Commit Graph

37 Commits

Author SHA1 Message Date
Efrain (Helgen)
985df1f52d CLAUDE.md: API @7 e interfaz publicadas (ocultar aceptar/firmar en proyectos cancelados), revisado en el cotizador real
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 18:28:15 -06:00
Efrain (Helgen)
09e9b7acfb Cobranza: ocultar "Marcar aceptada" y "Contrato firmado" en proyectos cancelados
vistaCobranza_ manda puedeAceptar y puedeFirmar (falsos si el proyecto está
Cancelado o, en el caso de aceptar, si ya está firmado); la interfaz oculta esos
botones y muestra un aviso con cómo reactivarlo. El servidor ya rechazaba ambas
acciones. Pruebas de cobranza e interfaz ampliadas. Publicar la API antes que la
interfaz.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 18:26:03 -06:00
Efrain (Helgen)
847c5441c8 CLAUDE.md: publicación de Cobranza completa, privado_(), revisión en el cotizador real y observaciones
- §4.5.2: privado_() (restringe con la API de Drive, de arriba abajo) y prepararCobranza() actualizada.
- §8: el conector de Drive no puede compartir; clasp push solo cambia @HEAD y cómo verificarlo.
- §9: resultado de la revisión en el cotizador real, producto de ejemplo HSE-EJ en el catálogo
  e idea de ocultar "Marcar aceptada" en proyectos cancelados.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 18:10:51 -06:00
Efrain (Helgen)
3e5d0dbf2d CLAUDE.md: entorno de prueba de Cobranza retirado (deployment y servidor local)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 18:06:34 -06:00
Efrain (Helgen)
a838e5b3be CLAUDE.md: carpeta de cobranza compartida con tania@ y leo@ (comprobado)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 18:04:58 -06:00
Efrain (Helgen)
98fde8ba17 CLAUDE.md: Cobranza publicada (API @6 e interfaz en Cloudflare) y pasos que faltan
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 18:00:44 -06:00
Efrain (Helgen)
c75e754137 Cobranza: prepararCobranza() restringe primero la carpeta y luego el libro
El libro hereda de la carpeta el acceso del dominio y Drive no deja quitar un permiso
heredado en el hijo (403 cannotDeletePermission). El simulacro de la API de Drive
ahora reproduce la herencia; la raíz de Mi unidad simulada ya no está compartida.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 17:57:22 -06:00
Efrain (Helgen)
bfe4661968 Cobranza: restringir acceso con la API de Drive (DriveApp.setSharing da Access denied)
En helgen.tech DriveApp.setSharing falla con "Access denied: DriveApp." aunque el
script es dueño, con Permission.NONE y con VIEW. privado_() ahora lista los permisos
con la API REST de Drive y borra los de tipo domain/anyone, con el token del script
(sin permisos nuevos). Si no puede, lanza error. Simulacro de la API en las pruebas.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 17:55:17 -06:00
Efrain (Helgen)
7e3256415a Cobranza: privado_() usa Permission.VIEW (NONE no está soportado y da Access denied)
prepararCobranza() falló en la API real con "Access denied: DriveApp." en setSharing.
Con Access.PRIVATE el permiso se ignora. El simulacro ahora rechaza NONE como Google.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 17:53:17 -06:00
Efrain (Helgen)
768554557f Cobranza: carpeta, libro, subcarpetas y comprobantes en acceso restringido
Workspace de helgen.tech comparte como lector con todo el dominio lo que se crea:
la carpeta y el libro de cobranza nacieron visibles para cualquier vendedor.
privado_() los deja en Restringido (conserva a tania@ y leo@) y prepararCobranza()
repara los que ya existen. Prueba: el simulacro de Drive comparte lo nuevo con el dominio.
CLAUDE.md: IDs de la carpeta y el libro de cobranza reales.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 17:47:45 -06:00
Efrain (Helgen)
11708f2f1f Respaldos antes de Cobranza y regla: las pruebas en el navegador las hace Claude
- CLAUDE.md §2: carpeta "Respaldos 2026-10-20 (antes de Cobranza)" con copias
  verificadas de la Base de datos y del Catálogo.
- Regla 13 y §8 "Pruebas en el navegador": Claude prueba en el Chrome del
  usuario (Claude in Chrome), por omisión solo en el entorno PRUEBAS; qué se le
  sigue pidiendo al usuario (sesión, permisos, funciones del editor).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 17:38:10 -06:00
