<?php
/**
 * calcu-fap.php — Calculadora de Facilidades de Pago (FAP) · RND 102500000019
 *  - Motor: motor_fap.php (reusa motor_siat.php + vencimientos.php + ufv_api).
 *  - Diseño IBM Carbon (carbon-tokens.css).
 *  - Modelo cuota validado vs caso real: cuota_k = saldo/N · DA(fecha_k)/DA(solicitud).
 *  Endpoints:
 *    ?action=vencimiento&periodo&impuesto&nit  -> {"fecha": "Y-m-d"|null}
 *    ?action=fap  (POST JSON)                   -> FAP completa (motor_fap)
 */
require_once __DIR__ . '/motor_siat.php';
require_once __DIR__ . '/vencimientos.php';
require_once __DIR__ . '/motor_fap.php';

if (isset($_GET['action']) && $_GET['action'] === 'vencimiento') {
    header('Content-Type: application/json'); header('Cache-Control: no-store');
    $nit = (isset($_GET['nit']) && $_GET['nit'] !== '') ? (int)$_GET['nit'] : null;
    echo json_encode(['fecha' => Vencimientos::sugerir($_GET['periodo'] ?? '', $_GET['impuesto'] ?? '', $nit)]);
    exit;
}
if (isset($_GET['action']) && $_GET['action'] === 'fap') {
    header('Content-Type: application/json'); header('Cache-Control: no-store');
    $in = json_decode(file_get_contents('php://input'), true);
    if (!is_array($in)) $in = $_POST;
    echo json_encode((new MotorFAP())->calcular($in));
    exit;
}
?>
<!DOCTYPE html>
<html lang="es" data-theme="carbon">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Calculadora de Facilidades de Pago (FAP) · boliviaimpuestos</title>
<meta name="description" content="Calcula facilidades de pago del SIN Bolivia (RND 102500000019): pago inicial, garantía, cuotas mensuales con mantenimiento de valor e intereses, y el desglose de cada cuota por impuesto y componente.">
<link rel="icon" href="assets/marca/isotipo-bib.png">
<link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:wght@400;500;600&family=IBM+Plex+Mono:wght@400;500&display=swap" rel="stylesheet">
<link rel="stylesheet" href="carbon-tokens.css">
<style>
  * { margin:0; padding:0; box-sizing:border-box; }
  body { font-family: var(--font-sans); font-size: var(--text-base); color: var(--text-primary);
         background: var(--bg-canvas); line-height: var(--leading-normal); letter-spacing:.16px; -webkit-font-smoothing: antialiased; }
  .num { font-variant-numeric: tabular-nums; } .mono { font-family: var(--font-mono); }
  a { color: var(--color-brand-500); }

  .app-header { display:flex; align-items:center; gap: var(--space-3); height:48px; padding:0 var(--space-5);
                background:#161616; }
  .app-header img { height:24px; filter:brightness(0) invert(1); }
  .app-header__section { font-size: var(--text-base); font-weight:600; color:#f4f4f4; }
  .wrap { max-width: 1200px; margin:0 auto; padding: var(--space-6); }

  .field { display:flex; flex-direction:column; }
  .field label { font-size: var(--text-xs); font-weight:400; color: var(--text-secondary); letter-spacing:.32px; margin-bottom: var(--space-2); }
  .field .hint { font-size: var(--text-xs); color: var(--color-neutral-500); letter-spacing:.32px; margin-top: var(--space-1); }
  .input, .select { height: var(--control-height); border:none; border-bottom:1px solid #8d8d8d; background:#f4f4f4;
                    padding:0 var(--space-3); font-family:inherit; font-size: var(--text-base); color: var(--text-primary); width:100%; }
  .input:hover, .select:hover { background:#e8e8e8; }
  .input:focus, .select:focus { outline:2px solid #0f62fe; outline-offset:-2px; }
  .input.right { text-align:right; }

  .btn { height: var(--control-height); padding:0 var(--space-5); border:0; cursor:pointer; font-family:inherit;
         font-size: var(--text-base); font-weight:400; letter-spacing:.16px; display:inline-flex; align-items:center; gap: var(--space-2); }
  .btn:focus { outline:2px solid #0f62fe; outline-offset:-2px; box-shadow: inset 0 0 0 1px #fff; }
  .btn-primary { background: var(--color-brand-500); color:#fff; }
  .btn-primary:hover { background: var(--color-brand-600); }
  .btn-secondary { background:#fff; color: var(--text-primary); border:1px solid #8d8d8d; }
  .btn-secondary:hover { background: var(--bg-subtle); }
  .btn-ghost { background:transparent; color: var(--color-brand-500); }
  .ic { width:16px; height:16px; flex-shrink:0; }

  .common-bar { display:grid; grid-template-columns: repeat(12,1fr); gap: var(--space-4) var(--space-5);
                margin: var(--space-5) 0; padding: var(--space-5); background:#fff; border:1px solid var(--border-default); }
  .card { background:#fff; border:1px solid var(--border-default); padding: var(--space-5) var(--space-6); margin-bottom: var(--space-5); }
  .card__title { font-size: var(--text-lg); font-weight:600; margin-bottom: var(--space-4); }
  .toolbar { display:flex; gap: var(--space-3); align-items:center; margin: var(--space-4) 0; flex-wrap:wrap; }

  .table-wrap { overflow-x:auto; border:1px solid var(--border-default); background:#fff; }
  table.t { width:100%; border-collapse:collapse; min-width:720px; }
  table.t thead th { background:#e0e0e0; color:#161616; font-size: var(--text-xs); font-weight:600; letter-spacing:.32px;
                     text-align:left; padding: var(--space-3); white-space:nowrap; }
  table.t thead th.r { text-align:right; }
  table.t tbody td { padding: var(--space-2) var(--space-3); border-bottom:1px solid var(--border-default); font-size: var(--text-base); }
  table.t tbody td.r { text-align:right; }
  table.t tbody tr:hover { background:#e8e8e8; }
  table.t tbody td .input, table.t tbody td .select { height:34px; }
  table.t tfoot td { padding: var(--space-3); border-top:2px solid #8d8d8d; background: var(--bg-subtle); font-weight:600; }
  table.t tfoot td.r { text-align:right; }
  .clickrow { cursor:pointer; }
  .clickrow:hover { background:#d0e2ff !important; }
  .compfila { background:#f4f4f4; }
  .compfila td { padding:0 !important; }
  .compbox { padding: var(--space-3) var(--space-4); }
  .compbox table { width:100%; border-collapse:collapse; }
  .compbox th, .compbox td { padding:4px 8px; font-size: var(--text-xs); text-align:right; border-bottom:1px solid var(--border-default); }
  .compbox th:first-child, .compbox td:first-child { text-align:left; }

  .metrics { display:grid; grid-template-columns: repeat(4,1fr); gap: var(--space-4); margin-bottom: var(--space-5); }
  .metric { background:#f4f4f4; padding: var(--space-4); }
  .metric .k { font-size: var(--text-xs); color: var(--text-secondary); letter-spacing:.32px; }
  .metric .v { font-size: var(--text-xl); font-weight:600; margin-top: var(--space-1); }
  @media (max-width:860px){ .metrics { grid-template-columns: repeat(2,1fr); } .common-bar > .field { grid-column: span 12 !important; } }

  .callout { border-left:3px solid var(--color-info-border); background: var(--color-info-bg); color: var(--text-primary);
             padding: var(--space-3) var(--space-4); font-size: var(--text-base); margin: var(--space-4) 0; }
  .err { color: var(--color-danger-fg); }
  .proy { color: var(--color-brand-500); font-weight:600; }
  .foot { margin-top: var(--space-8); padding-top: var(--space-4); border-top:1px solid var(--border-default);
          font-size: var(--text-xs); color: var(--text-tertiary); }
</style>
</head>
<body>
<header class="app-header">
  <img src="assets/marca/isotipo-bib.png" alt="boliviaimpuestos">
  <span class="app-header__section">Calculadora de Facilidades de Pago</span>
</header>

<div class="wrap">
  <div class="callout">
    Planes de pago según la <strong>R.N.D. 102500000019</strong> y su modificación <strong>R.N.D. 102600000020</strong> (pago inicial y garantía 5%). Ingrese las deudas; la calculadora aplica pago inicial,
    garantía y calcula cada cuota mensual (actualizada por UFV e intereses Art. 47) — y le muestra <strong>la composición de cada
    cuota</strong>, que el sistema del SIN no detalla.
  </div>

  <details style="margin: var(--space-3) 0; border:1px solid var(--border-default); background:#fff; padding: var(--space-3) var(--space-4);">
    <summary style="cursor:pointer; font-weight:600; font-size: var(--text-base);">Cómo se calcula (pago inicial, garantía y proyección de UFV)</summary>
    <div style="margin-top: var(--space-3); font-size: var(--text-base); color: var(--text-secondary);">
      <p style="margin-bottom: var(--space-2)"><strong>Pago inicial 5% y garantía 5%, planos</strong> (cualquier monto), según la <strong>RND 102600000020 (08/06/2026)</strong>, que modificó los Arts. 8, 15, 16 y 17 de la RND 102500000019:</p>
      <table class="t" style="min-width:0; max-width:640px;"><thead><tr>
        <th>Concepto</th><th class="r">Antes (RND 102500000019)</th><th class="r">Ahora (RND 102600000020)</th></tr></thead>
        <tbody>
        <tr><td>Pago inicial</td><td class="r">5% / 7,5% / 10% / 15% según monto</td><td class="r"><strong>5% plano</strong></td></tr>
        <tr><td>Garantía (efectivo / valores)</td><td class="r">5% / 10% / 15% / 20% según monto</td><td class="r"><strong>5% plano</strong></td></tr>
        </tbody></table>
      <p style="margin-top: var(--space-3)">La garantía hipotecaria / a primer requerimiento no se descuenta del saldo (es un respaldo, no un pago); debe cubrir ≥ 50% de la deuda.</p>
      <p style="margin-top: var(--space-3)"><strong>Proyección de UFV (cuotas futuras, marcadas con ≈):</strong> se usan las UFV reales del API (BCB) hasta el último dato publicado.
      Para fechas posteriores se proyecta con la <strong>metodología oficial del BCB (Resolución de Directorio 116/2001)</strong>:
      UFV<sub>d</sub> = UFV<sub>d−1</sub> × (1 + π)<sup>1/n</sup>, donde <em>n</em> = días calendario del mes y <em>π</em> = inflación interanual <em>mensualizada</em> (raíz doceava de la inflación a 12 meses).
      La inflación interanual se estima de la propia UFV (UFV<sub>último</sub> ÷ UFV<sub>hace 1 año</sub> − 1, pues la UFV ya acumula la inflación). Es una estimación; el SIN recalcula con la UFV/IPC real de cada mes.</p>
      <p style="margin-top: var(--space-3)"><strong>¿Interés sobre interés?</strong> El interés del Art. 47 es <em>compuesto</em> (capitaliza día a día: (1+tasa/360)<sup>días</sup>, por tramos 4%/6%/10% según los años de mora), por eso crece más que el interés simple. Pero se calcula siempre sobre el <strong>tributo omitido actualizado</strong>, nunca sobre los intereses ya generados (no es anatocismo). El mantenimiento de valor (UFV) no es interés: es la actualización por inflación.</p>
    </div>
  </details>

  <div class="common-bar">
    <div class="field" style="grid-column: span 3;">
      <label for="fechaSolicitud">Fecha de solicitud</label>
      <input type="date" id="fechaSolicitud" class="input">
      <span class="hint" id="ufvSolHint">UFV: —</span>
    </div>
    <div class="field" style="grid-column: span 2;">
      <label for="mesPrimera">1ª cuota (meses después)</label>
      <input type="number" id="mesPrimera" class="input" min="1" max="3" value="2">
      <span class="hint">Mes siguiente a la notificación.</span>
    </div>
    <div class="field" style="grid-column: span 2;">
      <label for="nitDigito">Último dígito NIT</label>
      <select id="nitDigito" class="select">
        <option value="">—</option>
        <option>0</option><option>1</option><option>2</option><option>3</option><option>4</option>
        <option>5</option><option>6</option><option>7</option><option>8</option><option>9</option>
      </select>
      <span class="hint">Sugiere vencimientos.</span>
    </div>
    <div class="field" style="grid-column: span 5;">
      <label for="tipoGarantia">Tipo de garantía</label>
      <select id="tipoGarantia" class="select">
        <option value="efectivo">Efectivo o valores fiscales (se descuenta del saldo)</option>
        <option value="sin">Garantía hipotecaria / a primer requerimiento (no se descuenta)</option>
      </select>
    </div>
  </div>

  <div class="card">
    <div class="card__title">Deudas a incluir en la facilidad</div>
    <div class="table-wrap">
      <table class="t">
        <thead><tr>
          <th>Impuesto</th><th>Periodo</th><th>F. vencimiento</th>
          <th class="r">Tributo omitido (Bs)</th><th class="r">N° cuotas</th><th></th>
        </tr></thead>
        <tbody id="deudasBody"></tbody>
      </table>
    </div>
    <div class="toolbar">
      <button class="btn btn-secondary" onclick="agregarDeuda()">+ Agregar deuda</button>
      <button class="btn btn-primary" onclick="calcularFAP()" style="margin-left:auto;">Calcular facilidad de pago</button>
    </div>
  </div>

  <div id="resultado"></div>

  <footer class="foot">
    Cálculo conforme a la R.N.D. 102500000019 (modif. por R.N.D. 102600000020), Art. 47 de la Ley 2492 y R.N.D. 102500000013. UFV oficiales del BCB (vía API).
    Las cuotas futuras usan UFV proyectada por tendencia y son una estimación sujeta a la UFV real y a la liquidación del SIN.
  </footer>
</div>

<script>
const IMPUESTOS = ['IVA','IT','IUE','RC-IVA','Otro'];
const MENSUALES = ['IVA','IT','RC-IVA'];
function fmtBs(n){ if(n===null||n===undefined||isNaN(n)) return '—'; return 'Bs '+Number(n).toLocaleString('es-BO',{minimumFractionDigits:2,maximumFractionDigits:2}); }
function fmtUFV(n){ if(n===null||n===undefined||isNaN(n)) return '—'; return Number(n).toLocaleString('es-BO',{minimumFractionDigits:5,maximumFractionDigits:5}); }
function fmtF(s){ if(!s) return ''; const [y,m,d]=s.split('-'); return `${d}/${m}/${y}`; }

const CIERRE_MES = { comercial:'12', industrial:'03', agropecuaria:'06', minera:'09' };
let filaId = 0;
function agregarDeuda(pre){
  const id = ++filaId;
  const tr = document.createElement('tr');
  tr.id = 'd'+id;
  tr.innerHTML = `
    <td><select class="select" data-f="impuesto">${IMPUESTOS.map(i=>`<option value="${i}">${i}</option>`).join('')}</select></td>
    <td class="pcell"></td>
    <td><input type="date" class="input" data-f="fechaVenc" value="${pre?.fechaVenc||''}"></td>
    <td><input type="number" class="input right" data-f="tributoOmitido" placeholder="0,00" value="${pre?.to||''}"></td>
    <td><input type="number" class="input right" data-f="cuotas" min="1" max="30" value="${pre?.cuotas||5}" style="max-width:90px"></td>
    <td><button class="btn btn-ghost" title="Quitar" onclick="document.getElementById('d${id}').remove()">✕</button></td>`;
  document.getElementById('deudasBody').appendChild(tr);
  const imp = tr.querySelector('[data-f=impuesto]');
  if(pre?.impuesto) imp.value = pre.impuesto;
  renderPeriodoCell(tr, pre); bindPeriodo(tr);
  imp.addEventListener('change', ()=>{ renderPeriodoCell(tr); bindPeriodo(tr); sugDeuda(tr); });
}
// Celda de periodo adaptativa: mes (mensual/Otro) o cierre+gestión (IUE).
function renderPeriodoCell(tr, pre){
  const imp = tr.querySelector('[data-f=impuesto]').value;
  const cell = tr.querySelector('.pcell');
  if(imp==='IUE'){
    cell.innerHTML = `<div style="display:flex;gap:6px">
      <select class="select" data-f="cierre" style="min-width:118px">
        <option value="comercial">Comercial (31 dic)</option><option value="industrial">Industrial (31 mar)</option>
        <option value="agropecuaria">Agro (30 jun)</option><option value="minera">Minera (30 sep)</option></select>
      <input type="number" class="input" data-f="gestion" placeholder="gestión" min="2001" max="2100" style="width:92px" value="${pre?.gestion||''}"></div>`;
  } else {
    cell.innerHTML = `<input type="month" class="input" data-f="periodo" value="${pre?.periodo||''}">`;
  }
}
function bindPeriodo(tr){ tr.querySelectorAll('.pcell [data-f]').forEach(el=> el.addEventListener('change', ()=>sugDeuda(tr))); }
// Sugiere el vencimiento: mensual por NIT, IUE por cierre (+120 días).
async function sugDeuda(tr){
  const imp = tr.querySelector('[data-f=impuesto]').value, fv = tr.querySelector('[data-f=fechaVenc]');
  let periodoVenc = '';
  if(MENSUALES.includes(imp)){ periodoVenc = tr.querySelector('[data-f=periodo]')?.value || ''; }
  else if(imp==='IUE'){ const g=tr.querySelector('[data-f=gestion]')?.value, c=tr.querySelector('[data-f=cierre]')?.value;
    if(g && c) periodoVenc = g+'-'+CIERRE_MES[c]; }
  else return; // Otro: vencimiento manual
  if(!periodoVenc) return;
  if(fv.value && fv.value!==(fv.dataset.auto||'')) return; // no pisar lo escrito a mano
  const nit = document.getElementById('nitDigito').value;
  try{ const r=await fetch(`?action=vencimiento&periodo=${periodoVenc}&impuesto=${encodeURIComponent(imp)}&nit=${nit}`); const d=await r.json();
    if(d.fecha){ fv.value=d.fecha; fv.dataset.auto=d.fecha; } }catch(e){}
}
// Etiqueta de periodo para mostrar/enviar.
function periodoLabel(tr){
  const imp = tr.querySelector('[data-f=impuesto]').value;
  if(imp==='IUE'){ const g=tr.querySelector('[data-f=gestion]')?.value||'', c=tr.querySelector('[data-f=cierre]')?.value||'';
    return 'Gestión '+g+(c?' ('+c+')':''); }
  return tr.querySelector('[data-f=periodo]')?.value || '';
}

async function refrescarUFVSol(){
  const f=document.getElementById('fechaSolicitud').value, el=document.getElementById('ufvSolHint');
  if(!f){ el.textContent='UFV: —'; return; }
  try{ const r=await fetch(`?action=get_ufv&fecha=${f}`); }catch(e){}
  // usa el endpoint del calc principal si existe; si no, omite
}

async function calcularFAP(){
  const cont = document.getElementById('resultado');
  const deudas = [];
  for(const tr of document.querySelectorAll('#deudasBody tr')){
    const g=f=>tr.querySelector(`[data-f=${f}]`)?.value || '';
    if(!g('tributoOmitido') || !g('fechaVenc')) continue;
    deudas.push({ impuesto:g('impuesto'), periodo:periodoLabel(tr),
      fechaVenc:g('fechaVenc'), tributoOmitido:parseFloat(g('tributoOmitido')||0), cuotas:parseInt(g('cuotas')||1) });
  }
  if(!deudas.length){ cont.innerHTML='<div class="card"><p class="err">Agregue al menos una deuda con tributo y vencimiento.</p></div>'; return; }
  const payload = { fechaSolicitud:document.getElementById('fechaSolicitud').value,
    mesPrimeraCuota:parseInt(document.getElementById('mesPrimera').value||2),
    tipoGarantia:document.getElementById('tipoGarantia').value, deudas };
  cont.innerHTML='<div class="card"><p class="hint">Calculando…</p></div>';
  const r = await (await fetch('?action=fap',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify(payload)})).json();
  if(r.error){ cont.innerHTML=`<div class="card"><p class="err">${r.error}</p></div>`; return; }
  render(r);
}

let ultimoFAP = null;
function render(r){
  ultimoFAP = r;
  const avisos = (r.avisos && r.avisos.length) ? `<div class="callout" style="border-left-color:#f1c21b;background:#fcf4d6;">
    <strong>Avisos:</strong><ul style="margin:var(--space-1) 0 0 18px">${r.avisos.map(a=>`<li>${a}</li>`).join('')}</ul></div>` : '';

  const m = `<div class="metrics">
    <div class="metric"><div class="k">Deuda total consolidada</div><div class="v num">${fmtBs(r.totalConsolidado)}</div></div>
    <div class="metric"><div class="k">Pago inicial (${r.porcentajePagoInicial}%)</div><div class="v num">${fmtBs(r.pagoInicial)}</div></div>
    <div class="metric"><div class="k">Garantía (${r.porcentajeGarantia}%)</div><div class="v num">${fmtBs(r.garantia)}</div></div>
    <div class="metric"><div class="k">Saldo a cuotas</div><div class="v num">${fmtBs(r.saldoTotal)}</div></div>
  </div>
  <div class="callout">📌 <strong>Cómo se llega a la deuda total:</strong> tu deuda se actualiza a hoy → <strong>tributo omitido + mantenimiento de valor (UFV) + interés (Art. 47)</strong>. Sobre ese total se aplica el 5% de pago inicial y el 5% de garantía; el <strong>saldo</strong> se divide entre las cuotas, y <strong>cada cuota se actualiza a su fecha de pago</strong> (por eso crecen mes a mes).</div>
  <div class="toolbar"><span class="hint">Cuota mínima ${fmtBs(r.cuotaMinimaBs)} (200 UFV) · máximo recomendado ${r.maxCuotasPermitidas} cuotas para este saldo · tope legal 30.</span>
    <button class="btn btn-secondary" style="margin-left:auto" onclick="generarReportePDF()">
      <svg class="ic" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="6 9 6 2 18 2 18 9"/><path d="M6 18H4a2 2 0 0 1-2-2v-5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2h-2"/><rect x="6" y="14" width="12" height="8"/></svg>Imprimir / PDF</button></div>`;

  const sd = k => r.deudas.reduce((a,x)=>a+(Number(x[k])||0),0);
  const deudasTab = `<div class="card"><div class="card__title">Deudas y accesorios</div><div class="table-wrap"><table class="t">
    <thead><tr><th>Impuesto</th><th>Periodo</th><th>F. venc.</th><th class="r">Tributo omitido</th><th class="r">Mant. valor</th>
    <th class="r">Interés</th><th class="r">Total deuda</th><th class="r">Pago inicial</th><th class="r">Garantía</th><th class="r">Saldo</th><th class="r">Cuotas</th></tr></thead>
    <tbody>${r.deudas.map(d=>`<tr><td>${d.impuesto}</td><td>${d.periodo}</td><td>${fmtF(d.venc)}</td>
      <td class="r num">${fmtBs(d.tributoOmitido)}</td><td class="r num">${fmtBs(d.mv)}</td><td class="r num">${fmtBs(d.interes)}</td>
      <td class="r num">${fmtBs(d.total)}</td><td class="r num">${fmtBs(d.pagoInicial)}</td><td class="r num">${fmtBs(d.garantia)}</td>
      <td class="r num">${fmtBs(d.saldo)}</td><td class="r num">${d.cuotas}</td></tr>`).join('')}</tbody>
    <tfoot><tr><td colspan="3">TOTAL</td>
      <td class="r num">${fmtBs(sd('tributoOmitido'))}</td><td class="r num">${fmtBs(sd('mv'))}</td><td class="r num">${fmtBs(sd('interes'))}</td>
      <td class="r num">${fmtBs(sd('total'))}</td><td class="r num">${fmtBs(sd('pagoInicial'))}</td><td class="r num">${fmtBs(sd('garantia'))}</td>
      <td class="r num">${fmtBs(sd('saldo'))}</td><td></td></tr></tfoot></table></div>
    <p class="hint" style="margin-top:var(--space-3)">El <strong>Total deuda</strong> de cada fila = tributo omitido + mantenimiento de valor + interés, actualizado a la fecha de solicitud (es lo mismo que calcula la <a href="calcu.php" target="_blank">calculadora de deuda tributaria</a>).</p></div>`;

  const filas = r.cronograma.map(c=>{
    const comp = `<tr class="compfila" id="comp${c.n}" style="display:none"><td colspan="6"><div class="compbox">
      <table><thead><tr><th>Impuesto / periodo</th><th>Tributo</th><th>Mant. valor</th><th>Interés</th><th>Cuota</th></tr></thead>
      <tbody>${c.detalle.map(x=>`<tr><td>${x.impuesto} ${x.periodo}</td><td class="num">${fmtBs(x.to)}</td>
        <td class="num">${fmtBs(x.mv)}</td><td class="num">${fmtBs(x.interes)}</td><td class="num">${fmtBs(x.cuota)}</td></tr>`).join('')}
      <tr style="font-weight:600"><td>Total cuota</td><td class="num">${fmtBs(c.compTO)}</td><td class="num">${fmtBs(c.compMV)}</td>
        <td class="num">${fmtBs(c.compInt)}</td><td class="num">${fmtBs(c.totalCuota)}</td></tr></tbody></table></div></td></tr>`;
    return `<tr class="clickrow" onclick="toggleComp(${c.n})"${c.bajoMinimo?' style="background:#fcf4d6"':''}>
      <td>${c.vencida?'<span title="Ya vencida (UFV cierta)" style="color:#24a148">●</span> ':'<span title="Por venir (estimada)" style="color:#a8a8a8">○</span> '}${c.n}</td><td>${fmtF(c.fecha)}</td><td class="num">${fmtUFV(c.ufv)}${c.proyectada?' <span class="proy" title="UFV proyectada">≈</span>':''}</td>
      <td class="r num">${c.deudasActivas}</td><td class="r num"><strong>${fmtBs(c.totalCuota)}</strong>${c.bajoMinimo?' <span class="proy" title="Bajo el mínimo de 200 UFV">⚠</span>':''}</td>
      <td class="r"><span class="btn-ghost" style="font-size:var(--text-xs)">ver ▾</span></td></tr>${comp}`;
  }).join('');

  const totalPlan = r.cronograma.reduce((a,c)=>a+c.totalCuota,0);
  const resumenEstado = `<p class="hint" style="margin:0 0 var(--space-3)">
    <span style="color:#24a148">●</span> ${r.nVencidas} cuota(s) ya vencida(s) hasta hoy (${fmtF(r.hoy)}): <strong>${fmtBs(r.totalVencido)}</strong> con UFV cierta &nbsp;·&nbsp;
    <span style="color:#a8a8a8">○</span> ${r.nPorVenir} por venir: <strong>${fmtBs(r.totalPorVenir)}</strong> (estimadas con UFV proyectada${r.inflacionAnualEstim!=null?`, inflación ≈ ${r.inflacionAnualEstim}% anual · Res. 116/2001`:''})</p>`;
  const crono = `<div class="card"><div class="card__title">Cronograma de cuotas (${r.maxCuotas}) — clic en una cuota para ver su composición</div>
    ${resumenEstado}
    <div class="table-wrap"><table class="t">
    <thead><tr><th>Cuota</th><th>Vencimiento</th><th>UFV</th><th class="r">Deudas activas</th><th class="r">Total cuota</th><th class="r"></th></tr></thead>
    <tbody>${filas}</tbody>
    <tfoot><tr><td colspan="4">Total a pagar en cuotas</td><td class="r num">${fmtBs(totalPlan)}</td><td></td></tr>
    <tr><td colspan="4">+ Pago inicial + Garantía</td><td class="r num">${fmtBs(r.pagoInicial + r.garantia)}</td><td></td></tr></tfoot>
    </table></div>
    <p class="hint" style="margin-top:var(--space-3)">≈ = UFV proyectada por tendencia (cuota futura, estimada). ⚠ = cuota bajo el mínimo de 200 UFV.</p></div>`;

  document.getElementById('resultado').innerHTML = avisos + m + deudasTab + crono;
}
function toggleComp(n){ const e=document.getElementById('comp'+n); if(e) e.style.display = e.style.display==='none'?'table-row':'none'; }

// ---------------- Reporte PDF ----------------
function generarReportePDF(){
  const r = ultimoFAP; if(!r){ alert('Primero calcule la facilidad de pago.'); return; }
  const fp = fmtF(r.fechaSolicitud);
  const totalPlan = r.cronograma.reduce((a,c)=>a+c.totalCuota,0);
  const deudasRows = r.deudas.map(d=>`<tr><td>${d.impuesto}</td><td>${d.periodo}</td><td>${fmtF(d.venc)}</td>
    <td class="r">${fmtBs(d.tributoOmitido)}</td><td class="r">${fmtBs(d.mv)}</td><td class="r">${fmtBs(d.interes)}</td>
    <td class="r">${fmtBs(d.total)}</td><td class="r">${d.cuotas}</td></tr>`).join('');
  const cronoRows = r.cronograma.map(c=>{
    const det = c.detalle.map(x=>`${x.impuesto} ${x.periodo}: ${fmtBs(x.cuota)} (TO ${fmtBs(x.to)} · MV ${fmtBs(x.mv)} · int ${fmtBs(x.interes)})`).join('<br>');
    return `<tr><td>${c.n}</td><td>${fmtF(c.fecha)}</td><td class="r">${fmtUFV(c.ufv)}${c.proyectada?' ≈':''}</td>
      <td class="r">${fmtBs(c.totalCuota)}${c.bajoMinimo?' ⚠':''}</td><td style="font-size:8pt">${det}</td></tr>`;
  }).join('');
  const avisos = (r.avisos&&r.avisos.length)?`<div class="aviso"><strong>Avisos:</strong> ${r.avisos.join(' · ')}</div>`:'';
  const css = `
    body{font-family:'IBM Plex Sans',system-ui,sans-serif;color:#161616;margin:0;font-size:10pt;}
    .num,.r{font-variant-numeric:tabular-nums;} .r{text-align:right;}
    .head{display:flex;align-items:center;gap:12px;border-bottom:2px solid #0f62fe;padding-bottom:8px;margin-bottom:14px;}
    .head img{height:30px;} .title{font-size:14pt;font-weight:600;} .sub{font-size:9pt;color:#525252;}
    h2{font-size:11pt;font-weight:600;margin:16px 0 6px;}
    .mtr{display:flex;gap:18px;margin:8px 0;flex-wrap:wrap;}
    .mtr div{background:#f4f4f4;padding:6px 12px;} .mtr .k{font-size:8pt;color:#525252;} .mtr .v{font-size:12pt;font-weight:600;}
    table{width:100%;border-collapse:collapse;margin:4px 0;} th{background:#e0e0e0;font-size:8pt;text-align:left;padding:4px 6px;}
    th.r{text-align:right;} td{padding:4px 6px;border-bottom:.5pt solid #e0e0e0;font-size:8.5pt;vertical-align:top;}
    tfoot td{font-weight:600;border-top:1.5pt solid #8d8d8d;}
    .aviso{background:#fcf4d6;border-left:3px solid #f1c21b;padding:6px 10px;font-size:8.5pt;margin:8px 0;}
    .foot{margin-top:16px;border-top:.5pt solid #e0e0e0;padding-top:6px;font-size:7.5pt;color:#6f6f6f;}
    @page{size:A4;margin:16mm 12mm;} tr,td,th{page-break-inside:avoid;}`;
  const html = `<!DOCTYPE html><html lang="es"><head><meta charset="UTF-8"><title>Facilidad de Pago</title>
    <link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:wght@400;500;600&display=swap" rel="stylesheet">
    <style>${css}</style></head><body>
    <div class="head"><img src="${location.origin}/c/assets/marca/isotipo-bib.png"><div>
      <div class="title">Plan de Facilidades de Pago</div>
      <div class="sub">R.N.D. 102500000019 · Fecha de solicitud: ${fp} · Garantía: ${r.porcentajeGarantia>0?'efectivo/valores':'hipotecaria/primer req.'}</div></div></div>
    ${avisos}
    <div class="mtr">
      <div><div class="k">Deuda total</div><div class="v">${fmtBs(r.totalConsolidado)}</div></div>
      <div><div class="k">Pago inicial (${r.porcentajePagoInicial}%)</div><div class="v">${fmtBs(r.pagoInicial)}</div></div>
      <div><div class="k">Garantía (${r.porcentajeGarantia}%)</div><div class="v">${fmtBs(r.garantia)}</div></div>
      <div><div class="k">Saldo a cuotas</div><div class="v">${fmtBs(r.saldoTotal)}</div></div>
    </div>
    <h2>Deudas y accesorios</h2>
    <table><thead><tr><th>Impuesto</th><th>Periodo</th><th>F. venc.</th><th class="r">Tributo omitido</th><th class="r">Mant. valor</th><th class="r">Interés</th><th class="r">Total</th><th class="r">Cuotas</th></tr></thead><tbody>${deudasRows}</tbody></table>
    <h2>Cronograma de cuotas (${r.maxCuotas}) y composición</h2>
    <table><thead><tr><th>Cuota</th><th>Vencimiento</th><th class="r">UFV</th><th class="r">Total cuota</th><th>Composición</th></tr></thead>
      <tbody>${cronoRows}</tbody>
      <tfoot><tr><td colspan="3">Total a pagar en cuotas</td><td class="r">${fmtBs(totalPlan)}</td><td></td></tr></tfoot></table>
    <div class="foot">Cálculo conforme a la R.N.D. 102500000019, Art. 47 de la Ley 2492 y R.N.D. 102500000013. UFV oficiales del BCB vía API; las cuotas futuras (≈) usan UFV proyectada por tendencia. Estimación referencial sujeta a la liquidación del SIN.</div>
    </body></html>`;
  const w = window.open('', '_blank'); w.document.write(html); w.document.close(); w.focus();
  setTimeout(()=>{ try{ w.print(); }catch(e){} }, 600);
}

document.addEventListener('DOMContentLoaded', ()=>{
  document.getElementById('fechaSolicitud').value = new Date().toISOString().slice(0,10);
  agregarDeuda(); agregarDeuda();
});
</script>
</body>
</html>
