Spaces:
Running
Running
File size: 6,230 Bytes
0a7a9c8 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 | 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 |