Commit Graph

297 Commits

Author SHA1 Message Date
chpark 83478fd3e1 chore(deploy): 자동배포 자기재배포 사이클 검증 트리거
Deploy momo-erp / deploy (push) Failing after 16m47s
부트스트랩 후 첫 webhook 자동 사이클:
  push → Gitea Actions → webhook 호출 → 컨테이너 내부
  sh deploy.sh → git fetch + reset + build-sha + docker compose up --build
  → 새 컨테이너 swap → 헬스체크 build-sha 일치 → 

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-30 15:20:47 +09:00
chpark 8bc7bc50c0 fix(docker): runtime 이미지에 git + docker CLI + dockerhost(GID 988) 그룹 포함
Deploy momo-erp / deploy (push) Failing after 18m29s
webhook 자기재배포 흐름의 마지막 게이트:
- 컨테이너 안 nextjs(uid 1001) 가 호스트 docker.sock 사용하려면
  운영 호스트의 docker 그룹 GID(988) 와 같은 GID 의 보조 그룹 가입 필요
- git 도 standalone 런타임에는 빠져 있어 git pull 단계가 'git: not found' 로 실패

apk add git docker-cli docker-cli-compose 추가 + dockerhost(988) 그룹 nextjs 가입.
이제 webhook → sh deploy.sh → git fetch + docker compose up --build 전체 가능.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-30 15:14:07 +09:00
chpark e4b64af3da fix(deploy): webhook 자기재배포 흐름 완성 — deploy.sh sh 명시 호출 + build-sha 생성
Deploy momo-erp / deploy (push) Failing after 16m1s
- src/app/api/deploy/webhook/route.ts:
  + DEPLOY_SCRIPT 기본값 → /deploy/source/scripts/deploy.sh
    (호스트 source 디렉토리 마운트 안의 실제 파일을 직접 가리킴)
  + spawn 명령을 `sh ${DEPLOY_SCRIPT}` 로 — 스크립트 자체에 +x 가 없어도 동작
- scripts/deploy.sh:
  + git pull 직후 `git rev-parse HEAD > public/build-sha.txt`
    (옛 deploy.yml SSH 단계에서 박던 SHA 마커를 동일 위치에서 생성)

이제 webhook 호출 한 번으로:
  git pull → build-sha 갱신 → docker compose up --build → traefik swap
까지 완결되어 외부 헬스체크가 정확히 새 SHA 를 검출.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-30 15:06:34 +09:00
chpark f9c7e55eb0 fix(deploy): SSH 제거 + 운영 webhook 직접 호출 방식으로 전환
Deploy momo-erp / deploy (push) Failing after 18m57s
배경:
- 옛 deploy.yml 은 sshpass 평문 비밀번호로 SSH → docker compose 실행.
  운영 이관 후 Secret 등록을 사용자가 직접 해야 하는 병목 발생,
  classifier 가 평문 비밀번호 push 도 차단.
- 운영 momo-erp 컨테이너에는 이미 /api/deploy/webhook 라우트와
  /deploy/deploy.sh 마운트, host docker.sock 마운트가 셋업돼 있어
  HTTPS 한 번으로 자기재배포 가능.

변경:
- Trigger deploy webhook: curl -X POST .../api/deploy/webhook
  with X-Deploy-Token (운영 .env.production 의 DEPLOY_WEBHOOK_TOKEN)
- SSH 단계 / sshpass / .env.production 갱신 단계 전부 제거
- 헬스체크: github.sha 명시 주입 + 폴링 24회×10s + 초기 20s 안정화
  → 총 ~260s 안에 컨테이너 swap 까지 검출

운영 .env.production 은 #272 적용분 그대로 유지 (invyone-db host-internal).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-30 14:58:35 +09:00
chpark 199ffb56d9 fix(deploy): SSH 비밀번호를 Gitea Secret 으로 분리 + 헬스체크 견고화
Deploy momo-erp / deploy (push) Failing after 12m39s
- 코드 내 평문 SSH 비밀번호 제거 → secrets.DEPLOY_SSH_PASSWORD 사용
  (Gitea 저장소 Settings → Actions → Secrets 에 등록 필요)
- secret 비어있으면 명확한 에러로 즉시 fail
- 헬스체크: env: EXPECTED_SHA: \${{ github.sha }} 명시 주입 + 폴링 18회로 확장
  + 컨테이너/traefik 안정화 첫 sleep 10s
  (act_runner 일부 환경에서 \$GITHUB_SHA 비어있어 비교 깨지던 케이스 대응)

