Muhammet Enes Nas
importSpace
bb47e01
Raw
History Blame Contribute Delete
5.71 kB
"""
Eczane Sipariş Asistanı — Veritabanı Katmanı
SQLite bağlantı yönetimi, şema oluşturma ve CRUD fonksiyonları.
"""
import sqlite3
import os
from contextlib import contextmanager
DB_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), "pharmacy.db")
def get_connection() -> sqlite3.Connection:
conn = sqlite3.connect(DB_PATH)
conn.row_factory = sqlite3.Row
conn.execute("PRAGMA journal_mode=WAL")
conn.execute("PRAGMA foreign_keys=ON")
return conn
@contextmanager
def get_db():
conn = get_connection()
try:
yield conn
conn.commit()
except Exception:
conn.rollback()
raise
finally:
conn.close()
def init_db():
with get_db() as conn:
conn.executescript("""
CREATE TABLE IF NOT EXISTS drugs (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT UNIQUE NOT NULL,
display_name TEXT,
stock INTEGER NOT NULL DEFAULT 0,
price REAL,
prospektus_summary TEXT,
source TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS orders (
id INTEGER PRIMARY KEY AUTOINCREMENT,
drug_id INTEGER REFERENCES drugs(id),
drug_name TEXT,
quantity INTEGER NOT NULL,
status TEXT DEFAULT 'Hazırlanıyor',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
""")
def find_drug(name: str) -> dict | None:
normalized = " ".join(name.strip().lower().split())
with get_db() as conn:
row = conn.execute(
"SELECT * FROM drugs WHERE LOWER(REPLACE(name, ' ', '')) = LOWER(REPLACE(?, ' ', ''))",
(normalized,),
).fetchone()
if row:
return dict(row)
return None
def insert_drug(
name: str,
display_name: str,
stock: int = 0,
price: float | None = None,
prospektus_summary: str | None = None,
source: str = "seed",
) -> int:
normalized = " ".join(name.strip().lower().split())
with get_db() as conn:
cur = conn.execute(
"""INSERT INTO drugs (name, display_name, stock, price, prospektus_summary, source)
VALUES (?, ?, ?, ?, ?, ?)""",
(normalized, display_name, stock, price, prospektus_summary, source),
)
return cur.lastrowid
def update_drug_prospektus(drug_id: int, summary: str, source: str = "fetched"):
with get_db() as conn:
conn.execute(
"UPDATE drugs SET prospektus_summary = ?, source = ? WHERE id = ?",
(summary, source, drug_id),
)
def search_drugs_by_keyword(keyword: str) -> list[dict]:
term = keyword.strip().lower()
stop_words = {"ilaci", "ilaç", "ilacı", "onerisi", "önerisi", "icin", "için", "ne", "var", "mi", "mı", "tavsiye", "iyi", "gelen", "gelir"}
words = [w for w in term.split() if w not in stop_words and len(w) > 2]
with get_db() as conn:
results = []
seen_ids = set()
full_pattern = f"%{term}%"
rows = conn.execute(
"""SELECT id, name, display_name, stock, price, prospektus_summary, source
FROM drugs
WHERE LOWER(prospektus_summary) LIKE ? OR LOWER(display_name) LIKE ? OR LOWER(name) LIKE ?""",
(full_pattern, full_pattern, full_pattern),
).fetchall()
for r in rows:
d = dict(r)
if d["id"] not in seen_ids:
seen_ids.add(d["id"])
results.append(d)
if results:
return results
for word in words:
pattern = f"%{word}%"
rows = conn.execute(
"""SELECT id, name, display_name, stock, price, prospektus_summary, source
FROM drugs
WHERE LOWER(prospektus_summary) LIKE ? OR LOWER(display_name) LIKE ? OR LOWER(name) LIKE ?""",
(pattern, pattern, pattern),
).fetchall()
for r in rows:
d = dict(r)
if d["id"] not in seen_ids:
seen_ids.add(d["id"])
results.append(d)
return results
def list_drugs() -> list[dict]:
with get_db() as conn:
rows = conn.execute(
"SELECT display_name, stock, price FROM drugs ORDER BY display_name"
).fetchall()
return [dict(r) for r in rows]
def create_order_record(drug_id: int, drug_name: str, quantity: int) -> dict | None:
with get_db() as conn:
cur = conn.execute(
"UPDATE drugs SET stock = stock - ? WHERE id = ? AND stock >= ?",
(quantity, drug_id, quantity),
)
if cur.rowcount == 0:
return None
cur = conn.execute(
"""INSERT INTO orders (drug_id, drug_name, quantity, status)
VALUES (?, ?, ?, 'Hazırlanıyor')""",
(drug_id, drug_name, quantity),
)
order_id = cur.lastrowid
return {
"order_id": order_id,
"drug_name": drug_name,
"quantity": quantity,
"status": "Hazırlanıyor",
}
def find_order(order_id: int) -> dict | None:
with get_db() as conn:
row = conn.execute(
"SELECT id AS order_id, drug_name, quantity, status, created_at FROM orders WHERE id = ?",
(order_id,),
).fetchone()
if row:
return dict(row)
return None