Saltar al contenido principal

ArtinTech Solution

WordPress invoice plugin by ArtinTech Solution

🌐 Lea este artículo en otro idioma: English · Español · Deutsch · Français · العربية · Bahasa Melayu · 简体中文 · 日本語

La mayoría de las pequeñas agencias y de los profesionales independientes facturan de una de dos maneras. O con una hoja de cálculo y una plantilla de Word que alguien exporta a PDF a mano, o con un servicio de facturación en la nube que cobra por usuario y por mes, para siempre. La primera opción se viene abajo en cuanto dos personas la usan. La segunda funciona bien hasta que llega un nuevo miembro del equipo, una segunda moneda o un cliente que necesita algo para lo que el producto nunca se diseñó.

Nosotros teníamos los dos problemas, así que creamos nuestro propio plugin de facturación para WordPress: ArtinTech Invoice Manager. Funciona como una aplicación a pantalla completa dentro de un sitio WordPress. Genera facturas profesionales con exportación a PDF en un clic, mantiene una agenda de clientes con los importes pendientes, registra los pagos en varias monedas e incluye un panel de administración para gestionar a los usuarios. El plugin está en funcionamiento en este mismo sitio, y hoy lo usamos para facturar a nuestros propios clientes.

Este artículo es el registro completo de su desarrollo. Explica qué hace el plugin, cómo está construido y por qué, cómo funciona su seguridad, qué errores encontramos antes de que los vieran nuestros clientes y qué hizo falta para preparar el código para el directorio de plugins de WordPress.org. Si está decidiendo entre encargar una herramienta de facturación a medida o usar una ya existente, las últimas secciones están escritas para usted.

Panel del plugin de facturación para WordPress con los totales facturado, cobrado, pendiente y vencido
El panel de facturación: totales por moneda, facturas recientes y la lista completa. Todas las capturas de este artículo usan datos de demostración con nombres de clientes ficticios.

Por qué creamos nuestro propio plugin de facturación para WordPress

Desarrollar un software que se podría alquilar suele ser un error, así que conviene explicar por qué aquí no lo fue. Las razones decisivas fueron prácticas, no ideológicas.

  • Los datos deben quedarse en la empresa. Las facturas, las direcciones de los clientes y el historial de pagos son el registro financiero de un negocio. Guardarlos en la misma base de datos de WordPress que ya respaldamos y controlamos es más sencillo que depender del botón de exportación de un tercero el día que lo necesitemos.
  • El precio por usuario juega en su contra. Una herramienta en la nube barata para una persona se convierte en un coste real cuando un pequeño equipo y algunos colaboradores externos necesitan su propio acceso. Un plugin cuesta lo mismo lo use una persona o veinte.
  • Varios titulares de cuenta independientes, una sola instalación. Cada persona debía tener sus propias facturas, clientes, logotipo, datos bancarios y numeración, totalmente separados de los demás, en un único sitio web.
  • Facturamos a nivel internacional. Facturamos a clientes de otros países y en más de una moneda. Necesitábamos totales por moneda, sin conversiones silenciosas, y facturas que incluyeran los datos bancarios para transferencias internacionales.
  • Queríamos poder modificarlo nosotros mismos. Cuando necesitamos un botón «Marcar como pagada» o un interruptor para ocultar el logotipo del cliente, lo queríamos esa misma tarde, no algún día en la hoja de ruta de un proveedor.

Nada de esto convierte al software de facturación en la nube en una mala opción. Es un equilibrio diferente, y una comparación directa ayuda a verlo.

Servicio de facturación en la nubePlugin de facturación para WordPress autoalojado
Dónde están los datosServidores del proveedorSu propia base de datos de WordPress
Coste al crecer el equipoSuele aumentar por usuarioFijo, sin importar el número de usuarios
Esfuerzo de puesta en marchaMinutosInstalar, activar y crear la página de la aplicación
PersonalizaciónLo que permitan los ajustesTodo lo que permita el código
MantenimientoLo gestiona el proveedorResponsabilidad suya, como con cualquier plugin
IntegracionesA menudo un gran catálogo de conectores listosDesarrolladas según su propio ecosistema

Si la columna de la derecha le parece una lista de tareas pesadas, probablemente una herramienta en la nube le convenga más. Si le parece una lista de cosas que ya hace con su sitio web, un plugin empieza a resultar interesante.

