- 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>
168 lines
4.4 KiB
TypeScript
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 };
|
|
}
|