333 Commits

Author SHA1 Message Date
chpark 3a0400a0c2 feat: 거래명세표 캡쳐 시 현재고 숨김 + 로그인 유지(30일) 체크박스
Deploy momo-erp / deploy (push) Successful in 53s
[현재고 — 캡처/공유 시에만 숨김]
- 거래처에 보낼 이미지에서 내부 정보(현재고)가 보이면 안 됨
- 거래명세표 표의 현재고 th/td 와 재고 부족 경고 박스에 .js-no-export 클래스 추가
- captureAndShare 안에서 toPng 직전 임시로 display:none → 캡처 후 복원
- 화면에서는 그대로 보이고, 다운받은 PNG/공유 이미지에서만 빠짐

[로그인 유지 — 30일 세션]
- /api/auth/login 요청 body 에 remember 추가
- /lib/session.ts createSession(user, remember=false) — 24시간(기본) / 30일(remember=true)
- 로그인 폼에 [✓ 로그인 유지 (30일)] 체크박스 (기본 ON, 나이 많은 사용자 친화)
- 체크 해제하면 24시간 세션 유지 (기존 동작)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 11:13:28 +09:00
chpark 3cbb28bbbd fix(반응형): 출고관리·매입발주·입고처리 모바일 스크롤 가로채기 해제
Deploy momo-erp / deploy (push) Successful in 53s
증상: 모바일에서 좌-우 분할 화면(출고관리 등) 의 페이지 스크롤이 안 됨.
원인:
- 컨테이너 minHeight: calc(100vh - 200px) 가 모바일에서도 적용 →
  좌·우 박스가 각각 거의 풀높이 차지
- 박스 내부의 overflow-auto 가 페이지 스크롤을 가로채 박스 안만 스크롤됨

수정:
- minHeight 인라인 스타일 → lg:min-h-[calc(100vh-200px)] 로 lg 이상에서만 적용
- 좌측 리스트 컨테이너: max-h-[60vh] lg:max-h-none 로 모바일에서 자연스러운 높이
- flex-1 overflow-auto → flex-1 lg:overflow-auto (모바일은 페이지 스크롤로 통일)
- 동일 패턴을 매입발주(/m/admin/procurements) + 입고처리(/m/admin/inbounds) 에도 적용

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 11:02:12 +09:00
chpark a5fd64da62 feat(출고요청): 카드 안에서 수량 입력/조절 + 카드/리스트 토글 + 거래명세표 라인 sync 버그 수정
Deploy momo-erp / deploy (push) Successful in 53s
[출고요청 화면 개선 — /m/orders/new]
- 카드에 [수량 입력 + 담기] 한 번에. 엔터 또는 버튼 클릭 시 그 수량만큼 카트에 추가
- 이미 담은 품목은 카드 안에 [- 1 +] 컨트롤 + [×] 빼기 버튼이 즉시 노출
  · 카트 수량 그 자리에서 직접 수정. 카드 외 카트 펼치기 불필요
- 담은 품목 카드는 emerald 테두리 + 우상단에 "담은 N" 배지로 강조

[보기 모드 토글]
- 검색바 우측에 [카드 / 리스트] 토글
- 카드: 기존 그리드 (이미지 위주, 시각적)
- 리스트: 표 형태 (품목 많을 때 한눈에) — 행마다 동일 [수량+담기] 컨트롤

[관리자 거래명세표 라인 sync 버그 fix]
- /m/admin/orders 에서 [+택배/+용차] 클릭 시 합계만 올라가고 인풋 표시값이 안 바뀌던 문제
- ExtraRow key 를 `OBJID-QTY-UNIT_PRICE-LABEL` 로 변경해 line 변경 시 컴포넌트 강제 재마운트
- useState 초기값이 새 line 값으로 확실히 반영됨

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 10:02:14 +09:00
chpark 2f4c5d5d02 feat(반응형): 입금/계산서/공급업체/창고/제조사/품목 — PC + 모바일 통일 UI
Deploy momo-erp / deploy (push) Successful in 51s
[패턴]
- 데스크탑(sm 이상): 표 + 가로 스크롤 (min-w 명시)
- 모바일(<640px): 카드 리스트 — 한 행을 그대로 카드 한 장으로
- 헤더: title + 부제 + 추가 버튼이 flex-wrap 으로 재배치
- 모달: max-w 유지 + 모바일에서 max-h-[90vh] overflow-y-auto

[페이지별 변경]
- /m/admin/payments: 요약 카드 3장 (전체/처리됨/미수금) + 표/카드 분기
- /m/admin/invoices: 선택건수+합계 부제 + 카드 리스트 + 표
- /m/admin/vendors: 카드 클릭 → 수정 모달 직행, 데스크탑 표 분리
- /m/admin/warehouses: 카드(아이콘+유형 배지)+표, 유형 색상 매핑
- /m/admin/makers: 검색바 폭 자동 + 카드(아이콘+버튼)+표
- /m/admin/items: 카드(이미지 썸네일+모든 배지) + 표, min-w 900px

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 09:34:19 +09:00
chpark 1502960151 feat(모바일 반응형): 사이드바 햄버거 오버레이 + 자동 닫기
Deploy momo-erp / deploy (push) Successful in 51s
증상: 모바일로 로그인 시 사이드바가 콘텐츠를 덮어 사용 불가능.
원인: 사이드바가 모든 폭에서 항상 정상 폭으로 자리잡음.

[레이아웃]
- 사이드바를 모바일에서 fixed + translate-x-full 로 화면 밖에 두고,
  mobileOpen=true 시 translate-x-0 슬라이드 인 (200ms transition)
- 모바일 오버레이 배경 클릭 시 닫기
- lg 이상에서는 기존대로 좌측 고정

[헤더]
- 모바일에서만 햄버거(≡) 버튼 노출 → setMobileOpen(true)
- 사용자명 모바일 width 줄이고 부서명 숨김 (110px → sm 이상 200px)

[사이드바]
- 헤더 우측에 모바일 전용 X 버튼 추가 (lg:hidden)
- 데스크탑 햄버거 토글은 hidden lg:flex 로 분리
- handleSubMenuClick 에서 setMobileOpen(false) 호출 → 메뉴 선택 시 자동 닫힘

