10.13 정리중

This commit is contained in:
R5600U_PC 2024-10-13 21:43:07 +09:00
parent ae42321b4f
commit 6be03a3c0b
8 changed files with 916 additions and 39 deletions

15
.vscode/launch.json vendored Normal file
View File

@ -0,0 +1,15 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Python Debugger: Current File",
"type": "debugpy",
"request": "launch",
"program": "${file}",
"console": "integratedTerminal"
}
]
}

Binary file not shown.

View File

@ -66340,3 +66340,841 @@ TypeError: 'NoneType' object does not support item assignment
2024-10-12 23:17:08,826 - gui.py:736 - default_logger - DEBUG - 3/[31]개 상품 수정 완료. 2024-10-12 23:17:08,826 - gui.py:736 - default_logger - DEBUG - 3/[31]개 상품 수정 완료.
2024-10-12 23:17:08,827 - gui.py:678 - default_logger - DEBUG - 번역 작업이 중단되었습니다. 2024-10-12 23:17:08,827 - gui.py:678 - default_logger - DEBUG - 번역 작업이 중단되었습니다.
2024-10-12 23:17:11,210 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... 2024-10-12 23:17:11,210 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다...
2024-10-13 11:23:42,172 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json
2024-10-13 11:23:42,173 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중...
2024-10-13 11:23:42,204 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다.
2024-10-13 11:23:42,204 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json
2024-10-13 11:23:42,211 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다.
2024-10-13 11:23:42,329 - cmb_diag.py:368 - default_logger - DEBUG - CrMoBi 단계 설정이 위젯에 반영되었습니다.
2024-10-13 11:23:42,336 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다.
2024-10-13 11:23:47,617 - gui.py:431 - default_logger - DEBUG - 가격 수정 버튼 - 활성화 선택
2024-10-13 11:23:48,853 - gui.py:524 - default_logger - DEBUG - 크롬 실행 버튼 클릭됨
2024-10-13 11:23:48,854 - gui.py:525 - default_logger - DEBUG - self.browser_controller.page : None
2024-10-13 11:23:48,854 - gui.py:560 - default_logger - DEBUG - 크롬 브라우저를 실행합니다...
2024-10-13 11:23:48,854 - browser_control.py:61 - default_logger - DEBUG - 크롬 브라우저 실행 중...
2024-10-13 11:23:52,543 - gui.py:555 - default_logger - DEBUG - 크무비 설정 버튼 클릭됨
2024-10-13 11:23:56,957 - browser_control.py:76 - default_logger - DEBUG - newPage 로딩 ...
2024-10-13 11:23:56,970 - browser_control.py:81 - default_logger - DEBUG - 페이지 제목: 퍼센티 - 셀러들을 위한 AI 구매대행 솔루션
2024-10-13 11:23:56,973 - browser_control.py:88 - default_logger - DEBUG - 크롬 창 핸들: 69950
2024-10-13 11:23:56,973 - browser_control.py:94 - default_logger - DEBUG - 로그인 시도 중: 직원 계정
2024-10-13 11:23:57,184 - browser_control.py:112 - default_logger - DEBUG - 로그인 완료: 직원 계정
2024-10-13 11:23:58,975 - browser_control.py:252 - default_logger - DEBUG - 다이얼로그가 발견되었습니다. 닫기 버튼을 클릭합니다.
2024-10-13 11:23:59,056 - browser_control.py:258 - default_logger - DEBUG - 다이얼로그를 성공적으로 닫았습니다.
2024-10-13 11:23:59,056 - gui.py:584 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 중...
2024-10-13 11:23:59,426 - browser_control.py:271 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 완료.
2024-10-13 11:23:59,426 - option.py:37 - default_logger - DEBUG - page객체 업데이트 : <Page url='https://www.percenty.co.kr/'>
2024-10-13 11:23:59,426 - title.py:31 - default_logger - DEBUG - page객체 업데이트 : <Page url='https://www.percenty.co.kr/'>
2024-10-13 11:23:59,426 - price.py:33 - default_logger - DEBUG - page객체 업데이트 : <Page url='https://www.percenty.co.kr/'>
2024-10-13 11:24:02,569 - gui.py:634 - default_logger - DEBUG - 번역 작업 버튼 클릭됨
2024-10-13 11:24:02,571 - gui.py:639 - default_logger - DEBUG - 번역 작업을 시작합니다...
2024-10-13 11:24:02,571 - browser_control.py:679 - default_logger - DEBUG - 페이지 스크롤 시작...
2024-10-13 11:24:03,168 - browser_control.py:689 - default_logger - DEBUG - 페이지 스크롤 완료.
2024-10-13 11:24:03,179 - browser_control.py:173 - default_logger - DEBUG - 가져온 텍스트: 총 31개 상품
2024-10-13 11:24:03,180 - gui.py:663 - default_logger - DEBUG - 현재 페이지: 1
2024-10-13 11:24:03,188 - browser_control.py:318 - default_logger - DEBUG - 현재 페이지의 수정할 상품 개수: 20
2024-10-13 11:24:03,189 - gui.py:681 - default_logger - DEBUG - 1/20: 세부사항 수정 작업 중...
2024-10-13 11:24:03,208 - browser_control.py:353 - default_logger - DEBUG - 상품의 '세부사항 수정 및 업로드' 버튼을 화면에 보이도록 스크롤.
2024-10-13 11:24:03,749 - browser_control.py:356 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 완료.
2024-10-13 11:24:04,342 - title.py:91 - default_logger - DEBUG - 원본 상품명을 가져오는 중입니다.
2024-10-13 11:24:04,362 - title.py:94 - default_logger - DEBUG - 원본 상품명: 液压电磁阀双向换向阀220v24vDSG-02-3C2/2B2/2B3B/3C3/3C6/03/D2
2024-10-13 11:24:04,368 - title.py:179 - default_logger - DEBUG - 마켓 : ss - 카테고리 텍스트를 가져오는 중입니다.
2024-10-13 11:24:04,369 - title.py:188 - default_logger - DEBUG - category_locator : div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=2
2024-10-13 11:24:04,380 - title.py:192 - default_logger - DEBUG - main_category_element : <Locator frame=<Frame name= url='https://www.percenty.co.kr/'> selector='div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=2'>
2024-10-13 11:24:04,386 - title.py:201 - default_logger - DEBUG - category_text_element : <Locator frame=<Frame name= url='https://www.percenty.co.kr/'> selector='div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=2 >> div.ant-col.css-1li46mu:nth-child(1)'>
2024-10-13 11:24:04,399 - title.py:214 - default_logger - DEBUG - 카테고리 text = 생활/건강-공구-에어공구-유압공구
2024-10-13 11:24:04,400 - gui.py:707 - default_logger - DEBUG - 가격수정 : True
2024-10-13 11:24:05,195 - browser_control.py:381 - default_logger - DEBUG - 가격 탭 클릭 완료.
2024-10-13 11:24:05,195 - price.py:65 - default_logger - DEBUG - 초기 더하기마진과 해외배송비 가격 정보를 수집합니다.
2024-10-13 11:24:05,427 - price.py:621 - default_logger - DEBUG - 더하기 마진 값: 10000
2024-10-13 11:24:05,445 - price.py:626 - default_logger - DEBUG - 해외 배송비 값: 50000
2024-10-13 11:24:05,445 - price.py:73 - default_logger - DEBUG - 옵션 가격 정보를 수집합니다.
2024-10-13 11:24:05,469 - price.py:524 - default_logger - DEBUG - 옵션 수: 18
2024-10-13 11:24:05,511 - price.py:601 - default_logger - ERROR - Failed to collect product costs and prices: 'coroutine' object has no attribute 'replace'
Traceback (most recent call last):
File "H:\py\autoTrans\price.py", line 569, in collect_product_costs_and_prices
cost_value = int(float(await product_cost_element.input_value().replace(",", "")))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'coroutine' object has no attribute 'replace'
2024-10-13 11:24:05,521 - price.py:500 - default_logger - ERROR - 원가기반 가격 계산 중 중 오류 발생: unsupported operand type(s) for /: 'PriceHandler' and 'float'
Traceback (most recent call last):
File "H:\py\autoTrans\price.py", line 484, in calc_initial_price
initial_cost_price = self.round_to_UP(initial_cost_price)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "H:\py\autoTrans\price.py", line 706, in round_to_UP
rounded_number = math.ceil(number / nearest) * nearest
~~~~~~~^~~~~~~~~
TypeError: unsupported operand type(s) for /: 'PriceHandler' and 'float'
2024-10-13 11:24:05,521 - price.py:83 - default_logger - DEBUG - 적정 판매가를 계산합니다.
2024-10-13 11:24:05,524 - price.py:122 - default_logger - ERROR - 가격 수정 중 오류 발생: 'NoneType' object does not support item assignment
Traceback (most recent call last):
File "H:\py\autoTrans\price.py", line 84, in process_price
self.optimal_price_config['sold_price'] = sold_price # 팔린가격 기본값(10000이 아닌 값이 있을 경우 팔린가격으로 간주)
~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^
TypeError: 'NoneType' object does not support item assignment
2024-10-13 11:24:05,700 - browser_control.py:508 - default_logger - DEBUG - 상품 수정 내용 저장 완료.
2024-10-13 11:24:05,702 - gui.py:731 - default_logger - DEBUG - 상품 세부사항 저장 중...
2024-10-13 11:24:06,044 - browser_control.py:500 - default_logger - DEBUG - 상품 수정 내용 저장 및 ECS 완료.
2024-10-13 11:24:06,047 - gui.py:736 - default_logger - DEBUG - 1/[31]개 상품 수정 완료.
2024-10-13 11:24:06,047 - gui.py:681 - default_logger - DEBUG - 2/20: 세부사항 수정 작업 중...
2024-10-13 11:24:06,142 - browser_control.py:353 - default_logger - DEBUG - 상품의 '세부사항 수정 및 업로드' 버튼을 화면에 보이도록 스크롤.
2024-10-13 11:24:06,525 - browser_control.py:356 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 완료.
2024-10-13 11:24:07,056 - title.py:91 - default_logger - DEBUG - 원본 상품명을 가져오는 중입니다.
2024-10-13 11:24:07,070 - title.py:94 - default_logger - DEBUG - 원본 상품명: 小型香水瓶分装中套机喷雾头胶水瓶内塞压盖机卡口封口手压封盖机
2024-10-13 11:24:07,072 - title.py:179 - default_logger - DEBUG - 마켓 : ss - 카테고리 텍스트를 가져오는 중입니다.
2024-10-13 11:24:07,073 - title.py:188 - default_logger - DEBUG - category_locator : div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=2
2024-10-13 11:24:07,083 - gui.py:757 - default_logger - DEBUG - 번역 작업을 중단합니다...
2024-10-13 11:24:07,086 - title.py:192 - default_logger - DEBUG - main_category_element : <Locator frame=<Frame name= url='https://www.percenty.co.kr/'> selector='div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=2'>
2024-10-13 11:24:07,092 - title.py:201 - default_logger - DEBUG - category_text_element : <Locator frame=<Frame name= url='https://www.percenty.co.kr/'> selector='div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=2 >> div.ant-col.css-1li46mu:nth-child(1)'>
2024-10-13 11:24:07,108 - title.py:214 - default_logger - DEBUG - 카테고리 text = 생활/건강-공구-에어공구-유압공구
2024-10-13 11:24:07,111 - gui.py:707 - default_logger - DEBUG - 가격수정 : True
2024-10-13 11:24:07,496 - browser_control.py:381 - default_logger - DEBUG - 가격 탭 클릭 완료.
2024-10-13 11:24:07,497 - price.py:65 - default_logger - DEBUG - 초기 더하기마진과 해외배송비 가격 정보를 수집합니다.
2024-10-13 11:24:07,639 - price.py:621 - default_logger - DEBUG - 더하기 마진 값: 10000
2024-10-13 11:24:07,661 - price.py:626 - default_logger - DEBUG - 해외 배송비 값: 30000
2024-10-13 11:24:07,661 - price.py:73 - default_logger - DEBUG - 옵션 가격 정보를 수집합니다.
2024-10-13 11:24:07,685 - price.py:524 - default_logger - DEBUG - 옵션 수: 4
2024-10-13 11:24:07,713 - price.py:601 - default_logger - ERROR - Failed to collect product costs and prices: 'coroutine' object has no attribute 'replace'
Traceback (most recent call last):
File "H:\py\autoTrans\price.py", line 569, in collect_product_costs_and_prices
cost_value = int(float(await product_cost_element.input_value().replace(",", "")))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'coroutine' object has no attribute 'replace'
2024-10-13 11:24:07,718 - price.py:500 - default_logger - ERROR - 원가기반 가격 계산 중 중 오류 발생: unsupported operand type(s) for /: 'PriceHandler' and 'float'
Traceback (most recent call last):
File "H:\py\autoTrans\price.py", line 484, in calc_initial_price
initial_cost_price = self.round_to_UP(initial_cost_price)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "H:\py\autoTrans\price.py", line 706, in round_to_UP
rounded_number = math.ceil(number / nearest) * nearest
~~~~~~~^~~~~~~~~
TypeError: unsupported operand type(s) for /: 'PriceHandler' and 'float'
2024-10-13 11:24:07,718 - price.py:83 - default_logger - DEBUG - 적정 판매가를 계산합니다.
2024-10-13 11:24:07,718 - price.py:122 - default_logger - ERROR - 가격 수정 중 오류 발생: 'NoneType' object does not support item assignment
Traceback (most recent call last):
File "H:\py\autoTrans\price.py", line 84, in process_price
self.optimal_price_config['sold_price'] = sold_price # 팔린가격 기본값(10000이 아닌 값이 있을 경우 팔린가격으로 간주)
~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^
TypeError: 'NoneType' object does not support item assignment
2024-10-13 11:24:07,886 - browser_control.py:508 - default_logger - DEBUG - 상품 수정 내용 저장 완료.
2024-10-13 11:24:07,887 - gui.py:731 - default_logger - DEBUG - 상품 세부사항 저장 중...
2024-10-13 11:24:08,180 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다...
2024-10-13 11:24:08,303 - browser_control.py:502 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Keyboard.press: Target page, context or browser has been closed
Traceback (most recent call last):
File "H:\py\autoTrans\browser_control.py", line 499, in save_and_ecs_product_edit
await self.page.keyboard.press("Escape")
File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 1302, in press
return mapping.from_maybe_impl(await self._impl_obj.press(key=key, delay=delay))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_input.py", line 38, in press
await self._channel.send("keyboardPress", locals_to_params(locals()))
File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send
return await self._connection.wrap_api_call(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call
raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None
playwright._impl._errors.TargetClosedError: Keyboard.press: Target page, context or browser has been closed
2024-10-13 11:24:08,308 - gui.py:736 - default_logger - DEBUG - 2/[31]개 상품 수정 완료.
2024-10-13 11:24:08,310 - gui.py:678 - default_logger - DEBUG - 번역 작업이 중단되었습니다.
2024-10-13 11:28:32,838 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json
2024-10-13 11:28:32,838 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중...
2024-10-13 11:28:32,848 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다.
2024-10-13 11:28:32,848 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json
2024-10-13 11:28:32,848 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다.
2024-10-13 11:28:32,962 - cmb_diag.py:368 - default_logger - DEBUG - CrMoBi 단계 설정이 위젯에 반영되었습니다.
2024-10-13 11:28:32,964 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다.
2024-10-13 11:28:34,581 - gui.py:431 - default_logger - DEBUG - 가격 수정 버튼 - 활성화 선택
2024-10-13 11:28:35,451 - gui.py:524 - default_logger - DEBUG - 크롬 실행 버튼 클릭됨
2024-10-13 11:28:35,451 - gui.py:525 - default_logger - DEBUG - self.browser_controller.page : None
2024-10-13 11:28:35,451 - gui.py:560 - default_logger - DEBUG - 크롬 브라우저를 실행합니다...
2024-10-13 11:28:35,451 - browser_control.py:61 - default_logger - DEBUG - 크롬 브라우저 실행 중...
2024-10-13 11:28:39,526 - browser_control.py:76 - default_logger - DEBUG - newPage 로딩 ...
2024-10-13 11:28:39,536 - browser_control.py:81 - default_logger - DEBUG - 페이지 제목: 퍼센티 - 셀러들을 위한 AI 구매대행 솔루션
2024-10-13 11:28:39,540 - browser_control.py:88 - default_logger - DEBUG - 크롬 창 핸들: 70174
2024-10-13 11:28:39,540 - browser_control.py:94 - default_logger - DEBUG - 로그인 시도 중: 직원 계정
2024-10-13 11:28:39,731 - browser_control.py:112 - default_logger - DEBUG - 로그인 완료: 직원 계정
2024-10-13 11:28:41,358 - browser_control.py:252 - default_logger - DEBUG - 다이얼로그가 발견되었습니다. 닫기 버튼을 클릭합니다.
2024-10-13 11:28:41,514 - browser_control.py:258 - default_logger - DEBUG - 다이얼로그를 성공적으로 닫았습니다.
2024-10-13 11:28:41,515 - gui.py:584 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 중...
2024-10-13 11:28:41,800 - browser_control.py:271 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 완료.
2024-10-13 11:28:41,801 - option.py:37 - default_logger - DEBUG - page객체 업데이트 : <Page url='https://www.percenty.co.kr/'>
2024-10-13 11:28:41,801 - title.py:31 - default_logger - DEBUG - page객체 업데이트 : <Page url='https://www.percenty.co.kr/'>
2024-10-13 11:28:41,802 - price.py:33 - default_logger - DEBUG - page객체 업데이트 : <Page url='https://www.percenty.co.kr/'>
2024-10-13 11:28:43,585 - gui.py:634 - default_logger - DEBUG - 번역 작업 버튼 클릭됨
2024-10-13 11:28:43,587 - gui.py:639 - default_logger - DEBUG - 번역 작업을 시작합니다...
2024-10-13 11:28:43,587 - browser_control.py:679 - default_logger - DEBUG - 페이지 스크롤 시작...
2024-10-13 11:28:44,182 - browser_control.py:689 - default_logger - DEBUG - 페이지 스크롤 완료.
2024-10-13 11:28:44,182 - browser_control.py:173 - default_logger - DEBUG - 가져온 텍스트: 총 31개 상품
2024-10-13 11:28:44,182 - gui.py:663 - default_logger - DEBUG - 현재 페이지: 1
2024-10-13 11:28:44,197 - browser_control.py:318 - default_logger - DEBUG - 현재 페이지의 수정할 상품 개수: 20
2024-10-13 11:28:44,199 - gui.py:681 - default_logger - DEBUG - 1/20: 세부사항 수정 작업 중...
2024-10-13 11:28:44,219 - browser_control.py:353 - default_logger - DEBUG - 상품의 '세부사항 수정 및 업로드' 버튼을 화면에 보이도록 스크롤.
2024-10-13 11:28:44,734 - browser_control.py:356 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 완료.
2024-10-13 11:28:45,306 - title.py:91 - default_logger - DEBUG - 원본 상품명을 가져오는 중입니다.
2024-10-13 11:28:45,325 - title.py:94 - default_logger - DEBUG - 원본 상품명: 液压电磁阀双向换向阀220v24vDSG-02-3C2/2B2/2B3B/3C3/3C6/03/D2
2024-10-13 11:28:45,556 - title.py:179 - default_logger - DEBUG - 마켓 : ss - 카테고리 텍스트를 가져오는 중입니다.
2024-10-13 11:28:45,556 - title.py:188 - default_logger - DEBUG - category_locator : div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=2
2024-10-13 11:28:45,567 - title.py:192 - default_logger - DEBUG - main_category_element : <Locator frame=<Frame name= url='https://www.percenty.co.kr/'> selector='div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=2'>
2024-10-13 11:28:45,572 - title.py:201 - default_logger - DEBUG - category_text_element : <Locator frame=<Frame name= url='https://www.percenty.co.kr/'> selector='div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=2 >> div.ant-col.css-1li46mu:nth-child(1)'>
2024-10-13 11:28:45,588 - title.py:214 - default_logger - DEBUG - 카테고리 text = 생활/건강-공구-에어공구-유압공구
2024-10-13 11:28:45,588 - gui.py:707 - default_logger - DEBUG - 가격수정 : True
2024-10-13 11:28:46,336 - browser_control.py:381 - default_logger - DEBUG - 가격 탭 클릭 완료.
2024-10-13 11:28:46,337 - price.py:65 - default_logger - DEBUG - 초기 더하기마진과 해외배송비 가격 정보를 수집합니다.
2024-10-13 11:28:46,544 - price.py:625 - default_logger - DEBUG - 더하기 마진 값: 10000
2024-10-13 11:28:46,610 - price.py:630 - default_logger - DEBUG - 해외 배송비 값: 50000
2024-10-13 11:28:46,610 - price.py:73 - default_logger - DEBUG - 옵션 가격 정보를 수집합니다.
2024-10-13 11:28:46,636 - price.py:524 - default_logger - DEBUG - 옵션 수: 18
2024-10-13 11:28:47,214 - price.py:599 - default_logger - DEBUG - 상품원가가 모였습니다.: [185, 185, 185, 185, 185, 308, 308, 335, 358, 358, 358, 358, 358, 358, 358, 358, 358, 525]
2024-10-13 11:28:47,214 - price.py:600 - default_logger - DEBUG - 최소원가: 37000, 최대원가: 105000, 평균원가: 63000, 상위평균원가: 84000
2024-10-13 11:28:47,214 - price.py:485 - default_logger - DEBUG - 원가에 카드수수료 4.0%, 기본마진 24.0% 적용된 계산원가: 108000
2024-10-13 11:28:47,229 - price.py:464 - default_logger - ERROR - 계산된 값 입력 실패: 'NoneType' object has no attribute 'get'
Traceback (most recent call last):
File "H:\py\autoTrans\price.py", line 415, in calculate_additional_margin_with_extended_thresholds
thresholds = config.get('thresholds', [])
^^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'get'
2024-10-13 11:28:47,229 - price.py:489 - default_logger - DEBUG - 계산원가 기준 해외배송비: 0
2024-10-13 11:28:47,229 - price.py:303 - default_logger - ERROR - 계산된 값 입력 실패: 'NoneType' object has no attribute 'get'
Traceback (most recent call last):
File "H:\py\autoTrans\price.py", line 240, in calculate_shipping_cost_with_extended_thresholds
min_price_for_extra_shipping = config.get('min_price_for_extra_shipping', 0)
^^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'get'
2024-10-13 11:28:47,229 - price.py:493 - default_logger - DEBUG - 계산원가 기준 더하기마진: 10000
2024-10-13 11:28:47,229 - price.py:496 - default_logger - DEBUG - 원가기반 가격: 118000
2024-10-13 11:28:47,229 - price.py:83 - default_logger - DEBUG - 적정 판매가를 계산합니다.
2024-10-13 11:28:47,229 - price.py:122 - default_logger - ERROR - 가격 수정 중 오류 발생: 'NoneType' object does not support item assignment
Traceback (most recent call last):
File "H:\py\autoTrans\price.py", line 84, in process_price
self.optimal_price_config['sold_price'] = sold_price # 팔린가격 기본값(10000이 아닌 값이 있을 경우 팔린가격으로 간주)
~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^
TypeError: 'NoneType' object does not support item assignment
2024-10-13 11:28:47,320 - browser_control.py:508 - default_logger - DEBUG - 상품 수정 내용 저장 완료.
2024-10-13 11:28:47,320 - gui.py:731 - default_logger - DEBUG - 상품 세부사항 저장 중...
2024-10-13 11:28:47,693 - browser_control.py:500 - default_logger - DEBUG - 상품 수정 내용 저장 및 ECS 완료.
2024-10-13 11:28:47,696 - gui.py:736 - default_logger - DEBUG - 1/[31]개 상품 수정 완료.
2024-10-13 11:28:47,696 - gui.py:681 - default_logger - DEBUG - 2/20: 세부사항 수정 작업 중...
2024-10-13 11:28:47,786 - browser_control.py:353 - default_logger - DEBUG - 상품의 '세부사항 수정 및 업로드' 버튼을 화면에 보이도록 스크롤.
2024-10-13 11:28:48,158 - browser_control.py:356 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 완료.
2024-10-13 11:28:48,464 - gui.py:757 - default_logger - DEBUG - 번역 작업을 중단합니다...
2024-10-13 11:28:48,669 - title.py:91 - default_logger - DEBUG - 원본 상품명을 가져오는 중입니다.
2024-10-13 11:28:48,691 - title.py:94 - default_logger - DEBUG - 원본 상품명: 小型香水瓶分装中套机喷雾头胶水瓶内塞压盖机卡口封口手压封盖机
2024-10-13 11:28:48,691 - title.py:179 - default_logger - DEBUG - 마켓 : ss - 카테고리 텍스트를 가져오는 중입니다.
2024-10-13 11:28:48,693 - title.py:188 - default_logger - DEBUG - category_locator : div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=2
2024-10-13 11:28:48,703 - title.py:192 - default_logger - DEBUG - main_category_element : <Locator frame=<Frame name= url='https://www.percenty.co.kr/'> selector='div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=2'>
2024-10-13 11:28:48,710 - title.py:201 - default_logger - DEBUG - category_text_element : <Locator frame=<Frame name= url='https://www.percenty.co.kr/'> selector='div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=2 >> div.ant-col.css-1li46mu:nth-child(1)'>
2024-10-13 11:28:48,720 - title.py:214 - default_logger - DEBUG - 카테고리 text = 생활/건강-공구-에어공구-유압공구
2024-10-13 11:28:48,720 - gui.py:707 - default_logger - DEBUG - 가격수정 : True
2024-10-13 11:28:49,119 - browser_control.py:381 - default_logger - DEBUG - 가격 탭 클릭 완료.
2024-10-13 11:28:49,120 - price.py:65 - default_logger - DEBUG - 초기 더하기마진과 해외배송비 가격 정보를 수집합니다.
2024-10-13 11:28:49,254 - price.py:625 - default_logger - DEBUG - 더하기 마진 값: 10000
2024-10-13 11:28:49,271 - price.py:630 - default_logger - DEBUG - 해외 배송비 값: 30000
2024-10-13 11:28:49,272 - price.py:73 - default_logger - DEBUG - 옵션 가격 정보를 수집합니다.
2024-10-13 11:28:49,297 - price.py:524 - default_logger - DEBUG - 옵션 수: 4
2024-10-13 11:28:49,455 - price.py:599 - default_logger - DEBUG - 상품원가가 모였습니다.: [189, 189, 189, 229]
2024-10-13 11:28:49,455 - price.py:600 - default_logger - DEBUG - 최소원가: 38000, 최대원가: 46000, 평균원가: 40000, 상위평균원가: 43000
2024-10-13 11:28:49,455 - price.py:485 - default_logger - DEBUG - 원가에 카드수수료 4.0%, 기본마진 24.0% 적용된 계산원가: 56000
2024-10-13 11:28:49,455 - price.py:464 - default_logger - ERROR - 계산된 값 입력 실패: 'NoneType' object has no attribute 'get'
Traceback (most recent call last):
File "H:\py\autoTrans\price.py", line 415, in calculate_additional_margin_with_extended_thresholds
thresholds = config.get('thresholds', [])
^^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'get'
2024-10-13 11:28:49,455 - price.py:489 - default_logger - DEBUG - 계산원가 기준 해외배송비: 0
2024-10-13 11:28:49,455 - price.py:303 - default_logger - ERROR - 계산된 값 입력 실패: 'NoneType' object has no attribute 'get'
Traceback (most recent call last):
File "H:\py\autoTrans\price.py", line 240, in calculate_shipping_cost_with_extended_thresholds
min_price_for_extra_shipping = config.get('min_price_for_extra_shipping', 0)
^^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'get'
2024-10-13 11:28:49,455 - price.py:493 - default_logger - DEBUG - 계산원가 기준 더하기마진: 10000
2024-10-13 11:28:49,455 - price.py:496 - default_logger - DEBUG - 원가기반 가격: 66000
2024-10-13 11:28:49,455 - price.py:83 - default_logger - DEBUG - 적정 판매가를 계산합니다.
2024-10-13 11:28:49,455 - price.py:122 - default_logger - ERROR - 가격 수정 중 오류 발생: 'NoneType' object does not support item assignment
Traceback (most recent call last):
File "H:\py\autoTrans\price.py", line 84, in process_price
self.optimal_price_config['sold_price'] = sold_price # 팔린가격 기본값(10000이 아닌 값이 있을 경우 팔린가격으로 간주)
~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^
TypeError: 'NoneType' object does not support item assignment
2024-10-13 11:28:49,562 - browser_control.py:508 - default_logger - DEBUG - 상품 수정 내용 저장 완료.
2024-10-13 11:28:49,562 - gui.py:731 - default_logger - DEBUG - 상품 세부사항 저장 중...
2024-10-13 11:28:49,899 - browser_control.py:500 - default_logger - DEBUG - 상품 수정 내용 저장 및 ECS 완료.
2024-10-13 11:28:49,902 - gui.py:736 - default_logger - DEBUG - 2/[31]개 상품 수정 완료.
2024-10-13 11:28:49,902 - gui.py:678 - default_logger - DEBUG - 번역 작업이 중단되었습니다.
2024-10-13 11:28:50,652 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다...
2024-10-13 11:41:53,310 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json
2024-10-13 11:41:53,310 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중...
2024-10-13 11:41:53,320 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다.
2024-10-13 11:41:53,321 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json
2024-10-13 11:41:53,321 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다.
2024-10-13 11:41:53,321 - price.py:56 - default_logger - DEBUG - self.shipping_config : {'min_price_for_extra_shipping': 50000, 'thresholds': [50000, 100000, 200000], 'increment_unit': 20000, 'additional_costs': [5000, 7000, 9000]}
2024-10-13 11:41:53,321 - price.py:58 - default_logger - DEBUG - self.margin_config : {'thresholds': [50000, 70000, 100000, 150000, 200000, 300000, 400000, 500000, 1000000], 'additional_margins': [5000, 10000, 15000, 25000, 35000, 50000, 70000, 90000, 120000]}
2024-10-13 11:41:53,321 - price.py:60 - default_logger - DEBUG - self.optimal_price_config : {'sold_price': None, 'cost_price2X': None, 'calculated_price': None, 'lower_bound': 0.85, 'upper_bound': 1.15, 'ratios': {'sold_price': 0.5, 'cost_price2X': 0.3, 'calculated_price': 0.2}}
2024-10-13 11:41:53,415 - cmb_diag.py:368 - default_logger - DEBUG - CrMoBi 단계 설정이 위젯에 반영되었습니다.
2024-10-13 11:41:53,415 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다.
2024-10-13 11:47:55,625 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다...
2024-10-13 11:48:00,000 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json
2024-10-13 11:48:00,001 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중...
2024-10-13 11:48:00,010 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다.
2024-10-13 11:48:00,010 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json
2024-10-13 11:48:00,010 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다.
2024-10-13 11:48:00,010 - price.py:56 - default_logger - DEBUG - self.shipping_config : {'min_price_for_extra_shipping': 50000, 'thresholds': [50000, 100000, 200000], 'increment_unit': 20000, 'additional_costs': [5000, 7000, 9000]}
2024-10-13 11:48:00,010 - price.py:58 - default_logger - DEBUG - self.margin_config : {'thresholds': [50000, 70000, 100000, 150000, 200000, 300000, 400000, 500000, 1000000], 'additional_margins': [5000, 10000, 15000, 25000, 35000, 50000, 70000, 90000, 120000]}
2024-10-13 11:48:00,010 - price.py:60 - default_logger - DEBUG - self.optimal_price_config : {'sold_price': None, 'cost_price2X': None, 'calculated_price': None, 'lower_bound': 0.85, 'upper_bound': 1.15, 'ratios': {'sold_price': 0.5, 'cost_price2X': 0.3, 'calculated_price': 0.2}}
2024-10-13 11:48:00,113 - cmb_diag.py:368 - default_logger - DEBUG - CrMoBi 단계 설정이 위젯에 반영되었습니다.
2024-10-13 11:48:00,113 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다.
2024-10-13 11:48:02,490 - gui.py:431 - default_logger - DEBUG - 가격 수정 버튼 - 활성화 선택
2024-10-13 11:48:04,050 - gui.py:524 - default_logger - DEBUG - 크롬 실행 버튼 클릭됨
2024-10-13 11:48:04,052 - gui.py:525 - default_logger - DEBUG - self.browser_controller.page : None
2024-10-13 11:48:04,052 - gui.py:560 - default_logger - DEBUG - 크롬 브라우저를 실행합니다...
2024-10-13 11:48:04,052 - browser_control.py:61 - default_logger - DEBUG - 크롬 브라우저 실행 중...
2024-10-13 11:48:08,379 - browser_control.py:76 - default_logger - DEBUG - newPage 로딩 ...
2024-10-13 11:48:08,383 - browser_control.py:81 - default_logger - DEBUG - 페이지 제목: 퍼센티 - 셀러들을 위한 AI 구매대행 솔루션
2024-10-13 11:48:08,383 - browser_control.py:88 - default_logger - DEBUG - 크롬 창 핸들: 397790
2024-10-13 11:48:08,383 - browser_control.py:94 - default_logger - DEBUG - 로그인 시도 중: 직원 계정
2024-10-13 11:48:08,577 - browser_control.py:112 - default_logger - DEBUG - 로그인 완료: 직원 계정
2024-10-13 11:48:10,337 - browser_control.py:252 - default_logger - DEBUG - 다이얼로그가 발견되었습니다. 닫기 버튼을 클릭합니다.
2024-10-13 11:48:10,515 - browser_control.py:258 - default_logger - DEBUG - 다이얼로그를 성공적으로 닫았습니다.
2024-10-13 11:48:10,515 - gui.py:584 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 중...
2024-10-13 11:48:10,829 - browser_control.py:271 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 완료.
2024-10-13 11:48:10,830 - option.py:37 - default_logger - DEBUG - page객체 업데이트 : <Page url='https://www.percenty.co.kr/'>
2024-10-13 11:48:10,831 - title.py:31 - default_logger - DEBUG - page객체 업데이트 : <Page url='https://www.percenty.co.kr/'>
2024-10-13 11:48:10,832 - price.py:33 - default_logger - DEBUG - page객체 업데이트 : <Page url='https://www.percenty.co.kr/'>
2024-10-13 11:48:13,324 - gui.py:634 - default_logger - DEBUG - 번역 작업 버튼 클릭됨
2024-10-13 11:48:13,324 - gui.py:639 - default_logger - DEBUG - 번역 작업을 시작합니다...
2024-10-13 11:48:13,326 - browser_control.py:679 - default_logger - DEBUG - 페이지 스크롤 시작...
2024-10-13 11:48:13,912 - browser_control.py:689 - default_logger - DEBUG - 페이지 스크롤 완료.
2024-10-13 11:48:13,917 - browser_control.py:173 - default_logger - DEBUG - 가져온 텍스트: 총 31개 상품
2024-10-13 11:48:13,918 - gui.py:663 - default_logger - DEBUG - 현재 페이지: 1
2024-10-13 11:48:13,925 - browser_control.py:318 - default_logger - DEBUG - 현재 페이지의 수정할 상품 개수: 20
2024-10-13 11:48:13,925 - gui.py:681 - default_logger - DEBUG - 1/20: 세부사항 수정 작업 중...
2024-10-13 11:48:13,948 - browser_control.py:353 - default_logger - DEBUG - 상품의 '세부사항 수정 및 업로드' 버튼을 화면에 보이도록 스크롤.
2024-10-13 11:48:14,471 - browser_control.py:356 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 완료.
2024-10-13 11:48:15,044 - title.py:91 - default_logger - DEBUG - 원본 상품명을 가져오는 중입니다.
2024-10-13 11:48:15,060 - title.py:94 - default_logger - DEBUG - 원본 상품명: 液压电磁阀双向换向阀220v24vDSG-02-3C2/2B2/2B3B/3C3/3C6/03/D2
2024-10-13 11:48:15,304 - title.py:179 - default_logger - DEBUG - 마켓 : ss - 카테고리 텍스트를 가져오는 중입니다.
2024-10-13 11:48:15,304 - title.py:188 - default_logger - DEBUG - category_locator : div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=2
2024-10-13 11:48:15,324 - title.py:192 - default_logger - DEBUG - main_category_element : <Locator frame=<Frame name= url='https://www.percenty.co.kr/'> selector='div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=2'>
2024-10-13 11:48:15,331 - title.py:201 - default_logger - DEBUG - category_text_element : <Locator frame=<Frame name= url='https://www.percenty.co.kr/'> selector='div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=2 >> div.ant-col.css-1li46mu:nth-child(1)'>
2024-10-13 11:48:15,339 - title.py:214 - default_logger - DEBUG - 카테고리 text = 생활/건강-공구-에어공구-유압공구
2024-10-13 11:48:15,347 - gui.py:707 - default_logger - DEBUG - 가격수정 : True
2024-10-13 11:48:16,102 - browser_control.py:381 - default_logger - DEBUG - 가격 탭 클릭 완료.
2024-10-13 11:48:16,102 - price.py:68 - default_logger - DEBUG - 초기 더하기마진과 해외배송비 가격 정보를 수집합니다.
2024-10-13 11:48:16,335 - price.py:628 - default_logger - DEBUG - 더하기 마진 값: 10000
2024-10-13 11:48:16,384 - price.py:633 - default_logger - DEBUG - 해외 배송비 값: 50000
2024-10-13 11:48:16,384 - price.py:76 - default_logger - DEBUG - 옵션 가격 정보를 수집합니다.
2024-10-13 11:48:16,409 - price.py:527 - default_logger - DEBUG - 옵션 수: 18
2024-10-13 11:48:16,979 - price.py:602 - default_logger - DEBUG - 상품원가가 모였습니다.: [185, 185, 185, 185, 185, 308, 308, 335, 358, 358, 358, 358, 358, 358, 358, 358, 358, 525]
2024-10-13 11:48:16,981 - price.py:603 - default_logger - DEBUG - 최소원가: 37000, 최대원가: 105000, 평균원가: 63000, 상위평균원가: 84000
2024-10-13 11:48:16,981 - price.py:488 - default_logger - DEBUG - 원가에 카드수수료 4.0%, 기본마진 24.0% 적용된 계산원가: 108000
2024-10-13 11:48:16,981 - price.py:467 - default_logger - ERROR - 계산된 값 입력 실패: 'NoneType' object has no attribute 'get'
Traceback (most recent call last):
File "H:\py\autoTrans\price.py", line 418, in calculate_additional_margin_with_extended_thresholds
thresholds = self.margin_config.get('thresholds', [])
^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'get'
2024-10-13 11:48:16,983 - price.py:492 - default_logger - DEBUG - 계산원가 기준 해외배송비: 0
2024-10-13 11:48:16,984 - price.py:306 - default_logger - ERROR - 계산된 값 입력 실패: 'NoneType' object has no attribute 'get'
Traceback (most recent call last):
File "H:\py\autoTrans\price.py", line 243, in calculate_shipping_cost_with_extended_thresholds
min_price_for_extra_shipping = self.shipping_config.get('min_price_for_extra_shipping', 0)
^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'get'
2024-10-13 11:48:16,984 - price.py:496 - default_logger - DEBUG - 계산원가 기준 더하기마진: 10000
2024-10-13 11:48:16,984 - price.py:499 - default_logger - DEBUG - 원가기반 가격: 118000
2024-10-13 11:48:16,984 - price.py:86 - default_logger - DEBUG - 적정 판매가를 계산합니다.
2024-10-13 11:48:16,984 - price.py:125 - default_logger - ERROR - 가격 수정 중 오류 발생: 'NoneType' object does not support item assignment
Traceback (most recent call last):
File "H:\py\autoTrans\price.py", line 87, in process_price
self.optimal_price_config['sold_price'] = sold_price # 팔린가격 기본값(10000이 아닌 값이 있을 경우 팔린가격으로 간주)
~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^
TypeError: 'NoneType' object does not support item assignment
2024-10-13 11:48:17,132 - browser_control.py:508 - default_logger - DEBUG - 상품 수정 내용 저장 완료.
2024-10-13 11:48:17,133 - gui.py:731 - default_logger - DEBUG - 상품 세부사항 저장 중...
2024-10-13 11:48:17,470 - browser_control.py:500 - default_logger - DEBUG - 상품 수정 내용 저장 및 ECS 완료.
2024-10-13 11:48:17,473 - gui.py:736 - default_logger - DEBUG - 1/[31]개 상품 수정 완료.
2024-10-13 11:48:17,474 - gui.py:681 - default_logger - DEBUG - 2/20: 세부사항 수정 작업 중...
2024-10-13 11:48:17,565 - browser_control.py:353 - default_logger - DEBUG - 상품의 '세부사항 수정 및 업로드' 버튼을 화면에 보이도록 스크롤.
2024-10-13 11:48:17,942 - browser_control.py:356 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 완료.
2024-10-13 11:48:18,311 - gui.py:757 - default_logger - DEBUG - 번역 작업을 중단합니다...
2024-10-13 11:48:18,456 - title.py:91 - default_logger - DEBUG - 원본 상품명을 가져오는 중입니다.
2024-10-13 11:48:18,464 - title.py:94 - default_logger - DEBUG - 원본 상품명: 小型香水瓶分装中套机喷雾头胶水瓶内塞压盖机卡口封口手压封盖机
2024-10-13 11:48:18,464 - title.py:179 - default_logger - DEBUG - 마켓 : ss - 카테고리 텍스트를 가져오는 중입니다.
2024-10-13 11:48:18,464 - title.py:188 - default_logger - DEBUG - category_locator : div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=2
2024-10-13 11:48:18,483 - title.py:192 - default_logger - DEBUG - main_category_element : <Locator frame=<Frame name= url='https://www.percenty.co.kr/'> selector='div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=2'>
2024-10-13 11:48:18,490 - title.py:201 - default_logger - DEBUG - category_text_element : <Locator frame=<Frame name= url='https://www.percenty.co.kr/'> selector='div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=2 >> div.ant-col.css-1li46mu:nth-child(1)'>
2024-10-13 11:48:18,499 - title.py:214 - default_logger - DEBUG - 카테고리 text = 생활/건강-공구-에어공구-유압공구
2024-10-13 11:48:18,499 - gui.py:707 - default_logger - DEBUG - 가격수정 : True
2024-10-13 11:48:18,894 - browser_control.py:381 - default_logger - DEBUG - 가격 탭 클릭 완료.
2024-10-13 11:48:18,894 - price.py:68 - default_logger - DEBUG - 초기 더하기마진과 해외배송비 가격 정보를 수집합니다.
2024-10-13 11:48:19,053 - price.py:628 - default_logger - DEBUG - 더하기 마진 값: 10000
2024-10-13 11:48:19,087 - price.py:633 - default_logger - DEBUG - 해외 배송비 값: 30000
2024-10-13 11:48:19,087 - price.py:76 - default_logger - DEBUG - 옵션 가격 정보를 수집합니다.
2024-10-13 11:48:19,112 - price.py:527 - default_logger - DEBUG - 옵션 수: 4
2024-10-13 11:48:19,197 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다...
2024-10-13 11:54:17,684 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json
2024-10-13 11:54:17,684 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중...
2024-10-13 11:54:17,700 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다.
2024-10-13 11:54:17,700 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json
2024-10-13 11:54:17,700 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다.
2024-10-13 11:54:17,701 - price.py:56 - default_logger - DEBUG - self.shipping_config : {'min_price_for_extra_shipping': 50000, 'thresholds': [50000, 100000, 200000], 'increment_unit': 20000, 'additional_costs': [5000, 7000, 9000]}
2024-10-13 11:54:17,701 - price.py:58 - default_logger - DEBUG - self.margin_config : {'thresholds': [50000, 70000, 100000, 150000, 200000, 300000, 400000, 500000, 1000000], 'additional_margins': [5000, 10000, 15000, 25000, 35000, 50000, 70000, 90000, 120000]}
2024-10-13 11:54:17,701 - price.py:60 - default_logger - DEBUG - self.optimal_price_config : {'sold_price': None, 'cost_price2X': None, 'calculated_price': None, 'lower_bound': 0.85, 'upper_bound': 1.15, 'ratios': {'sold_price': 0.5, 'cost_price2X': 0.3, 'calculated_price': 0.2}}
2024-10-13 11:54:17,840 - cmb_diag.py:368 - default_logger - DEBUG - CrMoBi 단계 설정이 위젯에 반영되었습니다.
2024-10-13 11:54:17,840 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다.
2024-10-13 11:54:23,375 - gui.py:524 - default_logger - DEBUG - 크롬 실행 버튼 클릭됨
2024-10-13 11:54:23,375 - gui.py:525 - default_logger - DEBUG - self.browser_controller.page : None
2024-10-13 11:54:23,377 - gui.py:560 - default_logger - DEBUG - 크롬 브라우저를 실행합니다...
2024-10-13 11:54:23,377 - browser_control.py:61 - default_logger - DEBUG - 크롬 브라우저 실행 중...
2024-10-13 11:54:27,878 - browser_control.py:76 - default_logger - DEBUG - newPage 로딩 ...
2024-10-13 11:54:27,894 - browser_control.py:81 - default_logger - DEBUG - 페이지 제목: 퍼센티 - 셀러들을 위한 AI 구매대행 솔루션
2024-10-13 11:54:27,899 - browser_control.py:88 - default_logger - DEBUG - 크롬 창 핸들: 135768
2024-10-13 11:54:27,899 - browser_control.py:94 - default_logger - DEBUG - 로그인 시도 중: 직원 계정
2024-10-13 11:54:28,212 - browser_control.py:112 - default_logger - DEBUG - 로그인 완료: 직원 계정
2024-10-13 11:54:29,793 - browser_control.py:252 - default_logger - DEBUG - 다이얼로그가 발견되었습니다. 닫기 버튼을 클릭합니다.
2024-10-13 11:54:30,026 - browser_control.py:258 - default_logger - DEBUG - 다이얼로그를 성공적으로 닫았습니다.
2024-10-13 11:54:30,029 - gui.py:584 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 중...
2024-10-13 11:54:30,387 - browser_control.py:271 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 완료.
2024-10-13 11:54:30,389 - option.py:37 - default_logger - DEBUG - page객체 업데이트 : <Page url='https://www.percenty.co.kr/'>
2024-10-13 11:54:30,389 - title.py:31 - default_logger - DEBUG - page객체 업데이트 : <Page url='https://www.percenty.co.kr/'>
2024-10-13 11:54:30,389 - price.py:33 - default_logger - DEBUG - page객체 업데이트 : <Page url='https://www.percenty.co.kr/'>
2024-10-13 11:54:43,859 - gui.py:431 - default_logger - DEBUG - 가격 수정 버튼 - 활성화 선택
2024-10-13 11:54:50,742 - gui.py:634 - default_logger - DEBUG - 번역 작업 버튼 클릭됨
2024-10-13 11:54:50,743 - gui.py:639 - default_logger - DEBUG - 번역 작업을 시작합니다...
2024-10-13 11:54:50,743 - browser_control.py:679 - default_logger - DEBUG - 페이지 스크롤 시작...
2024-10-13 11:54:51,417 - browser_control.py:689 - default_logger - DEBUG - 페이지 스크롤 완료.
2024-10-13 11:54:51,429 - browser_control.py:173 - default_logger - DEBUG - 가져온 텍스트: 총 31개 상품
2024-10-13 11:54:51,429 - gui.py:663 - default_logger - DEBUG - 현재 페이지: 1
2024-10-13 11:54:51,443 - browser_control.py:318 - default_logger - DEBUG - 현재 페이지의 수정할 상품 개수: 20
2024-10-13 11:54:51,443 - gui.py:681 - default_logger - DEBUG - 1/20: 세부사항 수정 작업 중...
2024-10-13 11:54:51,505 - browser_control.py:353 - default_logger - DEBUG - 상품의 '세부사항 수정 및 업로드' 버튼을 화면에 보이도록 스크롤.
2024-10-13 11:54:52,037 - browser_control.py:356 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 완료.
2024-10-13 11:54:52,556 - title.py:91 - default_logger - DEBUG - 원본 상품명을 가져오는 중입니다.
2024-10-13 11:54:52,587 - title.py:94 - default_logger - DEBUG - 원본 상품명: 液压电磁阀双向换向阀220v24vDSG-02-3C2/2B2/2B3B/3C3/3C6/03/D2
2024-10-13 11:54:52,827 - title.py:179 - default_logger - DEBUG - 마켓 : ss - 카테고리 텍스트를 가져오는 중입니다.
2024-10-13 11:54:52,828 - title.py:188 - default_logger - DEBUG - category_locator : div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=2
2024-10-13 11:54:52,846 - title.py:192 - default_logger - DEBUG - main_category_element : <Locator frame=<Frame name= url='https://www.percenty.co.kr/'> selector='div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=2'>
2024-10-13 11:54:52,863 - title.py:201 - default_logger - DEBUG - category_text_element : <Locator frame=<Frame name= url='https://www.percenty.co.kr/'> selector='div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=2 >> div.ant-col.css-1li46mu:nth-child(1)'>
2024-10-13 11:54:52,893 - title.py:214 - default_logger - DEBUG - 카테고리 text = 생활/건강-공구-에어공구-유압공구
2024-10-13 11:54:52,894 - gui.py:707 - default_logger - DEBUG - 가격수정 : True
2024-10-13 11:54:53,639 - browser_control.py:381 - default_logger - DEBUG - 가격 탭 클릭 완료.
2024-10-13 11:54:53,639 - price.py:68 - default_logger - DEBUG - 초기 더하기마진과 해외배송비 가격 정보를 수집합니다.
2024-10-13 11:54:53,859 - price.py:628 - default_logger - DEBUG - 더하기 마진 값: 10000
2024-10-13 11:54:53,920 - price.py:633 - default_logger - DEBUG - 해외 배송비 값: 50000
2024-10-13 11:54:53,920 - price.py:76 - default_logger - DEBUG - 옵션 가격 정보를 수집합니다.
2024-10-13 11:54:53,967 - price.py:527 - default_logger - DEBUG - 옵션 수: 18
2024-10-13 11:54:55,077 - price.py:602 - default_logger - DEBUG - 상품원가가 모였습니다.: [185, 185, 185, 185, 185, 308, 308, 335, 358, 358, 358, 358, 358, 358, 358, 358, 358, 525]
2024-10-13 11:54:55,077 - price.py:603 - default_logger - DEBUG - 최소원가: 37000, 최대원가: 105000, 평균원가: 63000, 상위평균원가: 84000
2024-10-13 11:54:55,092 - price.py:488 - default_logger - DEBUG - 원가에 카드수수료 4.0%, 기본마진 24.0% 적용된 계산원가: 108000
2024-10-13 11:54:55,092 - price.py:467 - default_logger - ERROR - 계산된 값 입력 실패: 'NoneType' object has no attribute 'get'
Traceback (most recent call last):
File "H:\py\autoTrans\price.py", line 418, in calculate_additional_margin_with_extended_thresholds
thresholds = self.margin_config.get('thresholds', [])
^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'get'
2024-10-13 11:54:55,092 - price.py:492 - default_logger - DEBUG - 계산원가 기준 해외배송비: 0
2024-10-13 11:54:55,092 - price.py:306 - default_logger - ERROR - 계산된 값 입력 실패: 'NoneType' object has no attribute 'get'
Traceback (most recent call last):
File "H:\py\autoTrans\price.py", line 243, in calculate_shipping_cost_with_extended_thresholds
min_price_for_extra_shipping = self.shipping_config.get('min_price_for_extra_shipping', 0)
^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'get'
2024-10-13 11:54:55,092 - price.py:496 - default_logger - DEBUG - 계산원가 기준 더하기마진: 10000
2024-10-13 11:54:55,092 - price.py:499 - default_logger - DEBUG - 원가기반 가격: 118000
2024-10-13 11:54:55,092 - price.py:86 - default_logger - DEBUG - 적정 판매가를 계산합니다.
2024-10-13 11:54:55,092 - price.py:125 - default_logger - ERROR - 가격 수정 중 오류 발생: 'NoneType' object does not support item assignment
Traceback (most recent call last):
File "H:\py\autoTrans\price.py", line 87, in process_price
self.optimal_price_config['sold_price'] = sold_price # 팔린가격 기본값(10000이 아닌 값이 있을 경우 팔린가격으로 간주)
~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^
TypeError: 'NoneType' object does not support item assignment
2024-10-13 11:54:55,251 - browser_control.py:508 - default_logger - DEBUG - 상품 수정 내용 저장 완료.
2024-10-13 11:54:55,253 - gui.py:731 - default_logger - DEBUG - 상품 세부사항 저장 중...
2024-10-13 11:54:55,553 - browser_control.py:500 - default_logger - DEBUG - 상품 수정 내용 저장 및 ECS 완료.
2024-10-13 11:54:55,556 - gui.py:736 - default_logger - DEBUG - 1/[31]개 상품 수정 완료.
2024-10-13 11:54:55,557 - gui.py:681 - default_logger - DEBUG - 2/20: 세부사항 수정 작업 중...
2024-10-13 11:54:55,672 - browser_control.py:353 - default_logger - DEBUG - 상품의 '세부사항 수정 및 업로드' 버튼을 화면에 보이도록 스크롤.
2024-10-13 11:54:56,036 - browser_control.py:356 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 완료.
2024-10-13 11:54:56,560 - title.py:91 - default_logger - DEBUG - 원본 상품명을 가져오는 중입니다.
2024-10-13 11:54:56,590 - title.py:94 - default_logger - DEBUG - 원본 상품명: 小型香水瓶分装中套机喷雾头胶水瓶内塞压盖机卡口封口手压封盖机
2024-10-13 11:54:56,592 - title.py:179 - default_logger - DEBUG - 마켓 : ss - 카테고리 텍스트를 가져오는 중입니다.
2024-10-13 11:54:56,593 - title.py:188 - default_logger - DEBUG - category_locator : div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=2
2024-10-13 11:54:56,615 - title.py:192 - default_logger - DEBUG - main_category_element : <Locator frame=<Frame name= url='https://www.percenty.co.kr/'> selector='div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=2'>
2024-10-13 11:54:56,630 - title.py:201 - default_logger - DEBUG - category_text_element : <Locator frame=<Frame name= url='https://www.percenty.co.kr/'> selector='div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=2 >> div.ant-col.css-1li46mu:nth-child(1)'>
2024-10-13 11:54:56,665 - title.py:214 - default_logger - DEBUG - 카테고리 text = 생활/건강-공구-에어공구-유압공구
2024-10-13 11:54:56,667 - gui.py:707 - default_logger - DEBUG - 가격수정 : True
2024-10-13 11:54:57,035 - browser_control.py:381 - default_logger - DEBUG - 가격 탭 클릭 완료.
2024-10-13 11:54:57,036 - price.py:68 - default_logger - DEBUG - 초기 더하기마진과 해외배송비 가격 정보를 수집합니다.
2024-10-13 11:54:57,173 - price.py:628 - default_logger - DEBUG - 더하기 마진 값: 10000
2024-10-13 11:54:57,206 - price.py:633 - default_logger - DEBUG - 해외 배송비 값: 30000
2024-10-13 11:54:57,206 - price.py:76 - default_logger - DEBUG - 옵션 가격 정보를 수집합니다.
2024-10-13 11:54:57,250 - price.py:527 - default_logger - DEBUG - 옵션 수: 4
2024-10-13 11:54:57,269 - gui.py:757 - default_logger - DEBUG - 번역 작업을 중단합니다...
2024-10-13 11:54:57,510 - price.py:602 - default_logger - DEBUG - 상품원가가 모였습니다.: [189, 189, 189, 229]
2024-10-13 11:54:57,512 - price.py:603 - default_logger - DEBUG - 최소원가: 38000, 최대원가: 46000, 평균원가: 40000, 상위평균원가: 43000
2024-10-13 11:54:57,512 - price.py:488 - default_logger - DEBUG - 원가에 카드수수료 4.0%, 기본마진 24.0% 적용된 계산원가: 56000
2024-10-13 11:54:57,514 - price.py:467 - default_logger - ERROR - 계산된 값 입력 실패: 'NoneType' object has no attribute 'get'
Traceback (most recent call last):
File "H:\py\autoTrans\price.py", line 418, in calculate_additional_margin_with_extended_thresholds
thresholds = self.margin_config.get('thresholds', [])
^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'get'
2024-10-13 11:54:57,514 - price.py:492 - default_logger - DEBUG - 계산원가 기준 해외배송비: 0
2024-10-13 11:54:57,515 - price.py:306 - default_logger - ERROR - 계산된 값 입력 실패: 'NoneType' object has no attribute 'get'
Traceback (most recent call last):
File "H:\py\autoTrans\price.py", line 243, in calculate_shipping_cost_with_extended_thresholds
min_price_for_extra_shipping = self.shipping_config.get('min_price_for_extra_shipping', 0)
^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'get'
2024-10-13 11:54:57,517 - price.py:496 - default_logger - DEBUG - 계산원가 기준 더하기마진: 10000
2024-10-13 11:54:57,517 - price.py:499 - default_logger - DEBUG - 원가기반 가격: 66000
2024-10-13 11:54:57,518 - price.py:86 - default_logger - DEBUG - 적정 판매가를 계산합니다.
2024-10-13 11:54:57,518 - price.py:125 - default_logger - ERROR - 가격 수정 중 오류 발생: 'NoneType' object does not support item assignment
Traceback (most recent call last):
File "H:\py\autoTrans\price.py", line 87, in process_price
self.optimal_price_config['sold_price'] = sold_price # 팔린가격 기본값(10000이 아닌 값이 있을 경우 팔린가격으로 간주)
~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^
TypeError: 'NoneType' object does not support item assignment
2024-10-13 11:54:57,620 - browser_control.py:508 - default_logger - DEBUG - 상품 수정 내용 저장 완료.
2024-10-13 11:54:57,620 - gui.py:731 - default_logger - DEBUG - 상품 세부사항 저장 중...
2024-10-13 11:54:58,057 - browser_control.py:500 - default_logger - DEBUG - 상품 수정 내용 저장 및 ECS 완료.
2024-10-13 11:54:58,059 - gui.py:736 - default_logger - DEBUG - 2/[31]개 상품 수정 완료.
2024-10-13 11:54:58,060 - gui.py:678 - default_logger - DEBUG - 번역 작업이 중단되었습니다.
2024-10-13 11:56:58,217 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json
2024-10-13 11:56:58,217 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중...
2024-10-13 11:56:58,231 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다.
2024-10-13 11:56:58,231 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json
2024-10-13 11:56:58,231 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다.
2024-10-13 11:56:58,231 - price.py:56 - default_logger - DEBUG - self.shipping_config : {'min_price_for_extra_shipping': 50000, 'thresholds': [50000, 100000, 200000], 'increment_unit': 20000, 'additional_costs': [5000, 7000, 9000]}
2024-10-13 11:56:58,231 - price.py:58 - default_logger - DEBUG - self.margin_config : {'thresholds': [50000, 70000, 100000, 150000, 200000, 300000, 400000, 500000, 1000000], 'additional_margins': [5000, 10000, 15000, 25000, 35000, 50000, 70000, 90000, 120000]}
2024-10-13 11:56:58,231 - price.py:60 - default_logger - DEBUG - self.optimal_price_config : {'sold_price': None, 'cost_price2X': None, 'calculated_price': None, 'lower_bound': 0.85, 'upper_bound': 1.15, 'ratios': {'sold_price': 0.5, 'cost_price2X': 0.3, 'calculated_price': 0.2}}
2024-10-13 11:56:58,366 - cmb_diag.py:368 - default_logger - DEBUG - CrMoBi 단계 설정이 위젯에 반영되었습니다.
2024-10-13 11:56:58,366 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다.
2024-10-13 11:57:00,120 - gui.py:431 - default_logger - DEBUG - 가격 수정 버튼 - 활성화 선택
2024-10-13 11:57:01,264 - gui.py:524 - default_logger - DEBUG - 크롬 실행 버튼 클릭됨
2024-10-13 11:57:01,265 - gui.py:525 - default_logger - DEBUG - self.browser_controller.page : None
2024-10-13 11:57:01,265 - gui.py:560 - default_logger - DEBUG - 크롬 브라우저를 실행합니다...
2024-10-13 11:57:01,265 - browser_control.py:61 - default_logger - DEBUG - 크롬 브라우저 실행 중...
2024-10-13 11:57:05,349 - browser_control.py:76 - default_logger - DEBUG - newPage 로딩 ...
2024-10-13 11:57:05,369 - browser_control.py:81 - default_logger - DEBUG - 페이지 제목: 퍼센티 - 셀러들을 위한 AI 구매대행 솔루션
2024-10-13 11:57:05,371 - browser_control.py:88 - default_logger - DEBUG - 크롬 창 핸들: 266872
2024-10-13 11:57:05,372 - browser_control.py:94 - default_logger - DEBUG - 로그인 시도 중: 직원 계정
2024-10-13 11:57:05,701 - browser_control.py:112 - default_logger - DEBUG - 로그인 완료: 직원 계정
2024-10-13 11:57:07,423 - browser_control.py:252 - default_logger - DEBUG - 다이얼로그가 발견되었습니다. 닫기 버튼을 클릭합니다.
2024-10-13 11:57:07,588 - browser_control.py:258 - default_logger - DEBUG - 다이얼로그를 성공적으로 닫았습니다.
2024-10-13 11:57:07,588 - gui.py:584 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 중...
2024-10-13 11:57:07,957 - browser_control.py:271 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 완료.
2024-10-13 11:57:07,960 - option.py:37 - default_logger - DEBUG - page객체 업데이트 : <Page url='https://www.percenty.co.kr/'>
2024-10-13 11:57:07,960 - title.py:31 - default_logger - DEBUG - page객체 업데이트 : <Page url='https://www.percenty.co.kr/'>
2024-10-13 11:57:07,960 - price.py:33 - default_logger - DEBUG - page객체 업데이트 : <Page url='https://www.percenty.co.kr/'>
2024-10-13 11:57:10,216 - gui.py:634 - default_logger - DEBUG - 번역 작업 버튼 클릭됨
2024-10-13 11:57:10,218 - gui.py:639 - default_logger - DEBUG - 번역 작업을 시작합니다...
2024-10-13 11:57:10,218 - browser_control.py:679 - default_logger - DEBUG - 페이지 스크롤 시작...
2024-10-13 11:57:10,828 - browser_control.py:689 - default_logger - DEBUG - 페이지 스크롤 완료.
2024-10-13 11:57:10,852 - browser_control.py:173 - default_logger - DEBUG - 가져온 텍스트: 총 31개 상품
2024-10-13 11:57:10,854 - gui.py:663 - default_logger - DEBUG - 현재 페이지: 1
2024-10-13 11:57:10,860 - browser_control.py:318 - default_logger - DEBUG - 현재 페이지의 수정할 상품 개수: 20
2024-10-13 11:57:10,860 - gui.py:681 - default_logger - DEBUG - 1/20: 세부사항 수정 작업 중...
2024-10-13 11:57:10,910 - browser_control.py:353 - default_logger - DEBUG - 상품의 '세부사항 수정 및 업로드' 버튼을 화면에 보이도록 스크롤.
2024-10-13 11:57:11,494 - browser_control.py:356 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 완료.
2024-10-13 11:57:12,060 - title.py:91 - default_logger - DEBUG - 원본 상품명을 가져오는 중입니다.
2024-10-13 11:57:12,092 - title.py:94 - default_logger - DEBUG - 원본 상품명: 液压电磁阀双向换向阀220v24vDSG-02-3C2/2B2/2B3B/3C3/3C6/03/D2
2024-10-13 11:57:12,326 - title.py:179 - default_logger - DEBUG - 마켓 : ss - 카테고리 텍스트를 가져오는 중입니다.
2024-10-13 11:57:12,326 - title.py:188 - default_logger - DEBUG - category_locator : div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=2
2024-10-13 11:57:12,352 - title.py:192 - default_logger - DEBUG - main_category_element : <Locator frame=<Frame name= url='https://www.percenty.co.kr/'> selector='div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=2'>
2024-10-13 11:57:12,355 - title.py:201 - default_logger - DEBUG - category_text_element : <Locator frame=<Frame name= url='https://www.percenty.co.kr/'> selector='div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=2 >> div.ant-col.css-1li46mu:nth-child(1)'>
2024-10-13 11:57:12,387 - title.py:214 - default_logger - DEBUG - 카테고리 text = 생활/건강-공구-에어공구-유압공구
2024-10-13 11:57:12,387 - gui.py:707 - default_logger - DEBUG - 가격수정 : True
2024-10-13 11:57:13,127 - browser_control.py:381 - default_logger - DEBUG - 가격 탭 클릭 완료.
2024-10-13 11:57:13,128 - price.py:68 - default_logger - DEBUG - 초기 더하기마진과 해외배송비 가격 정보를 수집합니다.
2024-10-13 11:57:13,342 - price.py:628 - default_logger - DEBUG - 더하기 마진 값: 10000
2024-10-13 11:57:13,398 - price.py:633 - default_logger - DEBUG - 해외 배송비 값: 50000
2024-10-13 11:57:13,400 - price.py:76 - default_logger - DEBUG - 옵션 가격 정보를 수집합니다.
2024-10-13 11:57:13,443 - price.py:527 - default_logger - DEBUG - 옵션 수: 18
2024-10-13 11:57:14,503 - price.py:602 - default_logger - DEBUG - 상품원가가 모였습니다.: [185, 185, 185, 185, 185, 308, 308, 335, 358, 358, 358, 358, 358, 358, 358, 358, 358, 525]
2024-10-13 11:57:14,505 - price.py:603 - default_logger - DEBUG - 최소원가: 37000, 최대원가: 105000, 평균원가: 63000, 상위평균원가: 84000
2024-10-13 11:57:14,507 - price.py:488 - default_logger - DEBUG - 원가에 카드수수료 4.0%, 기본마진 24.0% 적용된 계산원가: 108000
2024-10-13 11:57:14,507 - price.py:467 - default_logger - ERROR - 계산된 값 입력 실패: 'NoneType' object has no attribute 'get'
Traceback (most recent call last):
File "H:\py\autoTrans\price.py", line 418, in calculate_additional_margin_with_extended_thresholds
thresholds = self.margin_config.get('thresholds', [])
^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'get'
2024-10-13 11:57:14,507 - price.py:492 - default_logger - DEBUG - 계산원가 기준 해외배송비: 0
2024-10-13 11:57:14,507 - price.py:306 - default_logger - ERROR - 계산된 값 입력 실패: 'NoneType' object has no attribute 'get'
Traceback (most recent call last):
File "H:\py\autoTrans\price.py", line 243, in calculate_shipping_cost_with_extended_thresholds
min_price_for_extra_shipping = self.shipping_config.get('min_price_for_extra_shipping', 0)
^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'get'
2024-10-13 11:57:14,507 - price.py:496 - default_logger - DEBUG - 계산원가 기준 더하기마진: 10000
2024-10-13 11:57:14,507 - price.py:499 - default_logger - DEBUG - 원가기반 가격: 118000
2024-10-13 11:57:14,507 - price.py:86 - default_logger - DEBUG - 적정 판매가를 계산합니다.
2024-10-13 11:57:14,507 - price.py:125 - default_logger - ERROR - 가격 수정 중 오류 발생: 'NoneType' object does not support item assignment
Traceback (most recent call last):
File "H:\py\autoTrans\price.py", line 87, in process_price
self.optimal_price_config['sold_price'] = sold_price # 팔린가격 기본값(10000이 아닌 값이 있을 경우 팔린가격으로 간주)
~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^
TypeError: 'NoneType' object does not support item assignment
2024-10-13 11:57:14,609 - browser_control.py:508 - default_logger - DEBUG - 상품 수정 내용 저장 완료.
2024-10-13 11:57:14,612 - gui.py:731 - default_logger - DEBUG - 상품 세부사항 저장 중...
2024-10-13 11:57:14,975 - browser_control.py:500 - default_logger - DEBUG - 상품 수정 내용 저장 및 ECS 완료.
2024-10-13 11:57:14,977 - gui.py:736 - default_logger - DEBUG - 1/[31]개 상품 수정 완료.
2024-10-13 11:57:14,977 - gui.py:681 - default_logger - DEBUG - 2/20: 세부사항 수정 작업 중...
2024-10-13 11:57:15,077 - browser_control.py:353 - default_logger - DEBUG - 상품의 '세부사항 수정 및 업로드' 버튼을 화면에 보이도록 스크롤.
2024-10-13 11:57:15,453 - browser_control.py:356 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 완료.
2024-10-13 11:57:15,957 - gui.py:757 - default_logger - DEBUG - 번역 작업을 중단합니다...
2024-10-13 11:57:15,971 - title.py:91 - default_logger - DEBUG - 원본 상품명을 가져오는 중입니다.
2024-10-13 11:57:15,998 - title.py:94 - default_logger - DEBUG - 원본 상품명: 小型香水瓶分装中套机喷雾头胶水瓶内塞压盖机卡口封口手压封盖机
2024-10-13 11:57:16,000 - title.py:179 - default_logger - DEBUG - 마켓 : ss - 카테고리 텍스트를 가져오는 중입니다.
2024-10-13 11:57:16,001 - title.py:188 - default_logger - DEBUG - category_locator : div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=2
2024-10-13 11:57:16,021 - title.py:192 - default_logger - DEBUG - main_category_element : <Locator frame=<Frame name= url='https://www.percenty.co.kr/'> selector='div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=2'>
2024-10-13 11:57:16,037 - title.py:201 - default_logger - DEBUG - category_text_element : <Locator frame=<Frame name= url='https://www.percenty.co.kr/'> selector='div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=2 >> div.ant-col.css-1li46mu:nth-child(1)'>
2024-10-13 11:57:16,071 - title.py:214 - default_logger - DEBUG - 카테고리 text = 생활/건강-공구-에어공구-유압공구
2024-10-13 11:57:16,073 - gui.py:707 - default_logger - DEBUG - 가격수정 : True
2024-10-13 11:57:16,479 - browser_control.py:381 - default_logger - DEBUG - 가격 탭 클릭 완료.
2024-10-13 11:57:16,480 - price.py:68 - default_logger - DEBUG - 초기 더하기마진과 해외배송비 가격 정보를 수집합니다.
2024-10-13 11:57:16,671 - price.py:628 - default_logger - DEBUG - 더하기 마진 값: 10000
2024-10-13 11:57:16,724 - price.py:633 - default_logger - DEBUG - 해외 배송비 값: 30000
2024-10-13 11:57:16,727 - price.py:76 - default_logger - DEBUG - 옵션 가격 정보를 수집합니다.
2024-10-13 11:57:16,767 - price.py:527 - default_logger - DEBUG - 옵션 수: 4
2024-10-13 11:57:16,821 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다...
2024-10-13 11:57:16,840 - price.py:608 - default_logger - ERROR - Failed to collect product costs and prices: Page.wait_for_selector: Target page, context or browser has been closed
Traceback (most recent call last):
File "H:\py\autoTrans\price.py", line 570, in collect_product_costs_and_prices
standard_selling_price_element = await self.page.wait_for_selector(standard_selling_price_locator)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "h:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7999, in wait_for_selector
await self._impl_obj.wait_for_selector(
File "h:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 397, in wait_for_selector
return await self._main_frame.wait_for_selector(**locals_to_params(locals()))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "h:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector
await self._channel.send("waitForSelector", locals_to_params(locals()))
File "h:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send
return await self._connection.wrap_api_call(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "h:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call
raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None
playwright._impl._errors.TargetClosedError: Page.wait_for_selector: Target page, context or browser has been closed
2024-10-13 11:57:16,843 - price.py:488 - default_logger - DEBUG - 원가에 카드수수료 4.0%, 기본마진 24.0% 적용된 계산원가: 26000
2024-10-13 11:57:16,846 - price.py:467 - default_logger - ERROR - 계산된 값 입력 실패: 'NoneType' object has no attribute 'get'
Traceback (most recent call last):
File "H:\py\autoTrans\price.py", line 418, in calculate_additional_margin_with_extended_thresholds
thresholds = self.margin_config.get('thresholds', [])
^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'get'
2024-10-13 11:57:16,849 - price.py:492 - default_logger - DEBUG - 계산원가 기준 해외배송비: 0
2024-10-13 11:57:16,849 - price.py:306 - default_logger - ERROR - 계산된 값 입력 실패: 'NoneType' object has no attribute 'get'
Traceback (most recent call last):
File "H:\py\autoTrans\price.py", line 243, in calculate_shipping_cost_with_extended_thresholds
min_price_for_extra_shipping = self.shipping_config.get('min_price_for_extra_shipping', 0)
^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'get'
2024-10-13 11:57:16,849 - price.py:496 - default_logger - DEBUG - 계산원가 기준 더하기마진: 10000
2024-10-13 11:57:16,849 - price.py:499 - default_logger - DEBUG - 원가기반 가격: 36000
2024-10-13 11:57:16,849 - price.py:86 - default_logger - DEBUG - 적정 판매가를 계산합니다.
2024-10-13 11:57:16,849 - price.py:125 - default_logger - ERROR - 가격 수정 중 오류 발생: 'NoneType' object does not support item assignment
Traceback (most recent call last):
File "H:\py\autoTrans\price.py", line 87, in process_price
self.optimal_price_config['sold_price'] = sold_price # 팔린가격 기본값(10000이 아닌 값이 있을 경우 팔린가격으로 간주)
~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^
TypeError: 'NoneType' object does not support item assignment
2024-10-13 11:57:16,976 - browser_control.py:510 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Page.click: Target page, context or browser has been closed
Traceback (most recent call last):
File "H:\py\autoTrans\browser_control.py", line 507, in save_product_edit
await self.page.click(self.save_button_locator)
File "h:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click
await self._impl_obj.click(
File "h:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click
return await self._main_frame.click(**locals_to_params(locals()))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "h:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 488, in click
await self._channel.send("click", locals_to_params(locals()))
File "h:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send
return await self._connection.wrap_api_call(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "h:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call
raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None
playwright._impl._errors.TargetClosedError: Page.click: Target page, context or browser has been closed
2024-10-13 11:57:16,979 - gui.py:731 - default_logger - DEBUG - 상품 세부사항 저장 중...
2024-10-13 11:57:17,001 - browser_control.py:502 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Page.click: Target page, context or browser has been closed
Traceback (most recent call last):
File "H:\py\autoTrans\browser_control.py", line 498, in save_and_ecs_product_edit
await self.page.click(self.save_button_locator)
File "h:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click
await self._impl_obj.click(
File "h:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click
return await self._main_frame.click(**locals_to_params(locals()))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "h:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 488, in click
await self._channel.send("click", locals_to_params(locals()))
File "h:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send
return await self._connection.wrap_api_call(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "h:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call
raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None
playwright._impl._errors.TargetClosedError: Page.click: Target page, context or browser has been closed
2024-10-13 11:57:17,008 - gui.py:736 - default_logger - DEBUG - 2/[31]개 상품 수정 완료.
2024-10-13 11:57:17,013 - gui.py:678 - default_logger - DEBUG - 번역 작업이 중단되었습니다.
2024-10-13 11:59:02,903 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json
2024-10-13 11:59:02,904 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중...
2024-10-13 11:59:02,919 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다.
2024-10-13 11:59:02,919 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json
2024-10-13 11:59:02,919 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다.
2024-10-13 11:59:02,920 - price.py:67 - default_logger - DEBUG - self.shipping_config : {'min_price_for_extra_shipping': 50000, 'thresholds': [50000, 100000, 200000], 'increment_unit': 20000, 'additional_costs': [5000, 7000, 9000]}
2024-10-13 11:59:02,920 - price.py:69 - default_logger - DEBUG - self.margin_config : {'thresholds': [50000, 70000, 100000, 150000, 200000, 300000, 400000, 500000, 1000000], 'additional_margins': [5000, 10000, 15000, 25000, 35000, 50000, 70000, 90000, 120000]}
2024-10-13 11:59:02,920 - price.py:71 - default_logger - DEBUG - self.optimal_price_config : {'sold_price': None, 'cost_price2X': None, 'calculated_price': None, 'lower_bound': 0.85, 'upper_bound': 1.15, 'ratios': {'sold_price': 0.5, 'cost_price2X': 0.3, 'calculated_price': 0.2}}
2024-10-13 11:59:03,051 - cmb_diag.py:368 - default_logger - DEBUG - CrMoBi 단계 설정이 위젯에 반영되었습니다.
2024-10-13 11:59:03,051 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다.
2024-10-13 11:59:04,455 - gui.py:431 - default_logger - DEBUG - 가격 수정 버튼 - 활성화 선택
2024-10-13 11:59:05,256 - gui.py:524 - default_logger - DEBUG - 크롬 실행 버튼 클릭됨
2024-10-13 11:59:05,258 - gui.py:525 - default_logger - DEBUG - self.browser_controller.page : None
2024-10-13 11:59:05,258 - gui.py:560 - default_logger - DEBUG - 크롬 브라우저를 실행합니다...
2024-10-13 11:59:05,258 - browser_control.py:61 - default_logger - DEBUG - 크롬 브라우저 실행 중...
2024-10-13 11:59:09,514 - browser_control.py:76 - default_logger - DEBUG - newPage 로딩 ...
2024-10-13 11:59:09,532 - browser_control.py:81 - default_logger - DEBUG - 페이지 제목: 퍼센티 - 셀러들을 위한 AI 구매대행 솔루션
2024-10-13 11:59:09,534 - browser_control.py:88 - default_logger - DEBUG - 크롬 창 핸들: 266780
2024-10-13 11:59:09,534 - browser_control.py:94 - default_logger - DEBUG - 로그인 시도 중: 직원 계정
2024-10-13 11:59:09,766 - browser_control.py:112 - default_logger - DEBUG - 로그인 완료: 직원 계정
2024-10-13 11:59:11,383 - browser_control.py:252 - default_logger - DEBUG - 다이얼로그가 발견되었습니다. 닫기 버튼을 클릭합니다.
2024-10-13 11:59:11,504 - browser_control.py:258 - default_logger - DEBUG - 다이얼로그를 성공적으로 닫았습니다.
2024-10-13 11:59:11,505 - gui.py:584 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 중...
2024-10-13 11:59:11,936 - browser_control.py:271 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 완료.
2024-10-13 11:59:11,938 - option.py:37 - default_logger - DEBUG - page객체 업데이트 : <Page url='https://www.percenty.co.kr/'>
2024-10-13 11:59:11,939 - title.py:31 - default_logger - DEBUG - page객체 업데이트 : <Page url='https://www.percenty.co.kr/'>
2024-10-13 11:59:11,939 - price.py:45 - default_logger - DEBUG - page객체 업데이트 : <Page url='https://www.percenty.co.kr/'>
2024-10-13 11:59:13,207 - gui.py:634 - default_logger - DEBUG - 번역 작업 버튼 클릭됨
2024-10-13 11:59:13,207 - gui.py:639 - default_logger - DEBUG - 번역 작업을 시작합니다...
2024-10-13 11:59:13,210 - browser_control.py:679 - default_logger - DEBUG - 페이지 스크롤 시작...
2024-10-13 11:59:13,863 - browser_control.py:689 - default_logger - DEBUG - 페이지 스크롤 완료.
2024-10-13 11:59:13,879 - browser_control.py:173 - default_logger - DEBUG - 가져온 텍스트: 총 31개 상품
2024-10-13 11:59:13,879 - gui.py:663 - default_logger - DEBUG - 현재 페이지: 1
2024-10-13 11:59:13,892 - browser_control.py:318 - default_logger - DEBUG - 현재 페이지의 수정할 상품 개수: 20
2024-10-13 11:59:13,896 - gui.py:681 - default_logger - DEBUG - 1/20: 세부사항 수정 작업 중...
2024-10-13 11:59:13,948 - browser_control.py:353 - default_logger - DEBUG - 상품의 '세부사항 수정 및 업로드' 버튼을 화면에 보이도록 스크롤.
2024-10-13 11:59:14,477 - browser_control.py:356 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 완료.
2024-10-13 11:59:15,021 - title.py:91 - default_logger - DEBUG - 원본 상품명을 가져오는 중입니다.
2024-10-13 11:59:15,049 - title.py:94 - default_logger - DEBUG - 원본 상품명: 液压电磁阀双向换向阀220v24vDSG-02-3C2/2B2/2B3B/3C3/3C6/03/D2
2024-10-13 11:59:15,277 - title.py:179 - default_logger - DEBUG - 마켓 : ss - 카테고리 텍스트를 가져오는 중입니다.
2024-10-13 11:59:15,277 - title.py:188 - default_logger - DEBUG - category_locator : div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=2
2024-10-13 11:59:15,307 - title.py:192 - default_logger - DEBUG - main_category_element : <Locator frame=<Frame name= url='https://www.percenty.co.kr/'> selector='div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=2'>
2024-10-13 11:59:15,323 - title.py:201 - default_logger - DEBUG - category_text_element : <Locator frame=<Frame name= url='https://www.percenty.co.kr/'> selector='div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=2 >> div.ant-col.css-1li46mu:nth-child(1)'>
2024-10-13 11:59:15,348 - title.py:214 - default_logger - DEBUG - 카테고리 text = 생활/건강-공구-에어공구-유압공구
2024-10-13 11:59:15,350 - gui.py:707 - default_logger - DEBUG - 가격수정 : True
2024-10-13 11:59:16,092 - browser_control.py:381 - default_logger - DEBUG - 가격 탭 클릭 완료.
2024-10-13 11:59:16,092 - price.py:79 - default_logger - DEBUG - 초기 더하기마진과 해외배송비 가격 정보를 수집합니다.
2024-10-13 11:59:16,298 - price.py:639 - default_logger - DEBUG - 더하기 마진 값: 10000
2024-10-13 11:59:16,369 - price.py:644 - default_logger - DEBUG - 해외 배송비 값: 50000
2024-10-13 11:59:16,369 - price.py:87 - default_logger - DEBUG - 옵션 가격 정보를 수집합니다.
2024-10-13 11:59:16,413 - price.py:538 - default_logger - DEBUG - 옵션 수: 18
2024-10-13 11:59:17,539 - price.py:613 - default_logger - DEBUG - 상품원가가 모였습니다.: [185, 185, 185, 185, 185, 308, 308, 335, 358, 358, 358, 358, 358, 358, 358, 358, 358, 525]
2024-10-13 11:59:17,541 - price.py:614 - default_logger - DEBUG - 최소원가: 37000, 최대원가: 105000, 평균원가: 63000, 상위평균원가: 84000
2024-10-13 11:59:17,541 - price.py:499 - default_logger - DEBUG - 원가에 카드수수료 4.0%, 기본마진 24.0% 적용된 계산원가: 108000
2024-10-13 11:59:17,543 - price.py:435 - default_logger - DEBUG - 기존 구간: [50000, 70000, 100000, 150000, 200000, 300000, 400000, 500000, 1000000]
2024-10-13 11:59:17,543 - price.py:436 - default_logger - DEBUG - 기존 추가 마진: [5000, 10000, 15000, 25000, 35000, 50000, 70000, 90000, 120000]
2024-10-13 11:59:17,543 - price.py:469 - default_logger - DEBUG - 적용된 구간: 150000, 계산된 마진: 17000
2024-10-13 11:59:17,546 - price.py:503 - default_logger - DEBUG - 계산원가 기준 해외배송비: 17000
2024-10-13 11:59:17,546 - price.py:262 - default_logger - DEBUG - 기존 구간: [50000, 100000, 200000]
2024-10-13 11:59:17,547 - price.py:263 - default_logger - DEBUG - 기존 추가 비용: [5000, 7000, 9000]
2024-10-13 11:59:17,547 - price.py:298 - default_logger - DEBUG - 적용된 구간: 100000, 계산된 구간추가배송비: 10000
2024-10-13 11:59:17,549 - price.py:293 - default_logger - DEBUG - 적용된 구간: 200000, 계산된 구간추가배송비: 0
2024-10-13 11:59:17,549 - price.py:308 - default_logger - DEBUG - 최종 계산된 배송비: 20000
2024-10-13 11:59:17,550 - price.py:507 - default_logger - DEBUG - 계산원가 기준 더하기마진: 20000
2024-10-13 11:59:17,550 - price.py:510 - default_logger - DEBUG - 원가기반 가격: 145000
2024-10-13 11:59:17,550 - price.py:97 - default_logger - DEBUG - 적정 판매가를 계산합니다.
2024-10-13 11:59:17,552 - price.py:400 - default_logger - DEBUG - 비율 기반 계산된 가격: 80000, 상한: 194000, 하한: 143000
2024-10-13 11:59:17,552 - price.py:404 - default_logger - DEBUG - 가격이 하한을 밑돌아서 하한으로 조정됨: 143000
2024-10-13 11:59:17,554 - price.py:102 - default_logger - DEBUG - 계산된 적정 판매가: 143000
2024-10-13 11:59:17,554 - price.py:105 - default_logger - DEBUG - 더하기 마진을 적정 판매가에 맞게 조정합니다.
2024-10-13 11:59:17,555 - price.py:334 - default_logger - DEBUG - 총 옵션 기준 판매가 평균: 138000
2024-10-13 11:59:17,555 - price.py:338 - default_logger - DEBUG - 적정 판매가와 기준 판매가 차이: 5000
2024-10-13 11:59:17,558 - price.py:435 - default_logger - DEBUG - 기존 구간: [50000, 70000, 100000, 150000, 200000, 300000, 400000, 500000, 1000000]
2024-10-13 11:59:17,558 - price.py:436 - default_logger - DEBUG - 기존 추가 마진: [5000, 10000, 15000, 25000, 35000, 50000, 70000, 90000, 120000]
2024-10-13 11:59:17,559 - price.py:469 - default_logger - DEBUG - 적용된 구간: 150000, 계산된 마진: 24000
2024-10-13 11:59:17,559 - price.py:108 - default_logger - DEBUG - 조정된 더하기 마진: 25000
2024-10-13 11:59:17,559 - price.py:262 - default_logger - DEBUG - 기존 구간: [50000, 100000, 200000]
2024-10-13 11:59:17,562 - price.py:263 - default_logger - DEBUG - 기존 추가 비용: [5000, 7000, 9000]
2024-10-13 11:59:17,562 - price.py:308 - default_logger - DEBUG - 최종 계산된 배송비: 10000
2024-10-13 11:59:17,562 - price.py:114 - default_logger - DEBUG - 적정판매가 기준으로 재계산된 해외배송비: 10000
2024-10-13 11:59:17,564 - price.py:136 - default_logger - ERROR - 가격 수정 중 오류 발생: LocatorManager.get_category_data() missing 1 required positional argument: 'category'
Traceback (most recent call last):
File "H:\py\autoTrans\price.py", line 117, in process_price
extra_shipping = self.calculate_category_extra_shipping(category, optimal_price)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "H:\py\autoTrans\price.py", line 752, in calculate_category_extra_shipping
category_data = self.locator_manager.get_category_data(category)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: LocatorManager.get_category_data() missing 1 required positional argument: 'category'
2024-10-13 11:59:17,743 - browser_control.py:508 - default_logger - DEBUG - 상품 수정 내용 저장 완료.
2024-10-13 11:59:17,745 - gui.py:731 - default_logger - DEBUG - 상품 세부사항 저장 중...
2024-10-13 11:59:18,108 - browser_control.py:500 - default_logger - DEBUG - 상품 수정 내용 저장 및 ECS 완료.
2024-10-13 11:59:18,111 - gui.py:736 - default_logger - DEBUG - 1/[31]개 상품 수정 완료.
2024-10-13 11:59:18,112 - gui.py:681 - default_logger - DEBUG - 2/20: 세부사항 수정 작업 중...
2024-10-13 11:59:18,181 - browser_control.py:353 - default_logger - DEBUG - 상품의 '세부사항 수정 및 업로드' 버튼을 화면에 보이도록 스크롤.
2024-10-13 11:59:18,557 - browser_control.py:356 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 완료.
2024-10-13 11:59:19,105 - title.py:91 - default_logger - DEBUG - 원본 상품명을 가져오는 중입니다.
2024-10-13 11:59:19,134 - title.py:94 - default_logger - DEBUG - 원본 상품명: 小型香水瓶分装中套机喷雾头胶水瓶内塞压盖机卡口封口手压封盖机
2024-10-13 11:59:19,136 - title.py:179 - default_logger - DEBUG - 마켓 : ss - 카테고리 텍스트를 가져오는 중입니다.
2024-10-13 11:59:19,136 - title.py:188 - default_logger - DEBUG - category_locator : div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=2
2024-10-13 11:59:19,154 - title.py:192 - default_logger - DEBUG - main_category_element : <Locator frame=<Frame name= url='https://www.percenty.co.kr/'> selector='div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=2'>
2024-10-13 11:59:19,168 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다...
2024-10-13 11:59:19,184 - title.py:201 - default_logger - DEBUG - category_text_element : <Locator frame=<Frame name= url='https://www.percenty.co.kr/'> selector='div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=2 >> div.ant-col.css-1li46mu:nth-child(1)'>
2024-10-13 11:59:19,328 - title.py:223 - default_logger - ERROR - 카테고리 텍스트 가져오기 중 오류 발생: Locator.count: Target page, context or browser has been closed
Traceback (most recent call last):
File "H:\py\autoTrans\title.py", line 203, in get_category
if await category_text_element.count():
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "h:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 16229, in count
return mapping.from_maybe_impl(await self._impl_obj.count())
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "h:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 392, in count
return await self._frame._query_count(self._selector)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "h:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 128, in _query_count
return await self._channel.send("queryCount", {"selector": selector})
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "h:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send
return await self._connection.wrap_api_call(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "h:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call
raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None
playwright._impl._errors.TargetClosedError: Locator.count: Target page, context or browser has been closed
2024-10-13 11:59:19,331 - gui.py:707 - default_logger - DEBUG - 가격수정 : True
2024-10-13 11:59:19,350 - browser_control.py:383 - default_logger - DEBUG - 가격 탭 클릭 중 오류: Page.click: Target page, context or browser has been closed
Traceback (most recent call last):
File "H:\py\autoTrans\browser_control.py", line 380, in click_price_tab
await self.page.click(self.price_tab_locator)
File "h:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click
await self._impl_obj.click(
File "h:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click
return await self._main_frame.click(**locals_to_params(locals()))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "h:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 488, in click
await self._channel.send("click", locals_to_params(locals()))
File "h:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send
return await self._connection.wrap_api_call(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "h:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call
raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None
playwright._impl._errors.TargetClosedError: Page.click: Target page, context or browser has been closed
2024-10-13 11:59:19,355 - price.py:79 - default_logger - DEBUG - 초기 더하기마진과 해외배송비 가격 정보를 수집합니다.
2024-10-13 11:59:19,372 - price.py:648 - default_logger - ERROR - 해외배송비와 더하기 마진 수집 중 오류 발생: Page.wait_for_selector: Connection closed while reading from the driver
Traceback (most recent call last):
File "H:\py\autoTrans\price.py", line 636, in get_plusmargin_and_shipping_values
margin_element = await self.page.wait_for_selector(self.plus_margin_locator)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "h:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7999, in wait_for_selector
await self._impl_obj.wait_for_selector(
File "h:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 397, in wait_for_selector
return await self._main_frame.wait_for_selector(**locals_to_params(locals()))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "h:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector
await self._channel.send("waitForSelector", locals_to_params(locals()))
File "h:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send
return await self._connection.wrap_api_call(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "h:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call
raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None
Exception: Page.wait_for_selector: Connection closed while reading from the driver
2024-10-13 11:59:19,375 - price.py:85 - default_logger - DEBUG - 더하기마진값5000을 팔린가격5000으로 간주
2024-10-13 11:59:19,376 - price.py:87 - default_logger - DEBUG - 옵션 가격 정보를 수집합니다.

View File

@ -15,6 +15,7 @@ option_input_selector_template = '//*[@id="productMainContentContainerId"]/div[1
single_option_locator = '//div[@id="productMainContentContainerId"]//label[contains(@class, 'ant-radio-button-wrapper-checked') and contains(., '단일 상품등록')]' single_option_locator = '//div[@id="productMainContentContainerId"]//label[contains(@class, 'ant-radio-button-wrapper-checked') and contains(., '단일 상품등록')]'
option_product_locator = '//div[@id="productMainContentContainerId"]//label[contains(@class, 'ant-radio-button-wrapper-checked') and contains(., '옵션 상품등록')]' option_product_locator = '//div[@id="productMainContentContainerId"]//label[contains(@class, 'ant-radio-button-wrapper-checked') and contains(., '옵션 상품등록')]'
total_options_selector = '#productMainContentContainerId label.ant-checkbox-wrapper' total_options_selector = '#productMainContentContainerId label.ant-checkbox-wrapper'
is_all_option_checked_selector = '#productMainContentContainerId .ant-checkbox-indeterminate'
original_name_selector_template = 'div#productMainContentContainerId li:nth-child({i}) > div > div:nth-child(1) > div > div:nth-child(3) > div:nth-child(3) > span' original_name_selector_template = 'div#productMainContentContainerId li:nth-child({i}) > div > div:nth-child(1) > div > div:nth-child(3) > div:nth-child(3) > span'
edit_field_selector_template = 'div#productMainContentContainerId li:nth-child({i}) > div > div:nth-child(1) > div > div:nth-child(3) > div:nth-child(2) > div:nth-child(1) > span > input' edit_field_selector_template = 'div#productMainContentContainerId li:nth-child({i}) > div > div:nth-child(1) > div > div:nth-child(3) > div:nth-child(2) > div:nth-child(1) > span > input'
checkbox_selector_template = '#productMainContentContainerId li:nth-child({i}) input[type="checkbox"]' checkbox_selector_template = '#productMainContentContainerId li:nth-child({i}) input[type="checkbox"]'

4
gui.py
View File

@ -32,11 +32,11 @@ class TranslationApp(QWidget):
self.vertexAI = VertexAITranslator(self.logger, key_path) self.vertexAI = VertexAITranslator(self.logger, key_path)
self.optionHandler = None self.optionHandler = None
self.cmb_diag = CMBSettingsDialog(parent=self, logger=self.logger, debug=True)
self.clipboardImageManager = ClipboardImageManager(self, logger, self.browser_controller, self.debug) self.clipboardImageManager = ClipboardImageManager(self, logger, self.browser_controller, self.debug)
self.optionHandler = OptionHandler(self.locator_manager, self.browser_controller, self.whale_translator, self.logger, self.vertexAI, self.debug) self.optionHandler = OptionHandler(self.locator_manager, self.browser_controller, self.whale_translator, self.logger, self.vertexAI, self.debug)
self.priceHandler = PriceHandler(self.locator_manager, self.browser_controller, self.logger, self.vertexAI, self.debug) self.priceHandler = PriceHandler(self.locator_manager, self.browser_controller, self.logger, self.vertexAI, self.cmb_diag, self.debug)
self.titleHandler = TitleHandler(self.locator_manager, self.browser_controller, self.logger) self.titleHandler = TitleHandler(self.locator_manager, self.browser_controller, self.logger)
self.cmb_diag = CMBSettingsDialog(parent=self, logger=self.logger, debug=True)
self.running = False self.running = False
# 변수 설정 # 변수 설정

View File

@ -63,6 +63,7 @@ class LocatorManager:
'single_option_locator': self.config.get('OptionLocators', 'single_option_locator').strip("'"), 'single_option_locator': self.config.get('OptionLocators', 'single_option_locator').strip("'"),
'option_product_locator': self.config.get('OptionLocators', 'option_product_locator').strip("'"), 'option_product_locator': self.config.get('OptionLocators', 'option_product_locator').strip("'"),
'total_options_selector': self.config.get('OptionLocators', 'total_options_selector').strip("'"), 'total_options_selector': self.config.get('OptionLocators', 'total_options_selector').strip("'"),
'is_all_option_checked_selector': self.config.get('OptionLocators', 'is_all_option_checked_selector').strip("'"),
'original_name_selector_template': self.config.get('OptionLocators', 'original_name_selector_template').strip("'"), 'original_name_selector_template': self.config.get('OptionLocators', 'original_name_selector_template').strip("'"),
'edit_field_selector_template': self.config.get('OptionLocators', 'edit_field_selector_template').strip("'"), 'edit_field_selector_template': self.config.get('OptionLocators', 'edit_field_selector_template').strip("'"),
'checkbox_selector_template': self.config.get('OptionLocators', 'checkbox_selector_template').strip("'"), 'checkbox_selector_template': self.config.get('OptionLocators', 'checkbox_selector_template').strip("'"),

View File

@ -21,6 +21,7 @@ class OptionHandler:
self.single_option_locator = self.locator_manager.get_locator('OptionLocators', 'single_option_locator') self.single_option_locator = self.locator_manager.get_locator('OptionLocators', 'single_option_locator')
self.option_product_locator = self.locator_manager.get_locator('OptionLocators', 'option_product_locator') self.option_product_locator = self.locator_manager.get_locator('OptionLocators', 'option_product_locator')
self.total_options_selector = self.locator_manager.get_locator('OptionLocators', 'total_options_selector') self.total_options_selector = self.locator_manager.get_locator('OptionLocators', 'total_options_selector')
self.is_all_option_checked_selector = self.locator_manager.get_locator('OptionLocators', 'is_all_option_checked_selector')
self.original_name_selector_template = self.locator_manager.get_locator('OptionLocators', 'original_name_selector_template') self.original_name_selector_template = self.locator_manager.get_locator('OptionLocators', 'original_name_selector_template')
self.edit_field_selector_template = self.locator_manager.get_locator('OptionLocators', 'edit_field_selector_template') self.edit_field_selector_template = self.locator_manager.get_locator('OptionLocators', 'edit_field_selector_template')
self.checkbox_selector_template = self.locator_manager.get_locator('OptionLocators', 'checkbox_selector_template') self.checkbox_selector_template = self.locator_manager.get_locator('OptionLocators', 'checkbox_selector_template')
@ -262,7 +263,7 @@ class OptionHandler:
if checkbox: if checkbox:
self.logger.debug("전체 옵션이 체크되어 있음") self.logger.debug("전체 옵션이 체크되어 있음")
return True return True
checkbox_partial = await self.page.query_selector('#productMainContentContainerId .ant-checkbox-indeterminate') checkbox_partial = await self.page.query_selector(self.is_all_option_checked_selector)
self.logger.debug("일부 옵션이 체크되어 있으므로 수정완료 상품으로 판단.") self.logger.debug("일부 옵션이 체크되어 있으므로 수정완료 상품으로 판단.")
return checkbox_partial is None # 일부 체크 시 False return checkbox_partial is None # 일부 체크 시 False
except Exception as e: except Exception as e:

View File

@ -7,13 +7,26 @@ import math , re, time
from playwright.async_api import TimeoutError from playwright.async_api import TimeoutError
class PriceHandler: class PriceHandler:
def __init__(self, locator_manager, browser_controller, logger, vertexAI, debug_flag=False): def __init__(self, locator_manager, browser_controller, logger, vertexAI, cmb_diag, debug_flag=False):
self.locator_manager = locator_manager self.locator_manager = locator_manager
self.browser_controller = browser_controller self.browser_controller = browser_controller
self.page = self.browser_controller.page self.page = self.browser_controller.page
self.logger = logger self.logger = logger
self.debug_flag = debug_flag self.debug_flag = debug_flag
self.vertexAItranslator = vertexAI self.vertexAItranslator = vertexAI
self.cmb_diag = cmb_diag
self.shipping_config = None
self.margin_config = None
self.optimal_price_config = None
self.product_costs = []
self.option_data = []
self.calculated_price = 0
self.optimal_price = 0
self.return_fee = 0
self.first_delv_fee = 0
self.exchange_fee = 0
self.sold_price = 0
# Locator들을 미리 로드하여 초기화 - locator_template:동적 로딩, locator:고정로딩 # Locator들을 미리 로드하여 초기화 - locator_template:동적 로딩, locator:고정로딩
self.product_cost_locator_template = self.locator_manager.get_locator('PriceLocators', 'product_cost_locator') self.product_cost_locator_template = self.locator_manager.get_locator('PriceLocators', 'product_cost_locator')
@ -25,8 +38,8 @@ class PriceHandler:
self.exchange_fee_input_locator = self.locator_manager.get_locator('PriceLocators', 'exchange_fee_input_locator') self.exchange_fee_input_locator = self.locator_manager.get_locator('PriceLocators', 'exchange_fee_input_locator')
self.option_count_text_locator = self.locator_manager.get_locator('PriceLocators', 'option_count_text_locator') self.option_count_text_locator = self.locator_manager.get_locator('PriceLocators', 'option_count_text_locator')
# self.initialize_values() # 초기값 설정 메서드
self.initial_setting() self.initial_setting()
self.initialize_values() # 초기값 설정 메서드
def update_page(self, page1): def update_page(self, page1):
self.page = page1 self.page = page1
@ -37,12 +50,11 @@ class PriceHandler:
가격과 관련된 변수들을 초기화하는 메서드입니다. 가격과 관련된 변수들을 초기화하는 메서드입니다.
여러 상품을 처리할 데이터가 이전 상품에 영향을 주지 않도록 초기화합니다. 여러 상품을 처리할 데이터가 이전 상품에 영향을 주지 않도록 초기화합니다.
""" """
self.shipping_config = None # self.shipping_config = None
self.margin_config = None # self.margin_config = None
self.optimal_price_config = None # self.optimal_price_config = None
self.product_costs = [] self.product_costs = []
self.option_data = [] self.option_data = []
self.sold_price = 0
self.calculated_price = 0 self.calculated_price = 0
self.optimal_price = 0 self.optimal_price = 0
self.return_fee = 0 self.return_fee = 0
@ -53,8 +65,11 @@ class PriceHandler:
def initial_setting(self): def initial_setting(self):
# 설정 초기화 # 설정 초기화
self.shipping_config = self.set_shipping_config(min_price=50000, thresholds=[50000, 100000, 200000], increment_unit=20000, additional_costs=[5000, 7000, 9000]) self.shipping_config = self.set_shipping_config(min_price=50000, thresholds=[50000, 100000, 200000], increment_unit=20000, additional_costs=[5000, 7000, 9000])
self.logger.debug(f"self.shipping_config : {self.shipping_config}")
self.margin_config = self.set_margin_config(thresholds=[50000, 70000, 100000, 150000, 200000, 300000, 400000, 500000, 1000000], additional_margins=[5000, 10000, 15000, 25000, 35000, 50000, 70000, 90000, 120000]) self.margin_config = self.set_margin_config(thresholds=[50000, 70000, 100000, 150000, 200000, 300000, 400000, 500000, 1000000], additional_margins=[5000, 10000, 15000, 25000, 35000, 50000, 70000, 90000, 120000])
self.logger.debug(f"self.margin_config : {self.margin_config}")
self.optimal_price_config = self.set_optimal_price_config(sold_price=None, cost_price2X=None, calculated_price=None, lower_bound=0.85, upper_bound=1.15, ratios={'sold_price': 0.5, 'cost_price2X': 0.3, 'calculated_price': 0.2}) self.optimal_price_config = self.set_optimal_price_config(sold_price=None, cost_price2X=None, calculated_price=None, lower_bound=0.85, upper_bound=1.15, ratios={'sold_price': 0.5, 'cost_price2X': 0.3, 'calculated_price': 0.2})
self.logger.debug(f"self.optimal_price_config : {self.optimal_price_config}")
async def process_price(self, sold_price=0, category=None): async def process_price(self, sold_price=0, category=None):
try: try:
@ -77,25 +92,25 @@ class PriceHandler:
return return
# 2. 원가 기반가격 계산 # 2. 원가 기반가격 계산
calculated_price = self.calc_initial_price(upper_avg_cost, self.margin_config, self.shipping_config, 0.04, 0.24) calculated_price = self.calc_initial_price(upper_avg_cost, 0.04, 0.24)
# 3. 적정 판매가 산출 # 3. 적정 판매가 산출
self.logger.debug("적정 판매가를 계산합니다.") self.logger.debug("적정 판매가를 계산합니다.")
self.optimal_price_config['sold_price'] = sold_price # 팔린가격 기본값(10000이 아닌 값이 있을 경우 팔린가격으로 간주) self.optimal_price_config['sold_price'] = sold_price # 팔린가격 기본값(10000이 아닌 값이 있을 경우 팔린가격으로 간주)
self.optimal_price_config['cost_price2X'] = upper_avg_cost # 원가2배 가격 : upper_avg_cost를 기준으로 계산. self.optimal_price_config['cost_price2X'] = upper_avg_cost # 원가2배 가격 : upper_avg_cost를 기준으로 계산.
self.optimal_price_config['calculated_price'] = calculated_price # 기준판매가를 기준으로 계산된 값 self.optimal_price_config['calculated_price'] = calculated_price # 기준판매가를 기준으로 계산된 값
optimal_price = self.calculate_optimal_price(self.optimal_price_config) optimal_price = self.calculate_optimal_price()
self.logger.debug(f"계산된 적정 판매가: {optimal_price}") self.logger.debug(f"계산된 적정 판매가: {optimal_price}")
# 4. 더하기 마진을 적정 판매가 기준으로 재설정 # 4. 더하기 마진을 적정 판매가 기준으로 재설정
self.logger.debug("더하기 마진을 적정 판매가에 맞게 조정합니다.") self.logger.debug("더하기 마진을 적정 판매가에 맞게 조정합니다.")
additional_margin = self.calculate_adjusted_margin(optimal_price, option_data, self.margin_config) additional_margin = self.calculate_adjusted_margin(optimal_price, option_data)
additional_margin = self.round_to_UP(additional_margin) additional_margin = self.round_to_UP(additional_margin)
self.logger.debug(f"조정된 더하기 마진: {additional_margin}") self.logger.debug(f"조정된 더하기 마진: {additional_margin}")
# 5. 해외 배송비 재계산 # 5. 해외 배송비 재계산
shipping_base_price = optimal_price - upper_avg_cost - (upper_avg_cost*0.04) - (upper_avg_cost*0.24) - additional_margin shipping_base_price = optimal_price - upper_avg_cost - (upper_avg_cost*0.04) - (upper_avg_cost*0.24) - additional_margin
shipping_cost = self.calculate_shipping_cost_with_extended_thresholds(10000, shipping_base_price, self.shipping_config) shipping_cost = self.calculate_shipping_cost_with_extended_thresholds(10000, shipping_base_price)
shipping_cost = self.round_to_UP(shipping_cost) shipping_cost = self.round_to_UP(shipping_cost)
self.logger.debug(f"적정판매가 기준으로 재계산된 해외배송비: {shipping_cost}") self.logger.debug(f"적정판매가 기준으로 재계산된 해외배송비: {shipping_cost}")
@ -222,7 +237,7 @@ class PriceHandler:
self.logger.error(f"Failed to input calculated values: {e}", exc_info=True) self.logger.error(f"Failed to input calculated values: {e}", exc_info=True)
def calculate_shipping_cost_with_extended_thresholds(self, base_cost, product_price, config, max_threshold=5000000): def calculate_shipping_cost_with_extended_thresholds(self, base_cost, product_price, max_threshold=5000000):
""" """
점진적으로 증가하는 해외배송비를 계산하는 메서드입니다. 점진적으로 증가하는 해외배송비를 계산하는 메서드입니다.
@ -237,10 +252,10 @@ class PriceHandler:
""" """
try: try:
total_shipping_cost = base_cost total_shipping_cost = base_cost
min_price_for_extra_shipping = config.get('min_price_for_extra_shipping', 0) min_price_for_extra_shipping = self.shipping_config.get('min_price_for_extra_shipping', 0)
thresholds = config.get('thresholds', []) thresholds = self.shipping_config.get('thresholds', [])
increment_unit = config.get('increment_unit', 0) increment_unit = self.shipping_config.get('increment_unit', 0)
additional_costs = config.get('additional_costs', []) additional_costs = self.shipping_config.get('additional_costs', [])
if not thresholds or not additional_costs: if not thresholds or not additional_costs:
raise ValueError("기준 구간과 추가 비용 정보는 비워둘 수 없습니다.") raise ValueError("기준 구간과 추가 비용 정보는 비워둘 수 없습니다.")
@ -303,7 +318,7 @@ class PriceHandler:
self.logger.error(f"계산된 값 입력 실패: {e}", exc_info=True) self.logger.error(f"계산된 값 입력 실패: {e}", exc_info=True)
return max(base_cost, 10000) # 예외 발생 시 최소 기본 배송비 반환 return max(base_cost, 10000) # 예외 발생 시 최소 기본 배송비 반환
def calculate_adjusted_margin(self, optimal_price, option_data, margin_config): def calculate_adjusted_margin(self, optimal_price, option_data):
""" """
적정판매가와 기준판매가를 비교하여 더하기 마진을 조정하는 메서드입니다. 적정판매가와 기준판매가를 비교하여 더하기 마진을 조정하는 메서드입니다.
@ -324,7 +339,7 @@ class PriceHandler:
self.logger.debug(f"적정 판매가와 기준 판매가 차이: {price_difference}") self.logger.debug(f"적정 판매가와 기준 판매가 차이: {price_difference}")
# 마진 설정: 차이에 따른 더하기 마진 재조정 # 마진 설정: 차이에 따른 더하기 마진 재조정
adjusted_margin = self.calculate_additional_margin_with_extended_thresholds(optimal_price, margin_config) adjusted_margin = self.calculate_additional_margin_with_extended_thresholds(optimal_price)
# 만약 차이가 크다면, 추가로 마진을 더 조정할 수 있음 # 만약 차이가 크다면, 추가로 마진을 더 조정할 수 있음
if price_difference > 0: if price_difference > 0:
@ -337,7 +352,7 @@ class PriceHandler:
return 0 # 기본값 반환 return 0 # 기본값 반환
def calculate_optimal_price(self, config): def calculate_optimal_price(self):
""" """
적정 판매가를 계산하는 메서드입니다. 적정 판매가를 계산하는 메서드입니다.
@ -348,12 +363,12 @@ class PriceHandler:
- optimal_price (float): 계산된 적정 판매가 - optimal_price (float): 계산된 적정 판매가
""" """
try: try:
sold_price = config.get('sold_price') # 팔린가격 없으면 무시 sold_price = self.optimal_price_config.get('sold_price') # 팔린가격 없으면 무시
cost_price2X = config['cost_price2X'] * 2 # 원가의 2배 cost_price2X = self.optimal_price_config['cost_price2X'] * 2 # 원가의 2배
calculated_price = config['calculated_price'] # 원가기준 계산된 가격 calculated_price = self.optimal_price_config['calculated_price'] # 원가기준 계산된 가격
lower_bound = config['lower_bound'] # 상한선 비율 (기본값 : 원가2배의 15%) lower_bound = self.optimal_price_config['lower_bound'] # 상한선 비율 (기본값 : 원가2배의 15%)
upper_bound = config['upper_bound'] # 하한선 비율 (기본값 : 원가2배의 -15%) upper_bound = self.optimal_price_config['upper_bound'] # 하한선 비율 (기본값 : 원가2배의 -15%)
ratios = config['ratios'] # 계산비율 (기본값 : 팔린가격 50%, 원가2배가격 30%, 계산된가격 20%) ratios = self.optimal_price_config['ratios'] # 계산비율 (기본값 : 팔린가격 50%, 원가2배가격 30%, 계산된가격 20%)
# 비율 기반 계산 # 비율 기반 계산
weighted_sum = 0 weighted_sum = 0
@ -399,7 +414,7 @@ class PriceHandler:
self.logger.error(f"적정 판매가 계산 실패: {e}", exc_info=True) self.logger.error(f"적정 판매가 계산 실패: {e}", exc_info=True)
return 0 # 예외 발생 시 기본값 0 반환 return 0 # 예외 발생 시 기본값 0 반환
def calculate_additional_margin_with_extended_thresholds(self, upper_average_price, config, max_threshold=5000000): def calculate_additional_margin_with_extended_thresholds(self, upper_average_price, max_threshold=5000000):
""" """
점진적으로 증가하는 더하기 마진을 계산하는 메서드입니다. 점진적으로 증가하는 더하기 마진을 계산하는 메서드입니다.
@ -412,8 +427,8 @@ class PriceHandler:
- total_margin (int): 계산된 더하기 마진. - total_margin (int): 계산된 더하기 마진.
""" """
try: try:
thresholds = config.get('thresholds', []) thresholds = self.margin_config.get('thresholds', [])
additional_margins = config.get('additional_margins', []) additional_margins = self.margin_config.get('additional_margins', [])
if not thresholds or not additional_margins: if not thresholds or not additional_margins:
raise ValueError("기준 구간과 추가 마진 정보는 비워둘 수 없습니다.") raise ValueError("기준 구간과 추가 마진 정보는 비워둘 수 없습니다.")
@ -465,7 +480,7 @@ class PriceHandler:
return 0 # 예외 발생 시 기본값 0 반환 return 0 # 예외 발생 시 기본값 0 반환
def calc_initial_price(self, upper_avg_cost, margin_config, shipping_config, card = 0.04, min_margin = 0.24): def calc_initial_price(self, upper_avg_cost, card = 0.04, min_margin = 0.24):
""" """
초기에 모은 상품원가와 기준가격표를 기준으로 카드수수료, 최소마진등을 기반으로 계산 기준가격을 산출하고 초기에 모은 상품원가와 기준가격표를 기준으로 카드수수료, 최소마진등을 기반으로 계산 기준가격을 산출하고
이를 기반으로 테이블표에 의한 더하기마진, 해외배송비를 계산하는 함수. 이를 기반으로 테이블표에 의한 더하기마진, 해외배송비를 계산하는 함수.
@ -484,11 +499,11 @@ class PriceHandler:
initial_cost_price = self.round_to_UP(initial_cost_price) initial_cost_price = self.round_to_UP(initial_cost_price)
self.logger.debug(f"원가에 카드수수료 {card*100}%, 기본마진 {min_margin*100}% 적용된 계산원가: {initial_cost_price}") self.logger.debug(f"원가에 카드수수료 {card*100}%, 기본마진 {min_margin*100}% 적용된 계산원가: {initial_cost_price}")
initail_shipping_cost = self.calculate_additional_margin_with_extended_thresholds(initial_cost_price, margin_config) initail_shipping_cost = self.calculate_additional_margin_with_extended_thresholds(initial_cost_price)
initail_shipping_cost = self.round_to_UP(initail_shipping_cost) initail_shipping_cost = self.round_to_UP(initail_shipping_cost)
self.logger.debug(f"계산원가 기준 해외배송비: {initail_shipping_cost}") self.logger.debug(f"계산원가 기준 해외배송비: {initail_shipping_cost}")
initail_margin_cost = self.calculate_shipping_cost_with_extended_thresholds(10000, initial_cost_price, shipping_config) initail_margin_cost = self.calculate_shipping_cost_with_extended_thresholds(10000, initial_cost_price)
initail_margin_cost = self.round_to_UP(initail_margin_cost) initail_margin_cost = self.round_to_UP(initail_margin_cost)
self.logger.debug(f"계산원가 기준 더하기마진: {initail_margin_cost}") self.logger.debug(f"계산원가 기준 더하기마진: {initail_margin_cost}")
@ -566,8 +581,12 @@ class PriceHandler:
product_cost_element = await self.page.wait_for_selector(product_cost_locator) product_cost_element = await self.page.wait_for_selector(product_cost_locator)
standard_selling_price_element = await self.page.wait_for_selector(standard_selling_price_locator) standard_selling_price_element = await self.page.wait_for_selector(standard_selling_price_locator)
cost_value = int(float(await product_cost_element.input_value().replace(",", ""))) # cost_value = int(float(await product_cost_element.input_value().replace(",", "")))
price_value = int(await standard_selling_price_element.input_value().replace(",", "")) cost_value_str = await product_cost_element.input_value()
cost_value = int(float(cost_value_str.replace(",", "")))
# price_value = int(await standard_selling_price_element.input_value().replace(",", ""))
price_value_str = await standard_selling_price_element.input_value()
price_value = int(float(price_value_str.replace(",", "")))
self.product_costs.append(cost_value) self.product_costs.append(cost_value)
self.option_data.append({ self.option_data.append({
@ -615,12 +634,12 @@ class PriceHandler:
""" """
try: try:
# 더하기 마진 값 가져오기 # 더하기 마진 값 가져오기
margin_element = await self.page.wait_for_selector(self.selectors['plus_margin_locator']) margin_element = await self.page.wait_for_selector(self.plus_margin_locator)
margin_value = await margin_element.input_value() margin_value = await margin_element.input_value()
margin = int(margin_value.replace(",", "")) if margin_value else 0 margin = int(margin_value.replace(",", "")) if margin_value else 0
self.logger.debug(f"더하기 마진 값: {margin}") self.logger.debug(f"더하기 마진 값: {margin}")
shipping_element = await self.page.wait_for_selector(self.selectors['oversea_shipping_locator']) shipping_element = await self.page.wait_for_selector(self.oversea_shipping_locator)
shipping_value = await shipping_element.input_value() shipping_value = await shipping_element.input_value()
shipping_cost = int(shipping_value.replace(",", "")) if shipping_value else 0 shipping_cost = int(shipping_value.replace(",", "")) if shipping_value else 0
self.logger.debug(f"해외 배송비 값: {shipping_cost}") self.logger.debug(f"해외 배송비 값: {shipping_cost}")
@ -691,7 +710,7 @@ class PriceHandler:
'ratios': ratios 'ratios': ratios
} }
def round_to_UP(number, nearest=1000): def round_to_UP(self, number, nearest=1000):
""" """
숫자를 주어진 'nearest' 값에 맞춰 올림합니다. 숫자를 주어진 'nearest' 값에 맞춰 올림합니다.
@ -706,7 +725,7 @@ class PriceHandler:
rounded_number = math.ceil(number / nearest) * nearest rounded_number = math.ceil(number / nearest) * nearest
return rounded_number return rounded_number
def convert_cny_to_krw(cny, exchange_rate=200): def convert_cny_to_krw(self, cny, exchange_rate=200):
""" """
위안화 금액을 원화로 변환하는 함수 위안화 금액을 원화로 변환하는 함수
@ -729,6 +748,8 @@ class PriceHandler:
- total_extra_shipping (int): 계산된 추가 해외배송비 - total_extra_shipping (int): 계산된 추가 해외배송비
""" """
total_extra_shipping = 0 total_extra_shipping = 0
self.logger.debug(f"category : {category}")
cmb_config = self.cmb_diag.get_crmobi_stage(category)
# locator_manager에서 카테고리별 해외배송비 설정을 불러옴 # locator_manager에서 카테고리별 해외배송비 설정을 불러옴
category_data = self.locator_manager.get_category_data(category) category_data = self.locator_manager.get_category_data(category)