FPSMS-frontend
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.
 
 

68 рядки
2.4 KiB

  1. "use client";
  2. import { NEXT_PUBLIC_API_URL } from "@/config/api";
  3. import { clientAuthFetch } from "@/app/utils/clientAuthFetch";
  4. import type { ExpiryItemFilter } from "@/app/api/stockIssue/actions";
  5. /** Result tab currently shown; backend may filter the workbook by this bucket. */
  6. export type ExpiryExportBucket = "expired" | "today" | "upcoming";
  7. export interface ExportExpiryItemExcelParams extends ExpiryItemFilter {
  8. bucket?: ExpiryExportBucket;
  9. }
  10. /**
  11. * FP-MTMS Version Checklist | Functions Ref. No. 74 | v1.0.2 | 2026-09-07
  12. * GET /pickExecution/issues/expiryItem/excel
  13. * Query: itemCode, itemName, lotNo, daysAhead, bucket (expired|today|upcoming; omit for all categories)
  14. * Response: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
  15. * Optional Content-Disposition filename.
  16. */
  17. export async function exportExpiryItemExcel(
  18. filters: ExportExpiryItemExcelParams,
  19. ): Promise<void> {
  20. const params = new URLSearchParams();
  21. if (filters.itemCode) params.set("itemCode", filters.itemCode);
  22. if (filters.itemName) params.set("itemName", filters.itemName);
  23. if (filters.lotNo) params.set("lotNo", filters.lotNo);
  24. if (filters.daysAhead != null) params.set("daysAhead", String(filters.daysAhead));
  25. if (filters.bucket) params.set("bucket", filters.bucket);
  26. const queryString = params.toString();
  27. const url = `${NEXT_PUBLIC_API_URL}/pickExecution/issues/expiryItem/excel${queryString ? `?${queryString}` : ""}`;
  28. const response = await clientAuthFetch(url, {
  29. method: "GET",
  30. headers: {
  31. Accept: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
  32. },
  33. });
  34. if (response.status === 401 || response.status === 403) {
  35. throw new Error("Unauthorized");
  36. }
  37. if (!response.ok) {
  38. throw new Error(`HTTP error! status: ${response.status}`);
  39. }
  40. const blob = await response.blob();
  41. const downloadUrl = window.URL.createObjectURL(blob);
  42. const link = document.createElement("a");
  43. link.href = downloadUrl;
  44. const contentDisposition = response.headers.get("Content-Disposition");
  45. let fileName = "expiry-items.xlsx";
  46. if (contentDisposition?.includes("filename=")) {
  47. fileName = contentDisposition
  48. .split("filename=")[1]
  49. .split(";")[0]
  50. .replace(/"/g, "");
  51. }
  52. link.setAttribute("download", fileName);
  53. document.body.appendChild(link);
  54. link.click();
  55. link.remove();
  56. window.URL.revokeObjectURL(downloadUrl);
  57. }