# Kapital — Instrucciones para Claude Code

## Proyecto
Aplicación PHP/MySQL de punto de venta para restaurantes con múltiples sucursales.
- **Local**: `C:\xampp\htdocs\Kapital\` (XAMPP, PHP 8.x)
- **Producción**: `https://kapitalsushi.voyastic-dev.com/`
- **Panel WHM**: `https://201.131.126.247/whm`
- **Servidor**: cPanel, ea-php80, Apache, MariaDB 10.11

---

## Despliegue — comando "sube"

Cuando el usuario diga **"sube"**, ejecutar el script:

```powershell
& "C:\xampp\htdocs\Kapital\.claude\sube.ps1"
```

- Sube automáticamente todos los archivos modificados **desde la última subida** (por timestamp).
- Si el usuario dice **"sube todo"**, agregar `-Todo` para subir todo lo que tiene cambios en git status:

```powershell
& "C:\xampp\htdocs\Kapital\.claude\sube.ps1" -Todo
```

### Archivos EXCLUIDOS (nunca subir)
- `.claude\*` (settings, script, timestamp)
- `.git\*`
- `vendor\DBA.php` — las credenciales de producción son distintas a las locales

### Credenciales SSH/SCP
| Campo       | Valor                          |
|-------------|-------------------------------|
| Host        | 201.131.126.247               |
| Puerto      | 1891                          |
| Usuario     | root                          |
| Contraseña  | aIM3YM4a}?Oj_Y!              |
| Ruta remota | /home/kapital/public_html/Kapital/ |
| Tool        | C:\Program Files\PuTTY\pscp.exe |

### Conectarse al servidor manualmente (SSH)
```bash
! "C:\Program Files\PuTTY\plink.exe" -P 1891 -pw "aIM3YM4a}?Oj_Y!" root@201.131.126.247
```

### Ejecutar comando remoto sin entrar al shell
```powershell
& "C:\Program Files\PuTTY\plink.exe" -P 1891 -pw "aIM3YM4a}?Oj_Y!" root@201.131.126.247 "comando aqui"
```

---

## Estructura clave

```
Kapital/
├── vendor/
│   ├── DBA.php          ← EXCLUIDO del deploy (credenciales distintas en producción)
│   ├── funciones.php
│   └── ...
├── reportes/
│   ├── reporteSucursal.php      ← reporte ventas por sucursal (rediseñado)
│   └── funciones_php/
│       ├── datosVentas.php      ← queries de ventas por tipo
│       └── datosReportesEnsucursal.php
├── .claude/
│   ├── sube.ps1         ← script de deploy
│   └── last_upload.txt  ← timestamp de última subida
└── CLAUDE.md            ← este archivo
```

---

## Base de datos

### Conexión — dos capas
1. **`$conn`** → BD principal Kapital (`kapital_presto_ks`) — contiene `cat_sucursal` con credenciales cifradas de cada sucursal
2. **`$connSuc`** → BD propia de cada sucursal (se conecta dinámicamente con las credenciales descifradas)

Todas las queries de reportes corren en **`$connSuc`** (la BD de la sucursal).

### Credenciales producción en `vendor/DBA.php` (servidor)
```php
private function connect($dsn = 'mysql:host=localhost;dbname=kapital_presto_ks;port=3306',
                         $u = 'kapital_presto_ks', $p = 'N1Z^*OkhG*FJ')
```
**NO sobreescribir** — localmente tiene `root`/`''`.

### Tipos de pedido en tabla `pedido.tipo`
- `mesa` → pago en tabla `pago`
- `llevar` → pago en tabla `pago`
- `domicilio` → pago en tabla `pago_domicilio`
- `uber`, `rappi`, `delibot` → se agrupan como **delivery**, pago en tabla `pago`

### Status válidos para reportes
Solo incluir pedidos con: `status IN ('entregado','finalizado','cerrado')`

---

## Problemas conocidos y soluciones

### Include de `vendor/DBA.php` en archivos PHP de subdirectorios
Todo archivo PHP dentro de un subdirectorio (p. ej. `reportes/funciones_php/`, `gastosFijos/funciones_php/`, etc.) debe incluir el vendor con la ruta relativa correcta **y en este orden**:

```php
require("../../connect.php");

include('../../vendor/funciones.php');
include('../../vendor/DBA.php');
include('../../vendor/EncryptClass.php');
include('../../vendor/Security.php');
```

- `DBA.php` contiene el polyfill `Services_JSON` que reemplaza `json_encode`/`json_decode` cuando la extensión no está disponible en el servidor.
- Sin este include, el servidor lanza `Fatal error: Call to undefined function json_encode()`.
- La profundidad de `../../` depende del nivel del archivo; ajustar según corresponda (`../` para un nivel, `../../` para dos niveles, etc.).

### `json_decode()` no disponible en servidor
- El servidor carga PHP JSON como extensión compartida (.ini en `/opt/cpanel/ea-php80/root/etc/php.d/`)
- Solución: incluir `../../vendor/DBA.php` que tiene polyfill con `Services_JSON`

### `mysqli_stmt::get_result()` no disponible
- El servidor no tiene `mysqlnd` en contexto web
- Solución: función `stmt_get_result()` con `bind_result()` + `store_result()` manual (aplicada en `api_prestov2`)

### ONLY_FULL_GROUP_BY (MySQL strict mode)
- Error `#1055`: columnas en SELECT no están en GROUP BY
- Solución: agregar todas las columnas no-agregadas al GROUP BY, o usar `GROUP BY 1` para CASE WHEN expressions

### delivery en queries de totalizacion
- La BD guarda 'uber','rappi','delibot' — el JS espera 'delivery'
- Solución: `CASE WHEN p.tipo IN ('uber','rappi','delibot') THEN 'delivery' ELSE p.tipo END as tipo`

---

## Proyecto paralelo: api_prestov2
- Ruta local: `C:\xampp\htdocs\api_prestov2\`
- Ruta servidor: `/home/kapital/public_html/api_prestov2/`
- Su `vendor/DBA.php` también está excluido del deploy de Kapital
- Licencias y autenticación biométrica en `reportes/funciones_php/Licencia.php`