Cómo funciona: de la instalación a la factura cobrada

Antes de entrar en detalles, este es el proceso completo de principio a fin: lo que un administrador hace una sola vez y lo que un titular de cuenta hace con cada factura. Nueve pasos, cada uno mostrado en la interfaz real.

Paso 1: instalar el plugin y crear la página de la aplicación

  1. Suba el plugin desde Plugins → Add New → Upload Plugin y actívelo.
  2. Abra el nuevo menú Invoice Manager en wp-admin.
  3. Haga clic en Create app page.

Así se publica una página en /invoice-manager/, y esa página es la aplicación. Nada más cambia en el sitio. Los administradores pueden empezar a usarla de inmediato.

Paso 2: iniciar sesión o permitir que otros se registren

La página de la aplicación muestra su propia pantalla de inicio de sesión a quien no esté conectado. Se entra con el usuario o el correo electrónico habituales de WordPress, con las opciones «Remember me» y «Forgot password».

Pantalla de inicio de sesión de Invoice Manager
El inicio de sesión en el front-end. Los titulares de cuenta nunca necesitan ver wp-admin.

Si activa el registro público, aparece un enlace Create one bajo el formulario de acceso que lleva al registro. Si la aprobación del administrador está activada, la nueva cuenta queda «pendiente» hasta que un administrador la apruebe.

Pantalla de registro de Invoice Manager
El registro opcional, con el aviso de que las cuentas nuevas se revisan antes de poder usarse.

Paso 3: configurar los datos de la empresa una sola vez

Cada titular de cuenta empieza en My settings:

  • Subir el logotipo y elegir entre persona física o empresa.
  • Añadir la dirección, los datos de contacto y el número de identificación fiscal.
  • Definir la moneda predeterminada y el plazo de pago.
  • Añadir los datos bancarios.
  • Definir el prefijo y el número inicial de las facturas y crear sus propios tipos impositivos.

Todo lo que introduzca aquí se rellena automáticamente en las facturas nuevas, así que solo lo escribe una vez.

Ajustes de la cuenta con logotipo, dirección de la empresa, moneda, datos bancarios y numeración de facturas
My settings: imagen de marca, datos de la empresa, moneda, datos bancarios y numeración de facturas.

Paso 4: añadir clientes

En Clients → Add Client guarda cada cliente una sola vez: logotipo, nombre de la empresa y de la persona de contacto, correo electrónico, teléfono, dirección y número fiscal. La agenda de clientes se puede buscar, y cada ficha muestra cuántas facturas tiene el cliente y cuánto debe.

Agenda de clientes con logotipos e importes pendientes
La agenda de clientes, con logotipos e importes pendientes de un vistazo.

Paso 5: crear una factura

Haga clic en New invoice. El número, la fecha, la moneda, las condiciones y sus datos ya están rellenados.

  1. Elija el cliente.
  2. Añada las líneas con cantidad, precio y tipo impositivo.
  3. Si hace falta, aplique un descuento y añada campos personalizados, como un número de pedido.
  4. Decida si su logotipo y el del cliente aparecen en esta factura.
  5. Haga clic en Save.

Los totales se recalculan mientras escribe.

Editor de facturas con líneas, descuento, datos del cliente e interruptores de logotipo
El editor de facturas: el documento a la izquierda, las acciones y los interruptores de logotipo a la derecha.

Paso 6: previsualizar y descargar el PDF

Preview muestra la factura exactamente como la recibirá el cliente. Download PDF guarda un archivo A4 que puede enviar por correo, subir a un portal de clientes o imprimir.

Hay tres plantillas, que se eligen para cada factura desde el menú de plantillas del editor:

  • Blank: un diseño limpio y minimalista.
  • Modern: con una cabecera de color.
  • Classic: tipografía con serifa y líneas separadoras.
Vista previa del PDF de la factura con los logotipos del emisor y del cliente, datos bancarios y condiciones de pago
La vista previa del PDF, con ambos logotipos, descuento, datos bancarios y condiciones de pago.

Paso 7: registrar el pago

Cuando llegue el dinero, haga clic en Mark paid en la fila de la factura, o en el icono $ para registrar un pago parcial con fecha, método y referencia. El estado cambia automáticamente:

  • Partially paid (pagada parcialmente) tras un pago parcial.
  • Paid (pagada) cuando el saldo llega a cero.
  • Overdue (vencida) si pasa la fecha de vencimiento antes de que se pague por completo.
