# Memoria tecnica - shared-assets

Fecha: 2026-09-30

## Jornada tecnica 2026-09-30 - Aviso interno de impago recurrente

### Nueva plantilla administrativa

- Se incorpora `admin_recurring_payment_failure_email.php` como plantilla
  fallback comun para los impagos que todavía no alcanzan el limite de baja
  de una recurrencia.
- El mensaje se dirige a administracion e identifica recurrencia, contacto,
  metodo, periodicidad, numero de impagos consecutivos, limite aplicable y
  fecha del siguiente intento.
- La plantilla distingue expresamente el aviso previo de la cancelacion
  automatica y confirma que la recurrencia continúa activa.
- Todos los valores dinamicos se escapan antes de incorporarse al HTML y la
  plantilla no contiene consultas, credenciales ni datos reales.

### Coordinacion y verificaciones

- `dona` decide el umbral, envia el correo y conserva el aviso de baja ya
  existente; `donoradmin` registra las variables para su gestion tecnica.
- El correo es exclusivamente interno. Las comunicaciones al donante se
  mantienen fuera de este flujo y se gestionan desde Salesforce.
- Sintaxis PHP validada, renderizado comprobado con datos de prueba y formato
  revisado mediante `git diff --check`.
- No se requieren ni se aplicaron cambios de base de datos.

Fecha de cierre: 2026-09-30

## Jornada tecnica 2026-09-28 - Motor fiscal compartido

### Fuente comun para pasarela y administracion

- Se incorpora `services/FiscalDonationService.php` como fuente unica para
  seleccionar el modelo IRPF o IS vigente por fecha, tipo fiscal y regimen.
- El servicio obtiene los tramos ordenados, calcula bases anuales a partir de
  donaciones pagadas y aplica porcentajes ordinarios o incrementados por
  fidelizacion.
- La fidelizacion se determina sobre ejercicios consecutivos con aportacion
  positiva y sin disminucion, respetando el numero de años configurado en el
  modelo.
- El calculo devuelve base anterior y proyectada, deduccion anterior y
  estimada, incremento atribuible a la nueva aportacion y metadatos del modelo
  utilizado.
- La constante `VALID_DONATION_STATES` centraliza los estados que participan
  en calculos y certificados, evitando criterios distintos entre proyectos.

### Consumidores y pruebas

- `dona` consume el servicio desde el endpoint de estimacion del formulario.
- `donoradmin` lo utiliza en la configuracion fiscal y al determinar los
  ejercicios e importes validos para certificados.
- `tests/FiscalDonationServiceTest.php` cubre continuidad y caidas de
  aportaciones para fidelizacion y calculos por tramos normales e
  incrementados.
- La estructura persistente se entrega mediante
  `donoradmin/docs/migrations/2026_09_28_fiscal_models.sql`; este repositorio no
  contiene ni ejecuta migraciones de base de datos.

### Verificaciones realizadas

- Pruebas unitarias del servicio ejecutadas correctamente.
- Integracion comprobada con los dos modelos y tres tramos instalados en la
  base de desarrollo.
- Sintaxis PHP y formato mediante `git diff --check` revisados.

Fecha de cierre: 2026-09-28

## Jornada tecnica 2026-09-17 - Referencia de pago independiente del proveedor

### Plantilla administrativa compartida

- La plantilla fallback `admin_donation_email.php` sustituye la etiqueta
  `Referencia Redsys` por `Referencia de pago`.
- El valor y la variable `order_id` no cambian, por lo que se mantiene la
  compatibilidad con los contextos de correo existentes.
- La denominacion deja de asociar el identificador exclusivamente a Redsys y
  resulta valida para donaciones procesadas por otros proveedores.

### Coordinacion y verificaciones

- El ajuste queda alineado con el catalogo de variables de `dona` y
  `donoradmin` y con la copia administrativa utilizada por este ultimo.
- No se modifica la estructura HTML, la logica de renderizado ni el escape de
  datos dinamicos de la plantilla.
- Sintaxis PHP validada y revision de formato realizada mediante
  `git diff --check`.
- No se requieren ni se han aplicado cambios de base de datos.

Fecha de cierre: 2026-09-17

## Jornada tecnica 2026-08-27 - Constancia de intentos de donacion con error

### Adaptacion de la plantilla compartida

- `donor_abandoned_donation_email.php` distingue mediante `attempt_state` los
  abandonos ordinarios de los intentos que han terminado en estado `error`.
