# Nexus Autoparts — Guia de Instalacion

Guia paso a paso para instalar una instancia de Nexus Autoparts POS en un servidor nuevo.

Compatible con: **Raspberry Pi OS**, **Debian**, **Ubuntu**. Para Windows usar WSL.

---

## Requisitos minimos

| Componente | Minimo | Recomendado |
|---|---|---|
| RAM | 2 GB | 4 GB |
| Almacenamiento | 16 GB | 32 GB |
| SO | Raspberry Pi OS / Debian 12+ / Ubuntu 22+ | Debian 13 |
| Python | 3.11+ | 3.13 |
| PostgreSQL | 14+ | 16 |
| Node.js | 18+ | 20 |

---

## Paso 1 — Clonar el repositorio

```bash
sudo apt-get update && sudo apt-get install -y git
cd /home
sudo git clone https://git.consultoria-as.com/consultoria-as/Autoparts-DB.git Autopartes
sudo chown -R $(whoami):$(whoami) /home/Autopartes
cd /home/Autopartes
```

Si el certificado SSL da problemas:

```bash
GIT_SSL_VERIFY=false sudo git clone https://git.consultoria-as.com/consultoria-as/Autoparts-DB.git Autopartes
```

---

## Paso 2 — Ejecutar el script de instalacion

El script instala automaticamente: PostgreSQL, Python, Node.js, ffmpeg, todas las dependencias de pip, crea la base de datos, el tenant, el empleado owner y configura Gunicorn como servicio del sistema.

```bash
sudo bash /home/Autopartes/scripts/setup_instance.sh "NOMBRE_NEGOCIO" "ID_INSTANCIA" "PIN"
```

**Parametros:**

| Parametro | Descripcion | Ejemplo |
|---|---|---|
| NOMBRE_NEGOCIO | Nombre de la refaccionaria | `"Refacciones El Toro"` |
| ID_INSTANCIA | Identificador unico (sin espacios ni acentos) | `"refac-eltoro"` |
| PIN | PIN de 4 digitos para el login del dueno | `"1234"` |

**Ejemplo completo:**

```bash
sudo bash /home/Autopartes/scripts/setup_instance.sh "Refacciones El Toro" "refac-eltoro" "1234"
```

Al terminar, el script muestra:
- El tenant ID asignado
- El PIN del owner
- La IP local del servidor
- Instrucciones para arrancar

**Anota el tenant_id** — lo necesitas para los siguientes pasos.

---

## Paso 3 — Importar el catalogo TecDoc

El catalogo de partes (1.5M+ partes OEM, 304K aftermarket, 15.8M cross-references) vive en la base de datos `nexus_autoparts`. Si esta es tu primera instalacion, necesitas cargar los datos desde un dump.

### Opcion A — Dump desde otra instancia

Desde la maquina que YA tiene el catalogo:

```bash
# Exportar (en la maquina origen)
pg_dump -U nexus -h localhost nexus_autoparts > /tmp/nexus_catalog.sql

# Copiar al nuevo servidor (via USB, SCP, o red)
scp /tmp/nexus_catalog.sql usuario@IP_NUEVA:/tmp/
```

En el nuevo servidor:

```bash
PGPASSWORD=nexus_autoparts_2026 psql -U nexus -h localhost -d nexus_autoparts < /tmp/nexus_catalog.sql
```

### Opcion B — Sin catalogo (solo inventario local)

Si no necesitas el catalogo TecDoc (solo vas a cargar el inventario de la refaccionaria), salta este paso. El POS funciona sin el catalogo — simplemente el buscador de partes OEM no tendra datos.

---

## Paso 4 — Importar inventario

Prepara un archivo CSV con el inventario de la refaccionaria. Columnas aceptadas (los nombres son flexibles):

```csv
numero_de_parte,nombre,marca,precio,existencia
FO-1234,Filtro de Aceite Tsuru,FRAM,185.50,12
BP-5678,Bujia NGK Sentra,NGK,45.00,50
BA-9012,Balata Delantera Jetta,WAGNER,320.00,8
```

**Columnas requeridas:** `numero_de_parte` (o `codigo`, `clave`, `sku`), `nombre` (o `descripcion`)

**Columnas opcionales:** `marca`, `precio` (o `precio_1`), `existencia` (o `stock`, `cantidad`), `costo`, `precio_2`, `precio_3`, `categoria`, `ubicacion`, `codigo_barras`

El importador acepta nombres en espanol, ingles, y formato SICAR.

### Primero verificar (dry run):

```bash
cd /home/Autopartes/pos
python3 ../scripts/import_inventory.py --tenant=TENANT_ID --csv=ruta/al/inventario.csv --dry-run
```

### Importar de verdad:

```bash
python3 ../scripts/import_inventory.py --tenant=TENANT_ID --csv=ruta/al/inventario.csv
```

Si el CSV tiene codificacion Latin-1 (comun en archivos de SICAR):

```bash
python3 ../scripts/import_inventory.py --tenant=TENANT_ID --csv=inventario.csv --encoding=latin-1
```

---

## Paso 5 — Configurar peers (red de bodegas)

Para que esta instancia pueda ver el inventario de las otras refaccionarias en la red, edita el archivo de peers:

```bash
nano /home/Autopartes/pos/peers.json
```

Ejemplo con 2 peers:

```json
{
  "instance_name": "Refacciones El Toro",
  "instance_id": "refac-eltoro",
  "tenant_id": 12,
  "peers": [
    {
      "name": "Refacciones La Esquina",
      "url": "http://192.168.10.20:5001",
      "enabled": true
    },
    {
      "name": "AutoPartes Central",
      "url": "http://192.168.10.30:5001",
      "enabled": true
    }
  ],
  "peer_timeout_seconds": 3
}
```

**Importante:** El `tenant_id` debe coincidir con el que te dio el script de instalacion en el Paso 2.

---

## Paso 6 — Arrancar el servicio

```bash
# Arrancar
sudo systemctl start nexus-pos

# Verificar que esta corriendo
sudo systemctl status nexus-pos

# Ver logs en tiempo real
sudo journalctl -u nexus-pos -f
```

Para que arranque automaticamente al encender la maquina:

```bash
sudo systemctl enable nexus-pos
```

### Arranque manual (sin Gunicorn):

```bash
cd /home/Autopartes/pos
python3 app.py
```

---

## Paso 7 — Verificar

Desde cualquier dispositivo en la misma red (PC, tablet, celular), abre un navegador:

```
http://IP_DEL_SERVIDOR:5001/pos/login
```

Login con el PIN que configuraste en el Paso 2.

### Verificar la salud del sistema:

```bash
curl http://localhost:5001/pos/health
# Debe responder: {"status": "ok"}

curl http://localhost:5001/pos/api/peer/health
# Debe responder con el nombre de la instancia y conteo de inventario
```

---

## Paso 8 — WhatsApp (opcional)

Para vincular un numero de WhatsApp al chatbot IA:

1. Arranca el bridge de WhatsApp:

```bash
cd /opt/whatsapp-bridge
npm install
nohup node server.js > /tmp/wa-bridge.log 2>&1 &
```

2. Abre el POS en el navegador → seccion WhatsApp
3. Click "Conectar WhatsApp"
4. Escanea el QR con el telefono que quieres vincular

### Configurar el bridge como servicio:

```bash
sudo cat > /etc/systemd/system/nexus-whatsapp.service << 'EOF'
[Unit]
Description=Nexus WhatsApp Bridge
After=network.target

[Service]
User=root
WorkingDirectory=/opt/whatsapp-bridge
ExecStart=/usr/bin/node server.js
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable nexus-whatsapp
sudo systemctl start nexus-whatsapp
```

---

## Comandos utiles

