- backend: GET/PUT /skeen/frontend/v1/brand leyendo ir.config_parameter
skeen.clinic.brand (JSON: nombre, logo_claro, logo_oscuro, pie) con
defaults SKEEN; GET publico (el login lo necesita sin sesion), PUT admin
con auditoria. frontend_users.xml: 'Administrador SKEEN' -> 'Administrador'
- frontend: ClinicBrand + BRAND_DEFAULT en odoo.ts; brand y setBrand en el
contexto de auth (fetch al boot + cache localStorage + document.title)
- Login/layouts/mensajes/exports leen el brand en vez de strings SKEEN:
Login.tsx, SkeenLayout, HomeNestLayout, Cumpleanos (wa + export),
Pacientes/Ventas/Cortes/Reportes/Kpis/Alertas/AgendaPrint (titulos),
useClinicaPrint (fallback nombre), Login hace GET publico al montar
- Configuracion > Clinica: tarjeta 'Identidad de la clinica' (solo admin)
para editar nombre/pie/logos con preview
- no renombrado (invisible al usuario): rutas API /skeen/*, claves
localStorage, nombres de modulos, parametros skeen.*
Verificacion API: 11/11 tests OK (defaults, PUT merge, campo invalido
ignorado, restore, admin neutral). Deploy: build + rsync + Odoo reiniciado
- Nuevo modelo skeen.ticket.config (AbstractModel) con layout, datos de clinica
y logo en ir.config_parameter; _mezclar() hace que layouts viejos hereden las
secciones nuevas; _validar() rechaza valores imposibles y textos largos.
- Endpoints GET/PUT /ticket_config, PUT /ticket_config/clinica,
POST /ticket_config/reset (reset solo admin) con auditoria en skeen_config_audit.
- Los datos de la clinica pasan de localStorage (cada caja imprimia distinto)
a configuracion compartida en el servidor.
- TicketDoc.tsx renderiza segun el diseno: ancho 58/80mm, fuente, tamano de letra,
separador, mayusculas, orden de bloques y 29 secciones activables.
- TicketDesigner.tsx: editor completo con vista previa en vivo, reorden de bloques,
textos personalizables y carga de logo.
- TicketPrint.tsx ahora es un wrapper de TicketDoc; ReciboPrint, EstadoCuentaPrint,
RecetaPrint, CortePrint y ConteoPrint usan useClinicaPrint().
- _sale_to_dict expone telefono del paciente, medico que atendio y datos de paquete;
pos_checkout devuelve recibido/cambio en MXN y USD para imprimirlos.