# Análisis del Módulo Portal de Odoo **Módulo:** portal **Prioridad:** P1 **Mapeo MGN:** MGN-013 (Portal de Usuarios) ## Descripción Portal para usuarios externos (clientes, proveedores, derechohabientes): - Acceso limitado sin licencia Odoo - Vistas read-only personalizadas - Acciones permitidas (aprobar, comentar, descargar) ## Características Principales ### 1. Usuarios Portal ```python # Usuario portal (share=True) user = self.env['res.users'].create({ 'name': 'Cliente ABC', 'login': 'cliente@abc.com', 'groups_id': [(6, 0, [self.env.ref('base.group_portal').id])] }) # share=True → no consume licencia Odoo ``` ### 2. Vistas Portal Rutas públicas: - `/my/orders` - Órdenes de venta del cliente - `/my/invoices` - Facturas - `/my/projects` - Proyectos - `/my/tasks` - Tareas asignadas ### 3. Seguridad **Record rules filtran por usuario:** ```python # Cliente solo ve sus propias órdenes [('partner_id.user_id', '=', user.id)] ``` ### 4. Acciones Permitidas Clientes pueden: - Ver documentos (órdenes, facturas, proyectos) - Descargar PDFs - Aprobar cotizaciones (firma electrónica) - Comentar en tareas - Subir archivos Clientes NO pueden: - Crear órdenes - Editar precios - Ver órdenes de otros clientes - Acceder a configuración ## Mapeo a MGN-013 ### Requerimientos Funcionales **RF-POR-001: Portal de clientes** - Login con email/password - Dashboard personalizado - Documentos del cliente **RF-POR-002: Vista de órdenes/facturas** - Lista de órdenes de venta - Detalle de orden - Descarga de PDF **RF-POR-003: Aprobación de cotizaciones** - Revisar cotización - Aprobar con firma electrónica - Conversión a orden de venta **RF-POR-004: Vista de proyectos/tareas** - Proyectos del cliente - Tareas asignadas - Comentarios ## Implementación Recomendada MGN-013 ### Frontend: Rutas Públicas ```typescript // routes/portal.tsx const portalRoutes = [ { path: '/portal', element: , children: [ { path: 'dashboard', element: }, { path: 'orders', element: }, { path: 'orders/:id', element: }, { path: 'invoices', element: }, { path: 'projects', element: }, { path: 'projects/:id/tasks', element: } ] } ]; ``` ### Backend: Permisos Portal ```sql -- Rol 'portal_user' INSERT INTO auth.roles (name, category) VALUES ('portal_user', 'portal'); -- Permisos limitados INSERT INTO auth.model_permissions (role_id, resource, can_read, can_write, can_create, can_delete) VALUES ((SELECT id FROM auth.roles WHERE name = 'portal_user'), 'sales.orders', TRUE, FALSE, FALSE, FALSE), ((SELECT id FROM auth.roles WHERE name = 'portal_user'), 'account.invoices', TRUE, FALSE, FALSE, FALSE), ((SELECT id FROM auth.roles WHERE name = 'portal_user'), 'projects.projects', TRUE, FALSE, FALSE, FALSE); -- RLS: usuario portal solo ve sus registros CREATE POLICY portal_sales_orders ON sales.orders FOR SELECT TO portal_user USING (customer_id IN ( SELECT partner_id FROM auth.users WHERE id = current_setting('app.user_id')::int )); ``` ## Patrón de Firma Electrónica **Odoo implementa firma con canvas HTML5:** ```typescript // Componente de firma import SignatureCanvas from 'react-signature-canvas'; function QuotationApproval({ orderId }) { const sigRef = useRef(null); const handleApprove = async () => { const signatureDataURL = sigRef.current.toDataURL(); await approveQuotation({ orderId, signature: signatureDataURL, approvedAt: new Date() }); }; return (

Aprobar Cotización #{orderId}

); } ``` ## Aplicabilidad ⭐⭐⭐⭐⭐ - ESENCIAL para ERP Construcción Portal de derechohabientes INFONAVIT: - Ver avance de vivienda - Documentos (contratos, escrituras) - Programación de entrega - Postventa (garantías) **Recomendación:** Implementar desde Fase 1 --- **Fecha:** 2025-11-23 **Estado:** ✅ Análisis completo