SER.FactElectronica
0.13.0
dotnet add package SER.FactElectronica --version 0.13.0
NuGet\Install-Package SER.FactElectronica -Version 0.13.0
<PackageReference Include="SER.FactElectronica" Version="0.13.0" />
<PackageVersion Include="SER.FactElectronica" Version="0.13.0" />
<PackageReference Include="SER.FactElectronica" />
paket add SER.FactElectronica --version 0.13.0
#r "nuget: SER.FactElectronica, 0.13.0"
#addin nuget:?package=SER.FactElectronica&version=0.13.0
#tool nuget:?package=SER.FactElectronica&version=0.13.0
SER.FactElectronica
Biblioteca para integración con el sistema de Factura Electrónica de FACTURA1. Esta biblioteca facilita la comunicación con los servicios de facturación electrónica proporcionados por FACTURA1, permitiendo la creación y gestión de documentos electrónicos requeridos por la DIAN en Colombia.
Características
- Generación de facturas electrónicas
- Generación de notas crédito
- Generación de documentos soporte
- Asociación de rangos de numeración
- Carga y validación de representación gráfica (PDF)
- Obtención de Attached Document
- Registro y habilitación de empresas
- Gestión de autenticación con los servicios de FACTURA1
Instalación
dotnet add package SER.FactElectronica
Requisitos
- .NET 6.0 o superior
- Credenciales válidas de FACTURA1
Uso
Configuración
Uso
Configuración del Servicio
Para utilizar esta biblioteca, es necesario configurar las credenciales de acceso a los servicios de FACTURA1 y registrar la implementación del servicio en el contenedor de dependencias.
// En Startup.cs o Program.cs
services.AddTransient<IFactElectronica>(provider =>
{
var logger = provider.GetService<ILoggerFactory>();
var config = provider.GetService<IConfiguration>();
var options = provider.GetService<IOptionsMonitor<FacturaOptions>>();
return new Factura1(logger, config, options);
});
// En appsettings.json
{
"Factura1": {
"username": "su_usuario",
"password": "su_contraseña",
"SandBox": true // true para ambiente de pruebas, false para producción
}
}
Autenticación
La biblioteca maneja automáticamente la autenticación con los servicios de FACTURA1, pero también puedes solicitar un token manualmente:
// Obtener token de autenticación
var token = await _factura.LoginAsync();
Creación de Facturas Electrónicas
// Inyectar la dependencia
private readonly IFactElectronica _factura;
public MiController(IFactElectronica factura)
{
_factura = factura;
}
// Crear factura electrónica
public async Task<IActionResult> CrearFactura()
{
try
{
// Crear el encabezado de la factura
var encabezado = Encabezado.Basic(
nitemisor: 900000000,
mailContactoEmisor: "emisor@ejemplo.com",
tiporeceptor: TipoPersona.PersonaJuridica,
tipoDocRec: TipoIdentificadorFiscal.NIT,
nitreceptor: "800000000",
digitoverificacion: "1",
obligacionesfiscalesreceptor: ObligacionesFiscales.IVARegComun,
procvendedor: Procedencia.Residente,
tributoreceptor: TributosReceptorVendedor.ZZ,
regimenreceptor: TipoRegimen.SimpleTributacion,
nombrereceptor: "EMPRESA CLIENTE S.A.S.",
segnombrereceptor: "",
apellidosreceptor: "",
codigodepartamento: "11",
departamentoreceptor: "Bogotá",
codigociudadreceptor: "11001",
ciudadreceptor: "Bogotá D.C.",
direccionreceptor: "Calle 123 # 45-67",
telefonoreceptor: "6017654321",
telefonomovilreceptor: "3001234567",
mailreceptor: "cliente@empresa.com",
mailreceptorcontacto: "contacto@empresa.com",
nombrecontactoreceptor: "Contacto Cliente",
tipoComprobante: TiposDocumentos.FacturaVenta,
numResolucion: "18760000001",
prefijoFact: "SETP",
numeroFactura: "1000",
fechaFactura: DateTime.Now,
subtotal: 1000000,
medioPago: MediosPago.Efectivo,
fechaPagoFact: DateTime.Now.AddDays(30),
baseImpuesto: 1000000,
totalSinDescuento: 1000000,
totalDescuentos: 0,
totalImpuestos: 190000,
totalImpuestosRetenidos: 0,
total: 1190000
);
// Crear los detalles de la factura
var detalles = new List<Det>
{
new Det(
idConcepto: 1,
cantidad: 1,
impuesto: 0.19,
precioUnitario: 1000000,
identificacionproducto: "SERV-001",
nombreProducto: "Servicio de implementación"
)
};
// Crear la factura
var factura = new Factura
{
Encabezado = encabezado,
Detalle = detalles
};
// Enviar la factura
var resultado = await _factura.CreateInvoice(factura);
if (resultado?.Dian != null && resultado.Dian.Any(d => d.StatusCode == "200"))
{
return Ok(new
{
CUFE = resultado.Cufe,
QRData = resultado.Qrdata,
XML = resultado.Xml
});
}
return BadRequest(new { Error = resultado?.Error, Detalles = resultado?.Dian });
}
catch (Exception ex)
{
return StatusCode(500, $"Error al crear factura: {ex.Message}");
}
}
### Obtención de Attached Document
```csharp
// Obtener Attached Document
public async Task<IActionResult> ObtenerAttachedDocument(string xmlDian, string apDian)
{
try
{
// El método acepta XML en formato string o codificado en base64
var resultado = await _factura.GetAttachedDocumentAsync(xmlDian, apDian);
if (resultado != null && !string.IsNullOrEmpty(resultado.AttachedDocument))
{
return Ok(new
{
AttachedDocument = resultado.AttachedDocument,
Url = resultado.Url
});
}
return BadRequest("No se pudo generar el Attached Document");
}
catch (Exception ex)
{
return StatusCode(500, $"Error al generar el Attached Document: {ex.Message}");
}
}
Verificación y Descarga de PDF
// Verificar si existe el PDF de una factura
public async Task<IActionResult> VerificarPDF(string cufe)
{
try
{
var resultado = await _factura.CheckPdfFromInvoice(cufe);
if (resultado != null && !string.IsNullOrEmpty(resultado.Basepdf))
{
// Convertir base64 a archivo PDF
byte[] pdfBytes = Convert.FromBase64String(resultado.Basepdf);
return File(pdfBytes, "application/pdf", $"factura-{cufe}.pdf");
}
return NotFound("No se encontró el PDF de la factura");
}
catch (Exception ex)
{
return StatusCode(500, $"Error al verificar PDF: {ex.Message}");
}
}
// Subir un PDF asociado a una factura
public async Task<IActionResult> SubirPDF(string cufe, IFormFile pdfFile)
{
try
{
using (var ms = new MemoryStream())
{
await pdfFile.CopyToAsync(ms);
byte[] fileBytes = ms.ToArray();
string base64Pdf = Convert.ToBase64String(fileBytes);
var uploadRequest = new UploadPdf
{
Cufe = cufe,
Basepdf = base64Pdf
};
var resultado = await _factura.UploadPdfAsync(uploadRequest);
if (resultado != null && string.IsNullOrEmpty(resultado.Error))
{
return Ok(new { Message = "PDF subido correctamente", CUFE = resultado.Cufe });
}
return BadRequest(new { Error = resultado?.Error });
}
}
catch (Exception ex)
{
return StatusCode(500, $"Error al subir PDF: {ex.Message}");
}
}
Registro de Empresas
// Registrar una nueva empresa con Factura1
public async Task<IActionResult> RegistrarEmpresa()
{
try
{
var request = new CompanyRegisterRequest
{
Nit = "900000000",
DV = "1",
RazonSocial = "MI EMPRESA S.A.S.",
Email = "contacto@miempresa.com",
Telefono = "6017654321",
Celular = "3001234567",
PrimerNombre = "Juan",
PrimerApellido = "Pérez",
Ciudad = "Bogotá",
Direccion = "Calle 123 # 45-67",
TypeDocument = "31", // NIT
TipoRegimen = "48", // Responsable de IVA
ObFiscales = "R-99-PN", // No aplica - Otros
SetID = "...", // Obtenido al registrarse con Factura1
Servicio = "1" // Factura Electrónica
};
var resultado = await _factura.CreateCompanyAsync(request);
if (resultado != null && resultado.Valido == "true")
{
return Ok(new { Message = resultado.Msg });
}
return BadRequest(new { Error = resultado?.Msg });
}
catch (Exception ex)
{
return StatusCode(500, $"Error al registrar empresa: {ex.Message}");
}
}
Especificaciones de los Servicios
Servicio AttachedDocument
Característica | Descripción |
---|---|
Path | /servicio/service/app/AttachedDocument |
Versión | 1.0 |
Visibilidad | PUBLIC |
Stage | ALPHA |
Descripción | Método que permite construir el Attached Document de los comprobantes emitidos |
Formato | application/json; charset=UTF-8 |
Request
{
"xmlDian": "XML del documento timbrado a la DIAN (Invoice) en formato base 64",
"apDian": "XML respuesta del documento timbrado a la DIAN (Application Response) en formato base 64"
}
Response
{
"AttachedDocument": "Attached document del comprobante en formato base 64",
"URL": "URL en la cual se puede identificar el attached document (XML)"
}
Manejo de Errores
La biblioteca proporciona respuestas estandarizadas en caso de error:
// Ejemplo de respuesta de error
new InvoiceRes
{
Error = "Error comunicacion DIAN / proveedor tecnológico",
Dian = new Dian[]
{
new() {
StatusCode = "666", // Código de error interno
}
}
};
Gestión de Versiones
La biblioteca usa versionado semántico. La versión actual es 0.12.1
.
Entorno de Pruebas vs Producción
La biblioteca permite configurar el entorno de ejecución mediante la propiedad SandBox
:
true
: Utiliza el entorno de pruebas (QA) de FACTURA1false
: Utiliza el entorno de producción de FACTURA1
Asegúrese de probar completamente en el entorno de pruebas antes de pasar a producción.
Licencia
Este proyecto es propiedad de SER y SIRIO Dev.
Contribuir
Para contribuir a este proyecto, consulta nuestro archivo CONTRIBUTING.md.
Response
{
"AttachedDocument": "Attached document del comprobante en formato base 64",
"URL": "URL en la cual se puede identificar el attached document (XML)"
}
Licencia
Este proyecto es propiedad de SER y SIRIO Dev.
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net6.0
- Microsoft.AspNetCore.Mvc.Core (>= 2.2.5)
- Microsoft.Extensions.Configuration.Abstractions (>= 6.0.0)
- Microsoft.Extensions.Logging (>= 6.0.0)
- Microsoft.Extensions.Logging.Abstractions (>= 6.0.1)
- RestSharp (>= 112.1.0)
- RestSharp.Serializers.SystemTextJson (>= 106.15.0)
- System.IdentityModel.Tokens.Jwt (>= 6.34.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
0.13.0 | 95 | 5/25/2025 |
0.12.0 | 164 | 5/21/2025 |
0.11.0 | 241 | 4/11/2025 |
0.10.16 | 699 | 10/31/2024 |
0.10.15 | 132 | 10/22/2024 |
0.10.13 | 507 | 6/12/2024 |
0.10.12 | 128 | 6/12/2024 |
0.10.11 | 125 | 6/11/2024 |
0.10.10 | 117 | 6/11/2024 |
0.10.9 | 131 | 6/5/2024 |
0.10.8 | 149 | 6/5/2024 |
0.10.7 | 134 | 6/5/2024 |
0.10.6 | 130 | 6/5/2024 |
0.10.5 | 136 | 6/5/2024 |
0.10.4 | 142 | 6/5/2024 |
0.10.3 | 141 | 6/5/2024 |
0.10.1 | 145 | 5/30/2024 |
0.10.0 | 137 | 5/29/2024 |
0.9.19 | 727 | 9/12/2023 |
0.9.18 | 178 | 9/12/2023 |
0.9.17 | 157 | 9/12/2023 |
0.9.16 | 476 | 7/29/2023 |
0.9.15 | 236 | 5/24/2023 |
0.9.12 | 200 | 5/13/2023 |
0.9.10 | 776 | 8/1/2022 |
0.9.9 | 441 | 8/1/2022 |
0.9.8 | 439 | 8/1/2022 |
0.9.7 | 423 | 7/28/2022 |
0.9.6 | 454 | 7/28/2022 |
0.9.5 | 470 | 7/19/2022 |
0.9.4 | 480 | 3/22/2022 |
0.9.3 | 492 | 2/19/2022 |
0.9.2 | 473 | 2/19/2022 |