Commit Graph

413 Commits

Author SHA1 Message Date
king 86558dc8c1 fix(project): 프로젝트 상세 진입 시 기본 화면을 보드(세션)로
지금까지 프로젝트를 선택해도 기본 탭이 "달력"이라 가운데 화면에 세션이
바로 안 보였다(아사나는 프로젝트 진입 시 보드/리스트가 기본). 탭 순서를
보드·리스트·달력·타임라인으로 바꾸고 보드를 기본 활성 탭으로.

달력 이전/다음달 이동은 페이지를 통째로 새로고침하므로(?y=&m=), 마지막
탭을 localStorage(pj_view)에 기억해뒀다가 복원한다 — 안 그러면 달력을
보다가 월 이동만 해도 매번 보드로 튕겨나간다.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-15 19:50:20 +09:00
king 3e4883854d feat(project): 3단계 구조 프론트엔드 — 세션 관리·스코프·하위업무·멀티호밍·이미지
지난 커밋(07f4d0f)의 백엔드 위에 화면을 얹는다.

- 세션(기존 "단계") 문구 통일 + 프로젝트 스코프("이 프로젝트")일 때 보드
  컬럼에 관리 UI 추가: 이름변경/완료토글/삭제(만든 사람만)/"+ 세션 추가"/
  드래그 재정렬(카드 드래그와 같은 네이티브 HTML5 DnD, 기존
  PUT stages/order 재사용).
- 프로젝트 화면 툴바에 "이 프로젝트"/"전체 프로젝트" 스코프 토글 추가.
  기본은 아사나처럼 지금 프로젝트만(달력/타임라인/보드/리스트 4개 뷰
  전부), "전체"는 예전처럼 접근 가능한 프로젝트를 다 합쳐서 보여준다.
  서버가 tasks 각 행에 context_project_id(어느 프로젝트를 보다가 담겼는지)
  를 실어주고 클라이언트가 그걸로 순수 필터링(재조회 없음).
- 하위 업무 인라인 UI — 업무 모달 안에 체크박스·제목·담당자·마감일이 한
  줄인 하위업무 목록(변경 즉시 저장), "+ 하위 업무 추가". 카드에는
  "완료/전체" 진행 배지만 표시. update_task 에 completed 필드 추가(세션이
  없는 하위업무의 직접 완료 토글용).
- 멀티호밍 UI — 업무 모달에 "연결된 프로젝트" 칩 + "+ 프로젝트에 추가"(
  프로젝트/세션 선택). 보드에서 다른 프로젝트가 원 소속인 카드는 그
  프로젝트 배지를 달고 나타나며, 드래그로 세션을 옮기면
  POST /api/tasks/{id}/links 로 그 프로젝트 안에서의 배치만 바뀐다(원본
  불변). 링크 생성 권한을 다듬음 — 최초 연결은 원/대상 프로젝트 양쪽 권한이
  필요하지만, 이미 연결된 카드를 그 프로젝트 보드 안에서 옮기는 것은 대상
  프로젝트 권한만 있으면 되게 해 정상적인 드래그가 403 나지 않게 했다.
- 업무 설명란을 textarea → contenteditable 로 교체. 클립보드 이미지
  붙여넣기/파일 업로드 버튼으로 삽입(기존 task_attachments 재사용, 새
  GET /api/attachments/{id}/inline 추가 — 기존 /download 는
  Content-Disposition: attachment 라 <img> 렌더링에 못 씀). 새 업무 작성
  중(저장 전)에는 이미지 삽입 비활성화.
- .pj-modal-card 에 max-height/overflow-y 추가(내용이 늘어 화면보다
  길어지는 것 방지).

홈(index.html)·프로젝트(project.html) 두 업무 모달 모두 요소 id 를 공유하는
기존 구조를 그대로 따라, 새 로직은 공용 함수(initDescEditor/initSubtaskBlock/
initLinksBlock)로 한 번만 작성해 양쪽에서 재사용한다.

docs/PROJECT_MODULE.md 갱신 — 1-1절에 3단계 구조·권한 변경 전반을 정리.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-15 18:42:54 +09:00
king 07f4d0fd5b feat(project): 3단계 구조 백엔드 기반 — 세션 삭제자·하위업무·멀티호밍
프로젝트→세션→업무 3단계(아사나식) 전환의 1단계(백엔드). "세션"은 새 개념이
아니라 기존 "단계"(project_stages, 칸반 컬럼)를 그대로 재사용한다.

