Загрузка данных


from PyQt6 import QtCore, QtGui, QtWidgets
from PyQt6.QtCore import Qt
from PyQt6.QtGui import QStandardItemModel, QStandardItem

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(800, 500)
        palette = QtGui.QPalette()
        brush = QtGui.QBrush(QtGui.QColor(255, 201, 6))
        brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern)
        palette.setBrush(QtGui.QPalette.ColorGroup.Active, QtGui.QPalette.ColorRole.WindowText, brush)
        brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
        brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern)
        palette.setBrush(QtGui.QPalette.ColorGroup.Active, QtGui.QPalette.ColorRole.Base, brush)
        brush = QtGui.QBrush(QtGui.QColor(37, 150, 37))
        brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern)
        palette.setBrush(QtGui.QPalette.ColorGroup.Active, QtGui.QPalette.ColorRole.Window, brush)
        Form.setPalette(palette)
        font = QtGui.QFont()
        font.setPointSize(12)
        Form.setFont(font)
        self.tableView = QtWidgets.QTableView(parent=Form)
        self.tableView.setGeometry(QtCore.QRect(30, 80, 740, 380)) 
        self.tableView.setObjectName("tableView")
        self.label = QtWidgets.QLabel(parent=Form)
        self.label.setGeometry(QtCore.QRect(30, 30, 740, 41)) 
        font = QtGui.QFont()
        font.setPointSize(14)  
        font.setBold(True)  
        self.label.setFont(font)
        self.label.setObjectName("label")

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Топливо, проданное вам"))
        self.label.setText(_translate("Form", "ТОПЛИВО ПРОДАННОЕ ВАМ"))


class ToplivoWindow(QtWidgets.QWidget):
    def __init__(self, user_data, db_connection):
        super().__init__()
        self.user_data = user_data  # (user_id, login, client_card)
        self.db = db_connection
        self.ui = Ui_Form()
        self.ui.setupUi(self)
        self.resize(850, 550)
        
        # Получаем ФИО клиента и обновляем заголовок
        client_fio = self.get_client_fio()
        if client_fio:
            self.setWindowTitle(f"История покупок топлива - {client_fio}")
        else:
            self.setWindowTitle("История покупок топлива")
        
        self.setup_table()
        self.load_data()
    
    def setup_table(self):
        self.model = QStandardItemModel()
        self.ui.tableView.setModel(self.model)

        self.ui.tableView.setAlternatingRowColors(True)
        self.ui.tableView.setStyleSheet("""
            QTableView {
                gridline-color: #ccc;
                font-size: 12px;
            }
            QTableView::item:selected {
                background-color: #4CAF50;
                color: white;
            }
            QHeaderView::section {
                background-color: #2c3e50;
                color: white;
                padding: 8px;
                font-weight: bold;
                font-size: 12px;
            }
        """)

        self.ui.tableView.horizontalHeader().setStretchLastSection(True)
    
    def get_client_fio(self):
        """Получить ФИО клиента"""
        try:
            _, _, client_card = self.user_data
            
            if not client_card or not self.db:
                return None
            
            # Запрашиваем ФИО из базы данных
            query = "SELECT name, lastname, otchestvo FROM client WHERE client_card = %s"
            self.db.cur.execute(query, (client_card,))
            result = self.db.cur.fetchone()
            
            if result:
                name, lastname, otchestvo = result
                # Формируем ФИО: Иванов Иван Иванович
                fio = f"{lastname} {name} {otchestvo}".strip()
                return fio
            return None
        except Exception as e:
            print(f"Ошибка при получении ФИО: {e}")
            return None
    
    def load_data(self):
        try:
            _, _, client_card = self.user_data
            
            if not client_card:
                self.show_error("У вас нет привязанной клиентской карты")
                return
            
            if not self.db or not self.db.con:
                self.show_error("Нет подключения к базе данных")
                return
            
            # Получаем ФИО клиента
            client_fio = self.get_client_fio()
            fio_text = f" {client_fio}" if client_fio else ""
            
            query = """
                SELECT 
                    TO_CHAR(p.data_p, 'DD.MM.YYYY') as "Дата",
                    t.vid as "Вид топлива",
                    p.kolvo::text as "Количество",
                    t.ed_izmer as "Ед. изм.",
                    (p.kolvo * t.cena)::text as "Сумма",
                    f.name as "Компания",
                    z.adres as "Адрес АЗС"
                FROM prodaja p
                JOIN toplivo t ON p.id_t = t.id_toplivo
                JOIN zapravka z ON p.id_a = z.id
                JOIN firm f ON z.name_firm = f.id_firm
                WHERE p.id_c = %s
                ORDER BY p.data_p DESC
            """
            
            self.db.cur.execute(query, (client_card,))
            data = self.db.cur.fetchall()
            
            if not data:
                self.show_error(f"У{fio_text} пока нет покупок топлива")
                return

            headers = ["Дата", "Вид топлива", "Количество", "Ед. изм.", "Сумма (руб)", "Компания", "Адрес АЗС"]
            self.model.setHorizontalHeaderLabels(headers)
            
            total_sum = 0
            for row, record in enumerate(data):
                for col, value in enumerate(record):
                    item = QStandardItem(str(value))
                    item.setTextAlignment(Qt.AlignmentFlag.AlignCenter)
                    self.model.setItem(row, col, item)
                    if col == 4:  # Столбец суммы
                        try:
                            total_sum += float(value)
                        except:
                            pass
            
            self.ui.tableView.resizeColumnsToContents()
            # Обновляем заголовок с ФИО
            self.ui.label.setText(f"ТОПЛИВО, ПРОДАННОЕ{fio_text} | Общая сумма: {total_sum:.2f} руб")
            
        except Exception as e:
            print(f"Ошибка загрузки данных: {e}")
            import traceback
            traceback.print_exc()
            self.show_error(f"Ошибка загрузки: {str(e)}")
    
    def show_error(self, message):
        """Показывает сообщение об ошибке в таблице"""
        self.model.clear()
        self.model.setHorizontalHeaderLabels(["Сообщение"])
        item = QStandardItem(message)
        item.setTextAlignment(Qt.AlignmentFlag.AlignCenter)
        self.model.setItem(0, 0, item)
        self.ui.label.setText("ОШИБКА")