Files
balam/propuesta/Adenda-01-Integracion-Jira.html
T
Johann 67bce9d691 Prepara la Adenda 01 (integración Jira→BIND, 9–12 h) y el Excel de horas por etapa
Los dos pendientes que Erika re-preguntó el 28-jul: la adenda formaliza la
generación automática de cotizaciones desde tickets FAC ($5,400–$7,200 + IVA,
consistente con las ~10 h comunicadas el 21-jul) como solicitud de cambio
conforme a la §10 de la propuesta v1.2; el Excel resume horas por etapa
(E0 cerrada en 21.83 h, E1 en 19.75 h, E2/E3 con rangos contractuales) con
importes para facturación. PDF con el mismo diseño del paquete v1.2.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-01 13:02:07 -06:00

378 lines
21 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">
<head>
<meta charset="UTF-8">
<title>Adenda 01 — Integración Jira → BIND · Balam</title>
<style>
@font-face{ font-family:"Caladea"; font-style:normal; font-weight:400; src:url("fonts/Caladea-Regular.ttf") format("truetype"); }
@font-face{ font-family:"Caladea"; font-style:normal; font-weight:700; src:url("fonts/Caladea-Bold.ttf") format("truetype"); }
@font-face{ font-family:"Caladea"; font-style:italic; font-weight:400; src:url("fonts/Caladea-Italic.ttf") format("truetype"); }
@font-face{ font-family:"Caladea"; font-style:italic; font-weight:700; src:url("fonts/Caladea-BoldItalic.ttf") format("truetype"); }
@font-face{ font-family:"Carlito"; font-style:normal; font-weight:400; src:url("fonts/Carlito-Regular.ttf") format("truetype"); }
@font-face{ font-family:"Carlito"; font-style:normal; font-weight:700; src:url("fonts/Carlito-Bold.ttf") format("truetype"); }
@font-face{ font-family:"Carlito"; font-style:italic; font-weight:400; src:url("fonts/Carlito-Italic.ttf") format("truetype"); }
@font-face{ font-family:"Carlito"; font-style:italic; font-weight:700; src:url("fonts/Carlito-BoldItalic.ttf") format("truetype"); }
@font-face{ font-family:"DejaVu Sans Mono"; font-style:normal; font-weight:400; src:url("fonts/DejaVuSansMono.ttf") format("truetype"); }
:root{
--ink:#1C2B39; /* deep slate navy — headings, dark fields */
--ink-2:#3C4A57; /* body text */
--muted:#6E7A86; /* meta, captions */
--hair:#E4E8EC; /* hairlines */
--hair-2:#C9D1D8; /* stronger hairlines */
--accent:#BC5B3E; /* terracotta accent */
--accent-d:#9A4530; /* darker terracotta for small text */
--accent-tint:#FBF1EC;/* pale terracotta wash */
--cream:#F8F5F0; /* warm panel */
--paper:#FFFFFF;
--ok:#2E7D5B;
--warn:#C0892E;
--no:#B23A48;
--serif:'Caladea','Bitstream Charter','DejaVu Serif',Georgia,serif;
--sans:'Carlito','DejaVu Sans','Noto Sans',system-ui,sans-serif;
--mono:'DejaVu Sans Mono','Liberation Mono',monospace;
}
*{ -webkit-print-color-adjust:exact; print-color-adjust:exact; box-sizing:border-box; }
html,body{ margin:0; padding:0; }
body{
font-family:var(--sans);
font-size:10.25pt;
line-height:1.55;
color:var(--ink-2);
background:var(--paper);
-webkit-font-smoothing:antialiased;
}
@page{ size:Letter; margin:15mm 16mm 18mm 16mm; }
@page :first{ margin:0; }
p{ margin:6pt 0; }
strong,b{ font-weight:700; color:var(--ink); }
em,i{ font-style:italic; }
a{ color:var(--accent-d); text-decoration:none; }
code{
font-family:var(--mono); font-size:8.6pt;
background:var(--cream); border:.5pt solid var(--hair);
border-radius:3pt; padding:.5pt 3pt; color:var(--ink);
}
ul,ol{ margin:6pt 0; padding-left:17pt; }
li{ margin:3pt 0; line-height:1.5; color:var(--ink-2); padding-left:2pt; }
li::marker{ color:var(--accent); }
ol li::marker{ color:var(--accent-d); font-weight:700; }
/* ---------------- COVER ---------------- */
.cover{
width:216mm; min-height:279mm;
background:var(--ink);
color:#EAEDF0;
padding:30mm 26mm 24mm;
display:flex; flex-direction:column;
position:relative; overflow:hidden;
}
.cover::after{ /* faint geometric corner motif */
content:""; position:absolute; right:-60mm; top:-60mm;
width:150mm; height:150mm; border-radius:50%;
background:radial-gradient(circle at center, rgba(188,91,62,.18), rgba(188,91,62,0) 70%);
}
.cover .top{ position:relative; z-index:2; }
.cover .rule{ width:46pt; height:3pt; background:var(--accent); margin-bottom:14pt; }
.cover .eyebrow{
font-family:var(--sans); font-size:10pt; font-weight:700;
letter-spacing:.34em; text-transform:uppercase; color:#D89A82;
}
.cover .mid{ position:relative; z-index:2; margin-top:auto; margin-bottom:auto; padding:18mm 0; }
.cover h1{
font-family:var(--serif); font-weight:700;
font-size:37pt; line-height:1.06; letter-spacing:-.01em;
margin:0; color:#FFFFFF; max-width:150mm;
}
.cover .client{
margin-top:16pt; font-family:var(--sans); font-size:12.5pt; color:#C9D1D8;
}
.cover .client b{ color:var(--accent); font-weight:700; }
.cover .meta{ position:relative; z-index:2; }
.cover .meta-grid{
display:grid; grid-template-columns:34mm 1fr;
gap:7pt 14pt; border-top:.6pt solid rgba(255,255,255,.18);
padding-top:14pt;
}
.cover .meta-grid dt{
font-family:var(--sans); font-size:7.5pt; font-weight:700;
letter-spacing:.12em; text-transform:uppercase; color:#8FA0AD; padding-top:1.5pt;
}
.cover .meta-grid dd{ margin:0; font-size:9.5pt; color:#DDE3E8; line-height:1.45; }
.cover .meta-grid dd .who{ display:block; }
.cover .meta-grid dd .who b{ color:#FFFFFF; font-weight:700; }
.cover .meta-grid dd .who span{ color:#9FB0BC; }
.cover .conf{
position:relative; z-index:2; margin-top:18pt;
display:flex; justify-content:space-between; align-items:baseline;
font-family:var(--sans); font-size:8pt; letter-spacing:.06em;
text-transform:uppercase; color:#7C8B97;
border-top:.6pt solid rgba(255,255,255,.12); padding-top:10pt;
}
.cover .conf .badge{ color:var(--accent); font-weight:700; }
/* ---------------- TOC ---------------- */
.toc{ break-before:page; padding-top:6mm; }
.toc h2{
font-family:var(--serif); font-size:20pt; color:var(--ink);
margin:0 0 2pt; font-weight:700;
}
.toc .kick{
font-family:var(--sans); font-size:8pt; font-weight:700; letter-spacing:.2em;
text-transform:uppercase; color:var(--accent-d); margin-bottom:14pt;
}
.toc .rule{ width:46pt; height:2.5pt; background:var(--accent); margin:6pt 0 16pt; }
.toc-row{ display:flex; align-items:baseline; gap:9pt; padding:6.5pt 0; border-bottom:.5pt solid var(--hair); }
.toc-row .n{ font-family:var(--serif); font-weight:700; font-size:11pt; color:var(--accent); min-width:24pt; }
.toc-row .t{ font-family:var(--serif); font-size:11.5pt; color:var(--ink); }
.toc-row.section .t{ font-weight:700; }
.toc-row .dots{ flex:1; border-bottom:.6pt dotted var(--hair-2); transform:translateY(-3pt); }
.toc-row .pg{ font-family:var(--sans); font-size:9.5pt; color:var(--muted); font-variant-numeric:tabular-nums; min-width:14pt; text-align:right; }
.toc-row.annex{ margin-top:2pt; }
.toc-row.annex .n,.toc-row.annex .t{ color:var(--ink); }
.toc-row.annex .n{ color:var(--accent); }
/* ---------------- CONTENT ---------------- */
.content{ break-before:page; }
.sec{ margin-top:20pt; }
.sec:first-child{ margin-top:0; }
.sec-head{
display:flex; align-items:baseline; gap:14pt;
margin:0 0 9pt; padding-bottom:8pt;
border-bottom:1.2pt solid var(--ink); break-after:avoid;
}
.sec-head.no-num{ gap:0; }
.sec-num{
font-family:var(--serif); font-size:29pt; font-weight:700;
color:var(--accent); line-height:.85; letter-spacing:-.02em; min-width:38pt;
}
.sec-head h2{
font-family:var(--serif); font-size:18pt; font-weight:700;
color:var(--ink); line-height:1.12; margin:0;
}
.sec-head .kick{
display:block; font-family:var(--sans); font-size:7.5pt; font-weight:700;
letter-spacing:.16em; text-transform:uppercase; color:var(--accent-d); margin-bottom:3pt;
}
h3{ font-family:var(--sans); font-size:11.5pt; font-weight:700; color:var(--ink); margin:15pt 0 5pt; break-after:avoid; }
h3 .sn{ color:var(--accent-d); font-weight:700; margin-right:7pt; }
h4{ font-family:var(--sans); font-size:10pt; font-weight:700; color:var(--ink); margin:12pt 0 4pt; break-after:avoid; }
.mini-label{
font-family:var(--sans); font-size:8pt; font-weight:700; letter-spacing:.1em;
text-transform:uppercase; color:var(--accent-d); margin:10pt 0 4pt;
}
.lede{ font-size:11pt; line-height:1.62; color:var(--ink); }
/* drop cap for executive summary */
.dropcap > p:first-of-type::first-letter{
font-family:var(--serif); font-weight:700; color:var(--accent);
font-size:38pt; line-height:.82; float:left; padding:2pt 7pt 0 0;
}
/* ETAPA block */
.etapa{ margin:16pt 0 5pt; padding-top:9pt; border-top:.8pt solid var(--hair-2); break-after:avoid; }
.etapa .et-t{ font-family:var(--serif); font-size:13pt; font-weight:700; color:var(--ink); line-height:1.2; }
.etapa .et-meta{ font-family:var(--sans); font-size:8.5pt; font-weight:700; letter-spacing:.05em; text-transform:uppercase; color:var(--accent-d); margin-top:3pt; }
/* ---------------- TABLES ---------------- */
table{ width:100%; border-collapse:collapse; margin:10pt 0; font-size:9.2pt; }
thead{ display:table-header-group; }
th{
text-align:left; font-family:var(--sans); font-weight:700; color:var(--ink);
font-size:7.8pt; letter-spacing:.045em; text-transform:uppercase;
padding:7pt 9pt; border-bottom:1.4pt solid var(--ink); vertical-align:bottom;
}
td{ padding:6.5pt 9pt; border-bottom:.6pt solid var(--hair); vertical-align:top; color:var(--ink-2); line-height:1.42; }
tr{ break-inside:avoid; }
td.k{ color:var(--ink); font-weight:600; }
.num,th.num{ text-align:right; font-variant-numeric:tabular-nums; white-space:nowrap; }
.ctr,th.ctr{ text-align:center; }
tr.total td{ font-weight:700; color:var(--ink); background:var(--cream); border-top:1.2pt solid var(--ink); border-bottom:1.2pt solid var(--ink); }
tr.sub-total td{ font-weight:700; color:var(--ink); background:var(--accent-tint); border-top:1pt solid var(--accent); }
.cov{ font-size:11pt; text-align:center; line-height:1; }
table.compact td,table.compact th{ padding:5.5pt 8pt; }
/* ---------------- CALLOUTS ---------------- */
.callout{
break-inside:avoid; background:var(--accent-tint);
border-left:3pt solid var(--accent); border-radius:0 4pt 4pt 0;
padding:9pt 14pt; margin:11pt 0; font-size:9.4pt; line-height:1.5; color:var(--ink-2);
}
.callout strong,.callout b{ color:var(--accent-d); }
.callout.cool{ background:var(--cream); border-left-color:var(--ink); }
.callout.cool strong,.callout.cool b{ color:var(--ink); }
/* ---------------- FLOW CHIPS ---------------- */
.flow{
break-inside:avoid; display:flex; flex-wrap:wrap; align-items:center; justify-content:center;
gap:6pt; margin:14pt 0; padding:14pt 12pt; background:var(--cream); border-radius:7pt;
}
.chip{
font-family:var(--sans); font-weight:600; font-size:9pt; color:var(--ink);
background:#fff; border:.7pt solid var(--hair-2); padding:5pt 11pt; border-radius:20pt;
box-shadow:0 1pt 2pt rgba(28,43,57,.05);
}
.chip.accent{ background:var(--accent); color:#fff; border-color:var(--accent); }
.arrow{ color:var(--accent); font-weight:700; font-size:11pt; }
/* ---------------- SYNTHESIS CARDS ---------------- */
.synthesis{ display:grid; grid-template-columns:1fr 1fr; gap:9pt; margin:12pt 0; break-inside:avoid; }
.scard{ border:.7pt solid var(--hair); border-top:2.5pt solid var(--accent); border-radius:5pt; padding:9pt 12pt; background:#fff; }
.scard .lab{ font-family:var(--sans); font-size:7.3pt; font-weight:700; letter-spacing:.1em; text-transform:uppercase; color:var(--accent-d); margin-bottom:3pt; }
.scard .big{ font-family:var(--serif); font-size:13pt; font-weight:700; color:var(--ink); line-height:1.15; }
.scard .val{ font-size:9pt; color:var(--ink-2); line-height:1.42; }
.scard .sm{ font-size:8.2pt; color:var(--muted); margin-top:2pt; }
/* sign-off */
.signoff{ margin-top:24pt; padding-top:14pt; border-top:1.2pt solid var(--ink); break-inside:avoid; }
.signoff .nm{ font-family:var(--serif); font-size:14pt; font-weight:700; color:var(--ink); }
.signoff .rl{ font-family:var(--sans); font-size:9pt; color:var(--muted); margin-top:2pt; letter-spacing:.03em; }
hr.div{ border:none; border-top:.6pt solid var(--hair); margin:16pt 0; }
.spacer{ height:4pt; }
</style>
</head>
<body>
<!-- ============ COVER ============ -->
<div class="cover">
<div class="top">
<div class="rule"></div>
<div class="eyebrow">Adenda 01 · Propuesta Comercial</div>
</div>
<div class="mid">
<h1>Integración Jira&nbsp;→&nbsp;BIND</h1>
<div class="client">Generación automática de cotizaciones desde los tickets de facturación — <b>Balam</b></div>
</div>
<div class="meta">
<dl class="meta-grid">
<dt>Preparada para</dt>
<dd>Noe Rocha (CTO) · Araceli Sánchez Jiménez (CEO/Operaciones) · Erika Chávez (PM) · Pedro Alberto Ayala Elizondo (Contacto técnico)</dd>
<dt>Preparada por</dt>
<dd>Johann Velazquez — Consultor de Software · Monterrey, N.L.</dd>
<dt>Fecha</dt>
<dd>28 de julio de 2026</dd>
<dt>Referencia</dt>
<dd>Propuesta Comercial v1.2 · Contrato de servicios firmado el 26-jun-2026 · §10 — Control de cambios</dd>
<dt>Vigencia</dt>
<dd>30 días naturales a partir de la fecha de emisión</dd>
</dl>
<div class="conf">
<span class="badge">Documento confidencial</span>
<span>Adenda a la propuesta v1.2 — no sustituye al contrato</span>
</div>
</div>
</div>
<!-- ============ CONTENT ============ -->
<main class="content">
<section class="sec">
<div class="sec-head"><div class="sec-num">01</div><div><h2>Antecedente</h2></div></div>
<p>La propuesta v1.2 dejó Jira explícitamente <strong>fuera del alcance</strong> del MVP (§1.3 y Anexo A.4), conforme a la información disponible al momento de cotizar. Durante el Discovery y las sesiones de julio, la dirección confirmó que el proceso interno evolucionó: <strong>hoy todo el flujo de facturación de Balam nace y se gobierna en Jira</strong> — <em>"lo que no está en Jira no se procesa"</em> — con una bandeja dedicada (<strong>Facturación</strong>, llave <code>FAC-</code>) y un flujo de estatus formal que culmina en "resuelto".</p>
<p>En la sesión del 22 de julio el CTO planteó incorporar esta conectividad como ajuste de alcance; en la validación del prototipo del 24 de julio se ratificó, y en la sesión técnica del 27 de julio con Pedro Ayala quedó confirmada la viabilidad: la API de Jira cubre <strong>lectura y escritura</strong> de tickets, se entregó el token de integración (<strong>"PAF"</strong>, vigente al 27-jul-2027) y se documentaron los límites de consumo del lado de Atlassian. La estimación preliminar (~10&nbsp;h) se comunicó a la PM el 21 de julio; esta adenda la formaliza por escrito, como lo prevé el control de cambios de la propuesta.</p>
</section>
<section class="sec">
<div class="sec-head"><div class="sec-num">02</div><div><h2>Alcance del cambio</h2></div></div>
<p>La integración agrega a la primera etapa las siguientes capacidades:</p>
<ol>
<li><strong>Conexión con la API de Jira</strong> mediante el token PAF y lectura de los tickets de la bandeja <strong>Facturación (<code>FAC-</code>)</strong>, con consumo autorregulado conforme a los límites de velocidad documentados por Atlassian.</li>
<li><strong>Generación automática de la cotización en BIND</strong> cuando un ticket alcanza el estatus disparador que Balam defina (candidato natural: la entrada del ticket al proceso de facturación, previo a "resuelto"), a través de la misma <strong>capa de escritura controlada</strong> del MVP.</li>
<li><strong>Trazabilidad ticket ↔ cotización ↔ prefactura/factura</strong>, visible en la plataforma y registrada en la bitácora de auditoría. Los tickets leídos alimentan además la vista <em>"qué necesita atención"</em> del tablero.</li>
<li><strong>Pruebas controladas:</strong> scripts de consulta y de creación/edición sobre un registro de prueba, y una <strong>prueba observada</strong> con el equipo de Balam antes de habilitar la generación automática en operación (según lo acordado en la sesión del 27 de julio).</li>
</ol>
<div class="flow">
<span class="chip">Ticket Jira <small>(FAC)</small></span><span class="arrow">→</span>
<span class="chip accent">Cotización BIND <small>(automática)</small></span><span class="arrow">→</span>
<span class="chip">Prefactura</span><span class="arrow">→</span>
<span class="chip">Aprobación humana</span><span class="arrow">→</span>
<span class="chip">Timbrado <small>(PAC de BIND)</small></span>
</div>
<div class="callout"><strong>El control fiscal no cambia.</strong> La integración crea <strong>cotizaciones, nunca facturas</strong>: se mantiene la cadena acordada — cotización → prefactura → <strong>aprobación humana</strong> → timbrado por el PAC de BIND — con modo de simulación (<em>dry-run</em>), feature flag y registro en bitácora. No existe timbrado automático.</div>
</section>
<section class="sec">
<div class="sec-head"><div class="sec-num">03</div><div><h2>Qué no incluye</h2></div></div>
<ul>
<li><strong>Alta automática de clientes en BIND.</strong> Si el cliente del ticket no existe en BIND, la plataforma lo <strong>detecta y lo notifica</strong>; darlo de alta automáticamente es una decisión de proceso aún abierta y, de aprobarse, se estima por separado.</li>
<li><strong>Tickets con múltiples facturas.</strong> El supuesto de esta adenda es <em>un ticket → una cotización</em>. El manejo del caso masivo (un ticket con un listado de decenas de facturas) se define junto con Balam; si requiere desarrollo adicional, se estima por separado.</li>
<li><strong>Otros usos de Jira</strong> — reporteo de horas de consultores, tableros sobre otras bandejas o el espacio comercial para pipeline de ventas — así como los módulos diferidos del Anexo B, permanecen fuera del alcance.</li>
</ul>
</section>
<section class="sec">
<div class="sec-head"><div class="sec-num">04</div><div><h2>Estimación e inversión</h2></div></div>
<table>
<thead><tr><th>Concepto</th><th class="num">Horas</th><th class="num">Inversión (MXN)</th></tr></thead>
<tbody>
<tr><td class="k">Primera etapa — propuesta v1.2 (Etapas 0 a 3)</td><td class="num">112 – 136</td><td class="num">$67,200 – $81,600</td></tr>
<tr><td class="k">Adenda 01 — Integración Jira → BIND: lectura de la bandeja FAC, disparador por estatus, cotización automática, trazabilidad y pruebas</td><td class="num">9 – 12</td><td class="num">$5,400 – $7,200</td></tr>
<tr class="total"><td>Total de la primera etapa con adenda</td><td class="num">121 – 148</td><td class="num">$72,600 – $88,800</td></tr>
</tbody>
</table>
<ul>
<li><strong>Tarifa vigente:</strong> $600 MXN/h + IVA (§3.3). El rango es consistente con la estimación de ~10&nbsp;h comunicada el 21 de julio y opera bajo el mismo esquema de horas reales <strong>con tope</strong>: al aproximarse al máximo, el trabajo se detiene y se revisa con Balam.</li>
<li><strong>Facturación:</strong> como el resto de los avances — semanal (viernes) por horas efectivamente trabajadas, con pago a 30 días naturales.</li>
<li>Cifras antes de IVA.</li>
</ul>
</section>
<section class="sec">
<div class="sec-head"><div class="sec-num">05</div><div><h2>Supuestos y dependencias</h2></div></div>
<ol>
<li><strong>Definición del flujo de facturación</strong> por parte de Balam (actualmente en revisión interna; sesión por agendar): de ella salen el estatus disparador y las reglas de prefactura. La implementación de esta adenda inicia una vez cerrada esa definición.</li>
<li><strong>Token PAF vigente</strong> con visibilidad de la bandeja FAC (entregado el 27 de julio) y un interlocutor técnico (Pedro) para dudas de Jira, con respuesta en menos de 48 horas.</li>
<li><strong>Diagrama del flujo Jira de facturación</strong> en tamaño legible (comprometido por Balam en la sesión del 22 de julio).</li>
<li><strong>Bandeja FAC como fuente.</strong> FAC opera como bandeja "padre" del proceso de facturación; si las pruebas muestran que algún disparador nace en otra bandeja sin reflejarse en FAC, el ajuste se revisa en conjunto.</li>
<li><strong>Sin ambiente de pruebas de BIND:</strong> toda prueba de escritura será acotada, acordada previamente y observada, como se convino con el CTO.</li>
</ol>
</section>
<section class="sec">
<div class="sec-head"><div class="sec-num">06</div><div><h2>Condiciones</h2></div></div>
<p>Todo lo no modificado por esta adenda — condiciones comerciales (§3.3), garantía de 45 días, propiedad del código, metodología de desarrollo y supuestos generales — permanece en los términos de la propuesta v1.2 y del contrato de servicios firmado. La mención de Jira como "fuera de alcance" (§1.3 y Anexo A) queda sustituida por el alcance acotado que esta adenda define.</p>
</section>
<section class="sec">
<div class="sec-head"><div class="sec-num">07</div><div><h2>Aceptación</h2></div></div>
<p>Conforme a la §10 de la propuesta (control de cambios), esta adenda se ejecuta tras su <strong>aprobación por escrito</strong>; basta la confirmación por correo electrónico. No requiere un nuevo contrato.</p>
<div class="signoff">
<div class="nm">Johann Velazquez</div>
<div class="rl">Consultor de Software · Monterrey, Nuevo León</div>
</div>
</section>
</main>
</body>
</html>