pFacturas for WooCommerce

Descrizione

pFacturas es el plugin oficial para integrar la plataforma de facturación electrónica pFacturas con WooCommerce en Uruguay. Permite la emisión automática de Comprobantes Fiscales Electrónicos (CFE) cumpliendo con las normativas de la Dirección General Impositiva (DGI) de Uruguay.

Características principales

  • Emisión automática de CFE: Genera automáticamente e-Ticket, e-Factura y Notas de Crédito al procesar pedidos
  • Cumplimiento DGI: 100% conforme a las especificaciones técnicas de DGI Uruguay
  • Múltiples ambientes: Soporte para Demo, Testing y Producción
  • Facturación con/sin RUT: Factura tanto a consumidores finales como a empresas
  • Validación en tiempo real: Validación de RUT uruguayo con dígito verificador
  • Envío automático de PDF: El cliente recibe el comprobante fiscal por email
  • Compatible con WooCommerce Blocks: Funciona con el nuevo checkout de WooCommerce
  • Logs detallados: Sistema de logging para depuración y auditoría
  • Configuración flexible: Múltiples opciones para adaptar el plugin a tus necesidades

Requisitos

  • Cuenta activa en pFacturas (https://www.pfacturas.com)
  • WooCommerce instalado y activo
  • WordPress 6.0 o superior
  • PHP 7.4 o superior

Configuración rápida

  1. Instalar y activar el plugin
  2. Ir a WooCommerce pFacturas
  3. Seleccionar Modo: Demo (no requiere credenciales, ideal para pruebas rápidas)
  4. Realizar un pedido de prueba
  5. Verificar recepción del PDF por email

Nota: Para usar el ambiente de Testing o Producción, necesitarás credenciales de pFacturas obtenidas al contratar el servicio.

Servicios de terceros

Este plugin utiliza el servicio externo pFacturas para generar comprobantes fiscales electrónicos conforme a las regulaciones de DGI Uruguay.

Servicio: API de Facturación Electrónica pFacturas
Proveedor: PuntoExe Consultores
URL del servicio: https://www.pfacturas.com

Qué datos se envían:
– Información del cliente (nombre, RUT, dirección) desde pedidos de WooCommerce
– Detalles del pedido (artículos, precios, impuestos)
– Información de la tienda (RUT, sucursal)
– Estos datos se envían cuando se realiza un pedido y el plugin está configurado para emitir comprobantes electrónicos

Cuándo se envían los datos:
– Automáticamente después de completar el pedido (cuando está configurado)
– Manualmente cuando el administrador activa la generación de factura
– Solo para pedidos que requieren comprobantes fiscales electrónicos

Propósito: Generar comprobantes fiscales electrónicos (CFE) legalmente conformes según lo requiere la ley tributaria uruguaya (DGI)

Política de privacidad: https://efactura.puntoexe.com.uy/facturaci%C3%B3n-electr%C3%B3nica/woocommerce-integrado/pol%C3%ADtica-de-privacidad
Términos de servicio: https://efactura.puntoexe.com.uy/facturaci%C3%B3n-electr%C3%B3nica/woocommerce-integrado/t%C3%A9rminos-y-condiciones-de-servicio

Al usar este plugin, aceptas compartir datos de pedidos con el servicio pFacturas para fines de facturación electrónica.

Soporte técnico

Para consultas y soporte técnico, contactar a efactura@puntoexe.com.uy

Plugin desarrollado y mantenido por Punto Exe Consultores.

Dependencies

Este plugin requiere que WooCommerce esté instalado y activo.

Support

¿Preguntas o problemas? Escribe a efactura@puntoexe.com.uy.

Screenshot

Installazione

  1. Ir a Plugins Añadir nuevo Subir plugin
  2. Seleccionar el archivo ZIP y hacer clic en “Instalar ahora”
  3. Activar el plugin
  4. Ir a WooCommerce pFacturas
  5. Para pruebas rápidas: Seleccionar Modo “Demo” (no requiere configuración adicional)
  6. Para uso en producción: Configurar RUT, Sucursal, Usuario y Contraseña con credenciales de pFacturas

Recensioni

25 Maggio 2026
PFacturas para WooCommerce me sorprendió para bien porque resuelve una de las partes más molestas de vender online en Uruguay: la facturación electrónica. El plugin se integra directamente con el checkout de WooCommerce y adapta automáticamente el formulario según si el cliente compra como consumidor final o como empresa, pidiendo datos como RUT y razón social cuando corresponde. Además, hace validaciones adicionales con DGI para evitar errores en los datos de facturación, lo que da mucha más tranquilidad! Algo que me gustó mucho es que no requiere configuración inicial para empezar a probarlo. Apenas instalás el plugin ya queda funcionando en modo demo y empieza a generar facturas de prueba automáticamente, así que podés probar todo el flujo sin tener que configurar certificados ni perder tiempo tocando opciones complicadas. Se nota que está pensado para que cualquiera pueda empezar rápido! En general quedé muy conforme con el plugin. Para quienes usan WooCommerce y necesitan integrar facturación electrónica en Uruguay, me parece una solución súper práctica, cómoda y mucho más simple de lo que esperaba.
Leggi la recensione di 1

Contributi e sviluppo

“pFacturas for WooCommerce” è un software open source. Le persone che hanno contribuito allo sviluppo di questo plugin sono indicate di seguito.

Collaboratori

Changelog

1.2.1.1

  • Mejora: Changelog traducido al español (el público objetivo del plugin son empresas uruguayas)
  • Nota: Esta versión solo modifica la documentación, no hay cambios de código

1.2.1.0

  • Mejora: Nuevo botón “Restablecer defaults de POS” al final de la pestaña de configuración Backoffice/POS — rellena los campos vacíos con sus valores por defecto sin sobrescribir configuraciones personalizadas
  • Mejora: Facilita la migración desde versiones anteriores en las que pos_doc_meta_key quedaba guardado como string vacío (el nuevo default billing_vat no se aplica automáticamente a configuraciones ya guardadas)

1.2.0.0

  • Funcionalidad: Detección heurística del tipo de documento en órdenes que no provienen del checkout estándar (típicamente sistemas POS integrados via REST API)
  • Funcionalidad: Detección automática de RUT (12 dígitos con dígito verificador válido), Cédula uruguaya (8 dígitos con dígito verificador válido) u “Otros” a partir de un único campo de documento
  • Funcionalidad: Bloqueo de la creación de la orden via REST cuando el documento es inválido pero la razón social termina en SA/SAS/SRL/LTDA (se presume RUT mal tipeado y se exige corrección)
  • Funcionalidad: Nuevo default billing_vat para el meta key del documento — funciona out-of-the-box con la mayoría de plugins POS
  • Mejora: Pestaña Backoffice/POS reorganizada con texto de ayuda explícito para los dos modos (explícito de 2 campos vs heurístico de campo único)
  • Mejora: Nuevo helper pfwc_nombre_parece_empresa() para detectar sufijos SA/S.A./SAS/S.A.S./SRL/S.R.L./LTDA/Ltda (con o sin puntos)
  • Mejora: Nuevo código de error pf_rut_invalido_empresa para órdenes POS bloqueadas por inconsistencia entre documento y sufijo empresarial

1.1.3.2

  • Corrección: La página de settings ahora siempre abre en la primera pestaña al navegar de vuelta
  • Corrección: La posición de la pestaña activa solo se preserva durante la recarga por guardado de settings, no entre navegaciones

1.1.3.1

  • Corrección: Aviso en settings de POS cuando los meta keys de identificación fiscal no están configurados
  • Corrección: La validación previa a la emisión detecta cuando billing_company está presente pero los meta keys fiscales no están configurados, evitando la emisión silenciosa como consumo final
  • Corrección: El aviso dinámico en la pestaña POS se actualiza en tiempo real mientras el usuario completa o borra los campos de meta keys

1.1.3.0

  • Mejora: Página de settings reorganizada con navegación por pestañas (Conexión, Documento, Emisión, Checkout, Backoffice/POS, Avanzado)
  • Mejora: Pestaña activa persistida en localStorage entre recargas de página
  • Mejora: Todo el JavaScript consolidado en un único bloque inline

1.1.2.0

  • Refactor: Settings de POS simplificados — se eliminaron pos_rut_meta_key y pos_razon_social_meta_key
  • Funcionalidad: POS ahora usa el campo tipo_doc (2=RUT, 3=CI, etc.) alineado con los códigos de tipo de documento de DGI
  • Funcionalidad: Campos de billing POS configurables (pos_billing_first_name, pos_billing_last_name, pos_billing_company) con defaults estándar de WooCommerce
  • Funcionalidad: Todos los campos de meta keys POS cambiados de combos a inputs de texto para compatibilidad universal con cualquier plugin
  • Funcionalidad: Sincronización checkout — nuevos settings para copiar RUT y Razón Social a los campos billing estándar de WooCommerce
  • Funcionalidad: checkout_razon_social_meta_key (default: billing_company) sincroniza la Razón Social en el checkout

1.1.1.0

  • Corrección: IndicadorDeFacturacion ahora se infiere a partir de la tasa efectiva de impuestos en vez del nombre de la tax class
  • Corrección: Los productos exentos de IVA (ej: libros al 0%) ahora usan correctamente el indicador 1 (Exento) en vez del 3 (IVA Básica)
  • Corrección: El indicador de la línea de envío también usa el cálculo por tasa efectiva
  • Refactor: Mapeo centralizado de tasa de impuesto a indicador en el método indicador_por_tasa()

1.1.0.0

  • Funcionalidad: Compatibilidad con sistemas de Backoffice/POS (YITH Point of Sale y plugins similares)
  • Funcionalidad: Resolución automática de datos fiscales desde los campos billing cuando los campos del checkout están vacíos
  • Funcionalidad: Mapeo configurable de campos billing para RUT, Razón Social, Tipo Documento, Documento
  • Funcionalidad: Combos de settings populados dinámicamente desde los billing fields registrados por WooCommerce
  • Funcionalidad: Validación en dos niveles — hook de creación de orden via REST API + validación previa a la emisión
  • Funcionalidad: Funciones de validación de dígito verificador para RUT y CI (Cédula de Identidad) del lado del servidor
  • Funcionalidad: Soporte para Adenda multi-línea con un meta key extra configurable
  • Funcionalidad: Datos fiscales auto-persistidos en los meta de la orden para consistencia en notas de crédito
  • Corrección: El campo Id de MediosPago se trunca a 20 caracteres para cumplir con el límite del WSDL

1.0.27.64

  • Corrección: Modo Demo — el RUT y la Sucursal del Emisor se enviaban vacíos cuando las credenciales demo estaban expiradas
  • Corrección: El constructor del Client ahora se ejecuta antes que el Mapper para que las credenciales demo se renueven antes de construir la sección Emisor del CFE
  • Corrección: Mismo fix aplicado al flujo de emisión de notas de crédito (NC)
  • Corrección: Bloqueo de la página de checkout por loop infinito de MutationObserver/toggle en blocks.js
  • Corrección: Debounce agregado al callback del MutationObserver y se omite el dispatch al Store API cuando el payload no cambió
  • Limpieza: Removidos los console.log verbosos de debug en blocks.js

1.0.27.63

  • Seguridad: Corregido el orden de verificación del nonce AJAX — ahora el nonce se verifica ANTES de extraer order_id de $_POST
  • Seguridad: Migrado a verificación estática de nonce con check_ajax_referer() en vez de nonces específicos por orden
  • Seguridad: El nonce ahora usa el nombre de acción estático pfwc_emit_cfe en lugar del dinámico pf_emit_ . $order_id
  • Corrección: ob_start() y ob_get_clean() separados en líneas individuales para manejo explícito del buffer
  • Mejora: El handler AJAX ahora usa wp_localize_script() para pasar nonce y ajaxUrl al JavaScript
  • Cumplimiento: Todas las correcciones de seguridad siguen los requerimientos del WordPress.org Plugin Directory

1.0.27.62

  • Corrección: Renombradas todas las funciones helper del prefijo pf_ al prefijo pfwc_ (WordPress.org requiere 4 caracteres o más)
  • Corrección: Comentarios phpcs:ignore agregados para el uso de $_GET en el enqueueing de scripts del admin (solo para mostrar mensaje, no procesa datos)
  • Cumplimiento: Todos los nombres de funciones ahora cumplen con los estándares de naming de WordPress.org

1.0.27.61

  • Corrección: Cambiados todos los prefijos de clases de PF_ a PFWC_ (WordPress.org requiere 4 caracteres o más)
  • Corrección: Constantes PF_PLUGIN_DIR y PF_PLUGIN_URL cambiadas a PFWC_PLUGIN_DIR y PFWC_PLUGIN_URL
  • Corrección: Tags <script> inline convertidos a wp_add_inline_script() para enqueueing correcto
  • Seguridad: Agregada verificación de nonce y de capability en el método ajax_emit()
  • Seguridad: Agregada verificación de permisos en el método emit_if_needed() y removido el procesamiento directo de $_POST
  • Seguridad: Removidos los var_export() y print_r() inseguros de datos de $_POST en el logging
  • Seguridad: Agregado el escapado correcto con esc_html() a todas las variables echoeadas
  • Cumplimiento: Todos los scripts ahora están correctamente enqueueados siguiendo los WordPress Coding Standards

1.0.27.60

  • Corrección: Toda la descripción del plugin traducida al inglés (readme.txt y headers del plugin)
  • Documentación: Agregada sección completa de Servicios de Terceros documentando la integración con la API de pFacturas
  • Cumplimiento: Documentación completa de transmisión de datos, política de privacidad y términos de servicio

1.0.27.59

  • Corrección: Corregido el método de compresión del ZIP (cambiado a Compress-Archive para compatibilidad con WordPress.org)

1.0.27.58

  • Corrección: Corregido el nombre del plugin en readme.txt para que coincida con pFacturas.php (ambos usan ahora “pFacturas for WooCommerce”)

1.0.27.57

  • Corrección: Plugin URI corregido para cumplir con los requerimientos de WordPress.org (no puede ser una URL de WordPress.org, debe ser del sitio del desarrollador)

1.0.27.56

  • Corrección: Corregido el nombre del autor de “Punto Exe Consultores” a “PuntoExe Consultores” (sin espacio)

1.0.27.55

  • Corrección: Header completamente reescrito siguiendo el formato exacto de la documentación oficial de WordPress.org (nombre en inglés, campos adicionales requeridos, License en el formato exacto)

1.0.27.54

  • Corrección: Acentos removidos del header del plugin para evitar problemas de encoding (WordPress.org requiere ASCII puro en headers)

1.0.27.53

  • Corrección: Agregados los campos Plugin URI y Author URI al header (requeridos por WordPress.org)

1.0.27.52

  • Corrección: Formato del bloque de comentarios cambiado de /* a /** (estándar PHPDoc DocBlock)

1.0.27.51

  • Corrección: Formato del header del plugin corregido (asterisco * agregado al inicio de cada línea según el estándar de WordPress.org)

1.0.27.50

  • Corrección: Formato del header del plugin corregido (changelog interno removido, se mantiene solo en readme.txt)

1.0.27.49

  • Corrección: Restaurados los acentos en Plugin Name y Description

1.0.27.48

  • Corrección: Restaurados los acentos en los tags de readme.txt

1.0.27.47

  • Corrección: Cambiado el enfoque de phpcs:ignore inline a un bloque phpcs:disable/phpcs:enable en class-pf-emitter.php líneas 588-590

1.0.27.46

  • Corrección: Actualizado el comentario phpcs:ignore inline en class-pf-emitter.php línea 589

1.0.27.45

  • Corrección: Agregado comentario phpcs:ignore inline en class-pf-emitter.php línea 589 para NonceVerification.Missing

1.0.27.44

  • Corrección: Cambiado el slug del plugin de “woocommerce-pfacturas” a “pfacturas-for-woocommerce”
  • Corrección: Ahora cumple con las reglas de trademark de WordPress.org (termina en “for-woocommerce”)
  • Corrección: Agregado sanitize_text_field() en class-pf-emitter.php línea 606 para el nonce
  • IMPORTANTE: Requiere desinstalar y reinstalar el plugin (cambio de slug)

1.0.27.43

  • Corrección: Corregido el nombre del plugin para cumplir con las reglas de trademark de WordPress.org
  • Corrección: El nombre ahora termina en “for WooCommerce” en vez de “para WooCommerce”
  • Corrección: Removidos caracteres acentuados del nombre y la descripción para evitar problemas de encoding
  • Corrección: readme.txt reducido a un máximo de 5 tags y la descripción corta a menos de 150 caracteres
  • Corrección: Agregado wp_unslash() en class-pf-emitter.php línea 606 para $_POST['_wpnonce']

1.0.27.42

  • Corrección: Actualizado el Stable tag de readme.txt a 1.0.27.42
  • Corrección: Completados los comentarios phpcs:ignore faltantes en class-pf-checkout.php (líneas 18-20, 37-39)
  • Corrección: Agregado phpcs:ignore para var_export en class-pf-emitter.php línea 155
  • Corrección: Agregados phpcs:ignore para $_POST en class-pf-emitter.php líneas 588, 592, 605
  • Corrección: Agregados phpcs:ignore para var_export y print_r en class-pf-mapper.php líneas 17, 20, 25

1.0.27.41

  • Corrección: Agregado sanitize_callback a register_setting() para cumplir con los estándares de WordPress
  • Corrección: Actualizado “Tested up to” a WordPress 6.8
  • Corrección: Agregados comentarios phpcs:ignore para los warnings de verificación de nonce en hooks de WooCommerce
  • Corrección: Agregados comentarios phpcs:ignore para las funciones de debug (var_export, print_r) usadas solo para logging

1.0.27.39

  • Arquitectura: Implementado el sistema de builds dual (oficial vs desarrollo)
  • Archivo nuevo: class-pf-manual-updater.php con la funcionalidad de actualización manual
  • Corrección: La actualización manual se movió a un archivo separado para evitar errores en Plugin Check
  • Builds oficiales: Excluyen class-pf-manual-updater.php para pasar Plugin Check sin errores
  • Builds de desarrollo: Incluyen class-pf-manual-updater.php para funcionalidad completa
  • Documentación: Actualizada en _dev/ para explicar el sistema de builds dual

1.0.27.38

  • Corrección: Agregados comentarios phpcs:ignore a todos los print_r() y var_export() usados en logging
  • Corrección: La funcionalidad de actualización manual ahora requiere el archivo de flag _dev/enable-manual-updates.flag
  • Mejora: Actualización manual deshabilitada por defecto en versiones oficiales para cumplir con los estándares de WordPress.org
  • Plugin Check: Resueltos todos los warnings de DevelopmentFunctions en class-pf-blocks.php y class-pf-emitter.php

1.0.27.37

  • Corrección: Todos los usos de date() reemplazados por gmdate() para evitar problemas de timezone
  • Corrección: Agregado esc_html() al mensaje de error de wp_die() en class-pf-settings.php
  • WordPress.DateTime.RestrictedFunctions: Todos los date() cambiados a gmdate() en helpers.php, class-pf-client.php y class-pf-mapper.php

1.0.27.36

  • Corrección: Tercera ronda de correcciones para el Plugin Check de WordPress.org
  • Aplicado esc_attr() a todas las salidas de self::OPTION_KEY en class-pf-settings.php
  • Aplicados esc_html(), esc_attr(), esc_textarea() a los parámetros dinámicos de la función f()
  • Agregados comentarios phpcs:ignore para print_r() y var_export() usados en logging
  • Cambiado date() por current_time('mysql') en helpers.php para consistencia con WordPress
  • Mejorada la función in_array() con el parámetro de comparación estricta

1.0.27.35

  • Corrección: Correcciones adicionales para el Plugin Check de WordPress.org (segunda ronda)
  • Agregados comentarios phpcs:ignore con justificación para variables seguras
  • Corregidos 15 errores de output escaping en class-pf-checkout.php, class-pf-emitter.php y class-pf-settings.php

1.0.27.34

  • Corrección: Correcciones para cumplir con el Plugin Check de WordPress.org
  • Heredoc convertido a concatenación de strings (WordPress.org no permite heredoc)
  • Agregado output escaping con esc_attr(), esc_js(), esc_url() donde corresponde
  • wp_redirect() cambiado a wp_safe_redirect() para mayor seguridad

1.0.27

  • Funcionalidad: Modo Demo que permite probar el plugin sin credenciales
  • Funcionalidad: Detección automática y renovación de credenciales Demo expiradas
  • Mejora: Sistema de logging con preferencia del usuario
  • Mejora: Compatibilidad completa con WooCommerce Blocks
  • Mejora: Validación mejorada de RUT y CI con dígito verificador
  • Mejora: Manejo del umbral en Unidades Indexadas en base al subtotal
  • Corrección: Múltiples correcciones para cumplir con el Plugin Check de WordPress.org
  • Corrección: Mejoras de seguridad con sanitización y escapado de datos

1.0.16

  • Simplificación de campos del checkout: Ahora solo se solicitan “Tipo de Documento” y “Documento” cuando el total supera el umbral de identificación. Los demás datos (nombre, dirección, ciudad, país) se toman automáticamente de la información de billing de la orden.
  • Validación de CI mejorada: Agregada validación JavaScript del dígito verificador para Cédula de Identidad uruguaya (tipo 3) tanto en el checkout clásico como en WooCommerce Blocks.
  • Campos requeridos: Todos los campos billing ahora son requeridos cuando corresponde (RUT/Razón Social si se factura con RUT, Tipo y Documento si se supera el umbral).
  • WooCommerce Blocks actualizado: Removidos los campos redundantes del Store API y de blocks.js; ahora usa directamente los datos de la dirección de billing.
  • Mapper optimizado: El mapper ahora usa get_billing_first_name(), get_billing_last_name(), get_billing_address_1(), get_billing_city() y get_billing_country() del objeto orden.

1.0.15

  • Combos simplificados: Las opciones de los combos ahora muestran solo descripciones sin valores (ej: “Testing” en vez de “TES – Testing”).
  • Campos de Persona Física extendidos: Agregados los campos “Dirección” y “Ciudad” para cumplir con los requerimientos del umbral de identificación.
  • Opciones corregidas: “Cédula Mercosur” cambiado a “DNI Mercosur”, “Otro” cambiado a “Otros”.
  • Lógica de umbral mejorada: Cuando el total supera el umbral configurado y no se factura con RUT, se solicitan todos los campos requeridos de Persona Física.
  • Validación mejorada: La validación ahora verifica que todos los campos de Persona Física estén completos cuando corresponde.