diff --git a/AppCode/Auth.py b/AppCode/Auth.py new file mode 100644 index 0000000..cf92480 --- /dev/null +++ b/AppCode/Auth.py @@ -0,0 +1,54 @@ +from flask import Flask, render_template, request, redirect, url_for, send_from_directory, flash, jsonify, json +from flask_login import LoginManager, UserMixin + +from logging.handlers import RotatingFileHandler +from ldap3 import Server, Connection, ALL, SUBTREE + +from ldap3 import Server, Connection, ALL +from ldap3.core.exceptions import LDAPBindError + + + +class DefaultCredentials: + username = 'admin' + password = 'admin123' + +class LoginLDAP: + def __init__(self, request): + self.username = request.form['username'].strip() + self.password = request.form['password'] + self.isDefaultCredentials = False + self.isValidLogin = False + self.errorMessage = "" + ldap_user_dn = f"uid={self.username},ou=users,dc=lcepl,dc=org" + ldap_server = 'ldap://localhost:389' + #Need to re-factor further + + + # Static fallback user + if self.username == DefaultCredentials.username and self.password == DefaultCredentials.password: + self.isDefaultCredentials = True + self.isValidLogin = True + return + + try: + # LDAP authentication + conn = Connection( + Server(self.ldap_server, get_info=ALL), + user=self.ldap_user_dn, + password=self.password, + auto_bind=True + ) + + self.isValidLogin = True + return + + except LDAPBindError: + self.errorMessage = "Invalid credentials." + except Exception as e: + self.errorMessage = str(e) + + +class User(UserMixin): + def __init__(self, id): + self.id = id diff --git a/AppCode/Block.py b/AppCode/Block.py new file mode 100644 index 0000000..eac6e91 --- /dev/null +++ b/AppCode/Block.py @@ -0,0 +1,208 @@ +from flask import Flask, render_template, request, redirect, url_for, send_from_directory, flash, jsonify, json +from flask import current_app + +from datetime import datetime +from flask_login import LoginManager, UserMixin, login_user, logout_user, login_required, current_user + +from AppCode.Utilities import RegEx, ResponseHandler, HtmlHelper +from AppCode.Log import LogData, LogHelper + +import os +import config +import re + +import mysql.connector +from mysql.connector import Error + + +class Block: + + isSuccess = False + resultMessage = "" + + def __init__(self): + self.isSuccess = False + self.resultMessage = "" + + # ---------------------------------------------------------- + # Add Block + # ---------------------------------------------------------- + def AddBlock(self, request): + connection = config.get_db_connection() + if not connection: + self.isSuccess = False + self.resultMessage = HtmlHelper.json_response(ResponseHandler.db_connection_failure(), 500) + return + + cursor = connection.cursor() + + block_name = request.form['block_Name'].strip() + district_id = request.form['district_Id'] + + LogHelper.log_action("Add Block", f"User {current_user.id} Added Block '{block_name}'") + + if not re.match(RegEx.patternAlphabetOnly, block_name): + self.isSuccess = False + self.resultMessage = HtmlHelper.json_response(ResponseHandler.invalid_name("block"), 400) + return + + try: + cursor.callproc("GetBlockByNameAndDistrict", (block_name, district_id)) + for rs in cursor.stored_results(): + existing_block = rs.fetchone() + + if existing_block: + self.isSuccess = False + self.resultMessage = HtmlHelper.json_response(ResponseHandler.already_exists("block"), 409) + return + + cursor.callproc("SaveBlock", (block_name, district_id)) + connection.commit() + + self.isSuccess = True + self.resultMessage = HtmlHelper.json_response(ResponseHandler.add_success("block"), 200) + return + + except mysql.connector.Error as e: + print(f"Error inserting block: {e}") + self.isSuccess = False + self.resultMessage = HtmlHelper.json_response(ResponseHandler.add_failure("block"), 500) + finally: + cursor.close() + connection.close() + + # ---------------------------------------------------------- + # Get All Blocks + # ---------------------------------------------------------- + def GetAllBlocks(self): + blockdata = [] + connection = config.get_db_connection() + + if not connection: + return [] + + cursor = connection.cursor() + + try: + cursor.callproc("GetAllBlocks") + for rs in cursor.stored_results(): + blockdata = rs.fetchall() + + self.isSuccess = True + + except mysql.connector.Error as e: + print(f"Error fetching blocks: {e}") + self.isSuccess = False + self.resultMessage = HtmlHelper.json_response(ResponseHandler.fetch_failure("blocks"), 500) + return [] + + finally: + cursor.close() + connection.close() + + return blockdata + + # ---------------------------------------------------------- + # Check Block Exists + # ---------------------------------------------------------- + def CheckBlock(self, request): + connection = config.get_db_connection() + cursor = connection.cursor() + + block_name = request.json.get('block_Name', '').strip() + district_id = request.json.get('district_Id') + + LogHelper.log_action("Check Block", f"User {current_user.id} Checked block '{block_name}'") + + if not re.match(RegEx.patternAlphabetOnly, block_name): + return HtmlHelper.json_response(ResponseHandler.invalid_name("block"), 400) + + try: + cursor.callproc("GetBlockByNameAndDistrict", (block_name, district_id)) + for rs in cursor.stored_results(): + existing_block = rs.fetchone() + + if existing_block: + return HtmlHelper.json_response(ResponseHandler.already_exists("block"), 409) + + return HtmlHelper.json_response(ResponseHandler.is_available("block"), 200) + + except mysql.connector.Error as e: + print(f"Error checking block: {e}") + return HtmlHelper.json_response(ResponseHandler.fetch_failure("block"), 500) + + finally: + cursor.close() + connection.close() + + # ---------------------------------------------------------- + # Get Block By ID + # ---------------------------------------------------------- + def GetBlockByID(self, id): + blockdata = None + connection = config.get_db_connection() + cursor = connection.cursor() + + try: + cursor.callproc("GetBlockDataByID", (id,)) + for rs in cursor.stored_results(): + blockdata = rs.fetchone() + + except mysql.connector.Error as e: + print(f"Error fetching block data: {e}") + return None + finally: + cursor.close() + connection.close() + + return blockdata + + # ---------------------------------------------------------- + # Update Block + # ---------------------------------------------------------- + def EditBlock(self, request, id): + connection = config.get_db_connection() + cursor = connection.cursor() + + block_name = request.form['block_Name'].strip() + district_id = request.form['district_Id'] + + LogHelper.log_action("Edit Block", f"User {current_user.id} Edited block '{id}'") + + if not re.match(RegEx.patternAlphabetOnly, block_name): + return HtmlHelper.json_response(ResponseHandler.invalid_name("block"), 400) + + try: + cursor.callproc("UpdateBlockById", (block_name, district_id, id)) + connection.commit() + return "Successfully Updated" + + except mysql.connector.Error as e: + print(f"Error updating block: {e}") + return HtmlHelper.json_response(ResponseHandler.update_failure("block"), 500) + + finally: + cursor.close() + connection.close() + + # ---------------------------------------------------------- + # Delete Block + # ---------------------------------------------------------- + def DeleteBlock(self, id): + connection = config.get_db_connection() + cursor = connection.cursor() + + LogHelper.log_action("Delete Block", f"User {current_user.id} Deleted block '{id}'") + + try: + cursor.callproc("DeleteBlock", (id,)) + connection.commit() + return "Successfully Deleted" + + except mysql.connector.Error as e: + print(f"Error deleting block: {e}") + return HtmlHelper.json_response(ResponseHandler.delete_failure("block"), 500) + + finally: + cursor.close() + connection.close() diff --git a/AppCode/ContractorInfo.py b/AppCode/ContractorInfo.py new file mode 100644 index 0000000..88fa7f5 --- /dev/null +++ b/AppCode/ContractorInfo.py @@ -0,0 +1,76 @@ +import mysql.connector +from mysql.connector import Error +import config +import openpyxl +import os +import re +import ast +from datetime import datetime + + +class ContractorInfo: + ID = "" + contInfo = None + def __init__(self, id): + self.ID = id + print(id) + self.fetchData() + + def fetchData(self): + try: + connection = config.get_db_connection() + cursor = connection.cursor(dictionary=True, buffered=True) + print("here", flush=True) + + cursor.callproc('GetContractorInfoById', [self.contInfo]) + #self.contInfo = next(cursor.stored_results()).fetchone() + self.contInfo = cursor.fetchone() + + print(self.contInfo,flush=True) + finally: + cursor.close() + connection.close() + + def fetchalldata(self): + + try: + connection = config.get_db_connection() + cursor = connection.cursor(dictionary=True, buffered=True) + print("here", flush=True) + + + # ---------------- Hold Types ---------------- + cursor.execute(""" + SELECT DISTINCT ht.hold_type_id, ht.hold_type + FROM invoice_subcontractor_hold_join h + JOIN hold_types ht ON h.hold_type_id = ht.hold_type_id + WHERE h.Contractor_Id = %s + """, (self.contractor_id,)) + hold_types = cursor.fetchall() + hold_type_map = {ht['hold_type_id']: ht['hold_type'] for ht in hold_types} + + # ---------------- Invoices ---------------- + cursor.execute(""" + SELECT i.*, v.Village_Name + FROM assign_subcontractors asg + INNER JOIN invoice i ON i.PMC_No = asg.PMC_No AND i.Village_Id = asg.Village_Id + LEFT JOIN villages v ON i.Village_Id = v.Village_Id + WHERE asg.Contractor_Id = %s + ORDER BY i.PMC_No, i.Invoice_No + """, (self.contractor_id,)) + invoices = cursor.fetchall() + + # Remove duplicate invoices + invoice_ids_seen = set() + unique_invoices = [] + for inv in invoices: + if inv["Invoice_Id"] not in invoice_ids_seen: + invoice_ids_seen.add(inv["Invoice_Id"]) + unique_invoices.append(inv) + invoices = unique_invoices + + finally: + cursor.close() + connection.close() + + diff --git a/AppCode/District.py b/AppCode/District.py new file mode 100644 index 0000000..374b544 --- /dev/null +++ b/AppCode/District.py @@ -0,0 +1,236 @@ +from flask import Flask, render_template, request, redirect, url_for, send_from_directory, flash, jsonify, json +from flask import current_app + +from datetime import datetime +from flask_login import LoginManager, UserMixin, login_user, logout_user, login_required, current_user + +from AppCode.Utilities import RegEx, ResponseHandler, HtmlHelper +from AppCode.Log import LogData, LogHelper + +import os +import config +import re + +import mysql.connector +from mysql.connector import Error + +class District: + + isSuccess = False + resultMessage = "" + + def __init__(self): + self.isSuccess = False + self.resultMessage = "" + + def AddDistrict(self, request): + """Handles the logic for adding a new district.""" + connection = config.get_db_connection() + if not connection: + self.isSuccess = False + self.resultMessage = HtmlHelper.json_response(ResponseHandler.db_connection_failure(), 500) + return + + cursor = connection.cursor() + + district_name = request.form['district_Name'].strip() + state_id = request.form['state_Id'] + LogHelper.log_action("Add District", f"User {current_user.id} Added District '{district_name}'") + + if not re.match(RegEx.patternAlphabetOnly, district_name): + self.isSuccess = False + self.resultMessage = HtmlHelper.json_response(ResponseHandler.invalid_name("district"), 400) + return + + try: + cursor.callproc("GetDistrictByNameAndState", (district_name, state_id)) + for data in cursor.stored_results(): + rs = data.fetchone() + + if rs: + self.isSuccess = False + self.resultMessage = HtmlHelper.json_response(ResponseHandler.already_exists("district"), 409) + return + + cursor.callproc('SaveDistrict', (district_name, state_id)) + connection.commit() + self.isSuccess = True + self.resultMessage = HtmlHelper.json_response(ResponseHandler.add_success("district"), 200) + return + + except mysql.connector.Error as e: + print(f"Error inserting district: {e}") + self.isSuccess = False + self.resultMessage = HtmlHelper.json_response(ResponseHandler.add_failure("district"), 500) + return + finally: + cursor.close() + connection.close() + + + def GetAllDistricts(self, request): + """Fetches all districts with their state names.""" + districtdata = [] + connection = config.get_db_connection() + + self.isSuccess = False + self.resultMessage = "" + + if not connection: + return [] + + cursor = connection.cursor() + + try: + cursor.callproc("GetAllDistricts") + for dis in cursor.stored_results(): + districtdata = dis.fetchall() + self.isSuccess = True + + except mysql.connector.Error as e: + print(f"Error fetching districts: {e}") + self.isSuccess = False + self.resultMessage = HtmlHelper.json_response(ResponseHandler.fetch_failure("districts"), 500) + return [] + + finally: + cursor.close() + connection.close() + + return districtdata + + + def CheckDistrict(self, request): + """Checks if a district name already exists within a specific state.""" + self.isSuccess = False + self.resultMessage = "" + connection = config.get_db_connection() + + if not connection: + return HtmlHelper.json_response(ResponseHandler.db_connection_failure(), 500) + + cursor = connection.cursor() + + district_name = request.json.get('district_Name', '').strip() + state_id = request.json.get('state_Id', '') + LogHelper.log_action("Check District", f"User {current_user.id} Checked District '{district_name}'") + + if not re.match(RegEx.patternAlphabetOnly, district_name): + self.isSuccess = False + self.resultMessage = HtmlHelper.json_response(ResponseHandler.invalid_name("district"), 400) + return self.resultMessage + + try: + cursor.callproc("GetDistrictByNameAndState", (district_name, state_id,)) + for result in cursor.stored_results(): + existing_district = result.fetchone() + + if existing_district: + self.isSuccess = False + self.resultMessage = HtmlHelper.json_response(ResponseHandler.already_exists("district"), 409) + else: + self.isSuccess = True + self.resultMessage = HtmlHelper.json_response(ResponseHandler.is_available("district"), 200) + + return self.resultMessage + + except mysql.connector.Error as e: + print(f"Error checking district: {e}") + self.isSuccess = False + self.resultMessage = HtmlHelper.json_response(ResponseHandler.add_failure("district"), 500) + return self.resultMessage + finally: + cursor.close() + connection.close() + + + def DeleteDistrict(self, request, id): + """Deletes a district by its ID.""" + self.isSuccess = False + self.resultMessage = "" + connection = config.get_db_connection() + cursor = connection.cursor() + LogHelper.log_action("Delete District", f"User {current_user.id} Deleted District '{id}'") + + try: + cursor.callproc("DeleteDistrict", (id,)) + connection.commit() + self.resultMessage = "Successfully Deleted" + self.isSuccess = True + except mysql.connector.Error as e: + print(f"Error deleting district: {e}") + self.isSuccess = False + self.resultMessage = HtmlHelper.json_response(ResponseHandler.delete_failure("district"), 500) + finally: + cursor.close() + connection.close() + + return self.resultMessage + + + def EditDistrict(self, request, id): + """Handles the POST logic for updating a district.""" + self.isSuccess = False + self.resultMessage = "" + connection = config.get_db_connection() + cursor = connection.cursor() + + district_name = request.form['district_Name'].strip() + state_id = request.form['state_Id'] + LogHelper.log_action("Edit District", f"User {current_user.id} Edited District '{id}'") + + # Added validation consistent with your other Edit methods + if not re.match(RegEx.patternAlphabetOnly, district_name): + self.isSuccess = False + self.resultMessage = ResponseHandler.invalid_name("district"), 400 + return self.resultMessage + + try: + cursor.callproc("UpdateDistrict", (id, state_id, district_name,)) + connection.commit() + self.isSuccess = True + self.resultMessage = "Successfully Edited" + except mysql.connector.Error as e: + print(f"Error updating district: {e}") + self.isSuccess = False + self.resultMessage = ResponseHandler.update_failure("district"), 500 + finally: + cursor.close() + connection.close() + + return self.resultMessage + + + def GetDistrictByID(self, request, id): + """Fetches a single district's details by its ID.""" + districtdata = None + self.isSuccess = False + self.resultMessage = "" + connection = config.get_db_connection() + + if not connection: + return None + + cursor = connection.cursor() + + try: + cursor.callproc("GetDistrictDataByID", (id,)) + for rs in cursor.stored_results(): + districtdata = rs.fetchone() + + if districtdata: + self.isSuccess = True + self.resultMessage = "Success in Fetching" + else: + self.isSuccess = False + self.resultMessage = "District Not Found" + + except mysql.connector.Error as e: + print(f"Error fetching district data: {e}") + self.isSuccess = False + self.resultMessage = HtmlHelper.json_response(ResponseHandler.fetch_failure("district"), 500) + finally: + cursor.close() + connection.close() + + return districtdata \ No newline at end of file diff --git a/AppCode/Log.py b/AppCode/Log.py new file mode 100644 index 0000000..d84215b --- /dev/null +++ b/AppCode/Log.py @@ -0,0 +1,87 @@ +from flask import Flask, render_template, request, redirect, url_for, send_from_directory, flash, jsonify, json +from flask import current_app + +from datetime import datetime +from flask_login import LoginManager, UserMixin, login_user, logout_user, login_required, current_user + +import os + +class LogHelper: + @staticmethod + def log_action(action, details=""): + """Log user actions with timestamp, user, action, and details.""" + logData = LogData() + logData.WriteLog(action, details="") + +class LogData: + + filepath = "" + timestamp = None + + def __init__(self): + self.filepath = os.path.join(current_app.root_path, 'activity.log') + self.timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + + if hasattr(current_user, "cn") and current_user.cn: + self.user = current_user.cn + elif hasattr(current_user, "username") and current_user.username: + self.user = current_user.username + elif hasattr(current_user, "sAMAccountName") and current_user.sAMAccountName: + self.user = current_user.sAMAccountName + else: + self.user = "Unknown" + + def WriteLog(self, action, details=""): + """Log user actions with timestamp, user, action, and details.""" + + with open(self.filepath, "a", encoding="utf-8") as f: + f.write( + f"Timestamp: {self.timestamp} | " + f"User: {self.user} | " + f"Action: {action} | " + f"Details: {details}\n" + ) + + + def GetActivitiesLog(self): + logs = [] + + if os.path.exists(self.filepath): + with open(self.filepath, 'r') as f: + for line in f: + parts = line.strip().split(" | ") + if len(parts) == 4: + logs.append({ + "timestamp": parts[0].replace("Timestamp:", "").strip(), + "user": parts[1].replace("User:", "").strip(), + "action": parts[2].replace("Action:", "").strip(), + "details": parts[3].replace("Details:", "").strip() + }) + return logs + + def GetFilteredActivitiesLog(self, startDate, endDate, userName): + + filtered_logs = self.GetActivitiesLog() + + # Date filter + if startDate or endDate: + try: + start_dt = datetime.strptime(startDate, "%Y-%m-%d") if startDate else datetime.min + end_dt = datetime.strptime(endDate, "%Y-%m-%d") if endDate else datetime.max + + + filtered_logs = [ + log for log in filtered_logs + if start_dt <= datetime.strptime(log["timestamp"], "%Y-%m-%d %H:%M:%S") <= end_dt + ] + + + except Exception as e: + print("Date filter error:", e) + #Why catching all exceptions? Need to handle specific exceptions + + # Username filter + if userName: + filtered_logs = [log for log in filtered_logs if userName.lower() in log["user"].lower()] + + return filtered_logs \ No newline at end of file diff --git a/AppCode/ReportGenerator.py b/AppCode/ReportGenerator.py new file mode 100644 index 0000000..e69de29 diff --git a/AppCode/State.py b/AppCode/State.py new file mode 100644 index 0000000..290c330 --- /dev/null +++ b/AppCode/State.py @@ -0,0 +1,246 @@ +from flask import Flask, render_template, request, redirect, url_for, send_from_directory, flash, jsonify, json +from flask import current_app + +from datetime import datetime +from flask_login import LoginManager, UserMixin, login_user, logout_user, login_required, current_user + +from AppCode.Utilities import RegEx, ResponseHandler, HtmlHelper +from AppCode.Log import LogData, LogHelper + +import os +import config +import re + +import mysql.connector +from mysql.connector import Error + +class State: + + isSuccess = False + resultMessage = "" + + def __init__(self): + self.isSuccess = False + self.resultMessage = "" + + def AddState(self, request): + """Log user actions with timestamp, user, action, and details.""" + statedata = [] + + connection = config.get_db_connection() + + if connection: + cursor = connection.cursor() + state_name = request.form['state_Name'].strip() + LogHelper.log_action("Add State", f"User {current_user.id} added state '{state_name}'") + + if not re.match(RegEx.patternAlphabetOnly, state_name): + self.isSuccess = False + self.resultMessage = HtmlHelper.json_response(ResponseHandler.invalid_name("state"), 400) + return + + try: + + cursor.callproc("CheckStateExists", (state_name,)) + for data in cursor.stored_results(): + existing_state = data.fetchone() + + if existing_state: + self.isSuccess = False + self.resultMessage = HtmlHelper.json_response(ResponseHandler.already_exists("state"), 409) + return + + # cursor.execute("call SaveState (%s)", (state_name,)) + cursor.callproc("SaveState", (state_name,)) + connection.commit() + self.isSuccess = True + self.resultMessage = HtmlHelper.json_response(ResponseHandler.add_success("state"), 200) + return + + except mysql.connector.Error as e: + print(f"Error inserting state: {e}") + self.isSuccess = False + self.resultMessage = HtmlHelper.json_response(ResponseHandler.add_failure("state"), 500) + return + + #Need to make this seperate + + + + def GetAllStates(self, request): + """Log user actions with timestamp, user, action, and details.""" + statedata = [] + connection = config.get_db_connection() + + self.isSuccess = False + self.resultMessage = "" + + if not connection: + return [] + + cursor = connection.cursor() + + try: + cursor.callproc("GetAllStates") + for res in cursor.stored_results(): + statedata = res.fetchall() + self.isSuccess = True + + + except mysql.connector.Error as e: + print(f"Error fetching states: {e}") + self.isSuccess = False + self.resultMessage = HtmlHelper.json_response(ResponseHandler.fetch_failure("state"), 500) + return [] + + finally: + cursor.close() + connection.close() + + return statedata + + + + def CheckState(self, request): + self.isSuccess = False + self.resultMessage = "" + + connection = config.get_db_connection() + #connection closing needs to be verified + if connection: + cursor = connection.cursor() + state_name = request.json.get('state_Name', '').strip() + LogHelper.log_action("Check State", f"User {current_user.id} Checked state '{state_name}'") + if not re.match(RegEx.patternAlphabetOnly, state_name): + self.isSuccess = False + self.resultMessage = HtmlHelper.json_response(ResponseHandler.invalid_name("state"), 400) + return HtmlHelper.json_response(ResponseHandler.invalid_name("state"), 400) + + try: + # cursor.execute("SELECT * FROM states WHERE State_Name = %s", (state_name,)) + # existing_state = cursor.fetchone() + + cursor.callproc("CheckStateExists", (state_name,)) + for data in cursor.stored_results(): + existing_state = data.fetchone() + + if existing_state: + self.isSuccess = False + self.resultMessage = HtmlHelper.json_response(ResponseHandler.already_exists("state"), 409) + return HtmlHelper.json_response(ResponseHandler.already_exists("state"), 409) + else: + self.isSuccess = True + self.resultMessage = HtmlHelper.json_response(ResponseHandler.is_available("state"), 200) + return HtmlHelper.json_response(ResponseHandler.is_available("state"), 200) + + except mysql.connector.Error as e: + self.isSuccess = False + self.resultMessage = HtmlHelper.json_response(ResponseHandler.add_failure("state"), 500) + + print(f"Error checking state: {e}") + return HtmlHelper.json_response(ResponseHandler.add_failure("state"), 500) + finally: + cursor.close() + connection.close() + + + + def DeleteState(self, request, id): + self.isSuccess = False + self.resultMessage = "" + + connection = config.get_db_connection() + cursor = connection.cursor() + LogHelper.log_action("Delete State", f"User {current_user.id} Deleted state '{id}'") + try: + cursor.callproc('DeleteState', (id,)) + connection.commit() + + self.resultMessage = "Successfully Deleted" + self.isSuccess = True + except mysql.connector.Error as e: + print(f"Error deleting data: {e}") + self.isSuccess = False + self.resultMessage = HtmlHelper.json_response(ResponseHandler.delete_failure("state"), 500) + return HtmlHelper.json_response(ResponseHandler.delete_failure("state"), 500) + + finally: + cursor.close() + connection.close() + return self.resultMessage + + + def EditState(self, request, id): + self.isSuccess = False + self.resultMessage = "" + + connection = config.get_db_connection() + cursor = connection.cursor() + # str_pattern_reg = r"^[A-Za-z\s]+$" + + state_name = request.form['state_Name'].strip() + LogHelper.log_action("Edit State", f"User {current_user.id} Edited state '{state_name}'") + if not re.match(RegEx.patternAlphabetOnly, state_name): + self.isSuccess = False + self.resultMessage = ResponseHandler.invalid_name("state"), 400 + return ResponseHandler.invalid_name("state"), 400 + + try: + # cursor.execute("UPDATE states SET State_Name = %s WHERE State_ID = %s", (state_name, id)) + cursor.callproc("UpdateStateById", (id, state_name)) + connection.commit() + self.isSuccess = True + self.resultMessage = "Successfully Edited" + return redirect(url_for('add_state')) + except mysql.connector.Error as e: + print(f"Error updating data: {e}") + self.isSuccess = True + self.resultMessage = ResponseHandler.add_failure("state"), 500 + + return ResponseHandler.add_failure("state"), 500 + finally: + cursor.close() + connection.close() + + + + + + def GetStateByID(self, request, id): + """Log user actions with timestamp, user, action, and details.""" + statedata = [] + + self.isSuccess = False + self.resultMessage = "" + + connection = config.get_db_connection() + if not connection: + return [] + cursor = connection.cursor() + + try: + cursor.callproc("GetStateByID", (id,)) + for res in cursor.stored_results(): + statedata = res.fetchone() + + if statedata: + self.isSuccess = True + self.resultMessage = "Success in Fetching" + else: + self.isSuccess = False + self.resultMessage = "State Not Found" + + + except mysql.connector.Error as e: + print(f"Error fetching states: {e}") + self.isSuccess = False + self.resultMessage = HtmlHelper.json_response(ResponseHandler.fetch_failure("state"), 500) + return [] + + finally: + cursor.close() + connection.close() + + return statedata + + diff --git a/AppCode/Utilities.py b/AppCode/Utilities.py new file mode 100644 index 0000000..53ddb82 --- /dev/null +++ b/AppCode/Utilities.py @@ -0,0 +1,57 @@ +from flask import flash, jsonify, json + + +class RegEx: + patternAlphabetOnly = "^[A-Za-z ]+$" + + +class ResponseHandler: + @staticmethod + def invalid_name(entity): + return {'status': 'error', 'message': f'Invalid {entity} name. Only letters are allowed!'} + + @staticmethod + def already_exists(entity): + return {'status': 'exists', 'message': f'{entity.capitalize()} already exists!'} + + @staticmethod + def add_success(entity): + return {'status': 'success', 'message': f'{entity.capitalize()} added successfully!'} + + @staticmethod + def add_failure(entity): + return {'status': 'error', 'message': f'Failed to add {entity}.'} + + @staticmethod + def is_available(entity): + return {'status': 'available', 'message': f'{entity.capitalize()} name is available!'} + + @staticmethod + def delete_success(entity): + return {'status': 'success', 'message': f'{entity.capitalize()} deleted successfully!'} + + @staticmethod + def delete_failure(entity): + return {'status': 'error', 'message': f'Failed to delete {entity}.'} + + @staticmethod + def update_success(entity): + return {'status': 'success', 'message': f'{entity.capitalize()} updated successfully!'} + + @staticmethod + def update_failure(entity): + return {'status': 'error', 'message': f'Failed to update {entity}.'} + + @staticmethod + def fetch_failure(entity): + return {'status': 'error', 'message': f'Failed to fetch {entity}.'} + + +class HtmlHelper: + # Helper: JSON Response Formatter + + @staticmethod + def json_response(message_obj, status_code): + return jsonify(message_obj), status_code + #May need to refactor further + diff --git a/AppCode/Village.py b/AppCode/Village.py new file mode 100644 index 0000000..713dc4a --- /dev/null +++ b/AppCode/Village.py @@ -0,0 +1,274 @@ + +from flask_login import LoginManager, UserMixin, login_user, logout_user, login_required, current_user + +from AppCode.Utilities import RegEx, ResponseHandler, HtmlHelper +from AppCode.Log import LogData, LogHelper + +import os +import config +import re + +import mysql.connector +from mysql.connector import Error + + +class Village: + isSuccess = False + resultMessage = "" + + def __init__(self): + self.isSuccess = False + self.resultMessage = "" + + def AddVillage(self, request): + + connection = config.get_db_connection() + if not connection: + self.isSuccess = False + self.resultMessage = HtmlHelper.json_response(ResponseHandler.db_connection_failure(), 500) + return + + cursor = connection.cursor() + + block_id = request.form.get('block_Id') + village_name = request.form.get('Village_Name', '').strip() + LogHelper.log_action("Add Village", + f"User {current_user.id} adding village '{village_name}' to block '{block_id}'") + + if not block_id: + self.isSuccess = False + self.resultMessage = HtmlHelper.json_response(ResponseHandler.add_failure("block"), + 400) # Assuming this is a valid response + return + + if not re.match(RegEx.patternAlphabetOnly, village_name): + self.isSuccess = False + self.resultMessage = HtmlHelper.json_response(ResponseHandler.invalid_name("village"), 400) + return + + try: + # Check if the village already exists in the block + cursor.callproc("GetVillageByNameAndBlock", (village_name, block_id,)) + for rs in cursor.stored_results(): + existing_village = rs.fetchone() + + if existing_village: + self.isSuccess = False + self.resultMessage = HtmlHelper.json_response(ResponseHandler.already_exists("village"), 409) + return + + # Insert new village + cursor.callproc('SaveVillage', (village_name, block_id)) + connection.commit() + self.isSuccess = True + self.resultMessage = HtmlHelper.json_response(ResponseHandler.add_success("village"), 200) + return + + except mysql.connector.Error as e: + print(f"Database Error: {e}") + self.isSuccess = False + self.resultMessage = HtmlHelper.json_response(ResponseHandler.add_failure("village"), 500) + return + finally: + cursor.close() + connection.close() + + def GetAllVillages(self, request): + + villages = [] + connection = config.get_db_connection() + + self.isSuccess = False + self.resultMessage = "" + + if not connection: + return [] + + cursor = connection.cursor() + + try: + cursor.callproc("GetAllVillages") + for result in cursor.stored_results(): + villages = result.fetchall() + self.isSuccess = True + + except mysql.connector.Error as e: + print(f"Error fetching villages: {e}") + self.isSuccess = False + self.resultMessage = HtmlHelper.json_response(ResponseHandler.fetch_failure("village"), 500) + return [] + + finally: + cursor.close() + connection.close() + + return villages + + def CheckVillage(self, request): + + self.isSuccess = False + self.resultMessage = "" + connection = config.get_db_connection() + + if not connection: + return HtmlHelper.json_response(ResponseHandler.db_connection_failure(), 500) + + cursor = connection.cursor() + + block_id = request.form.get('block_Id') + village_name = request.form.get('Village_Name', '').strip() + LogHelper.log_action("Check Village", + f"User {current_user.id} checked village '{village_name}' in block '{block_id}'") + + if not re.match(RegEx.patternAlphabetOnly, village_name): + self.isSuccess = False + self.resultMessage = HtmlHelper.json_response(ResponseHandler.invalid_name("village"), 400) + return self.resultMessage + + if not block_id or not village_name: + self.isSuccess = False + self.resultMessage = HtmlHelper.json_response( + {'status': 'error', 'message': 'Block and Village Name are required!'}, 400) + return self.resultMessage + + try: + cursor.callproc("GetVillageByNameAndBlocks", (village_name, block_id)) + for rs in cursor.stored_results(): + existing_village = rs.fetchone() + + if existing_village: + self.isSuccess = False + self.resultMessage = HtmlHelper.json_response(ResponseHandler.already_exists("village"), 409) + else: + self.isSuccess = True + self.resultMessage = HtmlHelper.json_response(ResponseHandler.is_available("village"), 200) + + return self.resultMessage + + except mysql.connector.Error as e: + print(f"Error checking village: {e}") + self.isSuccess = False + self.resultMessage = HtmlHelper.json_response(ResponseHandler.add_failure("village"), 500) + return self.resultMessage + finally: + cursor.close() + connection.close() + + def DeleteVillage(self, request, village_id): + + self.isSuccess = False + self.resultMessage = "" + connection = config.get_db_connection() + cursor = connection.cursor() + LogHelper.log_action("Delete Village", f"User {current_user.id} deleted village '{village_id}'") + + try: + cursor.callproc("DeleteVillage", (village_id,)) + connection.commit() + self.resultMessage = ResponseHandler.delete_success("village") # Simple message, route will handle redirect + self.isSuccess = True + except mysql.connector.Error as e: + print(f"Error deleting village: {e}") + self.isSuccess = False + self.resultMessage = HtmlHelper.json_response(ResponseHandler.delete_failure("village"), 500) + finally: + cursor.close() + connection.close() + + return self.resultMessage + + def EditVillage(self, request, village_id): + + self.isSuccess = False + self.resultMessage = "" + connection = config.get_db_connection() + cursor = connection.cursor() + + village_name = request.form['Village_Name'].strip() + block_id = request.form['block_Id'] + LogHelper.log_action("Edit Village", + f"User {current_user.id} edited village '{village_id}' to name '{village_name}'") + + if not re.match(RegEx.patternAlphabetOnly, village_name): + self.isSuccess = False + self.resultMessage = HtmlHelper.json_response(ResponseHandler.invalid_name("village"), 400) + return self.resultMessage + + try: + # Using the stored procedure pattern from your State class + cursor.callproc("UpdateVillage", (village_id, block_id, village_name,)) + + connection.commit() + self.isSuccess = True + self.resultMessage = ResponseHandler.update_success("village") + except mysql.connector.Error as e: + print(f"Error updating data: {e}") + self.isSuccess = False + self.resultMessage = HtmlHelper.json_response(ResponseHandler.update_failure("village"), 500) + finally: + cursor.close() + connection.close() + + return self.resultMessage + + def GetVillageByID(self, request, id): + + village_data = None + self.isSuccess = False + self.resultMessage = "" + connection = config.get_db_connection() + + if not connection: + return None + + cursor = connection.cursor() + + try: + cursor.callproc("GetVillageDetailsById", (id,)) + for rs in cursor.stored_results(): + village_data = rs.fetchone() + + if village_data: + self.isSuccess = True + self.resultMessage = "Success in Fetching" + else: + self.isSuccess = False + self.resultMessage = "Village Not Found" + + except mysql.connector.Error as e: + print(f"Error fetching village: {e}") + self.isSuccess = False + self.resultMessage = HtmlHelper.json_response(ResponseHandler.fetch_failure("village"), 500) + finally: + cursor.close() + connection.close() + + return village_data + + def GetAllBlocks(self, request): + + blocks = [] + self.isSuccess = False + self.resultMessage = "" + connection = config.get_db_connection() + + if not connection: + return [] + + cursor = connection.cursor() + + try: + cursor.callproc('GetAllBlocks') + for result in cursor.stored_results(): + blocks = result.fetchall() + self.isSuccess = True + + except mysql.connector.Error as e: + print(f"Error fetching blocks: {e}") + self.isSuccess = False + self.resultMessage = HtmlHelper.json_response(ResponseHandler.fetch_failure("block"), 500) + finally: + cursor.close() + connection.close() + + return blocks \ No newline at end of file diff --git a/AppRoutes/StateRoute.py b/AppRoutes/StateRoute.py new file mode 100644 index 0000000..e69de29 diff --git a/Reconciliation-Product.code-workspace b/Reconciliation-Product.code-workspace new file mode 100644 index 0000000..876a149 --- /dev/null +++ b/Reconciliation-Product.code-workspace @@ -0,0 +1,8 @@ +{ + "folders": [ + { + "path": "." + } + ], + "settings": {} +} \ No newline at end of file diff --git a/Version-1.code-workspace b/Version-1.code-workspace new file mode 100644 index 0000000..876a149 --- /dev/null +++ b/Version-1.code-workspace @@ -0,0 +1,8 @@ +{ + "folders": [ + { + "path": "." + } + ], + "settings": {} +} \ No newline at end of file diff --git a/activity.log b/activity.log new file mode 100644 index 0000000..5c1da1c --- /dev/null +++ b/activity.log @@ -0,0 +1,4972 @@ +Timestamp: 2025-08-25 17:29:20 | User: Unknown | Action: Logout | Details: User v.sinha logged out +Timestamp: 2025-08-25 17:29:29 | User: Unknown | Action: Login | Details: User v.sinha logged in +Timestamp: 2025-08-25 17:29:38 | User: Unknown | Action: Check State | Details: User v.sinha Checked state 'MP' +Timestamp: 2025-08-25 17:29:39 | User: Unknown | Action: Add State | Details: User v.sinha added state 'MP' +Timestamp: 2025-08-25 17:29:43 | User: Unknown | Action: Delete State | Details: User v.sinha Deleted state '22' +Timestamp: 2025-08-25 17:46:20 | User: Unknown | Action: Check State | Details: User v.sinha Checked state 'MP' +Timestamp: 2025-08-25 17:46:20 | User: Unknown | Action: Add State | Details: User v.sinha added state 'MP' +Timestamp: 2025-08-25 17:46:24 | User: Unknown | Action: Delete State | Details: User v.sinha Deleted state '23' +Timestamp: 2025-08-25 17:49:43 | User: Unknown | Action: Check State | Details: User v.sinha Checked state 'MP' +Timestamp: 2025-08-25 17:49:44 | User: Unknown | Action: Add State | Details: User v.sinha added state 'MP' +Timestamp: 2025-08-25 17:49:51 | User: Unknown | Action: Delete State | Details: User v.sinha Deleted state '24' +Timestamp: 2025-08-25 18:01:58 | User: Unknown | Action: Check State | Details: User v.sinha Checked state 'MP' +Timestamp: 2025-08-25 18:01:59 | User: Unknown | Action: Add State | Details: User v.sinha added state 'MP' +Timestamp: 2025-08-25 18:02:05 | User: Unknown | Action: Delete State | Details: User v.sinha Deleted state '25' +Timestamp: 2025-08-25 18:05:30 | User: Unknown | Action: Logout | Details: User v.sinha logged out +Timestamp: 2025-08-25 18:05:42 | User: Unknown | Action: Login | Details: User v.sinha logged in +Timestamp: 2025-08-25 18:05:49 | User: Unknown | Action: Check State | Details: User v.sinha Checked state 'MP' +Timestamp: 2025-08-25 18:05:49 | User: Unknown | Action: Add State | Details: User v.sinha added state 'MP' +Timestamp: 2025-08-25 18:05:52 | User: Unknown | Action: Delete State | Details: User v.sinha Deleted state '26' +Timestamp: 2025-08-25 18:12:26 | User: Unknown | Action: Logout | Details: User v.sinha logged out +Timestamp: 2025-08-25 18:12:33 | User: Unknown | Action: Login | Details: User v.sinha logged in +Timestamp: 2025-08-25 18:12:55 | User: Unknown | Action: Check State | Details: User v.sinha Checked state 'MP' +Timestamp: 2025-08-25 18:12:56 | User: Unknown | Action: Add State | Details: User v.sinha added state 'MP' +Timestamp: 2025-08-25 18:13:00 | User: Unknown | Action: Delete State | Details: User v.sinha Deleted state '27' +Timestamp: 2025-08-26 10:32:21 | User: Unknown | Action: Login | Details: User v.sinha logged in +Timestamp: 2025-08-26 18:20:31 | User: Unknown | Action: Login | Details: User v.sinha logged in +Timestamp: 2025-09-24 15:17:33 | User: Unknown | Action: Login | Details: User admin logged in (static user) +Timestamp: 2025-09-24 15:18:49 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-24 15:18:49 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'aa' +Timestamp: 2025-09-24 15:18:52 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'aa' +Timestamp: 2025-09-24 15:21:28 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-24 15:21:28 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'aa' +Timestamp: 2025-09-24 15:21:29 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-24 15:21:30 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'' +Timestamp: 2025-09-24 15:21:43 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-24 15:22:10 | User: Unknown | Action: Check State | Details: User admin Checked state 'Uttar Pradesh' +Timestamp: 2025-09-24 15:22:12 | User: Unknown | Action: Add State | Details: User admin added state 'Uttar Pradesh' +Timestamp: 2025-09-24 15:22:39 | User: Unknown | Action: Check District | Details: User admin Checked District 'Shamli' +Timestamp: 2025-09-24 15:22:41 | User: Unknown | Action: Check District | Details: User admin Checked District 'Shamli' +Timestamp: 2025-09-24 15:22:42 | User: Unknown | Action: Add District | Details: User admin Added District 'Shamli' +Timestamp: 2025-09-24 15:23:03 | User: Unknown | Action: Get District | Details: User admin Get District '1' +Timestamp: 2025-09-24 15:23:09 | User: Unknown | Action: Check Block | Details: User admin Checked block 'Shamli' +Timestamp: 2025-09-24 15:23:12 | User: Unknown | Action: Check Block | Details: User admin Checked block 'Shamli' +Timestamp: 2025-09-24 15:23:12 | User: Unknown | Action: Add Block | Details: User admin Added block 'Shamli' +Timestamp: 2025-09-24 15:24:14 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:25:01 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:26:04 | User: Unknown | Action: Check State | Details: User admin Checked state 'Uttar Pradesh' +Timestamp: 2025-09-24 15:26:06 | User: Unknown | Action: Add State | Details: User admin added state 'Uttar Pradesh' +Timestamp: 2025-09-24 15:26:14 | User: Unknown | Action: Check District | Details: User admin Checked District 'Uttar Pradesh' +Timestamp: 2025-09-24 15:26:26 | User: Unknown | Action: Check District | Details: User admin Checked District 'Shamli' +Timestamp: 2025-09-24 15:26:29 | User: Unknown | Action: Check District | Details: User admin Checked District 'Shamli' +Timestamp: 2025-09-24 15:26:29 | User: Unknown | Action: Add District | Details: User admin Added District 'Shamli' +Timestamp: 2025-09-24 15:26:37 | User: Unknown | Action: Get District | Details: User admin Get District '1' +Timestamp: 2025-09-24 15:26:41 | User: Unknown | Action: Check Block | Details: User admin Checked block 'Shamli' +Timestamp: 2025-09-24 15:26:44 | User: Unknown | Action: Check Block | Details: User admin Checked block 'Shamli' +Timestamp: 2025-09-24 15:26:44 | User: Unknown | Action: Add Block | Details: User admin Added block 'Shamli' +Timestamp: 2025-09-24 15:27:00 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:27:00 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:27:00 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:27:00 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:27:00 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:27:00 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:27:00 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:27:00 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:27:00 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:27:00 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:27:00 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:27:00 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:27:00 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:27:00 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:27:00 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:27:00 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:27:00 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:27:00 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:27:00 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:27:00 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:27:00 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:27:00 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:27:00 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:27:00 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:27:19 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'A' +Timestamp: 2025-09-24 15:27:19 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'A' +Timestamp: 2025-09-24 15:27:19 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'Aa' +Timestamp: 2025-09-24 15:27:21 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'Aa' +Timestamp: 2025-09-24 15:35:38 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-24 15:35:48 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:35:48 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:35:48 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:35:48 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:35:48 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:35:48 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:35:48 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:35:48 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:35:48 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:35:58 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'A' +Timestamp: 2025-09-24 15:35:58 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'A' +Timestamp: 2025-09-24 15:35:58 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'Ar' +Timestamp: 2025-09-24 15:36:00 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'Ar' +Timestamp: 2025-09-24 15:50:03 | User: Unknown | Action: Login | Details: User admin logged in (static user) +Timestamp: 2025-09-24 15:50:21 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-24 15:51:45 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:52:01 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-24 15:52:03 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:53:27 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-24 15:53:29 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:53:29 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:53:29 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:53:29 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:53:29 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:53:29 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:53:29 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:53:29 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:53:29 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:54:15 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-24 15:54:19 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'' +Timestamp: 2025-09-24 15:54:39 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-24 15:54:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:54:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:54:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:54:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:54:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:54:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:54:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:54:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:54:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:54:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:54:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:54:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:54:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:54:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:54:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:54:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:54:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:54:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:54:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:54:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:54:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:54:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:54:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:54:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 15:55:13 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-24 15:55:13 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-24 15:55:13 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'adi' +Timestamp: 2025-09-24 15:55:16 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'adi' +Timestamp: 2025-09-24 16:14:09 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-24 16:14:10 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-24 16:14:17 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-24 16:14:19 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:14:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:14:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:14:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:14:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:14:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:14:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:14:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:14:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:14:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:14:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:14:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:14:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:14:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:14:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:14:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:14:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:14:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:14:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:14:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:14:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:14:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:14:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:14:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:14:25 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-24 16:14:25 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-24 16:22:09 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-24 16:22:10 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-24 16:22:18 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-24 16:22:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:22:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:22:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:22:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:22:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:22:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:22:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:22:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:22:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:22:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:22:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:22:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:22:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:22:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:22:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:22:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:22:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:22:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:22:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:22:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:22:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:22:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:22:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:22:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:22:25 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-24 16:22:25 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-24 16:23:14 | User: Unknown | Action: Login | Details: User admin logged in (static user) +Timestamp: 2025-09-24 16:23:19 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-24 16:23:21 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-24 16:25:51 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-24 16:25:51 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-24 16:25:58 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-24 16:26:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:26:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:26:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:26:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:26:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:26:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:26:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:26:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:26:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:26:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:26:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:26:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:26:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:26:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:26:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:26:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:26:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:26:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:26:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:26:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:26:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:26:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:26:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:26:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 16:26:29 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-24 16:26:29 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-24 16:59:58 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-24 16:59:59 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-24 17:00:05 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-24 17:00:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:00:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:00:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:00:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:00:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:00:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:00:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:00:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:00:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:00:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:00:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:00:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:00:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:00:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:00:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:00:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:00:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:00:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:00:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:00:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:00:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:00:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:00:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:00:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:00:14 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-24 17:00:15 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-24 17:11:17 | User: Unknown | Action: Login | Details: User admin logged in (static user) +Timestamp: 2025-09-24 17:11:31 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-24 17:11:33 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:11:33 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:11:33 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:11:33 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:11:33 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:11:33 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:11:33 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:11:33 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:11:33 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:11:33 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:11:33 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:11:33 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:11:33 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:11:33 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:11:33 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:11:33 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:11:33 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:11:33 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:11:33 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:11:33 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:11:33 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:11:33 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:11:33 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:11:33 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:11:39 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-24 17:11:40 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-24 17:14:21 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-24 17:14:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:14:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:14:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:14:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:14:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:14:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:14:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:14:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:14:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:14:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:14:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:14:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:14:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:14:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:14:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:14:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:14:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:14:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:14:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:14:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:14:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:14:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:14:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:14:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:14:29 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-24 17:14:29 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-24 17:14:30 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-24 17:18:11 | User: Unknown | Action: Login | Details: User admin logged in (static user) +Timestamp: 2025-09-24 17:18:20 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-24 17:18:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:18:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:18:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:18:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:18:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:18:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:18:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:18:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:18:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:18:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:18:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:18:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:18:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:18:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:18:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:18:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:18:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:18:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:18:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:18:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:18:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:18:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:18:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:18:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:18:26 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-24 17:18:26 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-24 17:18:27 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-24 17:56:56 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-24 17:56:59 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:56:59 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:56:59 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:56:59 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:56:59 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:56:59 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:56:59 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:56:59 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:56:59 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:56:59 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:56:59 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:56:59 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:56:59 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:56:59 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:56:59 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:56:59 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:56:59 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:56:59 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:56:59 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:56:59 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:56:59 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:56:59 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:56:59 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:56:59 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-24 17:57:07 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ew' +Timestamp: 2025-09-24 17:57:07 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ew' +Timestamp: 2025-09-24 17:57:08 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'e' +Timestamp: 2025-09-24 17:57:08 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'' +Timestamp: 2025-09-24 17:57:11 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'' +Timestamp: 2025-09-24 17:57:14 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-24 17:57:15 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-25 10:35:37 | User: Unknown | Action: Login | Details: User admin logged in (static user) +Timestamp: 2025-09-25 10:36:05 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-25 10:36:06 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-25 10:48:14 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-25 10:48:16 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 10:48:16 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 10:48:16 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 10:48:16 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 10:48:16 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 10:48:16 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 10:48:16 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 10:48:16 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 10:48:16 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 10:48:20 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-25 10:48:20 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-25 10:48:21 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-25 11:40:35 | User: Unknown | Action: Login | Details: User admin logged in (static user) +Timestamp: 2025-09-25 11:40:44 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-25 11:40:46 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 11:40:46 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 11:40:46 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 11:40:46 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 11:40:46 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 11:40:46 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 11:40:46 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 11:40:46 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 11:40:46 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 11:40:46 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 11:40:46 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 11:40:46 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 11:40:46 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 11:40:46 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 11:40:46 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 11:40:46 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 11:40:46 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 11:40:46 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 11:40:47 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 11:40:47 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 11:40:47 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 11:40:47 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 11:40:47 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 11:40:47 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 11:40:51 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-25 11:40:52 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 11:40:53 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 11:49:46 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-25 11:49:48 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 11:49:48 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 11:49:48 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 11:49:48 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 11:49:48 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 11:49:48 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 11:49:48 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 11:49:48 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 11:49:48 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 11:49:48 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 11:49:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 11:49:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 11:49:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 11:49:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 11:49:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 11:49:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 11:49:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 11:49:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 11:49:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 11:49:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 11:49:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 11:49:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 11:49:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 11:49:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 11:49:55 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-25 11:49:56 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 11:49:57 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 12:01:16 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-25 12:01:18 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:01:18 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:01:18 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:01:18 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:01:18 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:01:18 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:01:18 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:01:18 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:01:18 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:01:18 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:01:18 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:01:18 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:01:18 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:01:18 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:01:18 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:01:18 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:01:18 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:01:18 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:01:18 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:01:18 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:01:18 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:01:18 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:01:18 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:01:18 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:01:22 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 12:01:22 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 12:01:23 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 12:15:19 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-25 12:15:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:15:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:15:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:15:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:15:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:15:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:15:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:15:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:15:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:15:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:15:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:15:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:15:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:15:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:15:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:15:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:15:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:15:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:15:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:15:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:15:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:15:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:15:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:15:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:15:27 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 12:15:27 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 12:15:28 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 12:19:08 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 12:19:09 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 12:22:14 | User: Unknown | Action: Login | Details: User admin logged in (static user) +Timestamp: 2025-09-25 12:22:20 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-25 12:22:20 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 12:22:21 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 12:22:28 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-25 12:22:29 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:22:29 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:22:29 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:22:29 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:22:29 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:22:29 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:22:29 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:22:29 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:22:29 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:22:29 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:22:29 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:22:29 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:22:29 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:22:29 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:22:29 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:22:29 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:22:29 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:22:29 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:22:29 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:22:29 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:22:29 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:22:29 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:22:29 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:22:29 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:22:34 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 12:22:34 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 12:22:35 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 12:40:54 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-25 12:40:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:40:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:40:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:40:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:40:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:40:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:40:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:40:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:40:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:40:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:40:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:40:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:40:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:40:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:40:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:40:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:40:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:40:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:40:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:40:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:40:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:40:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:40:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:40:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:41:00 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-25 12:41:00 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 12:41:01 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 12:50:05 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-25 12:50:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:50:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:50:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:50:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:50:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:50:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:50:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:50:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:50:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:50:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:50:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:50:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:50:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:50:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:50:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:50:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:50:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:50:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:50:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:50:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:50:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:50:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:50:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:50:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 12:50:11 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 12:50:11 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 12:50:12 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 13:09:34 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-25 13:09:35 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-25 13:09:39 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-25 13:09:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:09:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:09:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:09:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:09:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:09:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:09:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:09:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:09:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:09:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:09:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:09:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:09:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:09:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:09:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:09:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:09:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:09:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:09:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:09:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:09:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:09:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:09:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:09:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:09:47 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 13:09:47 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 13:09:48 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 13:19:14 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-25 13:19:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:19:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:19:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:19:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:19:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:19:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:19:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:19:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:19:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:19:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:19:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:19:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:19:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:19:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:19:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:19:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:19:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:19:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:19:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:19:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:19:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:19:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:19:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:19:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:19:30 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 13:19:30 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 13:19:31 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 13:26:42 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-25 13:26:44 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:26:44 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:26:44 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:26:44 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:26:44 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:26:44 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:26:44 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:26:44 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:26:44 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:26:44 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:26:44 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:26:44 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:26:44 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:26:44 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:26:44 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:26:44 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:26:44 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:26:44 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:26:44 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:26:44 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:26:44 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:26:44 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:26:44 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:26:44 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 13:27:37 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-25 13:27:38 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 13:27:40 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 14:24:25 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-25 14:26:21 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 14:26:21 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 14:26:21 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 14:26:21 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 14:26:21 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 14:26:21 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 14:26:21 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 14:26:21 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 14:26:21 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 14:26:21 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 14:26:21 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 14:26:21 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 14:26:21 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 14:26:21 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 14:26:21 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 14:26:21 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 14:26:21 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 14:26:21 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 14:26:21 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 14:26:21 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 14:26:21 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 14:26:21 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 14:26:21 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 14:26:21 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 14:26:26 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 14:26:26 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 14:26:27 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 15:06:37 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-25 15:06:39 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:06:39 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:06:39 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:06:39 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:06:39 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:06:39 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:06:39 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:06:39 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:06:39 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:06:39 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:06:40 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:06:40 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:06:40 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:06:40 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:06:40 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:06:40 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:06:40 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:06:40 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:06:40 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:06:40 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:06:40 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:06:40 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:06:40 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:06:40 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:06:43 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 15:06:43 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 15:06:44 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 15:24:42 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-25 15:25:18 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:25:18 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:25:18 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:25:18 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:25:18 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:25:18 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:25:18 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:25:18 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:25:18 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:25:18 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:25:18 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:25:18 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:25:18 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:25:18 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:25:18 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:25:18 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:25:18 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:25:18 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:25:18 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:25:18 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:25:18 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:25:18 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:25:18 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:25:18 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:25:22 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 15:25:22 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 15:25:23 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 15:33:35 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-25 15:33:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:33:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:33:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:33:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:33:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:33:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:33:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:33:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:33:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:33:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:33:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:33:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:33:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:33:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:33:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:33:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:33:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:33:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:33:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:33:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:33:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:33:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:33:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:33:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:35:39 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-25 15:35:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:35:49 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-25 15:35:49 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 15:35:50 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 15:54:05 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-25 15:54:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:54:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:54:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:54:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:54:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:54:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:54:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:54:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:54:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:54:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:54:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:54:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:54:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:54:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:54:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:54:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:54:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:54:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:54:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:54:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:54:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:54:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:54:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:54:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 15:54:12 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-25 15:54:12 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 15:54:13 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 16:01:09 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-25 16:01:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:01:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:01:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:01:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:01:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:01:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:01:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:01:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:01:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:01:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:01:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:01:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:01:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:01:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:01:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:01:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:01:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:01:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:01:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:01:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:01:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:01:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:01:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:01:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:01:15 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 16:01:15 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 16:01:16 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 16:06:17 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-25 16:06:19 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:06:19 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:06:19 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:06:19 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:06:19 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:06:19 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:06:19 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:06:19 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:06:19 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:06:19 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:06:19 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:06:19 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:06:19 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:06:19 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:06:19 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:06:19 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:06:19 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:06:19 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:06:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:06:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:06:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:06:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:06:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:06:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:06:23 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-25 16:06:23 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 16:06:24 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 16:12:45 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-25 16:12:45 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 16:12:49 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 16:13:00 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 16:13:00 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 16:13:01 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 16:13:05 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-25 16:13:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:13:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:13:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:13:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:13:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:13:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:13:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:13:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:13:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:13:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:13:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:13:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:13:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:13:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:13:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:13:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:13:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:13:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:13:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:13:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:13:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:13:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:13:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:13:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:13:11 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 16:13:11 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 16:13:11 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 16:15:09 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-25 16:15:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:15:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:15:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:15:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:15:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:15:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:15:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:15:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:15:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:15:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:15:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:15:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:15:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:15:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:15:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:15:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:15:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:15:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:15:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:15:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:15:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:15:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:15:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:15:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:15:19 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-25 16:15:19 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 16:15:20 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 16:26:14 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 16:26:14 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 16:26:16 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 16:26:20 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-25 16:26:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:26:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:26:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:26:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:26:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:26:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:26:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:26:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:26:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:26:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:26:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:26:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:26:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:26:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:26:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:26:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:26:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:26:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:26:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:26:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:26:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:26:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:26:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:26:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:26:26 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 16:26:26 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 16:26:27 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 16:36:06 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-25 16:36:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:36:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:36:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:36:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:36:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:36:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:36:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:36:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:36:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:36:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:36:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:36:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:36:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:36:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:36:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:36:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:36:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:36:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:36:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:36:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:36:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:36:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:36:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:36:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:36:11 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 16:36:11 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 16:36:13 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 16:37:50 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-25 16:37:52 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:37:52 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:37:52 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:37:52 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:37:52 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:37:52 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:37:52 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:37:52 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:37:52 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:37:52 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:37:52 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:37:52 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:37:52 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:37:52 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:37:52 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:37:52 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:37:52 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:37:52 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:37:52 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:37:52 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:37:52 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:37:52 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:37:52 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:37:52 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:37:56 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 16:37:56 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 16:37:57 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 16:42:31 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 16:42:32 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 16:42:37 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-25 16:42:39 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:42:39 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:42:39 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:42:39 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:42:39 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:42:39 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:42:39 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:42:39 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:42:39 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:42:39 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:42:39 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:42:39 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:42:39 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:42:39 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:42:39 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:42:39 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:42:39 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:42:39 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:42:39 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:42:39 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:42:39 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:42:39 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:42:39 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:42:39 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:42:42 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 16:42:42 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 16:42:43 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 16:47:32 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 16:47:32 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 16:47:34 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 16:47:40 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 16:47:40 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 16:47:40 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 16:47:45 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-25 16:47:47 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:47:47 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:47:47 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:47:47 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:47:47 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:47:47 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:47:47 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:47:47 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:47:47 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:47:47 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:47:47 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:47:47 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:47:47 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:47:47 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:47:47 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:47:47 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:47:47 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:47:47 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:47:47 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:47:47 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:47:47 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:47:47 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:47:47 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:47:47 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 16:47:51 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 16:47:51 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 16:47:52 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 16:56:35 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-25 16:56:35 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 16:56:36 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 16:56:42 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-25 16:56:43 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:15:42 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-25 17:15:43 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 17:15:44 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 17:15:49 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-25 17:16:08 | User: Unknown | Action: Check State | Details: User admin Checked state 'Uttar Pradesh' +Timestamp: 2025-09-25 17:16:08 | User: Unknown | Action: Add State | Details: User admin added state 'Uttar Pradesh' +Timestamp: 2025-09-25 17:16:40 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-25 17:16:53 | User: Unknown | Action: Delete State | Details: User admin Deleted state '4' +Timestamp: 2025-09-25 17:16:54 | User: Unknown | Action: Check State | Details: User admin Checked state 'Shamli' +Timestamp: 2025-09-25 17:16:55 | User: Unknown | Action: Add State | Details: User admin added state 'Shamli' +Timestamp: 2025-09-25 17:17:05 | User: Unknown | Action: Check District | Details: User admin Checked District 'Uttar Pradesh' +Timestamp: 2025-09-25 17:17:06 | User: Unknown | Action: Check District | Details: User admin Checked District 'Uttar Pradesh' +Timestamp: 2025-09-25 17:17:06 | User: Unknown | Action: Add District | Details: User admin Added District 'Uttar Pradesh' +Timestamp: 2025-09-25 17:17:30 | User: Unknown | Action: Check State | Details: User admin Checked state 'Uttar Pradesh' +Timestamp: 2025-09-25 17:17:33 | User: Unknown | Action: Check State | Details: User admin Checked state 'Uttar Pradesh' +Timestamp: 2025-09-25 17:17:34 | User: Unknown | Action: Add State | Details: User admin added state 'Uttar Pradesh' +Timestamp: 2025-09-25 17:17:49 | User: Unknown | Action: Check District | Details: User admin Checked District 'Shamli' +Timestamp: 2025-09-25 17:17:49 | User: Unknown | Action: Check District | Details: User admin Checked District 'Shamli' +Timestamp: 2025-09-25 17:17:50 | User: Unknown | Action: Add District | Details: User admin Added District 'Shamli' +Timestamp: 2025-09-25 17:18:11 | User: Unknown | Action: Get District | Details: User admin Get District '5' +Timestamp: 2025-09-25 17:18:14 | User: Unknown | Action: Check Block | Details: User admin Checked block 'Shamli' +Timestamp: 2025-09-25 17:18:14 | User: Unknown | Action: Check Block | Details: User admin Checked block 'Shamli' +Timestamp: 2025-09-25 17:18:14 | User: Unknown | Action: Add Block | Details: User admin Added block 'Shamli' +Timestamp: 2025-09-25 17:18:35 | User: Unknown | Action: Get District | Details: User admin Get District '5' +Timestamp: 2025-09-25 17:18:38 | User: Unknown | Action: Get District | Details: User admin Get District '6' +Timestamp: 2025-09-25 17:18:40 | User: Unknown | Action: Check Block | Details: User admin Checked block 'Shamli' +Timestamp: 2025-09-25 17:18:41 | User: Unknown | Action: Check Block | Details: User admin Checked block 'Shamli' +Timestamp: 2025-09-25 17:18:41 | User: Unknown | Action: Add Block | Details: User admin Added block 'Shamli' +Timestamp: 2025-09-25 17:19:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:20:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:21:10 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-25 17:21:12 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:21:12 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:21:12 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:21:12 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:21:12 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:21:12 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:21:12 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:21:12 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:21:12 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:21:12 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:21:12 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:21:12 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:21:12 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:21:12 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:21:12 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:21:12 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:21:12 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:21:12 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:21:12 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:21:12 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:21:12 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:21:12 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:21:12 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:21:12 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:21:15 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 17:21:15 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 17:21:16 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 17:40:41 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-25 17:40:43 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:40:43 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:40:43 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:40:43 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:40:43 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:40:43 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:40:43 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:40:43 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:40:43 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:40:43 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:40:43 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:40:43 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:40:43 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:40:43 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:40:43 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:40:43 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:40:43 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:40:43 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:40:43 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:40:43 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:40:43 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:40:43 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:40:43 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:40:43 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:40:46 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-25 17:40:46 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 17:40:47 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 17:42:29 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-25 17:42:29 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 17:42:30 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 17:42:30 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 17:42:36 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-25 17:42:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:42:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:42:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:42:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:42:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:42:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:42:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:42:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:42:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:42:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:42:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:42:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:42:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:42:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:42:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:42:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:42:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:42:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:42:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:42:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:42:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:42:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:42:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:42:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:42:42 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 17:42:42 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 17:42:42 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 17:48:07 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-25 17:48:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:48:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:48:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:48:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:48:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:48:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:48:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:48:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:48:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:48:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:48:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:48:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:48:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:48:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:48:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:48:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:48:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:48:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:48:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:48:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:48:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:48:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:48:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:48:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:48:12 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-25 17:48:12 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 17:48:13 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 17:50:57 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-25 17:50:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:50:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:50:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:50:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:50:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:50:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:50:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:50:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:50:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:50:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:50:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:50:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:50:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:50:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:50:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:50:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:50:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:50:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:50:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:50:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:50:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:50:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:50:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:50:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 17:51:02 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-25 17:51:02 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 17:51:04 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 18:00:33 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-25 18:00:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:00:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:00:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:00:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:00:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:00:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:00:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:00:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:00:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:00:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:00:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:00:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:00:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:00:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:00:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:00:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:00:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:00:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:00:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:00:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:00:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:00:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:00:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:00:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:00:39 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-25 18:00:39 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 18:00:40 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 18:06:21 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-25 18:06:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:06:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:06:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:06:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:06:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:06:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:06:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:06:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:06:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:06:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:06:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:06:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:06:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:06:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:06:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:06:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:06:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:06:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:06:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:06:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:06:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:06:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:06:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:06:23 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:06:26 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 18:06:27 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 18:06:27 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 18:15:55 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-25 18:15:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:15:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:15:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:15:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:15:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:15:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:15:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:15:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:15:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:15:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:15:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:15:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:15:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:15:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:15:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:15:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:15:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:15:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:15:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:15:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:15:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:15:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:15:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:15:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:16:00 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 18:16:00 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 18:16:01 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 18:17:34 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-25 18:17:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:17:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:17:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:17:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:17:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:17:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:17:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:17:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:17:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:17:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:17:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:17:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:17:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:17:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:17:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:17:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:17:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:17:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:17:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:17:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:17:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:17:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:17:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:17:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:17:41 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 18:17:41 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 18:17:42 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 18:23:11 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-25 18:23:13 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:23:13 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:23:13 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:23:13 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:23:13 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:23:13 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:23:13 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:23:13 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:23:13 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:23:13 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:23:13 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:23:13 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:23:13 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:23:13 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:23:13 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:23:13 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:23:13 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:23:13 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:23:13 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:23:13 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:23:13 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:23:13 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:23:13 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:23:13 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:23:19 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-25 18:23:21 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-25 18:24:24 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-25 18:24:26 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:24:26 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:24:26 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:24:26 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:24:26 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:24:26 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:24:26 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:24:26 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:24:26 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:24:26 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:24:26 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:24:26 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:24:26 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:24:26 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:24:26 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:24:26 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:24:26 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:24:26 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:24:26 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:24:26 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:24:26 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:24:26 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:24:26 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:24:26 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:24:30 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 18:24:30 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 18:24:31 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-25 18:26:41 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-25 18:26:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:26:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:26:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:26:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:26:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:26:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:26:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:26:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:26:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-25 18:26:45 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-25 18:26:46 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-25 18:26:46 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-25 18:30:17 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-25 18:30:19 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 10:37:17 | User: Unknown | Action: Login | Details: User admin logged in (static user) +Timestamp: 2025-09-26 10:37:21 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-26 10:37:23 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-26 10:39:57 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-26 10:40:40 | User: Unknown | Action: Check State | Details: User admin Checked state 'Uttar Pradesh' +Timestamp: 2025-09-26 10:40:41 | User: Unknown | Action: Add State | Details: User admin added state 'Uttar Pradesh' +Timestamp: 2025-09-26 10:41:01 | User: Unknown | Action: Check District | Details: User admin Checked District 'Shamli' +Timestamp: 2025-09-26 10:41:01 | User: Unknown | Action: Check District | Details: User admin Checked District 'Shamli' +Timestamp: 2025-09-26 10:41:01 | User: Unknown | Action: Add District | Details: User admin Added District 'Shamli' +Timestamp: 2025-09-26 10:41:18 | User: Unknown | Action: Get District | Details: User admin Get District '4' +Timestamp: 2025-09-26 10:41:20 | User: Unknown | Action: Check Block | Details: User admin Checked block 'Shamli' +Timestamp: 2025-09-26 10:41:21 | User: Unknown | Action: Check Block | Details: User admin Checked block 'Shamli' +Timestamp: 2025-09-26 10:41:21 | User: Unknown | Action: Add Block | Details: User admin Added block 'Shamli' +Timestamp: 2025-09-26 10:41:48 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 10:47:39 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-26 10:47:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 10:47:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 10:47:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 10:47:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 10:47:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 10:47:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 10:47:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 10:47:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 10:47:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 10:47:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 10:47:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 10:47:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 10:47:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 10:47:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 10:47:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 10:47:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 10:47:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 10:47:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 10:47:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 10:47:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 10:47:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 10:47:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 10:47:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 10:47:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 10:47:45 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-26 10:47:45 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-26 10:47:46 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-26 10:57:34 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-26 10:57:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 10:57:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 10:57:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 10:57:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 10:57:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 10:57:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 10:57:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 10:57:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 10:57:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 10:57:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 10:57:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 10:57:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 10:57:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 10:57:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 10:57:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 10:57:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 10:57:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 10:57:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 10:57:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 10:57:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 10:57:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 10:57:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 10:57:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 10:57:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 10:57:39 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 10:57:39 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-26 10:57:40 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-26 11:08:31 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-26 11:08:33 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:08:33 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:08:33 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:08:33 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:08:33 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:08:33 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:08:33 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:08:33 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:08:33 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:08:33 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:08:33 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:08:33 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:08:33 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:08:33 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:08:33 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:08:33 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:08:33 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:08:33 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:08:33 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:08:33 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:08:33 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:08:33 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:08:33 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:08:33 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:08:37 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-26 11:08:37 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-26 11:08:38 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-26 11:10:53 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-26 11:10:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:10:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:10:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:10:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:10:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:10:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:10:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:10:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:10:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:10:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:10:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:10:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:10:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:10:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:10:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:10:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:10:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:10:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:10:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:10:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:10:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:10:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:10:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:10:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:10:59 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-26 11:10:59 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-26 11:11:00 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-26 11:14:35 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-26 11:14:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:14:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:14:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:14:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:14:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:14:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:14:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:14:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:14:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:14:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:14:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:14:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:14:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:14:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:14:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:14:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:14:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:14:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:14:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:14:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:14:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:14:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:14:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:14:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 11:14:41 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-26 11:14:41 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-26 11:14:41 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-26 12:06:12 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-26 12:06:14 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:06:14 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:06:14 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:06:14 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:06:14 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:06:14 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:06:14 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:06:14 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:06:14 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:06:14 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:06:14 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:06:14 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:06:14 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:06:14 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:06:14 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:06:14 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:06:14 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:06:14 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:06:14 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:06:14 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:06:14 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:06:14 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:06:14 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:06:14 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:14:47 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-26 12:14:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:14:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:14:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:14:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:14:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:14:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:14:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:14:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:14:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:14:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:14:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:14:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:14:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:14:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:14:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:14:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:14:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:14:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:14:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:14:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:14:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:14:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:14:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:14:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:15:44 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-26 12:15:44 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-26 12:15:45 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-26 12:34:19 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-26 12:34:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:34:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:34:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:34:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:34:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:34:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:34:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:34:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:34:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:34:29 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-26 12:34:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:34:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:34:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:34:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:34:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:34:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:34:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:34:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:34:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:34:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:34:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:34:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:34:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:34:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:34:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:34:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:34:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:34:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:34:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:34:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:34:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:34:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:34:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:34:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 12:34:34 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 12:34:34 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 12:34:35 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 12:36:37 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 12:36:37 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 12:36:38 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 12:38:30 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 12:38:31 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 12:38:32 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 12:40:53 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 12:40:54 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 12:40:58 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 12:42:53 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 12:42:54 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 12:42:54 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 12:44:34 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 12:44:35 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-26 12:44:36 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 12:44:36 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 12:44:37 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 12:45:46 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 12:45:46 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 12:45:47 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 12:55:40 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 12:55:40 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 12:55:41 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 12:58:48 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 12:58:49 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 12:58:50 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 13:00:47 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 13:00:47 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 13:11:46 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 13:11:47 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 13:11:47 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 13:13:26 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 13:13:26 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 13:13:27 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 13:16:04 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 13:16:04 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 13:16:05 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 13:16:43 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 13:16:44 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 13:16:44 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 13:23:37 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 13:23:38 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 13:23:39 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 13:24:06 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 13:24:08 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 13:29:02 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'' +Timestamp: 2025-09-26 13:29:04 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 13:29:06 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 13:29:06 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 13:29:25 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 13:29:26 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 13:35:04 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 13:35:04 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 13:35:04 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 13:36:04 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 13:36:04 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-26 13:36:05 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-26 13:38:57 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 13:38:57 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 13:38:58 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 13:40:20 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 13:40:20 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 13:40:21 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 13:41:27 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 13:41:27 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 13:41:27 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 13:43:35 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 13:43:35 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-26 13:43:36 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 13:43:37 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 13:43:37 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'arh' +Timestamp: 2025-09-26 13:43:38 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'arh' +Timestamp: 2025-09-26 13:46:13 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 13:46:14 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 13:46:14 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'arg' +Timestamp: 2025-09-26 13:46:15 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 13:46:16 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 13:47:24 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 13:47:24 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 13:47:25 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 14:16:49 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 14:16:50 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 14:16:52 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 14:18:30 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 14:18:30 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 14:18:31 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 14:19:40 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 14:19:41 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 14:19:41 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 14:21:25 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 14:21:25 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 14:21:26 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'arh' +Timestamp: 2025-09-26 14:21:27 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'arh' +Timestamp: 2025-09-26 14:22:27 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 14:22:28 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 14:22:29 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 14:23:49 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 14:23:49 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 14:23:49 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'arg' +Timestamp: 2025-09-26 14:23:50 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 14:23:51 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 14:24:35 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 14:24:35 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 14:24:36 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 14:25:38 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 14:25:38 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 14:25:38 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'arg' +Timestamp: 2025-09-26 14:25:39 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 14:25:41 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 14:26:42 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 14:26:42 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 14:26:43 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 14:30:22 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 14:30:22 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 14:30:23 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 15:27:14 | User: Unknown | Action: Login | Details: User admin logged in (static user) +Timestamp: 2025-09-26 15:27:17 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-26 15:27:17 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-26 15:27:19 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-26 15:27:46 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-26 15:27:56 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-26 15:27:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 15:27:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 15:27:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 15:27:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 15:27:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 15:27:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 15:27:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 15:27:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 15:27:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 15:28:03 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 15:28:03 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 15:28:04 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'arh' +Timestamp: 2025-09-26 15:28:04 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'arh' +Timestamp: 2025-09-26 15:30:28 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 15:30:28 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 15:30:31 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 15:30:39 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-26 15:30:50 | User: Unknown | Action: Check State | Details: User admin Checked state 'Uttar Pradesh' +Timestamp: 2025-09-26 15:31:01 | User: Unknown | Action: Check State | Details: User admin Checked state 'Uttar Pradesh' +Timestamp: 2025-09-26 15:31:02 | User: Unknown | Action: Add State | Details: User admin added state 'Uttar Pradesh' +Timestamp: 2025-09-26 15:31:09 | User: Unknown | Action: Check District | Details: User admin Checked District 'Shamli' +Timestamp: 2025-09-26 15:31:09 | User: Unknown | Action: Check District | Details: User admin Checked District 'Shamli' +Timestamp: 2025-09-26 15:31:10 | User: Unknown | Action: Add District | Details: User admin Added District 'Shamli' +Timestamp: 2025-09-26 15:31:19 | User: Unknown | Action: Get District | Details: User admin Get District '4' +Timestamp: 2025-09-26 15:31:21 | User: Unknown | Action: Check Block | Details: User admin Checked block 'Shamli' +Timestamp: 2025-09-26 15:31:21 | User: Unknown | Action: Check Block | Details: User admin Checked block 'Shamli' +Timestamp: 2025-09-26 15:31:21 | User: Unknown | Action: Add Block | Details: User admin Added block 'Shamli' +Timestamp: 2025-09-26 15:31:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 15:32:58 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 15:32:58 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 15:33:01 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 15:33:26 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-26 15:33:28 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 15:33:28 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 15:33:28 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 15:33:28 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 15:33:28 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 15:33:28 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 15:33:28 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 15:33:28 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 15:33:28 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 15:33:31 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 15:33:31 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 15:33:32 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'arh' +Timestamp: 2025-09-26 15:33:33 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'arh' +Timestamp: 2025-09-26 15:37:35 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-26 15:37:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 15:37:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 15:37:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 15:37:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 15:37:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 15:37:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 15:37:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 15:37:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 15:37:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 15:37:41 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 15:37:43 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 15:44:07 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 15:44:07 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 15:44:08 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 15:47:58 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-26 15:48:00 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 15:48:00 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 15:48:00 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 15:48:00 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 15:48:00 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 15:48:00 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 15:48:00 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 15:48:00 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 15:48:00 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 15:48:03 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 15:48:03 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ae' +Timestamp: 2025-09-26 15:48:04 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 15:48:04 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 15:48:06 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 15:50:00 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 15:50:00 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 15:50:00 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'arh' +Timestamp: 2025-09-26 15:50:02 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'arh' +Timestamp: 2025-09-26 15:55:31 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 15:55:31 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 16:00:00 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 16:00:01 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 16:02:41 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 16:02:42 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 16:02:42 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 16:20:54 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-26 16:20:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 16:20:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 16:20:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 16:20:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 16:20:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 16:20:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 16:20:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 16:20:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 16:20:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 16:20:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 16:20:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 16:20:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 16:20:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 16:20:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 16:20:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 16:20:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 16:20:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 16:20:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 16:20:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 16:20:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 16:20:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 16:20:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 16:20:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 16:20:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-26 16:20:59 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 16:21:00 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 16:36:01 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 16:36:01 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 16:40:07 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 16:40:08 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 16:41:48 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 16:41:48 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 16:42:59 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 16:43:00 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 16:44:01 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 16:44:02 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 16:58:15 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 16:58:17 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 17:47:48 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 17:47:49 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 17:48:00 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 17:48:01 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 18:07:02 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-26 18:07:02 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-26 18:07:04 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-27 10:45:15 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-27 10:45:17 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-27 10:50:03 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-27 10:50:04 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-27 11:10:41 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-27 11:10:43 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-27 11:14:44 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-27 11:14:44 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-27 11:14:45 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-27 11:19:53 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-27 11:19:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 11:19:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 11:19:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 11:19:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 11:19:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 11:19:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 11:19:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 11:19:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 11:19:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 11:20:01 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-27 11:20:03 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 11:20:03 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 11:20:03 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 11:20:03 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 11:20:03 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 11:20:03 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 11:20:03 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 11:20:03 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 11:20:03 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 11:20:03 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 11:20:03 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 11:20:03 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 11:20:03 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 11:20:03 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 11:20:03 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 11:20:03 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 11:20:03 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 11:20:03 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 11:20:03 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 11:20:03 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 11:20:03 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 11:20:03 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 11:20:03 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 11:20:03 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 11:20:07 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-27 11:20:07 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-27 11:20:08 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-27 11:34:40 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-27 11:34:40 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-27 11:34:41 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-27 11:36:26 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-27 11:36:26 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-27 11:36:27 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-27 11:39:43 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-27 11:39:43 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-27 11:54:18 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-27 11:54:19 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-27 11:54:20 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-27 11:58:28 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-27 11:58:31 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-27 11:59:14 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-27 11:59:14 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-27 11:59:15 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-27 12:12:44 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-27 12:12:44 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'as' +Timestamp: 2025-09-27 12:12:45 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-27 12:12:47 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-27 12:18:33 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-27 12:18:33 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-27 12:18:34 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-27 13:10:54 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-27 13:10:57 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-27 15:02:00 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-27 15:02:01 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-27 15:03:29 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-27 15:03:29 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-27 15:03:30 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'arh' +Timestamp: 2025-09-27 15:03:30 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'arh' +Timestamp: 2025-09-27 16:29:33 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-27 16:29:33 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-27 16:29:35 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-27 16:30:10 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-27 16:30:10 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-27 16:30:10 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-27 16:37:26 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-27 16:37:26 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-27 16:37:27 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'arh' +Timestamp: 2025-09-27 16:37:27 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'arh' +Timestamp: 2025-09-27 16:42:26 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-27 16:42:36 | User: Unknown | Action: Check State | Details: User admin Checked state 'Uttar Pradesh' +Timestamp: 2025-09-27 16:42:38 | User: Unknown | Action: Add State | Details: User admin added state 'Uttar Pradesh' +Timestamp: 2025-09-27 16:42:45 | User: Unknown | Action: Check District | Details: User admin Checked District 'Shamli' +Timestamp: 2025-09-27 16:42:45 | User: Unknown | Action: Check District | Details: User admin Checked District 'Shamli' +Timestamp: 2025-09-27 16:42:45 | User: Unknown | Action: Add District | Details: User admin Added District 'Shamli' +Timestamp: 2025-09-27 16:42:50 | User: Unknown | Action: Get District | Details: User admin Get District '4' +Timestamp: 2025-09-27 16:42:53 | User: Unknown | Action: Check Block | Details: User admin Checked block 'Shamli' +Timestamp: 2025-09-27 16:42:53 | User: Unknown | Action: Check Block | Details: User admin Checked block 'Shamli' +Timestamp: 2025-09-27 16:42:53 | User: Unknown | Action: Add Block | Details: User admin Added block 'Shamli' +Timestamp: 2025-09-27 16:43:05 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 16:43:05 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 16:43:05 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 16:43:05 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 16:43:05 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 16:43:05 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 16:43:05 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 16:43:05 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 16:43:05 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 16:43:09 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-27 16:43:10 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-27 16:46:46 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-27 16:46:48 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 16:46:48 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 16:46:48 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 16:46:48 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 16:46:48 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 16:46:48 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 16:46:48 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 16:46:48 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 16:46:48 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 16:46:48 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 16:46:48 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 16:46:48 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 16:46:48 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 16:46:48 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 16:46:48 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 16:46:48 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 16:46:48 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 16:46:48 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 16:46:48 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 16:46:48 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 16:46:48 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 16:46:48 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 16:46:48 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 16:46:48 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 16:46:55 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-27 16:46:56 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-27 16:46:56 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-27 16:57:55 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-27 16:57:56 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-27 17:16:18 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-27 17:16:19 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-27 17:33:52 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-27 17:33:53 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-27 17:37:57 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'r' +Timestamp: 2025-09-27 17:37:58 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'' +Timestamp: 2025-09-27 17:49:16 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-27 17:49:18 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-27 17:56:33 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-27 17:56:33 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-27 18:00:40 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-27 18:00:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:00:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:00:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:00:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:00:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:00:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:00:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:00:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:00:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:00:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:00:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:00:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:00:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:00:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:00:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:00:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:00:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:00:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:00:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:00:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:00:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:00:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:00:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:00:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:00:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:00:48 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-27 18:00:48 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-27 18:00:49 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-27 18:01:38 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-27 18:01:40 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:01:40 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:01:40 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:01:40 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:01:40 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:01:40 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:01:40 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:01:40 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:01:40 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:01:40 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:01:40 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:01:40 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:01:40 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:01:40 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:01:40 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:01:40 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:01:40 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:01:40 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:01:40 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:01:40 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:01:40 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:01:40 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:01:40 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:01:40 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:01:40 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:01:43 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-27 18:01:43 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-27 18:01:44 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-27 18:02:33 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-27 18:02:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:02:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:02:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:02:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:02:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:02:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:02:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:02:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:02:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:02:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:02:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:02:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:02:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:02:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:02:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:02:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:02:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:02:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:02:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:02:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:02:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:02:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:02:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:02:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:02:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-27 18:02:40 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-27 18:02:40 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-27 18:02:41 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-28 11:19:46 | User: Unknown | Action: Login | Details: User admin logged in (static user) +Timestamp: 2025-09-28 11:20:06 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-28 11:20:07 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-28 11:40:57 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-28 11:41:00 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 11:41:00 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 11:41:00 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 11:41:00 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 11:41:00 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 11:41:00 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 11:41:00 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 11:41:00 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 11:41:00 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 11:41:00 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 11:41:00 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 11:41:00 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 11:41:00 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 11:41:00 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 11:41:00 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 11:41:00 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 11:41:00 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 11:41:00 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 11:41:00 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 11:41:00 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 11:41:00 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 11:41:00 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 11:41:00 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 11:41:00 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 11:41:00 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 11:41:08 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-28 11:41:11 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-28 11:48:26 | User: Unknown | Action: Login | Details: User admin logged in (static user) +Timestamp: 2025-09-28 11:48:39 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-28 11:48:41 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-28 19:47:14 | User: Unknown | Action: Login | Details: User admin logged in (static user) +Timestamp: 2025-09-28 19:47:20 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-28 19:47:22 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-28 21:12:24 | User: Unknown | Action: Download PMC Report | Details: User admin Download PMC Report'59485' +Timestamp: 2025-09-28 21:12:24 | User: Unknown | Action: Download PMC Report | Details: User admin Download PMC Report'59485' +Timestamp: 2025-09-28 21:12:24 | User: Unknown | Action: Download PMC Report | Details: User admin Download PMC Report'59485' +Timestamp: 2025-09-28 21:12:24 | User: Unknown | Action: Download PMC Report | Details: User admin Download PMC Report'59485' +Timestamp: 2025-09-28 21:12:24 | User: Unknown | Action: Download PMC Report | Details: User admin Download PMC Report'59485' +Timestamp: 2025-09-28 21:13:38 | User: Unknown | Action: Download PMC Report | Details: User admin Download PMC Report'59485' +Timestamp: 2025-09-28 21:13:38 | User: Unknown | Action: Download PMC Report | Details: User admin Download PMC Report'59485' +Timestamp: 2025-09-28 21:13:38 | User: Unknown | Action: Download PMC Report | Details: User admin Download PMC Report'59485' +Timestamp: 2025-09-28 21:13:38 | User: Unknown | Action: Download PMC Report | Details: User admin Download PMC Report'59485' +Timestamp: 2025-09-28 21:13:38 | User: Unknown | Action: Download PMC Report | Details: User admin Download PMC Report'59485' +Timestamp: 2025-09-28 21:14:04 | User: Unknown | Action: Download PMC Report | Details: User admin Download PMC Report'59485' +Timestamp: 2025-09-28 21:14:04 | User: Unknown | Action: Download PMC Report | Details: User admin Download PMC Report'59485' +Timestamp: 2025-09-28 21:14:04 | User: Unknown | Action: Download PMC Report | Details: User admin Download PMC Report'59485' +Timestamp: 2025-09-28 21:14:04 | User: Unknown | Action: Download PMC Report | Details: User admin Download PMC Report'59485' +Timestamp: 2025-09-28 21:14:04 | User: Unknown | Action: Download PMC Report | Details: User admin Download PMC Report'59485' +Timestamp: 2025-09-28 21:15:26 | User: Unknown | Action: Login | Details: User admin logged in (static user) +Timestamp: 2025-09-28 21:15:29 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-28 21:15:29 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-28 21:15:31 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-28 21:29:49 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-28 21:29:53 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 21:29:53 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 21:29:53 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 21:29:53 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 21:29:53 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 21:29:53 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 21:29:53 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 21:29:53 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 21:29:53 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 21:29:53 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 21:29:54 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 21:29:54 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 21:29:54 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 21:29:54 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 21:29:54 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 21:29:54 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 21:29:54 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 21:29:54 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 21:29:54 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 21:29:54 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 21:29:54 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 21:29:54 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 21:29:54 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 21:29:54 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 21:29:54 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 21:29:58 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-28 21:29:58 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-28 21:30:00 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-28 22:07:03 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-28 22:07:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 22:07:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 22:07:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 22:07:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 22:07:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 22:07:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 22:07:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 22:07:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 22:07:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 22:07:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 22:07:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 22:07:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 22:07:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 22:07:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 22:07:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 22:07:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 22:07:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 22:07:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 22:07:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 22:07:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 22:07:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 22:07:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 22:07:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 22:07:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 22:07:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-28 22:07:15 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-28 22:07:15 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-28 22:07:16 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-29 10:07:20 | User: Unknown | Action: Login | Details: User admin logged in (static user) +Timestamp: 2025-09-29 10:07:26 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-29 10:07:28 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 10:07:28 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 10:07:28 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 10:07:28 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 10:07:28 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 10:07:28 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 10:07:28 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 10:07:28 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 10:07:28 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 10:07:31 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-29 10:07:31 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-29 10:07:32 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-29 10:07:53 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-29 10:07:53 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-29 10:07:54 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-29 10:13:28 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-29 10:13:29 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-29 10:13:30 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-29 10:16:32 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-29 10:17:29 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-29 10:17:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 10:17:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 10:17:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 10:17:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 10:17:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 10:17:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 10:17:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 10:17:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 10:17:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 10:17:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 10:17:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 10:17:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 10:17:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 10:17:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 10:17:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 10:17:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 10:17:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 10:17:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 10:17:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 10:17:32 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 10:17:32 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 10:17:32 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 10:17:32 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 10:17:32 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 10:17:32 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 10:17:34 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-29 10:17:35 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-29 10:17:36 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-29 10:27:41 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-29 10:27:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 10:27:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 10:27:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 10:27:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 10:27:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 10:27:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 10:27:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 10:27:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 10:27:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 10:27:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 10:27:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 10:27:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 10:27:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 10:27:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 10:27:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 10:27:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 10:27:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 10:27:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 10:27:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 10:27:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 10:27:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 10:27:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 10:27:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 10:27:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 10:27:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 10:27:53 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-29 10:27:54 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-29 12:43:57 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-29 12:43:57 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-29 12:43:58 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-29 12:52:16 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-29 12:52:17 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-29 15:19:07 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-29 15:19:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 15:19:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 15:19:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 15:19:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 15:19:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 15:19:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 15:19:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 15:19:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 15:19:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 15:19:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 15:19:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 15:19:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 15:19:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 15:19:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 15:19:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 15:19:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 15:19:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 15:19:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 15:19:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 15:19:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 15:19:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 15:19:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 15:19:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 15:19:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 15:19:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 15:19:13 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-29 15:19:13 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-29 15:19:14 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-29 16:00:36 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-29 16:00:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:00:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:00:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:00:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:00:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:00:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:00:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:00:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:00:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:00:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:00:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:00:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:00:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:00:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:00:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:00:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:00:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:00:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:00:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:00:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:00:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:00:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:00:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:00:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:00:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:00:42 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-29 16:00:42 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-29 16:00:43 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-29 16:05:05 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-29 16:06:52 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-29 16:07:07 | User: Unknown | Action: Check District | Details: User admin Checked District 'Muzaffarnagar' +Timestamp: 2025-09-29 16:07:18 | User: Unknown | Action: Check District | Details: User admin Checked District 'Muzaffarnagar' +Timestamp: 2025-09-29 16:07:53 | User: Unknown | Action: Add District | Details: User admin Added District 'Muzaffarnagar' +Timestamp: 2025-09-29 16:08:06 | User: Unknown | Action: Get District | Details: User admin Get District '4' +Timestamp: 2025-09-29 16:08:10 | User: Unknown | Action: Check Block | Details: User admin Checked block 'Muzaffarnagar' +Timestamp: 2025-09-29 16:08:10 | User: Unknown | Action: Check Block | Details: User admin Checked block 'Muzaffarnagar' +Timestamp: 2025-09-29 16:08:10 | User: Unknown | Action: Add Block | Details: User admin Added block 'Muzaffarnagar' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:08:42 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'j' +Timestamp: 2025-09-29 16:08:42 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ja' +Timestamp: 2025-09-29 16:08:44 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ja' +Timestamp: 2025-09-29 16:15:32 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-29 16:15:34 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:15:34 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:15:34 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:15:34 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:15:34 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:15:34 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:15:34 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:15:34 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:15:34 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:15:34 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:15:34 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:15:34 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:15:34 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:15:34 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:15:34 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:15:34 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:15:34 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:15:34 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:15:34 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:15:34 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:15:34 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:15:34 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:15:34 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:15:34 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:15:34 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:15:39 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-29 16:15:39 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-29 16:15:40 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-29 16:17:58 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-29 16:18:00 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:18:00 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:18:00 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:18:00 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:18:00 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:18:00 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:18:14 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-29 16:18:18 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:18:49 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-29 16:18:53 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:21:00 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-29 16:21:04 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:22:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:24:17 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:24:33 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-29 16:24:37 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:28:10 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-29 16:28:12 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'' +Timestamp: 2025-09-29 16:28:16 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'p' +Timestamp: 2025-09-29 16:28:16 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'po' +Timestamp: 2025-09-29 16:28:18 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'p' +Timestamp: 2025-09-29 16:28:19 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'pu' +Timestamp: 2025-09-29 16:28:19 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'pu' +Timestamp: 2025-09-29 16:28:31 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-29 16:28:34 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:28:34 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:28:34 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:28:34 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:28:34 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:28:34 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:28:34 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:28:34 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:28:34 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:28:34 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:28:34 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:28:34 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:28:34 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:28:34 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:28:34 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:28:34 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:28:34 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:28:34 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:28:34 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:28:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:28:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:28:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:28:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:28:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:28:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:28:40 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-29 16:28:40 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-29 16:28:41 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-29 16:29:53 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-29 16:29:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:29:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:29:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:29:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:29:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:29:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:29:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:29:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:29:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:29:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:29:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:29:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:29:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:29:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:29:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:29:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:29:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:29:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:29:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:29:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:29:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:29:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:29:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:29:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:29:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 16:30:01 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-29 16:30:01 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-29 16:30:02 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-29 16:47:32 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-29 16:47:32 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-29 16:47:32 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-29 16:48:15 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-29 16:48:15 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-29 16:48:16 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-29 16:49:36 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-29 16:49:36 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-29 16:49:37 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-29 16:51:22 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-29 16:51:23 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-29 16:54:22 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-29 16:54:22 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-29 16:54:22 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-29 16:57:11 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-29 16:57:11 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-29 16:57:13 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-29 17:00:42 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-29 17:00:43 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-29 17:08:18 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-29 17:08:21 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:08:21 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:08:21 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:08:21 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:08:21 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:08:21 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:08:21 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:08:21 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:08:21 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:08:21 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:08:21 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:08:21 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:08:21 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:08:21 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:08:21 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:08:21 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:08:21 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:08:21 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:08:21 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:08:21 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:08:21 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:08:21 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:08:21 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:08:21 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:08:21 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:08:26 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-29 17:08:26 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-29 17:08:27 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-29 17:10:59 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-29 17:11:13 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-29 17:11:15 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:11:15 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:11:15 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:11:15 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:11:15 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:11:15 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:11:15 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:11:15 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:11:15 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:11:15 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:11:15 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:11:15 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:11:15 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:11:15 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:11:15 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:11:15 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:11:15 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:11:15 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:11:15 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:13:27 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-29 17:13:27 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-29 17:13:28 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-29 17:13:36 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-29 17:13:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:13:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:13:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:13:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:13:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:13:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:13:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:13:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:13:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:13:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:13:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:13:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:13:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:13:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:13:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:13:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:13:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:13:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:13:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:13:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:13:38 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:13:39 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:13:39 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:13:39 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:13:39 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-29 17:13:42 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-29 17:13:42 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-29 17:13:43 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-29 17:15:56 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-29 17:15:56 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-29 17:15:57 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-29 17:19:18 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-29 17:19:18 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-29 17:19:19 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-29 17:27:48 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-29 17:27:48 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-29 17:27:49 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-29 18:22:56 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-29 18:22:56 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-29 18:22:58 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-30 10:30:19 | User: Unknown | Action: Login | Details: User admin logged in (static user) +Timestamp: 2025-09-30 10:31:51 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-30 10:40:56 | User: Unknown | Action: Login | Details: User admin logged in (static user) +Timestamp: 2025-09-30 10:40:58 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-30 11:35:14 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-30 11:35:16 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 11:35:16 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 11:35:16 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 11:35:16 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 11:35:16 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 11:35:16 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 11:35:16 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 11:35:16 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 11:35:16 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 11:35:16 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 11:35:16 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 11:35:16 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 11:35:16 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 11:35:16 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 11:35:16 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 11:35:16 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 11:35:16 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 11:35:16 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 11:35:16 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 11:35:16 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 11:35:16 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 11:35:16 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 11:35:16 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 11:35:16 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 11:35:16 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 11:35:20 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-30 11:35:20 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-30 11:35:21 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-30 11:51:45 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-30 11:51:47 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 11:51:47 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 11:51:47 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 11:51:47 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 11:51:47 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 11:51:47 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 11:51:47 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 11:51:47 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 11:51:47 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 11:51:47 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 11:51:47 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 13:03:13 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-30 13:03:15 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 13:03:15 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 13:03:15 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 13:03:15 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 13:03:15 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 13:03:15 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 13:03:15 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 13:03:15 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 13:03:15 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 13:03:15 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 13:03:15 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 13:03:15 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 13:03:15 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 13:03:15 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 13:03:15 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 13:03:15 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 13:03:15 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 13:03:15 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 13:03:15 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 13:03:15 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 13:03:15 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 13:03:15 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 13:03:15 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 13:03:15 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 13:03:15 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 13:03:18 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-30 13:03:19 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-30 13:03:19 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-30 14:29:09 | User: Unknown | Action: Login | Details: User admin logged in (static user) +Timestamp: 2025-09-30 14:30:18 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-30 14:30:20 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'' +Timestamp: 2025-09-30 15:04:51 | User: Unknown | Action: Login | Details: User admin logged in (static user) +Timestamp: 2025-09-30 15:04:54 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-30 15:04:55 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-30 17:15:25 | User: Unknown | Action: Login | Details: User admin logged in (static user) +Timestamp: 2025-09-30 17:16:54 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-30 17:16:54 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-30 17:16:56 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-30 17:28:25 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-30 17:28:27 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:28:27 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:28:27 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:28:27 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:28:27 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:28:27 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:28:27 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:28:27 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:28:27 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:28:27 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:28:27 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:28:27 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:28:27 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:28:27 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:28:27 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:28:27 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:28:27 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:28:27 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:28:27 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:28:27 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:28:27 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:28:27 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:28:27 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:28:27 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:28:27 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:28:31 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-30 17:28:31 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-30 17:28:32 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-30 17:43:00 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-30 17:43:03 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:43:03 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:43:03 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:43:03 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:43:03 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:43:03 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:43:03 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:43:03 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:43:03 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:43:03 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:44:41 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-30 17:44:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:44:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:44:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:44:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:44:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:44:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:44:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:44:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:44:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:44:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:46:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:47:07 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:47:18 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-30 17:47:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:47:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:47:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:47:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:47:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:47:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:47:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:47:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:47:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:47:20 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:47:52 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-30 17:47:54 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:47:54 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:47:54 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:47:54 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:47:54 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:47:54 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:47:54 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:47:54 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:47:54 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:47:54 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:47:54 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:47:54 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:47:54 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:47:54 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:47:54 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:47:54 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:47:54 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:47:54 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:47:54 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:48:06 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-30 17:48:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:48:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:48:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:48:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:48:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:48:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:48:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:48:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:48:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:48:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:48:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:48:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:48:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:48:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:48:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:48:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:48:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:48:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:48:08 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:48:59 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-30 17:49:01 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:49:01 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:49:01 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:49:01 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:49:01 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:49:01 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:49:01 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:49:01 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:49:01 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:49:01 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:49:01 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:49:01 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:49:01 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:49:01 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:49:01 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:49:01 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:49:01 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:49:01 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:49:01 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:49:01 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:49:01 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:49:01 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:49:01 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:49:01 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:49:01 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:49:04 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-30 17:49:04 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-30 17:49:05 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-30 17:50:39 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-30 17:50:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:50:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:50:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:50:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:50:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:50:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:50:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:50:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:50:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:50:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:50:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:50:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:50:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:50:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:50:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:50:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:50:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:50:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:50:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:50:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:50:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:50:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:50:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:50:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:50:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:50:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:50:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:50:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:50:50 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:50:50 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:50:50 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:50:50 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:50:50 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:50:50 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:50:50 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:50:50 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:50:50 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:50:50 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:54:56 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-30 17:54:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:54:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:54:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:54:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:54:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:54:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:54:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:54:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:54:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:54:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:54:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:54:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:54:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:54:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:54:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:54:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:54:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:54:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:54:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:54:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:54:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:54:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:54:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:54:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:54:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:55:02 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-30 17:55:02 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-30 17:55:04 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-30 17:58:09 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-30 17:58:10 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:58:10 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:58:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:58:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:58:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:58:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:58:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:58:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:58:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:58:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:58:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:58:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:58:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:58:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:58:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:58:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:58:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:58:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:58:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:58:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:58:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:58:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:58:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:58:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:58:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:58:16 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-30 17:58:16 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-30 17:58:17 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-30 17:59:17 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-30 17:59:18 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:59:18 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:59:18 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:59:18 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:59:18 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:59:18 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:59:18 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:59:18 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:59:18 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 17:59:22 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-30 17:59:22 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-09-30 17:59:22 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'arh' +Timestamp: 2025-09-30 17:59:23 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'arh' +Timestamp: 2025-09-30 18:14:10 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-30 18:14:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 18:14:55 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-30 18:14:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 18:14:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 18:14:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 18:14:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 18:14:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 18:14:56 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 18:14:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 18:14:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 18:14:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 18:14:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 18:14:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 18:14:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 18:14:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 18:14:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 18:14:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 18:14:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 18:14:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 18:14:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 18:14:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 18:14:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 18:14:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 18:14:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 18:14:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 18:14:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 18:14:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 18:15:00 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-30 18:15:00 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-30 18:15:01 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-30 18:16:32 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-30 18:16:40 | User: Unknown | Action: Check State | Details: User admin Checked state 'Uttar Pradesh' +Timestamp: 2025-09-30 18:16:40 | User: Unknown | Action: Add State | Details: User admin added state 'Uttar Pradesh' +Timestamp: 2025-09-30 18:16:45 | User: Unknown | Action: Check District | Details: User admin Checked District 'Shamli' +Timestamp: 2025-09-30 18:16:45 | User: Unknown | Action: Check District | Details: User admin Checked District 'Shamli' +Timestamp: 2025-09-30 18:16:45 | User: Unknown | Action: Add District | Details: User admin Added District 'Shamli' +Timestamp: 2025-09-30 18:16:50 | User: Unknown | Action: Get District | Details: User admin Get District '4' +Timestamp: 2025-09-30 18:16:52 | User: Unknown | Action: Check Block | Details: User admin Checked block 'Shamli' +Timestamp: 2025-09-30 18:16:52 | User: Unknown | Action: Check Block | Details: User admin Checked block 'Shamli' +Timestamp: 2025-09-30 18:16:52 | User: Unknown | Action: Add Block | Details: User admin Added block 'Shamli' +Timestamp: 2025-09-30 18:17:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 18:17:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 18:17:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 18:17:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 18:17:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 18:17:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 18:17:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 18:17:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 18:17:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 18:17:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 18:17:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 18:17:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 18:17:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 18:17:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 18:17:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 18:17:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 18:17:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 18:17:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 18:17:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 18:17:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 18:17:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 18:17:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 18:17:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 18:17:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 18:17:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 18:17:12 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-30 18:17:12 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-30 18:17:13 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-09-30 18:17:50 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-09-30 18:17:52 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 18:17:52 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 18:17:52 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 18:17:52 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 18:17:52 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 18:17:52 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 18:17:52 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 18:17:52 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 18:17:52 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-09-30 18:17:55 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-09-30 18:17:57 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-10-01 17:47:42 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-10-01 17:47:43 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-10-03 10:36:52 | User: Unknown | Action: Login | Details: User admin logged in (static user) +Timestamp: 2025-10-03 10:37:39 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-10-03 10:39:47 | User: Unknown | Action: Login | Details: User admin logged in (static user) +Timestamp: 2025-10-03 10:39:56 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-10-03 10:39:59 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 10:39:59 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 10:39:59 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 10:39:59 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 10:39:59 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 10:39:59 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 10:39:59 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 10:39:59 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 10:39:59 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 10:39:59 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 10:39:59 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 10:39:59 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 10:39:59 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 10:39:59 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 10:39:59 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 10:39:59 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 10:39:59 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 10:39:59 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 10:39:59 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 10:39:59 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 10:39:59 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 10:39:59 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 10:39:59 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 10:39:59 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 10:39:59 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 10:40:03 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-10-03 10:40:03 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-10-03 10:40:04 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-10-03 11:32:37 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-10-03 11:32:38 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-10-03 11:36:40 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-10-03 11:36:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 11:36:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 11:36:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 11:36:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 11:36:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 11:36:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 11:36:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 11:36:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 11:36:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 11:36:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 11:36:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 11:36:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 11:36:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 11:36:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 11:36:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 11:36:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 11:36:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 11:36:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 11:36:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 11:36:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 11:36:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 11:36:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 11:36:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 11:36:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 11:36:42 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 11:36:45 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-10-03 11:36:46 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-10-03 11:36:47 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-10-03 12:57:09 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-10-03 12:57:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 12:57:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 12:57:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 12:57:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 12:57:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 12:57:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 12:57:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 12:57:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 12:57:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 12:57:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 12:57:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 12:57:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 12:57:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 12:57:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 12:57:12 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 12:57:12 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 12:57:12 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 12:57:12 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 12:57:12 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 12:57:12 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 12:57:12 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 12:57:12 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 12:57:12 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 12:57:12 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 12:57:12 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 12:57:15 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-10-03 12:57:15 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-10-03 12:57:16 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-10-03 13:52:14 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-10-03 13:52:17 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 13:52:17 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 13:52:17 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 13:52:17 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 13:52:17 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 13:52:17 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 13:52:17 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 13:52:17 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 13:52:17 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 13:52:17 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 13:52:17 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 13:52:17 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 13:52:17 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 13:52:17 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 13:52:17 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 13:52:17 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 13:52:17 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 13:52:17 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 13:52:17 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 13:54:10 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-10-03 13:54:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 13:54:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 13:54:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 13:54:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 13:54:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 13:54:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 13:54:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 13:54:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 13:54:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 13:54:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 13:54:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 13:54:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 13:54:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 13:54:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 13:54:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 13:54:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 13:54:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 13:54:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 13:54:11 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:17:34 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-10-03 14:17:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:17:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:17:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:17:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:17:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:17:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:17:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:17:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:17:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:17:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:17:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:17:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:17:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:17:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:17:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:17:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:17:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:17:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:17:35 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:21:02 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-10-03 14:21:04 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:21:04 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:21:04 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:21:04 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:21:04 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:21:04 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:21:04 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:21:04 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:21:04 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:21:04 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:21:04 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:21:04 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:21:04 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:21:04 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:21:04 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:21:04 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:21:04 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:21:04 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:21:04 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:23:53 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-10-03 14:23:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:23:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:23:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:23:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:23:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:23:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:23:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:23:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:23:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:23:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:23:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:23:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:23:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:23:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:23:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:23:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:23:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:23:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:23:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:24:21 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:24:29 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:24:39 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-10-03 14:24:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:24:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:24:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:24:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:24:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:24:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:24:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:24:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:24:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:24:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:24:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:24:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:24:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:24:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:24:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:24:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:24:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:24:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:24:41 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:25:50 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-10-03 14:25:52 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:25:52 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:25:52 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:25:52 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:25:52 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:25:52 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:25:52 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:25:52 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:25:52 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:25:52 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:25:52 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:25:52 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:25:52 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:25:52 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:25:52 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:25:52 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:25:52 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:25:52 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:25:52 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:26:33 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-10-03 14:26:34 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:26:34 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:26:34 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:26:34 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:26:34 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:26:34 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:26:34 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:26:34 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:26:34 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:26:34 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:26:34 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:26:34 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:26:34 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:26:34 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:26:34 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:26:34 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:26:34 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:26:34 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:26:34 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:27:44 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-10-03 14:27:46 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:27:46 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:27:46 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:27:46 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:27:46 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:27:46 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:27:46 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:27:46 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:27:46 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:27:46 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:27:46 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:27:46 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:27:46 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:27:46 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:27:46 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:27:46 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:27:46 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:27:46 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:27:46 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:29:47 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-10-03 14:29:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:29:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:29:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:29:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:29:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:29:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:29:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:29:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:29:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:29:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:29:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:29:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:29:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:29:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:29:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:29:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:29:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:29:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:29:49 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:32:14 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-10-03 14:32:15 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:32:15 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:32:15 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:32:15 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:32:15 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:32:15 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:32:15 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:32:15 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:32:15 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:32:15 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:32:16 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:32:16 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:32:16 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:32:16 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:32:16 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:32:16 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:32:16 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:32:16 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:32:16 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:32:16 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:32:16 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:32:16 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:32:16 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:32:16 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:32:16 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:32:19 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-10-03 14:32:19 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-10-03 14:32:20 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-10-03 14:44:17 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-10-03 14:44:19 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:44:19 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:44:19 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:44:19 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:44:19 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:44:19 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:44:19 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:44:19 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:44:19 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:44:19 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:44:19 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:44:19 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:44:19 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:44:19 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:44:19 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:44:19 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:44:19 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:44:19 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:44:19 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:44:19 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:44:19 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:44:19 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:44:19 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:44:19 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:44:19 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:44:22 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-10-03 14:44:22 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-10-03 14:44:23 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-10-03 14:45:29 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-10-03 14:45:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:45:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:45:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:45:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:45:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:45:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:45:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:45:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:45:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:45:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:45:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:45:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:45:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:45:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:45:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:45:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:45:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:45:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:45:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:45:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:45:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:45:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:45:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:45:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:45:31 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 14:45:36 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-10-03 14:45:37 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-10-03 15:03:24 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-10-03 15:03:24 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-10-03 15:03:27 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'' +Timestamp: 2025-10-03 15:03:35 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-10-03 15:03:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 15:03:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 15:03:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 15:03:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 15:03:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 15:03:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 15:03:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 15:03:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 15:03:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 15:03:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 15:03:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 15:03:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 15:03:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 15:03:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 15:03:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 15:03:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 15:03:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 15:03:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 15:03:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 15:03:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 15:03:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 15:03:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 15:03:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 15:03:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 15:03:36 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 15:03:39 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-10-03 15:03:39 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-10-03 15:03:40 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-10-03 16:46:30 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-10-03 16:46:32 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 16:46:32 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 16:46:32 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 16:46:32 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 16:46:32 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 16:46:32 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 16:46:32 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 16:46:32 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 16:46:32 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 16:46:32 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 16:46:32 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 16:46:32 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 16:46:32 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 16:46:32 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 16:46:32 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 16:46:32 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 16:46:32 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 16:46:32 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 16:46:32 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 16:46:32 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 16:46:32 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 16:46:32 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 16:46:32 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 16:46:32 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 16:46:32 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 16:46:36 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-10-03 16:46:36 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-10-03 16:46:36 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-10-03 17:15:14 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-10-03 17:15:16 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:17:22 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-10-03 17:17:25 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:17:25 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:17:25 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:17:25 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:17:25 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:17:25 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:17:25 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:17:25 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:17:25 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:17:25 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:17:25 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:17:25 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:17:25 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:17:25 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:17:25 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:17:25 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:17:25 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:17:25 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:17:25 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:17:25 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:17:25 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:17:25 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:17:25 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:17:25 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:17:25 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:17:29 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-10-03 17:17:29 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-10-03 17:17:30 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-10-03 17:37:01 | User: Unknown | Action: Login | Details: User admin logged in (static user) +Timestamp: 2025-10-03 17:37:03 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-10-03 17:37:03 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-10-03 17:37:04 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-10-03 17:39:07 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-10-03 17:39:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:39:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:39:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:39:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:39:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:39:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:39:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:39:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:39:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:39:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:39:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:39:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:39:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:39:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:39:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:39:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:39:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:39:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:39:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:39:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:39:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:39:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:39:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:39:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:39:09 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:39:12 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-10-03 17:39:12 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-10-03 17:39:13 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-10-03 17:44:09 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-10-03 17:44:41 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-10-03 17:45:01 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-10-03 17:45:21 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-10-03 17:45:31 | User: Unknown | Action: Check District | Details: User admin Checked District 'Muzaffarnagar' +Timestamp: 2025-10-03 17:45:32 | User: Unknown | Action: Check District | Details: User admin Checked District 'Muzaffarnagar' +Timestamp: 2025-10-03 17:45:32 | User: Unknown | Action: Add District | Details: User admin Added District 'Muzaffarnagar' +Timestamp: 2025-10-03 17:45:42 | User: Unknown | Action: Get District | Details: User admin Get District '4' +Timestamp: 2025-10-03 17:45:44 | User: Unknown | Action: Check Block | Details: User admin Checked block 'Muzaffarnagar' +Timestamp: 2025-10-03 17:45:45 | User: Unknown | Action: Check Block | Details: User admin Checked block 'Muzaffarnagar' +Timestamp: 2025-10-03 17:45:45 | User: Unknown | Action: Add Block | Details: User admin Added block 'Muzaffarnagar' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:57 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:45:58 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:46:36 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'j' +Timestamp: 2025-10-03 17:46:36 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ja' +Timestamp: 2025-10-03 17:46:38 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ja' +Timestamp: 2025-10-03 17:49:50 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-10-03 17:49:52 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:49:52 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:49:52 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:49:52 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:49:52 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:49:52 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:49:52 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:49:52 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:49:52 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:49:55 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-10-03 17:49:56 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-10-03 17:49:56 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ar' +Timestamp: 2025-10-03 17:56:43 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-10-03 17:56:45 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:56:45 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:56:45 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-03 17:56:50 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-10-03 17:56:50 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'as' +Timestamp: 2025-10-03 17:56:52 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'as' +Timestamp: 2025-10-04 10:40:53 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-10-04 10:40:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-04 10:40:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-04 10:40:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-04 10:40:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-04 10:40:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-04 10:40:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-04 10:40:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-04 10:40:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-04 10:40:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-04 10:40:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-04 10:40:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-04 10:40:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-04 10:40:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-04 10:40:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-04 10:40:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-04 10:40:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-04 10:40:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-04 10:40:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-04 10:40:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-04 10:40:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-04 10:40:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-04 10:40:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-04 10:40:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-04 10:40:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-04 10:40:55 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-04 10:40:59 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-10-04 10:40:59 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-10-04 10:41:00 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-10-04 10:44:17 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-10-04 10:44:17 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-10-04 10:44:17 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-10-04 10:45:19 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-10-04 10:45:19 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-10-04 10:45:20 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-10-04 10:47:56 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-10-04 10:47:56 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-10-04 10:47:57 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-10-04 10:50:11 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-10-04 10:50:11 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-10-04 10:50:12 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-10-04 10:52:36 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-10-04 10:52:36 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-10-04 10:52:37 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-10-04 11:40:19 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-10-04 11:40:19 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-10-04 11:40:20 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-10-04 11:49:14 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-10-04 11:49:14 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-10-04 11:49:15 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ad' +Timestamp: 2025-10-04 15:07:42 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-10-04 15:07:42 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'aa' +Timestamp: 2025-10-04 15:07:42 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'aad' +Timestamp: 2025-10-04 15:07:43 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'aad' +Timestamp: 2025-10-04 17:27:24 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'aa' +Timestamp: 2025-10-04 17:27:24 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-10-04 17:27:24 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'aad' +Timestamp: 2025-10-04 17:27:25 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'aad' +Timestamp: 2025-10-06 13:03:06 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'd' +Timestamp: 2025-10-06 13:03:06 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'da' +Timestamp: 2025-10-06 13:03:06 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'day' +Timestamp: 2025-10-06 13:03:07 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'day' +Timestamp: 2025-10-06 13:08:38 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'd' +Timestamp: 2025-10-06 13:08:38 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'da' +Timestamp: 2025-10-06 13:08:38 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'day' +Timestamp: 2025-10-06 13:08:40 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'da' +Timestamp: 2025-10-06 13:08:40 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'd' +Timestamp: 2025-10-06 13:08:41 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'' +Timestamp: 2025-10-06 13:08:43 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-10-06 13:08:43 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ak' +Timestamp: 2025-10-06 13:08:44 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'akr' +Timestamp: 2025-10-06 13:08:44 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'akra' +Timestamp: 2025-10-06 13:08:45 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'akr' +Timestamp: 2025-10-06 13:08:45 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ak' +Timestamp: 2025-10-06 13:08:47 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ak' +Timestamp: 2025-10-06 13:09:20 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'd' +Timestamp: 2025-10-06 13:09:20 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'da' +Timestamp: 2025-10-06 13:09:21 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'day' +Timestamp: 2025-10-06 13:09:22 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'day' +Timestamp: 2025-10-06 13:15:23 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'd' +Timestamp: 2025-10-06 13:15:23 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'da' +Timestamp: 2025-10-06 13:15:24 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'day' +Timestamp: 2025-10-06 13:15:26 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'da' +Timestamp: 2025-10-06 13:15:26 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'd' +Timestamp: 2025-10-06 13:15:26 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'' +Timestamp: 2025-10-06 13:15:41 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-10-06 13:15:45 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 13:15:45 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 13:15:45 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 13:15:45 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 13:15:45 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 13:15:45 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 13:15:45 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 13:15:45 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 13:15:46 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 13:15:46 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 13:15:46 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 13:15:46 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 13:15:46 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 13:15:46 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 13:15:46 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 13:15:46 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 13:15:46 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 13:15:46 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 13:15:46 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 13:15:46 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 13:15:46 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 13:15:46 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 13:15:46 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 13:15:46 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 13:15:46 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 13:15:46 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 13:15:46 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 13:15:46 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 13:15:46 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 13:15:46 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 13:15:46 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 13:15:51 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'd' +Timestamp: 2025-10-06 13:15:51 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'da' +Timestamp: 2025-10-06 13:15:52 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'day' +Timestamp: 2025-10-06 13:15:53 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'day' +Timestamp: 2025-10-06 13:25:20 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-10-06 13:25:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 13:25:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 13:25:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 13:25:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 13:25:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 13:25:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 13:25:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 13:25:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 13:25:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 13:25:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 13:25:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 13:25:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 13:25:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 13:25:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 13:25:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 13:25:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 13:25:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 13:25:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 13:25:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 13:25:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 13:25:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 13:25:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 13:25:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 13:25:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 13:25:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 13:25:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 13:25:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 13:25:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 13:25:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 13:25:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 13:25:22 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 13:25:25 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'd' +Timestamp: 2025-10-06 13:25:26 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'da' +Timestamp: 2025-10-06 13:25:26 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'day' +Timestamp: 2025-10-06 13:25:27 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'day' +Timestamp: 2025-10-06 14:58:02 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'd' +Timestamp: 2025-10-06 14:58:02 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'da' +Timestamp: 2025-10-06 14:58:05 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'da' +Timestamp: 2025-10-06 15:00:04 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'd' +Timestamp: 2025-10-06 15:00:04 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'da' +Timestamp: 2025-10-06 15:00:06 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'da' +Timestamp: 2025-10-06 15:00:21 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-10-06 15:00:24 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 15:00:24 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 15:00:24 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 15:00:24 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 15:00:24 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 15:00:24 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 15:00:24 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 15:00:24 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 15:00:24 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 15:00:24 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 15:00:24 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 15:00:24 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 15:00:24 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 15:00:24 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 15:00:24 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 15:00:24 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 15:00:24 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 15:00:24 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 15:00:24 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 15:00:24 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 15:00:24 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 15:00:24 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 15:00:24 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 15:00:24 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 15:00:24 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 15:00:24 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 15:00:24 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 15:00:24 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 15:00:24 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 15:00:24 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 15:00:24 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-06 15:00:33 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'd' +Timestamp: 2025-10-06 15:00:33 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'da' +Timestamp: 2025-10-06 15:00:33 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'day' +Timestamp: 2025-10-06 15:00:34 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'day' +Timestamp: 2025-10-06 17:30:50 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' + +Timestamp: 2025-10-06 17:30:50 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'aad' +Timestamp: 2025-10-06 17:30:53 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-10-06 17:30:53 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'' +Timestamp: 2025-10-08 12:09:50 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'm' +Timestamp: 2025-10-08 12:09:50 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'm' +Timestamp: 2025-10-08 12:32:42 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'm' +Timestamp: 2025-10-08 12:32:42 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'ms' +Timestamp: 2025-10-08 12:32:43 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'm' +Timestamp: 2025-10-08 12:32:44 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'm' +Timestamp: 2025-10-08 12:58:25 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'm' +Timestamp: 2025-10-08 12:58:25 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'm' +Timestamp: 2025-10-08 12:59:22 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'm' +Timestamp: 2025-10-08 12:59:23 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'm' +Timestamp: 2025-10-09 10:20:50 | User: Unknown | Action: Login | Details: User admin logged in (static user) +Timestamp: 2025-10-09 10:21:30 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'm' +Timestamp: 2025-10-09 10:21:31 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'm' +Timestamp: 2025-10-09 10:31:00 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'm' +Timestamp: 2025-10-09 10:31:02 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'm' +Timestamp: 2025-10-09 10:31:50 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-10-09 10:31:53 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-09 10:31:53 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-09 10:31:53 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-09 10:31:53 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-09 10:31:53 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-09 10:31:53 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-09 10:31:53 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-09 10:31:53 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-09 10:31:53 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-09 10:31:53 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-09 10:31:53 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-09 10:31:53 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-09 10:31:53 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-09 10:31:53 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-09 10:31:53 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-09 10:31:53 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-09 10:31:53 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-09 10:31:53 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-09 10:31:53 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-09 10:31:53 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-09 10:31:53 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-09 10:31:53 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-09 10:31:53 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-09 10:31:53 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-09 10:31:53 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-09 10:31:53 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-09 10:31:53 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-09 10:31:53 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-09 10:31:53 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-09 10:31:53 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-09 10:31:53 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-09 10:31:53 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-09 10:31:53 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-09 10:31:53 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-09 10:31:53 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-09 10:31:53 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-09 10:31:53 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-09 10:31:54 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-09 10:31:54 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-09 10:31:54 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-09 10:31:54 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-09 10:31:54 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-09 10:31:54 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-09 10:31:54 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-09 10:31:54 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-09 10:31:54 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-09 10:31:54 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-09 10:31:54 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-09 10:31:54 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-09 10:31:54 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-09 10:31:54 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-09 10:31:54 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-09 10:31:54 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-09 10:31:54 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-09 10:31:54 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-09 10:31:54 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-09 10:31:54 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-09 10:31:54 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-09 10:31:54 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-09 10:31:54 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-09 10:31:54 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-09 10:31:59 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'm' +Timestamp: 2025-10-09 10:32:00 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'm' +Timestamp: 2025-10-14 10:25:59 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-10-14 10:25:59 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-10-15 10:27:20 | User: Unknown | Action: Login | Details: User admin logged in (static user) +Timestamp: 2025-10-15 10:27:29 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-10-15 10:27:30 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-10-15 15:44:05 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-10-15 15:44:05 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-10-15 15:44:24 | User: Unknown | Action: Upload Excel File | Details: User adminUpload Excel File'' +Timestamp: 2025-10-15 15:44:27 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-15 15:44:27 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-15 15:44:27 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-15 15:44:27 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-15 15:44:27 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-15 15:44:27 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-15 15:44:27 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-15 15:44:27 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-15 15:44:27 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-15 15:44:27 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-15 15:44:27 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-15 15:44:27 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-15 15:44:27 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-15 15:44:27 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-15 15:44:27 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-15 15:44:27 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-15 15:44:27 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-15 15:44:27 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-15 15:44:27 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-15 15:44:27 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-15 15:44:27 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-15 15:44:27 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-15 15:44:27 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-15 15:44:27 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-15 15:44:27 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-15 15:44:27 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-15 15:44:27 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-15 15:44:27 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-15 15:44:28 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-15 15:44:28 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-15 15:44:28 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-15 15:44:28 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-15 15:44:28 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-15 15:44:28 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-15 15:44:28 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-15 15:44:28 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-15 15:44:28 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-15 15:44:28 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-15 15:44:28 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-15 15:44:28 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-15 15:44:28 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-15 15:44:28 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-15 15:44:28 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-15 15:44:28 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-15 15:44:28 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-15 15:44:28 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-15 15:44:28 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-15 15:44:28 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-15 15:44:28 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-15 15:44:28 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-15 15:44:28 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-15 15:44:28 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-15 15:44:28 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-15 15:44:28 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-15 15:44:28 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-15 15:44:28 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-15 15:44:28 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-15 15:44:28 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-15 15:44:28 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-15 15:44:28 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-15 15:44:28 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-15 15:44:28 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-15 15:44:28 | User: Unknown | Action: Data saved | Details: User admin Data saved'None' +Timestamp: 2025-10-15 15:44:31 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-10-15 15:44:32 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-10-23 14:48:46 | User: Unknown | Action: Login | Details: User admin logged in (static user) +Timestamp: 2025-10-23 18:28:12 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-10-23 18:28:16 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-10-23 18:31:12 | User: Unknown | Action: Login | Details: User admin logged in (static user) +Timestamp: 2025-10-23 18:31:17 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-10-23 18:31:18 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-10-23 18:37:04 | User: Unknown | Action: Logout | Details: User admin logged out +Timestamp: 2025-10-23 18:37:09 | User: Unknown | Action: Login | Details: User admin logged in (static user) +Timestamp: 2025-10-23 20:13:02 | User: Unknown | Action: Logout | Details: User admin logged out +Timestamp: 2025-10-23 20:13:10 | User: Unknown | Action: Login | Details: User admin logged in (static user) +Timestamp: 2025-10-23 20:13:36 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-10-23 20:13:36 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'aa' +Timestamp: 2025-10-23 20:13:37 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'aa' +Timestamp: 2025-10-23 20:13:41 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-10-23 20:13:43 | User: Unknown | Action: Search contractor | Details: User admin Search contractor'a' +Timestamp: 2025-11-12 15:51:31 | User: Unknown | Action: Login | Details: User admin logged in (static user) +Timestamp: 2025-11-12 15:51:35 | User: Unknown | Action: Logout | Details: User admin logged out +Timestamp: 2025-11-14 17:51:17 | User: Unknown | Action: Login | Details: +Timestamp: 2025-11-14 17:54:56 | User: Unknown | Action: Login | Details: +Timestamp: 2025-11-14 17:57:06 | User: Unknown | Action: Logout | Details: +Timestamp: 2025-11-14 17:57:11 | User: Unknown | Action: Login | Details: +Timestamp: 2025-11-14 18:14:25 | User: Unknown | Action: Search contractor | Details: +Timestamp: 2025-11-14 19:38:45 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-14 19:38:45 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-14 19:38:45 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-14 19:38:45 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-14 19:38:46 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-14 19:38:46 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-14 19:38:46 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-14 19:38:48 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-14 19:38:48 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-14 19:38:50 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-14 19:38:51 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-14 19:38:52 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-14 19:38:54 | User: Unknown | Action: Add State | Details: +Timestamp: 2025-11-14 19:43:35 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-14 19:43:35 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-14 19:43:35 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-14 19:43:35 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-14 19:43:35 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-14 19:43:36 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-14 19:43:37 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-14 19:43:37 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-14 19:43:37 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-14 19:43:37 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-14 19:43:37 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-14 19:43:37 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-14 19:43:37 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-14 19:43:37 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-14 19:43:38 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-14 19:43:39 | User: Unknown | Action: Add State | Details: +Timestamp: 2025-11-14 19:44:24 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-14 19:44:24 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-14 19:44:24 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-14 19:44:24 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-14 19:44:30 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-14 19:44:30 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-14 19:44:32 | User: Unknown | Action: Add State | Details: +Timestamp: 2025-11-15 13:13:57 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 13:13:57 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 13:13:57 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 13:13:57 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 13:13:59 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 13:28:01 | User: Unknown | Action: Delete State | Details: +Timestamp: 2025-11-15 13:29:05 | User: Unknown | Action: Delete State | Details: +Timestamp: 2025-11-15 13:29:24 | User: Unknown | Action: Delete State | Details: +Timestamp: 2025-11-15 13:30:12 | User: Unknown | Action: Delete State | Details: +Timestamp: 2025-11-15 13:33:03 | User: Unknown | Action: Delete State | Details: +Timestamp: 2025-11-15 13:33:37 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 13:33:37 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 13:33:38 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 13:33:38 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 13:33:40 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 13:33:41 | User: Unknown | Action: Add State | Details: +Timestamp: 2025-11-15 13:33:48 | User: Unknown | Action: Delete State | Details: +Timestamp: 2025-11-15 13:34:55 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 13:34:55 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 13:34:56 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 13:34:56 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 13:34:56 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 13:34:58 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 13:34:58 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 13:34:59 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 13:35:00 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 13:35:02 | User: Unknown | Action: Add State | Details: +Timestamp: 2025-11-15 13:35:08 | User: Unknown | Action: Delete State | Details: +Timestamp: 2025-11-15 13:35:26 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 13:35:27 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 13:35:27 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 13:35:29 | User: Unknown | Action: Add State | Details: +Timestamp: 2025-11-15 13:35:34 | User: Unknown | Action: Delete State | Details: +Timestamp: 2025-11-15 13:36:43 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 13:36:43 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 13:36:43 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 13:36:45 | User: Unknown | Action: Add State | Details: +Timestamp: 2025-11-15 13:36:52 | User: Unknown | Action: Delete State | Details: +Timestamp: 2025-11-15 13:39:35 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 13:39:35 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 13:39:36 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 13:39:36 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 13:39:38 | User: Unknown | Action: Add State | Details: +Timestamp: 2025-11-15 13:39:46 | User: Unknown | Action: Delete State | Details: +Timestamp: 2025-11-15 13:44:28 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 13:44:28 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 13:44:28 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 13:44:28 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 13:44:29 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 13:44:29 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 13:44:29 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 13:44:30 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 13:44:30 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 13:44:30 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 13:44:31 | User: Unknown | Action: Add State | Details: +Timestamp: 2025-11-15 13:44:42 | User: Unknown | Action: Delete State | Details: +Timestamp: 2025-11-15 13:46:23 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 13:46:23 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 13:46:23 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 13:46:25 | User: Unknown | Action: Add State | Details: +Timestamp: 2025-11-15 13:46:59 | User: Unknown | Action: Delete State | Details: +Timestamp: 2025-11-15 13:47:38 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 13:47:38 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 13:47:39 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 13:47:40 | User: Unknown | Action: Add State | Details: +Timestamp: 2025-11-15 13:47:45 | User: Unknown | Action: Delete State | Details: +Timestamp: 2025-11-15 13:48:54 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 13:48:55 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 13:48:55 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 13:48:56 | User: Unknown | Action: Add State | Details: +Timestamp: 2025-11-15 13:49:02 | User: Unknown | Action: Delete State | Details: +Timestamp: 2025-11-15 16:09:12 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 16:09:12 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 16:09:13 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 16:09:16 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 16:09:16 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 16:09:17 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 16:09:17 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 16:09:29 | User: Unknown | Action: Add State | Details: +Timestamp: 2025-11-15 16:09:35 | User: Unknown | Action: Delete State | Details: +Timestamp: 2025-11-15 16:09:51 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 16:09:51 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 16:09:51 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 16:09:51 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 16:09:51 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 16:09:51 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 16:09:54 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 16:09:54 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 16:09:54 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 16:09:54 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 16:09:55 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 16:09:55 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 16:09:56 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 16:09:56 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 16:09:56 | User: Unknown | Action: Check State | Details: +Timestamp: 2025-11-15 16:09:57 | User: Unknown | Action: Add State | Details: +Timestamp: 2025-11-15 16:10:08 | User: Unknown | Action: Delete State | Details: +Timestamp: 2025-11-15 16:18:38 | User: Unknown | Action: Edit State | Details: +Timestamp: 2025-11-15 16:18:53 | User: Unknown | Action: Edit State | Details: +Timestamp: 2025-11-15 16:43:27 | User: Unknown | Action: Edit State | Details: +Timestamp: 2025-11-15 18:42:45 | User: Unknown | Action: Get District | Details: +Timestamp: 2025-11-15 18:42:49 | User: Unknown | Action: Check Block | Details: +Timestamp: 2025-11-15 18:42:49 | User: Unknown | Action: Check Block | Details: +Timestamp: 2025-11-15 18:42:49 | User: Unknown | Action: Check Block | Details: +Timestamp: 2025-11-15 18:42:49 | User: Unknown | Action: Check Block | Details: +Timestamp: 2025-11-15 18:42:50 | User: Unknown | Action: Check Block | Details: +Timestamp: 2025-11-15 18:42:52 | User: Unknown | Action: Check Block | Details: +Timestamp: 2025-11-15 18:42:55 | User: Unknown | Action: Add Block | Details: diff --git a/config.py b/config.py index e7b4fa9..5d13397 100644 --- a/config.py +++ b/config.py @@ -5,7 +5,7 @@ import os # Get MySQL credentials from environment variables MYSQL_HOST = os.getenv("MYSQL_HOST", "127.0.0.1") MYSQL_USER = os.getenv("MYSQL_USER", "root") -MYSQL_PASSWORD = os.getenv("MYSQL_PASSWORD", "admin") +MYSQL_PASSWORD = os.getenv("MYSQL_PASSWORD", "root") MYSQL_DB = os.getenv("MYSQL_DB", "test") # Connect to MySQL @@ -15,4 +15,4 @@ def get_db_connection(): user=MYSQL_USER, password=MYSQL_PASSWORD, database=MYSQL_DB - ) \ No newline at end of file + ) \ No newline at end of file diff --git a/logs/activity.log b/logs/activity.log new file mode 100644 index 0000000..e69de29 diff --git a/logs/audit.log b/logs/audit.log new file mode 100644 index 0000000..02c0a11 --- /dev/null +++ b/logs/audit.log @@ -0,0 +1,74 @@ +2025-08-22 13:29:24,485 | User: v.sinha | Action: Login | Details: User v.sinha logged in | IP: 192.168.0.180 +2025-08-22 13:41:42,046 | User: v.sinha | Action: Logout | Details: User v.sinha logged out | IP: 192.168.0.180 +2025-08-22 14:07:01,924 | User: v.sinha | Action: Login | Details: User v.sinha logged in | IP: 192.168.0.180 +2025-08-22 15:05:59,287 | User: v.sinha | Action: Logout | Details: User v.sinha logged out | IP: 192.168.0.180 +2025-08-22 15:06:05,201 | User: v.sinha | Action: Login | Details: User v.sinha logged in | IP: 192.168.0.180 +2025-08-23 15:58:28,248 | User: v.sinha | Action: Login | Details: User v.sinha logged in | IP: 192.168.0.180 +2025-08-23 17:33:06,648 | User: v.sinha | Action: Login | Details: User v.sinha logged in | IP: 192.168.0.180 +2025-08-23 17:39:08,442 | User: v.sinha | Action: Login | Details: User v.sinha logged in | IP: 192.168.0.180 +2025-08-23 18:14:51,722 | User: v.sinha | Action: Login | Details: User v.sinha logged in | IP: 192.168.0.180 +2025-08-25 11:57:12,202 | User: v.sinha | Action: Login | Details: User v.sinha logged in | IP: 192.168.0.238 +2025-08-25 12:00:17,780 | User: v.sinha | Action: Login | Details: User v.sinha logged in | IP: 192.168.0.181 +2025-08-25 14:09:29,385 | User: v.sinha | Action: Login | Details: User v.sinha logged in | IP: 192.168.0.181 +2025-08-25 14:12:35,084 | User: v.sinha | Action: Login | Details: User v.sinha logged in | IP: 192.168.0.181 +2025-08-25 14:23:53,539 | User: v.sinha | Action: Checked State | Details: User MP Checking State | IP: 192.168.0.181 +2025-08-25 14:23:54,024 | User: v.sinha | Action: Added State | Details: User MP Adding State | IP: 192.168.0.181 +2025-08-25 14:23:57,113 | User: v.sinha | Action: Deleted State | Details: User 11 Deleting State | IP: 192.168.0.181 +2025-08-25 14:31:55,715 | User: v.sinha | Action: Login | Details: User v.sinha logged in | IP: 192.168.0.181 +2025-08-25 14:36:21,158 | User: v.sinha | Action: Checked State | Details: User MP Checking State | IP: 192.168.0.181 +2025-08-25 14:36:21,496 | User: v.sinha | Action: Added State | Details: State 'MP' added. | IP: 192.168.0.181 +2025-08-25 14:47:08,719 | User: v.sinha | Action: Checked State | Details: User Maharashtra Checking State | IP: 192.168.0.181 +2025-08-25 14:47:14,759 | User: v.sinha | Action: Deleted State | Details: User 12 Deleting State | IP: 192.168.0.181 +2025-08-25 14:47:16,915 | User: v.sinha | Action: Checked State | Details: User MP Checking State | IP: 192.168.0.181 +2025-08-25 14:47:17,708 | User: v.sinha | Action: Added State | Details: State 'MP' added. | IP: 192.168.0.181 +2025-08-25 14:49:09,480 | User: v.sinha | Action: Checked State | Details: User MP Checking State | IP: 192.168.0.181 +2025-08-25 14:49:13,014 | User: v.sinha | Action: Deleted State | Details: User 13 Deleting State | IP: 192.168.0.181 +2025-08-25 14:49:14,584 | User: v.sinha | Action: Checked State | Details: User MP Checking State | IP: 192.168.0.181 +2025-08-25 14:49:15,055 | User: v.sinha | Action: Added State | Details: State 'MP' added. | IP: 192.168.0.181 +2025-08-25 14:51:55,187 | User: v.sinha | Action: Checked State | Details: User MP Checking State | IP: 192.168.0.181 +2025-08-25 14:51:58,463 | User: v.sinha | Action: Deleted State | Details: User 14 Deleting State | IP: 192.168.0.181 +2025-08-25 14:52:00,606 | User: v.sinha | Action: Checked State | Details: User MP Checking State | IP: 192.168.0.181 +2025-08-25 14:52:00,953 | User: v.sinha | Action: Added State | Details: State 'MP' added. | IP: 192.168.0.181 +2025-08-25 14:54:26,674 | User: v.sinha | Action: Deleted State | Details: User 15 Deleting State | IP: 192.168.0.181 +2025-08-25 14:54:28,892 | User: v.sinha | Action: Checked State | Details: User MP Checking State | IP: 192.168.0.181 +2025-08-25 14:54:29,553 | User: v.sinha | Action: Added State | Details: State 'MP' added. | IP: 192.168.0.181 +2025-08-25 15:18:37,773 | User: v.sinha | Action: Logout | Details: User v.sinha logged out | IP: 192.168.0.181 +2025-08-25 15:18:43,347 | User: v.sinha | Action: Login | Details: User v.sinha logged in | IP: 192.168.0.181 +2025-08-25 15:20:41,331 | User: v.sinha | Action: Logout | Details: User v.sinha logged out | IP: 192.168.0.181 +2025-08-25 15:20:47,525 | User: v.sinha | Action: Login | Details: User v.sinha logged in | IP: 192.168.0.181 +2025-08-25 15:20:55,687 | User: v.sinha | Action: Checked State | Details: User MP Checking State | IP: 192.168.0.181 +2025-08-25 15:20:58,544 | User: v.sinha | Action: Deleted State | Details: User 16 Deleting State | IP: 192.168.0.181 +2025-08-25 16:33:49,898 | User: v.sinha | Action: Check State | Details: User v.sinha Checked state 'MP' | IP: 192.168.0.181 +2025-08-25 16:33:50,394 | User: v.sinha | Action: Add State | Details: User v.sinha added state 'MP' | IP: 192.168.0.181 +2025-08-25 16:43:46,446 | User: v.sinha | Action: Login | Details: User v.sinha logged in | IP: 192.168.0.181 +2025-08-25 16:43:49,710 | User: v.sinha | Action: Logout | Details: User v.sinha logged out | IP: 192.168.0.181 +2025-08-25 16:43:58,093 | User: v.sinha | Action: Login | Details: User v.sinha logged in | IP: 192.168.0.181 +2025-08-25 16:44:11,935 | User: v.sinha | Action: Check State | Details: User v.sinha Checked state 'shamli' | IP: 192.168.0.181 +2025-08-25 16:44:12,466 | User: v.sinha | Action: Add State | Details: User v.sinha added state 'shamli' | IP: 192.168.0.181 +2025-08-25 16:44:17,731 | User: v.sinha | Action: Delete State | Details: User v.sinha Deleted state '18' | IP: 192.168.0.181 +2025-08-25 16:57:27,983 | User: v.sinha | Action: Logout | Details: User v.sinha logged out | IP: 192.168.0.181 +2025-08-25 16:57:33,498 | User: v.sinha | Action: Login | Details: User v.sinha logged in | IP: 192.168.0.181 +2025-08-25 16:57:41,438 | User: v.sinha | Action: Check State | Details: User v.sinha Checked state 'shamli' | IP: 192.168.0.181 +2025-08-25 16:57:42,250 | User: v.sinha | Action: Add State | Details: User v.sinha added state 'shamli' | IP: 192.168.0.181 +2025-08-25 16:57:45,339 | User: v.sinha | Action: Delete State | Details: User v.sinha Deleted state '19' | IP: 192.168.0.181 +2025-08-25 16:57:48,794 | User: v.sinha | Action: Delete State | Details: User v.sinha Deleted state '17' | IP: 192.168.0.181 +2025-08-25 17:04:11,021 | User: v.sinha | Action: Logout | Details: User v.sinha logged out | IP: 192.168.0.181 +2025-08-25 17:04:16,165 | User: v.sinha | Action: Login | Details: User v.sinha logged in | IP: 192.168.0.181 +2025-08-25 17:04:21,702 | User: v.sinha | Action: Check State | Details: User v.sinha Checked state 'shamli' | IP: 192.168.0.181 +2025-08-25 17:04:22,159 | User: v.sinha | Action: Add State | Details: User v.sinha added state 'shamli' | IP: 192.168.0.181 +2025-08-25 17:04:26,850 | User: v.sinha | Action: Check State | Details: User v.sinha Checked state 'M' | IP: 192.168.0.181 +2025-08-25 17:04:27,076 | User: v.sinha | Action: Check State | Details: User v.sinha Checked state 'MP' | IP: 192.168.0.181 +2025-08-25 17:04:28,070 | User: v.sinha | Action: Add State | Details: User v.sinha added state 'MP' | IP: 192.168.0.181 +2025-08-25 17:04:32,165 | User: v.sinha | Action: Delete State | Details: User v.sinha Deleted state '21' | IP: 192.168.0.181 +2025-08-25 17:04:35,058 | User: v.sinha | Action: Delete State | Details: User v.sinha Deleted state '20' | IP: 192.168.0.181 +2025-08-25 17:06:05,113 | User: v.sinha | Action: Check District | Details: User v.sinha Checked District 'Shamli' | IP: 192.168.0.181 +2025-08-25 17:06:05,114 | User: v.sinha | Action: Check District | Details: User v.sinha Checked District 'Shamli' | IP: 192.168.0.181 +2025-08-25 17:06:08,040 | User: v.sinha | Action: Check District | Details: User v.sinha Checked District 'p' | IP: 192.168.0.181 +2025-08-25 17:06:08,360 | User: v.sinha | Action: Check District | Details: User v.sinha Checked District 'pu' | IP: 192.168.0.181 +2025-08-25 17:06:08,554 | User: v.sinha | Action: Check District | Details: User v.sinha Checked District 'pun' | IP: 192.168.0.181 +2025-08-25 17:06:08,756 | User: v.sinha | Action: Check District | Details: User v.sinha Checked District 'pune' | IP: 192.168.0.181 +2025-08-25 17:06:10,190 | User: v.sinha | Action: Check District | Details: User v.sinha Checked District 'pune' | IP: 192.168.0.181 +2025-08-25 17:06:11,204 | User: v.sinha | Action: Check District | Details: User v.sinha Checked District 'pune' | IP: 192.168.0.181 +2025-08-25 17:06:11,206 | User: v.sinha | Action: Check District | Details: User v.sinha Checked District 'pune' | IP: 192.168.0.181 +2025-08-25 17:06:13,085 | User: v.sinha | Action: Add District | Details: User v.sinha Added District 'pune' | IP: 192.168.0.181 +2025-08-25 17:06:19,524 | User: v.sinha | Action: Delete District | Details: User v.sinha Deleted District '5' | IP: 192.168.0.181 diff --git a/main.py b/main.py index b5a03bd..c321c23 100644 --- a/main.py +++ b/main.py @@ -1,402 +1,270 @@ - from decimal import Decimal +from AppCode import ContractorInfo, Auth, Utilities, Log +from AppCode.Utilities import RegEx, ResponseHandler, HtmlHelper +from AppCode.Auth import LoginLDAP, User +from AppCode.Log import LogData, LogHelper +from AppCode.State import State +from AppCode.District import District +from AppCode.Block import Block +from AppCode.Village import Village +# need to optimize above import lines + from flask import Flask, render_template, request, redirect, url_for, send_from_directory, flash, jsonify, json +from flask import current_app, session, send_file + +from flask_login import LoginManager, UserMixin, login_user, logout_user, login_required, current_user + import mysql.connector from mysql.connector import Error + import config -import openpyxl import os import re import ast from datetime import datetime + + + +import openpyxl +from openpyxl import load_workbook +from openpyxl.styles import Font, PatternFill, Alignment +from openpyxl.utils import get_column_letter + + +import logging + import pandas as pd -from openpyxl.styles import Font + + +#import AppRoutes.StateRoute + # this is server app = Flask(__name__) +login_manager = LoginManager() +login_manager.init_app(app) +login_manager.login_view = 'login' + + +@login_manager.user_loader +def load_user(user_id): + return User(user_id) +#need to check and understand above function + app.secret_key = '9f2a1b8c4d6e7f0123456789abcdef01' - -str_pattern_reg = "^[A-Za-z ]+$" +#Shouldnt be hardcoded -class ResponseHandler: - @staticmethod - def invalid_name(entity): - return {'status': 'error', 'message': f'Invalid {entity} name. Only letters are allowed!'} - - @staticmethod - def already_exists(entity): - return {'status': 'exists', 'message': f'{entity.capitalize()} already exists!'} - - @staticmethod - def add_success(entity): - return {'status': 'success', 'message': f'{entity.capitalize()} added successfully!'} - - @staticmethod - def add_failure(entity): - return {'status': 'error', 'message': f'Failed to add {entity}.'} - - @staticmethod - def is_available(entity): - return {'status': 'available', 'message': f'{entity.capitalize()} name is available!'} - - @staticmethod - def delete_success(entity): - return {'status': 'success', 'message': f'{entity.capitalize()} deleted successfully!'} - - @staticmethod - def delete_failure(entity): - return {'status': 'error', 'message': f'Failed to delete {entity}.'} - - @staticmethod - def update_success(entity): - return {'status': 'success', 'message': f'{entity.capitalize()} updated successfully!'} - - @staticmethod - def update_failure(entity): - return {'status': 'error', 'message': f'Failed to update {entity}.'} - - @staticmethod - def fetch_failure(entity): - return f"Failed to fetch {entity}" - - -# Helper: JSON Response Formatter -def json_response(message_obj, status_code): - return jsonify(message_obj), status_code # this is Index page OR Home page.. @app.route('/') +@login_required def index(): return render_template('index.html') -# this is Profile page .. -@app.route('/admin_profile', methods=['GET', 'POST']) -def admin_profile(): - return render_template('admin_profile.html') + + + +# ---------------- LOGIN ROUTE ---------------- + +@app.route('/login', methods=['GET', 'POST']) +def login(): + if request.method == 'POST': + loginData = LoginLDAP(request) + # If bind successful → set session and log + + if loginData.isValidLogin: + if loginData.isDefaultCredentials: + LogHelper.log_action('Login', f"User {loginData.username} logged in (static user)") + else: + LogHelper.log_action('Login', f"User {loginData.username} logged in (LDAP)") + + session['username'] = loginData.username + login_user(User(loginData.username)) + return redirect(url_for('index', login='success')) + else: + flash(loginData.errorMessage, 'danger') + + return render_template('login.html') + + + + +@app.route('/logout') +@login_required +def logout(): + LogHelper.log_action('Logout', f"User {current_user.id} logged out") # log the event + logout_user() + flash('You have been logged out.', 'info') + return redirect(url_for('login')) + + + + +@app.route('/activity_log', methods=['GET', 'POST']) +@login_required +def activity_log(): + + # Filters (GET or POST) + start_date = request.values.get("start_date") + end_date = request.values.get("end_date") + user_name = request.values.get("username") + + logData = LogData() + filtered_logs = logData.GetFilteredActivitiesLog(start_date,end_date,user_name) + + return render_template( + "activity_log.html", + logs=filtered_logs, + start_date=start_date, + end_date=end_date, + username=user_name + ) + # ------------------------- State controller ------------------------------------------ @app.route('/add_state', methods=['GET', 'POST']) +@login_required def add_state(): - connection = config.get_db_connection() - statedata = [] - - if connection: - cursor = connection.cursor() - if request.method == 'POST': - state_name = request.form['state_Name'].strip() - - if not re.match(str_pattern_reg, state_name): - return json_response(ResponseHandler.invalid_name("state"), 400) - - try: - # cursor.execute("SELECT * FROM states WHERE State_Name = %s", (state_name,)) - # if cursor.fetchone(): - # return json_response(ResponseHandler.already_exists("state"), 409) - - cursor.callproc("CheckStateExists", (state_name,)) - for data in cursor.stored_results(): - existing_state = data.fetchone() - - if existing_state: - return json_response(ResponseHandler.already_exists("state"), 409) - - # cursor.execute("call SaveState (%s)", (state_name,)) - cursor.callproc("SaveState", (state_name,)) - connection.commit() - return json_response(ResponseHandler.add_success("state"), 200) - - except mysql.connector.Error as e: - print(f"Error inserting state: {e}") - return json_response(ResponseHandler.add_failure("state"), 500) - - try: - # cursor.execute("SELECT State_ID, State_Name FROM states") - # statedata = cursor.fetchall() - cursor.callproc("GetAllStates") - for res in cursor.stored_results(): - statedata = res.fetchall() - except mysql.connector.Error as e: - print(f"Error fetching states: {e}") - return ResponseHandler.fetch_failure("states"), 500 - finally: - cursor.close() - connection.close() - + state = State() + if request.method == 'POST': + state.AddState(request=request) + return state.resultMessage + + statedata = state.GetAllStates(request=request) return render_template('add_state.html', statedata=statedata) + # AJAX route to check state existence @app.route('/check_state', methods=['POST']) +@login_required def check_state(): - connection = config.get_db_connection() - - if connection: - cursor = connection.cursor() - state_name = request.json.get('state_Name', '').strip() - - if not re.match(str_pattern_reg, state_name): - return json_response(ResponseHandler.invalid_name("state"), 400) - - try: - # cursor.execute("SELECT * FROM states WHERE State_Name = %s", (state_name,)) - # existing_state = cursor.fetchone() - - cursor.callproc("CheckStateExists", (state_name,)) - for data in cursor.stored_results(): - existing_state = data.fetchone() - - if existing_state: - return json_response(ResponseHandler.already_exists("state"), 409) - else: - return json_response(ResponseHandler.is_available("state"), 200) - - except mysql.connector.Error as e: - print(f"Error checking state: {e}") - return json_response(ResponseHandler.add_failure("state"), 500) - finally: - cursor.close() - connection.close() - + state = State() + return state.CheckState(request=request) + # Delete State @app.route('/delete_state/', methods=['GET']) +@login_required def deleteState(id): - connection = config.get_db_connection() - cursor = connection.cursor() + state = State() + msg = state.DeleteState(request=request, id=id) - try: - # cursor.execute("DELETE FROM states WHERE State_ID = %s", (id,)) - cursor.callproc('DeleteState', (id,)) - connection.commit() - # For API response - # return json_response(ResponseHandler.delete_success("state"), 200) - - except mysql.connector.Error as e: - print(f"Error deleting data: {e}") - return json_response(ResponseHandler.delete_failure("state"), 500) - - finally: - cursor.close() - connection.close() - - return redirect(url_for('add_state')) + if not state.isSuccess: + return state.resultMessage + else: + return redirect(url_for('add_state')) # Edit State @app.route('/edit_state/', methods=['GET', 'POST']) +@login_required def editState(id): connection = config.get_db_connection() cursor = connection.cursor() - # str_pattern_reg = r"^[A-Za-z\s]+$" + + state = State() + statedata = [] if request.method == 'POST': - state_name = request.form['state_Name'].strip() + state.EditState(request=request, id=id) + if state.isSuccess: + return redirect(url_for('add_state')) + else: + return state.resultMessage + else: + statedata = state.GetStateByID(request=request, id=id) + + if not state.isSuccess: + return state.resultMessage + - if not re.match(str_pattern_reg, state_name): - return ResponseHandler.invalid_name("state"), 400 + if statedata is None: + statedata = [] - try: - # cursor.execute("UPDATE states SET State_Name = %s WHERE State_ID = %s", (state_name, id)) - cursor.callproc("UpdateStateById", (id, state_name)) - connection.commit() - return redirect(url_for('add_state')) - except mysql.connector.Error as e: - print(f"Error updating data: {e}") - return ResponseHandler.add_failure("state"), 500 - finally: - cursor.close() - connection.close() - - try: - # cursor.execute("SELECT * FROM states WHERE State_ID = %s", (id,)) - # state = cursor.fetchone() - cursor.callproc("GetStateByID", (id,)) - for result in cursor.stored_results(): - state = result.fetchone() - if state is None: - return "State not found", 404 - except mysql.connector.Error as e: - print(f"Error retrieving data: {e}") - return ResponseHandler.fetch_failure("state"), 500 - finally: - cursor.close() - connection.close() - - return render_template('edit_state.html', state=state) + return render_template('edit_state.html', state=statedata) # -------- end State controller ----------- # ------------------------- District controller ------------------------------------------ @app.route('/add_district', methods=['GET', 'POST']) +@login_required def add_district(): - connection = config.get_db_connection() - districtdata = [] - states = [] - - if connection: - cursor = connection.cursor() - - try: - # cursor.execute("SELECT State_ID, State_Name FROM states") - # states = cursor.fetchall() - cursor.callproc("GetAllStates") - for res in cursor.stored_results(): - states = res.fetchall() - - except mysql.connector.Error as e: - print(f"Error fetching states: {e}") - return ResponseHandler.fetch_failure("states"), 500 - - if request.method == 'POST': - district_name = request.form['district_Name'].strip() - state_id = request.form['state_Id'] - - if not re.match(str_pattern_reg, district_name): - return json_response(ResponseHandler.invalid_name("district"), 400) - - try: - # cursor.execute("SELECT * FROM districts WHERE District_Name = %s AND State_Id = %s", - # (district_name, state_id)) - cursor.callproc("GetDistrictByNameAndState", (district_name, state_id)) - for data in cursor.stored_results(): - rs = data.fetchone() - if rs: - return json_response(ResponseHandler.already_exists("district"), 409) - - cursor.callproc('SaveDistrict', (district_name, state_id)) - connection.commit() - - return json_response(ResponseHandler.add_success("district"), 200) - - except mysql.connector.Error as e: - print(f"Error inserting district: {e}") - return json_response(ResponseHandler.add_failure("district"), 500) - - try: - # cursor.execute("SELECT d.District_id, d.District_Name, s.State_Name, s.State_Id FROM districts d JOIN states s ON d.State_Id = s.State_ID") - # districtdata = cursor.fetchall() - cursor.callproc("GetAllDistricts") - for dis in cursor.stored_results(): - districtdata = dis.fetchall() - except mysql.connector.Error as e: - print(f"Error fetching districts: {e}") - return ResponseHandler.fetch_failure("districts"), 500 - finally: - cursor.close() - connection.close() - + district = District() + + if request.method == 'POST': + district.AddDistrict(request=request) + return district.resultMessage + state = State() + states = state.GetAllStates(request=request) + + districtdata = district.GetAllDistricts(request=request) + return render_template('add_district.html', districtdata=districtdata, states=states) # AJAX route to check district existence @app.route('/check_district', methods=['POST']) +@login_required def check_district(): - connection = config.get_db_connection() + district = District() + return district.CheckDistrict(request=request) + - if connection: - cursor = connection.cursor() - district_name = request.json.get('district_Name', '').strip() - state_id = request.json.get('state_Id', '') - - if not re.match(str_pattern_reg, district_name): - return json_response(ResponseHandler.invalid_name("district"), 400) - - try: - # cursor.execute("SELECT * FROM districts WHERE District_Name = %s AND State_Id = %s", - # (district_name, state_id)) - # existing_district = cursor.fetchone() - cursor.callproc("GetDistrictByNameAndState", (district_name, state_id,)) - for result in cursor.stored_results(): - existing_district = result.fetchone() - - if existing_district: - return json_response(ResponseHandler.already_exists("district"), 409) - else: - return json_response(ResponseHandler.is_available("district"), 200) - - except mysql.connector.Error as e: - print(f"Error checking district: {e}") - return json_response(ResponseHandler.add_failure("district"), 500) - finally: - cursor.close() - connection.close() - - -# this is delete District method by id.. -@app.route('/delete_district/', methods=['GET', 'POST']) +# Delete District +@app.route('/delete_district/', methods=['GET']) +@login_required def delete_district(district_id): - connection = config.get_db_connection() + district = District() + district.DeleteDistrict(request=request, id=district_id) - if connection: - cursor = connection.cursor() - try: - # cursor.execute("DELETE FROM districts WHERE District_id = %s", (district_id,)) - cursor.callproc("DeleteDistrict", (district_id,)) - connection.commit() - except mysql.connector.Error as e: - print(f"Error deleting district: {e}") - return json_response(ResponseHandler.delete_failure("district"), 500) - finally: - cursor.close() - connection.close() - - return redirect('/add_district') + if not district.isSuccess: + return district.resultMessage + else: + return redirect(url_for('add_district')) -# this is update District page by id .. +# Edit District @app.route('/edit_district/', methods=['GET', 'POST']) +@login_required def edit_district(district_id): - connection = config.get_db_connection() - districtdata = [] - states = [] + district = District() - if connection: - cursor = connection.cursor() - - # Retrieve all states for dropdown - try: - # cursor.execute("SELECT State_ID, State_Name FROM states") - # states = cursor.fetchall() - cursor.callproc("GetAllStates") - for res in cursor.stored_results(): - states = res.fetchall() - - except mysql.connector.Error as e: - print(f"Error fetching states: {e}") - return ResponseHandler.fetch_failure("states"), 500 - - # Retrieve district info - try: - # cursor.execute("SELECT District_Name, State_Id FROM districts WHERE District_id = %s", (district_id,)) - # districtdata = cursor.fetchone() - cursor.callproc("GetDistrictDataByID", (district_id,)) - for rs in cursor.stored_results(): - districtdata = rs.fetchone() - except mysql.connector.Error as e: - print(f"Error fetching district data: {e}") - return ResponseHandler.fetch_failure("district"), 500 - - # Handle update - if request.method == 'POST': - district_name = request.form['district_Name'] - state_id = request.form['state_Id'] - - try: - # cursor.execute( "UPDATE districts SET District_Name = %s, State_Id = %s WHERE District_id = %s", - # (district_name, state_id, district_id) ) - - cursor.callproc("UpdateDistrict", (district_id, state_id, district_name,)) - connection.commit() - except mysql.connector.Error as e: - print(f"Error updating district: {e}") - return ResponseHandler.update_failure("district"), 500 - return redirect('/add_district') + if request.method == 'POST': + district.EditDistrict(request=request, id=district_id) + if district.isSuccess: + return redirect(url_for('add_district')) + else: + + flash(district.resultMessage, "error") + + districtdata = district.GetDistrictByID(request=request, id=district_id) + state = State() + states = state.GetAllStates(request=request) + return render_template('edit_district.html', districtdata=districtdata, states=states) + + # GET Request + else: + districtdata = district.GetDistrictByID(request=request, id=district_id) + + if not district.isSuccess: + flash(district.resultMessage, "error") + return redirect(url_for('add_district')) + + + state = State() + states = state.GetAllStates(request=request) + + if districtdata is None: + districtdata = [] + if states is None: + states = [] return render_template('edit_district.html', districtdata=districtdata, states=states) @@ -405,237 +273,74 @@ def edit_district(district_id): # ------------------------- Block controller ------------------------------------------ @app.route('/add_block', methods=['GET', 'POST']) +@login_required def add_block(): - connection = config.get_db_connection() - block_data = [] - states = [] + block = Block() + district = District() - if connection: - cursor = connection.cursor() - try: - # cursor.execute("SELECT State_ID, State_Name FROM states") - # states = cursor.fetchall() - cursor.callproc("GetAllStates") - for res in cursor.stored_results(): - states = res.fetchall() + # form submission + if request.method == 'POST': + block.AddBlock(request) + return block.resultMessage - except mysql.connector.Error as e: - print(f"Error fetching states: {e}") - return json_response(ResponseHandler.fetch_failure("states"), 500) - - if request.method == 'POST': - block_name = request.form['block_Name'].strip() - district_id = request.form['district_Id'] - - if not re.match(str_pattern_reg, block_name): - return json_response(ResponseHandler.invalid_name("block"), 400) - - try: - # cursor.execute("SELECT * FROM blocks WHERE Block_Name = %s AND District_id = %s", - # (block_name, district_id)) - # existing_block = cursor.fetchone() - cursor.callproc("GetBlockByNameAndDistrict", (block_name, district_id,)) - for rs in cursor.stored_results(): - existing_block = rs.fetchone() - - if existing_block: - return json_response(ResponseHandler.already_exists("block"), 409) - - cursor.callproc('SaveBlock', (block_name, district_id)) - connection.commit() - - return json_response(ResponseHandler.add_success("block"), 200) - - except mysql.connector.Error as e: - print(f"Error adding block: {e}") - return json_response(ResponseHandler.add_failure("block"), 500) - - # Fetch all blocks to display - try: - # cursor.execute( - # """SELECT b.Block_Id, b.Block_Name, d.District_Name - # FROM blocks b - # JOIN districts d ON b.District_id = d.District_id""" - # ) - # block_data = cursor.fetchall() - cursor.callproc("GetAllBlocks") - for blocks in cursor.stored_results(): - block_data = blocks.fetchall() - - except mysql.connector.Error as e: - print(f"Error fetching blocks: {e}") - return json_response(ResponseHandler.fetch_failure("blocks"), 500) - finally: - cursor.close() - connection.close() - return render_template('add_block.html', block_data=block_data, states=states) - - -# check block -@app.route('/check_block', methods=['POST']) -def check_block(): + # Fetch all states connection = config.get_db_connection() cursor = connection.cursor() - block_name = request.json.get('block_Name', '').strip() - district_id = request.json.get('district_Id', '') - - if not re.match(str_pattern_reg, block_name): - return json_response(ResponseHandler.invalid_name("block"), 400) - - # cursor.execute("SELECT * FROM blocks WHERE Block_Name = %s AND District_id = %s", (block_name, district_id)) - # existing_block = cursor.fetchone() - cursor.callproc("GetBlockByNameAndDistrict", (block_name, district_id)) + cursor.callproc("GetAllStates") for rs in cursor.stored_results(): - existing_block = rs.fetchone() + states = rs.fetchall() - if existing_block: - return json_response(ResponseHandler.already_exists("block"), 409) + # Fetch all blocks + block_data = block.GetAllBlocks() - return json_response(ResponseHandler.is_available("block"), 200) + return render_template('add_block.html', states=states, block_data=block_data) -# update block by id -# @app.route('/edit_block/', methods=['GET', 'POST']) -# def edit_block(block_id): -# connection = config.get_db_connection() -# block_data, states, districts = [], [], [] -# -# if connection: -# cursor = connection.cursor() -# try: -# # cursor.execute("SELECT State_ID, State_Name FROM states") -# # states = cursor.fetchall() -# cursor.callproc("GetAllStates") -# for res in cursor.stored_results(): -# states = res.fetchall() -# -# # cursor.execute("SELECT Block_Name, District_id FROM blocks WHERE Block_Id = %s", (block_id,)) -# # block_data = cursor.fetchone() -# cursor.callproc("GetBlockById",(block_id,)) -# for block in cursor.stored_results(): -# block_data = block.fetchone() -# -# except mysql.connector.Error as e: -# print(f"Error fetching block data: {e}") -# return json_response(ResponseHandler.fetch_failure("block data"), 500) -# -# if request.method == 'POST': -# block_name = request.form['block_Name'] -# district_id = request.form['district_Id'] -# -# try: -# # cursor.execute("UPDATE blocks SET Block_Name = %s, District_id = %s WHERE Block_Id = %s", -# # (block_name, district_id, block_id)) -# -# cursor.callproc("UpdateBlock",(block_id,block_name, district_id)) -# connection.commit() -# except mysql.connector.Error as e: -# print(f"Error updating block: {e}") -# return json_response(ResponseHandler.update_failure("block"), 500) -# -# return redirect('/add_block') -# -# try: -# # cursor.execute("SELECT District_id, District_Name FROM districts") -# # districts = cursor.fetchall() -# -# cursor.callproc("GetAllDistricts") -# for dis in cursor.stored_results(): -# districts = dis.fetchall() -# -# except mysql.connector.Error as e: -# print(f"Error fetching districts: {e}") -# return json_response(ResponseHandler.fetch_failure("districts"), 500) -# -# return render_template('edit_block.html', block_data=block_data, states=states, districts=districts) +@app.route('/check_block', methods=['POST']) +@login_required +def check_block(): + block = Block() + return block.CheckBlock(request) + @app.route('/edit_block/', methods=['GET', 'POST']) +@login_required def edit_block(block_id): + block = Block() + + if request.method == 'POST': + return block.EditBlock(request, block_id) + + # Load all states connection = config.get_db_connection() - block_data = [] - states = [] - districts = [] + cursor = connection.cursor() + cursor.callproc("GetAllStates") + for rs in cursor.stored_results(): + states = rs.fetchall() - if connection: - cursor = connection.cursor() - # Retrieve all states - try: - # cursor.execute("SELECT State_ID, State_Name FROM states") - # states = cursor.fetchall() - cursor.callproc("GetAllStates") - for rs in cursor.stored_results(): - states = rs.fetchall() - except mysql.connector.Error as e: - print(f"Error fetching states: {e}") - return "Failed to fetch states", 500 + # Load all districts + cursor.callproc("GetAllDistrictsData") + for rs in cursor.stored_results(): + districts = rs.fetchall() - # Retrieve block data - try: - # cursor.execute("SELECT Block_Name, District_id FROM blocks WHERE Block_Id = %s", (block_id,)) - # block_data = cursor.fetchone() - cursor.callproc("GetBlockDataByID", (block_id,)) - for rs in cursor.stored_results(): - block_data = rs.fetchone() - except mysql.connector.Error as e: - print(f"Error fetching block data: {e}") - return "Failed to fetch block data", 500 + block_data = block.GetBlockByID(block_id) - # Handle POST request - if request.method == 'POST': - block_name = request.form['block_Name'] - district_id = request.form['district_Id'] - try: - # cursor.execute("UPDATE blocks SET Block_Name = %s, District_id = %s WHERE Block_Id = %s", - # (block_name, district_id, block_id)) - cursor.callproc("UpdateBlockById", (block_name, district_id, block_id,)) - connection.commit() - flash("Block updated successfully!", "success") - return redirect(url_for('add_block', block_id=block_id)) - except mysql.connector.Error as e: - print(f"Error updating blocks: {e}") - return "Failed to update blocks", 500 - - # Retrieve districts for the dropdown - try: - # cursor.execute("SELECT District_id, District_Name FROM districts") - # districts = cursor.fetchall() - cursor.callproc("GetAllDistrictsData") - for rs in cursor.stored_results(): - districts = rs.fetchall() - except mysql.connector.Error as e: - print(f"Error fetching districts: {e}") - return "Failed to fetch districts", 500 - - return render_template('edit_block.html', block_data=block_data, states=states, districts=districts) + return render_template('edit_block.html', block_data=block_data, states=states, districts=districts) - - - - -# delete block by id -@app.route('/delete_block/', methods=['GET', 'POST']) +@app.route('/delete_block/') +@login_required def delete_block(block_id): - connection = config.get_db_connection() + block = Block() + block.DeleteBlock(block_id) + return redirect(url_for('add_block')) - if connection: - cursor = connection.cursor() - try: - # cursor.execute("DELETE FROM blocks WHERE Block_Id = %s", (block_id,)) - cursor.callproc("DeleteBlock", (block_id,)) - connection.commit() - except mysql.connector.Error as e: - print(f"Error deleting block: {e}") - return json_response(ResponseHandler.add_failure("block"), 500) - finally: - cursor.close() - connection.close() - return redirect('/add_block') # this is get district all data by using state id .. @app.route('/get_districts/', methods=['GET']) +@login_required def get_districts(state_id): connection = config.get_db_connection() districts = [] @@ -649,9 +354,10 @@ def get_districts(state_id): cursor.callproc("GetDistrictsByStateId", (state_id,)) for dis in cursor.stored_results(): districts = dis.fetchall() + LogHelper.log_action("Get District", f"User {current_user.id} Get District '{state_id}'") except mysql.connector.Error as e: print(f"Error fetching districts: {e}") - return json_response(ResponseHandler.fetch_failure("districts"), 500) + return HtmlHelper.json_response(ResponseHandler.fetch_failure("districts"), 500) finally: cursor.close() connection.close() @@ -666,239 +372,80 @@ def get_districts(state_id): # ------------------------- Village controller ------------------------------------------ # Route to add a village @app.route('/add_village', methods=['GET', 'POST']) +@login_required def add_village(): - connection = config.get_db_connection() - cursor = connection.cursor() - states = [] - villages = [] + village = Village() - try: - # Fetch all states - # cursor.execute("SELECT State_ID, State_Name FROM states") - # states = cursor.fetchall() + if request.method == 'POST': + village.AddVillage(request=request) + return village.resultMessage - cursor.callproc("GetAllStates") - for res in cursor.stored_results(): - states = res.fetchall() - # Fetch all villages with their block names - # cursor.execute(""" - # SELECT v.Village_Id, v.Village_Name, b.Block_Name - # FROM villages v - # JOIN blocks b ON v.Block_Id = b.Block_Id - # """) - # villages = cursor.fetchall() - cursor.callproc("GetAllVillages") - for result in cursor.stored_results(): - villages = result.fetchall() + state = State() # Use the State class to get states + states = state.GetAllStates(request=request) - if request.method == 'POST': - block_id = request.form.get('block_Id') - village_name = request.form.get('Village_Name', '').strip() - - if not block_id: - return json_response(ResponseHandler.add_failure("block"), 400) - - if not re.match(str_pattern_reg, village_name): - return json_response(ResponseHandler.invalid_name("village"), 400) - - # Check if the village already exists in the block - # cursor.execute("SELECT * FROM villages WHERE Village_Name = %s AND Block_Id = %s", (village_name, block_id)) - # existing_village = cursor.fetchone() - cursor.callproc("GetVillageByNameAndBlock", (village_name, block_id,)) - for rs in cursor.stored_results(): - existing_village = rs.fetchone() - if existing_village: - return json_response(ResponseHandler.already_exists("village"), 409) - - # Insert new village - cursor.callproc('SaveVillage', (village_name, block_id)) - connection.commit() - - return json_response(ResponseHandler.add_success("village"), 200) - - except mysql.connector.Error as e: - print(f"Database Error: {e}") - return json_response(ResponseHandler.add_failure("village"), 500) - finally: - cursor.close() - connection.close() + villages = village.GetAllVillages(request=request) return render_template('add_village.html', states=states, villages=villages) - -# get block by district id -@app.route('/get_blocks/', methods=['GET']) -def get_blocks(district_id): - connection = config.get_db_connection() - cursor = connection.cursor() - blocks = [] - - try: - # cursor.execute("SELECT Block_Id, Block_Name FROM blocks WHERE District_id = %s", (district_id,)) - # blocks = cursor.fetchall() - cursor.callproc("GetBlocksByDistrict", (district_id,)) - for rs in cursor.stored_results(): - blocks = rs.fetchall() - except mysql.connector.Error as e: - print(f"Error fetching blocks: {e}") - return json_response({"error": "Failed to fetch blocks"}, 500) - finally: - cursor.close() - connection.close() - - return jsonify({"blocks": [{"Block_Id": block[0], "Block_Name": block[1]} for block in blocks]}) - - -# check village @app.route('/check_village', methods=['POST']) +@login_required def check_village(): - connection = config.get_db_connection() - cursor = connection.cursor() - - block_id = request.form.get('block_Id') - village_name = request.form.get('Village_Name', '').strip() - - # Validate village name - if not re.match(str_pattern_reg, village_name): - return json_response(ResponseHandler.invalid_name("village"), 400) - - if not block_id or not village_name: - return json_response({'status': 'error', 'message': 'Block and Village Name are required!'}, 400) - - # cursor.execute("SELECT * FROM villages WHERE Village_Name = %s AND Block_Id = %s", (village_name, block_id)) - # existing_village = cursor.fetchone() - cursor.callproc("GetVillageByNameAndBlocks", (village_name, block_id)) - for rs in cursor.stored_results(): - existing_village = rs.fetchone() - - cursor.close() - connection.close() - - if existing_village: - return json_response(ResponseHandler.already_exists("village"), 409) - else: - return json_response(ResponseHandler.is_available("village"), 200) + village = Village() + return village.CheckVillage(request=request) -# update village -# @app.route('/edit_village/', methods=['GET', 'POST']) -# def edit_village(village_id): -# connection = config.get_db_connection() -# village_data = None -# blocks = [] -# -# try: -# cursor = connection.cursor() -# # Fetch village details -# # cursor.execute("SELECT Village_Name, Block_Id FROM villages WHERE Village_Id = %s", (village_id,)) -# # village_data = cursor.fetchone() -# cursor.callproc("GetVillageById", (village_id,)) -# for result in cursor.stored_results(): -# village_data = result.fetchone() -# -# # Fetch all blocks for dropdown -# # cursor.execute("SELECT Block_Id, Block_Name FROM blocks") -# # blocks = cursor.fetchall() -# -# cursor.callproc("GetAllBlocks") -# for result in cursor.stored_results(): -# blocks = result.fetchall() -# -# if request.method == 'POST': -# village_name = request.form['Village_Name'] -# block_id = request.form['block_Id'] -# -# if not re.match(str_pattern_reg, village_name): -# return json_response(ResponseHandler.invalid_name("village"), 400) -# -# # cursor.execute("UPDATE villages SET Village_Name = %s, Block_Id = %s WHERE Village_Id = %s", -# # (village_name, block_id, village_id)) -# -# cursor.callproc("UpdateVillage", (village_id, village_name, block_id,)) -# -# connection.commit() -# return json_response(ResponseHandler.update_success("village"), 200) -# -# except mysql.connector.Error as e: -# print(f"Error: {e}") -# return json_response(ResponseHandler.update_failure("village"), 500) -# finally: -# if cursor: -# cursor.close() -# if connection: -# connection.close() -# -# return render_template('edit_village.html', village_data=village_data, blocks=blocks) - -@app.route('/edit_village/', methods=['GET', 'POST']) -def edit_village(village_id): - connection = config.get_db_connection() - village_data = None - blocks = [] - - try: - cursor = connection.cursor() - # # Fetch village details - # cursor.execute("SELECT Village_Name, Block_Id FROM villages WHERE Village_Id = %s", (village_id,)) - # village_data = cursor.fetchone() - cursor.callproc("GetVillageDetailsById", (village_id,)) - for rs in cursor.stored_results(): - village_data = rs.fetchone() - # Fetch all blocks for dropdown - # cursor.execute("SELECT Block_Id, Block_Name FROM blocks") - # blocks = cursor.fetchall() - cursor.callproc('GetAllBlocks') - for result in cursor.stored_results(): - blocks = result.fetchall() - - if request.method == 'POST': - village_name = request.form['Village_Name'] - block_id = request.form['block_Id'] - - if not re.match("^[A-Za-z ]+$", village_name): - flash("Invalid village name! Only letters and spaces allowed.", "error") - return redirect(url_for('edit_village', village_id=village_id)) - - cursor.execute("UPDATE villages SET Village_Name = %s, Block_Id = %s WHERE Village_Id = %s", - (village_name, block_id, village_id)) - connection.commit() - flash("Village updated successfully!", "success") - return redirect(url_for('edit_village', village_id=village_id)) - - except mysql.connector.Error as e: - print(f"Error: {e}") - return "Failed to process request", 500 - finally: - if cursor: - cursor.close() - if connection: - connection.close() - - return render_template('edit_village.html', village_data=village_data, blocks=blocks) - - -# delete village -@app.route('/delete_village/', methods=['GET', 'POST']) +# Delete Village +@app.route('/delete_village/', methods=['GET']) +@login_required def delete_village(village_id): - connection = config.get_db_connection() - cursor = connection.cursor() + village = Village() + village.DeleteVillage(request=request, village_id=village_id) - try: - # cursor.execute("DELETE FROM villages WHERE Village_Id = %s", (village_id,)) - cursor.callproc("DeleteVillage", (village_id,)) - connection.commit() - # return json_response(ResponseHandler.delete_success("village"), 200) - except mysql.connector.Error as e: - print(f"Error: {e}") - return json_response(ResponseHandler.add_failure("village"), 500) - finally: - if cursor: - cursor.close() - if connection: - connection.close() + if not village.isSuccess: + flash(village.resultMessage, "error") + return redirect(url_for('add_village')) + else: + + return redirect(url_for('add_village')) + + +# Edit Village +@app.route('/edit_village/', methods=['GET', 'POST']) +@login_required +def edit_village(village_id): + village = Village() + + if request.method == 'POST': + village.EditVillage(request=request, village_id=village_id) + if village.isSuccess: + flash(village.resultMessage, "success") + return redirect(url_for('add_village')) + else: + + flash(village.resultMessage, "error") + + village_data = village.GetVillageByID(request=request, id=village_id) + blocks = village.GetAllBlocks(request=request) + return render_template('edit_village.html', village_data=village_data, blocks=blocks) + + + else: + village_data = village.GetVillageByID(request=request, id=village_id) + + if not village.isSuccess: + flash(village.resultMessage, "error") + return redirect(url_for('add_village')) + + blocks = village.GetAllBlocks(request=request) + + if village_data is None: + village_data = [] # Ensure it's iterable in template + if blocks is None: + blocks = [] + + return render_template('edit_village.html', village_data=village_data, blocks=blocks) - return redirect(url_for('add_village')) # ---- end Village controller --------------------- @@ -906,6 +453,7 @@ def delete_village(village_id): # -------------------------------- Invoice controller ------------------------------------------ @app.route('/add_invoice', methods=['GET', 'POST']) +@login_required def add_invoice(): connection = config.get_db_connection() if not connection: @@ -917,6 +465,7 @@ def add_invoice(): # Get the village name from the form village_name = request.form.get('village') + print("village name", village_name) # Query the database to get the corresponding Village_Id based on the village name @@ -938,16 +487,27 @@ def add_invoice(): invoice_date = request.form.get('invoice_date') invoice_no = request.form.get('invoice_no') basic_amount = request.form.get('basic_amount') + basic_amount=float(basic_amount) if basic_amount else 0.0 debit_amount = request.form.get('debit_amount') + debit_amount=float(debit_amount) if debit_amount else 0.0 after_debit_amount = request.form.get('after_debit_amount') + after_debit_amount=float(after_debit_amount) if after_debit_amount else 0.0 amount = request.form.get('amount') + amount=float(amount) if amount else 0.0 gst_amount = request.form.get('gst_amount') + gst_amount=float(gst_amount) if gst_amount else 0.0 tds_amount = request.form.get('tds_amount') + tds_amount=float(tds_amount) if tds_amount else 0.0 sd_amount = request.form.get('sd_amount') + sd_amount=float(sd_amount) if sd_amount else 0.0 on_commission = request.form.get('on_commission') + on_commission=float(on_commission) if on_commission else 0.0 hydro_testing = request.form.get('hydro_testing') + hydro_testing=float(hydro_testing) if hydro_testing else 0.0 gst_sd_amount = request.form.get('gst_sd_amount') + gst_sd_amount=float(gst_sd_amount) if gst_sd_amount else 0.0 final_amount = request.form.get('final_amount') + final_amount=float(final_amount) if final_amount else 0.0 # insert_invoice_query = ''' # INSERT INTO invoice ( @@ -968,7 +528,7 @@ def add_invoice(): pmc_no, village_id, work_type, invoice_details, invoice_date, invoice_no, basic_amount, debit_amount, after_debit_amount, amount, gst_amount, tds_amount, sd_amount, on_commission, hydro_testing, gst_sd_amount, final_amount]) - + LogHelper.log_action("Add invoice", f"User {current_user.id} Added invoice '{ pmc_no}'") for result in cursor.stored_results(): invoice_id = result.fetchone()['invoice_id'] connection.commit() @@ -1053,10 +613,11 @@ def add_invoice(): # search subcontraactor to assing invoice @app.route('/search_subcontractor', methods=['POST']) +@login_required def search_subcontractor(): connection = config.get_db_connection() if not connection: - return json_response(ResponseHandler.fetch_failure("database connection"), 500) + return HtmlHelper.json_response(ResponseHandler.fetch_failure("database connection"), 500) sub_query = request.form.get("query") try: @@ -1078,10 +639,11 @@ def search_subcontractor(): for row in results ) print("Ajax Call for subcontractor", output) + return output except mysql.connector.Error as e: - return json_response(ResponseHandler.fetch_failure(f"Search failed: {str(e)}"), 500) + return HtmlHelper.json_response(ResponseHandler.fetch_failure(f"Search failed: {str(e)}"), 500) finally: cursor.close() @@ -1090,6 +652,7 @@ def search_subcontractor(): # get hold types @app.route('/get_hold_types', methods=['GET']) +@login_required def get_hold_types(): connection = config.get_db_connection() try: @@ -1100,7 +663,7 @@ def get_hold_types(): cursor.callproc("GetAllHoldTypes") for hold in cursor.stored_results(): hold_types = hold.fetchall() - + LogHelper.log_action("Get hold type", f"User {current_user.id} Get hold type'{ hold_types}'") return jsonify(hold_types) except mysql.connector.Error as e: return ResponseHandler.fetch_failure({str(e)}), 500 @@ -1113,6 +676,7 @@ def get_hold_types(): # update invoice by id @app.route('/edit_invoice/', methods=['GET', 'POST']) +@login_required def edit_invoice(invoice_id): connection = config.get_db_connection() if not connection: @@ -1141,7 +705,7 @@ def edit_invoice(invoice_id): invoice_details = request.form.get('invoice_details') invoice_date = request.form.get('invoice_date') invoice_no = request.form.get('invoice_no') - + LogHelper.log_action("Edit invoice", f"User {current_user.id} Edit invoice'{ invoice_id}'") # Convert numeric fields properly numeric_fields = { "basic_amount": request.form.get('basic_amount'), @@ -1305,27 +869,29 @@ def edit_invoice(invoice_id): # delete invoice by id @app.route('/delete_invoice/', methods=['GET']) +@login_required def delete_invoice(invoice_id): connection = config.get_db_connection() if not connection: - return json_response(ResponseHandler.fetch_failure("invoice"), 500) + return HtmlHelper.json_response(ResponseHandler.fetch_failure("invoice"), 500) try: cursor = connection.cursor() # cursor.execute("DELETE FROM invoice WHERE Invoice_Id = %s", (invoice_id,)) cursor.callproc("DeleteInvoice", (invoice_id,)) + LogHelper.log_action("Delete invoice", f"User {current_user.id} Delete invoice'{ invoice_id}'") connection.commit() # Check if the invoice was actually deleted if cursor.rowcount == 0: - return json_response(ResponseHandler.fetch_failure("invoice"), 404) + return HtmlHelper.json_response(ResponseHandler.fetch_failure("invoice"), 404) return redirect(url_for('add_invoice')) except mysql.connector.Error as e: print("Error deleting invoice:", e) - return json_response(ResponseHandler.delete_failure("invoice"), 500) + return HtmlHelper.json_response(ResponseHandler.delete_failure("invoice"), 500) finally: cursor.close() @@ -1343,7 +909,7 @@ def delete_invoice(invoice_id): # payments = [] # List to hold payment history # # if not connection: -# return json_response(ResponseHandler.fetch_failure("payment"), 500) +# return HtmlHelper.json_response(ResponseHandler.fetch_failure("payment"), 500) # # try: # cursor = connection.cursor() @@ -1359,7 +925,7 @@ def delete_invoice(invoice_id): # # except mysql.connector.Error as e: # print(f"Error fetching payment history: {e}") -# return json_response(ResponseHandler.fetch_failure("payment"), 500) +# return HtmlHelper.json_response(ResponseHandler.fetch_failure("payment"), 500) # finally: # cursor.close() # @@ -1380,7 +946,7 @@ def delete_invoice(invoice_id): # return redirect(url_for('add_payment')) # Redirect to add_payment page to reload the form # except mysql.connector.Error as e: # print(f"Error inserting payment: {e}") -# return json_response(ResponseHandler.add_failure("payment"), 500) +# return HtmlHelper.json_response(ResponseHandler.add_failure("payment"), 500) # finally: # cursor.close() # connection.close() @@ -1388,6 +954,7 @@ def delete_invoice(invoice_id): # return render_template('add_payment.html', payments=payments) @app.route('/add_payment', methods=['GET', 'POST']) +@login_required def add_payment(): connection = config.get_db_connection() payments = [] @@ -1403,7 +970,7 @@ def add_payment(): cursor.callproc('GetAllPayments') for result in cursor.stored_results(): payments = result.fetchall() - + except mysql.connector.Error as e: print(f"Error fetching payment history: {e}") return "Failed to fetch payment history", 500 @@ -1417,7 +984,7 @@ def add_payment(): tds_amount = request.form['TDS_Payment_Amount'] total_amount = request.form['total_amount'] utr = request.form['utr'] - + LogHelper.log_action("Add Payment", f"User {current_user.id} Add Payment'{ pmc_no}'") try: cursor = connection.cursor() # cursor.execute('''INSERT INTO payment (PMC_No, invoice_no, Payment_Amount, TDS_Payment_Amount, Total_Amount, UTR) @@ -1442,6 +1009,7 @@ def add_payment(): @app.route('/get_pmc_nos_by_subcontractor/') +@login_required def get_pmc_nos_by_subcontractor(subcontractorId): connection = config.get_db_connection() cur = connection.cursor() @@ -1467,12 +1035,13 @@ def get_pmc_nos_by_subcontractor(subcontractorId): # Edit Payment Route @app.route('/edit_payment/', methods=['GET', 'POST']) +@login_required def edit_payment(payment_id): connection = config.get_db_connection() payment_data = {} # To hold the payment data for the given ID if not connection: - return json_response(ResponseHandler.fetch_failure("payment"), 500) + return HtmlHelper.json_response(ResponseHandler.fetch_failure("payment"), 500) try: cursor = connection.cursor() @@ -1496,7 +1065,7 @@ def edit_payment(payment_id): tds_amount = request.form['TDS_Payment_Amount'] total_amount = request.form['total_amount'] utr = request.form['utr'] - + LogHelper.log_action("Edit Payment", f"User {current_user.id} Edit Payment'{ pmc_no}'") try: # cursor.execute('''UPDATE payment SET PMC_No=%s, Invoice_No=%s, Payment_Amount=%s, TDS_Payment_Amount=%s, # Total_Amount=%s, UTR=%s WHERE Payment_Id=%s''', @@ -1509,11 +1078,11 @@ def edit_payment(payment_id): return redirect(url_for('add_payment')) # Redirect to add_payment page to view the updated list except mysql.connector.Error as e: print(f"Error updating payment: {e}") - return json_response(ResponseHandler.update_failure("payment"), 500) + return HtmlHelper.json_response(ResponseHandler.update_failure("payment"), 500) except mysql.connector.Error as e: print(f"Error fetching payment data: {e}") - return json_response(ResponseHandler.fetch_failure("payment"), 500) + return HtmlHelper.json_response(ResponseHandler.fetch_failure("payment"), 500) finally: cursor.close() connection.close() @@ -1523,24 +1092,26 @@ def edit_payment(payment_id): # Delete Payment Route @app.route('/delete_payment/', methods=['GET', 'POST']) +@login_required def delete_payment(payment_id): connection = config.get_db_connection() if not connection: - return json_response(ResponseHandler.fetch_failure("payment"), 500) + return HtmlHelper.json_response(ResponseHandler.fetch_failure("payment"), 500) try: cursor = connection.cursor() # cursor.execute("DELETE FROM payment WHERE Payment_Id = %s", (payment_id,)) cursor.callproc("DeletePayment", (payment_id,)) + LogHelper.log_action("Delete Payment", f"User {current_user.id} Delete Payment'{ payment_id}'") connection.commit() # Check if any rows were deleted if cursor.rowcount == 0: - return json_response(ResponseHandler.fetch_failure("payment"), 404) + return HtmlHelper.json_response(ResponseHandler.fetch_failure("payment"), 404) return redirect(url_for('add_payment')) # Redirect back to the add_payment page except mysql.connector.Error as e: print(f"Error deleting payment: {e}") - return json_response(ResponseHandler.delete_failure("payment"), 500) + return HtmlHelper.json_response(ResponseHandler.delete_failure("payment"), 500) finally: cursor.close() connection.close() @@ -1550,41 +1121,64 @@ def delete_payment(payment_id): # ------------------------- GST Release controller ------------------------------------------ @app.route('/add_gst_release', methods=['GET', 'POST']) +@login_required def add_gst_release(): connection = config.get_db_connection() gst_releases = [] # List to hold GST Release history invoices = [] # List to hold invoices for the dropdown if not connection: - return json_response(ResponseHandler.fetch_failure("GST Release"), 500) + return HtmlHelper.json_response(ResponseHandler.fetch_failure("GST Release"), 500) try: cursor = connection.cursor() # Retrieve GST Release history - # cursor.execute("SELECT GST_Release_Id, PMC_No, Invoice_No, Basic_Amount, Final_Amount FROM gst_release") - # gst_releases = cursor.fetchall() + cursor.execute("SELECT GST_Release_Id, PMC_No, Invoice_No, Basic_Amount, Final_Amount,Total_Amount,UTR FROM gst_release") + gst_releases = cursor.fetchall() - cursor.callproc("GetAllGSTReleases") - for result in cursor.stored_results(): - gst_releases = result.fetchall() + # cursor.callproc("GetAllGSTReleases") + # for result in cursor.stored_results(): + # gst_releases = result.fetchall() if request.method == 'POST': pmc_no = request.form['PMC_No'] invoice_no = request.form['invoice_No'] basic_amount = request.form['basic_amount'] final_amount = request.form['final_amount'] - - cursor.callproc('SaveGSTRelease', ( - pmc_no, invoice_no, basic_amount, final_amount - )) + total_amount = request.form['total_amount'] + utr = request.form['utr'] + contractor_id = request.form['subcontractor_id'] + LogHelper.log_action("Add gst_release", f"User {current_user.id} Add gst_release'{ pmc_no}'") + # cursor.callproc('SaveGSTRelease', ( + # pmc_no, invoice_no, basic_amount, final_amount,total_amount, utr + # )) + # connection.commit() + cursor.execute(""" + INSERT INTO gst_release (PMC_No, + invoice_no, + Basic_Amount, + Final_Amount, + Total_Amount, + UTR, + Contractor_Id) + VALUES (%s, %s, %s, %s, %s, %s, %s) + """, ( + pmc_no, + invoice_no, + basic_amount, + final_amount, + total_amount, + utr, + contractor_id + )) connection.commit() return redirect(url_for('add_gst_release')) # Redirect to add_gst_release page except mysql.connector.Error as e: print(f"Error: {e}") - return json_response(ResponseHandler.add_failure("GST Release"), 500) + return HtmlHelper.json_response(ResponseHandler.add_failure("GST Release"), 500) finally: cursor.close() @@ -1595,52 +1189,70 @@ def add_gst_release(): # update gst Release by id @app.route('/edit_gst_release/', methods=['GET', 'POST']) +@login_required def edit_gst_release(gst_release_id): connection = config.get_db_connection() gst_release_data = {} # To hold the GST release data for the given ID invoices = [] # List to hold invoices for the dropdown if not connection: - return json_response(ResponseHandler.fetch_failure("GST Release"), 500) + return HtmlHelper.json_response(ResponseHandler.fetch_failure("GST Release"), 500) try: cursor = connection.cursor() # Fetch the existing GST release data for the given gst_release_id - # cursor.execute( - # "SELECT GST_Release_Id, PMC_No, Invoice_No, Basic_Amount, Final_Amount FROM gst_release WHERE GST_Release_Id = %s", - # (gst_release_id,) - # ) - # gst_release_data = cursor.fetchone() + cursor.execute( + "SELECT GST_Release_Id, PMC_No, Invoice_No, Basic_Amount, Final_Amount,Total_Amount,UTR FROM gst_release WHERE GST_Release_Id = %s", + (gst_release_id,) + ) + gst_release_data = cursor.fetchone() - cursor.callproc("GetGSTReleaseById", (gst_release_id,)) - for result in cursor.stored_results(): - gst_release_data = result.fetchone() + # cursor.callproc("GetGSTReleaseById", (gst_release_id,)) + # for result in cursor.stored_results(): + # gst_release_data = result.fetchone() if request.method == 'POST': - pmc_id = request.form['PMC_No'] + pmc_no = request.form['PMC_No'] invoice_no = request.form['invoice_No'] basic_amount = request.form['basic_amount'] final_amount = request.form['final_amount'] - + total_amount = request.form['total_amount'] + utr = request.form['utr'] + LogHelper.log_action("Edit gst_release", f"User {current_user.id} Edit gst_release'{ pmc_no}'") try: - # cursor.execute('''UPDATE gst_release SET PMC_No=%s, Invoice_No=%s, Basic_Amount=%s, Final_Amount=%s - # WHERE GST_Release_Id=%s''', - # (pmc_id, invoice_no, basic_amount, final_amount, gst_release_id)) + cursor.execute(""" + UPDATE gst_release + SET PMC_No = %s, + invoice_no = %s, + Basic_Amount = %s, + Final_Amount = %s, + Total_Amount = %s, + UTR = %s + WHERE GST_Release_Id = %s + """, ( + pmc_no, + invoice_no, + basic_amount, + final_amount, + total_amount, + utr, + gst_release_id + )) - cursor.callproc("UpdateGSTRelease", (gst_release_id, pmc_id, invoice_no, basic_amount, final_amount)) - - connection.commit() + # cursor.callproc("UpdateGSTRelease", (gst_release_id, pmc_id, invoice_no, basic_amount, final_amount)) + # + # connection.commit() return redirect(url_for('add_gst_release')) # Redirect to the page to view the updated list except mysql.connector.Error as e: print(f"Error updating GST Release: {e}") - return json_response(ResponseHandler.update_failure("GST Release"), 500) + return HtmlHelper.json_response(ResponseHandler.update_failure("GST Release"), 500) except mysql.connector.Error as e: print(f"Error fetching GST Release data: {e}") - return json_response(ResponseHandler.fetch_failure("GST Release"), 500) + return HtmlHelper.json_response(ResponseHandler.fetch_failure("GST Release"), 500) finally: cursor.close() @@ -1651,22 +1263,24 @@ def edit_gst_release(gst_release_id): # delete gst release by id @app.route('/delete_gst_release/', methods=['GET', 'POST']) +@login_required def delete_gst_release(gst_release_id): connection = config.get_db_connection() if not connection: - return json_response(ResponseHandler.fetch_failure("GST Release"), 500) + return HtmlHelper.json_response(ResponseHandler.fetch_failure("GST Release"), 500) try: cursor = connection.cursor() # cursor.execute("DELETE FROM gst_release WHERE GST_Release_Id = %s", (gst_release_id,)) cursor.callproc("DeleteGSTRelease", (gst_release_id,)) + LogHelper.log_action("delete gst_release", f"User {current_user.id} delete gst_release'{ gst_release_id}'") connection.commit() # Check if any rows were deleted if cursor.rowcount == 0: - return json_response(ResponseHandler.fetch_failure("GST Release"), 404) + return HtmlHelper.json_response(ResponseHandler.fetch_failure("GST Release"), 404) return redirect(url_for('add_gst_release')) # Redirect to the add_gst_release page except mysql.connector.Error as e: print(f"Error deleting GST Release: {e}") - return json_response(ResponseHandler.delete_failure("GST Release"), 500) + return HtmlHelper.json_response(ResponseHandler.delete_failure("GST Release"), 500) finally: cursor.close() connection.close() @@ -1676,12 +1290,13 @@ def delete_gst_release(gst_release_id): # ------------------------- Subcontractor controller ------------------------------------------ @app.route('/subcontractor', methods=['GET', 'POST']) +@login_required def subcontract(): connection = config.get_db_connection() subcontractor = [] if not connection: - return json_response(ResponseHandler.fetch_failure("Subcontractor"), 500) + return HtmlHelper.json_response(ResponseHandler.fetch_failure("Subcontractor"), 500) try: cursor = connection.cursor() @@ -1697,7 +1312,7 @@ def subcontract(): except Error as e: print(f"Error fetching data: {e}") - return json_response(ResponseHandler.fetch_failure("Subcontractor"), 500) + return HtmlHelper.json_response(ResponseHandler.fetch_failure("Subcontractor"), 500) if request.method == 'POST': contractor_data = { @@ -1736,11 +1351,11 @@ def subcontract(): except Error as e: print(f"Error inserting data: {e}") - return json_response(ResponseHandler.add_failure("Subcontractor"), 500) + return HtmlHelper.json_response(ResponseHandler.add_failure("Subcontractor"), 500) except Error as e: print(f"Error handling subcontractor data: {e}") - return json_response(ResponseHandler.fetch_failure("Subcontractor"), 500) + return HtmlHelper.json_response(ResponseHandler.fetch_failure("Subcontractor"), 500) finally: cursor.close() @@ -1751,11 +1366,12 @@ def subcontract(): # update subcontractor by id @app.route('/edit_subcontractor/', methods=['GET', 'POST']) +@login_required def edit_subcontractor(id): connection = config.get_db_connection() if not connection: - return json_response(ResponseHandler.fetch_failure("Subcontractor"), 500) + return HtmlHelper.json_response(ResponseHandler.fetch_failure("Subcontractor"), 500) try: cursor = connection.cursor() @@ -1770,7 +1386,7 @@ def edit_subcontractor(id): subcontractor = contractors.fetchone() if not subcontractor: - return json_response(ResponseHandler.fetch_failure("Subcontractor"), 404) + return HtmlHelper.json_response(ResponseHandler.fetch_failure("Subcontractor"), 404) if request.method == 'POST': updated_data = { @@ -1785,7 +1401,7 @@ def edit_subcontractor(id): 'Contractor_password': request.form['Contractor_password'], 'id': id } - + LogHelper.log_action("Edit Subcontractor", f"User {current_user.id}Edit Subcontractor'{ id}'") try: # cursor.execute("""UPDATE subcontractors SET # Contractor_Name=%(Contractor_Name)s, @@ -1816,11 +1432,11 @@ def edit_subcontractor(id): except Error as e: print(f"Error updating subcontractor: {e}") - return json_response(ResponseHandler.update_failure("Subcontractor"), 500) + return HtmlHelper.json_response(ResponseHandler.update_failure("Subcontractor"), 500) except Error as e: print(f"Error fetching subcontractor data: {e}") - return json_response(ResponseHandler.fetch_failure("Subcontractor"), 500) + return HtmlHelper.json_response(ResponseHandler.fetch_failure("Subcontractor"), 500) finally: cursor.close() @@ -1835,7 +1451,7 @@ def edit_subcontractor(id): # connection = config.get_db_connection() # if not connection: -# return json_response(ResponseHandler.fetch_failure("Subcontractor"), 500) +# return HtmlHelper.json_response(ResponseHandler.fetch_failure("Subcontractor"), 500) # try: # cursor = connection.cursor() @@ -1846,11 +1462,11 @@ def edit_subcontractor(id): # # Check if any row was deleted (subcontractor found) # if cursor.rowcount == 0: -# return json_response(ResponseHandler.fetch_failure("Subcontractor"), 404) +# return HtmlHelper.json_response(ResponseHandler.fetch_failure("Subcontractor"), 404) # except Error as e: # print(f"Error deleting subcontractor: {e}") -# return json_response(ResponseHandler.delete_failure("Subcontractor"), 500) +# return HtmlHelper.json_response(ResponseHandler.delete_failure("Subcontractor"), 500) # finally: # cursor.close() @@ -1858,11 +1474,12 @@ def edit_subcontractor(id): # return redirect(url_for('subcontract')) @app.route('/deleteSubContractor/', methods=['GET', 'POST']) +@login_required def deleteSubContractor(id): connection = config.get_db_connection() if not connection: - return json_response(ResponseHandler.fetch_failure("Subcontractor"), 500) + return HtmlHelper.json_response(ResponseHandler.fetch_failure("Subcontractor"), 500) try: cursor = connection.cursor() @@ -1870,7 +1487,7 @@ def deleteSubContractor(id): # Optional: check if subcontractor exists before attempting delete cursor.execute("SELECT 1 FROM subcontractors WHERE Contractor_Id = %s", (id,)) if cursor.fetchone() is None: - return json_response(ResponseHandler.fetch_failure("Subcontractor not found"), 404) + return HtmlHelper.json_response(ResponseHandler.fetch_failure("Subcontractor not found"), 404) # Call stored procedure to delete subcontractor and related records cursor.callproc("DeleteSubcontractor", (id,)) @@ -1881,13 +1498,13 @@ def deleteSubContractor(id): for result in cursor.stored_results(): row = result.fetchone() affected_rows = row[0] if row else 0 - + LogHelper.log_action("Delete Subcontractor", f"User {current_user.id}Delete Subcontractor'{ id}'") if affected_rows == 0: - return json_response(ResponseHandler.fetch_failure("Subcontractor not deleted"), 404) + return HtmlHelper.json_response(ResponseHandler.fetch_failure("Subcontractor not deleted"), 404) except Error as e: print(f"Error deleting subcontractor: {e}") - return json_response(ResponseHandler.delete_failure("Subcontractor"), 500) + return HtmlHelper.json_response(ResponseHandler.delete_failure("Subcontractor"), 500) finally: cursor.close() @@ -1913,6 +1530,7 @@ def upload(): if file and file.filename.endswith('.xlsx'): filepath = os.path.join(app.config['UPLOAD_FOLDER'], file.filename) file.save(filepath) + LogHelper.log_action("Upload Excel File", f"User {current_user.id}Upload Excel File'{file}'") return redirect(url_for('show_table', filename=file.filename)) return render_template('uploadExcelFile.html') @@ -2439,7 +2057,7 @@ def save_data(): village_name, work_type = None, None village_id = 0 - + LogHelper.log_action("Data saved", f"User {current_user.id} Data saved'{ village_name}'") PMC_No = save_data.get('PMC_No') Invoice_Details = save_data.get('Invoice_Details') Invoice_Date = save_data.get('Invoice_Date') @@ -2460,7 +2078,7 @@ def save_data(): Total_Amount = save_data.get('Total_Amount') TDS_Payment_Amount = save_data.get('TDS_Payment_Amount') UTR = save_data.get('UTR') - + if Invoice_Details: words = Invoice_Details.lower().split() if 'village' in words: @@ -2519,6 +2137,7 @@ def save_data(): ) # for result in cursor.stored_results(): # invoice_id = result.fetchone()['invoice_id'] + print("All invoice Details ",args) results = cursor.callproc('SaveInvoice', args) # cursor.callproc("SaveInvoice",args) # for re in cursor.stored_results(): @@ -2568,44 +2187,64 @@ def save_data(): else: print("Hold columns data is not a valid list of dictionaries.") #---------------------------------------------Credit Note--------------------------------------------------------------------------- - elif any(keyword in Invoice_Details.lower() for keyword in ['credit note']): + elif any(keyword in Invoice_Details.lower() for keyword in ['credit note','logging report']): print("Credit note found:", PMC_No, Invoice_No, Basic_Amount, Debit_Amount, Final_Amount, After_Debit_Amount, GST_Amount, Amount, Final_Amount, Payment_Amount, Total_Amount, UTR, Invoice_No) cursor.execute( """INSERT INTO credit_note (PMC_No, Invoice_Details, Basic_Amount, Debit_Amount, After_Debit_Amount, GST_Amount, Amount, Final_Amount, Payment_Amount, Total_Amount, UTR, Contractor_Id, invoice_no) VALUES (%s,%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s,%s)""", ( PMC_No, Invoice_Details, Basic_Amount, Debit_Amount, After_Debit_Amount, GST_Amount, Amount, Final_Amount, Payment_Amount, Total_Amount, UTR, subcontractor_id, Invoice_No)) #-----------------------------------------------Hold Amount---------------------------------------------------------------------- - elif Invoice_Details and any(keyword in Invoice_Details.lower() for keyword in - ['excess hold', 'ht', 'hold release amount']): + # Step 1: Normalize Invoice_Details: lowercase, trim, remove extra spaces + normalized_details = re.sub(r'\s+', ' ', Invoice_Details.strip()).lower() + + # Step 2: Define lowercase keywords + keywords = [ + 'excess hold', + 'ht', + 'hold release amount', + 'dpr excess hold amount', + 'excess hold amount', + 'Multi to Single layer bill', + 'hold amount', + 'logging report' + ] + + # Step 3: Matching condition + if any(kw in normalized_details for kw in keywords): + print("✅ Match found. Inserting hold release for:", Invoice_Details) cursor.execute(""" - INSERT INTO hold_release ( - PMC_No, Invoice_No, Invoice_Details, Basic_Amount, Total_Amount, UTR,Contractor_Id - ) VALUES (%s, %s, %s, %s, %s, %s,%s) - """, ( - PMC_No, Invoice_No, Invoice_Details, Basic_Amount, Final_Amount, UTR, subcontractor_id)) - print("Hold amount release from excel file:", PMC_No, Invoice_Details) - #------------------------------------------------------------------------------------------------------------------ + INSERT INTO hold_release (PMC_No, Invoice_No, Invoice_Details, Basic_Amount, + Total_Amount, UTR, Contractor_Id) + VALUES (%s, %s, %s, %s, %s, %s, %s) + """, ( + PMC_No, Invoice_No, Invoice_Details, Basic_Amount, Final_Amount, UTR, + subcontractor_id + )) + connection.commit() # ✅ Ensure changes are saved to DB + print("✅ Hold release inserted for:", PMC_No, Invoice_Details) + + #------------------------------------------------------------------------------------------------------------------ elif Invoice_Details and any( keyword in Invoice_Details.lower() for keyword in ['gst', 'release', 'note']): - print("Gst rels :", PMC_No, Invoice_No, Basic_Amount, Final_Amount) - cursor.callproc("SaveGSTRelease", (PMC_No, Invoice_No, Basic_Amount, Final_Amount)) - # cursor.execute( - # """INSERT INTO gst_release (PMC_No, Invoice_No, Basic_Amount, Final_Amount) VALUES (%s,%s, %s, %s)""", - # (PMC_No, Invoice_No, Basic_Amount, Final_Amount)) + print("Gst rels :", PMC_No, Invoice_No, Basic_Amount, Final_Amount,Total_Amount,UTR, subcontractor_id) + #cursor.callproc("SaveGSTRelease", (PMC_No, Invoice_No, Basic_Amount, Final_Amount,Total_Amount,UTR)) + cursor.execute( + """INSERT INTO gst_release (PMC_No, Invoice_No, Basic_Amount, Final_Amount,Total_Amount,UTR, Contractor_Id) VALUES (%s,%s, %s, %s, %s, %s, %s)""", + (PMC_No, Invoice_No, Basic_Amount, Final_Amount, Total_Amount, UTR, subcontractor_id)) # insert_payment = """INSERT INTO payment (PMC_No, Invoice_No, Payment_Amount, TDS_Payment_Amount, Total_Amount, UTR) VALUES (%s, %s, %s, %s, %s, %s)""" # cursor.execute(insert_payment, # (PMC_No, Invoice_No, Payment_Amount, TDS_Payment_Amount, Total_Amount, UTR)) if PMC_No and Total_Amount and UTR: - print("Payment :", PMC_No, Invoice_No, Payment_Amount, TDS_Payment_Amount, Total_Amount, UTR) + print("Payment :", PMC_No, Invoice_No, Payment_Amount, TDS_Payment_Amount, Total_Amount, UTR ) # insert_payment = """INSERT INTO payment (PMC_No, Invoice_No, Payment_Amount, TDS_Payment_Amount, Total_Amount, UTR) VALUES (%s, %s, %s, %s, %s, %s)""" # cursor.execute(insert_payment, # (PMC_No, Invoice_No, Payment_Amount, TDS_Payment_Amount, Total_Amount, UTR)) cursor.callproc("SavePayment", - (PMC_No, Invoice_No, Payment_Amount, TDS_Payment_Amount, Total_Amount, UTR)) + (PMC_No, Invoice_No, Payment_Amount, TDS_Payment_Amount, Total_Amount, UTR )) connection.commit() return jsonify({"success": "Data saved successfully!"}), 200 @@ -2621,7 +2260,7 @@ def save_data(): # ---------------------- Report -------------------------------- -# call repor page +# call report page @app.route('/report') def report_page(): return render_template('report.html') @@ -2644,7 +2283,8 @@ def search_contractor(): conditions = [] params = [] - + + LogHelper.log_action("Search contractor", f"User {current_user.id} Search contractor'{ subcontractor_name}'") if subcontractor_name: conditions.append("LOWER(s.Contractor_Name) LIKE LOWER(%s)") params.append(f"%{subcontractor_name}%") @@ -2704,229 +2344,6 @@ def search_contractor(): -# @app.route('/contractor_report/') -# def contractor_report(contractor_id): -# connection = config.get_db_connection() -# cursor = connection.cursor(dictionary=True, buffered=True) -# -# try: -# # Fetch contractor details -# cursor.execute(""" -# SELECT DISTINCT s.Contractor_Name, st.State_Name, d.District_Name, b.Block_Name, -# s.Mobile_No, s.GST_Registration_Type, s.GST_No,s.PAN_No,s.Email,s.Address -# FROM subcontractors s -# LEFT JOIN assign_subcontractors asg ON s.Contractor_Id = asg.Contractor_Id -# LEFT JOIN villages v ON asg.Village_Id = v.Village_Id -# LEFT JOIN blocks b ON v.Block_Id = b.Block_Id -# LEFT JOIN districts d ON b.District_id = d.District_id -# LEFT JOIN states st ON d.State_Id = st.State_Id -# WHERE s.Contractor_Id = %s -# """, (contractor_id,)) -# contInfo = cursor.fetchone() -# -# # cursor.callproc('GetContractorInfoById', [contractor_id]) -# # contInfo = next(cursor.stored_results()).fetchone() -# -# # Fetch distinct hold types present in invoices for the contractor -# cursor.execute(""" -# SELECT DISTINCT ht.hold_type_id, ht.hold_type -# FROM invoice_subcontractor_hold_join h -# JOIN hold_types ht ON h.hold_type_id = ht.hold_type_id -# JOIN invoice i ON h.Invoice_Id = i.Invoice_Id -# WHERE h.Contractor_Id = %s -# """, (contractor_id,)) -# hold_types = cursor.fetchall() -# # cursor.callproc('GetHoldTypesByContId', [contractor_id]) -# # hold_types = next(cursor.stored_results()).fetchall() -# -# # Fetch all invoices for the contractor, with optional hold information -# query = """ -# SELECT DISTINCT i.PMC_No, v.Village_Name, i.Work_Type, i.Invoice_Details, -# i.Invoice_Date, i.Invoice_No, i.Basic_Amount, i.Debit_Amount, -# i.After_Debit_Amount, i.Amount, i.GST_Amount, i.TDS_Amount, i.SD_Amount, -# i.On_Commission, i.Hydro_Testing, i.GST_SD_Amount, -# i.Final_Amount, h.hold_amount, ht.hold_type -# FROM invoice i -# LEFT JOIN villages v ON i.Village_Id = v.Village_Id -# LEFT JOIN assign_subcontractors asg ON v.Village_Id = asg.Village_Id -# LEFT JOIN subcontractors s ON asg.Contractor_Id = s.Contractor_Id -# LEFT JOIN invoice_subcontractor_hold_join h ON i.Invoice_Id = h.Invoice_Id AND h.Contractor_Id = s.Contractor_Id -# LEFT JOIN hold_types ht ON h.hold_type_id = ht.hold_type_id -# WHERE s.Contractor_Id = %s -# ORDER BY i.PMC_No ASC; -# """ -# cursor.execute(query, (contractor_id,)) -# invoices = cursor.fetchall() -# -# # cursor.callproc('GetInvoicesWithHoldByContId', [contractor_id]) -# # invoices = next(cursor.stored_results()).fetchall() -# -# gst_query = """select pmc_no,invoice_no,basic_amount,final_amount from gst_release where pmc_no in -# (select distinct pmc_no from assign_subcontractors where Contractor_Id= %s ) ORDER BY pmc_no ASC """ -# cursor.execute(gst_query, (contractor_id,)) -# gst_rel = cursor.fetchall() -# -# # cursor.callproc('GetGstReleaseBycontId', [contractor_id]) -# # gst_rel = next(cursor.stored_results()).fetchall() -# -# pay_query = """select pmc_no,invoice_no,Payment_Amount,TDS_Payment_Amount,Total_amount,utr from payment where pmc_no in -# (select distinct pmc_no from assign_subcontractors where Contractor_Id=%s ) ORDER BY pmc_no ASC """ -# cursor.execute(pay_query, (contractor_id,)) -# payments = cursor.fetchall() -# # cursor.callproc('GetPaymentsByContId', [contractor_id]) -# # payments = next(cursor.stored_results()).fetchall() -# -# total = { -# "sum_invo_basic_amt": float(sum(row['Basic_Amount'] or 0 for row in invoices)), -# "sum_invo_debit_amt": float(sum(row['Debit_Amount'] or 0 for row in invoices)), -# "sum_invo_after_debit_amt": float(sum(row['After_Debit_Amount'] or 0 for row in invoices)), -# "sum_invo_amt": float(sum(row['Amount'] or 0 for row in invoices)), -# "sum_invo_gst_amt": float(sum(row['GST_Amount'] or 0 for row in invoices)), -# "sum_invo_tds_amt": float(sum(row['TDS_Amount'] or 0 for row in invoices)), -# "sum_invo_ds_amt": float(sum(row['SD_Amount'] or 0 for row in invoices)), -# "sum_invo_on_commission": float(sum(row['On_Commission'] or 0 for row in invoices)), -# "sum_invo_hydro_test": float(sum(row['Hydro_Testing'] or 0 for row in invoices)), -# "sum_invo_gst_sd_amt": float(sum(row['GST_SD_Amount'] or 0 for row in invoices)), -# "sum_invo_final_amt": float(sum(row['Final_Amount'] or 0 for row in invoices)), -# "sum_invo_hold_amt": float(sum(row['hold_amount'] or 0 for row in invoices)), -# -# "sum_gst_basic_amt": float(sum(row['basic_amount'] or 0 for row in gst_rel)), -# "sum_gst_final_amt": float(sum(row['final_amount'] or 0 for row in gst_rel)), -# -# "sum_pay_payment_amt": float(sum(row['Payment_Amount'] or 0 for row in payments)), -# "sum_pay_tds_payment_amt": float(sum(row['TDS_Payment_Amount'] or 0 for row in payments)), -# "sum_pay_total_amt": float(sum(row['Total_amount'] or 0 for row in payments)) -# } -# current_date = datetime.now().strftime('%Y-%m-%d') -# -# except Exception as e: -# print(f"Error fetching contractor report: {e}") -# return "An error occurred while fetching contractor report", 500 -# -# finally: -# cursor.close() -# connection.close() -# -# return render_template('subcontractor_report.html', contInfo=contInfo, contractor_id=contractor_id, -# invoices=invoices, -# hold_types=hold_types, gst_rel=gst_rel, payments=payments, total=total, -# current_date=current_date) - -# @app.route('/contractor_report/') -# def contractor_report(contractor_id): -# connection = config.get_db_connection() -# cursor = connection.cursor(dictionary=True, buffered=True) - -# try: -# # Fetch contractor details -# cursor.execute(""" -# SELECT DISTINCT s.Contractor_Name, st.State_Name, d.District_Name, b.Block_Name, -# s.Mobile_No, s.GST_Registration_Type, s.GST_No,s.PAN_No,s.Email,s.Address -# FROM subcontractors s -# LEFT JOIN assign_subcontractors asg ON s.Contractor_Id = asg.Contractor_Id -# LEFT JOIN villages v ON asg.Village_Id = v.Village_Id -# LEFT JOIN blocks b ON v.Block_Id = b.Block_Id -# LEFT JOIN districts d ON b.District_id = d.District_id -# LEFT JOIN states st ON d.State_Id = st.State_Id -# WHERE s.Contractor_Id = %s -# """, (contractor_id,)) -# contInfo = cursor.fetchone() - -# # # Fetch distinct hold types present in invoices for the contractor -# cursor.execute(""" -# SELECT DISTINCT ht.hold_type_id, ht.hold_type -# FROM invoice_subcontractor_hold_join h -# JOIN hold_types ht ON h.hold_type_id = ht.hold_type_id -# JOIN invoice i ON h.Invoice_Id = i.Invoice_Id -# WHERE h.Contractor_Id = %s -# """, (contractor_id,)) -# hold_types = cursor.fetchall() -# # cursor.callproc('GetDistinctHoldTypesInInvoicesByContractor', [contractor_id]) - -# # for result in cursor.stored_results(): -# # hold_types = result.fetchall() - -# # # Fetch all invoices for the contractor, with optional hold information - -# query = """ -# SELECT DISTINCT i.PMC_No, v.Village_Name, i.Work_Type, i.Invoice_Details, -# i.Invoice_Date, i.Invoice_No, i.Basic_Amount, i.Debit_Amount, -# i.After_Debit_Amount, i.Amount, i.GST_Amount, i.TDS_Amount, i.SD_Amount, -# i.On_Commission, i.Hydro_Testing, i.GST_SD_Amount, -# i.Final_Amount, h.hold_amount, ht.hold_type -# FROM assign_subcontractors asg -# INNER JOIN villages v ON asg.Village_Id = v.Village_Id -# INNER JOIN invoice i ON i.Village_Id = v.Village_Id AND i.PMC_No = asg.PMC_No -# LEFT JOIN subcontractors s ON asg.Contractor_Id = s.Contractor_Id -# LEFT JOIN invoice_subcontractor_hold_join h ON i.Invoice_Id = h.Invoice_Id AND h.Contractor_Id = asg.Contractor_Id -# LEFT JOIN hold_types ht ON h.hold_type_id = ht.hold_type_id -# WHERE asg.Contractor_Id = %s -# ORDER BY i.PMC_No ASC; -# """ -# cursor.execute(query, (contractor_id,)) -# invoices = cursor.fetchall() - -# # cursor.callproc("GetInvoicesWithHoldInfoByContractor", [contractor_id]) -# # for result in cursor.stored_results(): -# # invoices = result.fetchall() - -# gst_query = """select pmc_no,invoice_no,basic_amount,final_amount from gst_release where pmc_no in -# (select distinct pmc_no from assign_subcontractors where Contractor_Id= %s ) ORDER BY pmc_no ASC """ -# cursor.execute(gst_query, (contractor_id,)) -# gst_rel = cursor.fetchall() -# # cursor.callproc('GetGSTReleasesByContractor', [contractor_id]) - -# # for result in cursor.stored_results(): -# # gst_rel = result.fetchall() - -# pay_query = """select pmc_no,invoice_no,Payment_Amount,TDS_Payment_Amount,Total_amount,utr from payment where pmc_no in -# (select distinct pmc_no from assign_subcontractors where Contractor_Id=%s ) ORDER BY pmc_no ASC """ -# cursor.execute(pay_query, (contractor_id,)) -# payments = cursor.fetchall() -# # cursor.callproc('GetPaymentsByContractor', [contractor_id]) - -# # for result in cursor.stored_results(): -# # payments = result.fetchall() - -# total = { -# "sum_invo_basic_amt": float(sum(row['Basic_Amount'] or 0 for row in invoices)), -# "sum_invo_debit_amt": float(sum(row['Debit_Amount'] or 0 for row in invoices)), -# "sum_invo_after_debit_amt": float(sum(row['After_Debit_Amount'] or 0 for row in invoices)), -# "sum_invo_amt": float(sum(row['Amount'] or 0 for row in invoices)), -# "sum_invo_gst_amt": float(sum(row['GST_Amount'] or 0 for row in invoices)), -# "sum_invo_tds_amt": float(sum(row['TDS_Amount'] or 0 for row in invoices)), -# "sum_invo_ds_amt": float(sum(row['SD_Amount'] or 0 for row in invoices)), -# "sum_invo_on_commission": float(sum(row['On_Commission'] or 0 for row in invoices)), -# "sum_invo_hydro_test": float(sum(row['Hydro_Testing'] or 0 for row in invoices)), -# "sum_invo_gst_sd_amt": float(sum(row['GST_SD_Amount'] or 0 for row in invoices)), -# "sum_invo_final_amt": float(sum(row['Final_Amount'] or 0 for row in invoices)), -# "sum_invo_hold_amt": float(sum(row['hold_amount'] or 0 for row in invoices)), - -# "sum_gst_basic_amt": float(sum(row['basic_amount'] or 0 for row in gst_rel)), -# "sum_gst_final_amt": float(sum(row['final_amount'] or 0 for row in gst_rel)), - -# "sum_pay_payment_amt": float(sum(row['Payment_Amount'] or 0 for row in payments)), -# "sum_pay_tds_payment_amt": float(sum(row['TDS_Payment_Amount'] or 0 for row in payments)), -# "sum_pay_total_amt": float(sum(row['Total_amount'] or 0 for row in payments)) -# } -# current_date = datetime.now().strftime('%Y-%m-%d') - -# except Exception as e: -# print(f"Error fetching contractor report: {e}") -# return "An error occurred while fetching contractor report", 500 - -# finally: -# cursor.close() -# connection.close() - -# return render_template('subcontractor_report.html', contInfo=contInfo, contractor_id=contractor_id, -# invoices=invoices, -# hold_types=hold_types, gst_rel=gst_rel, payments=payments, total=total, -# current_date=current_date) - -from flask import render_template -from datetime import datetime -import config @app.route('/contractor_report/') def contractor_report(contractor_id): @@ -3071,2084 +2488,146 @@ def contractor_report(contractor_id): - - - -# -----------------------------download contractor report--------------------------------- -# @app.route('/download_report/') -# def download_report(contractor_id): -# connection = config.get_db_connection() -# cursor = connection.cursor(dictionary=True) -# -# output_folder = "static/download" -# output_file = os.path.join(output_folder, f"Contractor_Report_{contractor_id}.xlsx") -# -# if not os.path.exists(output_folder): -# os.makedirs(output_folder) -# -# try: -# # Fetch Contractor Details -# # cursor.execute(""" -# # SELECT DISTINCT s.Contractor_Name, st.State_Name, d.District_Name, b.Block_Name, -# # s.Mobile_No, s.GST_Registration_Type, s.GST_No, s.PAN_No, s.Email, s.Address -# # FROM subcontractors s -# # LEFT JOIN assign_subcontractors asg ON s.Contractor_Id = asg.Contractor_Id -# # LEFT JOIN villages v ON asg.Village_Id = v.Village_Id -# # LEFT JOIN blocks b ON v.Block_Id = b.Block_Id -# # LEFT JOIN districts d ON b.District_id = d.District_id -# # LEFT JOIN states st ON d.State_Id = st.State_Id -# # WHERE s.Contractor_Id = %s -# # """, (contractor_id,)) -# # contInfo = cursor.fetchone() -# cursor.callproc('GetContractorInfoById', [contractor_id]) -# contInfo = next(cursor.stored_results()).fetchone() -# -# if not contInfo: -# return "No contractor found", 404 -# -# # Fetch distinct hold types present for the contractor -# cursor.execute(""" -# SELECT DISTINCT ht.hold_type_id, ht.hold_type -# FROM invoice_subcontractor_hold_join h -# JOIN hold_types ht ON h.hold_type_id = ht.hold_type_id -# WHERE h.Contractor_Id = %s -# """, (contractor_id,)) -# hold_types = cursor.fetchall() -# hold_type_map = {ht['hold_type_id']: ht['hold_type'] for ht in hold_types} -# -# # Fetch Invoices & GST Releases -# cursor.execute(""" -# SELECT DISTINCT i.Invoice_Id, i.PMC_No, v.Village_Name, i.Work_Type, i.Invoice_Details, -# i.Invoice_Date, i.Invoice_No, i.Basic_Amount, i.Debit_Amount, -# i.After_Debit_Amount, i.GST_Amount, i.Amount, i.TDS_Amount, i.SD_Amount, -# i.On_Commission, i.Hydro_Testing, i.GST_SD_Amount, i.Final_Amount, -# g.pmc_no AS gst_pmc_no, g.invoice_no AS gst_invoice_no, -# g.basic_amount AS gst_basic_amount, g.final_amount AS gst_final_amount -# FROM invoice i -# LEFT JOIN assign_subcontractors asg ON i.PMC_No = asg.PMC_No -# LEFT JOIN villages v ON i.Village_Id = v.Village_Id -# LEFT JOIN gst_release g ON i.PMC_No = g.pmc_no AND i.Invoice_No = g.invoice_no -# WHERE asg.Contractor_Id = %s -# """, (contractor_id,)) -# invoices = cursor.fetchall() -# -# # Fetch Hold Amounts separately -# cursor.execute(""" -# SELECT h.Invoice_Id, ht.hold_type_id, h.hold_amount -# FROM invoice_subcontractor_hold_join h -# JOIN hold_types ht ON h.hold_type_id = ht.hold_type_id -# WHERE h.Contractor_Id = %s -# """, (contractor_id,)) -# hold_amounts = cursor.fetchall() -# -# # Create a mapping of invoice_id to hold amounts by type -# hold_data = {} -# for h in hold_amounts: -# hold_data.setdefault(h['Invoice_Id'], {})[h['hold_type_id']] = h['hold_amount'] -# -# # Extract unique PMC numbers for payments -# pmc_numbers = tuple(set(inv['PMC_No'] for inv in invoices if inv['PMC_No'] is not None)) -# -# # Fetch all Payments for the PMC numbers (including those with null invoice_no) -# payments_map = {} -# extra_payments_map = {} # Now using a map to organize extra payments by PMC -# if pmc_numbers: -# # First get payments with invoice_no -# query = f""" -# SELECT pmc_no, invoice_no, Payment_Amount, TDS_Payment_Amount, Total_amount, UTR -# FROM payment -# WHERE pmc_no IN ({','.join(['%s'] * len(pmc_numbers))}) -# AND invoice_no IS NOT NULL -# ORDER BY pmc_no, invoice_no -# """ -# cursor.execute(query, pmc_numbers) -# payments = cursor.fetchall() -# -# # Organize payments by PMC No & Invoice No -# for pay in payments: -# key = (pay['pmc_no'], pay['invoice_no']) -# if key not in payments_map: -# payments_map[key] = [] -# payments_map[key].append(pay) -# -# # Then get extra payments (null invoice_no) and organize by PMC -# query = f""" -# SELECT pmc_no, invoice_no, Payment_Amount, TDS_Payment_Amount, Total_amount, UTR -# FROM payment -# WHERE pmc_no IN ({','.join(['%s'] * len(pmc_numbers))}) -# AND invoice_no IS NULL -# ORDER BY pmc_no -# """ -# cursor.execute(query, pmc_numbers) -# extra_payments = cursor.fetchall() -# -# for pay in extra_payments: -# if pay['pmc_no'] not in extra_payments_map: -# extra_payments_map[pay['pmc_no']] = [] -# extra_payments_map[pay['pmc_no']].append(pay) -# -# # Create Excel workbook -# workbook = openpyxl.Workbook() -# sheet = workbook.active -# sheet.title = "Contractor Report" -# -# # Write Contractor Details -# sheet.append(["", "", "Laxmi Civil Engineering Services PVT. LTD.", "", ""]) -# sheet.append( -# ["Contractor Name", contInfo["Contractor_Name"], " ", "GST No", contInfo["GST_No"], " ", "GST Type", -# contInfo["GST_Registration_Type"]]) -# sheet.append( -# ["State", contInfo["State_Name"], " ", "PAN No", contInfo["PAN_No"], " ", "Address", contInfo["Address"]]) -# sheet.append(["District", contInfo["District_Name"], " ", "Mobile No", contInfo["Mobile_No"]]) -# sheet.append(["Block", contInfo["Block_Name"], " ", "Email", contInfo["Email"]]) -# sheet.append([]) -# -# # Table Headers - include all hold types as separate columns -# base_headers = ["PMC No", "Village", "Work Type", "Invoice Details", "Invoice Date", "Invoice No", -# "Basic Amount", "Debit", "After Debit Amount", "GST (18%)", "Amount", "TDS (1%)", -# "SD (5%)", "On Commission", "Hydro Testing", "GST SD Amount"] -# -# hold_headers = [ht['hold_type'] for ht in hold_types] -# -# payment_headers = ["Final Amount", "Payment Amount", "TDS Payment", "Total Paid", "UTR"] -# -# sheet.append(base_headers + hold_headers + payment_headers) -# -# seen_invoices = set() -# seen_gst_notes = set() -# processed_payments = set() # Track which payments we've processed -# -# # Process invoices grouped by PMC No -# pmc_groups = {} -# for inv in invoices: -# pmc_no = inv["PMC_No"] -# if pmc_no not in pmc_groups: -# pmc_groups[pmc_no] = [] -# pmc_groups[pmc_no].append(inv) -# -# # Process each PMC group separately -# for pmc_no, pmc_invoices in pmc_groups.items(): -# # Process all invoices for this PMC first -# for inv in pmc_invoices: -# invoice_no = inv["Invoice_No"] -# payments = payments_map.get((pmc_no, invoice_no), []) -# -# # Process invoice row with first payment (if exists) -# if (pmc_no, invoice_no) not in seen_invoices: -# seen_invoices.add((pmc_no, invoice_no)) -# first_payment = payments[0] if len(payments) > 0 else None -# -# # Base invoice data -# row = [ -# pmc_no, inv["Village_Name"], inv["Work_Type"], inv["Invoice_Details"], -# inv["Invoice_Date"], invoice_no, inv["Basic_Amount"], inv["Debit_Amount"], -# inv["After_Debit_Amount"], inv["GST_Amount"], inv["Amount"], inv["TDS_Amount"], -# inv["SD_Amount"], inv["On_Commission"], inv["Hydro_Testing"], inv["GST_SD_Amount"] -# ] -# -# # Add hold amounts for each hold type -# invoice_holds = hold_data.get(inv["Invoice_Id"], {}) -# for ht_id in hold_type_map.keys(): -# row.append(invoice_holds.get(ht_id, "")) -# -# # Add payment information -# row += [ -# inv["Final_Amount"], -# first_payment["Payment_Amount"] if first_payment else "", -# first_payment["TDS_Payment_Amount"] if first_payment else "", -# first_payment["Total_amount"] if first_payment else "", -# first_payment["UTR"] if first_payment else "" -# ] -# -# sheet.append(row) -# -# if first_payment: -# payment_id = f"{pmc_no}-{invoice_no}-{first_payment['Payment_Amount']}-{first_payment.get('UTR', '')}" -# processed_payments.add(payment_id) -# -# # Process GST release if exists (only if we have a matching GST record) -# if inv["gst_pmc_no"] and (inv["gst_pmc_no"], inv["gst_invoice_no"]) not in seen_gst_notes: -# seen_gst_notes.add((inv["gst_pmc_no"], inv["gst_invoice_no"])) -# -# # Find the payment that matches this GST release -# gst_payment = None -# for payment in payments[1:]: # Skip first payment (already used for invoice) -# if payment['invoice_no'] == inv["gst_invoice_no"]: -# gst_payment = payment -# break -# -# # GST release row -# row = [ -# pmc_no, "", "", "GST Release Note", "", inv["gst_invoice_no"], -# inv["gst_basic_amount"], "", "", "", "", "", "", "", "", "" # Empty GST SD Amount -# ] -# -# # Empty holds for GST release -# row += ["" for _ in hold_headers] -# -# # Add payment information -# row += [ -# inv["gst_final_amount"], -# gst_payment["Payment_Amount"] if gst_payment else "", -# gst_payment["TDS_Payment_Amount"] if gst_payment else "", -# gst_payment["Total_amount"] if gst_payment else "", -# gst_payment["UTR"] if gst_payment else "" -# ] -# -# sheet.append(row) -# -# if gst_payment: -# payment_id = f"{pmc_no}-{inv['gst_invoice_no']}-{gst_payment['Payment_Amount']}-{gst_payment.get('UTR', '')}" -# processed_payments.add(payment_id) -# -# # Process remaining payments as extra payments -# for payment in payments[1:]: -# payment_id = f"{pmc_no}-{payment['invoice_no']}-{payment['Payment_Amount']}-{payment.get('UTR', '')}" -# if payment_id not in processed_payments: -# row = [ -# pmc_no, "", "", "", "", payment['invoice_no'], -# "", "", "", "", "", "", "", "", "", "" # Empty GST SD Amount -# ] -# -# # Empty holds for extra payments -# row += ["" for _ in hold_headers] -# -# # Add payment information -# row += [ -# "", -# payment["Payment_Amount"], -# payment["TDS_Payment_Amount"], -# payment["Total_amount"], -# payment["UTR"] -# ] -# -# sheet.append(row) -# processed_payments.add(payment_id) -# -# # Process extra payments for this PMC (null invoice_no) immediately after the PMC's invoices -# if pmc_no in extra_payments_map: -# for payment in extra_payments_map[pmc_no]: -# payment_id = f"{pmc_no}-null-{payment['Payment_Amount']}-{payment.get('UTR', '')}" -# if payment_id not in processed_payments: -# row = [ -# pmc_no, "", "", "", "", "", -# "", "", "", "", "", "", "", "", "", "" # Empty GST SD Amount -# ] -# -# # Empty holds for null invoice payments -# row += ["" for _ in hold_headers] -# -# # Add payment information -# row += [ -# "", -# payment["Payment_Amount"], -# payment["TDS_Payment_Amount"], -# payment["Total_amount"], -# payment["UTR"] -# ] -# -# sheet.append(row) -# processed_payments.add(payment_id) -# -# workbook.save(output_file) -# workbook.close() -# finally: -# cursor.close() -# connection.close() -# from openpyxl.styles import Font -# -# # Initialize totals -# total_basic_amount = 0 -# total_tds_amount = 0 -# total_sd_amount = 0 -# total_on_commission = 0 -# total_hold_amount = 0 -# total_final_amount = 0 -# total_total_amount = 0 # Sum of all Total Amounts from payment data -# -# # Iterate through rows to calculate totals -# for row in sheet.iter_rows(min_row=2, max_row=sheet.max_row, values_only=True): -# try: -# total_basic_amount += float(row[6] or 0) # Basic_Amount -# total_tds_amount += float(row[11] or 0) # TDS_Amount -# total_sd_amount += float(row[12] or 0) # SD_Amount -# total_on_commission += float(row[13] or 0) # On_Commission -# total_final_amount += float(row[-5] or 0) # Final_Amount -# total_total_amount += float(row[-2] or 0) # Total_Amount (from payments) -# -# # Sum of hold amounts (dynamically calculated based on hold_headers) -# hold_start_col = len(base_headers) # First column where hold types start -# hold_end_col = hold_start_col + len(hold_headers) # Last column where hold types end -# total_hold_amount += sum(float(row[i] or 0) for i in range(hold_start_col, hold_end_col)) -# -# except ValueError: -# continue # Skip if non-numeric values cause errors -# -# # Append the totals row at the bottom of the sheet -# totals_row = [ -# "TOTAL", "", "", "", "", "", # Empty values for non-numeric columns -# total_basic_amount, "", "", "", "", total_tds_amount, total_sd_amount, -# total_on_commission, "", "", # Empty GST SD Amount -# ] -# -# # Add empty placeholders for hold types -# totals_row += [total_hold_amount] + [""] * (len(hold_headers) - 1) -# -# # Add totals for Final Amount and Total Amount -# totals_row += [ -# total_final_amount, "", "", total_total_amount, "" # UTR column remains empty -# ] -# -# # Append totals row to sheet -# sheet.append([]) -# sheet.append(totals_row) -# -# # Make the totals row bold -# for cell in sheet[sheet.max_row]: -# cell.font = Font(bold=True) -# -# sheet.append([]) -# sheet.append([]) -# sheet.append([]) -# sheet.append([]) -# sheet.append(["This is Generated by LCEPL Application.."]) -# -# # Save workbook after modifications -# workbook.save(output_file) -# workbook.close() -# -# return send_from_directory(output_folder, f"Contractor_Report_{contractor_id}.xlsx", as_attachment=True) -from openpyxl import Workbook - # # Download report by contractor id # # Download report by contractor id -from flask import send_from_directory -import config +class FilePathData: + downloadReportFolder = "static/download" -# -----------------------PMC Report--------------------------- -# @app.route('/download_report/') -# def download_report(contractor_id): -# connection = config.get_db_connection() -# cursor = connection.cursor(dictionary=True) + -# output_folder = "static/download" -# output_file = os.path.join(output_folder, f"Contractor_Report_{contractor_id}.xlsx") - -# if not os.path.exists(output_folder): -# os.makedirs(output_folder) - -# try: -# # Fetch Contractor Details -# cursor.execute(""" -# SELECT DISTINCT s.Contractor_Name, st.State_Name, d.District_Name, b.Block_Name, -# s.Mobile_No, s.GST_Registration_Type, s.GST_No, s.PAN_No, s.Email, s.Address -# FROM subcontractors s -# LEFT JOIN assign_subcontractors asg ON s.Contractor_Id = asg.Contractor_Id -# LEFT JOIN villages v ON asg.Village_Id = v.Village_Id -# LEFT JOIN blocks b ON v.Block_Id = b.Block_Id -# LEFT JOIN districts d ON b.District_id = d.District_id -# LEFT JOIN states st ON d.State_Id = st.State_Id -# WHERE s.Contractor_Id = %s -# """, (contractor_id,)) -# contInfo = cursor.fetchone() - -# if not contInfo: -# return "No contractor found", 404 - -# # # Fetch distinct hold types present for the contractor -# # cursor.execute(""" -# # SELECT DISTINCT ht.hold_type_id, ht.hold_type -# # FROM invoice_subcontractor_hold_join h -# # JOIN hold_types ht ON h.hold_type_id = ht.hold_type_id -# # WHERE h.Contractor_Id = %s -# # """, (contractor_id,)) -# # hold_types = cursor.fetchall() -# cursor.callproc('GetDistinctHoldTypesByContractor', [contractor_id]) - -# for result in cursor.stored_results(): -# hold_types = result.fetchall() - -# hold_type_map = {ht['hold_type_id']: ht['hold_type'] for ht in hold_types} - -# # # Fetch Invoices & GST Releases -# # cursor.execute(""" -# # SELECT DISTINCT i.Invoice_Id, i.PMC_No, v.Village_Name, i.Work_Type, i.Invoice_Details, -# # i.Invoice_Date, i.Invoice_No, i.Basic_Amount, i.Debit_Amount, -# # i.After_Debit_Amount, i.GST_Amount, i.Amount, i.TDS_Amount, i.SD_Amount, -# # i.On_Commission, i.Hydro_Testing, i.GST_SD_Amount, i.Final_Amount, -# # g.pmc_no AS gst_pmc_no, g.invoice_no AS gst_invoice_no, -# # g.basic_amount AS gst_basic_amount, g.final_amount AS gst_final_amount -# # FROM invoice i -# # LEFT JOIN assign_subcontractors asg ON i.PMC_No = asg.PMC_No -# # LEFT JOIN villages v ON i.Village_Id = v.Village_Id -# # LEFT JOIN gst_release g ON i.PMC_No = g.pmc_no AND i.Invoice_No = g.invoice_no -# # WHERE asg.Contractor_Id = %s -# # """, (contractor_id,)) -# # invoices = cursor.fetchall() -# cursor.callproc('GetInvoicesAndGSTReleasesByContractor', [contractor_id]) - -# for result in cursor.stored_results(): -# invoices = result.fetchall() - -# # # Fetch Hold Amounts separately -# # cursor.execute(""" -# # SELECT h.Invoice_Id, ht.hold_type_id, h.hold_amount -# # FROM invoice_subcontractor_hold_join h -# # JOIN hold_types ht ON h.hold_type_id = ht.hold_type_id -# # WHERE h.Contractor_Id = %s -# # """, (contractor_id,)) -# # hold_amounts = cursor.fetchall() -# cursor.callproc('GetHoldAmountsByContractors', [contractor_id]) - -# for result in cursor.stored_results(): -# hold_amounts = result.fetchall() - -# # Create a mapping of invoice_id to hold amounts by type -# hold_data = {} -# for h in hold_amounts: -# hold_data.setdefault(h['Invoice_Id'], {})[h['hold_type_id']] = h['hold_amount'] - -# # Extract unique PMC numbers for payments -# pmc_numbers = tuple(set(inv['PMC_No'] for inv in invoices if inv['PMC_No'] is not None)) - -# # Fetch all Payments for the PMC numbers (including those with null invoice_no) -# payments_map = {} -# extra_payments_map = {} # Now using a map to organize extra payments by PMC -# if pmc_numbers: -# # First get payments with invoice_no -# query = f""" -# SELECT pmc_no, invoice_no, Payment_Amount, TDS_Payment_Amount, Total_amount, UTR -# FROM payment -# WHERE pmc_no IN ({','.join(['%s'] * len(pmc_numbers))}) -# AND invoice_no IS NOT NULL -# ORDER BY pmc_no, invoice_no -# """ -# cursor.execute(query, pmc_numbers) -# payments = cursor.fetchall() - -# # Organize payments by PMC No & Invoice No -# for pay in payments: -# key = (pay['pmc_no'], pay['invoice_no']) -# if key not in payments_map: -# payments_map[key] = [] -# payments_map[key].append(pay) - -# # Then get extra payments (null invoice_no) and organize by PMC -# query = f""" -# SELECT pmc_no, invoice_no, Payment_Amount, TDS_Payment_Amount, Total_amount, UTR -# FROM payment -# WHERE pmc_no IN ({','.join(['%s'] * len(pmc_numbers))}) -# AND invoice_no IS NULL -# ORDER BY pmc_no -# """ -# cursor.execute(query, pmc_numbers) -# extra_payments = cursor.fetchall() - -# for pay in extra_payments: -# if pay['pmc_no'] not in extra_payments_map: -# extra_payments_map[pay['pmc_no']] = [] -# extra_payments_map[pay['pmc_no']].append(pay) - -# # Create Excel workbook -# workbook = openpyxl.Workbook() -# sheet = workbook.active -# sheet.title = "Contractor Report" - -# # Write Contractor Details -# sheet.append(["Contractor Name", contInfo["Contractor_Name"]]) -# sheet.append(["State", contInfo["State_Name"]]) -# sheet.append(["District", contInfo["District_Name"]]) -# sheet.append(["Block", contInfo["Block_Name"]]) -# sheet.append(["Mobile No", contInfo["Mobile_No"]]) -# sheet.append(["GST Type", contInfo["GST_Registration_Type"]]) -# sheet.append(["GST No", contInfo["GST_No"]]) -# sheet.append(["PAN No", contInfo["PAN_No"]]) -# sheet.append(["Email", contInfo["Email"]]) -# sheet.append(["Address", contInfo["Address"]]) -# sheet.append([]) - -# # Table Headers - include all hold types as separate columns -# base_headers = ["PMC No", "Village", "Work Type", "Invoice Details", "Invoice Date", "Invoice No", -# "Basic Amount", "Debit", "After Debit Amount", "GST (18%)", "Amount", "TDS (1%)", -# "SD (5%)", "On Commission", "Hydro Testing", "GST SD Amount"] - -# hold_headers = [ht['hold_type'] for ht in hold_types] - -# payment_headers = ["Final Amount", "Payment Amount", "TDS Payment", "Total Paid", "UTR"] - -# sheet.append(base_headers + hold_headers + payment_headers) - -# seen_invoices = set() -# seen_gst_notes = set() -# processed_payments = set() # Track which payments we've processed - -# # Process invoices grouped by PMC No -# pmc_groups = {} -# for inv in invoices: -# pmc_no = inv["PMC_No"] -# if pmc_no not in pmc_groups: -# pmc_groups[pmc_no] = [] -# pmc_groups[pmc_no].append(inv) - -# # Process each PMC group separately -# for pmc_no, pmc_invoices in pmc_groups.items(): -# # Process all invoices for this PMC first -# for inv in pmc_invoices: -# invoice_no = inv["Invoice_No"] -# payments = payments_map.get((pmc_no, invoice_no), []) - -# # Process invoice row with first payment (if exists) -# if (pmc_no, invoice_no) not in seen_invoices: -# seen_invoices.add((pmc_no, invoice_no)) -# first_payment = payments[0] if len(payments) > 0 else None - -# # Base invoice data -# row = [ -# pmc_no, inv["Village_Name"], inv["Work_Type"], inv["Invoice_Details"], -# inv["Invoice_Date"], invoice_no, inv["Basic_Amount"], inv["Debit_Amount"], -# inv["After_Debit_Amount"], inv["GST_Amount"], inv["Amount"], inv["TDS_Amount"], -# inv["SD_Amount"], inv["On_Commission"], inv["Hydro_Testing"], inv["GST_SD_Amount"] -# ] - -# # Add hold amounts for each hold type -# invoice_holds = hold_data.get(inv["Invoice_Id"], {}) -# for ht_id in hold_type_map.keys(): -# row.append(invoice_holds.get(ht_id, "")) - -# # Add payment information -# row += [ -# inv["Final_Amount"], -# first_payment["Payment_Amount"] if first_payment else "", -# first_payment["TDS_Payment_Amount"] if first_payment else "", -# first_payment["Total_amount"] if first_payment else "", -# first_payment["UTR"] if first_payment else "" -# ] - -# sheet.append(row) - -# if first_payment: -# payment_id = f"{pmc_no}-{invoice_no}-{first_payment['Payment_Amount']}-{first_payment.get('UTR', '')}" -# processed_payments.add(payment_id) - -# # Process GST release if exists (only if we have a matching GST record) -# if inv["gst_pmc_no"] and (inv["gst_pmc_no"], inv["gst_invoice_no"]) not in seen_gst_notes: -# seen_gst_notes.add((inv["gst_pmc_no"], inv["gst_invoice_no"])) - -# # Find the payment that matches this GST release -# gst_payment = None -# for payment in payments[1:]: # Skip first payment (already used for invoice) -# if payment['invoice_no'] == inv["gst_invoice_no"]: -# gst_payment = payment -# break - -# # GST release row -# row = [ -# pmc_no, "", "", "GST Release Note", "", inv["gst_invoice_no"], -# inv["gst_basic_amount"], "", "", "", "", "", "", "", "", "" # Empty GST SD Amount -# ] - -# # Empty holds for GST release -# row += ["" for _ in hold_headers] - -# # Add payment information -# row += [ -# inv["gst_final_amount"], -# gst_payment["Payment_Amount"] if gst_payment else "", -# gst_payment["TDS_Payment_Amount"] if gst_payment else "", -# gst_payment["Total_amount"] if gst_payment else "", -# gst_payment["UTR"] if gst_payment else "" -# ] - -# sheet.append(row) - -# if gst_payment: -# payment_id = f"{pmc_no}-{inv['gst_invoice_no']}-{gst_payment['Payment_Amount']}-{gst_payment.get('UTR', '')}" -# processed_payments.add(payment_id) - -# # Process remaining payments as extra payments -# for payment in payments[1:]: -# payment_id = f"{pmc_no}-{payment['invoice_no']}-{payment['Payment_Amount']}-{payment.get('UTR', '')}" -# if payment_id not in processed_payments: -# row = [ -# pmc_no, "", "", "", "", payment['invoice_no'], -# "", "", "", "", "", "", "", "", "", "" # Empty GST SD Amount -# ] - -# # Empty holds for extra payments -# row += ["" for _ in hold_headers] - -# # Add payment information -# row += [ -# "", -# payment["Payment_Amount"], -# payment["TDS_Payment_Amount"], -# payment["Total_amount"], -# payment["UTR"] -# ] - -# sheet.append(row) -# processed_payments.add(payment_id) - -# # Process extra payments for this PMC (null invoice_no) immediately after the PMC's invoices -# if pmc_no in extra_payments_map: -# for payment in extra_payments_map[pmc_no]: -# payment_id = f"{pmc_no}-null-{payment['Payment_Amount']}-{payment.get('UTR', '')}" -# if payment_id not in processed_payments: -# row = [ -# pmc_no, "", "", "", "", "", -# "", "", "", "", "", "", "", "", "", "" # Empty GST SD Amount -# ] - -# # Empty holds for null invoice payments -# row += ["" for _ in hold_headers] - -# # Add payment information -# row += [ -# "", -# payment["Payment_Amount"], -# payment["TDS_Payment_Amount"], -# payment["Total_amount"], -# payment["UTR"] -# ] - - -# sheet.append(row) -# processed_payments.add(payment_id) - -# workbook.save(output_file) -# workbook.close() -# finally: -# cursor.close() -# connection.close() -# from openpyxl.styles import Font - -# # Initialize totals -# total_basic_amount = 0 -# total_tds_amount = 0 -# total_sd_amount = 0 -# total_on_commission = 0 -# total_hold_amount = 0 -# total_final_amount = 0 -# total_total_amount = 0 # Sum of all Total Amounts from payment data - -# # Iterate through rows to calculate totals -# for row in sheet.iter_rows(min_row=2, max_row=sheet.max_row, values_only=True): -# try: -# total_basic_amount += float(row[6] or 0) # Basic_Amount -# total_tds_amount += float(row[11] or 0) # TDS_Amount -# total_sd_amount += float(row[12] or 0) # SD_Amount -# total_on_commission += float(row[13] or 0) # On_Commission -# total_final_amount += float(row[-5] or 0) # Final_Amount -# total_total_amount += float(row[-2] or 0) # Total_Amount (from payments) - -# # Sum of hold amounts (dynamically calculated based on hold_headers) -# hold_start_col = len(base_headers) # First column where hold types start -# hold_end_col = hold_start_col + len(hold_headers) # Last column where hold types end -# total_hold_amount += sum(float(row[i] or 0) for i in range(hold_start_col, hold_end_col)) - -# except ValueError: -# continue # Skip if non-numeric values cause errors - -# # Append the totals row at the bottom of the sheet -# totals_row = [ -# "TOTAL", "", "", "", "", "", # Empty values for non-numeric columns -# total_basic_amount, "", "", "", "", total_tds_amount, total_sd_amount, -# total_on_commission, "", "", # Empty GST SD Amount -# ] - -# # Add empty placeholders for hold types -# totals_row += [total_hold_amount] + [""] * (len(hold_headers) - 1) - -# # Add totals for Final Amount and Total Amount -# totals_row += [ -# total_final_amount, "", "", total_total_amount, "" # UTR column remains empty -# ] - -# # Append totals row to sheet -# sheet.append([]) -# sheet.append(totals_row) - -# # Make the totals row bold -# for cell in sheet[sheet.max_row]: -# cell.font = Font(bold=True) - -# # Save workbook after modifications -# workbook.save(output_file) -# workbook.close() - -# return send_from_directory(output_folder, f"Contractor_Report_{contractor_id}.xlsx", as_attachment=True) - -# @app.route('/download_report/') -# def download_report(contractor_id): -# connection = config.get_db_connection() -# cursor = connection.cursor(dictionary=True) -# -# output_folder = "static/download" -# output_file = os.path.join(output_folder, f"Contractor_Report_{contractor_id}.xlsx") -# -# if not os.path.exists(output_folder): -# os.makedirs(output_folder) -# -# try: -# # Fetch Contractor Details -# # cursor.execute(""" -# # SELECT DISTINCT s.Contractor_Name, st.State_Name, d.District_Name, b.Block_Name, -# # s.Mobile_No, s.GST_Registration_Type, s.GST_No, s.PAN_No, s.Email, s.Address -# # FROM subcontractors s -# # LEFT JOIN assign_subcontractors asg ON s.Contractor_Id = asg.Contractor_Id -# # LEFT JOIN villages v ON asg.Village_Id = v.Village_Id -# # LEFT JOIN blocks b ON v.Block_Id = b.Block_Id -# # LEFT JOIN districts d ON b.District_id = d.District_id -# # LEFT JOIN states st ON d.State_Id = st.State_Id -# # WHERE s.Contractor_Id = %s -# # """, (contractor_id,)) -# # contInfo = cursor.fetchone() -# cursor.callproc('GetContractorInfoId', [contractor_id]) -# for result in cursor.stored_results(): -# contInfo = result.fetchone() -# -# if not contInfo: -# return "No contractor found", 404 -# -# # # Fetch distinct hold types present for the contractor -# # cursor.execute(""" -# # SELECT DISTINCT ht.hold_type_id, ht.hold_type -# # FROM invoice_subcontractor_hold_join h -# # JOIN hold_types ht ON h.hold_type_id = ht.hold_type_id -# # WHERE h.Contractor_Id = %s -# # """, (contractor_id,)) -# # hold_types = cursor.fetchall() -# cursor.callproc('GetDistinctHoldTypesByContractor', [contractor_id]) -# -# for result in cursor.stored_results(): -# hold_types = result.fetchall() -# -# hold_type_map = {ht['hold_type_id']: ht['hold_type'] for ht in hold_types} -# -# # # Fetch Invoices & GST Releases -# # cursor.execute(""" -# # SELECT DISTINCT i.Invoice_Id, i.PMC_No, v.Village_Name, i.Work_Type, i.Invoice_Details, -# # i.Invoice_Date, i.Invoice_No, i.Basic_Amount, i.Debit_Amount, -# # i.After_Debit_Amount, i.GST_Amount, i.Amount, i.TDS_Amount, i.SD_Amount, -# # i.On_Commission, i.Hydro_Testing, i.GST_SD_Amount, i.Final_Amount, -# # g.pmc_no AS gst_pmc_no, g.invoice_no AS gst_invoice_no, -# # g.basic_amount AS gst_basic_amount, g.final_amount AS gst_final_amount -# # FROM invoice i -# # LEFT JOIN assign_subcontractors asg ON i.PMC_No = asg.PMC_No -# # LEFT JOIN villages v ON i.Village_Id = v.Village_Id -# # LEFT JOIN gst_release g ON i.PMC_No = g.pmc_no AND i.Invoice_No = g.invoice_no -# # WHERE asg.Contractor_Id = %s -# # """, (contractor_id,)) -# # invoices = cursor.fetchall() -# cursor.callproc('GetInvoicesAndGSTReleasesByContractor', [contractor_id]) -# -# for result in cursor.stored_results(): -# invoices = result.fetchall() -# -# # # Fetch Hold Amounts separately -# # cursor.execute(""" -# # SELECT h.Invoice_Id, ht.hold_type_id, h.hold_amount -# # FROM invoice_subcontractor_hold_join h -# # JOIN hold_types ht ON h.hold_type_id = ht.hold_type_id -# # WHERE h.Contractor_Id = %s -# # """, (contractor_id,)) -# # hold_amounts = cursor.fetchall() -# cursor.callproc('GetHoldAmountsByContractors', [contractor_id]) -# -# for result in cursor.stored_results(): -# hold_amounts = result.fetchall() -# -# # Create a mapping of invoice_id to hold amounts by type -# hold_data = {} -# for h in hold_amounts: -# hold_data.setdefault(h['Invoice_Id'], {})[h['hold_type_id']] = h['hold_amount'] -# -# # Extract unique PMC numbers for payments -# pmc_numbers = tuple(set(inv['PMC_No'] for inv in invoices if inv['PMC_No'] is not None)) -# -# # Fetch all Payments for the PMC numbers (including those with null invoice_no) -# payments_map = {} -# extra_payments_map = {} # Now using a map to organize extra payments by PMC -# if pmc_numbers: -# # # First get payments with invoice_no -# # query = f""" -# # SELECT pmc_no, invoice_no, Payment_Amount, TDS_Payment_Amount, Total_amount, UTR -# # FROM payment -# # WHERE pmc_no IN ({','.join(['%s'] * len(pmc_numbers))}) -# # AND invoice_no IS NOT NULL -# # ORDER BY pmc_no, invoice_no -# # """ -# # cursor.execute(query, pmc_numbers) -# # payments = cursor.fetchall() -# -# pmc_list_str = ','.join(str(pmc) for pmc in pmc_numbers) -# # e.g. 'PMC001,PMC002,PMC003' -# cursor.callproc('GetPaymentsByPmcNosWithInvoice', [pmc_list_str]) -# -# for result in cursor.stored_results(): -# payments = result.fetchall() -# -# print("payments by procedure:", payments) -# # Organize payments by PMC No & Invoice No -# for pay in payments: -# key = (pay['pmc_no'], pay['invoice_no']) -# if key not in payments_map: -# payments_map[key] = [] -# payments_map[key].append(pay) -# -# # Then get extra payments (null invoice_no) and organize by PMC -# # query = f""" -# # SELECT pmc_no, invoice_no, Payment_Amount, TDS_Payment_Amount, Total_amount, UTR -# # FROM payment -# # WHERE pmc_no IN ({','.join(['%s'] * len(pmc_numbers))}) -# # AND invoice_no IS NULL -# # ORDER BY pmc_no -# # """ -# # cursor.execute(query, pmc_numbers) -# # extra_payments = cursor.fetchall() -# pmc_list_str = ','.join(str(pmc) for pmc in pmc_numbers) -# cursor.callproc('GetExtraPaymentsByPmcNos', [pmc_list_str]) -# -# for result in cursor.stored_results(): -# extra_payments = result.fetchall() -# print( -# "-----------------------------------------------------------------------------------------Extra Payment---------------------------------------------------------------") -# print("Extra payment from produre", extra_payments) -# -# for pay in extra_payments: -# if pay['pmc_no'] not in extra_payments_map: -# extra_payments_map[pay['pmc_no']] = [] -# extra_payments_map[pay['pmc_no']].append(pay) -# print( -# "-----------------------------------------------------------------------------------------Extra Payment MAP --------------------------------------------------------------") -# print("Extra payment MAp from produre", extra_payments_map) -# # Create Excel workbook -# workbook = openpyxl.Workbook() -# sheet = workbook.active -# sheet.title = "Contractor Report" -# -# # Write Contractor Details -# sheet.append(["Contractor Name", contInfo["Contractor_Name"]]) -# sheet.append(["State", contInfo["State_Name"]]) -# sheet.append(["District", contInfo["District_Name"]]) -# sheet.append(["Block", contInfo["Block_Name"]]) -# sheet.append(["Mobile No", contInfo["Mobile_No"]]) -# sheet.append(["GST Type", contInfo["GST_Registration_Type"]]) -# sheet.append(["GST No", contInfo["GST_No"]]) -# sheet.append(["PAN No", contInfo["PAN_No"]]) -# sheet.append(["Email", contInfo["Email"]]) -# sheet.append(["Address", contInfo["Address"]]) -# sheet.append([]) -# -# # Table Headers - include all hold types as separate columns -# base_headers = ["PMC No", "Village", "Work Type", "Invoice Details", "Invoice Date", "Invoice No", -# "Basic Amount", "Debit", "After Debit Amount", "GST (18%)", "Amount", "TDS (1%)", -# "SD (5%)", "On Commission", "Hydro Testing", "GST SD Amount"] -# -# hold_headers = [ht['hold_type'] for ht in hold_types] -# -# payment_headers = ["Final Amount", "Payment Amount", "TDS Payment", "Total Paid", "UTR"] -# -# sheet.append(base_headers + hold_headers + payment_headers) -# -# seen_invoices = set() -# seen_gst_notes = set() -# processed_payments = set() # Track which payments we've processed -# -# # Process invoices grouped by PMC No -# pmc_groups = {} -# for inv in invoices: -# pmc_no = inv["PMC_No"] -# if pmc_no not in pmc_groups: -# pmc_groups[pmc_no] = [] -# pmc_groups[pmc_no].append(inv) -# -# # Process each PMC group separately -# for pmc_no, pmc_invoices in pmc_groups.items(): -# # Process all invoices for this PMC first -# for inv in pmc_invoices: -# invoice_no = inv["Invoice_No"] -# payments = payments_map.get((pmc_no, invoice_no), []) -# -# # Process invoice row with first payment (if exists) -# if (pmc_no, invoice_no) not in seen_invoices: -# seen_invoices.add((pmc_no, invoice_no)) -# first_payment = payments[0] if len(payments) > 0 else None -# -# # Base invoice data -# row = [ -# pmc_no, inv["Village_Name"], inv["Work_Type"], inv["Invoice_Details"], -# inv["Invoice_Date"], invoice_no, inv["Basic_Amount"], inv["Debit_Amount"], -# inv["After_Debit_Amount"], inv["GST_Amount"], inv["Amount"], inv["TDS_Amount"], -# inv["SD_Amount"], inv["On_Commission"], inv["Hydro_Testing"], inv["GST_SD_Amount"] -# ] -# -# # Add hold amounts for each hold type -# invoice_holds = hold_data.get(inv["Invoice_Id"], {}) -# for ht_id in hold_type_map.keys(): -# row.append(invoice_holds.get(ht_id, "")) -# -# # Add payment information -# row += [ -# inv["Final_Amount"], -# first_payment["Payment_Amount"] if first_payment else "", -# first_payment["TDS_Payment_Amount"] if first_payment else "", -# first_payment["Total_amount"] if first_payment else "", -# first_payment["UTR"] if first_payment else "" -# ] -# -# sheet.append(row) -# -# if first_payment: -# payment_id = f"{pmc_no}-{invoice_no}-{first_payment['Payment_Amount']}-{first_payment.get('UTR', '')}" -# processed_payments.add(payment_id) -# -# # Process GST release if exists (only if we have a matching GST record) -# if inv["gst_pmc_no"] and (inv["gst_pmc_no"], inv["gst_invoice_no"]) not in seen_gst_notes: -# seen_gst_notes.add((inv["gst_pmc_no"], inv["gst_invoice_no"])) -# -# # Find the payment that matches this GST release -# gst_payment = None -# for payment in payments[1:]: # Skip first payment (already used for invoice) -# if payment['invoice_no'] == inv["gst_invoice_no"]: -# gst_payment = payment -# break -# -# # GST release row -# row = [ -# pmc_no, "", "", "GST Release Note", "", inv["gst_invoice_no"], -# inv["gst_basic_amount"], "", "", "", "", "", "", "", "", "" # Empty GST SD Amount -# ] -# -# # Empty holds for GST release -# row += ["" for _ in hold_headers] -# -# # Add payment information -# row += [ -# inv["gst_final_amount"], -# gst_payment["Payment_Amount"] if gst_payment else "", -# gst_payment["TDS_Payment_Amount"] if gst_payment else "", -# gst_payment["Total_amount"] if gst_payment else "", -# gst_payment["UTR"] if gst_payment else "" -# ] -# -# sheet.append(row) -# -# if gst_payment: -# payment_id = f"{pmc_no}-{inv['gst_invoice_no']}-{gst_payment['Payment_Amount']}-{gst_payment.get('UTR', '')}" -# processed_payments.add(payment_id) -# -# # Process remaining payments as extra payments -# for payment in payments[1:]: -# payment_id = f"{pmc_no}-{payment['invoice_no']}-{payment['Payment_Amount']}-{payment.get('UTR', '')}" -# if payment_id not in processed_payments: -# row = [ -# pmc_no, "", "", "", "", payment['invoice_no'], -# "", "", "", "", "", "", "", "", "", "" # Empty GST SD Amount -# ] -# -# # Empty holds for extra payments -# row += ["" for _ in hold_headers] -# -# # Add payment information -# row += [ -# "", -# payment["Payment_Amount"], -# payment["TDS_Payment_Amount"], -# payment["Total_amount"], -# payment["UTR"] -# ] -# -# sheet.append(row) -# processed_payments.add(payment_id) -# -# # Process extra payments for this PMC (null invoice_no) immediately after the PMC's invoices -# if pmc_no in extra_payments_map: -# for payment in extra_payments_map[pmc_no]: -# payment_id = f"{pmc_no}-null-{payment['Payment_Amount']}-{payment.get('UTR', '')}" -# if payment_id not in processed_payments: -# row = [ -# pmc_no, "", "", "", "", "", -# "", "", "", "", "", "", "", "", "", "" # Empty GST SD Amount -# ] -# -# # Empty holds for null invoice payments -# row += ["" for _ in hold_headers] -# -# # Add payment information -# row += [ -# "", -# payment["Payment_Amount"], -# payment["TDS_Payment_Amount"], -# payment["Total_amount"], -# payment["UTR"] -# ] -# -# sheet.append(row) -# processed_payments.add(payment_id) -# -# workbook.save(output_file) -# workbook.close() -# finally: -# cursor.close() -# connection.close() -# from openpyxl.styles import Font -# -# # Initialize totals -# total_basic_amount = 0 -# total_tds_amount = 0 -# total_sd_amount = 0 -# total_on_commission = 0 -# total_hold_amount = 0 -# total_final_amount = 0 -# total_total_amount = 0 # Sum of all Total Amounts from payment data -# -# # Iterate through rows to calculate totals -# for row in sheet.iter_rows(min_row=2, max_row=sheet.max_row, values_only=True): -# try: -# total_basic_amount += float(row[6] or 0) # Basic_Amount -# total_tds_amount += float(row[11] or 0) # TDS_Amount -# total_sd_amount += float(row[12] or 0) # SD_Amount -# total_on_commission += float(row[13] or 0) # On_Commission -# total_final_amount += float(row[-5] or 0) # Final_Amount -# total_total_amount += float(row[-2] or 0) # Total_Amount (from payments) -# -# # Sum of hold amounts (dynamically calculated based on hold_headers) -# hold_start_col = len(base_headers) # First column where hold types start -# hold_end_col = hold_start_col + len(hold_headers) # Last column where hold types end -# total_hold_amount += sum(float(row[i] or 0) for i in range(hold_start_col, hold_end_col)) -# -# except ValueError: -# continue # Skip if non-numeric values cause errors -# -# # Append the totals row at the bottom of the sheet -# totals_row = [ -# "TOTAL", "", "", "", "", "", # Empty values for non-numeric columns -# total_basic_amount, "", "", "", "", total_tds_amount, total_sd_amount, -# total_on_commission, "", "", # Empty GST SD Amount -# ] -# if hold_headers: -# totals_row += [total_hold_amount] + [""] * (len(hold_headers) - 1) -# -# # Add empty placeholders for hold types -# # totals_row += [total_hold_amount] + [""] * (len(hold_headers) - 1) -# -# # Add totals for Final Amount and Total Amount -# totals_row += [ -# total_final_amount, "", "", total_total_amount, "" # UTR column remains empty -# ] -# -# # Append totals row to sheet -# sheet.append([]) -# sheet.append(totals_row) -# total_hold_amount=Decimal('0.00') -# for d in invoices: -# total_hold_amount = total_hold_amount + d.get('SD_Amount', Decimal('0.00')) + d.get('On_Commission', -# Decimal( -# '0.00')) + d.get( -# 'Hydro_Testing', Decimal('0.00')) -# #new coded for summary chart added -# for data in hold_amounts: -# total_hold_amount = total_hold_amount + data.get('hold_amount', Decimal('0.00')) -# print("Total Hold Amount after adding the hold amount ", total_hold_amount) -# -# -# from datetime import datetime -# -# # Add payment information -# -# # Get today's date with weekday -# today_date = datetime.today().strftime('%A, %Y-%m-%d') -# -# # Add headers (optional) -# sheet.append(["Contractor Name", contInfo["Contractor_Name"]]) -# sheet.append(["Date", today_date]) -# sheet.append(["Description", "Amount"]) -# -# # Add your values -# sheet.append(["Advance/Surplus", str( total_final_amount - total_total_amount)]) -# sheet.append(["Total Hold Amount", str(total_hold_amount)]) -# sheet.append(["Amount With TDS", str(total_tds_amount)]) -# #new added code end here for summary chart -# -# # Make the totals row bold -# for cell in sheet[sheet.max_row]: -# cell.font = Font(bold=True) -# -# # Save workbook after modifications -# workbook.save(output_file) -# workbook.close() -# -# return send_from_directory(output_folder, f"Contractor_Report_{contractor_id}.xlsx", as_attachment=True) - -from flask import send_from_directory -import os -import openpyxl -from openpyxl.styles import Font, PatternFill -from decimal import Decimal -from datetime import datetime - -from flask import send_from_directory -import os -import openpyxl -from openpyxl.styles import Font, PatternFill -from decimal import Decimal -from datetime import datetime - -# @app.route('/download_report/') -# def download_report(contractor_id): -# connection = config.get_db_connection() -# cursor = connection.cursor(dictionary=True) - -# output_folder = "static/download" -# output_file = os.path.join(output_folder, f"Contractor_Report_{contractor_id}.xlsx") - -# if not os.path.exists(output_folder): -# os.makedirs(output_folder) - -# try: -# # Fetch Contractor Info -# cursor.callproc('GetContractorInfoId', [contractor_id]) -# for result in cursor.stored_results(): -# contInfo = result.fetchone() -# if not contInfo: -# return "No contractor found", 404 - -# # Fetch Hold Types -# cursor.callproc('GetDistinctHoldTypesByContractor', [contractor_id]) -# for result in cursor.stored_results(): -# hold_types = result.fetchall() -# hold_type_map = {ht['hold_type_id']: ht['hold_type'] for ht in hold_types} - -# # Fetch Invoices -# cursor.callproc('GetInvoicesAndGSTReleasesByContractor', [contractor_id]) -# for result in cursor.stored_results(): -# invoices = result.fetchall() - -# # Fetch Hold Amounts -# cursor.callproc('GetHoldAmountsByContractors', [contractor_id]) -# for result in cursor.stored_results(): -# hold_amounts = result.fetchall() -# hold_data = {} -# for h in hold_amounts: -# hold_data.setdefault(h['Invoice_Id'], {})[h['hold_type_id']] = h['hold_amount'] - -# # Extract PMC numbers -# pmc_numbers = tuple(set(inv['PMC_No'] for inv in invoices if inv['PMC_No'] is not None)) - -# payments_map = {} -# extra_payments_map = {} -# if pmc_numbers: -# pmc_list_str = ','.join(str(pmc) for pmc in pmc_numbers) -# cursor.callproc('GetPaymentsByPmcNosWithInvoice', [pmc_list_str]) -# for result in cursor.stored_results(): -# payments = result.fetchall() -# for pay in payments: -# key = (pay['pmc_no'], pay['invoice_no']) -# payments_map.setdefault(key, []).append(pay) - -# cursor.callproc('GetExtraPaymentsByPmcNos', [pmc_list_str]) -# for result in cursor.stored_results(): -# extra_payments = result.fetchall() -# for pay in extra_payments: -# extra_payments_map.setdefault(pay['pmc_no'], []).append(pay) - -# # Create Excel Workbook -# workbook = openpyxl.Workbook() -# sheet = workbook.active -# sheet.title = "Contractor Report" - -# # Write Contractor Info -# sheet.append(["Contractor Name", contInfo["Contractor_Name"]]) -# sheet.append(["State", contInfo["State_Name"]]) -# sheet.append(["District", contInfo["District_Name"]]) -# sheet.append(["Block", contInfo["Block_Name"]]) -# sheet.append(["Mobile No", contInfo["Mobile_No"]]) -# sheet.append(["GST Type", contInfo["GST_Registration_Type"]]) -# sheet.append(["GST No", contInfo["GST_No"]]) -# sheet.append(["PAN No", contInfo["PAN_No"]]) -# sheet.append(["Email", contInfo["Email"]]) -# sheet.append(["Address", contInfo["Address"]]) -# sheet.append([]) - -# # Table Headers -# base_headers = ["PMC No", "Village", "Work Type", "Invoice Details", "Invoice Date", "Invoice No", -# "Basic Amount", "Debit", "After Debit Amount", "GST (18%)", "Amount", "TDS (1%)", -# "SD (5%)", "On Commission", "Hydro Testing", "GST SD Amount"] -# hold_headers = [ht['hold_type'] for ht in hold_types] -# payment_headers = ["Final Amount", "Payment Amount", "TDS Payment", "Total Paid", "UTR"] -# all_headers = base_headers + hold_headers + payment_headers - -# sheet.append(all_headers) - -# # Style the headers -# header_fill = PatternFill(start_color="ADD8E6", end_color="ADD8E6", fill_type="solid") -# header_font = Font(bold=True) -# for cell in sheet[sheet.max_row]: -# cell.font = header_font -# cell.fill = header_fill - -# seen_invoices = set() -# seen_gst_notes = set() -# processed_payments = set() -# pmc_groups = {} -# for inv in invoices: -# pmc_groups.setdefault(inv["PMC_No"], []).append(inv) - -# for pmc_no, pmc_invoices in pmc_groups.items(): -# for inv in pmc_invoices: -# invoice_no = inv["Invoice_No"] -# payments = payments_map.get((pmc_no, invoice_no), []) - -# if (pmc_no, invoice_no) not in seen_invoices: -# seen_invoices.add((pmc_no, invoice_no)) -# first_payment = payments[0] if payments else None -# row = [ -# pmc_no, inv["Village_Name"], inv["Work_Type"], inv["Invoice_Details"], -# inv["Invoice_Date"], invoice_no, inv["Basic_Amount"], inv["Debit_Amount"], -# inv["After_Debit_Amount"], inv["GST_Amount"], inv["Amount"], inv["TDS_Amount"], -# inv["SD_Amount"], inv["On_Commission"], inv["Hydro_Testing"], inv["GST_SD_Amount"] -# ] -# invoice_holds = hold_data.get(inv["Invoice_Id"], {}) -# for ht_id in hold_type_map: -# row.append(invoice_holds.get(ht_id, "")) - -# row += [ -# inv["Final_Amount"], -# first_payment["Payment_Amount"] if first_payment else "", -# first_payment["TDS_Payment_Amount"] if first_payment else "", -# first_payment["Total_amount"] if first_payment else "", -# first_payment["UTR"] if first_payment else "" -# ] -# sheet.append(row) -# if first_payment: -# payment_id = f"{pmc_no}-{invoice_no}-{first_payment['Payment_Amount']}-{first_payment.get('UTR', '')}" -# processed_payments.add(payment_id) - -# # GST Notes -# if inv["gst_pmc_no"] and (inv["gst_pmc_no"], inv["gst_invoice_no"]) not in seen_gst_notes: -# seen_gst_notes.add((inv["gst_pmc_no"], inv["gst_invoice_no"])) -# gst_payment = None -# for payment in payments[1:]: -# if payment['invoice_no'] == inv["gst_invoice_no"]: -# gst_payment = payment -# break -# row = [pmc_no, "", "", "GST Release Note", "", inv["gst_invoice_no"], -# inv["gst_basic_amount"], "", "", "", "", "", "", "", "", ""] -# row += ["" for _ in hold_headers] -# row += [ -# inv["gst_final_amount"], -# gst_payment["Payment_Amount"] if gst_payment else "", -# gst_payment["TDS_Payment_Amount"] if gst_payment else "", -# gst_payment["Total_amount"] if gst_payment else "", -# gst_payment["UTR"] if gst_payment else "" -# ] -# sheet.append(row) -# if gst_payment: -# payment_id = f"{pmc_no}-{inv['gst_invoice_no']}-{gst_payment['Payment_Amount']}-{gst_payment.get('UTR', '')}" -# processed_payments.add(payment_id) - -# for payment in payments[1:]: -# payment_id = f"{pmc_no}-{payment['invoice_no']}-{payment['Payment_Amount']}-{payment.get('UTR', '')}" -# if payment_id not in processed_payments: -# row = [pmc_no, "", "", "", "", payment['invoice_no'], "", "", "", "", "", "", "", "", "", ""] -# row += ["" for _ in hold_headers] -# row += [ -# "", -# payment["Payment_Amount"], -# payment["TDS_Payment_Amount"], -# payment["Total_amount"], -# payment["UTR"] -# ] -# sheet.append(row) -# processed_payments.add(payment_id) - -# # Extra payments (null invoice) -# for payment in extra_payments_map.get(pmc_no, []): -# payment_id = f"{pmc_no}-null-{payment['Payment_Amount']}-{payment.get('UTR', '')}" -# if payment_id not in processed_payments: -# row = [pmc_no, "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""] -# row += ["" for _ in hold_headers] -# row += [ -# "", -# payment["Payment_Amount"], -# payment["TDS_Payment_Amount"], -# payment["Total_amount"], -# payment["UTR"] -# ] -# sheet.append(row) -# processed_payments.add(payment_id) - -# # Totals Calculation -# total_basic_amount = total_tds_amount = total_sd_amount = total_on_commission = 0 -# total_hold_amount = total_final_amount = total_total_amount = 0 - -# for row in sheet.iter_rows(min_row=13, max_row=sheet.max_row, values_only=True): -# try: -# total_basic_amount += float(row[6] or 0) -# total_tds_amount += float(row[11] or 0) -# total_sd_amount += float(row[12] or 0) -# total_on_commission += float(row[13] or 0) -# total_final_amount += float(row[-5] or 0) -# total_total_amount += float(row[-2] or 0) -# hold_start_col = len(base_headers) -# hold_end_col = hold_start_col + len(hold_headers) -# total_hold_amount += sum(float(row[i] or 0) for i in range(hold_start_col, hold_end_col)) -# except ValueError: -# continue - -# # Totals Row -# sheet.append([]) -# totals_row = [ -# "TOTAL", "", "", "", "", "", total_basic_amount, "", "", "", "", total_tds_amount, -# total_sd_amount, total_on_commission, "", "" -# ] -# if total_hold_amount: -# totals_row += [total_hold_amount] + [""] * (len(hold_headers) - 1) - -# totals_row += [total_final_amount, "", "", total_total_amount, ""] -# sheet.append(totals_row) - -# for cell in sheet[sheet.max_row]: -# cell.font = Font(bold=True) - -# # Summary Section -# today_date = datetime.today().strftime('%A, %Y-%m-%d') -# sheet.append([]) -# sheet.append(["Contractor Name", contInfo["Contractor_Name"]]) -# sheet.append(["Date", today_date]) -# sheet.append(["Description", "Amount"]) -# sheet.append(["Advance/Surplus", str(total_final_amount - total_total_amount)]) -# sheet.append(["Total Hold Amount", str(Decimal(total_hold_amount))]) -# sheet.append(["Amount With TDS", str(total_tds_amount)]) - -# # Auto adjust column widths -# for col in sheet.columns: -# max_length = 0 -# col_letter = openpyxl.utils.get_column_letter(col[0].column) -# for cell in col: -# try: -# if cell.value: -# max_length = max(max_length, len(str(cell.value))) -# except: -# pass -# sheet.column_dimensions[col_letter].width = max_length + 2 - -# workbook.save(output_file) -# workbook.close() - -# finally: -# cursor.close() -# connection.close() - -# return send_from_directory(output_folder, f"Contractor_Report_{contractor_id}.xlsx", as_attachment=True) -from flask import send_from_directory -from decimal import Decimal -from datetime import datetime -import os -import openpyxl -from openpyxl.styles import Font, PatternFill -import config - - -# @app.route('/download_report/') -# def download_report(contractor_id): -# connection = config.get_db_connection() -# cursor = connection.cursor(dictionary=True, buffered=True) -# -# output_folder = "static/download" -# output_file = os.path.join(output_folder, f"Contractor_Report_{contractor_id}.xlsx") -# os.makedirs(output_folder, exist_ok=True) -# -# try: -# # Contractor Info -# cursor.execute(""" -# SELECT DISTINCT s.Contractor_Name, st.State_Name, d.District_Name, b.Block_Name, -# s.Mobile_No, s.GST_Registration_Type, s.GST_No, s.PAN_No, s.Email, s.Address -# FROM subcontractors s -# LEFT JOIN assign_subcontractors asg ON s.Contractor_Id = asg.Contractor_Id -# LEFT JOIN villages v ON asg.Village_Id = v.Village_Id -# LEFT JOIN blocks b ON v.Block_Id = b.Block_Id -# LEFT JOIN districts d ON b.District_id = d.District_id -# LEFT JOIN states st ON d.State_Id = st.State_Id -# WHERE s.Contractor_Id = %s -# """, (contractor_id,)) -# contInfo = cursor.fetchone() -# if not contInfo: -# return "No contractor found", 404 -# -# # Hold Types -# cursor.execute(""" -# SELECT DISTINCT ht.hold_type_id, ht.hold_type -# FROM invoice_subcontractor_hold_join h -# JOIN hold_types ht ON h.hold_type_id = ht.hold_type_id -# JOIN invoice i ON h.Invoice_Id = i.Invoice_Id -# WHERE h.Contractor_Id = %s -# """, (contractor_id,)) -# hold_types = cursor.fetchall() -# hold_type_map = {ht['hold_type_id']: ht['hold_type'] for ht in hold_types} -# -# # Invoices -# cursor.execute(""" -# SELECT DISTINCT i.PMC_No, v.Village_Name, i.Work_Type, i.Invoice_Details, -# i.Invoice_Date, i.Invoice_No, i.Basic_Amount, i.Debit_Amount, -# i.After_Debit_Amount, i.GST_Amount, i.Amount, i.TDS_Amount, i.SD_Amount, -# i.On_Commission, i.Hydro_Testing, i.GST_SD_Amount, -# i.Final_Amount, i.Invoice_Id -# FROM assign_subcontractors asg -# INNER JOIN villages v ON asg.Village_Id = v.Village_Id -# INNER JOIN invoice i ON i.Village_Id = v.Village_Id AND i.PMC_No = asg.PMC_No -# WHERE asg.Contractor_Id = %s -# ORDER BY i.PMC_No ASC, i.Invoice_No ASC -# """, (contractor_id,)) -# invoices = cursor.fetchall() -# -# # Hold Amounts -# cursor.execute(""" -# SELECT h.Invoice_Id, h.hold_type_id, h.hold_amount -# FROM invoice_subcontractor_hold_join h -# JOIN invoice i ON h.Invoice_Id = i.Invoice_Id -# WHERE h.Contractor_Id = %s -# """, (contractor_id,)) -# hold_amounts = cursor.fetchall() -# hold_data = {} -# for h in hold_amounts: -# hold_data.setdefault(h['Invoice_Id'], {})[h['hold_type_id']] = h['hold_amount'] -# -# # GST Release query - Modified to get all GST releases for the contractor -# cursor.execute(""" -# SELECT gr.pmc_no, gr.invoice_no, gr.basic_amount, gr.final_amount -# FROM gst_release gr -# WHERE gr.pmc_no IN ( -# SELECT DISTINCT a.PMC_No -# FROM assign_subcontractors a -# WHERE a.Contractor_Id = %s -# ) -# ORDER BY gr.pmc_no ASC -# """, (contractor_id,)) -# gst_rel = cursor.fetchall() -# -# gst_rel_map = {} -# for gr in gst_rel: -# invoice_nos = [] -# if gr['invoice_no']: -# if ',' in gr['invoice_no']: -# invoice_nos = [x.strip() for x in gr['invoice_no'].replace(' ', '').split(',')] -# elif '&' in gr['invoice_no']: -# invoice_nos = [x.strip() for x in gr['invoice_no'].split('&')] -# else: -# invoice_nos = [gr['invoice_no'].strip()] -# -# # Map each individual invoice to the GST release -# for inv_no in invoice_nos: -# key = (gr['pmc_no'], inv_no) -# if key not in gst_rel_map: -# gst_rel_map[key] = { -# 'basic_amount': gr['basic_amount'], -# 'final_amount': gr['final_amount'], -# 'invoice_no': gr['invoice_no'], -# 'all_invoice_nos': invoice_nos -# } -# -# # Also map the combined invoice number if it's a combined release -# if len(invoice_nos) > 1: -# combined_key = (gr['pmc_no'], gr['invoice_no']) -# gst_rel_map[combined_key] = { -# 'basic_amount': gr['basic_amount'], -# 'final_amount': gr['final_amount'], -# 'invoice_no': gr['invoice_no'], -# 'all_invoice_nos': invoice_nos -# } -# -# # GST Release Payments - Updated to include Payment_Amount and TDS_Payment_Amount -# cursor.execute(""" -# SELECT p.pmc_no, p.invoice_no, p.Payment_Amount, p.TDS_Payment_Amount, p.Total_amount, p.utr -# FROM payment p -# JOIN gst_release gr ON p.pmc_no = gr.pmc_no AND ( -# p.invoice_no = gr.invoice_no -# OR (gr.invoice_no LIKE '%,%' AND FIND_IN_SET(p.invoice_no, REPLACE(gr.invoice_no, ' ', '')) > 0) -# OR (gr.invoice_no LIKE '%&%' AND ( -# p.invoice_no = SUBSTRING_INDEX(gr.invoice_no, '&', 1) -# OR p.invoice_no = SUBSTRING_INDEX(gr.invoice_no, '&', -1) -# OR (gr.invoice_no LIKE '%&%&%' AND p.invoice_no = SUBSTRING_INDEX(SUBSTRING_INDEX(gr.invoice_no, '&', 2), '&', -1)) -# )) -# ) -# WHERE gr.pmc_no IN ( -# SELECT DISTINCT i.PMC_No -# FROM invoice i -# JOIN assign_subcontractors a ON i.PMC_No = a.PMC_No AND i.Village_Id = a.Village_Id -# WHERE a.Contractor_Id = %s -# ) -# AND p.Total_amount != 0 -# """, (contractor_id,)) -# gst_payments = cursor.fetchall() -# -# gst_payment_map = {} -# for pay in gst_payments: -# key = (pay['pmc_no'], pay['invoice_no']) -# gst_payment_map[key] = { -# 'Payment_Amount': pay['Payment_Amount'], -# 'TDS_Payment_Amount': pay['TDS_Payment_Amount'], -# 'Total_amount': pay['Total_amount'], -# 'utr': pay['utr'] -# } -# # Also map to the combined invoice number if it exists -# for gr_key, gr_val in gst_rel_map.items(): -# if pay['pmc_no'] == gr_key[0] and pay['invoice_no'] in gr_val['all_invoice_nos']: -# combined_key = (pay['pmc_no'], gr_val['invoice_no']) -# gst_payment_map[combined_key] = { -# 'Payment_Amount': pay['Payment_Amount'], -# 'TDS_Payment_Amount': pay['TDS_Payment_Amount'], -# 'Total_amount': pay['Total_amount'], -# 'utr': pay['utr'] -# } -# -# # Invoice Payments - Updated to include Payment_Amount and TDS_Payment_Amount -# cursor.execute(""" -# SELECT p.pmc_no, p.invoice_no, p.Payment_Amount, p.TDS_Payment_Amount, p.Total_amount, p.utr -# FROM payment p -# INNER JOIN ( -# SELECT DISTINCT i.PMC_No, i.Invoice_No -# FROM invoice i -# JOIN assign_subcontractors a ON i.PMC_No = a.PMC_No AND i.Village_Id = a.Village_Id -# WHERE a.Contractor_Id = %s -# ) x ON p.pmc_no = x.PMC_No AND p.invoice_no = x.Invoice_No -# ORDER BY p.pmc_no ASC -# """, (contractor_id,)) -# payments = cursor.fetchall() -# payments_map = {} -# for pay in payments: -# key = (pay['pmc_no'], pay['invoice_no']) -# payments_map.setdefault(key, []).append({ -# 'Payment_Amount': pay['Payment_Amount'], -# 'TDS_Payment_Amount': pay['TDS_Payment_Amount'], -# 'Total_amount': pay['Total_amount'], -# 'utr': pay['utr'] -# }) -# -# # Extra Payments (no invoice_no) - Updated to include Payment_Amount and TDS_Payment_Amount -# cursor.execute(""" -# SELECT pmc_no, Payment_Amount, TDS_Payment_Amount, Total_amount, utr -# FROM payment -# WHERE (invoice_no IS NULL OR invoice_no = '') -# AND Total_amount != 0 -# AND pmc_no IS NOT NULL -# """) -# extra_payments_raw = cursor.fetchall() -# extra_payments_map = {} -# for pay in extra_payments_raw: -# extra_payments_map.setdefault(pay['pmc_no'], []).append({ -# 'Payment_Amount': pay['Payment_Amount'], -# 'TDS_Payment_Amount': pay['TDS_Payment_Amount'], -# 'Total_amount': pay['Total_amount'], -# 'utr': pay['utr'] -# }) -# -# # Credit Note -# # Credit Note Fetch -# cursor.execute(""" -# SELECT PMC_No, Invoice_Details, Basic_Amount, Debit_Amount, After_Debit_Amount, -# GST_Amount, Amount, Final_Amount, Payment_Amount, Total_Amount, UTR, Invoice_No -# FROM credit_note -# WHERE Contractor_Id = %s -# """, (contractor_id,)) -# -# credit_notes = cursor.fetchall() -# -# # Build map by (PMC_No, Invoice_No) -# credit_note_map = {} -# for cn in credit_notes: -# key = (cn["PMC_No"], cn["Invoice_No"]) # Use correct casing! -# credit_note_map.setdefault(key, []).append(cn) -# -# # Track already appended credit notes -# appended_credit_keys = set() -# -# # Excel Workbook -# workbook = openpyxl.Workbook() -# sheet = workbook.active -# sheet.title = "Contractor Report" -# -# # Contractor Info section -# for field, value in contInfo.items(): -# sheet.append([field.replace("_", " "), value]) -# sheet.append([]) -# -# base_headers = ["PMC No", "Village", "Work Type", "Invoice Details", "Invoice Date", "Invoice No", -# "Basic Amount", "Debit", "After Debit Amount", "GST (18%)", "Amount", "TDS (1%)", -# "SD (5%)", "On Commission", "Hydro Testing", "GST SD Amount"] -# hold_headers = [ht['hold_type'] for ht in hold_types] -# # Updated payment headers to include Payment Amount and TDS Payment -# payment_headers = ["Final Amount", "Payment Amount", "TDS Payment", "Total Paid", "UTR"] -# all_headers = base_headers + hold_headers + payment_headers -# sheet.append(all_headers) -# for cell in sheet[sheet.max_row]: -# cell.font = Font(bold=True) -# cell.fill = PatternFill(start_color="ADD8E6", end_color="ADD8E6", fill_type="solid") -# -# # Track which GST releases we've already processed -# processed_gst_releases = set() -# -# # Data Rows -# for inv in invoices: -# pmc_no = inv["PMC_No"] -# invoice_no = inv["Invoice_No"] -# -# row = [ -# pmc_no, inv["Village_Name"], inv["Work_Type"], inv["Invoice_Details"], -# inv["Invoice_Date"], invoice_no, inv["Basic_Amount"], inv["Debit_Amount"], -# inv["After_Debit_Amount"], inv["GST_Amount"], inv["Amount"], inv["TDS_Amount"], -# inv["SD_Amount"], inv["On_Commission"], inv["Hydro_Testing"], inv["GST_SD_Amount"] -# ] -# -# invoice_holds = hold_data.get(inv["Invoice_Id"], {}) -# for ht_id in hold_type_map: -# row.append(invoice_holds.get(ht_id, "")) -# -# payment = payments_map.get((pmc_no, invoice_no), [None])[0] -# row += [ -# inv["Final_Amount"], -# payment["Payment_Amount"] if payment else "", -# payment["TDS_Payment_Amount"] if payment else "", -# payment["Total_amount"] if payment else "", -# payment["utr"] if payment and payment["utr"] else "" -# ] -# sheet.append(row) -# -# # GST Release row - only show after the last invoice in the sequence -# if (pmc_no, invoice_no) in gst_rel_map: -# gr = gst_rel_map[(pmc_no, invoice_no)] -# -# # Check if this is the last invoice in the sequence -# if invoice_no == gr['all_invoice_nos'][-1] and gr['invoice_no'] not in processed_gst_releases: -# processed_gst_releases.add(gr['invoice_no']) -# -# # Find matching payment if it exists -# gst_payment = gst_payment_map.get((pmc_no, gr['invoice_no']), None) -# if not gst_payment: -# # Try matching with individual invoice numbers -# for inv_no in gr['all_invoice_nos']: -# if (pmc_no, inv_no) in gst_payment_map: -# gst_payment = gst_payment_map[(pmc_no, inv_no)] -# break -# -# gst_row = [ -# pmc_no, "", "", "GST Release Note", "", gr["invoice_no"], -# gr["basic_amount"], "", "", "", "", "", "", "", "", "" -# ] -# gst_row += ["" for _ in hold_headers] -# gst_row += [ -# gr["final_amount"], -# gst_payment["Payment_Amount"] if gst_payment else "", -# gst_payment["TDS_Payment_Amount"] if gst_payment else "", -# gst_payment["Total_amount"] if gst_payment else "", -# gst_payment["utr"] if gst_payment and gst_payment.get("utr") else "" -# ] -# sheet.append(gst_row) -# -# # Extra Payments (once per pmc_no) -# if pmc_no in extra_payments_map: -# for extra in extra_payments_map[pmc_no]: -# extra_row = [ -# pmc_no, "", "", " ", "", "", "", "", "", "", "", "", "", "", "", "" -# ] -# extra_row += ["" for _ in hold_headers] -# extra_row += [ -# "", -# extra['Payment_Amount'], -# extra['TDS_Payment_Amount'], -# extra['Total_amount'], -# extra['utr'] if extra['utr'] else "" -# ] -# sheet.append(extra_row) -# del extra_payments_map[pmc_no] -# -# # Now add any GST releases that weren't associated with any invoices -# for gr in gst_rel: -# if gr['invoice_no'] not in processed_gst_releases: -# pmc_no = gr['pmc_no'] -# invoice_no = gr['invoice_no'] -# -# # Find matching payment if it exists -# gst_payment = gst_payment_map.get((pmc_no, invoice_no), None) -# -# gst_row = [ -# pmc_no, "", "", "GST Release Note", "", invoice_no, -# gr["basic_amount"], "", "", "", "", "", "", "", "", "" -# ] -# gst_row += ["" for _ in hold_headers] -# gst_row += [ -# gr["final_amount"], -# gst_payment["Payment_Amount"] if gst_payment else "", -# gst_payment["TDS_Payment_Amount"] if gst_payment else "", -# gst_payment["Total_amount"] if gst_payment else "", -# gst_payment["utr"] if gst_payment and gst_payment.get("utr") else "" -# ] -# sheet.append(gst_row) -# processed_gst_releases.add(invoice_no) -# # Credit Note row(s) -# -# # Track already appended credit notes -# appended_credit_keys = set() -# -# # While writing invoices -# key = (pmc_no, invoice_no) -# if key in credit_note_map and key not in appended_credit_keys: -# for cn in credit_note_map[key]: -# credit_row = [ -# pmc_no, "", "", cn.get("Invoice_Details", "Credit Note"), "", cn.get("Invoice_No", ""), -# cn.get("Basic_Amount", ""), cn.get("Debit_Amount", ""), -# cn.get("After_Debit_Amount", ""), cn.get("GST_Amount", ""), cn.get("Amount", ""), "", "", -# "", -# "", "" -# ] -# credit_row += ["" for _ in hold_headers] -# credit_row += [ -# cn.get("Final_Amount", ""), -# cn.get("Total_Amount", ""), -# cn.get("UTR", "") -# ] -# sheet.append(credit_row) -# appended_credit_keys.add(key) -# -# # Totals row (NO UTR totals, UTR blank) -# total_basic_amount = total_tds_amount = total_sd_amount = total_on_commission = 0 -# total_final_amount = total_total_amount = total_hold_amount = 0 -# for row in sheet.iter_rows(min_row=13, max_row=sheet.max_row, values_only=True): -# try: -# desc = row[3] -# if desc == " ": -# total_total_amount += float(row[-2] or 0) -# continue -# -# total_basic_amount += float(row[6] or 0) -# total_tds_amount += float(row[11] or 0) -# total_sd_amount += float(row[12] or 0) -# total_on_commission += float(row[13] or 0) -# total_final_amount += float(row[-5] or 0) # Changed to -5 for Final Amount -# total_total_amount += float(row[-2] or 0) -# # sum holds -# total_hold_amount += sum( -# float(row[i] or 0) for i in range(len(base_headers), len(base_headers) + len(hold_headers))) -# except Exception: -# pass -# -# totals_row = [ -# "Total", "", "", "", "", "", total_basic_amount, "", "", "", "", total_tds_amount, -# total_sd_amount, total_on_commission, "", "" -# ] -# totals_row += [total_hold_amount for _ in hold_headers] -# totals_row += [total_final_amount, "", "", total_total_amount, -# ""] # UTR blank, Payment Amount and TDS Payment blank -# sheet.append([]) -# sheet.append(totals_row) -# for cell in sheet[sheet.max_row]: -# cell.font = Font(bold=True) -# -# # Summary Section -# today_date = datetime.today().strftime('%A, %Y-%m-%d') -# sheet.append([]) -# sheet.append(["Contractor Name", contInfo["Contractor_Name"]]) -# sheet.append(["Date", today_date]) -# sheet.append(["Description", "Amount"]) -# sheet.append(["Advance/Surplus", str(total_final_amount - total_total_amount)]) -# sheet.append(["Total Hold Amount", str(Decimal(total_hold_amount))]) -# sheet.append(["Amount With TDS", str(total_tds_amount)]) -# -# # Auto adjust column widths -# for col in sheet.columns: -# max_length = 0 -# col_letter = openpyxl.utils.get_column_letter(col[0].column) -# for cell in col: -# try: -# if cell.value: -# max_length = max(max_length, len(str(cell.value))) -# except: -# pass -# sheet.column_dimensions[col_letter].width = max_length + 2 -# -# workbook.save(output_file) -# workbook.close() -# -# finally: -# cursor.close() -# connection.close() -# -# return send_from_directory(output_folder, f"Contractor_Report_{contractor_id}.xlsx", as_attachment=True) @app.route('/download_report/') def download_report(contractor_id): connection = config.get_db_connection() cursor = connection.cursor(dictionary=True, buffered=True) - output_folder = "static/download" - output_file = os.path.join(output_folder, f"Contractor_Report_{contractor_id}.xlsx") + output_folder = FilePathData.downloadReportFolder os.makedirs(output_folder, exist_ok=True) + output_file = os.path.join(output_folder, f"Contractor_Report_{contractor_id}.xlsx") try: - # Contractor Info - cursor.execute(""" - SELECT DISTINCT s.Contractor_Name, - st.State_Name, - d.District_Name, - b.Block_Name, - s.Mobile_No, - s.GST_Registration_Type, - s.GST_No, - s.PAN_No, - s.Email, - s.Address - FROM subcontractors s - LEFT JOIN assign_subcontractors asg ON s.Contractor_Id = asg.Contractor_Id - LEFT JOIN villages v ON asg.Village_Id = v.Village_Id - LEFT JOIN blocks b ON v.Block_Id = b.Block_Id - LEFT JOIN districts d ON b.District_id = d.District_id - LEFT JOIN states st ON d.State_Id = st.State_Id - WHERE s.Contractor_Id = %s - """, (contractor_id,)) - contInfo = cursor.fetchone() - if not contInfo: + # ---------------- Contractor Info ---------------- + contractor = ContractorInfo(contractor_id) + contInfo = contractor.contInfo + + if not contractor.contInfo: return "No contractor found", 404 - # Hold Types + # ---------------- Hold Types ---------------- cursor.execute(""" - SELECT DISTINCT ht.hold_type_id, ht.hold_type - FROM invoice_subcontractor_hold_join h - JOIN hold_types ht ON h.hold_type_id = ht.hold_type_id - JOIN invoice i ON h.Invoice_Id = i.Invoice_Id - WHERE h.Contractor_Id = %s - """, (contractor_id,)) + SELECT DISTINCT ht.hold_type_id, ht.hold_type + FROM invoice_subcontractor_hold_join h + JOIN hold_types ht ON h.hold_type_id = ht.hold_type_id + WHERE h.Contractor_Id = %s + """, (contractor_id,)) hold_types = cursor.fetchall() hold_type_map = {ht['hold_type_id']: ht['hold_type'] for ht in hold_types} - # Invoices + # ---------------- Invoices ---------------- cursor.execute(""" - SELECT DISTINCT i.PMC_No, - v.Village_Name, - i.Work_Type, - i.Invoice_Details, - i.Invoice_Date, - i.Invoice_No, - i.Basic_Amount, - i.Debit_Amount, - i.After_Debit_Amount, - i.GST_Amount, - i.Amount, - i.TDS_Amount, - i.SD_Amount, - i.On_Commission, - i.Hydro_Testing, - i.GST_SD_Amount, - i.Final_Amount, - i.Invoice_Id - FROM assign_subcontractors asg - INNER JOIN villages v ON asg.Village_Id = v.Village_Id - INNER JOIN invoice i ON i.Village_Id = v.Village_Id AND i.PMC_No = asg.PMC_No - WHERE asg.Contractor_Id = %s - ORDER BY i.PMC_No ASC, i.Invoice_No ASC - """, (contractor_id,)) + SELECT i.*, v.Village_Name + FROM assign_subcontractors asg + INNER JOIN invoice i ON i.PMC_No = asg.PMC_No AND i.Village_Id = asg.Village_Id + LEFT JOIN villages v ON i.Village_Id = v.Village_Id + WHERE asg.Contractor_Id = %s + ORDER BY i.PMC_No, i.Invoice_No + """, (contractor_id,)) invoices = cursor.fetchall() - # Hold Amounts + # Remove duplicate invoices + invoice_ids_seen = set() + unique_invoices = [] + for inv in invoices: + if inv["Invoice_Id"] not in invoice_ids_seen: + invoice_ids_seen.add(inv["Invoice_Id"]) + unique_invoices.append(inv) + invoices = unique_invoices + + # ---------------- Hold Amounts ---------------- cursor.execute(""" - SELECT h.Invoice_Id, h.hold_type_id, h.hold_amount - FROM invoice_subcontractor_hold_join h - JOIN invoice i ON h.Invoice_Id = i.Invoice_Id - WHERE h.Contractor_Id = %s - """, (contractor_id,)) + SELECT h.Invoice_Id, h.hold_type_id, h.hold_amount + FROM invoice_subcontractor_hold_join h + WHERE h.Contractor_Id = %s + """, (contractor_id,)) hold_amounts = cursor.fetchall() hold_data = {} for h in hold_amounts: hold_data.setdefault(h['Invoice_Id'], {})[h['hold_type_id']] = h['hold_amount'] - # GST Release query - Modified to get all GST releases for the contractor + # ---------------- Payments ---------------- cursor.execute(""" - SELECT gr.pmc_no, gr.invoice_no, gr.basic_amount, gr.final_amount - FROM gst_release gr - WHERE gr.pmc_no IN (SELECT DISTINCT a.PMC_No - FROM assign_subcontractors a - WHERE a.Contractor_Id = %s) - ORDER BY gr.pmc_no ASC - """, (contractor_id,)) - gst_rel = cursor.fetchall() - - gst_rel_map = {} - for gr in gst_rel: - invoice_nos = [] - if gr['invoice_no']: - if ',' in gr['invoice_no']: - invoice_nos = [x.strip() for x in gr['invoice_no'].replace(' ', '').split(',')] - elif '&' in gr['invoice_no']: - invoice_nos = [x.strip() for x in gr['invoice_no'].split('&')] - else: - invoice_nos = [gr['invoice_no'].strip()] - - # Map each individual invoice to the GST release - for inv_no in invoice_nos: - key = (gr['pmc_no'], inv_no) - if key not in gst_rel_map: - gst_rel_map[key] = { - 'basic_amount': gr['basic_amount'], - 'final_amount': gr['final_amount'], - 'invoice_no': gr['invoice_no'], - 'all_invoice_nos': invoice_nos - } - - # Also map the combined invoice number if it's a combined release - if len(invoice_nos) > 1: - combined_key = (gr['pmc_no'], gr['invoice_no']) - gst_rel_map[combined_key] = { - 'basic_amount': gr['basic_amount'], - 'final_amount': gr['final_amount'], - 'invoice_no': gr['invoice_no'], - 'all_invoice_nos': invoice_nos - } - - # GST Release Payments - Updated to include Payment_Amount and TDS_Payment_Amount - cursor.execute(""" - SELECT p.pmc_no, p.invoice_no, p.Payment_Amount, p.TDS_Payment_Amount, p.Total_amount, p.utr - FROM payment p - JOIN gst_release gr ON p.pmc_no = gr.pmc_no AND ( - p.invoice_no = gr.invoice_no - OR - (gr.invoice_no LIKE '%,%' AND FIND_IN_SET(p.invoice_no, REPLACE(gr.invoice_no, ' ', '')) > 0) - OR (gr.invoice_no LIKE '%&%' AND ( - p.invoice_no = SUBSTRING_INDEX(gr.invoice_no, '&', 1) - OR p.invoice_no = SUBSTRING_INDEX(gr.invoice_no, '&', -1) - OR (gr.invoice_no LIKE '%&%&%' AND - p.invoice_no = SUBSTRING_INDEX(SUBSTRING_INDEX(gr.invoice_no, '&', 2), '&', -1)) - )) - ) - WHERE gr.pmc_no IN (SELECT DISTINCT i.PMC_No - FROM invoice i - JOIN assign_subcontractors a - ON i.PMC_No = a.PMC_No AND i.Village_Id = a.Village_Id - WHERE a.Contractor_Id = %s) - AND p.Total_amount != 0 - """, (contractor_id,)) - gst_payments = cursor.fetchall() - - gst_payment_map = {} - for pay in gst_payments: - key = (pay['pmc_no'], pay['invoice_no']) - gst_payment_map[key] = { - 'Payment_Amount': pay['Payment_Amount'], - 'TDS_Payment_Amount': pay['TDS_Payment_Amount'], - 'Total_amount': pay['Total_amount'], - 'utr': pay['utr'] - } - # Also map to the combined invoice number if it exists - for gr_key, gr_val in gst_rel_map.items(): - if pay['pmc_no'] == gr_key[0] and pay['invoice_no'] in gr_val['all_invoice_nos']: - combined_key = (pay['pmc_no'], gr_val['invoice_no']) - gst_payment_map[combined_key] = { - 'Payment_Amount': pay['Payment_Amount'], - 'TDS_Payment_Amount': pay['TDS_Payment_Amount'], - 'Total_amount': pay['Total_amount'], - 'utr': pay['utr'] - } - - # Invoice Payments - Updated to include Payment_Amount and TDS_Payment_Amount - cursor.execute(""" - SELECT p.pmc_no, p.invoice_no, p.Payment_Amount, p.TDS_Payment_Amount, p.Total_amount, p.utr - FROM payment p - INNER JOIN (SELECT DISTINCT i.PMC_No, i.Invoice_No - FROM invoice i - JOIN assign_subcontractors a - ON i.PMC_No = a.PMC_No AND i.Village_Id = a.Village_Id - WHERE a.Contractor_Id = %s) x - ON p.pmc_no = x.PMC_No AND p.invoice_no = x.Invoice_No - ORDER BY p.pmc_no ASC - """, (contractor_id,)) + SELECT DISTINCT p.pmc_no, p.invoice_no, p.Payment_Amount, p.TDS_Payment_Amount, p.Total_amount, p.utr + FROM payment p + INNER JOIN invoice i ON i.PMC_No = p.pmc_no AND i.invoice_no = p.invoice_no + INNER JOIN assign_subcontractors asg ON i.PMC_No = asg.PMC_No AND i.Village_Id = asg.Village_Id + WHERE asg.Contractor_Id = %s + """, (contractor_id,)) payments = cursor.fetchall() payments_map = {} for pay in payments: - key = (pay['pmc_no'], pay['invoice_no']) - payments_map.setdefault(key, []).append({ - 'Payment_Amount': pay['Payment_Amount'], - 'TDS_Payment_Amount': pay['TDS_Payment_Amount'], - 'Total_amount': pay['Total_amount'], - 'utr': pay['utr'] - }) - # Fetch hold_release data - cursor.execute(""" - SELECT * - FROM hold_release - WHERE Contractor_Id = %s - """, (contractor_id,)) - hold_releases = cursor.fetchall() - hold_release_map = {} - for hr in hold_releases: - invoice_nos = [i.strip() for i in str(hr['Invoice_No']).split('&')] - for inv_no in invoice_nos: - key = (hr['PMC_No'], inv_no) - hold_release_map.setdefault(key, []).append(hr) - # Credit Note - # Credit Note Fetch + key = (str(pay['pmc_no']), str(pay['invoice_no'])) + payments_map.setdefault(key, []).append(pay) + + # ---------------- Extra Payments (no invoice_no) ---------------- cursor.execute(""" - SELECT PMC_No, - Invoice_Details, - Basic_Amount, - Debit_Amount, - After_Debit_Amount, - GST_Amount, - Amount, - Final_Amount, - Payment_Amount, - Total_Amount, - UTR, - Invoice_No - FROM credit_note - WHERE Contractor_Id = %s - """, (contractor_id,)) - - credit_notes = cursor.fetchall() - - # Build map by (PMC_No, Invoice_No) - credit_note_map = {} - for cn in credit_notes: - key = (cn["PMC_No"], cn["Invoice_No"]) # Use correct casing! - credit_note_map.setdefault(key, []).append(cn) - print("Credit_note_map:",credit_note_map) - # Track already appended credit notes - appended_credit_keys = set() - #print("appended_credit_keys",appended_credit_keys) - - - # Extra Payments (no invoice_no) - Updated to include Payment_Amount and TDS_Payment_Amount - cursor.execute(""" - SELECT pmc_no, Payment_Amount, TDS_Payment_Amount, Total_amount, utr - FROM payment - WHERE (invoice_no IS NULL OR invoice_no = '') - AND Total_amount != 0 - AND pmc_no IS NOT NULL - """) + SELECT pmc_no, Payment_Amount, TDS_Payment_Amount, Total_amount, utr + FROM payment + WHERE (invoice_no IS NULL OR invoice_no = '') + AND Total_amount != 0 + AND pmc_no IS NOT NULL + """) extra_payments_raw = cursor.fetchall() extra_payments_map = {} for pay in extra_payments_raw: - extra_payments_map.setdefault(pay['pmc_no'], []).append({ + extra_payments_map.setdefault(str(pay['pmc_no']), []).append({ 'Payment_Amount': pay['Payment_Amount'], 'TDS_Payment_Amount': pay['TDS_Payment_Amount'], 'Total_amount': pay['Total_amount'], 'utr': pay['utr'] }) - # Excel Workbook + # ---------------- Credit Notes ---------------- + cursor.execute(""" + SELECT PMC_No, Invoice_No, Invoice_Details, Basic_Amount, Debit_Amount, After_Debit_Amount, + GST_Amount, Amount, Final_Amount, Payment_Amount, Total_Amount, UTR + FROM credit_note + WHERE Contractor_Id = %s + """, (contractor_id,)) + credit_notes = cursor.fetchall() + credit_note_map = {} + for cn in credit_notes: + key = (str(cn['PMC_No']), str(cn['Invoice_No'])) + credit_note_map.setdefault(key, []).append(cn) + + # ---------------- GST Releases ---------------- + cursor.execute(""" + SELECT PMC_No, Invoice_No, Basic_Amount, Final_Amount, Total_Amount, UTR + FROM gst_release + WHERE Contractor_Id = %s + ORDER BY PMC_No, Invoice_No + """, (contractor_id,)) + gst_releases = cursor.fetchall() + gst_release_map = {} + for gr in gst_releases: + key = (str(gr['PMC_No']), str(gr['Invoice_No'])) + gst_release_map.setdefault(key, []).append(gr) + + # ---------------- Excel Workbook ---------------- workbook = openpyxl.Workbook() sheet = workbook.active sheet.title = "Contractor Report" - # Contractor Info section + # Contractor Info for field, value in contInfo.items(): sheet.append([field.replace("_", " "), value]) sheet.append([]) + # Headers base_headers = ["PMC No", "Village", "Work Type", "Invoice Details", "Invoice Date", "Invoice No", "Basic Amount", "Debit", "After Debit Amount", "GST (18%)", "Amount", "TDS (1%)", "SD (5%)", "On Commission", "Hydro Testing", "GST SD Amount"] hold_headers = [ht['hold_type'] for ht in hold_types] - # Updated payment headers to include Payment Amount and TDS Payment payment_headers = ["Final Amount", "Payment Amount", "TDS Payment", "Total Paid", "UTR"] all_headers = base_headers + hold_headers + payment_headers sheet.append(all_headers) @@ -5156,201 +2635,118 @@ def download_report(contractor_id): cell.font = Font(bold=True) cell.fill = PatternFill(start_color="ADD8E6", end_color="ADD8E6", fill_type="solid") - # Track which GST releases we've already processed + # ---------------- Data Rows ---------------- processed_gst_releases = set() + appended_credit_keys = set() + previous_pmc_no = None - # Data Rows for inv in invoices: - pmc_no = inv["PMC_No"] - invoice_no = inv["Invoice_No"] + pmc_no = str(inv["PMC_No"]) + invoice_no = str(inv["invoice_no"]) + key = (pmc_no, invoice_no) + # Yellow separator if PMC_No changes + if previous_pmc_no and pmc_no != previous_pmc_no: + sheet.append([""] * len(all_headers)) + yellow_fill = PatternFill(start_color="FFFF99", end_color="FFFF99", fill_type="solid") + for cell in sheet[sheet.max_row]: + cell.fill = yellow_fill + previous_pmc_no = pmc_no + + # Invoice row row = [ pmc_no, inv["Village_Name"], inv["Work_Type"], inv["Invoice_Details"], inv["Invoice_Date"], invoice_no, inv["Basic_Amount"], inv["Debit_Amount"], inv["After_Debit_Amount"], inv["GST_Amount"], inv["Amount"], inv["TDS_Amount"], inv["SD_Amount"], inv["On_Commission"], inv["Hydro_Testing"], inv["GST_SD_Amount"] ] - + # Hold values invoice_holds = hold_data.get(inv["Invoice_Id"], {}) for ht_id in hold_type_map: row.append(invoice_holds.get(ht_id, "")) - payment = payments_map.get((pmc_no, invoice_no), [None])[0] + # Payment values + payment = payments_map.get(key, [None])[0] row += [ inv["Final_Amount"], payment["Payment_Amount"] if payment else "", payment["TDS_Payment_Amount"] if payment else "", payment["Total_amount"] if payment else "", - payment["utr"] if payment and payment["utr"] else "" + payment["utr"] if payment and payment.get("utr") else "" ] sheet.append(row) - # GST Release row - only show after the last invoice in the sequence - if (pmc_no, invoice_no) in gst_rel_map: - gr = gst_rel_map[(pmc_no, invoice_no)] - - # Check if this is the last invoice in the sequence - if invoice_no == gr['all_invoice_nos'][-1] and gr['invoice_no'] not in processed_gst_releases: - processed_gst_releases.add(gr['invoice_no']) - - # Find matching payment if it exists - gst_payment = gst_payment_map.get((pmc_no, gr['invoice_no']), None) - if not gst_payment: - # Try matching with individual invoice numbers - for inv_no in gr['all_invoice_nos']: - if (pmc_no, inv_no) in gst_payment_map: - gst_payment = gst_payment_map[(pmc_no, inv_no)] - break - - gst_row = [ - pmc_no, "", "", "GST Release Note", "", gr["invoice_no"], - gr["basic_amount"], "", "", "", "", "", "", "", "", "" - ] - gst_row += ["" for _ in hold_headers] - gst_row += [ - gr["final_amount"], - gst_payment["Payment_Amount"] if gst_payment else "", - gst_payment["TDS_Payment_Amount"] if gst_payment else "", - gst_payment["Total_amount"] if gst_payment else "", - gst_payment["utr"] if gst_payment and gst_payment.get("utr") else "" - ] - sheet.append(gst_row) - # Hold Release row(s) - if (pmc_no, invoice_no) in hold_release_map: - for hr in hold_release_map[(pmc_no, invoice_no)]: - hr_row = [ - pmc_no, "", "", hr["Invoice_Details"], "", hr["Invoice_No"], - hr.get("Basic_Amount", ""), "", "", "", "", "", "", "", "", "","","" - ] - hr_row += ["" for _ in hold_headers] - hr_row += [ - hr.get("Final_Amount", ""), - hr.get("Total_Amount", ""), - hr.get("UTR", "") - ] - sheet.append(hr_row) - # Extra Payments (once per pmc_no) + # ---------------- Extra Payments for this PMC ---------------- if pmc_no in extra_payments_map: - for extra in extra_payments_map[pmc_no]: - extra_row = [ - pmc_no, "", "", " ", "", "", "", "", "", "", "", "", "", "", "", "" - ] - extra_row += ["" for _ in hold_headers] + for ep in extra_payments_map[pmc_no]: + extra_row = [pmc_no] + [""] * (len(base_headers) - 1) + extra_row += [""] * len(hold_headers) extra_row += [ - "", - extra['Payment_Amount'], - extra['TDS_Payment_Amount'], - extra['Total_amount'], - extra['utr'] if extra['utr'] else "" + "", ep["Payment_Amount"], ep["TDS_Payment_Amount"], ep["Total_amount"], ep.get("utr", "") ] sheet.append(extra_row) del extra_payments_map[pmc_no] - # Now add any GST releases that weren't associated with any invoices - for gr in gst_rel: - if gr['invoice_no'] not in processed_gst_releases: - pmc_no = gr['pmc_no'] - invoice_no = gr['invoice_no'] + # GST Releases + if key in gst_release_map and key not in processed_gst_releases: + for gr in gst_release_map[key]: + gst_row = [ + pmc_no, "", "", "GST Release Note", "", gr["Invoice_No"], + gr["Basic_Amount"], "", "", "", "", "", "", "", "", "" + ] + gst_row += ["" for _ in hold_headers] + gst_row += [gr["Final_Amount"], "", "", gr["Total_Amount"], gr.get("UTR", "")] + sheet.append(gst_row) + processed_gst_releases.add(key) - # Find matching payment if it exists - gst_payment = gst_payment_map.get((pmc_no, invoice_no), None) + # Credit Notes + if key in credit_note_map and key not in appended_credit_keys: + for cn in credit_note_map[key]: + cn_row = [ + pmc_no, "", "", cn.get("Invoice_Details", "Credit Note"), "", cn.get("Invoice_No", ""), + cn.get("Basic_Amount", ""), cn.get("Debit_Amount", ""), cn.get("After_Debit_Amount", ""), + cn.get("GST_Amount", ""), cn.get("Amount", ""), "", "", "", "", "" + ] + cn_row += ["" for _ in hold_headers] + cn_row += [cn.get("Final_Amount", ""), "", "", cn.get("Total_Amount", ""), cn.get("UTR", "")] + sheet.append(cn_row) + appended_credit_keys.add(key) - gst_row = [ - pmc_no, "", "", "GST Release Note", "", invoice_no, - gr["basic_amount"], "", "", "", "", "", "", "", "", "" - ] - gst_row += ["" for _ in hold_headers] - gst_row += [ - gr["final_amount"], - gst_payment["Payment_Amount"] if gst_payment else "", - gst_payment["TDS_Payment_Amount"] if gst_payment else "", - gst_payment["Total_amount"] if gst_payment else "", - gst_payment["utr"] if gst_payment and gst_payment.get("utr") else "" - ] - sheet.append(gst_row) - processed_gst_releases.add(invoice_no) - # Credit Note row(s) - - # # Track already appended credit notes - appended_credit_keys = set() - - sheet.append(row) - - # ➕ Add this block right here: - key = (pmc_no, invoice_no) - if key in credit_note_map and key not in appended_credit_keys: - for cn in credit_note_map[key]: - credit_row = [ - pmc_no, "", "", cn.get("Invoice_Details", "Credit Note"), "", cn.get("Invoice_No", ""), - cn.get("Basic_Amount", ""), cn.get("Debit_Amount", ""), - cn.get("After_Debit_Amount", ""), cn.get("GST_Amount", ""), cn.get("Amount", ""), "", "", "", - "", "" - ] - credit_row += ["" for _ in hold_headers] - credit_row += [ - cn.get("Final_Amount", ""), "", "", cn.get("Total_Amount", ""), - cn.get("UTR", "") - ] - sheet.append(credit_row) - appended_credit_keys.add(key) - - - - - # Totals row (NO UTR totals, UTR blank) + # ---------------- Totals ---------------- total_basic_amount = total_tds_amount = total_sd_amount = total_on_commission = 0 total_final_amount = total_total_amount = total_hold_amount = 0 - for row in sheet.iter_rows(min_row=13, max_row=sheet.max_row, values_only=True): - try: - desc = row[3] - if desc == " ": - total_total_amount += float(row[-2] or 0) - continue - total_basic_amount += float(row[6] or 0) - total_tds_amount += float(row[11] or 0) - total_sd_amount += float(row[12] or 0) - total_on_commission += float(row[13] or 0) - total_final_amount += float(row[-5] or 0) # Changed to -5 for Final Amount - total_total_amount += float(row[-2] or 0) - # sum holds - total_hold_amount += sum( - float(row[i] or 0) for i in range(len(base_headers), len(base_headers) + len(hold_headers))) - except Exception: - pass + start_row = 2 # skip headers + for r in sheet.iter_rows(min_row=start_row, max_row=sheet.max_row, values_only=True): + try: + total_basic_amount += float(r[6] or 0) + total_tds_amount += float(r[11] or 0) + total_sd_amount += float(r[12] or 0) + total_on_commission += float(r[13] or 0) + total_final_amount += float(r[-5] or 0) + total_total_amount += float(r[-2] or 0) + total_hold_amount += sum(float(r[i] or 0) for i in range(len(base_headers), len(base_headers) + len(hold_headers))) + except: + continue totals_row = [ "Total", "", "", "", "", "", total_basic_amount, "", "", "", "", total_tds_amount, total_sd_amount, total_on_commission, "", "" ] totals_row += [total_hold_amount for _ in hold_headers] - totals_row += [total_final_amount, "", "", total_total_amount, - ""] # UTR blank, Payment Amount and TDS Payment blank + totals_row += [total_final_amount, "", "", total_total_amount, ""] sheet.append([]) sheet.append(totals_row) for cell in sheet[sheet.max_row]: cell.font = Font(bold=True) - # Summary Section - today_date = datetime.today().strftime('%A, %Y-%m-%d') - sheet.append([]) - sheet.append(["Contractor Name", contInfo["Contractor_Name"]]) - sheet.append(["Date", today_date]) - sheet.append(["Description", "Amount"]) - sheet.append(["Advance/Surplus", str(total_final_amount - total_total_amount)]) - sheet.append(["Total Hold Amount", str(Decimal(total_hold_amount))]) - sheet.append(["Amount With TDS", str(total_tds_amount)]) - - # Auto adjust column widths + # ---------------- Column Width ---------------- for col in sheet.columns: max_length = 0 col_letter = openpyxl.utils.get_column_letter(col[0].column) for cell in col: - try: - if cell.value: - max_length = max(max_length, len(str(cell.value))) - except: - pass + if cell.value: + max_length = max(max_length, len(str(cell.value))) sheet.column_dimensions[col_letter].width = max_length + 2 workbook.save(output_file) @@ -5361,572 +2757,8 @@ def download_report(contractor_id): connection.close() return send_from_directory(output_folder, f"Contractor_Report_{contractor_id}.xlsx", as_attachment=True) -# @app.route('/download_report/') -# def download_report(contractor_id): -# connection = config.get_db_connection() -# cursor = connection.cursor(dictionary=True, buffered=True) -# -# output_folder = "static/download" -# output_file = os.path.join(output_folder, f"Contractor_Report_{contractor_id}.xlsx") -# os.makedirs(output_folder, exist_ok=True) -# -# try: -# # Contractor Info -# cursor.execute(""" -# SELECT DISTINCT s.Contractor_Name, st.State_Name, d.District_Name, b.Block_Name, -# s.Mobile_No, s.GST_Registration_Type, s.GST_No, s.PAN_No, s.Email, s.Address -# FROM subcontractors s -# LEFT JOIN assign_subcontractors asg ON s.Contractor_Id = asg.Contractor_Id -# LEFT JOIN villages v ON asg.Village_Id = v.Village_Id -# LEFT JOIN blocks b ON v.Block_Id = b.Block_Id -# LEFT JOIN districts d ON b.District_id = d.District_id -# LEFT JOIN states st ON d.State_Id = st.State_Id -# WHERE s.Contractor_Id = %s -# """, (contractor_id,)) -# contInfo = cursor.fetchone() -# if not contInfo: -# return "No contractor found", 404 -# -# # Hold Types -# cursor.execute(""" -# SELECT DISTINCT ht.hold_type_id, ht.hold_type -# FROM invoice_subcontractor_hold_join h -# JOIN hold_types ht ON h.hold_type_id = ht.hold_type_id -# JOIN invoice i ON h.Invoice_Id = i.Invoice_Id -# WHERE h.Contractor_Id = %s -# """, (contractor_id,)) -# hold_types = cursor.fetchall() -# hold_type_map = {ht['hold_type_id']: ht['hold_type'] for ht in hold_types} -# -# # Invoices -# cursor.execute(""" -# SELECT DISTINCT i.PMC_No, v.Village_Name, i.Work_Type, i.Invoice_Details, -# i.Invoice_Date, i.Invoice_No, i.Basic_Amount, i.Debit_Amount, -# i.After_Debit_Amount, i.GST_Amount, i.Amount, i.TDS_Amount, i.SD_Amount, -# i.On_Commission, i.Hydro_Testing, i.GST_SD_Amount, -# i.Final_Amount, i.Invoice_Id -# FROM assign_subcontractors asg -# INNER JOIN villages v ON asg.Village_Id = v.Village_Id -# INNER JOIN invoice i ON i.Village_Id = v.Village_Id AND i.PMC_No = asg.PMC_No -# WHERE asg.Contractor_Id = %s -# ORDER BY i.PMC_No ASC -# """, (contractor_id,)) -# invoices = cursor.fetchall() -# -# # Hold Amounts -# cursor.execute(""" -# SELECT h.Invoice_Id, h.hold_type_id, h.hold_amount -# FROM invoice_subcontractor_hold_join h -# JOIN invoice i ON h.Invoice_Id = i.Invoice_Id -# WHERE h.Contractor_Id = %s -# """, (contractor_id,)) -# hold_amounts = cursor.fetchall() -# hold_data = {} -# for h in hold_amounts: -# hold_data.setdefault(h['Invoice_Id'], {})[h['hold_type_id']] = h['hold_amount'] -# -# # GST Release -# cursor.execute(""" -# SELECT gr.pmc_no, gr.invoice_no, gr.basic_amount, gr.final_amount -# FROM gst_release gr -# INNER JOIN ( -# SELECT DISTINCT i.PMC_No, i.Invoice_No -# FROM invoice i -# JOIN assign_subcontractors a ON i.PMC_No = a.PMC_No AND i.Village_Id = a.Village_Id -# WHERE a.Contractor_Id = %s -# ) x ON gr.pmc_no = x.PMC_No AND gr.invoice_no = x.Invoice_No -# ORDER BY gr.pmc_no ASC -# """, (contractor_id,)) -# gst_rel = cursor.fetchall() -# gst_rel_map = {(gr['pmc_no'], gr['invoice_no']): gr for gr in gst_rel} -# # -# -# -# -# -# -# #Credit Note -# # Credit Note Fetch -# cursor.execute(""" -# SELECT PMC_No, Invoice_Details, Basic_Amount, Debit_Amount, After_Debit_Amount, -# GST_Amount, Amount, Final_Amount, Payment_Amount, Total_Amount, UTR, Invoice_No -# FROM credit_note -# WHERE Contractor_Id = %s -# """, (contractor_id,)) -# -# credit_notes = cursor.fetchall() -# -# # Build map by (PMC_No, Invoice_No) -# credit_note_map = {} -# for cn in credit_notes: -# key = (cn["PMC_No"], cn["Invoice_No"]) # Use correct casing! -# credit_note_map.setdefault(key, []).append(cn) -# -# # Track already appended credit notes -# appended_credit_keys = set() -# -# -# -# -# -# -# # Invoice Payments -# cursor.execute(""" -# SELECT p.pmc_no, p.invoice_no, p.Total_amount, p.utr -# FROM payment p -# INNER JOIN ( -# SELECT DISTINCT i.PMC_No, i.Invoice_No -# FROM invoice i -# JOIN assign_subcontractors a ON i.PMC_No = a.PMC_No AND i.Village_Id = a.Village_Id -# WHERE a.Contractor_Id = %s -# ) x ON p.pmc_no = x.PMC_No AND p.invoice_no = x.Invoice_No -# ORDER BY p.pmc_no ASC -# """, (contractor_id,)) -# payments = cursor.fetchall() -# payments_map = {} -# for pay in payments: -# key = (pay['pmc_no'], pay['invoice_no']) -# payments_map.setdefault(key, []).append(pay) -# -# #Credit Note Fetch----------------------------------------------------------------------------- -# -# -# # GST Release Payments -# cursor.execute(""" -# SELECT p.pmc_no, p.invoice_no, p.Total_amount, p.utr -# FROM payment p -# INNER JOIN gst_release gr ON p.pmc_no = gr.pmc_no AND p.invoice_no = gr.invoice_no -# WHERE gr.invoice_no IS NOT NULL AND gr.pmc_no IS NOT NULL -# AND p.Total_amount != 0 -# """) -# gst_payments = cursor.fetchall() -# gst_payment_map = {} -# for pay in gst_payments: -# key = (pay['pmc_no'], pay['invoice_no']) -# gst_payment_map[key] = pay -# -# # Extra Payments (no invoice_no) -# cursor.execute(""" -# SELECT pmc_no, Total_amount, utr -# FROM payment -# WHERE (invoice_no IS NULL OR invoice_no = '') -# AND Total_amount != 0 -# AND pmc_no IS NOT NULL -# """) -# extra_payments_raw = cursor.fetchall() -# extra_payments_map = {} -# for pay in extra_payments_raw: -# extra_payments_map.setdefault(pay['pmc_no'], []).append(pay) -# -# # Excel Workbook -# workbook = openpyxl.Workbook() -# sheet = workbook.active -# sheet.title = "Contractor Report" -# -# # Contractor Info section -# for field, value in contInfo.items(): -# sheet.append([field.replace("_", " "), value]) -# sheet.append([]) -# -# base_headers = ["PMC No", "Village", "Work Type", "Invoice Details", "Invoice Date", "Invoice No", -# "Basic Amount", "Debit", "After Debit Amount", "GST (18%)", "Amount", "TDS (1%)", -# "SD (5%)", "On Commission", "Hydro Testing", "GST SD Amount"] -# hold_headers = [ht['hold_type'] for ht in hold_types] -# payment_headers = ["Final Amount", "Total Paid", "UTR"] -# all_headers = base_headers + hold_headers + payment_headers -# sheet.append(all_headers) -# for cell in sheet[sheet.max_row]: -# cell.font = Font(bold=True) -# cell.fill = PatternFill(start_color="ADD8E6", end_color="ADD8E6", fill_type="solid") -# -# # Data Rows -# for inv in invoices: -# pmc_no = inv["PMC_No"] -# invoice_no = inv["Invoice_No"] -# -# row = [ -# pmc_no, inv["Village_Name"], inv["Work_Type"], inv["Invoice_Details"], -# inv["Invoice_Date"], invoice_no, inv["Basic_Amount"], inv["Debit_Amount"], -# inv["After_Debit_Amount"], inv["GST_Amount"], inv["Amount"], inv["TDS_Amount"], -# inv["SD_Amount"], inv["On_Commission"], inv["Hydro_Testing"], inv["GST_SD_Amount"] -# ] -# -# invoice_holds = hold_data.get(inv["Invoice_Id"], {}) -# for ht_id in hold_type_map: -# row.append(invoice_holds.get(ht_id, "")) -# -# payment = payments_map.get((pmc_no, invoice_no), [None])[0] -# row += [ -# inv["Final_Amount"], -# payment["Total_amount"] if payment else "", -# payment["utr"] if payment and payment["utr"] else "" # UTR only display, no total -# ] -# sheet.append(row) -# -# # GST Release row -# if (pmc_no, invoice_no) in gst_rel_map: -# gr = gst_rel_map[(pmc_no, invoice_no)] -# gst_payment = gst_payment_map.get((pmc_no, invoice_no)) -# -# gst_row = [ -# pmc_no, "", "", "GST Release Note", "", gr["invoice_no"], -# gr["basic_amount"], "", "", "", "", "", "", "", "", "" -# ] -# gst_row += ["" for _ in hold_headers] -# gst_row += [ -# gr["final_amount"], -# gst_payment["Total_amount"] if gst_payment else "", -# gst_payment["utr"] if gst_payment and gst_payment["utr"] else "" -# ] -# sheet.append(gst_row) -# # Credit Note row(s) -# -# # Track already appended credit notes -# appended_credit_keys = set() -# -# # While writing invoices -# key = (pmc_no, invoice_no) -# if key in credit_note_map and key not in appended_credit_keys: -# for cn in credit_note_map[key]: -# credit_row = [ -# pmc_no, "", "", cn.get("Invoice_Details", "Credit Note"), "", cn.get("Invoice_No",""), -# cn.get("Basic_Amount", ""), cn.get("Debit_Amount", ""), -# cn.get("After_Debit_Amount", ""), cn.get("GST_Amount", ""), cn.get("Amount", ""), "", "", "", -# "", "" -# ] -# credit_row += ["" for _ in hold_headers] -# credit_row += [ -# cn.get("Final_Amount", ""), -# cn.get("Total_Amount", ""), -# cn.get("UTR", "") -# ] -# sheet.append(credit_row) -# appended_credit_keys.add(key) -# -# -# # Extra Payments (once per pmc_no) -# if pmc_no in extra_payments_map: -# for extra in extra_payments_map[pmc_no]: -# extra_row = [ -# pmc_no, "", "", " ", "", "", "", "", "", "", "", "", "", "", "", "" -# ] -# extra_row += ["" for _ in hold_headers] -# extra_row += ["", extra['Total_amount'], extra['utr'] if extra['utr'] else ""] -# sheet.append(extra_row) -# del extra_payments_map[pmc_no] -# -# # Totals row (NO UTR totals, UTR blank) -# total_basic_amount = total_tds_amount = total_sd_amount = total_on_commission = 0 -# total_final_amount = total_total_amount = total_hold_amount = 0 -# for row in sheet.iter_rows(min_row=13, max_row=sheet.max_row, values_only=True): -# try: -# desc = row[3] -# if desc == " ": -# total_total_amount += float(row[-2] or 0) -# continue -# -# total_basic_amount += float(row[6] or 0) -# total_tds_amount += float(row[11] or 0) -# total_sd_amount += float(row[12] or 0) -# total_on_commission += float(row[13] or 0) -# total_final_amount += float(row[-3] or 0) -# total_total_amount += float(row[-2] or 0) -# # sum holds -# total_hold_amount += sum(float(row[i] or 0) for i in range(len(base_headers), len(base_headers) + len(hold_headers))) -# -# # DO NOT sum UTR column (row[-1]) — skip it -# except Exception: -# pass -# -# totals_row = [ -# "Total", "", "", "", "", "", total_basic_amount, "", "", "", "", total_tds_amount, -# total_sd_amount, total_on_commission, "", "" -# ] -# totals_row += [total_hold_amount for _ in hold_headers] -# totals_row += [total_final_amount, total_total_amount, ""] # UTR blank -# sheet.append([]) -# sheet.append(totals_row) -# for cell in sheet[sheet.max_row]: -# cell.font = Font(bold=True) -# -# # Summary Section -# today_date = datetime.today().strftime('%A, %Y-%m-%d') -# sheet.append([]) -# sheet.append(["Contractor Name", contInfo["Contractor_Name"]]) -# sheet.append(["Date", today_date]) -# sheet.append(["Description", "Amount"]) -# sheet.append(["Advance/Surplus", str(total_final_amount - total_total_amount)]) -# sheet.append(["Total Hold Amount", str(Decimal(total_hold_amount))]) -# sheet.append(["Amount With TDS", str(total_tds_amount)]) -# -# # Auto adjust column widths -# for col in sheet.columns: -# max_length = 0 -# col_letter = openpyxl.utils.get_column_letter(col[0].column) -# for cell in col: -# try: -# if cell.value: -# max_length = max(max_length, len(str(cell.value))) -# except: -# pass -# sheet.column_dimensions[col_letter].width = max_length + 2 -# -# workbook.save(output_file) -# workbook.close() -# -# finally: -# cursor.close() -# connection.close() -# -# return send_from_directory(output_folder, f"Contractor_Report_{contractor_id}.xlsx", as_attachment=True) -# @app.route('/download_report/') -# def download_report(contractor_id): -# connection = config.get_db_connection() -# cursor = connection.cursor(dictionary=True) -# -# output_folder = "static/download" -# output_file = os.path.join(output_folder, f"Contractor_Report_{contractor_id}.xlsx") -# -# if not os.path.exists(output_folder): -# os.makedirs(output_folder) -# -# try: -# # Fetch Contractor Info -# cursor.callproc('GetContractorInfoId', [contractor_id]) -# for result in cursor.stored_results(): -# contInfo = result.fetchone() -# if not contInfo: -# return "No contractor found", 404 -# -# # Fetch Hold Types -# cursor.callproc('GetDistinctHoldTypesByContractor', [contractor_id]) -# for result in cursor.stored_results(): -# hold_types = result.fetchall() -# hold_type_map = {ht['hold_type_id']: ht['hold_type'] for ht in hold_types} -# -# # Fetch Invoices -# cursor.callproc('GetInvoicesAndGSTReleasesByContractor', [contractor_id]) -# for result in cursor.stored_results(): -# invoices = result.fetchall() -# -# # Fetch Hold Amounts -# cursor.callproc('GetHoldAmountsByContractors', [contractor_id]) -# for result in cursor.stored_results(): -# hold_amounts = result.fetchall() -# hold_data = {} -# for h in hold_amounts: -# hold_data.setdefault(h['Invoice_Id'], {})[h['hold_type_id']] = h['hold_amount'] -# -# # Extract PMC numbers -# pmc_numbers = tuple(set(inv['PMC_No'] for inv in invoices if inv['PMC_No'] is not None)) -# -# payments_map = {} -# extra_payments_map = {} -# if pmc_numbers: -# pmc_list_str = ','.join(str(pmc) for pmc in pmc_numbers) -# cursor.callproc('GetPaymentsByPmcNosWithInvoice', [pmc_list_str]) -# for result in cursor.stored_results(): -# payments = result.fetchall() -# for pay in payments: -# key = (pay['pmc_no'], pay['invoice_no']) -# payments_map.setdefault(key, []).append(pay) -# -# cursor.callproc('GetExtraPaymentsByPmcNos', [pmc_list_str]) -# for result in cursor.stored_results(): -# extra_payments = result.fetchall() -# for pay in extra_payments: -# extra_payments_map.setdefault(pay['pmc_no'], []).append(pay) -# -# # Create Excel Workbook -# workbook = openpyxl.Workbook() -# sheet = workbook.active -# sheet.title = "Contractor Report" -# -# # Write Contractor Info -# sheet.append(["Contractor Name", contInfo["Contractor_Name"]]) -# sheet.append(["State", contInfo["State_Name"]]) -# sheet.append(["District", contInfo["District_Name"]]) -# sheet.append(["Block", contInfo["Block_Name"]]) -# sheet.append(["Mobile No", contInfo["Mobile_No"]]) -# sheet.append(["GST Type", contInfo["GST_Registration_Type"]]) -# sheet.append(["GST No", contInfo["GST_No"]]) -# sheet.append(["PAN No", contInfo["PAN_No"]]) -# sheet.append(["Email", contInfo["Email"]]) -# sheet.append(["Address", contInfo["Address"]]) -# sheet.append([]) -# -# # Table Headers -# base_headers = ["PMC No", "Village", "Work Type", "Invoice Details", "Invoice Date", "Invoice No", -# "Basic Amount", "Debit", "After Debit Amount", "GST (18%)", "Amount", "TDS (1%)", -# "SD (5%)", "On Commission", "Hydro Testing", "GST SD Amount"] -# hold_headers = [ht['hold_type'] for ht in hold_types] -# payment_headers = ["Final Amount", "Payment Amount", "TDS Payment", "Total Paid", "UTR"] -# all_headers = base_headers + hold_headers + payment_headers -# -# sheet.append(all_headers) -# -# # Style the headers -# header_fill = PatternFill(start_color="ADD8E6", end_color="ADD8E6", fill_type="solid") -# header_font = Font(bold=True) -# for cell in sheet[sheet.max_row]: -# cell.font = header_font -# cell.fill = header_fill -# -# seen_invoices = set() -# seen_gst_notes = set() -# processed_payments = set() -# pmc_groups = {} -# for inv in invoices: -# pmc_groups.setdefault(inv["PMC_No"], []).append(inv) -# -# for pmc_no, pmc_invoices in pmc_groups.items(): -# for inv in pmc_invoices: -# invoice_no = inv["Invoice_No"] -# payments = payments_map.get((pmc_no, invoice_no), []) -# -# if (pmc_no, invoice_no) not in seen_invoices: -# seen_invoices.add((pmc_no, invoice_no)) -# first_payment = payments[0] if payments else None -# row = [ -# pmc_no, inv["Village_Name"], inv["Work_Type"], inv["Invoice_Details"], -# inv["Invoice_Date"], invoice_no, inv["Basic_Amount"], inv["Debit_Amount"], -# inv["After_Debit_Amount"], inv["GST_Amount"], inv["Amount"], inv["TDS_Amount"], -# inv["SD_Amount"], inv["On_Commission"], inv["Hydro_Testing"], inv["GST_SD_Amount"] -# ] -# invoice_holds = hold_data.get(inv["Invoice_Id"], {}) -# for ht_id in hold_type_map: -# row.append(invoice_holds.get(ht_id, "")) -# -# row += [ -# inv["Final_Amount"], -# first_payment["Payment_Amount"] if first_payment else "", -# first_payment["TDS_Payment_Amount"] if first_payment else "", -# first_payment["Total_amount"] if first_payment else "", -# first_payment["UTR"] if first_payment else "" -# ] -# sheet.append(row) -# if first_payment: -# payment_id = f"{pmc_no}-{invoice_no}-{first_payment['Payment_Amount']}-{first_payment.get('UTR', '')}" -# processed_payments.add(payment_id) -# -# # GST Notes -# if inv["gst_pmc_no"] and (inv["gst_pmc_no"], inv["gst_invoice_no"]) not in seen_gst_notes: -# seen_gst_notes.add((inv["gst_pmc_no"], inv["gst_invoice_no"])) -# gst_payment = None -# for payment in payments[1:]: -# if payment['invoice_no'] == inv["gst_invoice_no"]: -# gst_payment = payment -# break -# row = [pmc_no, "", "", "GST Release Note", "", inv["gst_invoice_no"], -# inv["gst_basic_amount"], "", "", "", "", "", "", "", "", ""] -# row += ["" for _ in hold_headers] -# row += [ -# inv["gst_final_amount"], -# gst_payment["Payment_Amount"] if gst_payment else "", -# gst_payment["TDS_Payment_Amount"] if gst_payment else "", -# gst_payment["Total_amount"] if gst_payment else "", -# gst_payment["UTR"] if gst_payment else "" -# ] -# sheet.append(row) -# if gst_payment: -# payment_id = f"{pmc_no}-{inv['gst_invoice_no']}-{gst_payment['Payment_Amount']}-{gst_payment.get('UTR', '')}" -# processed_payments.add(payment_id) -# -# for payment in payments[1:]: -# payment_id = f"{pmc_no}-{payment['invoice_no']}-{payment['Payment_Amount']}-{payment.get('UTR', '')}" -# if payment_id not in processed_payments: -# row = [pmc_no, "", "", "", "", payment['invoice_no'], "", "", "", "", "", "", "", "", "", ""] -# row += ["" for _ in hold_headers] -# row += [ -# "", -# payment["Payment_Amount"], -# payment["TDS_Payment_Amount"], -# payment["Total_amount"], -# payment["UTR"] -# ] -# sheet.append(row) -# processed_payments.add(payment_id) -# -# # Extra payments (null invoice) -# for payment in extra_payments_map.get(pmc_no, []): -# payment_id = f"{pmc_no}-null-{payment['Payment_Amount']}-{payment.get('UTR', '')}" -# if payment_id not in processed_payments: -# row = [pmc_no, "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""] -# row += ["" for _ in hold_headers] -# row += [ -# "", -# payment["Payment_Amount"], -# payment["TDS_Payment_Amount"], -# payment["Total_amount"], -# payment["UTR"] -# ] -# sheet.append(row) -# processed_payments.add(payment_id) -# -# # Totals Calculation -# total_basic_amount = total_tds_amount = total_sd_amount = total_on_commission = 0 -# total_hold_amount = total_final_amount = total_total_amount = 0 -# -# for row in sheet.iter_rows(min_row=13, max_row=sheet.max_row, values_only=True): -# try: -# total_basic_amount += float(row[6] or 0) -# total_tds_amount += float(row[11] or 0) -# total_sd_amount += float(row[12] or 0) -# total_on_commission += float(row[13] or 0) -# total_final_amount += float(row[-5] or 0) -# total_total_amount += float(row[-2] or 0) -# hold_start_col = len(base_headers) -# hold_end_col = hold_start_col + len(hold_headers) -# total_hold_amount += sum(float(row[i] or 0) for i in range(hold_start_col, hold_end_col)) -# except ValueError: -# continue -# -# # Totals Row -# sheet.append([]) -# totals_row = [ -# "TOTAL", "", "", "", "", "", total_basic_amount, "", "", "", "", total_tds_amount, -# total_sd_amount, total_on_commission, "", "" -# ] -# totals_row += [total_hold_amount] + [""] * (len(hold_headers) - 1) -# totals_row += [total_final_amount, "", "", total_total_amount, ""] -# sheet.append(totals_row) -# -# for cell in sheet[sheet.max_row]: -# cell.font = Font(bold=True) -# -# # Summary Section -# today_date = datetime.today().strftime('%A, %Y-%m-%d') -# sheet.append([]) -# sheet.append(["Contractor Name", contInfo["Contractor_Name"]]) -# sheet.append(["Date", today_date]) -# sheet.append(["Description", "Amount"]) -# sheet.append(["Advance/Surplus", str(total_final_amount - total_total_amount)]) -# sheet.append(["Total Hold Amount", str(Decimal(total_hold_amount))]) -# sheet.append(["Amount With TDS", str(total_tds_amount)]) -# -# # Auto adjust column widths -# for col in sheet.columns: -# max_length = 0 -# col_letter = openpyxl.utils.get_column_letter(col[0].column) -# for cell in col: -# try: -# if cell.value: -# max_length = max(max_length, len(str(cell.value))) -# except: -# pass -# sheet.column_dimensions[col_letter].width = max_length + 2 -# -# workbook.save(output_file) -# workbook.close() -# -# finally: -# cursor.close() -# connection.close() -# -# return send_from_directory(output_folder, f"Contractor_Report_{contractor_id}.xlsx", as_attachment=True) -# show report by pmc no @app.route('/pmc_report/') @@ -7047,8 +3879,29 @@ def download_pmc_report(pmc_no): else: extra_payments.append(pay) + # Fetch GST Release data + cursor.execute(""" + SELECT PMC_No, Invoice_No, Basic_Amount, Final_Amount, Total_Amount, UTR + FROM gst_release + WHERE PMC_No = %s + """, (pmc_no,)) + gst_releases = cursor.fetchall() + gst_release_map = {} + for gr in gst_releases: + invoice_nos = [] + if gr['Invoice_No']: + cleaned = gr['Invoice_No'].replace(' ', '') + if '&' in cleaned: + invoice_nos = cleaned.split('&') + elif ',' in cleaned: + invoice_nos = cleaned.split(',') + else: + invoice_nos = [cleaned] + for inv_no in invoice_nos: + gst_release_map.setdefault(inv_no, []).append(gr) + LogHelper.log_action("Download PMC Report", f"User {current_user.id} Download PMC Report'{ pmc_no}'") workbook = openpyxl.Workbook() sheet = workbook.active sheet.title = "PMC Report" @@ -7111,31 +3964,50 @@ def download_pmc_report(pmc_no): if first_payment: processed_payments.add(f"{invoice_no}-{first_payment['Payment_Amount']}-{first_payment.get('UTR', '')}") - if inv["gst_pmc_no"] and inv["gst_invoice_no"] and inv["gst_invoice_no"] not in seen_gst_notes: - seen_gst_notes.add(inv["gst_invoice_no"]) - gst_payment = None - for payment in payments[1:]: - if payment['invoice_no'] == inv["gst_invoice_no"]: - gst_payment = payment - break - if not gst_payment: - gst_payment = payments_map.get(inv["gst_invoice_no"], [None])[0] + # if inv["gst_pmc_no"] and inv["gst_invoice_no"] and inv["gst_invoice_no"] not in seen_gst_notes: + # seen_gst_notes.add(inv["gst_invoice_no"]) + # gst_payment = None + # for payment in payments[1:]: + # if payment['invoice_no'] == inv["gst_invoice_no"]: + # gst_payment = payment + # break + # if not gst_payment: + # gst_payment = payments_map.get(inv["gst_invoice_no"], [None])[0] + # + # gst_row = [ + # pmc_no, "", "", "GST Release Note", "", inv["gst_invoice_no"], + # inv["gst_basic_amount"], "", "", "", "", "", "", "", "", "" + # ] + # gst_row += ["" for _ in hold_headers] + # gst_row += [ + # inv["gst_final_amount"], + # gst_payment["Payment_Amount"] if gst_payment else "", + # gst_payment["TDS_Payment_Amount"] if gst_payment else "", + # gst_payment["Total_amount"] if gst_payment else "", + # gst_payment["UTR"] if gst_payment else "" + # ] + # sheet.append(gst_row) + # Add GST Release Note(s) for this invoice if any + if invoice_no in gst_release_map: + for gr in gst_release_map[invoice_no]: + gst_row = [ + pmc_no, "", "", "GST Release Note", "", gr["Invoice_No"], + gr["Basic_Amount"], "", "", "", "", "", "", "", "", "" + ] + gst_row += ["" for _ in hold_headers] + gst_row += [ + gr["Final_Amount"], "", "", gr["Total_Amount"], + gr["UTR"] if gr["UTR"] else "" + ] - gst_row = [ - pmc_no, "", "", "GST Release Note", "", inv["gst_invoice_no"], - inv["gst_basic_amount"], "", "", "", "", "", "", "", "", "" - ] - gst_row += ["" for _ in hold_headers] - gst_row += [ - inv["gst_final_amount"], - gst_payment["Payment_Amount"] if gst_payment else "", - gst_payment["TDS_Payment_Amount"] if gst_payment else "", - gst_payment["Total_amount"] if gst_payment else "", - gst_payment["UTR"] if gst_payment else "" - ] - sheet.append(gst_row) - if gst_payment: - processed_payments.add(f"{inv['gst_invoice_no']}-{gst_payment['Payment_Amount']}-{gst_payment.get('UTR', '')}") + # ✅ Ensure proper alignment + while len(gst_row) < len(base_headers) + len(hold_headers) + len(payment_headers): + gst_row.append("") + + sheet.append(gst_row) + + # if gst_payment: + # processed_payments.add(f"{inv['gst_invoice_no']}-{gst_payment['Payment_Amount']}-{gst_payment.get('UTR', '')}") for payment in payments[1:]: payment_id = f"{payment['invoice_no']}-{payment['Payment_Amount']}-{payment.get('UTR', '')}" @@ -7211,19 +4083,43 @@ def download_pmc_report(pmc_no): except: continue - totals_row = [ - "TOTAL", "", "", "", "", "", - total_basic_amount, "", "", "", "", total_tds_amount, total_sd_amount, - total_on_commission, "", "" - ] + # totals_row = [ + # "TOTAL", "", "", "", "", "", + # total_basic_amount, "", "", "", "", total_tds_amount, total_sd_amount, + # total_on_commission, "", "" + # ] + # if total_hold_amount_dynamic: + # totals_row += [total_hold_amount_dynamic] + [""] * (len(hold_headers) - 1) + # totals_row += [ + # total_final_amount, + # total_payment_amount, + # total_tds_payment_amount, + # total_total_paid, + # "" + # ] + # Prepare empty totals_row with length of base_headers + totals_row = [""] * len(base_headers) + + # Fill in specific columns + totals_row[0] = "TOTAL" # Column 0: Label + totals_row[6] = total_basic_amount # Column 6: Basic Amount + totals_row[11] = total_tds_amount # Column 11: TDS + totals_row[12] = total_sd_amount # Column 12: SD + totals_row[13] = total_on_commission # Column 13: On Commission + + # Add hold header totals + hold_values = ["" for _ in hold_headers] if total_hold_amount_dynamic: - totals_row += [total_hold_amount_dynamic] + [""] * (len(hold_headers) - 1) + hold_values[0] = total_hold_amount_dynamic # Only in first column + totals_row += hold_values + + # Add payment section totals_row += [ total_final_amount, total_payment_amount, total_tds_payment_amount, total_total_paid, - "" + "" # UTR ] sheet.append([]) @@ -7428,7 +4324,7 @@ def delete_hold_type(id): cursor.callproc("GetHoldTypesById", (id,)) for hold in cursor.stored_results(): hold_type = hold.fetchone() - + LogHelper.log_action("Delete hold type", f"User {current_user.id} Delete hold type'{ hold_type}'") if not hold_type: return jsonify({'status': 'error', 'message': 'Hold Type not found.'}), 404 @@ -7444,10 +4340,655 @@ def delete_hold_type(id): cursor.close() connection.close() +@app.route('/unreleased_gst') +def unreleased_gst(): + connection = config.get_db_connection() + cursor = connection.cursor(dictionary=True) + + try: + # Step 1: Fetch invoices + cursor.execute(""" + SELECT + i.PMC_No, i.Invoice_No, i.GST_SD_Amount, i.Invoice_Details, + i.Basic_Amount, i.Final_Amount + FROM `invoice` i + """) + invoices = cursor.fetchall() + + # Step 2: Fetch GST releases + cursor.execute(""" + SELECT Invoice_No, Basic_Amount ,Final_Amount + FROM gst_release + """) + gst_releases = cursor.fetchall() + + # Step 3: Lookup sets + gst_invoice_nos = {g['Invoice_No'] for g in gst_releases if g['Invoice_No']} + gst_basic_amounts = {float(g['Basic_Amount']) for g in gst_releases if g['Basic_Amount'] is not None} + + # Step 4: Filter + unreleased = [] + for inv in invoices: + match_by_invoice = inv['Invoice_No'] in gst_invoice_nos + match_by_gst_amount = float(inv.get('GST_SD_Amount') or 0.0) in gst_basic_amounts + if not (match_by_invoice or match_by_gst_amount): + unreleased.append(inv) + + return render_template("unreleased_gst.html", data=unreleased) + + finally: + cursor.close() + connection.close() # -- end hold types controlller -------------------- +# -- end hold types controlller -------------------- + +# Route to display the HTML form +@app.route('/add_work_order', methods=['GET']) +def add_work_order(): + # Add database connection + connection = config.get_db_connection() + cursor = connection.cursor(dictionary=True) + + cursor.execute("SELECT Contractor_id, Contractor_Name FROM subcontractors") # Adjust table/column names as needed + subcontractor = cursor.fetchall() + + cursor.close() + connection.close() + + return render_template('add_work_order.html', subcontractor=subcontractor) # This is your HTML form page + + +# Route to handle form submission (from action="/submit_work_order") +@app.route('/submit_work_order', methods=['POST', 'GET']) +def submit_work_order(): + vendor_name = request.form['vendor_name'] + work_order_type = request.form['work_order_type'] + work_order_amount = request.form['work_order_amount'] + boq_amount = request.form['boq_amount'] + work_done_percentage = request.form['work_done_percentage'] + work_order_number = request.form['work_order_number'] + gst_amount = request.form['gst_amount'] + tds_amount = request.form['tds_amount'] + security_deposite = request.form['security_deposite'] + sd_against_gst = request.form['sd_against_gst'] + final_total = request.form['final_total'] + tds_of_gst = request.form['tds_of_gst'] + LogHelper.log_action("Submit Work Order", f"User {current_user.id} Submit Work Order'{ work_order_type}'") + # print("Good Morning How are U") + connection = config.get_db_connection() + cursor = connection.cursor(dictionary=True) + # print("Good morning and how are you") + insert_query = """ + INSERT INTO work_order + (vendor_name, work_order_type, work_order_amount, boq_amount, work_done_percentage,work_order_number,gst_amount,tds_amount + ,security_deposit,sd_against_gst,final_total,tds_of_gst) + VALUES (%s, %s, %s, %s, %s,%s,%s,%s,%s,%s,%s,%s) + """ + cursor.execute(insert_query, + (vendor_name, work_order_type, work_order_amount, boq_amount, work_done_percentage, work_order_number + , gst_amount, tds_amount, security_deposite, sd_against_gst, final_total, tds_of_gst)) + connection.commit() + + # ✅ Fetch all data after insert + select_query = "SELECT * FROM work_order" + cursor.execute(select_query) + wo = cursor.fetchall() + # print("The Work order data is ",wo) + print("The data from work order ", wo) # should now print the data properly + cursor.execute("SELECT Contractor_id, Contractor_Name FROM subcontractors") # Adjust table/column names as needed + subcontractor = cursor.fetchall() + cursor.close() + connection.close() + + return render_template('add_work_order.html', work_order_type=work_order_type, wo=wo, subcontractor=subcontractor) + + +@app.route('/delete_work_order/', methods=['POST']) +def delete_work_order(id): + connection = config.get_db_connection() + cursor = connection.cursor() + cursor.execute("DELETE FROM work_order WHERE work_order_id = %s", (id,)) + connection.commit() + cursor.close() + connection.close() + LogHelper.log_action("delete Work Order", f"User {current_user.id} delete Work Order'{ id}'") + return jsonify({'success': True}) + + +@app.route('/update_work_order/', methods=['GET', 'POST']) +def update_work_order(id): + connection = config.get_db_connection() + cursor = connection.cursor(dictionary=True) + + if request.method == 'POST': + work_order_type = request.form['work_order_type'] + work_order_amount = request.form['work_order_amount'] + boq_amount = request.form['boq_amount'] + work_done_percentage = request.form['work_done_percentage'] + work_order_number = request.form['work_order_number'] + gst_amount = request.form['gst_amount'] + tds_amount = request.form['tds_amount'] + security_deposite = request.form['security_deposite'] + sd_against_gst = request.form['sd_against_gst'] + final_amount = request.form['final_amount'] + tds_of_gst = request.form['tds_of_gst'] + update_query = """ + UPDATE work_order + SET work_order_type = %s, + work_order_amount = %s, + boq_amount = %s, + work_done_percentage = %s, + work_order_number= %s, + gst_amount = %s, + tds_amount= %s, + security_deposite= %s, + sd_against_gst=%s, + final_amount= %s, + tds_of_gst=%s + WHERE work_order_id = %s + """ + cursor.execute(update_query, ( + work_order_type, work_order_amount, boq_amount, work_done_percentage, work_order_number, gst_amount, + tds_amount, security_deposite, sd_against_gst, final_amount, tds_of_gst, id)) + connection.commit() + cursor.close() + connection.close() + + # If GET request: fetch the existing record + cursor.execute("SELECT * FROM work_order WHERE work_order_id = %s", (id,)) + work_order = cursor.fetchone() + cursor.close() + connection.close() + return render_template('update_work_order.html', work_order=work_order) + + +# Optional: Route to show a success message +@app.route('/success') +def success(): + return "Work Order Submitted Successfully!" + + + +logging.basicConfig(level=logging.DEBUG) + + +@app.route('/add_purchase_order', methods=['GET', 'POST']) +def add_purchase_order(): + connection = config.get_db_connection() + cursor = connection.cursor(dictionary=True) + + if request.method == 'POST': + # Fetch form fields + purchase_date = request.form.get('purchase_date') + supplier_name = request.form.get('supplier_name') + purchase_order_no = request.form.get('purchase_order_no') + item_name = request.form.get('item_name') + quantity = request.form.get('quantity') + unit = request.form.get('unit') + rate = request.form.get('rate') + amount = request.form.get('amount') + GST_Amount = request.form.get('GST_Amount') + TDS = request.form.get('TDS') + final_amount = request.form.get('final_amount') + LogHelper.log_action("Add purchase order", f"User {current_user.id} Added puirchase Order'{ purchase_order_no}'") + # Insert into database + insert_query = """ + INSERT INTO purchase_order ( + purchase_date, supplier_name, purchase_order_no, item_name, quantity, unit, rate, amount, + GST_Amount, TDS, final_amount + ) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) + """ + cursor.execute(insert_query, ( + purchase_date, supplier_name, purchase_order_no, item_name, quantity, unit, rate, amount, + GST_Amount, TDS, final_amount + )) + connection.commit() + + # ✅ Always fetch updated data + cursor.execute("SELECT * FROM purchase_order") + purchases = cursor.fetchall() + + cursor.close() + connection.close() + + return render_template('add_purchase_order.html', purchases=purchases) + + +# Show all purchases +@app.route('/purchase_orders') +def show_purchase_orders(): + connection = config.get_db_connection() + cursor = connection.cursor(dictionary=True) + cursor.execute("SELECT * FROM purchase_order") + purchases = cursor.fetchall() + cursor.close() + connection.close() + return render_template('add_purchase_order.html', purchases=purchases) + + +# Delete purchase order +@app.route('/delete_purchase/', methods=['POST']) +def delete_purchase(id): + connection = config.get_db_connection() + cursor = connection.cursor() + cursor.execute("DELETE FROM purchase_order WHERE purchase_id = %s", (id,)) + connection.commit() + cursor.close() + connection.close() + LogHelper.log_action("Delete purchase order", f"User {current_user.id} Deleted puirchase Order'{ id}'") + return render_template(('add_purchase_order.html')) + + +# Edit purchase order (form + update logic) +@app.route('/update_purchase/', methods=['GET', 'POST']) +def update_purchase(id): + connection = config.get_db_connection() + cursor = connection.cursor(dictionary=True) + + if request.method == 'POST': + # ✅ Form submitted - update all fields + data = request.form + cursor.execute(""" + UPDATE purchase_order + SET purchase_date = %s, + supplier_name = %s, + purchase_order_no = %s, + item_name = %s, + quantity = %s, + unit = %s, + rate = %s, + amount = %s, + GST_Amount = %s, + TDS = %s, + final_amount = %s + WHERE purchase_id = %s + """, ( + data['purchase_date'], data['supplier_name'], data['purchase_order_no'], data['item_name'], + data['quantity'], + data['unit'], data['rate'], data['amount'], data['GST_Amount'], data['TDS'], data['final_amount'], + id + )) + connection.commit() + cursor.close() + connection.close() + LogHelper.log_action("Delete purchase order", f"User {current_user.id} Deleted puirchase Order'{ id}'") + return redirect(url_for('show_purchase_orders')) + + # Show edit form + cursor.execute("SELECT * FROM purchase_order WHERE purchase_id = %s", (id,)) + purchase = cursor.fetchone() + cursor.close() + connection.close() + return render_template('edit_purchase.html', purchase=purchase) + + +# SHOW all GRNs + ADD form +@app.route('/grn', methods=['GET']) +def grn_page(): + connection = config.get_db_connection() + cursor = connection.cursor(dictionary=True) + + # Fetch purchase orders for dropdown + cursor.execute("SELECT purchase_id, supplier_name FROM purchase_order") + purchase_orders = cursor.fetchall() + + # Fetch all GRNs to display + cursor.execute("SELECT * FROM goods_receive_note") + grns = cursor.fetchall() + print(grns) + cursor.close() + connection.close() + + # Render the template with both datasets + return render_template('grn_form.html', purchase_orders=purchase_orders, grns=grns) + + +# ADD new GRN +@app.route('/add_grn', methods=['POST', 'GET']) +def add_grn(): + data = request.form + connection = config.get_db_connection() + cursor = connection.cursor() + query = """ + INSERT INTO goods_receive_note + (grn_date, purchase_id, supplier_name, item_description, received_quantity, unit, rate, amount, remarks) + VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s) \ + """ + cursor.execute(query, ( + data.get('grn_date'), + data.get('purchase_id'), + data.get('supplier_name'), + data.get('item_description'), + data.get('received_quantity'), + data.get('unit'), + data.get('rate'), + data.get('amount'), + data.get('remarks') + )) + connection.commit() + + cursor.execute("SELECT * FROM goods_receive_note") + grns = cursor.fetchall() + print(grns) + query = "select * from purchase_order" + cursor.execute(query) + purchase_orders = cursor.fetchall() + cursor.close() + connection.close() + return render_template('grn_form.html', purchase_orders=purchase_orders, grns=grns) + + +# UPDATE GRN +@app.route('/update_grn/', methods=['GET', 'POST']) +def update_grn(grn_id): + connection = config.get_db_connection() + cursor = connection.cursor(dictionary=True) + + if request.method == 'POST': + data = request.form + query = """ + UPDATE goods_receive_note + SET grn_date=%s, purchase_id=%s, supplier_name=%s, item_description=%s, + received_quantity=%s, unit=%s, rate=%s, amount=%s, remarks=%s + WHERE grn_id=%s + """ + cursor.execute(query, ( + data['grn_date'], data['purchase_id'], data['supplier_name'], + data['item_description'], data['received_quantity'], data['unit'], + data['rate'], data['amount'], data['remarks'], grn_id + )) + connection.commit() + cursor.close() + connection.close() + return redirect(url_for('grns')) + + cursor.execute("SELECT * FROM goods_receive_note WHERE grn_id = %s", (grn_id,)) + grn = cursor.fetchone() + cursor.close() + connection.close() + return render_template("edit_grn.html", grn=grn) + + +# DELETE GRN +@app.route('/delete_grn/', methods=['POST']) +def delete_grn(grn_id): + connection = config.get_db_connection() + cursor = connection.cursor() + cursor.execute("DELETE FROM goods_receive_note WHERE grn_id = %s", (grn_id,)) + connection.commit() + cursor.close() + connection.close() + return render_template("grn_form.html") + + +@app.route('/work_order_report', methods=['GET']) +def work_order_report(): + return render_template('work_order_report.html') + + + + +# ✅ Vendor Name Search (for Select2) +@app.route('/get_vendor_names') +def get_vendor_names(): + query = request.args.get('q', '') + connection = config.get_db_connection() + cursor = connection.cursor() + cursor.execute("SELECT DISTINCT vendor_name FROM work_order WHERE vendor_name LIKE %s", (f"%{query}%",)) + vendors = [row[0] for row in cursor.fetchall()] + cursor.close() + connection.close() + return jsonify(vendors) + + +# ✅ Work Order Number Search (with or without vendor) +@app.route('/get_work_order_numbers') +def get_work_order_numbers(): + vendor = request.args.get('vendor_name', '') + query = request.args.get('q', '') + connection = config.get_db_connection() + cursor = connection.cursor() + + if vendor: + cursor.execute( + "SELECT DISTINCT work_order_number FROM work_order WHERE vendor_name = %s AND work_order_number LIKE %s", + (vendor, f"%{query}%")) + else: + cursor.execute("SELECT DISTINCT work_order_number FROM work_order WHERE work_order_number LIKE %s", + (f"%{query}%",)) + + orders = [row[0] for row in cursor.fetchall()] + cursor.close() + connection.close() + return jsonify(orders) + + +# ✅ Get Work Order Data (Filtered) +@app.route('/get_work_order_data') +def get_work_order_data(): + vendor = request.args.get('vendor_name') + order_number = request.args.get('work_order_number') + + query = "SELECT * FROM work_order WHERE 1=1" + params = [] + + if vendor: + query += " AND vendor_name = %s" + params.append(vendor) + if order_number: + query += " AND work_order_number = %s" + params.append(order_number) + + connection = config.get_db_connection() + cursor = connection.cursor(dictionary=True) + cursor.execute(query, tuple(params)) + data = cursor.fetchall() + cursor.close() + connection.close() + return jsonify(data) + + + + +@app.route('/download_work_order_report') +def download_work_order_report(): + vendor_name = request.args.get('vendor_name') + work_order_number = request.args.get('work_order_number') + + if work_order_number == "null": + work_order_number = None + + query = "SELECT * FROM work_order WHERE 1=1" + params = [] + + if vendor_name: + query += " AND vendor_name = %s" + params.append(vendor_name) + if work_order_number: + query += " AND work_order_number = %s" + params.append(work_order_number) + + conn = config.get_db_connection() + cursor = conn.cursor(dictionary=True) + cursor.execute(query, tuple(params)) + data = cursor.fetchall() + cursor.close() + conn.close() + + if not data: + return "No data found for the selected filters", 404 + + # Convert to DataFrame + df = pd.DataFrame(data) + + output_path = 'static/downloads/work_order_report.xlsx' + os.makedirs(os.path.dirname(output_path), exist_ok=True) + df.to_excel(output_path, index=False, startrow=2) # Leave space for heading + + # Load workbook for styling + wb = load_workbook(output_path) + ws = wb.active + + # Add a merged title + title = "Work Order Report" + ws.merge_cells(start_row=1, start_column=1, end_row=1, end_column=len(df.columns)) + title_cell = ws.cell(row=1, column=1) + title_cell.value = title + title_cell.font = Font(size=14, bold=True, color="1F4E78") + title_cell.alignment = Alignment(horizontal="center", vertical="center") + + # Style header row (row 3 because data starts from row 3) + header_font = Font(bold=True) + for col_num, column_name in enumerate(df.columns, 1): + cell = ws.cell(row=3, column=col_num) + cell.font = header_font + cell.alignment = Alignment(horizontal="center", vertical="center") + # Optional: adjust column width + max_length = max(len(str(column_name)), 12) + ws.column_dimensions[get_column_letter(col_num)].width = max_length + 2 + + wb.save(output_path) + return send_file(output_path, as_attachment=True) + + +@app.route('/purchase_order_report', methods=['GET']) +def purchase_order_report(): + return render_template('purchase_order_report.html') + + +@app.route('/get_supplier_names') +def get_supplier_names(): + query = request.args.get('q', '') # Get the search term from Select2 + connection = config.get_db_connection() + cursor = connection.cursor() + + # Fetch distinct supplier names that match the search query + cursor.execute( + "SELECT supplier_name FROM purchase_order WHERE supplier_name LIKE %s", + (f"%{query}%",) + ) + suppliers = [row[0] for row in cursor.fetchall()] + + cursor.close() + connection.close() + return jsonify(suppliers) + + +@app.route('/get_purchase_order_numbers') +def get_purchase_order_numbers(): + supplier = request.args.get('supplier_name', '') + query = request.args.get('q', '') + + connection = config.get_db_connection() + cursor = connection.cursor() + + if supplier: + cursor.execute(""" + SELECT purchase_order_no + FROM purchase_order + WHERE supplier_name = %s AND purchase_order_no LIKE %s + """, (supplier, f"%{query}%")) + else: + cursor.execute(""" + SELECT purchase_order_no + FROM purchase_order + WHERE purchase_order_no LIKE %s + """, (f"%{query}%",)) + + orders = [row[0] for row in cursor.fetchall()] + cursor.close() + connection.close() + return jsonify(orders) + + +@app.route('/get_purchase_order_data') +def get_purchase_order_data(): + supplier = request.args.get('supplier_name') + order_no = request.args.get('purchase_order_no') + + query = "SELECT * FROM purchase_order WHERE 1=1" + params = [] + + if supplier: + query += " AND supplier_name = %s" + params.append(supplier) + if order_no: + query += " AND purchase_order_no = %s" + params.append(order_no) + + connection = config.get_db_connection() + cursor = connection.cursor(dictionary=True) + cursor.execute(query, tuple(params)) + data = cursor.fetchall() + cursor.close() + connection.close() + return jsonify(data) + + +@app.route('/download_purchase_order_report') +def download_purchase_order_report(): + supplier_name = request.args.get('supplier_name') + purchase_order_no = request.args.get('purchase_order_no') + + if purchase_order_no == "null": + purchase_order_no = None + LogHelper.log_action("Download purchase order", f"User {current_user.id} Download puirchase Order'{ purchase_order_no}'") + query = "SELECT * FROM purchase_order WHERE 1=1" + params = [] + + if supplier_name: + query += " AND supplier_name = %s" + params.append(supplier_name) + if purchase_order_no: + query += " AND purchase_order_no = %s" + params.append(purchase_order_no) + + conn = config.get_db_connection() + cursor = conn.cursor(dictionary=True) + cursor.execute(query, tuple(params)) + data = cursor.fetchall() + cursor.close() + conn.close() + + if not data: + return "No data found for the selected filters", 404 + + # Convert to DataFrame + df = pd.DataFrame(data) + + output_path = 'static/downloads/purchase_order_report.xlsx' + os.makedirs(os.path.dirname(output_path), exist_ok=True) + + df.to_excel(output_path, index=False, startrow=2) # Reserve space for heading + + # Load workbook for styling + wb = load_workbook(output_path) + ws = wb.active + + # Add a merged title + title = "Purchase Order Report" + ws.merge_cells(start_row=1, start_column=1, end_row=1, end_column=len(df.columns)) + title_cell = ws.cell(row=1, column=1) + title_cell.value = title + title_cell.font = Font(size=14, bold=True, color="1F4E78") + title_cell.alignment = Alignment(horizontal="center", vertical="center") + + # Style header row (row 3 because data starts from row 3) + header_font = Font(bold=True) + for col_num, column_name in enumerate(df.columns, 1): + cell = ws.cell(row=3, column=col_num) + cell.font = header_font + cell.alignment = Alignment(horizontal="center", vertical="center") + max_length = max(len(str(column_name)), 12) + ws.column_dimensions[get_column_letter(col_num)].width = max_length + 2 + + wb.save(output_path) + return send_file(output_path, as_attachment=True) + + if __name__ == '__main__': app.run(host='0.0.0.0', port=5000, debug=True) diff --git a/templates/activity_log.html b/templates/activity_log.html new file mode 100644 index 0000000..40c9ef6 --- /dev/null +++ b/templates/activity_log.html @@ -0,0 +1,102 @@ + + + + + Activity Logs + + + +

Activity Logs

+
+ + + + + + + + + + + + + +
+ + + + + + + + + {% for log in logs %} + + + + + + + {% endfor %} + {% if logs|length == 0 %} + + + + {% endif %} +
TimestampUserActionDetails
{{ log.timestamp }}{{ log.user }}{{ log.action }}{{ log.details }}
No logs found
+ + + + diff --git a/templates/add_gst_release.html b/templates/add_gst_release.html index 62a19bd..f15e4fa 100644 --- a/templates/add_gst_release.html +++ b/templates/add_gst_release.html @@ -39,12 +39,18 @@


-
+


-
+


+
+

+ +
+

+ @@ -75,6 +81,8 @@ Invoice_No Basic_Amount Final_Amount + Total_Amount + UTR Update Delete @@ -87,6 +95,8 @@ {{ gst_rel[2] }} {{ gst_rel[3] }} {{ gst_rel[4] }} + {{ gst_rel[5] }} + {{ gst_rel[6] }} Edit


-

+




diff --git a/templates/add_purchase_order.html b/templates/add_purchase_order.html new file mode 100644 index 0000000..4e57849 --- /dev/null +++ b/templates/add_purchase_order.html @@ -0,0 +1,147 @@ +{% extends 'base.html' %} +{% block content %} + + Manage Purchases + + + + +
+ + +
+ + + + + + + + + + + + +{% endblock %} diff --git a/templates/add_state.html b/templates/add_state.html index 11857c9..4e499c7 100644 --- a/templates/add_state.html +++ b/templates/add_state.html @@ -29,6 +29,9 @@

Display States

+ diff --git a/templates/add_subcontractor.html b/templates/add_subcontractor.html index 9932652..39d9213 100644 --- a/templates/add_subcontractor.html +++ b/templates/add_subcontractor.html @@ -49,10 +49,10 @@
-
+
-
+
@@ -112,11 +112,11 @@ {% endfor %} diff --git a/templates/add_work_order.html b/templates/add_work_order.html new file mode 100644 index 0000000..ad5ad38 --- /dev/null +++ b/templates/add_work_order.html @@ -0,0 +1,137 @@ +{% extends 'base.html' %} +{% block content %} + + Manage Work Order + + + + + + + +
+ + +
+ + + +{# display data #} +
State ID - - Delete - +{# #} +{# Delete#} +{# #}
+ + + + + + + + + + + {% for htd in wo %} + + + + + + + + + + + + + + + {% endfor %} +
ID + Vender Name +{# #} +{# ⬆️#} +{# ⬇️#} +{# #} + Work Order TypeWork Order AmountBOQ AmountWork Done PercentageUpdateDelete
{{ htd.work_order_id }}{{ htd['vendor_name'] }}{{ htd['work_order_type'] }}{{ htd['work_order_amount'] }}{{ htd['boq_amount'] }}{{ htd['work_done_percentage'] }}{{ htd['work_order_number'] }}{{ htd['gst_amount'] }}{{ htd['tds_amount'] }}{{ htd[''] }}Edit +
+ +
+
+ +
Back to Dashboard + + + + + + + +{% endblock %} \ No newline at end of file diff --git a/templates/edit_grn.html b/templates/edit_grn.html new file mode 100644 index 0000000..22f0200 --- /dev/null +++ b/templates/edit_grn.html @@ -0,0 +1,39 @@ + + +Edit GRN + + + +

Edit GRN

+
+ +

+ + +

+ + +

+ + +

+ + +

+ + +

+ + +

+ + +

+ + +

+ + +
+ + diff --git a/templates/edit_gst_release.html b/templates/edit_gst_release.html index b7a4787..0339311 100644 --- a/templates/edit_gst_release.html +++ b/templates/edit_gst_release.html @@ -21,14 +21,22 @@ required>

-
+


-
+


+
+

+ +
+

+ diff --git a/templates/edit_purchase.html b/templates/edit_purchase.html new file mode 100644 index 0000000..bfa090a --- /dev/null +++ b/templates/edit_purchase.html @@ -0,0 +1,47 @@ + + + + Edit Purchase + + + +

Edit Purchase Order

+
+ +

+ + +

+ + +

+ + +

+ + +

+ + +

+ + +

+ + +

+ + + +

+ + +

+ + +

+ + +
+ + diff --git a/templates/grn_form.html b/templates/grn_form.html new file mode 100644 index 0000000..eae3847 --- /dev/null +++ b/templates/grn_form.html @@ -0,0 +1,77 @@ + + + + GRN Management + + + +

Add GRN

+
+ +

+ + +

+{# #} +{# #} + + +

+ + +

+ + +

+ + +

+ + +

+ + +

+ + +

+ + +
+ +

All GRNs

+ + + + + + {% for grn in grns %} + + + + + + + + + + + + + + {% endfor %} +
IDDatePurchase IDSupplierItemQtyUnitRateAmountRemarksActions
{{ grn[0] }}{{ grn[1] }}{{ grn[2] }}{{ grn[3] }}{{ grn[4] }}{{ grn[5] }}{{ grn[6] }}{{ grn[7] }}{{ grn[8] }}{{ grn[9] }} + Edit + +
+ +
+
+ + diff --git a/templates/index.html b/templates/index.html index 880d02c..b6e633b 100644 --- a/templates/index.html +++ b/templates/index.html @@ -6,8 +6,31 @@ Payment Reconciliation + +
+ Logout +