- Para un error, el titulo y el cuerpo agradecen expresamente el intento de
  colaborar e informan de que el proceso no llego a completarse.
- El mensaje incorpora una advertencia visible indicando que no se trata de
  una confirmacion de pago, evitando que el donante interprete el correo como
  justificante de una operacion realizada.
- Los abandonos mantienen sin cambios su contenido y comportamiento anteriores,
  por lo que la ampliacion es compatible con los consumidores existentes que
  no aporten `attempt_state`.

### Integracion entre repositorios

- `dona` decide cuando corresponde enviar la comunicacion, aporta el estado del
  intento y mantiene la alternativa equivalente en texto plano.
- `shared-assets` se limita a representar el HTML fallback comun y no incorpora
  consultas, decisiones de envio ni logica de persistencia.
- La proteccion contra envios duplicados y el registro de la comunicacion se
  mantienen en los servicios de `dona`.

### Seguridad y verificaciones

- Todos los datos dinamicos continúan escapados antes de incorporarse al HTML.
- La plantilla no confirma cargos, no expone detalles tecnicos del error y no
  contiene datos personales reales ni credenciales.
- Sintaxis PHP validada en la plantilla modificada.
- Revision de formato y espacios mediante `git diff --check`.

## Jornada tecnica 2026-08-14 - Recuperacion de donaciones y aviso de entrega SEPA

### Email de recuperacion al donante

- `donor_abandoned_donation_email.php` incorpora un enlace directo y visible a `https://fundacioncarf.org/dona/` para retomar la donacion.
- Se ajusta la tipografia y el espaciado del cuerpo para mantener una lectura homogenea con el resto de comunicaciones al donante.
- El contenido conserva el enlace de informacion fiscal y el canal de contacto de Fundacion CARF.
- Todos los valores dinamicos siguen escapados y las URLs se presentan de forma accesible y compatible con clientes de correo.

### Aviso administrativo de entrega SEPA

- `admin_transfer_pending_email.php` incorpora el estado del correo enviado al donante y, cuando procede, el detalle resumido del fallo.
- Las filas vacias se omiten con el comportamiento comun de la plantilla, por lo que un envio correcto no muestra informacion tecnica innecesaria.
- La plantilla permite que administracion distinga una solicitud SEPA correctamente registrada de una incidencia exclusiva del canal de correo.
- El cambio no altera importes, estados bancarios, referencias de mandato ni ningun dato persistido de la donacion.

### Coordinacion entre repositorios

- `dona` genera las nuevas variables de entrega tras intentar el correo al donante.
- `donoradmin` mantiene la version de texto plano y la trazabilidad de la comunicacion asociada.
- `shared-assets` proporciona la representacion HTML fallback comun sin incorporar logica de negocio ni acceso a base de datos.

### Verificaciones de cierre

- Sintaxis PHP validada en ambas plantillas modificadas.
- Revision del contexto aportado por `DonationMailer` en `dona` y `donoradmin`.
- Revision de formato y espacios mediante `git diff --check`.

## Jornada tecnica 2026-08-10 - Plantilla de modificacion de recurrencia

### Nueva confirmacion al donante

- Se incorpora `templates/emails/donor_recurring_modification_email.php` como plantilla fallback comun para cambios sustanciales de una donacion recurrente.
- El mensaje confirma que la peticion se ha realizado correctamente y evita terminologia tecnica interna.
- La tabla de detalle muestra codigo de recurrencia, campaña, importe anterior y nuevo, frecuencia anterior y nueva, proximo cobro previsto y metodo de pago.
- Las filas sin valor se omiten y los nuevos valores reciben mayor peso visual para facilitar la comprobacion.
- El cierre indica que no es necesaria otra gestion y ofrece los datos de contacto de Fundacion CARF si el cambio no coincide con lo solicitado.

### Integracion y seguridad

- `donoradmin` resuelve la plantilla mediante su catalogo editable y aporta un contexto previamente validado.
- La plantilla escapa todos los valores dinamicos, no ejecuta consultas y no contiene datos reales ni credenciales.
- Se mantiene la identidad visual compartida, con logotipo obtenido desde `SHARED_ASSETS_URL`, estilos inline y estructura compatible con clientes de correo.
- Existe una version de texto plano equivalente en `DonationMailer` para clientes que no renderizan HTML.

### Verificaciones realizadas