Ventana para registrar un pago con importe, fecha y método
Registro de un pago. El importe viene rellenado con el saldo pendiente.

Paso 8: controlar lo que se le debe

Los totales del panel se actualizan al instante. Para un cliente concreto, abra su página en la agenda de clientes y verá:

  • Todo lo facturado, cobrado y pendiente, por moneda.
  • Todas las facturas que le ha emitido.

Es justo la pantalla que conviene abrir antes de una llamada de seguimiento.

Página del cliente con totales facturado, cobrado y pendiente, e historial de facturas
La página del cliente: saldos por moneda e historial completo de facturas.

Paso 9: gestionar usuarios

Los administradores y quienes tengan el rol Invoice Manager Admin abren Admin panel → Users. Desde ahí pueden:

  • Aprobar registros pendientes. El usuario recibe un aviso automático por correo electrónico.
  • Suspender o reactivar cuentas.
  • Crear usuarios directamente. Los nuevos usuarios reciben un correo para establecer su contraseña.
  • Cambiar roles y eliminar cuentas.
Gestión de usuarios en el panel de administración con aprobación, suspensión y control de roles
Gestión de usuarios: aprobaciones, suspensiones, roles y número de facturas y clientes por cuenta.

Qué hace el plugin: un recorrido por sus funciones

El proceso anterior muestra el camino principal. Este recorrido cubre todo lo demás. Todo funciona en una sola página del sitio, con una interfaz que se siente como una aplicación independiente y no como una pantalla de WordPress.

El panel de facturación

La pantalla principal responde a la pregunta con la que cualquier empresario abre una herramienta de facturación: ¿quién nos debe qué? Arriba hay cuatro indicadores: facturado, cobrado, pendiente y vencido. Cada uno se calcula por separado para cada moneda, con un selector cuando un titular de cuenta factura en varias. Debajo aparecen las cuatro facturas más recientes en forma de tarjetas y, a continuación, la lista completa.

La lista se puede buscar por número de factura o nombre del cliente, filtrar por cliente, estado, tipo de documento y periodo, y ordenar por cualquier columna. Desde cada fila puede registrar un pago, marcar la factura como pagada, descargar el PDF, duplicarla o eliminarla sin abrirla.

El editor de facturas

El editor tiene la misma estructura que el documento final, así que lo que escribe está donde aparecerá. Las acciones están en la columna derecha.

  • Cuatro tipos de documento: Invoice (factura), Quote (presupuesto), Proforma y Credit Note (factura rectificativa).
  • Numeración automática con un prefijo por usuario, como AT2623. El número se puede editar y se rechazan los duplicados.
  • Fecha de emisión y de vencimiento. La fecha de vencimiento se calcula con el plazo de pago predeterminado de cada persona.
  • Líneas con cantidad, precio unitario, descripción y un tipo impositivo de la lista propia del usuario.
  • Descuento a nivel de factura, campos personalizados como un número de pedido, datos adicionales de la empresa y una descripción libre.
  • Datos del cliente, elegidos de la agenda o escritos para un caso puntual, con la opción de guardar ese cliente nuevo al momento.
  • Moneda por factura y condiciones de pago rellenadas desde los ajustes.

Los totales se actualizan mientras escribe. Si intenta salir con cambios sin guardar, la aplicación le pregunta antes. Es un detalle pequeño que en una herramienta de facturación importa más que casi en cualquier otro sitio.

Pagos, estados y «Marcar como pagada»

Nadie cambia a mano el estado de una factura. Se deduce de los pagos registrados, así que nunca puede contradecir el dinero que realmente ha entrado.

Pagos registradosEstado mostrado
NingunoUnpaid (sin pagar)
Menos que el totalPartially paid (pagada parcialmente)
Igual o más que el totalPaid (pagada)
No pagada del todo y vencidaOverdue (vencida)
El tipo de documento es QuoteQuote (nunca cuenta como ingreso)

Cada pago tiene fecha, importe, método y una nota opcional, así que los pagos a plazos y las diferencias por comisiones bancarias se registran correctamente. Para el caso más habitual, cuando el cliente simplemente ha pagado, existe el botón Mark as paid. Registra en un clic un pago por el saldo restante con la fecha de hoy.

