|
|
@@ -4,9 +4,10 @@ import { exportMultiSheetToXlsx } from "@/app/(main)/chart/_components/exportCha |
|
|
import type { |
|
|
import type { |
|
|
DrinkProductionQtyJobOrderDetail, |
|
|
DrinkProductionQtyJobOrderDetail, |
|
|
DrinkProductionQtyResponse, |
|
|
DrinkProductionQtyResponse, |
|
|
|
|
|
DrinkShipmentQtyResponse, |
|
|
} from "@/app/api/jo/actions"; |
|
|
} from "@/app/api/jo/actions"; |
|
|
|
|
|
|
|
|
type DrinkViewMode = "actual" | "planned"; |
|
|
|
|
|
|
|
|
export type DrinkViewMode = "actual" | "planned" | "shipment"; |
|
|
|
|
|
|
|
|
const formatDateTime = (value: unknown): string => { |
|
|
const formatDateTime = (value: unknown): string => { |
|
|
if (value == null || value === "") return ""; |
|
|
if (value == null || value === "") return ""; |
|
|
@@ -27,28 +28,102 @@ const formatDate = (value: string | null | undefined): string => { |
|
|
|
|
|
|
|
|
export type ExportDrinkProductionQtyParams = { |
|
|
export type ExportDrinkProductionQtyParams = { |
|
|
data: DrinkProductionQtyResponse[]; |
|
|
data: DrinkProductionQtyResponse[]; |
|
|
|
|
|
shipmentData?: DrinkShipmentQtyResponse[]; |
|
|
viewMode: DrinkViewMode; |
|
|
viewMode: DrinkViewMode; |
|
|
selectedDate: string; |
|
|
selectedDate: string; |
|
|
statusFilter: string; |
|
|
statusFilter: string; |
|
|
t: TFunction; |
|
|
t: TFunction; |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
const viewModeLabel = (viewMode: DrinkViewMode, t: TFunction): string => { |
|
|
|
|
|
switch (viewMode) { |
|
|
|
|
|
case "planned": |
|
|
|
|
|
return t("Drink detail mode: planned"); |
|
|
|
|
|
case "shipment": |
|
|
|
|
|
return t("Drink detail mode: shipment"); |
|
|
|
|
|
case "actual": |
|
|
|
|
|
return t("Drink detail mode: actual"); |
|
|
|
|
|
default: { |
|
|
|
|
|
const _exhaustive: never = viewMode; |
|
|
|
|
|
return _exhaustive; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
const formatDoStatus = (status: string | null | undefined, t: TFunction): string => { |
|
|
|
|
|
if (!status) return ""; |
|
|
|
|
|
switch (status.toLowerCase()) { |
|
|
|
|
|
case "pending": |
|
|
|
|
|
return t("Drink do status pending"); |
|
|
|
|
|
case "receiving": |
|
|
|
|
|
return t("Drink do status receiving"); |
|
|
|
|
|
case "completed": |
|
|
|
|
|
return t("Drink do status completed"); |
|
|
|
|
|
default: |
|
|
|
|
|
return t(status, { ns: "do", defaultValue: status }); |
|
|
|
|
|
} |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
export function exportDrinkProductionQtyXlsx({ |
|
|
export function exportDrinkProductionQtyXlsx({ |
|
|
data, |
|
|
data, |
|
|
|
|
|
shipmentData = [], |
|
|
viewMode, |
|
|
viewMode, |
|
|
selectedDate, |
|
|
selectedDate, |
|
|
statusFilter, |
|
|
statusFilter, |
|
|
t, |
|
|
t, |
|
|
}: ExportDrinkProductionQtyParams): void { |
|
|
}: ExportDrinkProductionQtyParams): void { |
|
|
const viewLabel = |
|
|
|
|
|
viewMode === "planned" |
|
|
|
|
|
? t("Drink detail mode: planned") |
|
|
|
|
|
: t("Drink detail mode: actual"); |
|
|
|
|
|
|
|
|
const viewLabel = viewModeLabel(viewMode, t); |
|
|
const statusFilterLabel = statusFilter |
|
|
const statusFilterLabel = statusFilter |
|
|
? t(statusFilter, { ns: "jo", defaultValue: statusFilter }) |
|
|
? t(statusFilter, { ns: "jo", defaultValue: statusFilter }) |
|
|
: t("All"); |
|
|
: t("All"); |
|
|
const exportedAt = dayjs().format("YYYY-MM-DD HH:mm:ss"); |
|
|
const exportedAt = dayjs().format("YYYY-MM-DD HH:mm:ss"); |
|
|
|
|
|
|
|
|
|
|
|
if (viewMode === "shipment") { |
|
|
|
|
|
const doRows: Record<string, unknown>[] = []; |
|
|
|
|
|
const itemRows = shipmentData.map((item) => { |
|
|
|
|
|
for (const delivery of item.deliveries ?? []) { |
|
|
|
|
|
doRows.push({ |
|
|
|
|
|
[t("Export meta: exported at")]: exportedAt, |
|
|
|
|
|
[t("Drink detail mode label")]: viewLabel, |
|
|
|
|
|
[t("Date")]: selectedDate, |
|
|
|
|
|
[t("Item Code")]: item.itemCode ?? "", |
|
|
|
|
|
[t("Goods Name")]: item.itemName ?? "", |
|
|
|
|
|
[t("Unit")]: item.uom ?? "", |
|
|
|
|
|
[t("Delivery Order Code", { ns: "do" })]: delivery.deliveryOrderCode ?? "", |
|
|
|
|
|
[t("Delivery Order Status", { ns: "do" })]: formatDoStatus( |
|
|
|
|
|
delivery.deliveryOrderStatus, |
|
|
|
|
|
t, |
|
|
|
|
|
), |
|
|
|
|
|
[t("Shop Name", { ns: "do" })]: |
|
|
|
|
|
delivery.shopName || delivery.shopCode || "", |
|
|
|
|
|
[t("Delivery Date", { ns: "do" })]: formatDate(delivery.deliveryDate), |
|
|
|
|
|
[t("Shipment Order Qty")]: delivery.orderQty ?? 0, |
|
|
|
|
|
[t("Shipped Qty")]: delivery.shippedQty ?? 0, |
|
|
|
|
|
}); |
|
|
|
|
|
} |
|
|
|
|
|
return { |
|
|
|
|
|
[t("Export meta: exported at")]: exportedAt, |
|
|
|
|
|
[t("Drink detail mode label")]: viewLabel, |
|
|
|
|
|
[t("Date")]: selectedDate, |
|
|
|
|
|
[t("Item Code")]: item.itemCode ?? "", |
|
|
|
|
|
[t("Goods Name")]: item.itemName ?? "", |
|
|
|
|
|
[t("Unit")]: item.uom ?? "", |
|
|
|
|
|
[t("Shipment Order Qty")]: item.totalOrderQty ?? 0, |
|
|
|
|
|
[t("Shipped Qty")]: item.totalShippedQty ?? 0, |
|
|
|
|
|
[t("DO count")]: (item.deliveries ?? []).length, |
|
|
|
|
|
}; |
|
|
|
|
|
}); |
|
|
|
|
|
const filename = `DrinkProductionQty_shipment_${selectedDate}_${dayjs().format("HHmm")}`; |
|
|
|
|
|
exportMultiSheetToXlsx( |
|
|
|
|
|
[ |
|
|
|
|
|
{ name: t("Excel sheet: DO detail"), rows: doRows }, |
|
|
|
|
|
{ name: t("Excel sheet: item summary"), rows: itemRows }, |
|
|
|
|
|
], |
|
|
|
|
|
filename, |
|
|
|
|
|
); |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
const filterJos = ( |
|
|
const filterJos = ( |
|
|
jobOrders: DrinkProductionQtyJobOrderDetail[], |
|
|
jobOrders: DrinkProductionQtyJobOrderDetail[], |
|
|
): DrinkProductionQtyJobOrderDetail[] => { |
|
|
): DrinkProductionQtyJobOrderDetail[] => { |
|
|
|