diff --git a/planeacion/Horas-etapas-Balam-2026-07-28.xlsx b/planeacion/Horas-etapas-Balam-2026-07-28.xlsx new file mode 100644 index 0000000..d664396 Binary files /dev/null and b/planeacion/Horas-etapas-Balam-2026-07-28.xlsx differ diff --git a/planeacion/generar_horas_etapas_2026_07_28.py b/planeacion/generar_horas_etapas_2026_07_28.py new file mode 100644 index 0000000..04168fb --- /dev/null +++ b/planeacion/generar_horas_etapas_2026_07_28.py @@ -0,0 +1,187 @@ +"""Genera Horas-etapas-Balam-2026-07-28.xlsx — resumen de horas POR ETAPA para Erika. + +Pedido por Erika el 27-jul (6:46 pm: "las ya completas más que nada para ver +cuántas son") y aclarado el 28-jul (8:36 am): el Excel es el insumo del conteo +de horas de cada etapa "sobre todo para la FACTURACIÓN correspondiente". + +Las horas trabajadas se leen del Excel interno (`Plan-actividades-avance-2026-07-27.xlsx`), +que a su vez sale de `Seguimiento-horas.csv` — una sola fuente de datos, igual que +`generar_resumen_erika_2026_07_27.py`. Los rangos estimados y montos son los +contractuales de la propuesta v1.2 (§4) y de la Adenda 01 (Jira → BIND). +""" +import os +from datetime import date + +import openpyxl +from openpyxl.styles import Alignment, Border, Font, PatternFill, Side +from openpyxl.utils import get_column_letter + +BASE = os.path.dirname(os.path.abspath(__file__)) +SRC = os.path.join(BASE, "Plan-actividades-avance-2026-07-27.xlsx") +DST = os.path.join(BASE, "Horas-etapas-Balam-2026-07-28.xlsx") +EMISION = date(2026, 7, 28) # fecha de emisión; horas al corte del lunes 27-jul +TARIFA = 600 # MXN/h + IVA (propuesta v1.2 §3.3) + +# Marca Balam +CAFE, AMARILLO, CREMA = "331F0E", "F7BD0C", "FDF3D8" +V_FILL, V_FONT = "C6EFCE", "006100" # verde +A_FILL, A_FONT = "FFEB9C", "9C6500" # amarillo +GRIS = "595959" +BORDE = "D9D9D9" + +thin = Side(style="thin", color=BORDE) +box = Border(left=thin, right=thin, top=thin, bottom=thin) + +# --- Horas trabajadas desde el Excel interno (única fuente) ------------------- +wsrc = openpyxl.load_workbook(SRC).active +trab = {} +for row in range(2, wsrc.max_row + 1): + nombre = str(wsrc.cell(row=row, column=1).value or "").strip() + if nombre.startswith(("Etapa 0", "Etapa 1", "Integracion")): + clave = "TOTAL" if nombre.startswith("Integracion") else nombre.split(" ")[0] + nombre.split(" ")[1] + trab[clave] = float(wsrc.cell(row=row, column=10).value or 0) + +E0, E1, TOTAL = trab["Etapa0"], trab["Etapa1"], trab["TOTAL"] +assert abs((E0 + E1) - TOTAL) < 0.01, f"Horas no cuadran: {E0} + {E1} != {TOTAL}" + +# --- Filas del resumen -------------------------------------------------------- +# (etapa, estatus, kind_estatus, est_min, est_max, trabajadas o None) +ETAPAS = [ + ("Etapa 0 — Discovery, infraestructura y prototipo visual", + "✅ Completada y validada (24-jul)", "ok", 18, 22, E0), + ("Etapa 1 — Plataforma base y sincronización con BIND", + "🟡 En curso · 6 de 8 entregables terminados", "curso", 32, 39, E1), + ("Etapa 2 — Facturación (consulta y emisión), catálogo y multimoneda", + "⚪ Próxima", "prox", 38, 46, None), + ("Etapa 3 — Cobranza, tablero, reportes y cierre", + "⚪ Próxima", "prox", 24, 29, None), +] +ADENDA = ("Adicional — Integración Jira → BIND (Adenda 01)", + "📋 En aprobación · no estaba en la propuesta original", "prox", 9, 12, None) + +SUB_MIN = sum(e[3] for e in ETAPAS) # 112 +SUB_MAX = sum(e[4] for e in ETAPAS) # 136 +TOT_MIN, TOT_MAX = SUB_MIN + ADENDA[3], SUB_MAX + ADENDA[4] # 121, 148 + + +def dinero(h): + return f"${h * TARIFA:,.0f}" + + +def rango_dinero(lo, hi): + return f"{dinero(lo)} – {dinero(hi)}" + + +# --- Construcción ------------------------------------------------------------- +wb = openpyxl.Workbook() +ws = wb.active +ws.title = "Horas por etapa" + +ws["A1"] = "Proyecto Balam · Plataforma de Automatización Financiera" +ws["A1"].font = Font(bold=True, size=14, color=CAFE) +ws["A2"] = ("Horas por etapa — emitido el 28-jul-2026 · horas trabajadas al corte " + "del lunes 27-jul-2026 · tarifa $600 MXN/h + IVA") +ws["A2"].font = Font(size=10, italic=True, color=GRIS) + +ENC = ["Etapa", "Estatus", "Horas estimadas", "Horas trabajadas\n(al 27-jul)", + "Importe estimado\n(MXN, antes de IVA)"] +ANCHOS = [52, 34, 15, 15, 20] +FILA_ENC = 4 + +for i, (txt, ancho) in enumerate(zip(ENC, ANCHOS), start=1): + c = ws.cell(row=FILA_ENC, column=i, value=txt) + c.font = Font(bold=True, size=10, color=CAFE) + c.fill = PatternFill("solid", fgColor=AMARILLO) + c.alignment = Alignment(horizontal="center", vertical="center", wrap_text=True) + c.border = box + ws.column_dimensions[get_column_letter(i)].width = ancho +ws.row_dimensions[FILA_ENC].height = 28 + + +def fila(r, nombre, estatus, kind, est, trabajadas, importe, bold=False, fill=None): + c = ws.cell(row=r, column=1, value=nombre) + c.font = Font(bold=bold, size=10, color=CAFE) + c.alignment = Alignment(vertical="center", wrap_text=True) + + cs = ws.cell(row=r, column=2, value=estatus) + cs.font = Font(size=9, color=GRIS) + cs.alignment = Alignment(vertical="center", wrap_text=True) + if kind == "ok": + cs.font = Font(size=9, color=V_FONT); cs.fill = PatternFill("solid", fgColor=V_FILL) + elif kind == "curso": + cs.font = Font(size=9, color=A_FONT); cs.fill = PatternFill("solid", fgColor=A_FILL) + + ce = ws.cell(row=r, column=3, value=est) + ce.font = Font(bold=bold, size=10, color=CAFE) + ce.alignment = Alignment(horizontal="center", vertical="center") + + ct = ws.cell(row=r, column=4, value=trabajadas if trabajadas is not None else "—") + if trabajadas is not None: + ct.number_format = "0.00" + ct.font = Font(bold=bold or trabajadas is not None, size=10, color=CAFE) + ct.alignment = Alignment(horizontal="center", vertical="center") + + ci = ws.cell(row=r, column=5, value=importe) + ci.font = Font(bold=bold, size=10, color=CAFE) + ci.alignment = Alignment(horizontal="right", vertical="center") + + for col in range(1, 6): + ws.cell(row=r, column=col).border = box + if fill: + ws.cell(row=r, column=col).fill = PatternFill("solid", fgColor=fill) + ws.row_dimensions[r].height = 26 + + +r = FILA_ENC + 1 +for nombre, estatus, kind, lo, hi, t in ETAPAS: + fila(r, nombre, estatus, kind, f"{lo} – {hi}", t, rango_dinero(lo, hi)) + r += 1 + +fila(r, "Subtotal — propuesta v1.2", "", "sub", f"{SUB_MIN} – {SUB_MAX}", TOTAL, + rango_dinero(SUB_MIN, SUB_MAX), bold=True, fill=CREMA) +r += 1 + +nombre, estatus, kind, lo, hi, t = ADENDA +fila(r, nombre, estatus, kind, f"{lo} – {hi}", t, rango_dinero(lo, hi)) +r += 1 + +fila(r, "Total con Adenda 01", "", "tot", f"{TOT_MIN} – {TOT_MAX}", TOTAL, + rango_dinero(TOT_MIN, TOT_MAX), bold=True, fill=CREMA) +r += 2 + +# --- Notas -------------------------------------------------------------------- +notas = [ + f"Horas trabajadas al corte del lunes 27-jul-2026, del control de horas del proyecto " + f"(mismas cifras del Excel de avance enviado el 27-jul): Etapa 0 {E0:.2f} h · " + f"Etapa 1 {E1:.2f} h · total {TOTAL:.2f} h.", + f"La Etapa 0 cerró en {E0:.2f} h, dentro del rango contractual de 18–22 h " + f"(a $600/h: {dinero(E0)} antes de IVA).", + "Referencia de facturación (propuesta v1.2, §3.3): la facturación inicial es de 30 h — " + "$18,000 + IVA — y cubre la Etapa 0 completa más el inicio de la Etapa 1; se emite en " + "cuanto se confirme el visto bueno. Los avances posteriores se facturan semanalmente " + "(viernes) por horas efectivamente trabajadas, con pago a 30 días naturales.", + "La integración Jira → BIND no estaba contemplada en la propuesta original; se " + "formaliza en la Adenda 01 (compartida el 28-jul) y se ejecuta tras su aprobación " + "por escrito.", + "Los rangos de horas operan con tope por etapa: al aproximarse al máximo, el trabajo " + "se detiene y se revisa el alcance antes de continuar.", +] +for txt in notas: + c = ws.cell(row=r, column=1, value=txt) + c.font = Font(italic=True, size=9, color=CAFE) + c.alignment = Alignment(wrap_text=True, vertical="top") + ws.merge_cells(start_row=r, start_column=1, end_row=r, end_column=5) + ws.row_dimensions[r].height = 28 if len(txt) > 120 else 16 + r += 1 + +ws.freeze_panes = f"A{FILA_ENC + 1}" +ws.sheet_view.showGridLines = False +ws.print_area = f"A1:E{r}" +ws.page_setup.orientation = "landscape" +ws.page_setup.fitToWidth = 1 +ws.sheet_properties.pageSetUpPr.fitToPage = True + +wb.save(DST) +print("OK ->", DST) +print(f" E0 {E0:.2f} h · E1 {E1:.2f} h · total {TOTAL:.2f} h · " + f"v1.2 {SUB_MIN}–{SUB_MAX} h · con adenda {TOT_MIN}–{TOT_MAX} h") diff --git a/propuesta/01 - ADENDA-INTEGRACION-JIRA.md b/propuesta/01 - ADENDA-INTEGRACION-JIRA.md new file mode 100644 index 0000000..047deef --- /dev/null +++ b/propuesta/01 - ADENDA-INTEGRACION-JIRA.md @@ -0,0 +1,66 @@ +# Adenda 01 — Integración Jira → BIND +## Generación automática de cotizaciones desde los tickets de facturación + +| | | +|---|---| +| **Preparada para** | Noe Rocha (CTO) · Araceli Sánchez Jiménez (CEO/Operaciones) · Erika Chávez (PM) · Pedro Alberto Ayala Elizondo (Contacto técnico) | +| **Preparada por** | Johann Velazquez — Consultor de Software · Monterrey, N.L. | +| **Fecha** | 28 de julio de 2026 | +| **Documento** | Adenda 01 a la Propuesta Comercial v1.2 — solicitud de cambio conforme a la §10 (control de cambios) | +| **Vigencia** | 30 días naturales a partir de la fecha de emisión | + +--- + +## 1. Antecedente + +La propuesta v1.2 dejó Jira explícitamente **fuera del alcance** 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ó: **hoy todo el flujo de facturación de Balam nace y se gobierna en Jira** — *"lo que no está en Jira no se procesa"* — con una bandeja dedicada (**Facturación**, llave `FAC-`) y un flujo de estatus formal que culmina en "resuelto". + +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 **lectura y escritura** de tickets, se entregó el token de integración (**"PAF"**, vigente al 27-jul-2027) y se documentaron los límites de consumo del lado de Atlassian. La estimación preliminar (~10 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. + +## 2. Alcance del cambio + +La integración agrega a la primera etapa las siguientes capacidades: + +1. **Conexión con la API de Jira** mediante el token PAF y lectura de los tickets de la bandeja **Facturación (`FAC-`)**, con consumo autorregulado conforme a los límites de velocidad documentados por Atlassian. +2. **Generación automática de la cotización en BIND** 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 **capa de escritura controlada** del MVP. +3. **Trazabilidad ticket ↔ cotización ↔ prefactura/factura**, visible en la plataforma y registrada en la bitácora de auditoría. Los tickets leídos alimentan además la vista *"qué necesita atención"* del tablero. +4. **Pruebas controladas:** scripts de consulta y de creación/edición sobre un registro de prueba, y una **prueba observada** 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). + +> **El control fiscal no cambia.** La integración crea **cotizaciones, nunca facturas**: se mantiene la cadena acordada — cotización → prefactura → **aprobación humana** → timbrado por el PAC de BIND — con modo de simulación (*dry-run*), feature flag y registro en bitácora. No existe timbrado automático. + +## 3. Qué no incluye + +- **Alta automática de clientes en BIND.** Si el cliente del ticket no existe en BIND, la plataforma lo **detecta y lo notifica**; darlo de alta automáticamente es una decisión de proceso aún abierta y, de aprobarse, se estima por separado. +- **Tickets con múltiples facturas.** El supuesto de esta adenda es *un ticket → una cotización*. 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. +- **Otros usos de Jira** — 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. + +## 4. Estimación e inversión + +| Concepto | Horas | Inversión (MXN) | +|---|---|---| +| Integración Jira → BIND: lectura de la bandeja FAC, disparador por estatus, cotización automática, trazabilidad y pruebas | 9 – 12 | $5,400 – $7,200 | + +- **Tarifa vigente:** $600 MXN/h + IVA (§3.3). El rango es consistente con la estimación de ~10 h comunicada el 21 de julio y opera bajo el mismo esquema de horas reales **con tope**: al aproximarse al máximo, el trabajo se detiene y se revisa con Balam. +- **Facturación:** como el resto de los avances — semanal (viernes) por horas efectivamente trabajadas, con pago a 30 días naturales. +- **Efecto en el total de la primera etapa:** de 112 – 136 h ($67,200 – $81,600) pasa a **121 – 148 h ($72,600 – $88,800)**, antes de IVA. + +## 5. Supuestos y dependencias + +1. **Definición del flujo de facturación** 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. +2. **Token PAF vigente** 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. +3. **Diagrama del flujo Jira de facturación** en tamaño legible (comprometido por Balam en la sesión del 22 de julio). +4. **Bandeja FAC como fuente.** 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. +5. **Sin ambiente de pruebas de BIND:** toda prueba de escritura será acotada, acordada previamente y observada, como se convino con el CTO. + +## 6. Condiciones + +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. + +## 7. Aceptación + +Conforme a la §10 de la propuesta (control de cambios), esta adenda se ejecuta tras su **aprobación por escrito**; basta la confirmación por correo electrónico. No requiere un nuevo contrato. + +--- + +**Johann Velazquez** · Consultor de Software +Monterrey, Nuevo León diff --git a/propuesta/Adenda-01-Integracion-Jira-Balam.pdf b/propuesta/Adenda-01-Integracion-Jira-Balam.pdf new file mode 100644 index 0000000..bee4600 Binary files /dev/null and b/propuesta/Adenda-01-Integracion-Jira-Balam.pdf differ diff --git a/propuesta/Adenda-01-Integracion-Jira.html b/propuesta/Adenda-01-Integracion-Jira.html new file mode 100644 index 0000000..62ab6f7 --- /dev/null +++ b/propuesta/Adenda-01-Integracion-Jira.html @@ -0,0 +1,377 @@ + + + + +Adenda 01 — Integración Jira → BIND · Balam + + + + + +
+
+
+
Adenda 01 · Propuesta Comercial
+
+ +
+