[스토어]
- mobileOpen 상태 + setMobileOpen 액션 추가

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 09:23:27 +09:00
chpark f85b2f17e0 feat(header): 상단에 [📖 매뉴얼] 링크 추가
Deploy momo-erp / deploy (push) Successful in 56s
요구사항: 메인 화면 어디서든 사용 설명서로 빠르게 이동.
- 헤더 우측 (사용자명 옆) 에 BookOpen 아이콘 + "매뉴얼" 텍스트
- /manual.html 새 탭으로 열기 (target=_blank)
- 모바일에서는 텍스트 숨기고 아이콘만

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 09:09:02 +09:00
chpark 88e7eab65e feat(입고 처리): 매입발주 선택 → 라인별 창고/수량 입고 (부분/전체) + 매뉴얼 보강
Deploy momo-erp / deploy (push) Successful in 51s
[입고 처리 화면 재설계 — 등록 → 수정 방식]
- 좌-우 분할:
  · 좌: 매입 발주서 리스트 (발주요청+입고중 기본 필터)
  · 우: 발주 라인별 [창고 선택 + 정상 입고 + 불량] 인라인 입력
- 발주/입고/미입고 한눈에 표시 (예: 10 / 5 / 5)
- 완전 입고된 라인은 ✓ 완료 표시 + 입력 칸 잠김
- 정상+불량은 남은 수량(qty - received_qty) 이하로 자동 클램프

[/api/m/procurements/list]
- 응답에 TOTAL_QTY, RECEIVED_QTY 추가 → 좌측 리스트에 진척 표시

[/api/m/inbounds/save]
- procObjid 있으면 라인별 입고 한도 사전 검증 (qty - received_qty 초과 차단)
- 0 입고 라인은 건너뛰기
- 매입발주 상태 자동 갱신:
  · 모든 라인 완전 입고 → RECEIVED (입고완료)
  · 일부 라인만 입고 → PARTIAL (입고중)
  · 시작 안 함 → REQUESTED 유지

[매뉴얼 — 가-1, 가-2, 다-2 대폭 보강]
- 거래처 출고 요청: 6단계 체크리스트 + 화면 도식 + 토스트/모달 예시 + 시나리오
- 내 주문 내역 + 거래처 자기 주문 수량 수정/품목 삭제/취소: 화면 도식 + 단계별 가이드 + 상태표
- 입고 처리: 화면 도식 + 발주/입고/미입고 표시 의미 + 부분입고 시나리오

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 01:16:29 +09:00
chpark da9b16f012 fix(품목 추가 모달): 체크박스 선택 안되던 문제 + 손모양 커서
Deploy momo-erp / deploy (push) Successful in 52s
증상: 품목 추가 모달에서 행 클릭과 체크박스 클릭 둘 다 toggle 호출 →
       두 번 발생해서 체크 상태가 변하지 않음.
수정:
- 체크박스 td 에 stopPropagation 추가 (행 onClick 으로 버블되지 않게)
- 행 클릭은 그대로 행 전체 토글로 동작
- 체크박스 명시 cursor:pointer + 크기 18px + 색상 accent-emerald-600
- select-none 추가 (드래그 시 글자 선택 방지)
- 헤더 전체선택 체크박스도 동일 처리

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 01:07:34 +09:00
chpark 03838af90c feat(거래처 출고이력): 본인이 출고요청 상태 품목 수량/삭제 직접 수정
Deploy momo-erp / deploy (push) Successful in 51s
[새 API: /api/m/orders/items/update]
- 본인 또는 관리자가 자기 발주의 품목(ITEM) 라인 수량 변경 또는 삭제
- REQUESTED 상태에서만 허용. 단가는 변경 불가 (momo_items.unit_price 기준 자동 재계산)
- 재고 / max_order_qty 한도 자동 검증 (unlimited_qty 권한이면 한도 우회)
- 트랜잭션으로 라인 수정 + momo_orders 합계 7종 자동 재집계

[/m/orders 거래명세표 모달 UI]
- 출고요청 상태 거래처 본인 화면에서 품목 라인 직접 편집:
  · 수량 인풋 (블러 시 자동 저장)
  · 행 끝의 [×] 버튼으로 그 품목만 삭제
- 택배/용차 라인은 인풋 안 보이고 "자동" 표시 — 모모 담당자가 조정
- 저장/삭제 후 onReload 로 모달 + 리스트 동시 갱신
- 안내 배너: "수량 수정 / 품목 삭제 / 주문 취소" 모두 가능 명시

[매뉴얼]
- 가-2 내 발주 이력 섹션에 수량 수정 / 품목 삭제 / 주문 취소 사용법 추가

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 00:38:23 +09:00
chpark e86017c42a feat(통계+세금계산서): 거래처×일자 피벗 통계 신설 + 중복 발행 차단
Deploy momo-erp / deploy (push) Successful in 53s
[새 통계 — 거래처×일자 매출 피벗]
- API: POST /api/m/statistics/monthly-pivot
  · 입력: { year, month }
  · 응답: dates[] / rows[ {거래처, BY_DAY:{날짜:{면세,과세}}, TOTAL_TAXFREE/TAXABLE} ] / totalsByDay / grandTotal
  · 출고완료/입금완료/계산서발행 상태 발주만 집계
- 화면: /m/admin/statistics/pivot
  · 가로 스크롤 피벗 표 (왼쪽 sticky 업체명)
  · TOT 행: 월간 일자별 총합 (부가세 신고용)
  · 거래처별 정렬: 매출 큰 순
  · 합계 카드 3종: 면세/과세/총
  · 엑셀 다운로드 (거래처 행 × 일자 컬럼 평면화)
- 메뉴 등록: 018 마이그레이션 (objid 9000504, 통계 그룹)

[세금계산서 중복 발행 차단]
- /api/m/einvoices/issue: orderObjid 가 이미 발행됨(FAIL/CANCELED 제외) 이면 400
  · "이미 발행된 발주입니다 (상태/승인번호)" 메시지 + alreadyIssued=true 플래그
- /m/admin/einvoices: 발행 가능 발주 리스트에서 이미 발행된 건 자동 제외
  · orders/list 와 einvoices/list 동시 조회 후 클라이언트 측 필터
  · DRAFT/QUEUED/SENT/ACK 모두 발행 완료로 간주 — 재발행 불가
  · FAIL/CANCELED 만 다시 발행 가능

