149 lines
4.3 KiB
TypeScript
149 lines
4.3 KiB
TypeScript
|
|
import { useState } from 'react';
|
|
import { supabase } from '@/integrations/supabase/client';
|
|
import { toast } from 'sonner';
|
|
import { ComponentePeca } from './useComponentesPeca';
|
|
|
|
export function useComponentesTableActions() {
|
|
const [importLoading, setImportLoading] = useState(false);
|
|
|
|
const exportTemplateCSV = () => {
|
|
const headers = [
|
|
'marca_componente',
|
|
'descricao',
|
|
'perfil',
|
|
'peso_unitario',
|
|
'quantidade_por_peca'
|
|
];
|
|
|
|
const csvContent = headers.join(',');
|
|
const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });
|
|
const link = document.createElement('a');
|
|
link.href = URL.createObjectURL(blob);
|
|
link.download = 'template_componentes.csv';
|
|
link.click();
|
|
|
|
toast.success('Template CSV de componentes baixado com sucesso!');
|
|
};
|
|
|
|
const exportComponentesCSV = (componentes: ComponentePeca[], pecaMarca: string) => {
|
|
if (componentes.length === 0) {
|
|
toast.error('Nenhum componente para exportar');
|
|
return;
|
|
}
|
|
|
|
const headers = [
|
|
'marca_componente',
|
|
'descricao',
|
|
'perfil',
|
|
'peso_unitario',
|
|
'quantidade_por_peca'
|
|
];
|
|
|
|
const csvData = componentes.map(comp => [
|
|
comp.marca_componente,
|
|
comp.descricao || '',
|
|
comp.perfil || '',
|
|
comp.peso_unitario,
|
|
comp.quantidade_por_peca
|
|
]);
|
|
|
|
const csvContent = [
|
|
headers.join(','),
|
|
...csvData.map(row => row.map(field => `"${field}"`).join(','))
|
|
].join('\n');
|
|
|
|
const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });
|
|
const link = document.createElement('a');
|
|
link.href = URL.createObjectURL(blob);
|
|
link.download = `componentes_${pecaMarca}_${new Date().toISOString().split('T')[0]}.csv`;
|
|
link.click();
|
|
|
|
toast.success(`${componentes.length} componentes exportados com sucesso!`);
|
|
};
|
|
|
|
const importComponentesCSV = async (file: File, pecaId: string, userId: string, onSuccess: () => void) => {
|
|
if (!file || !file.name.endsWith('.csv')) {
|
|
toast.error('Selecione um arquivo CSV válido');
|
|
return;
|
|
}
|
|
|
|
setImportLoading(true);
|
|
|
|
try {
|
|
const text = await file.text();
|
|
const lines = text.split('\n').filter(line => line.trim());
|
|
|
|
if (lines.length < 2) {
|
|
toast.error('Arquivo CSV deve conter pelo menos uma linha de dados');
|
|
return;
|
|
}
|
|
|
|
const headers = lines[0].split(',').map(h => h.trim().replace(/"/g, ''));
|
|
const expectedHeaders = ['marca_componente', 'descricao', 'perfil', 'peso_unitario', 'quantidade_por_peca'];
|
|
|
|
const hasRequiredHeaders = expectedHeaders.every(header => headers.includes(header));
|
|
if (!hasRequiredHeaders) {
|
|
toast.error('Arquivo CSV deve conter as colunas: ' + expectedHeaders.join(', '));
|
|
return;
|
|
}
|
|
|
|
const componentes = [];
|
|
|
|
for (let i = 1; i < lines.length; i++) {
|
|
const values = lines[i].split(',').map(v => v.trim().replace(/"/g, ''));
|
|
|
|
if (values.length !== headers.length) continue;
|
|
|
|
const componenteData: any = {
|
|
peca_id: pecaId,
|
|
user_id: userId
|
|
};
|
|
|
|
headers.forEach((header, index) => {
|
|
let value = values[index];
|
|
|
|
if (header === 'peso_unitario') {
|
|
componenteData[header] = parseFloat(value) || 0;
|
|
} else if (header === 'quantidade_por_peca') {
|
|
componenteData[header] = parseInt(value) || 1;
|
|
} else {
|
|
componenteData[header] = value || null;
|
|
}
|
|
});
|
|
|
|
if (!componenteData.marca_componente) continue;
|
|
|
|
componentes.push(componenteData);
|
|
}
|
|
|
|
if (componentes.length === 0) {
|
|
toast.error('Nenhum componente válido encontrado no arquivo');
|
|
return;
|
|
}
|
|
|
|
const { error } = await supabase
|
|
.from('componentes_peca')
|
|
.insert(componentes);
|
|
|
|
if (error) throw error;
|
|
|
|
toast.success(`${componentes.length} componente(s) importado(s) com sucesso!`);
|
|
onSuccess();
|
|
|
|
} catch (error) {
|
|
console.error('Erro ao importar componentes:', error);
|
|
toast.error('Erro ao importar componentes do CSV');
|
|
} finally {
|
|
setImportLoading(false);
|
|
}
|
|
};
|
|
|
|
return {
|
|
importLoading,
|
|
exportTemplateCSV,
|
|
exportComponentesCSV,
|
|
importComponentesCSV
|
|
};
|
|
}
|