/**
* Página Operações — Tickets e Cobertura de PROCs
* @author Descomplicar® | @link descomplicar.pt | @copyright 2026
*/
import { useState, useEffect, useCallback } from 'react'
import { motion } from 'framer-motion'
import {
BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer,
} from 'recharts'
import {
Ticket,
AlertTriangle,
Clock,
FileText,
Building2,
RefreshCw,
} from 'lucide-react'
// ---------------------------------------------------------------------------
// Tipos
// ---------------------------------------------------------------------------
interface TicketsByDept {
dept: string
count: number
}
interface CoverageItem {
dept: string
procs: number
total_expected: number
pct: number
}
interface OperationsData {
tickets: {
open: number
high_priority: number
avg_response_hours: number
by_department: TicketsByDept[]
}
procedures: {
total: number
departments: number
coverage: CoverageItem[]
}
}
// ---------------------------------------------------------------------------
// Animações
// ---------------------------------------------------------------------------
const containerVariants = {
hidden: { opacity: 0 },
show: { opacity: 1, transition: { staggerChildren: 0.05 } },
}
const itemVariants = {
hidden: { opacity: 0, y: 20 },
show: { opacity: 1, y: 0 },
}
// ---------------------------------------------------------------------------
// Sub-componentes
// ---------------------------------------------------------------------------
const StatCard = ({
label, value, icon: Icon, color, sub,
}: {
label: string
value: string
icon: React.ElementType
color: string
sub?: string
}) => (
{label}
{payload.map((p, i) => ({p.name}: {p.value}
))}A carregar dados de operações...
Tickets de Suporte e Cobertura de Procedimentos
| Departamento | PROCs | Esperados | Cobertura | % |
|---|---|---|---|---|
| {item.dept} | {item.procs} | {item.total_expected} |
|
= 80 ? '#34d399' : item.pct >= 50 ? '#fbbf24' : '#f87171', }} > {item.pct}% |