db.py 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. import psycopg2
  2. from config import DB_HOST, DB_PORT, DB_NAME
  3. class Database:
  4. def __init__(self):
  5. self.conn = None
  6. def connect(self, username, password):
  7. self.conn = psycopg2.connect(
  8. host=DB_HOST,
  9. port=DB_PORT,
  10. dbname=DB_NAME,
  11. user=username,
  12. password=password
  13. )
  14. return self.conn
  15. def execute(self, query, params=None, fetch=False):
  16. try:
  17. with self.conn.cursor() as cur:
  18. cur.execute(query, params)
  19. if fetch:
  20. return cur.fetchall()
  21. self.conn.commit()
  22. return True
  23. except Exception as e:
  24. self.conn.rollback()
  25. raise e
  26. # Отделы
  27. def get_departments(self):
  28. return self.execute(
  29. "SELECT department_id, head_last_name, head_first_name, head_middle_name, email, details "
  30. "FROM accounting_department ORDER BY department_id", fetch=True
  31. )
  32. def get_departments_list(self):
  33. rows = self.execute(
  34. "SELECT department_id, head_last_name, head_first_name FROM accounting_department ORDER BY department_id",
  35. fetch=True
  36. )
  37. return [(row[0], f"{row[0]}: {row[1]} {row[2]}") for row in rows]
  38. # Пользователи
  39. def _get_next_user_id(self):
  40. rows = self.execute("SELECT user_id FROM users ORDER BY user_id", fetch=True)
  41. existing = {row[0] for row in rows}
  42. next_id = 1
  43. while next_id in existing:
  44. next_id += 1
  45. return next_id
  46. def get_users(self):
  47. return self.execute(
  48. "SELECT user_id, last_name, first_name, middle_name, birth_date, phone "
  49. "FROM users ORDER BY user_id", fetch=True
  50. )
  51. def get_users_list(self):
  52. rows = self.execute(
  53. "SELECT user_id, last_name, first_name FROM users ORDER BY user_id",
  54. fetch=True
  55. )
  56. return [(row[0], f"{row[0]}: {row[1]} {row[2]}") for row in rows]
  57. def add_user(self, last_name, first_name, middle_name, birth_date, phone):
  58. new_id = self._get_next_user_id()
  59. self.execute(
  60. "INSERT INTO users (user_id, last_name, first_name, middle_name, birth_date, phone) "
  61. "VALUES (%s, %s, %s, %s, %s, %s)",
  62. (new_id, last_name, first_name, middle_name, birth_date, phone)
  63. )
  64. def update_user(self, user_id, last_name, first_name, middle_name, birth_date, phone):
  65. self.execute(
  66. "UPDATE users SET last_name=%s, first_name=%s, middle_name=%s, birth_date=%s, phone=%s "
  67. "WHERE user_id=%s",
  68. (last_name, first_name, middle_name, birth_date, phone, user_id)
  69. )
  70. def delete_user(self, user_id):
  71. self.execute("DELETE FROM users WHERE user_id=%s", (user_id,))
  72. # Билеты (представление tickets_full_price)
  73. def _get_next_ticket_id(self):
  74. rows = self.execute("SELECT ticket_id FROM tickets ORDER BY ticket_id", fetch=True)
  75. existing = {row[0] for row in rows}
  76. next_id = 1
  77. while next_id in existing:
  78. next_id += 1
  79. return next_id
  80. def get_tickets(self):
  81. return self.execute(
  82. "SELECT ticket_id, department_id, user_id, performance_name, ticket_price, hall_seat, event_datetime, full_price "
  83. "FROM tickets_full_price ORDER BY ticket_id", fetch=True
  84. )
  85. def add_ticket(self, department_id, user_id, performance_name, ticket_price, hall_seat, event_datetime):
  86. new_id = self._get_next_ticket_id()
  87. self.execute(
  88. "INSERT INTO tickets (ticket_id, department_id, user_id, performance_name, ticket_price, hall_seat, event_datetime) "
  89. "VALUES (%s, %s, %s, %s, %s, %s, %s)",
  90. (new_id, department_id, user_id, performance_name, ticket_price, hall_seat, event_datetime)
  91. )
  92. def update_ticket(self, ticket_id, department_id, user_id, performance_name, ticket_price, hall_seat, event_datetime):
  93. self.execute(
  94. "UPDATE tickets SET department_id=%s, user_id=%s, performance_name=%s, ticket_price=%s, hall_seat=%s, event_datetime=%s "
  95. "WHERE ticket_id=%s",
  96. (department_id, user_id, performance_name, ticket_price, hall_seat, event_datetime, ticket_id)
  97. )
  98. def delete_ticket(self, ticket_id):
  99. self.execute("DELETE FROM tickets WHERE ticket_id=%s", (ticket_id,))
  100. # Поиск
  101. def search_tickets(self, last_name=None, performance=None):
  102. sql = """
  103. SELECT t.ticket_id, u.last_name, u.first_name, t.performance_name,
  104. t.ticket_price, t.hall_seat, t.event_datetime,
  105. ROUND(t.ticket_price * 1.10, 2) AS full_price
  106. FROM tickets t
  107. JOIN users u ON t.user_id = u.user_id
  108. WHERE 1=1
  109. """
  110. params = []
  111. if last_name:
  112. sql += " AND u.last_name ILIKE %s"
  113. params.append(f"%{last_name}%")
  114. if performance:
  115. sql += " AND t.performance_name ILIKE %s"
  116. params.append(f"%{performance}%")
  117. sql += " ORDER BY t.event_datetime"
  118. return self.execute(sql, params, fetch=True)
  119. # Отчёт
  120. def revenue_by_performance(self, performance_name):
  121. result = self.execute("SELECT get_revenue(%s)", (performance_name,), fetch=True)
  122. return result[0][0] if result else 0