from PyQt5.QtWidgets import (QMainWindow, QDesktopWidget, QMessageBox, QAction, QVBoxLayout, QHBoxLayout, QWidget, QPushButton, QLabel, QProgressBar, QComboBox, QCheckBox, QTextBrowser, QPlainTextEdit, QDialog, QFrame, QLineEdit, QGridLayout, QSpinBox) from PyQt5.QtCore import Qt from ui.percenty_settings import PercentySettingsDialog # from ui.business_settings import BusinessSettingsDialog from ui.business_set import BusinessSettings 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.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, 450, 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())) 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'), } elif market_name == '스마트스토어': api_keys = { '업로드할스마트스토어계정ID': market_details.get('업로드할스마트스토어계정id'), '업로드할스마트스토어계정PW': market_details.get('업로드할스마트스토어계정pw'), '애플리케이션ID': market_details.get('애플리케이션id'), '애플리케이션시크릿': market_details.get('애플리케이션시크릿'), } elif market_name == 'esm': api_keys = { '옥션ID': market_details.get('옥션id'), '지마켓ID': market_details.get('지마켓id'), } elif market_name == '11번가-국내': api_keys = { 'APIKEY': market_details.get('apikey'), } elif market_name == '11번가-글로벌': api_keys = { 'APIKEY': market_details.get('apikey'), } elif market_name == '롯데온': api_keys = { 'APIKEY': market_details.get('apikey'), } 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('공급계약일련번호'), } elif market_name == '위메프': api_keys = { 'APIKEY': market_details.get('apikey'), } elif market_name == '옥션1.0': api_keys = { 'APIKEY': market_details.get('apikey'), '멤버ID': market_details.get('멤버id'), } 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)}") async def change_business(self): 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('현재 상태: 브라우저 준비') await self.playwright_helper.update_api_keys('https://percenty.co.kr', user_id, password, self.current_api_keys, self.status_label, self.progress_bar) self.progress_bar.setValue(100) self.status_label.setText('현재 상태: 사업자 변경 완료') await self.playwright_helper.close_browser() # 작업 완료 창 띄우기 self.show_completion_dialog() 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_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())) layout.addWidget(browser_button) close_button = QPushButton('확인') close_button.clicked.connect(dialog.accept) layout.addWidget(close_button) dialog.setLayout(layout) dialog.exec_() async def run_browser(self): await self.playwright_helper.init_browser(headless=False) user_id = self.config.get('Percenty_Setting', 'user_id') password = self.config.decrypt(self.config.get('Percenty_Setting', 'password')) await self.playwright_helper.login_and_fetch_api_keys('https://percenty.co.kr', user_id, password) def show_help(self): dialog = HelpDialog() dialog.exec_() def show_percenty_settings(self): dialog = PercentySettingsDialog(self.config) dialog.exec_() def show_business_settings(self): dialog = BusinessSettings(self.max_business_number) dialog. dialog.exec_()