Ir al contenido

Módulo Odoo

El módulo de sudte conecta Odoo con la API. Odoo no calcula impuestos fiscales, no arma el JSON del MH y no firma: envía la factura a sudte al confirmarla y guarda la respuesta. Así, los cambios de normativa se resuelven en sudte sin tocar tu instalación. Resumen comercial en facturación electrónica en Odoo.

Módulo Contenido
sudte_l10n_sv Localización de El Salvador: plan de cuentas mínimo, impuestos (IVA 13 %, retención y percepción 1 %, exento, no sujeto, exportación), posiciones fiscales, departamentos, municipios y distritos, actividades económicas, NIT, NRC y DUI en contactos con validación y control de duplicados, tipo de DTE por diario y unidades de medida CAT-014.
sudte_connector Envío a la API al confirmar, estados del DTE, PDF y JSON adjuntos, reintentos, consulta de estado, invalidación, notas de crédito y débito, webhooks y menú de reportes fiscales. Depende de sudte_l10n_sv.

Versiones: Odoo 20 Enterprise. Le siguen Odoo 20 Community y Odoo 18 con el mismo contrato de API. Funciona en instalaciones propias y en Odoo.sh; Odoo Online no permite módulos de terceros.

  1. Crea tu cuenta en app.sudte.com, registra el emisor (NIT de tu empresa) con sus establecimientos y puntos de venta, y carga las credenciales del MH del ambiente de pruebas.
  2. Copia sudte_l10n_sv y sudte_connector en tu ruta de addons (o en el repositorio de tu proyecto de Odoo.sh), actualiza la lista de aplicaciones e instala sudte connector.
  3. En Ajustes → Contabilidad → sudte, pega tu API key de pruebas (sk_test_…) y elige el emisor. Solo los administradores ven y editan la API key.
  4. Revisa los datos de la compañía: NIT, NRC, actividad económica, distrito, y los códigos MH de establecimiento y punto de venta por defecto.
  5. Confirma una factura de prueba y verifica que muestre el sello.
  • Diarios de venta: tipo de DTE por defecto (factura o crédito fiscal) y, si un diario corresponde a otra sucursal o caja, sus códigos de establecimiento y punto de venta. Si se dejan vacíos, se usan los de la compañía.
  • Impuestos: cada impuesto indica si la línea es gravada, exenta o no sujeta, o si es retención o percepción del 1 %. Los impuestos de la localización ya vienen clasificados.
  • Unidades de medida: código del catálogo CAT-014 (por defecto, 59 unidad).
  • Términos de pago: condición de la operación (contado o crédito) y forma de pago del catálogo CAT-017.
  • Contactos: tipo y número de documento (NIT, DUI, pasaporte), NRC, actividad económica y dirección con departamento, municipio y distrito. Un asistente lista los contactos incompletos para corregirlos antes de facturar.
  • Confirmar factura: se envía a sudte con una clave de idempotencia estable por factura. La factura muestra el estado del DTE, el número de control, el código de generación y el sello, con el PDF y el JSON adjuntos. sudte envía el correo al cliente.
  • Rechazo del MH: la factura muestra el motivo en español y el campo afectado. Corrige (por ejemplo, el contacto) y usa Reintentar: se conserva el código de generación.
  • Notas de crédito y débito: créalas desde la factura original; se envían con el documento relacionado.
  • Invalidar: el asistente pide el motivo (CAT-024), el responsable, el solicitante y, salvo rescisión total, la factura de reemplazo.
  • Consultar estado: actualiza la factura con el estado actual en sudte, útil si un webhook no llegó.

El conector expone un endpoint que recibe los eventos de sudte, verifica la firma Sudte-Signature y actualiza el estado de la factura. Regístralo en el panel de sudte (Desarrolladores → Webhooks) con la URL pública de tu Odoo que indica la pantalla de ajustes del módulo, y pega el secreto whsec_… en los ajustes. Detalles del formato en webhooks.

Cuando el MH autorice a tu empresa, carga en sudte las credenciales de producción y reemplaza en los ajustes de Odoo la API key por una sk_live_…. Registra también el webhook en el ambiente de producción.

Síntoma Causa y solución
«El distrito es obligatorio» El contacto no tiene distrito. Complétalo o usa el asistente de contactos incompletos.
[receptor.nrc] FORMATO NO VALIDO NRC con guiones o espacios. Edítalo en el contacto.
La factura queda «enviando» El MH tardó más de 20 segundos. Se actualizará con el webhook; si no, usa Consultar estado.
mh-credenciales Las credenciales del MH del ambiente activo están vencidas o son de otro ambiente. Vuelve a cargarlas en el panel.
prohibido La API key está limitada a otro emisor. Revisa el emisor elegido en los ajustes.

Lista completa de errores en errores y rechazos del MH.