- Sintaxis PHP validada en la plantilla.
- Revision de variables obligatorias y opcionales frente al catalogo de `donoradmin`.
- Revision de formato mediante `git diff --check`.

## Jornada tecnica 2026-07-30 - Aviso de devolucion bancaria SEPA

### Nueva plantilla al donante

- Se incorpora `templates/emails/donor_sepa_return_email.php`.
- La comunicacion se utiliza exclusivamente cuando `donoradmin` procesa de
  forma automatica una devolucion bancaria sobre una donacion que ya constaba
  como pagada.
- El mensaje informa con claridad de que la entidad bancaria ha devuelto el
  recibo, sin confundirlo con un reembolso solicitado por el donante.
- Se muestran, cuando estan disponibles, importe, fecha de devolucion,
  referencia y campaña.
- El cierre agradece cordialmente la disposicion a colaborar y deja abierta la
  posibilidad de una colaboracion futura.

### Integracion y seguridad

- `donoradmin` resuelve la plantilla mediante `EmailTemplateCatalog` y aporta
  un contexto previamente validado.
- La plantilla no realiza consultas, no contiene datos reales y omite filas sin
  valor.
- Se mantiene la identidad visual comun: logotipo mediante
  `SHARED_ASSETS_URL`, tarjeta central, tabla de resumen y pie corporativo.

### Verificaciones realizadas

- Sintaxis PHP validada.
- Plantilla reconocida por el catalogo de emails de `donoradmin`.
- Revision de formato mediante `git diff --check`.

## Jornada tecnica 2026-07-27 - Plantilla compartida de reembolso

### Nueva comunicacion al donante

- Se incorpora `templates/emails/donor_refund_email.php` como plantilla fallback comun para el correo manual de reembolso.
- El mensaje confirma que Fundacion CARF ha tramitado el reembolso solicitado por el donante.
- La tabla de detalle muestra solo valores disponibles: importe, fecha, motivo, referencia de donacion, campaña y metodo de pago.
- Se informa de que el tiempo de reflejo en cuenta puede depender de la entidad bancaria o del medio de pago.
- La plantilla mantiene la identidad visual compartida, el logotipo configurado mediante `SHARED_ASSETS_URL` y estilos inline compatibles con clientes de correo.

### Integracion y seguridad

- `donoradmin` consume esta plantilla desde `DonationMailer` y la expone en el catalogo de plantillas editables.
- La plantilla no realiza consultas ni contiene datos reales: recibe un contexto ya validado por el panel.
- No se incorporan credenciales, adjuntos, dumps ni documentos generados.

### Verificaciones realizadas

- Sintaxis PHP validada en la plantilla.
- Revision del HTML y de las variables opcionales para evitar filas vacias.
- Comprobacion de formato Git mediante `git diff --check`.

## Alcance del repositorio

`shared-assets` contiene recursos compartidos entre la pasarela `dona` y el panel `donoradmin`: estilos base, librerias frontend vendorizadas, iconos, imagenes corporativas, utilidades JS y plantillas fallback para emails/PDF.

## Relacion con otros repositorios

- `dona` consume este repositorio para estilos globales, SweetAlert2, scripts comunes, logotipos, iconos y plantillas de email/PDF.
- `donoradmin` consume este repositorio para estilos globales, SweetAlert2, scripts comunes, logotipos, iconos, biblioteca de medios base y plantillas fallback.
- Es un repositorio de soporte compartido: los cambios aqui pueden afectar simultaneamente a la pasarela publica y al panel administrativo.

## Contenido principal

- `css/`: Bulma, SweetAlert2, variables/base compartidas y estilos de paginas comunes.
- `js/`: SweetAlert2 y utilidades CARF compartidas.
- `fonts/`: fuente Inter usada por las interfaces.
- `img/`: logotipos, favicons, iconos de pago, iconos de formularios y recursos visuales comunes.
- `templates/emails/`: plantillas fallback de emails.
- `templates/pdf/`: plantillas fallback de certificados.

## Cambios recientes incluidos en esta copia

