47 Commits
Author SHA1 Message Date
Lizandro GuarnizoandClaude Opus 5 cd087f65af Elegir un solo BSUID por teléfono antes de escribir
57 números aparecen con dos identificadores (línea reciclada, o la persona
se registró de nuevo). El recorrido iba por BSUID, así que en esos casos los
dos escribían sobre el mismo usuario y el que quedaba dependía del orden:
cada ejecución dejaba un valor distinto y ninguna era más correcta. De ahí
los "110 reemplazos", que no eran 110 personas sino 57 escribiéndose dos
veces.

Ahora el empate se resuelve en memoria antes de tocar la base —gana el visto
más tarde, que es el vigente— y se escribe una sola vez por teléfono. La
corrida siguiente da 0 cambios y 0 conflictos, que es como debe comportarse
algo idempotente.

Estado final: 5.607 usuarios con su BSUID, sin duplicados, y ningún registro
con el identificador guardado en el campo de teléfono.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 21:54:21 -05:00
Lizandro GuarnizoandClaude Opus 5 ffb8c3c934 Partir el backfill en dos fases para que no muera a mitad
La ejecución real falló con "MySQL server has gone away" tras escribir 4.522
de 5.663: leer los 228.887 registros tarda más de media hora, y para cuando
empezaba a escribir el servidor ya había cerrado esa conexión. El singleton
de Database no sabe reconectar.

Ahora la lectura guarda el mapa en disco y termina; la segunda ejecución lo
toma de la caché en un segundo y escribe con la conexión sana. Reintentar
sale gratis, que era el otro problema: cada intento costaba media hora.

También informa cuántos teléfonos tienen más de un BSUID. La simulación
decía cero conflictos, pero no podía detectarlos: como no escribe, el bsuid
del usuario siempre estaba vacío y la comparación nunca daba positivo. Al
aplicar de verdad aparecieron. Ahora se cuentan al leer, sin depender de
lo ya escrito.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 21:08:14 -05:00
Lizandro GuarnizoandClaude Opus 5 6b74db3e4f Versionar la verificación del BSUID
Quedó fuera del commit anterior porque tests/ está en .gitignore, pese a
que el mensaje la mencionaba. Va en scripts/, que sí se versiona, junto al
backfill al que acompaña.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 20:26:54 -05:00
Lizandro GuarnizoandClaude Opus 5 26025a6399 Reconocer por BSUID a quien oculta su teléfono, y poder pedírselo
Meta no permite averiguar el teléfono a partir del BSUID: no hay endpoint de
consulta inversa, cada empresa debe llevar su propia equivalencia. Pero el
BSUID llega en TODOS los webhooks de mensaje, también en los que aún traen
teléfono, así que la equivalencia se puede ir guardando sola mientras la
persona todavía muestra su número.

- users.bsuid guarda esa equivalencia, y el webhook la anota en cada mensaje.
  Cuando alguien oculte su número, se le seguirá reconociendo y respondiendo
  a su teléfono de siempre.
- Va en columna aparte y no en phone_number porque el teléfono además cruza
  con el paciente y el turnero; mezclarlos rompería esos cruces.
- Para quien nunca escribió mostrando el número queda pedirle el contacto:
  pedirContacto() manda el botón request_contact_info, y el webhook atiende
  el mensaje `contacts` que llega si acepta.
- Al vincular puede aparecer un segundo registro de la misma persona. No se
  fusionan: una fusión mal hecha mezcla dos historias clínicas. Gana el que
  tiene el teléfono, el otro queda anotado en el log para revisarlo a mano.
- scripts/backfill_bsuid.php carga las equivalencias del histórico (6.423),
  con --simular para verlas sin escribir.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 20:07:52 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 fb0e77523c feat: módulo lab_examenes — CRUD catálogo de exámenes, items y tarifas
- Nuevo módulo lab_examenes con lista paginada, buscador y filtro por categoría
- Vista de detalle/edición con campos completos de exam_tipos (CUPS, protocolo,
  tipo muestra, nivel, abreviatura, seremite, ayuno, instrucciones)