[매뉴얼]
- 통계 표에 "거래처×일자 매출 (피벗)" 항목 추가, 부가세 신고 자료 활용 안내

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 23:51:05 +09:00
chpark b95ac11015 fix(items/list): 마이그레이션 미적용 환경에서도 동작하도록 컬럼 자동 보장
Deploy momo-erp / deploy (push) Successful in 51s
증상: 마스터 품목 관리 화면에 품목이 하나도 안 보임.
원인: 마이그레이션 016 (vendor_objid) 이 운영 DB 에 적용 안 된 상태에서
       SELECT I.vendor_objid 가 'column does not exist' 로 실패 → 빈 배열 응답.

해결: API 첫 호출 시 ALTER TABLE ... ADD COLUMN IF NOT EXISTS 로
       vendor_objid + max_order_qty + is_hidden + requires_delivery 모두 자동 보장.
       idempotent 하므로 이미 적용된 환경에서도 NOOP.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 23:24:58 +09:00
chpark 58645a0b3f feat(매입 발주): 엑셀 다운로드 + 이미지 공유 + 품목조회 JOIN 캐스팅 수정
Deploy momo-erp / deploy (push) Successful in 53s
[발주서 엑셀 다운로드]
- /api/m/procurements/excel/[id] 신설
- 이미지의 표준 발주서 양식대로 .xlsx 생성
  · 분류번호/발주서번호/발주일/공급업체/연락처/이메일
  · 1.물품의 표시 (품목코드·품명·단위·수량·단가·금액)
  · 총액 + V.A.T 별도
  · 2.비고 + 발주자 정보

[발주서 이미지 공유]
- 매입 발주서 양식 우상단에 [📤 이미지 공유] [⬇ 엑셀 다운로드] 버튼
- html-to-image 로 PNG 캡처 → Web Share API (카톡 등) 또는 PNG 다운로드
- 거래명세표(출고/정산)와 동일한 사용자 경험

[버그 수정 — 품목 모달에 결과 안 나옴]
- /api/m/items/list 의 supply_mng JOIN 캐스팅 누락
  · momo_items.vendor_objid (TEXT) vs supply_mng.objid (NUMERIC) 타입 충돌로 SQL 에러 → 빈 배열 응답
- LEFT JOIN supply_mng V ON I.vendor_objid = V.objid::text 로 명시적 캐스팅

[매뉴얼]
- 매입 발주 섹션에 "발주서 공유 / 엑셀 다운로드" 안내 추가

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 23:23:21 +09:00
chpark 6b60178b1d feat(v0.7 round2): 매입 발주서 양식 + 좌-우 분할 + 공급업체 일괄 불러오기
Deploy momo-erp / deploy (push) Successful in 51s
[화면 — /m/admin/procurements 전면 개편]
- 좌측: 발주서 리스트 (상태 필터, 발주번호, 공급업체, 금액)
- 우측: 발주서 양식 (이미지의 표준 발주서 형태)
  · 분류번호/발주서번호/발주일/공급업체 표
  · "1. 물품의 표시" 표 (품명·단위·수량·단가·금액)
  · "2. 비고" 텍스트 영역
  · 합계 자동 계산
- [+ 새 발주] / [발주 요청] 상단 버튼
- 작성중(OPEN) 상태에서만 인라인 편집 가능, 발주요청 후 잠김

[품목 추가 모달]
- 검색 + [공급업체 필터(현재/전체)] + [결과 내 검색]
- 다중 선택 + 헤더 체크박스로 전체 선택
- 이미 담긴 품목은 '이미' 표시
- 한 번에 N개 일괄 추가 (수량 1, 원가는 품목 마스터의 cost_price)

[API 4종 신설]
- POST /api/m/procurements/create-empty: 빈 발주서 1건 생성 (proc_no 자동 부여, status=OPEN)
- POST /api/m/procurements/lines/save: 라인 추가/수정/삭제 + 합계 재집계 (트랜잭션)
  · 같은 품목 중복 추가 시 수량 누적
- POST /api/m/procurements/update-header: 공급업체/메모 수정
- POST /api/m/procurements/send: 발주 요청 — status OPEN→REQUESTED + 공급업체 이메일로 발주서 HTML 메일 발송
  · 메일 실패해도 상태는 변경 (mailSent/mailError 응답)

[매뉴얼]
- 다-1 매입 발주 단계별 가이드 재작성
- "공급업체별 품목 일괄 불러오기" 팁 추가

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 22:26:21 +09:00
chpark 99565bf6e0 feat(v0.7 round1): 공급업체 명칭 변경 + 품목-공급업체 연결 + 거래처 출고이력 거래명세표 모달
Deploy momo-erp / deploy (push) Successful in 55s
[DB]
- 016: momo_items.vendor_objid 추가, momo_vendors 컬럼 보강 (email/address/memo/regdate)
- 017: 메뉴 9000202 "매입처 관리" → "공급업체 관리"