- project_stages 에 created_by 추가 — 세션 삭제도 "만든 사람만"(_can_delete
  재사용) 규칙 적용. api_delete_stage 를 _require_manage 단독 체크에서
  생성자 체크로 변경.
- 프로젝트 생성을 관리자 전용 → 로그인 사용자 전체로 개방
  (api_create_project: _require_admin → _require_user). 홈 화면의 "새
  프로젝트"/수정 모달·버튼도 is_admin 게이트를 걷어냄(생성자가 자동으로
  owner 가 되어 _can_manage 통과 — 기존 로직 재사용). 멤버 배정 API는 계속
  관리자 전용이라, 비관리자가 새 프로젝트 모달을 열면 멤버 선택란은 안내
  문구만 보여주고 시도하지 않는다(불필요한 403 방지).
- 하위 업무 — 새 테이블 없이 tasks.parent_task_id 재사용(부모 삭제 시
  CASCADE). list_tasks 는 기본적으로 최상위만 반환(보드/캘린더/리스트에
  하위업무가 카드로 안 뜨게) + comment_count 와 같은 방식으로 subtask_total/
  subtask_done 집계 추가. create_task 에 parent_task_id 지원(하위업무는
  부모와 같은 프로젝트, 세션 없음).
- 멀티호밍(task_project_links, 아사나 기능) — 업무 하나가 여러 프로젝트/세션에
  동시에 속할 수 있다. list_tasks(project_id=X, 비재귀)가 자동으로 그
  프로젝트에 연결된 업무까지 포함하도록 확장(다른 호출 경로는 안 건드림 —
  홈/내업무 전체보기에서 중복 노출 방지). 신규 API: GET /api/tasks/{id}(하위
  업무·연결 포함 상세), POST/DELETE /api/tasks/{id}/links.
- 설명란 이미지 삽입 준비: store.sanitize_description_html — 허용 태그만
  남기고 스크립트/이벤트속성/위험 URL 스킴 제거(표준 html.parser, 외부
  라이브러리 없음). api_create_task/api_update_task 저장 직전 통과.

⚠️ 배포 전 필수: scripts/sql/project_db_003_sections_subtasks_links.sql 를
project_db 에 적용해야 한다(project_stages.created_by, tasks.parent_task_id,
task_project_links 없이는 이 커밋의 쿼리가 전부 실패한다). 그 안의 기존
설명 텍스트→HTML 이스케이프 UPDATE 문은 1회만 실행할 것.

프론트엔드(세션 드래그 재정렬, 사이드바 프로젝트별 보기, 하위업무/멀티호밍
UI, 설명란 이미지 붙여넣기 편집기)는 다음 커밋에서 이어간다.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-15 18:15:25 +09:00
king e14d303b82 fix(cafe24): 앞 커밋에서 누락된 디자인파일 일반화 변경분 포함
config.py(Cafe24FtpConfig 일반화 + DESIGN_FILE_SPECS)·db.py(add/list_design_
revision)·router.py(design_files_router 연결)·_nav.html(탭 3개)·테스트·
.env.example·문서가 앞 커밋(8c2a9c4)에 함께 올라갔어야 하는데 스테이징 누락.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-15 14:50:58 +09:00
king 8c2a9c47e1 feat(cafe24): PC/모바일 상품상세 템플릿 편집 추가, 디자인파일 편집기 통합
- 상단 탭에 "PC 상품상세"(/sde_design/skin11/product/detail.html), "모바일
  상품상세"(/sde_design/mobile11/product/detail.html) 버튼 추가. 모바일
  스와이프와 마찬가지로 상품 API가 아닌 디자인 보관함 FTP 파일이며, 상세페이지
  편집기와 완전히 같은 문법강조·색상·단축키를 그대로 재사용.