Exportación a PDF y plantillas

Cada factura puede verse en una de tres plantillas y descargarse como PDF A4: la plantilla Blank, limpia; la Modern, con cabecera de color; y la Classic, con tipografía con serifa y líneas separadoras.

El PDF incluye:

  • El logotipo del emisor y el del cliente. Cualquiera de los dos puede ocultarse en cada factura.
  • Las dos direcciones.
  • Las líneas, el descuento, los impuestos y el total.
  • Los pagos recibidos, el saldo pendiente, los datos bancarios y las condiciones.

La agenda de clientes

Los clientes se guardan una vez y se reutilizan. Cada uno tiene logotipo, nombre de la empresa y de la persona de contacto, dirección, número fiscal y notas.

La lista de clientes muestra cuánto debe cada uno, y la página de un cliente muestra:

  • Los totales facturado, cobrado y pendiente por moneda.
  • El historial completo de facturas.
  • Un botón que empieza una factura nueva con los datos del cliente ya rellenados.

Ajustes personales para cada titular de cuenta

Cada usuario tiene sus propios:

  • Logotipo y elección entre persona física o empresa.
  • Dirección y teléfono con prefijo internacional.
  • Número fiscal y sitio web.
  • Moneda predeterminada y plazo de pago en días.
  • Datos bancarios, prefijo de factura y siguiente número.
  • Texto predeterminado de condiciones de pago y una lista de tipos impositivos con nombre.

Dos personas en el mismo sitio pueden emitir facturas que parecen de dos empresas distintas, porque lo son.

Registro, aprobaciones y panel de administración

La aplicación tiene sus propias pantallas de acceso y registro en el front-end, así que los titulares de cuenta nunca necesitan ver wp-admin. El registro público es opcional. Si está activado, las cuentas nuevas pueden requerir la aprobación de un administrador, que recibe un correo con cada registro.

Dentro de la aplicación, los administradores disponen de un Admin panel con cuatro secciones:

  • Overview: número de cuentas y volumen facturado de todos los usuarios.
  • Users: aprobar, suspender, reactivar, crear o eliminar cuentas y cambiar roles.
  • Sign-up settings: ajustes del registro.
  • Messages: mensajes del formulario «Contact us» de la aplicación.
Resumen del panel de administración con número de cuentas, ajustes de registro y volumen por moneda
El resumen de administración: cuentas pendientes de aprobación, ajustes de registro y volumen facturado de todas las cuentas.

¿Necesita una herramienta interna que se adapte a su forma de trabajar?

Facturas, aprobaciones, presupuestos, portales de clientes. Cuéntenos su flujo de trabajo y le diremos con franqueza si le basta un plugin existente o si merece la pena un desarrollo a medida.

Arquitectura: cómo debe guardar sus datos un plugin de facturación para WordPress

La calidad a largo plazo de un plugin depende en gran parte de su modelo de datos. Es lo único que ya no se puede cambiar fácilmente cuando existen facturas reales. Tomamos cuatro decisiones pronto, y las cuatro han resultado acertadas.

Tipos de contenido personalizados en lugar de tablas propias

Las facturas, los clientes y los mensajes de contacto son tipos de contenido personalizados (custom post types) privados. Cada registro pertenece al usuario de WordPress que lo creó, y los datos estructurados se guardan en un único campo de post meta. Los ajustes personales están en el user meta, y las opciones generales del plugin usan la Options API.

Unas tablas propias habrían sido algo más rápidas con volúmenes de datos muy grandes. A cambio, los tipos de contenido aportan muchas cosas gratis:

  • Las copias de seguridad y migraciones habituales de WordPress incluyen los datos automáticamente.
  • Las herramientas de exportación ya los entienden.
  • La caché de objetos funciona sin código adicional.
  • Al eliminar un usuario, sus registros pueden eliminarse con él sin escribir ni una línea de limpieza.

Una herramienta de facturación para una empresa rara vez supera unos pocos miles de facturas por persona. A esa escala, el enfoque nativo es el correcto.

Los tipos de contenido están registrados como completamente privados: no son públicos ni consultables, están excluidos de la búsqueda y ocultos a la REST API y a los sitemaps. Una factura no puede acabar por accidente en los resultados de búsqueda del tema ni en el sitemap de un plugin de SEO.

