master-floor/ressult/gui/partner_form.py.bak
2025-11-26 19:31:33 +03:00

186 lines
7.6 KiB
Python
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.

# 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)}")