발주관리 (OM) — 와이어프레임

위치: 프로젝트 상세(SCR-PM-016) › [발주] 탭 하위 — 독립 영역이 아니라 프로젝트를 열고 [발주] 탭으로 들어가는 계약·발주 흐름입니다. 사이드바 📦발주관리 1차 메뉴는 전역 현황(입고·재고 SCR-OM-007)만 담습니다.

로우파이 데스크톱 와이어프레임 · 근거: DE22-1 화면설계서 §09 OM 발주관리 (SCR-OM-001~007, v1.1-r8 풀 명세) · 배치만 표현, 정본은 vault md · 관련 API 는 발주관리 37주소가 구현(as-built)됐습니다. 절단 최적화·널링 지시서·다단 승인선도 구현을 마쳤고(2026-07-27 서버 코드 대조), 견적 개정 감지 배너도 구현을 마쳤습니다(2026-08-19, IF-OM-REVISION-001). 남은 MISSING 표기는 발주서 묶음 PDF 출력·실측 반영 증감 대조입니다.

← 프로젝트 상세 ← 와이어프레임 목록
회색 박스 = 실제 UI 컴포넌트의 자리표시(placeholder)입니다. 색·브랜딩·정밀색은 표현하지 않고 레이아웃·영역 배치만 담습니다. 예시 데이터(예: "미사5중 신축공사")·필드·컬럼·상태값은 DE22-1 §09 ui-sketch 를 그대로 옮긴 것입니다. 미확정 항목은 "(미확정)" 으로 표기합니다. SCR 7종이며, SCR-OM-004 발주 생성 위저드는 5단계(?step=1~5)이므로 단계별 프레임으로 나눠 총 12 프레임으로 구성했습니다.

화면 인덱스 (12 프레임 · SCR 7종)

SCR-OM-001계약 등록·옵션 확정/projects/:projectNo/contracts/new
ES 에서 계약 지정된 견적 버전을 받아 계약 정보·옵션을 등록한다. 권한 ROLE_OM_EDITOR. FR-OM-001·002.

