sifende

package module
v0.2.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 26, 2026 License: Apache-2.0 Imports: 21 Imported by: 0

README

sifende-go

SDK de Sifende para Go: emití facturas electrónicas, notas de crédito y eventos de SIFEN, verificá webhooks y calculá totales con las mismas reglas que la API.

  • Sin dependencias: sólo la biblioteca estándar.
  • Tipos generados desde el OpenAPI de la API, con los montos como Decimal exacto: nunca pasan por un float.
  • Reintentos seguros: cada operación tributaria viaja con Idempotency-Key.

Instalación

go get github.com/ithdev/sifende-go

Requiere Go 1.26 o posterior.

Necesitás una API key de Sifende. El prefijo de la clave fija el ambiente: sk_live_, sk_test_ o sk_sandbox_. La referencia completa de la API está en sifende.com.py/docs.

La API key emite documentos a nombre del contribuyente: usá el SDK sólo en el servidor, nunca dentro de una app distribuida.

Uso

cliente, err := sifende.NuevoCliente(os.Getenv("SIFENDE_API_KEY"))
if err != nil {
	return err
}
pedidoID := "1001" // el id de la venta en tu sistema

factura := &sifende.FacturaElectronicaRequest{
	TipoEmision:           sifende.TipoEmisionNormal,
	NumeroEstablecimiento: 1,
	PuntoExpedicion:       2,
	TipoTransaccion:       sifende.TipoTransaccionVentaMercaderia,
	IndicadorPresencia:    sifende.IndicadorPresenciaOperacionElectronica,
	CondicionOperacion:    sifende.CondicionOperacionContado,
	Receptor: sifende.ReceptorDTO{
		TipoContribuyente: sifende.NaturalezaNoContribuyente,
		TipoOperacion:     sifende.TipoOperacionB2C,
		TipoDocumento:     sifende.TipoDocumentoIdentidadInnominado,
		NumeroDocumento:   "0",
		NombreRazonSocial: "Sin Nombre",
	},
	Items: []sifende.ItemDTO{
		{
			Codigo: "REM-01", Descripcion: "Remera", Cantidad: sifende.NuevoDecimal(2), UnidadMedida: "UNI",
			PrecioUnitario: sifende.NuevoDecimal(150_000), AfectacionTributaria: sifende.AfectacionTributariaGravado,
			TasaIVA: new(int32(10)),
		},
		{
			Codigo: "ENVIO", Descripcion: "Envío", Cantidad: sifende.NuevoDecimal(1), UnidadMedida: "UNI",
			PrecioUnitario: sifende.NuevoDecimal(25_000), AfectacionTributaria: sifende.AfectacionTributariaGravado,
			TasaIVA: new(int32(10)),
		},
	},
}
totales, err := factura.Totales()
if err != nil {
	return err
}
factura.Pagos = []sifende.PagoFacturaDTO{
	{TipoPago: sifende.TipoPagoTransferencia, MontoPago: totales.TotalGeneral, MonedaPago: sifende.MonedaPYG},
}

documento, err := cliente.Documentos.Emitir(ctx, factura, "pedido-"+pedidoID)
if err != nil {
	return err
}
fmt.Println(documento.CDC, documento.Estado) // PENDIENTE

El documento queda en PENDIENTE hasta que SIFEN lo procesa. El resultado llega por webhook o con Documentos.ConsultarEstado(ctx, cdc).

En una operación al contado, MontoPago tiene que coincidir con el total redondeado. Totales (y CalcularTotales para armar el documento a mano) aplica el redondeo oficial de la SET: en guaraníes, al múltiplo de 50 inferior.

Emitir acepta cualquier SolicitudEmision: *FacturaElectronicaRequest, *NotaCreditoElectronicaRequest, *NotaDebitoElectronicaRequest, *NotaRemisionElectronicaRequest o *AutofacturaElectronicaRequest. Cada una envía su tipoDocumento sola.

Campos opcionales y montos

En una solicitud, un campo opcional que admite cero es un puntero: nil no se envía. Con Go 1.26, new(int32(10)) o new(sifende.MustDecimal("12.5")) lo arma en una línea. Los textos y las enumeraciones opcionales no son punteros: el valor vacío no se envía.

Los montos, cantidades y tasas son sifende.Decimal. Crealos con NuevoDecimal(150000), ParsearDecimal("19.99") o MustDecimal("19.99") para literales. Comparar los compara sin importar la escala: 1.50 y 1.5 son iguales.

En una respuesta, los campos son valores, y los objetos anidados son punteros que quedan en nil si no vinieron.

Configuración

cliente, err := sifende.NuevoCliente(apiKey,
	sifende.ConTimeout(10*time.Second),
	sifende.ConMaxReintentos(3),
)
Opción Por defecto
ConTimeout(d) 30 s Tiempo máximo por intento, lectura del cuerpo incluida.
ConMaxReintentos(n) 2 Reintentos ante fallas transitorias. 0 los desactiva.
ConBaseURL(url) https://api.sifende.com.py
ConHTTPClient(c) &http.Client{} Para usar un proxy o un transporte instrumentado.

Todas las operaciones reciben un context.Context: cancelarlo corta la operación y sus reintentos.

Operaciones

Método Endpoint
Documentos.Emitir(ctx, documento, idempotencyKey) POST /api/v1/documento-electronico
Documentos.ConsultarEstado(ctx, cdc) GET /api/v1/documento-electronico/status/{cdc}
Documentos.DescargarKude(ctx, cdc, espera) GET /api/v1/documento-electronico/{cdc}/kude
Documentos.DescargarKudeTicket(ctx, cdc, opciones) GET /api/v1/documento-electronico/{cdc}/kude/ticket
Documentos.DescargarKudeTicketImagen(ctx, cdc, opciones) GET /api/v1/documento-electronico/{cdc}/kude/ticket/imagen
Documentos.DescargarXML(ctx, cdc) GET /api/v1/documento-electronico/{cdc}/xml
Documentos.Cancelar(ctx, cdc, cancelacion, idempotencyKey) POST /api/v1/documento-electronico/{cdc}/cancelar
Documentos.Nominar(ctx, cdc, nominacion, idempotencyKey) POST /api/v1/documento-electronico/{cdc}/nominar
Documentos.Inutilizar(ctx, rango, idempotencyKey) POST /api/v1/documento-electronico/inutilizar
Documentos.ListarEventos(ctx, filtro) GET /api/v1/documento-electronico/eventos
Documentos.ConsultarEvento(ctx, id) GET /api/v1/documento-electronico/eventos/{id}
Contribuyente.Consultar(ctx) GET /api/v1/contribuyente
Contribuyente.ConsultarConsumoPlan(ctx) GET /api/v1/contribuyente/plan-consumo
Padron.Consultar(ctx, rucOCedula) GET /api/v1/padron/{documento}
Catalogos.Enumeraciones(ctx) GET /api/v1/public/enums
Catalogos.Departamentos(ctx), Distritos(ctx, id), Ciudades(ctx, id), CiudadesDeDepartamento(ctx, id) GET /api/v1/geografia/…
Webhooks.Listar(ctx), Crear(ctx, webhook) GET, POST /api/v1/contribuyente/webhooks
Webhooks.Consultar(ctx, id), Actualizar(ctx, id, webhook), Eliminar(ctx, id) GET, PUT, DELETE /api/v1/contribuyente/webhooks/{id}
Webhooks.RotarSecreto(ctx, id) POST /api/v1/contribuyente/webhooks/{id}/rotar
Webhooks.ListarEntregas(ctx, id, filtro) GET /api/v1/contribuyente/webhooks/{id}/entregas

Los catálogos son públicos y no envían la API key.

DescargarKude espera hasta 3 minutos a que el PDF esté listo; si no lo está, devuelve *ErrorKudePendiente. Con espera distinta de cero cambiás ese plazo.

DescargarKudeTicket devuelve el KuDE en cinta de papel para impresoras térmicas (Ancho 80 o 58 mm) y DescargarKudeTicketImagen el mismo ticket como PNG de 1 bit para ESC/POS (Puntos 576, 512 o 384). Con Resumen: true omiten el detalle de ítems e impuestos. Sólo existen para facturas y notas de crédito o débito. DescargarXML devuelve el XML firmado tal como se envió a SIFEN.

Para poder retomar una operación después de un corte, generá vos la idempotencyKey y guardala antes de enviar. Si pasás "", el SDK genera un UUID que sólo reusa en sus propios reintentos.

Errores

_, err := cliente.Documentos.Emitir(ctx, factura, idempotencyKey)

var errorAPI *sifende.ErrorAPI
var errorConexion *sifende.ErrorConexion
switch {
case errors.As(err, &errorAPI):
	errorAPI.Status    // 400
	errorAPI.Codigo    // "validation-error", "document-quota-exceeded", …
	errorAPI.Errores() // map[receptor.digitoVerificador:…]
case errors.As(err, &errorConexion):
	errorConexion.IdempotencyKey // repetí la operación con esta clave
	errorConexion.Timeout        // true si venció el timeout, incluso a mitad de la respuesta
}

Si cancelás el context, el error es el del contexto (context.Canceled o la causa que pasaste a context.WithCancelCause), no un error del SDK.

El SDK reintenta sólo los casos que la API marca como seguros, y respeta Retry-After:

  • Cortes de conexión en consultas y en operaciones con clave de idempotencia.
  • 409 idempotency-in-progress, 503 idempotency-upstream-unknown y 503 evento-nominacion-error.
  • 429.
  • 500, 502, 503 y 504 en consultas.

Webhooks

La firma se calcula sobre el cuerpo tal como llegó. Pasá los bytes crudos, antes de decodificar el JSON:

http.HandleFunc("POST /webhooks/sifende", func(w http.ResponseWriter, r *http.Request) {
	cuerpo, err := io.ReadAll(r.Body)
	if err != nil {
		w.WriteHeader(http.StatusBadRequest)
		return
	}
	evento, err := sifende.VerificarWebhook(sifende.OpcionesVerificacion{
		Cuerpo:   cuerpo,
		Headers:  r.Header,
		Secretos: []string{os.Getenv("SIFENDE_WEBHOOK_SECRET")},
	})
	if errors.Is(err, sifende.ErrFirmaWebhookInvalida) {
		w.WriteHeader(http.StatusUnauthorized)
		return
	}
	if err != nil {
		w.WriteHeader(http.StatusBadRequest)
		return
	}
	if evento.Tipo == sifende.TipoEventoWebhookDocumentoAprobado {
		if datos, err := evento.Documento(); err == nil {
			log.Println(datos.CDC, datos.Estado)
		}
	}
	w.WriteHeader(http.StatusNoContent)
})

Los tipos de evento son documento.aprobado, documento.rechazado, documento.cancelado y lote.procesado. Su Data se lee con evento.Documento(), evento.Cancelacion() o evento.Lote().

Webhooks registra y administra los endpoints. El secreto whsec_… llega sólo en la respuesta de Crear y de RotarSecreto, y ninguno de los dos admite Idempotency-Key: el SDK no los repite ante un corte. Si se corta un Crear, revisá Listar antes de volver a intentar.

Una entrega puede repetirse: deduplicá por evento.ID. VerificarWebhook rechaza una entrega si su X-Sifende-Timestamp difiere más de 5 minutos de tu reloj; ajustalo con Tolerancia. Durante una rotación de secreto, pasá Secretos: []string{nuevo, anterior}. FirmarWebhook calcula la firma para probar tu endpoint.

Desarrollo

go vet ./... && go test -race ./...

tipos_gen.go se genera desde el OpenAPI de la API con internal/generar, que sólo usa la biblioteca estándar. Para regenerarlo contra producción o contra una copia local del spec:

go generate ./...
SIFENDE_OPENAPI=./openapi.json go generate ./...

Licencia

Apache 2.0. Copyright 2026 ITH E.A.S.; ver NOTICE.

Documentation

Overview

Package sifende es el SDK de Sifende para Go: emití facturas electrónicas, notas de crédito y eventos de SIFEN, verificá webhooks y calculá totales con las mismas reglas que la API.

Los montos, cantidades y tasas son Decimal: aritmética exacta, sin pasar por float. Cada operación tributaria viaja con Idempotency-Key, así que reintentar nunca duplica un documento.

La referencia completa de la API está en https://sifende.com.py/docs.

Example
package main

import (
	"context"
	"fmt"
	"log"
	"os"

	"github.com/ithdev/sifende-go"
)

func main() {
	ctx := context.Background()
	cliente, err := sifende.NuevoCliente(os.Getenv("SIFENDE_API_KEY"))
	if err != nil {
		log.Fatal(err)
	}
	pedidoID := "1001" // el id de la venta en tu sistema

	factura := &sifende.FacturaElectronicaRequest{
		TipoEmision:           sifende.TipoEmisionNormal,
		NumeroEstablecimiento: 1,
		PuntoExpedicion:       2,
		TipoTransaccion:       sifende.TipoTransaccionVentaMercaderia,
		IndicadorPresencia:    sifende.IndicadorPresenciaOperacionElectronica,
		CondicionOperacion:    sifende.CondicionOperacionContado,
		Receptor: sifende.ReceptorDTO{
			TipoContribuyente: sifende.NaturalezaNoContribuyente,
			TipoOperacion:     sifende.TipoOperacionB2C,
			TipoDocumento:     sifende.TipoDocumentoIdentidadInnominado,
			NumeroDocumento:   "0",
			NombreRazonSocial: "Sin Nombre",
		},
		Items: []sifende.ItemDTO{
			{
				Codigo: "REM-01", Descripcion: "Remera", Cantidad: sifende.NuevoDecimal(2), UnidadMedida: "UNI",
				PrecioUnitario: sifende.NuevoDecimal(150_000), AfectacionTributaria: sifende.AfectacionTributariaGravado,
				TasaIVA: new(int32(10)),
			},
			{
				Codigo: "ENVIO", Descripcion: "Envío", Cantidad: sifende.NuevoDecimal(1), UnidadMedida: "UNI",
				PrecioUnitario: sifende.NuevoDecimal(25_000), AfectacionTributaria: sifende.AfectacionTributariaGravado,
				TasaIVA: new(int32(10)),
			},
		},
	}
	totales, err := factura.Totales()
	if err != nil {
		log.Fatal(err)
	}
	factura.Pagos = []sifende.PagoFacturaDTO{
		{TipoPago: sifende.TipoPagoTransferencia, MontoPago: totales.TotalGeneral, MonedaPago: sifende.MonedaPYG},
	}

	documento, err := cliente.Documentos.Emitir(ctx, factura, "pedido-"+pedidoID)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(documento.CDC, documento.Estado) // PENDIENTE
}

Index

Examples

Constants

View Source
const EsperaKudePorDefecto = 3 * time.Minute

EsperaKudePorDefecto es cuánto espera DescargarKude si no se indica otra espera.

View Source
const ToleranciaWebhookPorDefecto = 5 * time.Minute

ToleranciaWebhookPorDefecto es la diferencia máxima aceptada entre X-Sifende-Timestamp y el reloj local.

View Source
const URLBase = "https://api.sifende.com.py"

URLBase es la URL de la API. Es la misma para los tres ambientes: el ambiente lo fija la API key.

View Source
const Version = "0.2.0"

Version es la versión del SDK. Viaja en el User-Agent.

Variables

View Source
var ErrFirmaWebhookInvalida = errors.New("sifende: firma de webhook inválida")

ErrFirmaWebhookInvalida envuelve todo rechazo de VerificarWebhook: firma distinta, headers faltantes o timestamp fuera de la tolerancia. Respondé 401 y no proceses el evento.

Functions

func FirmarWebhook

func FirmarWebhook(secreto, eventID, deliveryID string, timestamp int64, cuerpo []byte) string

FirmarWebhook calcula X-Sifende-Signature para un cuerpo dado. Sirve para probar tu endpoint.

Types

type ActividadEconomica

type ActividadEconomica struct {
	Codigo      string `json:"codigo,omitempty"`
	Descripcion string `json:"descripcion,omitempty"`
}

ActividadEconomica es un objeto de la API de Sifende.

type ActualizarWebhookIntegracionRequest

type ActualizarWebhookIntegracionRequest struct {
	// URL HTTPS pública que recibe los eventos. No se siguen redirects.
	URL string `json:"url"`
	// Eventos a los que se suscribe el webhook.
	Eventos []TipoEventoWebhook `json:"eventos"`
	// `false` pausa el webhook y cancela sus entregas pendientes.
	Activo bool `json:"activo"`
}

ActualizarWebhookIntegracionRequest es un objeto de la API de Sifende.

type AfectacionTributaria

type AfectacionTributaria string

AfectacionTributaria es una enumeración de la API. Un valor fuera de las constantes se envía tal cual y la API lo valida.

const (
	AfectacionTributariaGravado        AfectacionTributaria = "GRAVADO"
	AfectacionTributariaExonerado      AfectacionTributaria = "EXONERADO"
	AfectacionTributariaExento         AfectacionTributaria = "EXENTO"
	AfectacionTributariaGravadoParcial AfectacionTributaria = "GRAVADO_PARCIAL"
)

type Ambiente

type Ambiente string

Ambiente es una enumeración de la API. Un valor fuera de las constantes se envía tal cual y la API lo valida.

const (
	AmbienteDev     Ambiente = "DEV"
	AmbienteProd    Ambiente = "PROD"
	AmbienteSandbox Ambiente = "SANDBOX"
)

type ApiResponseListCiudadDTO

type ApiResponseListCiudadDTO struct {
	Data      []CiudadDTO `json:"data,omitempty"`
	Timestamp string      `json:"timestamp,omitempty"`
	Errors    []string    `json:"errors,omitempty"`
}

ApiResponseListCiudadDTO es un objeto de la API de Sifende.

type ApiResponseListDepartamentoDTO

type ApiResponseListDepartamentoDTO struct {
	Data      []DepartamentoDTO `json:"data,omitempty"`
	Timestamp string            `json:"timestamp,omitempty"`
	Errors    []string          `json:"errors,omitempty"`
}

ApiResponseListDepartamentoDTO es un objeto de la API de Sifende.

type ApiResponseListDistritoDTO

type ApiResponseListDistritoDTO struct {
	Data      []DistritoDTO `json:"data,omitempty"`
	Timestamp string        `json:"timestamp,omitempty"`
	Errors    []string      `json:"errors,omitempty"`
}

ApiResponseListDistritoDTO es un objeto de la API de Sifende.

type ApiResponsePadron

type ApiResponsePadron struct {
	// Datos de un contribuyente o ciudadano según el padrón de la SET. Los nombres de campo y las enumeraciones son los del receptor de un documento electrónico.
	Data      *Padron  `json:"data,omitempty"`
	Timestamp string   `json:"timestamp,omitempty"`
	Errors    []string `json:"errors,omitempty"`
}

ApiResponsePadron es un objeto de la API de Sifende.

type AsociacionFacturaDTO

type AsociacionFacturaDTO struct {
	// `ELECTRONICO` o `IMPRESO` (H002)
	TipoDocumento TipoDocumentoAsociado `json:"tipoDocumento"`
	// ELECTRONICO: CDC de una NRE (07…) o de una FE de anticipo (01…) del mismo emisor (H004)
	CDC string `json:"cdc,omitempty"`
	// IMPRESO: timbrado del documento impreso (H005)
	NumeroTimbrado string `json:"numeroTimbrado,omitempty"`
	// IMPRESO: establecimiento (H006)
	Establecimiento string `json:"establecimiento,omitempty"`
	// IMPRESO: punto de expedición (H007)
	PuntoExpedicion string `json:"puntoExpedicion,omitempty"`
	// IMPRESO: número del documento (H008)
	NumeroDocumento string `json:"numeroDocumento,omitempty"`
	// IMPRESO: `FACTURA` (anticipo) o `NOTA_DE_REMISION` (H009)
	TipoDocumentoImpreso TipoDocumentoImpreso `json:"tipoDocumentoImpreso,omitempty"`
	// IMPRESO: fecha de emisión (H011)
	FechaEmision string `json:"fechaEmision,omitempty"`
	// Comprobante de retención (H012). Opcional y sólo con un pago `RETENCION`
	NumeroComprobanteRetencion string `json:"numeroComprobanteRetencion,omitempty"`
	// Resolución de crédito fiscal (H013). Obligatoria y exclusiva de `VENTA_CREDITO_FISCAL`
	NumeroResolucionCreditoFiscal string `json:"numeroResolucionCreditoFiscal,omitempty"`
}

AsociacionFacturaDTO: Documento referenciado por la factura (H001): una nota de remisión o una factura de anticipo, electrónica (`cdc`) o impresa (timbrado, establecimiento, punto, número, tipo y fecha).

type AutofacturaElectronicaRequest

type AutofacturaElectronicaRequest struct {
	// Fecha y hora de emisión en hora local de Paraguay, sin zona ni offset. Si se omite, se usa la fecha y hora del servidor al recibir el request
	FechaEmision string `json:"fechaEmision,omitempty"`
	// Sólo se admite `NORMAL`: SIFEN todavía no habilita la emisión en contingencia
	TipoEmision TipoEmision `json:"tipoEmision"`
	// Establecimiento habilitado del emisor (1-999)
	NumeroEstablecimiento int32 `json:"numeroEstablecimiento"`
	// Punto de expedición dentro del establecimiento (1-999)
	PuntoExpedicion int32 `json:"puntoExpedicion"`
	// Número de documento (dNumDoc) asignado por tu sistema, de 1 a 9.999.999. Si se omite, Sifende asigna el siguiente correlativo del punto de expedición
	NumeroDocumento *int64 `json:"numeroDocumento,omitempty"`
	// Código de seguridad (dCodSeg) de 9 dígitos. Con el mismo número y la misma fecha de emisión produce siempre el mismo CDC. Si se omite, Sifende genera uno al azar
	CodigoSeguridad string `json:"codigoSeguridad,omitempty"`
	// Timbrado con el que tu sistema numera. Si se informa y no coincide con el timbrado cargado en Sifende para el ambiente, el documento se rechaza con `timbrado-mismatch`
	NumeroTimbrado *int32 `json:"numeroTimbrado,omitempty"`
	// Naturaleza de la operación. Obligatorio para factura y autofactura; no se informa en notas de crédito, débito ni remisión
	TipoTransaccion TipoTransaccion `json:"tipoTransaccion,omitempty"`
	// Moneda de la operación
	MonedaOperacion Moneda `json:"monedaOperacion,omitempty"`
	// Códigos de obligaciones tributarias afectadas (D030)
	ObligacionesAfectadas []string `json:"obligacionesAfectadas,omitempty"`
	// Texto libre adicional del emisor (B005), de 1 a 3000 caracteres en una sola línea
	InfoEmisor string               `json:"infoEmisor,omitempty"`
	Items      []ItemAutofacturaDTO `json:"items"`
	// Sólo CONTADO
	CondicionOperacion CondicionOperacion `json:"condicionOperacion,omitempty"`
	// Vendedor de la compra documentada por la autofactura (grupo E4)
	Vendedor VendedorAutofacturaDTO `json:"vendedor"`
	// Dirección y códigos geográficos del vendedor o del lugar de la operación
	LugarOperacion DomicilioAutofacturaDTO `json:"lugarOperacion"`
	// Constancia electrónica asociada a la autofactura (grupo H)
	Constancia    ConstanciaAutofacturaDTO                   `json:"constancia"`
	CondicionPago AutofacturaElectronicaRequestCondicionPago `json:"condicionPago"`
	EmailEntrega  string                                     `json:"emailEntrega,omitempty"`
}

