186 lines
7.6 KiB
Python
186 lines
7.6 KiB
Python
# gui/partner_form.py
|
||
"""
|
||
Форма для добавления/редактирования партнера
|
||
Соответствует модулю 3 ТЗ
|
||
"""
|
||
from PyQt6.QtWidgets import (QDialog, QVBoxLayout, QHBoxLayout, QLabel,
|
||
QLineEdit, QComboBox, QPushButton, QMessageBox,
|
||
QFormLayout, QSpinBox)
|
||
from PyQt6.QtCore import pyqtSignal
|
||
import requests
|
||
|
||
class PartnerForm(QDialog):
|
||
partner_saved = pyqtSignal()
|
||
|
||
def __init__(self, parent=None, partner_data=None):
|
||
super().__init__(parent)
|
||
self.partner_data = partner_data
|
||
self.setup_ui()
|
||
|
||
def setup_ui(self):
|
||
self.setWindowTitle("Добавить партнера" if not self.partner_data else "Редактировать партнера")
|
||
self.setModal(True)
|
||
self.resize(500, 400)
|
||
|
||
layout = QVBoxLayout()
|
||
|
||
# Форма ввода данных
|
||
form_layout = QFormLayout()
|
||
|
||
self.company_name = QLineEdit()
|
||
self.company_name.setPlaceholderText("Введите наименование компании")
|
||
form_layout.addRow("Наименование компании*:", self.company_name)
|
||
|
||
self.inn = QLineEdit()
|
||
self.inn.setPlaceholderText("Введите ИНН")
|
||
form_layout.addRow("ИНН*:", self.inn)
|
||
|
||
self.partner_type = QComboBox()
|
||
self.partner_type.addItems(["", "distributor", "retail", "wholesale", "dealer"])
|
||
self.partner_type.setPlaceholderText("Выберите тип партнера")
|
||
form_layout.addRow("Тип партнера:", self.partner_type)
|
||
|
||
self.rating = QSpinBox()
|
||
self.rating.setRange(0, 100)
|
||
self.rating.setSuffix("%")
|
||
form_layout.addRow("Рейтинг:", self.rating)
|
||
|
||
self.legal_address = QLineEdit()
|
||
self.legal_address.setPlaceholderText("Введите юридический адрес")
|
||
form_layout.addRow("Юридический адрес:", self.legal_address)
|
||
|
||
self.director_name = QLineEdit()
|
||
self.director_name.setPlaceholderText("Введите ФИО директора")
|
||
form_layout.addRow("ФИО директора:", self.director_name)
|
||
|
||
self.phone = QLineEdit()
|
||
self.phone.setPlaceholderText("+7XXXXXXXXXX")
|
||
form_layout.addRow("Телефон:", self.phone)
|
||
|
||
self.email = QLineEdit()
|
||
self.email.setPlaceholderText("email@example.com")
|
||
form_layout.addRow("Email:", self.email)
|
||
|
||
self.sales_locations = QLineEdit()
|
||
self.sales_locations.setPlaceholderText("Москва, Санкт-Петербург...")
|
||
form_layout.addRow("Регионы продаж:", self.sales_locations)
|
||
|
||
layout.addLayout(form_layout)
|
||
|
||
# Кнопки
|
||
buttons_layout = QHBoxLayout()
|
||
|
||
self.save_button = QPushButton("Сохранить")
|
||
self.save_button.clicked.connect(self.save_partner)
|
||
self.save_button.setStyleSheet("""
|
||
QPushButton {
|
||
background-color: #28a745;
|
||
color: white;
|
||
border: none;
|
||
padding: 8px 16px;
|
||
border-radius: 4px;
|
||
font-weight: bold;
|
||
}
|
||
QPushButton:hover {
|
||
background-color: #218838;
|
||
}
|
||
""")
|
||
|
||
self.cancel_button = QPushButton("Отмена")
|
||
self.cancel_button.clicked.connect(self.reject)
|
||
|
||
buttons_layout.addWidget(self.save_button)
|
||
buttons_layout.addWidget(self.cancel_button)
|
||
buttons_layout.addStretch()
|
||
|
||
layout.addLayout(buttons_layout)
|
||
|
||
self.setLayout(layout)
|
||
|
||
# Если редактирование, заполняем форму
|
||
if self.partner_data:
|
||
self.fill_form()
|
||
|
||
# gui/partner_form.py (исправленный метод fill_form)
|
||
def fill_form(self):
|
||
"""Заполнение формы данными партнера"""
|
||
data = self.partner_data
|
||
self.company_name.setText(data.get('company_name', ''))
|
||
self.inn.setText(data.get('inn', ''))
|
||
|
||
partner_type = data.get('partner_type', '')
|
||
if partner_type:
|
||
index = self.partner_type.findText(partner_type)
|
||
if index >= 0:
|
||
self.partner_type.setCurrentIndex(index)
|
||
|
||
# Безопасное преобразование рейтинга к int
|
||
rating = data.get('rating', 0)
|
||
if isinstance(rating, float):
|
||
rating = int(rating)
|
||
self.rating.setValue(rating)
|
||
|
||
self.legal_address.setText(data.get('legal_address', ''))
|
||
self.director_name.setText(data.get('director_name', ''))
|
||
self.phone.setText(data.get('phone', ''))
|
||
self.email.setText(data.get('email', ''))
|
||
self.sales_locations.setText(data.get('sales_locations', ''))
|
||
|
||
def validate_form(self):
|
||
"""Валидация данных формы"""
|
||
errors = []
|
||
|
||
if not self.company_name.text().strip():
|
||
errors.append("Наименование компании обязательно")
|
||
|
||
if not self.inn.text().strip():
|
||
errors.append("ИНН обязателен")
|
||
|
||
if self.phone.text() and not self.phone.text().startswith('+'):
|
||
errors.append("Телефон должен начинаться с '+'")
|
||
|
||
return errors
|
||
|
||
def save_partner(self):
|
||
"""Сохранение партнера"""
|
||
errors = self.validate_form()
|
||
if errors:
|
||
QMessageBox.warning(self, "Ошибка валидации", "\n".join(errors))
|
||
return
|
||
|
||
partner_data = {
|
||
'company_name': self.company_name.text().strip(),
|
||
'inn': self.inn.text().strip(),
|
||
'partner_type': self.partner_type.currentText() or None,
|
||
'rating': self.rating.value(),
|
||
'legal_address': self.legal_address.text().strip() or None,
|
||
'director_name': self.director_name.text().strip() or None,
|
||
'phone': self.phone.text().strip() or None,
|
||
'email': self.email.text().strip() or None,
|
||
'sales_locations': self.sales_locations.text().strip() or None
|
||
}
|
||
|
||
try:
|
||
if self.partner_data:
|
||
# Обновление существующего партнера
|
||
response = requests.put(
|
||
f"http://localhost:8000/api/v1/partners/{self.partner_data['partner_id']}",
|
||
json=partner_data
|
||
)
|
||
else:
|
||
# Создание нового партнера
|
||
response = requests.post(
|
||
"http://localhost:8000/api/v1/partners",
|
||
json=partner_data
|
||
)
|
||
|
||
if response.status_code == 200:
|
||
self.partner_saved.emit()
|
||
QMessageBox.information(self, "Успех", "Партнер успешно сохранен")
|
||
self.accept()
|
||
else:
|
||
error_msg = response.json().get('detail', 'Неизвестная ошибка')
|
||
QMessageBox.warning(self, "Ошибка", f"Не удалось сохранить партнера: {error_msg}")
|
||
|
||
except Exception as e:
|
||
QMessageBox.critical(self, "Ошибка", f"Ошибка подключения: {str(e)}")
|