Se diagnosticaron y solucionaron las dos fallas reportadas, tomando como referencia directa el modelo de cotización 106 provisto.

---

### Diagnóstico de las causas raíz

1. **Por qué las notas salían cortadas o aplastadas:**
   - En el código anterior de [`generate_quote_xlsm.py`](file:///home/vpsadmin/.gemini/antigravity-cli/scratch/skizze-cotizaciones/server/generate_quote_xlsm.py) se ejecutaba una inserción incondicional de filas (`insert_rows`) y se activaba la fila 26 de "Opcionales" aun cuando no existían ítems opcionales.
   - Esa inserción desplazaba hacia abajo todas las notas comerciales, haciendo que cayeran en filas de la plantilla con alturas incompatibles: la aclaración de pago (*"Trabajos cotizados de lunes a viernes..."*) caía en la fila 33 que mide apenas **4.5 pt** de alto (quedando aplastada), y la cláusula de ajuste de materiales caía en una fila de **14 pt** en vez de la fila 44 de **34.5 pt** (mostrando sólo la primera línea y tapando la cláusula CAC).

2. **Por qué Excel arrojaba cartel de recuperación y borraba las fórmulas:**
   - La librería `openpyxl` generaba un archivo `xl/drawings/commentsDrawing1.vml` con prefijos de namespace no estándar (`<ns0:shapelayout>` y `<ns2:ClientData>`) debido a un residuo de comentarios en la plantilla.
   - Al abrir el libro en Microsoft Excel (Windows/Office), el motor XML detectaba inconsistencias en los esquemas VML, forzaba la reparación destructiva del libro y, en ese proceso de recuperación, purgaba todas las etiquetas `<f>` (fórmulas) de `sheet1.xml`.

---

### Correcciones aplicadas

1. **Plantilla maestra canónica:**
   - Se regeneraron [`SK-PC-clean-template.xlsm`](file:///home/vpsadmin/.gemini/antigravity-cli/scratch/skizze-cotizaciones/server/templates/SK-PC-clean-template.xlsm) y [`SK-PC-template.xlsm`](file:///home/vpsadmin/.gemini/antigravity-cli/scratch/skizze-cotizaciones/server/templates/SK-PC-template.xlsm) a partir de la estructura del modelo 106.
   - Se removieron los residuos en celdas auxiliares (como el texto `"VALOR DEL DÓLAR"` en `AA9` / `P7-P9`) y se preservó el contenedor nativo `vmlDrawing1.vml` de Microsoft Office.

2. **Lógica de disposición en [`generate_xlsm`](file:///home/vpsadmin/.gemini/antigravity-cli/scratch/skizze-cotizaciones/server/generate_quote_xlsm.py#L90-L245):**
   - **Caso estándar (sin opcionales):** Idéntico al modelo 106, las filas 26 y 27 se mantienen ocultas (`hidden = True`) sin insertar filas adicionales. Las notas comerciales quedan en sus posiciones fijas predeterminadas (filas 28 a 51) con su altura garantizada en `34.5 pt` y área de impresión en `'Sheet1 (3)'!$C$1:$P$59`.
   - **Normalización de VML en [`fix_xlsm_package`](file:///home/vpsadmin/.gemini/antigravity-cli/scratch/skizze-cotizaciones/server/generate_quote_xlsm.py#L42-L80):** Se corrigen automáticamente los namespaces XML al empaquetar el `.xlsm`, asegurando compatibilidad nativa con Excel sin carteles de advertencia y preservando las 24 fórmulas de cálculo.

---

### Verificación del resultado

- **PDF oficial:** Encaja perfectamente en **1 sola página A4**, con todas las notas legibles (forma de pago, horario en negrita, CAC completo y fórmula de ajuste por dólar).
- **Excel (.xlsm):** Abre de forma limpia y directa en Microsoft Excel sin cuadro de recuperación y con las **24 fórmulas** intactas y activas.

### Archivos disponibles

- **En la aplicación Skizze (Google Drive Local / PWA):**
  - PDF: [`SK-PC-2026-2026110105- IFF Reparación de Reefer - R0.pdf`](file:///home/vpsadmin/.gemini/antigravity-cli/scratch/skizze-cotizaciones/drive_local/SKIZZE%20IA/cotizaciones/2026110105-%20IFF-%20Reparaci%C3%B3n%20de%20Reefer/01-COTIZACIONES/SK-PC-2026-2026110105-%20IFF%20Reparaci%C3%B3n%20de%20Reefer%20-%20R0.pdf)
  - XLSM: [`SK-PC-2026-2026110105- IFF Reparación de Reefer - R0.xlsm`](file:///home/vpsadmin/.gemini/antigravity-cli/scratch/skizze-cotizaciones/drive_local/SKIZZE%20IA/cotizaciones/2026110105-%20IFF-%20Reparaci%C3%B3n%20de%20Reefer/01-COTIZACIONES/SK-PC-2026-2026110105-%20IFF%20Reparaci%C3%B3n%20de%20Reefer%20-%20R0.xlsm)
- **Copias en la carpeta de uploads del panel:**
  - PDF: [`CORREGIDO_SK-PC-2026-2026110105-_IFF_Reparacion_de_Reefer_-_R0.pdf`](file:///opt/chatpanel-v2/uploads/CORREGIDO_SK-PC-2026-2026110105-_IFF_Reparacion_de_Reefer_-_R0.pdf)
  - XLSM: [`CORREGIDO_SK-PC-2026-2026110105-_IFF_Reparacion_de_Reefer_-_R0.xlsm`](file:///opt/chatpanel-v2/uploads/CORREGIDO_SK-PC-2026-2026110105-_IFF_Reparacion_de_Reefer_-_R0.xlsm)
terminating 2 background task(s) on exit