Integración Jira → BIND

+
Generación automática de cotizaciones desde los tickets de facturación — Balam
+
+ +
+
+
Preparada para
+
Noe Rocha (CTO) · Araceli Sánchez Jiménez (CEO/Operaciones) · Erika Chávez (PM) · Pedro Alberto Ayala Elizondo (Contacto técnico)
+ +
Preparada por
+
Johann Velazquez — Consultor de Software · Monterrey, N.L.
+ +
Fecha
+
28 de julio de 2026
+ +
Referencia
+
Propuesta Comercial v1.2 · Contrato de servicios firmado el 26-jun-2026 · §10 — Control de cambios
+ +
Vigencia
+
30 días naturales a partir de la fecha de emisión
+
+ +
+ Documento confidencial + Adenda a la propuesta v1.2 — no sustituye al contrato +
+
+
+ + +
+ +
+
01

Antecedente

+ +

La propuesta v1.2 dejó Jira explícitamente fuera del alcance 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ó: hoy todo el flujo de facturación de Balam nace y se gobierna en Jira — "lo que no está en Jira no se procesa" — con una bandeja dedicada (Facturación, llave FAC-) y un flujo de estatus formal que culmina en "resuelto".

+ +

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 lectura y escritura de tickets, se entregó el token de integración ("PAF", vigente al 27-jul-2027) y se documentaron los límites de consumo del lado de Atlassian. La estimación preliminar (~10 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.

+
+ +
+
02

Alcance del cambio

+ +

La integración agrega a la primera etapa las siguientes capacidades:

+ +
    +
  1. Conexión con la API de Jira mediante el token PAF y lectura de los tickets de la bandeja Facturación (FAC-), con consumo autorregulado conforme a los límites de velocidad documentados por Atlassian.
  2. +
  3. Generación automática de la cotización en BIND 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 capa de escritura controlada del MVP.
  4. +
  5. Trazabilidad ticket ↔ cotización ↔ prefactura/factura, visible en la plataforma y registrada en la bitácora de auditoría. Los tickets leídos alimentan además la vista "qué necesita atención" del tablero.
  6. +
  7. Pruebas controladas: scripts de consulta y de creación/edición sobre un registro de prueba, y una prueba observada 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).
  8. +
