"use client"; import React, { useEffect, useState } from "react"; import { LineChart } from "@mui/x-charts/LineChart"; import { DashboardFinancialsResult, getDashboardFinancials, } from "../../landing/dashboard/Dashboard.Service"; import { loadCollaboratorsByCompanyId } from "../../admin/(organization-profile)/org/profile/[id]/collaborators/Collaborators.Service"; import { CompanyEmployeesView } from "@models/Collaborators.model"; import UnpaidIncomeCard from "../UnpaidIncomeCard/UnpaidIncomeCard"; import styles from "./FinancialWidget.module.css"; import dayjs from "dayjs"; import OpenInNewOutlinedIcon from "@mui/icons-material/OpenInNewOutlined"; import { useNavigation } from "@core/app/hooks/goto"; export interface FinancialWidgetProps { sessionUser: string; selectedOrgId: string; organizationName?: string; } export default function FinancialWidget({ sessionUser, selectedOrgId, organizationName, }: FinancialWidgetProps) { const { goTo } = useNavigation(); const [selectedTimeframe, setSelectedTimeframe] = useState<"week" | "month" | "year">("month"); const [selectedEmployeeId, setSelectedEmployeeId] = useState(""); const [collaborators, setCollaborators] = useState([]); const [financials, setFinancials] = useState(null); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const [isOpen, setIsOpen] = useState(true); useEffect(() => { if (selectedOrgId) { loadCollaboratorsByCompanyId({ companyId: selectedOrgId }) .then((res) => { setCollaborators(res); setSelectedEmployeeId(""); // reset employee filter when org changes }) .catch(console.error); } }, [selectedOrgId, sessionUser]); useEffect(() => { if (selectedOrgId) { setLoading(true); setError(null); setFinancials(null); getDashboardFinancials({ sessionUser, companyId: selectedOrgId, timeframe: selectedTimeframe, employeeId: selectedEmployeeId || undefined, }) .then((res) => { setFinancials(res); }) .catch((err) => { const errMsg = err.format ? err.format() : err.message; console.warn("Acceso denegado a métricas financieras: ", errMsg); setError("No tienes permisos de administrador para esta organización."); }) .finally(() => setLoading(false)); } }, [selectedOrgId, selectedTimeframe, selectedEmployeeId, sessionUser]); const formatCurrency = (val: number) => { return new Intl.NumberFormat("es-AR", { style: "currency", currency: "ARS" }).format(val); }; const renderComparison = () => { if (!financials) return null; const current = financials.currentPeriodTotal; const previous = financials.previousPeriodTotal; if (previous === 0) { if (current > 0) return +100% vs periodo anterior; return Sin datos previos; } const diff = current - previous; const percent = (diff / previous) * 100; if (percent > 0) return ( +{percent.toFixed(1)}% vs periodo anterior ); if (percent < 0) return ( {percent.toFixed(1)}% vs periodo anterior ); return 0% vs periodo anterior; }; if (!selectedOrgId) return null; if (error) { return (
{isOpen ? "−" : "+"}
{isOpen && (

Acceso Restringido

{error}

)} ); } const chartData = financials?.currentPeriodData || []; const xAxisData = chartData.map((d) => { // format label nicer depending on timeframe if (selectedTimeframe === "year") return dayjs(d.date).format("MMM YYYY"); return dayjs(d.date).format("DD/MM"); }); const seriesData = chartData.map((d) => d.amount); const hasChartData = chartData.some((d) => d.amount > 0); return (
{isOpen ? "−" : "+"}
{isOpen && ( <>
Ingresos del Periodo {loading ? "..." : formatCurrency(financials?.currentPeriodTotal || 0)}
{!loading && renderComparison()}
{financials && }
{loading && (
Cargando datos...
)} {!loading && hasChartData && (
val ? formatCurrency(val) : "0", }, ]} grid={{ horizontal: true }} margin={{ top: 20, bottom: 40, left: 70, right: 20 }} sx={{ ".MuiLineElement-root": { strokeWidth: 3, }, ".MuiAreaElement-root": { fill: "url(#gradient)", }, ".MuiChartsGrid-line": { strokeDasharray: "5 5", stroke: "#e5e7eb", }, ".MuiChartsAxis-line": { stroke: "transparent", }, ".MuiChartsAxis-tick": { stroke: "transparent", }, ".MuiChartsAxis-tickLabel": { fill: "#9ca3af", fontFamily: "inherit", fontSize: "12px", fontWeight: 500, }, ".MuiMarkElement-root": { stroke: "rgb(36, 169, 53)", strokeWidth: 2, fill: "#ffffff", scale: "1.2", }, }} >
)} )} ); }