<!doctype html>
<html lang="es">
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
    <meta name="color-scheme" content="light dark" />
    <link rel="icon" href="data:," />
    <title>Presupuesto de Gastos</title>
    <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=Nunito:ital,wght@0,400;0,600;0,700;0,800;0,900;1,400&display=swap" rel="stylesheet" />
    <style>
      :root {
        color-scheme: light dark;
        --bg: #f4f6f1;
        --bg-grad: #e9efe4;
        --card: #ffffff;
        --card-soft: #eef3ea;
        --ink: #22301f;
        --ink-soft: #5c6b57;
        --ink-faint: #8b9787;
        --line: #dde5d8;
        --green: #2e7d4f;
        --green-dark: #256b42;
        --green-soft: #e2f1e4;
        --green-ink: #1e5c38;
        --amber: #a86e12;
        --amber-soft: #f7ecd4;
        --red: #b3402f;
        --red-soft: #f9e4e0;
        --shadow: 0 2px 10px rgba(46, 80, 50, 0.08), 0 10px 28px rgba(46, 80, 50, 0.06);
        --track: #e2e9dc;
        --radius: 20px;
      }
      @media (prefers-color-scheme: dark) {
        :root {
          --bg: #1c1a17;
          --bg-grad: #232019;
          --card: #2b2721;
          --card-soft: #332e27;
          --ink: #f0ead9;
          --ink-soft: #c9c0ab;
          --ink-faint: #9a917e;
          --line: #453f34;
          --green: #7cc79b;
          --green-dark: #9adbb6;
          --green-soft: #2c4636;
          --green-ink: #a9e3c2;
          --amber: #e3b959;
          --amber-soft: #4a3d20;
          --red: #ef9a8c;
          --red-soft: #4c2f29;
          --shadow: 0 2px 10px rgba(0, 0, 0, 0.35), 0 10px 28px rgba(0, 0, 0, 0.3);
          --track: #403a30;
        }
      }
      * { box-sizing: border-box; }
      html { -webkit-text-size-adjust: 100%; }
      body {
        margin: 0;
        font-family: "Nunito", system-ui, -apple-system, "Segoe UI", sans-serif;
        background: linear-gradient(180deg, var(--bg-grad), var(--bg) 260px);
        color: var(--ink);
        min-height: 100vh;
      }
      button { font-family: inherit; }
      .oculto { display: none !important; }

      /* ---------- CANDADO ---------- */
      .candado {
        position: fixed; inset: 0; z-index: 50;
        display: flex; align-items: center; justify-content: center;
        padding: 24px;
        background: linear-gradient(180deg, var(--bg-grad), var(--bg));
      }
      .candado-tarjeta {
        width: 100%; max-width: 380px;
        background: var(--card);
        border: 1px solid var(--line);
        border-radius: 28px;
        box-shadow: var(--shadow);
        padding: 36px 28px 30px;
        text-align: center;
      }
      .candado-icono {
        width: 72px; height: 72px; margin: 0 auto 16px;
        border-radius: 50%;
        background: var(--green-soft);
        color: var(--green);
        display: flex; align-items: center; justify-content: center;
      }
      .candado h1 { margin: 0 0 6px; font-size: 1.7rem; font-weight: 900; letter-spacing: -0.01em; }
      .candado p { margin: 0 0 22px; color: var(--ink-soft); font-size: 1rem; line-height: 1.45; }
      .candado input {
        width: 100%;
        padding: 15px 18px;
        font-size: 1.05rem; font-family: inherit; font-weight: 700;
        color: var(--ink);
        background: var(--card-soft);
        border: 2px solid var(--line);
        border-radius: 16px;
        outline: none;
        text-align: center;
        transition: border-color .18s ease;
      }
      .candado input:focus { border-color: var(--green); }
      .btn-entrar {
        width: 100%; margin-top: 14px;
        padding: 15px;
        font-size: 1.05rem; font-weight: 800;
        color: #fff;
        background: var(--green);
        border: none; border-radius: 16px;
        cursor: pointer;
        transition: transform .12s ease, background .18s ease, opacity .18s ease;
      }
      @media (prefers-color-scheme: dark) { .btn-entrar { color: #14301f; } }
      .btn-entrar:active { transform: scale(0.98); }
      .btn-entrar:disabled { opacity: .55; cursor: default; }
      .btn-reintentar {
        width: 100%; margin-top: 10px;
        padding: 13px;
        font-size: 1rem; font-weight: 800;
        color: var(--green-ink);
        background: var(--green-soft);
        border: none; border-radius: 16px;
        cursor: pointer;
      }
      .candado-aviso {
        margin: 16px 0 0;
        font-size: .95rem; font-weight: 700; line-height: 1.4;
        min-height: 1.2em;
      }
      .candado-aviso.error { color: var(--red); }
      .candado-aviso.info { color: var(--ink-soft); }

      /* ---------- CONTENIDO ---------- */
      .contenido {
        max-width: 620px;
        margin: 0 auto;
        padding: 18px 16px calc(40px + env(safe-area-inset-bottom));
      }

      /* Período */
      .periodo-nav {
        display: flex; align-items: center; justify-content: space-between; gap: 10px;
        margin-bottom: 12px;
      }
      .flecha {
        width: 46px; height: 46px; flex: 0 0 auto;
        border-radius: 50%;
        border: 1px solid var(--line);
        background: var(--card);
        color: var(--ink);
        font-size: 1.5rem; font-weight: 800; line-height: 1;
        cursor: pointer; box-shadow: var(--shadow);
        display: flex; align-items: center; justify-content: center;
        transition: transform .12s ease;
      }
      .flecha:active { transform: scale(0.92); }
      .periodo-titulo { text-align: center; min-width: 0; }
      .periodo-titulo .etiqueta {
        font-size: 1.18rem; font-weight: 900; line-height: 1.2; letter-spacing: -0.01em;
      }
      .periodo-titulo .clave {
        font-size: .8rem; font-weight: 700; color: var(--ink-faint); margin-top: 2px;
      }
      .quincena-switch {
        display: flex; gap: 6px;
        background: var(--card-soft);
        border: 1px solid var(--line);
        border-radius: 999px;
        padding: 5px;
        margin-bottom: 16px;
      }
      .quincena-switch button {
        flex: 1;
        padding: 11px 8px;
        border: none; border-radius: 999px;
        background: transparent;
        color: var(--ink-soft);
        font-size: .98rem; font-weight: 800;
        cursor: pointer;
        transition: background .22s ease, color .22s ease, box-shadow .22s ease;
      }
      .quincena-switch button.activa {
        background: var(--card);
        color: var(--green-ink);
        box-shadow: 0 2px 8px rgba(40, 70, 45, .14);
      }

      /* Resumen */
      .resumen {
        background: var(--card);
        border: 1px solid var(--line);
        border-radius: var(--radius);
        box-shadow: var(--shadow);
        padding: 18px;
        margin-bottom: 18px;
      }
      .resumen-grid {
        display: grid; grid-template-columns: 1fr 1fr; gap: 12px;
      }
      @media (min-width: 560px) { .resumen-grid { grid-template-columns: repeat(4, 1fr); } }
      .cifra {
        background: var(--card-soft);
        border-radius: 14px;
        padding: 12px 13px;
      }
      .cifra .nombre { font-size: .8rem; font-weight: 800; color: var(--ink-soft); margin-bottom: 3px; }
      .cifra .valor { font-size: 1.13rem; font-weight: 900; letter-spacing: -0.01em; white-space: nowrap; }
      .cifra.sobra .valor { color: var(--green-ink); }
      .cifra.pagado-c .valor { color: var(--green-ink); }
      .barra-zona { margin-top: 16px; }
      .barra-texto {
        display: flex; justify-content: space-between; align-items: baseline;
        font-size: .88rem; font-weight: 800; color: var(--ink-soft);
        margin-bottom: 7px;
      }
      .barra-texto .pct { color: var(--green-ink); font-size: 1rem; font-weight: 900; }
      .barra {
        height: 14px; border-radius: 999px;
        background: var(--track);
        overflow: hidden;
      }
      .barra > div {
        height: 100%; width: 0%;
        border-radius: 999px;
        background: linear-gradient(90deg, #57a773, var(--green));
        transition: width .7s cubic-bezier(.22, .8, .3, 1);
      }
      .resumen-pie {
        display: block;
        margin-top: 16px;
      }
      .btn-editar {
        display: block;
        width: 100%; max-width: 420px;
        margin-inline: auto;
        padding: 16px 24px;
        font-size: .98rem; font-weight: 800;
        color: #fff;
        background: var(--green);
        border: none; border-radius: 999px;
        cursor: pointer; box-shadow: var(--shadow);
        transition: transform .12s ease, opacity .18s ease;
      }
      @media (prefers-color-scheme: dark) { .btn-editar { color: #14301f; } }
      .btn-editar:active { transform: scale(0.98); }
      .btn-editar:disabled { opacity: .55; }
      .guardado-txt { display: block; font-size: .85rem; font-weight: 700; color: var(--ink-faint); min-height: 1em; text-align: center; margin-top: 8px; }

      /* Botón «Listo» al final de la página (solo visible en modo edición) */
      .listo-final { display: block; margin-top: 18px; }

      /* Avisos */
      .aviso {
        border-radius: 14px;
        padding: 12px 14px;
        font-size: .93rem; font-weight: 700; line-height: 1.4;
        margin-bottom: 14px;
        display: flex; align-items: center; justify-content: space-between; gap: 10px;
      }
      .aviso.error { background: var(--red-soft); color: var(--red); }
      .aviso.info { background: var(--amber-soft); color: var(--amber); }
      .aviso button {
        flex: 0 0 auto;
        padding: 7px 14px;
        border: none; border-radius: 999px;
        background: var(--card);
        color: inherit;
        font-weight: 800; font-size: .88rem;
        cursor: pointer;
      }

      /* Tarjetas de gasto */
      .seccion-titulo { font-size: 1.05rem; font-weight: 900; margin: 4px 2px 12px; }
      .lista { display: flex; flex-direction: column; gap: 11px; transition: opacity .25s ease; }
      .lista.cargando { opacity: .45; pointer-events: none; }
      .tarjeta {
        width: 100%;
        display: flex; align-items: center; gap: 11px;
        text-align: left;
        background: var(--card);
        border: 1.5px solid var(--line);
        border-radius: var(--radius);
        box-shadow: var(--shadow);
        padding: 15px 16px;
        cursor: pointer; color: var(--ink);
        transition: background .3s ease, border-color .3s ease, transform .12s ease;
        -webkit-tap-highlight-color: transparent;
      }
      .tarjeta:active { transform: scale(0.985); }
      .tarjeta .icono {
        width: 44px; height: 44px; flex: 0 0 auto;
        border-radius: 15px;
        display: flex; align-items: center; justify-content: center;
        background: color-mix(in srgb, var(--c) 15%, transparent);
        color: var(--c);
        transition: background .3s ease, color .3s ease;
      }
      .tarjeta .datos { flex: 1; min-width: 0; }
      .tarjeta .nombre { font-size: .98rem; font-weight: 800; line-height: 1.25; overflow-wrap: break-word; }
      .tarjeta .detalle { font-size: .83rem; font-weight: 700; color: var(--ink-faint); margin-top: 1px; }
      .tarjeta .monto-zona { text-align: right; flex: 0 0 auto; max-width: 46%; }
      .tarjeta .monto { font-size: 1.08rem; font-weight: 900; letter-spacing: -0.01em; white-space: nowrap; transition: opacity .3s ease; }
      .tarjeta .estado-txt { font-size: .76rem; font-weight: 800; color: var(--ink-faint); margin-top: 2px; }
      .tarjeta .check {
        width: 28px; height: 28px; flex: 0 0 auto;
        border-radius: 50%;
        border: 2.5px solid var(--line);
        color: transparent;
        display: flex; align-items: center; justify-content: center;
        transition: background .3s ease, border-color .3s ease, color .25s ease, transform .3s cubic-bezier(.34, 1.56, .64, 1);
      }
      .tarjeta.pagada { background: var(--green-soft); border-color: var(--green); }
      .tarjeta.pagada .monto { opacity: .5; text-decoration: line-through; text-decoration-thickness: 2px; }
      .tarjeta.pagada .estado-txt { color: var(--green-ink); }
      .tarjeta.pagada .check { background: var(--green); border-color: var(--green); color: #fff; transform: scale(1.06); }
      @media (prefers-color-scheme: dark) { .tarjeta.pagada .check { color: #14301f; } }
      .tarjeta.pagada .icono { background: color-mix(in srgb, var(--green) 18%, transparent); color: var(--green-ink); }
      .tarjeta.no-aplica { opacity: .55; cursor: default; box-shadow: none; }
      .tarjeta.no-aplica:active { transform: none; }
      .tarjeta.no-aplica .monto { font-size: .92rem; font-weight: 800; color: var(--ink-soft); white-space: normal; }
      .tarjeta.no-aplica .check { display: none; }

      /* Modo edición de montos */
      .lista.editando .tarjeta { border-style: dashed; cursor: default; }
      .lista.editando .tarjeta:active { transform: none; }
      .edit-fila { display: flex; align-items: center; justify-content: flex-end; min-width: 0; }
      .edit-prefijo { font-size: .8rem; font-weight: 800; color: var(--ink-faint); margin-right: 5px; flex: 0 0 auto; }
      .edit-input {
        box-sizing: border-box;
        min-width: 0;
        width: 12ch; max-width: 100%;
        padding: 3px 8px;
        font-family: inherit; font-size: clamp(1rem, 4vw, 1.08rem); font-weight: 900; line-height: 1.3;
        text-align: right; color: var(--ink);
        background: var(--card-soft);
        border: 2px solid var(--line); border-radius: 10px;
        outline: none;
        transition: border-color .18s ease, background .18s ease;
      }
      .edit-input:focus { border-color: var(--green); }
      .edit-input.ajustado { border-color: var(--green); background: var(--green-soft); }

      /* Sueldo bruto (en la tarjeta «Sueldo Total»): la fila siempre se ve,
         también fuera de edición; el campo para editarlo solo aparece
         en modo edición */
      #fila-bruto-edit { margin-top: 14px; }
      .edit-input.bruto-input { width: 12ch; }
      .sueldo-alcance { margin: 14px 0 2px; }
      .sueldo-alcance-nombre { display: block; font-size: .8rem; font-weight: 800; color: var(--ink-soft); margin-bottom: 7px; }
      .alcance-chips {
        display: flex; flex-wrap: wrap; gap: 6px;
        background: var(--card-soft);
        border: 1px solid var(--line);
        border-radius: 999px;
        padding: 5px;
      }
      .chip-alcance {
        flex: 1 1 auto;
        padding: 9px 10px;
        border: none; border-radius: 999px;
        background: transparent;
        color: var(--ink-soft);
        font-size: .88rem; font-weight: 800;
        white-space: nowrap;
        cursor: pointer;
        transition: background .22s ease, color .22s ease, box-shadow .22s ease;
      }
      .chip-alcance.activa {
        background: var(--card);
        color: var(--green-ink);
        box-shadow: 0 2px 8px rgba(40, 70, 45, .14);
      }

      /* Eliminar gasto (solo en modo edición) */
      .btn-eliminar {
        flex: 0 0 auto;
        width: 38px; height: 38px;
        border-radius: 50%;
        border: 1px solid var(--red-soft);
        background: var(--red-soft);
        color: var(--red);
        display: flex; align-items: center; justify-content: center;
        cursor: pointer;
        transition: transform .12s ease, opacity .18s ease;
        -webkit-tap-highlight-color: transparent;
      }
      .btn-eliminar:active { transform: scale(0.92); }
      .btn-eliminar:disabled { opacity: .55; cursor: default; }

      /* Modal de confirmación de eliminación */
      .modal-fondo {
        position: fixed; inset: 0; z-index: 60;
        background: rgba(20, 25, 18, .48);
        display: flex; align-items: center; justify-content: center;
        padding: 20px;
      }
      .modal-tarjeta {
        width: 100%; max-width: 400px;
        background: var(--card);
        border: 1px solid var(--line);
        border-radius: 24px;
        box-shadow: var(--shadow);
        padding: 24px 22px 20px;
      }
      .modal-tarjeta h3 { margin: 0 0 8px; font-size: 1.18rem; font-weight: 900; line-height: 1.25; }
      .modal-tarjeta p { margin: 0 0 20px; color: var(--ink-soft); font-size: .97rem; line-height: 1.5; font-weight: 600; }
      .modal-acciones { display: flex; gap: 10px; }
      .modal-acciones button { flex: 1; padding: 13px 10px; border-radius: 999px; font-size: .97rem; font-weight: 800; cursor: pointer; border: none; }
      .btn-cancelar { background: var(--card-soft); color: var(--ink); border: 1px solid var(--line) !important; }
      .btn-confirmar-eliminar { background: var(--red); color: #fff; }
      @media (prefers-color-scheme: dark) { .btn-confirmar-eliminar { color: #2b1512; background: #ef9a8c; } }
      .btn-confirmar-eliminar:disabled { opacity: .55; }

      /* Deuda */
      .deuda {
        margin-top: 24px;
        background: var(--card);
        border: 1px solid var(--line);
        border-radius: var(--radius);
        box-shadow: var(--shadow);
        padding: 20px 18px;
      }
      .deuda h2 { margin: 0 0 2px; font-size: 1.1rem; font-weight: 900; }
      .deuda .sub { font-size: .88rem; font-weight: 700; color: var(--ink-soft); margin-bottom: 14px; }
      .deuda .saldo-nombre { font-size: .82rem; font-weight: 800; color: var(--ink-soft); }
      .deuda .saldo { font-size: 2rem; font-weight: 900; letter-spacing: -0.02em; color: var(--red); line-height: 1.15; }
      @media (prefers-color-scheme: dark) { .deuda .saldo { color: #f0a294; } }
      .deuda .barra { margin: 14px 0 8px; }
      .deuda .barra > div { background: linear-gradient(90deg, #57a773, var(--green)); }
      .deuda .filas { margin-top: 12px; display: flex; flex-direction: column; gap: 7px; }
      .deuda .fila { display: flex; justify-content: space-between; gap: 12px; font-size: .94rem; }
      .deuda .fila .k { color: var(--ink-soft); font-weight: 700; }
      .deuda .fila .v { font-weight: 900; white-space: nowrap; }

      /* Sueldo Total */
      .sueldo-mes {
        margin-top: 16px;
        background: var(--card);
        border: 1px solid var(--line);
        border-radius: var(--radius);
        box-shadow: var(--shadow);
        padding: 20px 18px;
      }
      .sueldo-mes h2 { margin: 0 0 10px; font-size: 1.1rem; font-weight: 900; }
      .sueldo-mes .monto-mes { font-size: 2rem; font-weight: 900; letter-spacing: -0.02em; color: var(--green-ink); line-height: 1.15; }
      .sueldo-mes .descuentos { margin-top: 14px; display: flex; flex-direction: column; gap: 7px; }
      .sueldo-mes .descuento { display: flex; justify-content: space-between; gap: 12px; font-size: .94rem; }
      .sueldo-mes .descuento .k { color: var(--ink-soft); font-weight: 700; }
      .sueldo-mes .descuento .v { font-weight: 900; white-space: nowrap; }
      .sueldo-mes .descuento .edit-fila { align-items: center; }
      .edit-input.desc-input { width: 11ch; }

      /* Campos de edición según la pantalla: en el celular se encogen para
         caber en su celda sin deformar la tarjeta ni el resumen; en PC
         quedan un poco más holgados pero igual de compactos. */
      @media (max-width: 480px) {
        .edit-input { padding: 2px 6px; border-radius: 9px; }
        .edit-prefijo { font-size: .75rem; margin-right: 4px; }
        .alcance-chips { border-radius: 18px; }
        .chip-alcance {
          font-size: .82rem; padding: 8px 7px;
          white-space: normal; text-align: center; line-height: 1.25;
        }
      }
      @media (min-width: 560px) {
        .edit-input { padding: 4px 10px; }
      }

      @media (prefers-reduced-motion: reduce) {
        * { transition: none !important; animation: none !important; }
      }
    </style>
  </head>
  <body>

    <!-- ============ CANDADO ============ -->
    <div class="candado" id="candado">
      <div class="candado-tarjeta">
        <div class="candado-icono" aria-hidden="true">
          <svg width="34" height="34" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="4" y="10" width="16" height="11" rx="2.5"/><path d="M8 10V7a4 4 0 0 1 8 0v3"/><circle cx="12" cy="15.5" r="1.4" fill="currentColor" stroke="none"/></svg>
        </div>
        <h1>Presupuesto</h1>
        <p>Escribe la clave para ver tu presupuesto</p>
        <form id="form-clave" autocomplete="off">
          <input type="password" id="input-clave" placeholder="Clave" autocomplete="current-password" enterkeyhint="go" />
          <button type="submit" class="btn-entrar" id="btn-entrar">Entrar</button>
        </form>
        <button type="button" class="btn-reintentar oculto" id="btn-reintentar">Reintentar</button>
        <p class="candado-aviso info" id="candado-aviso" role="status"></p>
      </div>
    </div>

    <!-- ============ CONTENIDO (oculto hasta validar la clave) ============ -->
    <main class="contenido oculto" id="contenido">

      <div class="periodo-nav">
        <button type="button" class="flecha" id="mes-anterior" aria-label="Mes anterior">‹</button>
        <div class="periodo-titulo">
          <div class="etiqueta" id="periodo-etiqueta">—</div>
          <div class="clave" id="periodo-hoy"></div>
        </div>
        <button type="button" class="flecha" id="mes-siguiente" aria-label="Mes siguiente">›</button>
      </div>

      <div class="quincena-switch" role="group" aria-label="Quincena">
        <button type="button" id="btn-q1">1ra quincena</button>
        <button type="button" id="btn-q2">2da quincena</button>
      </div>

      <section class="resumen" aria-label="Resumen de la quincena">
        <div class="resumen-grid">
          <div class="cifra" id="cifra-sueldo">
            <div class="nombre">Sueldo quincenal</div>
            <div class="valor" id="c-sueldo">—</div>
          </div>
          <div class="cifra"><div class="nombre">Comprometido</div><div class="valor" id="c-comprometido">—</div></div>
          <div class="cifra pagado-c"><div class="nombre">Pagado</div><div class="valor" id="c-pagado">—</div></div>
          <div class="cifra sobra"><div class="nombre">Te sobra</div><div class="valor" id="c-sobra">—</div></div>
        </div>
        <div class="barra-zona">
          <div class="barra-texto"><span>Progreso de pagos</span><span class="pct" id="pct-pagado">0%</span></div>
          <div class="barra"><div id="barra-pagado"></div></div>
        </div>
        <div class="resumen-pie">
          <button type="button" class="btn-editar" id="btn-editar">Editar</button>
          <span class="guardado-txt" id="guardado-txt" role="status"></span>
        </div>
      </section>

      <div class="aviso error oculto" id="aviso-guardar">
        <span>No se pudo guardar el cambio. Revisa tu conexión.</span>
        <button type="button" id="btn-reintentar-guardar">Reintentar</button>
      </div>
      <div class="aviso info oculto" id="aviso-info"><span id="aviso-info-txt"></span></div>

      <h2 class="seccion-titulo">Gastos de la quincena</h2>
      <div class="lista" id="lista-gastos"></div>

      <section class="deuda" id="tarjeta-deuda" aria-label="Deuda del vehículo"></section>

      <section class="sueldo-mes" id="tarjeta-sueldo-mes" aria-label="Sueldo Total">
        <h2>Sueldo Total</h2>
        <div class="monto-mes" id="sueldo-mes-valor">—</div>
        <div class="descuento" id="fila-bruto-edit"><span class="k">Sueldo bruto</span><span class="v" id="bruto-valor">—</span><span class="edit-fila oculto" id="bruto-edit-fila"><span class="edit-prefijo">RD$</span><input class="edit-input bruto-input" id="input-sueldo" type="text" inputmode="decimal" enterkeyhint="done" aria-label="Sueldo bruto de la quincena" /></span></div>
        <div class="sueldo-alcance oculto" id="sueldo-alcance">
          <span class="sueldo-alcance-nombre">Aplicar el sueldo a:</span>
          <div class="alcance-chips" role="group" aria-label="Alcance del sueldo">
            <button type="button" class="chip-alcance activa" id="chip-solo">Solo esta quincena</button>
            <button type="button" class="chip-alcance" id="chip-desde">Todas las 1ras desde aquí</button>
          </div>
        </div>
        <div class="descuentos">
          <div class="descuento"><span class="k">AFP</span><span class="v" id="desc-afp">—</span><span class="edit-fila oculto" id="desc-afp-edit"><span class="edit-prefijo">RD$</span><input class="edit-input desc-input" id="input-desc-afp" type="text" inputmode="decimal" enterkeyhint="done" aria-label="AFP por quincena" /></span></div>
          <div class="descuento"><span class="k">ARS</span><span class="v" id="desc-ars">—</span><span class="edit-fila oculto" id="desc-ars-edit"><span class="edit-prefijo">RD$</span><input class="edit-input desc-input" id="input-desc-ars" type="text" inputmode="decimal" enterkeyhint="done" aria-label="ARS por quincena" /></span></div>
          <div class="descuento" id="fila-desc-isr"><span class="k">ISR</span><span class="v" id="desc-isr">—</span><span class="edit-fila oculto" id="desc-isr-edit"><span class="edit-prefijo">RD$</span><input class="edit-input desc-input" id="input-desc-isr" type="text" inputmode="decimal" enterkeyhint="done" aria-label="ISR por quincena" /></span></div>
        </div>
      </section>

      <div class="listo-final oculto" id="listo-final">
        <button type="button" class="btn-editar" id="btn-listo-final">Listo</button>
      </div>

    </main>

    <!-- ============ CONFIRMAR ELIMINACIÓN ============ -->
    <div class="modal-fondo oculto" id="modal-eliminar" role="dialog" aria-modal="true" aria-labelledby="modal-eliminar-titulo">
      <div class="modal-tarjeta">
        <h3 id="modal-eliminar-titulo">Eliminar gasto</h3>
        <p id="modal-eliminar-txt"></p>
        <div class="modal-acciones">
          <button type="button" class="btn-cancelar" id="btn-cancelar-eliminar">Cancelar</button>
          <button type="button" class="btn-confirmar-eliminar" id="btn-confirmar-eliminar">Eliminar definitivamente</button>
        </div>
      </div>
    </div>

    <!-- Aviso de error al eliminar -->
    <div class="modal-fondo oculto" id="modal-error-eliminar" role="alertdialog" aria-modal="true">
      <div class="modal-tarjeta">
        <h3>No se pudo eliminar</h3>
        <p>No se pudo eliminar este gasto. Revisa tu conexión e inténtalo de nuevo.</p>
        <div class="modal-acciones">
          <button type="button" class="btn-cancelar" id="btn-cerrar-error-eliminar" style="flex:1">Entendido</button>
        </div>
      </div>
    </div>

    <script>
      // ============================================================
      // PUENTE: dirección del Apps Script que conecta con la hoja
      // «Presupuesto de Gastos». Se sustituye tras desplegar el puente.
      // La clave NUNCA va escrita en este código: la teclea la usuaria en
      // la pantalla de candado y el puente la valida en cada petición.
      const BRIDGE_URL = 'https://script.google.com/macros/s/AKfycbx-tc0t4mDT38qQEBuZmRGwMF6QjLcL2BQHHY2Nww3CsAIphEV1khnGCI9p7eqOwhT5/exec';
      // ============================================================

      var CLAVE_KEY = 'pg_clave';
      var CACHE_KEY = 'pg_cache_v3';

      var MESES = ['Enero','Febrero','Marzo','Abril','Mayo','Junio','Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre'];

      // Iconos y color suave de cada gasto conocido
      var ICONOS = {
        'Pasaje Metro 20V': { c: '#b7791f', svg: '<rect x="5" y="3" width="14" height="13" rx="3"/><path d="M5 10h14"/><path d="M8.5 20l1.6-4M15.5 20l-1.6-4"/><circle cx="9" cy="13.2" r="0.4" fill="currentColor"/><circle cx="15" cy="13.2" r="0.4" fill="currentColor"/>' },
        'Pago de Internet': { c: '#2f7fa8', svg: '<path d="M2.5 9a15 15 0 0 1 19 0"/><path d="M5.5 12.5a10.5 10.5 0 0 1 13 0"/><path d="M8.6 16a6 6 0 0 1 6.8 0"/><circle cx="12" cy="19" r="0.6" fill="currentColor"/>' },
        'Pago de Préstamo': { c: '#5b7fa6', svg: '<path d="M3 9.5L12 4l9 5.5"/><path d="M4.5 9.5V19M19.5 9.5V19M8 12v4M12 12v4M16 12v4"/><path d="M2.5 19.5h19"/>' },
        'Pago de luz': { c: '#c78f0a', svg: '<path d="M9 18h6M10 21h4"/><path d="M12 3a6 6 0 0 1 3.5 10.9c-.7.5-1 1-1 2.1h-5c0-1.1-.3-1.6-1-2.1A6 6 0 0 1 12 3z"/>' },
        'Recarga (Claro+Claro)': { c: '#3d9970', svg: '<rect x="7" y="2.5" width="10" height="19" rx="2.5"/><path d="M10.5 18.5h3"/>' },
        'GYM': { c: '#c0564b', svg: '<path d="M7 8v8M4.5 10v4M17 8v8M19.5 10v4M7 12h10"/>' },
        'Compra Supermercado': { c: '#4a7c59', svg: '<circle cx="9.5" cy="20" r="1.3"/><circle cx="17" cy="20" r="1.3"/><path d="M2.5 3.5h2.2l2.4 11h10.4l1.9-8.5H6"/>' },
        'Ahorros': { c: '#8a6d1d', svg: '<path d="M12 21v-7"/><path d="M12 14c0-3.5-2.5-5.5-6.5-5.5 0 4 2 6.5 6.5 5.5z"/><path d="M12 11c0-3 2-5 5.5-5 0 3.5-1.8 5.5-5.5 5z"/>' },
        'Google One': { c: '#5b8dd9', svg: '<path d="M7 18.5a4.5 4.5 0 0 1-.4-9A6 6 0 0 1 18.3 11 3.8 3.8 0 0 1 17.5 18.5z"/>' }
      };
      var ICONO_DEFECTO = { c: '#7a8a72', svg: '<rect x="3.5" y="6" width="17" height="13" rx="2.5"/><path d="M3.5 10.5h17"/>' };
      var SVG_CHECK = '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3.2" stroke-linecap="round" stroke-linejoin="round"><path d="M4.5 12.5l5 5L19.5 7"/></svg>';
      var SVG_TRASH = '<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 7h16"/><path d="M10 11v6M14 11v6"/><path d="M6 7l1 13a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1l1-13"/><path d="M9 7V4a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v3"/></svg>';

      // ---------- Estado ----------
      var sesion = { clave: null, validada: false };
      var datos = null;              // { gastos:[], config:{}, pagos:{}, ajustes:{} } del período mostrado
      var prestamoPagadoServidor = 0; // suma de «Pago de Préstamo» PAGADO en TODOS los períodos, según el puente (ya con montos vigentes)
      var aporteCargado = 0;          // aporte del préstamo de ESTE período tal como llegó del servidor
      var editando = false;           // modo edición de montos activo
      var sueldoAlcance = 'PERIODO';  // alcance elegido para el sueldo: 'PERIODO' | 'DESDE'
      var sueldoSinGuardar = false;   // hay un cambio de sueldo tecleado pendiente de guardar
      var sueldoMontoPendiente = null; // BRUTO tecleado pendiente de guardar (el puente guarda el bruto; null = borrar la regla)
      var sueldoVistaPrevia = null;    // BRUTO tecleado mientras se edita el sueldo; null = usar el bruto ancla del período
      var sueldoTocoChip = false;      // el desenfoque del campo vino de tocar un chip de alcance
      var descVistaPrevia = null;      // descuentos por quincena tecleados en edición {afp, ars, isr}; null = usar config
      var descuentosSinGuardar = false; // hay un cambio de descuentos tecleado pendiente de guardar
      var vista = periodoActual();   // { y, m (0-11), q (1|2) }
      var pendienteEliminar = null;   // concepto pendiente de confirmación de eliminación
      var guardadoPendiente = null;  // último guardado fallido { tipo:'pago'|'ajuste'|'sueldo', ... }
      var guardadoTimer = null;
      var ultimaClaveIntentada = null;

      // ---------- Utilidades ----------
      function $(id) { return document.getElementById(id); }
      function num(v) { var n = Number(v); return isNaN(n) ? 0 : n; }
      function fmt(n) {
        return 'RD$' + num(n).toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 });
      }
      function periodoActual() {
        var d = new Date();
        return { y: d.getFullYear(), m: d.getMonth(), q: d.getDate() <= 15 ? 1 : 2 };
      }
      function periodoKey(p) {
        return p.y + '-' + String(p.m + 1).padStart(2, '0') + '-Q' + p.q;
      }
      function periodoEtiqueta(p) {
        return (p.q === 1 ? '1ra' : '2da') + ' Quincena de ' + MESES[p.m] + ' de ' + p.y;
      }
      function mismoPeriodo(a, b) { return a.y === b.y && a.m === b.m && a.q === b.q; }
      function montoBase(g) { return num(vista.q === 1 ? g.q1 : g.q2); }
      function montoDe(g) {
        // Monto vigente: el ajuste de esta quincena manda sobre el monto base de la hoja
        if (datos && datos.ajustes && Object.prototype.hasOwnProperty.call(datos.ajustes, g.concepto)) {
          return num(datos.ajustes[g.concepto]);
        }
        return montoBase(g);
      }
      function gastoPorConcepto(concepto) {
        var r = null;
        if (datos) datos.gastos.forEach(function (g) { if (g.concepto === concepto) r = g; });
        return r;
      }
      function tieneAjuste(concepto) {
        return !!(datos && datos.ajustes && Object.prototype.hasOwnProperty.call(datos.ajustes, concepto));
      }
      // Total del préstamo que se muestra: el del servidor, corrigiendo el aporte
      // de este período con su estado y monto vigentes en pantalla
      function prestamoMostrado() {
        var aporteActual = 0;
        var g = gastoPorConcepto('Pago de Préstamo');
        if (g && datos.pagos[g.concepto] === 'PAGADO') aporteActual = montoDe(g);
        return Math.max(0, prestamoPagadoServidor - aporteCargado + aporteActual);
      }
      function esc(s) {
        return String(s == null ? '' : s).replace(/[&<>"']/g, function (ch) {
          return { '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;' }[ch];
        });
      }

      // ---------- Caché (solo se lee DESPUÉS de validar la clave en la sesión) ----------
      function leerCache() {
        try { return JSON.parse(localStorage.getItem(CACHE_KEY) || '{}') || {}; } catch (e) { return {}; }
      }
      function guardarCache(periodo, d) {
        if (!sesion.validada) return;
        try {
          var c = leerCache();
          c[periodo] = d;
          localStorage.setItem(CACHE_KEY, JSON.stringify(c));
        } catch (e) { /* caché llena o no disponible: no es crítica */ }
      }
      function borrarTodoLocal() {
        try {
          localStorage.removeItem(CLAVE_KEY);
          localStorage.removeItem(CACHE_KEY);
        } catch (e) {}
      }

      // ---------- Candado ----------
      function avisoCandado(txt, tipo) {
        var el = $('candado-aviso');
        el.textContent = txt || '';
        el.className = 'candado-aviso ' + (tipo || 'info');
      }
      function mostrarCandado() {
        $('contenido').classList.add('oculto');
        $('candado').classList.remove('oculto');
      }
      function mostrarContenido() {
        $('candado').classList.add('oculto');
        $('contenido').classList.remove('oculto');
      }

      // Pide los datos al puente. Rechaza con { auth:true } si la clave no es válida.
      function pedirDatos(clave, periodo) {
        var url = BRIDGE_URL + '?clave=' + encodeURIComponent(clave) + '&periodo=' + encodeURIComponent(periodo);
        return fetch(url, { method: 'GET' }).then(function (r) {
          if (!r.ok) throw new Error('HTTP ' + r.status);
          return r.json();
        }).then(function (j) {
          if (!j || j.ok !== true) { var e = new Error('clave'); e.auth = true; throw e; }
          return j;
        });
      }

      function intentarEntrar(clave) {
        if (!clave) { avisoCandado('Escribe tu clave para entrar.', 'error'); return; }
        ultimaClaveIntentada = clave;
        $('btn-entrar').disabled = true;
        $('btn-reintentar').classList.add('oculto');
        avisoCandado('Comprobando la clave…', 'info');
        pedirDatos(clave, periodoKey(vista)).then(function (j) {
          // Clave validada por el puente en esta sesión
          sesion.clave = clave;
          sesion.validada = true;
          try { localStorage.setItem(CLAVE_KEY, clave); } catch (e) {}
          aplicarDatos(j);
          guardarCache(periodoKey(vista), j);
          $('btn-entrar').disabled = false;
          avisoCandado('', 'info');
          mostrarContenido();
        }).catch(function (e) {
          $('btn-entrar').disabled = false;
          if (e && e.auth) {
            // El puente rechazó la clave: se borra todo lo local
            sesion.clave = null; sesion.validada = false; datos = null;
            borrarTodoLocal();
            $('input-clave').value = '';
            avisoCandado('Clave incorrecta, inténtalo de nuevo', 'error');
          } else {
            // Falló la conexión antes de validar: queda bloqueada
            avisoCandado('No se pudo conectar. Revisa tu conexión e inténtalo de nuevo.', 'error');
            $('btn-reintentar').classList.remove('oculto');
          }
        });
      }

      // ---------- Datos ----------
      function aplicarDatos(j) {
        // Cada respuesta del puente reinicia el total del préstamo con el valor
        // del servidor (que ya suma con los montos vigentes, ajustes incluidos)
        prestamoPagadoServidor = num(j.prestamoPagadoTotal);
        var configJ = j.config || {};
        var sueldoEfectivo = (j.sueldo != null ? num(j.sueldo) : num(vista.q === 1 ? configJ.SueldoQ1 : configJ.SueldoQ2));
        // Modelo invertido: el puente guarda el sueldo BRUTO (el ancla) y el
        // NETO se calcula siempre restando los descuentos. Las cachés viejas
        // no traen sueldoBruto: ahí el sueldo guardado era el neto y el bruto
        // se deriva sumándole los descuentos de esta quincena.
        var descCfg = {
          afp: configJ.DescAFP != null ? num(configJ.DescAFP) : DESC_DEFECTO.afp,
          ars: configJ.DescARS != null ? num(configJ.DescARS) : DESC_DEFECTO.ars,
          isr: configJ.DescISR != null ? num(configJ.DescISR) : DESC_DEFECTO.isr
        };
        var brutoEfectivo = j.sueldoBruto != null ? num(j.sueldoBruto)
          : sueldoEfectivo + descCfg.afp + descCfg.ars + (vista.q === 2 ? descCfg.isr : 0);
        datos = {
          gastos: Array.isArray(j.gastos) ? j.gastos : [],
          config: configJ,
          pagos: j.pagos || {},
          ajustes: (j.ajustes && typeof j.ajustes === 'object') ? j.ajustes : {},
          // Sueldo efectivo de este período, ya resuelto por el puente
          // (base de Config más las reglas guardadas). Las cachés viejas no lo
          // traen: en ese caso se deriva de la base de Config.
          sueldo: sueldoEfectivo,
          // Sueldo BRUTO efectivo de este período (el ancla que guarda el
          // puente). El neto que se muestra se calcula restando descuentos.
          sueldoBruto: brutoEfectivo,
          // Sueldos efectivos de ambas quincenas del mes visto, ya resueltos
          // por el puente. Fallback para cachés viejas sin sueldoQ1/sueldoQ2:
          // la mitad vista usa el sueldo efectivo y la otra mitad su base de Config.
          sueldoQ1: (j.sueldoQ1 != null ? num(j.sueldoQ1) : (vista.q === 1 ? sueldoEfectivo : num(configJ.SueldoQ1))),
          sueldoQ2: (j.sueldoQ2 != null ? num(j.sueldoQ2) : (vista.q === 2 ? sueldoEfectivo : num(configJ.SueldoQ2))),
          // Sueldos BRUTOS efectivos de ambas quincenas del mes visto, ya
          // resueltos por el puente: la cifra grande «Sueldo Total» es su
          // suma. Fallbacks para cachés viejas: la mitad vista usa el bruto
          // efectivo; la otra se deriva de su neto guardado sumándole los
          // descuentos de esa mitad, o de su base de Config.
          sueldoBrutoQ1: (j.sueldoBrutoQ1 != null ? num(j.sueldoBrutoQ1)
            : (vista.q === 1 ? brutoEfectivo
              : (j.sueldoQ1 != null ? num(j.sueldoQ1) + descCfg.afp + descCfg.ars : num(configJ.SueldoQ1)))),
          sueldoBrutoQ2: (j.sueldoBrutoQ2 != null ? num(j.sueldoBrutoQ2)
            : (vista.q === 2 ? brutoEfectivo
              : (j.sueldoQ2 != null ? num(j.sueldoQ2) + descCfg.afp + descCfg.ars + descCfg.isr : num(configJ.SueldoQ2)))),
          prestamoPagadoTotal: prestamoPagadoServidor
        };
        // Aporte del préstamo de ESTE período tal como llegó del servidor
        aporteCargado = 0;
        var gPrestamo = gastoPorConcepto('Pago de Préstamo');
        if (gPrestamo && datos.pagos[gPrestamo.concepto] === 'PAGADO') aporteCargado = montoDe(gPrestamo);
        renderTodo();
      }

      // Trae los datos de la vista actual (ya con la sesión validada).
      function cargarPeriodo(mostrarCarga) {
        if (!sesion.validada) return;
        var periodo = periodoKey(vista);
        if (mostrarCarga) $('lista-gastos').classList.add('cargando');
        pedirDatos(sesion.clave, periodo).then(function (j) {
          $('lista-gastos').classList.remove('cargando');
          ocultarAvisoInfo();
          aplicarDatos(j);
          guardarCache(periodo, j);
        }).catch(function (e) {
          $('lista-gastos').classList.remove('cargando');
          if (e && e.auth) {
            // La clave dejó de ser válida: volver al candado
            sesion.clave = null; sesion.validada = false; datos = null;
            borrarTodoLocal();
            mostrarCandado();
            avisoCandado('Clave incorrecta, inténtalo de nuevo', 'error');
            return;
          }
          // Sin conexión: la caché solo se usa porque la sesión ya validó
          var cache = leerCache();
          if (cache[periodo]) {
            aplicarDatos(cache[periodo]);
            mostrarAvisoInfo('Sin conexión: estás viendo los datos guardados de este período.');
          } else if (datos) {
            mostrarAvisoInfo('Sin conexión: no se pudo actualizar este período.');
          } else {
            mostrarAvisoInfo('Sin conexión y sin datos guardados para este período.');
          }
        });
      }

      // ---------- Render ----------
      function renderTodo() {
        renderPeriodo();
        renderResumen();
        renderTarjetas();
        renderDeuda();
        renderSueldoMes();
      }

      // Descuentos de nómina POR QUINCENA, guardados en la hoja (config).
      // AFP y ARS se cobran en cada quincena; el ISR solo en la 2da.
      // El NETO siempre se calcula restándolos del sueldo bruto (el ancla):
      // al cambiar un descuento, el neto cambia en el acto en esta tarjeta
      // y en el «Sueldo quincenal» del resumen. Si la hoja no trae un
      // valor, se usa el del volante como respaldo.
      var DESC_DEFECTO = { afp: 617.48, ars: 654.05, isr: 870.29 };

      function descuentosConfig() {
        var c = (datos && datos.config) || {};
        return {
          afp: c.DescAFP != null ? num(c.DescAFP) : DESC_DEFECTO.afp,
          ars: c.DescARS != null ? num(c.DescARS) : DESC_DEFECTO.ars,
          isr: c.DescISR != null ? num(c.DescISR) : DESC_DEFECTO.isr
        };
      }

      function descuentosActuales() {
        return descVistaPrevia || descuentosConfig();
      }

      function renderSueldoMes() {
        var el = $('sueldo-mes-valor');
        if (!el || !datos) return;
        // «Sueldo Total»: la cifra grande es la SUMA DE LOS BRUTOS de las
        // dos quincenas del mes visto (la misma en la vista de la 1ra y
        // de la 2da). Sale de los brutos vigentes: si un bruto cambia,
        // el total cambia. Mientras se edita el bruto de esta quincena,
        // el total usa el valor tecleado para esta mitad.
        el.textContent = fmt(brutoPeriodo() + brutoOtraMitad());
        // La fila «Sueldo bruto» siempre está visible, encima de los
        // descuentos: en vista normal muestra el bruto de la quincena
        // vista como texto; en edición esa misma fila muestra el campo.
        var brutoEl = $('bruto-valor');
        if (brutoEl) brutoEl.textContent = fmt(brutoPeriodo());
        // Debajo solo van los descuentos de la quincena vista; el ISR
        // solo se cobra (y solo se muestra) en la 2da quincena. El neto
        // por quincena no va aquí: vive en el «Sueldo quincenal» del resumen.
        var d = descuentosActuales();
        var esQ2 = vista.q === 2;
        $('desc-afp').textContent = fmt(d.afp);
        $('desc-ars').textContent = fmt(d.ars);
        $('desc-isr').textContent = fmt(d.isr);
        // En la 1ra quincena la fila del ISR no se muestra en absoluto
        $('fila-desc-isr').classList.toggle('oculto', !esQ2);
      }

      function renderPeriodo() {
        $('periodo-etiqueta').textContent = periodoEtiqueta(vista);
        var hoy = periodoActual();
        $('periodo-hoy').textContent = mismoPeriodo(vista, hoy) ? 'Estás en la quincena actual' : ('Período ' + periodoKey(vista));
        $('btn-q1').classList.toggle('activa', vista.q === 1);
        $('btn-q2').classList.toggle('activa', vista.q === 2);
      }

      // Sueldo BRUTO base de la mitad vista (Config ya guarda brutos).
      function brutoBase() {
        return num(vista.q === 1 ? datos.config.SueldoQ1 : datos.config.SueldoQ2);
      }

      // Neto que resulta de un bruto dado, restando los descuentos vigentes
      // de esta quincena (el ISR solo se resta en la 2da).
      function netoDesdeBruto(bruto) {
        var d = descuentosActuales();
        return num(bruto) - d.afp - d.ars - (vista.q === 2 ? d.isr : 0);
      }

      // Bruto del período visto: mientras se teclea el sueldo manda el
      // valor tecleado (el campo edita el bruto); si no, el bruto ancla
      // efectivo que resolvió el puente.
      function brutoPeriodo() {
        if (sueldoVistaPrevia !== null) return sueldoVistaPrevia;
        return num(datos.sueldoBruto);
      }

      // Bruto efectivo de la OTRA quincena del mes visto.
      function brutoOtraMitad() {
        return num(vista.q === 1 ? datos.sueldoBrutoQ2 : datos.sueldoBrutoQ1);
      }

      // Neto del período visto: se calcula siempre restando los descuentos
      // del bruto vigente (el tecleado mientras se edita el sueldo).
      function netoPeriodo() {
        return netoDesdeBruto(brutoPeriodo());
      }

      function totales() {
        // El ingreso es el neto calculado del período (bruto − descuentos)
        var sueldo = netoPeriodo();
        var comprometido = 0, pagado = 0;
        datos.gastos.forEach(function (g) {
          var m = montoDe(g);
          comprometido += m;
          if (datos.pagos[g.concepto] === 'PAGADO') pagado += m;
        });
        return { sueldo: sueldo, comprometido: comprometido, pagado: pagado, sobra: sueldo - comprometido };
      }

      function renderResumen() {
        var t = totales();
        $('c-sueldo').textContent = fmt(t.sueldo);
        $('c-comprometido').textContent = fmt(t.comprometido);
        $('c-pagado').textContent = fmt(t.pagado);
        $('c-sobra').textContent = fmt(t.sobra);
        var pct = t.comprometido > 0 ? Math.round((t.pagado / t.comprometido) * 100) : 0;
        $('pct-pagado').textContent = pct + '% pagado';
        requestAnimationFrame(function () { $('barra-pagado').style.width = pct + '%'; });
      }

      function renderTarjetas() {
        var lista = $('lista-gastos');
        lista.innerHTML = '';
        lista.classList.toggle('editando', editando);
        datos.gastos.forEach(function (g) {
          var base = montoBase(g);
          var ajustado = tieneAjuste(g.concepto);
          var monto = montoDe(g);
          var pagada = datos.pagos[g.concepto] === 'PAGADO';
          // No aplica solo si el monto base es 0 y no hay un ajuste para esta quincena
          var noAplica = base <= 0 && !ajustado;
          var ic = ICONOS[g.concepto] || ICONO_DEFECTO;
          var el;
          if (editando) {
            el = document.createElement('div');
          } else {
            el = document.createElement('button');
            el.type = 'button';
          }
          el.className = 'tarjeta' + (pagada && !noAplica ? ' pagada' : '') + (noAplica ? ' no-aplica' : '');
          el.style.setProperty('--c', ic.c);
          if (!editando) {
            el.setAttribute('aria-pressed', pagada && !noAplica ? 'true' : 'false');
            if (noAplica) el.disabled = true;
          }
          var detalle = g.detalle ? '<div class="detalle">' + esc(g.detalle) + '</div>' : '';
          var estadoTxt = (pagada ? 'Pagado' : 'Pendiente') + (ajustado ? ' · Editado' : '');
          var montoHtml;
          if (noAplica) {
            montoHtml = '<div class="monto">No aplica esta quincena</div>';
          } else if (editando) {
            montoHtml = '<div class="edit-fila"><span class="edit-prefijo">RD$</span>' +
              '<input class="edit-input' + (ajustado ? ' ajustado' : '') + '" type="text" inputmode="decimal" enterkeyhint="done" value="' + monto + '" aria-label="Monto de ' + esc(g.concepto) + '" /></div>' +
              '<div class="estado-txt">' + estadoTxt + '</div>';
          } else {
            montoHtml = '<div class="monto">' + fmt(monto) + '</div>' +
              '<div class="estado-txt">' + estadoTxt + '</div>';
          }
          var eliminarHtml = editando ? '<button type="button" class="btn-eliminar" aria-label="Eliminar ' + esc(g.concepto) + '" title="Eliminar definitivamente">' + SVG_TRASH + '</button>' : '';
          var checkHtml = editando ? '' : '<span class="check" aria-hidden="true">' + SVG_CHECK + '</span>';
          el.innerHTML =
            '<span class="icono" aria-hidden="true"><svg width="26" height="26" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">' + ic.svg + '</svg></span>' +
            '<div class="datos"><div class="nombre">' + esc(g.concepto) + '</div>' + detalle + '</div>' +
            '<div class="monto-zona">' + montoHtml + '</div>' +
            checkHtml + eliminarHtml;
          if (editando) {
            var btnElim = el.querySelector('.btn-eliminar');
            if (btnElim) {
              (function (concepto, btn) {
                btn.addEventListener('click', function (ev) {
                  ev.preventDefault();
                  ev.stopPropagation();
                  pedirEliminar(concepto);
                });
              })(g.concepto, btnElim);
            }
          }
          if (editando && !noAplica) {
            conectarInputAjuste(el.querySelector('.edit-input'), g.concepto);
          }
          if (!editando && !noAplica) {
            el.addEventListener('click', function () { alternarPago(g.concepto); });
          }
          lista.appendChild(el);
        });
      }

      // ---------- Edición de montos ----------
      function conectarInputAjuste(input, concepto) {
        if (!input) return;
        // Al escribir: las sumas y restas se reflejan en vivo en el resumen y la deuda
        input.addEventListener('input', function () {
          var v = input.value.trim().replace(',', '.');
          if (v === '') return;
          var n = parseFloat(v);
          if (!isNaN(n) && n >= 0) {
            datos.ajustes[concepto] = n;
            input.classList.add('ajustado');
            renderResumen();
            renderDeuda();
          }
        });
        // Al salir del campo: se guarda el ajuste en la hoja
        input.addEventListener('change', function () { confirmarAjuste(concepto, input); });
        input.addEventListener('keydown', function (ev) {
          if (ev.key === 'Enter') { ev.preventDefault(); input.blur(); }
        });
      }

      function confirmarAjuste(concepto, input) {
        var v = input.value.trim().replace(',', '.');
        if (v === '') {
          // Campo vacío: se quita el ajuste y vuelve el monto base de la hoja
          if (tieneAjuste(concepto)) {
            delete datos.ajustes[concepto];
            guardarAjuste(concepto, null);
          }
          renderTarjetas();
          renderResumen();
          renderDeuda();
          guardarCache(periodoKey(vista), datos);
          return;
        }
        var n = parseFloat(v);
        if (isNaN(n) || n < 0) {
          // Valor no válido: se restaura el monto vigente
          var g = gastoPorConcepto(concepto);
          input.value = g ? montoDe(g) : '';
          return;
        }
        n = Math.round(n * 100) / 100;
        datos.ajustes[concepto] = n;
        input.value = n;
        input.classList.add('ajustado');
        renderResumen();
        renderDeuda();
        guardarCache(periodoKey(vista), datos);
        guardarAjuste(concepto, n);
      }

      function renderDeuda() {
        var c = datos.config;
        var total = num(c.DeudaTotal);
        var saldoBase = num(c.DeudaSaldo);
        // El saldo y lo aportado descuentan los pagos del préstamo ya marcados (todos los períodos)
        var prestamoTotal = prestamoMostrado();
        var saldoRestante = Math.max(0, saldoBase - prestamoTotal);
        var aportadoTotal = (total - saldoBase) + prestamoTotal;
        var pct = total > 0 ? Math.min(100, Math.round((aportadoTotal / total) * 1000) / 10) : 0;
        $('tarjeta-deuda').innerHTML =
          '<h2>Deuda del vehículo</h2>' +
          '<div class="saldo-nombre">Saldo restante</div>' +
          '<div class="saldo">' + fmt(saldoRestante) + '</div>' +
          '<div class="barra"><div id="barra-deuda" style="width:0%"></div></div>' +
          '<div class="barra-texto"><span>Aportado: ' + fmt(aportadoTotal) + ' de ' + fmt(total) + '</span><span class="pct">' + pct + '%</span></div>' +
          '<div class="filas">' +
            '<div class="fila"><span class="k">Total de la deuda</span><span class="v">' + fmt(c.DeudaTotal) + '</span></div>' +
          '</div>';
        requestAnimationFrame(function () {
          var b = $('barra-deuda');
          if (b) b.style.width = pct + '%';
        });
      }

      // ---------- Marcar pagos ----------
      function alternarPago(concepto) {
        if (!datos || editando) return;
        var nuevo = datos.pagos[concepto] === 'PAGADO' ? 'PENDIENTE' : 'PAGADO';
        datos.pagos[concepto] = nuevo;
        renderTarjetas();
        renderResumen();
        // La deuda se recalcula sola: prestamoMostrado() usa el estado y monto vigentes
        if (concepto === 'Pago de Préstamo') renderDeuda();
        guardarCache(periodoKey(vista), datos);
        guardarPago(concepto, nuevo);
      }

      function setGuardado(txt) {
        $('guardado-txt').textContent = txt;
        if (guardadoTimer) clearTimeout(guardadoTimer);
        if (txt === 'Guardado ✓') {
          guardadoTimer = setTimeout(function () { $('guardado-txt').textContent = ''; }, 2600);
        }
      }

      function postPuente(objeto) {
        return fetch(BRIDGE_URL, {
          method: 'POST',
          mode: 'no-cors',
          headers: { 'Content-Type': 'text/plain;charset=UTF-8' },
          body: JSON.stringify(objeto)
        });
      }

      function guardarPago(concepto, estado) {
        setGuardado('Guardando…');
        postPuente({
          clave: sesion.clave,
          action: 'setPago',
          periodo: periodoKey(vista),
          concepto: concepto,
          estado: estado
        }).then(function () {
          if (!guardadoPendiente || guardadoPendiente.tipo === 'pago') {
            guardadoPendiente = null;
            $('aviso-guardar').classList.add('oculto');
          }
          setGuardado('Guardado ✓');
        }).catch(function () {
          guardadoPendiente = { tipo: 'pago', concepto: concepto, estado: estado };
          setGuardado('');
          $('aviso-guardar').classList.remove('oculto');
        });
      }

      function guardarAjuste(concepto, monto) {
        setGuardado('Guardando…');
        postPuente({
          clave: sesion.clave,
          action: 'setAjuste',
          periodo: periodoKey(vista),
          concepto: concepto,
          monto: monto
        }).then(function () {
          if (!guardadoPendiente || guardadoPendiente.tipo === 'ajuste') {
            guardadoPendiente = null;
            $('aviso-guardar').classList.add('oculto');
          }
          setGuardado('Guardado ✓');
        }).catch(function () {
          guardadoPendiente = { tipo: 'ajuste', concepto: concepto, monto: monto };
          setGuardado('');
          $('aviso-guardar').classList.remove('oculto');
        });
      }

      function guardarSueldo(alcance, monto, periodo) {
        setGuardado('Guardando…');
        postPuente({
          clave: sesion.clave,
          action: 'setSueldo',
          periodo: periodo,
          alcance: alcance,
          monto: monto
        }).then(function () {
          if (!guardadoPendiente || guardadoPendiente.tipo === 'sueldo') {
            guardadoPendiente = null;
            $('aviso-guardar').classList.add('oculto');
          }
          setGuardado('Guardado ✓');
        }).catch(function () {
          guardadoPendiente = { tipo: 'sueldo', alcance: alcance, monto: monto, periodo: periodo };
          setGuardado('');
          $('aviso-guardar').classList.remove('oculto');
        });
      }

      function guardarDescuentos(afp, ars, isr) {
        setGuardado('Guardando…');
        postPuente({
          clave: sesion.clave,
          action: 'setDescuentos',
          afp: afp,
          ars: ars,
          isr: isr
        }).then(function () {
          // Solo con la confirmación del puente los valores pasan a la
          // config local y a la caché: si el guardado falla, en pantalla
          // y en la caché siguen los valores anteriores.
          if (datos && datos.config) {
            datos.config.DescAFP = afp;
            datos.config.DescARS = ars;
            datos.config.DescISR = isr;
          }
          if (descVistaPrevia && descVistaPrevia.afp === afp && descVistaPrevia.ars === ars && descVistaPrevia.isr === isr) {
            descVistaPrevia = null;
          }
          if (datos) {
            // Con los descuentos ya guardados, el neto del período se
            // recalcula del bruto ancla y se cachea el resultado
            datos.sueldo = netoPeriodo();
            guardarCache(periodoKey(vista), datos);
          }
          renderSueldoMes();
          renderResumen();
          if (!guardadoPendiente || guardadoPendiente.tipo === 'descuentos') {
            guardadoPendiente = null;
            $('aviso-guardar').classList.add('oculto');
          }
          setGuardado('Guardado ✓');
        }).catch(function () {
          guardadoPendiente = { tipo: 'descuentos', afp: afp, ars: ars, isr: isr };
          setGuardado('');
          $('aviso-guardar').classList.remove('oculto');
        });
      }

      // ---------- Edición de los descuentos (AFP, ARS, ISR) ----------
      // Envía los tres valores tecleados (por quincena) de una vez; la
      // config local y la caché se actualizan en el éxito del POST.
      function guardarDescuentosActuales() {
        if (!datos || !descuentosSinGuardar) return;
        var d = descVistaPrevia || descuentosConfig();
        descuentosSinGuardar = false;
        guardarDescuentos(d.afp, d.ars, d.isr);
      }

      function conectarInputDescuento(input, campo) {
        if (!input) return;
        // Al escribir: el NETO se recalcula en vivo restando el descuento
        // del bruto, y se mueve en todas partes a la vez: la cifra grande
        // de esta tarjeta y el «Sueldo quincenal», el sobrante y la barra
        // del resumen (el ISR solo cuenta en la 2da quincena)
        input.addEventListener('input', function () {
          if (!descVistaPrevia) descVistaPrevia = descuentosConfig();
          var v = input.value.trim().replace(',', '.');
          var n = v === '' ? 0 : parseFloat(v);
          descVistaPrevia[campo] = isNaN(n) || n < 0 ? 0 : Math.round(n * 100) / 100;
          descuentosSinGuardar = true;
          renderSueldoMes();
          renderResumen();
        });
        // Al salir del campo: se guardan los tres descuentos en la hoja
        input.addEventListener('change', function () { guardarDescuentosActuales(); });
        input.addEventListener('keydown', function (ev) {
          if (ev.key === 'Enter') { ev.preventDefault(); input.blur(); }
        });
      }

      // Muestra u oculta los campos de descuento según el modo edición;
      // al entrar, cada campo se precarga con su valor por quincena.
      function sincronizarDescuentosEdicion() {
        var d = descuentosConfig();
        $('input-desc-afp').value = d.afp;
        $('input-desc-ars').value = d.ars;
        $('input-desc-isr').value = d.isr;
        $('desc-afp').classList.toggle('oculto', editando);
        $('desc-ars').classList.toggle('oculto', editando);
        $('desc-isr').classList.toggle('oculto', editando);
        $('desc-afp-edit').classList.toggle('oculto', !editando);
        $('desc-ars-edit').classList.toggle('oculto', !editando);
        $('desc-isr-edit').classList.toggle('oculto', !editando);
        // La fila del ISR completa (valor y campo) solo existe en la 2da
        // quincena: en la 1ra no hay campo de ISR que editar
        $('fila-desc-isr').classList.toggle('oculto', vista.q !== 2);
      }

      // ---------- Edición del sueldo ----------
      function actualizarChipsSueldo() {
        $('chip-solo').classList.toggle('activa', sueldoAlcance === 'PERIODO');
        $('chip-desde').classList.toggle('activa', sueldoAlcance === 'DESDE');
      }

      // Guarda el cambio de sueldo tecleado con el alcance elegido.
      // El campo edita el BRUTO y el puente guarda el bruto tal cual
      // (desde la v9): se envía el valor tecleado directamente, sin
      // ninguna conversión. El neto se sigue calculando por resta.
      // monto tecleado null borra la regla: los brutos locales de esta
      // mitad vuelven a la base de Config (la mejor aproximación en
      // pantalla; el puente resuelve el valor exacto en la próxima carga).
      function guardarSueldoActual() {
        if (!datos || !sueldoSinGuardar) return;
        var brutoTecleado = sueldoMontoPendiente;
        var alcance = sueldoAlcance;
        var periodo = periodoKey(vista);
        sueldoSinGuardar = false;
        var montoEnviar;
        if (brutoTecleado === null) {
          montoEnviar = null;
          datos.sueldoBruto = brutoBase();
          if (vista.q === 1) datos.sueldoBrutoQ1 = brutoBase(); else datos.sueldoBrutoQ2 = brutoBase();
        } else {
          montoEnviar = brutoTecleado;
          datos.sueldoBruto = montoEnviar;
          if (vista.q === 1) datos.sueldoBrutoQ1 = montoEnviar; else datos.sueldoBrutoQ2 = montoEnviar;
        }
        sueldoVistaPrevia = null;
        datos.sueldo = netoPeriodo();
        if (vista.q === 1) datos.sueldoQ1 = datos.sueldo; else datos.sueldoQ2 = datos.sueldo;
        renderResumen();
        renderSueldoMes();
        guardarCache(periodo, datos);
        guardarSueldo(alcance, montoEnviar, periodo);
      }

      function fijarAlcanceSueldo(a) {
        if (sueldoAlcance !== a) {
          sueldoAlcance = a;
          actualizarChipsSueldo();
          // Si ya tecleó un monto, se guarda con el alcance recién elegido
          if (sueldoSinGuardar) guardarSueldoActual();
        }
      }

      function conectarInputSueldo() {
        var input = $('input-sueldo');
        // Al escribir el BRUTO: se recalculan en vivo el «Sueldo Total»
        // de esta tarjeta (bruto tecleado + bruto de la otra mitad), el
        // neto del «Sueldo quincenal» (bruto tecleado − descuentos),
        // «Te sobra» y la barra del resumen
        input.addEventListener('input', function () {
          var v = input.value.trim().replace(',', '.');
          if (v === '') {
            sueldoMontoPendiente = null;
            sueldoVistaPrevia = brutoBase();
            sueldoSinGuardar = true;
            renderResumen();
            renderSueldoMes();
            return;
          }
          var n = parseFloat(v);
          if (!isNaN(n) && n >= 0) {
            sueldoMontoPendiente = Math.round(n * 100) / 100;
            sueldoVistaPrevia = n;
            sueldoSinGuardar = true;
            renderResumen();
            renderSueldoMes();
          }
        });
        // Al salir del campo: se guarda en la hoja con el alcance elegido.
        // Si el desenfoque lo causó tocar un chip de alcance, no se guarda
        // aquí: el chip guarda con el alcance recién elegido.
        input.addEventListener('change', function () {
          if (sueldoTocoChip) { sueldoTocoChip = false; return; }
          guardarSueldoActual();
        });
        input.addEventListener('keydown', function (ev) {
          if (ev.key === 'Enter') { ev.preventDefault(); input.blur(); }
        });
      }

      // ---------- Eliminar gasto definitivamente ----------
      function pedirEliminar(concepto) {
        if (!datos || !editando) return;
        pendienteEliminar = concepto;
        var monto = 0;
        var g = gastoPorConcepto(concepto);
        if (g) monto = montoDe(g);
        $('modal-eliminar-titulo').textContent = '¿Eliminar definitivamente «' + concepto + '»?';
        $('modal-eliminar-txt').textContent = 'Desaparece de todas las quincenas y no se puede deshacer. Al eliminarlo, el Comprometido baja ' + fmt(monto) + ' y lo que te sobra sube por ese mismo monto.';
        $('btn-confirmar-eliminar').disabled = false;
        $('btn-confirmar-eliminar').textContent = 'Eliminar definitivamente';
        $('modal-eliminar').classList.remove('oculto');
      }
      function cerrarModalEliminar() {
        pendienteEliminar = null;
        $('modal-eliminar').classList.add('oculto');
      }
      function mostrarErrorEliminar() {
        $('modal-error-eliminar').classList.remove('oculto');
      }
      function cerrarErrorEliminar() {
        $('modal-error-eliminar').classList.add('oculto');
      }
      function limpiarCacheTrasEliminar(concepto, prestamoAntes) {
        if (!sesion.validada) return;
        try {
          var c = leerCache();
          var claves = Object.keys(c);
          for (var i = 0; i < claves.length; i++) {
            var d = c[claves[i]];
            if (!d || typeof d !== 'object') continue;
            if (Array.isArray(d.gastos)) {
              d.gastos = d.gastos.filter(function (g) { return g.concepto !== concepto; });
            }
            if (d.pagos) delete d.pagos[concepto];
            if (d.ajustes) delete d.ajustes[concepto];
            if (concepto === 'Pago de Préstamo') {
              // En otras entradas de caché no conocemos su prestamoMostrado exacto,
              // usamos el total guardado de esa entrada si existe
              var totalEntrada = num(d.prestamoPagadoTotal);
              if (d.config) {
                d.config.DeudaSaldo = Math.max(0, num(d.config.DeudaSaldo) - totalEntrada);
              }
              d.prestamoPagadoTotal = 0;
            }
          }
          localStorage.setItem(CACHE_KEY, JSON.stringify(c));
        } catch (e) { /* caché no crítica */ }
      }
      function eliminarGastoConfirmado() {
        var concepto = pendienteEliminar;
        if (!concepto || !datos) { cerrarModalEliminar(); return; }
        var btn = $('btn-confirmar-eliminar');
        btn.disabled = true;
        btn.textContent = 'Eliminando…';
        // Capturar antes de borrar: lo ya pagado del préstamo se pliega al saldo
        var prestamoAntes = (concepto === 'Pago de Préstamo') ? prestamoMostrado() : 0;
        setGuardado('Eliminando…');
        postPuente({
          clave: sesion.clave,
          action: 'eliminarGasto',
          concepto: concepto
        }).then(function () {
          // Éxito: quitar de los datos locales de esta vista
          datos.gastos = datos.gastos.filter(function (g) { return g.concepto !== concepto; });
          if (datos.pagos) delete datos.pagos[concepto];
          if (datos.ajustes) delete datos.ajustes[concepto];
          if (concepto === 'Pago de Préstamo') {
            datos.config.DeudaSaldo = Math.max(0, num(datos.config.DeudaSaldo) - prestamoAntes);
            prestamoPagadoServidor = 0;
            aporteCargado = 0;
            datos.prestamoPagadoTotal = 0;
          }
          if (guardadoPendiente && guardadoPendiente.concepto === concepto) {
            guardadoPendiente = null;
            $('aviso-guardar').classList.add('oculto');
          }
          // Limpiar la caché de todos los períodos y guardar la vista actual ya limpia
          limpiarCacheTrasEliminar(concepto, prestamoAntes);
          guardarCache(periodoKey(vista), datos);
          cerrarModalEliminar();
          // Seguir en modo edición y repintar todo al instante
          renderTarjetas();
          renderResumen();
          renderDeuda();
          setGuardado('Guardado ✓');
          // setGuardado con texto distinto para reflejar la eliminación
          $('guardado-txt').textContent = 'Eliminado ✓';
          if (guardadoTimer) clearTimeout(guardadoTimer);
          guardadoTimer = setTimeout(function () { $('guardado-txt').textContent = ''; }, 2600);
        }).catch(function () {
          cerrarModalEliminar();
          setGuardado('');
          mostrarErrorEliminar();
        });
      }

      // ---------- Avisos dentro de la página ----------
      function mostrarAvisoInfo(txt) {
        $('aviso-info-txt').textContent = txt;
        $('aviso-info').classList.remove('oculto');
      }
      function ocultarAvisoInfo() { $('aviso-info').classList.add('oculto'); }

      // ---------- Controles ----------
      $('form-clave').addEventListener('submit', function (ev) {
        ev.preventDefault();
        intentarEntrar($('input-clave').value.trim());
      });
      $('btn-reintentar').addEventListener('click', function () {
        var c = $('input-clave').value.trim() || ultimaClaveIntentada;
        if (!c) { try { c = localStorage.getItem(CLAVE_KEY); } catch (e) {} }
        intentarEntrar(c);
      });
      function entrarModoEdicion() {
        editando = true;
        $('btn-editar').textContent = 'Listo';
        $('listo-final').classList.remove('oculto');
        // El sueldo se edita desde la tarjeta «Sueldo Total»: el campo
        // muestra el BRUTO vigente de la quincena vista y al guardar se
        // envía tal cual, con el alcance por defecto «Solo esta quincena»
        sueldoAlcance = 'PERIODO';
        sueldoSinGuardar = false;
        sueldoVistaPrevia = null;
        sueldoMontoPendiente = brutoPeriodo();
        $('input-sueldo').value = brutoPeriodo();
        $('chip-desde').textContent = vista.q === 1 ? 'Todas las 1ras desde aquí' : 'Todas las 2das desde aquí';
        actualizarChipsSueldo();
        $('bruto-valor').classList.add('oculto');
        $('bruto-edit-fila').classList.remove('oculto');
        $('sueldo-alcance').classList.remove('oculto');
        // Los descuentos también se editan: campos con el valor por quincena
        descVistaPrevia = null;
        descuentosSinGuardar = false;
        sincronizarDescuentosEdicion();
        renderTarjetas();
      }
      function salirModoEdicion() {
        if (!editando) return;
        // Al salir (con «Listo» o al cambiar de período) se guarda cualquier
        // cambio de sueldo que haya quedado tecleado sin confirmar
        guardarSueldoActual();
        // …y cualquier cambio de descuentos pendiente
        guardarDescuentosActuales();
        sueldoVistaPrevia = null;
        cerrarModalEliminar();
        editando = false;
        $('btn-editar').textContent = 'Editar';
        $('listo-final').classList.add('oculto');
        $('bruto-valor').classList.remove('oculto');
        $('bruto-edit-fila').classList.add('oculto');
        $('sueldo-alcance').classList.add('oculto');
        sincronizarDescuentosEdicion();
        if (datos) { renderTarjetas(); renderResumen(); renderSueldoMes(); }
      }
      $('btn-editar').addEventListener('click', function () {
        if (!datos) return;
        if (editando) salirModoEdicion(); else entrarModoEdicion();
      });
      // Botón «Listo» del final de la página: hace exactamente lo mismo
      // que el «Listo» de arriba (sale de edición guardando lo pendiente)
      $('btn-listo-final').addEventListener('click', function () {
        salirModoEdicion();
      });
      $('chip-solo').addEventListener('pointerdown', function () { sueldoTocoChip = true; });
      $('chip-desde').addEventListener('pointerdown', function () { sueldoTocoChip = true; });
      $('chip-solo').addEventListener('click', function () { fijarAlcanceSueldo('PERIODO'); });
      $('chip-desde').addEventListener('click', function () { fijarAlcanceSueldo('DESDE'); });
      conectarInputSueldo();
      conectarInputDescuento($('input-desc-afp'), 'afp');
      conectarInputDescuento($('input-desc-ars'), 'ars');
      conectarInputDescuento($('input-desc-isr'), 'isr');
      $('btn-q1').addEventListener('click', function () {
        if (vista.q !== 1) { salirModoEdicion(); vista.q = 1; renderPeriodo(); cargarPeriodo(true); }
      });
      $('btn-q2').addEventListener('click', function () {
        if (vista.q !== 2) { salirModoEdicion(); vista.q = 2; renderPeriodo(); cargarPeriodo(true); }
      });
      $('mes-anterior').addEventListener('click', function () {
        salirModoEdicion();
        vista.m -= 1;
        if (vista.m < 0) { vista.m = 11; vista.y -= 1; }
        renderPeriodo(); cargarPeriodo(true);
      });
      $('mes-siguiente').addEventListener('click', function () {
        salirModoEdicion();
        vista.m += 1;
        if (vista.m > 11) { vista.m = 0; vista.y += 1; }
        renderPeriodo(); cargarPeriodo(true);
      });
      $('btn-reintentar-guardar').addEventListener('click', function () {
        if (!guardadoPendiente) return;
        if (guardadoPendiente.tipo === 'ajuste') guardarAjuste(guardadoPendiente.concepto, guardadoPendiente.monto);
        else if (guardadoPendiente.tipo === 'sueldo') guardarSueldo(guardadoPendiente.alcance, guardadoPendiente.monto, guardadoPendiente.periodo);
        else if (guardadoPendiente.tipo === 'descuentos') guardarDescuentos(guardadoPendiente.afp, guardadoPendiente.ars, guardadoPendiente.isr);
        else guardarPago(guardadoPendiente.concepto, guardadoPendiente.estado);
      });
      $('btn-cancelar-eliminar').addEventListener('click', function () { cerrarModalEliminar(); });
      $('btn-confirmar-eliminar').addEventListener('click', function () { eliminarGastoConfirmado(); });
      $('btn-cerrar-error-eliminar').addEventListener('click', function () { cerrarErrorEliminar(); });
      $('modal-eliminar').addEventListener('click', function (ev) {
        if (ev.target === $('modal-eliminar')) cerrarModalEliminar();
      });
      $('modal-error-eliminar').addEventListener('click', function (ev) {
        if (ev.target === $('modal-error-eliminar')) cerrarErrorEliminar();
      });

      // ---------- Arranque ----------
      // La página nace bloqueada: nada se muestra hasta que el puente
      // valide la clave en esta sesión.
      mostrarCandado();
      (function arranque() {
        var guardada = null;
        try { guardada = localStorage.getItem(CLAVE_KEY); } catch (e) {}
        if (guardada) {
          $('input-clave').value = guardada;
          intentarEntrar(guardada);
        }
      })();
    </script>
  </body>
</html>
