Files
balam/prototipo/Prototipo-Etapa0.html
T

1453 lines
94 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="es-MX">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Balam · Facturación y Cobranza — Prototipo Etapa 0</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=Poppins:wght@300;400;500;600;700;800&display=swap" rel="stylesheet">
<style>
/* ============ Tokens de marca (marca/Marca-Balam.md) ============ */
:root{
--amarillo:#F7BD0C; /* primario de marca */
--amarillo-hover:#E0AB06;
--amarillo-soft:#FDF3D3;
--cafe:#331F0E; /* fondo oscuro de marca / tinta */
--cafe-2:#4A2E15; /* superficie café clara (hover sidebar) */
--cafe-3:#241608; /* café profundo */
--blanco:#FFFFFF;
--gris:#5C5C5C; /* neutro de apoyo */
/* Derivados cálidos para superficies claras */
--crema:#FAF7F1; /* fondo de la app */
--crema-2:#F4EEE2; /* soft */
--linea:#E9E0CF;
--linea-2:#DDD2BC;
--ink:#331F0E;
--muted:#7C6C56;
--muted-2:#A5977F;
/* Semánticos (conviven con café/amarillo) */
--ok:#1E7A46; --ok-bg:#E5F3EA; --ok-ink:#155934;
--warn:#9A5B00; --warn-bg:#FCF0D0; --warn-ink:#7A4800; --warn-line:#E9C566;
--bad:#B3261E; --bad-bg:#FBE9E7; --bad-ink:#8C1D17;
--info:#175E8C; --info-bg:#E7F1F8; --info-ink:#114A70;
--neutral-bg:#EFE9DC; --neutral-ink:#6B5C47;
--radius:14px; --radius-sm:9px;
--shadow:0 1px 2px rgba(51,31,14,.05), 0 4px 14px rgba(51,31,14,.06);
--shadow-lg:0 6px 28px rgba(51,31,14,.14);
--banner-h:36px;
}
*{box-sizing:border-box}
html,body{margin:0;padding:0;background:var(--crema)}
body{font-family:"Poppins",system-ui,sans-serif;color:var(--ink);font-size:13.5px;line-height:1.55;padding-top:var(--banner-h);min-width:1366px}
::selection{background:var(--amarillo);color:var(--cafe)}
/* ============ Banner fijo de prototipo ============ */
.proto-banner{
position:fixed;inset:0 0 auto 0;height:var(--banner-h);z-index:100;
background:var(--amarillo);color:var(--cafe);
display:flex;align-items:center;justify-content:center;gap:10px;
font-size:12px;font-weight:600;letter-spacing:.04em;
border-bottom:1px solid rgba(51,31,14,.18);
}
.proto-banner .dot-sep{opacity:.45;font-weight:400}
.proto-banner svg{width:15px;height:15px;flex:none}
/* ============ Layout ============ */
.app{display:grid;grid-template-columns:268px 1fr;min-height:calc(100vh - var(--banner-h))}
/* ============ Sidebar café ============ */
.sidebar{
background:linear-gradient(180deg,var(--cafe) 0%,var(--cafe-3) 100%);
color:#D9CDBB;display:flex;flex-direction:column;padding:26px 16px 18px;
position:sticky;top:var(--banner-h);height:calc(100vh - var(--banner-h));
}
.brand{display:flex;align-items:center;gap:12px;padding:0 10px 22px;border-bottom:1px solid rgba(247,189,12,.16);margin-bottom:14px}
.logo-mark{
width:42px;height:42px;border-radius:11px;background:var(--amarillo);color:var(--cafe);
display:grid;place-items:center;font-weight:800;font-size:21px;letter-spacing:-.02em;flex:none;
box-shadow:0 2px 10px rgba(247,189,12,.35);
}
.brand-name{color:var(--amarillo);font-weight:700;font-size:19px;letter-spacing:.14em;line-height:1.1}
.brand-sub{color:rgba(255,255,255,.55);font-size:8.5px;letter-spacing:.24em;text-transform:uppercase;font-weight:500}
.nav-label{color:rgba(217,205,187,.45);font-size:10px;letter-spacing:.18em;text-transform:uppercase;padding:14px 12px 7px;font-weight:600}
.nav-item{
display:flex;align-items:center;gap:11px;padding:10px 13px;border-radius:10px;cursor:pointer;
color:#D9CDBB;font-size:13px;font-weight:400;transition:background .13s,color .13s;margin-bottom:2px;
border:1px solid transparent;
}
.nav-item svg{width:18px;height:18px;flex:none;opacity:.75}
.nav-item:hover{background:rgba(247,189,12,.10);color:#F3EADA}
.nav-item.active{background:var(--amarillo);color:var(--cafe);font-weight:600;box-shadow:0 2px 12px rgba(247,189,12,.30)}
.nav-item.active svg{opacity:1}
.nav-num{margin-left:auto;font-size:10.5px;background:rgba(255,255,255,.14);color:#F3EADA;padding:1px 8px;border-radius:999px;font-weight:500}
.nav-item.active .nav-num{background:rgba(51,31,14,.16);color:var(--cafe)}
.bind-status{
margin-top:auto;background:rgba(247,189,12,.07);border:1px solid rgba(247,189,12,.18);border-radius:11px;
padding:11px 13px;font-size:11.5px;color:#E8DFCE;
}
.bind-status .row1{display:flex;align-items:center;gap:8px;font-weight:600;color:#fff;font-size:12px;margin-bottom:2px}
.dot{width:7px;height:7px;border-radius:50%;background:#3FBF71;box-shadow:0 0 6px #3FBF71}
.bind-status .meta{color:rgba(232,223,206,.6);font-size:10.5px}
.user-chip{display:flex;align-items:center;gap:10px;padding:12px 10px 0;margin-top:10px;border-top:1px solid rgba(247,189,12,.14)}
.avatar{width:34px;height:34px;border-radius:50%;background:var(--cafe-2);border:1.5px solid rgba(247,189,12,.5);color:var(--amarillo);display:grid;place-items:center;font-weight:600;font-size:12px;flex:none}
.user-name{color:#F6F1E7;font-size:12.5px;font-weight:500;line-height:1.25}
.user-role{color:rgba(217,205,187,.55);font-size:10.5px}
/* ============ Main / topbar ============ */
.main{min-width:0}
.topbar{
background:var(--blanco);border-bottom:1px solid var(--linea);padding:13px 34px;
display:flex;align-items:center;justify-content:space-between;gap:16px;
position:sticky;top:var(--banner-h);z-index:20;
}
.crumbs{display:flex;align-items:center;gap:8px;color:var(--muted);font-size:12.5px}
.crumbs .sep{color:var(--muted-2)}
.crumbs .current{color:var(--ink);font-weight:600}
.top-right{display:flex;align-items:center;gap:10px}
.pill{
display:inline-flex;align-items:center;gap:7px;font-size:11.5px;color:var(--muted);
background:var(--crema-2);border:1px solid var(--linea);padding:5px 11px;border-radius:999px;font-weight:500;
}
.pill b{color:var(--ink);font-weight:600}
.content{padding:30px 34px 60px;max-width:1560px}
.view{display:none;animation:fadeIn .18s ease}
.view.active{display:block}
@keyframes fadeIn{from{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}
.view-title{font-size:23px;font-weight:600;letter-spacing:-.01em;margin:0 0 3px}
.view-sub{color:var(--muted);margin:0 0 26px;font-size:13px;font-weight:300;max-width:880px}
.view-sub b{font-weight:500;color:var(--ink)}
/* ============ Componentes base ============ */
.card{background:var(--blanco);border:1px solid var(--linea);border-radius:var(--radius);box-shadow:var(--shadow)}
.card-pad{padding:22px 24px}
.card-title{font-size:14px;font-weight:600;margin:0 0 2px}
.card-sub{font-size:11.5px;color:var(--muted);font-weight:300;margin:0 0 14px}
.btn{
display:inline-flex;align-items:center;gap:7px;padding:9px 16px;border-radius:10px;
font-family:"Poppins",sans-serif;font-size:12.5px;font-weight:500;cursor:pointer;
border:1px solid transparent;background:var(--blanco);transition:all .13s;line-height:1.3;
}
.btn-primary{background:var(--amarillo);color:var(--cafe);font-weight:600;box-shadow:0 2px 10px rgba(247,189,12,.35)}
.btn-primary:hover{background:var(--amarillo-hover)}
.btn-dark{background:var(--cafe);color:#F6F1E7}
.btn-dark:hover{background:var(--cafe-2)}
.btn-ghost{background:var(--blanco);color:var(--ink);border-color:var(--linea-2)}
.btn-ghost:hover{background:var(--crema-2)}
.btn-danger-ghost{background:var(--blanco);color:var(--bad);border-color:#EBC7C3}
.btn-danger-ghost:hover{background:var(--bad-bg)}
.btn-sm{padding:5px 11px;font-size:11.5px;border-radius:8px}
.btn-lg{padding:12px 22px;font-size:13.5px;border-radius:12px}
.btn:disabled{opacity:.45;cursor:not-allowed;box-shadow:none}
.chip{display:inline-flex;align-items:center;gap:5px;padding:2.5px 10px;border-radius:999px;font-size:11px;font-weight:500;white-space:nowrap;line-height:1.6}
.chip-ok{background:var(--ok-bg);color:var(--ok-ink)}
.chip-warn{background:var(--warn-bg);color:var(--warn-ink)}
.chip-bad{background:var(--bad-bg);color:var(--bad-ink)}
.chip-info{background:var(--info-bg);color:var(--info-ink)}
.chip-neutral{background:var(--neutral-bg);color:var(--neutral-ink)}
.chip-brand{background:var(--amarillo-soft);color:#8A6400}
.chip-cafe{background:var(--cafe);color:var(--amarillo)}
.chip .cdot{width:6px;height:6px;border-radius:50%;background:currentColor;opacity:.75}
.alert{display:flex;gap:11px;padding:13px 16px;border-radius:11px;font-size:12.5px;line-height:1.55;border:1px solid}
.alert svg{width:17px;height:17px;flex:none;margin-top:1px}
.alert-warn{background:var(--warn-bg);border-color:var(--warn-line);color:var(--warn-ink)}
.alert-bad{background:var(--bad-bg);border-color:#E9B8B3;color:var(--bad-ink)}
.alert-info{background:var(--info-bg);border-color:#BCD7EA;color:var(--info-ink)}
.alert-ok{background:var(--ok-bg);border-color:#B7DCC5;color:var(--ok-ink)}
.alert b{font-weight:600}
/* Tablas */
.tbl{width:100%;border-collapse:collapse;font-size:12.5px}
.tbl th{
text-align:left;font-size:10.5px;text-transform:uppercase;letter-spacing:.07em;color:var(--muted);
font-weight:600;padding:11px 14px;border-bottom:1px solid var(--linea);background:var(--crema);white-space:nowrap;
}
.tbl td{padding:12px 14px;border-bottom:1px solid var(--linea);vertical-align:middle}
.tbl tr:last-child td{border-bottom:none}
.tbl tbody tr{transition:background .12s}
.tbl tbody tr:hover{background:var(--crema)}
.tbl .num{text-align:right;font-variant-numeric:tabular-nums}
.tbl .mono{font-weight:600;color:var(--ink)}
.row-click{cursor:pointer}
/* Formularios */
.field label{display:block;font-size:11px;font-weight:600;color:var(--muted);text-transform:uppercase;letter-spacing:.06em;margin-bottom:6px}
.field input[type=text],.field input[type=date],.field select,.field textarea{
width:100%;padding:9px 12px;border:1px solid var(--linea-2);border-radius:9px;font-family:"Poppins",sans-serif;
font-size:12.5px;color:var(--ink);background:var(--blanco);outline:none;transition:border .13s, box-shadow .13s;
}
.field input:focus,.field select:focus,.field textarea:focus{border-color:var(--amarillo);box-shadow:0 0 0 3px rgba(247,189,12,.22)}
.field input[readonly],.field input:disabled,.field select:disabled{background:var(--crema-2);color:var(--muted);cursor:not-allowed}
.field .hint{font-size:10.5px;color:var(--muted-2);margin-top:4px;font-weight:300}
.grid2{display:grid;grid-template-columns:1fr 1fr;gap:16px}
.grid3{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}
.grid4{display:grid;grid-template-columns:repeat(4,1fr);gap:16px}
/* KPIs dashboard */
.kpi{position:relative;background:var(--blanco);border:1px solid var(--linea);border-radius:var(--radius);padding:18px 20px 16px;box-shadow:var(--shadow);overflow:hidden}
.kpi::before{content:"";position:absolute;inset:0 auto 0 0;width:4px;background:var(--amarillo)}
.kpi.k-ok::before{background:var(--ok)}
.kpi.k-bad::before{background:var(--bad)}
.kpi.k-cafe::before{background:var(--cafe)}
.kpi-label{font-size:10.5px;color:var(--muted);font-weight:600;text-transform:uppercase;letter-spacing:.08em;margin-bottom:7px}
.kpi-value{font-size:25px;font-weight:600;letter-spacing:-.02em;line-height:1.1}
.kpi-value small{font-size:13px;font-weight:500;color:var(--muted)}
.kpi-meta{font-size:11.5px;color:var(--muted);margin-top:7px;font-weight:300}
.kpi-meta .up{color:var(--ok-ink);font-weight:500}
.kpi-meta .down{color:var(--bad-ink);font-weight:500}
/* Gráficas simples */
.bars{display:flex;align-items:flex-end;gap:26px;height:190px;padding:8px 6px 0}
.bar-col{flex:1;display:flex;flex-direction:column;align-items:center;gap:7px;height:100%;justify-content:flex-end}
.bar-val{font-size:10.5px;color:var(--muted);font-weight:500;font-variant-numeric:tabular-nums}
.bar{width:100%;max-width:58px;border-radius:7px 7px 3px 3px;background:var(--cafe);transition:transform .15s}
.bar:hover{transform:scaleY(1.02);transform-origin:bottom}
.bar.cur{background:var(--amarillo);border:1.5px dashed #C79509}
.bar-mes{font-size:11px;color:var(--muted);font-weight:500}
.bar-mes.cur{color:var(--ink);font-weight:600}
.hbar-row{display:grid;grid-template-columns:96px 1fr 64px;align-items:center;gap:12px;margin-bottom:11px;font-size:12px}
.hbar-track{height:12px;background:var(--crema-2);border-radius:999px;overflow:hidden}
.hbar-fill{height:100%;border-radius:999px;background:var(--cafe)}
.hbar-fill.am{background:var(--amarillo)}
.hbar-n{color:var(--muted);font-size:11.5px;text-align:right;font-variant-numeric:tabular-nums}
/* Lista requiere atención */
.att-item{display:flex;align-items:center;gap:13px;padding:12px 6px;border-bottom:1px solid var(--linea);cursor:pointer;border-radius:8px;transition:background .12s}
.att-item:hover{background:var(--crema)}
.att-item:last-child{border-bottom:none}
.sev{width:9px;height:9px;border-radius:50%;flex:none}
.sev-bad{background:var(--bad)} .sev-warn{background:#DFA100} .sev-info{background:var(--info)}
.att-txt{flex:1;font-size:12.5px}
.att-txt b{font-weight:600}
.att-txt .att-sub{display:block;font-size:11px;color:var(--muted);font-weight:300}
.att-go{color:var(--muted-2);font-size:15px}
/* Filtros chips */
.filters{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:16px}
.fchip{
padding:6px 14px;border-radius:999px;border:1px solid var(--linea-2);background:var(--blanco);
font-family:"Poppins",sans-serif;font-size:12px;font-weight:500;color:var(--muted);cursor:pointer;transition:all .12s;
}
.fchip:hover{border-color:var(--amarillo);color:var(--ink)}
.fchip.on{background:var(--cafe);border-color:var(--cafe);color:var(--amarillo);font-weight:600}
.search-box{margin-left:auto;position:relative}
.search-box input{
width:250px;padding:8px 12px 8px 34px;border:1px solid var(--linea-2);border-radius:999px;
font-family:"Poppins",sans-serif;font-size:12px;outline:none;background:var(--blanco);
}
.search-box input:focus{border-color:var(--amarillo);box-shadow:0 0 0 3px rgba(247,189,12,.2)}
.search-box svg{position:absolute;left:12px;top:50%;transform:translateY(-50%);width:14px;height:14px;color:var(--muted-2)}
/* Detalle ticket */
.back-link{display:inline-flex;align-items:center;gap:6px;color:var(--muted);font-size:12px;font-weight:500;cursor:pointer;margin-bottom:14px;border:none;background:none;font-family:"Poppins",sans-serif;padding:4px 8px;border-radius:7px}
.back-link:hover{background:var(--crema-2);color:var(--ink)}
.dl{display:grid;grid-template-columns:repeat(3,1fr);gap:0}
.dl>div{padding:13px 16px;border-bottom:1px solid var(--linea)}
.dl dt{font-size:10.5px;text-transform:uppercase;letter-spacing:.07em;color:var(--muted);font-weight:600;margin:0 0 3px}
.dl dd{margin:0;font-size:13px;font-weight:500}
.dl dd .chip{margin-left:0}
.attach{display:inline-flex;align-items:center;gap:6px;background:var(--crema-2);border:1px solid var(--linea);border-radius:8px;padding:5px 11px;font-size:11.5px;font-weight:500;margin:3px 6px 3px 0}
.attach svg{width:13px;height:13px;color:var(--muted)}
.attach.missing{border-style:dashed;color:var(--bad-ink);background:var(--bad-bg);border-color:#E9B8B3}
/* Wizard */
.stepper{display:flex;gap:0;margin-bottom:26px;background:var(--blanco);border:1px solid var(--linea);border-radius:var(--radius);overflow:hidden;box-shadow:var(--shadow)}
.step{
flex:1;display:flex;align-items:center;gap:10px;padding:13px 18px;font-size:12px;color:var(--muted);
border-right:1px solid var(--linea);position:relative;background:var(--blanco);
}
.step:last-child{border-right:none}
.step-n{
width:26px;height:26px;border-radius:50%;display:grid;place-items:center;flex:none;
background:var(--crema-2);color:var(--muted);font-weight:600;font-size:12px;border:1.5px solid var(--linea-2);
}
.step.cur{background:var(--amarillo-soft)}
.step.cur .step-n{background:var(--amarillo);border-color:var(--amarillo);color:var(--cafe)}
.step.cur .step-t{color:var(--ink);font-weight:600}
.step.done .step-n{background:var(--ok);border-color:var(--ok);color:#fff}
.step.done .step-t{color:var(--ok-ink)}
.step-t b{display:block;font-weight:inherit}
.step-t small{font-size:10px;color:var(--muted-2);font-weight:400;display:block;line-height:1.2}
.wiz-pane{display:none}
.wiz-pane.active{display:block;animation:fadeIn .18s ease}
.wiz-foot{display:flex;justify-content:space-between;align-items:center;margin-top:22px;gap:12px}
.ticket-ribbon{
display:flex;align-items:center;gap:14px;background:var(--cafe);color:#EFE6D6;border-radius:var(--radius);
padding:13px 20px;margin-bottom:20px;font-size:12.5px;box-shadow:var(--shadow);
}
.ticket-ribbon .tkid{background:var(--amarillo);color:var(--cafe);font-weight:700;border-radius:8px;padding:3px 11px;font-size:12px;letter-spacing:.02em}
.ticket-ribbon .sep{opacity:.35}
.ticket-ribbon b{color:#fff;font-weight:600}
/* Cotización card */
.quote-card{border:1.5px solid var(--linea-2);border-radius:var(--radius);padding:19px 22px;background:var(--blanco);transition:all .14s;cursor:pointer;position:relative}
.quote-card:hover{border-color:var(--amarillo)}
.quote-card.sel{border-color:var(--amarillo);box-shadow:0 0 0 3px rgba(247,189,12,.22);background:#FFFDF6}
.quote-card .radio{position:absolute;top:18px;right:18px;width:19px;height:19px;border-radius:50%;border:2px solid var(--linea-2);display:grid;place-items:center}
.quote-card.sel .radio{border-color:var(--amarillo);background:var(--amarillo)}
.quote-card.sel .radio::after{content:"";width:7px;height:7px;border-radius:50%;background:var(--cafe)}
/* Radios PPD/PUE */
.pay-opt{display:flex;gap:12px}
.pay-card{flex:1;border:1.5px solid var(--linea-2);border-radius:12px;padding:15px 17px;cursor:pointer;transition:all .13s;background:var(--blanco)}
.pay-card:hover{border-color:var(--muted-2)}
.pay-card.sel{border-color:var(--amarillo);background:#FFFDF6;box-shadow:0 0 0 3px rgba(247,189,12,.18)}
.pay-card .pc-head{display:flex;align-items:center;gap:9px;font-weight:600;font-size:13px;margin-bottom:3px}
.pay-card .pc-sub{font-size:11.5px;color:var(--muted);font-weight:300;line-height:1.5}
/* Prefactura / documento simulado */
.doc{
position:relative;background:var(--blanco);border:1px solid var(--linea-2);border-radius:var(--radius);
padding:30px 34px;overflow:hidden;box-shadow:var(--shadow);
}
.doc::after{
content:"SIMULACIÓN · SIN VALOR FISCAL";position:absolute;top:44%;left:50%;
transform:translate(-50%,-50%) rotate(-24deg);font-size:42px;font-weight:800;letter-spacing:.12em;
color:rgba(179,38,30,.08);white-space:nowrap;pointer-events:none;
}
.doc-head{display:flex;justify-content:space-between;gap:20px;border-bottom:2px solid var(--cafe);padding-bottom:16px;margin-bottom:16px}
.doc h4{margin:0;font-size:15px;font-weight:700}
.doc .doc-meta{font-size:11px;color:var(--muted);line-height:1.6}
.doc .fol{font-size:12px;font-weight:700;color:var(--cafe);background:var(--amarillo-soft);border-radius:8px;padding:4px 12px;display:inline-block}
/* Checklist emisión */
.check-row{display:flex;align-items:center;gap:11px;padding:10px 4px;border-bottom:1px solid var(--linea);font-size:12.5px}
.check-row:last-child{border-bottom:none}
.check-ico{width:21px;height:21px;border-radius:50%;background:var(--ok-bg);color:var(--ok);display:grid;place-items:center;flex:none}
.check-ico svg{width:12px;height:12px}
.check-row b{font-weight:600}
.check-row .cr-sub{color:var(--muted);font-size:11px;font-weight:300;display:block}
/* Éxito */
.success-wrap{max-width:660px;margin:30px auto;text-align:center}
.success-ico{width:82px;height:82px;border-radius:50%;background:var(--ok-bg);color:var(--ok);display:grid;place-items:center;margin:0 auto 20px;border:2px solid #B7DCC5}
.success-ico svg{width:40px;height:40px}
/* Envío */
.send-layout{display:grid;grid-template-columns:330px 1fr;gap:20px;align-items:start}
.send-item{padding:14px 16px;border-bottom:1px solid var(--linea);cursor:pointer;transition:background .12s;display:flex;flex-direction:column;gap:3px}
.send-item:last-child{border-bottom:none}
.send-item:hover{background:var(--crema)}
.send-item.sel{background:var(--amarillo-soft);border-left:4px solid var(--amarillo);padding-left:12px}
.send-item .si-top{display:flex;justify-content:space-between;align-items:center;gap:8px}
.send-item .si-fol{font-weight:600;font-size:12.5px}
.send-item .si-cli{font-size:11.5px;color:var(--muted)}
.req-row{display:flex;align-items:flex-start;gap:11px;padding:10px 4px;border-bottom:1px solid var(--linea);font-size:12.5px}
.req-row:last-child{border-bottom:none}
.req-row input[type=checkbox]{width:17px;height:17px;accent-color:#1E7A46;margin-top:2px;cursor:pointer;flex:none}
.req-row.auto input{accent-color:var(--gris)}
.req-row .rq-sub{display:block;font-size:11px;color:var(--muted);font-weight:300}
.mail-preview{border:1px solid var(--linea-2);border-radius:12px;overflow:hidden;background:var(--blanco)}
.mail-head{background:var(--crema);padding:13px 18px;border-bottom:1px solid var(--linea);font-size:12px}
.mail-head .mh-row{display:flex;gap:8px;margin-bottom:3px}
.mail-head .mh-row:last-child{margin-bottom:0}
.mail-head .mh-k{color:var(--muted);width:56px;flex:none;font-weight:500}
.mail-head .mh-v{font-weight:500}
.mail-body{padding:18px;font-size:12.5px;line-height:1.7;color:#4A3A28;font-weight:300}
.mail-body p{margin:0 0 10px}
.mail-attach{display:flex;flex-wrap:wrap;gap:6px;padding:12px 18px;border-top:1px dashed var(--linea-2);background:var(--crema)}
/* Cobranza aging */
.aging-card{display:grid;grid-template-columns:110px repeat(5,1fr) 130px;gap:0;align-items:stretch}
.aging-cell{padding:15px 16px;border-left:1px solid var(--linea);display:flex;flex-direction:column;gap:2px}
.aging-cur{display:flex;align-items:center;gap:9px;padding:15px 16px;font-weight:700;font-size:14px}
.aging-lbl{font-size:10px;text-transform:uppercase;letter-spacing:.07em;color:var(--muted);font-weight:600}
.aging-val{font-size:16.5px;font-weight:600;font-variant-numeric:tabular-nums;letter-spacing:-.01em}
.aging-n{font-size:10.5px;color:var(--muted-2)}
.aging-cell.hot .aging-val{color:var(--bad-ink)}
.aging-cell.warm .aging-val{color:var(--warn-ink)}
.aging-total{background:var(--crema);border-left:1px solid var(--linea-2)}
.empty-state{text-align:center;padding:38px 20px;color:var(--muted)}
.empty-state .es-ico{width:52px;height:52px;border-radius:50%;background:var(--ok-bg);color:var(--ok);display:grid;place-items:center;margin:0 auto 12px}
.empty-state .es-ico svg{width:24px;height:24px}
.empty-state b{color:var(--ink);font-weight:600;display:block;font-size:13.5px;margin-bottom:3px}
.empty-state p{font-size:12px;font-weight:300;margin:0;max-width:460px;margin-inline:auto}
/* Toast */
.toast{
position:fixed;bottom:26px;right:28px;z-index:200;background:var(--cafe);color:#F6F1E7;border-radius:12px;
padding:13px 18px;font-size:12.5px;display:none;align-items:center;gap:11px;box-shadow:var(--shadow-lg);
border:1px solid rgba(247,189,12,.35);max-width:430px;
}
.toast.show{display:flex;animation:fadeIn .2s ease}
.toast .tico{width:24px;height:24px;border-radius:50%;background:var(--amarillo);color:var(--cafe);display:grid;place-items:center;flex:none}
.toast .tico svg{width:13px;height:13px}
.footnote{font-size:11px;color:var(--muted-2);font-weight:300;margin-top:10px}
.mt8{margin-top:8px}.mt12{margin-top:12px}.mt16{margin-top:16px}.mt20{margin-top:20px}.mt24{margin-top:24px}
.mb8{margin-bottom:8px}.mb12{margin-bottom:12px}.mb16{margin-bottom:16px}.mb20{margin-bottom:20px}.mb24{margin-bottom:24px}
.flex{display:flex;align-items:center;gap:10px}
.spread{display:flex;align-items:center;justify-content:space-between;gap:14px}
</style>
</head>
<body>
<!-- ================= Banner fijo ================= -->
<div class="proto-banner">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 9v4m0 4h.01M10.3 3.9 1.8 18a2 2 0 0 0 1.7 3h17a2 2 0 0 0 1.7-3L13.7 3.9a2 2 0 0 0-3.4 0Z"/></svg>
Prototipo navegable — datos ficticios <span class="dot-sep">·</span> Etapa 0 <span class="dot-sep">·</span> Julio 2026
</div>
<div class="app">
<!-- ================= Sidebar ================= -->
<aside class="sidebar">
<div class="brand">
<div class="logo-mark">B</div>
<div>
<div class="brand-name">BALAM</div>
<div class="brand-sub">Talento Estratégico</div>
</div>
</div>
<div class="nav-label">Operación</div>
<div class="nav-item active" data-view="dashboard">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8"><rect x="3" y="3" width="7.5" height="7.5" rx="1.5"/><rect x="13.5" y="3" width="7.5" height="7.5" rx="1.5"/><rect x="3" y="13.5" width="7.5" height="7.5" rx="1.5"/><rect x="13.5" y="13.5" width="7.5" height="7.5" rx="1.5"/></svg>
Dashboard
</div>
<div class="nav-item" data-view="solicitudes">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8"><path d="M3 7.5 12 3l9 4.5v9L12 21l-9-4.5v-9Z"/><path d="M3 7.5 12 12m0 0 9-4.5M12 12v9"/></svg>
Solicitudes (Jira)
<span class="nav-num">8</span>
</div>
<div class="nav-item" data-view="emision">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8"><path d="M14 3H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V9l-6-6Z"/><path d="M14 3v6h6M9 14l2 2 4-4"/></svg>
Emisión asistida
</div>
<div class="nav-item" data-view="envio">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8"><path d="m22 2-11 11M22 2 15 22l-4-9-9-4 20-7Z"/></svg>
Envío al cliente
<span class="nav-num">4</span>
</div>
<div class="nav-item" data-view="cobranza">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8"><circle cx="12" cy="12" r="9"/><path d="M12 7v5l3 2.5"/></svg>
Cobranza
</div>
<div class="nav-item" data-view="bitacora">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8"><path d="M8 6h13M8 12h13M8 18h13M3.5 6h.01M3.5 12h.01M3.5 18h.01"/></svg>
Bitácora
</div>
<div class="bind-status">
<div class="row1"><span class="dot"></span> BIND ERP · conectado</div>
<div class="meta">Última sincronización: hoy 12:42 · 1,240 / 20,000 llamadas</div>
</div>
<div class="user-chip">
<div class="avatar">AR</div>
<div>
<div class="user-name">Arturo R.</div>
<div class="user-role">Administración · Facturación</div>
</div>
</div>
</aside>
<!-- ================= Main ================= -->
<div class="main">
<div class="topbar">
<div class="crumbs">
<span>Balam · Plataforma de facturación y cobranza</span>
<span class="sep">/</span>
<span class="current" id="crumb">Dashboard</span>
</div>
<div class="top-right">
<span class="pill">TC DOF <b>$18.7342</b> MXN/USD · 06 jul 2026</span>
<span class="pill">Lunes, 6 de julio de 2026</span>
</div>
</div>
<div class="content">
<!-- ============================================================
VISTA 1 · DASHBOARD
============================================================ -->
<section class="view active" id="view-dashboard">
<h1 class="view-title">Panel de control — Julio 2026</h1>
<p class="view-sub">Resumen del mes al <b>lunes 6 de julio</b>. Cifras leídas de BIND ERP; montos por moneda <b>sin mezclar</b> (MXN y USD se reportan por separado).</p>
<div class="grid4 mb20">
<div class="kpi">
<div class="kpi-label">Facturado julio · MXN</div>
<div class="kpi-value">$486,300 <small>MXN</small></div>
<div class="kpi-meta">12 CFDI emitidos · <span class="up">▲ ritmo 8% vs jun</span></div>
</div>
<div class="kpi k-cafe">
<div class="kpi-label">Facturado julio · USD</div>
<div class="kpi-value">$10,350 <small>USD</small></div>
<div class="kpi-meta">2 invoices (extranjero, IVA 0%) · TC DOF $18.7342</div>
</div>
<div class="kpi k-ok">
<div class="kpi-label">Emitidas vs. pendientes</div>
<div class="kpi-value">14 <small>/ ~55 del mes</small></div>
<div class="kpi-meta">5 en proceso · 36 esperadas (recurrencias + tickets)</div>
</div>
<div class="kpi k-bad">
<div class="kpi-label">Cartera vencida</div>
<div class="kpi-value">$444,660 <small>MXN</small></div>
<div class="kpi-meta">+ $11,750 USD · 5 facturas vencidas</div>
</div>
</div>
<div style="display:grid;grid-template-columns:1.5fr 1fr;gap:20px" class="mb20">
<div class="card card-pad">
<div class="spread mb12">
<div>
<h3 class="card-title">Facturación mensual · MXN</h3>
<p class="card-sub" style="margin-bottom:0">Últimos 6 meses · julio en curso (al día 6)</p>
</div>
<span class="chip chip-neutral">Fuente: BIND ERP</span>
</div>
<div class="bars">
<div class="bar-col"><span class="bar-val">$1.62M</span><div class="bar" style="height:68%"></div><span class="bar-mes">Feb</span></div>
<div class="bar-col"><span class="bar-val">$1.78M</span><div class="bar" style="height:75%"></div><span class="bar-mes">Mar</span></div>
<div class="bar-col"><span class="bar-val">$1.71M</span><div class="bar" style="height:72%"></div><span class="bar-mes">Abr</span></div>
<div class="bar-col"><span class="bar-val">$1.85M</span><div class="bar" style="height:78%"></div><span class="bar-mes">May</span></div>
<div class="bar-col"><span class="bar-val">$1.93M</span><div class="bar" style="height:82%"></div><span class="bar-mes">Jun</span></div>
<div class="bar-col"><span class="bar-val">$0.49M</span><div class="bar cur" style="height:21%"></div><span class="bar-mes cur">Jul · en curso</span></div>
</div>
</div>
<div class="card card-pad">
<h3 class="card-title">Facturas por cliente · junio</h3>
<p class="card-sub">54 facturas emitidas — el mayor exige <b>una factura por colaborador</b></p>
<div class="hbar-row"><span><b>CEMEX</b></span><div class="hbar-track"><div class="hbar-fill am" style="width:100%"></div></div><span class="hbar-n">38 fact.</span></div>
<div class="hbar-row"><span>ACUNTIA</span><div class="hbar-track"><div class="hbar-fill" style="width:18%"></div></div><span class="hbar-n">7 fact.</span></div>
<div class="hbar-row"><span>Axie</span><div class="hbar-track"><div class="hbar-fill" style="width:11%"></div></div><span class="hbar-n">4 fact.</span></div>
<div class="hbar-row"><span>Dilo</span><div class="hbar-track"><div class="hbar-fill" style="width:8%"></div></div><span class="hbar-n">3 fact.</span></div>
<div class="hbar-row"><span>Regiotour</span><div class="hbar-track"><div class="hbar-fill" style="width:5%"></div></div><span class="hbar-n">2 fact.</span></div>
<p class="footnote">46 clientes activos concentran ~55 facturas/mes.</p>
</div>
</div>
<div class="card card-pad">
<div class="spread mb8">
<h3 class="card-title">Requiere atención</h3>
<span class="chip chip-warn"><span class="cdot"></span>5 pendientes</span>
</div>
<div class="att-item" onclick="show('solicitudes')">
<span class="sev sev-bad"></span>
<span class="att-txt"><b>FAC-0873 · Axie</b> — bloqueado: falta la <b>cotización BIND</b> (obligatoria para iniciar facturación).
<span class="att-sub">Solicitarla al área comercial antes de convertir a prefactura.</span></span>
<span class="att-go"></span>
</div>
<div class="att-item" onclick="show('cobranza')">
<span class="sev sev-bad"></span>
<span class="att-txt"><b>F-2026-0019 · ACUNTIA</b> — factura de <b>febrero</b> con 114 días vencida ($86,200 MXN).
<span class="att-sub">Cliente puntual sin seguimiento a tiempo — alerta interna escalada a administración.</span></span>
<span class="att-go"></span>
</div>
<div class="att-item" onclick="show('emision')">
<span class="sev sev-warn"></span>
<span class="att-txt"><b>3 prefacturas en simulación</b> esperan validación humana antes de emitir CFDI.
<span class="att-sub">Nada se timbra sin confirmación del aprobador.</span></span>
<span class="att-go"></span>
</div>
<div class="att-item" onclick="show('solicitudes')">
<span class="sev sev-warn"></span>
<span class="att-txt"><b>FAC-0871 · Nuova Textil</b> — cliente nuevo <b>sin cédula de identificación fiscal</b> adjunta.
<span class="att-sub">El alta del cliente en BIND la realiza administración antes de poder cotizar.</span></span>
<span class="att-go"></span>
</div>
<div class="att-item" onclick="show('envio')">
<span class="sev sev-info"></span>
<span class="att-txt"><b>4 facturas emitidas sin enviar</b> — la facturación termina hasta que el correo sale con los adjuntos correctos.
<span class="att-sub">CEMEX requiere Excel de horas con VoBo + nomenclatura de asunto.</span></span>
<span class="att-go"></span>
</div>
</div>
</section>
<!-- ============================================================
VISTA 2 · SOLICITUDES (JIRA)
============================================================ -->
<section class="view" id="view-solicitudes">
<!-- Bandeja -->
<div id="sol-lista">
<h1 class="view-title">Solicitudes de facturación — Jira ITSM</h1>
<p class="view-sub">Bandeja sincronizada del portal <b>Administración General → Facturación</b>. Regla vigente: <b>si no hay ticket en Jira, no se factura</b>. Todos los tickets se asignan a Arturo (administración hace doble check de datos, cédula fiscal y estado de cuenta).</p>
<div class="filters">
<button class="fchip on">Todos (8)</button>
<button class="fchip">Por validar (3)</button>
<button class="fchip">Listos para facturar (3)</button>
<button class="fchip">Bloqueados (1)</button>
<button class="fchip">Facturados (1)</button>
<div class="search-box">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="11" cy="11" r="7"/><path d="m20 20-3.5-3.5"/></svg>
<input type="text" placeholder="Buscar ticket, cliente, proyecto…" />
</div>
</div>
<div class="card" style="overflow:hidden">
<table class="tbl">
<thead>
<tr>
<th>Ticket</th><th>Tipo</th><th>Cliente</th><th>Proyecto / resumen</th>
<th>Moneda</th><th class="num">Monto est.</th><th>Crédito</th><th>Recurrente</th><th>Estatus</th><th></th>
</tr>
</thead>
<tbody>
<tr class="row-click" onclick="show('sol-detalle')">
<td class="mono">FAC-0876</td>
<td><span class="chip chip-brand">Staff augmentation</span></td>
<td><b>CEMEX</b></td>
<td>Célula datos · Ing. Mariana Gutiérrez — julio</td>
<td>MXN</td><td class="num">$68,440</td><td>90 días</td>
<td><span class="chip chip-info">Mensual</span></td>
<td><span class="chip chip-ok"><span class="cdot"></span>Listo para facturar</span></td>
<td><button class="btn btn-sm btn-ghost">Abrir </button></td>
</tr>
<tr class="row-click" onclick="toast('Vista de detalle disponible para FAC-0876 (demo).')">
<td class="mono">FAC-0875</td>
<td><span class="chip chip-brand">Headhunting</span></td>
<td><b>Dilo</b></td>
<td>Cierre vacante Gerente TI — 50% restante (Luis Cantú)</td>
<td>MXN</td><td class="num">$95,700</td><td>30 días</td>
<td><span class="chip chip-neutral">No</span></td>
<td><span class="chip chip-ok"><span class="cdot"></span>Listo para facturar</span></td>
<td><button class="btn btn-sm btn-ghost">Abrir </button></td>
</tr>
<tr class="row-click" onclick="toast('Vista de detalle disponible para FAC-0876 (demo).')">
<td class="mono">FAC-0874</td>
<td><span class="chip chip-brand">Fact. adicional</span></td>
<td><b>Regiotour</b></td>
<td>Soporte plataforma reservas · horas extra junio</td>
<td>MXN</td><td class="num">$23,200</td><td>30 días</td>
<td><span class="chip chip-neutral">No</span></td>
<td><span class="chip chip-warn"><span class="cdot"></span>Por validar</span></td>
<td><button class="btn btn-sm btn-ghost">Abrir </button></td>
</tr>
<tr class="row-click" onclick="toast('FAC-0873 bloqueado: la cotización BIND es requisito para iniciar (regla del 6-jul).')">
<td class="mono">FAC-0873</td>
<td><span class="chip chip-brand">Staff augmentation</span></td>
<td><b>Axie</b></td>
<td>Squad desarrollo · 2 devs — julio (USD, extranjero)</td>
<td>USD</td><td class="num">$5,175</td><td>45 días</td>
<td><span class="chip chip-info">Mensual</span></td>
<td><span class="chip chip-bad"><span class="cdot"></span>Bloqueado · sin cotización</span></td>
<td><button class="btn btn-sm btn-ghost">Abrir </button></td>
</tr>
<tr class="row-click" onclick="toast('Cliente nuevo: administración da de alta en BIND (cédula fiscal pendiente) y avisa a comercial para cotizar.')">
<td class="mono">FAC-0871</td>
<td><span class="chip chip-brand">Headhunting</span></td>
<td><b>Nuova Textil</b> <span class="chip chip-warn" style="margin-left:5px">Cliente nuevo</span></td>
<td>Anticipo búsqueda Dir. Comercial</td>
<td>MXN</td><td class="num">$60,000</td><td>30 días</td>
<td><span class="chip chip-neutral">No</span></td>
<td><span class="chip chip-warn"><span class="cdot"></span>Alta de cliente en curso</span></td>
<td><button class="btn btn-sm btn-ghost">Abrir </button></td>
</tr>
<tr class="row-click" onclick="toast('Vista de detalle disponible para FAC-0876 (demo).')">
<td class="mono">FAC-0870</td>
<td><span class="chip chip-brand">Fact. adicional</span></td>
<td><b>ACUNTIA</b></td>
<td>Consultoría infraestructura · bolsa 40 h</td>
<td>MXN</td><td class="num">$34,800</td><td>30 días</td>
<td><span class="chip chip-neutral">No</span></td>
<td><span class="chip chip-ok"><span class="cdot"></span>Listo para facturar</span></td>
<td><button class="btn btn-sm btn-ghost">Abrir </button></td>
</tr>
<tr class="row-click" onclick="toast('Bajas restan del monto recurrente del siguiente periodo (demo).')">
<td class="mono">FAC-0869</td>
<td><span class="chip chip-cafe">Baja</span></td>
<td><b>CEMEX</b></td>
<td>Baja de colaborador · Ing. Raúl Peña (efectiva 15-jul)</td>
<td>MXN</td><td class="num">$61,480</td><td></td>
<td><span class="chip chip-neutral">No</span></td>
<td><span class="chip chip-warn"><span class="cdot"></span>Por validar</span></td>
<td><button class="btn btn-sm btn-ghost">Abrir </button></td>
</tr>
<tr class="row-click" onclick="toast('FAC-0868 ya tiene CFDI vinculado: F-2026-0142 (evidencia PDF+XML en el ticket).')">
<td class="mono">FAC-0868</td>
<td><span class="chip chip-brand">Staff augmentation</span></td>
<td><b>CEMEX</b></td>
<td>Célula datos · Arq. Jorge Salinas — julio</td>
<td>MXN</td><td class="num">$71,920</td><td>90 días</td>
<td><span class="chip chip-info">Mensual</span></td>
<td><span class="chip chip-ok"><span class="cdot"></span>Facturado · F-2026-0142</span></td>
<td><button class="btn btn-sm btn-ghost">Abrir </button></td>
</tr>
</tbody>
</table>
</div>
<p class="footnote">Tickets de ejemplo. Tres vías generan factura: facturación adicional directa · headhunting (anticipo + cierre) · staff augmentation (al arrancar la persona). El portal Jira sirve a varias empresas; esta vista filtra <b>empresa origen = Balam</b>.</p>
</div>
<!-- Detalle FAC-0876 -->
<div id="sol-detalle" style="display:none">
<button class="back-link" onclick="show('solicitudes')"> Volver a la bandeja</button>
<div class="spread mb16">
<div>
<h1 class="view-title">FAC-0876 · CEMEX — Staff augmentation</h1>
<p class="view-sub" style="margin-bottom:0">Levantado por <b>Araceli Sánchez</b> (comercial) · 03 jul 2026, 10:22 · Asignado a <b>Arturo R.</b> · Empresa origen: <b>Balam</b></p>
</div>
<span class="chip chip-ok" style="font-size:12px;padding:5px 14px"><span class="cdot"></span>Listo para facturar</span>
</div>
<div class="card mb16" style="overflow:hidden">
<dl class="dl" style="margin:0">
<div><dt>Tipo de solicitud</dt><dd>Facturación · Staff augmentation</dd></div>
<div><dt>Cliente</dt><dd>CEMEX, S.A.B. de C.V.</dd></div>
<div><dt>Cliente nuevo</dt><dd>No — recurrente</dd></div>
<div><dt>Proyecto</dt><dd>Célula de datos · Monterrey</dd></div>
<div><dt>Resumen (summary)</dt><dd>Servicios julio — Ing. Mariana Gutiérrez</dd></div>
<div><dt>Periodo de incidencias</dt><dd>0131 jul · sin horas extra</dd></div>
<div><dt>Moneda</dt><dd>MXN</dd></div>
<div><dt>Días de crédito</dt><dd>90 días <span class="chip chip-warn" style="margin-left:6px">Innegociable CEMEX</span></dd></div>
<div><dt>Recurrencia</dt><dd>Sí — mensual (12 meses)</dd></div>
<div><dt>Monto estimado</dt><dd>$68,440.00 MXN + IVA</dd></div>
<div><dt>Orden de compra</dt><dd>OC-CMX-88123 (autorizada)</dd></div>
<div><dt>Cotización BIND vinculada</dt><dd><span class="chip chip-ok">COT-2026-0455 ✓</span></dd></div>
</dl>
</div>
<div class="card card-pad mb16">
<h3 class="card-title mb8">Adjuntos del ticket</h3>
<span class="attach"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M14 3H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V9l-6-6Z"/></svg> COT-2026-0455.pdf</span>
<span class="attach"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M14 3H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V9l-6-6Z"/></svg> OC-CMX-88123.pdf</span>
<span class="attach"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M14 3H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V9l-6-6Z"/></svg> Horas-julio-MGutierrez-VoBo.xlsx</span>
<p class="footnote">Cliente recurrente: basta la cotización. Si fuera <b>cliente nuevo</b>, se exigiría además la cédula de identificación fiscal.</p>
</div>
<div class="alert alert-info mb16">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="9"/><path d="M12 8h.01M11 12h1v4h1"/></svg>
<span>Doble check de administración completado: datos fiscales vigentes, sin adeudos bloqueantes en estado de cuenta y OC autorizada. El flujo parte de la <b>cotización BIND COT-2026-0455</b> — requisito obligatorio.</span>
</div>
<div class="flex" style="justify-content:flex-end;gap:10px">
<button class="btn btn-ghost" onclick="toast('En el producto real esto abre el ticket en Jira ITSM.')">Ver en Jira ↗</button>
<button class="btn btn-primary btn-lg" onclick="startWizard()">Iniciar facturación →</button>
</div>
</div>
</section>
<!-- ============================================================
VISTA 3 · EMISIÓN ASISTIDA (WIZARD 5 PASOS)
============================================================ -->
<section class="view" id="view-emision">
<div id="wiz-main">
<h1 class="view-title">Emisión asistida de CFDI</h1>
<p class="view-sub">Flujo validado en Discovery (6-jul): <b>cotización BIND → prefactura → validación humana → CFDI</b>. Nada se timbra sin confirmación explícita del aprobador.</p>
<div class="ticket-ribbon">
<span class="tkid">FAC-0876</span>
<span><b>CEMEX</b> · Staff augmentation · Ing. Mariana Gutiérrez — julio</span>
<span class="sep">|</span>
<span>MXN · 90 días de crédito · recurrente mensual</span>
<span style="margin-left:auto" class="chip chip-brand">Cotización requerida ✓</span>
</div>
<div class="stepper">
<div class="step cur" id="st-1"><span class="step-n">1</span><span class="step-t"><b>Cotización BIND</b><small>punto de partida obligatorio</small></span></div>
<div class="step" id="st-2"><span class="step-n">2</span><span class="step-t"><b>Datos de factura</b><small>CFDI · PPD/PUE · TC DOF</small></span></div>
<div class="step" id="st-3"><span class="step-n">3</span><span class="step-t"><b>Conceptos e IVA</b><small>regla 16% / 0%</small></span></div>
<div class="step" id="st-4"><span class="step-n">4</span><span class="step-t"><b>Prefactura</b><small>simulación, sin timbrar</small></span></div>
<div class="step" id="st-5"><span class="step-n">5</span><span class="step-t"><b>Validación y emisión</b><small>timbra el PAC de BIND</small></span></div>
</div>
<!-- Paso 1 -->
<div class="wiz-pane active" id="wp-1">
<div class="card card-pad">
<h3 class="card-title">Paso 1 · Selecciona la cotización de BIND</h3>
<p class="card-sub">Regla de negocio (Discovery 6-jul, definida por Araceli): <b>toda factura parte de una cotización registrada en BIND</b>. La conversión a prefactura es de un clic, sin volver a capturar.</p>
<div class="grid2 mt12">
<div class="quote-card sel" onclick="pickQuote(this)">
<span class="radio"></span>
<div class="chip chip-ok mb8">Vinculada al ticket</div>
<div style="font-weight:600;font-size:14px">COT-2026-0455</div>
<div style="font-size:12px;color:var(--muted);margin:3px 0 9px">CEMEX · Staff augmentation · Ing. Mariana Gutiérrez · julio 2026</div>
<div class="spread" style="font-size:12.5px">
<span>Subtotal <b>$68,440.00 MXN</b></span>
<span class="chip chip-neutral">Vigente · 28 jun 2026</span>
</div>
</div>
<div class="quote-card" onclick="pickQuote(this)">
<span class="radio"></span>
<div class="chip chip-neutral mb8">Otra cotización del cliente</div>
<div style="font-weight:600;font-size:14px">COT-2026-0448</div>
<div style="font-size:12px;color:var(--muted);margin:3px 0 9px">CEMEX · Staff augmentation · Arq. Jorge Salinas · julio 2026</div>
<div class="spread" style="font-size:12.5px">
<span>Subtotal <b>$71,920.00 MXN</b></span>
<span class="chip chip-neutral">Vigente · 26 jun 2026</span>
</div>
</div>
</div>
<div class="alert alert-warn mt16">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 9v4m0 4h.01M10.3 3.9 1.8 18a2 2 0 0 0 1.7 3h17a2 2 0 0 0 1.7-3L13.7 3.9a2 2 0 0 0-3.4 0Z"/></svg>
<span><b>¿No hay cotización?</b> No se puede continuar. Solicítala a comercial (Araceli) — para cliente nuevo, administración primero lo da de alta en BIND y después comercial cotiza.</span>
</div>
</div>
<div class="wiz-foot">
<button class="btn btn-ghost" onclick="show('solicitudes')">Cancelar</button>
<button class="btn btn-primary" onclick="wiz(2)">Continuar con COT-2026-0455 →</button>
</div>
</div>
<!-- Paso 2 -->
<div class="wiz-pane" id="wp-2">
<div class="card card-pad">
<h3 class="card-title">Paso 2 · Datos de la factura</h3>
<p class="card-sub">Precargados desde la cotización y el catálogo del cliente en BIND. Los campos editables quedan registrados en bitácora.</p>
<div class="grid3 mt12">
<div class="field"><label>Cliente (receptor)</label><input type="text" value="CEMEX, S.A.B. de C.V." readonly><div class="hint">RFC: CMX870506AB1 · precargado de BIND</div></div>
<div class="field"><label>Sucursal</label><select disabled><option>Matriz</option></select><div class="hint">Única activa; por unidad de negocio a futuro</div></div>
<div class="field"><label>Moneda</label><input type="text" value="MXN — Peso mexicano" readonly><div class="hint">Del ticket FAC-0876; sin conversión</div></div>
<div class="field"><label>Tipo de cambio DOF</label><input type="text" value="$18.7342 (06 jul 2026)" readonly><div class="hint">Informativo — aplica solo a facturas USD</div></div>
<div class="field"><label>Días de crédito</label><input type="text" value="90"><div class="hint">Default del cliente · CEMEX: innegociable</div></div>
<div class="field"><label>Orden de compra</label><input type="text" value="OC-CMX-88123"><div class="hint">Autorizada · prerequisito del deber ser</div></div>
<div class="field"><label>Uso CFDI</label>
<select><option selected>G03 — Gastos en general (nacional)</option><option>S01 — Sin efectos fiscales (extranjero, IVA 0%)</option></select>
<div class="hint">"Sin efectos fiscales" se usa para facturación extranjera</div>
</div>
<div class="field"><label>Ticket Jira (comentarios BIND)</label><input type="text" value="FAC-0876" readonly><div class="hint">Se escribe en comentarios para cruzar reportes</div></div>
<div class="field"><label>Fecha de emisión</label><input type="date" value="2026-07-06"></div>
</div>
<div class="mt20">
<label style="display:block;font-size:11px;font-weight:600;color:var(--muted);text-transform:uppercase;letter-spacing:.06em;margin-bottom:8px">Método de pago</label>
<div class="pay-opt">
<div class="pay-card sel" id="pay-ppd" onclick="pickPay('ppd')">
<div class="pc-head"><span class="chip chip-ok">Recomendado</span> PPD — Pago en parcialidades o diferido</div>
<div class="pc-sub">Default de la plataforma: Balam siempre otorga crédito (30/45/90 días). El complemento de pago se timbra al cobrar.</div>
</div>
<div class="pay-card" id="pay-pue" onclick="pickPay('pue')">
<div class="pc-head">PUE — Pago en una sola exhibición</div>
<div class="pc-sub">Solo si el pago se recibe <b>el mismo día</b> de la emisión. Requiere confirmación consciente.</div>
</div>
</div>
<div class="alert alert-warn mt12" id="pue-alert" style="display:none">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 9v4m0 4h.01M10.3 3.9 1.8 18a2 2 0 0 0 1.7 3h17a2 2 0 0 0 1.7-3L13.7 3.9a2 2 0 0 0-3.4 0Z"/></svg>
<span><b>Advertencia SAT — elegiste PUE con 90 días de crédito.</b> PUE declara pago en una sola exhibición: si el cobro no ocurre el mismo día, la factura queda inconsistente ante el SAT. Un PUE erróneo ya generó un <b>requerimiento del SAT</b> a Balam (~2024). Para ventas a crédito usa <b>PPD</b>. Para continuar con PUE deberás confirmarlo en el paso 5.</span>
</div>
</div>
</div>
<div class="wiz-foot">
<button class="btn btn-ghost" onclick="wiz(1)">← Regresar</button>
<button class="btn btn-primary" onclick="wiz(3)">Continuar →</button>
</div>
</div>
<!-- Paso 3 -->
<div class="wiz-pane" id="wp-3">
<div class="card card-pad">
<h3 class="card-title">Paso 3 · Conceptos e IVA</h3>
<p class="card-sub">Conceptos importados de la cotización. El IVA se asigna <b>automáticamente por regla</b> — en BIND hoy es captura manual y ha causado errores (Discovery 6-jul).</p>
<div class="alert alert-ok mb16">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M20 6 9 17l-5-5"/></svg>
<span><b>Regla fiscal aplicada: IVA 16%.</b> Factura nacional en MXN con uso CFDI "Gastos en general" → 16%. Si fuera extranjera ("Sin efectos fiscales", USD) la regla asignaría <b>0%</b>. BIND no automatiza esto; la plataforma sí.</span>
</div>
<table class="tbl">
<thead><tr><th>Clave</th><th>Concepto</th><th class="num">Cant.</th><th class="num">P. unitario</th><th class="num">IVA</th><th class="num">Importe</th></tr></thead>
<tbody>
<tr>
<td class="mono">029</td>
<td>Consultoría y servicios profesionales — Staff augmentation · <b>Ing. Mariana Gutiérrez</b> · periodo 0131 jul 2026</td>
<td class="num">1</td><td class="num">$68,440.00</td>
<td class="num"><span class="chip chip-ok">16% auto</span></td>
<td class="num mono">$68,440.00</td>
</tr>
</tbody>
</table>
<p class="footnote">El concepto incluye el <b>nombre del recurso</b>, como pidió administración. Retenciones adicionales (aplicables a reclutadoras) se configuran por cliente en el catálogo.</p>
<div class="card-pad" style="background:var(--crema);border-radius:11px;border:1px solid var(--linea);padding:14px 18px;margin-top:14px">
<div class="spread" style="font-size:12.5px"><span>Subtotal</span><b>$68,440.00 MXN</b></div>
<div class="spread" style="font-size:12.5px;margin-top:5px"><span>IVA 16% <span class="chip chip-ok" style="margin-left:5px">automático por regla</span></span><b>$10,950.40 MXN</b></div>
<div class="spread" style="font-size:14.5px;margin-top:9px;padding-top:9px;border-top:1.5px solid var(--linea-2)"><span style="font-weight:600">Total</span><b style="font-size:16px">$79,390.40 MXN</b></div>
</div>
<details class="mt16" style="font-size:12px">
<summary style="cursor:pointer;color:var(--muted);font-weight:500">Modificar IVA manualmente (requiere justificación)</summary>
<div class="alert alert-bad mt8">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 9v4m0 4h.01M10.3 3.9 1.8 18a2 2 0 0 0 1.7 3h17a2 2 0 0 0 1.7-3L13.7 3.9a2 2 0 0 0-3.4 0Z"/></svg>
<span><b>Override de la regla fiscal.</b> Cambiar el IVA de una factura nacional MXN a un valor distinto de 16% quedará registrado en bitácora con tu usuario y requerirá motivo. Ejemplo real: un 16% capturado en una factura "sin efectos fiscales" fue detectado en la sesión del 6-jul.</span>
</div>
</details>
</div>
<div class="wiz-foot">
<button class="btn btn-ghost" onclick="wiz(2)">← Regresar</button>
<button class="btn btn-primary" onclick="wiz(4)">Generar prefactura (simulación) →</button>
</div>
</div>
<!-- Paso 4 -->
<div class="wiz-pane" id="wp-4">
<div class="alert alert-info mb16">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="9"/><path d="M12 8h.01M11 12h1v4h1"/></svg>
<span><b>Modo simulación — nada se ha timbrado.</b> Esta prefactura replica la práctica actual de Balam: siempre prefactura primero, porque cancelar un CFDI timbrado implica retrabajo administrativo y contable. Revisa con calma; puedes regresar a corregir.</span>
</div>
<div class="doc">
<div class="doc-head">
<div>
<h4>PREFACTURA — Balam Talento Estratégico, S.A. de C.V.</h4>
<div class="doc-meta">RFC: BTE190513QX4 · Régimen 601 — General de Ley Personas Morales<br>Av. Fundidora 501, Col. Obrera, Monterrey, N.L., C.P. 64010</div>
</div>
<div style="text-align:right">
<span class="fol">PRE-2026-0311</span>
<div class="doc-meta" style="margin-top:6px">Fecha: 06 jul 2026<br>Estatus: <b>Simulación — sin valor fiscal</b></div>
</div>
</div>
<div class="grid2 mb12" style="font-size:12px">
<div>
<div style="font-size:10.5px;text-transform:uppercase;letter-spacing:.07em;color:var(--muted);font-weight:600;margin-bottom:4px">Receptor</div>
<b>CEMEX, S.A.B. de C.V.</b><br>RFC: CMX870506AB1 · Uso CFDI: G03 — Gastos en general<br>Días de crédito: 90 · OC: OC-CMX-88123
</div>
<div>
<div style="font-size:10.5px;text-transform:uppercase;letter-spacing:.07em;color:var(--muted);font-weight:600;margin-bottom:4px">Condiciones</div>
Moneda: MXN · Método de pago: <b>PPD</b> · Forma: 99 — Por definir<br>Vencimiento: 04 oct 2026 · Ref. Jira: <b>FAC-0876</b> · Cotización: COT-2026-0455
</div>
</div>
<table class="tbl" style="font-size:12px">
<thead><tr><th>Clave</th><th>Descripción</th><th class="num">Cant.</th><th class="num">P. unitario</th><th class="num">Importe</th></tr></thead>
<tbody>
<tr><td class="mono">029</td><td>Consultoría y servicios profesionales — Staff augmentation · Ing. Mariana Gutiérrez · 0131 jul 2026</td><td class="num">1</td><td class="num">$68,440.00</td><td class="num">$68,440.00</td></tr>
</tbody>
</table>
<div style="display:flex;justify-content:flex-end;margin-top:12px">
<div style="width:270px;font-size:12.5px">
<div class="spread"><span>Subtotal</span><b>$68,440.00</b></div>
<div class="spread" style="margin-top:4px"><span>IVA 16%</span><b>$10,950.40</b></div>
<div class="spread" style="margin-top:7px;padding-top:7px;border-top:1.5px solid var(--cafe);font-size:14px"><span style="font-weight:600">Total MXN</span><b>$79,390.40</b></div>
</div>
</div>
</div>
<div class="wiz-foot">
<button class="btn btn-ghost" onclick="wiz(3)">← Corregir conceptos</button>
<div class="flex">
<button class="btn btn-ghost" onclick="toast('Prefactura PRE-2026-0311 guardada. Puede retomarse desde el Dashboard.')">Guardar y validar después</button>
<button class="btn btn-primary" onclick="wiz(5)">Pasa el doble check → validación final</button>
</div>
</div>
</div>
<!-- Paso 5 -->
<div class="wiz-pane" id="wp-5">
<div class="grid2" style="grid-template-columns:1.2fr 1fr;align-items:start">
<div class="card card-pad">
<h3 class="card-title">Paso 5 · Validaciones finales</h3>
<p class="card-sub">Todos los candados en verde. La emisión es el único paso irreversible del flujo.</p>
<div class="check-row"><span class="check-ico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3"><path d="M20 6 9 17l-5-5"/></svg></span><span><b>Cotización BIND vinculada</b><span class="cr-sub">COT-2026-0455 vigente · regla obligatoria del 6-jul</span></span></div>
<div class="check-row"><span class="check-ico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3"><path d="M20 6 9 17l-5-5"/></svg></span><span><b>Ticket Jira válido y autorizado</b><span class="cr-sub">FAC-0876 · doble check de administración completado</span></span></div>
<div class="check-row"><span class="check-ico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3"><path d="M20 6 9 17l-5-5"/></svg></span><span><b>Método de pago PPD</b><span class="cr-sub">Coherente con 90 días de crédito · sin riesgo de requerimiento SAT</span></span></div>
<div class="check-row"><span class="check-ico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3"><path d="M20 6 9 17l-5-5"/></svg></span><span><b>IVA 16% por regla fiscal</b><span class="cr-sub">Nacional MXN · sin override manual</span></span></div>
<div class="check-row"><span class="check-ico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3"><path d="M20 6 9 17l-5-5"/></svg></span><span><b>Prefactura revisada en simulación</b><span class="cr-sub">PRE-2026-0311 · totales verificados: $79,390.40 MXN</span></span></div>
<div class="check-row"><span class="check-ico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3"><path d="M20 6 9 17l-5-5"/></svg></span><span><b>Cliente activo en BIND con datos fiscales completos</b><span class="cr-sub">CEMEX · RFC y dirección fiscal precargados</span></span></div>
</div>
<div>
<div class="card card-pad mb16">
<h3 class="card-title mb8">Aprobación humana</h3>
<div class="field mb12">
<label>Aprobador responsable</label>
<select><option selected>Arturo R. — Administración / Facturación</option><option>Araceli Sánchez — Dirección</option></select>
<div class="hint">Queda asentado en la bitácora junto con fecha y hora</div>
</div>
<label style="display:flex;gap:9px;font-size:12px;cursor:pointer;align-items:flex-start">
<input type="checkbox" id="chk-confirm" style="width:16px;height:16px;accent-color:#1E7A46;margin-top:2px" onchange="document.getElementById('btn-emit').disabled=!this.checked">
<span>Revisé la prefactura <b>PRE-2026-0311</b> y autorizo la emisión del CFDI.</span>
</label>
</div>
<div class="alert alert-warn mb12">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 9v4m0 4h.01M10.3 3.9 1.8 18a2 2 0 0 0 1.7 3h17a2 2 0 0 0 1.7-3L13.7 3.9a2 2 0 0 0-3.4 0Z"/></svg>
<span><b>Acción irreversible.</b> Al emitir, el PAC de BIND timbra el CFDI ante el SAT. Cancelar después implica proceso administrativo y contable.</span>
</div>
<button class="btn btn-primary btn-lg" id="btn-emit" style="width:100%;justify-content:center" disabled onclick="emitOk()">
Emitir CFDI — timbra el PAC de BIND
</button>
<button class="btn btn-ghost mt8" style="width:100%;justify-content:center" onclick="wiz(4)">← Volver a la prefactura</button>
</div>
</div>
</div>
</div>
<!-- Éxito -->
<div id="wiz-exito" style="display:none">
<div class="success-wrap">
<div class="success-ico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><path d="M20 6 9 17l-5-5"/></svg></div>
<h1 class="view-title" style="font-size:25px">CFDI emitido correctamente</h1>
<p class="view-sub" style="margin-inline:auto">Timbrado por el PAC de BIND · 06 jul 2026, 13:05 · aprobado por <b>Arturo R.</b></p>
<div class="card card-pad mb16" style="text-align:left">
<dl class="dl" style="grid-template-columns:1fr 1fr;margin:0">
<div><dt>Folio interno</dt><dd>F-2026-0143</dd></div>
<div><dt>Folio fiscal (UUID)</dt><dd style="font-size:11px">D4C0FA2E-91B7-4A38-B21C-7E55A0293F16</dd></div>
<div><dt>Cliente</dt><dd>CEMEX, S.A.B. de C.V.</dd></div>
<div><dt>Total</dt><dd>$79,390.40 MXN · PPD · vence 04 oct 2026</dd></div>
</dl>
<div class="alert alert-ok mt12">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M20 6 9 17l-5-5"/></svg>
<span><b>Evidencia adjuntada a Jira:</b> PDF + XML se anexaron a FAC-0876 y el ticket pasó a estatus <b>"Facturado"</b>.</span>
</div>
</div>
<div class="flex" style="justify-content:center;gap:10px">
<button class="btn btn-ghost" onclick="resetWizard()">Emitir otra factura</button>
<button class="btn btn-primary" onclick="resetWizard();show('envio')">Continuar al envío al cliente →</button>
</div>
<p class="footnote mt12">La facturación no termina aquí: falta <b>enviar el correo</b> con los adjuntos que exige cada cliente.</p>
</div>
</div>
</section>
<!-- ============================================================
VISTA 4 · ENVÍO AL CLIENTE
============================================================ -->
<section class="view" id="view-envio">
<h1 class="view-title">Envío al cliente</h1>
<p class="view-sub">El paso que hoy falta sistematizar: <b>la facturación termina hasta que el correo sale</b> con los adjuntos y el formato que cada cliente exige. El botón "Enviar" se bloquea si falta un requisito.</p>
<div class="send-layout">
<!-- Cola -->
<div class="card" style="overflow:hidden">
<div style="padding:14px 16px;border-bottom:1px solid var(--linea)" class="spread">
<h3 class="card-title" style="margin:0">Por enviar</h3>
<span class="chip chip-warn">4 facturas</span>
</div>
<div class="send-item sel">
<div class="si-top"><span class="si-fol">F-2026-0143 · CEMEX</span><span class="chip chip-bad">Falta 1 adjunto</span></div>
<span class="si-cli">$79,390.40 MXN · emitida hoy 13:05 · hub de facturación</span>
</div>
<div class="send-item" onclick="toast('Demo: la vista muestra el caso CEMEX, el más estricto en requisitos.')">
<div class="si-top"><span class="si-fol">F-2026-0140 · Axie</span><span class="chip chip-ok">Completo</span></div>
<span class="si-cli">$5,175.00 USD · requiere estado de cuenta de todas las facturas</span>
</div>
<div class="send-item" onclick="toast('Demo: la vista muestra el caso CEMEX, el más estricto en requisitos.')">
<div class="si-top"><span class="si-fol">F-2026-0139 · ACUNTIA</span><span class="chip chip-ok">Completo</span></div>
<span class="si-cli">$34,800.00 MXN · empaquetar .zip + estado de cuenta</span>
</div>
<div class="send-item" onclick="toast('Demo: la vista muestra el caso CEMEX, el más estricto en requisitos.')">
<div class="si-top"><span class="si-fol">F-2026-0138 · Dilo</span><span class="chip chip-ok">Completo</span></div>
<span class="si-cli">$95,700.00 MXN · adjuntar cotización del proyecto</span>
</div>
</div>
<!-- Detalle de envío CEMEX -->
<div>
<div class="card card-pad mb16">
<div class="spread mb12">
<div>
<h3 class="card-title">F-2026-0143 · CEMEX, S.A.B. de C.V.</h3>
<p class="card-sub" style="margin:0">Perfil de envío del catálogo de particularidades por cliente</p>
</div>
<span class="chip chip-cafe">Perfil CEMEX</span>
</div>
<div class="req-row auto">
<input type="checkbox" checked disabled>
<span><b>Factura PDF + XML</b> <span class="chip chip-neutral" style="margin-left:5px">adjuntado automático</span><span class="rq-sub">F-2026-0143.pdf · F-2026-0143.xml — tomados de BIND al emitir</span></span>
</div>
<div class="req-row" id="req-excel">
<input type="checkbox" id="chk-excel" onchange="updateSend()">
<span><b>Excel de horas del colaborador con VoBo del jefe</b> <span class="chip chip-bad" style="margin-left:5px" id="chip-excel">Pendiente</span><span class="rq-sub">Requisito CEMEX: reporte de horas de Ing. Mariana Gutiérrez firmado/aprobado por el jefe directo. Marca la casilla al adjuntarlo.</span></span>
</div>
<div class="req-row auto">
<input type="checkbox" checked disabled>
<span><b>Asunto con nomenclatura CEMEX</b> <span class="chip chip-ok" style="margin-left:5px">Generado y validado</span><span class="rq-sub">Proveedor + mes + número de factura en posiciones exactas — la plataforma lo arma solo (hoy se redacta a mano y un error rebota la factura).</span></span>
</div>
<div class="alert alert-bad mt12" id="send-block">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 9v4m0 4h.01M10.3 3.9 1.8 18a2 2 0 0 0 1.7 3h17a2 2 0 0 0 1.7-3L13.7 3.9a2 2 0 0 0-3.4 0Z"/></svg>
<span><b>Envío bloqueado:</b> falta el Excel de horas con visto bueno. CEMEX rechaza el correo si llega incompleto — y con 90 días de crédito, cada rebote empuja el cobro.</span>
</div>
<div class="alert alert-ok mt12" id="send-okmsg" style="display:none">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M20 6 9 17l-5-5"/></svg>
<span><b>Checklist completo.</b> Todos los requisitos del perfil CEMEX están cubiertos; el envío está habilitado.</span>
</div>
</div>
<div class="mail-preview mb16">
<div class="mail-head">
<div class="mh-row"><span class="mh-k">Para</span><span class="mh-v">recepcion.facturas@cemex-hub.mx</span></div>
<div class="mh-row"><span class="mh-k">CC</span><span class="mh-v">arturo.rosas@balam.mx · cobranza@balam.mx</span></div>
<div class="mh-row"><span class="mh-k">Asunto</span><span class="mh-v" style="font-family:ui-monospace,monospace;font-size:11.5px;background:var(--amarillo-soft);padding:2px 8px;border-radius:6px">PROV-104728_JUL2026_F-2026-0143</span> <span class="chip chip-ok" style="margin-left:6px">Nomenclatura CEMEX ✓</span></div>
</div>
<div class="mail-body">
<p>Estimado equipo de Cuentas por Pagar:</p>
<p>Adjuntamos la factura <b>F-2026-0143</b> por los servicios de staff augmentation correspondientes a <b>julio 2026</b> (Ing. Mariana Gutiérrez), junto con el reporte de horas autorizado. Referencia OC-CMX-88123.</p>
<p>Quedamos atentos a cualquier aclaración.<br>Atentamente,<br><b>Balam Talento Estratégico · Administración</b></p>
</div>
<div class="mail-attach">
<span class="attach"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M14 3H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V9l-6-6Z"/></svg> F-2026-0143.pdf</span>
<span class="attach"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M14 3H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V9l-6-6Z"/></svg> F-2026-0143.xml</span>
<span class="attach missing" id="att-excel"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 9v4m0 4h.01"/><circle cx="12" cy="12" r="9"/></svg> Horas-jul-MGutierrez-VoBo.xlsx — pendiente</span>
</div>
</div>
<div class="flex" style="justify-content:flex-end;gap:10px">
<button class="btn btn-ghost" onclick="toast('Vista previa actualizada (demo).')">Editar correo</button>
<button class="btn btn-primary btn-lg" id="btn-send" disabled onclick="toast('Correo enviado a CEMEX ✓ — evidencia registrada en bitácora y en el ticket FAC-0876.')">Enviar factura por correo →</button>
</div>
<div class="card card-pad mt16">
<h3 class="card-title mb8">Particularidades por cliente (catálogo)</h3>
<table class="tbl" style="font-size:12px">
<thead><tr><th>Cliente</th><th>Adjuntos requeridos</th><th>Reglas de formato</th></tr></thead>
<tbody>
<tr><td><b>CEMEX</b></td><td>Factura (PDF+XML) + Excel de horas con VoBo del jefe</td><td>Asunto con nomenclatura exacta (proveedor · mes · factura) + redacción específica; se envía al hub</td></tr>
<tr><td><b>Axie</b> <span class="chip chip-info" style="margin-left:4px">Extranjero</span></td><td>Invoices + estado de cuenta de todas las facturas</td><td>Invoice PDF sin XML (validación extranjera) · IVA 0%</td></tr>
<tr><td><b>ACUNTIA</b></td><td>.zip (PDF+XML) + estado de cuenta</td><td>Todo empaquetado en un solo .zip</td></tr>
<tr><td><b>Dilo</b></td><td>Factura + cotización del proyecto</td><td>Por proyecto — la cotización acompaña siempre</td></tr>
<tr><td><b>Regiotour</b></td><td>Factura (PDF+XML)</td><td>Envío estándar</td></tr>
</tbody>
</table>
<p class="footnote">Editable por administración. Pendiente del 6-jul: Ara + Arturo completan el Excel de destinatarios y particularidades; este catálogo lo absorberá.</p>
</div>
</div>
</div>
</section>
<!-- ============================================================
VISTA 5 · COBRANZA
============================================================ -->
<section class="view" id="view-cobranza">
<h1 class="view-title">Cobranza operativa</h1>
<p class="view-sub">Aging de cuentas por cobrar leído de BIND (<b>Finanzas → Cuentas por cobrar</b>), por moneda y sin mezclar. Las alertas son <b>internas, al equipo Balam</b> — los recordatorios automáticos al cliente se habilitan en fase posterior.</p>
<div class="card mb16" style="overflow:hidden">
<div style="padding:13px 18px;border-bottom:1px solid var(--linea)" class="spread">
<h3 class="card-title" style="margin:0">Aging · MXN</h3>
<span class="chip chip-neutral">11 facturas abiertas</span>
</div>
<div class="aging-card">
<div class="aging-cur"><span class="chip chip-cafe">MXN</span></div>
<div class="aging-cell"><span class="aging-lbl">Por vencer</span><span class="aging-val">$612,480</span><span class="aging-n">6 facturas</span></div>
<div class="aging-cell"><span class="aging-lbl">130 días</span><span class="aging-val">$148,060</span><span class="aging-n">2 facturas</span></div>
<div class="aging-cell warm"><span class="aging-lbl">3160 días</span><span class="aging-val">$124,700</span><span class="aging-n">1 factura</span></div>
<div class="aging-cell warm"><span class="aging-lbl">6190 días</span><span class="aging-val">$85,700</span><span class="aging-n">1 factura</span></div>
<div class="aging-cell hot"><span class="aging-lbl">+90 días</span><span class="aging-val">$86,200</span><span class="aging-n">1 factura</span></div>
<div class="aging-cell aging-total"><span class="aging-lbl">Vencido total</span><span class="aging-val" style="color:var(--bad-ink)">$444,660</span><span class="aging-n">5 facturas</span></div>
</div>
</div>
<div class="card mb20" style="overflow:hidden">
<div style="padding:13px 18px;border-bottom:1px solid var(--linea)" class="spread">
<h3 class="card-title" style="margin:0">Aging · USD</h3>
<span class="chip chip-neutral">3 facturas abiertas · TC DOF $18.7342 solo informativo</span>
</div>
<div class="aging-card">
<div class="aging-cur"><span class="chip chip-brand">USD</span></div>
<div class="aging-cell"><span class="aging-lbl">Por vencer</span><span class="aging-val">$10,350</span><span class="aging-n">2 invoices</span></div>
<div class="aging-cell"><span class="aging-lbl">130 días</span><span class="aging-val">$0</span><span class="aging-n"></span></div>
<div class="aging-cell warm"><span class="aging-lbl">3160 días</span><span class="aging-val">$11,750</span><span class="aging-n">1 invoice</span></div>
<div class="aging-cell"><span class="aging-lbl">6190 días</span><span class="aging-val">$0</span><span class="aging-n"></span></div>
<div class="aging-cell"><span class="aging-lbl">+90 días</span><span class="aging-val">$0</span><span class="aging-n"></span></div>
<div class="aging-cell aging-total"><span class="aging-lbl">Vencido total</span><span class="aging-val" style="color:var(--warn-ink)">$11,750</span><span class="aging-n">1 invoice</span></div>
</div>
</div>
<div style="display:grid;grid-template-columns:1.4fr 1fr;gap:20px">
<div class="card card-pad">
<div class="spread mb12">
<div>
<h3 class="card-title">Alertas internas <span class="chip chip-warn" style="margin-left:6px">al equipo Balam — no al cliente</span></h3>
<p class="card-sub" style="margin:0">Los recordatorios automáticos <b>al cliente</b> se habilitan en fase posterior (Anexo B).</p>
</div>
</div>
<table class="tbl" style="font-size:12px">
<thead><tr><th>Factura</th><th>Cliente</th><th class="num">Monto</th><th>Vencida hace</th><th>Alerta</th><th>Destinatario interno</th></tr></thead>
<tbody>
<tr>
<td class="mono">F-2026-0019</td><td>ACUNTIA</td><td class="num">$86,200 MXN</td>
<td><span class="chip chip-bad">114 días · febrero</span></td>
<td>Escalamiento a dirección</td><td>Araceli S. + Arturo R.</td>
</tr>
<tr>
<td class="mono">F-2026-0058</td><td>Regiotour</td><td class="num">$85,700 MXN</td>
<td><span class="chip chip-bad">73 días · abril</span></td>
<td>Seguimiento urgente</td><td>Arturo R.</td>
</tr>
<tr>
<td class="mono">F-2026-0087</td><td>Dilo</td><td class="num">$124,700 MXN</td>
<td><span class="chip chip-warn">41 días</span></td>
<td>Recordatorio de gestión</td><td>Arturo R.</td>
</tr>
<tr>
<td class="mono">INV-2026-0102</td><td>Axie</td><td class="num">$11,750 USD</td>
<td><span class="chip chip-warn">38 días</span></td>
<td>Recordatorio de gestión</td><td>Arturo R.</td>
</tr>
<tr>
<td class="mono">F-2026-0110</td><td>CEMEX</td><td class="num">$71,920 MXN</td>
<td><span class="chip chip-info">Vence en 6 días</span></td>
<td>Aviso preventivo</td><td>Arturo R.</td>
</tr>
</tbody>
</table>
<div class="alert alert-info mt12">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="9"/><path d="M12 8h.01M11 12h1v4h1"/></svg>
<span>La factura de <b>febrero</b> es del cliente "muy pagador" — se quedó sin seguimiento por confiar en que pagaría solo. Con alertas automáticas, ningún vencimiento pasa desapercibido (caso citado por Ara y Arturo, 6-jul).</span>
</div>
</div>
<div class="card card-pad">
<h3 class="card-title">Excepciones de seguimiento</h3>
<p class="card-sub">Clientes excluidos de las alertas de morosidad</p>
<div class="empty-state">
<div class="es-ico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M20 6 9 17l-5-5"/></svg></div>
<b>Sin excepciones — todos los clientes reciben seguimiento</b>
<p>Decisión de dirección (6-jul-2026): la lista de excepciones queda <b>vacía</b>. La capacidad existe y es configurable, pero hoy ningún cliente se excluye de los avisos de vencimiento.</p>
</div>
<button class="btn btn-ghost btn-sm" style="width:100%;justify-content:center" onclick="toast('Capacidad disponible pero sin uso: dirección decidió no excluir a nadie (6-jul).')">Agregar excepción…</button>
</div>
</div>
</section>
<!-- ============================================================
VISTA 6 · BITÁCORA
============================================================ -->
<section class="view" id="view-bitacora">
<h1 class="view-title">Bitácora de auditoría</h1>
<p class="view-sub">Registro inmutable de cada acción: quién, qué, cuándo, con qué <b>ticket Jira</b> y qué <b>folio BIND</b>. Base de la trazabilidad end-to-end del flujo.</p>
<div class="filters">
<button class="fchip on">Todo (hoy)</button>
<button class="fchip">Emisiones</button>
<button class="fchip">Validaciones</button>
<button class="fchip">Envíos</button>
<button class="fchip">Overrides</button>
<button class="fchip">Solo Arturo R.</button>
<div class="search-box">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="11" cy="11" r="7"/><path d="m20 20-3.5-3.5"/></svg>
<input type="text" placeholder="Buscar folio, ticket, usuario…" />
</div>
</div>
<div class="card" style="overflow:hidden">
<table class="tbl">
<thead><tr><th>Fecha y hora</th><th>Usuario</th><th>Acción</th><th>Referencias</th><th>Detalle</th></tr></thead>
<tbody>
<tr>
<td style="white-space:nowrap">06 jul 2026 · 13:05</td><td><b>Arturo R.</b></td>
<td><span class="chip chip-ok">CFDI emitido</span></td>
<td class="mono" style="font-size:11.5px">FAC-0876 · F-2026-0143</td>
<td>Timbrado por PAC de BIND · $79,390.40 MXN · PPD · UUID D4C0FA2E… · evidencia PDF+XML anexada a Jira</td>
</tr>
<tr>
<td style="white-space:nowrap">06 jul 2026 · 13:04</td><td><b>Arturo R.</b></td>
<td><span class="chip chip-info">Validación aprobada</span></td>
<td class="mono" style="font-size:11.5px">FAC-0876 · PRE-2026-0311</td>
<td>Doble check completo: cotización ✓ · PPD ✓ · IVA 16% por regla ✓ · confirmación explícita del aprobador</td>
</tr>
<tr>
<td style="white-space:nowrap">06 jul 2026 · 12:58</td><td><b>Plataforma</b></td>
<td><span class="chip chip-neutral">Prefactura simulada</span></td>
<td class="mono" style="font-size:11.5px">FAC-0876 · COT-2026-0455</td>
<td>Cotización convertida a prefactura PRE-2026-0311 en un clic · modo simulación, sin timbrar</td>
</tr>
<tr>
<td style="white-space:nowrap">06 jul 2026 · 12:41</td><td><b>Plataforma</b></td>
<td><span class="chip chip-warn">Advertencia mostrada</span></td>
<td class="mono" style="font-size:11.5px">FAC-0874</td>
<td>Usuario seleccionó PUE con 30 días de crédito → alerta SAT desplegada · el usuario regresó a PPD</td>
</tr>
<tr>
<td style="white-space:nowrap">06 jul 2026 · 12:15</td><td><b>Araceli S.</b></td>
<td><span class="chip chip-brand">Cotización vinculada</span></td>
<td class="mono" style="font-size:11.5px">FAC-0875 · COT-2026-0461</td>
<td>Cotización BIND adjuntada al ticket de headhunting (cierre 50% restante, Dilo)</td>
</tr>
<tr>
<td style="white-space:nowrap">06 jul 2026 · 11:52</td><td><b>Arturo R.</b></td>
<td><span class="chip chip-bad">Override de IVA</span></td>
<td class="mono" style="font-size:11.5px">FAC-0872 · PRE-2026-0309</td>
<td>IVA manual 0%→16% en factura nacional con motivo capturado: "concepto exento mal clasificado en cotización"</td>
</tr>
<tr>
<td style="white-space:nowrap">06 jul 2026 · 11:20</td><td><b>Plataforma</b></td>
<td><span class="chip chip-info">Alerta interna enviada</span></td>
<td class="mono" style="font-size:11.5px">F-2026-0019</td>
<td>Escalamiento a dirección: factura ACUNTIA con 114 días vencida ($86,200 MXN) · destinatarios: Araceli S., Arturo R.</td>
</tr>
<tr>
<td style="white-space:nowrap">06 jul 2026 · 10:47</td><td><b>Erika C.</b></td>
<td><span class="chip chip-neutral">Consulta de reporte</span></td>
<td class="mono" style="font-size:11.5px"></td>
<td>Exportó aging de cobranza MXN/USD a XLSX para corte semanal</td>
</tr>
<tr>
<td style="white-space:nowrap">06 jul 2026 · 10:12</td><td><b>Plataforma</b></td>
<td><span class="chip chip-neutral">Sincronización BIND</span></td>
<td class="mono" style="font-size:11.5px"></td>
<td>Lectura de cuentas por cobrar y catálogo de clientes · 214 llamadas API · sin cambios en facturas pagadas</td>
</tr>
<tr>
<td style="white-space:nowrap">06 jul 2026 · 09:38</td><td><b>Arturo R.</b></td>
<td><span class="chip chip-ok">Correo enviado</span></td>
<td class="mono" style="font-size:11.5px">FAC-0868 · F-2026-0142</td>
<td>Factura CEMEX enviada al hub con Excel de horas VoBo · asunto validado: PROV-104728_JUL2026_F-2026-0142</td>
</tr>
<tr>
<td style="white-space:nowrap">06 jul 2026 · 09:15</td><td><b>Araceli S.</b></td>
<td><span class="chip chip-brand">Ticket creado</span></td>
<td class="mono" style="font-size:11.5px">FAC-0876</td>
<td>Solicitud de facturación staff augmentation CEMEX · cotización COT-2026-0455 adjunta · empresa origen: Balam</td>
</tr>
</tbody>
</table>
</div>
<p class="footnote">Cada registro guarda usuario, timestamp, ticket Jira y folio BIND para reconstruir el flujo completo: solicitud → cotización → prefactura → CFDI → envío → cobranza.</p>
</section>
</div><!-- /content -->
</div><!-- /main -->
</div><!-- /app -->
<div class="toast" id="toast">
<span class="tico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3"><path d="M20 6 9 17l-5-5"/></svg></span>
<span id="toast-msg"></span>
</div>
<script>
/* ============ Navegación entre vistas ============ */
const CRUMBS = {
dashboard:'Dashboard', solicitudes:'Solicitudes (Jira)', emision:'Emisión asistida',
envio:'Envío al cliente', cobranza:'Cobranza', bitacora:'Bitácora'
};
function show(view){
// Sub-vistas internas
if(view === 'sol-detalle'){
show('solicitudes');
document.getElementById('sol-lista').style.display = 'none';
document.getElementById('sol-detalle').style.display = 'block';
return;
}
document.querySelectorAll('.view').forEach(v => v.classList.remove('active'));
const target = document.getElementById('view-' + view);
if(!target) return;
target.classList.add('active');
document.querySelectorAll('.nav-item[data-view]').forEach(n => n.classList.toggle('active', n.dataset.view === view));
document.getElementById('crumb').textContent = CRUMBS[view] || view;
// Estados por defecto de cada vista
if(view === 'solicitudes'){
document.getElementById('sol-lista').style.display = 'block';
document.getElementById('sol-detalle').style.display = 'none';
}
window.scrollTo({top:0, behavior:'instant'});
}
document.querySelectorAll('.nav-item[data-view]').forEach(el => {
el.addEventListener('click', () => show(el.dataset.view));
});
/* ============ Wizard de emisión (5 pasos) ============ */
let curStep = 1;
function wiz(n){
curStep = n;
document.querySelectorAll('.wiz-pane').forEach(p => p.classList.remove('active'));
document.getElementById('wp-' + n).classList.add('active');
for(let i = 1; i <= 5; i++){
const s = document.getElementById('st-' + i);
s.classList.remove('cur','done');
if(i < n) s.classList.add('done');
if(i === n) s.classList.add('cur');
if(i < n) s.querySelector('.step-n').innerHTML = '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" style="width:12px;height:12px"><path d="M20 6 9 17l-5-5"/></svg>';
else s.querySelector('.step-n').textContent = i;
}
document.getElementById('wiz-main').scrollIntoView({behavior:'instant', block:'start'});
}
function startWizard(){
resetWizard();
show('emision');
}
function resetWizard(){
document.getElementById('wiz-exito').style.display = 'none';
document.getElementById('wiz-main').style.display = 'block';
const chk = document.getElementById('chk-confirm');
chk.checked = false;
document.getElementById('btn-emit').disabled = true;
pickPay('ppd');
wiz(1);
}
function emitOk(){
document.getElementById('wiz-main').style.display = 'none';
document.getElementById('wiz-exito').style.display = 'block';
toast('CFDI F-2026-0143 timbrado por el PAC de BIND · evidencia anexada a FAC-0876.');
window.scrollTo({top:0, behavior:'instant'});
}
/* Paso 1: selección de cotización */
function pickQuote(el){
document.querySelectorAll('.quote-card').forEach(q => q.classList.remove('sel'));
el.classList.add('sel');
}
/* Paso 2: PPD/PUE con advertencia SAT */
function pickPay(which){
const ppd = document.getElementById('pay-ppd'), pue = document.getElementById('pay-pue');
ppd.classList.toggle('sel', which === 'ppd');
pue.classList.toggle('sel', which === 'pue');
document.getElementById('pue-alert').style.display = which === 'pue' ? 'flex' : 'none';
}
/* ============ Envío: checklist bloqueante ============ */
function updateSend(){
const ok = document.getElementById('chk-excel').checked;
document.getElementById('btn-send').disabled = !ok;
document.getElementById('send-block').style.display = ok ? 'none' : 'flex';
document.getElementById('send-okmsg').style.display = ok ? 'flex' : 'none';
const chipE = document.getElementById('chip-excel');
chipE.textContent = ok ? 'Adjuntado ✓' : 'Pendiente';
chipE.className = 'chip ' + (ok ? 'chip-ok' : 'chip-bad');
chipE.style.marginLeft = '5px';
const att = document.getElementById('att-excel');
if(ok){
att.classList.remove('missing');
att.innerHTML = '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M14 3H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V9l-6-6Z"/></svg> Horas-jul-MGutierrez-VoBo.xlsx';
} else {
att.classList.add('missing');
att.innerHTML = '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 9v4m0 4h.01"/><circle cx="12" cy="12" r="9"/></svg> Horas-jul-MGutierrez-VoBo.xlsx — pendiente';
}
}
/* ============ Toast ============ */
let toastTimer = null;
function toast(msg){
const t = document.getElementById('toast');
document.getElementById('toast-msg').textContent = msg;
t.classList.add('show');
clearTimeout(toastTimer);
toastTimer = setTimeout(() => t.classList.remove('show'), 4200);
}
/* Los filtros y búsquedas son decorativos en el prototipo */
document.querySelectorAll('.fchip').forEach(c => {
c.addEventListener('click', () => {
c.parentElement.querySelectorAll('.fchip').forEach(x => x.classList.remove('on'));
c.classList.add('on');
toast('Filtro aplicado (demo — los datos son ficticios).');
});
});
</script>
</body>
</html>