Commit Graph

144 Commits

Author SHA1 Message Date
king 106cf70922 feat(dispatch): 라벨 PDF에서 받는 사람(이름/전화/주소) 추출
xlsx 엔 받는 사람이 없거나(Shopee) 가려져(TikTok) 라벨 PDF 를 출처로 사용.
업로드 시 Order ID 로 박스와 조인해 채운다(하이브리드).

- pdf_parser.py 추가 (pdfplumber)
  · Shopee SPX 라벨: 2단 중 왼쪽 열만 읽어 Recipient 블록 추출(전화 미표시)
  · TikTok 라벨: 배송사별 양식 대응 — To <이름> (+60)…(Ninja), Receiver <이름>(NDD)
  · 주소 영역에 섞인 10자리+ 바코드 숫자 제거(우편번호 5자리 보존)
  · PDF 없거나 파싱 실패해도 업로드 진행(PII 만 빈 값)
- router: 라벨 PDF 파싱 결과를 parcels 에 머지 후 저장
- requirements: pdfplumber>=0.11 (Docker 재빌드 필요)
- new.html: PDF 가 받는 사람 출처임을 안내(권장)
- .gitignore: docs/samples/ (실제 고객 PII PDF — 커밋 금지)
- 문서 갱신

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 14:45:35 +09:00
king 691eecee52 fix(dispatch): Shopee Packing List xlsx 파싱 추가
- 헤더 별칭에 underscore형(order_sn, tracking_number) 추가
- Shopee 는 SKU/수량이 product_info 한 셀에 묶여 있어 전용 파서 추가
  · store.parse_shopee_product_info: [n] 단위 상품 분해, SKU/상품명/수량 추출
  · parser._parse_shopee: 1행=1주문=1박스, 상품 펼쳐 박스로 묶음, 배송사 SPX 추론
- parse_export(platform) 로 Shopee/일반 경로 분기, 라우터가 platform 전달
- 이름/주소/전화는 xlsx 에 없음 → 라벨 PDF 단계에서 보강 예정
- 테스트 3개 추가

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 14:29:54 +09:00
king f1097b85dc feat(dispatch): Shopee 플랫폼 추가 + 받는 사람 정보 저장/출고 엑셀
- 플랫폼 TikTok/Shopee 분리: 업로드 화면이 선택에 따라 파일 안내 변경
  (TikTok=Order Export xlsx, Shopee=Packing List xlsx / 라벨 PDF 선택)
- TikTok Picking List.pdf 업로드 제거(피킹 요약은 데이터 엑셀로 생성)
- 파서 공용화 + 헤더 행 자동탐지(Shopee 제목행 대응), 두 포맷 헤더 별칭 통합
- 받는 사람 이름/전화/주소를 박스 단위로 dispatch_db 에 저장(개인정보)
  · init SQL 갱신 + 기존 DB용 멱등 마이그레이션 dispatch_add_recipient_columns.sql
- 출고 작업 카드: Package 제거, 받는 사람 이름(크게)+주소(여러 줄)+전화 표시
- 배치 다운로드 zip 에 취합 출고 엑셀 포함
  파일명 YYYY.MM.DD(Ddd)_tictoc.xlsx / _shopee.xlsx (export.py)
- 문서(CLAUDE.md, DISPATCH_MODULE.md) PII 보관·Shopee 반영

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 14:16:11 +09:00
king c0a661db82 feat(dispatch): 출고 배치별 업로드 원본 zip 다운로드
배치 목록에 '다운로드' 버튼 추가. 피킹/라벨 PDF + 주문 엑셀 중
실제 존재하는 파일만 zip 으로 묶어 내려준다. 한글 파일명은
RFC5987 filename* 으로 인코딩.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 21:50:53 +09:00
king 5426889f91 revert(dispatch): 송장 클립보드 복사 기능 제거
J&T 가 path 방식으로 자동 조회되어 클립보드 복사가 불필요해짐.
복사 JS·토스트·CSS·data-copy 속성 삭제. 송장 링크/스타일은 유지.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 19:25:44 +09:00
king 8523a620ad fix(dispatch): J&T 송장 조회를 경로(path) 방식으로 자동 조회
jtexpress.my/tracking/<송장번호> 형태면 자동 조회됨(쿼리 파라미터는 무시).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 19:24:14 +09:00
king ec037d7045 style(dispatch): 송장 밑줄 강제표시·확대 + J&T 파라미터 제거
- 송장 링크 밑줄이 erp.css 전역 a 스타일에 덮여 안 보이던 것 !important 로 강제
- 송장번호 18px 로 확대
- J&T 는 파라미터 무시(자동입력 불가)라 깔끔한 공식 페이지만 열고 클립보드 복사로 처리

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 19:20:48 +09:00
king 6141f0e38a feat(dispatch): 송장 클릭 시 클립보드 복사 + J&T 공식 페이지로
- J&T 를 공식 조회 페이지(jtexpress.my/tracking)로 되돌림
- 송장번호 클릭 시 클립보드에 자동 복사 후 새 탭 열기(공식 페이지에 붙여넣기)
  복사 완료 토스트 표시. Ninja Van 등 자동입력 되는 곳도 복사는 동작.