AutofacturaElectronicaRequest: Autofactura electrónica. El comprador se deriva del contribuyente autenticado; no se envía receptor.

func (AutofacturaElectronicaRequest) MarshalJSON

func (s AutofacturaElectronicaRequest) MarshalJSON() ([]byte, error)

MarshalJSON agrega tipoDocumento al cuerpo.

func (*AutofacturaElectronicaRequest) TipoDocumento

TipoDocumento devuelve TipoDocumentoAutofacturaElectronica: el valor que AutofacturaElectronicaRequest envía en tipoDocumento.

type AutofacturaElectronicaRequestCondicionPago

type AutofacturaElectronicaRequestCondicionPago struct {
	Tipo string `json:"tipo"`
}

AutofacturaElectronicaRequestCondicionPago es un objeto de la API de Sifende.

type CancelacionRequest

type CancelacionRequest struct {
	Motivo string `json:"motivo"`
}

CancelacionRequest es un objeto de la API de Sifende.

type CaracteristicaCarga

type CaracteristicaCarga string

CaracteristicaCarga es una enumeración de la API. Un valor fuera de las constantes se envía tal cual y la API lo valida.

const (
	CaracteristicaCargaMercaderiaConCadenaDeFrio CaracteristicaCarga = "MERCADERIA_CON_CADENA_DE_FRIO"
	CaracteristicaCargaCargaPeligrosa            CaracteristicaCarga = "CARGA_PELIGROSA"
	CaracteristicaCargaOtro                      CaracteristicaCarga = "OTRO"
)

type CargaRemisionDTO

type CargaRemisionDTO struct {
	UnidadMedidaVolumen UnidadMedida        `json:"unidadMedidaVolumen,omitempty"`
	VolumenTotal        string              `json:"volumenTotal,omitempty"`
	UnidadMedidaPeso    UnidadMedida        `json:"unidadMedidaPeso,omitempty"`
	PesoTotal           string              `json:"pesoTotal,omitempty"`
	Caracteristica      CaracteristicaCarga `json:"caracteristica,omitempty"`
	// Sólo OTRO: descripción requerida. En los otros tipos se deriva la descripción oficial
	DescripcionCaracteristica string `json:"descripcionCaracteristica,omitempty"`
}

CargaRemisionDTO es un objeto de la API de Sifende.

type ChequePagoDTO

type ChequePagoDTO struct {
	// Número del cheque (E631). Se completa con ceros a la izquierda hasta 8
	NumeroCheque string `json:"numeroCheque"`
	// Banco emisor (E632)
	BancoCheque string `json:"bancoCheque"`
}

ChequePagoDTO: Pago con cheque (E630)

type CiudadDTO

type CiudadDTO struct {
	CiudadID   int32  `json:"ciudadId,omitempty"`
	DistritoID int32  `json:"distritoId,omitempty"`
	Codigo     int32  `json:"codigo,omitempty"`
	Nombre     string `json:"nombre,omitempty"`
}

CiudadDTO es un objeto de la API de Sifende.

type Cliente

type Cliente struct {
	Documentos    *ServicioDocumentos
	Contribuyente *ServicioContribuyente
	Padron        *ServicioPadron
	Catalogos     *ServicioCatalogos
	Webhooks      *ServicioWebhooks
	// contains filtered or unexported fields
}

Cliente habla con la API de Sifende. Es seguro usarlo desde varias goroutines.

func NuevoCliente

func NuevoCliente(apiKey string, opciones ...Opcion) (*Cliente, error)

NuevoCliente crea un cliente con la API key del contribuyente: sk_live_…, sk_test_… o sk_sandbox_….

La API key emite documentos a nombre del contribuyente: usala sólo en el servidor.

func (*Cliente) Ambiente

func (c *Cliente) Ambiente() Ambiente

Ambiente es el ambiente que fija el prefijo de la API key: sk_live_ → PROD, sk_test_ → DEV, sk_sandbox_ → SANDBOX. Vacío para una clave sin prefijo conocido.

type CodigoNombre

type CodigoNombre struct {
	// Código SIFEN (cDepRec / cDisRec / cCiuRec).
	Codigo int32  `json:"codigo,omitempty"`
	Nombre string `json:"nombre,omitempty"`
}

CodigoNombre es un objeto de la API de Sifende.

type ComprasPublicasDTO

type ComprasPublicasDTO struct {
	// Modalidad de contratación (E021), exactamente 2 caracteres no blancos
	Modalidad string `json:"modalidad"`
	// Entidad contratante (E022), 5 dígitos y valor mayor que cero
	Entidad string `json:"entidad"`
	// Año de contratación (E023), 2 dígitos y valor mayor que cero
	Anho string `json:"anho"`
	// Secuencia de contratación (E024), 7 dígitos y valor mayor que cero
	Secuencia string `json:"secuencia"`
	// Fecha de emisión del código (E025), anterior a la fecha efectiva de la FE
	FechaEmisionCodigo string `json:"fechaEmisionCodigo"`
}

ComprasPublicasDTO: Datos opcionales de contratación pública, en cualquier operación. Los códigos deben enviarse como strings canónicos; la API no agrega ceros ni acepta números.

type CondicionAnticipo

type CondicionAnticipo string

CondicionAnticipo es una enumeración de la API. Un valor fuera de las constantes se envía tal cual y la API lo valida.

const (
	CondicionAnticipoAnticipoGlobal  CondicionAnticipo = "ANTICIPO_GLOBAL"
	CondicionAnticipoAnticipoPorItem CondicionAnticipo = "ANTICIPO_POR_ITEM"
)

type CondicionCredito

type CondicionCredito string

CondicionCredito es una enumeración de la API. Un valor fuera de las constantes se envía tal cual y la API lo valida.

const (
	CondicionCreditoPlazo CondicionCredito = "PLAZO"
	CondicionCreditoCuota CondicionCredito = "CUOTA"
)

type CondicionOperacion

type CondicionOperacion string

CondicionOperacion es una enumeración de la API. Un valor fuera de las constantes se envía tal cual y la API lo valida.

const (
	CondicionOperacionContado CondicionOperacion = "CONTADO"
	CondicionOperacionCredito CondicionOperacion = "CREDITO"
)

type CondicionPagoDTO

type CondicionPagoDTO struct {
	// `CONTADO` o `CREDITO`. Coincide con el `condicionOperacion` del documento
	Tipo CondicionOperacion `json:"tipo,omitempty"`
	// Medio de pago
	TipoPago TipoPago `json:"tipoPago,omitempty"`
	// Descripción propia del medio (E607). Obligatoria y exclusiva de `tipoPago = OTRO`
	DescripcionTipoPago string `json:"descripcionTipoPago,omitempty"`
	// Moneda del pago
	MonedaPago Moneda `json:"monedaPago,omitempty"`
	// Monto pagado en `monedaPago`. Obligatorio para `tipo = CONTADO`
	MontoPago *Decimal `json:"montoPago,omitempty"`
	// Tipo de cambio de la moneda del pago (E611)
	TipoCambio *Decimal `json:"tipoCambio,omitempty"`
	// Denominación de la tarjeta (E621). Se asume `OTRO` si no se informa
	TipoTarjeta TipoTarjeta `json:"tipoTarjeta,omitempty"`
	// Descripción propia de la tarjeta (E622). Obligatoria y exclusiva de `tipoTarjeta = OTRO`
	DescripcionTipoTarjeta string `json:"descripcionTipoTarjeta,omitempty"`
	// Forma de procesamiento del pago con tarjeta (E626). Se asume `OTRO` si no se informa
	FormaProcesamientoPago FormaProcesamientoPago `json:"formaProcesamientoPago,omitempty"`
	// Número del cheque (E631). Obligatorio para `tipoPago = CHEQUE`
	NumeroCheque string `json:"numeroCheque,omitempty"`
	// Banco emisor del cheque (E632). Obligatorio para `tipoPago = CHEQUE`
	BancoCheque string `json:"bancoCheque,omitempty"`
	// Modalidad del crédito (E641). `PLAZO` o `CUOTA`
	CondicionCredito CondicionCredito `json:"condicionCredito,omitempty"`
	// Plazo del crédito. Para `tipo = CREDITO`
	PlazoCredito string `json:"plazoCredito,omitempty"`
	// Alternativa al plazo libre: cantidad de 1 a 9999 y unidad DIAS o MESES
	PlazoEstructurado *PlazoEstructuradoDTO `json:"plazoEstructurado,omitempty"`
	// Cantidad de cuotas (E644), entre 1 y 999. En runtime debe coincidir con la cantidad
	// de elementos de `detalleCuotas`; JSON Schema no puede validar esa igualdad.
	Cuotas *int32 `json:"cuotas,omitempty"`
	// Detalle de las cuotas (E650). Para `condicionCredito = CUOTA`
	DetalleCuotas []CuotaCreditoDTO `json:"detalleCuotas,omitempty"`
	// Entrega inicial del crédito (E645). Cero equivale a ausencia. En runtime debe ser menor que el
	// total de la operación y expresarse en `monedaOperacion`; JSON Schema no valida ese cálculo.
	MontoEntregaInicial *Decimal `json:"montoEntregaInicial,omitempty"`
}

CondicionPagoDTO: Medio de pago de la operación. Qué campos se informan depende de `tipo` y de `tipoPago`. `montoPago` tiene que cuadrar con el total de los ítems.

type ConstanciaAutofacturaDTO

type ConstanciaAutofacturaDTO struct {
	// Tipo de constancia (H014)
	Tipo TipoConstancia `json:"tipo"`
}

ConstanciaAutofacturaDTO: Constancia electrónica asociada a la autofactura (grupo H)

type ContribuyenteIntegracionDTO

type ContribuyenteIntegracionDTO struct {
	RUC                   string               `json:"ruc,omitempty"`
	DigitoVerificador     string               `json:"digitoVerificador,omitempty"`
	RazonSocial           string               `json:"razonSocial,omitempty"`
	NombreFantasia        string               `json:"nombreFantasia,omitempty"`
	TipoContribuyente     TipoContribuyente    `json:"tipoContribuyente,omitempty"`
	Ambiente              Ambiente             `json:"ambiente,omitempty"`
	ActividadesEconomicas []ActividadEconomica `json:"actividadesEconomicas,omitempty"`
	Direccion             string               `json:"direccion,omitempty"`
	NumeroCasa            int32                `json:"numeroCasa,omitempty"`
	Departamento          *Ubicacion           `json:"departamento,omitempty"`
	Distrito              *Ubicacion           `json:"distrito,omitempty"`
	Ciudad                *Ubicacion           `json:"ciudad,omitempty"`
	Telefono              string               `json:"telefono,omitempty"`
	Email                 string               `json:"email,omitempty"`
	Timbrado              *Timbrado            `json:"timbrado,omitempty"`
	Establecimientos      []Establecimiento    `json:"establecimientos,omitempty"`
	LogoURL               string               `json:"logoUrl,omitempty"`
	EstadoConfiguracion   *EstadoConfiguracion `json:"estadoConfiguracion,omitempty"`
}

ContribuyenteIntegracionDTO es un objeto de la API de Sifende.

type CrearWebhookIntegracionRequest

type CrearWebhookIntegracionRequest struct {
	// URL HTTPS pública que recibe los eventos. No se siguen redirects.
	URL string `json:"url"`
	// Eventos a los que se suscribe el webhook.
	Eventos []TipoEventoWebhook `json:"eventos"`
}

CrearWebhookIntegracionRequest es un objeto de la API de Sifende.

type CreditoFacturaDTO

type CreditoFacturaDTO struct {
	// `PLAZO` o `CUOTA` (E641)
	CondicionCredito CondicionCredito `json:"condicionCredito"`
	// PLAZO: texto libre de 2 a 15 caracteres (E643)
	PlazoCredito string `json:"plazoCredito,omitempty"`
	// PLAZO: alternativa estructurada a `plazoCredito`
	PlazoEstructurado *PlazoEstructuradoDTO `json:"plazoEstructurado,omitempty"`
	// CUOTA: cantidad de 1 a 999 (E644); coincide con `detalleCuotas`
	Cuotas *int32 `json:"cuotas,omitempty"`
	// CUOTA: calendario completo (E650). La suma cubre el saldo financiado
	DetalleCuotas []CuotaCreditoDTO `json:"detalleCuotas,omitempty"`
	// Opcional; si se informa coincide con la suma de `pagos` (E645)
	MontoEntregaInicial *Decimal `json:"montoEntregaInicial,omitempty"`
}

CreditoFacturaDTO: Condiciones del crédito (E640). Los medios de la entrega inicial van en `pagos`; el saldo financiado es el total menos esa entrega.

type CuotaCreditoDTO

type CuotaCreditoDTO struct {
	// Monto de la cuota (E651)
	Monto Decimal `json:"monto"`
	// Fecha de vencimiento opcional (E652)
	FechaVencimiento string `json:"fechaVencimiento,omitempty"`
	// Moneda de la cuota (E653). Si se omite, `monedaOperacion`
	Moneda Moneda `json:"moneda,omitempty"`
}

CuotaCreditoDTO: Detalle de una cuota del crédito (E650)

type DatosCancelacion

type DatosCancelacion struct {
	DocumentoID           string  `json:"documentoId"`
	CDC                   string  `json:"cdc"`
	Estado                string  `json:"estado"`
	EventoSifenID         int64   `json:"eventoSifenId"`
	Motivo                string  `json:"motivo"`
	CodigoRespuesta       *string `json:"codigoRespuesta"`
	MensajeRespuesta      *string `json:"mensajeRespuesta"`
	ProtocoloAutorizacion *string `json:"protocoloAutorizacion"`
}

DatosCancelacion es el Data de documento.cancelado.

type DatosComercialesDTO

type DatosComercialesDTO struct {
	// Número de orden de compra (G002)
	OrdenCompra string `json:"ordenCompra,omitempty"`
	// Número de orden de venta (G003)
	OrdenVenta string `json:"ordenVenta,omitempty"`
	// Número de asiento contable (G004)
	AsientoContable string `json:"asientoContable,omitempty"`
	// Ciclo facturado (E821). Exige fechas de inicio y fin
	Ciclo string `json:"ciclo,omitempty"`
	// Inicio del ciclo (E822). Obligatorio y exclusivo con `ciclo`
	FechaInicioCiclo string `json:"fechaInicioCiclo,omitempty"`
	// Fin del ciclo (E823), no anterior al inicio
	FechaFinCiclo string `json:"fechaFinCiclo,omitempty"`
	// Fechas de vencimiento para el pago (E824), hasta 3 y no anteriores a la emisión
	VencimientosPago []string `json:"vencimientosPago,omitempty"`
	// Número de contrato (E825)
	NumeroContrato string `json:"numeroContrato,omitempty"`
	// Saldo anterior (E826). Informativo: no se suma al total de la factura
	SaldoAnterior *Decimal `json:"saldoAnterior,omitempty"`
}

DatosComercialesDTO: Referencias comerciales (G002-G004) y datos adicionales de uso comercial (E821-E826)

type DatosDocumento

type DatosDocumento struct {
	DocumentoID string `json:"documentoId"`
	CDC         string `json:"cdc"`
	Estado      string `json:"estado"`
	// LoteID es nil fuera de un lote, y siempre nil dentro de DatosLote.Documentos.
	LoteID                *int64           `json:"loteId"`
	ProtocoloAutorizacion *string          `json:"protocoloAutorizacion"`
	Resultados            []ResultadoSifen `json:"resultados"`
}

DatosDocumento es el Data de documento.aprobado y documento.rechazado.

type DatosLote

type DatosLote struct {
	LoteID                  int64            `json:"loteId"`
	NumeroLote              string           `json:"numeroLote"`
	Estado                  string           `json:"estado"`
	Aprobados               int              `json:"aprobados"`
	AprobadosConObservacion int              `json:"aprobadosConObservacion"`
	Rechazados              int              `json:"rechazados"`
	Documentos              []DatosDocumento `json:"documentos"`
}

DatosLote es el Data de lote.procesado.

type Decimal

type Decimal struct {
	// contains filtered or unexported fields
}

Decimal es un número decimal exacto: un entero y una escala, como BigDecimal en la API. Los montos, cantidades y tasas viajan como Decimal para no perder precisión en un float.

Las operaciones redondean con HALF_UP, igual que el backend. El valor cero es 0 con escala 0. Un Decimal es inmutable: las operaciones devuelven uno nuevo.

Example
precio := MustDecimal("19.99")
total := precio.Multiplicar(NuevoDecimal(3))
fmt.Println(total, total.ConEscala(0), total.Comparar(MustDecimal("59.970")))
Output:
59.97 60 0

func DecimalDeFloat

func DecimalDeFloat(f float64) (Decimal, error)

DecimalDeFloat convierte un float64 con su representación decimal más corta: 0.1 es 0.1, no 0.1000000000000000055….

func MustDecimal

func MustDecimal(texto string) Decimal

MustDecimal es ParsearDecimal para literales: entra en pánico si el texto no es un decimal.

func NuevoDecimal

func NuevoDecimal(n int64) Decimal

NuevoDecimal devuelve el entero n como Decimal: NuevoDecimal(150000) es 150000.

func ParsearDecimal

func ParsearDecimal(texto string) (Decimal, error)

ParsearDecimal lee un decimal como "19.99", "-0.5" o "1e3". Conserva la escala del texto: "1.50" tiene escala 2.

func (Decimal) Abs

func (d Decimal) Abs() Decimal

func (Decimal) Comparar

func (d Decimal) Comparar(otro Decimal) int

Comparar devuelve -1, 0 o 1 según d sea menor, igual o mayor que otro, sin importar la escala: 1.50 y 1.5 son iguales.

func (Decimal) ConEscala

func (d Decimal) ConEscala(escala int32) Decimal

ConEscala cambia la escala, redondeando HALF_UP si la reduce.

func (Decimal) Dividir

func (d Decimal) Dividir(divisor Decimal, escala int32) Decimal

Dividir devuelve d/divisor con la escala indicada, redondeado HALF_UP. Entra en pánico si el divisor es cero.

func (Decimal) EsCero

func (d Decimal) EsCero() bool

func (Decimal) Escala

func (d Decimal) Escala() int32

Escala es la cantidad de dígitos después del punto.

func (Decimal) Float64

func (d Decimal) Float64() float64

Float64 devuelve la aproximación float64 más cercana. Para mostrar o comparar montos usá String o Comparar.

func (Decimal) MarshalJSON

func (d Decimal) MarshalJSON() ([]byte, error)

MarshalJSON escribe el decimal como número JSON, con todos sus dígitos.

func (Decimal) Multiplicar

func (d Decimal) Multiplicar(otro Decimal) Decimal

func (Decimal) Restar

func (d Decimal) Restar(otro Decimal) Decimal

func (Decimal) Resto

func (d Decimal) Resto(divisor Decimal) Decimal

Resto es el resto de la división truncada, con el signo de d (como BigDecimal.remainder).

func (Decimal) String

func (d Decimal) String() string

String escribe el decimal con su escala, sin exponente: "1057450", "60.98", "-0.50".

func (Decimal) Sumar

func (d Decimal) Sumar(otro Decimal) Decimal

func (*Decimal) UnmarshalJSON

func (d *Decimal) UnmarshalJSON(datos []byte) error

UnmarshalJSON acepta un número JSON o un texto con un número.

type Departamento

type Departamento string

Departamento es una enumeración de la API. Un valor fuera de las constantes se envía tal cual y la API lo valida.

const (
	DepartamentoCapital       Departamento = "CAPITAL"
	DepartamentoConcepcion    Departamento = "CONCEPCION"
	DepartamentoSanPedro      Departamento = "SAN_PEDRO"
	DepartamentoCordillera    Departamento = "CORDILLERA"
	DepartamentoGuaira        Departamento = "GUAIRA"
	DepartamentoCaaguazu      Departamento = "CAAGUAZU"
	DepartamentoCaazapa       Departamento = "CAAZAPA"
	DepartamentoItapua        Departamento = "ITAPUA"
	DepartamentoMisiones      Departamento = "MISIONES"
	DepartamentoParaguari     Departamento = "PARAGUARI"
	DepartamentoAltoParana    Departamento = "ALTO_PARANA"
	DepartamentoCentral       Departamento = "CENTRAL"
	DepartamentoNeembucu      Departamento = "NEEMBUCU"
	DepartamentoAmambay       Departamento = "AMAMBAY"
	DepartamentoPteHayes      Departamento = "PTE_HAYES"
	DepartamentoBoqueron      Departamento = "BOQUERON"
	DepartamentoAltoParaguay  Departamento = "ALTO_PARAGUAY"
	DepartamentoCanindeyu     Departamento = "CANINDEYU"
	DepartamentoChaco         Departamento = "CHACO"
	DepartamentoNuevaAsuncion Departamento = "NUEVA_ASUNCION"
)

