Bitácora 8–30 jun: contrato firmado, plan de actividades y skill proposal-pdf
- Comunicaciones (REGISTRO #15–#21): respuesta v1.1 (10-jun), luz verde (16-jun), contrato (envío 25-jun, ajustes + firma 26-jun), arranque con Erika y kickoff 1-jul - Evidencia en fuentes/ (correos 8/10/16-jun, WhatsApp Paola y Erika) - Contratos (sin firmar y firmado) en propuesta/ - Plan de actividades Etapa 0–3 + guion del kickoff (planeacion/) - Skill proposal-pdf instalado (.claude/skills) + Propuesta-Balam.pdf regenerada - README/PENDIENTES al día; limpieza de archivos sueltos; .gitignore (locks de Office) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,31 @@
|
||||
{
|
||||
"_comment": "Worked example: A4 + cover logo + a long table that spans a page break + 'X / N' footer. Run: python3 scripts/build_pdf.py examples/example-a4.config.json",
|
||||
"input_html": "example-a4.html",
|
||||
"output_pdf": "Propuesta-Reservaciones-A4.pdf",
|
||||
"page_size": "A4",
|
||||
"cover_full_bleed": true,
|
||||
"metadata": {
|
||||
"title": "Propuesta — Plataforma de Reservaciones",
|
||||
"author": "Johann Velázquez",
|
||||
"subject": "Plataforma de reservaciones para Náutica del Norte",
|
||||
"keywords": "propuesta, reservaciones, software"
|
||||
},
|
||||
"footer": {
|
||||
"_comment": "skip_pages also skips the TOC (page 2) here; page_number_format shows X / N.",
|
||||
"text": "Propuesta · Plataforma de Reservaciones · Náutica del Norte — Confidencial",
|
||||
"skip_first_page": true,
|
||||
"skip_pages": [2],
|
||||
"page_number_format": "{page} / {pages}",
|
||||
"rule": true
|
||||
},
|
||||
"fonts": {
|
||||
"footer_ttf": "/usr/share/fonts/truetype/crosextra/Carlito-Regular.ttf"
|
||||
},
|
||||
"toc": {
|
||||
"execsum": "El objetivo de la primera etapa es centralizar",
|
||||
"1": "El reto principal del proyecto",
|
||||
"2": "El alcance se organiza en módulos",
|
||||
"3": "El proyecto se entrega bajo un esquema",
|
||||
"anexoA": "Este anexo detalla la cobertura"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,362 @@
|
||||
<!DOCTYPE html>
|
||||
<!--
|
||||
template.html — editorial proposal/report design system.
|
||||
|
||||
HOW TO USE
|
||||
• Replace the example content with yours. Keep the component markup/classes.
|
||||
• Every section that appears in the TOC gets a {{PG_key}} token in the TOC row
|
||||
AND a matching entry in pdf.config.json -> "toc" whose value is a UNIQUE
|
||||
phrase from that section's BODY (never the title — titles also render in the
|
||||
TOC and would match there first). build_pdf.py fills the tokens automatically.
|
||||
• The first page is a full-bleed cover thanks to @page:first { margin:0 }.
|
||||
• Footer (confidential line + page number) is stamped by build_pdf.py, not here.
|
||||
|
||||
COMPONENT CHEAT-SHEET (classes you can reuse)
|
||||
.cover .eyebrow/.rule/h1/.client/.meta-grid → cover page
|
||||
.toc + .toc-row(.section) → table of contents
|
||||
.sec + .sec-head/.sec-num/.kick → numbered section header
|
||||
.sec-head.no-num → header with no big number
|
||||
h3 > span.sn → sub-section heading (e.g. 2.1)
|
||||
table / th / td.k / td.num / td.cov / .ctr → tables (key cell, numeric, coverage)
|
||||
tr.total / tr.sub-total → emphasized table rows
|
||||
table.compact → tighter table for dense data
|
||||
.callout / .callout.cool → accent / navy info panels
|
||||
.flow + .chip(.accent) → pipeline / step diagram
|
||||
.synthesis + .stat → headline stat cards
|
||||
p.lede → opening paragraph
|
||||
p.drop → paragraph with drop cap
|
||||
p.mini-label → small uppercase label
|
||||
.etapa + .etapa-h → phase/stage block
|
||||
.signoff → closing signature
|
||||
.cover .logo (.txt | img.invert) → optional logo on the cover
|
||||
.break → start the block on a new page
|
||||
.keep / .no-break → keep a block from splitting across pages
|
||||
-->
|
||||
<html lang="es">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="author" content="Johann Velázquez">
|
||||
<title>Propuesta — Plataforma de Reservaciones</title>
|
||||
<style>
|
||||
:root{
|
||||
--ink:#1C2B39; /* deep navy — primary text + cover */
|
||||
--ink-soft:#33424F; /* secondary text */
|
||||
--muted:#6B7682; /* captions, footers */
|
||||
--accent:#BC5B3E; /* terracotta — the single accent */
|
||||
--accent-d:#9E4A30; /* darker terracotta for emphasis on tint */
|
||||
--accent-tint:#F6E9E3; /* faint terracotta fill */
|
||||
--cream:#F4EFEA; /* warm panel fill */
|
||||
--line:#D9DEE3; /* hairlines */
|
||||
--serif:"Caladea", Georgia, "Times New Roman", serif;
|
||||
--sans:"Carlito", "Helvetica Neue", Arial, sans-serif;
|
||||
--mono:"DejaVu Sans Mono", "SFMono-Regular", Consolas, monospace;
|
||||
}
|
||||
|
||||
/* For A4: change size to A4 here AND set "page_size":"A4" in pdf.config.json. */
|
||||
@page{ size:A4; margin:15mm 16mm 18mm 16mm; }
|
||||
@page :first{ margin:0; } /* full-bleed cover */
|
||||
|
||||
*{ box-sizing:border-box; }
|
||||
html,body{ margin:0; padding:0; }
|
||||
body{
|
||||
font-family:var(--sans); color:var(--ink-soft);
|
||||
font-size:10pt; line-height:1.5;
|
||||
-webkit-print-color-adjust:exact; print-color-adjust:exact;
|
||||
}
|
||||
p{ margin:0 0 7pt; }
|
||||
strong,b{ color:var(--ink); font-weight:700; }
|
||||
em{ font-style:italic; }
|
||||
code{
|
||||
font-family:var(--mono); font-size:8.6pt;
|
||||
background:var(--cream); padding:.5pt 3pt; border-radius:2pt; color:var(--ink);
|
||||
}
|
||||
a{ color:var(--accent-d); text-decoration:none; }
|
||||
|
||||
/* ---------- 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,.cover .mid,.cover .meta{ position:relative; z-index:2; }
|
||||
.cover .rule{ width:46pt; height:3pt; background:var(--accent); margin-bottom:14pt; }
|
||||
.cover .eyebrow{
|
||||
font-size:9pt; letter-spacing:.32em; text-transform:uppercase; color:#9FB0BF; font-weight:700;
|
||||
}
|
||||
/* Optional logo slot (top of cover). Use a text mark or an <img>.
|
||||
.invert flips a dark logo to white for the navy cover. */
|
||||
.cover .logo{ margin-bottom:16pt; }
|
||||
.cover .logo .txt{ font-family:var(--serif); font-weight:700; font-size:14pt; color:#fff; letter-spacing:.01em; }
|
||||
.cover .logo img{ height:30pt; width:auto; }
|
||||
.cover .logo img.invert{ filter:brightness(0) invert(1); opacity:.92; }
|
||||
.cover .mid{ 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 .confidential{
|
||||
margin-top:18pt; display:flex; justify-content:space-between;
|
||||
font-size:8pt; letter-spacing:.18em; text-transform:uppercase; color:#7E8C99;
|
||||
}
|
||||
.meta-grid{ display:grid; grid-template-columns:34mm 1fr; gap:6pt 10pt; margin:0; font-size:9.2pt; }
|
||||
.meta-grid dt{ color:#8A98A5; text-transform:uppercase; letter-spacing:.12em; font-size:7.6pt; padding-top:1.5pt; }
|
||||
.meta-grid dd{ margin:0; color:#D7DDE2; }
|
||||
.meta-grid dd .who{ display:block; }
|
||||
.meta-grid dd .who b{ color:#FFFFFF; font-weight:700; }
|
||||
.meta-grid dd .who span{ color:#9FB0BF; }
|
||||
|
||||
/* ---------- TOC ---------- */
|
||||
.toc{ break-before:page; padding-top:6mm; }
|
||||
.kick{ font-size:8.5pt; letter-spacing:.28em; text-transform:uppercase; color:var(--accent); font-weight:700; }
|
||||
.toc h2{ font-family:var(--serif); font-size:26pt; font-weight:700; color:var(--ink); margin:2pt 0 4pt; }
|
||||
.toc .bar{ width:40pt; height:3pt; background:var(--accent); margin:6pt 0 16pt; }
|
||||
.toc-row{ display:flex; align-items:baseline; gap:8pt; padding:7pt 0; border-bottom:.6pt solid var(--line); font-size:10.5pt; }
|
||||
.toc-row .n{ width:22pt; color:var(--accent); font-weight:700; font-variant-numeric:tabular-nums; }
|
||||
.toc-row .t{ color:var(--ink); }
|
||||
.toc-row.section .t{ font-weight:700; }
|
||||
.toc-row .dots{ flex:1; border-bottom:1pt dotted var(--line); transform:translateY(-3pt); }
|
||||
.toc-row .pg{ color:var(--muted); font-variant-numeric:tabular-nums; }
|
||||
|
||||
/* ---------- SECTIONS ---------- */
|
||||
.content{ break-before:page; }
|
||||
.sec{ margin-bottom:14pt; }
|
||||
.sec-head{ display:flex; gap:12pt; align-items:flex-start; border-bottom:1.4pt solid var(--ink); padding-bottom:6pt; margin:0 0 11pt; }
|
||||
.sec-head .sec-num{ font-family:var(--serif); font-size:30pt; font-weight:700; line-height:.9; color:var(--accent); min-width:42pt; }
|
||||
.sec-head h2{ font-family:var(--serif); font-size:19pt; font-weight:700; color:var(--ink); margin:4pt 0 0; }
|
||||
.sec-head .kick{ display:block; margin-bottom:2pt; }
|
||||
.sec-head.no-num{ border-bottom-width:1.4pt; }
|
||||
.sec-head.no-num h2{ margin-top:0; }
|
||||
|
||||
h3{ font-family:var(--sans); font-size:11.5pt; font-weight:700; color:var(--ink); margin:13pt 0 5pt; }
|
||||
h3 .sn{ color:var(--accent); font-weight:700; margin-right:7pt; }
|
||||
h4{ font-family:var(--sans); font-size:9.5pt; font-weight:700; color:var(--ink-soft); text-transform:uppercase; letter-spacing:.06em; margin:10pt 0 3pt; }
|
||||
|
||||
p.lede{ font-size:11pt; color:var(--ink-soft); }
|
||||
p.drop::first-letter{
|
||||
font-family:var(--serif); font-size:34pt; font-weight:700; color:var(--accent);
|
||||
float:left; line-height:.82; padding:2pt 6pt 0 0;
|
||||
}
|
||||
p.mini-label{ font-size:8pt; letter-spacing:.12em; text-transform:uppercase; color:var(--accent-d); font-weight:700; margin:9pt 0 1pt; }
|
||||
|
||||
ul,ol{ margin:4pt 0 8pt; padding-left:16pt; }
|
||||
li{ margin:0 0 3.5pt; padding-left:2pt; }
|
||||
li::marker{ color:var(--accent); }
|
||||
|
||||
/* ---------- TABLES ---------- */
|
||||
table{ width:100%; border-collapse:collapse; margin:10pt 0; font-size:9.2pt; }
|
||||
thead th{
|
||||
text-align:left; font-size:7.8pt; letter-spacing:.07em; text-transform:uppercase;
|
||||
color:#FFFFFF; background:var(--ink); padding:5pt 8pt; font-weight:700;
|
||||
}
|
||||
thead th.num,thead th.ctr{ text-align:right; }
|
||||
thead th.ctr{ text-align:center; }
|
||||
tbody td{ padding:5.5pt 8pt; border-bottom:.6pt solid var(--line); vertical-align:top; }
|
||||
tbody tr:nth-child(even) td{ background:#FBFAF8; }
|
||||
td.k{ color:var(--ink); font-weight:600; }
|
||||
.num,th.num{ text-align:right; font-variant-numeric:tabular-nums; white-space:nowrap; }
|
||||
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); }
|
||||
td.cov{ font-size:11pt; text-align:center; line-height:1; }
|
||||
table.compact tbody td{ padding:4pt 8pt; }
|
||||
table.compact{ font-size:8.8pt; }
|
||||
|
||||
/* ---------- CALLOUTS ---------- */
|
||||
.callout{
|
||||
background:var(--accent-tint); border-left:3pt solid var(--accent);
|
||||
padding:9pt 12pt; margin:10pt 0; font-size:9.4pt; color:var(--ink-soft); border-radius:0 3pt 3pt 0;
|
||||
}
|
||||
.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 / PIPELINE ---------- */
|
||||
.flow{ display:flex; flex-wrap:wrap; align-items:center; gap:5pt; margin:10pt 0; }
|
||||
.flow .chip{
|
||||
background:#fff; border:1pt solid var(--line); border-radius:4pt;
|
||||
padding:4pt 9pt; font-size:8.6pt; font-weight:600; color:var(--ink-soft); white-space:nowrap;
|
||||
}
|
||||
.flow .chip.accent{ background:var(--accent); border-color:var(--accent); color:#fff; }
|
||||
.flow .arrow{ color:var(--accent); font-weight:700; }
|
||||
|
||||
/* ---------- SYNTHESIS STATS ---------- */
|
||||
.synthesis{ display:flex; gap:10pt; margin:12pt 0; }
|
||||
.synthesis .stat{ flex:1; background:var(--ink); color:#EAEDF0; border-radius:5pt; padding:11pt 13pt; }
|
||||
.synthesis .stat .big{ font-family:var(--serif); font-size:21pt; font-weight:700; color:#fff; line-height:1; }
|
||||
.synthesis .stat .lab{ font-size:8pt; letter-spacing:.08em; text-transform:uppercase; color:#9FB0BF; margin-top:4pt; }
|
||||
|
||||
/* ---------- PHASE / STAGE ---------- */
|
||||
.etapa{ border:1pt solid var(--line); border-left:3pt solid var(--accent); border-radius:0 4pt 4pt 0; padding:9pt 12pt; margin:8pt 0; }
|
||||
.etapa-h{ font-weight:700; color:var(--ink); font-size:10pt; margin-bottom:3pt; }
|
||||
.etapa-h .tag{ float:right; font-size:8pt; color:var(--muted); font-weight:600; }
|
||||
|
||||
/* ---------- SIGNOFF ---------- */
|
||||
.signoff{ margin-top:18pt; padding-top:10pt; border-top:1.4pt solid var(--ink); }
|
||||
.signoff .nm{ font-family:var(--serif); font-size:14pt; font-weight:700; color:var(--ink); }
|
||||
.signoff .rl{ font-size:8.5pt; color:var(--muted); letter-spacing:.04em; }
|
||||
|
||||
/* ---------- PRINT SAFETY (keep these) ---------- */
|
||||
/* Don't strand a heading at the bottom of a page, just above its body. */
|
||||
h2,h3,h4,.sec-head{ break-after:avoid; }
|
||||
/* Repeat table header rows when a long table spans a page break, and never
|
||||
split an individual row, callout, card, phase block or the sign-off. */
|
||||
thead{ display:table-header-group; }
|
||||
tfoot{ display:table-footer-group; }
|
||||
tr{ break-inside:avoid; }
|
||||
.callout,.synthesis,.synthesis .stat,.etapa,.flow,.signoff,figure,img{ break-inside:avoid; }
|
||||
/* Utilities: .keep keeps a block together; .break starts a new page. */
|
||||
.keep,.no-break{ break-inside:avoid; }
|
||||
.break{ break-before:page; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<!-- ============================= COVER ============================= -->
|
||||
<section class="cover">
|
||||
<div class="top">
|
||||
<div class="logo"><span class="txt">BRÚJULA</span></div>
|
||||
<div class="rule"></div>
|
||||
<div class="eyebrow">Propuesta Comercial</div>
|
||||
</div>
|
||||
|
||||
<div class="mid">
|
||||
<h1>Plataforma de<br>Reservaciones</h1>
|
||||
<div class="client">Preparada para <b>Náutica del Norte</b></div>
|
||||
</div>
|
||||
|
||||
<div class="meta">
|
||||
<dl class="meta-grid">
|
||||
<dt>Preparada por</dt>
|
||||
<dd>Johann Velázquez — Consultor de Software · Monterrey, N.L.</dd>
|
||||
<dt>Fecha</dt>
|
||||
<dd>16 de junio de 2026</dd>
|
||||
<dt>Versión</dt>
|
||||
<dd>1.0</dd>
|
||||
<dt>Vigencia</dt>
|
||||
<dd>30 días naturales a partir de la fecha de emisión</dd>
|
||||
</dl>
|
||||
<div class="confidential">
|
||||
<span>Documento confidencial</span>
|
||||
<span>Tamaño A4</span>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- ============================= TOC ============================= -->
|
||||
<section class="toc">
|
||||
<div class="kick">Contenido</div>
|
||||
<h2>Índice</h2>
|
||||
<div class="bar"></div>
|
||||
<div class="toc-row"><span class="n">—</span><span class="t">Resumen ejecutivo</span><span class="dots"></span><span class="pg">{{PG_execsum}}</span></div>
|
||||
<div class="toc-row section"><span class="n">01</span><span class="t">Entendimiento del proyecto</span><span class="dots"></span><span class="pg">{{PG_1}}</span></div>
|
||||
<div class="toc-row section"><span class="n">02</span><span class="t">Alcance y requerimientos</span><span class="dots"></span><span class="pg">{{PG_2}}</span></div>
|
||||
<div class="toc-row section"><span class="n">03</span><span class="t">Inversión y modelo</span><span class="dots"></span><span class="pg">{{PG_3}}</span></div>
|
||||
<div class="toc-row section"><span class="n">A</span><span class="t">Anexo A — Cobertura por módulo</span><span class="dots"></span><span class="pg">{{PG_anexoA}}</span></div>
|
||||
</section>
|
||||
|
||||
<!-- ============================= BODY ============================= -->
|
||||
<main class="content">
|
||||
|
||||
<section class="sec">
|
||||
<div class="sec-head no-num"><div><span class="kick">Resumen</span><h2>Resumen ejecutivo</h2></div></div>
|
||||
<p class="drop">Esta propuesta resume el alcance, la inversión y el modelo de colaboración para construir una plataforma de reservaciones para Náutica del Norte, que hoy gestiona sus reservas por teléfono y hojas de cálculo. El objetivo de la primera etapa es centralizar la disponibilidad, el cobro y la confirmación en una sola herramienta, reduciendo el trabajo manual y los errores de doble reserva.</p>
|
||||
|
||||
<div class="synthesis">
|
||||
<div class="stat"><div class="big">6 sem</div><div class="lab">Plazo estimado</div></div>
|
||||
<div class="stat"><div class="big">$72K</div><div class="lab">Inversión (MXN)</div></div>
|
||||
<div class="stat"><div class="big">24</div><div class="lab">Requerimientos</div></div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="sec">
|
||||
<div class="sec-head"><div class="sec-num">01</div><div><h2>Entendimiento del proyecto</h2></div></div>
|
||||
<p class="lede">El reto principal del proyecto es eliminar la coordinación manual de reservas sin interrumpir la operación durante temporada alta.</p>
|
||||
<p>El flujo objetivo conecta la disponibilidad de embarcaciones con el cobro y la confirmación automática al cliente:</p>
|
||||
<div class="flow">
|
||||
<span class="chip">Disponibilidad</span><span class="arrow">→</span>
|
||||
<span class="chip">Reserva</span><span class="arrow">→</span>
|
||||
<span class="chip accent">Cobro</span><span class="arrow">→</span>
|
||||
<span class="chip">Confirmación</span><span class="arrow">→</span>
|
||||
<span class="chip">Recordatorio</span>
|
||||
</div>
|
||||
<div class="callout cool"><strong>Prioridad de la primera etapa:</strong> disponibilidad, reserva y cobro en línea. La conciliación contable y el programa de lealtad se difieren a fases posteriores.</div>
|
||||
</section>
|
||||
|
||||
<section class="sec">
|
||||
<div class="sec-head"><div class="sec-num">02</div><div><h2>Alcance y requerimientos</h2></div></div>
|
||||
<p>El alcance se organiza en módulos. La siguiente matriz lista los requerimientos funcionales de la primera etapa; es deliberadamente extensa para mostrar cómo una tabla larga reparte sus filas entre páginas repitiendo el encabezado.</p>
|
||||
<table class="compact">
|
||||
<thead><tr><th style="width:46pt;">ID</th><th>Requerimiento</th><th>Módulo</th><th class="ctr" style="width:54pt;">Prioridad</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td class="k">RF-01</td><td>Calendario de disponibilidad por embarcación</td><td>Reservas</td><td class="ctr">Alta</td></tr>
|
||||
<tr><td class="k">RF-02</td><td>Bloqueo de horarios por mantenimiento</td><td>Reservas</td><td class="ctr">Alta</td></tr>
|
||||
<tr><td class="k">RF-03</td><td>Reserva con selección de fecha, hora y duración</td><td>Reservas</td><td class="ctr">Alta</td></tr>
|
||||
<tr><td class="k">RF-04</td><td>Reglas de anticipación mínima y máxima</td><td>Reservas</td><td class="ctr">Media</td></tr>
|
||||
<tr><td class="k">RF-05</td><td>Cupos y capacidad por embarcación</td><td>Reservas</td><td class="ctr">Alta</td></tr>
|
||||
<tr><td class="k">RF-06</td><td>Cobro en línea con tarjeta</td><td>Pagos</td><td class="ctr">Alta</td></tr>
|
||||
<tr><td class="k">RF-07</td><td>Cobro de anticipo configurable</td><td>Pagos</td><td class="ctr">Media</td></tr>
|
||||
<tr><td class="k">RF-08</td><td>Reembolsos y cancelaciones con política</td><td>Pagos</td><td class="ctr">Media</td></tr>
|
||||
<tr><td class="k">RF-09</td><td>Comprobante de pago al cliente</td><td>Pagos</td><td class="ctr">Alta</td></tr>
|
||||
<tr><td class="k">RF-10</td><td>Confirmación automática por correo</td><td>Notificaciones</td><td class="ctr">Alta</td></tr>
|
||||
<tr><td class="k">RF-11</td><td>Recordatorio previo a la reserva</td><td>Notificaciones</td><td class="ctr">Media</td></tr>
|
||||
<tr><td class="k">RF-12</td><td>Notificación de cambios o cancelación</td><td>Notificaciones</td><td class="ctr">Media</td></tr>
|
||||
<tr><td class="k">RF-13</td><td>Registro y autenticación de clientes</td><td>Clientes</td><td class="ctr">Alta</td></tr>
|
||||
<tr><td class="k">RF-14</td><td>Historial de reservas del cliente</td><td>Clientes</td><td class="ctr">Media</td></tr>
|
||||
<tr><td class="k">RF-15</td><td>Datos de contacto y preferencias</td><td>Clientes</td><td class="ctr">Baja</td></tr>
|
||||
<tr><td class="k">RF-16</td><td>Panel de operación con agenda del día</td><td>Operación</td><td class="ctr">Alta</td></tr>
|
||||
<tr><td class="k">RF-17</td><td>Reprogramación manual desde el panel</td><td>Operación</td><td class="ctr">Media</td></tr>
|
||||
<tr><td class="k">RF-18</td><td>Lista blanca de clientes frecuentes</td><td>Operación</td><td class="ctr">Baja</td></tr>
|
||||
<tr><td class="k">RF-19</td><td>Reporte de ocupación por periodo</td><td>Reportes</td><td class="ctr">Media</td></tr>
|
||||
<tr><td class="k">RF-20</td><td>Reporte de ingresos por embarcación</td><td>Reportes</td><td class="ctr">Media</td></tr>
|
||||
<tr><td class="k">RF-21</td><td>Exportación a Excel</td><td>Reportes</td><td class="ctr">Baja</td></tr>
|
||||
<tr><td class="k">RF-22</td><td>Roles y permisos (admin / operador)</td><td>Seguridad</td><td class="ctr">Alta</td></tr>
|
||||
<tr><td class="k">RF-23</td><td>Bitácora de cambios</td><td>Seguridad</td><td class="ctr">Media</td></tr>
|
||||
<tr><td class="k">RF-24</td><td>Respaldo automático de la base de datos</td><td>Seguridad</td><td class="ctr">Alta</td></tr>
|
||||
<tr class="total"><td>Total</td><td>24 requerimientos en 7 módulos</td><td colspan="2" class="num">Etapa 1</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<div class="callout">La matriz completa de requerimientos no funcionales (rendimiento, seguridad y disponibilidad) se acuerda en el Discovery y se anexa al contrato.</div>
|
||||
</section>
|
||||
|
||||
<section class="sec">
|
||||
<div class="sec-head"><div class="sec-num">03</div><div><h2>Inversión y modelo</h2></div></div>
|
||||
<p>El proyecto se entrega bajo un esquema de tiempo y materiales con tope por etapa, a una tarifa de $600 MXN/h + IVA.</p>
|
||||
<table>
|
||||
<thead><tr><th>Etapa</th><th>Entregable</th><th class="num">Horas</th><th class="num">Inversión (MXN)</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td class="k">0</td><td>Discovery y arquitectura</td><td class="num">20</td><td class="num">$12,000</td></tr>
|
||||
<tr><td class="k">1</td><td>Reservas y disponibilidad</td><td class="num">36</td><td class="num">$21,600</td></tr>
|
||||
<tr><td class="k">2</td><td>Pagos y notificaciones</td><td class="num">34</td><td class="num">$20,400</td></tr>
|
||||
<tr><td class="k">3</td><td>Operación, reportes y cierre</td><td class="num">30</td><td class="num">$18,000</td></tr>
|
||||
<tr class="total"><td>Total</td><td>Primera etapa</td><td class="num">120 h</td><td class="num">$72,000</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<div class="signoff">
|
||||
<div class="nm">Johann Velázquez</div>
|
||||
<div class="rl">Consultor de Software · Monterrey, Nuevo León</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="sec break">
|
||||
<div class="sec-head"><div class="sec-num">A</div><div><span class="kick">Anexo</span><h2>Cobertura por módulo</h2></div></div>
|
||||
<p class="lede">Este anexo detalla la cobertura de cada módulo en la primera etapa.</p>
|
||||
<table>
|
||||
<thead><tr><th>Módulo</th><th class="ctr" style="width:62pt;">Cobertura</th><th>Detalle</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td class="k">Reservas</td><td class="cov">✅</td><td>Disponibilidad, reserva, cupos y reglas de anticipación.</td></tr>
|
||||
<tr><td class="k">Pagos</td><td class="cov">✅</td><td>Cobro con tarjeta, anticipo y comprobante.</td></tr>
|
||||
<tr><td class="k">Conciliación contable</td><td class="cov">❌</td><td>Diferida a fase posterior.</td></tr>
|
||||
<tr><td class="k">Lealtad</td><td class="cov">❌</td><td>Diferida a fase posterior.</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</section>
|
||||
|
||||
</main>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user