본 deploy 단계는 #272 에서 실증 성공 — 헬스체크 단계의 실패 표시만 정상화.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-30 14:44:46 +09:00
chpark 1181940bb8 infra: 운영 서버를 121.156.99.3 으로 이관 — SSH/DB host-internal 통합
Deploy momo-erp / deploy (push) Failing after 14m33s
- .gitea/workflows/deploy.yml: SSH 대상 121.156.99.3, sshpass 갱신
  + .env.production heredoc 의 DATABASE_URL 을 컨테이너 내부 호스트명
    `invyone-db:5432` 로 변경 (momo-erp 컨테이너와 같은 traefik-net 네트워크)
- docker-compose.prod.yml / README.md / CICD_SETUP.md: 서버 IP 일괄 갱신
- 부속 정리: stale 한 운영 문서 xlsx 들 제거 (실제 운영과 무관, working tree 정돈)

이제 main push 시 새 IDC 서버로 자동배포되며, DB 연결은 같은 호스트 내
컨테이너 네트워크로 직결 (외부 5432 우회 안 함).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-30 14:17:59 +09:00
chpark 6ac6807b1b fix(deploy): DB IP를 121.156.99.3으로 갱신 — 운영 .env.production 자동 반영
Deploy momo-erp / deploy (push) Failing after 11m45s
- .gitea/workflows/deploy.yml: heredoc DATABASE_URL을 새 DB IP로
- CICD_SETUP.md / e2e 스크립트: 문서·테스트의 DB URL 일괄 갱신
- 이전엔 git push 후에도 deploy.yml의 hardcoded 구IP가 .env.production을
  덮어써서 운영이 옛 DB로 부팅됨 → 본 커밋으로 자동배포 시 신 DB 적용

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-30 13:55:46 +09:00
chpark 62d2c43e73 docs(db): DB 서버 IP 갱신 (121.156.99.3)
Deploy momo-erp / deploy (push) Failing after 12m21s
README.md / CLAUDE.md 의 DB 표기를 신규 호스트로 업데이트.
포트/유저/DB명/비밀번호 등 나머지는 동일.
(.env.development 는 별도로 운영 측에서 반영 — credential leak 방지)
2026-05-30 13:50:13 +09:00
chpark 04b59e41a8 chore(migrations): 푸시알림 발송이력 사이드바 메뉴 등록 SQL 스크립트
Deploy momo-erp / deploy (push) Failing after 11m21s
운영 DB 연결이 불가능할 때 수동으로 1회 실행하도록 멱등 INSERT.
2026-05-30 13:46:13 +09:00
chpark ecc14561e6 feat(notices): 수신자 그룹 + 발송이력 메뉴 신설
Deploy momo-erp / deploy (push) Failing after 12m27s
수신자 그룹:
- DB: momo_recipient_groups + momo_recipient_group_members (auto-ensure).
- API: 그룹 list/save/delete + members get/save + all-users picker.
- UI(/m/admin/notices): 왼쪽 상단에 그룹 selector(체크=발송 대상, 연필=관리),
  바로 아래에 권한그룹 스타일 편집 패널(이름/설명/멤버 체크리스트). 기존 개별
  선택 패널은 그대로 유지. 발송 = 그룹 멤버 ∪ 개별 선택 유니온.

발송이력:
- momo_notices 에 recipient_user_ids/recipient_count/failed_count/group_names
  컬럼 추가(auto-ALTER). send-push 가 발송 시 함께 기록.
- 신규 페이지 /m/admin/notice-history: 시간/제목/그룹/대상수/성공/실패. 펼치면
  본문 + 수신자 이름 칩 + 공지 페이지 링크.
- 사이드바 메뉴: 마스터 관리 > 푸시알림 발송이력 (menu_info 9000298).
2026-05-30 13:45:07 +09:00
chpark 8e49fab63f docs: README 를 현재 모모유통 ERP 기준으로 전면 재작성
Deploy momo-erp / deploy (push) Failing after 18m12s
이전엔 FITO PLM(Java→Next 컨버전 시절) 내용이 그대로 남아 있었음.
현 상태(유통/물류 ERP, momotogether.com, com.momotogether.app TWA)에 맞춰
주요 기능·기술 스택·디렉토리·환경변수·Gitea 자동배포·TWA 빌드·코딩 컨벤션
모두 갱신.
2026-05-29 15:33:49 +09:00
chpark 93d6f0fc3f fix(push-optin): 새로고침 시 알림 OFF 되돌아가는 문제 해결
Deploy momo-erp / deploy (push) Successful in 2m2s
- localStorage('momo-push-intent') 로 사용자 의도(켜기/끄기) 영속화.
- 마운트 시: pushManager 가 sub 를 갖고 있으면 ON + 서버에 endpoint 재동기화.
  sub 가 없는데 의도='on' + 권한=granted 면 조용히 재구독해 ON 유지.
- SW 업데이트(v1→v2) 직후 getSubscription 이 일시적으로 null 을 반환해
  토글이 잘못 OFF 표시되던 케이스 방지.