- 세 파일(swiper/mobile_detail/pc_detail)이 화면·로직 100% 동일해 라우터를
  routes_swiper.py → routes_design_files.py 로 일반화(/cafe24/design/{file_key}
  하나로 공유). 템플릿도 swiper.html → design_editor.html 로 통합.
  db.py 의 add_swiper_revision/list_swiper_revisions 도 file_key 를 받는
  add_design_revision/list_design_revisions 로 일반화(테이블은 처음부터
  file_key 컬럼으로 여러 파일을 담게 설계돼 있어 마이그레이션 불필요).
- PC/모바일 상품상세는 상품 1건이 아니라 전체 상품 페이지가 공유하는
  템플릿이라 적용 확인 문구에 별도 경고 추가.
- 신규 env: CAFE24_MOBILE_DETAIL_FTP_PATH, CAFE24_PC_DETAIL_FTP_PATH
  (FTP 호스트/계정은 기존 CAFE24_FTP_* 공유). .env.example·문서 갱신.
- 유닛테스트 갱신/추가: DESIGN_FILE_SPECS 3종 등록 확인, 경로 env 오버라이드.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-15 14:50:39 +09:00
king 93037411fb feat(cafe24): 모바일 스와이프(product-swiper.js) 편집 화면 추가 (FTP)
- product-swiper.js는 상품이 아니라 카페24 "디자인 보관함" 스킨 파일이라
  Admin API(OAuth)로는 접근 불가 — 실물 확인(스크린샷) 결과 디자인 보관함
  FTP 계정(호스트/포트/ID/PW, OAuth와 별개)으로만 읽기/쓰기 가능.
  app/integrations/cafe24/design_ftp.py 를 표준 ftplib 로 새로 추가.
- 상단 탭에 "모바일 스와이프" 버튼 추가. 편집 화면(swiper.html)은 상세페이지
  편집기(_editor.html)와 완전히 같은 문법강조·색상·단축키 JS를 그대로 옮겨
  씀(요청사항) — 상품 전용 UI(목록·진열/판매·예약)는 제외.
- 적용 순서도 상세페이지와 동일한 원칙: FTP에서 현재값 재조회 → BACKUP →
  지문 대조(충돌 거부) → FTP 쓰기 → MANUAL 버전 + 감사로그(apply_swiper).
  textarea의 CRLF는 적용 전 LF로 정규화(안 하면 매번 "변경됨"으로 오판).
- 버전 이력은 cafe24_product_revisions(product_no NOT NULL)에 넣을 수 없어
  새 테이블 cafe24_swiper_revisions 추가(scripts/sql/cafe24_db_003_*.sql,
  서버에서 별도 실행 필요).
- 신규 env: CAFE24_FTP_HOST(미설정 시 {mall_id}.ftp.cafe24.com)/PORT/USER/
  PASSWORD, CAFE24_SWIPER_FTP_PATH. .env.example·문서 갱신.
- 유닛테스트 4건 추가(FTP config 기본값, 가짜 FTP로 읽기/쓰기 왕복·오류 처리).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-15 14:33:35 +09:00
king 20f3f0f7df fix(cafe24): 모바일 상세설명 '직접등록' 오적용·적용직후 읽기지연 수정
- PUT 시 mobile_description 필드를 더 이상 보내지 않는다. 그 필드를 보내는
  순간 카페24가 모바일 상세설명 설정을 "직접 등록"으로 바꿔버림을 실물로
  확인(separated_mobile_description 이 'T'가 됨). 대신
  separated_mobile_description="F" 만 지정해 "PC 상세설명과 동일"을 강제하고,
  카페24가 모바일 값을 PC 와 자동으로 맞추게 한다. 화면 적용(apply)과 예약
  적용(worker) 양쪽 다 수정.
- products.wait_for_description 추가 — 적용 직후 카페24 관리자 API 의 짧은
  읽기 지연(쓰기 직후 몇 초간 이전 값을 돌려줌 — 쇼핑몰 화면에는 바로 반영됨)을
  0.8초 간격 최대 3회 재확인으로 흡수. "쇼핑몰엔 반영됐는데 카페24 상품관리
  화면만 적용 안 된 것처럼 보이는" 증상 완화.
- CAFE24_SHOP_URL 예시를 www.miras.co.kr 로 갱신(.env.example) — 실제 값은
  운영 서버 .env 에서 직접 설정해야 함(코드는 그대로 이 값을 읽어 다이렉트
  주소를 만듦).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-15 13:49:05 +09:00