[명칭 일괄 변경]
- src/app/api/m/vendors/* + (main)/m/admin/vendors/* + procurements/* + inbounds/*
- 모든 UI/메시지의 '매입처' → '공급업체'

[품목 ↔ 공급업체 연결]
- /api/m/items/list 응답에 VENDOR_OBJID/VENDOR_NAME 추가, vendorObjid 필터 지원
- /api/m/items/save: vendorObjid 입력/저장 (insert + update)
- 품목 등록·수정 폼에 [공급업체] 드롭다운 신설 (제조사 옆)

[/m/orders 거래처 출고 이력 화면 — 모달 + 이미지 공유]
- 행 클릭 / [보기] 버튼 → 거래명세표 모달
- 모달 안에 [📤 이미지 공유] [⬇ 엑셀 다운로드] 버튼 (출고/정산 화면과 동일)
- 출고요청 상태이면 [🗑 주문 취소] 버튼 노출 → /api/m/orders/cancel
- html-to-image 로 PNG 캡처 → Web Share API 또는 다운로드

[매뉴얼]
- 공급업체 명칭 반영, 출고이력 거래명세표 보기 동작 추가, 품목 폼에 공급업체 필드 설명 추가

Round 2 예정: 매입 발주 양식 (좌측 리스트 + 우측 발주서 + 품목 검색/공급업체 일괄 불러오기) + 매뉴얼 보강

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 22:19:08 +09:00
chpark 8c89c44b5f feat(거래명세표): 공급자 정보 박스 + 비고 컬럼 + 이미지 공유 + 엑셀 수정
Deploy momo-erp / deploy (push) Successful in 1m13s
[공급자 정보 박스 (우측 상단)]
- 결제계좌번호 / 전화번호 / 이메일 표를 거래명세표 우측 상단에 표시
- 환경변수: 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>
2026-05-07 20:51:30 +09:00
chpark 6b751e48d0 chore(manual + fix): 매뉴얼 한글화 + 택배/용차 라인 동기화 버그 수정
Deploy momo-erp / deploy (push) Successful in 51s
[매뉴얼]
- 영어/기술용어/환경변수 코드 노출 제거
- 초등학생 수준 친절한 설명체로 전면 재작성
- 역할별 시나리오 박스 + 화면 도식 + FAQ 한글 위주
- URL/코드 참조 최소화

[ExtraRow 버그]
- 거래명세표에서 [+ 택배/용차 추가] 클릭해도 인풋 칸의 수량이 화면에 안 바뀌던 문제
- 같은 OBJID 라서 컴포넌트가 unmount 안 되어 useState 초기값 무시되던 케이스
- useEffect 로 line prop 변경 시 인풋 state 동기화

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 20:45:07 +09:00
chpark fb6e0d38b6 fix(middleware): /manual.html 등 정적 .html/.pdf 파일 인증 면제
Deploy momo-erp / deploy (push) Successful in 51s
증상: https://momotogether.com/manual.html 접속 시 /login 으로 307 리다이렉트.
원인: middleware 가 .html 확장자 정적 파일을 인증 체크 대상으로 분류.
해결: 정적 자산 정규식에 html/htm/pdf/txt 추가.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 20:30:56 +09:00
chpark b48d3a505f docs: 사용자 매뉴얼 HTML 추가 (public/manual.html)
Deploy momo-erp / deploy (push) Successful in 50s
URL: https://momotogether.com/manual.html
- 거래처(USER) 가이드: 회원가입 / 출고 요청 / 발주 이력 / 회원정보 수정
- 관리자(ADMIN) 가이드: 발주서 관리·출고처리·거래명세표·인라인 편집·세금계산서 발행
- 마스터 관리: 품목·거래처·매입처·창고·제조사
- 매입/입고: 매입 발주·입고·재고
- 통계: 대시보드·월간/일자별/원가마진 + 엑셀 다운로드
- 전체 업무 흐름도
- FAQ: 택배 라인 / 권한 / 메일 / STUB / 모바일

단일 HTML 파일 — 인쇄 가능, 모바일 대응, 외부 폰트 X

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 20:29:24 +09:00
chpark 57bb74dc14 chore(header): 모바일 친화 — 상단 메뉴 탭/Admin/알람·매뉴얼·테마 아이콘 제거
Deploy momo-erp / deploy (push) Successful in 51s
배경: 모바일에서 헤더가 너무 빽빽함. 사용되지 않는 요소 정리.

제거:
- [사용자] / [관리자] 등 상단 메뉴 탭 (좌측 메뉴로 충분)
- 홈 아이콘
- 알람 (결재함 배지) — MOMO에서는 결재 흐름 X
- 매뉴얼 (BookOpen) 아이콘
- 테마 토글 (Sun/Moon)
- Admin 패널 진입 버튼

유지:
- 사용자명(클릭 시 /profile)
- 로그아웃

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 20:12:48 +09:00
chpark 70736bd8f6 fix(momo orders): 택배/용차 추가 버튼 — 같은 종류 라인 있으면 수량 +1 (중복 생성 방지)
Deploy momo-erp / deploy (push) Successful in 50s
증상: + 택배 추가 / + 용차 추가 버튼을 누를 때마다 같은 종류 라인이 새로 생성됨.
변경: 같은 kind 의 라인이 이미 있으면 그 라인의 qty 를 +1, 없으면 신규 추가.

- /m/admin/orders (관리자 거래명세표): 기존 라인 찾아 lines/save 로 qty+1 업데이트
- /m/orders/new (거래처 발주 작성): extras 배열에서 같은 kind 라인의 qty +1

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 20:09:16 +09:00
chpark 63d778cfe5 feat(momo v0.6): 대메뉴 순서 재배치 + 모든 로그인 랜딩 → 출고 요청
Deploy momo-erp / deploy (push) Successful in 51s
[메뉴 015]
- 600 거래처 주문 (9000100)
- 650 출고/정산  (9000400)
- 700 매입/입고  (9000300)
- 750 마스터 관리 (9000200)
- 800 통계       (9000500) — 대시보드 자식 포함

[로그인 랜딩]
- 역할 분기 제거. 관리자/거래처 모두 /m/orders/new 로
- 관리자는 좌측 메뉴에서 [출고/정산]으로 이동

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 20:07:25 +09:00
chpark b0808b1d0a feat(momo v0.6): 거래명세표 행 순서 + 메뉴 재배치 + 로그인 랜딩 변경
Deploy momo-erp / deploy (push) Successful in 51s
[거래명세표 행 순서]
- 택배(DELIVERY)/용차(CHARTER) 라인이 품목(ITEM) 위로 표시되도록 정렬
- /api/m/orders/detail, /api/m/orders/statement/[id]: ORDER BY CASE kind 추가
- /m/admin/orders 화면 + xlsx 출력: 표시 순서 기준으로 SEQ 재부여 (DB seq 와 무관)

[메뉴 014]
- 마스터 관리 (9000200) → 마지막 (seq 900)
- 대시보드 (9000001) → 통계 그룹(9000500) 자식으로 이동, parent 변경
- 빈 [DASHBOARD] 대메뉴(1837127121) 비활성화
- 최종 순서: 거래처 주문 → 매입/입고 → 출고/정산 → 통계(대시보드 포함) → 마스터 관리

[로그인 랜딩]
- 기존: 모든 사용자 /m/dashboard
- 변경: 역할별 분기
  · ADMIN/관리자 → /m/admin/orders (발주서 관리·출고처리)
  · USER/거래처   → /m/orders/new (출고 요청)
- 회원가입 직후도 /m/orders/new 로

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 16:43:57 +09:00
chpark e65ea43429 feat(momo v0.6): 전자세금계산서 메뉴 등록 + 거래명세표에 발행 버튼 추가
Deploy momo-erp / deploy (push) Successful in 51s
[메뉴 마이그레이션 013]
- objid=9000404 '전자세금계산서' (parent=9000400 출고/정산)
- url: /m/admin/einvoices, seq=13

[거래명세표 [세금계산서 발행] 버튼]
- 관리자 발주 상세(/m/admin/orders) 거래명세표 미리보기 하단
- 출고완료(APPROVED/SHIPPED) 또는 입금완료(PAID) 상태에서 노출
- [세금계산서 발행] (과세 TAX) / [계산서(면세)] (TAXFREE) 두 버튼 분리
- 클릭 → 확인 모달 → /api/m/einvoices/issue 호출 → 결과 모달 (승인번호/처리방식 표시)
- 발행 후 같은 화면에 "세금계산서 발행됨 (승인번호)" 표시

[현재 흐름 (v0.6)]
1. 거래처: 출고 요청
2. 담당자: 체크 + [출고] 버튼 → 재고 차감 + 거래명세표 메일 자동 발송 (status=APPROVED)
3. 담당자: 거래명세표에서 [세금계산서 발행] 버튼 클릭 → 전자세금계산서 발행
4. 발행 이력은 /m/admin/einvoices 메뉴에서 일괄 조회/엑셀 다운로드

[추후 옵션]
- 출고 처리 시 자동 세금계산서 발행 토글 (지금은 명시 발행만)
- nts-esero 어댑터 실 통신 활성화 (인증서 + ERP 연계 승인 후)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 16:28:07 +09:00
chpark 0b0749cfb1 chore: package-lock.json normalize (npm install 부산물)
Deploy momo-erp / deploy (push) Successful in 1m14s
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 16:19:17 +09:00
chpark 7e764d500e feat(momo v0.6): 전자세금계산서 발행 모듈 골격 (별도 메뉴 + 국세청 직접 연동 준비)
Deploy momo-erp / deploy (push) Successful in 51s
[정책]
- 발주/출고/입금 흐름과 분리된 별도 메뉴 (월말 일괄 또는 신고 시점 발행 가능)
- 출고 시 자동 발행은 향후 토글 옵션으로 추가

[DB 012]
- momo_einvoices: 발행 이력 (공급자/받는자/금액/승인번호/상태/원본XML)
- momo_einvoice_items: 라인별 상세
- 상태: DRAFT → QUEUED → SENT → ACK | FAIL | CANCELED

[발행 어댑터 추상화 (lib/einvoice)]
- InvoiceProvider 인터페이스 — issue/status/cancel
- adapters/manual.ts: 자체 거래명세서 (국세청 전송 X, 기본)
- adapters/nts-esero.ts: 국세청 e-세로 직접 연동 골격
  · NTS_ESERO_MODE: stub | test | prod
  · stub 모드는 DB 기록만 (개발/CI 안전)
  · 실 통신은 사업자 공동인증서 + ERP 연계 승인 후 활성화
  · SOAP/XMLDSig 페이로드 빌더 골격 작성, 인증서 받으면 서명+전송 추가
- index.ts: EINVOICE_PROVIDER 환경변수로 어댑터 선택

[API]
- POST /api/m/einvoices/list: 발행 이력 조회 + 필터 (관리자)
- POST /api/m/einvoices/issue: 발주(orderObjid)로부터 또는 수동 입력으로 발행
  · 어댑터 결과를 momo_einvoices/_items 에 트랜잭션 기록 (성공/실패 모두)

[UI]
- /m/admin/einvoices 페이지 신설
  · 발행 가능 발주 리스트 (출고/입금 완료된 건)
  · 한 번 클릭으로 세금계산서 발행 → 결과 모달
  · 발행 이력 (날짜/상태/승인번호 필터, 엑셀 다운로드)
  · STUB 모드 안내 배너 — 운영 활성화 절차 명시

[문서]
- docs/MOMO_DISTRIBUTION_SPEC.md 부록 B (v0.6) 추가

다음 단계 (인증서 + ERP 연계 승인 후):
- nts-esero.ts 의 SOAP + XMLDSig 실제 구현
- NTS_ESERO_MODE=test 로 100건 검증
- NTS_ESERO_MODE=prod 전환

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 16:14:02 +09:00
chpark a336191153 fix(db 011): momo_order_items.item_objid NOT NULL → NULLABLE
Deploy momo-erp / deploy (push) Successful in 50s
증상: 거래명세표에서 [+ 택배/용차 추가] 클릭 시
  null value in column "item_objid" of relation "momo_order_items" violates not-null constraint

원인: 001_momo_init.sql 에서 item_objid 가 TEXT NOT NULL 로 정의됨.
       택배/용차 라인(kind=DELIVERY/CHARTER)은 품목이 아니라 가상 부가 라인이라 NULL 이 정상.

해결: ALTER ... DROP NOT NULL. ITEM 라인은 어차피 코드 레벨에서 항상 값을 넣고 있어 무영향.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 15:59:24 +09:00
chpark 194dfffae1 fix(deploy): 마이그레이션 호스트 폴백 + 라인 저장 에러 메시지 상세화
Deploy momo-erp / deploy (push) Successful in 52s
증상: /m/admin/orders 거래명세표에서 [+ 택배/용차 추가] 클릭 시 "라인 저장 중 오류" 500.
원인: 마이그레이션 010 (momo_order_items.kind/extra_label, momo_orders.total_delivery/charter)이
       운영 DB에 적용되지 않음. deploy.yml 의 docker compose exec 가 silent fail 했을 가능성.

[deploy.yml]
- 컨테이너 안 마이그레이션 실패 시 → 호스트에서 docker run node:20 + pg 임시 컨테이너 폴백
- 호스트는 source 디렉토리를 /work 로 마운트해서 db/migrations 와 scripts/migrate-momo.mjs 직접 실행
- 모두 실패하면 ::error:: 로 명확히 표시 (warning 무시 방지)

[lines/save]
- catch 블록에서 실제 PG 에러 메시지 노출
- 'column does not exist'(42703) 감지 시 마이그레이션 미적용 힌트 추가

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 15:53:28 +09:00
chpark c9b375bbcb feat(momo v0.5): 거래명세표에서 택배/용차 라인 직접 추가/수정/삭제
Deploy momo-erp / deploy (push) Successful in 1m14s
[요구사항 반영]
- 택배비/용차비는 매번 달라지므로 수기 입력 (담당자명+단가+수량)
- 용차 추가 버튼 → 한 라인 생성, 기본 단가 5000원
- 단가×수량 = 합계 자동 계산 (예: 5000 × 6 = 30,000)
- 거래명세표(관리자 발주 상세)에서 바로 수정 가능

[API]
- /api/m/orders/save extras 입력 형태 변경: amount → unitPrice + qty (amount 호환 유지)
- /api/m/orders/lines/save 신설: REQUESTED 상태 발주에 택배/용차 라인 추가/수정/삭제
  · 본인 또는 관리자만 가능, ITEM 라인은 보호됨
  · 라인 변경 후 momo_orders 합계 컬럼 (total_supply/vat/amount/taxfree/taxable/delivery/charter) 자동 재집계

[UI]
- /m/orders/new (거래처 발주 작성):
  · 택배/용차 라인 단가+수량 분리 입력, 기본 단가 4000(택배)/5000(용차)
  · 라인별 합계 실시간 표시 (단가 × 수량 = 합계)
- /m/admin/orders (관리자 거래명세표):
  · REQUESTED 상태에서 [+ 택배 추가] [+ 용차 추가] 버튼 노출
  · 택배/용차 라인은 인라인 편집 (담당자명/단가/수량 즉시 수정, 체크 클릭 → 저장)
  · 삭제는 X 버튼

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 15:27:03 +09:00
chpark 86417c2ffe build(next): standalone 빌드에 db/migrations + migrate-momo.mjs 포함
Deploy momo-erp / deploy (push) Successful in 51s
deploy.yml 의 docker compose exec ... npm run migrate:momo 가 컨테이너 안에서
실행되려면 마이그레이션 SQL 과 실행 스크립트가 standalone 번들에 포함되어야 함.
outputFileTracingIncludes 옵션으로 자동 복사되도록 설정.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-02 00:46:11 +09:00
chpark 3d5b020456 feat(momo v0.4): 통계 그래프(recharts) + 엑셀 다운로드(xlsx) + 모바일 반응형 정리
Deploy momo-erp / deploy (push) Successful in 52s
[통계 페이지 3종 — recharts + xlsx 다운로드]
- /m/admin/statistics (월간 업체별): 누적 막대그래프 TOP15 + 엑셀
- /m/admin/statistics/daily (일자별): ComposedChart (스택 막대 + 건수 라인) + 엑셀
- /m/admin/statistics/margin (원가/마진): 매출/원가/마진 막대 TOP10 + 엑셀

[발주 이력 (/m/orders)]
- 엑셀 다운로드 버튼 추가
- 모바일 폭 대응 (헤더 wrap, 테이블 가로 스크롤, 버튼 사이즈 sm)

[공통]
- src/lib/xlsx-export.ts: downloadXlsx 헬퍼 신설 (컬럼 정의 + 시트명 + 자동 타임스탬프)
- 타입 폭 넓힘 (T 제약 제거, recharts Tooltip formatter 시그니처 호환)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-02 00:37:20 +09:00
chpark 1f9b017617 feat(momo v0.4): 발주서 택배/용차 라인 + 택배전용 품목 자동 라인 + 모바일 반응형
Deploy momo-erp / deploy (push) Successful in 56s
[DB 010]
- momo_items.requires_delivery (택배 전용 플래그)
- momo_order_items.kind (ITEM/DELIVERY/CHARTER) + extra_label
- momo_orders.total_delivery / total_charter

[발주]
- /api/m/orders/save: 택배/용차 라인 처리, 택배전용 품목이 있으면 택배 라인 필수 검증
- /api/m/orders/detail: kind/extra_label/택배비/용차비 응답
- /m/orders/new 재설계:
  · 택배/용차 추가 버튼 (한 줄씩 생성, 담당자명+금액 수기 입력)
  · 택배전용 품목 카트에 담기면 자동으로 택배 라인 1줄 추가, 제거 시 차단
  · 카트 수량 직접 입력 가능 (재고/한도 자동 클램프)
  · 모바일 반응형 (2열 그리드, 터치 친화 패딩, sticky 카트바 압축)

[품목]
- 관리자 등록/수정 폼: 택배 전용 라디오 추가
- 그리드 배지에 택배 표시
- /api/m/items/list: REQUIRES_DELIVERY 응답
- /api/m/items/save: requiresDelivery 필드 처리

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-02 00:26:20 +09:00
chpark defd358e20 chore(domain): momo.junggomoa.com → momotogether.com
Deploy momo-erp / deploy (push) Successful in 1m11s
- docker-compose.prod.yml: Traefik Host 라벨 (apex + www)
- .gitea/workflows/deploy.yml: NEXTAUTH_URL + 헬스체크 URL
- CICD_SETUP.md, docs/proposal.html, docs/MOMO_DISTRIBUTION_SPEC.md 도메인 표기 수정

DNS 입력 (가비아):
  A  @    183.99.177.40
  A  www  183.99.177.40

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-29 18:17:40 +09:00
chpark 860e52939d fix(admin-panel): 사용자 수정 폼 404 수정 + 거래처 특수권한 토글 추가
Deploy momo-erp / deploy (push) Successful in 51s
- /admin-panel/user-form 페이지 신설 (기존 /admin/user-form 만 있었음)
- 거래처(user_type='C') 회원 수정 시 unlimited_qty/view_hidden 토글 노출
- /api/admin/users/detail 응답에 address/ceo_name/biz_no/status/unlimited_qty/view_hidden 추가
- /api/admin/users/save 업데이트 시 위 필드 처리

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-29 17:11:10 +09:00
chpark 80512f3098 feat(momo v0.3): 발주 제한수량/숨김품목/회원특수권한 + admin 변경 + 회원정보 수정
Deploy momo-erp / deploy (push) Successful in 1m21s
[인증/계정]
- MASTER_PWD 백도어 제거 (auth.ts, constants.ts) — 모든 사용자는 자기 비번으로만 로그인
- SUPER_ADMIN/ADMIN_USER_ID: plm_admin → admin
- DB 마이그레이션 009: plm_admin → admin (비번 '1') / 모모유통 임직원 6명 등록 (user_type='A')
  · 거래처(user_type='C') 보존, 그 외 FITO 레거시 인사정보 일괄 삭제

[품목 마스터 확장]
- momo_items: max_order_qty (1회 발주 한도), is_hidden (숨김 처리) 컬럼 추가
- /api/m/items/save: maxOrderQty/isHidden 입력 처리
- /api/m/items/list: 일반 회원에게 is_hidden=Y 품목 숨김 (view_hidden 권한자만 노출)
- 관리자 품목 화면에 두 입력 필드 + 그리드 배지 추가

[회원 권한 확장]
- user_info: unlimited_qty (제한수량 해지), view_hidden (숨김 보기) 컬럼 추가
- /api/m/customers/list, /save 신설 (관리자 전용 — 거래처 정보/권한 수정)
- /m/admin/customers 페이지 신설 — 두 권한 토글로 관리

[발주 검증]
- /api/m/orders/save: 회원의 unlimited_qty 권한 + 품목별 max_order_qty 한도 검증 추가
- 재고 한도도 백엔드에서 검증 (기존엔 프론트만 체크)

[회원정보 수정]
- /api/auth/profile (GET/POST): 본인 정보 + 비밀번호 변경
- /m/profile 페이지 신설, 헤더의 사용자 이름 클릭 → 프로필 페이지

[문서]
- docs/MOMO_DISTRIBUTION_SPEC.md 부록 A (v0.3) 추가

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-29 16:45:35 +09:00
chpark db50153494 fix(m/orders/save): FITO 사용자 발주요청 시 customer_objid NULL 위반 수정
Deploy momo-erp / deploy (push) Successful in 49s
- r.user.objid 가 없는 FITO 세션(plm_admin 등)에서 발주 요청 시 INSERT 실패하던 문제: r.user.objid || r.user.userId 폴백
- customer_objid 와 regid 에 같은 $3 재사용하던 부분 분리 ($10) — 42P18 회피
- try/catch 범위 확장: req.json 파싱 실패, 존재하지 않는 품목, 수량 유효성 모두 400 응답
- enriched.map 의 throw 가 catch 밖이라 generic 500 으로 떨어지던 동작 개선

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-27 17:00:31 +09:00
chpark cd4260ea73 fix(orders/save): pool.connect() 없이 pool.query() 직접 호출 — 연결 누수 수정
Deploy momo-erp / deploy (push) Successful in 49s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-27 06:30:25 +09:00
chpark 81fbb10b99 fix(migration 008): ON CONFLICT → IF NOT EXISTS 패턴으로 수정 (menu_info unique 제약 없음)
Deploy momo-erp / deploy (push) Successful in 49s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-27 04:14:57 +09:00
chpark ad5e1265e4 fix(momo dashboard): FITO 관리자(plm_admin)가 ADMIN 대시보드를 보도록 수정
Deploy momo-erp / deploy (push) Successful in 50s
role 필드 없이 isAdmin=true / userType='A' 인 경우에도 관리자 뷰 표시.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-27 03:07:05 +09:00
chpark 883dd95b46 feat(momo): 제조사 관리 메뉴 sidebar 등록 (migration 008)
Deploy momo-erp / deploy (push) Successful in 49s
마스터 관리 그룹에 '/m/admin/makers' 소메뉴 추가.
ON CONFLICT DO NOTHING으로 멱등성 보장.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-27 00:34:18 +09:00
chpark 9531d20b58 docs(claude): 프론트=React / 백엔드=Node.js 아키텍처 명시
Deploy momo-erp / deploy (push) Successful in 49s
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-27 00:15:56 +09:00
chpark 6930ea2bc7 feat(momo): 제조사 관리 + 재고 이력 + 품목 속성 JSONB 확장
Deploy momo-erp / deploy (push) Successful in 51s
- 제조사 관리 페이지/API CRUD (momo_makers)
- 재고 이력 조회 페이지/API (momo_stock_moves)
- 품목 관리: 제조관리 JSONB 섹션(소비기한·입고가·원산지·보관온도·바코드) 추가
- 품목 목록 API: onlyAvailable 서브쿼리 WHERE 절로 수정
- 재고 관리 페이지: 재고 이력 버튼 추가
- admin-panel: 메뉴 관리 DB 상태 무관 최상단 고정

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-27 00:12:05 +09:00
chpark 72786bfc98 feat(momo): 출고 처리 2분할 UI + 회원가입 주소 + 거래처 정보 보강
Deploy momo-erp / deploy (push) Successful in 50s
- 회원가입 폼·API·DB(user_info.address 컬럼 추가, 마이그레이션 007)에
  주소 필드 추가, 전화/주소를 필수값으로 승격.
- 관리자 발주서 관리 페이지(/m/admin/orders) 를 좌(리스트)·우(거래명세표
  미리보기) 2분할 레이아웃으로 재구성. 체크박스로 출고요청 다중 선택 후
  상단 [출고] 버튼으로 일괄 처리(승인+재고차감+메일발송) 지원.
- 미리보기에 품목별 현재고(STOCK 창고 합산) 노출, 부족분 경고 표시.
- /api/m/orders/detail: ceo_name·biz_no·address 컬럼 + 품목별 현재고
  합산 SELECT 추가. /api/m/orders/approve: 명세서 발송 SQL의 잘못된
  alias 누락(`order.company_name` undefined) 수정.
- 마이그레이션 006: ON CONFLICT(objid) 가 menu_info 의 unique 제약
  부재로 실패하던 idempotent 버그를 EXISTS 분기로 교체.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-26 22:32:03 +09:00
chpark 9aae8e7c54 feat(momo): 사용자 피드백 일괄 반영
Deploy momo-erp / deploy (push) Successful in 50s
사용자 명시적 운영 배포 승인 ('운영배포까지 진행 ... 될때까지 하라고').
- 로그인 후 redirectTo /dashboard → /m/dashboard 로 통일 (plm_admin 도 모모로)
- 세션 있으면 / · /login · /signup → /m/dashboard 리다이렉트 (middleware)
- /m/items 페이지를 /m/orders/new 로 redirect — 메뉴 통합
- 출고요청 카트를 상단 sticky bar 로 이동, 클릭 시 펼침 + 발주 버튼 항상 노출
- user_info 에 biz_no/ceo_name 컬럼 추가 (migration 006)
- signupMomoUser 가 biz_no/ceo_name 저장하도록 수정
- 메뉴: 9000101 품목 검색 비활성화 (출고요청과 통합으로 중복)
- admin-panel: 메뉴관리 섹션 idempotent 복구 (migration 006)
2026-04-26 21:39:19 +09:00
chpark 5760283c63 fix(momo orders/new): 카트 영역 항상 표시 — 빈 상태에서도 등록 위치 노출
Deploy momo-erp / deploy (push) Successful in 49s
문제: 사용자가 '물건 담고 등록하는 곳이 안 보인다' 보고.
원인: cart.length>0 분기 안에 합계+발주버튼이 묶여있어 빈 카트에서 미렌더.
수정:
- 합계/발주요청 버튼을 분기 밖으로 분리 (빈 상태=비활성 버튼)
- 좁은 화면용 상단 요약 배지 + 발주 버튼 추가
- 좌우 분리 브레이크포인트 md → lg 로 변경

E2E 영향 없음(/api/m/orders/save 인터페이스 동일). 사용자 명시적 운영 배포 승인.
2026-04-26 21:24:35 +09:00
chpark a2707d658e fix(momo): /data_storage 를 named volume 으로 전환 — 업로드 EACCES 해소
Deploy momo-erp / deploy (push) Successful in 53s
호스트 바인드 마운트는 docker compose 가 root 소유로 자동 생성해
컨테이너 nextjs(uid 1001) 가 mkdir 불가. named volume(momo_data_storage)
은 Dockerfile 의 chown nextjs:nodejs 를 그대로 복제하여 권한 문제 사라짐.
deploy.sh 의 host-side mkdir/chmod 도 더 이상 불필요하므로 제거.
2026-04-26 17:16:59 +09:00
chpark ba1cd769d7 fix(items): 품목명에서 'M' 자동 접두 제거 + 면세는 is_tax_free 컬럼만으로 관리
Deploy momo-erp / deploy (push) Successful in 1m14s
- /api/m/items/save: 입력 itemName 앞의 'M ' 자동 strip + 자동 면세 추론 로직 제거
  → 사용자는 '꽃계탕' 그대로 입력, 면세 라디오만 선택
- 어드민 폼 라벨 '면세 (M품목)' → '면세'
- DB 정리: 운영 momo_items 12건 'M ' 접두 일괄 제거 (꽃계탕, 유정란, 꽃송이버섯 등)
- 품목 검색 / 출고 요청 메뉴 분리:
  - /m/items = 단순 조회 (장바구니 없음, 스크롤 가능, 4열 그리드)
  - /m/orders/new = 발주 작성 (장바구니 + 발주 요청)

이미지 저장 권한:
- /api/uploads/[...path] 신규 — /data_storage/uploads 정적 서빙 (nextjs uid 소유 보장)
- upload-image: data_storage 우선 사용 + URL 도 /api/uploads/items/... 로 전환
- 권한 401 회피
2026-04-26 01:34:01 +09:00
chpark 6408984074 fix: 거래처 주문 장바구니 가시성 + 이미지 업로드 영구 저장
Deploy momo-erp / deploy (push) Successful in 49s
장바구니:
- /m/items 우측 패널 lg: → md: 브레이크포인트 (768px+ 부터 노출)
- 패널 테두리 강조 (emerald-300 2px) + 그림자 강화
- [담기] 클릭 시 우측 상단 토스트 피드백 (장바구니 추가됨)

이미지 업로드:
- docker-compose.prod.yml 에 ./public/uploads:/app/public/uploads 볼륨 마운트
  (컨테이너 재빌드 시에도 이미지 보존)
- Dockerfile: /app/public/uploads/items 디렉토리 + nextjs 소유권 미리 설정
- scripts/deploy.sh: 호스트 public/uploads/items 디렉토리 보장 + 권한 777
- /api/m/items/upload-image: 저장 경로 fallback (3개 후보) + 명확한 에러 메시지
2026-04-26 01:18:14 +09:00
chpark 0ba97294eb chore: 시스템 구동에 불필요한 잔재 파일 일괄 삭제
Deploy momo-erp / deploy (push) Successful in 49s
삭제 (FITO 잔재 / 미사용 스크립트):
- dev_git_only.{bat,sh}, run-windows.bat, stop-windows.bat
- start-{debug,dev,dev-full,dev-full-win,devlocal-full,docker-linux,prod-full}.sh, start.sh
- setup.sh, smart-logs.sh, verify-build.sh, quick-rebuild.sh, quick-update-jsp.sh
- build-mac.sh, build-windows.bat, compile_only.sh
- docker-compose.{debug,localdev,win}.yml, Dockerfile.win, dockerfilelocal.dev
- hin, pace_ilshinplm-ilshin (정체불명)
- AGENTS.md, BOM_SEQ_DRAG_DROP.md (FITO 잔재 문서)
- test_contract_*.{html,md} (FITO 계약 테스트)
- cookies.txt (테스트 쿠키 — 보안)
- env.{development,production}.example, .env.example (.env.production.example 와 중복)
- tsconfig.tsbuildinfo (빌드 산출물)

남은 핵심 파일:
- 빌드/런: package.json, tsconfig.json, next.config.ts, postcss.config.mjs, eslint.config.mjs
- 도커: Dockerfile, Dockerfile.dev, docker-compose.{prod,dev}.yml
- 환경: .env.production.example, .env.momo.example
- 가이드: README.md, DOCKER_SETUP.md, SETTING_GUIDE.txt, CICD_SETUP.md, CLAUDE.md
2026-04-26 01:14:57 +09:00
chpark 95129cf606 fix(momo): user_info/supply_mng 통합 + JOIN 타입 캐스팅 + ADMIN 가드 보강
Deploy momo-erp / deploy (push) Successful in 48s
- momo-auth: user_info(AES) 기반으로 전환 (momo_users 폐기)
- /api/auth/signup: user_info INSERT (user_type=C 거래처)
- /api/m/vendors: supply_mng 재사용 (charge_user_name/supply_tel_no/reg_no 등 매핑)
- /api/m/{orders,dashboard,statistics,inbounds,procurements}:
  momo_users → user_info LEFT JOIN, momo_vendors/makers → supply_mng (objid::text 캐스팅)
- /api/m/{users,makers} 라우트 삭제 (admin-panel 사용)
- requireMomoAdmin: FITO isAdmin / userType=A / admin@momo.com 모두 통과
- DB: momo_users/roles/menus/role_menus/makers/vendors/attachments DROP (스펙 v0.2)
2026-04-26 00:41:02 +09:00
chpark 3f97e4eac6 fix(guard): plm_admin(FITO isAdmin)도 모모 ADMIN으로 인정 — 403 해소
Deploy momo-erp / deploy (push) Successful in 49s
2026-04-26 00:26:57 +09:00