# Documentación: Flujo Custom (B2B / Mayoreo) y Subcontratación en Odoo

*Este documento consolida las decisiones, configuraciones y la arquitectura implementada para manejar el flujo B2B y maquila, manteniéndolo 100% aislado de Shopify.*

## 1. El Problema a Resolver
El cliente (Hazard) necesita manejar un flujo donde:
- Se venden productos a la medida (ej. Camisas para Club de Golf) a clientes B2B.
- Hazard no fabrica la ropa directamente. Proveen los insumos (telas, botones, cierres) a fábricas externas (maquileras, muchas en China).
- Ocasionalmente, compran el producto ya terminado a la fábrica.
- Piden cotizaciones a diferentes fábricas y manejan anticipos.
- **Regla Crítica:** Todo este inventario (Insumos y Ropa a la Medida) debe estar separado lógicamente de la tienda en línea (Shopify), aunque físicamente compartan el almacén. El conector no debe sincronizar estos productos.

---

## 2. Solución y Arquitectura en Odoo

Para resolver esto utilizando funciones nativas de Odoo y código a prueba de errores, activamos la siguiente arquitectura:

### A. Fabricación y Subcontratación (MRP)
Se activó la **Subcontratación**.
- **Cómo funciona:** Cuando se crea la "Camisa Custom", se le asigna una **Lista de Materiales (BoM)** de tipo *Subcontratación*. 
- **La magia:** Al crearle una Orden de Compra a la fábrica china por las camisas, Odoo automáticamente genera un movimiento de inventario (Resuministro de subcontratista) que **descuenta la tela de nuestro almacén principal** y la transfiere a una bodega virtual de la fábrica. Al recibir la camisa terminada, la tela se consume oficialmente.

### B. Compras y Licitaciones (Purchase Agreements)
Se activaron los **Acuerdos de Compra**.
- Esto permite crear una *Licitación* o *Requisición*. Se puede pedir cotización a 3 fábricas chinas distintas al mismo tiempo, compararlas en Odoo y elegir la ganadora para generar la Orden de Compra definitiva.
- **Anticipos:** Se resuelven registrando una factura de proveedor por "Anticipo" vinculada a la Orden de Compra, lo que crea un saldo a favor en la cuenta de la fábrica.

### C. Ventas B2B (CRM / Sales)
Se creó el **Equipo de Ventas `Custom / B2B`**.
- Los vendedores usan Odoo (recomendado usar el CRM Kanban de Odoo en lugar de Notion para evitar doble trabajo) para hacer las cotizaciones (Quotations) directamente.

---

## 3. El Blindaje contra Shopify (Código Personalizado)

Para garantizar que el inventario no se mezcle con Shopify, se crearon dos categorías de producto exclusivas:
1. `Insumos / Materia Prima`
2. `Producto Final Custom`

**La medida de seguridad:**
Se modificó el módulo custom `hazard_shopify` (específicamente en `models/product_template.py`). Se añadió un `@api.constrains` que actúa como escudo protector:
```python
@api.constrains('shopify_published', 'categ_id')
def _check_shopify_published_category(self):
    for record in self:
        if record.shopify_published and record.categ_id:
            if 'Custom' in record.categ_id.name or 'Insumo' in record.categ_id.name:
                raise UserError("Los productos de la categoría Custom o Insumos no pueden ser publicados en Shopify.")
```
**Resultado:** Incluso si un usuario intenta forzar la sincronización (marcando la casilla "Publicado en Shopify" o haciendo clic en el botón de push), el sistema lanzará un error y bloqueará la acción. La separación está garantizada por código.

*(Nota: Los códigos de barra automáticos EAN13 siguen generándose para estos productos gracias a la lógica del sistema, lo cual es útil para escaneos internos en bodega).*

---

## 4. Guía de Prueba Rápida (Walkthrough)

Se inyectaron datos de prueba (`setup_test_data.py`) para validar el flujo. Los pasos para una demo son:

1. **Cotizar al Cliente Final:** Confirmar la Cotización (SO) para el cliente `Club de Golf Test` por 5 unidades de `Camisa Custom Club de Golf (Test)`.
2. **Mandar a Maquilar:** Confirmar la Orden de Compra (PO) a `Fábrica China Test`.
3. **Validar Envío de Insumo:** Ir a *Inventario > Operaciones > Resuministro de Subcontratista* y validar la entrega de 7.5 metros de `Tela Azul Premium` hacia la fábrica.
4. **Recibir el Producto Final:** Volver a la Orden de Compra y recibir las 5 camisas.
5. **Entregar al Cliente Final:** Volver a la Cotización original (SO) y validar la entrega al cliente.

*Durante todo este flujo, Shopify permanece 100% aislado.*