- Sub-tabla inline de items de resultado (lab_items_resultado) con edición por fila
- Sub-tabla de precios por tarifa (lab_tarifas) con modal de edición
- APIs: list, get, save, save_item, save_tarifa, get_tarifas
- Script ETL Firebird→MySQL (scripts/etl_examenes.php) para la migración inicial

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-07 23:06:54 -05:00
Lizandro Guarnizo db469b2134 up 2026-03-10 18:42:51 -05:00
Lizandro Guarnizo 1bd7588e86 up 2026-02-21 09:29:27 -05:00
Lizandro Guarnizo 602e6d3724 up 2026-02-20 11:21:06 -05:00
Lizandro Guarnizo 421a5a4d7c up 2026-02-20 09:07:37 -05:00
Lizandro Guarnizo 1aae148396 up 2026-02-03 21:30:55 -05:00
Lizandro Guarnizo 95125a6708 up 2026-01-25 22:49:13 -05:00
Lizandro Guarnizo 09b50a2a99 up 2026-01-24 02:40:33 -05:00
Lizandro Guarnizo 3033f022d7 up 2026-01-24 02:20:31 -05:00
Lizandro Guarnizo a481a20e9a up 2026-01-24 02:15:54 -05:00
Lizandro Guarnizo 60e41bfa1a up 2026-01-24 00:55:33 -05:00
Lizandro Guarnizo 41b4c2fb32 up 2026-01-24 00:47:13 -05:00
Lizandro Guarnizo 99bedaa5a6 up 2026-01-22 10:33:16 -05:00
Lizandro Guarnizo 5e345b951f up 2026-01-22 00:19:20 -05:00
Lizandro Guarnizo ee016d62f5 ujp 2026-01-21 23:55:49 -05:00
Lizandro Guarnizo a70b8f36b5 up 2026-01-21 22:51:57 -05:00
Lizandro Guarnizo 32f5f580f7 up 2026-01-21 22:31:46 -05:00
Lizandro Guarnizo 31dbc8aa86 up 2026-01-21 22:11:12 -05:00
lizandrogd 0d96fa0029 up 2026-01-21 16:42:26 -05:00
lizandrogd ac179cec98 up 2026-01-21 16:32:40 -05:00
lizandrogd d263cfd225 UP 2026-01-21 15:34:49 -05:00
lizandrogd b709d65190 u 2026-01-21 15:19:58 -05:00
lizandrogd 75b8f469f4 up 2026-01-21 15:08:18 -05:00
lizandrogd 3e57e6946c up 2026-01-21 12:44:58 -05:00
lizandrogd 3f6e723fac up 2026-01-21 12:33:11 -05:00
lizandrogd b6ef6179b8 up 2026-01-21 12:26:36 -05:00
lizandrogd 901d51c82f up 2026-01-21 12:20:46 -05:00
lizandrogd 6cec747ae3 up 2026-01-21 12:05:48 -05:00
lizandrogd c7d0b8b70c up 2026-01-21 11:58:17 -05:00
lizandrogd fccaa3b649 up 2026-01-21 11:17:36 -05:00
lizandrogd 5727721f02 up 2026-01-21 11:04:41 -05:00
lizandrogd 5e9220590a up 2026-01-21 10:57:02 -05:00
lizandrogd b1e291bf05 up 2026-01-21 09:48:09 -05:00
lizandrogd fd9c718a44 up 2026-01-21 09:29:59 -05:00
lizandrogd 45a11032f5 mejoras 2026-01-21 08:28:54 -05:00
lizandrogd cec91ff45a up 2026-01-21 02:49:42 -05:00
lizandrogd 845762f916 up 2026-01-21 02:45:59 -05:00
lizandrogd edfa5f68d9 up 2026-01-21 02:34:23 -05:00
lizandrogd b1961f0116 up 2026-01-21 02:22:29 -05:00
lizandrogd 87b89b52a5 up 2026-01-21 01:02:17 -05:00
lizandrogd 81708fbb22 up
up
2026-01-20 23:29:06 -05:00
lizandrogd f222df40cd up 2026-01-20 22:33:39 -05:00
lizandrogd 648a6c0291 up 2026-01-20 22:13:02 -05:00