Instantáneas: por qué una factura copia al emisor y al cliente

Una factura es un documento con valor legal de un momento concreto. Si la empresa cambia de dirección el año que viene, las facturas del año anterior deben seguir mostrando la dirección antigua. Por eso, al crear una factura, el plugin copia en ella los datos del emisor, y también los del cliente.

Cambiar sus ajustes o la dirección de un cliente nunca reescribe el pasado. Si quiere que un borrador antiguo tome los datos nuevos, el editor ofrece una acción explícita, «Use my latest settings», en lugar de hacerlo en silencio.

La factura también conserva un vínculo con la ficha del cliente, en el que se basan los saldos por cliente. Si se elimina un cliente, se elimina el vínculo, pero la instantánea permanece. La factura se sigue leyendo correctamente y simplemente deja de contar para un cliente que ya no existe.

El estado se calcula, nunca se guarda

«Vencida» depende de la fecha de hoy, así que un estado guardado estaría mal al día siguiente. El plugin guarda los hechos: líneas, descuento, pagos y fecha de vencimiento. El estado lo calcula cada vez que se lee la factura. Un campo de estado guardado es una de las causas más frecuentes de «el panel dice que está pagada, el banco dice que no» en el software empresarial.

Cálculos que su contable aprobará

  • El descuento se aplica antes de impuestos. Un descuento del 10 % reduce tanto el subtotal como el impuesto calculado sobre él, como exigen la mayoría de los sistemas fiscales.
  • Impuestos por línea. Cada línea lleva su propio tipo, así que una factura puede combinar conceptos sujetos y exentos.
  • Las facturas rectificativas restan en todos los totales, y los presupuestos no cuentan.
  • Las monedas nunca se convierten. Los totales se llevan por moneda. Una conversión silenciosa a un tipo de cambio cualquiera daría cifras que no coinciden ni con la factura ni con el extracto bancario.
  • Los totales se recalculan en el servidor a partir de las líneas al guardar. El cálculo en el navegador solo sirve para mostrarlo. Una petición manipulada no puede guardar un total que no cuadre.

Una REST API que comprueba la propiedad en cada petición

El front-end se comunica con WordPress a través de un espacio de nombres REST propio. Todas las rutas pasan por la misma comprobación de permisos: la petición debe venir de un usuario conectado con la capacidad del plugin y una cuenta activa, y llevar un nonce válido de WordPress.

Además, toda petición que afecte a una factura o a un cliente comprueba que el registro pertenece al usuario actual. Si no es así, la API responde not found en lugar de forbidden. Es intencionado: «forbidden» confirma que existe un registro con ese ID, mientras que «not found» no revela nada. Lo probamos expresamente solicitando la factura de una cuenta mientras estamos conectados con otra.

Cada campo que llega se sanea y se limita en longitud:

  • Las fechas deben seguir un formato estricto.
  • Las monedas deben tener tres letras.
  • Los tipos de documento y las plantillas deben estar en una lista fija.
  • Los logotipos solo se aceptan como imágenes que ya estén en la biblioteca de medios del sitio.

Las imágenes subidas se decodifican y se comprueba que sean archivos PNG, JPEG, GIF o WebP reales antes de entrar en la biblioteca de medios. Los SVG se rechazan, porque un archivo SVG puede contener scripts.

Un detalle práctico nos ahorró futuras consultas de soporte. Algunos alojamientos compartidos y reglas de cortafuegos bloquean por completo las peticiones HTTP PUT y DELETE. Por eso la aplicación envía cada escritura como POST con la cabecera estándar de sustitución de método de WordPress, que la REST API admite de forma nativa. Las rutas siguen siendo RESTful y las peticiones funcionan también en alojamientos restrictivos.

Cuentas, roles y aprobaciones

El plugin añade dos roles y un modelo de capacidades. Solo modifica los roles propios de WordPress para dar acceso a los administradores.

RolPuede usar la aplicaciónPuede gestionar titulares de cuentaPuede gestionar administradores de facturación y roles
AdministratorSíSíSí
Invoice Manager AdminSíSíNo
Invoice Account HolderSíNoNo

El rol intermedio existe para que, por ejemplo, la persona responsable de la oficina pueda aprobar y atender a los usuarios sin recibir las llaves de todo el sitio. Los administradores nunca pueden ser suspendidos ni eliminados desde la aplicación, y nadie puede eliminar su propia cuenta allí. Son precisamente los errores que dejan a la gente fuera de su propio sitio web.