type DepartamentoDTO

type DepartamentoDTO struct {
	DepartamentoID int32  `json:"departamentoId,omitempty"`
	Codigo         int32  `json:"codigo,omitempty"`
	Nombre         string `json:"nombre,omitempty"`
}

DepartamentoDTO es un objeto de la API de Sifende.

type DistritoDTO

type DistritoDTO struct {
	DistritoID     int32  `json:"distritoId,omitempty"`
	DepartamentoID int32  `json:"departamentoId,omitempty"`
	Codigo         int32  `json:"codigo,omitempty"`
	Nombre         string `json:"nombre,omitempty"`
}

DistritoDTO es un objeto de la API de Sifende.

type DocumentoAsociadoDTO

type DocumentoAsociadoDTO struct {
	// Único valor admitido hoy: `ELECTRONICO`
	TipoDocumento TipoDocumentoAsociado `json:"tipoDocumento"`
	// CDC del documento referenciado, 44 dígitos
	CDC                  string               `json:"cdc"`
	NumeroTimbrado       string               `json:"numeroTimbrado,omitempty"`
	Establecimiento      string               `json:"establecimiento,omitempty"`
	PuntoExpedicion      string               `json:"puntoExpedicion,omitempty"`
	NumeroDocumento      string               `json:"numeroDocumento,omitempty"`
	TipoDocumentoImpreso TipoDocumentoImpreso `json:"tipoDocumentoImpreso,omitempty"`
	FechaEmision         string               `json:"fechaEmision,omitempty"`
	// RUC fusionado del emisor del documento asociado, sin DV ni guion (H018)
	RUCFusionado string `json:"rucFusionado,omitempty"`
}

DocumentoAsociadoDTO: Documento que origina el ajuste. Hoy sólo se admite `tipoDocumento = ELECTRONICO`, es decir referenciar otro documento por su CDC: cualquier otro valor devuelve `400 validation-error`. Los campos de documento impreso están reservados para cuando se habilite ese caso.

type DocumentoAsociadoRemisionDTO

type DocumentoAsociadoRemisionDTO struct {
	TipoDocumento        TipoDocumentoAsociado `json:"tipoDocumento"`
	CDC                  string                `json:"cdc,omitempty"`
	NumeroTimbrado       string                `json:"numeroTimbrado,omitempty"`
	Establecimiento      string                `json:"establecimiento,omitempty"`
	PuntoExpedicion      string                `json:"puntoExpedicion,omitempty"`
	NumeroDocumento      string                `json:"numeroDocumento,omitempty"`
	TipoDocumentoImpreso TipoDocumentoImpreso  `json:"tipoDocumentoImpreso,omitempty"`
	FechaEmision         string                `json:"fechaEmision,omitempty"`
	RUCFusionado         string                `json:"rucFusionado,omitempty"`
}

DocumentoAsociadoRemisionDTO es un objeto de la API de Sifende.

type DocumentoElectronicoEmisionResponseDTO

type DocumentoElectronicoEmisionResponseDTO struct {
	// Identificador público del documento
	ID string `json:"id,omitempty"`
	// PK numérica del documento
	DeID int64 `json:"deId,omitempty"`
	// Código de Control del Documento Electrónico, 44 dígitos
	CDC string `json:"cdc,omitempty"`
	// Siempre `PENDIENTE` en la emisión. Los estados terminales se consultan con `statusUrl`
	Estado string `json:"estado,omitempty"`
	// Ambiente inmutable en el que se emitió el documento
	Ambiente string `json:"ambiente,omitempty"`
	// Eco del tipo emitido
	TipoDocumento string `json:"tipoDocumento,omitempty"`
	// Correlativo asignado dentro del punto de expedición
	NumeroDocumento int64 `json:"numeroDocumento,omitempty"`
	// Número en formato establecimiento-puntoExpedición-correlativo
	NumeroFormateado string `json:"numeroFormateado,omitempty"`
	// Momento en que Sifende registró el documento
	FechaCreacion string `json:"fechaCreacion,omitempty"`
	// URL del QR oficial de SIFEN, para embeber en tu UI o en el KuDE
	QRURL string `json:"qrUrl,omitempty"`
	// URL absoluta para hacer polling del estado. También viaja en el header `Location`
	StatusURL string `json:"statusUrl,omitempty"`
	// URL absoluta del KuDE en PDF, disponible una vez aprobado el documento
	KudeURL string `json:"kudeUrl,omitempty"`
	ItiDe   int32  `json:"itiDe,omitempty"`
}

DocumentoElectronicoEmisionResponseDTO es un objeto de la API de Sifende.

type DocumentoElectronicoStatusDTO

type DocumentoElectronicoStatusDTO struct {
	CDC                   string `json:"cdc,omitempty"`
	Estado                string `json:"estado,omitempty"`
	Ambiente              string `json:"ambiente,omitempty"`
	NumeroDocumento       int64  `json:"numeroDocumento,omitempty"`
	FechaCreacion         string `json:"fechaCreacion,omitempty"`
	ProtocoloAutorizacion string `json:"protocoloAutorizacion,omitempty"`
	MensajeRechazo        string `json:"mensajeRechazo,omitempty"`
	ItiDe                 int32  `json:"itiDe,omitempty"`
}

DocumentoElectronicoStatusDTO es un objeto de la API de Sifende.

type DocumentoParaTotales

type DocumentoParaTotales struct {
	// MonedaOperacion vacía es PYG.
	MonedaOperacion           Moneda
	TipoCambio                *Decimal
	DescuentoGlobalPorcentaje *Decimal
	AnticipoGlobalPorcentaje  *Decimal
	Comision                  *Decimal
	Items                     []ItemParaTotales
}

DocumentoParaTotales son los campos de un documento que intervienen en el total.

type Domicilio

type Domicilio struct {
	Departamento *CodigoNombre `json:"departamento,omitempty"`
	Distrito     *CodigoNombre `json:"distrito,omitempty"`
	Localidad    *CodigoNombre `json:"localidad,omitempty"`
	Barrio       string        `json:"barrio,omitempty"`
	Direccion    string        `json:"direccion,omitempty"`
	NumeroPuerta string        `json:"numeroPuerta,omitempty"`
	Referencias  string        `json:"referencias,omitempty"`
}

Domicilio es un objeto de la API de Sifende.

type DomicilioAutofacturaDTO

type DomicilioAutofacturaDTO struct {
	// Dirección del vendedor o lugar de la transacción (E308/E316)
	Direccion string `json:"direccion"`
	// Código de departamento del catálogo SIFEN (E310/E317)
	Departamento string `json:"departamento"`
	// Código de distrito opcional del catálogo SIFEN (E312/E319)
	CodigoDistrito *int32 `json:"codigoDistrito,omitempty"`
	// Código de ciudad del catálogo SIFEN (E314/E321)
	Ciudad string `json:"ciudad"`
}

DomicilioAutofacturaDTO: Dirección y códigos geográficos del vendedor o del lugar de la operación

type EnergiaElectricaDTO

type EnergiaElectricaDTO struct {
	// Número de medidor (E792)
	NumeroMedidor string `json:"numeroMedidor,omitempty"`
	// Código de actividad (E793)
	CodigoActividad *int32 `json:"codigoActividad,omitempty"`
	// Código de categoría (E794)
	CodigoCategoria string `json:"codigoCategoria,omitempty"`
	// Lectura anterior (E795)
	LecturaAnterior *Decimal `json:"lecturaAnterior,omitempty"`
	// Lectura actual (E796)
	LecturaActual *Decimal `json:"lecturaActual,omitempty"`
	// Consumo (E797). Con ambas lecturas Sifende lo deriva como actual − anterior
	Consumo *Decimal `json:"consumo,omitempty"`
}

EnergiaElectricaDTO: Medición del sector de energía eléctrica (E791). Hasta 9 por factura (NT023)

type EnumValueDTO

type EnumValueDTO struct {
	Name  string `json:"name,omitempty"`
	Label string `json:"label,omitempty"`
	Val   int32  `json:"val,omitempty"`
	Extra string `json:"extra,omitempty"`
}

EnumValueDTO es un objeto de la API de Sifende.

type ErrorAPI

type ErrorAPI struct {
	Status int
	// Codigo es el último segmento del type del Problem Details: "validation-error", "document-quota-exceeded"…
	Codigo string
	// Problema es nil si el cuerpo no es un Problem Details.
	Problema *ProblemDetail
	// Cuerpo es la respuesta tal como llegó, para diagnosticar errores que no son Problem Details.
	Cuerpo  []byte
	TraceID string
	// ReintentarEn es el Retry-After de la respuesta, si vino.
	ReintentarEn *time.Duration
	// IdempotencyKey es la clave con la que se envió la operación: repetila para recuperar el resultado.
	IdempotencyKey string
}

ErrorAPI es una respuesta de error de la API. Casi siempre trae un Problem Details (RFC 9457) con el código del error.

Example
e := nuevoErrorAPI(429, []byte(`{"type":"https://sifende.com.py/docs/solucion-problemas/rate-limited","title":"Demasiadas solicitudes"}`),
	http.Header{"Retry-After": {"2"}}, "pedido-1001")
fmt.Println(e.Codigo, *e.ReintentarEn, e)
Output:
rate-limited 2s sifende: 429 Demasiadas solicitudes

func (*ErrorAPI) Error

func (e *ErrorAPI) Error() string

func (*ErrorAPI) Errores

func (e *ErrorAPI) Errores() map[string]string

Errores devuelve los errores de validación por campo de un validation-error, como {"receptor.digitoVerificador": "…"}.

type ErrorConexion

type ErrorConexion struct {
	Mensaje        string
	IdempotencyKey string
	// Timeout es true si el intento venció el timeout del cliente, incluso a mitad de la respuesta.
	Timeout bool
	Err     error
}

ErrorConexion indica que no hubo una respuesta completa de la API: falló la conexión, venció el timeout o el cuerpo llegó cortado o ilegible. La operación pudo haberse ejecutado: repetila con la misma IdempotencyKey.

func (*ErrorConexion) Error

func (e *ErrorConexion) Error() string

func (*ErrorConexion) Unwrap

func (e *ErrorConexion) Unwrap() error

type ErrorKudePendiente

type ErrorKudePendiente struct {
	CDC string
}

ErrorKudePendiente indica que el KuDE no estuvo listo dentro de la espera de DescargarKude.

func (*ErrorKudePendiente) Error

func (e *ErrorKudePendiente) Error() string

type Establecimiento

type Establecimiento struct {
	NumeroEstablecimiento int32             `json:"numeroEstablecimiento,omitempty"`
	NombreSucursal        string            `json:"nombreSucursal,omitempty"`
	Activo                bool              `json:"activo,omitempty"`
	PuntosExpedicion      []PuntoExpedicion `json:"puntosExpedicion,omitempty"`
}

Establecimiento es un objeto de la API de Sifende.

type EstadoConfiguracion

type EstadoConfiguracion struct {
	CertificadoConfigurado        bool   `json:"certificadoConfigurado,omitempty"`
	CertificadoVence              string `json:"certificadoVence,omitempty"`
	CertificadoVigente            bool   `json:"certificadoVigente,omitempty"`
	CscConfigurado                bool   `json:"cscConfigurado,omitempty"`
	TimbradoVigente               bool   `json:"timbradoVigente,omitempty"`
	DireccionConfigurada          bool   `json:"direccionConfigurada,omitempty"`
	ActividadEconomicaConfigurada bool   `json:"actividadEconomicaConfigurada,omitempty"`
	ListoParaEmitir               bool   `json:"listoParaEmitir,omitempty"`
}

EstadoConfiguracion es un objeto de la API de Sifende.

type EstadoEntregaWebhook

type EstadoEntregaWebhook string

EstadoEntregaWebhook es una enumeración de la API. Un valor fuera de las constantes se envía tal cual y la API lo valida.

const (
	EstadoEntregaWebhookPendiente    EstadoEntregaWebhook = "PENDIENTE"
	EstadoEntregaWebhookEncolada     EstadoEntregaWebhook = "ENCOLADA"
	EstadoEntregaWebhookEnviando     EstadoEntregaWebhook = "ENVIANDO"
	EstadoEntregaWebhookReintentando EstadoEntregaWebhook = "REINTENTANDO"
	EstadoEntregaWebhookEntregada    EstadoEntregaWebhook = "ENTREGADA"
	EstadoEntregaWebhookFallida      EstadoEntregaWebhook = "FALLIDA"
	EstadoEntregaWebhookCancelada    EstadoEntregaWebhook = "CANCELADA"
)

type EstadoRUC

type EstadoRUC string

EstadoRUC es una enumeración de la API. Un valor fuera de las constantes se envía tal cual y la API lo valida.

const (
	EstadoRUCACT EstadoRUC = "ACT"
	EstadoRUCSUS EstadoRUC = "SUS"
	EstadoRUCSAD EstadoRUC = "SAD"
	EstadoRUCBLQ EstadoRUC = "BLQ"
	EstadoRUCCAN EstadoRUC = "CAN"
	EstadoRUCCDE EstadoRUC = "CDE"
)

type EventoInutilizacionRequest

type EventoInutilizacionRequest struct {
	NumeroTimbrado  int32  `json:"numeroTimbrado"`
	Establecimiento string `json:"establecimiento"`
	PuntoExpedicion string `json:"puntoExpedicion"`
	NumeroInicio    string `json:"numeroInicio"`
	NumeroFin       string `json:"numeroFin"`
	TipoDocumento   int32  `json:"tipoDocumento"`
	Motivo          string `json:"motivo"`
	Serie           string `json:"serie,omitempty"`
}

EventoInutilizacionRequest es un objeto de la API de Sifende.

type EventoNominacionRequest

type EventoNominacionRequest struct {
	// Receptor que reemplazará al receptor innominado de la factura electrónica
	Receptor ReceptorNominadoRequest `json:"receptor"`
	Motivo   string                  `json:"motivo"`
}

EventoNominacionRequest: Datos necesarios para nominar el receptor de una factura electrónica innominada

type EventoSifenDTO

type EventoSifenDTO struct {
	EventoSifenID          int64  `json:"eventoSifenId,omitempty"`
	DocumentoElectronicoID int64  `json:"documentoElectronicoId,omitempty"`
	ContribuyenteID        int64  `json:"contribuyenteId,omitempty"`
	Ambiente               string `json:"ambiente,omitempty"`
	TipoEvento             string `json:"tipoEvento,omitempty"`
	EstadoEvento           string `json:"estadoEvento,omitempty"`
	CDC                    string `json:"cdc,omitempty"`
	Motivo                 string `json:"motivo,omitempty"`
	ProtocoloAutorizacion  string `json:"protocoloAutorizacion,omitempty"`
	CodigoRespuesta        string `json:"codigoRespuesta,omitempty"`
	MensajeRespuesta       string `json:"mensajeRespuesta,omitempty"`
	FechaCreacion          string `json:"fechaCreacion,omitempty"`
	FechaProcesamiento     string `json:"fechaProcesamiento,omitempty"`
	NumeroTimbrado         int32  `json:"numeroTimbrado,omitempty"`
	Establecimiento        string `json:"establecimiento,omitempty"`
	PuntoExpedicion        string `json:"puntoExpedicion,omitempty"`
	NumeroInicio           string `json:"numeroInicio,omitempty"`
	NumeroFin              string `json:"numeroFin,omitempty"`
	TipoDocumento          int32  `json:"tipoDocumento,omitempty"`
	SerieNumero            string `json:"serieNumero,omitempty"`
}

EventoSifenDTO es un objeto de la API de Sifende.

type EventoWebhook

type EventoWebhook struct {
	ID              string            `json:"id"`
	Tipo            TipoEventoWebhook `json:"tipo"`
	Version         string            `json:"version"`
	OcurridoEn      string            `json:"ocurridoEn"`
	ContribuyenteID int64             `json:"contribuyenteId"`
	// Ambiente puede faltar en entregas creadas antes de que se agregara el campo.
	Ambiente Ambiente        `json:"ambiente,omitempty"`
	Data     json.RawMessage `json:"data"`
}

EventoWebhook es una entrega verificada. Data depende de Tipo: leela con Documento, Cancelacion o Lote.

Una entrega puede repetirse: deduplicá por ID.

func VerificarWebhook

func VerificarWebhook(opciones OpcionesVerificacion) (*EventoWebhook, error)

VerificarWebhook verifica la firma X-Sifende-Signature y devuelve el evento. Todo rechazo envuelve ErrFirmaWebhookInvalida: la firma no coincide, faltan headers o el timestamp está fuera de la tolerancia.

Example
package main

import (
	"errors"
	"io"
	"log"
	"net/http"
	"os"

	"github.com/ithdev/sifende-go"
)

func main() {
	http.HandleFunc("POST /webhooks/sifende", func(w http.ResponseWriter, r *http.Request) {
		cuerpo, err := io.ReadAll(r.Body)
		if err != nil {
			w.WriteHeader(http.StatusBadRequest)
			return
		}
		evento, err := sifende.VerificarWebhook(sifende.OpcionesVerificacion{
			Cuerpo:   cuerpo,
			Headers:  r.Header,
			Secretos: []string{os.Getenv("SIFENDE_WEBHOOK_SECRET")},
		})
		if errors.Is(err, sifende.ErrFirmaWebhookInvalida) {
			w.WriteHeader(http.StatusUnauthorized)
			return
		}
		if err != nil {
			w.WriteHeader(http.StatusBadRequest)
			return
		}
		if evento.Tipo == sifende.TipoEventoWebhookDocumentoAprobado {
			datos, err := evento.Documento()
			if err != nil {
				w.WriteHeader(http.StatusBadRequest)
				return
			}
			log.Println(datos.CDC, datos.Estado)
		}
		w.WriteHeader(http.StatusNoContent)
	})
}

func (*EventoWebhook) Cancelacion

func (e *EventoWebhook) Cancelacion() (*DatosCancelacion, error)

Cancelacion devuelve el Data de documento.cancelado.

func (*EventoWebhook) Documento

func (e *EventoWebhook) Documento() (*DatosDocumento, error)

Documento devuelve el Data de documento.aprobado o documento.rechazado.

func (*EventoWebhook) Lote

func (e *EventoWebhook) Lote() (*DatosLote, error)

Lote devuelve el Data de lote.procesado.

type FacturaElectronicaRequest

type FacturaElectronicaRequest struct {
	// Fecha y hora de emisión en hora local de Paraguay, sin zona ni offset. Si se omite, se usa la fecha y hora del servidor al recibir el request
	FechaEmision string `json:"fechaEmision,omitempty"`
	// Sólo se admite `NORMAL`: SIFEN todavía no habilita la emisión en contingencia
	TipoEmision TipoEmision `json:"tipoEmision"`
	// Establecimiento habilitado del emisor (1-999)
	NumeroEstablecimiento int32 `json:"numeroEstablecimiento"`
	// Punto de expedición dentro del establecimiento (1-999)
	PuntoExpedicion int32 `json:"puntoExpedicion"`
	// Número de documento (dNumDoc) asignado por tu sistema, de 1 a 9.999.999. Si se omite, Sifende asigna el siguiente correlativo del punto de expedición
	NumeroDocumento *int64 `json:"numeroDocumento,omitempty"`
	// Código de seguridad (dCodSeg) de 9 dígitos. Con el mismo número y la misma fecha de emisión produce siempre el mismo CDC. Si se omite, Sifende genera uno al azar
	CodigoSeguridad string `json:"codigoSeguridad,omitempty"`
	// Timbrado con el que tu sistema numera. Si se informa y no coincide con el timbrado cargado en Sifende para el ambiente, el documento se rechaza con `timbrado-mismatch`
	NumeroTimbrado *int32 `json:"numeroTimbrado,omitempty"`
	// Naturaleza de la operación. Obligatorio para factura y autofactura; no se informa en notas de crédito, débito ni remisión
	TipoTransaccion TipoTransaccion `json:"tipoTransaccion,omitempty"`
	// Porcentaje de descuento global aplicado a cada ítem de la operación (F010)
	DescuentoGlobalPorcentaje *Decimal `json:"descuentoGlobalPorcentaje,omitempty"`
	// Moneda de la operación
	MonedaOperacion Moneda `json:"monedaOperacion,omitempty"`
	// Tipo de cambio global de la operación (D018)
	TipoCambio *Decimal `json:"tipoCambio,omitempty"`
	// Códigos de obligaciones tributarias afectadas (D030)
	ObligacionesAfectadas []string `json:"obligacionesAfectadas,omitempty"`
	// Texto libre adicional del emisor (B005), de 1 a 3000 caracteres en una sola línea
	InfoEmisor string `json:"infoEmisor,omitempty"`
	// Ítems del documento. Al menos uno
	Items []ItemDTO `json:"items"`
	// Destinatario del documento. Los nombres de los campos no cambian entre operaciones, pero
	// cuáles son obligatorios lo decide `tipoContribuyente`, y es el motivo de rechazo más
	// frecuente al integrar:
	//
	// - `CONTRIBUYENTE` exige `tipoContribuyenteReceptor` y `digitoVerificador`, y no lleva
	//   `tipoDocumento`.
	// - `NO_CONTRIBUYENTE` exige `tipoDocumento`, y no lleva los otros dos: SIFEN rechaza
	//   `tipoContribuyenteReceptor` en un no contribuyente con el código 1303.
	//
	// Las dos reglas van como `if`/`then` en este schema, así que un validador las detecta antes
	// de mandar el request.
	Receptor ReceptorDTO `json:"receptor"`
	// Comisión de la operación (F025), IVA 10% incluido. Se suma al total general y su IVA al total de IVA
	Comision *Decimal `json:"comision,omitempty"`
	// Tipo de impuesto afectado (D013). Si se omite, `IVA`; ISC no está habilitado
	TipoImpuesto TipoImpuesto `json:"tipoImpuesto,omitempty"`
	// Indicador de presencia (E011). Si se omite, `OPERACION_PRESENCIAL`
	IndicadorPresencia IndicadorPresencia `json:"indicadorPresencia,omitempty"`
	// Descripción propia de la presencia (E012). Obligatoria y exclusiva de `indicadorPresencia = OTRO`
	DescripcionPresencia string `json:"descripcionPresencia,omitempty"`
	// Fecha estimada del traslado de la mercadería, cuando se documentará con una nota de remisión electrónica (E013)
	FechaFuturaRemision string `json:"fechaFuturaRemision,omitempty"`
	// `CONTADO` o `CREDITO`
	CondicionOperacion CondicionOperacion `json:"condicionOperacion"`
	// Forma anterior de un único medio de pago y del crédito. Excluyente con `pagos`/`credito`
	CondicionPago *CondicionPagoDTO `json:"condicionPago,omitempty"`
	// Medios de pago, en orden. En `CONTADO` (1 a 999) cubren el total de la operación; en `CREDITO`
	// describen la entrega inicial (0 a 999). Excluyente con `condicionPago`
	Pagos []PagoFacturaDTO `json:"pagos,omitempty"`
	// Condiciones del crédito. Obligatorio en `CREDITO` con `pagos`; ausente en `CONTADO`
	Credito *CreditoFacturaDTO `json:"credito,omitempty"`
	// No se admite en la factura electrónica: usar `documentosAsociados`, también para una sola referencia
	//
	// Deprecated: la API lo mantiene por compatibilidad.
	DocumentoAsociado *DocumentoAsociadoDTO `json:"documentoAsociado,omitempty"`
	// Notas de remisión y facturas de anticipo referenciadas (H001), en orden. Hasta 99
	DocumentosAsociados []AsociacionFacturaDTO `json:"documentosAsociados,omitempty"`
	// Información de interés del Fisco respecto al DE (B006), de 1 a 3000 caracteres en una sola línea. Se imprime en el KuDE
	InformacionFiscal string `json:"informacionFiscal,omitempty"`
	// Condición del anticipo aplicado (D019). Obligatoria cuando la factura aplica anticipos
	CondicionAnticipo CondicionAnticipo `json:"condicionAnticipo,omitempty"`
	// Anticipo global como porcentaje del precio unitario de cada ítem; Sifende deriva EA007
	AnticipoGlobalPorcentaje *Decimal `json:"anticipoGlobalPorcentaje,omitempty"`
	// Órdenes, asiento y datos adicionales de uso comercial
	DatosComerciales *DatosComercialesDTO `json:"datosComerciales,omitempty"`
	// Información adicional de interés del emisor para el receptor (J003). Se imprime en el KuDE y no se envía a SIFEN
	InformacionAdicional string `json:"informacionAdicional,omitempty"`
	// Sector de energía eléctrica (E791), hasta 9 mediciones
	Energia []EnergiaElectricaDTO `json:"energia,omitempty"`
	// Sector de seguros (E800)
	Seguro *SeguroDTO `json:"seguro,omitempty"`
	// Sector de supermercados (E810)
	Supermercado *SupermercadoDTO `json:"supermercado,omitempty"`
	// Transporte de la mercadería (E900), opcional en la factura
	Transporte *TransporteFacturaDTO `json:"transporte,omitempty"`
	// Datos generales de la carga (G050)
	Carga *CargaRemisionDTO `json:"carga,omitempty"`
	// Contratación pública opcional (E020), en cualquier operación
	ComprasPublicas *ComprasPublicasDTO `json:"comprasPublicas,omitempty"`
	// Código de contratación de compras públicas (E827), opcional en cualquier operación
	CodigoContratacionDNCP string `json:"codigoContratacionDncp,omitempty"`
}