king d6424c2272 fix(project): 댓글 팝업 닫기(X) 버튼 제거
배경 클릭으로 닫는 방식만 유지.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-15 13:34:19 +09:00
king fee2765905 fix(project): 아이콘버튼 호버 중앙정렬·댓글팝업 본인댓글 삭제 지원
- .pj-icon-btn 기본 스타일에 flex 중앙정렬 추가(닫기 버튼 등 호버 음영이
  아이콘 기준 중앙에 오지 않던 문제, 버튼 UA 기본 패딩이 원인)
- 댓글 팝업(카톡형)에서 본인이 작성한 댓글에만 삭제 버튼 노출
  (서버는 이미 본인/관리자만 삭제 허용하도록 검증 중)

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-15 13:28:02 +09:00
king b3c98995c9 feat(project): 댓글 팝업 고정크기 500x850·업무제목 앞 상태아이콘→댓글아이콘 정리
- 댓글 팝업 제목을 업무 제목으로 표시, 우상단 닫기(X) 버튼 추가
- 팝업 크기 500x850 고정, 내용 많으면 목록만 스크롤(팝업 크기 유지)
- 카드/내 업무 목록의 완료여부 원형 아이콘 제거, 그 자리를 댓글 아이콘 전용 슬롯으로 교체
- 댓글 유무와 무관하게 슬롯 폭을 고정해 업무 제목이 항상 같은 위치에서 시작(세로 정렬)

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-15 13:22:50 +09:00
king f54344c3ef feat(project): 홈 화면 업무추가·멤버표시·댓글팝업·실시간 새로고침 추가
- 카드 이름 옆 호버 노출 업무 추가 버튼(기존 업무편집 팝업을 생성 모드로 재사용)
- 카드 이름 아래 배정 멤버 아이콘+이름 표시, 새 프로젝트 모달에서 멤버 다중 선택
- 업무별 댓글 말풍선+개수 표시, 더블클릭 시 카톡형 댓글 전용 팝업
- 확인 안 한 새 댓글은 말풍선이 커지며 반짝임(localStorage 로 확인 여부 추적)
- GET /project/api/live-version 폴링으로 다른 사용자의 변경사항을 자동 새로고침
- 날짜 표기를 yy/mm/dd(요일)에서 mm/dd(요일)로 변경

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-15 13:03:02 +09:00
king 1aad9844dd feat(project): 업무 클릭 시 페이지 이동 없이 그 자리에서 팝업 편집
- 좌측 트리(프로젝트 상세 페이지): 이미 로드된 업무 데이터로 즉시 팝업 —
  더 이상 페이지를 새로고침하며 달력 탭으로 넘어가지 않음
- 홈 화면 카드/내 업무 리스트: 홈에도 업무편집 모달을 추가해 페이지 이동 없이
  팝업으로 편집(담당자·단계는 해당 프로젝트를 API 로 조회해 채움, 첨부·댓글 포함)
- 교차 프로젝트 업무 편집 시 담당자 select 가 현재 프로젝트 멤버만 보이던 문제 수정
  (해당 업무의 프로젝트 멤버를 다시 조회)
- 완료 프로젝트 숨기기 토글을 인라인 style.display 로 직접 제어하도록 변경
  ([hidden] 속성 + 클래스 규칙 조합이 기대대로 안 먹히는 경우 대비, 원인 불문 확실히 동작)

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-15 09:16:39 +09:00
king ef05f9d362 fix(project): 완료 프로젝트 숨기기 버튼 동작 안 하던 CSS 특이도 문제 수정
- .pj-project-grid[hidden] 규칙 추가 — display:grid 규칙과 특이도가 같아
  [hidden] 속성이 무시되던 버그