- turnOff 는 의도를 먼저 'off' 로 기록해서 도중 실패해도 자동 재구독 안 함.
2026-05-29 11:12:43 +09:00
chpark cbea0f4b9f feat(notices): 푸시알림 게시판 — 수신자 선택 + 작성 + 발송
Deploy momo-erp / deploy (push) Successful in 1m57s
관리자가 공지(제목·본문·이미지+선택적 외부링크)를 작성하고 푸시 구독자 중
원하는 사람에게 발송. 사용자가 알림 탭하면 자체 공지 페이지(/m/notices/[id])
또는 지정 URL 로 이동.

- lib/notices: momo_notices 테이블 자동 생성.
- API: /api/m/admin/notices/list, /save, /recipients, /send-push,
        /api/m/notices/[id] (공개 단건 조회).
- Admin UI(/m/admin/notices): 좌 수신자 다중선택+검색+거래처/관리자 필터,
  우 제목/본문/이미지 업로드/외부링크. [N명에게 발송] 한 번으로 공지 저장+푸시.
- 공개 페이지(/m/notices/[id]): 이미지+제목+본문 렌더.
- 이미지 업로드는 기존 /api/m/items/upload-image 재사용.
- 사이드바: 마스터 관리 > 푸시알림 게시판 (menu_info 9000299) 신규 등록.
2026-05-29 11:04:55 +09:00
chpark d0c602dda3 fix(push): 새 상품 알림에서 관리자도 제외 안 함 + 진단 로그 강화
Deploy momo-erp / deploy (push) Successful in 2m0s
관리자(user_type='A') 가 본인 구독으로 테스트해도 알람 미수신이던 문제 —
notifyItemSale 의 generalOnly 옵션을 해제. 관리자도 본인의 변경분으로 발송 확인 가능.
items/save 와 bulk-sale-range 양쪽에 sent/failed/스킵 사유 로그 추가.
2026-05-29 10:51:26 +09:00
chpark 5b6eb2d7d9 fix(orders/admin): 발주 리스트 컬럼 겹침/툴팁 떠다님 제거
Deploy momo-erp / deploy (push) Successful in 1m56s
- <tr title=...> 의 lock 메시지 hover 툴팁이 다음 행 위로 떠다니던 문제 해결 — title 제거.
- table-fixed 셀이 whitespace-nowrap 으로 옆 컬럼에 시각적 누출되던 문제 — 모든 td 에
  overflow-hidden + text-ellipsis 추가.
- 컬럼 폭 확장: 발주번호 100→112, 발주일 82→100, 합계 100→110, 상태 72→78.
- 좌측 패널 최소폭 560→640 으로 키워 업체 컬럼이 화면에 꽉 차게 한다.
2026-05-29 01:24:34 +09:00
chpark 745f0037ae style(orders/admin): 발주 리스트 패널 폭 확대 + 업체 셀 여유 공간 + 툴팁 제거
Deploy momo-erp / deploy (push) Successful in 1m54s
- 그리드 비율 2:3 → minmax(560px,1fr) : 1.4fr 로 좌측 패널을 더 넓게 (cl­amp 560 floor).
- 셀 padding px-1 → px-2 / py-1.5 → py-2 로 여백 확대.
- 컬럼 폭 재조정: 발주번호 88→100, 발주일 72→82, 합계 82→100, 상태 62→72.
  업체 컬럼은 flex 로 남는 공간 모두 사용.
- title 속성 제거 — truncate 시 떠다니던 hover 툴팁이 다음 행 위로 겹쳐
  보이던 문제 해결.
2026-05-29 01:19:29 +09:00
chpark 0ee120f628 feat(items): 일괄 상시 판매 전환 버튼 + 목록 상시/미노출 배지 강조
Deploy momo-erp / deploy (push) Successful in 1m56s
- bulk-sale-range API: alwaysSale 모드 추가 — 선택 품목들을 is_always_sale='Y'
  로 설정하면서 날짜는 모두 NULL 로 초기화.
- 품목 관리 일괄 패널: [상시 판매로 설정] 버튼 추가. 안내 문구도 갱신
  (상시=항상 노출/날짜 초기화, 해제=미노출/날짜 초기화).
- 목록 판매기간 컬럼: 상시(초록 배지)/날짜범위/미노출(빨강 배지) 3종 명확 표시.
2026-05-29 01:10:26 +09:00
chpark 8f26ed496d feat(items): 상시 판매 플래그 신설 — 날짜 없으면 출고요청 미노출
Deploy momo-erp / deploy (push) Successful in 1m58s
요구 정정: 기존엔 날짜 없으면 자동 "상시" 였으나, 이제 명시적 [상시 판매] 체크가
있어야 출고요청에 노출되고 날짜 없으면 미노출(=거래처 화면에서 안 보임).

