erp-platform/ui/src/utils/hooks/useReports.ts

228 lines
6.3 KiB
TypeScript
Raw Normal View History

2025-08-15 15:00:09 +00:00
import { ReportGeneratedDto, ReportTemplateDto, ReportCategoryDto } from '@/proxy/reports/models'
2025-08-15 08:07:51 +00:00
import ReportsService from '@/services/reports.service'
import { useState, useCallback, useEffect } from 'react'
const reportsService = new ReportsService()
interface ReportData {
templates: ReportTemplateDto[]
2025-08-15 11:52:30 +00:00
generatedReports: ReportGeneratedDto[]
2025-08-15 15:00:09 +00:00
categories: ReportCategoryDto[]
2025-08-15 08:07:51 +00:00
}
export const useReports = () => {
const [data, setData] = useState<ReportData>({
templates: [],
generatedReports: [],
2025-08-15 15:00:09 +00:00
categories: [],
2025-08-15 08:07:51 +00:00
})
const [isLoading, setIsLoading] = useState(false)
useEffect(() => {
const loadData = async () => {
setIsLoading(true)
try {
await new Promise((resolve) => setTimeout(resolve, 200))
2025-08-15 15:00:09 +00:00
const [templatesResponse, generatedReportsResponse, categoriesResponse] = await Promise.all(
[
reportsService.getTemplates({
sorting: '',
skipCount: 0,
maxResultCount: 1000,
}),
reportsService.getGeneratedReports({
sorting: '',
skipCount: 0,
maxResultCount: 1000,
}),
reportsService.getCategories(),
],
)
2025-08-15 08:07:51 +00:00
setData({
templates: templatesResponse.data.items || [],
generatedReports: generatedReportsResponse.data.items || [],
2025-08-15 15:00:09 +00:00
categories: categoriesResponse.data || [],
2025-08-15 08:07:51 +00:00
})
} catch (error) {
console.error('Error loading data:', error)
// Fallback to default data
setData({
templates: [],
generatedReports: [],
2025-08-15 15:00:09 +00:00
categories: [],
2025-08-15 08:07:51 +00:00
})
} finally {
setIsLoading(false)
}
}
loadData()
}, [])
const createTemplate = useCallback(
async (template: ReportTemplateDto) => {
setIsLoading(true)
try {
const response = await reportsService.createTemplate(template as ReportTemplateDto)
const newTemplate = response.data as ReportTemplateDto
// Update local state
setData((prevData) => ({
...prevData,
templates: [...prevData.templates, newTemplate],
}))
return newTemplate
} catch (error) {
console.error('Error creating template:', error)
throw error
} finally {
setIsLoading(false)
}
},
[data],
)
const updateTemplate = useCallback(async (id: string, updates: Partial<ReportTemplateDto>) => {
setIsLoading(true)
try {
// First get the current template to merge with updates
const currentTemplateResponse = await reportsService.getTemplateById(id)
const currentTemplate = currentTemplateResponse.data as ReportTemplateDto
const updatedTemplate = { ...currentTemplate, ...updates }
await reportsService.updateTemplate(id, updatedTemplate)
// Update local state
setData((prevData) => ({
...prevData,
templates: prevData.templates.map((template) =>
template.id === id
2025-08-15 15:00:09 +00:00
? { ...template, ...updates, lastModificationTime: new Date().toISOString() }
2025-08-15 08:07:51 +00:00
: template,
),
}))
} catch (error) {
console.error('Error updating template:', error)
throw error
} finally {
setIsLoading(false)
}
}, [])
const deleteTemplate = useCallback(async (id: string) => {
setIsLoading(true)
try {
await reportsService.deleteTemplate(id)
// Update local state
setData((prevData) => ({
...prevData,
templates: prevData.templates.filter((template) => template.id !== id),
}))
} catch (error) {
console.error('Error deleting template:', error)
throw error
} finally {
setIsLoading(false)
}
}, [])
const generateReport = useCallback(
async (templateId: string, parameterValues: Record<string, string>) => {
setIsLoading(true)
try {
2025-08-15 15:00:09 +00:00
const reportData = {
2025-08-15 08:07:51 +00:00
templateId,
parameters: parameterValues,
2025-08-15 15:00:09 +00:00
}
2025-08-15 08:07:51 +00:00
const response = await reportsService.generateReport(reportData)
2025-08-15 11:52:30 +00:00
const report = response.data as ReportGeneratedDto
2025-08-15 08:07:51 +00:00
if (report) {
// Update local state
setData((prevData) => ({
...prevData,
generatedReports: [...prevData.generatedReports, report],
}))
}
return report
} catch (error) {
console.error('Error generating report:', error)
throw error
} finally {
setIsLoading(false)
}
},
[],
)
const getReportById = useCallback(
async (reportId: string) => {
try {
const response = await reportsService.getGeneratedReportById(reportId)
2025-08-15 11:52:30 +00:00
return response.data as ReportGeneratedDto
2025-08-15 08:07:51 +00:00
} catch (error) {
console.error('Error getting report by id:', error)
// Fallback to local data
return data.generatedReports.find((report) => report.id === reportId)
}
},
[data.generatedReports],
)
const getTemplateById = useCallback(
async (templateId: string) => {
try {
const response = await reportsService.getTemplateById(templateId)
return response.data as ReportTemplateDto
} catch (error) {
console.error('Error getting template by id:', error)
// Fallback to local data
return data.templates.find((template) => template.id === templateId)
}
},
[data.templates],
)
2025-08-15 15:00:09 +00:00
const loadTemplatesByCategory = useCallback(async (categoryName?: string) => {
setIsLoading(true)
try {
const templatesResponse = await reportsService.getTemplates({
sorting: '',
skipCount: 0,
maxResultCount: 1000,
category: categoryName && categoryName !== 'Tümü' ? categoryName : undefined,
})
setData((prevData) => ({
...prevData,
templates: templatesResponse.data.items || [],
}))
} catch (error) {
console.error('Error loading templates by category:', error)
} finally {
setIsLoading(false)
}
}, [])
2025-08-15 08:07:51 +00:00
return {
templates: data.templates,
generatedReports: data.generatedReports,
2025-08-15 15:00:09 +00:00
categories: data.categories,
2025-08-15 08:07:51 +00:00
isLoading,
setIsLoading,
createTemplate,
updateTemplate,
deleteTemplate,
generateReport,
getReportById,
getTemplateById,
2025-08-15 15:00:09 +00:00
loadTemplatesByCategory,
2025-08-15 08:07:51 +00:00
}
}