El registro público está desactivado hasta que un administrador lo activa. Entonces el formulario tiene cuatro protecciones:

  • Un nonce.
  • Un campo trampa (honeypot) oculto que rellenan los bots pero no las personas.
  • Un límite de cinco registros por dirección de red y por hora.
  • Una longitud mínima de contraseña.

Con la aprobación activada, una cuenta nueva puede iniciar sesión, pero solo ve el aviso «Esperando aprobación» hasta que un administrador la aprueba. En ese momento el usuario recibe un correo. Suspender a un usuario cierra su sesión al instante en todos sus dispositivos, porque se eliminan sus sesiones de WordPress en lugar de esperar a que caduque una cookie.

Una aplicación a pantalla completa que el tema no puede romper

Una aplicación de facturación tiene que verse y comportarse igual en cualquier sitio donde se instale. Los estilos de botones de un tema, los reinicios de CSS de un maquetador o el optimizador de scripts de un plugin de caché pueden romper sutilmente una interfaz de tipo aplicación. Por eso el plugin se encarga por completo de mostrar su propia página.

Cuando un visitante abre la página de la aplicación, el plugin sirve su propia plantilla mínima en lugar de la del tema. Esa plantilla solo imprime la hoja de estilos y los scripts del plugin, mediante las funciones estándar de WordPress, y nada del tema ni de otros plugins. La página también indica a las cachés que no la guarden y a los buscadores que no la indexen, porque es una aplicación, no contenido.

La interfaz está escrita en módulos de JavaScript sencillos, sin framework, empaquetados en un único archivo legible. La navegación usa rutas con hash, así que cambiar entre facturas, clientes y ajustes nunca recarga la página y el botón «Atrás» del navegador sigue funcionando. La tipografía DM Sans viene incluida en el plugin en lugar de cargarse desde un servicio de fuentes, por lo que la aplicación no hace ninguna petición a servidores de terceros.

El diseño se pensó para móviles desde el principio. En pantallas pequeñas:

  • La barra lateral se convierte en un menú desplegable.
  • Las tablas de datos se convierten en tarjetas apiladas, con una etiqueta en cada valor.
  • El editor de facturas se reorganiza en una sola columna.

Las facturas se consultan a menudo desde el móvil cuando un cliente dice que ya ha pagado.

Panel de facturación en un móvil
El panel en un móvil.
Lista de facturas como tarjetas apiladas en un móvil
La lista de facturas se convierte en tarjetas apiladas, con Mark paid a un toque.

Generar facturas en PDF directamente en el navegador

Generar PDF en el servidor con PHP suele implicar librerías pesadas, fuentes instaladas en el servidor, límites de memoria y resultados muy distintos según el alojamiento. Nosotros generamos el PDF en el navegador del usuario:

  1. La factura se muestra como un documento HTML de tamaño A4.
  2. Ese documento se convierte en una imagen.
  3. La imagen se coloca en un archivo PDF con la librería de código abierto html2pdf.js.

Esto tiene tres ventajas:

  • El PDF es idéntico a la vista previa en pantalla, porque es la vista previa.
  • Funciona en cualquier alojamiento.
  • No se envía ningún dato de facturas a ningún sitio para convertirlo.

El inconveniente es que el texto del PDF es una imagen y no texto seleccionable. Para facturas que se leen, se imprimen y se archivan, es un precio aceptable a cambio de un resultado idéntico en todas partes.

Los errores que encontramos antes que nuestros clientes

Cada uno de estos errores se vio en una pantalla real. Vale la pena describirlos, porque cada uno representa un tipo de fallo que aparece también en otros proyectos.

La segunda página en blanco por medio píxel

Las facturas de una página se descargaban como PDF de dos páginas, con la segunda en blanco. La causa: el documento en pantalla tenía una altura mínima de 1123 píxeles para que la vista previa pareciera una hoja completa. Pero un A4 a 96 DPI mide 1122,5 píxeles de alto. Ese medio píxel sobrante bastaba para que la librería de PDF empezara una página nueva.

