import sqlite3 import datetime import os DB_NAME = "guarantee_manager.db" def get_db_connection(): conn = sqlite3.connect(DB_NAME) conn.row_factory = sqlite3.Row return conn def init_db(): conn = get_db_connection() c = conn.cursor() # جدول کاربران (برای لاگین ساده) c.execute(''' CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT UNIQUE NOT NULL, password TEXT NOT NULL ) ''') # جدول پیمانکاران c.execute(''' CREATE TABLE IF NOT EXISTS contractors ( id INTEGER PRIMARY KEY AUTOINCREMENT, company_name TEXT NOT NULL, national_id TEXT, phone TEXT, address TEXT ) ''') # جدول ضمانت‌نامه‌ها c.execute(''' CREATE TABLE IF NOT EXISTS guarantees ( id INTEGER PRIMARY KEY AUTOINCREMENT, guarantee_number TEXT UNIQUE NOT NULL, type TEXT NOT NULL, bank_name TEXT NOT NULL, branch_name TEXT, amount REAL NOT NULL, issue_date TEXT NOT NULL, due_date TEXT NOT NULL, status TEXT NOT NULL, contractor_id INTEGER, contract_info TEXT, description TEXT, file_path TEXT, FOREIGN KEY (contractor_id) REFERENCES contractors (id) ) ''') # ایجاد کاربر پیش‌فرض اگر وجود ندارد (admin/admin) # در نسخه واقعی باید پسورد هش شود c.execute("SELECT * FROM users WHERE username = 'admin'") if not c.fetchone(): c.execute("INSERT INTO users (username, password) VALUES ('admin', 'admin')") conn.commit() conn.close() # --- توابع پیمانکاران --- def add_contractor(name, nid, phone, address): conn = get_db_connection() try: conn.execute("INSERT INTO contractors (company_name, national_id, phone, address) VALUES (?, ?, ?, ?)", (name, nid, phone, address)) conn.commit() return True, "پیمانکار با موفقیت افزوده شد." except Exception as e: return False, str(e) finally: conn.close() def get_contractors_list(): conn = get_db_connection() rows = conn.execute("SELECT id, company_name FROM contractors").fetchall() conn.close() return [(r["company_name"], r["id"]) for r in rows] def get_all_contractors_df(): conn = get_db_connection() rows = conn.execute("SELECT id, company_name, national_id, phone, address FROM contractors").fetchall() conn.close() return [list(r) for r in rows] # --- توابع ضمانت‌نامه‌ها --- def add_guarantee(g_num, g_type, bank, branch, amount, i_date, d_date, status, c_id, c_info, desc, f_path): conn = get_db_connection() try: conn.execute(''' INSERT INTO guarantees (guarantee_number, type, bank_name, branch_name, amount, issue_date, due_date, status, contractor_id, contract_info, description, file_path) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ''', (g_num, g_type, bank, branch, amount, i_date, d_date, status, c_id, c_info, desc, f_path)) conn.commit() return True, "ضمانت‌نامه ذخیره شد." except sqlite3.IntegrityError: return False, "شماره ضمانت‌نامه تکراری است." except Exception as e: return False, str(e) finally: conn.close() def search_guarantees(search_query="", status_filter=None): conn = get_db_connection() query = ''' SELECT g.id, g.guarantee_number, g.type, g.bank_name, g.amount, g.due_date, g.status, c.company_name, g.contract_info FROM guarantees g LEFT JOIN contractors c ON g.contractor_id = c.id WHERE 1=1 ''' params = [] if status_filter and status_filter != "همه": query += " AND g.status = ?" params.append(status_filter) if search_query: query += " AND (g.guarantee_number LIKE ? OR c.company_name LIKE ? OR g.bank_name LIKE ?)" params.append(f"%{search_query}%") params.append(f"%{search_query}%") params.append(f"%{search_query}%") rows = conn.execute(query, params).fetchall() conn.close() return [list(r) for r in rows] def get_alerts(days_threshold=30): conn = get_db_connection() today = datetime.date.today() target_date = today + datetime.timedelta(days=days_threshold) # تبدیل تاریخ‌ها برای مقایسه رشته‌ای (فرض بر فرمت YYYY-MM-DD) today_str = today.strftime("%Y-%m-%d") target_str = target_date.strftime("%Y-%m-%d") query = ''' SELECT g.guarantee_number, g.bank_name, g.due_date, c.company_name, g.amount FROM guarantees g LEFT JOIN contractors c ON g.contractor_id = c.id WHERE g.status = 'فعال' AND g.due_date <= ? AND g.due_date >= ? ORDER BY g.due_date ASC ''' rows = conn.execute(query, (target_str, today_str)).fetchall() conn.close() return [list(r) for r in rows] def get_stats(): conn = get_db_connection() total_active = conn.execute("SELECT COUNT(*), SUM(amount) FROM guarantees WHERE status='فعال'").fetchone() total_expired = conn.execute("SELECT COUNT(*) FROM guarantees WHERE status='فعال' AND due_date < date('now')").fetchone() total_released = conn.execute("SELECT COUNT(*) FROM guarantees WHERE status='آزاد شده'").fetchone() conn.close() count = total_active[0] if total_active[0] else 0 amount = total_active[1] if total_active[1] else 0 expired = total_expired[0] if total_expired[0] else 0 released = total_released[0] if total_released[0] else 0 return count, amount, expired, released def check_auth(username, password): conn = get_db_connection() user = conn.execute("SELECT * FROM users WHERE username = ? AND password = ?", (username, password)).fetchone() conn.close() return user is not None