"use client"; import { NEXT_PUBLIC_API_URL } from '@/config/api'; import { clientAuthFetch } from '@/app/utils/clientAuthFetch'; export interface ItemCodeWithName { code: string; name: string; } export interface ItemCodeWithCategory { code: string; category: string; name?: string; } /** * Fetch item codes for SemiFG Production Analysis Report * @param stockCategory - Comma-separated stock categories (e.g., "FG,WIP") or empty string for all * @returns Array of item codes with names */ export const fetchSemiFGItemCodes = async ( stockCategory: string = '' ): Promise => { let url = `${NEXT_PUBLIC_API_URL}/report/semi-fg-item-codes`; if (stockCategory && stockCategory !== 'All' && !stockCategory.includes('All')) { url = `${url}?stockCategory=${stockCategory}`; } const response = await clientAuthFetch(url, { method: 'GET', headers: { 'Content-Type': 'application/json' }, }); if (response.status === 401 || response.status === 403) throw new Error("Unauthorized"); if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`); return await response.json(); }; /** * Fetch item codes with category information for SemiFG Production Analysis Report * @param stockCategory - Comma-separated stock categories (e.g., "FG,WIP") or empty string for all * @returns Array of item codes with category and name */ export const fetchSemiFGItemCodesWithCategory = async ( stockCategory: string = '' ): Promise => { let url = `${NEXT_PUBLIC_API_URL}/report/semi-fg-item-codes-with-category`; if (stockCategory && stockCategory !== 'All' && !stockCategory.includes('All')) { url = `${url}?stockCategory=${stockCategory}`; } const response = await clientAuthFetch(url, { method: 'GET', headers: { 'Content-Type': 'application/json' }, }); if (response.status === 401 || response.status === 403) throw new Error("Unauthorized"); if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`); return await response.json(); }; /** * Generate and download the SemiFG Production Analysis Report PDF * @param criteria - Report criteria parameters * @param reportTitle - Title of the report for filename * @returns Promise that resolves when download is complete */ export const generateSemiFGProductionAnalysisReport = async ( criteria: Record, reportTitle: string = '成品/半成品生產分析報告' ): Promise => { const queryParams = new URLSearchParams(criteria).toString(); const url = `${NEXT_PUBLIC_API_URL}/report/print-semi-fg-production-analysis?${queryParams}`; const response = await clientAuthFetch(url, { method: 'GET', headers: { Accept: 'application/pdf' }, }); if (response.status === 401 || response.status === 403) throw new Error("Unauthorized"); if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`); const blob = await response.blob(); const downloadUrl = window.URL.createObjectURL(blob); const link = document.createElement('a'); link.href = downloadUrl; const contentDisposition = response.headers.get('Content-Disposition'); let fileName = `${reportTitle}.pdf`; if (contentDisposition?.includes('filename=')) { fileName = contentDisposition.split('filename=')[1].split(';')[0].replace(/"/g, ''); } link.setAttribute('download', fileName); document.body.appendChild(link); link.click(); link.remove(); window.URL.revokeObjectURL(downloadUrl); }; /** * Generate and download the SemiFG Production Analysis Report as Excel * @param criteria - Report criteria parameters * @param reportTitle - Title of the report for filename * @returns Promise that resolves when download is complete */ export const generateSemiFGProductionAnalysisReportExcel = async ( criteria: Record, reportTitle: string = '成品/半成品生產分析報告' ): Promise => { const queryParams = new URLSearchParams(criteria).toString(); const url = `${NEXT_PUBLIC_API_URL}/report/print-semi-fg-production-analysis-excel?${queryParams}`; const response = await clientAuthFetch(url, { method: 'GET', headers: { Accept: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }, }); if (response.status === 401 || response.status === 403) throw new Error('Unauthorized'); if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`); const blob = await response.blob(); const downloadUrl = window.URL.createObjectURL(blob); const link = document.createElement('a'); link.href = downloadUrl; const contentDisposition = response.headers.get('Content-Disposition'); let fileName = `${reportTitle}.xlsx`; if (contentDisposition?.includes('filename=')) { fileName = contentDisposition.split('filename=')[1].split(';')[0].replace(/"/g, ''); } link.setAttribute('download', fileName); document.body.appendChild(link); link.click(); link.remove(); window.URL.revokeObjectURL(downloadUrl); };