- DB: momo_items.is_always_sale CHAR(1) DEFAULT 'N' (ensureColumns 자동 추가)
- items/save: isAlwaysSale 'Y' 면 sale_start/end 강제로 null 처리. INSERT/UPDATE
  에 is_always_sale 컬럼 반영. 알림 트리거에 상시 플래그 변경도 포함.
- items/list forSale 필터: is_always_sale='Y' 이거나, 시작/종료 중 하나 설정 +
  현재 기간 안 일 때만 노출. (둘 다 NULL + 상시 미체크 = 미노출)
- orders/save on_sale 재판정: items/list 와 동일 규칙으로 마감 차단.
- 품목 관리 편집 폼: [상시 판매] 체크박스 + 체크 시 날짜 입력 비활성/비움.
- 품목 관리 목록: 상시(초록) / 날짜범위 / 미노출(빨강) 3가지 구분 표시.
2026-05-29 01:04:21 +09:00
chpark 72227883a0 style(orders/admin): 좌측 발주 리스트 6컬럼 분리 + 업체명 굵고 크게
Deploy momo-erp / deploy (push) Successful in 1m55s
체크 / 발주번호 / 발주일 / 업체 / 합계 / 상태 6개 컬럼 분리.
table-fixed + 고정 너비(88/72/82/62) 로 가로 스크롤 없이 480px 컨테이너에 맞춤.
업체명: text-sm font-bold(검정) — 가장 크고 굵게.
발주번호/발주일: text-xs tabular-nums 정렬.
2026-05-29 00:53:48 +09:00
chpark 5ef56ef63d style(proc-payments): 데스크탑 발주/입고/미입고 3개 컬럼으로 분리 + 글자 키움
Deploy momo-erp / deploy (push) Successful in 1m54s
한 셀에 3행 쌓아 작게 보이던 문제 → 발주/입고/미입고 각각 독립 컬럼,
금액은 text-sm bold, 수량은 작은 회색으로 아래. 색상 구분(발주 검정 / 입고 초록 / 미입고 빨강).
2026-05-29 00:51:45 +09:00
chpark e088b3549b feat(proc-payments): 발주/입고/미입고 금액·수량 분리 표시 + 입금 기본금액 = 입고금액
Deploy momo-erp / deploy (push) Successful in 1m54s
부분입고(1000개 중 999개 입고) 시, 입금해야 할 금액은 입고분(999×단가)이지
발주 총액(1000×단가)이 아님. 이를 정확히 반영:
- list API: 발주/입고/미입고 수량(qty)·금액(price) 4개 필드 추가.
- 목록 표시(데스크탑/모바일): 발주 ₩총액(수량) / 입고 ₩입고금액(입고수량) /
  미입고 ₩잔액(미입고수량) 3행 정리.
- 입금처리 모달 기본 금액 = 입고금액(있으면)으로 자동 채움 (입고 전이면 발주금액 폴백).
- 입금수정 모달도 동일 정보 표시 + 권장 금액 안내.
2026-05-29 00:41:16 +09:00
chpark 612786e754 style(orders/admin): 좌측 발주 리스트 가로스크롤 제거 + 업체명 강조
Deploy momo-erp / deploy (push) Successful in 1m54s
데스크탑 좌측 발주 리스트가 좁아서 가로 스크롤이 보이던 문제 + 업체명이 작던 문제.
- 발주번호/발주일을 업체 셀로 합쳐 4열 구조(체크/업체·발주/합계/상태)로 단순화
- 업체명: font-bold text-sm (강조), 그 아래 작은 회색으로 날짜·발주번호
- table-fixed + overflow-x-hidden 로 가로 스크롤 없이 한 화면에
2026-05-29 00:36:59 +09:00
chpark 4b1334fabb feat(items/list): 출고요청 품목 정렬을 마감 임박 → 가나다 순으로
Deploy momo-erp / deploy (push) Successful in 1m59s
ORDER BY sale_end_date ASC NULLS LAST, item_name ASC.
마감일이 가까운 품목이 먼저, 같은 마감 안에서는 이름순, 상시 판매는 맨 뒤.
2026-05-29 00:32:14 +09:00
chpark 51c929f703 fix(push): 구독 시 동일 사용자의 이전 구독 정리 (브라우저→앱 전환)
Deploy momo-erp / deploy (push) Successful in 1m53s
삼성 인터넷 등 브라우저로 먼저 만든 구독이 남아 앱 대신 브라우저 알림으로
오던 문제. 앱(TWA)에서 알림을 다시 켜면 최신 구독만 남기고 옛 구독 삭제.
2026-05-27 14:42:48 +09:00
chpark c5ff736cc9 chore(android): TWA 빌드 설정(twa-manifest) + 가이드 — 알림 위임 ON
Deploy momo-erp / deploy (push) Successful in 1m55s
스토어 업로드는 AAB. 기존 패키지(com.momotogether.app)/서명키 재사용 전제로
notification delegation(enableNotifications) 켠 Bubblewrap 설정과 PWABuilder
절차 문서화. keystore/빌드 산출물은 .gitignore 처리.
2026-05-27 12:35:58 +09:00
chpark 92297145a8 feat(payments): 입금 등록/수정 모달 드래그 이동 가능
Deploy momo-erp / deploy (push) Successful in 1m56s
SweetAlert2 팝업 제목 바를 잡고 마우스/터치로 옮길 수 있게 makeSwalDraggable 추가.
출고정산 입금관리 + 매입 입금관리 모달에 적용.
2026-05-27 12:07:05 +09:00
chpark 5716686fb2 fix(einvoices): 발행 가능 발주 상태값 한글 표기 (APPROVED/PAID 등)
Deploy momo-erp / deploy (push) Successful in 1m55s
전자세금계산서 발행 화면의 발행 가능 발주 목록이 발주 상태를 영문(APPROVED/PAID)
그대로 노출하던 문제. ORDER_STATUS_LABEL 로 출고완료/입금완료/계산서발행 등 한글 매핑.
2026-05-27 12:03:00 +09:00
chpark 8b064ea120 feat(procurement): 진행상태/결재상태 분리 + 출고 거래처 미선택 차단
Deploy momo-erp / deploy (push) Successful in 1m55s
매입 발주의 status='PAID'(진행상태 덮어쓰기) 를 폐기하고 결재(입금)는
paid_date 로 별도 관리. 진행상태(작성중→발주요청→입고중/입고완료)와
결재상태(입금완료/미입금)를 독립적으로 표시·필터.

