npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@chalatech/turbopyme-react

v1.2.0

Published

Headless custom React hooks and primitives for Turbopyme API and SV DTE emissions

Downloads

352

Readme

@chalatech/turbopyme-react

Un conjunto de React Hooks personalizados y componentes "headless" (sin estilos forzados) para integrarse fácilmente con la API de Turbopyme y emitir Documentos Tributarios Electrónicos (DTE) para El Salvador.

Esta librería facilita la autenticación, el manejo de catálogos del Ministerio de Hacienda, y los complejos flujos de emisión de Facturas y Comprobantes de Crédito Fiscal.


⚡ TL;DR - Resumen Rápido

| Categoría | Nombre | Descripción | | :--- | :--- | :--- | | Hooks | useCatalogs | Carga catálogos de Hacienda (giros, ubicaciones). | | | useDteEmission | Firma y envía Facturas (FE) y Crédito Fiscal (CCF). | | | useCustomerProfile | Gestiona perfiles y datos fiscales de clientes. | | Componentes | <LocationSelect /> | Selector doble de Depto/Municipio vinculado. | | | <SearchableActivitySelect /> | Buscador de actividades económicas (giros). | | Validación | receptorFacturaSchema | Esquema Zod para clientes (DUI/Pasaporte). | | | receptorCCFSchema | Esquema Zod para empresas (NIT/NRC/Ubicación). | | | documentLineSchema | Esquema Zod para ítems de venta. |


🚀 Instalación

npm install @chalatech/turbopyme-react zod

(Nota: Esta librería utiliza zod para la validación de esquemas y está construida para react >= 18).


⚙️ Configuración Inicial

Para que los hooks puedan comunicarse con la API de Turbopyme, debes envolver tu aplicación (o la parte de tu app que facturará) con el TurbopymeProvider.

import { TurbopymeProvider } from '@chalatech/turbopyme-react';

function App() {
  return (
    <TurbopymeProvider 
      initialBaseUrl="https://app.turbopyme.com/api/v1"
      initialToken="eyJhbGciOiJIUzI1NiIsIn..." // Tu token JWT de sesión
    >
      <TuAplicacion />
    </TurbopymeProvider>
  );
}

🛠 Funcionalidades y Hooks Principales

1. useCatalogs (Catálogos de Hacienda)

Obtiene y almacena en memoria los catálogos oficiales necesarios para llenar un DTE, como Actividades Económicas, Departamentos y Municipios.

Ejemplo de uso:

import { useEffect } from 'react';
import { useCatalogs } from '@chalatech/turbopyme-react';

const CatalogoVista = () => {
  const { 
    activities, 
    locations, 
    fetchEconomicActivities, 
    fetchLocations, 
    loadingLocations 
  } = useCatalogs();

  useEffect(() => {
    fetchEconomicActivities();
    fetchLocations();
  }, []);

  if (loadingLocations) return <p>Cargando departamentos...</p>;

  return (
    <ul>
      {locations.map(depto => (
        <li key={depto.code}>{depto.value} (Municipios: {depto.municipios.length})</li>
      ))}
    </ul>
  );
};

2. useDteEmission (Emisión de DTEs)

Expone las funciones necesarias para enviar la carga (payload) a la API de Turbopyme para ser firmada y enviada a Hacienda. Soporta Factura Electrónica (FE) y Comprobante de Crédito Fiscal (CCF).

Ejemplo de Emisión de Factura (con datos reales simulados):

import { useDteEmission } from '@chalatech/turbopyme-react';

const Facturador = () => {
  const { emitFactura, loadingFactura } = useDteEmission();

  const manejarCobro = async () => {
    const payloadFactura = {
      receptor: {
        nombre: "Juan Pérez",
        tipoDocumento: "13", // 13 = DUI
        numDocumento: "01234567-8",
        correo: "[email protected]"
      },
      cuerpoDocumento: [
        {
          numItem: 1,
          tipoItem: 1, // 1 = Bienes
          cantidad: 2,
          codigo: "PROD-001",
          descripcion: "Zapatos de Cuero",
          precioUni: 45.00,
          montoDescu: 0,
          ventaGravada: 90.00,
          tributos: ["20"] // 20 = IVA Mínimo
        }
      ],
      resumen: {
        totalGravada: 90.00,
        montoTotalOperacion: 90.00,
        totalPagar: 90.00
      }
    };

    try {
      const resultado = await emitFactura(payloadFactura);
      console.log('✅ Sello de recepción:', resultado.sello_recepcion);
      console.log('📄 Código de generación:', resultado.generation_code);
    } catch (error) {
      console.error('❌ Fallo al emitir:', error);
    }
  };

  return (
    <button onClick={manejarCobro} disabled={loadingFactura}>
      {loadingFactura ? 'Emitiendo...' : 'Emitir Factura de $90.00'}
    </button>
  );
};

