/* global React, ReactDOM */
const { useState, useEffect } = React;
const { Icon, useReveal, Navbar, Footer, useSiteTweaks, SiteTweaks, PrivacyBox, Galeria } = window;
const MADECA_EMAIL = "madeca@masoft.es";
// navbar principal (72) + subcabecera (~52)
const NAV_OFFSET = 126;
const SECTIONS = [
{ id: "que-es", label: "Qué es" },
{ id: "obligacion", label: "La obligación" },
{ id: "funcionamiento", label: "Cómo funciona" },
{ id: "gestion", label: "Gestión" },
{ id: "pantallas", label: "Pantallas" },
{ id: "integraciones", label: "Integraciones" },
{ id: "garantias", label: "Garantías" },
{ id: "preguntas", label: "Preguntas" },
{ id: "mini", label: "Versión gratuita", destacado: true },
{ id: "contacto", label: "Contacto" }
];
const scrollToId = (id) => {
const el = document.getElementById(id);
if (!el) return;
const y = el.getBoundingClientRect().top + window.pageYOffset - NAV_OFFSET;
window.scrollTo({ top: Math.max(0, y), behavior: "smooth" });
};
/* ---------- Contenido ---------- */
// Referencias normativas comprobadas en los textos consolidados del BOE el
// 09/10/2026: Orden FOM/2861/2012 (arts. 2.1, 4, 6, 7 y 9), Ley 16/1987 LOTT
// (arts. 141.17 y 143.1.d), Ley 9/2025 (DT 8.ª) y Resolución de 5 de junio
// de 2026 (BOE-A-2026-12784). No añadir cifras ni plazos sin fuente oficial.
const REQUISITOS = [
{ icon: "file-text", h: "Electrónico de origen", p: "Un albarán en papel escaneado no sirve como DeCA: el documento debe nacer en formato electrónico." },
{ icon: "search", h: "Visible en carretera", p: "La inspección debe poder consultarlo con un código QR o un enlace, sin usuario ni contraseña." },
{ icon: "lock", h: "Conservado un año", p: "Cargador y transportista deben conservarlo al menos un año, a disposición de la Inspección de Transporte." }
];
const PIPELINE = [
{ k: "1", label: "Llega el albarán", sub: "ERP · NUBE · NAS · FOTO", desc: "MADeCa lo recoge de donde ya lo tiene: su ERP, una carpeta compartida, la nube o una foto del papel." },
{ k: "2", label: "Lee los datos", sub: "EXTRACCIÓN · OCR", desc: "Cargador, transportista, destinatario, origen, destino, mercancía, fecha y matrícula, también de escaneos." },
{ k: "3", label: "Usted confirma", sub: "BANDEJA DE REVISIÓN", desc: "Lo que falta, en rojo y a un clic de su campo; el documento original, al lado, señala dónde se leyó cada dato. Nada se emite sin revisión." },
{ k: "4", label: "DeCA con su QR", sub: "PDF · QR · ENLACE", desc: "Copia para el conductor, enlace privado para la otra parte y consulta inmediata para la inspección." }
];
const SHOTS = [
{ src: "assets/madeca/v04/inicio.webp", t: "Inicio", d: "Lo pendiente, lo que está en ruta y lo que necesita atención: certificados por caducar, borradores sin revisar y fuentes con error." },
{ src: "assets/madeca/v04/revision.webp", t: "Revisión de un albarán", d: "MADeCa no da por bueno ningún dato del que no esté completamente seguro. Si un dato no aparece o no puede comprobarse —como un NIF cuyo dígito de control no cuadra—, en lugar de suponerlo lo señala y pide su comprobación: un clic lleva al campo, que queda en rojo hasta confirmarlo con el albarán original a la vista." },
{ src: "assets/madeca/v04/bandeja.webp", t: "Bandeja de revisión", d: "Filtros, orden por columnas y varios documentos a la vez: emitir los completos con confirmación o descartar." },
{ src: "assets/madeca/v04/expediciones.webp", t: "Expediciones", d: "Búsqueda por referencia, matrícula, cliente o NIF, periodos de fechas, estados con su número y exportación a Excel." },
{ src: "assets/madeca/v04/historial.webp", t: "Historial", d: "Estadísticas por día, semana, mes, trimestre, año o fechas a elegir, con la evolución del periodo." },
{ src: "assets/madeca/v04/historial_desglose.webp", t: "Desglose del historial", d: "Por destinatario, cargador, vehículo, provincia, mercancía y más. Pulse una fila y todo el historial se filtra por ella." },
{ src: "assets/madeca/v04/expedicion.webp", t: "Ficha de la expedición", d: "Modificaciones en ruta y actividad: quién emitió, modificó o entregó cada DeCA y cuándo." },
{ src: "assets/madeca/v04/nueva.webp", t: "Nueva expedición", d: "Formulario por secciones del art. 6, con comprobación al escribir y sugerencias de clientes de DeCA anteriores." },
{ src: "assets/madeca/deca.webp", t: "El DeCA en PDF", d: "Documento completo con los datos del art. 6 de la Orden FOM/2861/2012 y su código QR de verificación." },
{ src: "assets/madeca/v04/fuentes.webp", t: "Fuentes de datos", d: "Conexión con SharePoint, Google Drive, Dropbox, NAS y los principales ERP." }
];
const GESTION = [
{ icon: "check", h: "Revisión guiada", p: "Los datos obligatorios que faltan, enlazados a su campo; cada NIF, matrícula y fecha se comprueba mientras se escribe, con las mismas reglas que al emitir." },
{ icon: "search", h: "Dónde se leyó cada dato", p: "En la revisión, el documento original recuadra el dato del campo en el que está. Se comprueba de un vistazo." },
{ icon: "list", h: "Varios a la vez", p: "Seleccione varios albaranes de la bandeja y emita los completos —con su confirmación— o descarte los que no sirven." },
{ icon: "grid", h: "Inicio y avisos", p: "Resumen del día y avisos de certificados por caducar, documentos sin revisar y fuentes con error, también por correo a los administradores." },
{ icon: "file-text", h: "Historial y estadísticas", p: "Todo lo gestionado por periodo, con desglose por destinatario, vehículo, provincia o mercancía. Cada cifra filtra al pulsarla." },
{ icon: "download", h: "Exportación a Excel", p: "Las expediciones y el historial, con sus filtros y totales, en un libro de Excel listo para trabajar." }
];
const INTEGRACIONES = [
["ERP", "Microsoft Dynamics 365 Business Central, Odoo, SAP Business One* y Holded*."],
["Documentos en la nube", "SharePoint, OneDrive, Google Drive y Dropbox."],
["Red de la empresa", "NAS por SFTP o el conector local, que lee los documentos dentro de su red y solo envía los datos."],
["ERP sin API", "Carpeta compartida (a3ERP, Sigrid y otros): el ERP deja el PDF o los datos y MADeCa los recoge."],
["A medida", "API para que su programa envíe los albaranes directamente."]
];
const GARANTIAS = [
{ icon: "check", h: "Revisión humana", p: "Su equipo confirma cada DeCA antes de emitirlo; la responsabilidad de los datos queda donde la pone la norma." },
{ icon: "grid", h: "Cada empresa, sus datos", p: "Accesos separados por empresa y por rol: administración, operación y consulta." },
{ icon: "lock", h: "Claves protegidas", p: "Las credenciales de su ERP y de su nube se guardan cifradas y no se vuelven a mostrar." },
{ icon: "refresh", h: "Cambios en ruta", p: "Si cambia la matrícula o el destino, la modificación se añade al mismo documento: mismo QR, misma URL." },
{ icon: "file-text", h: "Constancia de cada emisión", p: "Cada DeCA queda registrado con su fecha y hora de emisión, la prueba que exime al cargador si el documento no va a bordo." },
{ icon: "cpu", h: "En la nube o en su servidor", p: "Servicio gestionado por Masoft o instalación propia junto a su ERP y su NAS." }
];
const PREGUNTAS = [
["¿Tengo que cambiar de ERP?", "No. MADeCa lee de su ERP, de una carpeta o de sus documentos."],
["¿Y si no tengo ERP?", "Puede subir sus albaranes o rellenar el formulario del panel."],
["¿Vale escanear el albarán en papel?", "Como DeCA, no. Pero MADeCa lee el escaneo y genera un documento válido."],
["¿Necesito certificado digital?", "Solo si el DeCA tiene finalidad contractual. En ese caso MADeCa firma con el certificado de su empresa."],
["¿Quién está obligado?", "El cargador contractual (también agencias, transitarios y operadores logísticos) y el transportista efectivo."],
["¿Qué transportes quedan fuera?", "Las mudanzas, la paquetería de pocos bultos, el traslado de vehículos averiados y los transportes que no necesitan autorización."]
];
/* ---------- Subcabecera propia ---------- */
const MDSubnav = ({ active }) => (
Demostración con sus documentosLe enseñamos el DeCA generado a partir de sus albaranes
Propuesta a medidaSegún su volumen de envíos y la modalidad que prefiera
{state === "done" ? (
Solicitud enviada
Le responderemos a la mayor brevedad con la información de MADeCa.
) : (
)}
);
};
/* ---------- MADeCa Mini (versión gratuita) ---------- */
// Datos tomados del paquete 0.5.0 (LICENCIA.txt y guía de instalación). Si
// cambia el paquete, actualizar MINI_PAQUETE y copiar los ficheros nuevos a
// madeca-mini/ (el .tar.gz no va en Git: se sube por FTP). El .tar.gz no tiene
// acceso directo: se sirve desde api/mini_download.php, que toma siempre el de
// versión más alta que haya en madeca-mini/.
const MINI_DIR = "madeca-mini/";
const MINI_PAQUETE = {
version: "0.5.0",
fichero: "madeca-mini-0.5.0.tar.gz",
tamano: "183 MB",
sha256: "f9a339eb5188145ac8576a6118228bd348a3048a1f2ae4f9567c1d98174c83f3"
};
const MINI_GUIA = MINI_DIR + "GUIA_INSTALACION_MADeCa_Mini.html";
const MINI_LIMITES = [
{ n: "1", h: "Una empresa", p: "Una sola empresa por instalación." },
{ n: "30", h: "DeCA al día", p: "Al llegar al límite no se emiten más ese día; lo pendiente espera en la bandeja." },
{ n: "3", h: "Vehículos", p: "Hasta tres cabezas tractoras o camiones registrados." }
];
const MINI_REQUISITOS = [
["Servidor", "Linux Ubuntu 22.04 o 24.04 LTS, o Debian 12, en un equipo x86_64 (Intel/AMD) con 2 GB de memoria y 10 GB libres como mínimo. Dedicado, máquina virtual o VPS."],
["Dominio propio", "Un dominio o subdominio con un registro DNS que apunte a la IP pública del servidor."],
["Acceso desde internet", "Puertos 80 y 443 abiertos hasta el servidor y libres de otros servicios. El certificado HTTPS se obtiene y se renueva solo."],
["Siempre en marcha", "La inspección consulta el DeCA escaneando su QR en carretera: si el servidor se apaga o pierde la conexión, no podrá descargarlo."],
["Administración", "Acceso sudo por SSH y alguien que se ocupe del servidor: seguridad, copias de seguridad y actualizaciones."]
];
// LICENCIA.txt viene cortada a ~75 columnas para leerse en consola. Para la web
// se unen las líneas de continuación (sangradas, tras otra línea sangrada) y el
// texto se ajusta solo al ancho de la ventana, también en el móvil.
const unirLineas = (txt) => {
const out = [];
let previaSangrada = false;
for (const linea of txt.replace(/\r/g, "").split("\n")) {
const sangrada = /^ +\S/.test(linea);
const t = linea.trim();
if (sangrada && previaSangrada && !/^(-|\d+\.)/.test(t) && out.length) out[out.length - 1] += " " + t;
else out.push(sangrada ? linea.replace(/^ +/, m => (/^-/.test(t) ? " " : "")) : linea);
previaSangrada = sangrada;
}
return out.join("\n");
};
// El paquete no tiene enlace directo: al aceptar se pide al servidor un enlace
// temporal (api/mini_token.php) que caduca a la hora y cuenta la descarga.
const MINI_ERRORES = {
demasiadas: "Se han pedido demasiadas descargas desde su conexión. Inténtelo dentro de una hora.",
no_disponible: "La descarga no está disponible en este momento. Inténtelo más tarde.",
robot: "Su navegador no permite esta descarga. Pruebe con otro navegador."
};
const MiniDescarga = ({ open, onClose }) => {
const [accept, setAccept] = useState(false);
const [licencia, setLicencia] = useState(null);
const [preparando, setPreparando] = useState(false);
const [error, setError] = useState(null);
const [iniciada, setIniciada] = useState(false);
const descargar = async () => {
if (!accept || preparando) return;
setPreparando(true); setError(null); setIniciada(false);
try {
const r = await fetch("api/mini_token.php", {
method: "POST",
credentials: "same-origin",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ acepto: true })
});
const d = await r.json().catch(() => ({}));
if (!r.ok || !d.ok || !d.url) throw new Error(d.error || "servidor");
window.location.href = d.url;
setIniciada(true);
} catch (e) {
setError(MINI_ERRORES[e.message] || "No se ha podido iniciar la descarga. Inténtelo de nuevo en unos minutos.");
} finally {
setPreparando(false);
}
};
useEffect(() => {
if (!open) return;
setAccept(false); setError(null); setIniciada(false);
document.body.style.overflow = "hidden";
if (licencia === null) {
fetch(MINI_DIR + "LICENCIA.txt", { cache: "no-cache" })
.then(r => (r.ok ? r.text() : Promise.reject()))
.then(t => setLicencia(unirLineas(t)))
.catch(() => setLicencia(""));
}
const esc = (e) => { if (e.key === "Escape") onClose(); };
window.addEventListener("keydown", esc);
return () => { window.removeEventListener("keydown", esc); document.body.style.overflow = ""; };
}, [open]);
return (
e.stopPropagation()}>
Descarga gratuita
MADeCa Mini {MINI_PAQUETE.version}
{MINI_PAQUETE.tamano} · Servidor Linux (Ubuntu o Debian) · Instalador, licencia y guía incluidos
Condiciones de uso
{licencia === null &&
Cargando las condiciones…
}
{licencia === "" && (
No se han podido mostrar aquí. Léalas en LICENCIA.txt antes de descargar.
)}
{licencia &&
{licencia}
}
{error &&
{error}
}
{iniciada &&
La descarga ha comenzado. El enlace es personal y caduca en una hora.
La misma aplicación MADeCa, totalmente gratuita, para instalar en un servidor propio.
Tiene todas las funciones, con tres límites.
{MINI_LIMITES.map(x => (
{x.n}
{x.h}
{x.p}
))}
Para técnicos de sistemas
MADeCa Mini no es un programa de doble clic. El DeCA tiene que poder consultarse desde
internet en cualquier momento, así que la aplicación funciona como un servicio web
publicado con HTTPS en un servidor Linux propio. Su instalación y su mantenimiento
requieren conocimientos previos de administración de servidores Linux, redes y dominios.
Si no los tiene, le recomendamos la versión completa con servicio gestionado.
{MINI_REQUISITOS.map(([k, v]) => (
{k}
{v}
))}
Sin soporte ni garantía · Prohibida su venta y su modificación
MADeCa Mini es totalmente gratuita y se entrega tal cual, con su guía de instalación y
configuración. No incluye soporte, instalación, alojamiento, mantenimiento ni
actualizaciones comprometidas, y Masoft.es no garantiza que funcione sin interrupciones
ni errores. En la medida en que la ley lo permita, Masoft.es no responde de ningún daño
derivado de su instalación o su uso: pérdida de datos, interrupciones, DeCA no emitidos o
no disponibles para la inspección, sanciones o pérdida de beneficios. Quien la instala
responde de su servidor, de sus copias de seguridad y de los datos de cada DeCA.
Queda prohibido venderla, alquilarla o cobrar por ella, sola o dentro de
otro producto o servicio, así como modificarla, descompilarla, intentar saltarse sus
límites o quitar los avisos de versión gratuita y de autoría.
Soporte, instalación, servidor o la versión completa sin límites: contrato aparte con
Masoft.es, a través del formulario de contacto.
MADeCa — el DeCA de cada transporte, listo antes de salir.
El documento de control del transporte de mercancías por carretera ya es obligatoriamente
electrónico. MADeCa lo genera a partir de los albaranes que su empresa ya tiene — con su
código QR para la inspección — sin cambiar su forma de trabajar.
Orden FOM/2861/2012QR sin usuario ni contraseñaLee escaneos (OCR)ERP · nube · NASNube o servidor propio
MADeCa emite, guarda y sirve a la inspección el Documento Electrónico de Control
Administrativo de cada envío. Para cargadores, transportistas, agencias y operadores logísticos.
Emitir
Si su ERP ya genera el albarán en PDF, MADeCa le añade el QR. Si no, redacta el
documento completo con los datos, comprobando NIF, matrículas y fechas.
Acompañar el viaje
Copia en PDF con QR para el conductor, cambios en ruta sobre el mismo documento y
cierre de la URL pública siete días después de la entrega.
Conservar
Un año de conservación, enlace privado para la otra parte durante ese plazo y
constancia de la fecha y hora de cada emisión.
{/* ---- La obligación ---- */}
La obligación
Cargador y transportista, los dos.
Desde el 5 de octubre de 2026 el documento de control es obligatoriamente digital. Están
obligados el cargador contractual — también agencias, transitarios y operadores
logísticos — y el transportista efectivo.
{REQUISITOS.map(x => (
{x.h}
{x.p}
))}
401 – 600 €
Multa por infracción grave
cuando falta el documento de control o le faltan datos esenciales. Responden el cargador
y el transportista; el cargador queda eximido si prueba que lo emitió — y MADeCa deja
constancia de cada emisión.
Fuentes (BOE, textos consolidados): Ley 9/2025, disposición transitoria 8.ª · Orden
FOM/2861/2012, arts. 2.1, 4, 7 y 9 · Ley 16/1987 (LOTT), arts. 141.17 y 143.1.d · Resolución
de 5 de junio de 2026 (BOE-A-2026-12784).
{/* ---- Cómo funciona ---- */}
Cómo funciona
Cuatro pasos, uno solo es suyo.
MADeCa recoge y prepara; su equipo revisa y confirma. Así la responsabilidad de los datos
queda donde la pone el art. 7 de la Orden FOM/2861/2012.
{PIPELINE.map((p, i) => (
{p.k}
{p.label}{p.sub}
{p.desc}
))}
{/* ---- Gestión ---- */}
Gestión
Todo a la vista, sin buscar.
Además de emitir, MADeCa le ayuda a revisar más rápido y a saber en cada momento qué ha
gestionado, para quién y con qué vehículo.
{GESTION.map(x => (
{x.h}
{x.p}
))}
{/* ---- Pantallas ---- */}
Pantallas
Así se ve MADeCa.
Pantallas reales de la demostración, con datos ficticios. Pulse una para ampliarla.
{/* ---- Integraciones ---- */}
Integraciones
Se conecta con lo que ya usa.
MADeCa revisa cada pocos minutos la fuente que elija y deja los albaranes nuevos en la
bandeja de revisión.
{INTEGRACIONES.map(([k, v]) => (
{k}
{v}
))}
* SAP Business One y Holded: correspondencia de campos en validación con instalaciones reales.
{/* ---- Garantías ---- */}
Garantías
Seguridad y cumplimiento.
{GARANTIAS.map(x => (
{x.h}
{x.p}
))}
{/* ---- Preguntas ---- */}
Preguntas frecuentes
Lo que nos preguntan siempre.
{PREGUNTAS.map(([q, a]) => (
{q}
{a}
))}
Aviso
MADeCa es una herramienta de apoyo para cumplir la normativa. La exactitud de los datos de
cada DeCA es responsabilidad del cargador contractual y del transportista efectivo (art. 7 de
la Orden FOM/2861/2012); por eso ningún documento se emite sin la confirmación de su equipo.