- 홈 카드 업무 미리보기에 단계(stage_name) 칩 표시
- 홈 화면 날짜 표기를 yy/mm/dd(요일) 형식으로 통일(프로젝트 마감·업무 마감·내 업무 기간)

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-15 09:02:31 +09:00
king a09ceee7a5 feat(project): 홈 화면 진행중/완료 프로젝트 구분, 완료 업무 취소선 유지
- 프로젝트 카드를 "진행중"/"완료" 두 섹션으로 분리(완료는 접기/펼치기)
- 완료된 업무도 미리보기 목록에서 숨기지 않고 취소선으로 계속 표시
- 사이드바 빠른 프로젝트 생성(+)에도 마감일 입력 추가 (홈 새 프로젝트 모달은 기존에 지원)
- 카드 편집/삭제 버튼이 완료 섹션 카드도 인식하도록 수정

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-15 08:55:50 +09:00
king 78683a9ae4 feat(project): 홈 화면 프로젝트 카드에 업무 미리보기·진행률 표시
카드마다 완료/전체 진행률 바와 미완료 업무 목록(담당자·마감일, 최대 8건)을
붙여 프로젝트 전체 현황을 홈에서 한눈에 볼 수 있게 함.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-15 08:42:28 +09:00
king 32cc8299e3 feat(malaysia): 일자별 엑셀을 상품(행) x 날짜(열) 양식으로
요청 양식에 맞춰 전치. A=상품명, B=자체상품코드, C~ 는 'MM월 DD일'.
기간 내 모든 날짜를 열로 유지(빈 날 포함), 등록된 낱개 아이템은 이동이
없어도 행으로 표시. 수량 0 은 빈칸. 헤더 갈색 배경 + 흰 굵은글씨,
C2 틀고정, 데이터 영역 얇은 테두리.

기간 생략 시 이력 최소~최대 날짜를 사용하고 2년 초과는 400 으로 막는다.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-09 23:38:59 +09:00
king bc6e2a3417 feat(malaysia): 이동 이력 일자별 낱개 수량 엑셀 다운로드
기간 전체를 일자 x 낱개 아이템 피벗으로 내려받는 /movements/export-daily 추가.
콤보(세트) 출고는 등록 시 이미 BOM 으로 분해돼 구성 낱개 OUT movement 로
저장되므로 별도 분해 없이 낱개 기준 합계에 포함된다.

- db.movement_totals_by_date(): 기간/종류별 일자 x 아이템 합계
- 시트 '일자별'(행=날짜, 열=아이템, 합계 행/열) + '상세'(긴 형식, 자동필터)
- 이동 이력 카드에 종류/기간 선택 + 다운로드 버튼

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-09 23:33:23 +09:00
king af87f317ab fix(cupang): 자동 등록된 센터가 이름 대신 id 로 보이던 문제
센터 이름은 페이지를 열 때 받은 목록(cpg-centers)에서 찾는데,
업로드 도중 자동 등록된 센터는 그 목록에 없어 centerName() 이
id 숫자를 그대로 반환했다. 업로드 응답의 센터를 목록에 합친다.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-07 18:28:18 +09:00
king 4fce96b438 feat(cupang): 발주 업로드 시 미등록 입고센터 자동 등록
발주서에 있는 센터가 cupang_centers 에 없으면 자동 배분에서 제외됐다.
이제 발주서에 적힌 이름 그대로 센터를 등록(sort_order 는 기존 최대값 다음)
하고 계산에 포함한다. 경고문도 "등록되지 않은 센터" 대신
"새 입고센터 자동 등록" 으로 바꿨다.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-07 18:21:39 +09:00
king 0b79629207 style(cupang): 매출 표 줄무늬 색을 #caedfb 로
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-02 16:41:36 +09:00
king 35f849ba0c feat(cupang): 매출 표에 그룹 줄무늬 — 입고센터(센터 검색 시 출고일) 기준
연속된 같은 그룹은 같은 배경, 그룹이 바뀌면 배경을 번갈아 칠한다.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-02 16:34:11 +09:00
king 2128d622b8 fix(cupang): 순번 없는 매출 행이 누락되던 문제 — 시트 데이터 22건 추가
- 시트 마지막 부분(2026-09 등)에 순번(B열)이 비어 있는 발주 라인이 있어
  파서가 건너뛰었다. 판정 기준을 "발주번호가 숫자 + SKU/품목 존재"로 변경
