# Corrección FE webhook Hacienda, envío y consulta de estado

## Origen corregido

1. `MH_WEBHOOK_SECRET` era obligatorio en `HaciendaClient::sendDocument()` y bloqueaba el envío antes de llegar a Hacienda.
2. La consulta de estado intentaba reenviar documentos firmados y, si el reenvío fallaba, de todos modos consultaba Hacienda. Esto generaba `MH_STATUS_HTTP_ERROR` 400 para claves que Hacienda aún no tenía registradas.
3. El cliente de Hacienda usaba un endpoint sandbox no alineado con la URI oficial `recepcion-sandbox/v1` definida en el Anexo 3.
4. El webhook procesaba solo tablas `fe_*`; en CukPOS la tabla operativa es `documentos_electronicos`, por lo que los callbacks podían recibirse sin actualizar el documento real.
5. El webhook guardaba estados finales como `finalizado`; el panel requiere estados explícitos `ACEPTADO`, `RECHAZADO`, `ERROR`, `ENVIADO` o `PENDIENTE`.

## Archivos tocados

- `app/HttpClients/Clients/HaciendaClient.php`
- `app/Http/Controllers/Api/Hacienda/WebhookHaciendaController.php`
- `app/Services/HaciendaWebhookService.php`
- `app/Support/HaciendaWebhookConfig.php`
- `sql/20260704_webhook_hacienda_envio_estado_fix.sql`

## Requerido al desplegar

Ejecutar el SQL:

```sql
source sql/20260704_webhook_hacienda_envio_estado_fix.sql;
```

Luego limpiar caché de Laravel si está activa:

```bash
php artisan optimize:clear
```

Variables recomendadas:

```env
MH_WEBHOOK_BASE_URL=https://apicook.fasicat.com
FE_SEND_SIGNED_ON_STATUS_CHECK=true
```

`MH_WEBHOOK_SECRET` ahora puede configurarse explícitamente. Si no existe, el sistema deriva un token estable desde `APP_KEY`, evitando que la emisión quede bloqueada por falta de esa variable.
