Commit Graph

45 Commits

Author SHA1 Message Date
chpark 13d02cac6a chore(migrations): db/migrations 전체 삭제 + deploy 마이그레이션 단계 제거
Deploy momo-erp / deploy (push) Successful in 2m3s
사용자 명시 요청 — 운영 DB 는 이미 모든 스키마/데이터 변경 반영됐고,
더 이상 자동 reload 가 필요 없음. 매 deploy 시 마이그레이션이 실행되며
사용자 변경(비밀번호, 부서, 추가 거래처 등) 을 원복하는 사고를 막기 위해
폴더 통째로 삭제.

- db/migrations/*.sql 35개 모두 삭제
- .gitea/workflows/deploy.yml 의 migrate-momo.mjs 호출 단계 제거
- scripts/migrate-momo.mjs 파일 자체는 유지

운영 DB 의 모든 user_info 비밀번호는 '1' 로 직접 reset 완료(142명).
2026-05-14 01:26:30 +09:00
chpark 9a086dae50 fix(migrations): momo001..momo135 부서 '일반구매자' (DEPT003) 매 deploy 보장
Deploy momo-erp / deploy (push) Successful in 2m42s
운영 DB 에는 직접 UPDATE 로 부서 설정 완료. 035 도 INSERT/UPSERT 시
dept_code='DEPT003', dept_name='일반구매자' 박도록 패치.
임직원 6명(user_type='A') 은 영향 없음.
2026-05-14 00:10:19 +09:00
chpark d86a1154a9 fix(migrations+procurements): supply_mng objid numeric + setActiveId 빌드 에러
Deploy momo-erp / deploy (push) Successful in 2m34s
운영 DB 직접 점검 후 발견:
- supply_mng.objid 는 numeric NOT NULL (TEXT 아님) → 'MOMOSUP000000001'
  같은 문자열 INSERT 가 cast fail 로 80개 다 fail 하고 supply_mng = 0개
  잔존 상태였음. 운영 DB 에는 직접 80개 박아둠 (objid 1..80).
- 035 마이그레이션도 동일 패턴(numeric objid)으로 재작성. 매 deploy 안전.

직전 deploy #137 (485aea4) 빌드 실패 원인:
- procurements/page.tsx 의 deleteProc 에서 setActiveId(null) → state 가
  string 이라 타입 에러. setActiveId("") 로 수정.
2026-05-14 00:02:28 +09:00
chpark 6ea1f13003 fix(migrations): 031/032/033 NO-OP 화 + 035 plain SQL 단일 책임으로 통합
Deploy momo-erp / deploy (push) Failing after 58s
직전 batch 가 운영 반영 후에도 supply_mng 가 10개로 유지된다는 사용자 신고.
원인 추정: 031/032/033 의 DO block 안에서 어딘가 fail → migrate-momo.mjs 가
process.exit(1) → 그 뒤 마이그레이션 (034, 035) 실행 자체 못 함.

→ 031/032/033 본문을 SELECT 1; 로 NO-OP 화. fail 지점 우회.
→ 035 가 단독으로 회원 135 + 공급업체 80 + 제조사 메뉴 삭제 모두 처리.
  · DO block 없이 plain SQL 만 (각 statement 가 별도 transaction)
  · supply_mng: 통째 DELETE 후 80개 plain INSERT
  · user_info: user_type='U' DELETE 후 ON CONFLICT (user_id) UPSERT
  · 매 deploy 안전 — UPSERT 라 중복 INSERT 도 OK
2026-05-13 23:58:36 +09:00
chpark 485aea4d4f feat(procurements): 작성중 삭제 + 입금완료전 수정 + 035 plain SQL reload
Deploy momo-erp / deploy (push) Failing after 58s
- 매입 발주서: OPEN 일 때 삭제 버튼 노출, 라인 포함 hard delete
  · 신규 API /api/m/procurements/delete (status='OPEN' 만 허용)
- 매입 발주 editable: STATUS === 'OPEN' → STATUS not in (PAID, CANCELLED)
  · lines/save API 가드도 동일 (PAID/CANCELLED 만 차단)
- 035_supply_mng_plain_reload.sql: 직전 DO block 마이그레이션이 어디서
  fail 하는지 추적 불가 → 가장 단순한 plain SQL 로 supply_mng 다 비우고
  엑셀 기준 80개 INSERT ON CONFLICT(supply_code) UPSERT
  · momo_items/momo_procurements 의 vendor_objid 모두 NULL 처리
  · UNIQUE INDEX 보장 후 INSERT — 매 deploy 안전
2026-05-13 23:53:32 +09:00
chpark 5fce695f09 fix(migrations): 019 의 supply_mng 10개 매 deploy reset 차단 + 034 UPSERT
Deploy momo-erp / deploy (push) Successful in 2m36s
진짜 root cause — 019_proc_terms.sql 이 매 deploy 시
  DELETE FROM supply_mng;
  INSERT INTO supply_mng ... 10개 시드 (VND-001 ~ VND-010)
를 실행해서 supply_mng 가 항상 10개로 reset 되고 있었음.

→ 019 의 supply_mng 시드 부분 제거 (납품조건 ALTER 만 유지).

034 신설 — idempotent 매 deploy 안전 실행:
- product_lines 컬럼 보장
- supply_code UNIQUE 인덱스 보장 (ON CONFLICT 동작)
- 옛 'VND-*' 시드는 items/procurements 의 vendor_objid 끊은 후 DELETE
- 엑셀 80개 INSERT ON CONFLICT (supply_code) DO UPDATE
- sentinel 가드 없이 매번 안전 — 사용자 추가 supply (다른 supply_code) 는 보존
2026-05-13 23:46:30 +09:00
chpark 1fde88bcd8 fix(migrations): 008/023 매 deploy 원복 사고 차단 + 033 강제 리로드
Deploy momo-erp / deploy (push) Successful in 2m49s
근본 원인:
- 008_makers_menu.sql: 매 deploy 시 제조사 관리 메뉴를 status='active' 로
  되돌려놓아 사용자가 메뉴 삭제해도 다음 배포 때 부활.
- 023_seed_momo_vendors_from_xlsx.sql: 매 deploy 시 옛 100개 공급업체를
  비-idempotent 한 INSERT 로 박아 supply_mng 가 영원히 옛 데이터로 원복.

→ 두 파일을 빈 NO-OP 으로 교체.

033_force_reload_v2.sql 신설 (sentinel 가드 momo_migration_marks 기반):
- 제조사 메뉴 menu_info objid=9000204 삭제
- momo_einvoice_items/einvoices/stock_moves(ORDER)/order_items/orders 통째
- user_info user_type='U' 다 삭제 후 momo001..momo135 ON CONFLICT UPSERT
  · 본사팀 85 (HQ), 김포팀 50 (KIMPO), 카테고리별 default_wh 매핑, 비번 '1'
- supply_mng 다 삭제 후 80개 INSERT (엑셀 모모유통 제조사 리스트 26.05.12)
  · product_lines 컬럼 ALTER (DO block 밖)
2026-05-13 23:37:40 +09:00
chpark 91313351f9 chore(data): 회원/공급업체 마스터 통째 리로드 (마이그레이션 032)
Deploy momo-erp / deploy (push) Successful in 2m33s
사용자 요청 — docs 의 엑셀 두 파일을 기준으로:
- 회원(user_info user_type='U') 전부 삭제 후 momo001..momo135 신규 등록
  · 본사팀(85): 창고픽업 WH001 / 시장픽업 WH002 / 용차배송 WH003
  · 김포팀(50): 김포지사 WH004 / 창고픽업 WH005 / 시장픽업 WH007 / 용차배송 WH006
  · statement_branch: 본사='HQ' / 김포='KIMPO'
  · 비번 '1' (AES 암호화)
- 공급업체(supply_mng) 전부 삭제 후 80개 신규 등록 (제조사 리스트 엑셀 기준)
  · supply_mng 에 product_lines TEXT 컬럼 추가하여 제품명 보관
  · items.vendor_objid 는 NULL 처리 (참조 무결성)

1회성 sentinel — momo_migration_marks 테이블로 가드. 신규 데이터가
다음 deploy 때 또 지워지는 사고 방지.
2026-05-13 23:29:57 +09:00
chpark 94fc425ef3 chore(orders): 옛 발주 데이터 1회성 삭제 (마이그레이션 031)
Deploy momo-erp / deploy (push) Successful in 2m19s
사용자 명시 요청 — supplier snapshot 이전의 옛 발주 데이터를 통째로
비우고 신규 발주만 운용. 사용자가 새로 등록하기로 함.

⚠️ migrate-momo.mjs 가 매 deploy 시 모든 .sql 을 재실행하므로 raw DELETE
를 그대로 박으면 신규 발주가 다음 deploy 때 또 지워지는 사고가 남.
→ sentinel 테이블 momo_migration_marks 도입, 1회만 실행되도록 가드.

삭제 범위:
- momo_einvoice_items (발주연결분)
- momo_einvoices WHERE order_objid IS NOT NULL
- momo_stock_moves WHERE ref_type='ORDER'
- momo_order_items 전체
- momo_orders 전체

보존: momo_stocks.qty — 사용자가 inventory 메뉴에서 직접 보정.
2026-05-13 17:44:03 +09:00
chpark 0bfe85dc69 fix(orders): 거래명세표 공급자 정보 발주 시점 snapshot 처리
Deploy momo-erp / deploy (push) Successful in 3m37s
기존: 거래명세표 발급 때마다 user_info.statement_branch + branches table
을 실시간 조회 → 사용자의 기준 명세표를 바꾸거나, branches 의 계좌/
전화/이메일을 수정하면 과거 이미 찍힌 명세표까지 함께 바뀌어버림.

수정: 출고요청(REQUESTED) 시점에 supplier 8개 컬럼을 momo_orders 행에
박아두고, 이후 detail/statement/approve 는 이 snapshot 을 사용.

- 마이그레이션 030: momo_orders 에 supplier_branch / supplier_name /
  supplier_ceo / supplier_bank_account / supplier_phone / supplier_email
  / supplier_biz_no / supplier_address 컬럼 추가 (idempotent IF NOT EXISTS)
- save: 발주 INSERT 시 getSupplierByBranch(user.statement_branch) 호출 결과
  를 그대로 박음
- detail/statement/approve: snapshot 컬럼이 있으면 그것을 사용, 없으면
  옛 발주용 폴백으로 user_info.statement_branch → branches table 조회
2026-05-13 16:39:40 +09:00
chpark 0c380d94a0 feat(warehouses 029): 창고 7개로 정비 — 기존 5개 라벨/타입 갱신 + 김포 용차/시장 2개 신규
Deploy momo-erp / deploy (push) Successful in 2m15s
기존 5개 (objid/wh_code 그대로 유지 — 재고 이동·입출고 데이터 보존):
- WH001 본사창고 → 본사 창고 (HQ_STOCK)
- WH002 시장픽업 → 본사 시장 (HQ_MARKET)
- WH003 용차배송 → 본사 용차 (HQ_CHARTER)
- WH004 창고픽업팀 → 김포지사 (KIMPO_BRANCH)
- WH005 김포창고 → 김포 창고 (KIMPO_STOCK)

신규 2개 (idempotent INSERT):
- WH006 김포 용차 (KIMPO_CHARTER)
- WH007 김포 시장 (KIMPO_MARKET)

총 7개. 사용자 요청한 본사 3 + 김포 4 구성 정확히 맞춤.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 16:08:45 +09:00
chpark 19e3cf9048 feat(statement-branch-admin): 기준 명세표 관리 메뉴/페이지/API + 창고 카테고리 7개로 확장
Deploy momo-erp / deploy (push) Successful in 3m5s
마이그레이션 028:
- momo_statement_branches 테이블 신설 (code PK / name / bank_account / phone / email 등)
- HQ, KIMPO 기본 시드 INSERT (사용자가 관리자 페이지에서 편집 가능)
- 메뉴: 시스템 그룹에 '기준 명세표 관리' (M_ASBR / menu_info 9000310)

라이브러리 (src/lib/momo-branches.ts):
- 하드코딩 → DB 조회로 변경 (60초 in-memory 캐시)
- getSupplierByBranch 가 async — detail/statement/approve API 도 await 추가
- 저장 시 invalidateBranchCache() 호출

페이지/API (관리자 전용):
- /m/admin/statement-branches : list + 등록/수정/삭제 모달
- POST /api/m/admin/statement-branches/list
- POST /api/m/admin/statement-branches/save (regist / update / delete)

사용자 수정 폼:
- "기준 거래명세서" select 옵션이 하드코딩 본사/김포 → DB 의 branches list 동적 fetch

창고 관리:
- WH_TYPE 카테고리 5개 → 7개 (옛 enum 도 라벨 매핑은 유지)
  · HQ_STOCK 본사 창고
  · HQ_CHARTER 본사 용차
  · HQ_MARKET 본사 시장
  · KIMPO_BRANCH 김포지사
  · KIMPO_STOCK 김포 창고
  · KIMPO_CHARTER 김포 용차
  · KIMPO_MARKET 김포 시장
- 신규 추가 시 select 는 위 7개만 노출, 기존 데이터 (STOCK 등) 는 라벨로 자연 표시

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 15:48:08 +09:00
chpark 6ad57356a0 feat(statement-branch): 사용자별 거래명세서 공급자 정보 분기 (본사/김포)
Deploy momo-erp / deploy (push) Successful in 1m59s
마이그레이션 027:
- user_info 에 statement_branch VARCHAR(10) DEFAULT 'HQ' 컬럼 추가
- 기존 사용자 일괄 'HQ' 로 채움

라이브러리:
- src/lib/momo-branches.ts 신설 — HQ / KIMPO 두 branch 의 공급자 정보 정의
  · HQ: 기업은행 434-115361-01-016 (이상용) / 010-6369-8443 / momo8443@daum.net
  · KIMPO: 농협 351-1383-7634-13 (모모유통) / 010-5789-9431 / momokimpo@nate.com
- getSupplierByBranch(branch) helper

거래명세표 supplier 분기 (3개 API):
- /api/m/orders/detail: order.STATEMENT_BRANCH 따라 supplier 객체 결정
- /api/m/orders/statement/[id]: xlsx 다운로드도 동일
- /api/m/orders/approve: 메일 발송 stmt 도 동일

사용자 수정 폼:
- /api/admin/users/detail: statement_branch 반환 (default 'HQ')
- /api/admin/users/save: statement_branch 받아 UPDATE
- /admin-panel/user-form: "기준 거래명세서" select 추가 (본사/김포)

흐름: 거래처 사용자의 기준을 김포로 설정 → 그 사용자의 발주에 대한 거래명세표 supplier 가 김포 정보로 표시

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 15:29:02 +09:00
chpark 6b401071a4 fix(migration 026): menu_info 에 unique constraint 없어 ON CONFLICT 실패 → WHERE NOT EXISTS + UPDATE 분리
Deploy momo-erp / deploy (push) Successful in 2m10s
지난 commit 의 026 이 ON CONFLICT(objid) 로 INSERT 시도 → menu_info 에 PK/unique 없어 PG 에러.
패턴: INSERT WHERE NOT EXISTS + 그 다음 별도 UPDATE WHERE objid=... 로 idempotent 처리.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 14:25:48 +09:00
chpark 7d18285ac6 feat(menu+filter+history): 사이드바 메뉴 노출 + 자동조회 + 재고이력 한글/이동 상대창고 표시
Deploy momo-erp / deploy (push) Successful in 2m53s
1) 사이드바 메뉴 누락 fix (마이그레이션 026):
   - FITO menu_info 테이블에 9000304 '매입 입금관리', 9000305 '재고이력' INSERT
   - 기존 입고/재고 seq 재정렬 (11→12, 12→13)
   - momo_menus 만으로는 사이드바에 안 나옴 — menu_info 가 사이드바의 진짜 소스

2) 재고이력 표시 개선:
   - inventory/history API: REF_TYPE_LABEL (한글) + COUNTER_WH_NAME (이동 시 상대 창고) 추가
   - inventory/transfer 라우트: stock_moves 의 ref_objid 에 상대 창고 objid 박음
   - StockHistoryModal + history page: "INBOUND" → "입고", TRANSFER 시 "→ XX창고/← XX창고" 표시

3) 자동조회 (조회 버튼 없이 즉시):
   - m/orders (내발주이력): 날짜 from~to + 상태 input 추가 + state dep useEffect
   - m/orders/new (출고요청): "재고있는 품목만 / 전체 품목" 필터 추가 + 250ms 디바운스 자동 fetch

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 14:22:28 +09:00
chpark bf2339c242 feat(inbound+inventory): 입고는 입금완료(PAID) 만 + 재고이력 메뉴/모달
Deploy momo-erp / deploy (push) Successful in 2m17s
1) 입고 처리 (m/admin/inbounds):
   - 노출 대상: REQUESTED+PARTIAL → PAID+PARTIAL 로 변경 (입금 안 된 발주는 입고 불가)
   - editable 조건 / STATUS 라벨/색상 PAID 추가
   - 안내 문구 갱신

2) 재고이력 메뉴 (마이그레이션 025):
   - M_AINVH '재고이력' 메뉴 매입 그룹 sort 34 에 INSERT (페이지는 기존 /m/admin/inventory/history 활용)

3) 재고관리 페이지 (m/admin/inventory):
   - 데스크탑 표/모바일 카드 모두 행마다 "이력" 버튼 추가
   - 클릭 시 StockHistoryModal 팝업 — 해당 품목 + 해당 창고 한정 이력 조회 (POST /api/m/inventory/history)

매입 흐름 완성: 매입발주(REQUESTED) → 입금관리(PAID) → 입고처리(RECEIVED)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 14:03:29 +09:00
chpark b781722614 feat(proc-payment): 매입 입금관리 메뉴/페이지/API 신설
Deploy momo-erp / deploy (push) Successful in 2m9s
매입 흐름: 매입발주(REQUESTED) → 매입 입금관리(PAID) → 입고 처리(RECEIVED)

DB (마이그레이션 024):
- momo_procurements 에 paid_date, paid_amount, paid_method, paid_memo 컬럼 추가
- 매입 그룹 메뉴 sort 재정렬: 매입발주 30, 입금관리(신설) 31, 입고처리 32, 재고관리 33
- M_APROCPAY '매입 입금관리' /m/admin/proc-payments 메뉴 INSERT (ON CONFLICT idempotent)

UI/API:
- /m/admin/proc-payments 페이지 — 발주요청/입금완료 분리 카드 + 입금 처리 모달 (금액/방법/메모)
- 조회조건: 날짜 from~to + 공급업체 + 상태 (즉시 반영)
- POST /api/m/admin/proc-payments/list — REQUESTED|PAID 만 노출
- POST /api/m/admin/proc-payments/confirm — REQUESTED → PAID 전환 + paid_* 채움

다음 단계 (별도 batch): 입고 처리 페이지에서 PAID 만 노출 + 입고 시 RECEIVED 전환

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 12:30:31 +09:00
chpark 9293029631 chore: 제조사 관리 메뉴/페이지/API 삭제 + 엑셀 공급업체 80개 일괄 등록
Deploy momo-erp / deploy (push) Successful in 2m0s
1) 삭제:
   - src/app/(main)/m/admin/makers/page.tsx
   - src/app/api/m/makers/{list,save,delete}/route.ts
   (메뉴 DB 의 제조사 항목은 이전 commit 9705a04 에서 이미 제거됨)

2) 마이그레이션 023:
   - docs/모모유통 제조사 리스트(26.05.12).xlsx 의 80개 업체를 supply_mng 에 일괄 등록
   - idempotent: supply_name 중복 시 SKIP (NOT EXISTS)
   - supply_code: MM-NNNN 자동 채번 (기존 max(objid) + ROW_NUMBER)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 12:13:19 +09:00
chpark f62660952b fix(migration): 009 의 DELETE FROM user_info 비활성화 — 매 배포마다 거래처 삭제 사고
Deploy momo-erp / deploy (push) Successful in 1m54s
[원인]
- db/migrations/009_items_user_permissions.sql 가 user_type<>'C' AND
  NOT IN (admin 7인) 사용자를 삭제하는 정리 쿼리를 포함
- user_type 'C' → 'U' 통합 이후 'U' 거래처 134명이 위 조건에 걸려
  매 배포마다 통째로 삭제됨 (어제·오늘 두 번 사용자 관리에 거래처 0명)

[수정]
- 해당 DELETE 블록 통째로 주석 처리 — 마이그레이션은 idempotent 해야 하고
  destructive 작업은 두지 않는다는 원칙
- 거래처 134명은 별도 복구 스크립트로 다시 INSERT (이 commit 직후)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 10:20:02 +09:00
chpark 10e8dad841 fix(user/default_wh_objid): numeric → text 로 변환
Deploy momo-erp / deploy (push) Successful in 1m42s
운영 momo_warehouses.objid 가 text 타입(예: MOMOWH000000001)이라
default_wh_objid 도 text 로 일치시켜야 매핑 가능.
- db/migrations/022_user_default_wh_text.sql
- /api/admin/users/save: ::numeric 캐스트 제거

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 23:36:49 +09:00
chpark 3ba6237a32 feat(orders+users): 사용자별 기준 창고 매핑 → 출고 시 그 창고에서 차감
Deploy momo-erp / deploy (push) Successful in 1m49s
본사팀 / 김포팀 거래처 리스트처럼 거래처별로 출고 창고가 다른 케이스 대응.
회원은 가입 시 기본 정보만 입력하고, 관리자가 사용자 수정에서 창고를 매핑.

[스키마]
- db/migrations/021_user_default_wh.sql: user_info.default_wh_objid numeric NULL

[API]
- /api/admin/users/detail: default_wh_objid 반환
- /api/admin/users/save: 수정 시 default_wh_objid 저장 (빈 값 → NULL)
- /api/m/orders/approve: 1) 거래처의 default_wh_objid → 2) STOCK 첫 창고 fallback

[UI]
- admin-panel/user-form: '출고 기준 창고' 셀렉트 추가 (수정 모드만)
  미지정 시 기본 창고로 fallback

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 15:18:22 +09:00
chpark a3ab0d7629 feat(admin/auth): 권한관리 통합 화면 — 권한그룹/직원/메뉴 동시 매핑
Deploy momo-erp / deploy (push) Failing after 37s
[권한그룹 사용자 추가 SQL 에러 fix]
- $3 파라미터에 ::text 명시 캐스트로 inconsistent types 해결
  ("inconsistent types deduced for parameter $3")

[새 UI - admin-panel/auth]
- 좌측: 권한 목록 + 검색 + 생성 (목록에서 클릭으로 활성화, 더블클릭으로 수정/삭제)
- 우중·우우: 권한있는/권한없는 직원 패널 (체크박스 + 전체선택 + 검색)
  · ‹ 추가  / 제거 › 버튼 즉시 반영
- 하단: 메뉴 전체 트리 (체크 즉시 서버 반영)
- 모달 헬퍼 안 띄우고 한 화면에서 모두 처리 → 사용 흐름 단순화

[새 스키마/API]
- db/migrations/020_authority_sub_menu.sql
- /api/admin/auth/menus  : 그룹의 메뉴 OBJID + 전체 메뉴 트리
- /api/admin/auth/menus/toggle : 단일 메뉴 ON/OFF

[거래명세표]
- 수량 컬럼 너비 w-14 → w-20 (모바일에서 잘리던 문제)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 14:36:16 +09:00
chpark 6cfe0041a2 feat: 매입 발주서 납품조건 + 공급업체 샘플 + 관리자/사용자 모드 토글 + 모달 sticky
Deploy momo-erp / deploy (push) Successful in 53s
[DB 019]
- momo_procurements 에 delivery_place / delivery_period / payment_terms / freight_terms 컬럼 추가
- 기존 supply_mng (공급업체) 데이터 모두 삭제 + 샘플 10개 신규 등록
  · (주)아바텍, 대성식품, (주)고기파는농부, 광이진천 농장, 단과일,
    봉담수산, 명일동유기농, 울산단과일, 농부의아침, 초록마을 도매
- 시퀀스 가정 없이 MAX(objid)+1 로 안전하게 부여

[발주서 양식 — 표준 거래명세표 양식 반영]
- ProcurementForm: "2. 납품조건" 섹션 추가
  · 1)~3) 표준 조항 (납기 지연 공제 / 검수 부적합 반출 / 수량 규격 변경)
  · 4) 납품장소 5) 납품기간 6) 대금지불 7) 운임부담 — 표 형식 입력칸
  · 8)~9) 표준 조항 (3일 이의 제기 효력 / 명시되지 않은 사항)
  · 하단 "상기와 같이 발주함." + 발주일 + 발주자
- update-header API: 4개 필드 동적 업데이트
- /api/m/procurements/excel/[id]: 엑셀 출력에도 납품조건 9개 항목 + 4필드 표
- /api/m/procurements/send: 메일 본문 HTML 에도 납품조건 표 + 표준 조항

[관리자/사용자 모드 토글]
- 헤더 매뉴얼 옆에 [👥 사용자 / 🛡 관리자] 토글 버튼 (admin 권한자만 노출)
- menu-store: viewMode("user"|"admin") + setViewMode 추가
- 사이드바: viewMode 에 따라 대메뉴 필터링
  · 사용자 모드: '거래처 주문' 그룹만
  · 관리자 모드: 출고/정산 + 매입/입고 + 마스터 관리 + 통계
- admin 권한자 자동으로 로그인 시 관리자 모드 진입

[ItemPicker 모달 모바일 친화]
- 모바일에서 화면 하단 도킹(items-end) → 풀스크린 시트 처럼
- 헤더는 sticky top-0 으로 고정 → 긴 목록에서도 검색바 항상 보임

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 11:42:45 +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 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 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 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 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 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 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 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 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 04d51eb792 feat(menu): 사용자 → 대메뉴 → 소메뉴 2단 트리로 재구성, 모모 자체 회원/권한/메뉴 제거
Deploy momo-erp / deploy (push) Successful in 46s
DB:
- [사용자] 그룹 아래에 5개 대메뉴 신규 (거래처 주문/마스터 관리/매입·입고/출고·정산/통계)
- 각 대메뉴 아래에 모모 페이지 소메뉴로 배치 (URL 직접 연결)
- 기존 [DASHBOARD] 대메뉴 활용 — 자식 [대시보드 → /m/dashboard] 추가, 기존 dashboard.do 비활성화

코드:
- /m/admin/users, /m/admin/roles, /m/admin/menus 페이지 삭제
- /api/m/users, /api/m/roles, /api/m/menus 삭제
- 모모 사이드바 [시스템] 그룹 제거 (기존 admin-panel 사용자/권한/메뉴 관리 활용)

→ plm_admin 로그인 후 [사용자] 그룹 펼치면 깔끔한 2단 트리 표시,
   각 소메뉴 클릭 시 /m/* 페이지로 정상 이동
2026-04-26 00:04:16 +09:00
chpark a358e69f6c fix(menu): 모모유통 19개 메뉴를 [사용자] 그룹 직속 자식으로 평탄화 (그룹 노드 제거)
Deploy momo-erp / deploy (push) Successful in 47s
2026-04-25 23:58:42 +09:00
chpark e8dc97a32f feat: FITO admin-panel 복원 + menu_info 에 모모유통 메뉴 19개 등록
Deploy momo-erp / deploy (push) Successful in 46s
- src/app/(main), admin, admin-panel, common, api/{admin,common,menu} 복원
- /api/auth/login: FITO 인증 다시 활성화 (plm_admin 등 FITO 사용자 로그인 가능)
- 미들웨어: 옛 경로 강제 리다이렉트 제거
- /m/layout.tsx: FITO 슈퍼관리자(isAdmin)도 ADMIN 으로 받아 모모 페이지 진입 허용
- DB 005: menu_info 에 모모유통 루트(9000000) + 자식 19개(/m/* URL 직접 연결)
  → plm_admin 로그인 후 사이드바 [모모유통] 그룹에서 클릭 시 동작
  → 메뉴 관리 UI 에서 추가/수정/삭제 가능
2026-04-25 23:47:13 +09:00
chpark e132cec4aa feat: FITO 잔재 메뉴 일괄 제거 + 권한/메뉴 관리 추가 (ERP 확장 준비)
Deploy momo-erp / deploy (push) Successful in 31s
삭제 (FITO 전용):
- src/app/(main)/* (영업관리/프로젝트/제품/구매/설계변경 등 모든 PLM 페이지)
- src/app/admin, admin-panel, common
- src/app/{approval,cost,cs,delivery,fund,inventory,order,part,part-mgmt,
  procurement-std,product,product-mgmt,production,project,purchase,
  purchase-order,sales,scm,work}
- src/app/api/{admin,approval,cost,cost-mgmt,cs,dashboard,delivery,fund,
  inventory,menu,order,part,part-mgmt,procurement-std,product,product-mgmt,
  production,project,purchase,purchase-order,sales,scm,work,common}

추가 (모모 ERP 확장 베이스):
- /m/admin/roles  + /api/m/roles/{list,save}
- /m/admin/menus + /api/m/menus/{list,save}
- DB 004: momo_roles / momo_menus / momo_role_menus + 시스템 시드
- 사이드바 [시스템] 그룹: 회원관리·권한관리·메뉴관리

기타:
- /api/auth/login 에서 FITO 인증 시도 제거 (MOMO 전용)
- 미들웨어: 옛 FITO 경로 → /m/dashboard 자동 리다이렉트

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-25 23:42:53 +09:00
chpark 0e38a6f127 feat(momo): 매입/입고/출고/정산 메뉴 분리 + secret-free 자동배포
Deploy momo-erp via webhook / deploy (push) Failing after 0s
기능:
- 매입처(vendor) 마스터 + API
- 매입 발주(procurement) 작성/목록/상세 + API
- 입고 처리(inbound): 매입발주 라인 자동 로드 또는 단독 입고
  - 정상/불량 수량 분리 입력, 정상만 재고 +, 불량 사유 기록
- 출고 관리: 상태 라벨 변경 (REQUESTED→출고요청, APPROVED→출고완료, PAID→입금완료, INVOICED→계산서발행)
- 입금 관리 페이지 (부분/전액 입금 등록 → 완납 시 자동 PAID 전환)
- 계산서 일괄 발행 페이지 (체크박스 멀티 선택)
- 일자별 매출 통계 + 막대 그래프
- 원가/마진 통계 (월간 품목별, 마진율 표시)
- 사이드바 그룹 재구성 (마스터/매입/출고-정산/통계)
- 랜딩 페이지에 5단계 업무 흐름 다이어그램 추가
- DB v2 마이그레이션: 입고 헤더/라인 + 매입발주에 정상/불량 컬럼

CI/CD:
- secret-free webhook 자동 배포로 전환 (시크릿 등록 불필요)
- /api/deploy/webhook 엔드포인트가 X-Deploy-Token 검증 후 deploy.sh 실행
- docker-compose.prod.yml에 docker.sock + 소스 마운트 (자가 배포 가능)
- workflow는 단순히 webhook curl + 헬스체크 폴링

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-25 21:37:48 +09:00
chpark 8a13e5008d merge: nextjs-main → main (모모유통 유통관리 ERP 본 브랜치 통합)
Deploy momo-erp to production / deploy (push) Failing after 4s
- 가입/로그인/랜딩/품목/재고/발주/승인/메일/엑셀 전체 기능
- DB 마이그레이션 + 시드 + CI 자동 마이그레이션
- SMTP 환경변수 (chpark@coa-soft.com)
- 배포 트리거 main 단일 브랜치 정책
2026-04-25 21:13:51 +09:00
chpark fa91c805fc feat(momo): 모모유통 유통관리 ERP 1차 구축 (가입/품목/재고/발주/명세서/메일)
- DB: momo_* 테이블 12종 (users/items/makers/warehouses/stocks/stock_moves/orders/order_items/procurements/vendors/attachments/mail_logs) + 시드
- 인증: 랜딩(/) + 회원가입(/signup, bcrypt) + 로그인(MOMO/FITO 자동 분기) + /api/auth/mobile-login(JWT 토큰)
- 세션: 쿠키 + Authorization Bearer 동시 지원 (모바일 앱용)
- /m/* 레이아웃: 좌측 사이드바 + 헤더, 역할별 메뉴 분기
- USER 화면: 품목 검색(이미지/재고/단가) + 장바구니 + 발주 요청 + 본인 이력 + 대시보드
- ADMIN 화면: 품목/창고/재고/매입입고/발주승인/회원관리/월간 매출 통계 + 대시보드(14일 그래프, 재고 부족, 승인 대기)
- 발주 승인: 트랜잭션으로 재고 차감 + 거래명세표 HTML 메일 본문 + xlsx 첨부 발송 (nodemailer)
- 면세 자동 판정: 품목명 'M' 접두 시 is_tax_free=Y, 합계는 면세/과세 분리 집계
- 미들웨어: /, /signup, /api/auth/signup, /api/auth/mobile-login 공개
- 도구: scripts/migrate-momo.mjs (npm run migrate:momo), .env.momo.example
- 문서: docs/MOMO_DISTRIBUTION_SPEC.md, docs/proposal.html (고객용 HTML 제안서)
- 별도 RN 앱(d:/momo-mobile) 스캐폴드 작성 (Expo + EAS APK 빌드)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-25 20:56:18 +09:00
chpark 082042cd6d FITO PLM 프로젝트 설정 및 소스 교체
- DB 연결: 211.115.91.141:11140/fito, postgres/intops0909!!
- 도메인: fito.wace.me
- 소스 교체 (woosung 기반)
- Dockerfile.dev 컴파일 단계 추가
- 로그인 페이지 DH Autoware 스타일 리디자인
- Constants: 회사명 (주)피토/fito, SYSTEM_TITLE FITO PLM
- 헤더 로고 FITO 로고로 변경
- 파비콘 추가
- 관리자 팝업 window.open 공백 이슈 수정

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-16 18:44:57 +09:00
chpark 3e135041ac Initial commit: ILSHIN PLM 프로젝트 소스 코드
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-16 17:49:38 +09:00