# 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
<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

```typescript
// 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

```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<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