- 송장 링크 굵기 800 + 밑줄 2px 로 강조

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 19:17:43 +09:00
king fe8a4f146e fix(dispatch): J&T 조회를 17TRACK 으로 + Order ID 라벨 확대
- J&T gzquery 엔드포인트 404 → 17TRACK(#nums 자동입력·조회)로 교체
  (J&T MY 공식 딥링크는 송장 자동입력 미지원). Ninja Van 은 공식 유지.
- 'Order ID' 라벨 14px 로 확대(숫자 크기는 유지)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 19:13:37 +09:00
king 4a07ef139d feat(dispatch): 작업 2단계로 축소 + J&T 조회 URL 수정 + Order ID 확대
- 택배스캔 단계 제거 → 라벨부착 / Kagayaku 전달 2단계
- 버튼 라벨에서 '완료' 제거(라벨부착 / Kagayaku 전달)
- 완료 판정/배치목록 완료수를 label_attached AND handed_to_kagayaku 기준으로
- J&T 송장 조회 딥링크를 gzquery.html?bills= 로 교체(billcode 미입력 문제)
- Order ID 27px 로 확대, 송장 링크 밑줄 강조(굵기/오프셋)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 19:09:16 +09:00
king 1c14c748dd feat(dispatch): Order ID 강조 + 송장번호 배송조회 딥링크
- Order ID 를 카드에서 가장 크게(22px bold) 표시 — 가장 자주 보는 값
- Tracking 번호 클릭 시 배송사 조회 페이지로 송장번호 채워 새 탭 이동
  (store.courier_tracking_url + Jinja 필터 courier_track)
- Ninja Van/J&T 등 말레이시아 주요 배송사 URL 매핑(미매핑은 텍스트 폴백)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 19:02:44 +09:00
king bd79d20eb1 feat(dispatch): 작업 단계를 3개로 축소(라벨부착·Kagayaku전달·택배스캔)
상품은 미리 제작·박스 포장까지 끝나 들어오므로 상품준비/포장완료 단계 제거.
- STATUS_FIELDS 3개로 축소(DB 컬럼 product_ready/packed 는 보존)
- 카드 버튼·필터(미포장/포장완료 → 미완료) 갱신
- 완료 판정/카운트는 STATUS_FIELDS 기준이라 자동 반영

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 18:58:06 +09:00
king ec8c1caced style(dispatch): 업로드 폼 파일 라벨을 번호 이모지 표기로 변경
표시 라벨만 변경(1️⃣/2️⃣/3️⃣). 서버 저장 파일명은 기존 안전한 이름 유지.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 17:54:01 +09:00
king 31eaac8424 style(dispatch): 카드 상단 여백 제거 — 로고를 우상단 absolute 배치
큰 로고가 flex 헤더 줄 높이를 키워 No.1 위에 빈 띠가 생기던 문제 수정.
로고/텍스트 배지를 카드 우상단으로 absolute 처리해 줄 높이에 영향 없게 함.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 16:23:19 +09:00
king dfe79878b1 style(dispatch): 배송사 로고 표시 크기 2배(카드 44px·전달 40px)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 16:21:00 +09:00
king fd4ef9180c feat(dispatch): 배송사 로고 파일 확장자 자동 감지(png 우선)
디스크에 있는 <슬러그>.png 또는 .svg 를 탐지해 URL 반환(png 우선),
없으면 텍스트 폴백. 새 로고는 파일 1개 + 키워드 1줄로 추가 가능.
lru_cache 로 페이지당 반복 stat 최소화.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 16:08:45 +09:00
king a65ca65a8b feat(dispatch): 배송사 배지를 로고 이미지로 표시
- store.courier_logo_url: 배송사명(부분 일치) → 로고 SVG URL, 없으면 텍스트 폴백
- Jinja 필터 courier_logo 등록(main.py)
- Ninja Van / J&T Express 내장 SVG 로고 추가(static/dispatch/courier/)
- 출고 작업 카드 + Kagayaku 전달 요약에 로고 렌더

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 15:54:23 +09:00
king a189b93427 fix(dispatch): TikTok export 파싱 — read_only 버그 회피 + 설명행 스킵
- load_workbook read_only=True 제거: TikTok export 의 부실한 <dimension>
  메타 탓에 read_only 모드가 A열만 읽고 끊기는 openpyxl 버그(실제 54열 →
  1열만 반환)로 'Seller SKU 컬럼 없음' 오인 발생. 일반 모드로 전환.
- 헤더 바로 아래 '컬럼 설명' 행(2번째 행) 스킵: ID 필드에 공백이 있으면
  데이터가 아니라 설명 문장으로 판별(_is_description_row).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 15:27:29 +09:00
king 99eea01fc1 feat(dispatch): 말레이시아 TikTok 출고관리 모듈 추가
03_TikTok_Order_Export.xlsx 업로드 → 1박스=1카드 출고 작업 리스트,
SKU 피킹 요약, Kagayaku 전달표(A4 인쇄)를 자동 생성.

- 1박스 묶음 기준: Package ID > Tracking ID > Order ID, 같은 박스 같은 SKU 합산
- 작업 상태 5단계 토글(AJAX 즉시 저장) + dispatch_logs 기록
- 고객 이름/주소/전화 미저장(파싱 시 폐기, 스키마에 컬럼 없음)
- 엑셀은 openpyxl 파싱(pandas 미사용), DB는 dispatch_db 전용
- 인증은 기존 Google OAuth + 신규 권한키 dispatch 재사용
- scripts/sql/dispatch_db_init.sql, docs/DISPATCH_MODULE.md 동봉

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 15:11:43 +09:00
king 8453c425f8 feat(malaysia): POG 버튼명 변경 및 영문 모드 지원
'창고POG 출력' → 'POG 출력'. KO_EN 사전에 POG 출력/창고 POG
미리보기 추가해 ENG 모드서 영어 표시.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 00:32:23 +09:00
king a3a1d3fbad fix(malaysia): 창고 POG 인쇄 6열 강제 + 면당 한 장 보장
.rv-row 에 grid-template-columns:repeat(6,1fr) !important 로 6열
강제(인쇄 시 3열로 덮이던 문제 차단). height:210mm 고정 제거 →
height:auto + 칸 min-height:50mm 로 프린터 기본여백 더해져도 면이
한 장 넘던 문제 해소. rv-side flex 해제해 자연 높이로 흐름.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 00:29:23 +09:00
king 1424772afa fix(malaysia): 창고 POG 인쇄 시 grid 깨짐 수정(6열 복구)
container-type:size 가 인쇄에서 자식 grid 를 3열로 깨는 Chrome
버그 회피 — 인쇄 전용으로 containment 해제, 글자·여백 mm 고정,
시트 height:210mm(A4 가로 1면=1장). 화면 미리보기는 cqh 유지.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 00:24:21 +09:00
king b0925b86a1 fix(malaysia): 창고 POG 글자 축소로 면별 한 페이지에 맞춤
cqh 글자 2.6→1.55, 패딩·간격 축소. 셀 내용 잘림·페이지 초과 해소.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 00:20:04 +09:00
king fb114a222c feat(malaysia): 창고 POG를 면별 A4 1장(Side A/B/Ground)으로 분리
전체 1장 → 면마다 한 페이지로 출력. 행을 flex 균등 분배해
칸·글자 크게(cqh 2배) 한눈에 보이게. 시트별 page-break 적용.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 00:16:15 +09:00
king 0ce932f0e2 feat(malaysia): 창고 랙 전체 도면 A4 1장 'POG 출력' 추가
창고POG 출력 버튼 → Side A/B/Ground 전체 도면을 A4 가로 1장에
미리보기 후 인쇄. container-type:size + cqh/cqw 로 시트 높이에
맞춰 자동 축소. 기존 칸별 인쇄와 body 클래스(printing-cells/
printing-pog)로 분리해 인쇄 대상 충돌 방지.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 00:11:14 +09:00
king 650a14fe7c style(malaysia): 창고 랙 보기 화면 글자 크기 확대
칸코드/상품명/계산식 11→14px, 셀 패딩·높이 확대해 가독성 개선.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 23:38:02 +09:00
king aedb5f1fdb fix(malaysia): 랙 엑셀 합계 제목행 배경색 위치 어긋남 수정
append([]) 은 셀이 없어 max_row 가 증가하지 않아, 합계 제목행 대신
바로 위 빈 줄에 배경색이 칠해졌다. 빈 문자열 셀로 한 줄 띄우고
제목행 추가 직후 max_row 로 정확한 행을 잡아 스타일 적용.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 16:44:23 +09:00
king 2bbe36ccf0 feat(malaysia): 랙 엑셀에 아이템별 합계 표 추가
상세 표 아래(한 줄 띄움)에 아이템 코드별 수량 합계 표를 추가.
컬럼: 아이템 코드/이름/합계 수량, 코드순 정렬. 자동필터는 상세
표 범위에만 적용(합계 표 제외). 열너비 자동은 그대로.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 16:42:05 +09:00
king ec9630144d feat(malaysia): 창고 랙 보기 엑셀 다운로드 추가
랙 보기 기준(latest_rack_stocktake)의 모든 칸 항목을 xlsx 로 내보내는
/rack/export 엔드포인트와 다운로드 버튼 추가. 컬럼: 아이템 코드/이름/
수량/랙번호. 표 전체 자동필터, 각 열 내용 길이에 맞춰 너비 자동(한글
폭 보정). 뚜껑(MD-) 이름도 병합해 표시.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 16:36:54 +09:00
king 55a2fc8793 feat(malaysia): 뚜껑(MD-) 랙 위치확인 배치 허용, 재고는 미반영
뚜껑(MD-0000~0005)을 재고조사 랙 입력 드롭다운에 노출해 창고 랙
어디에 있는지 위치만 기록할 수 있게 함. 재고에는 반영하지 않음.

- store.LID_ITEMS / lid_name_map 추가
- validate_rack_code 신설(개별/세트/뚜껑 허용) → replace_rack·
  reposition_rack 검증에 적용. 직접 라인 입력(validate_stocktake_code)은
  여전히 MD- 차단해 재고 오염 방지.
- aggregate_rack 에서 MD- 집계 제외 → daily_stocktake_line 미생성.
- 랙 드롭다운 목록에 LID_ITEMS 추가, 랙 보기 이름맵에 뚜껑 이름 병합.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 14:40:17 +09:00
king fa396bd237 feat(malaysia): 재고조사 랙에 Side B 아래 Ground(G1~G6) 6칸 추가
Side B 다음에 Ground 영역을 추가하고 단일 파렛트 6칸(G1~G6)을
한 줄로 배치. rack_cell_codes 검증 목록과 rack_layout 렌더 구조에
반영. 면 제목을 side.label 로 바꿔 A/B는 'Side A/B', Ground는
'Ground'로 표기. 입력/이동 저장 검증 모두 G1~G6 허용.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 14:23:40 +09:00
king a683c38b76 fix(malaysia): 랙 인쇄 시 앱 셸 100vh 클립 풀어 모든 파렛트 출력
앱 셸(body.erp-app-body/.erp-app/.erp-content height:100vh +
overflow:hidden, .erp-page overflow:auto)이 한 화면만 보이게 잘라,
인쇄 시 둘째 칸부터 잘려 항상 1장만 인쇄되던 근본 원인. 인쇄
미디어에서 조상 요소의 height/overflow 제한을 해제해 선택한 모든
파렛트가 각 장으로 출력되게 수정.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 14:16:06 +09:00
king 6a2eded9b5 fix(malaysia): 랙 인쇄 페이지 분리를 break-before 로 변경
break-after:page 가 Chrome에서 100vh 시트에 무시돼 여러 파렛트가
한 장에 인쇄되던 문제. 첫 칸 제외 매 칸에 break-before:page 적용해
파렛트마다 새 장으로 확실히 분리.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 14:12:20 +09:00
king fb473f74ee fix(malaysia): 랙 다중 파렛트 인쇄 시 파렛트당 한 장씩 분리
미리보기 컨테이너(.rvp-pages)가 flex라 Chrome이 자식의 page-break를
무시해 여러 파렛트가 한 장에 뭉쳐 잘려 인쇄됐다. 인쇄 시 block 으로
바꾸고 break-after:page 적용해 파렛트(칸)마다 종이 한 장씩 출력.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 14:06:56 +09:00
king a807238cba fix(malaysia): 랙 가로 인쇄 상하 여백 0 처리해 세로 공간 확보
가로 인쇄 시 상하 여백은 프린터 좌우에 해당. 0으로 줄여 세로
출력 공간을 최대화. 좌우는 4mm 유지.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 14:01:46 +09:00
king cb3b6841e1 fix(malaysia): 랙 인쇄 시 상품 2개 이상이면 글자 용지 넘침 수정
미리보기는 vmin 비율로 자동 축소돼 한 장에 맞지만 실제 인쇄는
고정 cm 크기를 상품 1개 기준으로 사용해 2개 이상이면 세로로
용지를 넘어가 글자가 잘렸다. 칸 상품 수에 따라 인쇄 글자 크기를
단계(rvp-multi/rvp-many)로 축소해 A4 가로 1장에 맞게 수정.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 13:58:49 +09:00
king 81352d1ca7 fix(malaysia): 랙 인쇄 시 빈 페이지 출력 수정
비인쇄 요소를 visibility:hidden 대신 display:none 으로 제거. 기존엔 숨긴 요소가 공간을 차지해 인쇄 미리보기 overlay(static)가 아래로 밀려 첫 페이지가 비었음.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-16 13:37:48 +09:00
king d2701c2e22 style(malaysia): 콤보 재고 영역 확대·Last Stocktake 열 축소
콤보 카드 420→520px, Last Stocktake 96px 고정, 콤보 숫자열 nowrap·52px → 가로 스크롤 제거.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-16 11:52:58 +09:00
king 411c03e352 fix(malaysia): 콤보 재고 패널 영문 번역 추가
헤더(조사/출고/재고) data-ko/data-en, 안내문 i18n(날짜 분리), malaysia.js 캐시버전 갱신. 짧은 단어는 사전 대신 data 속성 사용해 RICH 부분치환 오염 방지.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-16 11:49:48 +09:00
king 5b9d9c45ea fix(malaysia): 같은 날 콤보 출고도 콤보 재고에 반영
콤보 재고 차감 기준을 movement_date > stocktake_date 에서
재고조사 created_at < set_movement.created_at 으로 변경.
날짜만 비교하면 재고조사 당일 출고가 누락되던 문제 수정.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-16 11:40:30 +09:00
king c786fbabd7 feat(malaysia): 콤보 출고를 콤보 재고현황에 반영
- set_movement(콤보 단위 출고 원장) 테이블 신설 + 마이그레이션 SQL
- create_set_out: 낱개 OUT 과 함께 콤보 OUT 1행 기록(같은 트랜잭션)
- 콤보 재고 = 최근 재고조사 콤보수량 − 재고조사일 이후 콤보 출고
- 재고현황 콤보 패널: 조사/출고/재고 3열 표시
- reset_all_data 에 set_movement 삭제 포함

배포: malaysia_stock_db_set_movement.sql 적용(테이블+GRANT) 후 코드 배포.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-16 11:35:40 +09:00
king 765d3ba985 feat(malaysia): BOM 없는 세트 있어도 재고조사 확정 허용(경고만)
- finalize_stocktake 의 missing_bom 하드 차단 제거 → 확정/저장 진행
- BOM 없는 세트는 낱개로 분해되지 않고 0 반영, 경고 로그만 남김
- 세트 BOM 분리는 itemcode_db(set_components) 권한이 정상일 때 자동 적용

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-16 11:12:13 +09:00
king 03a96b6118 feat(malaysia): 랙 저장 버튼 수정 시 빨강 강조·저장 안내창
- 드래그로 칸 재배치하면 저장 버튼을 검정→빨강(흰 글씨)으로 강조
- 저장 클릭 시 저장되었습니다. 안내창 표시 후 제출

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-16 10:13:02 +09:00
king f383297fc5 fix(malaysia): 인쇄 미리보기에서 빈 랙 제외
선택한 칸 중 비어 있는 칸은 미리보기/인쇄에서 제외. 선택한 칸이 모두
비어 있으면 '인쇄할 문서가 없습니다' 안내 후 미리보기를 열지 않음.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-15 18:31:11 +09:00
king e256c6c5ee style(malaysia): 랙 인쇄 레이아웃 — 번호 제거·용량 강조·박스 확대
- 인쇄/미리보기에서 랙 번호 제거(불필요)
- 여백 축소(@page 4mm, 시트 2mm), 글자 전반 확대
- 상품명과 용량(750ml 등) 줄 분리, 용량을 최대(5.5cm)로 키워 원거리 가독
- 계산식의 박스 수(21box)를 굵게 3cm로 강조

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-15 18:12:56 +09:00
king 6763b2af68 feat(malaysia): 랙 보기 드래그 재배치·저장·인쇄 미리보기
랙 보기에서 칸을 드래그해 다른 칸으로 구성을 옮긴다(채워진 칸끼리 맞교환,
Side A↔B 가능). 칸 번호는 유지되고 수량 합계도 불변(위치만). 저장하면 그
배치로 기록되며, 재고조사 '이전값 불러오기'가 이 최종 위치를 불러온다.

- db.reposition_rack: 칸(cell_code) 배치만 교체, daily_stocktake_line 보존,
  확정본도 허용(취소만 불가). 위치 이동은 전산재고에 영향 없음
- db.previous_rack_entries: 정렬을 랙 저장시각(MAX created_at) 기준으로 통일 →
  '이전값 불러오기'가 랙 보기 최종 위치와 일치
- POST /malaysia/rack/save: latest_rack_stocktake 대상 reposition
- rack_view.html + malaysia_rack_view.js: HTML5 드래그 이동/swap, 칸 체크 선택,
  저장(병렬배열 직렬화), 인쇄 미리보기 모달
- 인쇄: 선택한 칸을 칸마다 A4 가로 1장, 굵은 대형 글씨(@media print),
  미리보기 후 인쇄
- i18n 항목 추가, malaysia.js 캐시버스트 v20260615c

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-15 18:06:01 +09:00
king 2c0eeb5502 feat(malaysia): 확정된 날짜에 재고조사 생성 시 안내창 차단
같은 날짜+창고에 finalized 조사가 있으면 생성 버튼 클릭 시 alert 로
'{날짜} 은 재고조사가 확정되어 다시 재고조사를 생성할 수 없습니다.' 안내
후 제출 차단. 확정 날짜는 이미 받아온 stocktakes 목록에서 추출(추가 쿼리
없음). 서버측 차단(create_stocktake ValueError)은 안전망으로 유지. 한/영 안내.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-15 17:38:55 +09:00
king 6e32c68590 feat(malaysia): 재고조사에 '이전값 불러오기' 버튼 추가
작성중 재고조사 상세에서 직전 조사의 랙 저장값을 한 번에 불러와 채운다.
사용자는 이어서 수정 후 저장/확정. 직전 조사에 랙 입력이 있을 때만 버튼 노출.

- db.previous_rack_entries: 현재 제외·취소 제외, 랙 있는 가장 최근 조사의
  랙 항목 반환(replace_rack 입력 형식과 호환)
- POST /stocktakes/{id}/rack/load-previous: 이전 랙을 현재 조사로 replace_rack
  적용 후 리다이렉트(화면 복원). 작성중만 허용, 이전값 없으면 400
- 상세 핸들러에 has_prev_rack 플래그, 템플릿에 formaction 버튼(덮어쓰기 confirm)
- i18n '이전값 불러오기'→'Load previous', JS 캐시버스트 v20260615b

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-15 17:29:54 +09:00
king 4d05c7fad5 fix(malaysia): 랙보기 상단 제목 영문 미번역 보완
ENG 토글 시 topbar 제목 '창고 랙'(page_title)·'랙 보기'(page_subtitle)가
KO_EN 사전에 없어 '랙' 글자만 한글로 남았다. 두 항목 추가로 전체 번역.
malaysia.js 캐시버스트 v20260615a.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-15 17:22:48 +09:00
king c91059b415 fix(malaysia): 랙보기를 '최근 저장' 재고조사 기준으로
기존 랙보기는 latest_stocktake(조사 날짜 DESC) 기준이라, 방금 저장한
조사라도 날짜가 더 늦은 다른 조사가 있으면 안 보였다. 랙을 마지막으로
저장한 조사를 보여주도록 latest_rack_stocktake 추가 — daily_stocktake_rack
.created_at MAX 기준(replace_rack 이 매 저장마다 delete+insert 하므로
랙 저장 시각과 일치). 재고현황 index 의 날짜 기준 latest_stocktake 는 유지.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-15 14:49:30 +09:00