Files
StationManager/ticketswidget.cpp
2026-04-05 16:14:54 +03:00

137 lines
5.7 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "ticketswidget.h"
#include "database.h"
#include "mainwindow.h"
#include <QTableWidget>
#include <QHeaderView>
#include <QMessageBox>
#include <QGroupBox>
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<int>::of(&QComboBox::currentIndexChanged),
this, &TicketsWidget::onRouteChanged);
connect(m_seatCount, QOverload<int>::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<Route> 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<Ticket> 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<MainWindow*>(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, "Ошибка", "Не удалось продать билет!");
}
}