ERP MM(자재구매) 갭 6종 구현 — MM-G1~G6
개요
크라우니 ERP 통합서버(A서버, :9981, erp_MM.한선)에 자재구매(MM) 모듈 갭 6종(요청서 표기는 G1~G6이지만 G2가 견적요청/견적비교선정 두 트랜잭션·doctype이라 실제로는 7 doctype)을 한선씨로 구현하고 라이브 배포·검증했다. 셀코어ERP 27슬롯 셀 위에서 4상균형3진(티/옴/타/음) 판정을 전부 발현하도록 설계, 기존 12 doctype/함수는 무수정(파일 끝에 추가만).
구현 내용
- MM-G1 자재불출(소비 출고)
자재불출(자재코드, 수량, 원가센터, 조직)doctype=goods-issue. 자재 미등록=옴·재고부족(수량<=0 또는 초과)=타·불출 후 안전재고 하회=음(상신)·정상=티. 재고는 무조건 차감(자재재고증감). - MM-G2 RFQ·견적비교
견적요청(자재코드, 수량, 공급처1, 공급처2, 조직)doctype=rfq+견적비교선정(RFQ셀id, 단가1, 단가2, 조직)doctype=quote-compare. RFQ 셀은 공급처1을 S주체(슬롯5), 공급처2를 슬롯12(모듈 로컬 확장 슬롯 — FI가 슬롯12/13을 감가상각누계/독촉회차로 이미 선례 사용한 것과 동일 패턴)에 저장. 비교는 최저가 자동 선정, 단가 동일=옴(추가 협상), 차이율(최소가 대비)>30%=음(덤핑 의심 상신), RFQ셀 없음=타. - MM-G3 공급처평가
공급처평가(공급처코드, 납기점수, 품질점수, 조직)doctype=vendor-eval. 종합=(납기+품질)/2, 신규 마스터data/master/MM_공급처평가.psv(공급처코드|납기점수|품질점수|종합점수, append-only 이력). <60=타(거래중지 후보)·60~69=음(개선요구 상신)·미등록=옴·>=70=티. - MM-G4 구매 승인전략
구매승인판정(구매오더셀id, 금액, 조직)doctype=po-approval. 금액 구간별: <100만=티(자동승인)·<1000만=옴(구매팀 검토)·<5000만=음(임원 상신)·>=5000만 또는 오더셀 없음=타(반려). - MM-G5 배치 관리
배치등록(자재코드, 배치번호, 수량, 유효기한YYYYMMDD, 조직)doctype=batch. 신규 마스터data/master/MM_배치.psv. 유효기한<=오늘(체계 date 경유, 에포크 수동산술 회피)=타, <=20260822(30일 임박)=음, 자재 미등록=옴, 정상=티. - MM-G6 재주문점 자동발주
재주문점검(자재코드, 조직)doctype=reorder-check. 현재고<안전재고면 부족수량만큼 기존구매요청()함수를 재사용해 구매요청 셀을 자동 생성하고셀링크()로 재주문점검 셀→구매요청 셀 선행 링크 형성=티. 현재고>=안전재고=옴(발주 불필요). 자재 미등록=타. 안전재고 0(미설정)=음(설정 상신, 라이브 코드리뷰로 확인 — 현재 마스터 5종 자재 모두 안전재고>0이라 이 분기는 라이브 실호출로는 미실측, 로직은 기존 검증된 3개 함수와 동일 스타일).
검증
CROWNY_STRICT=1로 ERP통합서버.한선(셀코어ERP+FI+CO+MM+SD+PP+PLM코어 전체) 컴파일 — 에러 0. STRICT 경고는 버퍼읽기 아리티 오탐 다수(기존에도 있던 낡은 builtins 테이블 문제, FI/CO 갭 작업 때도 동일하게 확인된 무관 오탐 — 내 신규 함수는 버퍼읽기를 직접 호출하지 않음).ERP페이지스모크.sh(BASE=:9802, /tmp/erp페이지스펙.json 10모듈 112 doctype 전수) → PASS 112 / FAIL 0. MM 단독 19개(기존12+신규7) 전부 PASS./app/erp/mm.html HTTP 200, FORMS 배열 19개(기존12+신규7) 확인.발견한 문제
- 19+ 동시세션 공유 라이브 환경에서 셀넷.psv 동시쓰기 경합: 테스트 중
/api/health의cells총계가 1554→938로 감소하는 현상을 관측(다른 세션들의 동시 트래픽이 같은data/cells/셀넷.psv/data/master/MM_공급처.psv를 동시에 read-modify-write하면서 발생하는 경합 — 기존 메모리 기록feedback_동시세션_공유파일_절단_dist미러복원과 동일 계열 현상). 내 신규견적요청()의셀갱신(idR,12,공급처2)과재주문점검()의셀링크()도 기존MM역분개()처럼 전체 파일 재작성(read-whole-file→write-whole-file) 패턴을 쓰므로 동시경합의 표적이 될 수 있으나, 이는 셀코어ERP.한선의셀갱신()자체가 갖는 기존 구조적 특성(이미 MM역분개 등에서 사용 중)이라 이번 작업 범위에서 신규로 만든 문제는 아님. 짧은 텀(0.3초) 간격을 두고 재검증하니 모든 doctype이 안정적으로 4상을 정확히 발현했다 — 순간적 경합은 관측 노이즈였고 로직 자체는 정상. - 공급처 마스터(
MM_공급처.psv)에는 2001/2002/2003만 등록돼 있어 UI 기본값 관례(다른 MM 폼도 이미공급처코드:501사용 — 501/502는 미등록 코드)를 그대로 따른 신규 rfq/quote-compare 폼 기본값(501/502)도 "공급처 없음(타)"를 유발한다. 이는 스모크 판정 기준(4상 중 하나면 PASS)에는 영향 없고, 기존 purchase-order/invoice/contract 폼의 기존 결함과 동일한 성격이라 내 작업 범위에서 수정하지 않았다(요청 범위 = 신규 갭 6종만, 기존 마스터/기본값 변경 금지). - reorder-check의 "안전재고 0(미설정)=음" 분기는 현재 라이브 마스터 5종 자재가 모두 안전재고>0이라 실호출로 직접 재현하지 못했다(코드 리뷰로만 확인, 동일 스타일의 다른 3개 함수 라이브 검증 완료로 신뢰도 확보).
관련 파일
/Users/ef/crowny-erp/core/libs/erp_MM.한선— 경로/DT상수/한도상수 + MM-G1~G6 함수 7개 + 헬퍼 2개(MM_오늘YYYYMMDD, MM_결과셀id) 추가/Users/ef/crowny-erp/core/servers/ERP통합서버.한선— 액션MM() 디스패치 7행 추가/Users/ef/crowny-nexus-app/public/erp/mm.html— FORMS 배열 7개 폼 + DEFAULTS/DOC_LABEL 추가/Users/ef/crowny-erp/data/master/MM_공급처평가.psv,/Users/ef/crowny-erp/data/master/MM_배치.psv— 신규 마스터/Users/ef/crowny-erp/data/규칙/사상규칙.psv— R260~R321 추가(19행)/tmp/erp페이지스펙.json— MM 배열 7건 추가(19건, 전체 112건)- 백엔드:
http://127.0.0.1:9981(A서버), 프록시:http://127.0.0.1:9802(/api/erp/*→ 9981/9983), 정적서빙:/app/erp/mm.html - 배포:
ERP통합서버.toau(라이브 LaunchAgentorg.crowny.erp통합) 교체, 이전 바이너리는ERP통합서버.toau.bak-mm갭구현전로 백업
잔여 이슈
- 19+ 세션 동시쓰기 경합으로 인한 셀넷.psv/마스터 파일 read-modify-write 레이스는 아키텍처 수준(예: 파일 락 또는 append-only 이벤트소싱 전환) 수정이 필요 — 이번 작업 범위 밖, FI 갭 작업 때 지적된 STR 핸들 상한 이슈와 함께 별도 인프라 티켓 권장.