- 2026-07-01 - Datos premium en plantillas de email compartidas:
  - Las plantillas con prefijo `donor_` distinguen entre donante particular, empresa y donacion anonima para mostrar solo los datos relevantes en cada caso.
  - Los datos del donante se ordenan de forma uniforme: tipo de donante, datos personales o societarios, contacto, documento, correo, telefono y ubicacion cuando procede.
  - Los emails dirigidos al donante omiten campos vacios o no aplicables, evitando mostrar datos bancarios o de pago que no se han informado para esa operacion concreta.
  - Las plantillas con prefijo `admin_` mantienen una lectura mas completa para administracion, incluyendo datos internos utiles como identificadores, referencias, estado, metodo de pago, recurrencia y consentimiento cuando existen.
  - Se evita duplicar informacion: el nombre visible del donante no se repite si ya queda desglosado por nombre/apellidos o razon social/contacto.
  - La estructura visual existente se mantiene intacta: tarjetas, tablas, colores, cabecera, pies y estilos inline siguen alineados con el sistema actual.
  - Archivos tocados: `templates/emails/admin_donation_email.php`, `templates/emails/admin_transfer_pending_email.php`, `templates/emails/admin_recurring_cancellation_email.php`, `templates/emails/donor_donation_email.php`, `templates/emails/donor_transfer_pending_email.php` y `templates/emails/donor_recurring_cancellation_email.php`.
- 2026-06-30 - Unificacion de plantillas fisicas de email:
  - Las plantillas con prefijo `admin_` se alinean visualmente con `admin_donation_email.php`, compartiendo estructura de tarjeta, cabecera con logotipo, tabla de datos y pie interno oscuro.
  - Las plantillas con prefijo `donor_` se alinean visualmente con `donor_donation_email.php`, manteniendo tono de confirmacion al donante, tabla de resumen y pie corporativo.
  - `admin_donation_email.php` amplia la informacion mostrada con los datos disponibles de donante, contacto, direccion, pago, IBAN/mandato cuando procede y consentimiento.
  - `admin_transfer_pending_email.php` conserva la informacion de transferencia pendiente y adopta el mismo formato interno que el resto de emails administrativos.
  - `admin_recurring_cancellation_email.php` conserva la informacion de cancelacion y anade datos principales de donante y direccion cuando llegan en el contexto.
  - `donor_donation_email.php`, `donor_transfer_pending_email.php` y `donor_recurring_cancellation_email.php` muestran datos principales del donante y de la operacion cuando estan disponibles, omitiendo campos vacios de forma limpia.
  - Las etiquetas `Email` se sustituyen por `Correo electronico` en los campos de correo del donante.
  - Se elimina la exposicion de `Municipio ID`; las plantillas esperan `municipality_name` y `province_name` para mostrar ubicacion legible.
  - Las plantillas mantienen compatibilidad con los datos existentes: no consultan base de datos, no cambian nombres de archivo y no introducen dependencias nuevas.
  - Archivos principales tocados: `templates/emails/admin_donation_email.php`, `admin_transfer_pending_email.php`, `admin_recurring_cancellation_email.php`, `donor_donation_email.php`, `donor_transfer_pending_email.php` y `donor_recurring_cancellation_email.php`.
- 2026-06-24 - Plantillas compartidas:
  - Se corrigen las rutas de imagen en plantillas fallback de email para que el logotipo apunte al origen del dominio y a `/shared-assets/img/Carf_negro.png`, evitando rutas erroneas bajo `/dona/` o `/donoradmin/`.
  - Se actualizan los templates de email de donacion, transferencia pendiente y cancelacion de recurrencia, tanto para notificaciones internas como para comunicaciones al donante.
  - Se valida que la ruta publica del logotipo en staging responde correctamente con `HTTP 200` y `content-type: image/png`.
  - Se ajusta la plantilla PDF de certificado para resolver imagenes desde `shared-assets/img` mediante ruta de disco relativa al propio repositorio.
  - Se corrige la generacion del importe en letra del certificado, aplicando apocope masculina: `un euro`, `veintiun euros`, `veintiun mil`, `treinta y un`, `ciento un mil`, etc.
  - Se mejora el parseo de importes con formatos europeos y mixtos como `1.234,56`, evitando lecturas incorrectas de miles y decimales.
  - Se normalizan tildes en numeros frecuentes y se contempla el caso de millones exactos como `un millon de euros`.
- Consolidacion como dependencia explicita de `dona` y `donoradmin`.
- Documentacion de la relacion entre proyectos para facilitar despliegues y copias de seguridad independientes.
- Preparacion de `.gitignore` para evitar incluir documentos generados, dumps o secretos si se incorporan accidentalmente en el futuro.

## Criterios de seguridad para Git