FacturaElectronicaRequest: Factura electrónica — `tipoDocumento = FACTURA_ELECTRONICA`.

func (FacturaElectronicaRequest) MarshalJSON

func (s FacturaElectronicaRequest) MarshalJSON() ([]byte, error)

MarshalJSON agrega tipoDocumento al cuerpo.

func (*FacturaElectronicaRequest) TipoDocumento

func (*FacturaElectronicaRequest) TipoDocumento() TipoDocumento

TipoDocumento devuelve TipoDocumentoFacturaElectronica: el valor que FacturaElectronicaRequest envía en tipoDocumento.

func (*FacturaElectronicaRequest) Totales

func (f *FacturaElectronicaRequest) Totales() (Totales, error)

Totales calcula los totales de la factura con CalcularTotales.

type FiltroEntregas added in v0.2.0

type FiltroEntregas struct {
	// Page empieza en 0.
	Page int32
	// Size va de 1 a 100. Por defecto 20.
	Size       int32
	Estado     EstadoEntregaWebhook
	TipoEvento TipoEventoWebhook
}

FiltroEntregas filtra ListarEntregas. Los campos en cero no se envían.

type FiltroEventos

type FiltroEventos struct {
	// Page empieza en 0.
	Page int32
	// Size es la cantidad por página. Por defecto 10.
	Size int32
	// TipoEvento es CANCELACION, INUTILIZACION, NOMINACION…
	TipoEvento string
}

FiltroEventos filtra ListarEventos. Los campos en cero no se envían.

type FormaProcesamientoPago

type FormaProcesamientoPago string

FormaProcesamientoPago es una enumeración de la API. Un valor fuera de las constantes se envía tal cual y la API lo valida.

const (
	FormaProcesamientoPagoPOS             FormaProcesamientoPago = "POS"
	FormaProcesamientoPagoPagoElectronico FormaProcesamientoPago = "PAGO_ELECTRONICO"
	FormaProcesamientoPagoOtro            FormaProcesamientoPago = "OTRO"
)

type Incoterm

type Incoterm string

Incoterm es una enumeración de la API. Un valor fuera de las constantes se envía tal cual y la API lo valida.

const (
	IncotermCFR Incoterm = "CFR"
	IncotermCIF Incoterm = "CIF"
	IncotermCIP Incoterm = "CIP"
	IncotermCPT Incoterm = "CPT"
	IncotermDAP Incoterm = "DAP"
	IncotermDAT Incoterm = "DAT"
	IncotermDDP Incoterm = "DDP"
	IncotermEXW Incoterm = "EXW"
	IncotermFAS Incoterm = "FAS"
	IncotermFCA Incoterm = "FCA"
	IncotermFOB Incoterm = "FOB"
)

type IndicadorPresencia

type IndicadorPresencia string

IndicadorPresencia es una enumeración de la API. Un valor fuera de las constantes se envía tal cual y la API lo valida.

const (
	IndicadorPresenciaOperacionPresencial    IndicadorPresencia = "OPERACION_PRESENCIAL"
	IndicadorPresenciaOperacionElectronica   IndicadorPresencia = "OPERACION_ELECTRONICA"
	IndicadorPresenciaOperacionTelemarketing IndicadorPresencia = "OPERACION_TELEMARKETING"
	IndicadorPresenciaVentaADomicilio        IndicadorPresencia = "VENTA_A_DOMICILIO"
	IndicadorPresenciaOperacionBancaria      IndicadorPresencia = "OPERACION_BANCARIA"
	IndicadorPresenciaOperacionCiclica       IndicadorPresencia = "OPERACION_CICLICA"
	IndicadorPresenciaOtro                   IndicadorPresencia = "OTRO"
)

type ItemAutofacturaDTO

type ItemAutofacturaDTO struct {
	// Código interno del producto o servicio en tu sistema (E701)
	Codigo string `json:"codigo"`
	// Descripción del producto o servicio (E708)
	Descripcion string `json:"descripcion"`
	// Cantidad, hasta 10 enteros y 8 decimales (E711)
	Cantidad Decimal `json:"cantidad"`
	// Unidad de medida del catálogo SIFEN (E714)
	UnidadMedida UnidadMedida `json:"unidadMedida"`
	// Precio unitario de la autofactura (E721)
	PrecioUnitario Decimal `json:"precioUnitario"`
}

ItemAutofacturaDTO es un objeto de la API de Sifende.

type ItemDTO

type ItemDTO struct {
	// Código interno del producto o servicio en tu sistema (E701)
	Codigo string `json:"codigo"`
	// Descripción del producto o servicio (E708)
	Descripcion string `json:"descripcion"`
	// Cantidad, hasta 10 enteros y 8 decimales (E711)
	Cantidad Decimal `json:"cantidad"`
	// Unidad de medida del catálogo SIFEN (E709)
	UnidadMedida UnidadMedida `json:"unidadMedida"`
	// Precio unitario sin descuentos, IVA incluido (E721)
	PrecioUnitario Decimal `json:"precioUnitario"`
	// Tipo de cambio del ítem (E725)
	TipoCambio *Decimal `json:"tipoCambio,omitempty"`
	// Afectación del ítem al IVA (E731)
	AfectacionTributaria AfectacionTributaria `json:"afectacionTributaria"`
	// Tasa de IVA en porcentaje: 10, 5 o 0 (E734). Con `afectacionTributaria = GRAVADO` es 10 o 5
	TasaIVA *int32 `json:"tasaIVA,omitempty"`
	// Proporción gravada en porcentaje (E733). Sólo se informa para `afectacionTributaria = GRAVADO_PARCIAL`; en el resto la deriva Sifende
	PropIVA *Decimal `json:"propIVA,omitempty"`
	// Descuento en importe sobre el precio unitario del ítem (EA002)
	DescuentoParticular *Decimal `json:"descuentoParticular,omitempty"`
	// Alternativa a `descuentoParticular`: porcentaje sobre el precio unitario. Sifende deriva el importe (EA002) con la precisión de la moneda
	DescuentoParticularPorcentaje *Decimal `json:"descuentoParticularPorcentaje,omitempty"`
	// Sólo factura: anticipo facturado aplicado sobre el precio unitario del ítem (EA006), en la moneda de la factura de anticipo
	AnticipoParticular *Decimal `json:"anticipoParticular,omitempty"`
	// Sólo factura: CDC de la factura de anticipo que se aplica en el ítem (E719). Debe figurar en `documentosAsociados`
	CDCAnticipo string `json:"cdcAnticipo,omitempty"`
	// País de origen del producto (E712); su descripción se deriva
	PaisOrigen Pais `json:"paisOrigen,omitempty"`
	// Código DNCP general (E704), string de exactamente 8 dígitos, opcional en cualquier operación
	CodigoDNCPGeneral string `json:"codigoDncpGeneral,omitempty"`
	// Código DNCP específico (E705), string de 3 a 4 dígitos, opcional en cualquier operación
	CodigoDNCPEspecifico string `json:"codigoDncpEspecifico,omitempty"`
	// Partida arancelaria (E702), string de 4 dígitos
	PartidaArancelaria string `json:"partidaArancelaria,omitempty"`
	// Nomenclatura común del Mercosur (E703), string de 6 a 8 dígitos
	NCM string `json:"ncm,omitempty"`
	// GTIN del producto (E706), string
	GTIN string `json:"gtin,omitempty"`
	// GTIN del paquete (E707), string
	GTINPaquete string `json:"gtinPaquete,omitempty"`
	// Información de interés del emisor sobre el ítem (E714)
	Observacion string `json:"observacion,omitempty"`
	// Número de lote (E751)
	Lote string `json:"lote,omitempty"`
	// Fecha de vencimiento de la mercadería (E752)
	Vencimiento string `json:"vencimiento,omitempty"`
	// Número de serie (E753)
	NumeroSerie string `json:"numeroSerie,omitempty"`
	// Número de pedido (E754)
	NumeroPedido string `json:"numeroPedido,omitempty"`
	// Número de seguimiento (E755)
	NumeroSeguimiento string `json:"numeroSeguimiento,omitempty"`
	// Número de registro del producto ante la autoridad competente (E759, NT010)
	NumeroRegistroProducto string `json:"numeroRegistroProducto,omitempty"`
	// Número de registro de la entidad comercial (E760, NT010)
	NumeroRegistroEntidadComercial string `json:"numeroRegistroEntidadComercial,omitempty"`
	// Nombre del producto según el registro (E761, NT010)
	NombreProducto string `json:"nombreProducto,omitempty"`
	// Datos del vehículo nuevo vendido en el ítem (E770)
	VehiculoNuevo *VehiculoNuevoDTO `json:"vehiculoNuevo,omitempty"`
}

ItemDTO: Ítem del documento. Sifende calcula los totales y el IVA a partir de estos campos: no se envía ni el subtotal del ítem ni el total del documento.

type ItemParaTotales

type ItemParaTotales struct {
	PrecioUnitario                Decimal
	Cantidad                      Decimal
	AfectacionTributaria          AfectacionTributaria
	TasaIVA                       *int32
	PropIVA                       *Decimal
	TipoCambio                    *Decimal
	DescuentoParticular           *Decimal
	DescuentoParticularPorcentaje *Decimal
	AnticipoParticular            *Decimal
}

ItemParaTotales son los campos de un ítem que intervienen en el total. Tienen los mismos nombres y tipos que en ItemDTO.

type ItemRemisionDTO

type ItemRemisionDTO struct {
	Codigo                         string       `json:"codigo"`
	Descripcion                    string       `json:"descripcion"`
	Cantidad                       Decimal      `json:"cantidad"`
	UnidadMedida                   UnidadMedida `json:"unidadMedida"`
	CodigoDNCPGeneral              string       `json:"codigoDncpGeneral,omitempty"`
	CodigoDNCPEspecifico           string       `json:"codigoDncpEspecifico,omitempty"`
	PartidaArancelaria             string       `json:"partidaArancelaria,omitempty"`
	NCM                            string       `json:"ncm,omitempty"`
	GTIN                           string       `json:"gtin,omitempty"`
	GTINPaquete                    string       `json:"gtinPaquete,omitempty"`
	PaisOrigen                     Pais         `json:"paisOrigen,omitempty"`
	Observacion                    string       `json:"observacion,omitempty"`
	Tolerancia                     Tolerancia   `json:"tolerancia,omitempty"`
	ToleranciaCantidad             *Decimal     `json:"toleranciaCantidad,omitempty"`
	ToleranciaPorcentaje           *Decimal     `json:"toleranciaPorcentaje,omitempty"`
	Lote                           string       `json:"lote,omitempty"`
	Vencimiento                    string       `json:"vencimiento,omitempty"`
	NumeroSerie                    string       `json:"numeroSerie,omitempty"`
	NumeroPedido                   string       `json:"numeroPedido,omitempty"`
	NumeroSeguimiento              string       `json:"numeroSeguimiento,omitempty"`
	NumeroRegistroProducto         string       `json:"numeroRegistroProducto,omitempty"`
	NumeroRegistroEntidadComercial string       `json:"numeroRegistroEntidadComercial,omitempty"`
	NombreProducto                 string       `json:"nombreProducto,omitempty"`
}

ItemRemisionDTO es un objeto de la API de Sifende.

type LocalRemisionDTO

type LocalRemisionDTO struct {
	Direccion             string `json:"direccion"`
	NumeroCasa            int32  `json:"numeroCasa"`
	ComplementoDireccion1 string `json:"complementoDireccion1,omitempty"`
	ComplementoDireccion2 string `json:"complementoDireccion2,omitempty"`
	Departamento          string `json:"departamento"`
	CodigoDistrito        *int32 `json:"codigoDistrito,omitempty"`
	Ciudad                string `json:"ciudad"`
	Telefono              string `json:"telefono,omitempty"`
}

LocalRemisionDTO es un objeto de la API de Sifende.

type ModalidadTransporte

type ModalidadTransporte string

ModalidadTransporte es una enumeración de la API. Un valor fuera de las constantes se envía tal cual y la API lo valida.

const (
	ModalidadTransporteTerrestre  ModalidadTransporte = "TERRESTRE"
	ModalidadTransporteFluvial    ModalidadTransporte = "FLUVIAL"
	ModalidadTransporteAereo      ModalidadTransporte = "AEREO"
	ModalidadTransporteMultimodal ModalidadTransporte = "MULTIMODAL"
)

type Moneda

type Moneda string

Moneda es una enumeración de la API. Un valor fuera de las constantes se envía tal cual y la API lo valida.

const (
	MonedaAED Moneda = "AED"
	MonedaAFN Moneda = "AFN"
	MonedaALL Moneda = "ALL"
	MonedaAMD Moneda = "AMD"
	MonedaANG Moneda = "ANG"
	MonedaAOA Moneda = "AOA"
	MonedaARS Moneda = "ARS"
	MonedaAUD Moneda = "AUD"
	MonedaAWG Moneda = "AWG"
	MonedaAZM Moneda = "AZM"
	MonedaBAM Moneda = "BAM"
	MonedaBBD Moneda = "BBD"
	MonedaBYN Moneda = "BYN"
	MonedaBDT Moneda = "BDT"
	MonedaBGN Moneda = "BGN"
	MonedaBHD Moneda = "BHD"
	MonedaBIF Moneda = "BIF"
	MonedaBMD Moneda = "BMD"
	MonedaBND Moneda = "BND"
	MonedaBOB Moneda = "BOB"
	MonedaBOV Moneda = "BOV"
	MonedaBRL Moneda = "BRL"
	MonedaBSD Moneda = "BSD"
	MonedaBTN Moneda = "BTN"
	MonedaBWP Moneda = "BWP"
	MonedaBYR Moneda = "BYR"
	MonedaBZD Moneda = "BZD"
	MonedaCAD Moneda = "CAD"
	MonedaCDF Moneda = "CDF"
	MonedaCHF Moneda = "CHF"
	MonedaCHE Moneda = "CHE"
	MonedaCHW Moneda = "CHW"
	MonedaCLP Moneda = "CLP"
	MonedaCLF Moneda = "CLF"
	MonedaCNY Moneda = "CNY"
	MonedaCOP Moneda = "COP"
	MonedaCOU Moneda = "COU"
	MonedaCRC Moneda = "CRC"
	MonedaCUP Moneda = "CUP"
	MonedaCUC Moneda = "CUC"
	MonedaCVE Moneda = "CVE"
	MonedaCYP Moneda = "CYP"
	MonedaCZK Moneda = "CZK"
	MonedaDJF Moneda = "DJF"
	MonedaDKK Moneda = "DKK"
	MonedaDOP Moneda = "DOP"
	MonedaDZD Moneda = "DZD"
	MonedaEEK Moneda = "EEK"
	MonedaEGP Moneda = "EGP"
	MonedaERN Moneda = "ERN"
	MonedaETB Moneda = "ETB"
	MonedaEUR Moneda = "EUR"
	MonedaFJD Moneda = "FJD"
	MonedaFKP Moneda = "FKP"
	MonedaGBP Moneda = "GBP"
	MonedaGEL Moneda = "GEL"
	MonedaGHS Moneda = "GHS"
	MonedaGHC Moneda = "GHC"
	MonedaGIP Moneda = "GIP"
	MonedaGMD Moneda = "GMD"
	MonedaGNF Moneda = "GNF"
	MonedaGTQ Moneda = "GTQ"
	MonedaGYD Moneda = "GYD"
	MonedaHKD Moneda = "HKD"
	MonedaHNL Moneda = "HNL"
	MonedaHRK Moneda = "HRK"
	MonedaHTG Moneda = "HTG"
	MonedaHUF Moneda = "HUF"
	MonedaIDR Moneda = "IDR"
	MonedaILS Moneda = "ILS"
	MonedaINR Moneda = "INR"
	MonedaIQD Moneda = "IQD"
	MonedaIRR Moneda = "IRR"
	MonedaISK Moneda = "ISK"
	MonedaJMD Moneda = "JMD"
	MonedaJOD Moneda = "JOD"
	MonedaJPY Moneda = "JPY"
	MonedaKES Moneda = "KES"
	MonedaKGS Moneda = "KGS"
	MonedaKHR Moneda = "KHR"
	MonedaKMF Moneda = "KMF"
	MonedaKPW Moneda = "KPW"
	MonedaKRW Moneda = "KRW"
	MonedaKWD Moneda = "KWD"
	MonedaKYD Moneda = "KYD"
	MonedaKZT Moneda = "KZT"
	MonedaLAK Moneda = "LAK"
	MonedaLBP Moneda = "LBP"
	MonedaLKR Moneda = "LKR"
	MonedaLRD Moneda = "LRD"
	MonedaLSL Moneda = "LSL"
	MonedaLTL Moneda = "LTL"
	MonedaLVL Moneda = "LVL"
	MonedaLYD Moneda = "LYD"
	MonedaMAD Moneda = "MAD"
	MonedaMZN Moneda = "MZN"
	MonedaMDL Moneda = "MDL"
	MonedaMGF Moneda = "MGF"
	MonedaMKD Moneda = "MKD"
	MonedaMGA Moneda = "MGA"
	MonedaMMK Moneda = "MMK"
	MonedaMNT Moneda = "MNT"
	MonedaMOP Moneda = "MOP"
	MonedaMRO Moneda = "MRO"
	MonedaMTL Moneda = "MTL"
	MonedaMUR Moneda = "MUR"
	MonedaXUA Moneda = "XUA"
	MonedaMVR Moneda = "MVR"
	MonedaMRU Moneda = "MRU"
	MonedaMWK Moneda = "MWK"
	MonedaMXN Moneda = "MXN"
	MonedaMXV Moneda = "MXV"
	MonedaMYR Moneda = "MYR"
	MonedaMZM Moneda = "MZM"
	MonedaNAD Moneda = "NAD"
	MonedaNGN Moneda = "NGN"
	MonedaNIO Moneda = "NIO"
	MonedaNOK Moneda = "NOK"
	MonedaNPR Moneda = "NPR"
	MonedaNZD Moneda = "NZD"
	MonedaOMR Moneda = "OMR"
	MonedaPAB Moneda = "PAB"
	MonedaPEN Moneda = "PEN"
	MonedaPGK Moneda = "PGK"
	MonedaPHP Moneda = "PHP"
	MonedaPKR Moneda = "PKR"
	MonedaPLN Moneda = "PLN"
	MonedaPYG Moneda = "PYG"
	MonedaQAR Moneda = "QAR"
	MonedaRON Moneda = "RON"
	MonedaROL Moneda = "ROL"
	MonedaRUB Moneda = "RUB"
	MonedaRWF Moneda = "RWF"
	MonedaSAR Moneda = "SAR"
	MonedaRSD Moneda = "RSD"
	MonedaSBD Moneda = "SBD"
	MonedaSCR Moneda = "SCR"
	MonedaSDD Moneda = "SDD"
	MonedaSDG Moneda = "SDG"
	MonedaSRD Moneda = "SRD"
	MonedaSEK Moneda = "SEK"
	MonedaSGD Moneda = "SGD"
	MonedaSHP Moneda = "SHP"
	MonedaSIT Moneda = "SIT"
	MonedaSKK Moneda = "SKK"
	MonedaSLL Moneda = "SLL"
	MonedaSOS Moneda = "SOS"
	MonedaSRG Moneda = "SRG"
	MonedaSSP Moneda = "SSP"
	MonedaSTD Moneda = "STD"
	MonedaSVC Moneda = "SVC"
	MonedaSYP Moneda = "SYP"
	MonedaSZL Moneda = "SZL"
	MonedaTHB Moneda = "THB"
	MonedaTJS Moneda = "TJS"
	MonedaTMM Moneda = "TMM"
	MonedaTND Moneda = "TND"
	MonedaTRY Moneda = "TRY"
	MonedaTMT Moneda = "TMT"
	MonedaTOP Moneda = "TOP"
	MonedaTRL Moneda = "TRL"
	MonedaTTD Moneda = "TTD"
	MonedaTWD Moneda = "TWD"
	MonedaTZS Moneda = "TZS"
	MonedaUAH Moneda = "UAH"
	MonedaUGX Moneda = "UGX"
	MonedaUSD Moneda = "USD"
	MonedaUSN Moneda = "USN"
	MonedaUYU Moneda = "UYU"
	MonedaUYI Moneda = "UYI"
	MonedaUYW Moneda = "UYW"
	MonedaUZS Moneda = "UZS"
	MonedaVEB Moneda = "VEB"
	MonedaVND Moneda = "VND"
	MonedaVUV Moneda = "VUV"
	MonedaVES Moneda = "VES"
	MonedaWST Moneda = "WST"
	MonedaSTN Moneda = "STN"
	MonedaXAF Moneda = "XAF"
	MonedaXAG Moneda = "XAG"
	MonedaXAU Moneda = "XAU"
	MonedaXCD Moneda = "XCD"
	MonedaXDR Moneda = "XDR"
	MonedaXOF Moneda = "XOF"
	MonedaXPD Moneda = "XPD"
	MonedaXPF Moneda = "XPF"
	MonedaXPT Moneda = "XPT"
	MonedaXSU Moneda = "XSU"
	MonedaXBA Moneda = "XBA"
	MonedaXBB Moneda = "XBB"
	MonedaXBC Moneda = "XBC"
	MonedaXTS Moneda = "XTS"
	MonedaXXX Moneda = "XXX"
	MonedaYER Moneda = "YER"
	MonedaYUM Moneda = "YUM"
	MonedaZMW Moneda = "ZMW"
	MonedaZWL Moneda = "ZWL"
	MonedaZAR Moneda = "ZAR"
	MonedaZMK Moneda = "ZMK"
	MonedaZWD Moneda = "ZWD"
)