3. useCustomerProfile (Gestión de Clientes)

Útil para cargar y actualizar la información fiscal de un cliente específico, ideal para pre-llenar los datos de facturación (NIT, NRC, Actividad Económica).

import { useEffect } from 'react';
import { useCustomerProfile } from '@chalatech/turbopyme-react';

const PerfilCliente = ({ customerId }) => {
  // Inicializamos el hook con el ID del cliente
  const { getCustomer, updateCustomer, loading } = useCustomerProfile(customerId);

  useEffect(() => {
    getCustomer().then(data => console.log('Datos del cliente:', data));
  }, [customerId]);

  const actualizarDatos = async () => {
    await updateCustomer({
      nombreLegal: "Inversiones Tecnologicas S.A. de C.V.",
      nrc: "123456-7",
      nit: "0614-010190-101-1",
      actividadEconomica: "62010" // Desarrollo de sistemas informáticos
    });
  };

  if (loading) return <p>Sincronizando información...</p>;

  return <button onClick={actualizarDatos}>Actualizar Perfil Fiscal</button>;
};

🧩 Componentes UI Incluidos

La librería provee componentes "headless" o sin estilos estrictos. Puedes pasarles tus propias clases de CSS o Tailwind a través de los props.

LocationSelect

Un componente compuesto que maneja automáticamente la relación entre Departamento y Municipio.

import { useState } from 'react';
import { LocationSelect } from '@chalatech/turbopyme-react';

const FormularioDireccion = () => {
  const [depto, setDepto] = useState('06'); // 06 = San Salvador (Catálogo Hacienda)
  const [muni, setMuni] = useState('14'); // 14 = San Salvador centro

  return (
    <LocationSelect 
      departamento={depto}
      municipio={muni}
      onDepartamentoChange={setDepto}
      onMunicipioChange={setMuni}
      // Estilos personalizados
      className="flex flex-col gap-4"
      selectClassName="border p-2 rounded w-full"
    />
  );
};

SearchableActivitySelect

El catálogo de actividades económicas del Ministerio de Hacienda tiene más de 1000 registros. Este componente provee un buscador integrado para filtrar por código o nombre de actividad.

import { useState } from 'react';
import { SearchableActivitySelect } from '@chalatech/turbopyme-react';

const FormularioFiscal = () => {
  const [actividad, setActividad] = useState('62010');

  return (
    <div>
      <label>Actividad Económica (Giro)</label>
      <SearchableActivitySelect
        value={actividad}
        onChange={setActividad}
        placeholder="Ej. Restaurantes, Desarrollo de software..."
        inputClassName="border p-2 w-full rouded"
        listClassName="bg-white border shadow-lg"
        itemClassName="hover:bg-gray-100 p-2"
      />
    </div>
  );
};

👨‍💻 Validación con Zod (dteSchemas)

La librería exporta esquemas ya construidos y validados con las reglas exclusivas del Ministerio de Hacienda de El Salvador. Estos son perfectos para usar junto con react-hook-form y @hookform/resolvers para validar tus UI antes del envío.

Esquemas disponibles:

  • receptorFacturaSchema: Valida un cliente común (Factura Electrónica). Exige nombre válido y correos verificados.
  • receptorCCFSchema: Valida empresas para un Crédito Fiscal. Obliga a que tengan NIT de 14 dígitos (sin guiones), NRC, Ubicación Exacta y Actividad Económica.
  • documentLineSchema: Valida una línea de ítem en la factura (cantidades válidas, mínimo de montos, etc).
  • emisorSchema: Valida los datos fiscales de la propia empresa que emite.

Ejemplo de Validación Básica:

import { receptorCCFSchema } from '@chalatech/turbopyme-react';

const datosCliente = {
  nombre: "Distribuidora El Salvador",
  nit: "06141212801015", // sin guiones, ¡válido!
  nrc: "12345-6",
  actividadEconomica: "45200",
  departamento: "06", // San Salvador
  municipio: "14", // San Salvador
  complemento: "Calle San Antonio Abad",
  correo: "[email protected]"
};

try {
  // Parse verificará reglas automáticamente
  const valido = receptorCCFSchema.parse(datosCliente);
  console.log("Datos de empresa correctos:", valido);
} catch (error) {
  // Manejo de los errores tipográficos definidos en español
  console.error(error.errors);
}

📄 Funciones de Construcción (dteBuilders)

La librería también exporta funciones utilitarias que ayudan a estructurar JSON complejos de emisión, listos para enviar a useDteEmission().

📎 Licencia

MIT © Chalatech