/** * inventoryTransfer API client * 2단계 재고이동 (출고측 보내기 -> 입고측 확정/거절/부분입고) * * 백엔드: backend-node/src/controllers/inventoryTransferController.ts * 사용처: * - 출고: frontend/app/(main)/COMPANY_X/pop/outbound/inventory-move/ * - 입고: frontend/app/(main)/COMPANY_X/pop/inbound/inventory-move/ */ import { apiClient } from "./client"; export type TransferStatus = | "PENDING" | "CONFIRMED" | "PARTIAL_CONFIRMED" | "REJECTED" | "CANCELLED"; export type LineStatus = | "PENDING" | "CONFIRMED" | "PARTIAL_CONFIRMED" | "REJECTED"; // ---- 요청 생성 (출고측 보내기) ---- export interface CreateRequestItem { stock_id: string; qty: number; } export interface CreateRequestBody { from_warehouse: string; to_warehouse: string; items: CreateRequestItem[]; note?: string; } export interface CreateRequestResultLine { detail_id: string; stock_id: string; item_code: string; qty: number; } export interface CreateRequestData { request_id: string; request_no: string; status: TransferStatus; lines: CreateRequestResultLine[]; } // ---- 목록 row (pending / sent 공용) ---- export interface TransferListRow { request_id: string; request_no: string; from_warehouse: string; to_warehouse: string; from_warehouse_name: string; to_warehouse_name: string; status: TransferStatus; note: string | null; requested_by: string; requested_at: string; line_count: number | string; pending_count: number | string; } // ---- 상세 ---- export interface TransferMaster { request_id: string; request_no: string; from_warehouse: string; to_warehouse: string; from_warehouse_name: string; to_warehouse_name: string; status: TransferStatus; note: string | null; requested_by: string; requested_at: string; confirmed_by: string | null; confirmed_at: string | null; } export interface TransferDetail { detail_id: string; item_code: string; item_name: string; unit: string; lot_no: string | null; from_location: string | null; to_location: string | null; requested_qty: string; confirmed_qty: string; rejected_qty: string; line_status: LineStatus; reject_reason: string | null; } export interface TransferDetailData { master: TransferMaster; details: TransferDetail[]; } // ---- 입고측 처리 ---- export interface ProcessItem { detail_id: string; confirmed_qty: number; // 0 = 전체 거절 reject_reason?: string; } export interface ProcessBody { items: ProcessItem[]; } export interface ProcessData { request_id: string; status: TransferStatus; } // ============================================================ // API // ============================================================ export async function createTransferRequest(body: CreateRequestBody) { const res = await apiClient.post("/inventory-transfer/request", body); return res.data as { success: boolean; message?: string; data?: CreateRequestData; }; } export async function getPendingTransfers(warehouseCode?: string) { const params = warehouseCode ? { warehouse_code: warehouseCode } : {}; const res = await apiClient.get("/inventory-transfer/pending", { params }); return res.data as { success: boolean; data: TransferListRow[] }; } export async function getReceivedHistory(warehouseCode?: string) { const params = warehouseCode ? { warehouse_code: warehouseCode } : {}; const res = await apiClient.get("/inventory-transfer/received-history", { params }); return res.data as { success: boolean; data: TransferListRow[] }; } export async function getSentTransfers(warehouseCode?: string) { const params = warehouseCode ? { warehouse_code: warehouseCode } : {}; const res = await apiClient.get("/inventory-transfer/sent", { params }); return res.data as { success: boolean; data: TransferListRow[] }; } export async function getTransferDetail(requestId: string) { const res = await apiClient.get(`/inventory-transfer/${requestId}`); return res.data as { success: boolean; data: TransferDetailData }; } export async function processTransfer(requestId: string, body: ProcessBody) { const res = await apiClient.post( `/inventory-transfer/${requestId}/process`, body, ); return res.data as { success: boolean; message?: string; data?: ProcessData }; } export async function cancelTransfer(requestId: string) { const res = await apiClient.post(`/inventory-transfer/${requestId}/cancel`); return res.data as { success: boolean; message?: string; data?: ProcessData }; }