- seed 재생성: 2,218 → 2,240행. 2026년 9월계(1,447개 / 11,035,564원)가
  시트와 정확히 일치

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-02 16:31:07 +09:00
king 49228dc1ff style(cupang): 매출 표 머리글 굵게
.erp-table thead th (font-weight:500, 회색) 에 눌리지 않게 특이도를 올려
font-weight 800 + 검정으로 지정

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-02 16:22:41 +09:00
king f781204094 fix(cupang): 매출 조회 조건이 세로로 쌓이던 문제, 주차 없음 안내
- .cpg > form { flex-direction: column } 에 눌려 세로 배치되던 것을
  form.cpg-sales-filter 로 가로(row) 고정, 높이도 내용만큼만
- 고른 주차에 자료가 없으면 "<주차> 주차에 등록된 매출 자료가 없습니다" 표시
- 주차 목록은 최근 주차(출고일 최댓값 기준)부터

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-02 16:18:37 +09:00
king 9ae27bce8a style(cupang): 매출 조회 조건 1행 고정 + 주차 필터, 상단 합계 KPI 제거
- 조회 조건은 flex-wrap: nowrap 로 한 줄 유지(좁은 화면은 가로 스크롤)
- 주차(week_label) 필터 추가 — 최근 주차부터 목록
- 공급가/원가/물류비/마진/순마진 합계 카드 삭제, 표 영역 높이 확대

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-02 16:13:49 +09:00
king 0979a89ed9 feat(cupang): 쿠팡 로켓 매출 화면 + cupang_sales 테이블
- scripts/sql/cupang_db_006_sales.sql: cupang_sales(발주 라인) / cupang_sales_weekly(광고비·할인·장려금) 생성
- scripts/sql/cupang_sales_seed.sql: 구글 시트 초기 데이터 2,218행 + 주차비용 100건
  (공급가 합계가 시트 2024/2025 총계와 일치)
- /cupang/sales: 기간·센터·발주유형·검색 조회, 합계 KPI(공급가/원가/물류비/마진/순마진),
  행 추가·수정·삭제, 시트(xlsx·csv) 업로드 일괄 등록, 조회 조건 그대로 엑셀 다운로드
