import React, { useState, useEffect } from "react"; import ArcGauge from "../ArcGauge"; import LoadingSpinner from "../LoadingSpinner"; import { env } from "../../src/config/env"; import { authService } from "../../src/services/auth.service"; import { formatCurrency, formatNumber } from "../../utils/formatters"; interface SaleSeller { supervisorId: number; store: string; sellerId: number; sellerName: string; qtdeDaysMonth: number; qtdeDays: number; objetivo: number; saleValue: number; dif: number; ObjetivoSale: number; percentualObjective: number; qtdeInvoice: number; ticket: number; listPrice: number; discountValue: number; percentOff: number; mix: number; saleToday: number; devolution: number; preSaleValue: number; preSaleQtde: number; objetiveHour?: number; percentualObjectiveHour?: number; } interface DashboardSeller { objetive: number; sale: number; percentualSale: number; discount: number; mix: number; objetiveToday: number; saleToday: number; nfs: number; devolution: number; nfsToday: number; objetiveHour: number; percentualObjetiveHour: number; saleSupervisor: SaleSeller[]; } const DashboardSellerView: React.FC = () => { const [data, setData] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { const fetchDashboardData = async () => { try { setLoading(true); setError(null); const token = authService.getToken(); const supervisorId = authService.getSupervisor(); const apiUrl = env.API_URL.replace(/\/$/, ""); if (!supervisorId) { throw new Error("Supervisor ID não encontrado."); } const response = await fetch( `${apiUrl}/dashboard/sale/${supervisorId}`, { method: "GET", headers: { "Content-Type": "application/json", ...(token && { Authorization: `Basic ${token}` }), }, } ); if (!response.ok) { const errorData = await response.json().catch(() => ({})); throw new Error( errorData.message || "Erro ao buscar dados do dashboard do vendedor." ); } const result = await response.json(); setData(result); } catch (err) { console.error("Erro ao buscar dados do dashboard:", err); setError( err instanceof Error ? err.message : "Não foi possível carregar os dados do dashboard." ); } finally { setLoading(false); } }; fetchDashboardData(); }, []); const colors = [ { to: 25, color: "#f31700" }, { from: 25, to: 50, color: "#f31700" }, { from: 50, to: 70, color: "#ffc000" }, { from: 70, color: "#0aac25" }, ]; if (loading) { return (
); } if (error) { return (

{error}

); } if (!data || !data.saleSupervisor || data.saleSupervisor.length === 0) { return (

Nenhum dado de vendas disponível.

); } const firstSeller = data.saleSupervisor[0]; const faturamentoDiaPercentual = data.objetiveToday > 0 ? (data.saleToday / data.objetiveToday) * 100 : 0; const ticketMedioDia = data.nfsToday > 0 ? data.saleToday / data.nfsToday : 0; return (
{/* Header */}

Dashboard - Venda mês

{firstSeller.supervisorId} - {firstSeller.store}

{/* Cards de Analytics */}
{/* Card 1: Faturamento Dia */}

{formatCurrency(data.saleToday)}

Faturamento Dia
{formatCurrency(data.objetiveToday)} ( {formatNumber(faturamentoDiaPercentual)}%)
Ticket Médio Dia

{formatCurrency(ticketMedioDia)}

{/* Card 2: Realizado Hora */}
{/* Card 3: Faturamento Líquido */}

{formatCurrency(data.sale)}

Faturamento Líquido
{formatCurrency(data.objetive)} ( {formatNumber(data.percentualSale)}%)
Devolução

{formatCurrency(data.devolution)}

{/* Card 4: Realizado */}
{/* Tabela de Vendedores */}

Vendedores

{[ "Vendedor", "Meta dia", "Meta Hora", "Venda dia", "% Hora", "% Dia", "Meta", "Realizado", "Dif", "%", "Qtde NFs", "Ticket Médio", "Desconto", "Mix", "Qtde Orçamento", "VL Orçamento", ].map((h) => ( ))} {data.saleSupervisor.map((seller, idx) => { const percentualDia = seller.ObjetivoSale > 0 ? (seller.saleToday / seller.ObjetivoSale) * 100 : 0; return ( ); })}
{h}
{seller.sellerName} {formatCurrency(seller.ObjetivoSale)} {formatCurrency(seller.objetiveHour || 0)} {formatCurrency(seller.saleToday)}
= 100 ? "bg-emerald-500" : (seller.percentualObjectiveHour || 0) >= 70 ? "bg-orange-500" : "bg-red-500" }`} style={{ width: `${Math.min( seller.percentualObjectiveHour || 0, 100 )}%`, }} >
{formatNumber(seller.percentualObjectiveHour || 0)}%
= 100 ? "bg-emerald-500" : percentualDia >= 70 ? "bg-orange-500" : "bg-red-500" }`} style={{ width: `${Math.min(percentualDia, 100)}%`, }} >
{formatNumber(percentualDia)}%
{formatCurrency(seller.objetivo)} {formatCurrency(seller.saleValue)} {formatCurrency(seller.dif)}
= 100 ? "bg-emerald-500" : seller.percentualObjective >= 70 ? "bg-orange-500" : "bg-red-500" }`} style={{ width: `${Math.min( seller.percentualObjective, 100 )}%`, }} >
{formatNumber(seller.percentualObjective)}%
{formatNumber(seller.qtdeInvoice, 0)} {formatCurrency(seller.ticket)} {formatCurrency(seller.discountValue)} {formatNumber(seller.mix, 0)} {formatNumber(seller.preSaleQtde, 0)} {formatCurrency(seller.preSaleValue)}
); }; export default DashboardSellerView;