Efrain (Helgen)
829fc1e321 CLAUDE.md: resultado de las pruebas de Cobranza y USD, lección de fechas en Sheets y pasos para publicar
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 17:35:04 -06:00
Efrain (Helgen)
b1b3bb94d0 Cobranza: fechas de pago y firma legibles (Sheets las convertía en fecha)
En la prueba de punta a punta la fecha del pago se mostraba como
"Tue Oct 20 2026 00:00:00 GMT-0600…": appendRow convierte "AAAA-MM-DD" en fecha
aunque la columna tenga formato de texto. Ahora fecha_pago y fecha_firma se
escriben con apóstrofo (texto, sin depender de la zona horaria de la hoja) y al
leer se normalizan las filas ya guardadas como fecha. Firmar y desbloquear ya no
reescriben aceptada_por / fecha_aceptacion. La prueba simula ese comportamiento
de Sheets.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 17:32:31 -06:00
Efrain (Helgen)
decddbb973 Cotizaciones: columna V con el tipo de cambio usado en cotizaciones USD
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>
2026-10-20 17:11:56 -06:00
Efrain (Helgen)
6fb43f84a1 Catálogo: precio en USD automático con el tipo de cambio del día
- Pestaña "Tipo de cambio" en el catálogo: Google Finance (USD→MXN), un valor
  manual opcional que manda, y el tipo de cambio en uso (rango TIPO_CAMBIO).
  Se crea sola y se recalcula cada hora.
- Columna I "Precio USD (sin IVA, automático)": fórmula por renglón (no
  ARRAYFORMULA, para que appendRow no escriba al final de la hoja); los
  renglones sin fórmula se reparan solos; protegida con advertencia.
- En cotizaciones USD, al elegir un producto se pone su precio en dólares; al
  cambiar de moneda se convierten los renglones del catálogo no modificados y
  se avisa de los capturados a mano. La pestaña Catálogo muestra el precio USD
  y el tipo de cambio en uso.
- Pruebas de catálogo e interfaz ampliadas; CLAUDE.md actualizado.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 17:01:57 -06:00
Efrain (Helgen)
1d49ee171e CLAUDE.md: deployment de prueba para Cobranza en el proyecto PRUEBAS
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 16:50:54 -06:00
Efrain (Helgen)
d08f4025f5 Cobranza: esquema de Energy editable solo por el administrador; columnas USD en el PDF
- 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>
2026-10-20 16:49:18 -06:00
Efrain (Helgen)
745c9e3a66 Fase 2: cobranza por proyecto y cotizaciones en USD
- 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>
2026-10-20 14:54:23 -06:00
Efrain (Helgen)
f31f88f363 CLAUDE.md §6.8: orden obligatorio cuando un cambio requiere un permiso nuevo de Google
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 13:47:26 -06:00
Efrain (Helgen)
18e305a36f Revert "Historial: nombre del vendedor desde el directorio de Google de helgen.tech"
Se decidió no publicar la búsqueda en el directorio (servicio People): el nombre de un vendedor viejo
(p. ej. leo@helgen.tech) se corrige solo cuando guarde una cotización con sesión. appsscript.json vuelve a
quedar sin servicios avanzados y Code.js igual a lo publicado en @5. Nunca se hizo clasp push de c6c4b93.

This reverts commit c6c4b93.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 13:45:30 -06:00
Efrain (Helgen)
c6c4b93da3 Historial: nombre del vendedor desde el directorio de Google de helgen.tech
Las cotizaciones de vendedores que nunca guardaron con sesión (p. ej. leo@helgen.tech) seguían mostrando el
correo. Ahora, para correos @helgen.tech sin nombre en la hoja, listarCotizaciones busca el nombre y apellido
en el directorio de la organización (servicio avanzado People, searchDirectoryPeople con perfiles del
dominio), solo acepta la persona con el correo exacto y guarda el resultado 6 h en caché. Si el directorio
falla o no hay permiso, se muestra el correo como antes. No escribe en la hoja.

probarDirectorio() autoriza el permiso desde el editor. Pruebas en sesion.test.js. CLAUDE.md §3, §4.4,
§4.6 y §6.8 (orden: push, autorizar, deploy).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 13:34:27 -06:00
Efrain (Helgen)
fc621d23b4 CLAUDE.md: registros de prueba HLG-2026-0006 y PRY-2026-0001 ya marcados en la hoja
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 13:29:15 -06:00
Efrain (Helgen)
306acaf78e CLAUDE.md: API publicada en @5
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 13:20:51 -06:00
Efrain (Helgen)
7cc595587b CLAUDE.md: registros de prueba con guion corto (HLG-2026-0006, PRY-2026-0001)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 13:20:37 -06:00
Efrain (Helgen)
3c410b46ad Historial: nombre del vendedor también en cotizaciones viejas
Las filas anteriores a la sesión con Google no tienen vendedor_nombre/apellido y mostraban el correo.
listarCotizaciones ahora arma un mapa correo → "Nombre Apellido" con las filas que sí lo tienen
(nombresDeVendedores, gana la más reciente) y lo usa para las viejas (vendedorDeFila); si el correo no
se conoce, sigue mostrando el correo. Solo cambia la respuesta: la hoja no se modifica.