type MotivoEmision

type MotivoEmision string

MotivoEmision es una enumeración de la API. Un valor fuera de las constantes se envía tal cual y la API lo valida.

const (
	MotivoEmisionDevolucionYAjustesDePrecios MotivoEmision = "DEVOLUCION_Y_AJUSTES_DE_PRECIOS"
	MotivoEmisionDevolucion                  MotivoEmision = "DEVOLUCION"
	MotivoEmisionDescuento                   MotivoEmision = "DESCUENTO"
	MotivoEmisionBonificacion                MotivoEmision = "BONIFICACION"
	MotivoEmisionCreditoIncobrable           MotivoEmision = "CREDITO_INCOBRABLE"
	MotivoEmisionRecuperoDeCosto             MotivoEmision = "RECUPERO_DE_COSTO"
	MotivoEmisionRecuperoDeGasto             MotivoEmision = "RECUPERO_DE_GASTO"
	MotivoEmisionAjusteDePrecio              MotivoEmision = "AJUSTE_DE_PRECIO"
)

type MotivoTraslado

type MotivoTraslado string

MotivoTraslado es una enumeración de la API. Un valor fuera de las constantes se envía tal cual y la API lo valida.

const (
	MotivoTrasladoTrasladoPorVentas            MotivoTraslado = "TRASLADO_POR_VENTAS"
	MotivoTrasladoTrasladoPorConsignacion      MotivoTraslado = "TRASLADO_POR_CONSIGNACION"
	MotivoTrasladoExportacion                  MotivoTraslado = "EXPORTACION"
	MotivoTrasladoTrasladoPorCompra            MotivoTraslado = "TRASLADO_POR_COMPRA"
	MotivoTrasladoImportacion                  MotivoTraslado = "IMPORTACION"
	MotivoTrasladoTrasladoPorDevolucion        MotivoTraslado = "TRASLADO_POR_DEVOLUCION"
	MotivoTrasladoTrasladoEntreLocales         MotivoTraslado = "TRASLADO_ENTRE_LOCALES"
	MotivoTrasladoTrasladoBienesTransformacion MotivoTraslado = "TRASLADO_BIENES_TRANSFORMACION"
	MotivoTrasladoTrasladoBienesReparacion     MotivoTraslado = "TRASLADO_BIENES_REPARACION"
	MotivoTrasladoTrasladoPorEmisorMovil       MotivoTraslado = "TRASLADO_POR_EMISOR_MOVIL"
	MotivoTrasladoExhibicionODemostracion      MotivoTraslado = "EXHIBICION_O_DEMOSTRACION"
	MotivoTrasladoParticipacionEnFerias        MotivoTraslado = "PARTICIPACION_EN_FERIAS"
	MotivoTrasladoTrasladoDeEncomiendas        MotivoTraslado = "TRASLADO_DE_ENCOMIENDAS"
	MotivoTrasladoDecomiso                     MotivoTraslado = "DECOMISO"
	MotivoTrasladoOtro                         MotivoTraslado = "OTRO"
)

type Naturaleza

type Naturaleza string

Naturaleza es una enumeración de la API. Un valor fuera de las constantes se envía tal cual y la API lo valida.

const (
	NaturalezaContribuyente   Naturaleza = "CONTRIBUYENTE"
	NaturalezaNoContribuyente Naturaleza = "NO_CONTRIBUYENTE"
)

type NaturalezaVendedor

type NaturalezaVendedor string

NaturalezaVendedor es una enumeración de la API. Un valor fuera de las constantes se envía tal cual y la API lo valida.

const (
	NaturalezaVendedorNoContribuyente NaturalezaVendedor = "NO_CONTRIBUYENTE"
	NaturalezaVendedorExtranjero      NaturalezaVendedor = "EXTRANJERO"
)

type NotaCreditoElectronicaRequest

type NotaCreditoElectronicaRequest struct {
	// Fecha y hora de emisión en hora local de Paraguay, sin zona ni offset. Si se omite, se usa la fecha y hora del servidor al recibir el request
	FechaEmision string `json:"fechaEmision,omitempty"`
	// Sólo se admite `NORMAL`: SIFEN todavía no habilita la emisión en contingencia
	TipoEmision TipoEmision `json:"tipoEmision"`
	// Establecimiento habilitado del emisor (1-999)
	NumeroEstablecimiento int32 `json:"numeroEstablecimiento"`
	// Punto de expedición dentro del establecimiento (1-999)
	PuntoExpedicion int32 `json:"puntoExpedicion"`
	// Número de documento (dNumDoc) asignado por tu sistema, de 1 a 9.999.999. Si se omite, Sifende asigna el siguiente correlativo del punto de expedición
	NumeroDocumento *int64 `json:"numeroDocumento,omitempty"`
	// Código de seguridad (dCodSeg) de 9 dígitos. Con el mismo número y la misma fecha de emisión produce siempre el mismo CDC. Si se omite, Sifende genera uno al azar
	CodigoSeguridad string `json:"codigoSeguridad,omitempty"`
	// Timbrado con el que tu sistema numera. Si se informa y no coincide con el timbrado cargado en Sifende para el ambiente, el documento se rechaza con `timbrado-mismatch`
	NumeroTimbrado *int32 `json:"numeroTimbrado,omitempty"`
	// Naturaleza de la operación. Obligatorio para factura y autofactura; no se informa en notas de crédito, débito ni remisión
	TipoTransaccion TipoTransaccion `json:"tipoTransaccion,omitempty"`
	// Porcentaje de descuento global aplicado a cada ítem de la operación (F010)
	DescuentoGlobalPorcentaje *Decimal `json:"descuentoGlobalPorcentaje,omitempty"`
	// Moneda de la operación
	MonedaOperacion Moneda `json:"monedaOperacion,omitempty"`
	// Tipo de cambio global de la operación (D018)
	TipoCambio *Decimal `json:"tipoCambio,omitempty"`
	// Códigos de obligaciones tributarias afectadas (D030)
	ObligacionesAfectadas []string `json:"obligacionesAfectadas,omitempty"`
	// Texto libre adicional del emisor (B005), de 1 a 3000 caracteres en una sola línea
	InfoEmisor string `json:"infoEmisor,omitempty"`
	// Ítems del documento. Al menos uno
	Items []ItemDTO `json:"items"`
	// Destinatario del documento. Los nombres de los campos no cambian entre operaciones, pero
	// cuáles son obligatorios lo decide `tipoContribuyente`, y es el motivo de rechazo más
	// frecuente al integrar:
	//
	// - `CONTRIBUYENTE` exige `tipoContribuyenteReceptor` y `digitoVerificador`, y no lleva
	//   `tipoDocumento`.
	// - `NO_CONTRIBUYENTE` exige `tipoDocumento`, y no lleva los otros dos: SIFEN rechaza
	//   `tipoContribuyenteReceptor` en un no contribuyente con el código 1303.
	//
	// Las dos reglas van como `if`/`then` en este schema, así que un validador las detecta antes
	// de mandar el request.
	Receptor ReceptorDTO `json:"receptor"`
	// Comisión de la operación (F025), IVA 10% incluido. Se suma al total general y su IVA al total de IVA
	Comision *Decimal `json:"comision,omitempty"`
	// Motivo del ajuste
	MotivoEmision MotivoEmision `json:"motivoEmision"`
	// Documento que se está modificando
	DocumentoAsociado DocumentoAsociadoDTO `json:"documentoAsociado"`
}

NotaCreditoElectronicaRequest: Nota de crédito electrónica — `tipoDocumento = NOTA_DE_CREDITO_ELECTRONICA`. No lleva `tipoTransaccion` ni `condicionOperacion`.

func (NotaCreditoElectronicaRequest) MarshalJSON

func (s NotaCreditoElectronicaRequest) MarshalJSON() ([]byte, error)

MarshalJSON agrega tipoDocumento al cuerpo.

func (*NotaCreditoElectronicaRequest) TipoDocumento

TipoDocumento devuelve TipoDocumentoNotaDeCreditoElectronica: el valor que NotaCreditoElectronicaRequest envía en tipoDocumento.

func (*NotaCreditoElectronicaRequest) Totales

Totales calcula los totales de la nota de crédito con CalcularTotales.

type NotaDebitoElectronicaRequest

type NotaDebitoElectronicaRequest struct {
	// Fecha y hora de emisión en hora local de Paraguay, sin zona ni offset. Si se omite, se usa la fecha y hora del servidor al recibir el request
	FechaEmision string `json:"fechaEmision,omitempty"`
	// Sólo se admite `NORMAL`: SIFEN todavía no habilita la emisión en contingencia
	TipoEmision TipoEmision `json:"tipoEmision"`
	// Establecimiento habilitado del emisor (1-999)
	NumeroEstablecimiento int32 `json:"numeroEstablecimiento"`
	// Punto de expedición dentro del establecimiento (1-999)
	PuntoExpedicion int32 `json:"puntoExpedicion"`
	// Número de documento (dNumDoc) asignado por tu sistema, de 1 a 9.999.999. Si se omite, Sifende asigna el siguiente correlativo del punto de expedición
	NumeroDocumento *int64 `json:"numeroDocumento,omitempty"`
	// Código de seguridad (dCodSeg) de 9 dígitos. Con el mismo número y la misma fecha de emisión produce siempre el mismo CDC. Si se omite, Sifende genera uno al azar
	CodigoSeguridad string `json:"codigoSeguridad,omitempty"`
	// Timbrado con el que tu sistema numera. Si se informa y no coincide con el timbrado cargado en Sifende para el ambiente, el documento se rechaza con `timbrado-mismatch`
	NumeroTimbrado *int32 `json:"numeroTimbrado,omitempty"`
	// Naturaleza de la operación. Obligatorio para factura y autofactura; no se informa en notas de crédito, débito ni remisión
	TipoTransaccion TipoTransaccion `json:"tipoTransaccion,omitempty"`
	// Porcentaje de descuento global aplicado a cada ítem de la operación (F010)
	DescuentoGlobalPorcentaje *Decimal `json:"descuentoGlobalPorcentaje,omitempty"`
	// Moneda de la operación
	MonedaOperacion Moneda `json:"monedaOperacion,omitempty"`
	// Tipo de cambio global de la operación (D018)
	TipoCambio *Decimal `json:"tipoCambio,omitempty"`
	// Códigos de obligaciones tributarias afectadas (D030)
	ObligacionesAfectadas []string `json:"obligacionesAfectadas,omitempty"`
	// Texto libre adicional del emisor (B005), de 1 a 3000 caracteres en una sola línea
	InfoEmisor string `json:"infoEmisor,omitempty"`
	// Ítems del documento. Al menos uno
	Items []ItemDTO `json:"items"`
	// Destinatario del documento. Los nombres de los campos no cambian entre operaciones, pero
	// cuáles son obligatorios lo decide `tipoContribuyente`, y es el motivo de rechazo más
	// frecuente al integrar:
	//
	// - `CONTRIBUYENTE` exige `tipoContribuyenteReceptor` y `digitoVerificador`, y no lleva
	//   `tipoDocumento`.
	// - `NO_CONTRIBUYENTE` exige `tipoDocumento`, y no lleva los otros dos: SIFEN rechaza
	//   `tipoContribuyenteReceptor` en un no contribuyente con el código 1303.
	//
	// Las dos reglas van como `if`/`then` en este schema, así que un validador las detecta antes
	// de mandar el request.
	Receptor ReceptorDTO `json:"receptor"`
	// Comisión de la operación (F025), IVA 10% incluido. Se suma al total general y su IVA al total de IVA
	Comision *Decimal `json:"comision,omitempty"`
	// Motivo del ajuste
	MotivoEmision MotivoEmision `json:"motivoEmision"`
	// Documento que se está modificando
	DocumentoAsociado DocumentoAsociadoDTO `json:"documentoAsociado"`
}

NotaDebitoElectronicaRequest: Nota de débito electrónica — `tipoDocumento = NOTA_DE_DEBITO_ELECTRONICA`. No lleva `tipoTransaccion` ni `condicionOperacion`.

func (NotaDebitoElectronicaRequest) MarshalJSON

func (s NotaDebitoElectronicaRequest) MarshalJSON() ([]byte, error)

MarshalJSON agrega tipoDocumento al cuerpo.

func (*NotaDebitoElectronicaRequest) TipoDocumento

TipoDocumento devuelve TipoDocumentoNotaDeDebitoElectronica: el valor que NotaDebitoElectronicaRequest envía en tipoDocumento.

func (*NotaDebitoElectronicaRequest) Totales

func (n *NotaDebitoElectronicaRequest) Totales() (Totales, error)

Totales calcula los totales de la nota de débito con CalcularTotales.

type NotaRemisionElectronicaRequest

type NotaRemisionElectronicaRequest struct {
	// Fecha y hora de emisión en hora local de Paraguay, sin zona ni offset. Si se omite, se usa la fecha y hora del servidor al recibir el request
	FechaEmision string `json:"fechaEmision,omitempty"`
	// Sólo se admite `NORMAL`: SIFEN todavía no habilita la emisión en contingencia
	TipoEmision TipoEmision `json:"tipoEmision"`
	// Establecimiento habilitado del emisor (1-999)
	NumeroEstablecimiento int32 `json:"numeroEstablecimiento"`
	// Punto de expedición dentro del establecimiento (1-999)
	PuntoExpedicion int32 `json:"puntoExpedicion"`
	// Número de documento (dNumDoc) asignado por tu sistema, de 1 a 9.999.999. Si se omite, Sifende asigna el siguiente correlativo del punto de expedición
	NumeroDocumento *int64 `json:"numeroDocumento,omitempty"`
	// Código de seguridad (dCodSeg) de 9 dígitos. Con el mismo número y la misma fecha de emisión produce siempre el mismo CDC. Si se omite, Sifende genera uno al azar
	CodigoSeguridad string `json:"codigoSeguridad,omitempty"`
	// Timbrado con el que tu sistema numera. Si se informa y no coincide con el timbrado cargado en Sifende para el ambiente, el documento se rechaza con `timbrado-mismatch`
	NumeroTimbrado *int32 `json:"numeroTimbrado,omitempty"`
	// Naturaleza de la operación. Obligatorio para factura y autofactura; no se informa en notas de crédito, débito ni remisión
	TipoTransaccion TipoTransaccion `json:"tipoTransaccion,omitempty"`
	// Porcentaje de descuento global aplicado a cada ítem de la operación (F010)
	DescuentoGlobalPorcentaje *Decimal `json:"descuentoGlobalPorcentaje,omitempty"`
	// Moneda de la operación
	MonedaOperacion Moneda `json:"monedaOperacion,omitempty"`
	// Tipo de cambio global de la operación (D018)
	TipoCambio *Decimal `json:"tipoCambio,omitempty"`
	// Códigos de obligaciones tributarias afectadas (D030)
	ObligacionesAfectadas []string `json:"obligacionesAfectadas,omitempty"`
	// Texto libre adicional del emisor (B005), de 1 a 3000 caracteres en una sola línea
	InfoEmisor string `json:"infoEmisor,omitempty"`
	// Ítems del documento. Al menos uno
	Items []ItemRemisionDTO `json:"items"`
	// Destinatario del documento. Los nombres de los campos no cambian entre operaciones, pero
	// cuáles son obligatorios lo decide `tipoContribuyente`, y es el motivo de rechazo más
	// frecuente al integrar:
	//
	// - `CONTRIBUYENTE` exige `tipoContribuyenteReceptor` y `digitoVerificador`, y no lleva
	//   `tipoDocumento`.
	// - `NO_CONTRIBUYENTE` exige `tipoDocumento`, y no lleva los otros dos: SIFEN rechaza
	//   `tipoContribuyenteReceptor` en un no contribuyente con el código 1303.
	//
	// Las dos reglas van como `if`/`then` en este schema, así que un validador las detecta antes
	// de mandar el request.
	Receptor                  ReceptorDTO        `json:"receptor"`
	MotivoTraslado            MotivoTraslado     `json:"motivoTraslado"`
	DescripcionMotivoTraslado string             `json:"descripcionMotivoTraslado,omitempty"`
	ResponsableEmision        ResponsableEmision `json:"responsableEmision"`
	KilometrosRecorrido       int32              `json:"kilometrosRecorrido"`
	CostoFlete                *Decimal           `json:"costoFlete,omitempty"`
	// Obligatoria en venta sin asociaciones; mes/año no posterior a la emisión efectiva
	FechaFacturaFutura string                `json:"fechaFacturaFutura,omitempty"`
	InformacionFiscal  string                `json:"informacionFiscal,omitempty"`
	Carga              *CargaRemisionDTO     `json:"carga,omitempty"`
	Transporte         TransporteRemisionDTO `json:"transporte"`
	// Sólo facturas asociadas: CDC electrónico con prefijo 01 o tipoDocumentoImpreso FACTURA (H001a/2414)
	DocumentosAsociados []DocumentoAsociadoRemisionDTO `json:"documentosAsociados,omitempty"`
}

NotaRemisionElectronicaRequest: Nota de remisión electrónica — `tipoDocumento = NOTA_DE_REMISION_ELECTRONICA`. La emisión de NRE está disponible. Antes de iniciar el traslado, esperá a que la nota de remisión esté en estado APROBADO o APROBADO_OBSERVACION. La `direccion` del receptor es obligatoria: documenta un traslado físico de mercadería. Ejemplos sintéticos nacional/importación/exportación: sólo tramo paraguayo, no sustituyen documentación ni autorización aduanera. Ajustar fechas e identidad al emisor; el registro no equivale a aprobación SIFEN.

func (NotaRemisionElectronicaRequest) MarshalJSON

func (s NotaRemisionElectronicaRequest) MarshalJSON() ([]byte, error)

MarshalJSON agrega tipoDocumento al cuerpo.

func (*NotaRemisionElectronicaRequest) TipoDocumento

TipoDocumento devuelve TipoDocumentoNotaDeRemisionElectronica: el valor que NotaRemisionElectronicaRequest envía en tipoDocumento.

type Opcion

type Opcion func(*Cliente) error

Opcion configura el cliente en NuevoCliente.

func ConBaseURL

func ConBaseURL(base string) Opcion

ConBaseURL apunta el cliente a otra URL, por ejemplo un servidor de pruebas.

func ConHTTPClient

func ConHTTPClient(h *http.Client) Opcion

ConHTTPClient usa otro *http.Client, por ejemplo con un proxy o un transporte instrumentado. Su Timeout se suma al del SDK: dejalo en cero y usá ConTimeout.

func ConMaxReintentos

func ConMaxReintentos(n int) Opcion

ConMaxReintentos fija cuántas veces se repite una operación ante una falla transitoria. Por defecto 2; 0 los desactiva.

func ConTimeout

func ConTimeout(d time.Duration) Opcion

ConTimeout fija el tiempo máximo de cada intento, lectura del cuerpo incluida. Por defecto 30 s.

type OpcionesTicket added in v0.2.0

type OpcionesTicket struct {
	// Ancho es el ancho del papel en mm: 80 o 58. Cero es 80.
	Ancho int32
	// Resumen omite el detalle de ítems y de impuestos (Manual Técnico V150, cap. 13.7).
	Resumen bool
}

OpcionesTicket configura DescargarKudeTicket.

type OpcionesTicketImagen added in v0.2.0