No se versionan dumps SQL, claves privadas, backups ni PDFs generados con datos reales. Los assets publicos, plantillas fallback y librerias frontend compartidas si quedan versionados.

## Notas de despliegue

Debe publicarse de forma que los proyectos puedan acceder a rutas absolutas como `/shared-assets/css/...`, `/shared-assets/js/...`, `/shared-assets/img/...` y `/shared-assets/templates/...`.

---

## Jornada técnica 2026-09-11 - Visibilidad sin redistribuciones forzadas

### Núcleo JavaScript compartido

- `CARF.utils.isVisible` deja de consultar `window.getComputedStyle`, evitando una
  lectura de estilos que podía forzar al navegador a recalcular el diseño después
  de cambios en el DOM.
- La visibilidad se determina mediante conexión al documento, atributo `hidden`,
  tipo `hidden` de los campos y ancestros con las clases de ocultación utilizadas
  por las aplicaciones.
- La misma implementación se mantiene sincronizada con la copia consumida en `dona`.

### Impacto y verificaciones

- El cambio conserva la API pública del núcleo y no altera las llamadas existentes.
- La medición posterior facilitada para la página de donación dejó de atribuir el
  reflow a `carf.core.js`; Lighthouse mostró 30 ms sin asignación frente a los
  238 ms atribuidos previamente al archivo compartido.
- Se realizó una revisión estática del JavaScript y del formato mediante
  `git diff --check`; el entorno de cierre no dispone del ejecutable Node.
- No se realizaron cambios de base de datos.

Fecha de cierre: 2026-09-11

---

## Jornada tecnica 2026-07-02 - Plantillas centralizadas y certificado oficial

Durante esta jornada se ajustan las plantillas compartidas para que `dona` y `donoradmin` consuman la misma base visual y puedan migrarse de dominio sin rutas fijas.

### Emails compartidos

- Las plantillas fallback de email sustituyen rutas absolutas hardcodeadas por `SHARED_ASSETS_URL`.
- Los logotipos y recursos visuales quedan preparados para publicarse bajo el dominio configurado por cada proyecto consumidor.
- Se mantienen los nombres de archivo y la estructura de datos esperada por `dona` y `donoradmin`.

### Certificado PDF

- `templates/pdf/certificado_template.php` queda como plantilla oficial comun para certificados generados desde la pasarela y desde el panel.
- El formato visual se alinea con la plantilla usada por `dona` en el envio posterior a la donacion, evitando el aspecto antiguo que cortaba el footer.
- La cabecera, cuerpo, firma y pie legal se ajustan para A4 con margenes absolutos y tamanos de fuente mas contenidos.
- La palabra `CERTIFICA` elimina espacios manuales que alargaban el subrayado y descuadraban el bloque.
- El domicilio del donante deja de mostrar IDs internos; compone municipio y provincia en texto legible y evita duplicados cuando coinciden.
- La plantilla acepta alias de assets (`logo_url`, `carf_logo_url`, `firma_url`, `signature_url`) y embebe imagenes desde `shared-assets/img` cuando se ejecuta por disco.
- El calculo de importes en letra conserva compatibilidad con importes ya preformateados y normaliza cantidades en formato europeo.
- El ejercicio del certificado admite `anio_donacion`, `certificado_anio` y `certificate_year`.

### Validaciones realizadas

- Sintaxis PHP validada en la plantilla de certificado.
- Prueba local de renderizado HTML/PDF con WeasyPrint usando datos ficticios, verificando que el ano llega correctamente y que el PDF se genera.

---

## Jornada tecnica 2026-07-07 - Certificado dinamico y recuperacion de donaciones

Durante esta jornada se actualizan las plantillas compartidas consumidas por `dona` y `donoradmin` para soportar certificados mas precisos y el nuevo flujo de recuperacion amable de intentos de donacion no finalizados.

### Certificado PDF compartido

- `templates/pdf/certificado_template.php` deja de mostrar `N.I.F.` como literal fijo.
- La etiqueta del documento se adapta a NIF/NIE cuando corresponde.
- Para pasaporte u otros documentos se muestra el numero sin prefijo incorrecto.
- La plantilla queda preparada para recibir el importe certificado como acumulado anual del donante, manteniendo la redaccion de ejercicio fiscal.
- Se conserva la compatibilidad con los datos enviados desde `dona` y `donoradmin`.

### Email de donacion abandonada