- 달력 상단에 "쿠팡 로켓 매출" 버튼 추가
- sales_import.py: 병합 머리글 3행 건너뛰고 라인/주차 소계 분리, 월계·총계는 저장하지 않음

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-02 16:03:08 +09:00
king 15de38cb74 style(cupang): 달력 다듬기 — 이전/다음 달 더 흐리게, 연도를 월 위로, 오늘 버튼 굵게
- 다른 달 칸 opacity .5 → .28
- 달 머리글 세로 배치: 연도(작게, 위) + 월(크게, 아래)
- "오늘" 버튼 글자 굵게 + 테두리 2px 검정

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-02 14:48:51 +09:00
king d128744346 style(cupang): 달력 하단 범례와 구분선 제거
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-02 14:43:33 +09:00
king 76ba2eb8bf fix(cupang): 달력 칸이 겹치던 문제 — 칸에 box-sizing: border-box
전역 border-box 가 없어 height:100% + padding/border 가 고정 행 높이를 넘어
아래 주와 겹쳤다.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-02 14:40:59 +09:00
king bf8f36bc40 fix(cupang): 달마다 다르던 달력 칸 크기 통일
주 수(5주/6주)에 따라 1fr 로 나뉘던 행 높이를 고정값(--mcal-row)으로 바꿔
두 달의 칸 크기와 세로 간격을 동일하게 맞춘다. 화면 높이에 따라 84/72/62px.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-02 14:38:02 +09:00
king ba2478d461 style(cupang): 달 이동 화살표를 짧고 굵은 SVG 로 교체
글꼴 글리프는 두께 조절이 안 돼 stroke-width 5.5 SVG 로 대체

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-02 14:34:33 +09:00
king e259e7d370 style(cupang): 달력 헤더 재구성 — 큰 화살표·가운데 제목, 오늘 버튼 중앙 이동
- 상단 바: ← 제목 → 을 가운데 정렬, 화살표는 테두리 없는 큰 글리프
- "오늘" 버튼을 두 달 사이 상단 중앙으로 이동
- 달 머리글 가운데 정렬, 출고 건수 배지는 오른쪽에 겹쳐 배치

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-02 14:29:37 +09:00
king 9cba09d646 feat(cupang): 공휴일 데이터 2030년까지 확장 (설날·추석·대체공휴일 포함)
- 2028~2030 음력 공휴일: 설날/부처님오신날/추석 연휴
- 대체공휴일: 2028-10-05(추석·개천절 겹침), 2029-05-07(어린이날 토),
  2029-05-21(부처님오신날 일), 2029-09-24(추석 연휴 일),
  2030-02-05(설날 연휴 일), 2030-05-06(어린이날 일)

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-02 03:06:41 +09:00
king df46784474 fix(cupang): 성탄절 대체공휴일 반영 (2027-12-27)
대체공휴일 대상 목록을 주석으로 명시 — 삼일절·어린이날·광복절·개천절·한글날·
설날·추석·부처님오신날·성탄절 (신정·현충일·제헌절은 제외)

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-02 03:03:03 +09:00
king 0762fb9b44 docs(cupang): 제헌절은 대체공휴일 대상 아님을 주석으로 명시
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-02 03:00:25 +09:00
king cd8f54d187 feat(cupang): 제헌절(7/17) 공휴일 추가
2026년부터 공휴일로 재지정 — 고정 양력 공휴일 목록에 추가

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-02 02:55:51 +09:00
king b302ec0951 feat(cupang): 달력 칸에 공휴일 이름 표시(대체공휴일 포함)
- holidays.py 를 이름까지 담도록 확장(holiday_name), is_holiday 는 이름 유무로 판정
- 대체공휴일은 원래 명칭 대신 "대체공휴일"로 표기, 겹치는 날은 "어린이날·부처님오신날"
- 달력 칸에 날짜 아래 빨강 소형 라벨 + title 툴팁, 칸 최소 높이 62→70px

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-02 02:52:59 +09:00
king 15f181318b feat(cupang): 채움률 낮은 혼합 상자 경고, 직접 입력 제거하고 출고일 목록으로 대체
- 혼합 상자 채움률 60% 이하면 "상자 변경 필요"(오렌지) 도장 + 업로드/날짜 전환 시 안내 팝업
- ① 직접 입력 표와 계산/제품 추가/초기화 버튼·이벤트 제거. 품목은 업로드(또는 임시 저장 불러오기)로만
- 상단 출고일 탭 바를 없애고 ① 카드 안 세로 목록으로 이동 (날짜·센터수·상자수·수량)
- 임시 저장에 ship_date 를 함께 담아 불러올 때 출고일 유지

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-02 01:55:51 +09:00
king 7d9f7fa364 feat(cupang): 분배 확정 즉시 실행 + 저장 중 스피너
- 출고일자 선택 대화상자 제거. 확정 시 활성 출고일(업로드 F13−1일, 없으면 오늘)로 바로 저장
- 저장 중 스피너 모달 표시 → 응답 오면 닫고 달력으로 이동(여러 날짜면 다음 날짜로 이어감)
- 실패 시 모달 닫고 사유를 상단 메시지로 표시, 버튼 재활성화

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-01 20:39:25 +09:00
king 1a2291f510 refactor(cupang): 입고센터 관리 화면 제거
- /cupang/centers GET/POST, 수정·삭제 라우트와 centers.html 삭제
- 달력 상단 "입고센터 관리" 버튼 제거, 상자 계산의 안내 문구 정리
- 센터 관리 화면 전용 CSS 제거(공용 .cpg-icon-btn/.cpg-btn-sm 은 유지)
- 센터 데이터(cupang_centers)와 db 계층은 그대로 — 출고 확정·발주 업로드에서 계속 사용

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-01 20:34:41 +09:00
king 46ce6d78b8 style(cupang): 상자 목록 머리글 굵게·가운데 정렬, 열 너비 확대
머리글 글자가 잘리지 않도록 상자번호 82px / 제품코드 100px / 수량 62px

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-01 20:26:06 +09:00
king cd8a594e05 style(cupang): 상자 목록 엑셀 버튼 글자 흰색 고정, 오버 시 굵게
.erp-body a { color: inherit } 에 밀려 글자가 검게 나오던 문제 — a+클래스 선택자로 흰색 지정

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-01 20:24:48 +09:00
king 9f0a3f7f73 style(cupang): 상자 목록 엑셀 버튼 초록, 머리글 안 줄임, 행 클릭 체크 토글
- 엑셀 다운로드 버튼 배경 #217346
- 표 머리글은 말줄임 없이 전체 표시(상자번호 열 74px)
- 행 클릭 시 상자 단위로 체크 색 토글 + 체크 개수 표시(세는 용도)

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-01 20:11:43 +09:00
king 3926b6a431 feat(cupang): 상자 목록을 번호·제품명·제품코드·수량 표로, 엑셀 다운로드 추가
- ② 상자 목록: 카드 대신 표. 한 상자에 여러 제품이면 상자번호 칸 rowspan 병합
- GET /cupang/{id}/boxes.xlsx — 같은 표를 xlsx 로 (export.build_box_list_workbook)
- box_list 항목에 product_code 포함

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-01 19:55:06 +09:00
king 15947e73ed feat(cupang): 달력 월 표기 확대, 출고 보기 ②를 상자 번호별 내용물 목록으로
- 달력 월 이름/연도 글자 크기 2배·굵게
- 출고 상세 ② 상자 요약 → ② 상자 목록: 전체 상자에 1번부터 번호를 붙이고
  상자마다 담긴 제품·수량을 표시. box_plan 스냅샷 우선, 없으면 계산 결과로 대체

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-01 19:49:42 +09:00
king e49abc4b8c fix(cupang): 3열에서 ③ 카드 자체를 스크롤러로
카드 높이는 grid 행(1fr)으로 화면에 맞춰져 있으므로 카드에 overflow-y:auto
를 걸면 안쪽 구조와 무관하게 스크롤된다. 목록은 자연 높이로 두고 헤더는
sticky. JS 높이 계산 대상에서 ③ 제외(①② 만 유지).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-01 17:50:06 +09:00
king 2608fd7f23 fix(cupang): 좁은 화면에서는 카드가 늘고 페이지가 스크롤되게 분기
진단 결과 1열로 접힌 상태에서 .cpg-calc3 가 704px 를 세 카드가 나눠
가져(224px씩) 내용이 잘렸고, JS 가 준 높이(561px)는 카드보다 커서
무용지물이었다.

