- bootstrap(): una sola llamada al entrar con roles y listas según el rol; las pestañas se dibujan
al instante con los roles de la última sesión (localStorage, solo interfaz). getDatosIniciales
queda como alias.
- CacheService por versión de colección (proyectos, contratos, cotizaciones, catálogo,
requisiciones, oc, pagosCobranza, pagosProveedores): doPost sube la versión tras cada escritura
(con candado); las hojas que se editan a mano se revisan por huella cada pocos minutos desde
la consulta de fondo. Memoria por petición para propiedades y cachés.
- sincronizar(versiones, contexto): devuelve solo lo que cambió y respeta roles; la interfaz
consulta cada 20 s con la pestaña visible, al cambiar de pestaña y al abrir un buscador de
proyectos; si alguien está capturando, avisa en vez de repintar. Los cambios de rol se aplican
sin recargar.
- Requisiciones, OC y pago a proveedores en proyectos Activos y Cerrados con o sin contrato
(moneda de la aceptada o MXN); Cancelados no. Cobranza sin aceptada muestra costo de OC y
"Sin contrato". Pagos de clientes siguen exigiendo contrato firmado.
- Clave de proyecto (columna L): folio visible PRY-AAAA-NNNN-XXX, sugerida con el nombre y
editable al crear; la llave interna sigue siendo PRY-AAAA-NNNN. asignarClavesProyectos()
(vista previa) y asignarClavesProyectosAplicar() asignan clave a los existentes y renombran
su carpeta principal. Buscadores por clave.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Rol nuevo ROL_COMPRAS (Script Properties): solo ese rol crea, ve, recibe y
cancela órdenes; el servidor lo revisa en cada llamada y los demás reciben
codigo PERMISO. getDatosIniciales agrega permisos.compras.
- Órdenes OC-AAAA-NNNN con el mismo candado e idempotencia, solo en proyectos
Activos con contrato firmado. Estados Emitida / Recibida / Cancelada (con
motivo; nunca se borran). La línea de negocio sale del contrato.
- Libro y carpeta "Cotizador Helgen — Compras" aparte y restringidos con
privado_(): ni en la Base de datos ni en la carpeta del proyecto ni en
cobranza. Pestañas OrdenesCompra, Proveedores (se llena sola) y Bitacora.
- PDF de la orden siempre con la razón social de Helgen y los términos
TERMINOS_OC (se agregan solos a Config). Sin tipo de cambio ni línea.
- Costo siempre capturado, nunca el precio de venta. Orden en otra moneda que
el proyecto: tipo de cambio obligatorio y costo convertido.
- Margen (contratado sin IVA − órdenes vigentes sin IVA) solo en la vista de
cobranza; preparado para sumar nómina y horas. Con órdenes vigentes la
aceptada no puede cambiar de moneda.
- Cobranza y compras comparten la mecánica de área privada (carpetaArea_,
libroArea_, enRol_). Los proyectos nuevos ya no crean "Órdenes de compra".
- Interfaz: pestaña Compras y tarjeta de margen en Cobranza.
- Pruebas: tests/compras.test.js nuevo; interfaz, cobranza, sesión, proyectos
y cotización actualizadas (oc.html de ejemplo). Las ocho pasan.
Sin publicar: falta respaldo, prueba en PRUEBAS, clasp y wrangler (CLAUDE.md §9).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
La interfaz manda el tipo de cambio con que convirtió los precios del catálogo;
el servidor lo valida (1–1000, 4 decimales) y lo guarda solo en cotizaciones en
USD. En MXN, en filas viejas o con precios capturados sin tipo de cambio queda
vacía. El encabezado se agrega solo (patrón de ENCABEZADOS_COTIZACIONES).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Esquema de Helgen Energy: solo ADMIN_DESBLOQUEO lo edita (antes de firmar),
con motivo obligatorio que queda en la Bitacora junto con el esquema anterior.
Al cambiar entre cotizaciones de Energy se conserva el esquema; al pasar de
Helgen a Energy se pone el 60/30/10 (con confirmación si reemplaza otro).
- PDF en USD: columnas "P. Unitario (USD)" e "Importe (USD)"; en MXN sin cambios.
- Prueba de que la cotización USD imprime el mismo bloque de términos que MXN.
- Pruebas de cobranza e interfaz ampliadas; CLAUDE.md actualizado.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Cobranza en un libro y una carpeta aparte ("Cotizador Helgen — Cobranza"),
fuera de la carpeta maestra, porque la Base de datos la lee todo el dominio.
- Cotización aceptada (una por proyecto; línea y moneda salen de ella),
esquema de pagos (Energy fijo 60/30/10; Helgen editable, suma 100%),
contrato firmado que bloquea todo, desbloqueo solo del administrador con
motivo, pagos PAG-AAAA-NNNN con comprobante obligatorio (PDF/imagen,
revisado por contenido), excedente a la siguiente etapa, tolerancia de 1.00,
tipo de cambio cuando la moneda del pago es otra, cancelación con motivo y
bitácora.
- Permisos en el servidor: ROL_COBRANZA y ADMIN_DESBLOQUEO en Script
Properties; sin rol, codigo PERMISO y ningún dato de cobranza.
- Un proyecto con contrato firmado no admite cotizaciones nuevas y sale del
buscador de cotizaciones.
- Cotizaciones en MXN o USD (columna U, PDF e importe con letra en dólares);
en USD el catálogo no pone el precio.
- Proyectos nuevos sin subcarpeta "Pagos".
- Pruebas: nueva cobranza.test.js; interfaz, cotización, sesión y proyectos
ampliadas. CLAUDE.md actualizado (§4.5.2, §5, §6.10, §6.11, regla 12, §9).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>