La corrección elimina la altura mínima solo durante la exportación, así que la vista previa sigue pareciendo papel. Lo confirmamos contando las páginas del PDF generado: dos antes de la corrección y una después. Una factura de 45 líneas sigue pasando correctamente a una segunda página con contenido.

Un enlace de cierre de sesión que se escapaba a sí mismo

La función de WordPress para la URL de cierre de sesión devuelve una URL ya escapada para HTML, con los símbolos «&» escritos como &. Eso es correcto dentro de un atributo HTML, pero no en JavaScript: allí el carácter escapado rompía el token de seguridad y, con él, el cierre de sesión. La corrección decodifica la URL una vez antes de pasarla a la aplicación. Un error pequeño, pero típico de la frontera entre plantillas PHP y JavaScript.

Logotipos de clientes que nunca llegaban a la factura

El logotipo de un cliente se podía subir y se guardaba bien, pero nunca aparecía en las facturas. La instantánea que se copia en cada factura simplemente no lo incluía. La corrección tuvo dos partes:

  • Las facturas nuevas ahora incluyen el logotipo en la instantánea.
  • Las facturas guardadas antes recurren, al leerse, al logotipo actual del cliente vinculado, sin reescribir los datos guardados.

No tocar los datos guardados al corregir un problema de visualización es un hábito que merece la pena.

Una tarjeta del panel que contradecía a la tabla

Tras marcar una factura como pagada en la lista, la fila se volvía verde, pero la tarjeta «Facturas recientes» de encima seguía mostrando Unpaid hasta recargar la página. Dos vistas de los mismos datos se habían desincronizado. Ahora, cada acción que modifica una factura vuelve a dibujar toda la pantalla con datos actualizados, así que todas las cifras de la página coinciden siempre.

La alineación tras añadir un logotipo

Con el logotipo del cliente sobre la dirección, el bloque «To» empezaba más abajo que el bloque «From», y la factura parecía descompensada. La solución fue colocar el logotipo a la derecha de la dirección: los dos bloques empiezan en la misma línea y el logotipo queda alineado con el número de factura de arriba. Después dimos algo más de anchura a la columna del cliente para que una dirección postal suiza típica cupiera en una sola línea. La lección: pruebe los diseños de facturas con datos reales de clientes, porque los nombres de ejemplo siempre son convenientemente cortos.

Preparación para el directorio de plugins de WordPress.org

El código que funciona en su propio sitio y el código que supera la revisión de WordPress.org no son lo mismo. El directorio tiene sus propias reglas, y antes de enviarlo ajustamos varias cosas para cumplirlas.

  • Ninguna llamada a servidores externos. La tipografía se cargaba al principio desde un servicio de fuentes, lo que enviaba la dirección IP de cada visitante a un tercero. Ahora está incluida en el plugin bajo su licencia abierta.
  • Scripts y estilos a través de las funciones de WordPress. Las etiquetas script y link escritas a mano se sustituyeron por recursos registrados y versionados. La configuración en tiempo de ejecución se pasa con el mecanismo estándar de scripts en línea.
  • Código fuente legible. El directorio no acepta código minificado sin sus fuentes. El paquete de la aplicación se distribuye sin minificar, con los módulos originales incluidos, y el readme explica cómo volver a compilarlo.
  • Licencias de terceros declaradas. La librería de PDF y la tipografía aparecen en el readme con su licencia y un enlace a la fuente, y los archivos de licencia se incluyen en el plugin.
  • El plugin no dispara hooks del núcleo. Una versión temprana lanzaba la acción de inicio de sesión propia de WordPress tras el registro. Hoy el plugin inicia la sesión con su propio código.
  • Desinstalación solo con consentimiento. Eliminar el plugin no borra nada salvo que el administrador haya pedido expresamente borrar los datos. Las facturas son documentación empresarial, y perderlas por un clic accidental es inaceptable.
  • Un readme completo con descripción breve, pasos de instalación, preguntas frecuentes, sección de privacidad y registro de cambios. El código está preparado para pasar sin problemas la herramienta oficial Plugin Check.

Ninguna de estas reglas empeoró el plugin, y algunas lo mejoraron. Incluir la tipografía, por ejemplo, eliminó por completo una cuestión de privacidad.

¿Quiere un plugin de WordPress bien construido desde el modelo de datos?

Envíenos lo que debe hacer la herramienta. En un día hábil recibirá un alcance claro, las ventajas e inconvenientes de cada opción y un precio cerrado.