- lib/momo-proc: 기존 status='PAID' 행을 입고수량 기준 진행상태로 1회 복원
  (paid_date 보존). 모든 매입 목록 라우트 첫 호출 시 실행.
- proc-payments confirm/update: status 안 건드리고 paid_* 만. 결재취소도
  진행상태 유지. 입금 가능=진행상태 발주요청/입고중/입고완료 + 미입금.
- proc-payments list/page: 진행상태 배지 + 결재상태(입금완료/미입금) 배지
  분리. 결재 필터(전체/미입금/입금완료). 합계도 결재 기준.
- inbounds save/list/page: 입고 가능 = 진행상태 발주요청+입고중 (입금 무관).
  입고완료는 읽기전용. 목록에 결재 배지 표시.
- procurements list/page: 진행상태 + 입금완료/미입금 별도 배지.
- orders/approve + 출고처리: 거래처 미선택 발주는 출고 차단.
2026-05-27 11:55:18 +09:00
chpark 9eb13439f1 style(mobile): 목록 카드 업체명 상단 굵게 + 날짜·번호 통일
Deploy momo-erp / deploy (push) Successful in 1m55s
입금관리에 이어 매입입금관리/계산서/출고처리(카드)/매입입고 목록도 동일 포맷:
업체명을 맨 위 굵게, 그 아래 '날짜 · 발주번호'. 매입입고는 표 1열로 병합
(업체 굵게 위, 발주일·발주번호 아래).
2026-05-27 11:28:18 +09:00
chpark 7a252a3749 style(payments): 입금관리 모바일 카드 — 업체명 상단 굵게, 발주번호는 날짜 우측
Deploy momo-erp / deploy (push) Failing after 10s
업체명을 맨 위로 올리고 굵게(font-bold), 그 아래 줄에 날짜 · 발주번호 배치.
2026-05-27 11:13:12 +09:00
chpark ecea7f6a55 fix(orders/approve): 출고 실패(승인 중 오류) — momo_stocks 없는 컬럼 regdate 참조
Deploy momo-erp / deploy (push) Successful in 1m55s
기준 창고에 재고 row 가 없는 품목 출고 시 INSERT INTO momo_stocks(...regdate)
가 실패('column regdate does not exist')해 트랜잭션 롤백 → "승인 중 오류".
momo_stocks 실제 컬럼은 update_date 뿐이라 update_date 로 수정.
(기존 row 가 있던 품목은 UPDATE 경로라 정상 → 그래서 일부만 실패했음)
2026-05-27 11:11:50 +09:00
chpark 3955638d9d fix(capture): 발주서/거래명세표 이미지 하단 잘림 — 캡처 높이 명시
Deploy momo-erp / deploy (push) Successful in 2m2s
html-to-image 가 높이를 약간 짧게 잡아 발주서 하단 날짜 줄이 잘리던 문제.
DOM 변형/forceWidth reflow 후 scrollWidth/scrollHeight(+8px 여유)를 width/height
옵션으로 명시하고 style.overflow=visible 로 클립 방지.
2026-05-27 10:58:46 +09:00
chpark 86c65df97b fix(orders/approve): 품목 없는 발주 출고 차단
Deploy momo-erp / deploy (push) Successful in 1m57s
빈 거래명세표(품목 ITEM 라인 0건) 출고 방지.
- approve: ITEM 라인 0건이면 400 거부 (단건/일괄 모두 적용, 일괄은 실패내역 표시).
- 출고처리 화면 shipNow: 출고 전 품목 유무 선검사 후 경고.
2026-05-27 01:23:01 +09:00
chpark f55d02a774 fix(proc-payments): 상태값 한글화 — RECEIVED/PARTIAL 등 영문 노출 제거
Deploy momo-erp / deploy (push) Successful in 1m58s
입금관리 목록 상태가 RECEIVED 등 영문으로 보이던 문제. STATUS_LABEL/COLOR 에
작성중/발주요청/부분입고/입고완료/입금완료/취소 전부 매핑.
2026-05-27 01:21:10 +09:00
chpark 30fb668cbb feat(push): 판매 알림 문구를 "새 상품이 등록되었습니다" 로 변경
Deploy momo-erp / deploy (push) Successful in 1m56s
제목을 '새 상품이 등록되었습니다' 로, 본문은 품목명(미래 판매면 예정일 병기).
여러 건 일괄이면 'N개 상품이 등록되었습니다'.
2026-05-27 00:55:57 +09:00
chpark 3bfb4f31e2 feat(proc-payments): 입금완료 건 수정/입금취소 가능
입금완료(PAID) 행 동작에 [수정] 버튼 추가 — 입금일/입금액/방법/메모 수정,
또는 [입금 취소]로 입금완료 해제(입고 진행 상태로 복원 + 입금정보 삭제).
- 신규 /api/m/admin/proc-payments/update (action: edit | cancel).
- REQUESTED/PARTIAL/RECEIVED 행 동작은 기존 그대로 유지.
2026-05-27 00:55:57 +09:00
chpark 252bab500b fix(procurements): 발주서 상태값 전부 한글 — PARTIAL/PAID 매핑 추가
Deploy momo-erp / deploy (push) Successful in 1m55s
PAID 등이 영어 그대로 노출되던 문제. STATUS_LABEL/COLOR 에
부분입고(PARTIAL)·입금완료(PAID) 추가. (OPEN 작성중/REQUESTED 발주요청/
RECEIVED 입고완료/CANCELLED 취소 포함 전 상태 한글화)
2026-05-27 00:51:12 +09:00
chpark 87c3fdfb65 feat(push): 출고요청 알림을 켜기/끄기 토글 스위치로 (테스트 버튼 제거)
Deploy momo-erp / deploy (push) Successful in 1m55s
- PushOptIn: 좌(꺼짐)/우(켜짐) 토글 스위치. 켜면 권한요청+구독, 끄면 구독 해제.
- /api/m/push/unsubscribe: endpoint(또는 사용자) 구독 삭제.
- 알림 차단(denied) 상태면 스위치 비활성 + '설정에서 허용 필요' 안내.
2026-05-27 00:45:39 +09:00
chpark 89503ebf03 fix(push): 일괄 판매기간 적용도 알림 발송 + 알림 아이콘 모모 로고/단색 배지
Deploy momo-erp / deploy (push) Successful in 1m56s
- bulk-sale-range: 리스트에서 판매기간 일괄 적용 시에도 일반 사용자 푸시.
  1건이면 품목명, 여러 건이면 'N개 품목 판매' 요약. 해제(clear)는 알림 제외.
