Files
vexplor/frontend/lib/api/inventoryTransfer.ts
kmh 79962160d0 Update admin pages, API clients, and add transfer plan docs
- Update logistics/inbound-outbound pages across 9 companies
- Update production/result and production/work-instruction admin pages
- Add inventoryTransfer API client and enhance packaging/popInventoryAdjust/popInventoryMove clients
- Add transaction-packaging-loading-plan docs
- Add AdjustHistoryModal for COMPANY_9

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-21 18:04:11 +09:00

168 lines
4.4 KiB
TypeScript

/**
* 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 };
}