'use client'; import { useEffect, useState } from 'react'; import { useQuery, useQueryClient } from '@tanstack/react-query'; import { Header } from '@/components/layouts/header'; import { Card, CardContent, CardHeader, CardTitle, Button, Label } from '@horux/shared-ui'; import { Receipt, Save, AlertCircle } from 'lucide-react'; import { apiClient } from '@/lib/api/client'; import { getUsosCfdi } from '@/lib/api/catalogos'; interface PreferenciasFacturacion { factPreferencia: 'publico_general' | 'mis_datos'; factUsoCfdi: string; factRegimenPreferido: string | null; regimenesActivos: { clave: string; descripcion: string }[]; } export default function PreferenciasFacturacionPage() { const queryClient = useQueryClient(); const [saving, setSaving] = useState(false); const [message, setMessage] = useState<{ kind: 'ok' | 'err'; text: string } | null>(null); const { data: prefs, isLoading } = useQuery({ queryKey: ['preferencias-facturacion'], queryFn: () => apiClient.get('/facturacion/preferencias-facturacion').then(r => r.data), }); const { data: usosCfdiAll = [] } = useQuery({ queryKey: ['usos-cfdi'], queryFn: getUsosCfdi, }); // Solo se permiten 2 usos para auto-facturación de pagos del SaaS: // G03 (Gastos en general) — el más común para servicios deducibles. // S01 (Sin efectos fiscales) — para clientes que no requieren deducir. const ALLOWED_USOS = ['G03', 'S01']; const usosCfdi = usosCfdiAll.filter(u => ALLOWED_USOS.includes(u.clave)); const [form, setForm] = useState({ factPreferencia: 'mis_datos', factUsoCfdi: 'G03', factRegimenPreferido: null, regimenesActivos: [], }); useEffect(() => { if (prefs) setForm(prefs); }, [prefs]); const onSave = async () => { setSaving(true); setMessage(null); try { await apiClient.put('/facturacion/preferencias-facturacion', { factPreferencia: form.factPreferencia, factUsoCfdi: form.factUsoCfdi, factRegimenPreferido: form.factRegimenPreferido, }); queryClient.invalidateQueries({ queryKey: ['preferencias-facturacion'] }); setMessage({ kind: 'ok', text: 'Preferencias guardadas. Aplicará a futuros pagos auto-facturados.' }); } catch (err: any) { setMessage({ kind: 'err', text: err?.response?.data?.message || err?.message || 'Error al guardar' }); } finally { setSaving(false); } }; const isPubGen = form.factPreferencia === 'publico_general'; const tieneRegimenes = form.regimenesActivos.length > 0; const advertirSinRegimenes = form.factPreferencia === 'mis_datos' && !tieneRegimenes; return ( <>
Auto-facturación de pagos de suscripción

Cuando MercadoPago confirma un pago de tu suscripción, Horux 360 emite automáticamente un CFDI. Aquí defines a qué nombre y con qué uso CFDI.

{isLoading ? (
Cargando…
) : (
{/* Toggle preferencia */}
{/* Advertencia si sin CSF y eligió "mis datos" */} {advertirSinRegimenes && (
No tienes regímenes fiscales registrados. Sube tu FIEL en /configuracion para que el sistema descargue tu CSF y sincronice automáticamente. Mientras tanto, las facturas saldrán a Público en General aunque la preferencia esté en "Mis datos".
)} {/* Uso CFDI (solo si "mis datos") */} {!isPubGen && (

Por defecto G03 (Gastos en general). Tu contador puede recomendarte otro.

)} {/* Régimen preferido (solo si "mis datos" Y tiene varios) */} {!isPubGen && form.regimenesActivos.length > 1 && (

Tienes varios regímenes activos. Elige cuál usar al facturar tus pagos.

)} {!isPubGen && form.regimenesActivos.length === 1 && (
Régimen fiscal:{' '} {form.regimenesActivos[0].clave} — {form.regimenesActivos[0].descripcion}
)} {/* Mensaje + botón */} {message && (
{message.text}
)}
)}
); }