진입 — 프로젝트 [발주] 탭 계약 영역의 [계약 등록 →](계약이 없을 때 — #2108 ㉑). SCR-ES-001 [발주(OM)] 은 견적 버전 선택 창을 열어 SCR-OM-004 로 간다(#1751 — #2112 에서 바로잡음 · #2233 — 창은 버전만 고르고 뺄 섹션은 위저드 1단계에서 고른다)

다음 단계 — [계약 등록] 성공 → SCR-OM-002 계약 목록·상세 · [취소] → 프로젝트 [발주] 탭.

  1. 계약 번호 자동채번 표시 — CON-{YYYY}-{NNN} 형식으로 시스템이 채번할 값을 미리 보여준다.
  2. 계약 정보 입력 — 견적 참고 정보(견적 금액·유효기간)를 표시하고, 계약금액·납기일·지불조건을 입력한다.
  3. 계약금액 입력 규칙 — 계약금액은 견적 금액과 상관없이 넣는다. 견적 대비 상한과 관리자 승인은 없다(FR-OM-001, #4145).
  4. 옵션 확정 입력 — 색상(외부)·색상(내부)·유리 사양을 select로 확정한다(FR-OM-002).
  5. 옵션 확정 마감 경고 — 확정 후 변경 시 추가 비용이 발생하며, 납품 1주 전 확정 마감이다.
  6. [계약 등록] 버튼 — 저장 시 계약번호 채번 + 계약정보·옵션확정값을 저장한다. 발주 위저드 2단계(도장·색상·랩핑)에는 미리 채우지 않는다(#2652 · #3696 결정 4).
관련 API Swagger UI ↗
  • GET/api/pm/projects/{projectNo} — 브레드크럼·fgptitle에 쓰는 프로젝트 컨텍스트(프로젝트명) 조회
  • GET/api/pm/options/groups/{groupCode}/values — 색상(외부/내부)·유리 사양 select 옵션 값 목록
  • GET/api/es/estimate-lines/{lineId} — 견적 라인 조회 — 계약 등록 시 서버가 견적에서 quoteAmount 를 채운다
  • POST/api/om/projects/{projectId}/contracts — [계약 등록] 버튼 — 계약번호 자동채번(CON-YYYY-NNN)·계약정보·옵션확정 저장 (IF-OM-CONTRACT-001)
프로젝트  ›  미사5중 신축공사  ›  발주  ›  계약 등록
CMD+K 검색
🔔3
미사5중 신축공사목록으로 돌아가기
계약 등록1계약 번호 자동 채번: CON-2026-001
등록 폼 (2열)
2계약 정보
계약 지정 견적EST-2026-001 · v.3 · Rev.1
견적 금액₩ 568,463,387
견적 유효기간2026-12-11
계약금액568,463,387
납기일2026-10-30
지불 조건30/40/30
3· 계약금액은 견적 금액과 상관없이 넣는다 (FR-OM-001, #4145).
4옵션 확정 (FR-OM-002)
색상(외부)WH
색상(내부)WH
유리 사양42(6LE+SKN154II
!5색상 확정 후 변경 시 추가 비용 — 납품 1주 전 확정 마감.
액션
취소6계약 등록
· 계약 번호 자동 채번 CON-{YYYY}-{NNN}. 옵션 확정값은 발주 위저드 2단계에 미리 채우지 않는다(#2652). 계약 구분(조달/사급/입찰/수의)에 따라 산출물 양식 분기.
SCR-OM-002계약 목록·상세 (이력)/projects/:projectNo/contracts · …/:contractNo
계약 목록 + 상세(조건·옵션 확정·이력 타임라인, FR-OM-003). master-detail. 취소는 이 계약에 딸린 발주가 있으면 막는다(#2229). 권한 ROLE_OM_VIEWER 이상.

진입 — SCR-PM-016 프로젝트 상세 [발주] 탭 진입 시 계약 영역이 기본 노출

다음 단계 — 계약이 진행중이면 같은 [발주] 탭의 SCR-OM-003 [발주 만들기] 로 이어 간다(📌 #3775 — 종전 [발주 생성하기]).

  1. 계약 목록 테이블 — 계약번호·견적버전·계약금액·납기일·상태 컬럼. 행 클릭 시 우측 상세 패널이 갱신된다.
  2. 선택 행(강조) — 클릭한 계약(CON-2026-001)이 회색조로 강조 표시된다.
  3. 계약 상태 전이 규칙 — 신규→진행중→완공→취소 순으로 전이한다. 이 계약에 딸린 발주(이 계약의 견적 버전으로 낸, 취소하지 않은 발주)가 있으면 [계약 취소] 를 잠그고 「이 계약에 딸린 발주가 있어 계약을 취소할 수 없습니다.」를 보인다. 같은 프로젝트라도 다른 견적 버전의 발주는 세지 않는다(#2229).
  4. 계약 상세 패널 — 견적 버전·회차(v.3 · Rev.1, #2961 — ⏳ 서버·화면 반영 전)·지불 조건·옵션 확정·계약 확정일을 kv로 보여준다. 목록 「견적 버전」 칸과 등록 화면 「계약 지정 견적」 줄도 버전과 회차를 함께 적는다.
  5. 이력 타임라인 — 변경일·변경자·내용을 시간순으로 나열한다.
관련 API Swagger UI ↗
  • GET/api/pm/projects/{projectNo} — 프로젝트 컨텍스트 조회
  • GET/api/om/projects/{projectId}/contracts — 계약 목록(번호·견적버전·금액·납기·상태) 조회 (IF-OM-CONTRACT-001)
  • GET/api/om/contracts/{contractId} — 우측 상세 패널(조건·옵션 확정·확정일) 조회
  • GET/api/om/contracts/{contractId}/history — 이력 타임라인(변경일·변경자·내용) 조회
  • GET/api/om/purchase-orders?estimateId={계약의 estimateId} — 이 계약에 딸린 발주 수(total). 0 보다 크면 [계약 취소] 를 잠근다 (IF-OM-ORDER-001, #2229)
  • POST/api/om/contracts/{contractId}/cancel — 계약 취소(ROLE_ADMIN·사유 필수) — 이 계약에 딸린 발주가 있으면 409 CONTRACT_HAS_ORDERS 가드 (IF-OM-CONTRACT-002)
프로젝트  ›  미사5중 신축공사  ›  발주  ›  계약
CMD+K 검색
🔔3
미사5중 신축공사목록으로 돌아가기
계약
1계약 목록 테이블
계약 번호견적 버전계약금액납기일상태
2CON-2026-001v.3 · Rev.1₩ 568,463,3872026-10-30진행중
CON-2025-042v.1 · Rev.1₩ 363,378,6732026-03-15완공
3· 계약 상태 전이: 신규 → 진행중 → 완공 → 취소. 견적 워크플로의 [계약] 지정과 1:1 연결.
상세 · 이력
4CON-2026-001 상세
견적 버전v.3 · Rev.1
지불 조건계약금 30 / 기성 40 / 잔금 30
옵션 확정WH/WH · 42(6LE+SKN154II
계약 확정일2025-05-14
5이력 타임라인
일시변경자내용
2025-05-14성윤정계약 등록 (신규 → 진행중)
2025-05-20성윤정유리 사양 변경 확정
SCR-OM-003발주 목록 (프로젝트)/projects/:projectNo/orders
프로젝트 발주 회차 목록. SCR-PM-016 프로젝트 상세 [발주] 탭 진입. FR-OM-010. 권한 ROLE_OM_VIEWER 이상 / 생성 ROLE_OM_EDITOR.

다음 단계 — [발주 만들기] → 「무엇으로 발주하나요?」 선택 창 → 묶음 발주(SCR-OM-004 1단계 묶음 고르기) · 일반 발주(견적 버전 선택 창 f4 → SCR-OM-004) · 선발주(f4 선발주 갈래 → SCR-OM-004 ?advance=1) · 추가·보정(SCR-OM-006) (📌 #3775 — 종전 [발주 생성하기] · [선발주 만들기] · [추가·보정 발주 →] 셋을 합쳤다, ✅ 화면 반영 f9fa4783(#1402)) · 조회 역할은 [자재 대조 보기 →] → SCR-OM-006 · 발주 행 → SCR-OM-005.

  1. 개정 경고 배너 — 기준 견적이 개정(Rev.N→N+1)되고 다시 따져 봐야 하는 발주가 1건 이상일 때만 조건부로 노출되는 영향 확인 경고다(§4.8). 경고 안의 발주 줄을 누르면 발주 상세(SCR-OM-005)로 간다.
  2. [발주 만들기] 버튼 (📌 #3775 · ✅ 화면 반영 f9fa4783(#1402)) — 발주를 만드는 문은 이것 하나다. 누르면 「무엇으로 발주하나요?」 선택 창(⑥)이 뜬다. 만들기 역할에게만 보이고, 계약이 「진행중」·「완공」 이 아니면 잠근다(#2905). 조회 역할에게는 그 자리에 [자재 대조 보기 →](SCR-OM-006)가 선다. 종전 [발주 생성하기] 는 견적 버전 선택 모달(f4)로 바로 이어졌다.
  3. 발주 회차 목록 테이블 — 발주번호·구분·회차·묶음·금액·상태·발주일·발주서를 줄마다 보여준다. 회차는 「N회」로 적는다 — 「N차」는 묶음 칸의 제작 묶음 차수에만 쓴다(📌 #3775 · #3611 용어 표).
  4. 상태 배지 — 발주확정(🔒 잠금)·승인 대기 등 회차별 진행 상태를 표시한다.
  5. 확정 발주 개정 안내 — 다시 따져 봐야 하는 발주가 없고 확정된 발주만 개정 전 기준 위에 남았을 때 개정 경고 대신 노출되는 안내다(§4.8). 손쓸 것이 없는 알림이라 붉은 경고를 쓰지 않는다. 개정 경고와 함께 뜨지 않는다.
  6. 「무엇으로 발주하나요?」 선택 창 (📌 #3775 · ✅ 화면 반영 f9fa4783(#1402) — 종전 [선발주 만들기] 버튼 자리) — 새 흐름(묶음 목록 newFlow)이면 묶음 발주 · 선발주 · 추가·보정, 아니면 일반 발주 · 선발주 · 추가·보정 세 줄이다. 골라 두는 줄은 차례대로 ① 승인됐고 발주에 안 든 묶음이 있으면 묶음 발주 ② 누적 대조에 부족 자재가 있으면 추가·보정 ③ 나머지 새 흐름은 선발주 ④ 새 흐름에 들지 않으면 일반 발주다. 고를 묶음이 없으면 묶음 발주 줄을 잠그고 까닭을 적는다. 정본 DE22-1 §09 §3.3 #3775 상자 · §4.4 「들어가는 문」 상자. ⓘ 선발주 줄(종전 [선발주 만들기], #3588) — 계약이 진행중이면 언제든 계약 견적의 확정 라인으로 자재를 예측해 산다(오차 감수, 횟수 제한 없음). 누르면 OM-004 를 선발주 모드로 연다 — 1단계가 묶음 고르기 대신 계약 견적의 섹션 고르기(#2233 모양)로 서고 요청에 advance: true 를 싣는다. 선발주는 작업지시를 만들지 않는다. 진입은 현장담당 승인 묶음이 없어도 열린다 — 작업지시를 여는 관문은 그대로 현장담당이 승인한 제작지시서다.
  7. 「구분」 칸 (📌 #3775 · ✅ 화면 반영 f9fa4783(#1402) — 종전 「선발주 N차」·「추가·보정 N차」 배지) — 늘 보인다. advanceRound > 0 이면 「선발주 · N번째」, additionalRound > 0 이면 「추가·보정 · N번째」, batchIds 가 있으면 「묶음 발주」, 그 밖은 「일반」이다. 취소한 발주는 선발주 · 추가·보정만 가르고 나머지는 「—」다. 서버 칸을 더하지 않고 화면이 세 칸으로 가른다. 예측으로 산 양(선발주)과 모자라서 더 산 양(추가·보정)을 따로 읽게 하는 #3588 의 뜻은 그대로다.
  8. 「최종 발주 마무리」 머리 배지 (#3588 · ⏳ 화면 반영 전) — 자재 누적 대조의 finalOrderStatus 가 COMPLETE 일 때다 — 계약 부호가 모두 묶음에 들고, 묶음이 모두 발주되고, 발주가 모두 승인되고, 부족 자재가 없다. 남은 선발주(과발주)는 양만 보인다. 서버가 셈해 보이기만 하고 아무 동작도 막지 않는다. 새 흐름에 들지 않은 프로젝트(NOT_APPLICABLE)는 배지를 두지 않는다.
관련 API Swagger UI ↗
  • GET/api/pm/projects/{projectNo} — 프로젝트 컨텍스트 조회
  • GET/api/om/purchase-orders?projectId={id}&status=&orderType=&orderRound=&page=&size= — 발주 회차 목록(발주 기준 설계·회차·금액·상태·발주일) 조회 (IF-OM-ORDER-001)
  • MISSINGGET /api/om/purchase-orders/{purchaseOrderId}/export?format=xlsx|pdf — 발주서 받기 — 실물 문서 형태별 서식 넷(원자재·부자재·임가공·널링) xlsx 기본, 파일이 여럿이면 zip, PDF 는 사본 — IF-OM-ORDER-001 §5.6.4 (#2305). 묶음(ids)은 그 절 규약을 따른다
  • GET/api/om/projects/{projectId}/revision-alert — 기준 견적 개정(Rev.N→N+1) 감지 배너 (IF-OM-REVISION-001 §5.6.7)
  • GET(위 발주 회차 목록 응답) advanceRound · additionalRound · batchIds — 「구분」 칸 글 (📌 #3775 — 서버 칸 더하지 않음 · ✅ 화면 반영 f9fa4783(#1402))
  • GET/api/fs/projects/{projectId}/batches — 선택 창이 새 흐름(newFlow)과 고를 묶음(status = APPROVED · inLivePurchaseOrder = false)을 읽는다 (§5.4.38, 📌 #3775 · ✅ 화면 반영 f9fa4783(#1402))
  • GET/api/om/projects/{projectId}/material-balance — 자재 누적 대조의 finalOrderStatus(NOT_APPLICABLE·IN_PROGRESS·SHORTAGE·COMPLETE)와 conditions — 머리 「최종 발주 마무리」 배지 (IF-OM-REQ-001 · DE24-1 §5.8.13, #3588 — ✅ 서버 반영 #3591 · ⏳ 화면 반영 전)
  • POST/api/om/purchase-orders 요청 advance: true — 선택 창 「계약 견적으로 미리 — 선발주」(종전 [선발주 만들기])로 연 위저드가 낸다. 지정된 계약 견적이 아니면 409 ADVANCE_ORDER_NOT_CONTRACT_ESTIMATE, supplement·batchIds[] 와 함께 오면 400 (IF-OM-ORDER-001 §5.6.1, #3588)
프로젝트  ›  미사5중 신축공사  ›  발주  ›  발주 목록
CMD+K 검색
🔔3
미사5중 신축공사목록으로 돌아가기
!1기준 견적이 개정되었습니다 (Rev.N → Rev.N+1) — 발주 영향 확인 필요 (§4.8, 다시 따져 봐야 하는 발주가 있을 때만 노출).
i5확정된 발주 N건이 개정 전 기준 위에 있습니다 (현재 Rev.M) — 이미 확정돼 되돌릴 수 없어 다시 따져 볼 발주는 없습니다. 그 차이는 보정 발주 회차에서 처리합니다 (§4.8, 위 개정 경고와 함께 뜨지 않는다).
액션 바
8최종 발주 마무리2발주 만들기
3발주 회차 목록 테이블
발주번호7구분회차묶음금액 정산 합계 / 중량상태발주일발주서
PO-2026-099-01선발주 · 1번째1회—₩ 21,300,000승인2026-10-20발주서 받기 ↓
PO-2026-099-02묶음 발주2회1차 · 101동₩ 9,655,6804발주확정 🔒2026-10-21발주서 받기 ↓
PO-2026-099-03추가·보정 · 1번째3회—₩ 1,240,000승인 대기——
PO-2026-098-01일반1회—₩ 4,120,000승인2026-09-30발주서 받기 ↓
6[발주 만들기] 를 누르면 — 「무엇으로 발주하나요?」 선택 창 (새 흐름 프로젝트 · 승인된 묶음 있음)
무엇으로 발주하나요?설명
◉승인된 제작 묶음으로 — 묶음 발주현장담당이 제작지시서를 승인한 묶음을 담아 삽니다. 선발주로 산 양은 빼고 셉니다.
○계약 견적으로 미리 — 선발주계약 견적으로 자재를 미리 삽니다. 작업지시는 서지 않습니다.
○모자란 자재만 — 추가·보정실측·제조 뒤 모자란 자재만 더 삽니다.
닫기다음
· 📌 #3775 (✅ 화면 반영 f9fa4783(#1402)) — 문은 [발주 만들기] 하나 · 「구분」 칸 · 회차 「N회」 · 이름은 「묶음 발주」(「정발주」·「본발주」 쓰지 않음) · SCR-OM-006 은 화면으로 남긴다. 새 흐름에 들지 않은 프로젝트의 창은 첫 줄이 「견적 버전으로 — 일반 발주」(→ f4)다. · 회차 = 그 프로젝트 안에서 발주가 선 차례(선발주·묶음 발주·보정을 함께 센다). [발주서 받기] = 실물 문서 형태별 발주서 묶음 다운로드(xlsx 기본 · PDF 사본, #2305). 발송 후 잠금(order-locked). · #3588 — 머리 「최종 발주 마무리」 배지(선발주 진입·배지는 위 #3775 로 갈음). 흐름은 ① 선발주 → ② 묶음 발주(OM-004 1단계 승인된 묶음 고르기) → ③ 부족분 추가 발주(OM-006 [자재 누적 대조] → [차이분 발주 생성 (새 회차)]) → ④ 최종 발주 마무리. 셋 다 작업지시를 만들지 않는다. 정본 DE24-1 §5.8.13 「선발주 · 묶음 발주 · 부족분 추가 발주 · 최종 발주 마무리」.
단추 (#3775 — 정본 「이탈」 행)발주 만들기자리: [발주] 탭 머리 — 편집 역할자재 대조 보기 →자리: 같은 곳 — 조회 역할 (종전 [추가·보정 발주 →])
SCR-OM-003견적 버전 선택 · 모달[발주 만들기] 창 「일반 발주」·「선발주」 → 모달
발주 기준 견적 버전을 선택한다. 계약 버전 기본 선택, 비계약 버전은 시뮬레이션 모드(저장·승인·발주확정 차단)로 표기. 버전을 고르면 OM-004 위저드로 진입하고, 뺄 섹션은 위저드 1단계 「발주할 섹션」 칸에서 고른다(#2233 — 발주 한 건 = 견적 버전 전체 − 뺀 섹션). 종전 화면(as-built #1751)은 버전 뒤에 확정 라인 하나를 이어서 골랐다 — #2233 이 그 칸을 걷는다.

진입 — SCR-OM-003 발주 목록 [발주 만들기] → 선택 창의 「견적 버전으로 — 일반 발주」 또는 「계약 견적으로 미리 — 선발주」 (📌 #3775 — 종전 [발주 생성하기] · [선발주 만들기] 버튼)

다음 단계 — [발주 생성 시작] → SCR-OM-004 · 견적 버전이 0건이면 [견적 탭으로 →] → SCR-ES-001 (#2106 ⑳) · 확정 라인 0건 안내와 [견적 상세로 →] 는 위저드 1단계 섹션 칸으로 옮긴다 (#2233).

  1. 모달 헤더 — "발주 기준 견적 버전 선택".
  2. 계약 버전 라디오(기본 선택) — v.3, RESOLVED_BOM 기준 정식 발주로 진행된다.
  3. 비계약 버전 라디오 — 선택 시 "시뮬레이션" 뱃지가 붙는다.
  4. 시뮬레이션 모드 안내 — 비계약 버전 선택 시 위저드 5단계 산출까지는 가능하나 저장·승인·발주확정은 차단된다(ISS-0354 옵션 A).
  5. 섹션 안내(#2233 — 종전 확정 라인 라디오 자리) — 「뺄 섹션은 다음 화면(1단계)에서 고릅니다」를 한 줄 적는다. 종전(as-built #1751)에는 여기서 확정 라인 하나를 골랐다. 발주 한 건이 견적 버전 전체를 받게 되어(#2233) 라인 칸을 걷는다.
  6. [위저드 열기] 버튼 — 버전을 고르면 눌리며, 그 견적 버전으로 발주 생성 위저드(OM-004)에 진입한다(#2233).
관련 API Swagger UI ↗
  • GET/api/es/projects/{projectId}/estimates — 프로젝트의 견적 버전 목록과 계약·비계약 구분 조회
  • GET/api/es/estimate-lines?estimateId={id} — (#2233 뒤 이 창은 부르지 않는다) 섹션·라인 목록은 1단계가 /api/om/estimates/{estimateId}/material-requirements 로 받는다
모달 (dim 배경 위)
새 단추 (#2112 — 정본 「이탈」 행)견적 상세로 →자리: #2233 뒤 1단계 섹션 칸 — 고를 섹션 0건견적 탭으로 →자리: 견적 버전 0건 안내 안
SCR-OM-004발주 생성 위저드 · 1단계 발주 섹션·자재 선택/projects/:projectNo/orders/new?step=1
견적 버전의 섹션을 늘어놓고 뺄 섹션을 고른다. 담은 섹션들의 발주 자재 소요를 자재 표 한 줄씩 합쳐 보이고(#3580 — 종전 품번 카드), 부분 선택 + 수량 조정으로 선발주·분할 발주를 정의한다. 발주 한 건 = 견적 버전 전체 − 뺀 섹션(#2233 — 종전 「견적 라인 하나」 #2112 결정 4 는 뒤집혔다). 입력 = IF-OM-REQ-001 버전 단위 조회(서버가 부모 수량·대수·합치기·손실률을 셈하고 출처를 싣는다). 권한 ROLE_OM_EDITOR.

진입 — 견적 버전 선택 창 [발주 생성 시작] (SCR-OM-003 [발주 만들기] 창 — 종전 [발주 생성하기], 📌 #3775 · SCR-ES-001 [발주(OM)] · SCR-ES-003 [발주 만들기 →]) / SCR-OM-005 [같은 견적의 남은 섹션 발주 →] — 그 견적 버전으로 바로 연다 (#2233) / SCR-OM-006 [차이분 발주 생성(새 회차)] 버튼 재진입 / SCR-OM-005 [이어서 작성] — 작성중 발주를 그 값으로 채워 연다 (#2214) / SCR-OM-003 [발주 만들기] 창 「계약 견적으로 미리 — 선발주」(종전 [선발주 만들기], 📌 #3775) — 아래 섹션 고르기 화면이 선발주 모드로 선다 (#3588 · ✅ 화면 반영 f9fa4783(#1402)). 새 흐름 프로젝트에서 묶음 발주로 열면 1단계는 아래 둘째 그림 「승인된 제작 묶음 고르기」다 (#3053 · ✅ 화면 반영 #3058)

다음 단계 — [다음] → 2단계 · 라인이 확정 안 된 섹션은 잠그고 그 줄에 [견적 라인 확정 화면으로 →] → SCR-ES-005, 고를 섹션이 없으면 [견적 상세로 →] → SCR-ES-003 (#2233), 진입값이 없으면 [발주 목록으로] · 위저드를 떠나는 단추는 저장 안 한 입력이 있으면 확인창 먼저 · 다른 도메인으로 가는 단추는 모두 새 창 (#2112 결정 4·5 · #2106 ⑫⑯⑲).

  1. 위저드 스텝퍼 — 5단계(발주 자재 선택→도장·색상·랩핑→장바 절단→거래처별 발주→재고 사용) 중 1단계가 활성이다.
  2. 선택 카운터 — 현재 선택된 품번 수를 실시간으로 표시한다. 찾기 칸 옆에는 「{전체}개 중 {보이는}개」를 따로 적는다 (#3580).
  3. [전체 선택]/[선택 해제] 버튼 — 자재 표의 줄 전부를 한꺼번에 고르거나 푼다. 📌 #3891 결정 (2026-10-23 · ⏳ 화면 반영 전) — 찾기 칸이나 구분 단추로 거른 때는 보이는 줄에만 걸고 이름을 「보이는 {N}개 선택」·「보이는 {M}개 해제」로 바꾼다(N = 보이는 줄 가운데 고를 수 있는 줄, M = 보이는 줄 가운데 골라 둔 줄). 숨은 줄의 선택은 그대로 둔다. 선발주로 다 채운 잠긴 줄은 어느 경우에도 담기지 않는다. 거른 때 숨은 줄 가운데 골라 둔 것이 있으면 「총 N개 선택됨」 뒤에 「· 숨은 줄 {K}개 포함」을 붙인다. 찾기로 걸러져 숨은 줄까지 모두에 건다 (#3580). 정본은 DE22-1 §09 §4.4 「📌 결정 #3891」 상자다.
  4. 자재 표 (#3580 결정 2026-10-20 · ✅ 화면 반영 a0cfd6ff(#1362) · 한 줄 높이 보완 1bfe4dcc(#1370)) — 카드 대신 표 한 줄에 자재 하나를 둔다. 줄은 한 줄 높이(36px)이고, 알림이 있는 줄만 키가 커진다. 칸은 일곱이다 — 선택(체크 칸, 덮인 자재는 잠금) · 자재(이름 한 줄로 접는다, 전체는 마우스를 올리면 보인다, 누르면 체크 — DE22-1 §00 §4.4 「이름 칸은 두 줄까지」의 예외) · 코드(자재 코드 · 공급 구분) · 필요량(한 줄에 「44.7 EA (합친 41 · 손실 5%)」, 전체 문장 「합친 수량 41 EA · 손실률 5% 반영」은 마우스를 올리면 보인다, 손실률이 없으면 괄호 없음) · 출처(한 줄에 「2곳 · SEC-A 12대 · …」, 한 곳이면 출처 줄만, 없으면 「—」, 전체는 마우스를 올리면 보인다. 출처 목록이 없는 옛 응답에서 두 곳 이상이면 「N곳에서 합쳤습니다」만) · 알림(계산할 수 없는 곳 · 기본 산식 · 선발주 남음 · 누적 부족을 접지 않고 다 보인다, 없으면 「—」) · 발주 수량(숫자 입력과 단위, 고르지 않으면 꺼진다). 형재 줄은 발주 수량 칸에 「필요 조각 수 [입력] 단위 + 3단계 안내」를 한 줄로 적고, 안내 전체(「발주 본수는 3단계 절단 결과로 정해집니다.」)는 마우스를 올리면 보인다. 줄 차례는 자재 코드 차례다. 계산할 수 없는 곳이 있는 줄은 노란 배경이다. 머리 줄은 표 안에서 굴려도 붙어 있고, 표 높이는 화면의 70% 까지다. 재고 · 거래처 칸은 1단계 자료에 없어 두지 않는다. 까닭은 카드 52장이 화면 4.9장을 차지했고 카드 높이가 제각각이었으며 찾기 칸이 없고 수량 칸까지 Tab 을 두 번 눌러야 했기 때문이다. 담은 섹션들의 발주 자재 소요를 품번마다 카드 한 장으로 합쳐 보이고, 카드마다 섹션별 출처 줄(5AW 36대 · 144)을 적는다(#2233 — 섹션마다 대수가 달라 「몇 대분」 뱃지 대신이다). 종전 화면은 고른 견적 라인 하나의 소요였다(#2112). 수량 초깃값은 서버가 준 실제 필요량(requiredQty)을 정수로 올린 값이고, 체크와 수량 입력으로 부분 선택·수량 조정을 한다. 옛 화면(ASIS)의 「섹션 카드」는 #865·#2112 로 지금 모습이 되었다.
  5. [다음] 버튼 — 2단계(도장·색상·랩핑)로 이동한다.
  6. 발주할 섹션 칸(#2233) — 견적 버전의 섹션을 한 줄씩(담기·부호·대수·든 제품·든 발주) 보인다. 기본은 모두 담고, 살아 있는 발주에 이미 든 섹션은 발주번호·유형·상태를 적고 빼 둔 채 연다(다시 담을 수 있다). 라인이 하나라도 확정 안 된 섹션은 잠근다 — 섹션은 통째로 담는다. 섹션을 빼거나 담으면 품번 카드를 다시 부른다.
  7. 선발주 모드 (#3588 · ⏳ 화면 반영 전) — SCR-OM-003 [발주 만들기] 창의 「계약 견적으로 미리 — 선발주」(종전 [선발주 만들기], 📌 #3775)로 열면 1단계가 묶음 고르기 대신 계약 견적의 섹션 고르기(위 그림, #2233 모양)로 서고 요청에 advance: true 를 싣는다. 수량은 발주 담당이 예측해 정한다 — 대수를 줄이거나 자재를 빼도 된다(오차 감수). 묶음 없이 내고, 승인해도 작업지시를 만들지 않는다.
  8. 승인된 제작 묶음 고르기 (#3053 · ✅ 서버 반영 #3056 · ✅ 화면 반영 #3058) — 새 흐름 프로젝트(응답 머리 newFlow·poGateActive)의 묶음 발주는 섹션 고르기 자리에 승인된 묶음 표(차수·이름·부호별 수량·개소·승인한 현장담당·승인 시각)를 둔다. 여러 묶음을 한 발주에 담을 수 있다. 이미 살아 있는 발주에 든 묶음(inLivePurchaseOrder)은 「(이미 발주에 담김)」을 붙여 보이되 고를 수 없다. 섹션을 빼는 칸은 없다 — 범위는 차수(실측한 개소를 서버가 세운 묶음, 📌 #3704)로 이미 정해졌다(현장담당이 묶음으로 이미 정했다 ⛔ 뒤집힘 #3704). 소요는 고른 묶음의 제작용 사본 확정 행으로 셈한다(실측 반영). 저장 요청은 batchIds[] 를 싣고 견적 라인 칸을 비운다. 승인된 묶음이 없으면 「현장담당이 승인한 제작 묶음이 없습니다. 현장 관리 화면에서 진행을 확인하세요.」를 보인다.
  9. 자재 이름·코드 찾기 칸 (#3580 · ✅ 화면 반영) — 자재 표 위에 둔다. 친 글자가 자재 이름이나 코드에 든 줄만 보인다(대소문자와 앞뒤 빈칸은 따지지 않는다). 고른 상태와 입력한 수량은 거르기와 상관없이 남는다. 칸 옆에 「{전체}개 중 {보이는}개」를 적는다. 맞는 줄이 없으면 「「{글자}」에 맞는 자재가 없습니다.」와 「자재 이름이나 코드를 다시 확인해 주세요. 고른 자재와 입력한 수량은 그대로 남아 있습니다.」를 보인다. 찾는 글자는 단계를 옮기면 비워진다. 이 표와 찾기 칸은 묶음 발주(아래 둘째 그림)의 1단계 자재 고르기에도 같다.
  10. 수량 칸 Enter (#3580 · ✅ 화면 반영 1bfe4dcc(#1370)) — 수량 칸에서 Enter 를 누르면 찾기로 거른 뒤 보이는 줄 가운데 아래쪽의 고른 줄 수량 칸으로 간다. Shift+Enter 는 위로 간다. 안 고른 줄과 숨은 줄은 건너뛰고, 끝 줄이면 그대로 머문다. 체크 칸은 Tab 차례에 남는다(접근성).
  11. 「전체 · 원자재 · 부자재」 거르기 단추 (#3870 · ✅ 화면 반영 380e7dcf · ✅ 서버 응답 칸 반영 7c636b83(#3876)) — 찾기 칸 바로 옆의 세 칸 고르기 단추다. 처음에는 「전체」가 골라져 있다. 칸마다 그 칸을 누르면 보일 줄 수를 적는다(찾는 글자를 반영한 수). 찾기 칸과 함께 걸려 두 조건을 모두 만족하는 줄만 보인다. 가르는 값은 자재 마스터의 자재 구분이고, 발주 자재 소요 응답 줄의 materialKind(RAW·SUB)로 받는다. 구분이 빈 자재는 「전체」에만 보인다. 응답에 이 칸이 없으면 「원자재」·「부자재」 칸을 끄고 「자재 구분을 받지 못해 원자재·부자재로 거를 수 없습니다.」를 적는다. 고른 상태·입력 수량은 바뀌지 않는다. [전체 선택]/[선택 해제]는 거른 때 보이는 줄에만 건다(#3891 — 위 [전체 선택]/[선택 해제] 줄). 고른 칸은 단계를 옮기면 「전체」로 돌아간다. 정본은 DE22-1 §09 §4.4 「📌 결정 #3870」 상자다.
  12. 부호 그림 (#4166 · #4167 · FR-ES-025 · ⏳ 서버 · 화면 반영 전) — 「발주할 섹션」 칸 줄마다 부호 글자 왼쪽에 작은 칸 40 px. 섹션을 빼거나 담는 판단을 하는 유일한 자리라서 어떤 창인지 모양으로 본다. 마우스를 올리면 240 px 미리보기가 뜬다. 칸이 없는 섹션은 같은 크기 빈 자리에 「그림 없음」 이다. 발주 역할은 견적 주소를 부르지 않는다(#2894) — 그림은 발주 쪽 응답으로 받는다. 이 자리 정본은 09_OM §4.4 설계 주석 2 다. 크기 · 상태 문구 · 56 px 이하 줄여 그리기 · 꼬리표 규칙은 DE22-1 §00 §10 이 정본이다.
관련 API Swagger UI ↗
  • GET/api/pm/projects/{projectNo} — 프로젝트 컨텍스트 조회
  • GET/api/om/estimates/{estimateId}/material-requirements?estimateLineIds=… — 견적 버전의 섹션 목록과 담은 섹션들의 합친 소요·출처(IF-OM-REQ-001 버전 단위 조회, #2233 — 서버 반영 전)
  • GET/api/om/purchase-orders?estimateId={id} — 섹션마다 「든 발주」를 가린다(응답 estimateLines[], #2233)
  • GET/api/om/estimate-lines/{estimateLineId}/material-requirements — 지금 화면(as-built)이 부르는 라인 하나의 소요. #2233 뒤에도 주소는 남는다
  • POST/api/om/purchase-orders — 발주(회차) 작성중(DRAFT) 생성. 위저드 단계값은 화면(클라이언트)에서 조립해 완료 시 라인 묶음으로 함께 전송 (IF-OM-ORDER-001 — 단계별 저장 주소 없음)
  • POST/api/om/purchase-orders 요청 advance: true — 선발주 모드 저장. 계약 견적(지정된 CONTRACTED 원본)의 확정 라인만 받는다 — 아니면 409 ADVANCE_ORDER_NOT_CONTRACT_ESTIMATE (§5.6.1 · §5.8.13, #3588 — ✅ 서버 반영 #3591 · ⏳ 화면 반영 전)
  • GET/api/fs/projects/{projectId}/batches?status= — 승인된 묶음 표. 응답 머리 newFlow·poGateActive, 줄마다 approvedBy·approvedAt·inLivePurchaseOrder (IF-MF-BATCH-001 §5.8.13, #3234)
  • GET/api/mf/batches/{batchId}/revisions · /{revNo} — 고른 묶음의 승인된 제작지시서 버전에서 사본 라인과 대수를 얻는다 (#3234 ①)
  • POST/api/om/purchase-orders 요청 batchIds[] — 묶음 발주 저장, 견적 라인 칸은 비운다. 409 BATCH_NOT_APPROVED·BATCH_ALREADY_ORDERED, 서로 다른 계약 견적의 묶음은 400 (§5.6.1)
  • GET/api/om/estimates/{estimateId}/material-requirements — 발주 자재 소요 버전 단위 조회(IF-OM-REQ-001 §5.6.8) sections[] 의 부호 그림 칸 cropPictureUrl(그림 주소 — 읽을 때마다 서버가 한 시간짜리를 새로 발급, 화면이 오래 들고 있지 않는다) · cropPictureStatus(그림 상태 PENDING · RENDERED · SKIPPED · FAILED, null 은 SKIPPED 로 읽는다). 발주 역할은 견적 주소를 부르지 않으므로 이 응답으로 받는다(#2894). DE24-1 §5.4.13 「부호 그림 칸」(#4168) · ⏳ 서버 반영 전 #4171
프로젝트  ›  미사5중 신축공사  ›  발주  ›  발주 생성
CMD+K 검색
🔔3
미사5중 신축공사목록으로 돌아가기
‹ 견적 v.1 발주7이 그림 = 지금 흐름 프로젝트의 발주 · [선발주 만들기]로 연 선발주 모드(계약 견적, advance: true) — 화면 문구는 정본에 없다 (#3588, ⏳ 화면 반영 전)
1위저드 스텝퍼
1발주 자재 선택 2도장·색상·랩핑 3장바 절단 4거래처별 발주 5재고 사용
6발주할 섹션 칸 (#2233)
발주할 섹션 — 견적 v.1 · 2곳 담음 · 1곳 빼 둠 · 1곳 잠김섹션 전체 담기
담기섹션대수든 제품든 발주
☐121AW72대DHS-AE225-U 미서기PO-2026-026-03 형재 · 승인 (빼 둠)
☑5AW36대DHS-AE225-U 미서기—
☑3AW4대DHS-AE225-U 미서기—
🔒AD011대라인 1건 확정 전[견적 라인 확정 화면으로 →]
자재 선택 툴바 — 찾기 칸 (#3580) · 원자재·부자재 거르기 단추 (#3870)
발주 자재 선택 — 담은 섹션 2곳 합계2총 2개 선택됨3전체 선택선택 해제
9자재 이름·코드 찾기11전체 4원자재 2부자재 24개 중 4개
4자재 표 (일곱 칸 · 한 줄 높이 · 자재 코드 차례 · 머리 줄 고정 · 표 높이 화면의 70% 까지 — #3580)
선택자재코드필요량출처알림발주 수량
☐풍지판02-0077 · 부자재80 EA2곳 · 5AW 36대 72 · …—80 EA (꺼짐)
☐크리센트HDW-LCK-001 · 부자재40 EA2곳 · 5AW 36대 36 · …—40 EA (꺼짐)
☑후렘-외부 AUNI-A225-101A · 형재160 EA (합친 152 · 손실 5%)2곳 · 5AW 36대 144 · …계산할 수 없는 곳 1건필요 조각 수 160 EA · 본수는 3단계
☑문짝바UNI-A225-401A · 형재320 EA2곳 · 5AW 36대 288 · …기본 산식으로 계산한 곳 2건필요 조각 수 320 EA · 본수는 3단계
ⓘ찾는 글자에 맞는 줄이 없을 때 — 「「{글자}」에 맞는 자재가 없습니다.」 · 「자재 이름이나 코드를 다시 확인해 주세요. 고른 자재와 입력한 수량은 그대로 남아 있습니다.」
스텝 액션
5다음 — 도장·색상·랩핑
· 발주 한 건 = 견적 버전 전체 − 뺀 섹션(#2233 — 서버·화면 반영 전). 섹션은 통째로 담고 대수를 쪼개지 않는다. 1AW 줄은 옛 라인 한 칸 발주(PO-2026-026-03)가 담은 라인으로 옮겨 담겨 「든 발주」로 뜨는 모습이다. · 부분 선택 + 수량 조정 = 선발주·분할 발주의 메커니즘. 비계약 버전 선택 시 상단 시뮬레이션 배너 노출(§4.3). · #3580 뒤에는 카드가 아니라 자재 표다 — 노란 줄은 계산할 수 없는 곳이 있는 줄이다. 아래 카드 서술은 그 앞 모습이다. · (지금 화면 as-built) 카드 머리의 「몇 대분」 뱃지는 unitQty 가 1 보다 클 때만 선다 — 한 대분이면 적지 않는다. #2233 뒤에는 섹션별 출처 줄이 그 자리를 맡는다. 길이가 없어 셀 수 없는 줄은 카드 바탕을 옅은 경고색으로 두고 까닭과 할 일을 한 줄 적는다 — 「절단 길이가 없어 수량을 계산할 수 없습니다. 발주 수량을 직접 채워 주세요」. 값을 0 으로 그리지 않는다 (#2150 as-built · 정본 DE22-1 §09 §4.4 1단계). · 기본 산식으로 센 자리가 있는 길이·면적 단위 줄은 바탕색을 바꾸지 않고 한 줄 알림을 단다 — 「기본 산식으로 센 자리 N건 — 절단 산식이 아직 확인 전 기본값입니다. 길이를 확인해 주세요」. 발주를 막지 않는다 (#2231 결정 · 서버·화면 반영 전).
8새 흐름 프로젝트의 묶음 발주 — 1단계 「승인된 제작 묶음 고르기」 (#3053 · ✅ 서버 반영 #3056 · ✅ 화면 반영 #3058 · fe 9109f61 #3356)
1발주 자재 선택 2도장·색상·랩핑 3장바 절단 4거래처별 발주 5재고 사용
승인된 묶음 표 — 프로젝트 묶음 목록에서 APPROVED 만 · 여러 개 고를 수 있다
담기차수이름부호별 수량개소승인한 현장담당승인 시각
☑1차101동 저층부AW1 30 · AW3 1242박현장2026-10-16 15:20
☑2차101동 고층부AW1 4040박현장2026-10-17 10:05
—3차102동 (이미 발주에 담김)AW1 3030박현장2026-10-15 09:40
ⓘ승인된 묶음이 없을 때 — 「현장담당이 승인한 제작 묶음이 없습니다. 현장 관리 화면에서 진행을 확인하세요.」
· 섹션을 빼는 칸은 없다 — 범위는 차수(실측한 개소, 📌 #3704 — 현장담당이 묶음으로 ⛔ 뒤집힘)로 이미 정해졌고, 부호 안 수량까지 나뉜다(예: AW1 100개 중 1차 30개). · 고른 묶음의 제작용 사본 확정 행으로 소요를 셈하고(실측 반영), 3단계는 고른 묶음의 승인된 절단 계획을 그대로 받는다(#3443). · 「(이미 발주에 담김)」 줄은 고를 수 없고 그 묶음의 버전은 부르지 않는다 — 저장 때 409 BATCH_ALREADY_ORDERED 안내는 경합에 대비해 남긴다. · 묶음 발주로 열면 2단계 자재 표에 「선발주 남음」 열이 서고 이번 발주 수량의 기본값이 누적 부족분이다(#3588 — f6 아래 그림). 선발주로 다 채워 줄이 하나도 없는 묶음 발주도 낸다. · 자재만 더 사는 추가·보정 회차와 선발주는 묶음 없이 낸다(#2975 · #3588). 예시 값(묶음 이름·사람·시각)은 그림을 위한 가상값이다.
새 단추 (#2112 — 정본 「이탈」 행)견적 라인 확정 화면으로 →자리: 1단계 안내 안 — 라인 미확정·확정 구성표 0건 (#2233 뒤 섹션 칸의 잠긴 줄)견적 상세로 →자리: 섹션 칸 — 고를 섹션 0건 (#2233)발주 목록으로자리: 1단계 안내 안 — 진입값 없음견적 목록으로자리: 머리 [발주 목록] 곁 — 견적 목록에서 왔을 때
SCR-OM-004발주 생성 위저드 · 2단계 도장·색상·랩핑?step=2
섹션(몫)마다 도장 · 색상 · 랩핑 · 표면 처리 네 칸을 고른다. 기본은 위 「일괄 지정」 줄이고, 따로 고친 칸은 일괄 값이 덮지 않는다. 색상 · 랩핑은 목록에서만 고른다(글자 입력 없음). #3874 결정 R-OM-FINISH-PER-SECTION · ⏳ 서버 반영 전.

진입 — SCR-OM-004 1단계 [다음 — 도장·색상·랩핑] 버튼. 1단계에서 승인된 묶음을 골라 왔으면(묶음 발주) 아래 둘째 그림처럼 머리 「색상」 칸 미리 채우기와 「선발주 남음」 열이 더해진다 (#3577 · #3588, ⏳ 서버·화면 반영 전)

  1. 위저드 스텝퍼 — 1단계 완료(✓), 2단계가 활성이다.
  2. 「일괄 지정」 줄 (#3874) — 도장 · 색상 · 랩핑 · 표면 처리 네 고르개다. 고르면 형재가 있는 모든 섹션의 같은 칸에 들어간다. 따로 고친 칸은 덮지 않는다. 처음 값은 넷 다 미지정이다(견적 OPT-FIN 을 미리 채우지 않는다, #3696 결정 4). 아래에 「도장 · 랩핑과 섹션마다 고른 색상은 아직 발주에 저장되지 않습니다(서버 반영 전).」 안내와 발주서 「색 상」 칸 미리보기를 둔다.
  3. 섹션 표 (#3874) — 줄마다 도장 · 색상(견본 색 칩 + 코드 · 이름) · 랩핑 · 표면 처리 네 칸이다. 줄 칸을 바꾸면 「따로 고침」 표시가 붙고, [일괄 값으로] 가 네 칸을 되돌린다. 형재가 없는 섹션은 네 칸을 모두 두지 않는다.
  4. [나누기] — 섹션 대수를 몫으로 쪼갠다. 몫마다 네 칸을 모두 따로 고른다(예: 화이트 20 · 다크그레이 16). 새 몫은 섹션 값을 물려받는다.
  5. [다음] 버튼 — 3단계(장바 절단)로 이동한다.
  6. 「색상」 칸 미리 채우기 (#3577 결정 2026-10-19 · ⏳ 화면 반영 전) — 고른 묶음 범위 서브섹션의 색 이름이 하나면 머리 「색상」 칸을 그 색 이름으로 미리 채운다. 둘 이상이면 「색 이름이 다른 서브섹션이 섞였습니다」 안내와 색 이름별 수량 소계를 보인다. 색 이름은 제작팀이 사본 부호(서브섹션) 편집 대화창에서 적는다(§10 #3577 상자). 2단계 [나누기](표면 처리 몫, #1803 ①)는 그대로 둔다.
  7. 「선발주 남음」 열 · 기본 수량 (#3588 · ⏳ 화면 반영 전) — 묶음 발주로 열면 자재 표에 「선발주 남음」 열을 더하고, 이번 발주 수량의 기본값을 자재 누적 대조(material-balance?batchIds=)의 부족분으로 채운다(0 아래면 0). 선발주로 다 채운 자재는 0 이다. 발주 담당이 고칠 수 있다. 줄이 하나도 없는 묶음 발주도 낸다 — 묶음을 「발주 승인됨」으로 옮겨야 작업지시를 발행할 수 있다.
  8. 「도장 업체」 · 「단열 업체」 (#3696 결정 2026-10-20 · ⏳ 서버 · 화면 반영 전) — 색상 칸 곁에서 발주마다 한 번 고른다. 후보는 도장 · 단열 공정에 연결된 거래처(partner_process)다. 도장 업체를 고르면 표면 처리를 정했고 무피가 아닌 줄을 그 업체 앞 도장 발주서에 싣는다. 비우면 도장 발주서를 내지 않는다. 4단계 줄의 공정 고르개는 걷는다.
관련 API Swagger UI ↗
  • GET/api/pm/projects/{projectNo} — 프로젝트 컨텍스트 조회
  • —도장 · 색상 · 랩핑 목록은 지금 화면 상수다(finish-catalog.ts). 나중에 도장 = GET /api/pm/options/groups/OPT-FIN/values, 색상 · 랩핑 = 공통코드 PAINT_COLOR · WRAP_FINISH (DE34-1 §2.12.2 #3874)
  • MISSINGGET /api/pm/processes/{processCode}/partners — 도장 · 단열 업체 후보 — 주소는 있으나 발주 역할(OM_EDITOR · OM_APPROVER)에 닫혀 있다. 요청 머리 paintPartnerId · insulationPartnerId 도 서버 반영 전 (#3696)
  • GET/api/om/projects/{projectId}/material-balance?batchIds= — 고른 묶음을 소요 누계에 더해 자재마다 부족분(이번 발주 기본 수량)과 선발주 남음을 셈한다 (IF-OM-REQ-001 · DE24-1 §5.8.13, #3588 — ✅ 서버 반영 #3591 · ⏳ 화면 반영 전)
  • GET제작용 사본 부호 응답의 colorName(색 이름, 64자, 비어도 된다) — 고른 묶음 범위 서브섹션의 색 이름. 서버가 따로 주는 값은 없고 화면이 부호 응답에서 읽는다 (DE24-1 §5.8.13 「사본 부호 나누기 · 수량별 색 이름」, #3577 — ✅ 서버 칸 반영 #3585 · ⏳ 화면 반영 전)
  • —2단계 값은 화면(클라이언트)에서 조립 — 별도 단계 저장 주소 없음. 완료 시 줄 surfaceFinish 와 머리 colorCode(섹션 색상으로 채움)로 POST /api/om/purchase-orders 에 포함
  • MISSING줄 lines[].paintMethod · colorCode · wrapCode — 서버 반영 전 (DE24-1 §5.6.1 R-OM-FINISH-PER-SECTION, #3874)
프로젝트  ›  미사5중 신축공사  ›  발주  ›  발주 생성
CMD+K 검색
🔔3
미사5중 신축공사목록으로 돌아가기
1위저드 스텝퍼
✓발주 자재 선택 2도장·색상·랩핑 3장바 절단 4거래처별 발주 5재고 사용
2일괄 지정 — 모든 섹션에 넣기
도장2코팅 ▾색상■ W-01 화이트 ▾랩핑랩핑 없음 ▾표면 처리마리온 ▾
ⓘ도장 · 랩핑과 섹션마다 고른 색상은 아직 발주에 저장되지 않습니다(서버 반영 전). 발주서 「색 상」 칸: W-01/DG-02
3섹션 표 — 줄마다 네 칸
섹션대수도장색상랩핑표면 처리
지킴이실-AD0112코팅 ▾■ W-01 화이트 ▾랩핑 없음 ▾마리온 ▾4나누기
AW01132코팅 ▾몫 2개 — 아래에서 고릅니다랩핑 없음 ▾마리온 ▾몫 추가
└ 몫 172코팅 ▾■ W-01 화이트 ▾랩핑 없음 ▾마리온 ▾삭제
└ 몫 262코팅 ▾■ DG-02 다크그레이 ▾ 따로 고침랩핑 없음 ▾마리온 ▾삭제 · 일괄 값으로
CW-ACC4형재가 없는 섹션 — 도장 · 색상 · 랩핑 · 표면 처리 칸을 두지 않는다—
스텝 액션
이전5다음 — 장바 절단
· 색상 · 랩핑 목록은 시험용 임의 값이다(색상 W-01~NV-10, 랩핑 WR-00 랩핑 없음 · WR-01~WR-10). · 머리 「색 상」 칸은 고른 색이 하나면 「코드 이름」, 둘 이상이면 코드를 / 로 잇는다. · 절단 묶음 키 목표는 자재 × 표면 처리 × 도장 × 색상 × 랩핑이고, 서버 반영 전에는 자재 × 표면 처리다.
묶음 발주로 연 2단계 — 「색상」 칸 미리 채우기 (#3577) · 「선발주 남음」 열 (#3588) · ⏳ 화면 반영 전
6머리 「색상」 칸 — 서브섹션의 색 이름이 하나일 때
색상DJO168 LIGHT GREY(서브섹션 색 이름 — 색상 목록의 코드 · 이름과 같으면 「일괄 지정」 색상으로 미리 채우고, 다르면 이 글자가 발주서 「색 상」 칸으로 간다, #3874)
8도장 업체대아프로폰 ▾단열 업체선택 안 함 ▾(#3696 — 발주마다 한 번 고른다. 후보는 그 공정에 연결된 거래처 · ⏳ 서버 · 화면 반영 전)
6서브섹션의 색 이름이 둘 이상일 때 — 칸을 채우지 않고 안내와 소계
!색 이름이 다른 서브섹션이 섞였습니다 — DJO168 LIGHT GREY 30 · WH 12
7자재 표 — 「선발주 남음」 열 · 발주 수량 기본값 = 누적 부족분
자재선발주 남음발주 수량표면 처리
UNI-A225-101A 후렘-외부 A4002코팅 ▾나누기
UNI-A225-401A 문짝바0242코팅 ▾나누기
HDW-LCK-001 크리센트120——
· 발주 수량 기본값은 자재 누적 대조(material-balance?batchIds=)가 이번 묶음을 넣고 셈한 부족분이다(0 아래면 0). 선발주로 다 채운 자재는 0 이고, 발주 담당이 고칠 수 있다. 형재는 바 수로 센다. · 색 이름은 제작지시서 (외)와 절단지시서 무리 머리에도 찍힌다(§10 #3577 상자). 2단계 [나누기](표면 처리 몫)는 그대로다. · 표의 열 차례·「발주 수량」 열 이름과 예시 값은 그림을 위한 것이다 — 정본이 정한 화면 글자는 「선발주 남음」·「색상」·「색 이름이 다른 서브섹션이 섞였습니다」다.
SCR-OM-004발주 생성 위저드 · 3단계 장바 절단?step=3 · 상태 cutting-running
서버가 확정 자재 구성표의 자르는 줄(널링반제품·도장품·원자재 자신)에서 절단 목록을 뽑아 자른다(#2104). 사람은 여유·칼날 두께·각도 공차만 넣는다. 결과 = 원자재별 본수·장바 길이·폐기 + 원가 추정 셈 근거. 장바 길이 범위 탐색은 서버에 섰다(#2165) — 가용 재고 길이가 있으면 그 길이가 먼저다(#2976). FR-OM-004·FR-OM-005.

진입 — SCR-OM-004 2단계 [다음 — 장바 절단] 버튼

다음 단계 — 표준 길이가 없는 형재 줄의 [표준 길이 등록 →] → 그 자재의 SCR-PM-003 「표준 길이」 칸 (새 창, 자재 편집 권한). 창에 초점이 돌아오면 표준 길이를 다시 부른다 (#2106 ⑰).

  1. 위저드 스텝퍼 — 1·2단계 완료, 3단계가 활성이다.
  2. ① 파라미터 패널 — 여유·칼날 두께(kerf)·각도 절단 공차(자르는 품번별로 덮어쓸 수 있다)를 입력한다. 요구 길이 칸은 없다 — 길이는 서버가 구성표에서 읽는다(#2104). 📌 #3694 결정 (2026-10-20 회의 · ⏳ 서버·화면 반영 전) — 「장척 길이 (mm)」 칸 둘(최소 ~ 최대)을 둔다. 장척은 공장에서 사는 긴 원자재 한 본이다. 비우면 흐린 글자 6,300 과 「비우면 모든 자재를 6,300 mm 로 자릅니다. 한 길이로 자르려면 한 칸만, 범위 안에서 가장 알맞은 길이를 찾으려면 두 칸을 넣으세요.」를 보인다. 요청에 barLengthMinMm · barLengthMaxMm 으로 싣는다(빈칸은 싣지 않음). 0 이하·최소 > 최대면 칸 아래 안내와 함께 [절단 최적화 계산] 을 잠근다. 최소/최대 길이는 범위 탐색이 서기 전까지 계산에 실리지 않는 안내 칸이다. ⛔ 뒤집힘 (#3694). 정본 DE22-1 §09 3단계 「#3694 — 장척 길이 칸을 둔다」 줄. 📌 #3828 결정 (2026-10-22 · ⏳ 화면 반영 전) — 아래 「선택한 자재」 표의 길이 열은 이름이 「장척 길이 (mm)」이고, 이 칸 값을 그대로 보인다(비우면 6,300 「기본」 · 하나면 그 길이 · 범위면 최소~최대). 자재 표준 길이 범위(5,900~6,700)는 그 칸 툴팁으로만 보인다. 정본 DE22-1 §09 3단계 #3828 줄.
  3. [② 절단 계산] 버튼 — 1단계에서 고른 견적 라인·대수와 고른 원자재를 보낸다. 부호 수량은 서버가 곱한다(3단계에서 따로 곱하지 않는다).
  4. 계산 진행 표시(cutting-running) — 진행률 바와 [취소] 버튼을 보여준다.
  5. 결과 KPI — 원자재 본수(사는 바)·스크랩 중량·스크랩률·원가 추정을 계산 결과로 채운다. 원가 추정은 형재 1본 단가 × 원자재 본수의 합이다.
  6. 절단 목록 · 원자재별 본수 — 서버가 뽑은 절단 목록(자르는 품번 × 절단 길이 × 조각 수)과 원자재별 본수(자르는 바 본수 × 드는 수)를 보인다. 1단계에서 고르지 않은 구성 원자재는 「이번 발주에 싣지 않음」으로 보인다. [절단 조합] 상세는 자르는 바별 본수·폐기다. 장바 길이가 가용 재고 길이로 정해진 원자재(lengthSource=STOCK)는 원자재별 본수 표의 길이 곁에 「재고 길이」를 붙인다 — 그 밖의 값·값 없음이면 붙이지 않는다(#2976·#3079).
  7. 라인별 폐기율 · 라인 묶음 — 📌 #3993 결정 (2026-10-26 · ⏳ 서버·화면 반영 전) — KPI 아래 「라인별 폐기율」 표(byLine[]: 생산 라인 · 자르는 바 본수 · 폐기 중량 · 폐기율 · 쓴 장척 길이)와 굵은 「전체」 줄(summary)을 둔다. 절단 목록·원자재별 본수 표는 라인 머리줄(「프레임 라인 — 폐기율 7.8 %」)로 묶는다. 라인 값이 빈 자재는 「라인 미지정」으로 맨 끝이다. byLine[] 이 한 줄뿐이면 요약 표와 머리줄을 숨긴다. 파라미터 카드의 「라인별로 따로 정하기」를 펼치면 라인마다 장척 최소~최대를 넣고, 넣은 라인만 lineBarLengths[] 로 싣는다. 라인 값은 자재 상세(SCR-PM-003)의 「생산 라인」 칸이다. 정본 DE22-1 §09 3단계 #3993 줄 · DE24-1 §5.5.2 R-OMCUT-PRODUCTION-LINE.
  8. 원가 추정 셈 근거 — 원자재별 잡힌 거래처·1본 단가·본수·금액. 거래처 우선순위가 비었으면 「우선순위가 정해지지 않아 먼저 등록된 거래처 단가로 셈했습니다」 경고를 띄운다.
  9. [다음] 버튼 — 4단계(거래처별 발주)로 이동한다. 형재 줄의 발주 수량은 여기서 낸 원자재 본수다. 서버가 절단 목록에 넣지 못한 형재가 있으면 그 줄의 장바 길이·본수를 사람이 넣어야 넘어간다.
관련 API Swagger UI ↗
  • GET/api/pm/projects/{projectNo} — 프로젝트 컨텍스트 조회
  • GET/api/pm/items/{itemId}/standard-length — 자재별 원자재 표준 길이(default/min/max) 범위 조회 — 절단 최적화 입력 (IF-PM-LEN-001)
  • POST/api/om/cutting-plans/optimize — 절단 계산(계산 전용·미영속). 요청 lines[](견적 라인·대수)·itemIds[]·itemOverrides[] → 응답 cutList[]·byItem[]·byMaterial[](본수·셈 근거 cost)·uncuttable[] (IF-OM-CUT-002, #2104 — 서버 #2122 반영 완료)
프로젝트  ›  미사5중 신축공사  ›  발주  ›  발주 생성
CMD+K 검색
🔔3
미사5중 신축공사목록으로 돌아가기
1위저드 스텝퍼
✓발주 자재 선택 ✓도장·색상·랩핑 3장바 절단 4거래처별 발주 5재고 사용
2① 파라미터
여유mm
칼날 두께 kerfmm
각도 절단 공차mm (자르는 품번별)
장척 길이 (mm)6,300 ~ 최대
비우면 모든 자재를 6,300 mm 로 자릅니다. 한 길이로 자르려면 한 칸만, 범위 안에서 가장 알맞은 길이를 찾으려면 두 칸을 넣으세요. (📌 #3694 · ⏳ 서버·화면 반영 전)
▸ 라인별로 따로 정하기 (📌 #3993 · ⏳ 반영 전)
프레임6,000 ~ 최대
문짝6,300 ~ 최대
커튼월6,300 ~ 최대
단열재6,300 ~ 최대
3② 절단 계산
4② 계산 진행 (cutting-running)
계산 중 — 자르는 품번 단위 취소
5결과 — KPI (값은 계산 산출)
원자재 본수
—
스크랩 중량
—
스크랩률
—
원가 추정
—
6라인별 폐기율 (📌 #3993 · ⏳ 반영 전 — byLine[])
생산 라인자르는 바 본수폐기 중량폐기율쓴 장척 길이
프레임계산계산계산6,000
문짝계산계산계산6,300 기본
라인 미지정계산계산계산6,300 기본
전체계산계산계산
라인 미지정 자재는 자재 상세의 「생산 라인」 칸에서 정합니다. 아래 두 표는 라인 머리줄(「프레임 라인 — 폐기율 7.8 %」)로 묶인다.
6절단 목록 (서버가 구성표에서 뽑는다)
자르는 품번절단 길이조각 수각도
프레임 라인 — 폐기율 계산
UNI-A225-10KN 후렘 널링반제품1,60014445°
UNI-A225-10KN 후렘 널링반제품65014445°
6원자재별 본수
원자재장바 길이본수이번 발주
프레임 라인 — 폐기율 계산
UNI-A225-101A 후렘-외부 A6,300 재고 길이계산싣는다절단 조합
UNI-P225-101 후렘 PVC계산계산싣지 않음 — 따로 마련절단 조합
6원가 추정 셈 근거
원자재거래처1본 단가본수금액
UNI-A225-101A주 거래처 ⚠ 우선순위 없음계산계산계산
스텝 액션
이전7다음 — 거래처별 발주
· 절단 목록·원자재 본수·원가 셈의 정본은 DE24-1 §5.5.2 「개정」(#2104 — 서버 #2122·화면 #2123 반영 완료). 형재 1본 = 정척 바 1개, 원가 = 1본 단가 × 본수. 장바 길이 범위 탐색(ASIS §11.4)은 서버에 섰다(#2165) — 가용 재고 길이가 있으면 그 길이가 먼저다(#2976). 산식 검산은 §11.4.1 정본. · 절단 목록에서 기본 산식으로 길이를 낸 줄에는 「기본 산식」 표시를 붙인다 — 본수·원가가 확인 전 길이로 셈해졌다는 뜻이다 (#2231 결정 · 서버·화면 반영 전).
새 단추 (#2112 — 정본 「이탈」 행)표준 길이 등록 ↗자리: 3단계 미등록 형재 줄 — 새 창
SCR-OM-004발주 생성 위저드 · 4단계 거래처별 발주?step=4
자재마다 사는 거래처 · 발주 단위 · 여분 수량을 확정한다. 거래처 후보 = PM partner_material 소비(자체 공장 = 선택지). #3696 — 공정 칸을 걷었다(도장 · 단열 업체는 2단계 발주 머리) · ⏳ 서버 · 화면 반영 전.

진입 — SCR-OM-004 3단계 [다음 — 거래처별 발주] 버튼

다음 단계 — 표 위 「거래처가 없는 자재 N종」 + [거래처·단가 묶음 등록 →] → 단가 묶음 등록 · 줄마다 [거래처 매핑 →] → SCR-PM-006 · 공정 0건이면 [공정 관리로 →] → SCR-PM-007 — 셋 다 새 창 (#2106 ⑭⑱).

  1. 위저드 스텝퍼 — 1~3단계 완료, 4단계가 활성이다.
  2. 자재 분류 서브탭 — 전체/압출재/부속/유리/부자재로 매트릭스를 좁혀 본다.
  3. 자재 × 거래처 표 — 자재마다 거래처 · 발주 단위 · 수량(산출) · 여분을 확정한다. 공정 칸은 #3696 으로 걷었다 — 도장 · 단열을 맡길 업체는 2단계 발주 머리에서 한 번 고른다.
  4. 거래처 선택 드롭다운 · [기본 거래처로 변경] — PM에 등록된 자재-거래처 매핑(partner_material)을 후보로 쓰며, 자체 공장도 한 선택지다. 미리 고른 거래처를 바꾼 줄에만 [기본 거래처로 변경] 이 선다. 누르면 그 자재의 우선순위 1 이 고른 거래처로 바뀌어 다음 발주에서 미리 골라진다. 누르지 않으면 이번 발주에만 쓴다(#3696).
  5. 발주 단위 — 기준 단위(EA 등)와 고른 거래처의 묶음 단위(예 「봉 (500 EA)」) 가운데 고른다. 묶음으로 사면 묶음 수 = 필요 수량 ÷ 묶음 수량을 올린 값이고 수량은 기준 단위로 함께 보인다(#3696).
  6. [다음] 버튼 — 5단계(재고 사용)로 이동한다. 여기서 입력한 여분 수량은 다음 단계 재고 계산에 합산된다.
관련 API Swagger UI ↗
  • GET/api/pm/projects/{projectNo} — 프로젝트 컨텍스트 조회
  • GET/api/pm/items/{itemCode}/partners — 자재별 거래처 후보 목록 — 매트릭스 '거래처' 컬럼(partner_material 소비)
  • MISSINGPUT /api/pm/items/{itemCode}/partners/{partnerMaterialId}/default — [기본 거래처로 변경] — 거래처 종류 무관 · 발주 역할에 연다 (#3696, DE24-1 §5.3.9)
  • POST/api/om/pricing/current — 자재별 거래처별 현재 유효 단가 일괄 조회 — 매트릭스 '단가' (IF-OM-CUT-001)
  • —자재×거래처 표·여분 수량은 화면(클라이언트)에서 조립 — 별도 단계 저장 주소 없음. 완료 시 발주 라인(partnerId·orderUnit·packQty·packCount·orderQty — #3696 으로 새 위저드는 processCode 를 보내지 않는다)으로 POST /api/om/purchase-orders 에 포함
프로젝트  ›  미사5중 신축공사  ›  발주  ›  발주 생성
CMD+K 검색
🔔3
미사5중 신축공사목록으로 돌아가기
1위저드 스텝퍼
✓발주 자재 선택 ✓도장·색상·랩핑 ✓장바 절단 4거래처별 발주 5재고 사용
2자재 분류 서브탭
전체압출재부속유리부자재
3자재 × 거래처 표
자재거래처발주 단위수량여분
UNI-A225-401A4대양알루미늄 ▾ 1순위 자동본 ▾산출0
UNI-M226-101-A성진알루미늄 ▾ 기본 거래처로 변경본 ▾산출0
크리센트 나사동신테크 ▾ 거래처 1곳 자동봉 (500 EA) ▾3봉 (1,500)0
결합 부속유니크시스템 ▾EA ▾산출0
스텝 액션
이전5다음 — 재고 사용
· 거래처 후보는 PM partner_material 매핑을 소비한다(자체 공장도 거래처 선택지). 여분 수량은 다음 5단계에서 재고 차감과 합산된다.
새 단추 (#2112 — 정본 「이탈」 행)거래처·단가 묶음 등록 ↗자리: 매트릭스 표 위 — 거래처 없는 자재가 있을 때거래처 매핑 ↗자리: 거래처 「미지정」 줄마다공정 관리로 ↗자리: 공정 0건 안내 안 — 공정 조회 권한
SCR-OM-004발주 생성 위저드 · 5단계 재고 사용?step=5
재고(자재×길이×가공 상태) 사용 수량 입력 + 가공 상태 체크(도장/단열). 최종 발주 수량 = 수량 + 여분 − 재고. 완료 시 발주(회차) 생성 → 승인 제출.

진입 — SCR-OM-004 4단계 [다음 — 재고 사용] 버튼

다음 단계 — [발주 생성] → SCR-OM-005 발주 상세 — 생성은 됐는데 승인 요청이 실패해도 만든 발주 상세로 보낸다 (#2106 ④).

  1. 위저드 스텝퍼 — 1~4단계 완료, 5단계가 활성이다.
  2. 재고 사용 테이블 — 자재×길이×가공 상태별로 필요 수량·여분·재고 사용을 나란히 보여준다.
  3. 재고 사용 입력 — 보유 재고 중 사용할 수량을 입력한다.
  4. 최종 발주 수량 — 필요 수량+여분−재고 사용으로 자동 산출된다.
  5. [임시 저장(작성중)] 버튼 — 위저드를 중단해도 작성중 상태로 저장할 수 있다.
  6. [발주 생성·승인 제출] 버튼 — 위저드를 마치면 발주(회차)가 생성되어 승인 단계(OM-005)로 넘어간다.
관련 API Swagger UI ↗
  • GET/api/pm/projects/{projectNo} — 프로젝트 컨텍스트 조회
  • POST/api/om/inventory/availability — 자재×길이×가공상태별 가용 재고(충당 가능량) 조회 — 재고 사용 입력 (IF-OM-INV-001, SCR-OM-007과 공유)
  • POST/api/om/inventory/reserve — 재고 충당 예약(reserved_qty 증가) — 5단계 재고 사용 확정
  • POST/api/om/purchase-orders → POST /{purchaseOrderId}/submit — 위저드 완료 — 발주(회차) 생성(DRAFT) + 승인 요청 (IF-OM-ORDER-001)
  • PUT/api/om/purchase-orders/{purchaseOrderId} — [임시 저장(작성중)] — 작성중(DRAFT) 발주 수정·재개 (DRAFT 한정)
프로젝트  ›  미사5중 신축공사  ›  발주  ›  발주 생성
CMD+K 검색
🔔3
미사5중 신축공사목록으로 돌아가기
1위저드 스텝퍼
✓발주 자재 선택 ✓도장·색상·랩핑 ✓장바 절단 ✓거래처별 발주 5재고 사용
2재고 사용 테이블 (자재 × 길이 × 가공 상태)
자재길이가공 상태필요 수량여분재고 사용4최종 발주 수량
UNI-A225-401A6300원자재산출030= 수량+여분−재고
UNI-A225-401A63002코팅 도장 ☑산출00= 수량+여분−재고
UNI-M226-101-A6300원자재+단열 ☑산출00= 수량+여분−재고
스텝 액션 (위저드 완료)
이전5임시 저장 (작성중)6발주 생성 · 승인 제출
· 공정별 최종 발주 수량 = 수량 + 여분 − 재고. 재고 마스터는 SCR-OM-007. 완료 시 발주(회차) 생성 → 승인 제출(OM-005). 중단 시 작성중 상태로 임시 저장.
SCR-OM-005발주 상세·승인·발주서 출력/projects/:projectNo/orders/:orderNo
공정×거래처 분해 결과 확인 + 금액 계층 승인 워크플로 + 발주서 출력. 승인 완료 시 PO 확정 이벤트 → MF 제작도 트리거. FR-OM-006·007·008.

진입 — SCR-OM-003 발주 회차 목록 행 클릭 / 승인 알림 / SCR-OM-004 [발주 생성] 뒤 / SCR-OM-007 [발주 상세 →]·「승인대기 N건」 카드 (#2112)

다음 단계 — 상태별 단추(§4.5.4 표 — 작성중 [승인 요청]·[이어서 작성]·[삭제]·[취소], 승인대기 [승인]·[반려], 승인 [발주 확정]·[취소]) · [이어서 작성] → SCR-OM-004 (그 발주 값으로 채워 연다 — 기준 견적 라인이 없으면 잠그고 까닭, #2214 · #2233 뒤 담은 라인이 없으면) · 발주확정·운송중이면 [입고 등록] 창 · [입고 이력 보기 →] → SCR-OM-007 발주 입고 현황 · [작업지시 보기 →] → SCR-MF-003 (승인 이상) · [같은 견적의 남은 섹션 발주 →] → SCR-OM-004 (이 견적 버전, 이미 발주에 든 섹션은 빼 둔 채 — #2233, 종전 [같은 견적의 다른 라인 발주 →]) · 견적 목록에서 왔으면 [견적 목록으로] (#2106 ⑥⑦⑧⑩⑫).

  1. 상태·출력 액션 바 — 발주 상태 배지와 [발주서 받기]·[널링지시서] 다운로드 버튼을 함께 둔다. 두 단추 모두 xlsx 를 받고, 곁의 형식 고르기(▾)로 PDF 사본을 받는다(#2305).
  2. 승인 대기 배지 — 현재 발주의 승인 진행 상태를 표시한다.
  3. 발주번호 곁 구분 (📌 #3775 · ✅ 화면 반영 f9fa4783(#1402)) — 목록 「구분」 칸과 같은 글(「선발주 · N번째」 · 「묶음 발주」 · 「추가·보정 · N번째」 · 「일반」)과 회차 「N회」를 늘 보인다. 종전 「추가·보정 N차」 배지를 갈음한다(정본 DE22-1 §09 §4.5.1 「구분」 줄).
  4. 공정×거래처 분해 테이블 — 공정별 거래처·품목 수·중량/길이·금액·문서(개별 발주서)를 보여준다. 「문서」 단추는 그 줄의 서식·거래처 파일 하나를 받는다 — 원자재발주서·부자재발주서·도장 발주서·널링지시서(DE24-1 §5.6.4 서식 가르기, #2305).
  5. 승인 워크플로우 패널 — 발주 금액과 필요 승인 단계(금액 계층에 따른 과장/부장)를 요약한다.
  6. 승인선 테이블 — 작성·과장·부장 등 단계별 승인자와 상태(완료/승인/대기)를 보여준다.
  7. [승인]/[반려] 버튼 — 승인 완료 시 PO 확정 이벤트가 발행돼 MF 제작도를 트리거하고, 발송 처리 후에는 발주확정 상태로 잠긴다.
  8. 취소·반려 사유 칸 (#3149 결정 · ⏳ 서버·화면 반영 전) — 승인 발주의 [취소] 확인 창은 「취소 사유」 칸(필수, 1~255자)을 둔다. 비면 [발주 취소] 를 잠근다. 작성중 발주의 [취소] 창에는 사유 칸이 없다. [반려] 창의 사유 칸은 어느 길로 보내든 필수다. 취소 사유는 상세 머리 「취소 정보」 둘째 줄에, 반려 사유는 결재선 표 「사유·코멘트」 칸에 남는다. 빈 사유는 400 PURCHASE_ORDER_REASON_REQUIRED 로 창 안에 알린다.
  9. [승인] 확인 창에는 사유 칸이 없다 (📌 #3914 결정 2026-10-23 · ✅ 화면 반영 wims2.0_fe PR #1477 e11d3ca9) — 승인은 누가 하든(작성자 본인이어도) 확인 한 번으로 끝난다. 종전의 「승인 사유」 칸과 본인 승인 422 ORDER_SELF_APPROVAL_REASON_REQUIRED 안내를 걷었다. 사유는 [반려]·승인 발주 [취소] 때만 받는다(#3149). 정본 DE22-1 §09 §4.5.2 「승인」 줄.
  10. [승인] 확인 창 — 갈래마다 다른 글 (#3448 ③ ✅ 화면 반영 · #3637 결정 2026-10-20 ⏳ 서버·화면 반영 전) — [승인]을 누르면 확인 창이 뜬다. 화면은 프로젝트 묶음 목록 머리의 newFlow·poGateActive 와 발주의 견적 라인·additionalRound 로 갈래를 가른다. #3637 로 「옛 흐름 · 라인 없는 발주」 한 줄을 「옛 흐름 · 라인 있는 발주」와 「라인 없는 발주」 둘로 나눈다 — 라인 없는 발주(재고 사용 발주 등)는 흐름과 상관없이 「담은 견적 라인이 없는 발주라 승인해도 작업지시를 만들지 않습니다」를 적고, 완료 알림은 「발주를 승인했습니다.」 하나다. 이미 선 빈 작업지시는 그대로 둔다. 갈래 표는 아래 그림 밑에 옮겼다.
  11. 부호 그림 (#4166 · #4167 · FR-ES-025 · ⏳ 서버 · 화면 반영 전) — 머리 「담은 섹션」 칸(종전 「5AW 36대 · 3AW 4대」 글자)을 부호 그림 띠로 바꾼다 — 섹션마다 카드 84 × 56 그림과 아래 「부호 대수」 글자. 승인자가 어떤 창들을 위한 발주인지 한눈에 본다. 발주 라인(자재 줄)에는 섹션을 붙이지 않는다. 이 자리 정본은 09_OM §4.5.1 「담은 섹션」 줄이다. 크기 · 상태 문구 · 56 px 이하 줄여 그리기 · 꼬리표 규칙은 DE22-1 §00 §10 이 정본이다.
관련 API Swagger UI ↗
  • GET/api/pm/projects/{projectNo} — 프로젝트 컨텍스트 조회
  • GET/api/om/purchase-orders/{purchaseOrderId} — 발주 상세(헤더 + 라인 전체, 화면이 공정×거래처로 묶어 표시) 조회 (IF-OM-ORDER-001)
  • POST/api/om/purchase-orders/{purchaseOrderId}/submit — [승인 요청] — 작성중→승인대기
  • POST/api/om/purchase-orders/{purchaseOrderId}/approve — [승인] — 승인대기→승인 (ROLE_OM_APPROVER, 단일 승인). 본문 없이 부른다 — 승인은 사유를 받지 않는다(#3914). #3637 — 견적 라인이 없는 발주는 승인해도 작업지시를 세우지 않는다 (DE24-1 §5.8.2 「#3601」 상자, ⏳ 서버 반영 전)
  • GET/api/fs/projects/{projectId}/batches?status= — 승인 확인 창 갈래 가르기 — 응답 머리 newFlow·poGateActive (#3448 ③)
  • POST/api/om/purchase-orders/{purchaseOrderId}/reject — [반려] — 승인대기→작성중 복귀. #3149 뒤 본문 { reason } 필수(1~255자) — 결재 차례를 모를 때만 이 주소로 보낸다(평소에는 단계 반려 …/approvals/{stepSeq}/reject)
  • POST/api/om/purchase-orders/{purchaseOrderId}/cancel — [취소] — 작성중·승인→취소(작업 전 작업지시 함께 취소, #2582). #3149 뒤 본문 { reason? } — 승인 발주는 필수, 작성중은 선택. 응답 cancelReason (⏳ 서버 반영 전)
  • POST/api/om/purchase-orders/{purchaseOrderId}/confirm — 발주 확정 — 승인→발주확정(잠금)·가격 동결·재고 차감. 승인 완료 시 IF-EVT-OM-PO-APPROVED로 MF 제작도 트리거
  • GET/api/om/purchase-orders/{purchaseOrderId}/approvals — 금액 계층 다단 승인선(과장/부장/임원) 단계별 상태 — 단계 처리는 POST .../approvals/{stepSeq}/approve·reject
  • MISSINGGET /api/om/purchase-orders/{purchaseOrderId}/export?format=xlsx|pdf[&form=…&partnerId=…] — 발주서 받기(실물 문서 형태별 서식 넷 — xlsx 기본, PDF 사본. 종전 「표준 1서식 PDF」 는 #2305 로 바뀌었다) — IF-OM-ORDER-001 §5.6.4
  • GET/api/om/purchase-orders/{purchaseOrderId}/knurling-instruction?format=xlsx|pdf — 널링 지시서(널링 가공 지시·정산서 — 등급 시트 + 출고명세서, DE24-1 §5.6.5). ⚠️ 지금 서버는 마킹 6열 PDF 를 낸다 — #2305 로 실물 서식으로 바뀐다(서버 반영 전)
  • GET/api/om/purchase-orders/{purchaseOrderId} — 발주 상세(한 건) 응답 estimateLines[] 의 부호 그림 칸 cropPictureUrl(그림 주소 — 읽을 때마다 서버가 한 시간짜리를 새로 발급, 화면이 오래 들고 있지 않는다) · cropPictureStatus(그림 상태 PENDING · RENDERED · SKIPPED · FAILED, null 은 SKIPPED 로 읽는다). 같은 섹션의 라인은 같은 값이라 「담은 섹션」 띠는 섹션마다 한 장으로 그린다. 목록 · 쓰기 응답에는 싣지 않는다(§5.6.1 #2233 상자). 견적 주소는 부르지 않는다(#2894). DE24-1 §5.4.13 「부호 그림 칸」(#4168) · ⏳ 서버 반영 전 #4171
프로젝트  ›  미사5중 신축공사  ›  발주  ›  발주 상세
CMD+K 검색
🔔3
미사5중 신축공사목록으로 돌아가기
1상태 · 출력 액션 바
PO-2026-099-02묶음 발주 · 2회2승인 대기발주서 받기 ↓ ▾널링지시서 ↓ ▾
11담은 섹션 — 부호 그림 띠 (#4166 · ⏳ 서버 · 화면 반영 전)
5AW 36대3AW 4대1AW 12대그림 없음EX-02 2대외 3곳 ▸
섹션마다 카드 84 × 56 그림 한 장과 그 아래 「부호 대수」 글자를 한 칸으로 가로로 잇는다. 한 줄에 다 안 들어가면 첫 줄만 보이고 「외 N곳」 을 눌러 펼친다. 마우스를 올리면 240 px 미리보기. 칸이 없는 섹션은 「그림 없음」. 담은 라인이 없는 발주는 「—」 다.
3공정 × 거래처 분해 (발주서 단위)
공정거래처품목 수중량/길이금액문서
압출대양알루미늄125,565.73 kg₩ 39,824,654원자재발주서 ↓
도장(2코팅)대아프로폰96,418.66 kg₩ 7,509,849도장 발주서 ↓
널링(결합)유니크시스템42,494.8 m₩ 1,995,840널링지시서 ↓
· 자재별 출처 견적 라인 trace 유지(-EL{estimateLineId}) — 동일 거래처 복수 라인 합산 시에도 출처 표시. 출력물 = 실물 문서 형태별 양식(원자재·부자재·임가공·널링) xlsx + PDF 사본(#2305 — 종전 「xlsx(ASIS 19종 양식 승계) + PDF」). 널링지시서(FR-OM-008) = 널링 가공 지시·정산서.
4승인 워크플로우 (FR-OM-007)
발주 금액₩ 49,330,343
필요 승인부장 (5천만 미만 → 과장+부장)
5승인선
단계승인자상태
작성성윤정완료
과장김성현승인
부장—대기
반려6승인
· 승인 완료 시 PO 확정 이벤트(poNumber·resolvedBomId[]·deliveryDate) → MF 제작도 트리거. 발송 처리 → 발주확정 + 잠금(order-locked).
승인 발주 [취소] 확인 창 (#3149 결정 · ⏳ 서버·화면 반영 전)
· 사유를 비우면 [발주 취소] 가 잠긴다. 작성중 발주의 [취소] 창은 사유 칸 없이 본문 둘째·셋째 문장(작업지시 안내)도 없다. [반려] 창도 같은 꼴로 「반려 사유 *」 칸이 늘 필수다. 취소한 발주의 상세 머리에는 「취소 2026-10-13 14:02 · 아이디」 아래 「취소 사유 「…」」 줄이 붙는다.
8[승인] 확인 창 — 라인 없는 발주 갈래 (#3637 결정 · ⏳ 서버·화면 반영 전) · 진입: 이 화면 승인선 패널의 [승인] 버튼
✓완료 알림 — 「발주를 승인했습니다.」
갈래가르는 기준확인 창 글성공 알림
묶음 발주견적 라인이 있고 newFlow·poGateActive 가 둘 다 참「{발주번호} 발주를 승인합니다. 승인하면 묶음이 「발주 승인됨」으로 바뀝니다. 작업지시는 제작지시서를 제출할 때 이미 만들어졌습니다.」「발주를 승인했습니다. 묶음이 「발주 승인됨」으로 바뀌었습니다.」
옛 흐름 · 라인 있는 발주 (#3637)newFlow 가 거짓이고 견적 라인이 있음「{발주번호} 발주를 승인합니다. 승인하면 제조 작업지시를 함께 만듭니다.」「발주를 승인했습니다. 제조 작업지시를 함께 만들었습니다.」
라인 없는 발주 (#3637, ⏳ 화면 반영 전)견적 라인이 없음(재고 사용 발주 등) — 흐름과 상관없다「{발주번호} 발주를 승인합니다. 담은 견적 라인이 없는 발주라 승인해도 작업지시를 만들지 않습니다.」「발주를 승인했습니다.」
추가·보정 발주additionalRound 가 1 이상「… 추가·보정 발주라 승인해도 작업지시를 새로 만들지 않습니다.」(#3129)「발주를 승인했습니다.」
가를 수 없음묶음 목록을 받는 중·못 받음, 또는 발주 관문 스위치가 꺼짐「… 묶음을 담은 발주면 묶음이 「발주 승인됨」으로 바뀌고, 묶음이 없는 발주면 제조 작업지시를 함께 만듭니다.」「발주를 승인했습니다.」
· 정본 DE22-1 §09 §4.5.3 갈래 표를 옮겼다. 종전 「옛 흐름 · 라인 없는 발주」 한 줄(「승인하면 서버가 제조 작업지시를 만듭니다」)은 #3637 로 위 두 줄로 나뉘었다. 창 머리 이름과 단추 이름은 정본에 없어 그림을 위한 것이다.
새 단추 (#2112 — 정본 「이탈」 행)입고 등록자리: 머리 — 발주확정·운송중, 편집 역할입고 이력 보기 →자리: 머리작업지시 보기 →자리: 머리 — 승인 이상, 제조 조회 권한같은 견적의 남은 섹션 발주 →자리: 머리 — 편집 역할, 담은 섹션이 있는 발주 (#2233)견적 목록으로자리: [발주 목록] 곁 — 견적 목록에서 왔을 때
SCR-OM-006추가·보정 발주/projects/:projectNo/orders/extra
기발주 대비 차이(증감) 목록 → 증가분은 새 회차 발주(위저드 재진입), 감소분은 잉여 처리. 탭은 [자재 누적 대조] · [발주량 대조] 둘이다(#3613 — 종전 FS 실측 차이·MF 부족분·널링 잔여 셋). 권한 ROLE_OM_EDITOR. FR-OM-006.

진입 — SCR-OM-003 발주 목록 [발주 만들기] 창의 「모자란 자재만 — 추가·보정」 · 조회 역할은 [자재 대조 보기 →] (📌 #3775 — 종전 [추가·보정 발주 →]. 이 화면은 위저드 안으로 옮기지 않고 남긴다) / FS 실측 반영 알림

다음 단계 — [차이분 발주 생성 (새 회차)] → SCR-OM-004 (차이분을 미리 고른 채).

  1. 액션 바 — 「FS 실측 반영 수신」 배지는 걷었다 — 수신 시각을 줄 자료가 없다 (#3613, §09 §4.6 뒤집힘 상자).
  2. [차이분 발주 생성(새 회차)] 버튼 — 체크한 증가분을 위저드(OM-004) 새 회차로 사전 선택해 재진입한다.
  3. 탭 — [자재 누적 대조](새 흐름 프로젝트 — 누적 대조 finalOrderStatus 가 NOT_APPLICABLE 이 아닐 때만 보이고 그때 기본. 내용은 아래 둘째 그림 — 자재마다 소요 누계 · 발주 누계 셋 · 차이와 최종 발주 마무리 상태, #3588) · [발주량 대조](제조에서 넘어온 추가·보정 회차 표 + 작업지시별 대조 표 — 실측 반영 재계산과 제조 부족분이 함께 든다). 탭이 하나뿐이면 탭 줄을 그리지 않는다. 탭을 바꾸면 고른 줄을 비운다. 종전 탭 셋([FS 실측 차이]·[MF 부족분]·[널링 잔여])은 셈이 하나라 둘이 같은 표였고 하나는 막다른 자리였다 (#3613).
  4. 차이(증감) 목록 테이블 — 기발주 대비 재평가(실측) 수량과 그 차이를 항목별로 보여준다. 나눠 가진 발주의 기발주 숫자 곁에는 「발주 전체 기준」을 붙이고, 다른 작업지시 줄이 이미 센 빈 줄(COUNTED_IN_OTHER_WORK_ORDER)에는 「이 발주의 값은 작업지시 {번호} 줄에 합쳐 보입니다.」를 띄운다 (§09 §4.6.1 #2616 상자).
  5. 처리 컬럼 — 증가분은 "추가 발주", 감소분은 "잉여 — 재고 전환"으로 처리 방향을 표시한다(세부 규칙 미확정).
  6. [자재 누적 대조] 탭 (#3588 · ⏳ 화면 반영 전) — 새 흐름 프로젝트에서 자재마다 소요 누계(발주에 든 묶음) · 발주 누계(선발주 · 묶음 발주 · 추가·보정 회차로 나눠 보임) · 차이(부족 · 선발주 남음 · 맞음)와 최종 발주 마무리 상태를 보인다. 부족 자재를 담아 [차이분 발주 생성 (새 회차)]로 잇는다(supplement: true). 조회가 실패하면 탭 줄을 그리되 탭 안에 「자재 누적 대조를 불러오지 못했습니다.」 + [다시 시도]를 둔다. [차이분 발주 생성 (새 회차)]는 지금 보이는 탭에서 고른 줄만 넘긴다 (#3613).
관련 API Swagger UI ↗
  • GET/api/pm/projects/{projectNo} — 프로젝트 컨텍스트 조회
  • GET/api/om/purchase-orders?projectId={id} — 기발주 라인 조회 — 재평가와 비교할 기발주 수량 (IF-OM-ORDER-001)
  • GET/api/mf/projects/{projectId}/order-check — [발주량 대조] 탭 증감 대조 — IF-MF-ORDERCHECK-001 프로젝트 축(작업지시별 묶음 + 합계) — §5.8.4 [구현] (정책 7·9, §09 §4.6.2)
  • POST/api/om/purchase-orders — [차이분 발주 생성(새 회차)] — 증가분을 orderRound+1 로 위저드(OM-004) 새 회차 생성 (IF-OM-ORDER-001)
  • GET/api/om/projects/{projectId}/material-balance — [자재 누적 대조] 탭 — finalOrderStatus·conditions·items[](requiredQty · advanceOrderedQty·batchOrderedQty·supplementOrderedQty · orderedQty · balanceQty · state). 탭을 보일지도 이 값으로 가른다 (IF-OM-REQ-001 · DE24-1 §5.8.13, #3588 — ✅ 서버 반영 #3591 · ⏳ 화면 반영 전)
  • POST/api/om/purchase-orders 요청 supplement: true — [자재 누적 대조] 부족 자재로 연 위저드가 내는 추가·보정 회차 (#2975 그대로 · 새 칸·새 주소 없음)
  • POST/api/om/inventory/adjust — 감소분 잉여 재고 전환 (IF-OM-INV-001 — 전환 규칙 자체는 잠정 미확정)
프로젝트  ›  미사5중 신축공사  ›  발주  ›  추가·보정 발주
CMD+K 검색
🔔3
미사5중 신축공사목록으로 돌아가기
보정 사유 · 액션 바
12차이분 발주 생성 (새 회차)
3탭 — 셈 기준으로 가른다
자재 누적 대조발주량 대조
실측을 반영한 절단 재계산 결과와 기발주를 견줍니다 (작업지시별)
4차이(증감) 목록 테이블
☐섹션항목기발주재평가 (실측)차이처리
☑AW01UNI-A225-401A (장바)180186+65추가 발주
☑AAW0102-0077 풍지판5458+4추가 발주
☐AW12UNI-M226-101-A (장바)3230−2잉여 — 재고 전환
· 증가분은 위저드 재진입(차이분 사전 선택)으로 새 회차 발주. 감소분 처리 규칙(재고 전환 vs 취소)은 ASIS 확인 후 확정 — (미확정). 모든 추가 발주는 새 회차로 OM-004 동일 파이프라인을 탄다.
6[자재 누적 대조] 탭 — 새 흐름 프로젝트에서 기본 탭 (#3588 · #3613 · ⏳ 화면 반영 전) · 진입: SCR-OM-003 [발주 만들기] 창 「모자란 자재만 — 추가·보정」 · 조회 역할 [자재 대조 보기 →] (📌 #3775 — 종전 [추가·보정 발주 →])
차이분 발주 생성 (새 회차)
자재 누적 대조발주량 대조
최종 발주 마무리 상태 — finalOrderStatus · conditions
최종 발주 마무리
IN_PROGRESS
묶음에 안 든 부호 수량
28
발주 전 묶음
1
승인 전 발주
0
부족 자재
2
자재별 누적 대조 표 — 부족 줄만 고를 수 있다
☐자재단위소요 누계선발주묶음 발주추가·보정발주 누계차이상태
☑UNI-A225-401A 문짝바바310200960296−14부족
☑02-0077 풍지판EA16480780158−6부족
—UNI-A225-101A 후렘-외부 A바12016000160+40선발주 남음
—HDW-LCK-001 크리센트EA404000400맞음
!조회 실패일 때 — 「자재 누적 대조를 불러오지 못했습니다.」 다시 시도 (탭 줄은 그대로 그린다 — 조용히 숨기지 않는다)
· 소요 누계 = 살아 있는 발주에 든 묶음의 소요(묶음의 제작용 사본 확정 행 — 보정 차수가 담은 부호는 원래 묶음의 같은 부호를 갈음한다). 발주 누계 = 살아 있는 발주(작성중 포함)의 줄 수량을 선발주 · 묶음 발주 · 추가·보정 회차로 나눠 보이고 합친다. 차이 = 발주 누계 − 소요 누계 — 0 보다 작으면 부족, 크면 선발주 남음, 0 이면 맞음. 형재는 바 수로 센다. · 마무리 상태 넷 — IN_PROGRESS(부호·묶음·발주 조건 가운데 하나라도 남음) · SHORTAGE(그 셋은 채웠고 부족 자재만 남음) · COMPLETE(넷 다 채움 — 발주 목록 머리 「최종 발주 마무리」) · NOT_APPLICABLE(새 흐름 아님 — 이 탭을 그리지 않는다). 남은 선발주(과발주)는 양만 보인다. · 표 열 이름 · 마무리 상태 칸의 화면 글자 · 예시 값은 그림을 위한 것이다 — 정본은 응답 칸(DE24-1 §5.8.13 누적 대조 응답)과 상태 이름(부족 · 선발주 남음 · 맞음)까지만 정했다.
SCR-OM-007입고·재고 현황 (전역)/inventory
발주별 입고 상태 + 자재별 재고(보유량·예약량·여유량 — 위저드 5단계 차감의 마스터). 창고 단위 횡단 정보라 전역 경로. FR-OM-010.

진입 — 사이드바 발주관리 1차 메뉴 › 입고·재고 현황 / SCR-OM-005 [입고 이력 보기 →](그 발주를 골라 둔 [발주 입고 현황] 탭 — #2112)

다음 단계 — [발주 입고 현황] 탭 발주 선택 곁 [발주 상세 →] → SCR-OM-005 (주소는 응답 projectNo·purchaseOrderId) · 고른 발주가 발주확정·운송중이면 [입고 등록] 창 · 요약 카드 「승인대기 N건」 → 승인대기 발주 목록 → SCR-OM-005 · 「운송중」 카드 → 발주 입고 현황 탭 (#2106 ⑥⑦⑨).

  1. 필터바 — 거래처·자재 조건으로 화면 전체를 좁혀 본다.
  2. 요약 카드 — 입고 지연·재고 부족 알림·운송중 건수를 한눈에 보여준다.
  3. 탭 — [발주 입고 현황]/[자재 재고]로 화면을 전환한다.
  4. 자재 재고 테이블 — 자재×길이×가공 상태 단위로 보유량·예약량·여유량을 보여주며, 위저드 5단계 재고 차감의 마스터 데이터다.
  5. 재고 부족 표시(⚠) — 여유량이 0인 항목에 경고 아이콘을 붙인다.
관련 API Swagger UI ↗
  • GET/api/om/inventory?itemId=&processState=&warehouseCode=&page=&size= — 자재별 재고(보유량·예약량·여유량, 자재×길이×가공상태×창고 단위) 조회 — [자재 재고] 탭·요약 카드 (IF-OM-INV-001)
  • GET/api/om/purchase-orders/{purchaseOrderId}/goods-receipts — 발주별 입고 이력(회차·이론/계근 중량·잔여) 조회 — [발주 입고 현황] 탭 (IF-OM-RCV-001)
  • POST/api/om/purchase-orders/{purchaseOrderId}/goods-receipts — 입고 검수 등록(실입고 수량·계근중량) — 이론중량 대사·재고 자동 반영
  • POST/api/om/inventory/adjust — 재고 조정(실사 보정)
발주관리  ›  입고·재고 현황
CMD+K 검색
🔔3
1입고·재고 현황거래처: 전체자재: 전체
2요약 카드
입고 지연
2건 ⚠
재고 부족 알림
3품목
운송중
5건
3탭
발주 입고 현황자재 재고
4자재 재고 테이블 (자재 × 길이 × 가공 상태)
자재길이가공 상태보유량예약량여유량
UNI-A225-401A6300원자재241014
UNI-A225-401A63002코팅 도장6650 ⚠
UNI-M226-101-A6300원자재+단열12012
· [발주 입고 현황] 탭 = 발주확정·운송중·입고완료·지연 알림. 재고 단위 = 자재 × 길이 × 가공 상태. 필터: 거래처·자재·기간. 입고 처리 권한 ROLE_OM_EDITOR.
새 단추 (#2112 — 정본 「이탈」 행)발주 상세 →자리: [발주 입고 현황] 탭 발주 선택 곁입고 등록자리: 같은 탭 — 발주확정·운송중, 편집 역할입고 취소자리: 같은 탭 입고 목록 줄 끝 — 편집 역할, 확인 창 (#3030)승인대기 3건자리: 요약 카드 줄에 넷째 카드