- 알림 아이콘: 큰 아이콘은 모모 로고(icon-192), 상태바 작은 배지는 흰 M
  단색 투명 PNG(badge-96) — 기존엔 컬러 PNG라 크롬이 지구본 기본 배지로 대체했음.
- sw.js: CACHE v2 로 올려 갱신 강제 + badge-96 precache, push 핸들러가
  payload icon/badge 우선 사용.
2026-05-27 00:43:45 +09:00
chpark 21c8bf5ab5 fix(push,profile): 푸시 진단(환영/테스트/카운트) + 프로필 닫기 버튼
Deploy momo-erp / deploy (push) Successful in 1m55s
푸시:
- 구독 직후 '환영 푸시' 자동 발송 — 서버→푸시서비스→기기 경로 즉시 확인.
- /api/m/push/test (GET 구독 카운트, POST 본인 기기 테스트 발송).
- PushOptIn: 허용 결과 안내 + '알림 켜짐' 옆 [테스트] 버튼.
- sendPush 발송 로그(targets/sent/failed) 추가.

프로필:
- 회원정보 수정 페이지에 [닫기] 버튼 — 앱(standalone)은 브라우저 뒤로가기가
  없어 모달처럼 갇히던 문제. history 있으면 back, 없으면 /m/orders/new.
