diff --git a/src/app/api/pickOrder/actions.ts b/src/app/api/pickOrder/actions.ts index 213ea1d..0177e5a 100644 --- a/src/app/api/pickOrder/actions.ts +++ b/src/app/api/pickOrder/actions.ts @@ -15,6 +15,7 @@ import { } from "."; import { PurchaseQcResult } from "../po/actions"; +import { StringNullableChain } from "lodash"; // import { BASE_API_URL } from "@/config/api"; export interface SavePickOrderLineRequest { @@ -986,3 +987,25 @@ export const fetchConsoStatus = cache(async (consoCode: string) => { }, ); }); + +export interface ReleasedDoPickOrderResponse { + id: number; + storeId: string; + ticketNo: string; + pickOrderId: number; + ticketStatus: string; + doOrderId: number; + shopId: number; + handledBy: number; + ticketReleaseTime: string; +} + +export const fetchReleasedDoPickOrders = async (): Promise => { + const response = await serverFetchJson( + `${BASE_API_URL}/doPickOrder/released`, + { + method: "GET", + }, + ); + return response; +}; \ No newline at end of file diff --git a/src/app/utils/formatUtil.ts b/src/app/utils/formatUtil.ts index 8dc4f02..2b3708c 100644 --- a/src/app/utils/formatUtil.ts +++ b/src/app/utils/formatUtil.ts @@ -30,7 +30,7 @@ export const integerFormatter = new Intl.NumberFormat("en-HK", {}); export const INPUT_DATE_FORMAT = "YYYY-MM-DD"; -export const OUTPUT_DATE_FORMAT = "YYYY/MM/DD"; +export const OUTPUT_DATE_FORMAT = "YYYY-MM-DD"; export const INPUT_TIME_FORMAT = "HH:mm:ss"; diff --git a/src/components/FinishedGoodSearch/FinishedGoodSearch.tsx b/src/components/FinishedGoodSearch/FinishedGoodSearch.tsx index e681fec..4a32e78 100644 --- a/src/components/FinishedGoodSearch/FinishedGoodSearch.tsx +++ b/src/components/FinishedGoodSearch/FinishedGoodSearch.tsx @@ -24,7 +24,7 @@ import NewCreateItem from "./newcreatitem"; import AssignAndRelease from "./AssignAndRelease"; import AssignTo from "./assignTo"; import { fetchAllItemsInClient, ItemCombo } from "@/app/api/settings/item/actions"; -import { fetchPickOrderClient, autoAssignAndReleasePickOrder, autoAssignAndReleasePickOrderByStore } from "@/app/api/pickOrder/actions"; +import { fetchPickOrderClient, autoAssignAndReleasePickOrder, autoAssignAndReleasePickOrderByStore, fetchReleasedDoPickOrders } from "@/app/api/pickOrder/actions"; import Jobcreatitem from "./Jobcreatitem"; import { useSession } from "next-auth/react"; import { SessionWithTokens } from "@/config/authConfig"; @@ -64,6 +64,19 @@ const PickOrderSearch: React.FC = ({ pickOrders }) => { ); const [fgPickOrdersData, setFgPickOrdersData] = useState([]); + const [releasedOrderCount, setReleasedOrderCount] = useState(0); + + const fetchReleasedOrderCount = useCallback(async () => { + try { + const releasedOrders = await fetchReleasedDoPickOrders(); + // Count only orders that have a valid doOrderId + const validCount = releasedOrders.filter(order => order.doOrderId).length; + setReleasedOrderCount(validCount); + } catch (error) { + console.error("Error fetching released order count:", error); + setReleasedOrderCount(0); + } + }, []); const handleDraft = useCallback(async () =>{ try{ @@ -105,6 +118,68 @@ const PickOrderSearch: React.FC = ({ pickOrders }) => { } },[t, fgPickOrdersData]); + const handleAllDraft = useCallback(async () =>{ + try { + const releasedOrders = await fetchReleasedDoPickOrders(); + + if(releasedOrders.length === 0) { + console.log("No released do_pick_order records found"); + + return; + } + console.log("Found released orders:", releasedOrders); + + const confirmResult = await Swal.fire({ + title: t("Confirm Print"), + text: t(`Do you want to print ${releasedOrders.length} draft(s)?`), + icon: "question", + showCancelButton: true, + confirmButtonText: t("Yes, print"), + cancelButtonText: t("Cancel"), + confirmButtonColor: "#3085d6", + cancelButtonColor: "#d33" + }); + + // If user cancels, exit the function + if (!confirmResult.isConfirmed) { + return; + } + + for (const order of releasedOrders) { + const { doOrderId, pickOrderId } = order; + + console.log(`Processing order - DO Order ID: ${doOrderId}, Pick order ID: ${pickOrderId}`); + + const printRequest = { + printerId: 1, + printQty: 1, + isDraft: true, + numOfCarton: 0, + deliveryOrderId: doOrderId, + pickOrderId: pickOrderId + }; + + console.log("Printing draft with request:", printRequest) + + const response = await printDN(printRequest); + if(!response.success) { + console.error(`Print failed for order ${order.ticketNo}:`, response.message); + } + } + + Swal.fire({ + position: "bottom-end", + icon: "success", + text: t(`Printed ${releasedOrders.length} draft(s) successfully.`), + showConfirmButton: false, + timer: 1500 + }); + } catch(error){ + console.error("Error in handleAllDraft:",error); + } + + },[t]); + const handleDN = useCallback(async () =>{ const askNumofCarton = await Swal.fire({ title: t("Enter the number of cartons: "), @@ -319,6 +394,10 @@ const PickOrderSearch: React.FC = ({ pickOrders }) => { } },[t, fgPickOrdersData]); + useEffect(() => { + fetchReleasedOrderCount(); + }, [fetchReleasedOrderCount]); + useEffect(() => { const onAssigned = () => { localStorage.removeItem('hideCompletedUntilNext'); @@ -413,7 +492,6 @@ const PickOrderSearch: React.FC = ({ pickOrders }) => { setIsOpenCreateModal(false) }, []) - useEffect(() => { if (tabIndex === 3) { @@ -629,6 +707,12 @@ const PickOrderSearch: React.FC = ({ pickOrders }) => { {/* ✅ Updated print buttons with completion status */} +