Saltar al contenido

Ejemplos ejecutables de SDK

Estos ejemplos se extraen durante el build desde los ficheros de código SDK delimitados por marcadores estables. La documentación no mantiene una copia manual adicional del código.

Control de emisión

El ejemplo de primera factura valida antes de emitir y exige confirmación explícita del llamador y una clave de idempotencia. No lo ejecutes contra Production.

Primera factura

var draft = await client.Invoices.CreateDraftAsync(
new CreateInvoiceDraftRequest
{
CustomerId = Required("EMISSARY_CUSTOMER_ID"),
SeriesId = Required("EMISSARY_SERIES_ID"),
Currency = "EUR",
IssueDate = DateOnly.FromDateTime(DateTime.UtcNow),
Lines =
[
new InvoiceLineRequest
{
Description = "Software development service",
Quantity = 1,
Unit = "service",
UnitPrice = 100m,
DiscountType = "None",
DiscountValue = 0,
TaxRateId = Required("EMISSARY_TAX_RATE_ID")
}
]
},
idempotencyKey: Required("EMISSARY_DRAFT_IDEMPOTENCY_KEY"));
var validation = await client.Invoices.ValidateAsync(draft.Id);
Console.WriteLine($"Draft {draft.Id}: valid={validation.IsValid}");
foreach (var error in validation.Errors)
{
Console.WriteLine($"Validation: {error}");
}
if (!validation.IsValid || !string.Equals(Environment.GetEnvironmentVariable("EMISSARY_CONFIRM_ISSUE"), "true", StringComparison.OrdinalIgnoreCase))
{
Console.WriteLine("No invoice was issued. Set EMISSARY_CONFIRM_ISSUE=true to explicitly authorize the example issue call.");
return;
}
var issued = await client.Invoices.IssueAsync(
draft.Id,
new IssueInvoiceRequest { ExpectedVersion = draft.Version },
idempotencyKey: Required("EMISSARY_ISSUE_IDEMPOTENCY_KEY"));
Console.WriteLine($"Issued {issued.InvoiceNumber ?? issued.Id}; fiscal status: {issued.FiscalSubmissionStatus ?? issued.FiscalStatus ?? "not reported"}.");
//

Estado fiscal

var status = await client.Invoices.GetFiscalStatusAsync(Required("EMISSARY_INVOICE_ID"));
Console.WriteLine($"Invoice {status.InvoiceId}: commercial={status.CommercialStatus}, fiscal={status.FiscalStatus}");
if (status.LatestOperation is { } operation)
{
Console.WriteLine($"Operation {operation.Id}: {operation.Status}; code={operation.LatestErrorCode ?? "none"}");
}
//

Descargar un documento

var invoiceId = Required("EMISSARY_INVOICE_ID");
var documentId = Required("EMISSARY_DOCUMENT_ID");
await using var download = await client.Documents.DownloadAsync(invoiceId, documentId);
var destination = download.FileName ?? $"{documentId}.bin";
await using var file = File.Create(destination);
await download.Content.CopyToAsync(file);
Console.WriteLine($"Saved {destination} ({download.ContentType ?? "unknown content type"}).");
//

Verificación de webhook

var secret = Required("EMISSARY_WEBHOOK_SECRET");
var timestamp = Required("WEBHOOK-TIMESTAMP");
var signature = Required("WEBHOOK-SIGNATURE");
using var body = new MemoryStream();
await Console.OpenStandardInput().CopyToAsync(body);
var verified = EmissaryWebhookVerifier.Verify(body.ToArray(), timestamp, signature, secret);
Console.WriteLine(verified ? "Webhook signature verified." : "Webhook signature is invalid or outside the timestamp tolerance.");
//