DSR (PMX) 워크플로우 v2 — 모달 자동화

매일 07:25 KST 자동 실행 (월~토) · Playwright + 모달 자동 입력 + 결근자 자동 반영
📅 도입: 2026-07-02 🤖 코드: pmx_workdaily_modal.py ⏰ 스케줄: 25 7 * * 1-6 📊 모드: headless + iframe 내부
📊 DSR v2 워크플로우 — 5단계 모달 자동화 오늘자 카드: textarea 자동입력 → 저장 → 인원 모달 → 4직종 분배 → Telegram 발송 STEP 0 · 환경 로드 BASE_DIR=/home/jaekyung/dsr · .env 로드 (PMX_ID/PW + Telegram) · SCREEN/IMAGE/DATA 폴더 생성 · .venv python 우선 .env 권한 600 · chromium 1223/1228 캐시 활용 (별도 설치 불필요) STEP 1 · 일정 포털 fetch (HTTP API) GET http://211.106.147.183:8081/schedule → memos / pouring / todos / manpower_json 4섹션 → 오늘(26.07.02) + 내일(26.07.03) 작업메모 파싱 ("총원N명" 줄까지 = 작업내용) 💡 포털 직접 호출 (브라우저 X) — urllib.request 10s 타임아웃 STEP 2 · PMX 로그인 https://www.gs-pmx.com/com/login → .env ID/PW 입력 → storage_state = pmx_storage_v2.json (세션 재사용) storage_state 만료 시 재로그인 자동 (browser context) STEP 2.5 · 작업일보 iframe 진입 partner_workdaily_mgm?mnuId=004142 ⚠ iframe 내부 → page.frame_locator() DOM은 영문 (PMX 본사) — selector 영문 기준 작성 STEP 3 · 오늘자(26.07.02) 카드 sync "이전 작업 가져오기" → "확인" 클릭 (있을 때만) nth(0) = 가장 가까운 빈 미래 카드 (오늘자 안 건드림 — GS 취합중) v1 사고 교훈: 6/28 카드 잘못 잡음 → v2는 명시적 date 매칭 + nth(0) 정책 STEP 4 · textarea 금일/명일 입력 금일(오늘) = 오늘자 메모 5줄 명일(내일) = 내일자 메모 5줄 → fill() (not type) — IME 우회 ⚠ fill 후 reload 시 데이터 휘발 → 5초 내 저장 STEP 5 · 인원 모달 자동 입력 roster.json 풀 명단 + 4직종 매핑 today_overrides[26.07.02].absent → 결근자 2명 자동 차감 (천응수, 신동훈) 내선공 6 → 4명 / 협력회사 1 → 0명 자동 STEP 6 · 카드 저장 + 캡쳐 + Telegram btnSave 클릭 (PMX) → 캡쳐: screens_modal/final_26.07.02.png + image_cache/DSR_2026-07-02_success.png Telegram 봇 pmx2580_bot → chat_id=8675731677 (소장님 Home) 발송 ✓ match_roster / labor_match 자동 검증 (status=OK, exit 0) v1 → v2 핵심 개선 (차별점) ┌─ v1 (462 lines) — 폐기됨 6/29 사고 원인 · find_card selector 버그 (6/28 카드 잡음 → 7/1 데이터 덮어씀) · iframe 내부 selector 누락 (DOM 영문 인식 실패) · 인원 모달 4직종 자동화 미지원 (소장님 30초 수동 필수) · nth(0) 정책 불일치 (PRO + 기존 코드 상이) └─ v2 (pmx_workdaily_modal.py, 48KB, 7/2 신규) · 명시적 date 매칭 (26.07.02 정확) + nth(0) = 가장 가까운 미래 카드 · frame_locator("iframe[src*='partner_workdaily_mgm.do']") iframe 진입 · roster.json 기반 4직종 자동 배분 + 결근자 자동 차감 (소장님 개입 최소화) · status=OK / saveClicked=True / match_roster / labor_match 4중 검증 → exit 0

📂 핵심 파일 4개

🎯 자동화 성공률

⚠️ 운영 pitfall

📍 파일 위치 및 백업

소스: /home/jaekyung/dsr/ · 백업(방금): /mnt/ssd500/var/hermes-dsr-backup-20260702-082800/ (852K)
스크린샷: /home/jaekyung/dsr/screens_modal/ · 이미지캐시: /home/jaekyung/dsr/image_cache/
로그: /home/jaekyung/dsr/logs/dsr_$(date).log · 결과: /home/jaekyung/dsr/data/dsr_result.json
크론: /etc/cron.d/dsr-send (root 644) · 스케줄: 25 7 * * 1-6 jaekyung ... /home/jaekyung/dsr/dsr.sh
venv: /home/jaekyung/.pixelrag-venv/bin/python (재활용) · chromium: /home/jaekyung/.cache/ms-playwright/chromium-1228

다음 자동 실행: 2026-07-03 (금) 07:25 KST — 소장님 폰에 Telegram 알림 자동 발송