#include "ticketswidget.h" #include "database.h" #include "mainwindow.h" #include #include #include #include TicketsWidget::TicketsWidget(QWidget* parent) : QWidget(parent) { auto* mainLayout = new QVBoxLayout(this); auto* title = new QLabel("Продажа билетов", this); title->setStyleSheet("font-size: 20px; font-weight: bold;"); mainLayout->addWidget(title); auto* sellGroup = new QGroupBox("Новый билет", this); auto* sellForm = new QFormLayout(sellGroup); m_routeCombo = new QComboBox(this); m_routeInfo = new QLabel("Выберите рейс", this); m_passengerName = new QLineEdit(this); m_passengerName->setPlaceholderText("Иванов Иван Иванович"); m_documentNumber = new QLineEdit(this); m_documentNumber->setPlaceholderText("Серия и номер паспорта"); m_seatCount = new QSpinBox(this); m_seatCount->setMinimum(1); m_seatCount->setMaximum(10); m_totalPrice = new QLabel("0.00 руб.", this); m_sellBtn = new QPushButton("Продать билет", this); sellForm->addRow("Рейс:", m_routeCombo); sellForm->addRow("", m_routeInfo); sellForm->addRow("ФИО пассажира:", m_passengerName); sellForm->addRow("Документ:", m_documentNumber); sellForm->addRow("Количество билетов:", m_seatCount); sellForm->addRow("Итого:", m_totalPrice); sellForm->addRow("", m_sellBtn); mainLayout->addWidget(sellGroup); connect(m_routeCombo, QOverload::of(&QComboBox::currentIndexChanged), this, &TicketsWidget::onRouteChanged); connect(m_seatCount, QOverload::of(&QSpinBox::valueChanged), this, &TicketsWidget::onRouteChanged); connect(m_sellBtn, &QPushButton::clicked, this, &TicketsWidget::onSellClicked); auto* ticketsLabel = new QLabel("Проданные билеты на выбранный рейс", this); ticketsLabel->setStyleSheet("font-weight: bold;"); mainLayout->addWidget(ticketsLabel); m_ticketsTable = new QTableWidget(this); m_ticketsTable->setColumnCount(6); m_ticketsTable->setHorizontalHeaderLabels({"ID", "Пассажир", "Документ", "Билетов", "Сумма", "Продано"}); m_ticketsTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); m_ticketsTable->setSelectionBehavior(QAbstractItemView::SelectRows); m_ticketsTable->setEditTriggers(QAbstractItemView::NoEditTriggers); mainLayout->addWidget(m_ticketsTable); refreshRoutes(); } void TicketsWidget::refreshRoutes() { m_routeCombo->clear(); QVector routes = Database::instance().getAllRoutes(); for (const auto& route : routes) { m_routeCombo->addItem(QString("%1 - %2").arg(route.routeName).arg(route.departureTime), route.id); } } void TicketsWidget::onRouteChanged(int index) { if (index < 0) return; int routeId = m_routeCombo->currentData().toInt(); Route route = Database::instance().getRoute(routeId); m_routeInfo->setText(QString("Цена: %1 руб. | Свободно: %2 мест") .arg(route.price, 0, 'f', 2) .arg(route.availableSeats)); m_seatCount->setMaximum(qMin(10, route.availableSeats)); double total = route.price * m_seatCount->value(); m_totalPrice->setText(QString("%1 руб.").arg(total, 0, 'f', 2)); QVector tickets = Database::instance().getTicketsByRoute(routeId); m_ticketsTable->setRowCount(tickets.size()); for (int i = 0; i < tickets.size(); ++i) { const Ticket& ticket = tickets[i]; m_ticketsTable->setItem(i, 0, new QTableWidgetItem(QString::number(ticket.id))); m_ticketsTable->setItem(i, 1, new QTableWidgetItem(ticket.passengerName)); m_ticketsTable->setItem(i, 2, new QTableWidgetItem(ticket.documentNumber)); m_ticketsTable->setItem(i, 3, new QTableWidgetItem(QString::number(ticket.seatCount))); m_ticketsTable->setItem(i, 4, new QTableWidgetItem(QString::number(ticket.totalPrice, 'f', 2))); m_ticketsTable->setItem(i, 5, new QTableWidgetItem(ticket.saleDate)); } } void TicketsWidget::onSellClicked() { int routeId = m_routeCombo->currentData().toInt(); Route route = Database::instance().getRoute(routeId); QString passengerName = m_passengerName->text().trimmed(); QString documentNumber = m_documentNumber->text().trimmed(); int seatCount = m_seatCount->value(); if (passengerName.isEmpty() || documentNumber.isEmpty()) { QMessageBox::warning(this, "Ошибка", "Заполните все поля!"); return; } if (seatCount > route.availableSeats) { QMessageBox::warning(this, "Ошибка", QString("Недостаточно мест! Доступно: %1").arg(route.availableSeats)); return; } MainWindow* mainWin = qobject_cast(window()); int sellerId = mainWin ? mainWin->currentUserId() : 1; if (Database::instance().addTicket(routeId, passengerName, documentNumber, seatCount, sellerId)) { QMessageBox::information(this, "Успех", QString("Продано %1 билет(а) на сумму %2 руб.") .arg(seatCount) .arg(route.price * seatCount, 0, 'f', 2)); m_passengerName->clear(); m_documentNumber->clear(); m_seatCount->setValue(1); refreshRoutes(); onRouteChanged(m_routeCombo->currentIndex()); } else { QMessageBox::critical(this, "Ошибка", "Не удалось продать билет!"); } }