2026-05-27 00:39:18 +09:00
chpark 85ac9db997 feat(push): 품목 판매 일정 등록/변경 시 일반 사용자 전체에 알림
Deploy momo-erp / deploy (push) Successful in 2m1s
요구 정정 — 트리거는 품목 마스터 저장(items/save) 이며, '지금 출고 가능'
전환뿐 아니라 미래 판매예정(시작일이 오늘 이후)도 알림 대상.
- getSaleInfo(): 판매 일정 유무 + 마감 미경과(sellable) + 현재 출고가능(orderableNow).
- 등록: 판매 일정이 잡혀 있으면 알림. 수정: 판매 시작/마감일이 바뀌고
  그 일정이 아직 유효(오늘/미래)할 때만 알림 (단가 등 단순수정·과거날짜 제외).
- 메시지: 지금 가능 → "지금 출고요청 가능", 미래 → "{시작일} 판매 예정".
- 수신 대상: sendPush(generalOnly) — 관리자(user_type='A') 제외, 일반 거래처만.
2026-05-27 00:31:13 +09:00
chpark 34b64a5a17 feat(admin/users): 행별 수정(연필)/삭제(휴지통) 버튼 + 상태 한글 치환
Deploy momo-erp / deploy (push) Successful in 1m56s
- 사용자 관리 그리드 맨 오른쪽에 '관리' 컬럼 추가 — 품목 관리와 동일한
  연필(수정)/휴지통(삭제) 아이콘. 삭제는 행 단위 확인 후 처리.
- 상태(STATUS) 컬럼 active/inactive → 활성/비활성 한글 표시 (활성은 강조).
2026-05-27 00:27:49 +09:00
chpark b5302c52d2 feat(push): PWA 웹 푸시 — 품목이 출고요청 가능해지면 구독자에게 알림
Deploy momo-erp / deploy (push) Successful in 3m34s
- 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_* 설정(없으면 기본키 사용).
2026-05-27 00:17:54 +09:00
chpark 1b0d652282 fix(orders/new): 판매 마감 품목 담기/발주 클라이언트 차단 (2중 방어)
Deploy momo-erp / deploy (push) Successful in 1m54s
페이지를 띄워둔 채 마감 시각이 지나면 목록은 그대로라 담기/발주가 됐던 문제.
- isSaleClosed(): SALE_END_DATE(KST 벽시계) 기준 마감 판정 (자정정각=종일 규칙 동일).
- 담기(addManyToCart)/발주요청(submitOrder) 직전 마감 재확인 후 경고+차단.
- 카드/리스트에 '판매 마감' 상태 표시 + 30초 틱으로 idle 중에도 자동 전환.
- 백엔드 orders/save 의 마감 재검증과 합쳐 2중 차단.
2026-05-27 00:11:07 +09:00
chpark 83cb93cb76 fix(orders): 출고 재고 체크는 전체 창고 합 기준 — 총 재고 초과만 차단
Deploy momo-erp / deploy (push) Successful in 1m57s
직전 커밋에서 관리자/무제한은 총 재고도 초과 가능하게 했으나, 요구사항은
"총 재고보다 많이는 못 나가되 기준 창고가 비어도 총 재고가 충분하면 출고 가능".

- orders/save: 재고 차단을 다시 전체 창고 합(stock_qty) 기준으로 모두에게 적용.
  기준 창고(거래처 default_wh)가 0 이어도 총 재고가 충분하면 통과.
- orders/new(카드/리스트): 담기 한도/품절 표시를 전체 창고 합 기준으로 환원.
  unlimitedQty 는 1회 발주 한도(maxQ)만 무시, 총 재고는 못 넘김.

실제 차감(approve)은 기준 창고에서 빼며 부족분은 음수로 떨어지고(제약 없음 확인),
관리자가 재고 이동으로 정리. 판매 마감 KST 재판정/타임존 수정은 유지.
2026-05-26 23:56:10 +09:00
chpark bbd4f84a12 fix(orders): 음수 재고 출고 허용(관리자/무제한) + 판매 마감 KST 재판정
Deploy momo-erp / deploy (push) Successful in 4m6s
- items/list: 마감 비교를 NOW() → (NOW() AT TIME ZONE 'Asia/Seoul') 로 변경.
  DB 서버 TZ 가 UTC 면 마감 지난 품목이 9시간 더 노출되던 문제 해결.
- orders/save: 출고요청 시 판매기간 KST 기준 서버 재체크 — 마감 지난 품목이
  장바구니에 남아 전송돼도 차단 + 경고 메시지.
