Targeted Hardening & Responsive Fixes
V-3.2.0244 — Targeted Hardening & Responsive Fixes: ======================================== 1. RLS PATCHES ======================================== A) cash_sessions — POLICY REEMPLAZADA: • Antes: ALL USING (owner_id = auth.uid() OR cashier_id = auth.uid()) • Después: ALL USING (owner_id = auth.uid() OR (cashier_id = auth.uid() AND owner_id = get_cashier_owner(auth.uid())) OR is_super_admin(auth.uid())) • Razón: simetría con cash_movements; un cashier solo puede ver/modificar sesiones de su owner asignado, no de otros owners donde por error coincida el cashier_id. • WITH CHECK: idéntico a USING para mantener integridad en INSERT/UPDATE. B) cash_deposit_evidence — VERIFICADO sin cambios: • Policy 'owner manages cash_deposit_evidence' ALL → owner_id = auth.uid() OR is_super_admin. • Policy 'cashier reads cash_deposit_evidence' SELECT → has_role(cashier) AND owner_id = get_cashier_owner. • Policy 'cashier inserts cash_deposit_evidence' INSERT → has_role(cashier) AND owner_id = get_cashier_owner AND uploaded_by = auth.uid(). • Conclusión: ya estaba correctamente scopeada. El hallazgo [MEDIO] de V-3.2.0243 era falsa alarma del slice de auditoría. C) supplier_network_audit_log — VERIFICADO sin cambios: • Policy 'supplier reads own audit log' SELECT → EXISTS supplier_networks WHERE network_id match AND (owner OR super_admin). • Policy 'operator reads own audit entries' SELECT → auth.uid() = actor_owner_id. • Operador NO ve logs globales — solo entradas que él mismo generó. ✓ • Conclusión: ya estaba correcto. ======================================== 2. RESPONSIVE FIXES ======================================== A) /cash-control: • Filtros de tienda y estado: cambiados a w-full sm:w-[200px] / sm:w-[180px] (antes ancho fijo causaba overflow en mobile). • Lista de movimientos: tabla solo en md+; en mobile ahora se renderiza como Cards apiladas con fecha, tipo, monto, badge de estado y subtítulo tienda · usuario. Tap en card abre el detalle. • Sin cambios de comportamiento ni de datos. B) /franchise-network: • Card de código de red: input + botón copy ahora con shrink-0 y min-w-0 para evitar overflow en 374px. • Filas de invoices: layout flex-col en mobile / flex-row en sm+, badges y montos en text-xs sm:text-sm. • Sin cambios de datos ni RPCs. No se rediseñó ningún módulo. No se cambió branding ni navegación. ======================================== 3. PERFORMANCE ======================================== • No se hizo code-splitting (aplazado a versión dedicada). • No se detectaron queries duplicadas nuevas. • Imports pesados aún en pos / router; chunks >500kB se aceptan en esta versión. ======================================== 4. QA ======================================== • bunx tsc --noEmit — LIMPIO. • npm run build — EXITOSO (sin nuevos warnings). • Migración cash_sessions aplicada sin errores; linter sin nuevas advertencias críticas. • Verificado en preview 374px: cash-control muestra cards mobile correctamente; franchise-network filas compactas. ======================================== 5. ENTREGABLE ======================================== Migraciones creadas: 1 (cash_sessions policy rewrite). Policies nuevas: 1 (replace de la existente). Fixes responsive: 2 rutas (/cash-control, /franchise-network). Riesgos pendientes: [INFO] code-splitting de pos y router (aplazado). [INFO] cashiers count en cash_sessions con sesiones legacy: la nueva policy requiere que owner_id en la sesión coincida con cashier_assignments — sesiones huérfanas (cashier reasignado a otro owner) podrían volverse invisibles para el cashier. Mitigación: super admin sigue viendo todo; owner sigue viendo todo de su propio owner_id. Deploy-ready: SÍ.
Aspectos destacados
- Policy cash_sessions reforzada (simetría owner/cashier)
- Cash deposit evidence + supplier audit log verificados
- /cash-control con cards en mobile
- /franchise-network con filas compactas mobile
- Sin features nuevas — solo hardening y responsive