type OpcionesTicketImagen struct {
	// Puntos son los puntos por línea de la impresora a 203 dpi: 576 o 512 para papel de 80 mm, 384 para 58 mm. Cero
	// es 576.
	Puntos int32
	// Resumen omite el detalle de ítems y de impuestos (Manual Técnico V150, cap. 13.7).
	Resumen bool
}

OpcionesTicketImagen configura DescargarKudeTicketImagen.

type OpcionesVerificacion

type OpcionesVerificacion struct {
	// Cuerpo es el cuerpo crudo tal como llegó: la firma se calcula sobre bytes, no sobre el JSON reserializado.
	Cuerpo  []byte
	Headers http.Header
	// Secretos son los secretos whsec_… del endpoint. Durante una rotación, pasá el nuevo y el anterior.
	Secretos []string
	// Tolerancia es la antigüedad máxima de X-Sifende-Timestamp. Cero es ToleranciaWebhookPorDefecto.
	Tolerancia time.Duration
	// Ahora reemplaza el reloj, para tests. Cero es time.Now().
	Ahora time.Time
}

OpcionesVerificacion configura VerificarWebhook.

type Padron

type Padron struct {
	// RUC base o número de cédula, normalizado: sólo dígitos, sin DV.
	NumeroDocumento string `json:"numeroDocumento,omitempty"`
	// CONTRIBUYENTE si el documento está inscripto como tal; NO_CONTRIBUYENTE si sólo figura como ciudadano.
	TipoContribuyente Naturaleza `json:"tipoContribuyente,omitempty"`
	// Tipo de documento de identidad; sólo para un no contribuyente.
	TipoDocumento TipoDocumentoIdentidad `json:"tipoDocumento,omitempty"`
	// Persona física o jurídica (D207); null para un no contribuyente.
	TipoContribuyenteReceptor TipoContribuyente `json:"tipoContribuyenteReceptor,omitempty"`
	// Dígito verificador del RUC.
	DigitoVerificador string `json:"digitoVerificador,omitempty"`
	// Razón social o nombre completo.
	NombreRazonSocial string `json:"nombreRazonSocial,omitempty"`
	NombreComercial   string `json:"nombreComercial,omitempty"`
	// Correo electronico
	Email string `json:"email,omitempty"`
	// Estado del contribuyente tal como lo informa la SET.
	Estado string `json:"estado,omitempty"`
	// Código SET del estado, el mismo que usa el contribuyente en Sifende.
	EstadoRUC         EstadoRUC     `json:"estadoRuc,omitempty"`
	TipoSociedad      *TipoSociedad `json:"tipoSociedad,omitempty"`
	EsPersonaJuridica bool          `json:"esPersonaJuridica,omitempty"`
	EsEntidadPublica  bool          `json:"esEntidadPublica,omitempty"`
	Exportador        bool          `json:"exportador,omitempty"`
	// Domicilio fiscal con los códigos geográficos de SIFEN, si el padrón lo tiene.
	Domicilio    *Domicilio `json:"domicilio,omitempty"`
	ConsultadoEn string     `json:"consultadoEn,omitempty"`
}

Padron: Datos de un contribuyente o ciudadano según el padrón de la SET. Los nombres de campo y las enumeraciones son los del receptor de un documento electrónico.

type PageDTOEventoSifenDTO

type PageDTOEventoSifenDTO struct {
	Content       []EventoSifenDTO `json:"content,omitempty"`
	Page          int32            `json:"page,omitempty"`
	Size          int32            `json:"size,omitempty"`
	TotalElements int64            `json:"totalElements,omitempty"`
	TotalPages    int32            `json:"totalPages,omitempty"`
}

PageDTOEventoSifenDTO es un objeto de la API de Sifende.

type PagoFacturaDTO

type PagoFacturaDTO struct {
	// Medio de pago (E606)
	TipoPago TipoPago `json:"tipoPago"`
	// Descripción propia del medio (E607). Obligatoria y exclusiva de `tipoPago = OTRO`
	DescripcionTipoPago string `json:"descripcionTipoPago,omitempty"`
	// Importe aplicado a la factura, en `monedaPago` (E608)
	MontoPago Decimal `json:"montoPago"`
	// Moneda del pago (E609)
	MonedaPago Moneda `json:"monedaPago"`
	// Tipo de cambio de `monedaPago` (E611). Obligatorio fuera de PYG; prohibido en PYG
	TipoCambio *Decimal `json:"tipoCambio,omitempty"`
	// Datos de la tarjeta (E620). Obligatorio y exclusivo de tarjeta de crédito o débito
	Tarjeta *TarjetaPagoDTO `json:"tarjeta,omitempty"`
	// Datos del cheque (E630). Obligatorio y exclusivo de `tipoPago = CHEQUE`
	Cheque *ChequePagoDTO `json:"cheque,omitempty"`
}

PagoFacturaDTO: Un medio de pago de la factura (E605). En contado cubre el total; en crédito, la entrega inicial

type Pais

type Pais string

Pais es una enumeración de la API. Un valor fuera de las constantes se envía tal cual y la API lo valida.

const (
	PaisDZA Pais = "DZA"
	PaisEGY Pais = "EGY"
	PaisLBY Pais = "LBY"
	PaisMAR Pais = "MAR"
	PaisSDN Pais = "SDN"
	PaisTUN Pais = "TUN"
	PaisESH Pais = "ESH"
	PaisIOT Pais = "IOT"
	PaisBDI Pais = "BDI"
	PaisCOM Pais = "COM"
	PaisDJI Pais = "DJI"
	PaisERI Pais = "ERI"
	PaisETH Pais = "ETH"
	PaisATF Pais = "ATF"
	PaisKEN Pais = "KEN"
	PaisMDG Pais = "MDG"
	PaisMWI Pais = "MWI"
	PaisMUS Pais = "MUS"
	PaisMYT Pais = "MYT"
	PaisMOZ Pais = "MOZ"
	PaisREU Pais = "REU"
	PaisRWA Pais = "RWA"
	PaisSYC Pais = "SYC"
	PaisSOM Pais = "SOM"
	PaisSSD Pais = "SSD"
	PaisUGA Pais = "UGA"
	PaisTZA Pais = "TZA"
	PaisZMB Pais = "ZMB"
	PaisZWE Pais = "ZWE"
	PaisAGO Pais = "AGO"
	PaisCMR Pais = "CMR"
	PaisCAF Pais = "CAF"
	PaisTCD Pais = "TCD"
	PaisCOG Pais = "COG"
	PaisCOD Pais = "COD"
	PaisGNQ Pais = "GNQ"
	PaisGAB Pais = "GAB"
	PaisSTP Pais = "STP"
	PaisBWA Pais = "BWA"
	PaisLSO Pais = "LSO"
	PaisNAM Pais = "NAM"
	PaisZAF Pais = "ZAF"
	PaisSWZ Pais = "SWZ"
	PaisBEN Pais = "BEN"
	PaisBFA Pais = "BFA"
	PaisCPV Pais = "CPV"
	PaisCIV Pais = "CIV"
	PaisGMB Pais = "GMB"
	PaisGHA Pais = "GHA"
	PaisGIN Pais = "GIN"
	PaisGNB Pais = "GNB"
	PaisLBR Pais = "LBR"
	PaisMLI Pais = "MLI"
	PaisMRT Pais = "MRT"
	PaisNER Pais = "NER"
	PaisNGA Pais = "NGA"
	PaisSHN Pais = "SHN"
	PaisSEN Pais = "SEN"
	PaisSLE Pais = "SLE"
	PaisTGO Pais = "TGO"
	PaisAIA Pais = "AIA"
	PaisATG Pais = "ATG"
	PaisABW Pais = "ABW"
	PaisBHS Pais = "BHS"
	PaisBRB Pais = "BRB"
	PaisBES Pais = "BES"
	PaisVGB Pais = "VGB"
	PaisCYM Pais = "CYM"
	PaisCUB Pais = "CUB"
	PaisCUW Pais = "CUW"
	PaisDMA Pais = "DMA"
	PaisDOM Pais = "DOM"
	PaisGRD Pais = "GRD"
	PaisGLP Pais = "GLP"
	PaisHTI Pais = "HTI"
	PaisJAM Pais = "JAM"
	PaisMTQ Pais = "MTQ"
	PaisMSR Pais = "MSR"
	PaisPRI Pais = "PRI"
	PaisBLM Pais = "BLM"
	PaisKNA Pais = "KNA"
	PaisLCA Pais = "LCA"
	PaisMAF Pais = "MAF"
	PaisVCT Pais = "VCT"
	PaisSXM Pais = "SXM"
	PaisTTO Pais = "TTO"
	PaisTCA Pais = "TCA"
	PaisVIR Pais = "VIR"
	PaisBLZ Pais = "BLZ"
	PaisCRI Pais = "CRI"
	PaisSLV Pais = "SLV"
	PaisGTM Pais = "GTM"
	PaisHND Pais = "HND"
	PaisMEX Pais = "MEX"
	PaisNIC Pais = "NIC"
	PaisPAN Pais = "PAN"
	PaisARG Pais = "ARG"
	PaisBOL Pais = "BOL"
	PaisBRA Pais = "BRA"
	PaisCHL Pais = "CHL"
	PaisCOL Pais = "COL"
	PaisECU Pais = "ECU"
	PaisFLK Pais = "FLK"
	PaisGUF Pais = "GUF"
	PaisGUY Pais = "GUY"
	PaisPRY Pais = "PRY"
	PaisPER Pais = "PER"
	PaisSGS Pais = "SGS"
	PaisSUR Pais = "SUR"
	PaisURY Pais = "URY"
	PaisVEN Pais = "VEN"
	PaisBMU Pais = "BMU"
	PaisCAN Pais = "CAN"
	PaisGRL Pais = "GRL"
	PaisSPM Pais = "SPM"
	PaisUSA Pais = "USA"
	PaisATA Pais = "ATA"
	PaisKAZ Pais = "KAZ"
	PaisKGZ Pais = "KGZ"
	PaisTJK Pais = "TJK"
	PaisTKM Pais = "TKM"
	PaisUZB Pais = "UZB"
	PaisCHN Pais = "CHN"
	PaisHKG Pais = "HKG"
	PaisMAC Pais = "MAC"
	PaisTWN Pais = "TWN"
	PaisPRK Pais = "PRK"
	PaisJPN Pais = "JPN"
	PaisMNG Pais = "MNG"
	PaisKOR Pais = "KOR"
	PaisBRN Pais = "BRN"
	PaisKHM Pais = "KHM"
	PaisIDN Pais = "IDN"
	PaisLAO Pais = "LAO"
	PaisMYS Pais = "MYS"
	PaisMMR Pais = "MMR"
	PaisPHL Pais = "PHL"
	PaisSGP Pais = "SGP"
	PaisTHA Pais = "THA"
	PaisTLS Pais = "TLS"
	PaisVNM Pais = "VNM"
	PaisAFG Pais = "AFG"
	PaisBGD Pais = "BGD"
	PaisBTN Pais = "BTN"
	PaisIND Pais = "IND"
	PaisIRN Pais = "IRN"
	PaisMDV Pais = "MDV"
	PaisNPL Pais = "NPL"
	PaisPAK Pais = "PAK"
	PaisLKA Pais = "LKA"
	PaisARM Pais = "ARM"
	PaisAZE Pais = "AZE"
	PaisBHR Pais = "BHR"
	PaisCYP Pais = "CYP"
	PaisGEO Pais = "GEO"
	PaisIRQ Pais = "IRQ"
	PaisISR Pais = "ISR"
	PaisJOR Pais = "JOR"
	PaisKWT Pais = "KWT"
	PaisLBN Pais = "LBN"
	PaisOMN Pais = "OMN"
	PaisQAT Pais = "QAT"
	PaisSAU Pais = "SAU"
	PaisPSE Pais = "PSE"
	PaisSYR Pais = "SYR"
	PaisTUR Pais = "TUR"
	PaisARE Pais = "ARE"
	PaisYEM Pais = "YEM"
	PaisBLR Pais = "BLR"
	PaisBGR Pais = "BGR"
	PaisCZE Pais = "CZE"
	PaisHUN Pais = "HUN"
	PaisPOL Pais = "POL"
	PaisMDA Pais = "MDA"
	PaisROU Pais = "ROU"
	PaisRUS Pais = "RUS"
	PaisSVK Pais = "SVK"
	PaisUKR Pais = "UKR"
	PaisALA Pais = "ALA"
	PaisGGY Pais = "GGY"
	PaisJEY Pais = "JEY"
	PaisDNK Pais = "DNK"
	PaisEST Pais = "EST"
	PaisFRO Pais = "FRO"
	PaisFIN Pais = "FIN"
	PaisISL Pais = "ISL"
	PaisIRL Pais = "IRL"
	PaisIMN Pais = "IMN"
	PaisLVA Pais = "LVA"
	PaisLTU Pais = "LTU"
	PaisNOR Pais = "NOR"
	PaisSJM Pais = "SJM"
	PaisSWE Pais = "SWE"
	PaisGBR Pais = "GBR"
	PaisALB Pais = "ALB"
	PaisAND Pais = "AND"
	PaisBIH Pais = "BIH"
	PaisHRV Pais = "HRV"
	PaisGIB Pais = "GIB"
	PaisGRC Pais = "GRC"
	PaisVAT Pais = "VAT"
	PaisITA Pais = "ITA"
	PaisMLT Pais = "MLT"
	PaisMNE Pais = "MNE"
	PaisPRT Pais = "PRT"
	PaisSMR Pais = "SMR"
	PaisSRB Pais = "SRB"
	PaisSVN Pais = "SVN"
	PaisESP Pais = "ESP"
	PaisMKD Pais = "MKD"
	PaisAUT Pais = "AUT"
	PaisBEL Pais = "BEL"
	PaisFRA Pais = "FRA"
	PaisDEU Pais = "DEU"
	PaisLIE Pais = "LIE"
	PaisLUX Pais = "LUX"
	PaisMCO Pais = "MCO"
	PaisNLD Pais = "NLD"
	PaisCHE Pais = "CHE"
	PaisAUS Pais = "AUS"
	PaisCXR Pais = "CXR"
	PaisCCK Pais = "CCK"
	PaisHMD Pais = "HMD"
	PaisNZL Pais = "NZL"
	PaisNFK Pais = "NFK"
	PaisFJI Pais = "FJI"
	PaisNCL Pais = "NCL"
	PaisPNG Pais = "PNG"
	PaisSLB Pais = "SLB"
	PaisVUT Pais = "VUT"
	PaisGUM Pais = "GUM"
	PaisKIR Pais = "KIR"
	PaisMHL Pais = "MHL"
	PaisFSM Pais = "FSM"
	PaisNRU Pais = "NRU"
	PaisMNP Pais = "MNP"
	PaisPLW Pais = "PLW"
	PaisUMI Pais = "UMI"
	PaisASM Pais = "ASM"
	PaisCOK Pais = "COK"
	PaisPYF Pais = "PYF"
	PaisNIU Pais = "NIU"
	PaisPCN Pais = "PCN"
	PaisWSM Pais = "WSM"
	PaisTKL Pais = "TKL"
	PaisTON Pais = "TON"
	PaisTUV Pais = "TUV"
	PaisWLF Pais = "WLF"
	PaisNN  Pais = "NN"
)

type PlanConsumoDTO

type PlanConsumoDTO struct {
	CodigoPlan                  string `json:"codigoPlan,omitempty"`
	NombrePlan                  string `json:"nombrePlan,omitempty"`
	InicioPeriodo               string `json:"inicioPeriodo,omitempty"`
	FinPeriodo                  string `json:"finPeriodo,omitempty"`
	DocumentosIncluidos         int64  `json:"documentosIncluidos,omitempty"`
	ConsumoConfirmado           int64  `json:"consumoConfirmado,omitempty"`
	ReservasActivas             int64  `json:"reservasActivas,omitempty"`
	DocumentosDisponibles       int64  `json:"documentosDisponibles,omitempty"`
	PermiteAdicionales          bool   `json:"permiteAdicionales,omitempty"`
	PrecioDocumentoAdicionalPYG int64  `json:"precioDocumentoAdicionalPyg,omitempty"`
	AdicionalesFacturables      int64  `json:"adicionalesFacturables,omitempty"`
	CostoEstimadoPYG            int64  `json:"costoEstimadoPyg,omitempty"`
}

PlanConsumoDTO es un objeto de la API de Sifende.

type PlazoEstructuradoDTO

type PlazoEstructuradoDTO struct {
	Cantidad int32       `json:"cantidad"`
	Unidad   UnidadPlazo `json:"unidad"`
}

PlazoEstructuradoDTO es un objeto de la API de Sifende.

type PolizaSeguroDTO

type PolizaSeguroDTO struct {
	// Código de la póliza (EA791)
	Codigo string `json:"codigo"`
	// Unidad de tiempo de la vigencia (EA792): hora, día, mes, año
	UnidadVigencia string `json:"unidadVigencia"`
	// Vigencia en la unidad indicada (EA793)
	Vigencia Decimal `json:"vigencia"`
	// Número de la póliza (EA794)
	Numero string `json:"numero"`
	// Inicio de vigencia (EA795), `AAAA-MM-DDThh:mm:ss`
	FechaInicioVigencia string `json:"fechaInicioVigencia,omitempty"`
	// Fin de vigencia (EA796), no anterior al inicio
	FechaFinVigencia string `json:"fechaFinVigencia,omitempty"`
	// Código de un ítem de la factura para asociar la póliza (EA797, NT008)
	CodigoItem string `json:"codigoItem,omitempty"`
}

PolizaSeguroDTO: Póliza de seguros (EA790)

type ProblemDetail

type ProblemDetail struct {
	// URI del tipo de error. Apunta a la página de la documentación que lo explica
	Type string `json:"type,omitempty"`
	// Resumen legible del tipo de error
	Title string `json:"title,omitempty"`
	// Código HTTP
	Status int `json:"status,omitempty"`
	// Descripción del caso concreto
	Detail string `json:"detail,omitempty"`
	// Ruta que produjo el error
	Instance string `json:"instance,omitempty"`
	// Identificador de la petición. Es el dato que hay que pasarle a soporte
	TraceID string `json:"traceId,omitempty"`
	// Sólo en errores de validación: un mensaje por campo, indexado por el nombre del campo tal como se envió
	Errores map[string]string `json:"errores,omitempty"`
	// Campo del request que causó el rechazo, incluido un header cuando corresponda
	Campo string `json:"campo,omitempty"`
	// Valor que llegó en el request
	ValorRecibido string `json:"valorRecibido,omitempty"`
	// Sólo en errores de enumeración: los valores válidos, con su descripción
	ValoresAceptados []any `json:"valoresAceptados,omitempty"`
}

ProblemDetail: Error en formato RFC 9457. Se sirve como `application/problem+json`.

type PuntoExpedicion

type PuntoExpedicion struct {
	PuntoExpedicion int32 `json:"puntoExpedicion,omitempty"`
	Activo          bool  `json:"activo,omitempty"`
}

PuntoExpedicion es un objeto de la API de Sifende.

type ReceptorDTO

type ReceptorDTO struct {
	// Naturaleza del receptor (D201). Siempre se envía
	TipoContribuyente Naturaleza `json:"tipoContribuyente"`
	// Tipo de operación: B2B, B2C, B2G (organismo público) o B2F (cliente del exterior)
	TipoOperacion TipoOperacion `json:"tipoOperacion"`
	// Persona física o jurídica (D205). Obligatorio si `tipoContribuyente = CONTRIBUYENTE`; no se envía para un no contribuyente
	TipoContribuyenteReceptor TipoContribuyente `json:"tipoContribuyenteReceptor,omitempty"`
	// Tipo de documento de identidad del receptor (D208). Su descripción D209 se deriva del catálogo. Obligatorio si `tipoContribuyente = NO_CONTRIBUYENTE`; no se envía para un contribuyente
	TipoDocumento TipoDocumentoIdentidad `json:"tipoDocumento,omitempty"`
	// Descripción propia del documento de identidad (D209). Obligatoria y exclusiva de `tipoDocumento = OTRO`
	DescripcionTipoDocumento string `json:"descripcionTipoDocumento,omitempty"`
	// RUC sin el dígito verificador para un contribuyente; número de identidad (D210) para un no contribuyente. Para el receptor innominado, el literal `0`. Opcional sólo en B2F
	NumeroDocumento string `json:"numeroDocumento,omitempty"`
	// Nombre completo o razón social (D211). Para el receptor innominado, el literal `Sin Nombre`
	NombreRazonSocial string `json:"nombreRazonSocial"`
	// Dígito verificador del RUC, un solo dígito. Obligatorio si `tipoContribuyente = CONTRIBUYENTE`
	DigitoVerificador string `json:"digitoVerificador,omitempty"`
	// Nombre de fantasía del receptor (D212)
	NombreFantasia string `json:"nombreFantasia,omitempty"`
	// Domicilio del receptor (D213). Obligatorio para `tipoOperacion = B2F` y para la nota de remisión, que documenta un traslado físico; opcional en el resto. En una FE nacional exige `departamento` y `ciudad`
	Direccion string `json:"direccion,omitempty"`
	// Número de casa (D218)
	NumeroCasa *int32 `json:"numeroCasa,omitempty"`
	// Departamento del catálogo paraguayo (D219)
	Departamento string `json:"departamento,omitempty"`
	// Código de distrito del catálogo paraguayo (D221)
	CodigoDistrito *int32 `json:"codigoDistrito,omitempty"`
	// Ciudad del catálogo paraguayo (D223)
	Ciudad string `json:"ciudad,omitempty"`
	// Teléfono del receptor (D214)
	Telefono string `json:"telefono,omitempty"`
	// Teléfono móvil
	Celular string `json:"celular,omitempty"`
	// Si el envío automático está configurado, Sifende manda el KuDE a esta dirección
	Email string `json:"email,omitempty"`
	// Código interno con el que el emisor identifica al cliente (D217)
	CodigoCliente string `json:"codigoCliente,omitempty"`
	// País del receptor en código ISO. Sólo se cambia para receptores del exterior
	Pais Pais `json:"pais,omitempty"`
}

