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 (
Gestão centralizada de ativos e alocações.
| Veículo | Classificação | Operacional | Rastreadores | Opções |
|---|---|---|---|---|
|
{v.placa}
{v.modelo} - {v.fabricante}
{v.ano_modelo}/{v.ano_fabricacao} • {v.cor}
|
{v.tipo_frota} • {v.tipo_de_placa}
{v.atuacao}
|
|
{v.geotab === 'SIM' &&
|
|
| Nenhum veículo encontrado com os filtros atuais. | ||||