GENERACIÓN DEL IECV

GENERAR IECV PARA SET DE PRUEBAS

La Información Electrónica de Compras y Ventas es un archivo XML donde se informaban las compras o ventas del contribuyente. Este archivo debe ser firmado y enviado como si se tratase de un DTE tradicional.

Desde Agosto de 2017 que no forma parte del proceso electrónico, por lo tanto, no se debe ser enviado al SII, sin embargo, se solicita para el proceso de certificación.

Requisitos

Para generar un IECV debe cumplir con los siguientes requisitos:

Si desea más información respecto a los primeros pasos, puede consultar nuestro artículo de instalación.

Estructura del IECV

Toda la información y detalles respecto a la estructura y datos que deben ir en el IECV, se encuentra detallada en este enlace del SII.

Sin embargo, para efectos de la construcción y aprobación del set de pruebas, podemos decir que el IECV se compone de una carátula, resumen y un listado de detalles.

Carátula

Contiene datos generales de la información del envío los cuales corresponden al Rut del contribuyente emisor, período tributario, tipo de segmento, y número de Segmento en el caso de envíos parciales. Se construye de la siguiente manera:

libro.EnvioLibro.Caratula = new ChileSystems.DTE.Engine.InformacionElectronica.LCV.Caratula()
{
    RutEmisor = "11111111-1", //Rut del contribuyente
    RutEnvia = "22222222-2", //Rut del certificado digital
    PeriodoTributario = "05-2020", //Mayo de 2020
    FechaResolucion = Now, //Fecha de resolución
    NumeroResolucion = empresa.NumeroResolucion,
    TipoOperacion = ChileSystems.DTE.Engine.Enum.TipoOperacionLibro.TipoOperacionLibroEnum.Venta,
    TipoLibro = ChileSystems.DTE.Engine.Enum.TipoLibro.TipoLibroEnum.Especial,
    TipoEnvio = ChileSystems.DTE.Engine.Enum.TipoEnvioLibro.TipoEnvioLibroEnum.Total,
    FolioNotificacion = 1   
};
                        

Resumen

Existe el resumen de período y resumen de segmento. Para el caso específico de la certificación, el tipo de envío es TOTAL, por lo que solo debemos usar resumen de período de la siguiente forma:

libro.EnvioLibro.ResumenPeriodo = new ChileSystems.DTE.Engine.InformacionElectronica.LCV.ResumenPeriodo();
libro.EnvioLibro.ResumenPeriodo.TotalesPeriodo = new List< ChileSystems.DTE.Engine.InformacionElectronica.LCV.TotalPeriodo>();
libro.EnvioLibro.ResumenPeriodo.TotalesPeriodo.Add(new ChileSystems.DTE.Engine.InformacionElectronica.LCV.TotalPeriodo()
{
    TipoDocumento = ChileSystems.DTE.Engine.Enum.TipoDTE.TipoDocumentoLibro.NotaCreditoElectronica,
    CantidadDocumentos = 0,
    CantidadDocumentosAnulados = 0,
    TotalMontoExento = 0,
    TotalMontoNeto = 0,
    TotalMontoIva = 0,
    TotalMonto = 0
});
                        

Se debe crear un objeto TotalesPeriodo por cada tipo de documento que se desee informar. Para la certificación basta con la factura electrónica (33), nota de crédito electrónica (61) y nota de débito electrónica (56)

El atributo CantidadDocumentosAnulados corresponde a la cantidad de folios que han sido anulados en el sitio del SII, para el caso de la certificación este campo siempre será 0.

Detalles

Los detalles de cada documento informados en este XML deben ingresarse de la siguiente manera:

libro.EnvioLibro.Detalles.Add(new ChileSystems.DTE.Engine.InformacionElectronica.LCV.Detalle()
{
    TipoDocumento = ChileSystems.DTE.Engine.Enum.TipoDTE.DTEType.FacturaElectronica,
    NumeroDocumento = 0,
    IndicadorAnulado = ChileSystems.DTE.Engine.Enum.IndicadorAnulado.IndicadorAnuladoEnum.NotSet,
    TasaImpuestoOperacion = 0.19,
    FechaDocumento = DateTime.Now,
    RutDocumento = "55555555-5", //Dato inventado. Da lo mismo para la certificación
    RazonSocial = "Razón Social", //Dato inventado. Da lo mismo para la certificación
    MontoExento = 0,
    MontoNeto = 0,
    MontoIva = 0,
    MontoTotal = 0
});
                        

Una vez conocida la estructura de cada libro, es posible confeccionar el libro de ventas y compras según un set de pruebas básico.

Generar las Ventas

El libro de ventas debe generarse según los ocho documentos que corresponden al set de pruebas, compuesto por 4 facturas electrónicas, 3 notas de crédito y 1 nota de débito.

