904 lines
42 KiB
Python
904 lines
42 KiB
Python
from PyQt5.QtWidgets import (QMainWindow, QDesktopWidget, QMessageBox, QAction, QVBoxLayout, QHBoxLayout, QWidget, QPushButton, QLabel, QProgressBar, QComboBox, QCheckBox, QTextBrowser, QPlainTextEdit, QDialog, QFrame, QLineEdit, QGridLayout, QSpinBox, QApplication)
|
|
from PyQt5.QtCore import Qt
|
|
from ui.percenty_settings import PercentySettingsDialog
|
|
# from ui.business_settings import BusinessSettingsDialog
|
|
from ui.business_set import BusinessSettings
|
|
import webbrowser
|
|
from ui.help_dialog import HelpDialog
|
|
from utils.playwright_helpers import PlaywrightHelper
|
|
# from utils.config import ConfigManager
|
|
import asyncio
|
|
from ui.apikey_widget import ApiKeyWidget
|
|
from qfluentwidgets import PushButton, RoundMenu, DropDownPushButton, FluentIcon as FIF
|
|
|
|
import re
|
|
|
|
class MainWindow(QMainWindow):
|
|
def __init__(self, config, logger):
|
|
super().__init__()
|
|
self.config = config
|
|
self.logger = logger
|
|
self.max_business_number = 3
|
|
self.current_api_keys = {}
|
|
self.playwright_helper = PlaywrightHelper()
|
|
self.isHeadless_mode = True
|
|
self.api_widget = ApiKeyWidget()
|
|
self.business_infos = {}
|
|
|
|
self.bsDialog = BusinessSettings(self.current_api_keys, self.config, self.max_business_number)
|
|
self.psDialog = PercentySettingsDialog(self.config)
|
|
|
|
|
|
self.menu = RoundMenu(parent=self)
|
|
self.menu2 = RoundMenu(parent=self)
|
|
# Initialize the class variable
|
|
self.current_slot = 1
|
|
|
|
# 액션 딕셔너리 생성
|
|
self.actions = {f'{i}번 슬롯': QAction(FIF.SAVE.icon(), f'{i}번 슬롯', self) for i in range(1, self.max_business_number + 1)}
|
|
|
|
# 액션에 메서드 연결 및 메뉴에 추가
|
|
for text, action in self.actions.items():
|
|
action.triggered.connect(lambda checked, text=text: self.save_business_action_triggered(text))
|
|
self.menu.addAction(action)
|
|
# 초기 스타일 시트 설정
|
|
self.update_menu_items()
|
|
|
|
self.setWindowTitle('Change-Percenty2')
|
|
self.setGeometry(100, 100, 550, 800)
|
|
self.center()
|
|
|
|
|
|
self.init_ui()
|
|
|
|
def center(self):
|
|
screen_geometry = self.frameGeometry()
|
|
screen_center = QDesktopWidget().availableGeometry().center()
|
|
screen_geometry.moveCenter(screen_center)
|
|
self.move(screen_geometry.topLeft())
|
|
|
|
def init_ui(self):
|
|
main_layout = QVBoxLayout()
|
|
|
|
# 상단의 도움말, 퍼센티 설정, 사업자 설정 메뉴
|
|
self.create_menu()
|
|
|
|
# 메인 레이아웃 설정
|
|
main_layout.addLayout(self.create_main_layout())
|
|
|
|
# 상태 라벨 추가
|
|
self.status_label = QLabel('현재 상태: 준비 완료')
|
|
main_layout.addWidget(self.status_label)
|
|
|
|
container = QWidget()
|
|
container.setLayout(main_layout)
|
|
self.setCentralWidget(container)
|
|
|
|
self.create_reset_actions()
|
|
|
|
self.update_menu_items()
|
|
self.updateSelect_Business()
|
|
|
|
def create_menu(self):
|
|
menubar = self.menuBar()
|
|
|
|
# 도움말 메뉴
|
|
help_menu = menubar.addMenu('도움말')
|
|
help_action = QAction('도움말 보기', self)
|
|
help_action.triggered.connect(self.show_help)
|
|
help_menu.addAction(help_action)
|
|
|
|
# 퍼센티 설정 메뉴
|
|
percenty_menu = menubar.addMenu('퍼센티 설정')
|
|
percenty_action = QAction('퍼센티 설정', self)
|
|
percenty_action.triggered.connect(self.show_percenty_settings)
|
|
percenty_menu.addAction(percenty_action)
|
|
|
|
# 사업자 설정 메뉴
|
|
business_menu = menubar.addMenu('사업자 설정')
|
|
business_action = QAction('사업자 설정', self)
|
|
business_action.triggered.connect(self.show_business_settings)
|
|
business_menu.addAction(business_action)
|
|
|
|
def create_main_layout(self):
|
|
layout = QVBoxLayout()
|
|
|
|
# self.top_frame = QFrame(self)
|
|
# self.top_frame.setFrameShape(QFrame.StyledPanel)
|
|
# self.top_frame.setFrameShadow(QFrame.Raised)
|
|
# self.top_layout = QHBoxLayout(self.top_frame)
|
|
|
|
# self.middle_frame = QFrame(self)
|
|
# self.middle_frame.setFrameShape(QFrame.StyledPanel)
|
|
# self.middle_frame.setFrameShadow(QFrame.Raised)
|
|
# self.middle_layout = QHBoxLayout(self.middle_frame)
|
|
|
|
# self.bottom_frame = QFrame(self)
|
|
# self.bottom_frame.setFrameShape(QFrame.StyledPanel)
|
|
# self.bottom_frame.setFrameShadow(QFrame.Raised)
|
|
# self.bottom_layout = QVBoxLayout(self.bottom_frame)
|
|
|
|
|
|
top_layout = QHBoxLayout()
|
|
middle_layout = QVBoxLayout()
|
|
bottom_layout = QVBoxLayout()
|
|
|
|
# 상단 레이아웃
|
|
self.create_top_layout(top_layout)
|
|
|
|
# 중단 레이아웃
|
|
self.create_middle_layout(middle_layout)
|
|
|
|
# 하단 레이아웃
|
|
self.create_bottom_layout(bottom_layout)
|
|
|
|
# QFrame으로 감싸고 테두리 설정
|
|
top_frame = QFrame()
|
|
top_frame.setLayout(top_layout)
|
|
top_frame.setFrameShape(QFrame.Box)
|
|
top_frame.setFrameShadow(QFrame.Raised)
|
|
|
|
middle_frame = QFrame()
|
|
middle_frame.setLayout(middle_layout)
|
|
middle_frame.setFrameShape(QFrame.Box)
|
|
middle_frame.setFrameShadow(QFrame.Raised)
|
|
|
|
bottom_frame = QFrame()
|
|
bottom_frame.setLayout(bottom_layout)
|
|
bottom_frame.setFrameShape(QFrame.Box)
|
|
bottom_frame.setFrameShadow(QFrame.Raised)
|
|
|
|
layout.addWidget(top_frame, 10)
|
|
layout.addWidget(middle_frame, 60)
|
|
layout.addWidget(bottom_frame, 30)
|
|
|
|
return layout
|
|
|
|
|
|
def create_top_layout(self, layout):
|
|
# self.fetch_button = QPushButton('현재설정 가져오기')
|
|
self.fetch_button = PushButton('현재설정\n가져오기', self)
|
|
self.fetch_button.setMinimumSize(150,50)
|
|
self.fetch_button.clicked.connect(lambda: asyncio.ensure_future(self.fetch_settings()))
|
|
layout.addWidget(self.fetch_button)
|
|
|
|
self.save_button = DropDownPushButton(FIF.SAVE, '저장',self)
|
|
self.save_button.setMenu(self.menu)
|
|
self.save_button.setMenu(self.menu)
|
|
self.save_button.setMinimumSize(150,50)
|
|
# self.save_button.clicked.connect(lambda: asyncio.ensure_future(self.save_settings()))
|
|
layout.addWidget(self.save_button)
|
|
|
|
self.reset_button = DropDownPushButton(FIF.ROTATE, '초기화',self)
|
|
self.reset_button.setMenu(self.menu2)
|
|
self.reset_button.setMenu(self.menu2)
|
|
self.reset_button.setMinimumSize(150,50)
|
|
# self.save_button.clicked.connect(lambda: asyncio.ensure_future(self.save_settings()))
|
|
layout.addWidget(self.reset_button)
|
|
|
|
def create_middle_layout(self, layout):
|
|
# currentStatusLayout 추가
|
|
current_status_layout = QVBoxLayout()
|
|
|
|
self.select_Business = QSpinBox()
|
|
self.select_Business.setSuffix("번째 사업자")
|
|
self.select_Business.setValue(1)
|
|
self.select_Business.setMaximum(self.max_business_number)
|
|
self.select_Business.setMinimum(1)
|
|
self.select_Business.valueChanged.connect(self.updateSelect_Business)
|
|
|
|
# 첫 번째 박스 (사업자 현황)
|
|
self.business_info_box = QGridLayout()
|
|
self.business_info_label = QLabel('현재 사업자 정보(별칭)')
|
|
self.business_info_label_context = QLineEdit('')
|
|
self.business_info_label_context.setAlignment(Qt.AlignLeft)
|
|
self.business_info_label_context.setPlaceholderText("사업자 별칭을 입력해 주세요")
|
|
# self.business_info_label_context.setToolTip("입력해 주세요")
|
|
self.business_register_number_label = QLabel('사업자등록번호')
|
|
self.business_register_number_label.setAlignment(Qt.AlignCenter)
|
|
self.business_register_number_label_context = QLineEdit('')
|
|
self.business_register_number_label_context.setAlignment(Qt.AlignCenter)
|
|
self.business_name_label = QLabel('상호명')
|
|
self.business_name_label.setAlignment(Qt.AlignCenter)
|
|
self.business_name_label_context = QLineEdit('')
|
|
self.business_name_label_context.setAlignment(Qt.AlignCenter)
|
|
self.business_date_label = QLabel('등록날짜')
|
|
self.business_date_label.setAlignment(Qt.AlignCenter)
|
|
self.business_date_label_context = QLineEdit('')
|
|
self.business_date_label_context.setAlignment(Qt.AlignCenter)
|
|
self.business_call_label = QLabel('응대전화번호')
|
|
self.business_call_label.setAlignment(Qt.AlignCenter)
|
|
self.business_call_label_context = QLineEdit('')
|
|
self.business_call_label_context.setAlignment(Qt.AlignCenter)
|
|
self.business_info_box.addWidget(self.business_info_label,1,1,1,2)
|
|
self.business_info_box.addWidget(self.business_info_label_context,1,3,1,2)
|
|
self.business_info_box.addWidget(self.business_register_number_label,2,1)
|
|
self.business_info_box.addWidget(self.business_register_number_label_context,3,1)
|
|
self.business_info_box.addWidget(self.business_name_label,2,2)
|
|
self.business_info_box.addWidget(self.business_name_label_context,3,2)
|
|
self.business_info_box.addWidget(self.business_date_label,2,3)
|
|
self.business_info_box.addWidget(self.business_date_label_context,3,3)
|
|
self.business_info_box.addWidget(self.business_call_label,2,4)
|
|
self.business_info_box.addWidget(self.business_call_label_context,3,4)
|
|
self.business_info_box.setContentsMargins(10,10,10,10)
|
|
self.business_info_box.setSpacing(10)
|
|
|
|
|
|
business_frame = QFrame()
|
|
business_frame.setLayout(self.business_info_box)
|
|
self.business_call_label.setStyleSheet
|
|
business_frame.setFrameShape(QFrame.Box)
|
|
# business_frame.setFrameShadow(QFrame.Plain)
|
|
# business_frame.setStyleSheet("border: 1px dashed black;")
|
|
|
|
current_status_layout.addWidget(self.select_Business, 10)
|
|
current_status_layout.addWidget(business_frame, 20)
|
|
|
|
# 두 번째 박스 (마켓 현황)
|
|
self.market_info_box = QGridLayout()
|
|
|
|
self.market_info_label = QLabel('마켓 정보')
|
|
self.market_info_cc_btn = QPushButton('쿠팡')
|
|
self.market_info_cc_label = QLabel('------')
|
|
self.market_info_ss_btn = QPushButton('스마트스토어')
|
|
self.market_info_ss_label = QLabel('------')
|
|
self.market_info_dm11_btn = QPushButton('11번가-국내')
|
|
self.market_info_dm11_label = QLabel('------')
|
|
self.market_info_gb11_btn = QPushButton('11번가-글로벌')
|
|
self.market_info_gb11_label = QLabel('------')
|
|
self.market_info_esm_btn = QPushButton('esm')
|
|
self.market_info_esm_label = QLabel('------')
|
|
self.market_info_lton_btn = QPushButton('롯데온')
|
|
self.market_info_lton_label = QLabel('------')
|
|
self.market_info_ip_btn = QPushButton('인터파크')
|
|
self.market_info_ip_label = QLabel('------')
|
|
self.market_info_wmp_btn = QPushButton('위메프')
|
|
self.market_info_wmp_label = QLabel('------')
|
|
self.market_info_at_btn = QPushButton('옥션1.0')
|
|
self.market_info_at_label = QLabel('------')
|
|
|
|
self.market_info_cc_btn.clicked.connect(lambda: self.market_info_btn_clicked(self.market_info_cc_btn))
|
|
self.market_info_ss_btn.clicked.connect(lambda: self.market_info_btn_clicked(self.market_info_ss_btn))
|
|
self.market_info_dm11_btn.clicked.connect(lambda: self.market_info_btn_clicked(self.market_info_dm11_btn))
|
|
self.market_info_gb11_btn.clicked.connect(lambda: self.market_info_btn_clicked(self.market_info_gb11_btn))
|
|
self.market_info_esm_btn.clicked.connect(lambda: self.market_info_btn_clicked(self.market_info_esm_btn))
|
|
self.market_info_lton_btn.clicked.connect(lambda: self.market_info_btn_clicked(self.market_info_lton_btn))
|
|
self.market_info_ip_btn.clicked.connect(lambda: self.market_info_btn_clicked(self.market_info_ip_btn))
|
|
self.market_info_wmp_btn.clicked.connect(lambda: self.market_info_btn_clicked(self.market_info_wmp_btn))
|
|
self.market_info_at_btn.clicked.connect(lambda: self.market_info_btn_clicked(self.market_info_at_btn))
|
|
|
|
|
|
self.market_info_box.addWidget(self.market_info_label,1,1,1,2)
|
|
self.market_info_box.addWidget(self.market_info_cc_btn,2,1)
|
|
self.market_info_box.addWidget(self.market_info_cc_label,2,2)
|
|
self.market_info_box.addWidget(self.market_info_ss_btn,2,3)
|
|
self.market_info_box.addWidget(self.market_info_ss_label,2,4)
|
|
self.market_info_box.addWidget(self.market_info_dm11_btn,3,1)
|
|
self.market_info_box.addWidget(self.market_info_dm11_label,3,2)
|
|
self.market_info_box.addWidget(self.market_info_gb11_btn,3,3)
|
|
self.market_info_box.addWidget(self.market_info_gb11_label,3,4)
|
|
self.market_info_box.addWidget(self.market_info_esm_btn,4,1)
|
|
self.market_info_box.addWidget(self.market_info_esm_label,4,2)
|
|
self.market_info_box.addWidget(self.market_info_lton_btn,4,3)
|
|
self.market_info_box.addWidget(self.market_info_lton_label,4,4)
|
|
self.market_info_box.addWidget(self.market_info_ip_btn,5,1)
|
|
self.market_info_box.addWidget(self.market_info_ip_label,5,2)
|
|
self.market_info_box.addWidget(self.market_info_wmp_btn,5,3)
|
|
self.market_info_box.addWidget(self.market_info_wmp_label,5,4)
|
|
self.market_info_box.addWidget(self.market_info_at_btn,6,1)
|
|
self.market_info_box.addWidget(self.market_info_at_label,6,2)
|
|
|
|
market_frame = QFrame()
|
|
market_frame.setLayout(self.market_info_box)
|
|
market_frame.setFrameShape(QFrame.Box)
|
|
|
|
current_status_layout.addWidget(market_frame, 40)
|
|
|
|
# 세 번째 박스 (비어 있음)
|
|
self.empty_box = QVBoxLayout()
|
|
|
|
empty_frame = QFrame()
|
|
empty_frame.setLayout(self.empty_box)
|
|
empty_frame.setFrameShape(QFrame.Box)
|
|
empty_frame.setFrameShadow(QFrame.Plain)
|
|
empty_frame.setStyleSheet("border: 1px dashed black;")
|
|
|
|
current_status_layout.addWidget(empty_frame, 30)
|
|
|
|
layout.addLayout(current_status_layout)
|
|
|
|
def create_bottom_layout(self, layout):
|
|
self.business_dropdown = QComboBox()
|
|
layout.addWidget(self.business_dropdown)
|
|
|
|
self.market_checkbox_layout = QGridLayout()
|
|
layout.addLayout(self.market_checkbox_layout)
|
|
|
|
# 체크박스만 추가
|
|
self.all_checkbox = QCheckBox("전체 체크")
|
|
self.cp_checkbox = QCheckBox("쿠팡")
|
|
self.ss_checkbox = QCheckBox("스마트스토어")
|
|
self.st11_dm_checkbox = QCheckBox("11번가-국내")
|
|
self.st11_gb_checkbox = QCheckBox("11번가-글로벌")
|
|
self.esm_checkbox = QCheckBox("ESM")
|
|
self.lton_checkbox = QCheckBox("롯데온")
|
|
self.ip_checkbox = QCheckBox("인터파크")
|
|
self.wmp_checkbox = QCheckBox("위메프")
|
|
self.at_checkbox = QCheckBox("옥션1.0")
|
|
self.all_checkbox.stateChanged.connect(self.handle_all_checked)
|
|
self.market_checkbox_layout.addWidget(self.all_checkbox,1,1)
|
|
self.market_checkbox_layout.addWidget(self.cp_checkbox,2,1)
|
|
self.market_checkbox_layout.addWidget(self.ss_checkbox,2,2)
|
|
self.market_checkbox_layout.addWidget(self.st11_dm_checkbox,2,3)
|
|
self.market_checkbox_layout.addWidget(self.st11_gb_checkbox,3,1)
|
|
self.market_checkbox_layout.addWidget(self.esm_checkbox,3,2)
|
|
self.market_checkbox_layout.addWidget(self.lton_checkbox,3,3)
|
|
self.market_checkbox_layout.addWidget(self.ip_checkbox,4,1)
|
|
self.market_checkbox_layout.addWidget(self.wmp_checkbox,4,2)
|
|
self.market_checkbox_layout.addWidget(self.at_checkbox,4,3)
|
|
|
|
self.change_business_button = QPushButton('사업자 바꾸기')
|
|
# self.change_business_button.clicked.connect(lambda: asyncio.ensure_future(self.change_business()))
|
|
self.change_business_button.clicked.connect(self.handle_change_business_button)
|
|
layout.addWidget(self.change_business_button)
|
|
|
|
self.progress_bar = QProgressBar(self)
|
|
self.progress_bar.setAlignment(Qt.AlignCenter)
|
|
layout.addWidget(self.progress_bar)
|
|
|
|
|
|
def handle_all_checked(self, state):
|
|
if state == Qt.Checked:
|
|
self.cp_checkbox.setChecked(True)
|
|
self.ss_checkbox.setChecked(True)
|
|
self.st11_dm_checkbox.setChecked(True)
|
|
self.st11_gb_checkbox.setChecked(True)
|
|
self.esm_checkbox.setChecked(True)
|
|
self.lton_checkbox.setChecked(True)
|
|
self.ip_checkbox.setChecked(True)
|
|
self.wmp_checkbox.setChecked(True)
|
|
self.at_checkbox.setChecked(True)
|
|
|
|
elif state == Qt.Unchecked:
|
|
self.cp_checkbox.setChecked(False)
|
|
self.ss_checkbox.setChecked(False)
|
|
self.st11_dm_checkbox.setChecked(False)
|
|
self.st11_gb_checkbox.setChecked(False)
|
|
self.esm_checkbox.setChecked(False)
|
|
self.lton_checkbox.setChecked(False)
|
|
self.ip_checkbox.setChecked(False)
|
|
self.wmp_checkbox.setChecked(False)
|
|
self.at_checkbox.setChecked(False)
|
|
|
|
def market_info_btn_clicked(self, button):
|
|
currentBtnMarket = button.text()
|
|
if self.current_api_keys:
|
|
print(f"{currentBtnMarket} 호출")
|
|
|
|
market_api_infos = self.get_market_infos(self.current_api_keys, currentBtnMarket)
|
|
print(f"리턴된 market_api_infos : {market_api_infos}")
|
|
if currentBtnMarket == '스마트스토어':
|
|
self.api_widget.call_UI(market_api_infos, self.current_api_keys)
|
|
else:
|
|
self.api_widget.call_UI(market_api_infos)
|
|
else:
|
|
print(f"{currentBtnMarket}의 마켓정보 없음")
|
|
|
|
def move_focus(self, current_widget, next_widget):
|
|
if len(current_widget.text()) == current_widget.maxLength():
|
|
next_widget.setFocus()
|
|
|
|
async def fetch_settings(self):
|
|
self.logger.debug("Fetching settings...")
|
|
self.status_label.setText('현재 상태: 설정 가져오는 중...')
|
|
self.progress_bar.setValue(0)
|
|
|
|
# 이메일 형식 검증을 위한 정규 표현식
|
|
email_pattern = r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$'
|
|
|
|
headless = self.config.get('Percenty_Setting', 'headless', fallback='')
|
|
if headless == 'True':
|
|
headless = True
|
|
else:
|
|
headless = False
|
|
|
|
self.isHeadless_mode = headless
|
|
|
|
await self.playwright_helper.init_browser(self.isHeadless_mode)
|
|
self.progress_bar.setValue(5)
|
|
|
|
|
|
user_id = self.config.get('Percenty_Setting', 'user_id')
|
|
if not re.match(email_pattern, user_id):
|
|
# 메시지 박스 생성 및 표시
|
|
QMessageBox.warning(self, "입력 오류", "유효한 이메일 주소를 입력해주세요.")
|
|
|
|
encrypted_pw = self.config.get('Percenty_Setting', 'password')
|
|
if not user_id or not encrypted_pw:
|
|
QMessageBox.warning(self, "값 오류", "퍼센티 설정을 확인하세요.")
|
|
else:
|
|
password = self.config.decrypt(encrypted_pw)
|
|
|
|
web_api_keys = await self.playwright_helper.login_and_fetch_api_keys('https://percenty.co.kr', user_id, password, self.status_label, self.progress_bar)
|
|
self.current_api_keys = web_api_keys
|
|
print(f"가져온 apikeys\n{web_api_keys}")
|
|
|
|
selected_business_info = self.search_apikeys_for_business(web_api_keys)
|
|
|
|
# 가져온 API 키를 UI에 업데이트하는 로직 추가
|
|
self.update_market_info(web_api_keys, selected_business_info)
|
|
self.progress_bar.setValue(100)
|
|
self.status_label.setText('현재 상태: 설정 가져오기 완료')
|
|
await self.playwright_helper.close_browser()
|
|
|
|
def search_apikeys_for_business(self, api_keys):
|
|
self.status_label.setText('현재 상태: 키 검증하기')
|
|
|
|
business_info = {
|
|
'사업자별칭': '설정사업자없음',
|
|
'사업자등록번호': '000-00-00000',
|
|
'상호명': '설정사업자없음',
|
|
'등록날짜': '0000-00-00',
|
|
'응대전화번호': '000-000-0000'
|
|
}
|
|
|
|
# max_business = int(self.config.get('DEFAULT', 'max_businesses'))
|
|
|
|
try:
|
|
|
|
all = self.config.get_all_businesses()
|
|
print(f"저장된 사업자 수 : [{len(all)}] 개")
|
|
print(f"all : {all}")
|
|
|
|
progress_step = 15 / len(all)
|
|
|
|
print(f"progress_step : {progress_step}")
|
|
|
|
# 저장된 모든 사업자 정보 가져오기
|
|
for business_section in all:
|
|
print(f"키검증 business_section : {business_section}")
|
|
stored_api_keys = self.config.get_api_keys(business_section)
|
|
print(f"키검증 stored_api_keys : {stored_api_keys}")
|
|
if stored_api_keys and stored_api_keys == api_keys:
|
|
print("stored_api_keys 존재함")
|
|
business_info = self.config.get_business_info(business_section)
|
|
print(f"business_info : {business_info}")
|
|
break
|
|
else:
|
|
pass
|
|
|
|
self.progress_bar.setValue(80 + int(progress_step))
|
|
self.status_label.setText(f'현재 상태: {business_section} 사업자 가져오기 완료')
|
|
except Exception as e:
|
|
print(f"{e}")
|
|
|
|
print(f"business_info{business_info}")
|
|
return business_info
|
|
|
|
def get_market_infos(self, current_api_keys, market_name):
|
|
try:
|
|
if market_name in current_api_keys:
|
|
market_details = current_api_keys[market_name]
|
|
|
|
if market_name == '쿠팡':
|
|
api_keys = {
|
|
'쿠팡ID': market_details.get('쿠팡id'),
|
|
'업체코드': market_details.get('업체코드'),
|
|
'accesskey': market_details.get('accesskey'),
|
|
'secretkey': market_details.get('secretkey'),
|
|
'배송프로필번호': market_details.get('배송프로필번호'),
|
|
}
|
|
elif market_name == '스마트스토어':
|
|
api_keys = {
|
|
'업로드할스마트스토어계정ID': market_details.get('업로드할스마트스토어계정id'),
|
|
'업로드할스마트스토어계정PW': market_details.get('업로드할스마트스토어계정pw'),
|
|
'애플리케이션ID': market_details.get('애플리케이션id'),
|
|
'애플리케이션시크릿': market_details.get('애플리케이션시크릿'),
|
|
'배송프로필번호': market_details.get('배송프로필번호'),
|
|
}
|
|
elif market_name == 'esm':
|
|
api_keys = {
|
|
'옥션ID': market_details.get('옥션id'),
|
|
'지마켓ID': market_details.get('지마켓id'),
|
|
'배송프로필번호': market_details.get('배송프로필번호'),
|
|
}
|
|
elif market_name == '11번가-국내':
|
|
api_keys = {
|
|
'APIKEY': market_details.get('apikey'),
|
|
'배송프로필번호': market_details.get('배송프로필번호'),
|
|
}
|
|
elif market_name == '11번가-글로벌':
|
|
api_keys = {
|
|
'APIKEY': market_details.get('apikey'),
|
|
'배송프로필번호': market_details.get('배송프로필번호'),
|
|
}
|
|
elif market_name == '롯데온':
|
|
api_keys = {
|
|
'APIKEY': market_details.get('apikey'),
|
|
'배송프로필번호': market_details.get('배송프로필번호'),
|
|
}
|
|
elif market_name == '인터파크':
|
|
api_keys = {
|
|
'상품상태재고수정인증키': market_details.get('상품상태재고수정인증키'),
|
|
'상품상태재고수정비밀키': market_details.get('상품상태재고수정비밀키'),
|
|
'상품재고조회인증키': market_details.get('상품재고조회인증키'),
|
|
'상품재고조회비밀키': market_details.get('상품재고조회비밀키'),
|
|
'상품정보조회인증': market_details.get('상품정보조회인증'),
|
|
'상품정보조회비밀키': market_details.get('상품정보조회비밀키'),
|
|
'상품수정인증키': market_details.get('상품수정인증키'),
|
|
'상품수정비밀키': market_details.get('상품수정비밀키'),
|
|
'상품등록인증키': market_details.get('상품등록인증키'),
|
|
'상품등록비밀키': market_details.get('상품등록비밀키'),
|
|
'반품배송지조회인증키': market_details.get('반품배송지조회인증키'),
|
|
'반품배송지조회비밀키': market_details.get('반품배송지조회비밀키'),
|
|
'반품배송지등록인증키': market_details.get('반품배송지등록인증키'),
|
|
'반품배송지등록비밀키': market_details.get('반품배송지등록비밀키'),
|
|
'상품qna등록인증키': market_details.get('상품qna등록인증키'),
|
|
'상품qna등록비밀키': market_details.get('상품qna등록비밀키'),
|
|
'상품qna조회인증키': market_details.get('상품qna조회인증키'),
|
|
'상품qna조회비밀키': market_details.get('상품qna조회비밀키'),
|
|
'인터파크업체번호': market_details.get('인터파크업체번호'),
|
|
'공급계약일련번호': market_details.get('공급계약일련번호'),
|
|
'배송프로필번호': market_details.get('배송프로필번호'),
|
|
}
|
|
elif market_name == '위메프':
|
|
api_keys = {
|
|
'APIKEY': market_details.get('apikey'),
|
|
'배송프로필번호': market_details.get('배송프로필번호'),
|
|
}
|
|
elif market_name == '옥션1.0':
|
|
api_keys = {
|
|
'APIKEY': market_details.get('apikey'),
|
|
'멤버ID': market_details.get('멤버id'),
|
|
'배송프로필번호': market_details.get('배송프로필번호'),
|
|
}
|
|
else:
|
|
api_keys = {key: value for key, value in market_details.items() if 'key' in key.lower() or '키' in key}
|
|
|
|
return api_keys
|
|
else:
|
|
return None
|
|
except Exception as e:
|
|
print(f"get_market_info 중 에러 : {e}")
|
|
|
|
def update_market_info(self, web_api_keys, selected_business_info):
|
|
print(f"update_market_info : {web_api_keys}\n\n{selected_business_info}")
|
|
|
|
# 사업자 정보 업데이트
|
|
self.business_info_label_context.setText(selected_business_info['사업자별칭'])
|
|
self.business_register_number_label_context.setText(selected_business_info['사업자등록번호'])
|
|
self.business_name_label_context.setText(selected_business_info['상호명'])
|
|
self.business_date_label_context.setText(selected_business_info['등록날짜'])
|
|
self.business_call_label_context.setText(selected_business_info['응대전화번호'])
|
|
|
|
# 마켓 정보 업데이트
|
|
market_buttons = [
|
|
(self.market_info_cc_btn, '쿠팡', self.market_info_cc_label),
|
|
(self.market_info_ss_btn, '스마트스토어', self.market_info_ss_label),
|
|
(self.market_info_dm11_btn, '11번가-국내', self.market_info_dm11_label),
|
|
(self.market_info_gb11_btn, '11번가-글로벌', self.market_info_gb11_label),
|
|
(self.market_info_esm_btn, 'esm', self.market_info_esm_label),
|
|
(self.market_info_lton_btn, '롯데온', self.market_info_lton_label),
|
|
(self.market_info_ip_btn, '인터파크', self.market_info_ip_label),
|
|
(self.market_info_wmp_btn, '위메프', self.market_info_wmp_label),
|
|
(self.market_info_at_btn, '옥션1.0', self.market_info_at_label),
|
|
]
|
|
|
|
for button, market, label in market_buttons:
|
|
market_info = self.current_api_keys.get(market, None)
|
|
print(f"market : {market}")
|
|
print(f"market_info : {market_info}")
|
|
if market_info and any(value for value in market_info.values()):
|
|
button.setStyleSheet("background-color: lightgreen;")
|
|
label.setText(selected_business_info['사업자별칭'])
|
|
print(f"사업자 별칭으로 라벨 설정 : {selected_business_info['사업자별칭']}")
|
|
else:
|
|
button.setStyleSheet("background-color: darkgray;")
|
|
label.setText("NoMatch")
|
|
print(f"NoMatch로 라벨 설정")
|
|
|
|
async def save_settings(self, business_number, call_text):
|
|
|
|
confirmation = QMessageBox.question(self, "확인", call_text,
|
|
QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
|
|
if confirmation == QMessageBox.No:
|
|
return
|
|
|
|
business_nickName = self.business_info_label_context.text()
|
|
business_register_number = self.business_register_number_label_context.text()
|
|
business_register_name = self.business_name_label_context.text()
|
|
business_register_date = self.business_date_label_context.text()
|
|
business_CS_call_Number = self.business_call_label_context.text()
|
|
|
|
if not business_nickName or not business_register_number or not business_register_name or not business_register_date or not business_CS_call_Number:
|
|
# 메시지 박스 생성 및 표시
|
|
QMessageBox.warning(self, "입력 오류", "빈 값을 채워주세요.")
|
|
|
|
self.logger.debug("Saving settings...")
|
|
self.status_label.setText(f'현재 상태: {business_number}사업자로 설정 저장하는 중...')
|
|
self.progress_bar.setValue(0)
|
|
|
|
# 현재 QLineEdit 값들을 가져와서 사업자 정보 업데이트
|
|
business_info = {
|
|
'사업자별칭': self.business_info_label_context.text(),
|
|
'사업자등록번호': self.business_register_number_label_context.text(),
|
|
'상호명': self.business_name_label_context.text(),
|
|
'등록날짜': self.business_date_label_context.text(),
|
|
'응대전화번호': self.business_call_label_context.text()
|
|
}
|
|
|
|
print(f"save_settings || business_info : {business_info}")
|
|
|
|
self.config.set_business_info(business_number, business_info)
|
|
|
|
self.config.set_api_keys(business_number, self.current_api_keys)
|
|
|
|
self.progress_bar.setValue(100)
|
|
self.status_label.setText('현재 상태: 설정 저장 완료')
|
|
await self.playwright_helper.close_browser()
|
|
self.actions[f'{business_number}번 슬롯'].setText(f'{business_number}번 슬롯 (저장됨)')
|
|
|
|
def updateSelect_Business(self):
|
|
try:
|
|
selected_business_index = self.select_Business.value()
|
|
selected_section = f'BUSINESS_{selected_business_index}'
|
|
print(f"---------------------------------------------------")
|
|
print(f"selected_section : {selected_section}")
|
|
print(f"self.current_api_keys : {self.current_api_keys}")
|
|
# config.ini 파일에서 선택된 사업자의 정보를 가져옴
|
|
if not self.config.config.has_section(selected_section):
|
|
|
|
QMessageBox.warning(self, "설정 오류", f"{selected_section} 섹션이 존재하지 않습니다.")
|
|
return
|
|
|
|
business_nickName = self.config.get(selected_section, '사업자별칭', fallback='')
|
|
print(f"business_nickName : {business_nickName}")
|
|
business_register_number = self.config.get(selected_section, '사업자등록번호', fallback='')
|
|
business_register_name = self.config.get(selected_section, '상호명', fallback='')
|
|
business_register_date = self.config.get(selected_section, '등록날짜', fallback='')
|
|
business_CS_call_Number = self.config.get(selected_section, '응대전화번호', fallback='')
|
|
|
|
# 마켓 API 정보 가져오기
|
|
saved_api_keys = self.config.get_api_keys(selected_section)
|
|
self.current_api_keys = saved_api_keys
|
|
|
|
print(f"saved_api_keys \n {saved_api_keys}")
|
|
|
|
# 마켓 정보 업데이트
|
|
self.update_market_info(saved_api_keys, {
|
|
'사업자별칭': business_nickName,
|
|
'사업자등록번호': business_register_number,
|
|
'상호명': business_register_name,
|
|
'등록날짜': business_register_date,
|
|
'응대전화번호': business_CS_call_Number
|
|
})
|
|
|
|
market_sections = [
|
|
'쿠팡', '스마트스토어', '11번가-국내', '11번가-글로벌',
|
|
'esm', '롯데온', '인터파크', '위메프', '옥션1.0'
|
|
]
|
|
|
|
for market in market_sections:
|
|
market_api_info = self.config.get(selected_section, market, fallback=None)
|
|
if market_api_info:
|
|
self.current_api_keys[market] = market_api_info
|
|
|
|
self.status_label.setText(f"{selected_section}의 정보를 로드했습니다.")
|
|
|
|
except Exception as e:
|
|
|
|
QMessageBox.critical(self, "오류", f"설정 로드 중 오류가 발생했습니다: {str(e)}")
|
|
|
|
def handle_change_business_button(self):
|
|
asyncio.create_task(self.perform_change_business())
|
|
|
|
async def perform_change_business(self):
|
|
await self.change_business()
|
|
await self.playwright_helper.set_headless_mode(False)
|
|
# webbrowser.open('https://www.percenty.co.k')
|
|
QMessageBox.information(self, "사업자 변경 완료", f"[{self.business_info_label_context.text()}] 사업자로의 변경이 완료되었습니다.")
|
|
|
|
# self.show_completion_dialog()
|
|
|
|
async def change_business(self):
|
|
try:
|
|
self.logger.debug("Changing business...")
|
|
self.status_label.setText('현재 상태: 사업자 변경 시작')
|
|
self.progress_bar.setValue(0)
|
|
|
|
# 사업자 드롭박스에서 선택된 사업자와 마켓 체크박스에서 선택된 마켓 가져오기
|
|
selected_business = self.business_dropdown.currentText()
|
|
selected_markets = [checkbox.text() for checkbox in self.market_checkbox_layout.children() if checkbox.isChecked()]
|
|
|
|
# 선택된 사업자와 마켓에 따라 API 키 변경 작업 수행
|
|
|
|
user_id = self.config.get('Percenty_Setting', 'user_id')
|
|
password = self.config.decrypt(self.config.get('Percenty_Setting', 'password'))
|
|
|
|
headless = self.config.get('Percenty_Setting', 'headless', fallback='')
|
|
if headless == 'True':
|
|
headless = True
|
|
else:
|
|
headless = False
|
|
|
|
self.isHeadless_mode = headless
|
|
|
|
await self.playwright_helper.init_browser(self.isHeadless_mode)
|
|
self.progress_bar.setValue(5)
|
|
self.status_label.setText('현재 상태: 브라우저 준비')
|
|
|
|
isSuccess = await self.playwright_helper.update_api_keys('https://percenty.co.kr', user_id, password, self.current_api_keys, self.status_label, self.progress_bar)
|
|
print(f"isSuccess : {isSuccess}")
|
|
self.progress_bar.setValue(100)
|
|
self.status_label.setText('현재 상태: 사업자 변경 완료')
|
|
# await self.playwright_helper.close_browser()
|
|
|
|
# # 작업 완료 창 띄우기
|
|
# await self.show_completion_dialog()
|
|
except asyncio.CancelledError:
|
|
print("Change business task was cancelled")
|
|
await self.playwright_helper.close_browser()
|
|
print("Browser closed safely after cancellation")
|
|
|
|
|
|
def show_completion_dialog(self):
|
|
dialog = QDialog(self)
|
|
dialog.setWindowTitle('작업 완료')
|
|
|
|
layout = QVBoxLayout()
|
|
completion_label = QLabel('사업자 변경 작업이 완료되었습니다.')
|
|
layout.addWidget(completion_label)
|
|
|
|
browser_button = QPushButton('브라우저 실행')
|
|
# browser_button.clicked.connect(lambda: asyncio.ensure_future(self.run_browser()))
|
|
|
|
# browser_button.clicked.connect(lambda: asyncio.create_task(self.run_browser()))
|
|
browser_button.clicked.connect(self.show_browser_button)
|
|
# self.handle_run_browser_button
|
|
# asyncio.create_task(self.run_browser())
|
|
|
|
# layout.addWidget(browser_button)
|
|
|
|
close_button = QPushButton('확인')
|
|
close_button.clicked.connect(dialog.accept)
|
|
# close_button.clicked.connect(self.playwright_helper.close_browser)
|
|
|
|
layout.addWidget(close_button)
|
|
|
|
dialog.setLayout(layout)
|
|
dialog.exec_()
|
|
|
|
def show_browser_button(self):
|
|
pass
|
|
|
|
async def run_browser(self):
|
|
try:
|
|
print("run_browser clicked")
|
|
await self.playwright_helper.init_browser(headless=False)
|
|
print("init_browser run")
|
|
user_id = self.config.get('Percenty_Setting', 'user_id')
|
|
print(f"user_id: {user_id}")
|
|
password = self.config.decrypt(self.config.get('Percenty_Setting', 'password'))
|
|
await self.playwright_helper.login('https://percenty.co.kr', user_id, password)
|
|
print("login run")
|
|
self.playwright_helper.browser.on('disconnected', self.on_browser_closed)
|
|
except asyncio.CancelledError:
|
|
print("Browser task was cancelled")
|
|
await self.playwright_helper.close_browser()
|
|
print("Browser closed safely after cancellation")
|
|
|
|
def on_browser_closed(self):
|
|
if self.playwright_helper.browser is not None:
|
|
print("브라우저 종료됨")
|
|
self.show_notification_after_browser_closed()
|
|
else:
|
|
print("브라우저가 이미 종료되었습니다.")
|
|
|
|
def show_notification_after_browser_closed(self):
|
|
msg_box = QMessageBox(self)
|
|
msg_box.setWindowTitle("Notification")
|
|
msg_box.setText("프로그램을 종료하시겠습니까?")
|
|
msg_box.setStandardButtons(QMessageBox.Cancel)
|
|
|
|
exit_program_button = QPushButton("프로그램 종료")
|
|
close_browser_button = QPushButton("브라우저만 종료")
|
|
|
|
msg_box.addButton(exit_program_button, QMessageBox.ActionRole)
|
|
msg_box.addButton(close_browser_button, QMessageBox.ActionRole)
|
|
|
|
exit_program_button.clicked.connect(self.exit_program)
|
|
close_browser_button.clicked.connect(lambda: asyncio.create_task(self.close_browser_only()))
|
|
|
|
msg_box.exec_()
|
|
|
|
def exit_program(self):
|
|
QApplication.instance().quit()
|
|
|
|
async def close_browser_only(self):
|
|
await self.playwright_helper.close_browser()
|
|
print("브라우저만 종료됨")
|
|
|
|
|
|
|
|
|
|
def save_business_action_triggered(self, action_name):
|
|
slot_number = int(action_name.split('번')[0])
|
|
|
|
# Check if the slot is already saved
|
|
if self.actions[f'{slot_number}번 슬롯'].text().endswith('(저장됨)'):
|
|
call_text = "기존의 내용이 있습니다. 그래도 저장하시겠습니까?"
|
|
|
|
else:
|
|
call_text = f"{slot_number}슬롯에 저장할까요"
|
|
|
|
# print(f"{slot_number}번자리")
|
|
asyncio.ensure_future(self.save_settings(slot_number, call_text))
|
|
self.update_menu_items()
|
|
|
|
|
|
def update_menu_items(self):
|
|
print("update_menu_items 호출됨")
|
|
for i, (text, action) in enumerate(self.actions.items(), start=1):
|
|
print(f"슬롯 {i} 상태 확인 중")
|
|
if self.config.has_business_info(i):
|
|
action.setText(f'{i}번 슬롯 (저장됨)')
|
|
print(f"슬롯 {i}: 저장됨")
|
|
else:
|
|
action.setText(f'{i}번 슬롯')
|
|
print(f"슬롯 {i}: 저장되지 않음")
|
|
if text.startswith(f'{self.current_slot}번'):
|
|
action.setProperty("highlighted", True)
|
|
else:
|
|
action.setProperty("highlighted", False)
|
|
self.menu.setStyleSheet("""
|
|
QMenu::item {
|
|
background-color: white;
|
|
color: black;
|
|
}
|
|
QMenu::item:selected {
|
|
background-color: lightgray;
|
|
}
|
|
QMenu::item[highlighted="true"] {
|
|
color: red;
|
|
}
|
|
""")
|
|
|
|
def create_reset_actions(self):
|
|
reset_all_action = QAction(FIF.REMOVE.icon(), '전체 초기화', self)
|
|
reset_all_action.triggered.connect(self.reset_all_slots)
|
|
self.menu2.addAction(reset_all_action)
|
|
|
|
for i in range(1, self.max_business_number + 1):
|
|
reset_action = QAction(FIF.REMOVE.icon(), f'{i}번 슬롯 초기화', self)
|
|
reset_action.triggered.connect(lambda checked, i=i: self.reset_slot(i))
|
|
self.menu2.addAction(reset_action)
|
|
|
|
def reset_all_slots(self):
|
|
confirmation = QMessageBox.question(self, "확인", "모든 슬롯을 초기화하시겠습니까?",
|
|
QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
|
|
if confirmation == QMessageBox.Yes:
|
|
for i in range(1, self.max_business_number + 1):
|
|
self.reset_slot(i, update_menu=False)
|
|
self.update_menu_items()
|
|
|
|
def reset_slot(self, slot_number, update_menu=True):
|
|
confirmation = QMessageBox.question(self, "확인", f"{slot_number}번 슬롯을 초기화하시겠습니까?",
|
|
QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
|
|
if confirmation == QMessageBox.Yes:
|
|
self.config.reset_business_info_and_keys(slot_number)
|
|
if update_menu:
|
|
self.update_menu_items()
|
|
|
|
def show_help(self):
|
|
dialog = HelpDialog()
|
|
dialog.exec_()
|
|
|
|
def show_percenty_settings(self):
|
|
self.psDialog.exec_()
|
|
|
|
def show_business_settings(self):
|
|
self.bsDialog.current_api_keys = self.current_api_keys
|
|
self.bsDialog.exec_()
|
|
|
|
|