import React, { useEffect, useState } from 'react'; import { useVehicles } from '../hooks/useVehicles'; import { Truck, Search, Plus, Filter, Pencil, Info, MapPin, Calendar, FileText, CheckCircle2, User, DollarSign, Wifi, Activity, Database } from 'lucide-react'; import { Card, CardHeader } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { motion, AnimatePresence } from 'framer-motion'; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { toast } from 'sonner'; /** * Gestão de Veículos (Frota & Bases). * Cadastro Master completo com abas para organização de dados. */ export const FleetManagementView = () => { const { vehicles, loading, fetchVehicles, createVehicle, updateVehicle } = useVehicles(); const [searchTerm, setSearchTerm] = useState(''); // State for Modal const [isModalOpen, setIsModalOpen] = useState(false); const [editingVehicle, setEditingVehicle] = useState(null); // Form State - Inicializado com todos os campos do JSON const [formData, setFormData] = useState({ // Identificação placa: '', chassi: '', renavam: '', modelo: '', fabricante: '', cor: '', ano_fabricacao: '', ano_modelo: '', tipo_placa: '', // Mercosul, Cinza... // Classificação categoria: '', // Utilitário, Passeio tipo_frota: '', // Locação, Próprio atuacao: '', // Mercado Livre, Shopee... // Operacional base: '', uf: '', proprietario: '', // Localiza, Movida cnpj: '', contrato: '', // Responsáveis gestor: '', coordenador: '', dispatcher: '', fiscal_operacao: '', // Financeiro valor_fipe: '', valor_aluguel: '', primeira_locacao: '', data_limite: '', // Rastreadores (Strings "SIM"/"NÃO") geotab: 'NÃO', sascar: 'NÃO', golfleet: 'NÃO', pooltrack: 'NÃO', t4s: 'NÃO', ultimo_moki: '' }); useEffect(() => { fetchVehicles(); }, [fetchVehicles]); const filteredVehicles = vehicles.filter(v => v.placa?.toLowerCase().includes(searchTerm.toLowerCase()) || v.modelo?.toLowerCase().includes(searchTerm.toLowerCase()) || v.chassi?.toLowerCase().includes(searchTerm.toLowerCase()) ); const handleOpenModal = (vehicle = null) => { if (vehicle) { setEditingVehicle(vehicle); setFormData({ placa: vehicle.placa || '', chassi: vehicle.chassi || '', renavam: vehicle.renavam || '', modelo: vehicle.modelo || '', fabricante: vehicle.fabricante || '', cor: vehicle.cor || '', ano_fabricacao: vehicle.ano_fabricacao || '', ano_modelo: vehicle.ano_modelo || '', tipo_placa: vehicle.tipo_de_placa || '', // Atenção ao nome do campo no JSON (tipo_de_placa) vs form categoria: vehicle.categoria || '', tipo_frota: vehicle.tipo_frota || '', atuacao: vehicle.atuacao || '', base: vehicle.base || '', uf: vehicle.uf || '', proprietario: vehicle.proprietario || '', cnpj: vehicle.cnpj || '', contrato: vehicle.contrato || '', gestor: vehicle.gestor || '', coordenador: vehicle.coordenador || '', dispatcher: vehicle.dispatcher || '', fiscal_operacao: vehicle.fiscal_operacao || '', valor_fipe: vehicle.valor_fipe || '', valor_aluguel: vehicle.valor_aluguel || '', primeira_locacao: vehicle.primeira_locacao || '', data_limite: vehicle.data_limite || '', geotab: vehicle.geotab || 'NÃO', sascar: vehicle.sascar || 'NÃO', golfleet: vehicle.golfleet || 'NÃO', pooltrack: vehicle.pooltrack || 'NÃO', t4s: vehicle.t4s || 'NÃO', ultimo_moki: vehicle.ultimo_moki || '' }); } else { setEditingVehicle(null); // Reset form setFormData({ placa: '', chassi: '', renavam: '', modelo: '', fabricante: '', cor: '', ano_fabricacao: '', ano_modelo: '', tipo_placa: '', categoria: '', tipo_frota: '', atuacao: '', base: '', uf: '', proprietario: '', cnpj: '', contrato: '', gestor: '', coordenador: '', dispatcher: '', fiscal_operacao: '', valor_fipe: '', valor_aluguel: '', primeira_locacao: '', data_limite: '', geotab: 'NÃO', sascar: 'NÃO', golfleet: 'NÃO', pooltrack: 'NÃO', t4s: 'NÃO', ultimo_moki: '' }); } setIsModalOpen(true); }; const handleInputChange = (field, value) => { setFormData(prev => ({ ...prev, [field]: value })); }; const handleSubmit = async (e) => { e.preventDefault(); let success = false; // Normalizar payload (ajuste tipo_placa -> tipo_de_placa se necessário pelo backend) const payload = { ...formData, tipo_de_placa: formData.tipo_placa // Backend usa tipo_de_placa no GET, assumindo no POST }; if (editingVehicle) { // Usa idveiculo_frota conforme JSON success = await updateVehicle(editingVehicle.idveiculo_frota, payload); } else { success = await createVehicle(payload); } if (success) { setIsModalOpen(false); } }; return (
{/* Header */}

Frota & Bases

Gestão centralizada de ativos e alocações.

{/* Main Content */}
setSearchTerm(e.target.value)} />
{filteredVehicles.map((v) => ( ))} {filteredVehicles.length === 0 && ( )}
Veículo Classificação Operacional Rastreadores Opções
{v.placa} {v.modelo} - {v.fabricante} {v.ano_modelo}/{v.ano_fabricacao} • {v.cor}
{v.categoria}
{v.tipo_frota} • {v.tipo_de_placa}
{v.atuacao}
{v.base} - {v.uf}
{v.proprietario}
{v.gestor && Gestor: {v.gestor}}
{v.geotab === 'SIM' && GEOTAB} {v.sascar === 'SIM' && SASCAR} {v.golfleet === 'SIM' && GOLFLEET} {v.pooltrack === 'SIM' && POOL} {v.t4s === 'SIM' && T4S} {!v.geotab && !v.sascar && !v.golfleet && !v.pooltrack && !v.t4s && Sem Rastreador}
Nenhum veículo encontrado com os filtros atuais.
{/* Modal Cadastro/Edição */} {editingVehicle ? 'Editar Veículo' : 'Novo Veículo'} Preencha os dados completos do ativo.
Básicos Operacional Financeiro Rastreadores
{/* --- ABA BÁSICOS --- */}
handleInputChange('placa', e.target.value)} required placeholder="ABC-1234" />
handleInputChange('chassi', e.target.value)} placeholder="XYZ..." />
handleInputChange('renavam', e.target.value)} />
handleInputChange('cor', e.target.value)} placeholder="Ex: Branco" />
handleInputChange('fabricante', e.target.value)} placeholder="Fiat, VW..." />
handleInputChange('modelo', e.target.value)} placeholder="Fiorino, Gol..." />
handleInputChange('ano_fabricacao', e.target.value)} placeholder="2024" />
handleInputChange('ano_modelo', e.target.value)} placeholder="2025" />
handleInputChange('tipo_placa', e.target.value)} placeholder="Reserva..." />
{/* --- ABA OPERACIONAL --- */}
handleInputChange('base', e.target.value)} placeholder="Ex: SRJ10" />
handleInputChange('uf', e.target.value)} maxLength={2} placeholder="SP" />
handleInputChange('atuacao', e.target.value)} placeholder="Ex: Mercado Livre" />
handleInputChange('gestor', e.target.value)} />
handleInputChange('coordenador', e.target.value)} />
handleInputChange('dispatcher', e.target.value)} />
handleInputChange('fiscal_operacao', e.target.value)} />
{/* --- ABA FINANCEIRO --- */}
handleInputChange('valor_fipe', e.target.value)} placeholder="0,00" />
handleInputChange('valor_aluguel', e.target.value)} placeholder="0,00" />
handleInputChange('cnpj', e.target.value)} />
handleInputChange('contrato', e.target.value)} />
handleInputChange('primeira_locacao', e.target.value)} />
handleInputChange('data_limite', e.target.value)} />
{/* --- ABA RASTREADORES --- */}
{['geotab', 'sascar', 'golfleet', 'pooltrack', 't4s'].map((tracker) => (
))}
handleInputChange('ultimo_moki', e.target.value)} placeholder="Ex: Fazer novo Moki" />
); };