ReceptorDTO: Destinatario del documento. Los nombres de los campos no cambian entre operaciones, pero cuáles son obligatorios lo decide `tipoContribuyente`, y es el motivo de rechazo más frecuente al integrar:

  • `CONTRIBUYENTE` exige `tipoContribuyenteReceptor` y `digitoVerificador`, y no lleva `tipoDocumento`.
  • `NO_CONTRIBUYENTE` exige `tipoDocumento`, y no lleva los otros dos: SIFEN rechaza `tipoContribuyenteReceptor` en un no contribuyente con el código 1303.

Las dos reglas van como `if`/`then` en este schema, así que un validador las detecta antes de mandar el request.

type ReceptorNominadoRequest

type ReceptorNominadoRequest struct {
	Naturaleza               Naturaleza             `json:"naturaleza"`
	TipoOperacion            TipoOperacion          `json:"tipoOperacion"`
	Pais                     Pais                   `json:"pais"`
	TipoContribuyente        TipoContribuyente      `json:"tipoContribuyente,omitempty"`
	RUC                      string                 `json:"ruc,omitempty"`
	DigitoVerificador        string                 `json:"digitoVerificador,omitempty"`
	TipoDocumento            TipoDocumentoIdentidad `json:"tipoDocumento,omitempty"`
	DescripcionTipoDocumento string                 `json:"descripcionTipoDocumento,omitempty"`
	NumeroDocumento          string                 `json:"numeroDocumento,omitempty"`
	NombreRazonSocial        string                 `json:"nombreRazonSocial"`
	NombreFantasia           string                 `json:"nombreFantasia,omitempty"`
	Direccion                string                 `json:"direccion,omitempty"`
	NumeroCasa               *int32                 `json:"numeroCasa,omitempty"`
	Departamento             Departamento           `json:"departamento,omitempty"`
	CodigoDistrito           *int32                 `json:"codigoDistrito,omitempty"`
	CodigoCiudad             *int32                 `json:"codigoCiudad,omitempty"`
	Telefono                 string                 `json:"telefono,omitempty"`
	Celular                  string                 `json:"celular,omitempty"`
	Email                    string                 `json:"email,omitempty"`
	CodigoCliente            string                 `json:"codigoCliente,omitempty"`
}

ReceptorNominadoRequest: Receptor que reemplazará al receptor innominado de la factura electrónica

type ResponsableEmision

type ResponsableEmision string

ResponsableEmision es una enumeración de la API. Un valor fuera de las constantes se envía tal cual y la API lo valida.

const (
	ResponsableEmisionEmisorFactura                    ResponsableEmision = "EMISOR_FACTURA"
	ResponsableEmisionPoseedorFacturaYBienes           ResponsableEmision = "POSEEDOR_FACTURA_Y_BIENES"
	ResponsableEmisionEmpresaTransportista             ResponsableEmision = "EMPRESA_TRANSPORTISTA"
	ResponsableEmisionDespachanteDeAduanas             ResponsableEmision = "DESPACHANTE_DE_ADUANAS"
	ResponsableEmisionAgenteDeTransporteOIntermediario ResponsableEmision = "AGENTE_DE_TRANSPORTE_O_INTERMEDIARIO"
)

type ResponsableFlete

type ResponsableFlete string

ResponsableFlete es una enumeración de la API. Un valor fuera de las constantes se envía tal cual y la API lo valida.

const (
	ResponsableFleteEmisorFacturaElectronica   ResponsableFlete = "EMISOR_FACTURA_ELECTRONICA"
	ResponsableFleteReceptorFacturaElectronica ResponsableFlete = "RECEPTOR_FACTURA_ELECTRONICA"
	ResponsableFleteTercero                    ResponsableFlete = "TERCERO"
	ResponsableFleteAgenteIntermediario        ResponsableFlete = "AGENTE_INTERMEDIARIO"
	ResponsableFleteTransportePropio           ResponsableFlete = "TRANSPORTE_PROPIO"
)

type ResultadoSifen

type ResultadoSifen struct {
	Codigo  string `json:"codigo"`
	Mensaje string `json:"mensaje"`
}

type SeguroDTO

type SeguroDTO struct {
	// Código de la empresa de seguros en la Superintendencia de Seguros (E801)
	CodigoEmpresa string `json:"codigoEmpresa,omitempty"`
	// Pólizas (EA790), de 1 a 999
	Polizas []PolizaSeguroDTO `json:"polizas"`
}

SeguroDTO: Sector de seguros (E800)

type ServicioCatalogos

type ServicioCatalogos struct {
	// contains filtered or unexported fields
}

ServicioCatalogos consulta los catálogos públicos de la API. No envían la API key.

func (*ServicioCatalogos) Ciudades

func (r *ServicioCatalogos) Ciudades(ctx context.Context, distritoID int32) ([]CiudadDTO, error)

func (*ServicioCatalogos) CiudadesDeDepartamento added in v0.2.0

func (r *ServicioCatalogos) CiudadesDeDepartamento(ctx context.Context, departamentoID int32) ([]CiudadDTO, error)

CiudadesDeDepartamento devuelve todas las ciudades de un departamento, sin pasar por sus distritos, con el código que SIFEN espera en el domicilio del receptor.

func (*ServicioCatalogos) Departamentos

func (r *ServicioCatalogos) Departamentos(ctx context.Context) ([]DepartamentoDTO, error)

func (*ServicioCatalogos) Distritos

func (r *ServicioCatalogos) Distritos(ctx context.Context, departamentoID int32) ([]DistritoDTO, error)

func (*ServicioCatalogos) Enumeraciones

func (r *ServicioCatalogos) Enumeraciones(ctx context.Context) (map[string][]EnumValueDTO, error)

Enumeraciones devuelve los valores aceptados por cada enumeración de la API (unidadMedida, tipoPago…).

type ServicioContribuyente

type ServicioContribuyente struct {
	// contains filtered or unexported fields
}

ServicioContribuyente consulta los datos del contribuyente de la API key.

func (*ServicioContribuyente) Consultar

Consultar devuelve el RUC, los establecimientos, los puntos de expedición y si el contribuyente está listo para emitir.

func (*ServicioContribuyente) ConsultarConsumoPlan

func (r *ServicioContribuyente) ConsultarConsumoPlan(ctx context.Context) (*PlanConsumoDTO, error)

type ServicioDocumentos

type ServicioDocumentos struct {
	// contains filtered or unexported fields
}

ServicioDocumentos emite documentos electrónicos y sus eventos.

func (*ServicioDocumentos) Cancelar

func (d *ServicioDocumentos) Cancelar(ctx context.Context, cdc string, cancelacion CancelacionRequest, idempotencyKey string) (*EventoSifenDTO, error)

Cancelar cancela en SIFEN un documento aprobado.

func (*ServicioDocumentos) ConsultarEstado

func (*ServicioDocumentos) ConsultarEvento

func (d *ServicioDocumentos) ConsultarEvento(ctx context.Context, eventoID int64) (*EventoSifenDTO, error)

func (*ServicioDocumentos) DescargarKude

func (d *ServicioDocumentos) DescargarKude(ctx context.Context, cdc string, espera time.Duration) ([]byte, error)

DescargarKude devuelve el PDF del KuDE. Si Sifende todavía lo está preparando, consulta de nuevo hasta que esté listo, como mucho durante espera (EsperaKudePorDefecto si es cero). Si no llega a tiempo devuelve *ErrorKudePendiente.

func (*ServicioDocumentos) DescargarKudeTicket added in v0.2.0

func (d *ServicioDocumentos) DescargarKudeTicket(ctx context.Context, cdc string, opciones OpcionesTicket) ([]byte, error)

DescargarKudeTicket devuelve el KuDE en cinta de papel, en PDF, para impresoras térmicas de 80 o 58 mm. Se genera en cada pedido. Sólo existe para facturas y notas de crédito o débito: otros tipos responden 501 kude-not-supported.

func (*ServicioDocumentos) DescargarKudeTicketImagen added in v0.2.0

func (d *ServicioDocumentos) DescargarKudeTicketImagen(ctx context.Context, cdc string, opciones OpcionesTicketImagen) ([]byte, error)

DescargarKudeTicketImagen devuelve el ticket como PNG de 1 bit con el ancho exacto de una línea de la impresora, para imprimirlo con el comando de imagen ráster de ESC/POS (GS v 0).

func (*ServicioDocumentos) DescargarXML added in v0.2.0

func (d *ServicioDocumentos) DescargarXML(ctx context.Context, cdc string) ([]byte, error)

DescargarXML devuelve el XML firmado tal como se envió a SIFEN, con el código QR incluido. Está disponible desde que el documento se registra, sin esperar la respuesta de SIFEN; si todavía no tiene XML, la API responde 409 documento-xml-not-available.

func (*ServicioDocumentos) Emitir

Emitir envía un documento a Sifende. Responde con el CDC en estado PENDIENTE; el resultado de SIFEN llega por webhook o con ConsultarEstado.

idempotencyKey identifica la operación: generala vos (por ejemplo "pedido-1001") y guardala antes de enviar, así podés repetirla después de un corte sin duplicar el documento. Si va vacía, el SDK genera un UUID que sólo reusa en sus propios reintentos.

Example (Errores)
package main

import (
	"context"
	"errors"
	"fmt"
	"os"

	"github.com/ithdev/sifende-go"
)

func main() {
	ctx := context.Background()
	cliente, _ := sifende.NuevoCliente(os.Getenv("SIFENDE_API_KEY"))
	var factura *sifende.FacturaElectronicaRequest

	_, err := cliente.Documentos.Emitir(ctx, factura, "pedido-1001")

	var errorAPI *sifende.ErrorAPI
	var errorConexion *sifende.ErrorConexion
	switch {
	case errors.As(err, &errorAPI):
		fmt.Println(errorAPI.Status, errorAPI.Codigo, errorAPI.Errores())
	case errors.As(err, &errorConexion):
		// La operación pudo haberse ejecutado: repetila con la misma clave.
		fmt.Println("reintentar con", errorConexion.IdempotencyKey)
	}
}

func (*ServicioDocumentos) Inutilizar

func (d *ServicioDocumentos) Inutilizar(ctx context.Context, rango EventoInutilizacionRequest, idempotencyKey string) (*EventoSifenDTO, error)

Inutilizar inutiliza en SIFEN un rango de números que no se va a usar.

func (*ServicioDocumentos) ListarEventos

func (d *ServicioDocumentos) ListarEventos(ctx context.Context, filtro FiltroEventos) (*PageDTOEventoSifenDTO, error)

func (*ServicioDocumentos) Nominar

func (d *ServicioDocumentos) Nominar(ctx context.Context, cdc string, nominacion EventoNominacionRequest, idempotencyKey string) (*EventoSifenDTO, error)

Nominar identifica al receptor de una factura emitida como innominada.

type ServicioPadron

type ServicioPadron struct {
	// contains filtered or unexported fields
}

ServicioPadron busca contribuyentes y personas en el padrón de la DNIT.

func (*ServicioPadron) Consultar

func (r *ServicioPadron) Consultar(ctx context.Context, rucOCedula string) (*Padron, error)

Consultar busca un RUC o una cédula, con o sin puntos y dígito verificador. Los campos encajan con el receptor. Devuelve nil si la API no trae datos.

type ServicioWebhooks added in v0.2.0

type ServicioWebhooks struct {
	// contains filtered or unexported fields
}

ServicioWebhooks administra los webhooks del contribuyente en el ambiente de la API key. Para verificar las entregas que llegan a tu endpoint, usá VerificarWebhook.

Crear y RotarSecreto no admiten Idempotency-Key, así que el SDK no los repite ante un corte de conexión: el secreto sólo viaja en esa respuesta.

func (*ServicioWebhooks) Actualizar added in v0.2.0

Actualizar reemplaza la URL, los eventos y el estado. Activo: false pausa el webhook y cancela sus entregas pendientes. El secreto no cambia: para eso, RotarSecreto.

func (*ServicioWebhooks) Consultar added in v0.2.0

func (w *ServicioWebhooks) Consultar(ctx context.Context, webhookID int64) (*WebhookEndpointDTO, error)

Consultar devuelve un webhook, sin el secreto. Uno de otro ambiente responde 404.

func (*ServicioWebhooks) Crear added in v0.2.0

Crear registra una URL HTTPS pública para recibir eventos. Hay hasta cinco webhooks activos por ambiente.

El secreto whsec_… con el que se firman las entregas llega sólo en esta respuesta: guardalo. Si se corta la conexión, consultá Listar antes de repetir: una URL ya registrada responde 400 validation-error.

func (*ServicioWebhooks) Eliminar added in v0.2.0

func (w *ServicioWebhooks) Eliminar(ctx context.Context, webhookID int64) error

Eliminar borra el webhook y cancela sus entregas pendientes. No se puede deshacer.

func (*ServicioWebhooks) Listar added in v0.2.0

Listar devuelve los webhooks del ambiente de la API key, los más recientes primero, sin el secreto.

func (*ServicioWebhooks) ListarEntregas added in v0.2.0

func (w *ServicioWebhooks) ListarEntregas(ctx context.Context, webhookID int64, filtro FiltroEntregas) (*WebhookEntregaPaginaDTO, error)

ListarEntregas devuelve el historial de entregas del webhook, las más recientes primero: estado, intentos y último error. Se conserva 90 días.

func (*ServicioWebhooks) RotarSecreto added in v0.2.0

func (w *ServicioWebhooks) RotarSecreto(ctx context.Context, webhookID int64) (*WebhookSecretResponse, error)

RotarSecreto genera un secreto nuevo y deja de firmar con el anterior, también las entregas pendientes. El secreto llega sólo en esta respuesta; si no la recibiste, volvé a rotar.

Para no perder entregas durante el cambio, verificá con los dos secretos hasta actualizar tu endpoint: OpcionesVerificacion{Secretos: []string{nuevo, anterior}}.

type SolicitudEmision

type SolicitudEmision interface {
	TipoDocumento() TipoDocumento
	// contains filtered or unexported methods
}

SolicitudEmision es el cuerpo de documentos.Emitir. La implementan los punteros a AutofacturaElectronicaRequest, FacturaElectronicaRequest, NotaCreditoElectronicaRequest, NotaDebitoElectronicaRequest, NotaRemisionElectronicaRequest.

type SupermercadoDTO

type SupermercadoDTO struct {
	// Nombre del cajero (E811)
	NombreCajero string `json:"nombreCajero,omitempty"`
	// Efectivo recibido (E812)
	Efectivo *Decimal `json:"efectivo,omitempty"`
	// Vuelto entregado (E813)
	Vuelto *Decimal `json:"vuelto,omitempty"`
	// Monto de la donación (E814)
	Donacion *Decimal `json:"donacion,omitempty"`
	// Descripción de la donación (E815). Sólo con `donacion`
	DescripcionDonacion string `json:"descripcionDonacion,omitempty"`
}

SupermercadoDTO: Sector de supermercados (E810). Describe la caja: el efectivo recibido y el vuelto no son pagos de la factura, que se informan en `pagos` o `condicionPago`.

type TarjetaPagoDTO

type TarjetaPagoDTO struct {
	// Denominación (E621)
	TipoTarjeta TipoTarjeta `json:"tipoTarjeta"`
	// Descripción propia (E622). Obligatoria y exclusiva de `tipoTarjeta = OTRO`
	DescripcionTipoTarjeta string `json:"descripcionTipoTarjeta,omitempty"`
	// Razón social de la procesadora (E623)
	RazonSocialProcesadora string `json:"razonSocialProcesadora,omitempty"`
	// RUC de la procesadora sin DV (E624)
	RUCProcesadora string `json:"rucProcesadora,omitempty"`
	// DV del RUC de la procesadora (E625). `0` es un valor
	DigitoVerificadorProcesadora string `json:"digitoVerificadorProcesadora,omitempty"`
	// Forma de procesamiento (E626)
	FormaProcesamientoPago FormaProcesamientoPago `json:"formaProcesamientoPago"`
	// Código de autorización (E627), como string: de 6 a 10 dígitos, desde 100000
	CodigoAutorizacion string `json:"codigoAutorizacion,omitempty"`
	// Nombre del titular (E628)
	NombreTitular string `json:"nombreTitular,omitempty"`
	// Cuatro últimos dígitos (E629), como string
	UltimosCuatroDigitos string `json:"ultimosCuatroDigitos,omitempty"`
}

TarjetaPagoDTO: Pago con tarjeta de crédito o débito (E620). Nunca se informa el número completo

type Timbrado

type Timbrado struct {
	Numero              int32  `json:"numero,omitempty"`
	FechaInicioVigencia string `json:"fechaInicioVigencia,omitempty"`
}

Timbrado es un objeto de la API de Sifende.

type TipoCombustible

type TipoCombustible string

TipoCombustible es una enumeración de la API. Un valor fuera de las constantes se envía tal cual y la API lo valida.

const (
	TipoCombustibleGasolina TipoCombustible = "GASOLINA"
	TipoCombustibleDiesel   TipoCombustible = "DIESEL"
	TipoCombustibleEtanol   TipoCombustible = "ETANOL"
	TipoCombustibleGNV      TipoCombustible = "GNV"
	TipoCombustibleFlex     TipoCombustible = "FLEX"
	TipoCombustibleOtro     TipoCombustible = "OTRO"
)

type TipoConstancia

type TipoConstancia string

TipoConstancia es una enumeración de la API. Un valor fuera de las constantes se envía tal cual y la API lo valida.

const (
	TipoConstanciaConstanciaNoContribuyente  TipoConstancia = "CONSTANCIA_NO_CONTRIBUYENTE"
	TipoConstanciaConstanciaMicroproductores TipoConstancia = "CONSTANCIA_MICROPRODUCTORES"
)

type TipoContribuyente

type TipoContribuyente string

TipoContribuyente es una enumeración de la API. Un valor fuera de las constantes se envía tal cual y la API lo valida.

const (
	TipoContribuyentePersonaFisica   TipoContribuyente = "PERSONA_FISICA"
	TipoContribuyentePersonaJuridica TipoContribuyente = "PERSONA_JURIDICA"
)

type TipoDocumento

type TipoDocumento string

TipoDocumento es una enumeración de la API. Un valor fuera de las constantes se envía tal cual y la API lo valida.

const (
	TipoDocumentoFacturaElectronica        TipoDocumento = "FACTURA_ELECTRONICA"
	TipoDocumentoNotaDeCreditoElectronica  TipoDocumento = "NOTA_DE_CREDITO_ELECTRONICA"
	TipoDocumentoNotaDeDebitoElectronica   TipoDocumento = "NOTA_DE_DEBITO_ELECTRONICA"
	TipoDocumentoNotaDeRemisionElectronica TipoDocumento = "NOTA_DE_REMISION_ELECTRONICA"
	TipoDocumentoAutofacturaElectronica    TipoDocumento = "AUTOFACTURA_ELECTRONICA"
)

type TipoDocumentoAsociado

type TipoDocumentoAsociado string

TipoDocumentoAsociado es una enumeración de la API. Un valor fuera de las constantes se envía tal cual y la API lo valida.

const (
	TipoDocumentoAsociadoElectronico           TipoDocumentoAsociado = "ELECTRONICO"
	TipoDocumentoAsociadoImpreso               TipoDocumentoAsociado = "IMPRESO"
	TipoDocumentoAsociadoConstanciaElectronica TipoDocumentoAsociado = "CONSTANCIA_ELECTRONICA"
)

type TipoDocumentoIdentidad

type TipoDocumentoIdentidad string

TipoDocumentoIdentidad es una enumeración de la API. Un valor fuera de las constantes se envía tal cual y la API lo valida.

const (
	TipoDocumentoIdentidadCedulaParaguaya    TipoDocumentoIdentidad = "CEDULA_PARAGUAYA"
	TipoDocumentoIdentidadPasaporte          TipoDocumentoIdentidad = "PASAPORTE"
	TipoDocumentoIdentidadCedulaExtranjera   TipoDocumentoIdentidad = "CEDULA_EXTRANJERA"
	TipoDocumentoIdentidadCarnetDeResidencia TipoDocumentoIdentidad = "CARNET_DE_RESIDENCIA"
	TipoDocumentoIdentidadInnominado         TipoDocumentoIdentidad = "INNOMINADO"
	TipoDocumentoIdentidadTarjetaDiplomatica TipoDocumentoIdentidad = "TARJETA_DIPLOMATICA"
	TipoDocumentoIdentidadOtro               TipoDocumentoIdentidad = "OTRO"
)

type TipoDocumentoImpreso

type TipoDocumentoImpreso string

TipoDocumentoImpreso es una enumeración de la API. Un valor fuera de las constantes se envía tal cual y la API lo valida.

const (
	TipoDocumentoImpresoFactura                TipoDocumentoImpreso = "FACTURA"
	TipoDocumentoImpresoNotaDeCredito          TipoDocumentoImpreso = "NOTA_DE_CREDITO"
	TipoDocumentoImpresoNotaDeDebito           TipoDocumentoImpreso = "NOTA_DE_DEBITO"
	TipoDocumentoImpresoNotaDeRemision         TipoDocumentoImpreso = "NOTA_DE_REMISION"
	TipoDocumentoImpresoComprobanteDeRetencion TipoDocumentoImpreso = "COMPROBANTE_DE_RETENCION"
)

type TipoEmision

type TipoEmision string

TipoEmision es una enumeración de la API. Un valor fuera de las constantes se envía tal cual y la API lo valida.

const (
	TipoEmisionNormal TipoEmision = "NORMAL"
)

type TipoEventoWebhook

type TipoEventoWebhook string

TipoEventoWebhook es una enumeración de la API. Un valor fuera de las constantes se envía tal cual y la API lo valida.

const (
	TipoEventoWebhookDocumentoAprobado  TipoEventoWebhook = "documento.aprobado"
	TipoEventoWebhookDocumentoRechazado TipoEventoWebhook = "documento.rechazado"
	TipoEventoWebhookDocumentoCancelado TipoEventoWebhook = "documento.cancelado"
	TipoEventoWebhookLoteProcesado      TipoEventoWebhook = "lote.procesado"
)

type TipoImpuesto

type TipoImpuesto string

TipoImpuesto es una enumeración de la API. Un valor fuera de las constantes se envía tal cual y la API lo valida.