¿Plugin de facturación para WordPress a medida o una solución existente?

Con franqueza: la mayoría de las empresas no deberían encargar una herramienta de facturación a medida. Si una sola persona emite unas pocas facturas al mes en una sola moneda, un producto existente le sirve bien y cuesta menos que cualquier desarrollo a medida. El desarrollo a medida pasa a ser la mejor opción cuando se cumplen varios de estos puntos:

  • Varias personas necesitan facturar por separado, aisladas entre sí, en un mismo sistema, y el precio por usuario empieza a notarse.
  • La facturación debe conectarse con algo propio del negocio, como un sistema de reservas, una herramienta de gestión de proyectos, un ERP o un portal de clientes.
  • Factura en varias monedas y necesita totales que nunca se conviertan a sus espaldas.
  • Sus facturas necesitan reglas que las herramientas estándar no contemplan, como pasos de aprobación, tipos de documento o series de numeración propias.
  • Quiere que los datos financieros permanezcan en una infraestructura que es suya y que usted mismo respalda y controla.

Si solo se cumple uno de estos puntos, estudie primero con más calma los productos existentes. Si se cumplen tres o más, un plugin específico como este suele costar menos, a dos o tres años, que las suscripciones y los apaños que sustituye. Y hace exactamente lo que necesita.

Decida lo que decida, evalúe cualquier herramienta de facturación según los puntos de este artículo:

  • ¿Guarda un estado fijo de cada factura, de modo que los cambios posteriores en sus datos o en los de un cliente no reescriban facturas antiguas?
  • ¿Calcula el estado a partir de los pagos en lugar de guardarlo?
  • ¿Mantiene las monedas separadas?
  • ¿Separa a los usuarios entre sí?
  • ¿Puede acceder a sus datos en cualquier momento?

Preguntas frecuentes

¿Un plugin de facturación para WordPress puede gestionar varios usuarios?

Sí, si está diseñado para ello. En ArtinTech Invoice Manager, cada factura y cada cliente pertenecen al titular de cuenta que los creó, y la API comprueba la propiedad en cada petición. Cada usuario tiene sus propios ajustes, logotipo, numeración y datos bancarios, y no puede ver los datos de los demás.

¿El plugin envía datos de facturación a servicios de terceros?

No. Todo se guarda en la base de datos de WordPress del propio sitio. Los PDF se generan en el navegador del usuario y la tipografía viene incluida en el plugin. Los únicos mensajes salientes son los correos normales de WordPress, como los avisos de registro y aprobación.

¿Puede crear facturas en distintas monedas?

Sí. Cada factura tiene su propia moneda, y el panel y las páginas de clientes muestran los totales separados por moneda. No se convierte nada, así que las cifras siempre coinciden con las facturas que realmente se enviaron.

¿Funciona con mi tema o mi maquetador?

Sí. La página de la aplicación se muestra con la plantilla y los recursos propios del plugin. Ni el tema, ni Elementor, ni ningún otro maquetador pueden alterar su aspecto o su comportamiento. El resto de su sitio no se ve afectado en absoluto.

¿El plugin está disponible en WordPress.org?

Lo hemos preparado para el directorio de plugins de WordPress.org, y aparecerá allí en cuanto supere la revisión. Si quiere usarlo antes o necesita una versión adaptada a su forma de trabajar, póngase en contacto con nosotros.

¿Pueden crear una versión a medida para mi empresa?

Sí. Diseños de factura propios, tipos de documento adicionales, la conexión con un sistema de reservas o de proyectos, portales de clientes y flujos de aprobación son extensiones naturales de la misma base. Puede ver cómo planteamos este tipo de proyectos en nuestro servicio de desarrollo de plugins de WordPress.

Crear herramientas de WordPress como esta es una parte central de nuestro trabajo. Algunas son correcciones pequeñas, como el error 403 causado por la caché que rastreamos hasta la duración de un nonce. Otras son aplicaciones completas como esta, desarrolladas dentro de nuestro servicio de desarrollo WordPress y de desarrollo de CMS y ERP a medida. Si está valorando una herramienta de facturación, o cualquier otro software que su empresa tenga que sortear constantemente, hable con nosotros. Recibirá una valoración honesta, incluso si la respuesta es que un producto existente es suficiente.

Share this article

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *