# API REST de Facturación Electrónica SUNAT (Perú)

Esta API desarrollada en **PHP** utilizando la biblioteca **Greenter** permite generar, firmar digitalmente y enviar Comprobantes de Pago Electrónicos (CPE) directamente a la **SUNAT** (entorno de pruebas/Beta).

La API expone un **endpoint único y unificado** que detecta automáticamente el tipo de documento en el payload JSON recibido, procesándolo, firmándolo con el certificado digital y enviándolo de forma inmediata.

---

## Características
- **Portabilidad completa**: No requiere PHP ni Composer preinstalado de forma global en Windows; el entorno se ejecuta localmente desde la carpeta `bin/`.
- **Certificado de Pruebas Autogenerado**: Incluye un certificado digital de prueba autogenerado en `certs/certificate.pem` listo para funcionar con el Beta de la SUNAT.
- **Detección automática**: Soporta Facturas (`01`), Boletas (`03`), Notas de Crédito (`07`), Notas de Débito (`08`), Resúmenes Diarios (`RC`) y Comunicaciones de Baja (`RA`).
- **Resolución asíncrona automática**: Para Resúmenes Diarios y Comunicaciones de Baja, la API gestiona el ticket y realiza una consulta en bucle inteligente para retornar directamente el resultado de la Constancia de Recepción (CDR) de la SUNAT.

---

## Cómo Iniciar la API

1. **Inicializar el Servidor**:
   Levante el servidor web local incorporado de PHP ejecutando el siguiente comando en la raíz del proyecto:
   ```bash
   .\bin\php.bat -S localhost:8000 -t src/api
   ```

2. **Verificar el Estado**:
   Abra en su navegador o envíe una petición `GET` a:
   `http://localhost:8000/status`

---

## Endpoints de la API

### 1. `POST /send`
Envía cualquier documento a la SUNAT. El tipo de documento se determina mediante el campo `tipoDoc`.

- **Headers**: `Content-Type: application/json`
- **Respuestas**:
  - `200 OK`: El documento fue enviado y aceptado (o está en proceso). Retorna el resultado del CDR de la SUNAT.
  - `400 Bad Request` o `500 Internal Server Error`: En caso de errores de validación de SUNAT, firmas o sintaxis.

### 2. `GET /ticket-status?ticket={TICKET}&filename={FILENAME}`
Permite consultar el estado de un ticket generado por un Resumen Diario o Comunicación de Baja en caso de que la respuesta automática haya demorado más de lo esperado.

---

## Ejemplos de Payload JSON (POST `/send`)

### Ejemplo 1: Factura Electrónica (`tipoDoc`: "01")
```json
{
  "tipoDoc": "01",
  "serie": "F001",
  "correlativo": "999",
  "fechaEmision": "2026-07-09T08:00:00-05:00",
  "moneda": "PEN",
  "total": 118.00,
  "totalGravado": 100.00,
  "totalIgv": 18.00,
  "formaPago": "CONTADO",
  "emisor": {
    "ruc": "20123456789",
    "razonSocial": "EMPRESA DE PRUEBA S.A.C.",
    "direccion": "Av. Las Flores 123",
    "ubigueo": "150101",
    "departamento": "LIMA",
    "provincia": "LIMA",
    "distrito": "LIMA"
  },
  "cliente": {
    "tipoDoc": "6",
    "numDoc": "20445566778",
    "razonSocial": "CLIENTE DE PRUEBAS S.A.",
    "direccion": "Calle Los Pinos 456"
  },
  "detalles": [
    {
      "codigo": "P001",
      "descripcion": "Desarrollo de Software a Medida",
      "cantidad": 1,
      "unidadMedida": "NIU",
      "valorUnitario": 100.00,
      "precioUnitario": 118.00,
      "valorVenta": 100.00,
      "tipoAfectacionIgv": "10",
      "igv": 18.00
    }
  ],
  "leyendas": [
    {
      "codigo": "1000",
      "valor": "SON CIENTO DIECIOCHO Y 00/100 SOLES"
    }
  ]
}
```

### Ejemplo 2: Resumen Diario de Boletas (`tipoDoc`: "RC")
```json
{
  "tipoDoc": "RC",
  "correlativo": "001",
  "fechaComprobantes": "2026-07-09",
  "emisor": {
    "ruc": "20123456789",
    "razonSocial": "EMPRESA DE PRUEBA S.A.C."
  },
  "detalles": [
    {
      "tipoDoc": "03",
      "serieNro": "B001-52",
      "clienteTipo": "1",
      "clienteNro": "44556677",
      "estado": "1",
      "total": 59.00,
      "totalGravado": 50.00,
      "totalIgv": 9.00
    }
  ]
}
```

### Ejemplo 3: Comunicación de Baja de Facturas (`tipoDoc`: "RA")
```json
{
  "tipoDoc": "RA",
  "correlativo": "001",
  "fechaComprobantes": "2026-07-09",
  "emisor": {
    "ruc": "20123456789",
    "razonSocial": "EMPRESA DE PRUEBA S.A.C."
  },
  "detalles": [
    {
      "tipoDoc": "01",
      "serie": "F001",
      "correlativo": "999",
      "motivoAnulacion": "Error en digitación de RUC del receptor"
    }
  ]
}
```
