import { useState, useEffect } from 'react'; import api from '../../services/api'; import { Save, DollarSign, FileText, Type, AlertCircle } from 'lucide-react'; import { processCategories, type FlatCategory } from '../../utils/categoryTreeUtils'; interface PricingConfig { basePrice: number; baseWordCount: number; extraWordPrice: number; specialChars: string; specialCharPrice: number; boldSurcharge: number; frameSurcharge: number; } export default function PricingManager() { const [flatCategories, setFlatCategories] = useState([]); const [selectedCat, setSelectedCat] = useState(null); // Configuración por defecto const defaultConfig: PricingConfig = { basePrice: 0, baseWordCount: 15, extraWordPrice: 0, specialChars: '!', specialCharPrice: 0, boldSurcharge: 0, frameSurcharge: 0 }; const [config, setConfig] = useState(defaultConfig); const [loading, setLoading] = useState(false); const [saving, setSaving] = useState(false); useEffect(() => { // Cargar categorías y procesar árbol api.get('/categories').then(res => { const processed = processCategories(res.data); setFlatCategories(processed); }); }, []); useEffect(() => { if (selectedCat) { setLoading(true); // Cargar config existente api.get(`/pricing/${selectedCat}`) .then(res => { if (res.data) setConfig(res.data); else setConfig(defaultConfig); // Reset si es nuevo }) .finally(() => setLoading(false)); } }, [selectedCat]); const handleSave = async () => { if (!selectedCat) return; setSaving(true); try { await api.post('/pricing', { ...config, categoryId: selectedCat }); alert('Configuración guardada correctamente.'); } catch (e) { alert('Error al guardar.'); } finally { setSaving(false); } }; // Helper para el nombre del rubro seleccionado const selectedCatName = flatCategories.find(c => c.id === selectedCat)?.path; return (

Gestor de Tarifas y Reglas

{/* SELECTOR DE RUBRO */}
{/* Flecha custom para estilo */}
{selectedCat && (

Editando: {selectedCatName}

)}
{selectedCat && (
{/* TARIFA BASE */}

Tarifa Base (Texto)

$ setConfig({ ...config, basePrice: parseFloat(e.target.value) })} />

Costo por el aviso básico por día.

setConfig({ ...config, baseWordCount: parseInt(e.target.value) })} />
setConfig({ ...config, extraWordPrice: parseFloat(e.target.value) })} />
{/* CONTENIDO ESPECIAL */}

Caracteres Especiales

setConfig({ ...config, specialChars: e.target.value })} />

Cada uno de estos símbolos se cobrará aparte.

$ setConfig({ ...config, specialCharPrice: parseFloat(e.target.value) })} />
{/* ESTILOS VISUALES */}

Estilos Visuales (Recargos)

N
setConfig({ ...config, boldSurcharge: parseFloat(e.target.value) })} />
A
setConfig({ ...config, frameSurcharge: parseFloat(e.target.value) })} />
{/* BARRA DE ACCIÓN FLOTANTE */}
Configurando tarifas para: {selectedCatName}
)}
); }