ChangePercenty2/ui/business_set.py

516 lines
24 KiB
Python

from PyQt5.QtWidgets import (QWidget, QVBoxLayout, QHBoxLayout, QGridLayout, QLabel, QLineEdit,
QPushButton, QTabWidget, QCheckBox, QFrame, QDialog, QDialogButtonBox,
QFontDialog, QMenuBar, QAction, QMessageBox, QToolBar, QFileDialog, QInputDialog)
from PyQt5.QtCore import Qt
from PyQt5.Qsci import QsciScintilla, QsciLexerPython
from qfluentwidgets import CalendarPicker, PrimaryPushButton
from qfluentwidgets import FluentIcon as FIF
class BusinessSettings(QDialog):
def __init__(self, current_api_keys, config_manager, max_business_count=5, parent=None):
super().__init__(parent)
self.setMinimumSize(900, 900) # 설정된 최소 크기
self.setWindowTitle("상세 사업자 설정")
self.config_manager = config_manager
self.max_business_count = max_business_count
self.etc_number = 5
self.current_api_keys = current_api_keys
self.business_info = [{} for _ in range(max_business_count)]
self.market_info = [{} for _ in range(max_business_count)]
# self.selected_markets = {market: True for market in ["쿠팡", "스마트스토어", "ESM", "11번가-국내", "11번가-글로벌", "롯데온", "인터파크", "위메프", "옥션1.0"]}
self.selected_markets = {market: True for market in self.config_manager.valid_markets}
self.tab_layouts = []
self.business_info_layouts = []
self.market_info_widgets = []
self.alias_edits = []
self.reg_number_edits = []
self.name_edits = []
self.reg_date_edits = []
self.phone_edits = []
self.etc_titles = [[] for _ in range(max_business_count)]
self.etc_contexts = [[] for _ in range(max_business_count)]
self.market_checkboxes = [{} for _ in range(max_business_count)]
self.market_tabs = [[] for _ in range(max_business_count)]
self.initUI()
self.changeButton_Text()
self.load_business_info() # Load business info on initialization
def initUI(self):
self.setLayout(QVBoxLayout())
# 상단 버튼 레이아웃
top_layout = QHBoxLayout()
top_frame = QFrame(self)
top_frame.setLayout(top_layout)
top_frame.setFrameShape(QFrame.StyledPanel)
top_frame.setFixedHeight(int(self.height() * 0.1))
self.save_button = QPushButton("저장")
self.save_button.clicked.connect(self.save_business_info) # Connect save button to method
self.refersh_button = QPushButton("새로고침")
self.refersh_button.clicked.connect(lambda: self.load_business_info())
self.cancel_button = QPushButton("취소")
self.cancel_button.clicked.connect(lambda: self.reject())
self.setup_market_button = QPushButton("설정마켓")
self.setup_market_button.clicked.connect(self.show_market_setup)
top_layout.addWidget(self.save_button)
top_layout.addWidget(self.refersh_button)
top_layout.addWidget(self.cancel_button)
top_layout.addWidget(self.setup_market_button)
self.layout().addWidget(top_frame)
# QTabWidget 설정
# 내용 레이아웃
self.tab_widget = QTabWidget()
self.tab_widget.setTabsClosable(False)
self.layout().addWidget(self.tab_widget)
for i in range(self.max_business_count):
tab = QWidget()
self.tab_layouts.append(QVBoxLayout())
self.business_info_layouts.append(self.create_business_info_layout(i))
self.market_info_widgets.append(self.create_market_info_widget(i))
print(f"객체접근 테스트 Init: {self.alias_edits[0].text()}")
self.tab_layouts[i].addLayout(self.business_info_layouts[i])
self.tab_layouts[i].addWidget(self.market_info_widgets[i])
tab.setLayout(self.tab_layouts[i])
self.tab_layouts[i].setStretch(0, 3)
self.tab_layouts[i].setStretch(1, 2)
self.tab_widget.addTab(tab, f"{i + 1}사업자")
self.tab_widget.currentChanged.connect(self.update_tab_styles)
self.tab_widget.currentChanged.connect(self.changeButton_Text)
self.update_tab_styles()
def load_business_info(self):
# print(f"객체접근 테스트 : {self.alias_edits[0].text()}")
for i in range(self.max_business_count):
section = f"BUSINESS_{i+1}"
business_info = self.config_manager.get_business_info(section)
self.business_info[i] = {
"사업자별칭": business_info.get("사업자별칭", ""),
"사업자등록번호": business_info.get("사업자등록번호", ""),
"상호명": business_info.get("상호명", ""),
"등록날짜": business_info.get("등록날짜", ""),
"응대전화번호": business_info.get("응대전화번호", "")
}
for j in range(self.etc_number):
title_key = f"기타정보Title{j+1}"
context_key = f"기타정보Context{j+1}"
self.business_info[i][title_key] = self.config_manager.get(section, title_key, fallback="")
self.business_info[i][context_key] = self.config_manager.get(section, context_key, fallback="")
# 마켓 정보 불러오기
api_keys = self.config_manager.get_api_keys(section)
for market, fields in self.market_info[i].items():
for label in fields.keys():
key = label.replace(' ', '_')
# print(f"market : {market}")
# print(f"fields : {fields}")
# print(f"key : {key}")
# print(f"label : {label}")
# print(f"api_keys[market][key] : {api_keys.get(market, {}).get(key, '')}")
fields[label].setText(api_keys.get(market, {}).get(key, ''))
self.selected_markets[i] = self.config_manager.get_active_markets(i + 1)
if not self.selected_markets[i]: # 활성화된 마켓 정보가 없을 경우
self.selected_markets[i] = {market: True for market in self.config_manager.valid_markets}
self.update_widgets(i)
def update_widgets(self, index):
business = self.business_info[index]
self.alias_edits[index].setText(business.get("사업자별칭", ""))
self.reg_number_edits[index].setText(business.get("사업자등록번호", ""))
self.name_edits[index].setText(business.get("상호명", ""))
self.reg_date_edits[index].setText(business.get("등록날짜", ""))
self.phone_edits[index].setText(business.get("응대전화번호", ""))
for j in range(self.etc_number):
# self.etc_titles[index][j].setText(business.get(f"etc{j+1}_title", ""))
# self.etc_contexts[index][j].setText(business.get(f"etc{j+1}_context", ""))
self.etc_titles[index][j].setText(business.get(f"기타정보Title{j+1}", ""))
self.etc_contexts[index][j].setText(business.get(f"기타정보Context{j+1}", ""))
def save_business_info(self):
for i in range(self.max_business_count):
section = f"BUSINESS_{i+1}"
self.business_info[i] = {
"사업자별칭": self.alias_edits[i].text(),
"사업자등록번호": self.reg_number_edits[i].text(),
"상호명": self.name_edits[i].text(),
"등록날짜": self.reg_date_edits[i].text(),
"응대전화번호": self.phone_edits[i].text()
}
# 기타정보 저장
for j in range(self.etc_number):
self.business_info[i][f"기타정보Title{j+1}"] = self.etc_titles[i][j].text()
self.business_info[i][f"기타정보Context{j+1}"] = self.etc_contexts[i][j].text()
# 사업자 정보 저장
self.config_manager.set_business_info(i + 1, self.business_info[i])
# 마켓 API 정보 저장
api_keys = {}
for market, fields in self.market_info[i].items():
api_keys[market] = {label: line_edit.text() for label, line_edit in fields.items()}
self.config_manager.set_api_keys(i + 1, api_keys)
# 활성 마켓 정보 저장
self.config_manager.set_active_markets(i + 1, self.selected_markets[i])
self.config_manager.save()
# print("저장된 사업자 정보:", self.business_info)
# print("저장된 마켓 정보:", self.market_info)
def changeButton_Text(self, current_index = 1):
current_index = self.tab_widget.currentIndex()
self.save_button.setText(f"{current_index + 1}사업자 설정 저장")
self.refersh_button.setText(f"{current_index + 1}사업자 새로고침")
self.setup_market_button.setText(f"{current_index + 1}사업자 설정마켓")
def create_business_info_layout(self, index):
business_layout = QGridLayout()
# print(f"alias_edits 갯수 : {len(self.alias_edits)}")
alias_label = QLabel("사업자별칭:")
alias_edit = QLineEdit()
alias_edit.textChanged.connect(lambda text, idx=index: self.update_tab_title(text, idx))
self.alias_edits.append(alias_edit)
business_layout.addWidget(alias_label, 0, 0)
business_layout.addWidget(alias_edit, 0, 1)
# print(f"alias_edits 갯수 : {len(self.alias_edits)}")
# print(f"객체접근 테스트 : {self.alias_edits[0].text()}")
reg_number_label = QLabel("사업자등록번호:")
reg_number_label.setAlignment(Qt.AlignCenter)
reg_number_edit = QLineEdit()
reg_number_edit.setMinimumWidth(60)
self.reg_number_edits.append(reg_number_edit)
business_layout.addWidget(reg_number_label, 1, 0)
business_layout.addWidget(reg_number_edit, 1, 1)
name_label = QLabel("상호명:")
name_label.setAlignment(Qt.AlignCenter)
name_edit = QLineEdit()
name_edit.setMinimumWidth(60)
self.name_edits.append(name_edit)
business_layout.addWidget(name_label, 2, 0)
business_layout.addWidget(name_edit, 2, 1)
reg_date_label = QLabel("등록날짜:")
reg_date_label.setAlignment(Qt.AlignCenter)
reg_date_edit = CalendarPicker(self)
reg_date_edit.setMinimumWidth(60)
reg_date_edit.dateChanged.connect(lambda t: print(t.toString()))
self.reg_date_edits.append(reg_date_edit)
business_layout.addWidget(reg_date_label, 3, 0)
business_layout.addWidget(reg_date_edit, 3, 1)
phone_label = QLabel("응대전화번호:")
phone_label.setAlignment(Qt.AlignCenter)
phone_edit = QLineEdit()
phone_edit.setMinimumWidth(60)
self.phone_edits.append(phone_edit)
business_layout.addWidget(phone_label, 4, 0)
business_layout.addWidget(phone_edit, 4, 1)
for j in range(self.etc_number):
label = f"기타정보Title{j+1}"
# etc_push_btn = QPushButton(label)
etc_push_btn = PrimaryPushButton(FIF.INFO, label, self)
etc_push_btn.setMinimumWidth(80)
# etc_push_btn.setText(label)
etc_push_btn.clicked.connect(lambda checked, lbl=label, idx=index, btn=etc_push_btn: self.show_other_info_dialog(lbl, idx, btn))
etc_push_btn.setText(label)
self.etc_titles[index].append(etc_push_btn)
# business_layout.addWidget(etc_title_label, 5 + j * 2, 0)
business_layout.addWidget(etc_push_btn, j, 3)
# etc_context_label = QLabel(f"기타정보Context{j+1}:")
# etc_context_edit = QLineEdit()
# self.etc_contexts[index].append(etc_context_edit)
# # business_layout.addWidget(etc_context_label, 6 + j * 2, 0)
# # business_layout.addWidget(etc_context_edit, 6 + j * 2, 1)
etc_context_edit = QsciScintilla()
content_lexer = QsciLexerPython()
etc_context_edit.setLexer(content_lexer)
etc_context_edit.setMargins(1)
self.etc_contexts[index].append(etc_context_edit)
return business_layout
def create_market_info_widget(self, index):
layout = QTabWidget()
self.market_tabs[index] = layout
market_tabs = {
"쿠팡": [("쿠팡id", ""), ("업체코드", ""), ("accesskey", ""), ("secretkey", ""), ("배송프로필번호", "")],
"스마트스토어": [("업로드할스마트스토어계정id", ""), ("업로드할스마트스토어계정pw", ""), ("애플리케이션id", ""), ("애플리케이션시크릿", ""), ("배송프로필번호", "")],
"esm": [("옥션id", ""), ("지마켓id", ""), ("배송프로필번호", "")],
"11번가-국내": [("apikey", ""), ("배송프로필번호", "")],
"11번가-글로벌": [("apikey", ""), ("배송프로필번호", "")],
"롯데온": [("apikey", ""), ("배송프로필번호", "")],
"인터파크": [("상품상태재고수정인증키", ""), ("상품상태재고수정비밀키", ""),
("상품재고조회인증키", ""), ("상품재고조회비밀키", ""),
("상품정보조회인증", ""), ("상품정보조회비밀키", ""),
("상품수정인증키", ""), ("상품수정비밀키", ""),
("상품등록인증키", ""), ("상품등록비밀키", ""),
("반품배송지조회인증키", ""), ("반품배송지조회비밀키", ""),
("반품배송지등록인증키", ""), ("반품배송지등록비밀키", ""),
("상품qna등록인증키", ""), ("상품qna등록비밀키", ""),
("상품qna조회인증키", ""), ("상품qna조회비밀키", ""),
("인터파크업체번호", ""), ("공급계약일련번호", ""),
("배송프로필번호", "")],
"위메프": [("apikey", ""), ("배송프로필번호", "")],
"옥션1.0": [("멤버id", ""), ("apikey", ""), ("배송프로필번호", "")]
}
for market, fields in market_tabs.items():
tab = QWidget()
tab_layout = QGridLayout()
self.market_info[index][market] = {}
for i, (label_text, placeholder) in enumerate(fields):
tab_layout.addWidget(QLabel(label_text), i, 0)
line_edit = QLineEdit(placeholder)
tab_layout.addWidget(line_edit, i, 1)
self.market_info[index][market][label_text] = line_edit
tab.setLayout(tab_layout)
layout.addTab(tab, market)
return layout
def show_market_setup(self):
set_market_dialog = QDialog(self)
set_market_dialog.setWindowTitle("설정 마켓")
set_market_dialog.setLayout(QVBoxLayout())
layout = set_market_dialog.layout()
current_tab = self.tab_widget.currentIndex()
active_markets = self.selected_markets[current_tab]
print(f"active_markets : {active_markets}")
all_select_checkbox = QCheckBox("전체선택")
all_select_checkbox.setChecked(all(active_markets.values()))
all_select_checkbox.stateChanged.connect(lambda state: self.toggle_all_checkboxes(state, current_tab))
layout.addWidget(all_select_checkbox)
market_layout = QGridLayout()
markets = list(active_markets.keys())
print(f"markets : {markets}")
self.market_checkboxes[current_tab] = {}
for i, market in enumerate(markets):
checkbox = QCheckBox(market)
print(f"market : {market}")
print(f"active_markets[{market}] : {active_markets[market]}")
checkbox.setChecked(active_markets[market])
self.market_checkboxes[current_tab][market] = checkbox
market_layout.addWidget(checkbox, i // 3, i % 3)
layout.addLayout(market_layout)
button_box = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel)
# button_box.accepted.connect(lambda: self.save_market_settings(current_tab))
button_box.accepted.connect(set_market_dialog.accept)
button_box.rejected.connect(set_market_dialog.reject)
layout.addWidget(button_box)
if set_market_dialog.exec() == QDialog.Accepted:
for market, checkbox in self.market_checkboxes[current_tab].items():
self.selected_markets[current_tab][market] = checkbox.isChecked()
self.update_market_tabs(current_tab)
def update_market_tabs(self, current_tab):
market_info_widget = self.market_info_widgets[current_tab]
active_markets = self.selected_markets[current_tab]
for j in range(market_info_widget.count()):
market_name = market_info_widget.tabText(j)
market_info_widget.setTabVisible(j, active_markets.get(market_name, False))
def toggle_all_checkboxes(self, state, tab_index):
is_checked = state == Qt.Checked
for checkbox in self.market_checkboxes[tab_index].values():
checkbox.setChecked(is_checked)
def save_market_settings(self, tab_index):
active_markets = self.selected_markets[tab_index]
for market, checkbox in self.market_checkboxes[tab_index].items():
active_markets[market] = checkbox.isChecked()
self.config_manager.set_active_markets(tab_index + 1, active_markets)
# def update_market_tabs(self, current_tab):
# # tab = self.tab_widget.widget(current_tab)
# print("update_market_tabs")
# market_info_widget = self.market_info_widgets[current_tab]
# active_markets = self.selected_markets[current_tab]
# for j in range(market_info_widget.count()):
# market_tab = market_info_widget.widget(j)
# market_name = market_info_widget.tabText(j)
# market_tab.setVisible(active_markets.get(market_name, False))
def show_other_info_dialog(self, label, index, button):
info_number = ''.join(filter(str.isdigit, label))
set_etc_dialog = QDialog(self)
set_etc_dialog.setWindowTitle("기타정보 설정")
set_etc_dialog.setMinimumSize(400,600)
layout = QVBoxLayout(set_etc_dialog)
# 메뉴 바 생성
menu_bar = QMenuBar()
layout.setMenuBar(menu_bar)
# 폰트 선택 메뉴 추가
font_menu = menu_bar.addMenu('Font')
select_font_action = QAction('Select Font', self)
font_menu.addAction(select_font_action)
title_layout = QHBoxLayout()
title_layout.addWidget(QLabel("제목"))
title_input = QLineEdit()
title_layout.addWidget(title_input, 3)
layout.addLayout(title_layout)
# Toolbar 추가
toolbar = QToolBar()
layout.addWidget(toolbar)
# 라인 번호 표시 토글 버튼 추가
toggle_line_numbers_action = QAction("Line Numbers", self)
toggle_line_numbers_action.setCheckable(True)
toggle_line_numbers_action.setChecked(True)
toggle_line_numbers_action.toggled.connect(lambda state: content_editor.setMargins(state))
toolbar.addAction(toggle_line_numbers_action)
# 폰트 종류 선택 버튼 추가
font_type_action = QAction("Font Type", self)
font_type_action.triggered.connect(lambda: self.select_font(content_editor))
toolbar.addAction(font_type_action)
# 이미지 삽입 버튼 추가
insert_image_action = QAction("Insert Image", self)
insert_image_action.triggered.connect(lambda: self.insert_image(content_editor))
toolbar.addAction(insert_image_action)
content_layout = QVBoxLayout()
content_layout.addWidget(QLabel("내용"))
# content_editor = QsciScintilla()
# content_lexer = QsciLexerPython()
# content_editor.setLexer(content_lexer)
# content_editor.setMargins(1)
content_editor = self.etc_contexts[index][int(info_number)-1]
content_layout.addWidget(content_editor)
layout.addLayout(content_layout)
button_box = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel)
button_box.accepted.connect(lambda: set_etc_dialog.accept())
button_box.rejected.connect(lambda: set_etc_dialog.reject())
layout.addWidget(button_box)
# 폰트 선택 메뉴 동작 연결
select_font_action.triggered.connect(lambda: self.select_font(content_editor))
# label에서 숫자만 추출하여 적절한 키 형식으로 변환
info_title_key = f"기타정보Title{info_number}"
info_context_key = f"기타정보Context{info_number}"
# 기존 정보가 없으면 초기화
if info_title_key not in self.business_info[index] or info_context_key not in self.business_info[index]:
self.business_info[index][info_title_key] = ""
self.business_info[index][info_context_key] = ""
print(f"기존 값이 없으므로 기타정보 초기화")
# 기존 정보가 있으면 로드
old_title = self.business_info[index].get(info_title_key, "")
old_content = self.business_info[index].get(info_context_key, "")
# print(f"self.business_info : {self.business_info}")
print(f"index : {index}")
print(f"info_title_key : {info_title_key}")
print(f"info_context_key : {info_context_key}")
title_input.setText(old_title)
print(f"기존 값 old_title 입력 : {old_title}")
content_editor.setText(old_content)
print(f"기존 값 old_content 입력 : {old_content}")
if set_etc_dialog.exec() == QDialog.Accepted:
new_title = title_input.text()
new_content = content_editor.text()
# old_title = self.other_info[index][label].get("title", "")
# old_content = self.other_info[index][label].get("content", "")
if new_title != old_title or new_content != old_content:
confirmation = QMessageBox.question(self, "변경 사항 확인", "내용이 변경되었습니다. 저장하시겠습니까?",
QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
if confirmation == QMessageBox.Yes:
if new_title == "":
new_title = label
self.business_info[index][info_title_key] = new_title
self.business_info[index][info_context_key] = new_content
button.setText(new_title)
else:
if new_title == "":
new_title = label
self.business_info[index][info_title_key] = new_title
self.business_info[index][info_context_key] = new_content
button.setText(new_title)
# Print the other_info dictionary for debugging
print(self.business_info)
def insert_image(self, content_editor):
file_name, _ = QFileDialog.getOpenFileName(self, "Insert Image", "", "Images (*.png *.xpm *.jpg)")
if file_name:
content_editor.insert(f"![Image]({file_name})")
def select_font(self, content_editor):
font, ok = QFontDialog.getFont()
if ok:
content_editor.setFont(font)
def update_tab_title(self, text, index):
if text:
self.tab_widget.setTabText(index, text)
else:
self.tab_widget.setTabText(index, f"{index + 1}사업자")
def update_tab_styles(self):
for i in range(self.tab_widget.count()):
tab_bar = self.tab_widget.tabBar()
if i == self.tab_widget.currentIndex():
tab_bar.setTabTextColor(i, Qt.black)
tab_bar.setStyleSheet("QTabBar::tab:selected { background: lightgreen; }")
else:
tab_bar.setTabTextColor(i, Qt.black)
tab_bar.setStyleSheet("QTabBar::tab:!selected { background: transparent; }")