import { Aside } from "@astrojs/starlight/components";

La aprobación comercial (ACECF) es la confirmación de que un comprador
está de acuerdo con lo que dice un comprobante. Va en dos direcciones
independientes.

## Alguien más aprueba uno de tus comprobantes

```
POST /{tenantid}/fe/aprobacioncomercial/api/ecf
```

Misma ruta fija que la recepción de comprobantes, también sin credencial
por defecto. NovaFE valida el XML, verifica la firma, y contrasta el
ACECF contra el comprobante propio que dice aprobar o rechazar: emisor,
e-NCF, fecha de emisión, monto total y comprador tienen que coincidir
exactamente con lo que NovaFE ya tiene guardado.

<Aside type="note" title="Sin acuse propio">
  A diferencia de la recepción de comprobantes, aquí no hay un documento de
  respuesta firmado: cualquier objeción es un `400` simple, y una aprobación
  válida es un `200` sin cuerpo.
</Aside>

La decisión queda reflejada en tu comprobante y dispara el webhook
[`commercial_approval.received`](/webhooks/catalogo-de-eventos/).

<Aside type="tip" title="Una decisión nueva reemplaza a la anterior">
  Quien aprueba puede cambiar de decisión más adelante: una segunda llamada
  sobrescribe la anterior, no se acumulan.
</Aside>

## Tú apruebas uno que recibiste

```json
POST /api/v1/received-ecf/{id}/commercial-approval
{ "decision": "accepted" }
```

O, para rechazar, con el motivo obligatorio:

```json
{
  "decision": "rejected",
  "rejectionReason": "El monto no coincide con lo acordado"
}
```

Solo funciona sobre un comprobante que recibiste correctamente, que
todavía no tiene una decisión tuya y cuyo tipo admite aprobación comercial.
Responde `202`: NovaFE firma el ACECF con tu certificado y lo encola para
entregar, no lo envía dentro del mismo request.

<Aside type="note" title="Tipos que no admiten aprobación comercial">
  La DGII no admite aprobación comercial entre contribuyentes para los tipos 32
  (consumo), 41 (compras), 43 (gastos menores), 46 (exportaciones) y 47 (pagos
  al exterior). Intentarlo sobre uno de ellos responde `409`, y el campo
  `commercialApprovalApplies` de [lo
  recibido](/recepcion-b2b/consultar-recibidos/) ya viene en `false`.
</Aside>

<Aside type="caution" title="Esta decisión sí es definitiva">
  A diferencia de la dirección anterior, aquí no puedes cambiar de opinión
  después: un segundo intento sobre el mismo comprobante responde `409`.
</Aside>

### Aprobación automática (opcional)

Por defecto una persona decide cada comprobante recibido. Si recibes muchos de proveedores de
siempre, puedes pedir que se acepten solos con tres ajustes de Configuración:

| Ajuste                             | Qué hace                                                                       |
| ---------------------------------- | ------------------------------------------------------------------------------ |
| `inbound.auto_commercial_approval` | `manual` (por defecto) o `auto_trusted`.                                       |
| `inbound.trusted_issuers`          | RNC o cédulas, sin guiones, de los emisores de confianza.                      |
| `inbound.auto_approve_max_amount`  | Monto máximo en RD$. Es obligatorio: con 0 no se aprueba nada automáticamente. |

Un comprobante recibido de un emisor de confianza, por un monto que no pase del máximo, se acepta
al instante y su ACECF se entrega como cualquier otro. **Nunca se rechaza nada automáticamente**, y
todo lo demás (otro emisor, un monto mayor) queda pendiente de una persona. Cada aprobación
automática queda marcada como tal en el comprobante recibido (`commercialApprovalAutomatic` y
`commercialApprovalAutomaticRule`).

<Aside type="caution" title="La aprobación comercial tiene efectos fiscales">
  Activa esto solo si confías en los emisores de la lista y el monto máximo
  refleja lo que estás dispuesto a aceptar sin revisión.
</Aside>

### A dónde se entrega

A dos destinos independientes, cada uno con su propio reintento: si uno
falla, el otro no se bloquea.

1. **Al emisor del comprobante**: NovaFE busca su URL de recepción en el
   directorio de la DGII y le manda el ACECF a su propio endpoint de
   aprobación comercial (el mismo que describe esta página, del lado de
   quien recibe).
2. **A la DGII**: para que quede registrado también ahí.

<Aside
  type="caution"
  title="La entrega a la DGII todavía no está confirmada contra un TesteCF real"
>
  NovaFE interpreta el código de estado HTTP de esa llamada, pero la ruta y la
  forma exacta de la respuesta de la DGII para este flujo no se han confirmado
  contra un ambiente de pruebas real todavía.
</Aside>

<Aside type="note" title="Esta decisión no dispara ningún webhook">
  A diferencia de cuando alguien más aprueba uno de tus comprobantes, tu propia
  decisión sobre algo que recibiste no genera un evento. Consulta su estado en
  [Consultar lo recibido](/recepcion-b2b/consultar-recibidos/).
</Aside>