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"; interface SaleSupervisor { supervisorId: number; name: string; sale: number; cost: number; devolution: number; objetivo: number; profit: number; percentual: number; nfs: number; } interface DashboardSale { sale: number; cost: number; devolution: number; objetivo: number; profit: number; percentual: number; nfs: number; saleSupervisor: SaleSupervisor[]; } const DashboardDayView: 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 apiUrl = env.API_URL.replace(/\/$/, ""); // Remove trailing slash const response = await fetch(`${apiUrl}/dashboard/sale`, { method: "GET", headers: { "Content-Type": "application/json", ...(token && { Authorization: `Basic ${token}` }), }, }); if (!response.ok) { throw new Error(`Erro ao carregar dados: ${response.statusText}`); } const result = await response.json(); setData(result); } catch (err) { setError( err instanceof Error ? err.message : "Erro ao carregar dados do dashboard" ); } finally { setLoading(false); } }; fetchDashboardData(); }, []); const formatCurrency = (value: number): string => { return new Intl.NumberFormat("pt-BR", { style: "currency", currency: "BRL", }).format(value); }; const formatNumber = (value: number, decimals: number = 2): string => { return new Intl.NumberFormat("pt-BR", { minimumFractionDigits: decimals, maximumFractionDigits: decimals, }).format(value); }; const colors = [ { to: 25, color: "#f31700" }, { from: 25, to: 50, color: "#f31700" }, { from: 50, to: 70, color: "#ffc000" }, { from: 70, color: "#0aac25" }, // Verde mais vibrante como na imagem ]; const colorsProfit = [ { to: 0, color: "#f31700" }, { from: 0, to: 20, color: "#f31700" }, { from: 20, to: 30, color: "#ffc000" }, { from: 30, color: "#0aac25" }, // Verde mais vibrante como na imagem ]; if (loading) { return (
); } if (error) { return (

{error}

); } if (!data) { return (

Nenhum dado disponível

); } const ticketMedio = data.nfs > 0 ? data.sale / data.nfs : 0; return (
{/* Header */}

Dashboard

Faturamento
{/* Cards Analytics */}
{/* Card 1: Faturamento Líquido */}

{formatCurrency(data.sale)}

Faturamento Líquido
{formatCurrency(data.objetivo)} ({formatNumber(data.percentual)}%)
Devolução {formatCurrency(data.devolution)}
{/* Card 2: Realizado */}
{/* Card 3: Margem Líquida */}
{/* Card 4: Cupons e Ticket Médio */}

{formatNumber(data.nfs, 0)}

Quantidade de cupons emitidos
Ticket Médio {formatCurrency(ticketMedio)}
{/* Tabela de Supervisores */}
{data.saleSupervisor.map((supervisor, idx) => ( ))}
# Loja Meta Realizado % Margem Devolução
{supervisor.supervisorId} {supervisor.name} {formatCurrency(supervisor.objetivo)} {formatCurrency(supervisor.sale)}
{formatNumber(supervisor.percentual)}%
= 100 ? "bg-emerald-500" : supervisor.percentual >= 70 ? "bg-[#22baa0]" : supervisor.percentual >= 50 ? "bg-[#ffc000]" : "bg-[#f31700]" }`} style={{ width: `${Math.min(supervisor.percentual, 100)}%`, }} >
{formatNumber(supervisor.profit)}% {formatCurrency(supervisor.devolution)}
); }; export default DashboardDayView;