const (
	TipoImpuestoIVA      TipoImpuesto = "IVA"
	TipoImpuestoISC      TipoImpuesto = "ISC"
	TipoImpuestoRenta    TipoImpuesto = "RENTA"
	TipoImpuestoNinguno  TipoImpuesto = "NINGUNO"
	TipoImpuestoIvaRenta TipoImpuesto = "IVA_RENTA"
)

type TipoOperacion

type TipoOperacion string

TipoOperacion es una enumeración de la API. Un valor fuera de las constantes se envía tal cual y la API lo valida.

const (
	TipoOperacionB2B TipoOperacion = "B2B"
	TipoOperacionB2C TipoOperacion = "B2C"
	TipoOperacionB2G TipoOperacion = "B2G"
	TipoOperacionB2F TipoOperacion = "B2F"
)

type TipoOperacionVehiculo

type TipoOperacionVehiculo string

TipoOperacionVehiculo es una enumeración de la API. Un valor fuera de las constantes se envía tal cual y la API lo valida.

const (
	TipoOperacionVehiculoVentaARepresentante    TipoOperacionVehiculo = "VENTA_A_REPRESENTANTE"
	TipoOperacionVehiculoVentaAlConsumidorFinal TipoOperacionVehiculo = "VENTA_AL_CONSUMIDOR_FINAL"
	TipoOperacionVehiculoVentaAlGobierno        TipoOperacionVehiculo = "VENTA_AL_GOBIERNO"
	TipoOperacionVehiculoVentaAFlotaDeVehiculos TipoOperacionVehiculo = "VENTA_A_FLOTA_DE_VEHICULOS"
)

type TipoPago

type TipoPago string

TipoPago es una enumeración de la API. Un valor fuera de las constantes se envía tal cual y la API lo valida.

const (
	TipoPagoEfectivo             TipoPago = "EFECTIVO"
	TipoPagoCheque               TipoPago = "CHEQUE"
	TipoPagoTarjetaDeCredito     TipoPago = "TARJETA_DE_CREDITO"
	TipoPagoTarjetaDeDebito      TipoPago = "TARJETA_DE_DEBITO"
	TipoPagoTransferencia        TipoPago = "TRANSFERENCIA"
	TipoPagoGiro                 TipoPago = "GIRO"
	TipoPagoBilleteraElectronica TipoPago = "BILLETERA_ELECTRONICA"
	TipoPagoTarjetaEmpresarial   TipoPago = "TARJETA_EMPRESARIAL"
	TipoPagoVale                 TipoPago = "VALE"
	TipoPagoRetencion            TipoPago = "RETENCION"
	TipoPagoPagoPorAnticipo      TipoPago = "PAGO_POR_ANTICIPO"
	TipoPagoValorFiscal          TipoPago = "VALOR_FISCAL"
	TipoPagoValorComercial       TipoPago = "VALOR_COMERCIAL"
	TipoPagoCompensacion         TipoPago = "COMPENSACION"
	TipoPagoPermuta              TipoPago = "PERMUTA"
	TipoPagoPagoBancario         TipoPago = "PAGO_BANCARIO"
	TipoPagoPagoMovil            TipoPago = "PAGO_MOVIL"
	TipoPagoDonacion             TipoPago = "DONACION"
	TipoPagoPromocion            TipoPago = "PROMOCION"
	TipoPagoConsumoInterno       TipoPago = "CONSUMO_INTERNO"
	TipoPagoPagoElectronico      TipoPago = "PAGO_ELECTRONICO"
	TipoPagoOtro                 TipoPago = "OTRO"
)

type TipoSociedad

type TipoSociedad struct {
	Codigo      string `json:"codigo,omitempty"`
	Descripcion string `json:"descripcion,omitempty"`
}

TipoSociedad es un objeto de la API de Sifende.

type TipoTarjeta

type TipoTarjeta string

TipoTarjeta es una enumeración de la API. Un valor fuera de las constantes se envía tal cual y la API lo valida.

const (
	TipoTarjetaVisa            TipoTarjeta = "VISA"
	TipoTarjetaMastercard      TipoTarjeta = "MASTERCARD"
	TipoTarjetaAmericanExpress TipoTarjeta = "AMERICAN_EXPRESS"
	TipoTarjetaMaestro         TipoTarjeta = "MAESTRO"
	TipoTarjetaPanal           TipoTarjeta = "PANAL"
	TipoTarjetaCabal           TipoTarjeta = "CABAL"
	TipoTarjetaOtro            TipoTarjeta = "OTRO"
)

type TipoTransaccion

type TipoTransaccion string

TipoTransaccion es una enumeración de la API. Un valor fuera de las constantes se envía tal cual y la API lo valida.

const (
	TipoTransaccionVentaMercaderia     TipoTransaccion = "VENTA_MERCADERIA"
	TipoTransaccionPrestacionServicios TipoTransaccion = "PRESTACION_SERVICIOS"
	TipoTransaccionMixto               TipoTransaccion = "MIXTO"
	TipoTransaccionVentaActivoFijo     TipoTransaccion = "VENTA_ACTIVO_FIJO"
	TipoTransaccionVentaDivisas        TipoTransaccion = "VENTA_DIVISAS"
	TipoTransaccionCompraDivisas       TipoTransaccion = "COMPRA_DIVISAS"
	TipoTransaccionPromocionOMuestras  TipoTransaccion = "PROMOCION_O_MUESTRAS"
	TipoTransaccionDonacion            TipoTransaccion = "DONACION"
	TipoTransaccionAnticipo            TipoTransaccion = "ANTICIPO"
	TipoTransaccionCompraProductos     TipoTransaccion = "COMPRA_PRODUCTOS"
	TipoTransaccionCompraServicios     TipoTransaccion = "COMPRA_SERVICIOS"
	TipoTransaccionVentaCreditoFiscal  TipoTransaccion = "VENTA_CREDITO_FISCAL"
	TipoTransaccionMuestrasMedicas     TipoTransaccion = "MUESTRAS_MEDICAS"
)

type TipoTransporte

type TipoTransporte string

TipoTransporte es una enumeración de la API. Un valor fuera de las constantes se envía tal cual y la API lo valida.

const (
	TipoTransportePropio  TipoTransporte = "PROPIO"
	TipoTransporteTercero TipoTransporte = "TERCERO"
)

type Tolerancia

type Tolerancia string

Tolerancia es una enumeración de la API. Un valor fuera de las constantes se envía tal cual y la API lo valida.

const (
	ToleranciaToleranciaDeQuiebra Tolerancia = "TOLERANCIA_DE_QUIEBRA"
	ToleranciaTolerancioDeMerma   Tolerancia = "TOLERANCIO_DE_MERMA"
)

type Totales

type Totales struct {
	// TotalOperacion es la suma de los ítems antes del redondeo (F014-F017).
	TotalOperacion Decimal
	// Redondeo es el redondeo oficial de la SET (F013): en PYG, lo que se descuenta para llegar a un múltiplo de 50.
	Redondeo Decimal
	// TotalGeneral es el total a cobrar (F014): el MontoPago de una operación al contado, en la moneda de la
	// operación.
	TotalGeneral Decimal
	// TotalGuaranies es el total en guaraníes (F023); 0 en PYG.
	TotalGuaranies Decimal
}

Totales es el resultado de CalcularTotales.

func CalcularTotales

func CalcularTotales(documento DocumentoParaTotales) (Totales, error)

CalcularTotales calcula los totales con las mismas reglas que Sifende valida al emitir, para que MontoPago coincida con el total redondeado sin un ida y vuelta a la API.

Devuelve error si la operación es en moneda extranjera, no tiene tipo de cambio global y a un ítem le falta el suyo.

type TransporteFacturaDTO

type TransporteFacturaDTO struct {
	TipoTransporte            TipoTransporte            `json:"tipoTransporte,omitempty"`
	Modalidad                 ModalidadTransporte       `json:"modalidad"`
	ResponsableFlete          ResponsableFlete          `json:"responsableFlete"`
	Incoterm                  Incoterm                  `json:"incoterm,omitempty"`
	NumeroManifiesto          string                    `json:"numeroManifiesto,omitempty"`
	NumeroDespachoImportacion string                    `json:"numeroDespachoImportacion,omitempty"`
	FechaInicioTraslado       string                    `json:"fechaInicioTraslado,omitempty"`
	FechaFinTraslado          string                    `json:"fechaFinTraslado,omitempty"`
	PaisDestino               Pais                      `json:"paisDestino,omitempty"`
	Salida                    *LocalRemisionDTO         `json:"salida,omitempty"`
	Entregas                  []LocalRemisionDTO        `json:"entregas,omitempty"`
	Vehiculos                 []VehiculoRemisionDTO     `json:"vehiculos,omitempty"`
	Transportista             *TransportistaRemisionDTO `json:"transportista,omitempty"`
}

TransporteFacturaDTO: Transporte de la mercadería facturada (E900). Opcional en la FE: salida, entregas, vehículos y transportista se informan cuando se conocen

type TransporteRemisionDTO

type TransporteRemisionDTO struct {
	TipoTransporte            TipoTransporte           `json:"tipoTransporte"`
	Modalidad                 ModalidadTransporte      `json:"modalidad"`
	ResponsableFlete          ResponsableFlete         `json:"responsableFlete"`
	Incoterm                  Incoterm                 `json:"incoterm,omitempty"`
	NumeroManifiesto          string                   `json:"numeroManifiesto,omitempty"`
	NumeroDespachoImportacion string                   `json:"numeroDespachoImportacion,omitempty"`
	FechaInicioTraslado       string                   `json:"fechaInicioTraslado"`
	FechaFinTraslado          string                   `json:"fechaFinTraslado"`
	PaisDestino               Pais                     `json:"paisDestino,omitempty"`
	Salida                    LocalRemisionDTO         `json:"salida"`
	Entregas                  []LocalRemisionDTO       `json:"entregas"`
	Vehiculos                 []VehiculoRemisionDTO    `json:"vehiculos"`
	Transportista             TransportistaRemisionDTO `json:"transportista"`
}

TransporteRemisionDTO es un objeto de la API de Sifende.

type TransportistaRemisionDTO

type TransportistaRemisionDTO struct {
	Naturaleza               Naturaleza             `json:"naturaleza"`
	NombreRazonSocial        string                 `json:"nombreRazonSocial"`
	RUC                      string                 `json:"ruc,omitempty"`
	DigitoVerificador        string                 `json:"digitoVerificador,omitempty"`
	TipoDocumento            TipoDocumentoIdentidad `json:"tipoDocumento,omitempty"`
	NumeroDocumento          string                 `json:"numeroDocumento,omitempty"`
	Nacionalidad             Pais                   `json:"nacionalidad,omitempty"`
	DomicilioFiscal          string                 `json:"domicilioFiscal"`
	NumeroDocumentoConductor string                 `json:"numeroDocumentoConductor"`
	NombreConductor          string                 `json:"nombreConductor"`
	DireccionConductor       string                 `json:"direccionConductor"`
	NombreAgente             string                 `json:"nombreAgente,omitempty"`
	RUCAgente                string                 `json:"rucAgente,omitempty"`
	DigitoVerificadorAgente  string                 `json:"digitoVerificadorAgente,omitempty"`
	DireccionAgente          string                 `json:"direccionAgente,omitempty"`
}

TransportistaRemisionDTO es un objeto de la API de Sifende.

type Ubicacion

type Ubicacion struct {
	Codigo      int32  `json:"codigo,omitempty"`
	Descripcion string `json:"descripcion,omitempty"`
}

Ubicacion es un objeto de la API de Sifende.

type UnidadMedida

type UnidadMedida string

UnidadMedida es una enumeración de la API. Un valor fuera de las constantes se envía tal cual y la API lo valida.

const (
	UnidadMedidaKWh    UnidadMedida = "kWh"
	UnidadMedidaAA     UnidadMedida = "AA"
	UnidadMedidaBG     UnidadMedida = "BG"
	UnidadMedida4A     UnidadMedida = "_4A"
	UnidadMedidaAB     UnidadMedida = "AB"
	UnidadMedidaBX     UnidadMedida = "BX"
	UnidadMedidaCM     UnidadMedida = "CM"
	UnidadMedidaCM2    UnidadMedida = "CM2"
	UnidadMedidaCM3    UnidadMedida = "CM3"
	UnidadMedidaBK     UnidadMedida = "BK"
	UnidadMedidaCPM    UnidadMedida = "CPM"
	UnidadMedidaCi     UnidadMedida = "Ci"
	UnidadMedidaDET    UnidadMedida = "DET"
	UnidadMedidaDi     UnidadMedida = "Di"
	UnidadMedidaDOC    UnidadMedida = "DOC"
	UnidadMedidaDPC    UnidadMedida = "DPC"
	UnidadMedidaBL     UnidadMedida = "BL"
	UnidadMedidaGLL    UnidadMedida = "GLL"
	UnidadMedidaG      UnidadMedida = "g"
	UnidadMedidaGRO    UnidadMedida = "GRO"
	UnidadMedidaHa     UnidadMedida = "ha"
	UnidadMedidaHs     UnidadMedida = "Hs"
	UnidadMedidaSET    UnidadMedida = "SET"
	UnidadMedidaE4     UnidadMedida = "E4"
	UnidadMedidaKg     UnidadMedida = "kg"
	UnidadMedidaKgM2   UnidadMedida = "kg_m2"
	UnidadMedidaKm     UnidadMedida = "Km"
	UnidadMedidaKT     UnidadMedida = "KT"
	UnidadMedidaLT     UnidadMedida = "LT"
	UnidadMedidaUJgo   UnidadMedida = "U_JGO"
	UnidadMedidaME     UnidadMedida = "ME"
	UnidadMedidaMl     UnidadMedida = "ml"
	UnidadMedidaM      UnidadMedida = "m"
	UnidadMedidaMT     UnidadMedida = "MT"
	UnidadMedidaM2     UnidadMedida = "M2"
	UnidadMedidaM3     UnidadMedida = "M3"
	UnidadMedidaM5     UnidadMedida = "M5"
	UnidadMedidaMCU    UnidadMedida = "MCU"
	UnidadMedidaMG     UnidadMedida = "MG"
	UnidadMedidaML     UnidadMedida = "ML"
	UnidadMedidaMIL    UnidadMedida = "MIL"
	UnidadMedidaMM     UnidadMedida = "MM"
	UnidadMedidaMM2    UnidadMedida = "MM2"
	UnidadMedidaMi     UnidadMedida = "Mi"
	UnidadMedidaPK     UnidadMedida = "PK"
	UnidadMedidaPAR    UnidadMedida = "PAR"
	UnidadMedidaBW     UnidadMedida = "BW"
	UnidadMedidaFOT    UnidadMedida = "FOT"
	UnidadMedidaFTK    UnidadMedida = "FTK"
	UnidadMedidaPCE    UnidadMedida = "PCE"
	UnidadMedidaPm     UnidadMedida = "pm"
	UnidadMedidaJR     UnidadMedida = "JR"
	UnidadMedidaPUL    UnidadMedida = "PUL"
	UnidadMedidaKLT    UnidadMedida = "KLT"
	UnidadMedidaRacion UnidadMedida = "racion"
	UnidadMedidaRM     UnidadMedida = "RM"
	UnidadMedidaRO     UnidadMedida = "RO"
	UnidadMedidaSe     UnidadMedida = "Se"
	UnidadMedidaDR     UnidadMedida = "DR"
	UnidadMedidaTN     UnidadMedida = "TN"
	UnidadMedidaUNI    UnidadMedida = "UNI"
	UnidadMedidaUI     UnidadMedida = "UI"
	UnidadMedidaGL     UnidadMedida = "GL"
	UnidadMedidaYa     UnidadMedida = "Ya"
)

type UnidadPlazo

type UnidadPlazo string

UnidadPlazo es una enumeración de la API. Un valor fuera de las constantes se envía tal cual y la API lo valida.

const (
	UnidadPlazoDias  UnidadPlazo = "DIAS"
	UnidadPlazoMeses UnidadPlazo = "MESES"
)

type VehiculoNuevoDTO

type VehiculoNuevoDTO struct {
	// Tipo de operación de venta (E771)
	TipoOperacion TipoOperacionVehiculo `json:"tipoOperacion,omitempty"`
	// Chasis (E773)
	Chasis string `json:"chasis,omitempty"`
	// Color (E774)
	Color string `json:"color,omitempty"`
	// Potencia del motor en CV (E775)
	Potencia *int32 `json:"potencia,omitempty"`
	// Capacidad del motor en cc (E776)
	CapacidadMotor *int32 `json:"capacidadMotor,omitempty"`
	// Peso neto en toneladas (E777)
	PesoNeto *Decimal `json:"pesoNeto,omitempty"`
	// Peso bruto en toneladas (E778)
	PesoBruto *Decimal `json:"pesoBruto,omitempty"`
	// Tipo de combustible (E779)
	TipoCombustible TipoCombustible `json:"tipoCombustible,omitempty"`
	// Combustible propio (E780). Obligatorio y exclusivo de `tipoCombustible = OTRO`
	DescripcionCombustible string `json:"descripcionCombustible,omitempty"`
	// Número de motor (E781)
	NumeroMotor string `json:"numeroMotor,omitempty"`
	// Capacidad máxima de tracción en toneladas (E782)
	CapacidadTraccion *Decimal `json:"capacidadTraccion,omitempty"`
	// Año de fabricación (E783)
	AnioFabricacion *int32 `json:"anioFabricacion,omitempty"`
	// Tipo de vehículo (E784)
	TipoVehiculo string `json:"tipoVehiculo,omitempty"`
	// Capacidad máxima de pasajeros sentados (E785)
	CapacidadPasajeros *int32 `json:"capacidadPasajeros,omitempty"`
}

VehiculoNuevoDTO: Datos del vehículo nuevo vendido en el ítem (E770)

type VehiculoRemisionDTO

type VehiculoRemisionDTO struct {
	TipoVehiculo         string `json:"tipoVehiculo"`
	Marca                string `json:"marca"`
	TipoIdentificacion   int32  `json:"tipoIdentificacion"`
	NumeroIdentificacion string `json:"numeroIdentificacion,omitempty"`
	Matricula            string `json:"matricula,omitempty"`
	DatosAdicionales     string `json:"datosAdicionales,omitempty"`
	NumeroVuelo          string `json:"numeroVuelo,omitempty"`
}

VehiculoRemisionDTO es un objeto de la API de Sifende.

type VendedorAutofacturaDTO

type VendedorAutofacturaDTO struct {
	// Naturaleza del vendedor (E301)
	Naturaleza NaturalezaVendedor `json:"naturaleza"`
	// Tipo de documento de identidad del vendedor (E304)
	TipoDocumento TipoDocumentoIdentidad `json:"tipoDocumento"`
	// Número de documento de identidad del vendedor (E306)
	NumeroDocumento string `json:"numeroDocumento"`
	// Nombre y apellido del vendedor (E307)
	Nombre string `json:"nombre"`
	// Dirección y ubicación del vendedor (E308, E310–E315)
	Domicilio DomicilioAutofacturaDTO `json:"domicilio"`
	// Número de casa del vendedor; informar cero cuando no tiene numeración (E309)
	NumeroCasa int32 `json:"numeroCasa"`
}

VendedorAutofacturaDTO: Vendedor de la compra documentada por la autofactura (grupo E4)

type WebhookDeliveryDTO

type WebhookDeliveryDTO struct {
	ID                 string               `json:"id,omitempty"`
	EventID            string               `json:"eventId,omitempty"`
	TipoEvento         string               `json:"tipoEvento,omitempty"`
	EndpointID         int64                `json:"endpointId,omitempty"`
	EndpointURL        string               `json:"endpointUrl,omitempty"`
	Estado             EstadoEntregaWebhook `json:"estado,omitempty"`
	CantidadIntentos   int32                `json:"cantidadIntentos,omitempty"`
	UltimoHTTPStatus   int32                `json:"ultimoHttpStatus,omitempty"`
	UltimoErrorCodigo  string               `json:"ultimoErrorCodigo,omitempty"`
	UltimoErrorMensaje string               `json:"ultimoErrorMensaje,omitempty"`
	FechaCreacion      string               `json:"fechaCreacion,omitempty"`
	FechaUltimoIntento string               `json:"fechaUltimoIntento,omitempty"`
	FechaEntrega       string               `json:"fechaEntrega,omitempty"`
	FechaFallo         string               `json:"fechaFallo,omitempty"`
}

WebhookDeliveryDTO es un objeto de la API de Sifende.

type WebhookEndpointDTO

type WebhookEndpointDTO struct {
	ID                   int64    `json:"id,omitempty"`
	URL                  string   `json:"url,omitempty"`
	Ambiente             Ambiente `json:"ambiente,omitempty"`
	Eventos              []string `json:"eventos,omitempty"`
	Activo               bool     `json:"activo,omitempty"`
	FechaCreacion        string   `json:"fechaCreacion,omitempty"`
	FechaEdicion         string   `json:"fechaEdicion,omitempty"`
	FechaRotacionSecreto string   `json:"fechaRotacionSecreto,omitempty"`
}

WebhookEndpointDTO es un objeto de la API de Sifende.

type WebhookEntregaPaginaDTO

type WebhookEntregaPaginaDTO struct {
	Content []WebhookDeliveryDTO `json:"content,omitempty"`
	// Página actual, base 0
	Page          int32 `json:"page,omitempty"`
	Size          int32 `json:"size,omitempty"`
	TotalElements int64 `json:"totalElements,omitempty"`
	TotalPages    int32 `json:"totalPages,omitempty"`
}

WebhookEntregaPaginaDTO es un objeto de la API de Sifende.

type WebhookSecretResponse

type WebhookSecretResponse struct {
	Endpoint *WebhookEndpointDTO `json:"endpoint,omitempty"`
	// Secreto de firma. Sólo se devuelve al crear el webhook y al rotar el secreto.
	Secreto string `json:"secreto,omitempty"`
}

WebhookSecretResponse es un objeto de la API de Sifende.

Directories

Path Synopsis
internal
generar command
Command generar escribe tipos_gen.go a partir del OpenAPI de la API de Sifende.
Command generar escribe tipos_gen.go a partir del OpenAPI de la API de Sifende.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL