4.2 KiB
4.2 KiB
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
# 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:
# Cliente solo ve sus propias órdenes
<record id="portal_sale_order_rule" model="ir.rule">
<field name="domain_force">[('partner_id.user_id', '=', user.id)]</field>
</record>
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
// routes/portal.tsx
const portalRoutes = [
{
path: '/portal',
element: <PortalLayout />,
children: [
{ path: 'dashboard', element: <PortalDashboard /> },
{ path: 'orders', element: <PortalOrders /> },
{ path: 'orders/:id', element: <PortalOrderDetail /> },
{ path: 'invoices', element: <PortalInvoices /> },
{ path: 'projects', element: <PortalProjects /> },
{ path: 'projects/:id/tasks', element: <PortalTasks /> }
]
}
];
Backend: Permisos Portal
-- 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:
// Componente de firma
import SignatureCanvas from 'react-signature-canvas';
function QuotationApproval({ orderId }) {
const sigRef = useRef<SignatureCanvas>(null);
const handleApprove = async () => {
const signatureDataURL = sigRef.current.toDataURL();
await approveQuotation({
orderId,
signature: signatureDataURL,
approvedAt: new Date()
});
};
return (
<div>
<h3>Aprobar Cotización #{orderId}</h3>
<SignatureCanvas ref={sigRef} />
<button onClick={handleApprove}>Aprobar</button>
</div>
);
}
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