Para ello, se deben instanciar todos los objetos descritos con anterioridad, es decir, se debe definir la información de la carátula, resumenes y detalles.

Los valores que se deben cambiar en la carátula son:

libro.EnvioLibro.Caratula.TipoOperacion = ChileSystems.DTE.Engine.Enum.TipoOperacionLibro.TipoOperacionLibroEnum.Venta;
libro.EnvioLibro.Caratula.TipoLibro = ChileSystems.DTE.Engine.Enum.TipoLibro.TipoLibroEnum.Especial;
libro.EnvioLibro.Caratula.TipoEnvio = ChileSystems.DTE.Engine.Enum.TipoEnvioLibro.TipoEnvioLibroEnum.Total;

Luego deben ingresarse 3 resumenes correspondientes a las facturas electrónicas, notas de crédito y nota de débito.

Finalmente debe ingresar ocho detalles según cada documento del set de pruebas.

Generar las Compras

El libro de compras debe generarse según siete documentos que te explicitan en el archivo de set de pruebas, compuesto por 2 facturas manuales (a papel), 2 facturas electrónicas, 2 notas de crédito (a papel) y una factura de compra electrónica.

Al igual que las ventas, se debe indicar los datos de la carátula, resumenes y detalles, sin embargo, hay algunos documentos que tienen algún tratamiento especial o diferente. Primero comenzaremos con los detalles:

Factura (manual) - Folio 234
libro.EnvioLibro.Detalles.Add(new ChileSystems.DTE.Engine.InformacionElectronica.LCV.Detalle()
{
    TipoDocumento = ChileSystems.DTE.Engine.Enum.TipoDTE.DTEType.Factura,
    NumeroDocumento = 234,
    TasaImpuestoOperacion = 19,
    FechaDocumento = DateTime.Now,
    RutDocumento = "17096073-4",
    RazonSocial = "Razón Social",
    MontoExento = 0,
    MontoNeto = neto_del_monto,
    MontoIva = iva_del_monto,
    MontoTotal = total_del_monto
});
Factura electrónica - Folio 32
libro.EnvioLibro.Detalles.Add(new ChileSystems.DTE.Engine.InformacionElectronica.LCV.Detalle()
{
    TipoDocumento = ChileSystems.DTE.Engine.Enum.TipoDTE.DTEType.FacturaElectronica,
    NumeroDocumento = 32,
    TasaImpuestoOperacion = 19,
    FechaDocumento = DateTime.Now,
    RutDocumento = "17096073-4",
    RazonSocial = "Razón Social",
    MontoExento = exento_del_monto, //Esta factura tiene monto exentos
    MontoNeto = neto_del_monto,
    MontoIva = iva_del_monto,
    MontoTotal = total_del_monto
});
Factura (manual) - Folio 781
libro.EnvioLibro.Detalles.Add(new ChileSystems.DTE.Engine.InformacionElectronica.LCV.Detalle()
{
    TipoDocumento =  ChileSystems.DTE.Engine.Enum.TipoDTE.DTEType.Factura,
    NumeroDocumento = 781,
    TasaImpuestoOperacion = 19,
    FechaDocumento = DateTime.Now,
    RutDocumento = "17096073-4",
    RazonSocial = "Razón Social",
    MontoNeto = neto_del_valor,
    IVAUsoComun = iva_del_valor, //Aquí no va MontoIva, sino que IVAUsoComun según el documento del set de pruebas
    MontoTotal = total_del_VAlor
});
Nota de Crédito (manual) - Folio 451
libro.EnvioLibro.Detalles.Add(new ChileSystems.DTE.Engine.InformacionElectronica.LCV.Detalle()
{
    TipoDocumento = ChileSystems.DTE.Engine.Enum.TipoDTE.DTEType.NotaCredito,
    NumeroDocumento = 451,
    TasaImpuestoOperacion = 19,
    FechaDocumento = DateTime.Now,
    RutDocumento = "17096073-4",
    RazonSocial = "Razón Social",
    MontoNeto = neto_del_valor,
    MontoIva = iva_del_valor,
    MontoTotal = total_del_valor,
    TipoDocumentoReferencia = ChileSystems.DTE.Engine.Enum.TipoDTE.TipoDocumentoLibro.FacturaManual, //Se agrega referencia
    FolioDocumentoReferencia = 234
});
Factura Electrónica - Folio 67
libro.EnvioLibro.Detalles.Add(new ChileSystems.DTE.Engine.InformacionElectronica.LCV.Detalle()
{
    TipoDocumento = ChileSystems.DTE.Engine.Enum.TipoDTE.DTEType.FacturaElectronica,
    NumeroDocumento = 67,
    TasaImpuestoOperacion = 19,
    FechaDocumento = DateTime.Now,
    RutDocumento = "17096073-4",
    RazonSocial = "Razón Social",
    MontoNeto = neto_del_valor,
    MontoTotal = total_del_valor,
    IVANoRecuperable = new List()
    {
        new ChileSystems.DTE.Engine.InformacionElectronica.LCV.TotalIVANoRecuperableDetalle()
        {
            CodigoIVANoRecuperable = ChileSystems.DTE.Engine.Enum.CodigoIVANoRecuperable.CodigoIVANoRecuperableEnum.EntregaGratuita,
            TotalMontoIVANoRecuperable = iva_del_valor
        }
    }
});
Factura de Compra Electrónica - Folio 9
libro.EnvioLibro.Detalles.Add(new ChileSystems.DTE.Engine.InformacionElectronica.LCV.Detalle()
{
    TipoDocumento =  ChileSystems.DTE.Engine.Enum.TipoDTE.DTEType.FacturaCompraElectronica,
    NumeroDocumento = 9,
    TasaImpuestoOperacion = 19,
    FechaDocumento = DateTime.Now,
    RutDocumento = "17096073-4",
    RazonSocial = "Razón Social",
    MontoNeto = neto_del_valor,
    MontoIva = iva_del_valor,
    MontoTotal = total_del_valor,
    IVARetenidoTotal = iva_del_valor,
    Impuestos = new List() //Tiene compra con retención total de IVA
    {
        new ChileSystems.DTE.Engine.InformacionElectronica.LCV.ImpuestosDetalle()
        {
            CodigoImpuesto = ChileSystems.DTE.Engine.Enum.TipoImpuesto.TipoImpuestoEnum.IVARetenidoTotal,
            TotalMontoImpuesto = iva_del_valor,
            TasaImpuesto = 19
        }
    }
});
Nota de Crédito (manual) - Folio 211
libro.EnvioLibro.Detalles.Add(new ChileSystems.DTE.Engine.InformacionElectronica.LCV.Detalle()
{
    TipoDocumento =  ChileSystems.DTE.Engine.Enum.TipoDTE.DTEType.NotaCredito,
    NumeroDocumento = 211,
    TasaImpuestoOperacion = 19,
    FechaDocumento = DateTime.Now,
    RutDocumento = "17096073-4",
    RazonSocial = "Razón Social",
    MontoNeto = neto_del_valor,
    MontoIva = iva_del_valor,
    MontoTotal = total_del_valor,
    TipoDocumentoReferencia = ChileSystems.DTE.Engine.Enum.TipoDTE.TipoDocumentoLibro.FacturaElectronica,
    FolioDocumentoReferencia = 32
});

Los valores que se deben cambiar en la carátula son:

libro.EnvioLibro.Caratula.TipoOperacion = ChileSystems.DTE.Engine.Enum.TipoOperacionLibro.TipoOperacionLibroEnum.Compra;
libro.EnvioLibro.Caratula.TipoLibro = ChileSystems.DTE.Engine.Enum.TipoLibro.TipoLibroEnum.Especial;
libro.EnvioLibro.Caratula.TipoEnvio = ChileSystems.DTE.Engine.Enum.TipoEnvioLibro.TipoEnvioLibroEnum.Total;

Luego deben ingresarse 4 resumenes correspondientes a las facturas manuales, facturas electrónicas, notas de crédito manuales y factura de compra electrónica.

libro.EnvioLibro.ResumenPeriodo = new ChileSystems.DTE.Engine.InformacionElectronica.LCV.ResumenPeriodo();
libro.EnvioLibro.ResumenPeriodo.TotalesPeriodo = new List();
Facturas (manuales)
var manuales = libro.EnvioLibro.Detalles.Where(x => x.TipoDocumento == ChileSystems.DTE.Engine.Enum.TipoDTE.DTEType.Factura);
libro.EnvioLibro.ResumenPeriodo.TotalesPeriodo.Add(new ChileSystems.DTE.Engine.InformacionElectronica.LCV.TotalPeriodo()
{
    TipoDocumento = ChileSystems.DTE.Engine.Enum.TipoDTE.TipoDocumentoLibro.FacturaManual,
    CantidadDocumentos = manuales.Count(),
    CantidadDocumentosAnulados = 0,
    TotalMontoExento = manuales.Sum(x=>x.MontoExento),
    TotalMontoNeto = manuales.Sum(x => x.MontoNeto),
    TotalMontoIva = manuales.Sum(x => x.MontoIva),
    TotalIVAUsoComun = manuales.Sum(x => x.IVAUsoComun),
    TotalMonto = manuales.Sum(x => x.MontoTotal),
    FactorProporcionalidadIVA = 0.6, //Este factor lo indican en el Set de Pruebas
    TotalCreditoIVAUsoComun = (int)Math.Round(manuales.Sum(x => x.IVAUsoComun) * 0.6, 0, MidpointRounding.AwayFromZero),
    CantidadOperacionesConIvaUsoComun = 1
});
Facturas electrónicas
var electronicas = libro.EnvioLibro.Detalles.Where(x => x.TipoDocumento == ChileSystems.DTE.Engine.Enum.TipoDTE.DTEType.FacturaElectronica);
libro.EnvioLibro.ResumenPeriodo.TotalesPeriodo.Add(new ChileSystems.DTE.Engine.InformacionElectronica.LCV.TotalPeriodo()
{
    TipoDocumento = ChileSystems.DTE.Engine.Enum.TipoDTE.TipoDocumentoLibro.FacturaElectronica,
    CantidadDocumentos = electronicas.Count(),
    CantidadDocumentosAnulados = 0,
    TotalMontoExento = electronicas.Sum(x=>x.MontoExento),
    TotalMontoNeto = electronicas.Sum(x => x.MontoNeto),
    TotalMontoIva = electronicas.Sum(x => x.MontoIva),
    TotalIVAUsoComun = electronicas.Sum(x => x.IVAUsoComun),
    TotalMonto = electronicas.Sum(x => x.MontoTotal),
    TotalIVANoRecuperable = new List()
    {
        new ChileSystems.DTE.Engine.InformacionElectronica.LCV.TotalIVANoRecuperable()
        {
            CantidadOperacionesIVANoRecuperable = 1,
            CodigoIVANoRecuperable = ChileSystems.DTE.Engine.Enum.CodigoIVANoRecuperable.CodigoIVANoRecuperableEnum.EntregaGratuita,
            TotalMontoIVANoRecuperable = electronicas.Sum(x=>x.IVANoRecuperable.Sum(y=>y.TotalMontoIVANoRecuperable))
        }
    }
});
Notas de Crédito (manuales)
var nc = libro.EnvioLibro.Detalles.Where(x => x.TipoDocumento == ChileSystems.DTE.Engine.Enum.TipoDTE.DTEType.NotaCredito);
libro.EnvioLibro.ResumenPeriodo.TotalesPeriodo.Add(new ChileSystems.DTE.Engine.InformacionElectronica.LCV.TotalPeriodo()
{
    TipoDocumento = ChileSystems.DTE.Engine.Enum.TipoDTE.TipoDocumentoLibro.NotaCredito,
    CantidadDocumentos = nc.Count(),
    CantidadDocumentosAnulados = 0,
    TotalMontoExento = nc.Sum(x => x.MontoExento),
    TotalMontoNeto = nc.Sum(x => x.MontoNeto),
    TotalMontoIva = nc.Sum(x => x.MontoIva),
    TotalMonto = nc.Sum(x => x.MontoTotal),
});
Factura de Compra Electrónica
libro.EnvioLibro.ResumenPeriodo.TotalesPeriodo.Add(new ChileSystems.DTE.Engine.InformacionElectronica.LCV.TotalPeriodo()
{
    TipoDocumento = ChileSystems.DTE.Engine.Enum.TipoDTE.TipoDocumentoLibro.FacturaCompraElectronica,
    CantidadDocumentos = fce.Count(),
    CantidadDocumentosAnulados = 0,
    TotalMontoExento = fce.Sum(x => x.MontoExento),
    TotalMontoNeto = fce.Sum(x => x.MontoNeto),
    TotalMontoIva = fce.Sum(x => x.MontoIva),
    TotalMonto = fce.Sum(x => x.MontoTotal),
    TotalIVARetenidoTotal = fce.Sum(x => x.IVARetenidoTotal),
    Impuestos = new List()
    {
        new ChileSystems.DTE.Engine.InformacionElectronica.LCV.ImpuestosPeriodo()
        {
            CodigoImpuesto = ChileSystems.DTE.Engine.Enum.TipoImpuesto.TipoImpuestoEnum.IVARetenidoTotal,
            TotalMontoImpuesto = fce.Sum(x=>x.IVARetenidoTotal)
        }
    }
});

Enviar los libros al SII

Una vez teniendo uno de los libros con toda su información, se procede a firmarlo:

var path = libroVentas.Firmar(configuracion.Certificado.Nombre, "out\\temp\\", configuracion.APIKey);

El XML resultante quedará en la variable path y será este el que deba ser enviado al SII. Para más información visita nuestro artículo de Envío de Documentos al SII.

El código presentado se encuentra disponible en Github. La clase handler es la que contiene todos los métodos necesarios para la operación de la API.

También se encuentra disponible en Youtube, esta explicación en video Certificacion set de pruebas SII Chile con Simple API .NET C#.