+ +
+ Ticket Jira (FAC)→ + Cotización BIND (automática)→ + Prefactura→ + Aprobación humana→ + Timbrado (PAC de BIND) +
+ +
El control fiscal no cambia. La integración crea cotizaciones, nunca facturas: se mantiene la cadena acordada — cotización → prefactura → aprobación humana → timbrado por el PAC de BIND — con modo de simulación (dry-run), feature flag y registro en bitácora. No existe timbrado automático.
+
+ +
+
03

Qué no incluye

+ + +
+ +
+
04

Estimación e inversión

+ + + + + + + + +
ConceptoHorasInversión (MXN)
Primera etapa — propuesta v1.2 (Etapas 0 a 3)112 – 136$67,200 – $81,600
Adenda 01 — Integración Jira → BIND: lectura de la bandeja FAC, disparador por estatus, cotización automática, trazabilidad y pruebas9 – 12$5,400 – $7,200
Total de la primera etapa con adenda121 – 148$72,600 – $88,800
+ + +
+ +
+
05

Supuestos y dependencias

+ +
    +
  1. Definición del flujo de facturación 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.
  2. +
  3. Token PAF vigente 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.
  4. +
  5. Diagrama del flujo Jira de facturación en tamaño legible (comprometido por Balam en la sesión del 22 de julio).
  6. +
  7. Bandeja FAC como fuente. 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.
  8. +
  9. Sin ambiente de pruebas de BIND: toda prueba de escritura será acotada, acordada previamente y observada, como se convino con el CTO.
  10. +