| Comando | Descripcion |
|---|---|
| `sudo systemctl start nexus-pos` | Arrancar el POS |
| `sudo systemctl stop nexus-pos` | Detener el POS |
| `sudo systemctl restart nexus-pos` | Reiniciar el POS |
| `sudo systemctl status nexus-pos` | Ver estado |
| `sudo journalctl -u nexus-pos -f` | Ver logs en vivo |
| `sudo systemctl start nexus-whatsapp` | Arrancar WhatsApp bridge |
| `curl localhost:5001/pos/health` | Verificar salud del POS |
| `curl localhost:21465/status` | Verificar WhatsApp bridge |

---

## Estructura de archivos

```
/home/Autopartes/
├── pos/                    # Aplicacion Flask (POS)
│   ├── app.py              # Punto de entrada
│   ├── config.py            # Configuracion (DB, JWT, SMTP)
│   ├── peers.json           # Configuracion de peers (red)
│   ├── blueprints/          # Endpoints REST
│   ├── services/            # Logica de negocio
│   ├── templates/           # Paginas HTML
│   └── static/              # CSS, JS, imagenes
├── dashboard/              # Servidor web publico (puerto 5000)
│   ├── server.py
│   ├── landing.html
│   └── catalog-public.html
├── scripts/                # Scripts de utilidad
│   ├── setup_instance.sh    # Instalacion automatica
│   ├── import_inventory.py  # Importar inventario CSV
│   └── seed_marketplace.py  # Datos de prueba marketplace
├── sql/                    # Migraciones de base de datos
├── pitch/                  # Pitch deck para inversionistas
└── vehicle_database/       # Schema del catalogo de vehiculos
```

---

## Solucion de problemas

### El POS no arranca

```bash
# Ver el error exacto
sudo journalctl -u nexus-pos --no-pager -n 50

# Verificar que PostgreSQL esta corriendo
sudo systemctl status postgresql

# Verificar que el puerto no esta ocupado
sudo fuser 5001/tcp
```

### No puedo acceder desde otro dispositivo

```bash
# Verificar el firewall
sudo ufw status
# Si esta activo, abrir el puerto:
sudo ufw allow 5001/tcp

# Verificar que el servicio escucha en todas las interfaces
ss -tlnp | grep 5001
# Debe mostrar 0.0.0.0:5001, NO 127.0.0.1:5001
```

### El inventario no se importo correctamente

```bash
# Verificar cuantos items hay
cd /home/Autopartes/pos
python3 -c "
from tenant_db import get_tenant_conn
conn = get_tenant_conn(TENANT_ID)
cur = conn.cursor()
cur.execute('SELECT COUNT(*) FROM inventory WHERE is_active = TRUE')
print(cur.fetchone()[0], 'items en inventario')
conn.close()
"
```

### WhatsApp no genera QR

```bash
# Limpiar sesion anterior y reiniciar
sudo rm -rf /opt/whatsapp-bridge/auth/
sudo systemctl restart nexus-whatsapp
# Esperar 10 segundos, luego revisar
curl localhost:21465/status
```

### Los peers no se ven entre si

```bash
# Desde esta maquina, verificar que el peer responde
curl http://IP_DEL_PEER:5001/pos/api/peer/health

# Si no responde, verificar:
# 1. Que el POS del peer esta corriendo
# 2. Que estan en la misma red
# 3. Que el firewall permite puerto 5001
ping IP_DEL_PEER
```

---

## Actualizaciones

Para actualizar el sistema a la ultima version:

```bash
cd /home/Autopartes
git pull origin main
sudo systemctl restart nexus-pos
```

Si hay migraciones de base de datos nuevas:

```bash
# Aplicar migraciones al master
PGPASSWORD=nexus_autoparts_2026 psql -U nexus -h localhost -d nexus_autoparts -f sql/marketplace_schema.sql

# Aplicar migraciones al tenant
PGPASSWORD=nexus_autoparts_2026 psql -U nexus -h localhost -d tenant_NOMBRE -f sql/marketplace_tenant_users.sql
```

---

## Soporte

- **Email:** ialcarazsalazar@consultoria-as.com
- **WhatsApp:** +52 664 217 0990
- **Gitea:** https://git.consultoria-as.com/consultoria-as/Autoparts-DB