- 1501px 이상: 카드 안쪽만 스크롤. 높이는 "카드 아래끝 − 영역 top" 으로 계산
- 1500px 이하: 카드/영역 높이 제한 해제, .cpg 를 flex:0 0 auto 로 두어
  내용만큼 늘고 페이지(.erp-page)가 스크롤

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-01 17:46:40 +09:00
king 71194de2eb fix(cupang): 스크롤 영역 높이를 rAF 후 JS 로 지정 + 진단 로그
CSS flex 체인만으로 잡히지 않는 환경 대비. render() 이후 다음 프레임에
각 영역의 화면 위치를 재서 max-height 를 !important 로 지정한다.
window.CPG_DEBUG = true 후 window.cpgFit() 으로 계산값 확인 가능.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-01 17:41:36 +09:00
king ca87c254c0 fix(cupang): 3열 프레임 높이를 그리드 행(1fr)로 고정 — ③ 목록만 스크롤
원인: .cpg-calc3 의 행 높이가 auto 라 카드가 화면 아래로 넘치도록 늘어났고,
페이지 스크롤도 없어서 아래쪽(마지막 상자, [+ 새 혼합 상자])이 잘렸다.

- grid-template-rows: minmax(0,1fr) 로 행을 컨테이너 높이에 고정
- 카드 overflow:hidden, ①표/②목록/③센터목록만 내부 스크롤
- 그동안 덧댄 !important 패치와 JS 높이 강제 지정 제거(충돌 정리)
- 2열/1열로 접히면 행이 여러 개라 카드 max-height(76vh)로 처리

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-01 17:38:51 +09:00
king f1c16e8282 fix(cupang): ③ 만 내부 스크롤, 페이지 전체 스크롤은 없앰
앞선 커밋의 .cpg-page-grow(페이지가 늘어나는 방식)를 되돌리고,
③ 카드는 overflow:hidden + 목록만 스크롤로 복구.
JS 높이 계산 대상에 ③ 목록을 다시 포함(창높이-요소top, 260 이하면 60vh).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-01 17:36:16 +09:00