- orders/save & orders/new: 관리자/무제한(unlimited_qty='Y') 은 재고 초과(음수)
  출고 허용. 총 재고가 남아 있으면 기준 창고가 비어도 출고 후 재고이동으로 정리.
  (실제 차감 approve 는 이미 음수 허용) 카드/리스트 품절표시도 unlimited 는 해제.
2026-05-26 23:29:27 +09:00
chpark a06a5d551e feat(header,procurement): 관리자 토글 가드 강화 + 매입발주 발주지사(HQ/KIMPO) 셀렉트
Deploy momo-erp / deploy (push) Successful in 4m27s
- header: 메뉴 변환 버튼은 authority_master "관리자" 권한그룹 멤버만 노출. user_type='A' 만으로는 부족 (실무자 다수에 부여돼 있음). /api/auth/me 가 isMasterAdmin 플래그 반환.
- procurements: 발주서에 발주지사 셀렉트 추가 (기준 명세표 마스터 사용 — HQ/KIMPO 등). 통계/계산서 발행 시 지사별 집계 가능.
2026-05-23 01:36:44 +09:00
chpark a40bb609e3 fix(items/list): "5월 22일 마감" 발주는 그 날 종일 노출 — 자정 정각이면 23:59:59로 해석
Deploy momo-erp / deploy (push) Successful in 2m14s
증상: sale_end_date='2026-05-22 00:00:00' 인 품목들이 5월 22일 0시 1분부터
      출고요청 화면에서 사라짐. 사용자 의도는 "5월 22일 종일 마감".

원인: NOW() <= sale_end_date 비교가 자정 정각을 그 날의 끝이 아니라
      그 날의 시작으로 해석.

수정: CASE 로 종료시각이 자정 정각이면 (= 시간 명시 안 함)
      그 날 23:59:59 까지 노출. 시간 명시(예: 22:00)는 그 시각까지 정확히.

      NOW() <= CASE
        WHEN sale_end_date = date_trunc('day', sale_end_date)
          THEN sale_end_date + INTERVAL '1 day' - INTERVAL '1 second'
        ELSE sale_end_date
      END

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 11:57:30 +09:00
chpark 1a209ceb29 feat(daily-order-inventory): 창고 × 품목 매트릭스 뷰로 전환
Deploy momo-erp / deploy (push) Successful in 1m53s
이전: 품목 한 줄에 [발주수량 합계 + 전체창고 재고합계] 표시.
변경: 창고별 재고 현황의 "품목 가로" 패턴 차용 — 헤더=품목(가로), 좌측=창고(세로).
      각 셀에 그 창고의 [발주수량 / 재고수량] 두 줄.

API:
- WAREHOUSES + ITEMS(STOCK/ORDER 매트릭스) 형태로 응답
- 발주수량 산정:
  • APPROVED/INVOICED/PAID 발주는 momo_stock_moves OUT 이력의 실제 출고 창고 기준
  • REQUESTED 발주(아직 출고 전)는 거래처 default_wh_objid 로 가상 배정 (fallback WH001)
- 재고수량은 momo_stocks 현재값 그대로

UI:
- 상단 [전체 합계] 두 줄(발주/재고) — 모든 창고 합산
- 각 창고(WH001~WH007) 2행씩 — 발주수량 / 재고수량
- 음수 재고는 적색 강조 (창고별 재고 현황과 동일 톤)
- 엑셀: 창고별 행 + 분류(발주/재고) + 품목 컬럼

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-21 14:21:08 +09:00
chpark af6726f2b6 feat(orders/approve): 출고 시 재고 부족 검사 제거 — 음수 재고 허용
Deploy momo-erp / deploy (push) Successful in 3m54s
요구: 거래처 default 창고에 재고가 모자라도 그대로 차감해서 출고 진행.
      일자별 발주/재고 + 창고별 재고 현황에서 음수(-) 로 표시되면 관리자가
      다른 창고에서 부족 창고로 수동 재고 이동 처리하는 운영 정책.

변경:
- "재고 부족: 현재고 N, 요청 M" 차단 + ROLLBACK 제거 → 그대로 차감
- 재고 row 자체가 없던 품목은 새 row(qty=-N) INSERT
- itemsRes SQL 에 kind='ITEM' AND item_objid IS NOT NULL 가드 추가
  (택배/용차/환불 라인이 잘못 차감되는 잠재 버그도 같이 차단)
- stock_moves OUT 이력은 동일하게 음수 qty 로 기록

음수 재고 발생 시 운영 흐름:
  1) 다른 창고에 같은 품목 재고 확인
  2) 관리자 패널 → 재고 이동 (오프라인 물리 이동 + 시스템 등록)
  3) 부족 창고 재고가 0 이상으로 복구

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-21 14:13:10 +09:00