import { useState, useMemo } from 'react'; import { Card, CardHeader } from '../../ui/Card'; import { Button } from '../../ui/Button'; import { Input } from '../../ui/Input'; import { CheckCircle, Activity, RotateCcw, Calculator } from 'lucide-react'; interface IngresoMarginalProps { ejercicioId: string; onComplete?: (puntuacion: number) => void; } interface FilaIngreso { q: number; p: number; } export function IngresoMarginal({ ejercicioId: _ejercicioId, onComplete }: IngresoMarginalProps) { const datosBase: FilaIngreso[] = [ { q: 0, p: 100 }, { q: 1, p: 90 }, { q: 2, p: 80 }, { q: 3, p: 70 }, { q: 4, p: 60 }, { q: 5, p: 50 }, { q: 6, p: 40 }, { q: 7, p: 30 }, { q: 8, p: 20 }, ]; const [respuestas, setRespuestas] = useState<{[key: string]: string}>({}); const [validado, setValidado] = useState(false); const [errores, setErrores] = useState([]); const datosCalculados = useMemo(() => { return datosBase.map((fila, index) => { const it = fila.p * fila.q; const itAnterior = index > 0 ? datosBase[index - 1].p * datosBase[index - 1].q : 0; const img = index > 0 ? it - itAnterior : null; return { ...fila, it, img }; }); }, []); const handleRespuestaChange = (q: number, valor: string) => { setRespuestas(prev => ({ ...prev, [`img_${q}`]: valor })); setValidado(false); }; const validarRespuestas = () => { const nuevosErrores: string[] = []; datosCalculados.forEach((fila) => { if (fila.img !== null) { const respuesta = parseFloat(respuestas[`img_${fila.q}`] || '0'); if (Math.abs(respuesta - fila.img) > 1) { nuevosErrores.push(`Q=${fila.q}: El IMg debería ser $${fila.img}`); } } }); setErrores(nuevosErrores); setValidado(true); if (nuevosErrores.length === 0 && onComplete) { onComplete(100); } }; const reiniciar = () => { setRespuestas({}); setValidado(false); setErrores([]); }; const maxIT = Math.max(...datosCalculados.map(d => d.it)); const maxIMG = Math.max(...datosCalculados.filter(d => d.img !== null).map(d => Math.abs(d.img || 0))); const escalaIT = maxIT > 0 ? 120 / maxIT : 1; const escalaIMG = maxIMG > 0 ? 60 / maxIMG : 1; return (
Concepto

El Ingreso Marginal es el cambio en el ingreso total resultante de vender una unidad adicional. Se calcula como: IMg = ΔIT / ΔQ. Cuando el precio debe bajar para vender más, el IMg {'<'} IT.

Cantidad (Q) $ (×100) {datosBase.map((d, i) => ( {d.q} ))} `${60 + i * 35},${160 - d.it * escalaIT}`).join(' ')} /> d.img !== null) .map((d, i) => `${95 + i * 35},${160 - (d.img || 0) * escalaIMG - 50}`) .join(' ')} /> IT IMg
{datosCalculados.map((fila) => ( ))}
Q P ($) IT ($) IMg ($)
{fila.q} {fila.p} {fila.it} {fila.img !== null ? ( handleRespuestaChange(fila.q, e.target.value)} className="w-24" placeholder="IMg" /> ) : ( - )}

Cálculo del Ingreso Marginal:

IMg = IT(Q) - IT(Q-1)

Ejemplo: Cuando Q aumenta de 2 a 3 unidades, el IT pasa de $160 a $210. El IMg de la 3ra unidad es $210 - $160 = $50.

{validado && errores.length === 0 && (
¡Todos los cálculos son correctos!
)} {validado && errores.length > 0 && (

Errores encontrados:

    {errores.map((error, i) => (
  • {error}
  • ))}
)}

Importancia del Ingreso Marginal:

  • Regla de maximización: La empresa maximiza beneficios cuando IMg = CMg
  • IMg {'<'} P: Cuando debe bajar el precio para vender más, el IMg es menor que el precio
  • IMg positivo: Mientras IMg {'>'} 0, el ingreso total aumenta
  • IMg negativo: Si IMg {'<'} 0, vender más reduce el ingreso total
); } export default IngresoMarginal;