erp-core/docs/01-analisis-referencias/odoo/odoo-portal-analysis.md

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