import { Aside, Code } from "@astrojs/starlight/components";
import models from "../../../../public/models/php/Ecf.php?raw";

Clases `final` con propiedades `readonly`, `jsonSerialize()` para armar el JSON del request y `fromArray()` para leer la respuesta. Requiere PHP 8.1 o superior; el espacio de nombres es `NovaFE\Client\Models`.

## Descargar

{/* prettier-ignore */}
- <a href="/models/php/Ecf.php" download>Ecf.php</a>: emisión de e-CF, con sus tipos anidados.
- <a href="/models/novafe-models-php.zip" download>novafe-models-php.zip</a>: todas las áreas de la API.
- <a href="/openapi/novafe-public.json" download>documento OpenAPI</a>: el contrato completo, para generar tus propios modelos.

## Ejemplo: emitir un comprobante

```php title="emitir.php"
<?php

declare(strict_types=1);

use NovaFE\Client\Models\EcfBuyerPayload;
use NovaFE\Client\Models\EcfDto;
use NovaFE\Client\Models\EcfLinePayload;
use NovaFE\Client\Models\EcfPaymentMethodPayload;
use NovaFE\Client\Models\EcfPaymentPayload;
use NovaFE\Client\Models\IssueEcfCommand;

$payload = new IssueEcfCommand(
    type: 31,
    lines: [
        new EcfLinePayload(
            name: "Servicio de consultoría",
            kind: "service",
            quantity: 1.0,
            unitOfMeasure: "43",
            unitPrice: 2000.0,
            itbisRate: 1,
        ),
    ],
    incomeType: "01",
    internalNumber: "FAC-2026-00042",
    buyer: new EcfBuyerPayload(rnc: "131880681", name: "Mi Cliente SRL"),
    payment: new EcfPaymentPayload(
        condition: "credit",
        dueDate: "15-03-2026",
        methods: [new EcfPaymentMethodPayload(type: "check_transfer", amount: 2360.0)],
    ),
);

$curl = curl_init("https://api.novafe.example/api/v1/ecf");
curl_setopt_array($curl, [
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => [
        "Content-Type: application/json",
        "X-API-Key: " . getenv("NOVAFE_API_KEY"),
        "Idempotency-Key: " . bin2hex(random_bytes(16)),
    ],
    CURLOPT_POSTFIELDS => json_encode($payload),
]);

$ecf = EcfDto::fromArray(json_decode(curl_exec($curl), true));
echo $ecf->encf . " " . $ecf->status . PHP_EOL;
```

## Modelos de emisión

Todo el contenido de `Ecf.php`, listo para copiar. Incluye `IssueEcfCommand` (el cuerpo de `POST /ecf`), `EcfDto` (la respuesta) y sus tipos anidados.

<Code code={models} lang="php" title="Ecf.php" />

<Aside type="tip" title="Otras áreas de la API">
  Los modelos de secuencias, webhooks, recepción B2B y el resto están en el zip
  y en la [página de descargas](/sdk-modelos/).
</Aside>