Sin conexión
++ No hay conexión a internet en este momento. Revisa tu red e intenta de nuevo; + la aplicación seguirá trabajando en cuanto vuelvas a estar en línea. +
+ +diff --git a/frontend/index.html b/frontend/index.html index 8a04141..73794a9 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -1,13 +1,21 @@ - +
+ + + + + + + + -+ No hay conexión a internet en este momento. Revisa tu red e intenta de nuevo; + la aplicación seguirá trabajando en cuanto vuelvas a estar en línea. +
+ +Instalar la app
+ {deferred ? ( ++ Accede más rápido desde tu pantalla de inicio. +
+ ) : ( +
+ Toca
Ciencia, estética y cuidado personalizado en cada tratamiento. Gestiona tu clínica con confianza.
diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts index 5831268..2d2c470 100644 --- a/frontend/vite.config.ts +++ b/frontend/vite.config.ts @@ -1,10 +1,63 @@ -import { defineConfig } from 'vite' +import { defineConfig, type Plugin, type ResolvedConfig } from 'vite' import react from '@vitejs/plugin-react' import tailwindcss from '@tailwindcss/vite' +import { createHash } from 'node:crypto' +import { existsSync, readFileSync, readdirSync, writeFileSync } from 'node:fs' +import { resolve } from 'node:path' + +// PWA: inyecta en dist/sw.js (1) una versión de caché única por build y +// (2) la lista de assets con hash a precachear. La versión es un hash del +// index.html, el manifest y los nombres de los assets, así que cambia +// exactamente cuando cambia el bundle (y el SW descarta las cachés viejas +// en `activate`). No toca el pipeline `tsc -b && vite build`. +function pwaServiceWorker(): Plugin { + let outDir = 'dist' + return { + name: 'skeen-pwa-service-worker', + apply: 'build', + configResolved(config: ResolvedConfig) { + outDir = config.build.outDir + }, + closeBundle() { + const dir = resolve(process.cwd(), outDir) + const swPath = resolve(dir, 'sw.js') + if (!existsSync(swPath)) return + + const listAssets = (sub: string): string[] => { + const abs = resolve(dir, sub) + if (!existsSync(abs)) return [] + return readdirSync(abs) + .filter((f) => /\.(js|css|woff2?|png|jpe?g|svg|webp|ico|json)$/i.test(f)) + .map((f) => `/${sub}/${f}`) + .sort() + } + // Solo /assets (hash): los iconos ya van listados explícitamente en sw.js. + const assets = listAssets('assets') + + const read = (file: string): Buffer => + existsSync(resolve(dir, file)) ? readFileSync(resolve(dir, file)) : Buffer.from('') + const version = createHash('sha256') + .update(read('index.html')) + .update(read('manifest.webmanifest')) + .update(assets.join('|')) + .digest('hex') + .slice(0, 12) + + let sw = readFileSync(swPath, 'utf8') + sw = sw.replace('__BUILD_VERSION__', version) + // JSON dentro de un literal de una sola comilla: se quitan comillas + // simples por seguridad (los nombres de Vite no las contienen). + sw = sw.replace('__PRECACHE_ASSETS__', JSON.stringify(assets).replace(/'/g, '')) + writeFileSync(swPath, sw) + + this.warn(`PWA service worker: versión de caché ${version}, ${assets.length} assets precacheados`) + }, + } +} // https://vitejs.dev/config/ export default defineConfig({ - plugins: [react(), tailwindcss()], + plugins: [react(), tailwindcss(), pwaServiceWorker()], server: { port: 5173, proxy: { diff --git a/odoo-addons/skeen_whatsapp/models/ticket_config.py b/odoo-addons/skeen_whatsapp/models/ticket_config.py index 3c5131c..b91a875 100644 --- a/odoo-addons/skeen_whatsapp/models/ticket_config.py +++ b/odoo-addons/skeen_whatsapp/models/ticket_config.py @@ -61,12 +61,17 @@ DEFAULT_TICKET_LAYOUT = { # cada equipo imprimía una dirección o un teléfono distinto. TICKET_CLINICA_KEY = 'skeen.ticket_clinica' +# Defaults NEUTROS a propósito: cada instancia configura su propio perfil en +# Configuración › Tickets. Si el nombre queda vacío, el frontend usa el nombre +# del brand de la clínica. Antes estos defaults traían los datos de SKEEN, que +# se filtraban a cualquier instancia nueva (dirección, teléfono y correo ajenos +# impresos en el ticket). DEFAULT_CLINICA = { - 'nombre': 'SKEEN Derma Experts', - 'direccion': 'Playas de Rosarito, Baja California', - 'telefono': '+52 (661) 100-2172', - 'email': 'hola@skeen.mx', - 'sitio': 'https://skeen.mx', + 'nombre': '', + 'direccion': '', + 'telefono': '', + 'email': '', + 'sitio': '', 'rfc': '', 'sucursal': '', 'tiene_logo': False,