Pruebas en sesion.test.js. CLAUDE.md: §4.4, §4.6 y registros de prueba en la hoja real
(HLG-2026-0005, HLG-2026-0006, PRY-2026-0001) para excluirlos de reportes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 12:58:24 -06:00
Efrain (Helgen)
3b7f5ec953 CLAUDE.md: API publicada en @4 (Proyectos)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 12:36:40 -06:00
Efrain (Helgen)
8ec8ed24fc CLAUDE.md: respaldo 2026-10-20 (Base de datos y Catálogo) y proyecto de prueba archivado
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 12:31:19 -06:00
Efrain (Helgen)
c04f878168 Proyecto rechazado al guardar: la interfaz limpia el campo y refresca la lista
Si el servidor rechaza la cotización porque el proyecto se canceló, se cerró o no existe, la etiqueta seguía
diciendo "Proyecto activo". Ahora el error lleva codigo PROYECTO (errorProyecto_ en Code.js, doPost lo
pasa a la respuesta, la capa api-web lo pone en err.codigo) y errorAlGuardar limpia el campo Proyecto,
refresca la lista de proyectos y muestra el aviso. Otros errores no tocan el campo.

Pruebas: tests/interfaz.test.js (nueva: DOM y fetch simulados), codigo PROYECTO en proyectos.test.js y
sesion.test.js. CLAUDE.md §8 y §10.2.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 12:29:56 -06:00
Efrain (Helgen)
f6476c3230 CLAUDE.md: regla de responder siempre en español
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 12:16:09 -06:00
Efrain (Helgen)
5f6b4829d6 CLAUDE.md: proyecto de prueba de punta a punta (PRUEBAS — Cotizador Helgen) y cómo archivarlo
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 11:17:08 -06:00
Efrain (Helgen)
aae01d6918 Proyectos: folio PRY-AAAA-NNNN, carpeta en Drive y cotizaciones ligadas por proyecto_folio
- Pestaña "Proyectos" (se crea sola) con cliente_id (RFC o SIN-RFC:nombre|empresa), estado con lista
  desplegable y vendedor del token. Folio con contador propio CONSECUTIVO_PROY_AAAA bajo el mismo candado.
- Carpeta Cotizador Helgen/Proyectos/AAAA/<folio> — <cliente> — <nombre>/ con Cotizaciones,
  Órdenes de compra y Pagos; las subcarpetas borradas o renombradas se vuelven a crear.
- Cotizaciones: columna T proyecto_folio (las viejas quedan vacías = "Sin proyecto"); con proyecto, el PDF
  va a su carpeta Cotizaciones. Proyecto inexistente o no Activo se rechaza sin gastar folio.
- Interfaz: campo Proyecto opcional con buscador y "Nuevo proyecto" en el módulo 1; columna en Historial.
- Pruebas: tests/proyectos.test.js (Drive simulado con árbol de carpetas) y sesion.test.js ampliada.
- CLAUDE.md: §6.9 Proyectos y §6.10 modelo futuro (OC, Pagos, Gastos, cotización "Aceptada").

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 10:59:37 -06:00
Efrain (Helgen)
55950b3762 Favicon con el isologo de Helgen en la portada y el cotizador
Se agregan favicon.ico (16+32), favicon-32.png, apple-touch-icon.png (180) e
isologo-512.png en web/, con sus etiquetas <link> y theme-color #2C3C5B en
web/index.html y web/cotizador/index.html. Rutas absolutas para que funcionen
desde /cotizador/. La portada usaba el logo blanco como favicon, que casi no
se veía en pestañas claras. Publicado con wrangler (versión 19893d69).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 17:53:50 -06:00
Efrain (Helgen)
1fb78c41ab CLAUDE.md: git ahora usa GitHub CLI (gh) en lugar del token personal
gh v2.102.0 instalado en ~/.local/bin sin Homebrew; sesión con gh auth login
--web y credenciales de git con gh auth setup-git.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 16:59:39 -06:00
Efrain (Helgen)
607a6dfaa9 CLAUDE.md: regla de commit + push y recordatorio de publicar con clasp o wrangler
También anota el arreglo de los archivos Icon de macOS dentro de .git que rompían git fetch.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 16:46:27 -06:00
Efrain (Helgen)
8d3c23e0c6 CLAUDE.md: remoto de GitHub y copia vieja desactivada
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 16:35:11 -06:00
Efrain (Helgen)
584a12e25c CLAUDE.md: nueva ruta oficial ~/Proyectos/cotizador-helgen
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 16:19:01 -06:00
Efrain (Helgen)
bbb34768b4 Respaldo inicial del Cotizador Helgen (19/10/2026)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 16:14:08 -06:00