- Nueva plantilla `templates/emails/donor_abandoned_donation_email.php`.
- El tono del email es informativo, agradecido y no comercialmente agresivo.
- Incluye saludo personalizado cuando hay nombre disponible.
- Informa de que la donacion no llego a completarse y ofrece contacto con la Fundacion.
- Incluye enlace a informacion sobre incentivos fiscales.
- La plantilla usa variables configurables para email de la Fundacion y URL fiscal cuando llegan desde los servicios consumidores.

### Impacto en repos consumidores

- `dona` usa la plantilla para el cron automatico de recuperacion.
- `donoradmin` puede usar la misma plantilla para reenvio manual desde la vista tecnica de intentos.
- El certificado compartido mantiene una unica base visual para certificados emitidos desde pasarela y panel.

---

## Jornada tecnica 2026-07-08 - Cierre sin cambios funcionales compartidos

Durante esta jornada no se han introducido cambios de codigo, plantillas o assets en `shared-assets`.

### Impacto en consumidores

- Las mejoras realizadas en `dona` y `donoradmin` reutilizan las plantillas compartidas ya existentes.
- El email `donor_abandoned_donation_email.php` sigue siendo la base comun para recuperacion automatica y reenvio manual.
- No ha sido necesario modificar recursos visuales, CSS compartido ni plantillas PDF.

### Estado final

`shared-assets` queda documentado como estable para esta jornada. Los cambios funcionales del dia se concentran en `dona` y `donoradmin`.

---

## Jornada tecnica 2026-07-10 - Almacenamiento compartido y fin de recibos

Durante esta jornada `shared-assets` pasa a concentrar los recursos documentales y de media que antes estaban dispersos entre `dona` y `donoradmin`.

### Certificados

- Se incorpora `services/AnnualCertificatePdfService.php` como servicio compartido para nombrado, ubicacion y busqueda de certificados anuales.
- Se crea `storage/certificates` como raiz comun para certificados generados por `dona` y `donoradmin`.
- `storage/.htaccess` protege el almacenamiento compartido frente a acceso web directo.
- Los PDFs generados siguen sin versionarse por la regla `*.pdf` de `.gitignore`.

### Media compartida

- Se crea `media-library` como carpeta central para archivos subidos desde la biblioteca de medios del panel.
- `media-library/.htaccess` bloquea acceso web directo a los ficheros subidos.
- `donoradmin` queda preparado para listar recursos desde `img`, `media-library` y `storage`.

### Retirada de recibos

- Se elimina `templates/pdf/recibo_template.php`.
- Se elimina `storage/receipts` como destino documental.
- La documentacion queda ajustada para reflejar que las plantillas PDF compartidas corresponden a certificados.

### Archivos principales modificados

- `services/AnnualCertificatePdfService.php`
- `storage/.htaccess`
- `storage/certificates/.gitkeep`
- `media-library/.htaccess`
- `media-library/.gitkeep`
- `templates/pdf/recibo_template.php`
- `docs/memoria_tecnica_shared-assets.md`

### Verificaciones realizadas

- Validacion de sintaxis PHP en `AnnualCertificatePdfService.php`.
- Revision de que los PDFs reales bajo `storage/certificates` quedan ignorados por Git.
- Revision de que no quedan referencias activas a `receipts` en los repos consumidores.
## Jornada técnica 2026-09-10 - Plantillas PayPal y cancelación automática

- Se incorpora `donor_paypal_incomplete_email.php` para confirmar una donación
  pagada con los datos mínimos facilitados por PayPal. Presenta nombre, correo e
  importe y ofrece un enlace opcional para completar datos fiscales y solicitar
  el certificado, sin afirmar que exista un adjunto.
- La plantilla distingue las vistas de prueba para no presentar enlaces de
  demostración como invitaciones válidas y conserva un contacto alternativo
  cuando no se puede construir el enlace.
- Se incorpora `admin_recurring_automatic_cancellation_email.php` para avisar a
  administración cuando una recurrencia alcanza el límite de impagos, mostrando
  recurrencia, contacto, método, número de fallos, fecha y motivo.
- Ambas plantillas siguen la estructura visual y el pie corporativo de los correos
  existentes y quedan catalogadas por `dona` y `donoradmin`.

### Verificaciones realizadas

- Validación de sintaxis PHP de ambas plantillas.
- Renderizado indirecto mediante las pruebas de correo e integración de `dona`.
- Revisión de formato mediante `git diff --check`.

Fecha de cierre: 2026-09-10

---
