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
}
Output:
Index ¶
- Constants
- Variables
- func FirmarWebhook(secreto, eventID, deliveryID string, timestamp int64, cuerpo []byte) string
- type ActividadEconomica
- type ActualizarWebhookIntegracionRequest
- type AfectacionTributaria
- type Ambiente
- type ApiResponseListCiudadDTO
- type ApiResponseListDepartamentoDTO
- type ApiResponseListDistritoDTO
- type ApiResponsePadron
- type AsociacionFacturaDTO
- type AutofacturaElectronicaRequest
- type AutofacturaElectronicaRequestCondicionPago
- type CancelacionRequest
- type CaracteristicaCarga
- type CargaRemisionDTO
- type ChequePagoDTO
- type CiudadDTO
- type Cliente
- type CodigoNombre
- type ComprasPublicasDTO
- type CondicionAnticipo
- type CondicionCredito
- type CondicionOperacion
- type CondicionPagoDTO
- type ConstanciaAutofacturaDTO
- type ContribuyenteIntegracionDTO
- type CrearWebhookIntegracionRequest
- type CreditoFacturaDTO
- type CuotaCreditoDTO
- type DatosCancelacion
- type DatosComercialesDTO
- type DatosDocumento
- type DatosLote
- type Decimal
- func (d Decimal) Abs() Decimal
- func (d Decimal) Comparar(otro Decimal) int
- func (d Decimal) ConEscala(escala int32) Decimal
- func (d Decimal) Dividir(divisor Decimal, escala int32) Decimal
- func (d Decimal) EsCero() bool
- func (d Decimal) Escala() int32
- func (d Decimal) Float64() float64
- func (d Decimal) MarshalJSON() ([]byte, error)
- func (d Decimal) Multiplicar(otro Decimal) Decimal
- func (d Decimal) Restar(otro Decimal) Decimal
- func (d Decimal) Resto(divisor Decimal) Decimal
- func (d Decimal) String() string
- func (d Decimal) Sumar(otro Decimal) Decimal
- func (d *Decimal) UnmarshalJSON(datos []byte) error
- type Departamento
- type DepartamentoDTO
- type DistritoDTO
- type DocumentoAsociadoDTO
- type DocumentoAsociadoRemisionDTO
- type DocumentoElectronicoEmisionResponseDTO
- type DocumentoElectronicoStatusDTO
- type DocumentoParaTotales
- type Domicilio
- type DomicilioAutofacturaDTO
- type EnergiaElectricaDTO
- type EnumValueDTO
- type ErrorAPI
- type ErrorConexion
- type ErrorKudePendiente
- type Establecimiento
- type EstadoConfiguracion
- type EstadoEntregaWebhook
- type EstadoRUC
- type EventoInutilizacionRequest
- type EventoNominacionRequest
- type EventoSifenDTO
- type EventoWebhook
- type FacturaElectronicaRequest
- type FiltroEntregas
- type FiltroEventos
- type FormaProcesamientoPago
- type Incoterm
- type IndicadorPresencia
- type ItemAutofacturaDTO
- type ItemDTO
- type ItemParaTotales
- type ItemRemisionDTO
- type LocalRemisionDTO
- type ModalidadTransporte
- type Moneda
- type MotivoEmision
- type MotivoTraslado
- type Naturaleza
- type NaturalezaVendedor
- type NotaCreditoElectronicaRequest
- type NotaDebitoElectronicaRequest
- type NotaRemisionElectronicaRequest
- type Opcion
- type OpcionesTicket
- type OpcionesTicketImagen
- type OpcionesVerificacion
- type Padron
- type PageDTOEventoSifenDTO
- type PagoFacturaDTO
- type Pais
- type PlanConsumoDTO
- type PlazoEstructuradoDTO
- type PolizaSeguroDTO
- type ProblemDetail
- type PuntoExpedicion
- type ReceptorDTO
- type ReceptorNominadoRequest
- type ResponsableEmision
- type ResponsableFlete
- type ResultadoSifen
- type SeguroDTO
- type ServicioCatalogos
- func (r *ServicioCatalogos) Ciudades(ctx context.Context, distritoID int32) ([]CiudadDTO, error)
- func (r *ServicioCatalogos) CiudadesDeDepartamento(ctx context.Context, departamentoID int32) ([]CiudadDTO, error)
- func (r *ServicioCatalogos) Departamentos(ctx context.Context) ([]DepartamentoDTO, error)
- func (r *ServicioCatalogos) Distritos(ctx context.Context, departamentoID int32) ([]DistritoDTO, error)
- func (r *ServicioCatalogos) Enumeraciones(ctx context.Context) (map[string][]EnumValueDTO, error)
- type ServicioContribuyente
- type ServicioDocumentos
- func (d *ServicioDocumentos) Cancelar(ctx context.Context, cdc string, cancelacion CancelacionRequest, ...) (*EventoSifenDTO, error)
- func (d *ServicioDocumentos) ConsultarEstado(ctx context.Context, cdc string) (*DocumentoElectronicoStatusDTO, error)
- func (d *ServicioDocumentos) ConsultarEvento(ctx context.Context, eventoID int64) (*EventoSifenDTO, error)
- func (d *ServicioDocumentos) DescargarKude(ctx context.Context, cdc string, espera time.Duration) ([]byte, error)
- func (d *ServicioDocumentos) DescargarKudeTicket(ctx context.Context, cdc string, opciones OpcionesTicket) ([]byte, error)
- func (d *ServicioDocumentos) DescargarKudeTicketImagen(ctx context.Context, cdc string, opciones OpcionesTicketImagen) ([]byte, error)
- func (d *ServicioDocumentos) DescargarXML(ctx context.Context, cdc string) ([]byte, error)
- func (d *ServicioDocumentos) Emitir(ctx context.Context, documento SolicitudEmision, idempotencyKey string) (*DocumentoElectronicoEmisionResponseDTO, error)
- func (d *ServicioDocumentos) Inutilizar(ctx context.Context, rango EventoInutilizacionRequest, idempotencyKey string) (*EventoSifenDTO, error)
- func (d *ServicioDocumentos) ListarEventos(ctx context.Context, filtro FiltroEventos) (*PageDTOEventoSifenDTO, error)
- func (d *ServicioDocumentos) Nominar(ctx context.Context, cdc string, nominacion EventoNominacionRequest, ...) (*EventoSifenDTO, error)
- type ServicioPadron
- type ServicioWebhooks
- func (w *ServicioWebhooks) Actualizar(ctx context.Context, webhookID int64, ...) (*WebhookEndpointDTO, error)
- func (w *ServicioWebhooks) Consultar(ctx context.Context, webhookID int64) (*WebhookEndpointDTO, error)
- func (w *ServicioWebhooks) Crear(ctx context.Context, webhook CrearWebhookIntegracionRequest) (*WebhookSecretResponse, error)
- func (w *ServicioWebhooks) Eliminar(ctx context.Context, webhookID int64) error
- func (w *ServicioWebhooks) Listar(ctx context.Context) ([]WebhookEndpointDTO, error)
- func (w *ServicioWebhooks) ListarEntregas(ctx context.Context, webhookID int64, filtro FiltroEntregas) (*WebhookEntregaPaginaDTO, error)
- func (w *ServicioWebhooks) RotarSecreto(ctx context.Context, webhookID int64) (*WebhookSecretResponse, error)
- type SolicitudEmision
- type SupermercadoDTO
- type TarjetaPagoDTO
- type Timbrado
- type TipoCombustible
- type TipoConstancia
- type TipoContribuyente
- type TipoDocumento
- type TipoDocumentoAsociado
- type TipoDocumentoIdentidad
- type TipoDocumentoImpreso
- type TipoEmision
- type TipoEventoWebhook
- type TipoImpuesto
- type TipoOperacion
- type TipoOperacionVehiculo
- type TipoPago
- type TipoSociedad
- type TipoTarjeta
- type TipoTransaccion
- type TipoTransporte
- type Tolerancia
- type Totales
- type TransporteFacturaDTO
- type TransporteRemisionDTO
- type TransportistaRemisionDTO
- type Ubicacion
- type UnidadMedida
- type UnidadPlazo
- type VehiculoNuevoDTO
- type VehiculoRemisionDTO
- type VendedorAutofacturaDTO
- type WebhookDeliveryDTO
- type WebhookEndpointDTO
- type WebhookEntregaPaginaDTO
- type WebhookSecretResponse
Examples ¶
Constants ¶
const EsperaKudePorDefecto = 3 * time.Minute
EsperaKudePorDefecto es cuánto espera DescargarKude si no se indica otra espera.
const ToleranciaWebhookPorDefecto = 5 * time.Minute
ToleranciaWebhookPorDefecto es la diferencia máxima aceptada entre X-Sifende-Timestamp y el reloj local.
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.
const Version = "0.2.0"
Version es la versión del SDK. Viaja en el User-Agent.
Variables ¶
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 ¶
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.
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 ¶
func (*AutofacturaElectronicaRequest) TipoDocumento() 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 ¶
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.
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 ¶
DecimalDeFloat convierte un float64 con su representación decimal más corta: 0.1 es 0.1, no 0.1000000000000000055….
func MustDecimal ¶
MustDecimal es ParsearDecimal para literales: entra en pánico si el texto no es un decimal.
func NuevoDecimal ¶
NuevoDecimal devuelve el entero n como Decimal: NuevoDecimal(150000) es 150000.
func ParsearDecimal ¶
ParsearDecimal lee un decimal como "19.99", "-0.5" o "1e3". Conserva la escala del texto: "1.50" tiene escala 2.
func (Decimal) Comparar ¶
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) Dividir ¶
Dividir devuelve d/divisor con la escala indicada, redondeado HALF_UP. Entra en pánico si el divisor es cero.
func (Decimal) Float64 ¶
Float64 devuelve la aproximación float64 más cercana. Para mostrar o comparar montos usá String o Comparar.
func (Decimal) MarshalJSON ¶
MarshalJSON escribe el decimal como número JSON, con todos sus dígitos.
func (Decimal) Multiplicar ¶
func (Decimal) Resto ¶
Resto es el resto de la división truncada, con el signo de d (como BigDecimal.remainder).
func (Decimal) String ¶
String escribe el decimal con su escala, sin exponente: "1057450", "60.98", "-0.50".
func (*Decimal) UnmarshalJSON ¶
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
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.
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)
})
}
Output:
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 ¶
func (*NotaCreditoElectronicaRequest) TipoDocumento() TipoDocumento
TipoDocumento devuelve TipoDocumentoNotaDeCreditoElectronica: el valor que NotaCreditoElectronicaRequest envía en tipoDocumento.
func (*NotaCreditoElectronicaRequest) Totales ¶
func (n *NotaCreditoElectronicaRequest) Totales() (Totales, error)
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 ¶
func (*NotaDebitoElectronicaRequest) TipoDocumento() 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 ¶
func (*NotaRemisionElectronicaRequest) TipoDocumento() TipoDocumento
TipoDocumento devuelve TipoDocumentoNotaDeRemisionElectronica: el valor que NotaRemisionElectronicaRequest envía en tipoDocumento.
type Opcion ¶
Opcion configura el cliente en NuevoCliente.
func ConBaseURL ¶
ConBaseURL apunta el cliente a otra URL, por ejemplo un servidor de pruebas.
func ConHTTPClient ¶
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 ¶
ConMaxReintentos fija cuántas veces se repite una operación ante una falla transitoria. Por defecto 2; 0 los desactiva.
func ConTimeout ¶
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 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) 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 ¶
func (r *ServicioContribuyente) Consultar(ctx context.Context) (*ContribuyenteIntegracionDTO, error)
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 (d *ServicioDocumentos) ConsultarEstado(ctx context.Context, cdc string) (*DocumentoElectronicoStatusDTO, error)
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
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 ¶
func (d *ServicioDocumentos) Emitir(ctx context.Context, documento SolicitudEmision, idempotencyKey string) (*DocumentoElectronicoEmisionResponseDTO, error)
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)
}
}
Output:
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.
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
func (w *ServicioWebhooks) Actualizar(ctx context.Context, webhookID int64, webhook ActualizarWebhookIntegracionRequest) (*WebhookEndpointDTO, error)
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
func (w *ServicioWebhooks) Crear(ctx context.Context, webhook CrearWebhookIntegracionRequest) (*WebhookSecretResponse, error)
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
func (w *ServicioWebhooks) Listar(ctx context.Context) ([]WebhookEndpointDTO, error)
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.