"use server"; import { BASE_API_URL } from "@/config/api"; // import { ServerFetchError, serverFetchJson, serverFetchWithNoContent } from "@/app/utils/fetchUtil"; import { revalidateTag } from "next/cache"; import { cache } from "react"; import { serverFetchJson } from "@/app/utils/fetchUtil"; import { QcItemResult } from "../settings/qcItem"; import { RecordsRes } from "../utils"; import { ConsoPickOrderResult, PickOrderLineWithSuggestedLot, PickOrderResult, PreReleasePickOrderSummary, StockOutLine, } from "."; import { PurchaseQcResult } from "../po/actions"; // import { BASE_API_URL } from "@/config/api"; export interface SavePickOrderLineRequest { itemId: number qty: number uomId: number } export interface SavePickOrderRequest { type: string targetDate: string pickOrderLine: SavePickOrderLineRequest[] } export interface PostPickOrderResponse { id: number | null; name: string; code: string; type?: string; message: string | null; errorPosition: string entity?: T | T[]; } export interface PostStockOutLiineResponse { id: number | null; name: string; code: string; type?: string; message: string | null; errorPosition: string | keyof T; entity: T | T[] | null; } export interface ReleasePickOrderInputs { consoCode: string; assignTo: number; } export interface CreateStockOutLine { consoCode: string; pickOrderLineId: number; inventoryLotLineId: number; qty: number; } export interface UpdateStockOutLine { id: number; // consoCode: String, itemId: number; qty: number; pickOrderLineId: number; inventoryLotLineId?: number; status: string; pickTime?: string; // pickerId: number? } export interface PickOrderQcInput { qty: number; status: string; qcResult: PurchaseQcResult[]; } export interface PickOrderApprovalInput { allowQty: number; rejectQty: number; status: string; } export interface GetPickOrderInfoResponse { pickOrders: GetPickOrderInfo[]; items: CurrentInventoryItemInfo[]; } export interface GetPickOrderInfo { id: number; code: string; targetDate: string; type: string; status: string; assignTo: number; pickOrderLines: GetPickOrderLineInfo[]; } export interface GetPickOrderLineInfo { id: number; itemId: number; itemCode: string; itemName: string; availableQty: number| null; requiredQty: number; uomCode: string; uomDesc: string; suggestedList: any[]; } export interface CurrentInventoryItemInfo { id: number; code: string; name: string; uomDesc: string; availableQty: number; requiredQty: number; } export const fetchPickOrderDetails = cache(async (ids: string) => { return serverFetchJson( `${BASE_API_URL}/pickOrder/detail/${ids}`, { method: "GET", next: { tags: ["pickorder"] }, }, ); }); export interface PickOrderLotDetailResponse { lotId: number; lotNo: string; expiryDate: string; location: string; stockUnit: string; availableQty: number; requiredQty: number; actualPickQty: number; suggestedPickLotId: number; lotStatus: string; lotAvailability: 'available' | 'insufficient_stock' | 'expired' | 'status_unavailable'; } export const fetchAllPickOrderDetails = cache(async () => { return serverFetchJson( `${BASE_API_URL}/pickOrder/detail`, { method: "GET", next: { tags: ["pickorder"] }, }, ); }); export const fetchPickOrderLineLotDetails = cache(async (pickOrderLineId: number) => { return serverFetchJson( `${BASE_API_URL}/pickOrder/lot-details/${pickOrderLineId}`, { method: "GET", next: { tags: ["pickorder"] }, }, ); }); export const createPickOrder = async (data: SavePickOrderRequest) => { console.log(data); const po = await serverFetchJson( `${BASE_API_URL}/pickOrder/create`, { method: "POST", body: JSON.stringify(data), headers: { "Content-Type": "application/json" }, }, ); revalidateTag("pickorder"); return po; } export const assignPickOrder = async (ids: number[]) => { const pickOrder = await serverFetchJson( `${BASE_API_URL}/pickOrder/conso`, { method: "POST", body: JSON.stringify({ ids: ids }), headers: { "Content-Type": "application/json" }, }, ); // revalidateTag("po"); return pickOrder; }; export const consolidatePickOrder_revert = async (ids: number[]) => { const pickOrder = await serverFetchJson( `${BASE_API_URL}/pickOrder/deconso`, { method: "POST", body: JSON.stringify({ ids: ids }), headers: { "Content-Type": "application/json" }, }, ); // revalidateTag("po"); return pickOrder; }; export const fetchPickOrderClient = cache( async (queryParams?: Record) => { if (queryParams) { const queryString = new URLSearchParams(queryParams).toString(); return serverFetchJson>( `${BASE_API_URL}/pickOrder/getRecordByPage?${queryString}`, { method: "GET", next: { tags: ["pickorder"] }, }, ); } else { return serverFetchJson>( `${BASE_API_URL}/pickOrder/getRecordByPage`, { method: "GET", next: { tags: ["pickorder"] }, }, ); } }, ); export const fetchPickOrderWithStockClient = cache( async (queryParams?: Record) => { if (queryParams) { const queryString = new URLSearchParams(queryParams).toString(); return serverFetchJson>( `${BASE_API_URL}/pickOrder/getRecordByPageWithStock?${queryString}`, { method: "GET", next: { tags: ["pickorder"] }, }, ); } else { return serverFetchJson>( `${BASE_API_URL}/pickOrder/getRecordByPageWithStock`, { method: "GET", next: { tags: ["pickorder"] }, }, ); } }, ); export const fetchConsoPickOrderClient = cache( async (queryParams?: Record) => { if (queryParams) { const queryString = new URLSearchParams(queryParams).toString(); return serverFetchJson>( `${BASE_API_URL}/pickOrder/getRecordByPage-conso?${queryString}`, { method: "GET", next: { tags: ["pickorder"] }, }, ); } else { return serverFetchJson>( `${BASE_API_URL}/pickOrder/getRecordByPage-conso`, { method: "GET", next: { tags: ["pickorder"] }, }, ); } }, ); export const fetchPickOrderLineClient = cache( async (queryParams?: Record) => { if (queryParams) { const queryString = new URLSearchParams(queryParams).toString(); return serverFetchJson>( `${BASE_API_URL}/pickOrder/get-pickorder-line-byPage?${queryString}`, { method: "GET", next: { tags: ["pickorder"] }, }, ); } else { return serverFetchJson>( `${BASE_API_URL}/pickOrder/get-pickorder-line-byPage`, { method: "GET", next: { tags: ["pickorder"] }, }, ); } }, ); export const fetchStockOutLineClient = cache( async (pickOrderLineId: number) => { return serverFetchJson( `${BASE_API_URL}/stockOutLine/getByPickOrderLineId/${pickOrderLineId}`, { method: "GET", next: { tags: ["pickorder"] }, }, ); }, ); export const fetchConsoDetail = cache(async (consoCode: string) => { return serverFetchJson( `${BASE_API_URL}/pickOrder/pre-release-info/${consoCode}`, { method: "GET", next: { tags: ["pickorder"] }, }, ); }); export const releasePickOrder = async (data: ReleasePickOrderInputs) => { console.log(data); console.log(JSON.stringify(data)); const po = await serverFetchJson<{ consoCode: string }>( `${BASE_API_URL}/pickOrder/releaseConso`, { method: "POST", body: JSON.stringify(data), headers: { "Content-Type": "application/json" }, }, ); revalidateTag("pickorder"); return po; }; export const createStockOutLine = async (data: CreateStockOutLine) => { console.log("triggering"); const po = await serverFetchJson>( `${BASE_API_URL}/stockOutLine/create`, { method: "POST", body: JSON.stringify(data), headers: { "Content-Type": "application/json" }, }, ); revalidateTag("pickorder"); return po; }; export const updateStockOutLine = async (data: UpdateStockOutLine) => { console.log(data); const po = await serverFetchJson>( `${BASE_API_URL}/stockOutLine/update`, { method: "POST", body: JSON.stringify(data), headers: { "Content-Type": "application/json" }, }, ); revalidateTag("pickorder"); return po; }; export const completeConsoPickOrder = async (consoCode: string) => { const po = await serverFetchJson>( `${BASE_API_URL}/pickOrder/consoPickOrder/complete/${consoCode}`, { method: "POST", headers: { "Content-Type": "application/json" }, }, ); revalidateTag("pickorder"); return po; }; export const fetchConsoStatus = cache(async (consoCode: string) => { return serverFetchJson<{ status: string }>( `${BASE_API_URL}/stockOut/get-status/${consoCode}`, { method: "GET", next: { tags: ["pickorder"] }, }, ); });