2026-09-14 세션 — AL발주서 엑셀 산출물 실물 대조 개선 — 기록: [코디]
논의·대안
[페페] 지시 = 「pfs AL발주서 현재 엑셀 작성본 확인해서 개선 사항 연구하고 반영해라」.
「현재 작성본」을 두 갈래로 잡고 둘 다 확인했다.
① PFS /field/al-orderpaper 가 뽑는 엑셀(생성기 api/pfs/al_orderpaper/al_orderpaper_excel.py
+ 번들 템플릿 assets/al_order_template.xlsx = AL업체·유리업체 2시트).
② 현장에서 사람이 실제로 채워 보낸 NAS 실물 —
\\192.168.0.101\...\2026현장\원부자재발주서\09월\ 의 26.9월분 4건
(봉적 한남동 서안대 · 이지웨이 요청건 · 에넥스 금호 구미 형곡3차 MH · 한샘 학동매장).
C:\dev\tools\nasget.py get 으로 받아 C:\dev\_work\al-op\ 에서 대조했다.
대조 결과 나온 갭은 「양식이 원래 하던 일을 PFS 산출물이 못 하고 있는 것」 4건 + 「양식에 칸이 있는데 PFS 가 안 채우는 것」 1건이었다. 자재 발주 실무상 이 산출물은 그대로 팩스로 나가는 종이라, 표기가 회사 양식과 다르거나 한 장에 두 업체가 섞이면 그 자체가 사고다 — 그래서 「보기 좋게」가 아니라 오배송·오표기 차단을 기준으로 골랐다.
착수 전 상의 = 코덱스(gptapp.py ask) 3문항. 답 중 「fitToPage 면 수동 페이지나눔이 무시된다」는
실측으로 뒤집혔다(아래). 계획 서브에이전트(Fable)는 코드 읽기 단계에서 11분 무응답이라
생존감시(Monitor)가 잡아 중단시켰고, 사실조사가 이미 끝나 있어 계획 없이 진행했다.
결정
반영 5건(전부 master 로컬 커밋, 운영 미반영).
- 날짜칸 — 양식 서식이
mm" ."dd(aaa)(=09 .09(수))인데 PFS 는 문자열'2026-09-09'를 넣어 서식이 안 먹었다.datetime.date로 넣는다. 연도칸도 문자열 →int. 실측 대조(Excel COM.Text) = 개선 후'09 .09(수)'— NAS 실물과 문자 단위로 같다. - 매수칸 — 템플릿 수식
=ROUNDUP(ROW()/20,0). AL 은 블록주기 20이라 1,2,3 정상인데 유리는 블록주기 29 라 3장째부터 1,2,4,5,7 로 튄다(원본 엑셀 버그를 그대로 상속, NAS 실물 4건 전부 같은 값). 계산한 장 번호를 값으로 박는다. - 페이지나눔 — 블록(발주서 1장)마다 row break. 없으면 AL 은 자동나눔이 40행에 떨어져
한 페이지에 발주서 두 장이 찍힌다 = 수신처가 다른 업체 발주서가 같은 종이·같은 팩스로 나간다.
화면 인쇄 경로는 이미
.al-sheet{page-break-after:always}로 장 단위였는데 엑셀만 아니었다. - 빈 시트 — 유리만(또는 AL만) 발주하는 현장(실물 「이지웨이 요청건」이 그렇다)에 수신처만 찍힌 빈 발주서 시트가 딸려 나가던 것 → 항목 없는 쪽 시트 삭제.
- 타입칸 — 양식
타 입행(AL A19 · 유리 A28)에 실물은84A,59:주방3,일반2처럼 타입명과 세대수를 적어 보낸다(26.9월 4건 중 1건 사용). PFS 는 현장명만 채우고 이 칸을 비웠다 → 헤더에type_note1칸 추가(DB 멱등 ALTER · 엑셀 채움 · 입력칸).
타입칸 UI 는 web-designer 상담(페페 상시 지시 26.9.4)대로 첫 줄에 끼우지 않고 별도 줄로 뺐다 —
1366px 에서 첫 줄이 이미 경계(계산 ≈1130px vs 가용 1124px)라 인라인 추가는 줄바꿈 확정이라는 진단.
폭은 정의만 되고 안 쓰이던 .w220 재사용(새 CSS 0줄). 접힌 헤더 요약은 값이 있을 때만 표시
(4건 중 1건꼴로 쓰는 칸이라 늘 「타입 -」를 달면 노이즈).
산출물·커밋
- master
7c81ac8— 개선 1~4 (al_orderpaper_excel.py1파일). - master
8500344— 개선 5 타입칸 (al_orderpaper_excel.py·al_orderpaper_dao.py·al_orderpaper_service.py·field_al_orderpaper.html·al_orderpaper.js·migrations/patch49_al_orderpaper_type_note.sql). - 운영 배포 완료(페페 채팅 승인 26.9.14 04:1x) —
deploy-live2357d07·cb84927(master 2커밋 체리픽). 배포경계 = 대상 6파일에 대해origin/deploy-livevs 작업직전 master(f70b1a5) diff 비어 있음(내 변경분뿐). 체리픽 뒤 blob 해시 6/6 master 와 동일(working-tree md5 는 CRLF 때문에 다르게 나온다 — blob 으로 잰다). ⚠deploy-live는 별도 worktreeC:\dev\pfs_deploy_wt에 있다 — 본 리포에서checkout deploy-live는 거부된다. - 배포 검증 = 운영 HEAD
cb84927· 마커 8/8 ok(scripts/_al_deploy_check.py) · 서버 openpyxl 3.0.10 으로_demo()PASS(로컬은 3.1.5 라 따로 재야 한다) · 운영 실데이터 1건(no=1금강 부산에코)으로 실제 엑셀 생성 → 시트 2 · 브레이크[20]/[29]· 매수[1,2]·pfs-liveuwsgi 04:19:27 KST 재기동 · health 8000 = 200. - DB =
al_orderpaper.type_note VARCHAR(150)ADD COLUMN 만(운영·테스트 둘 다 적용 확인,scripts/_al_type_note_column_check.py). DROP·데이터 변경 0. - 사이트맵 재빌드 = 그룹 8 · 페이지 58 · 미반영 1(
/field/worklog— 이번 건과 무관한 기존 차이). - devplan
pfs.html— 배포분 2건을 DONE(AR·AQ)에 올리고, PENDING 에 낡아 있던 07-29 AL발주서 QA 4건을 비웠다 (deploy-live파일에 그 마커가 이미 있다: dao"vendors TEXT NULL"· 템플릿alVendorRows). - 자체검사
_demo()확장 — 기존 assert 전량 유지 + 날짜형·연도 int·유리 3블록 매수[1,2,3]· 블록 경계 브레이크·한쪽만 발주 시 시트 1개·firstSheet=0·타입 2블록째까지. - 실측 도구(스크래치,
C:\dev\_work\al-op\) =pagecheck.py(Excel COM 페이지 수·나눔행) ·celltext.py(서식 적용 결과 문자열) ·dump.py(NAS 실물 탭 덤프).
🔴새 함정 2건은 projects/pfs/rules.md 🆕 신규에 적었다.
- openpyxl 로 시트를 지우면 workbookView.firstSheet=1 이 남아 엑셀이 파일을 아예 못 연다
(openpyxl 로는 멀쩡히 읽히고 zip 구조도 정상이라 파일만 봐선 안 걸린다). 판정 = Excel COM 열기.
- fitToPage=True 라도 fitToHeight=0(높이 자동)이면 수동 page break 는 정상 동작한다
(실측 AL 3블록 → 3페이지). 브레이크 id 는 delete_rows 를 안 따라오니 행 삭제 뒤에 깐다.
다음
- ⏳화면 육안은 페페 몫 — 타입칸이 실제로 어떻게 렌더되는지 못 봤다(로그인 500).
- ⏳PFS 로그인 500 — 테스트·운영 둘 다
POST /api/auth/login500.pfs_login.env비번 낡음 가능성(rules §에 같은 증상 기록). 이걸 고쳐야 E2E·UI 검사기가 다시 돈다. 참고로 운영 AL발주서 데이터는 1건뿐이다(테스트 5건) — 아직 실사용 초기. - 제안(미반영, 페페 결정 사항) = ①유리 입고처가 여러 곳일 때 PFS 는 장을 나누는데
실물은 한 장 안에 입고처 행을 끼워 쓴다(같은 업체에 3장이 가는 대신 1장) ②유리 두께(3T/5T)를
필드로 받아 비고를 자동 조합 ③AL 캡노트(
*캡 포함 마감 사이즈입니다. 캡 색상: 투명캡)를 편집 가능하게.
관계
- 주제 그룹: pfs-al-orderpaper
- 관련 문서: pfs-session-2026-07-29-al-orderpaper-qa8, pfs-session-2026-07-29-al-profile-crud