- lib/push.ts: web-push + VAPID(env 우선/하드코딩 폴백) + momo_push_subscriptions
자동 생성. sendPush() 는 만료(404/410) 구독 자동 정리.
- API: GET /api/m/push/vapid (공개키), POST /api/m/push/subscribe (구독 저장).
- sw.js: push / notificationclick 핸들러 추가 (클릭 시 /m/orders/new 열기).
- components/PushOptIn: 출고요청 페이지에 '새 품목 알림 받기' 버튼. 권한 허용 시
구독 저장, 이미 허용이면 조용히 갱신. iOS<16.4 등 미지원 환경은 자동 숨김.
- items/save: 품목이 '출고요청 불가 → 가능' 으로 전환되면(신규 등록 포함, KST 기준
판매기간/ACTIVE/비숨김) 구독자에게 푸시 발송. 단순 수정은 알림 안 함.
운영에서 VAPID 키 교체 원하면 .env.production 에 VAPID_* 설정(없으면 기본키 사용).
[공급자 정보 박스 (우측 상단)]
- 결제계좌번호 / 전화번호 / 이메일 표를 거래명세표 우측 상단에 표시
- 환경변수: MOMO_BANK_ACCOUNT / MOMO_PHONE / MOMO_EMAIL / MOMO_COMPANY_CEO 등
- detail API 응답에 supplier 객체 추가
[비고(remark) 컬럼]
- 모든 라인(품목/택배/용차)에 비고 입력 가능
- /api/m/orders/items/remark 신설 — REQUESTED 상태에서만 본인/관리자 수정
- 인풋에서 포커스 이탈/엔터 시 자동 저장
- 모든 라인에 momo_order_items.remark 컬럼 활용 (이미 존재)
[이미지 공유 + 인쇄]
- 거래명세표 위쪽에 [📤 이미지 공유] [🖨 인쇄] 버튼 신설
- html-to-image 라이브러리로 PNG 캡처 → Web Share API 가 있으면 카톡/메신저로 직접 공유,
없으면 PNG 파일 다운로드 (모바일/PC 호환)
- statementRef 로 캡처 영역 분리 (버튼은 영역 밖)
[엑셀 다운로드 수정]
- 기존: SELECT 쿼리에 alias 빠져 있어(`U.user_name, NULL, NULL`) 회사명/대표자/사업자번호가 모두 빈 값
- 수정: company_name/ceo_name/biz_no/phone/address/email 명시 alias
- 택배/용차 라인은 [택배]/[용차] 라벨로 출력
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>