+
+ +
+
06

Condiciones

+ +

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.

+
+ +
+
07

Aceptación

+ +

Conforme a la §10 de la propuesta (control de cambios), esta adenda se ejecuta tras su aprobación por escrito; basta la confirmación por correo electrónico. No requiere un nuevo contrato.

+ +
+
Johann Velazquez
+
Consultor de Software · Monterrey, Nuevo León
+
+
+ +
+ + + diff --git a/propuesta/adenda-01.pdf.config.json b/propuesta/adenda-01.pdf.config.json new file mode 100644 index 0000000..75982a4 --- /dev/null +++ b/propuesta/adenda-01.pdf.config.json @@ -0,0 +1,32 @@ +{ + "input_html": "Adenda-01-Integracion-Jira.html", + "output_pdf": "Adenda-01-Integracion-Jira-Balam.pdf", + + "page_size": "Letter", + "cover_full_bleed": true, + "render_timeout_ms": 30000, + + "metadata": { + "title": "Adenda 01 — Integración Jira → BIND · Plataforma de Automatización Financiera · Balam", + "author": "Johann Velazquez", + "subject": "Solicitud de cambio a la propuesta v1.2: generación automática de cotizaciones en BIND desde tickets de Jira", + "keywords": "adenda, Jira, BIND, Balam, control de cambios, cotizaciones" + }, + + "footer": { + "text": "Adenda 01 · Integración Jira → BIND · Balam — Confidencial", + "skip_first_page": true, + "skip_pages": [], + "page_number_format": "{page} / {pages}", + "rule": true, + "font_size_pt": 7.5, + "margin_mm": 12, + "color": [0.46, 0.51, 0.57] + }, + + "fonts": { + "footer_ttf": "fonts/Carlito-Regular.ttf" + }, + + "toc": {} +}