입출고 요청과 일정관리
저장·요청·승인·변경·완료를 하나의 물류 요청과 전사 일정으로 연결하는 상세 명세.
개발 전달용 상세 명세 v1.0 · 하나의 서비스 / 단계별 구현 설계
C-2 / DEVELOPMENT SPECIFICATION
01서비스 개요·문제와 범위
여러 상품행을 하나의 물류 요청으로 묶고, 요청→승인→협의→실제 처리→일정·재고 이력을 연결한다.
| 문제 | 개발 방향 |
|---|---|
| 행 범위·담당자·완료 여부 불명확 | 요청헤더·상태·담당자·실제수량·이력 |
| 시트와 캘린더 이중 입력 | 승인된 요청을 기준으로 일정 파생 |
| Slack 논의를 다시 찾기 어려움 | 승인 게시와 요청 상세 연결,업무메모 유지 |
본 문서의AS-IS는 시트·Slack·별도 캘린더다. A의 최초Notion환경과 구분한다.
C-2 / DEVELOPMENT SPECIFICATION
02시작 조건·권한·플로우
| 역할 | 가능한 변경 | 제약 |
|---|---|---|
| 요청자 | 상품 검색·발번, 본인 초안 작성·수정·삭제, 요청 제출, 공유된 요청·전사 일정 조회, 본인 요청의 수정 제안 | 타인 초안·상품 기준 수정·승인·완료·운영 요금·자동화 접근 불가 |
| 물류 담당자 | 공유 요청 검토·승인·변경·완료, 재고·상품 운영정보 수정, 자동화·비용 비교, 업무 메모 | 계정 생성·비밀번호 초기화·운영 계약 기준 변경 불가 |
| 물류 어드민 | 물류 담당자 기능 전체, 계정 생성·비밀번호 재설정, 담당자 재배정·단계 변경, 3PL·요금·상시판매 기준 관리 | 완료 재고를 상태값만 바꿔 취소하는 우회는 금지 |
C-2 / DEVELOPMENT SPECIFICATION
03요구사항·화면 지도
| 요구 ID | 개발 지시 | 검수 기준 |
|---|---|---|
| C2-R01 | 입고·출고를 구분한 폼과5개 상품행을 제공한다. | 품번 참조·다중 붙여넣기·필수값 검사 |
| C2-R02 | 저장과 요청을 분리하고 바로 요청 확인을 제공한다. | 저장=입력완료, 요청=물류팀 확인 중 |
| C2-R03 | 요청 목록에 검색·내것/전체·상태 필터를 제공한다. | 헤더중복 없음·3PL표시·타인초안제외 |
| C2-R04 | 물류 승인 후 상태·캘린더·Slack을 연결한다. | 슬랙 논의 중,캘린더1건,게시 실패는별도표시 |
| C2-R05 | 수정 요청을 검토한 뒤 본 요청에 반영한다. | 승인 전 원본 불변,상품이름표시 |
| C2-R06 | 완료에 실제 상품별 수량을 기록한다. | 물류는0허용,상태·원장·재고 원자 처리 |
| C2-R07 | 취소 확인과 이력·메모를 보존한다. | 승인된미완료만취소,일정제외,재고 불변 |
| C2-R08 | 전사4레인 기간 캘린더와월별안내를 제공한다. | 다보내/패박 입고·출고,월경계기간 표시 |
| 화면 ID | 내용 |
|---|---|
| C2-S01 | 입고/출고 신청 팝업 |
| C2-S02 | 입출고 프로젝트 목록 |
| C2-S03 | 상세·수정·담당자·실수량·메모 |
| C2-S04 | 수정 요청·검토 팝업 |
| C2-S05 | 전사 캘린더·월별 일정 안내 |
C-2 / DEVELOPMENT SPECIFICATION
04입고 신청·필드
물류 요청 이름 *예시 요청
요청자로그인 사용자
입고 요청일 *YYYY-MM-DD
입고 방식(선택)퀵/박스 · 퀵/파레트 · 택배 · 방문입고(물류팀)
상품 입고 속성요청 전체 적용
| 품번 | 상품이름(잠금) | 프로젝트(잠금) | 상품속성(잠금) | 수량 | 바코드(선택) |
|---|---|---|---|---|---|
| 300000 | 기준정보 자동 | 자동 | 자동 | 1 | - |
비고(특이사항) · 예정시간 · 차량정보/송장번호 · 국가(수입 시) · 사유
‘저장’만으로는 요청되지 않습니다. 저장 후 정보를 확인하고 ‘요청’을 눌러주세요.| 필드 | 규칙 |
|---|---|
| 물류 요청 이름 | 맨위 필수.상품프로젝트명과구분 |
| 입고일·요청자 | 일자는필수,요청자는인증 계정잠금 |
| 입고방식 | 필수 아님.퀵/박스·퀵/파레트·택배·방문입고(물류팀) |
| 상품입고속성 | 요청전체에적용: 현장 직납 / Knowmerce로 바로 받음 (회사 직접 수령) / 현장 갔다가 창고 리턴 / 창고 최초 입고 |
| 상품행 | 처음5행,+추가.품번조회시상품이름·프로젝트·속성잠금자동채움 |
| 기타 | 비고·예정시간·차량/송장·국가·사유는선택텍스트.처리상필요한추가정보는물류가보완 |
C-2 / DEVELOPMENT SPECIFICATION
05출고 신청·필드·재고 경고
물류 요청 이름 *예시 요청
요청자로그인 사용자
출고 요청일 *YYYY-MM-DD
출고 사유필수 선택
수령인·연락처·주소필수
| 품번 | 상품이름(잠금) | 프로젝트(잠금) | 상품속성(잠금) | 수량 | 바코드(선택) |
|---|---|---|---|---|---|
| 300000 | 기준정보 자동 | 자동 | 자동 | 1 | - |
비고(특이사항) · 예정시간 · 차량정보/송장번호 · 국가(수입 시) · 사유
‘저장’만으로는 요청되지 않습니다. 저장 후 정보를 확인하고 ‘요청’을 눌러주세요.출고 방식은 제거한다. 출고 사유는 다음 선택값으로 제공한다: 이벤트당첨증정 / 판매(고객/회사등) / 판매대행상품소속사이동 / 창고이동 / 고객앨범전달용(사인회등) / 소속사증정(샘플) / CS / 자체이동(현장판매/싸인받기) / 그 외
| 필수 | 검증 |
|---|---|
| 출고 요청일·품번·요청수량 | 유효한 일자·등록 상품·1 이상 정수 |
| 받는 사람·연락처·도착지 주소 | 공백만입력불가.국내번호는확인 가능한 형식안내 |
| 출고사유 | 선택 필수.그외의추가설명은비고 |
| 현재고부족 | “출고 요청만큼 재고가 충분하지 않습니다. 그래도 요청하시겠습니까?” 확인하면제출가능 |
| 현재고미확인 | 미확인임을구분안내.0으로간주하지않음 |
요청수량은요청자1이상.승인 후 물류 담당자는일부처리없음을표현하기위해수량/실수량0을입력가능하다.모든행0인경우에도완료로종결할지이슈/취소로남길지확인 필요.
C-2 / DEVELOPMENT SPECIFICATION
06붙여넣기·저장·요청 상호작용
| 이벤트 | 동작·문구 |
|---|---|
| 품번여러줄붙여넣기 | 탭/줄바꿈에서품번을각행에넣고부족한행자동추가.각품번정보조회후상품필드잠금.실패한행표시. |
| 빈행 | 모든값이빈행만제외.수량만있거나품번조회실패한행은저장 차단. |
| 수량0오류 | “1행의 수량을 확인해주세요.”처럼행번호포함.기존입력보존. |
| 저장 | 헤더+상품행원자저장,입력완료.안내: “저장되었습니다. 정보를 다시 한 번 확인하고, 하단 ‘요청’ 버튼을 눌러주세요. 입고 요청이 진행된 경우, 정보는 논의 후 수정 가능합니다.” |
| 저장후 | 요청/삭제/수정버튼노출.삭제는재확인. |
| 바로요청 | 저장옆발송아이콘,진한색.저장은연한색. “요청이 진행되면 수정이 어렵습니다. 그래도 바로 요청하시겠습니까?” 확인/취소. |
| 요청성공 | 물류팀확인중,뒤화면입출고프로젝트목록으로이동.취소/실패는현재폼유지 |
C-2 / DEVELOPMENT SPECIFICATION
07프로젝트 목록·대시보드 필터
검색: 요청자 · 물류 요청 이름 · 품번 · 상품이름
◉ 내것만 보기 ○ 전체보기
전체 / 승인대기 / 입고 / 출고 / 완료 / 이슈 해결 중
| Num | 물류 요청 이름 | 상품 | 요청자 | 입출고일 | 3PL | 상태 |
|---|---|---|---|---|---|---|
| 001 | 예시출고요청 | 상품A 외1건 | 예시사용자 | 예시일정 | 다보내 | 슬랙 논의 중 |
물류 담당자/어드민 외 계정은 내것만 보기를 기본 선택한다. 목록의 내 요청을 별도로 볼드 처리하지 않는다. 전체보기에서도 타인 입력완료는 제외한다. 승인대기는 물류팀 확인 중이면서 미승인인 요청이다.
대시보드 카드: 승인 대기 → 슬랙 논의 중 → 이슈 해결 중(빨간아이콘) → 수정 요청. 클릭하면 같은 목록의 조건필터로 이동한다.
C-2 / DEVELOPMENT SPECIFICATION
08상세·메모·수정 요청·담당자
물류 담당자승인한 담당자 / 어드민 변경가능
3PL다보내
출고 완료 예상 시점예시일정
운송 정보차량·송장 등
| 상품이름 | 요청수량 | 실수량 |
|---|---|---|
| 예시상품A | 5 | 5 |
| 예시상품B | 3 | 0 |
| 행동 | 정책 |
|---|---|
| 메모 | 모든접근가능담당자작성.댓글처럼작성자·시간·내용표시.단순덮어쓰기가아님. |
| 수정요청 | 품번보다상품이름표시.수량·일정변경과사유입력.사유안내: “(변경사항이 다른 영역일 경우, 수정 사유에 따로 적어주세요)” |
| 수정승인 | 검토현재값/제안값확인 후 적용.검토중원본이바뀌었으면재조회·재검토.대기수정은요청당1건제안. |
| 담당자·단계 | 어드민이정보수정에서담당자변경·허용단계변경가능.완료원장우회수정불가. |
| 수령정보 | 요청당1개수령인·주소로정의.상품별배송지가다르면요청분리하는안. |
C-2 / DEVELOPMENT SPECIFICATION
09승인·상태·취소·Slack
| 상태 | 의미 | 처리 |
|---|---|---|
| 입력완료 | 저장한 초안 | 본인 수정·삭제·요청 / 캘린더·재고 영향 없음 |
| 물류팀 확인 중 | 제출 후 검토 대기 | 물류 담당자 승인 / 아직 일정 미등록 |
| 슬랙 논의 중 | 물류 승인 이후 협의 | 전사 일정 생성·Slack 게시 / 배송·완료·이슈·취소로 진행 |
| 배송 중 / 출고중 | 출고 작업·운송 진행 | 운송 정보·출고 완료 예상 시점 기록 |
| 입고 완료 / 출고 완료 | 물류팀이 실제 수량을 확인 | 상품별 실수량과 수불을 함께 확정 / 직접 덮어쓰기 금지 |
| 이슈 해결 중 | 누락·업체 협의 등으로 중단 | 메모·정보 보완 후 진행 상태 선택 |
| 취소 | 승인된 미완료 요청을 중단 | 확인 팝업 / 일정 제외 / 재고 변화 없음 / 기록 보존 |
승인시 “슬랙 논의 중”으로 바꾸고 전사 캘린더에 표시한다. 공통 Slack 채널에 봇 게시한다. 이 연동은개발스펙이며현재프로토타입에서는실제연동과구분한다.
요청자 : @실제 Slack 사용자 ID 물류 담당자 : @실제 Slack 사용자 ID 프로젝트 : [물류 요청 이름] 등록 상품 : 대표 상품 외 n건 시행 일시 : YYYY-MM-DD 특이사항 : 내용 또는 -
취소: “취소로 변경됩니다. 맞습니까?” 확인 후 승인된미완료만취소.캘린더제외·대기수정무효·재고 불변.완료 후 취소는자동역재고하지않고별도보정검토. Slack 전송 실패는승인을취소하지않고게시재시도로복구.
C-2 / DEVELOPMENT SPECIFICATION
10실제 처리·재고·동시 요청
재고NULL일때첫입고를더한값을현재고로자동확정하면기존숨은재고를잃을수있다.기초재고확인 후 완료를기본안으로하고,첫입고로확정하는정책은운영합의가필요하다.
C-2 / DEVELOPMENT SPECIFICATION
11전사 캘린더·기간·월별 안내
3PL·유형
월
화
수
목
금
다보내 입고
← 예시 물류 요청 →
다보내 출고
← 예시 물류 요청 →
패박 입고
← 예시 물류 요청 →
패박 출고
← 예시 물류 요청 →
오른쪽 월별 일정 안내: 해당 월과 겹치는 모든 승인 프로젝트
| 항목 | 명세 |
|---|---|
| 레인 | 다보내입고·다보내출고 / 패박입고·패박출고.둘업체동시에표시.업체색을고정하고일정본문에는업체명반복하지않음. |
| 기간 | 입출고시작~출고완료예상시점동안←→기간막대표시.완료예상이같으면하루이벤트. |
| 다른완료일 | 실제출고시점과예상이달라지면메모에사유기록.변경된예상일은물류팀관리. |
| 내요청 | 캘린더에서만본인요청글자볼드.전사일정은숨기지않음. |
| 월경계 | 전월부터진행중이거나다음월로이어지는기간도현재월에겹치면표시.겹침은같은레인내서브행. |
| 승인·변경·취소 | 동일요청ID로파생.취소/반려/미승인제외.별도수동일정복제하지않음. |
C-2 / DEVELOPMENT SPECIFICATION
12부분 데이터·API 계약
logistics_requests
| 필드/제약 | 타입 | 논리 정의 |
|---|---|---|
| id | TEXT | PRIMARY KEY NOT NULL |
| request_num | INTEGER | NOT NULL |
| request_name | TEXT | NOT NULL |
| direction | TEXT | NOT NULL |
| requester_id | TEXT | NOT NULL REFERENCES actors(id) ON DELETE RESTRICT |
| assignee_id | TEXT | REFERENCES actors(id) ON DELETE RESTRICT |
| warehouse_id | TEXT | REFERENCES warehouses(id) ON DELETE RESTRICT |
| status | TEXT | NOT NULL |
| scheduled_at | TEXT | NOT NULL |
| expected_end_at | TEXT | |
| completed_at | TEXT | |
| inbound_method | TEXT | |
| inbound_attribute | TEXT | |
| outbound_reason | TEXT | |
| recipient | TEXT | |
| phone | TEXT | |
| postal_code | TEXT | |
| address | TEXT | |
| transport_info | TEXT | |
| origin_country | TEXT | |
| note | TEXT | |
| created_at | TEXT | NOT NULL |
| UNIQUE | (request_num) |
Slack 게시를 위해 slack_message_ts / slack_delivery_status / slack_last_error(nullable) 추가를 제안한다. 알림·정기실행 전용 테이블은 추가하지 않는다.
request_lines
| 필드/제약 | 타입 | 논리 정의 |
|---|---|---|
| id | TEXT | PRIMARY KEY NOT NULL |
| request_id | TEXT | NOT NULL REFERENCES logistics_requests(id) ON DELETE RESTRICT |
| product_id | TEXT | NOT NULL REFERENCES products(id) ON DELETE RESTRICT |
| line_no | INTEGER | NOT NULL |
| sku_number_snapshot | TEXT | NOT NULL |
| name_snapshot | TEXT | NOT NULL |
| requested_qty | INTEGER | NOT NULL |
| actual_qty | INTEGER | |
| UNIQUE | (request_id, | product_id) |
| UNIQUE | (request_id, | line_no) |
| CHECK | (requested_qty | >= 0) |
| CHECK | (actual_qty | IS NULL OR actual_qty >= 0) |
request_changes
| 필드/제약 | 타입 | 논리 정의 |
|---|---|---|
| id | TEXT | PRIMARY KEY NOT NULL |
| request_id | TEXT | NOT NULL REFERENCES logistics_requests(id) ON DELETE RESTRICT |
| requested_by | TEXT | NOT NULL REFERENCES actors(id) ON DELETE RESTRICT |
| reason | TEXT | NOT NULL |
| proposed_scheduled_at | TEXT | |
| status | TEXT | NOT NULL |
| reviewed_by | TEXT | REFERENCES actors(id) ON DELETE RESTRICT |
| reviewed_at | TEXT | |
| created_at | TEXT | NOT NULL |
request_change_lines
| 필드/제약 | 타입 | 논리 정의 |
|---|---|---|
| id | TEXT | PRIMARY KEY NOT NULL |
| change_id | TEXT | NOT NULL REFERENCES request_changes(id) ON DELETE RESTRICT |
| request_line_id | TEXT | NOT NULL REFERENCES request_lines(id) ON DELETE RESTRICT |
| proposed_qty | INTEGER | NOT NULL |
| UNIQUE | (change_id, | request_line_id) |
| CHECK | (proposed_qty | >= 0) |
project_comments
| 필드/제약 | 타입 | 논리 정의 |
|---|---|---|
| id | TEXT | PRIMARY KEY NOT NULL |
| request_id | TEXT | NOT NULL REFERENCES logistics_requests(id) ON DELETE RESTRICT |
| actor_id | TEXT | NOT NULL REFERENCES actors(id) ON DELETE RESTRICT |
| body | TEXT | NOT NULL |
| created_at | TEXT | NOT NULL |
request_status_history
| 필드/제약 | 타입 | 논리 정의 |
|---|---|---|
| id | TEXT | PRIMARY KEY NOT NULL |
| request_id | TEXT | NOT NULL REFERENCES logistics_requests(id) ON DELETE RESTRICT |
| actor_id | TEXT | NOT NULL REFERENCES actors(id) ON DELETE RESTRICT |
| from_status | TEXT | |
| to_status | TEXT | NOT NULL |
| reason | TEXT | |
| created_at | TEXT | NOT NULL |
| 제안 API | 권한·조건 |
|---|---|
| POST /requests · PATCH /requests/:id/draft | 인증요청자·입력완료본인 소유·폼검증 |
| POST /requests/:id/submit | 초안최신 상태·재고경고확인 |
| POST /requests/:id/approve | 물류역할·제출요청·담당자·3PL확정 |
| POST /request-changes · /:id/review | 본인수정제안·물류검토·같은 요청명세참조 |
| POST /requests/:id/complete · /cancel | 완료원자처리/취소확인·상태조건 |
| GET /calendar?month=YYYY-MM | 승인요청의기간투영 |
| POST /requests/:id/comments | 공유접근가능사용자·본문1~2000자제안 |
C-2 / DEVELOPMENT SPECIFICATION
13인수 테스트·확인 필요
| 테스트 ID | 연결 요구 | 시나리오 | 기대 결과 |
|---|---|---|---|
| C2-T01 | C2-R01 | 5행중2상품,3행빈값 | 명세2행저장 |
| C2-T02 | C2-R01 | 품번2개줄바꿈붙여넣기 | 각행자동조회,상품이름수정불가 |
| C2-T03 | C2-R02 | 저장만실행 | 입력완료·일정/Slack/재고 변화없음 |
| C2-T04 | C2-R02 | 바로요청취소/확인 | 취소는폼유지,확인만제출 |
| C2-T05 | C2-R03 | 전체보기로타인초안검색 | 초안노출안됨 |
| C2-T06 | C2-R04 | 승인 후 Slack실패 | 승인/일정유지·재시도상태표시 |
| C2-T07 | C2-R05 | 수정반려 | 원요청수량·일정불변 |
| C2-T08 | C2-R06 | 완료실수량5와0 | 첫상품만이동,0수량표시보존 |
| C2-T09 | C2-R06 | 동일완료동시실행 | 수불1회·음수재고없음 |
| C2-T10 | C2-R07 | 승인 후 취소확인 | 일정제외·재고 불변·이력보존 |
| C2-T11 | C2-R08 | 월경계기간과본인요청 | 막대연속·본인볼드·전체월안내 |
확인 필요:한요청여러3PL의분리안,초과실입고,완료 후 보정,초안물류팀열람범위,Slack실제ID/채널설정. 임의로동작확정하지않고C-0의미확인정책목록과함께검토한다.