private void btnVerificarCarpeta_Click(object sender, EventArgs e)
        {
            try
            {
                ListaProveedorProducto = new List <cp_proveedor_producto_Info>();
                ListaProveedor         = new List <cp_proveedor_Info>();
                bus_ruta.GuardarDB(new cp_RutaPorEmpresaPorUsuario_Info
                {
                    IdEmpresa = param.IdEmpresa,
                    IdUsuario = param.IdUsuario,
                    RutaXML   = txtRutaXml.Text
                });

                blst = new BindingList <cp_XML_Documento_Info>();
                string   folder = txtRutaXml.Text;
                string   filter = "*.XML*";
                string[] files  = Directory.GetFiles(folder, filter);

                foreach (var item in files)
                {
                    string      readText             = File.ReadAllText(item);
                    XmlDocument xmlComprobanteOrigen = new XmlDocument();
                    xmlComprobanteOrigen.Load(new StringReader(readText));
                    string mensajeErrorOut      = string.Empty;
                    string sXml_a_descerializar = Quitar_a_xml_CDATA_y_Signature(xmlComprobanteOrigen.GetElementsByTagName("comprobante")[0].InnerXml, ref mensajeErrorOut);

                    var rootElement             = XElement.Parse(sXml_a_descerializar);
                    var infoFactura             = rootElement.Element("infoFactura");
                    var infoTributaria          = rootElement.Element("infoTributaria");
                    var IdentificacionComprador = infoFactura.Element("identificacionComprador").Value;

                    if (IdentificacionComprador == param.InfoEmpresa.em_ruc)
                    {
                        #region Cabecera
                        var Documento = new cp_XML_Documento_Info
                        {
                            XML                       = sXml_a_descerializar,
                            Tipo                      = infoTributaria.Element("codDoc").Value == "01" ? "FACTURA" : "NOTA DE CREDITO",
                            emi_Ruc                   = infoTributaria.Element("ruc").Value,
                            emi_RazonSocial           = infoTributaria.Element("razonSocial").Value,
                            emi_NombreComercial       = infoTributaria.Element("nombreComercial") == null?infoTributaria.Element("razonSocial").Value : infoTributaria.Element("nombreComercial").Value,
                            ClaveAcceso               = infoTributaria.Element("claveAcceso").Value,
                            emi_ContribuyenteEspecial = infoFactura.Element("contribuyenteEspecial") == null ? "NO" : infoFactura.Element("contribuyenteEspecial").Value,
                            CodDocumento              = infoTributaria.Element("codDoc").Value,
                            Establecimiento           = infoTributaria.Element("estab").Value,
                            PuntoEmision              = infoTributaria.Element("ptoEmi").Value,
                            NumeroDocumento           = infoTributaria.Element("secuencial").Value,
                            emi_DireccionMatriz       = infoTributaria.Element("dirMatriz").Value,


                            FechaEmision       = DateTime.ParseExact(infoFactura.Element("fechaEmision").Value, "dd/MM/yyyy", System.Globalization.CultureInfo.CurrentCulture),
                            rec_RazonSocial    = infoFactura.Element("razonSocialComprador").Value,
                            rec_Identificacion = infoFactura.Element("identificacionComprador").Value
                        };
                        Documento.FormaPago   = infoFactura.Element("pagos") == null ? null : infoFactura.Element("pagos").Element("pago") == null ? null : (infoFactura.Element("pagos").Element("pago").Element("formaPago") == null ? null : infoFactura.Element("pagos").Element("pago").Element("formaPago").Value);
                        Documento.IdFormaPago = Documento.FormaPago;
                        Documento.Plazo       = infoFactura.Element("pagos") == null ? 0 : infoFactura.Element("pagos").Element("pago") == null ? 0 : (infoFactura.Element("pagos").Element("pago").Element("plazo") == null ? 0 : Convert.ToInt32(Convert.ToDecimal(infoFactura.Element("pagos").Element("pago").Element("plazo").Value)));
                        #endregion

                        #region Detalle
                        var list = infoFactura.Element("totalConImpuestos").Elements("totalImpuesto")
                                   .Select(element => element)
                                   .ToList();
                        Documento.SubtotalIVA = 0;
                        Documento.Subtotal0   = 0;
                        Documento.ValorIVA    = 0;

                        foreach (var Impuesto in list)
                        {
                            if (Impuesto.Element("codigo").Value.ToString() != "3")
                            {
                                Documento.Porcentaje = Convert.ToDouble(Impuesto.Element("valor").Value);

                                if (Documento.Porcentaje == 0)
                                {
                                    Documento.Descuento += Impuesto.Element("descuentoAdicional") == null ? 0 : Convert.ToDouble(Impuesto.Element("descuentoAdicional").Value);
                                    Documento.Subtotal0 += Convert.ToDouble(Impuesto.Element("baseImponible").Value) - Documento.Descuento;
                                }
                                else
                                {
                                    Documento.Descuento   += Impuesto.Element("descuentoAdicional") == null ? 0 : Convert.ToDouble(Impuesto.Element("descuentoAdicional").Value);
                                    Documento.SubtotalIVA += Convert.ToDouble(Impuesto.Element("baseImponible").Value) - Documento.Descuento;
                                    Documento.ValorIVA    += Convert.ToDouble(Impuesto.Element("valor").Value);
                                    Documento.Porcentaje   = bus_impuesto.Get_Info_impuesto(param.Get_Parametro_Info(tb_parametro_enum.P_IVA).Valor).porcentaje;
                                }
                            }
                        }
                        Documento.Total = Documento.Subtotal0 + Documento.SubtotalIVA + Documento.ValorIVA;
                        double ValorIva = Math.Round((double)Documento.SubtotalIVA * 0.12, 2, MidpointRounding.AwayFromZero);
                        if (ValorIva != Documento.ValorIVA)
                        {
                            MessageBox.Show("Revisar: \n" + item + "\nIVA no cuadra con el subtotal con IVA :\nIVA calculado: " + ValorIva.ToString("c2") + "\nIVA en factura: " + Convert.ToDouble(Documento.ValorIVA).ToString("c2"));
                        }
                        Documento.Comprobante = Documento.CodDocumento + '-' + Documento.Establecimiento + "-" + Documento.PuntoEmision + "-" + Documento.NumeroDocumento;

                        var listD = rootElement.Element("detalles").Elements("detalle")
                                    .Select(element => element)
                                    .ToList();

                        Documento.lstDetalle = new List <cp_XML_DocumentoDet_Info>();
                        int Contador = 1;
                        foreach (var Detalle in listD)
                        {
                            var d = new cp_XML_DocumentoDet_Info
                            {
                                CodigoProducto = Detalle.Element("codigoPrincipal") == null ? "" : Detalle.Element("codigoPrincipal").Value.ToString(),
                                NombreProducto = Detalle.Element("descripcion").Value.ToString(),
                                Cantidad       = Convert.ToDouble(Detalle.Element("cantidad").Value),
                                Precio         = Convert.ToDouble(Detalle.Element("precioTotalSinImpuesto").Value)
                            };
                            if (Contador == 1)
                            {
                                Documento.Observacion = d.NombreProducto;
                                Contador = 2;
                            }
                            var ImpuestoD = Detalle.Element("impuestos").Elements("impuesto")
                                            .Select(element => element)
                                            .FirstOrDefault();

                            d.PorcentajeIVA = Convert.ToDouble(ImpuestoD.Element("tarifa").Value);
                            d.ValorIva      = Convert.ToDouble(ImpuestoD.Element("valor").Value);
                            d.Total         = d.Precio + d.ValorIva;
                            Documento.lstDetalle.Add(d);
                        }

                        if (Documento.Total == 0)
                        {
                            Documento.Descuento = infoFactura.Element("totalDescuento") == null ? 0 : Convert.ToDouble(infoFactura.Element("totalDescuento").Value);
                            Documento.Subtotal0 = Convert.ToDouble(infoFactura.Element("totalSinImpuestos").Value) - Documento.Descuento;
                            Documento.Total     = Documento.Subtotal0;
                        }
                        #endregion

                        #region Valida contabilización automática
                        var proveedor = ListaProveedor.Where(q => q.IdEmpresa == param.IdEmpresa && q.Persona_Info.pe_cedulaRuc == Documento.emi_Ruc).FirstOrDefault();
                        if (proveedor == null)
                        {
                            proveedor = busProveedor.Get_Info_Proveedor(param.IdEmpresa, Documento.emi_Ruc);
                            if (proveedor != null)
                            {
                                ListaProveedor.Add(proveedor);
                            }
                        }

                        if (proveedor != null && !string.IsNullOrEmpty(proveedor.IdCtaCble_Gasto) && !string.IsNullOrEmpty(proveedor.IdCtaCble_CXP))
                        {
                            Documento.SeContabiliza = true;
                        }
                        #endregion

                        #region Proveedor producto
                        if (proveedor != null && ListaProveedorProducto.Where(q => q.IdProveedor == proveedor.IdProveedor).Count() == 0)
                        {
                            ListaProveedorProducto.AddRange(busProveedorProducto.GetList(param.IdEmpresa, proveedor.IdProveedor));
                        }
                        #endregion

                        #region Info adicional
                        if (rootElement.Element("infoAdicional") != null)
                        {
                            var listAdicional = rootElement.Element("infoAdicional").Elements("campoAdicional")
                                                .Select(element => element).ToList();
                            if (listAdicional.Count > 0)
                            {
                                var Kilometraje = listAdicional.Where(x => (string)x.Attribute("nombre") == "kilometraje").FirstOrDefault();
                                var Placa       = listAdicional.Where(x => (string)x.Attribute("nombre") == "placa").FirstOrDefault();
                                var Disco       = listAdicional.Where(x => (string)x.Attribute("nombre") == "disco").FirstOrDefault();

                                if (Kilometraje != null && Placa != null && Disco != null)
                                {
                                    Documento.Observacion = (Documento.lstDetalle.Count > 0 ? Documento.lstDetalle.First().NombreProducto : "") + "-km" + Kilometraje.Value.ToString() + "-D" + Disco.Value.ToString() + "-" + Placa.Value.ToString() + "-";
                                    int numValue = 0;
                                    if (Int32.TryParse(Disco.Value.ToString(), out numValue))
                                    {
                                        var PuntoCargo = lstPuntoCargo.Where(q => q.codPunto_cargo == "DISCO " + Convert.ToInt32(Disco.Value).ToString()).FirstOrDefault();
                                        if (PuntoCargo != null)
                                        {
                                            Documento.IdPunto_cargo = PuntoCargo.IdPunto_cargo;
                                            Documento.IdCentroCosto = PuntoCargo.IdCentroCosto_Scc;
                                            Documento.IdCentroCosto_sub_centro_costo = PuntoCargo.IdCentroCosto_sub_centro_costo_Scc;
                                        }
                                    }
                                }
                            }
                        }
                        #endregion

                        #region Codigos de retención
                        Documento.Imagen       = bus_xml.Existe(param.IdEmpresa, Documento.emi_Ruc, Documento.CodDocumento, Documento.Establecimiento, Documento.PuntoEmision, Documento.NumeroDocumento, Documento.ClaveAcceso);
                        Documento.lstRetencion = new List <cp_XML_Documento_Retencion_Info>();


                        bool DividirBases = false;

                        if (ListaCodigoProveedor.Where(q => q.IdEmpresa == param.IdEmpresa && q.pe_cedulRuc == Documento.emi_Ruc).Count() == 0)
                        {
                            var ListaDet = bus_codigoProveedor.GetList(param.IdEmpresa, Documento.emi_Ruc);
                            if (ListaDet.Count > 0)
                            {
                                if (ListaDet.Where(q => string.IsNullOrEmpty(q.BienServicio)).Count() == 1)
                                {
                                    DividirBases = true;
                                }

                                Documento.Automatico   = true;
                                Documento.lstRetencion = new List <cp_XML_Documento_Retencion_Info>();
                                var lstDup = ListaDet.GroupBy(q => q.re_tipo).Select(q => new
                                {
                                    re_tipo  = q.Key,
                                    Contador = q.Count()
                                }).ToList();


                                if (lstDup.Where(q => q.Contador > 1).Count() > 0 && Documento.Imagen == 1)
                                {
                                    foreach (var Detalle in ListaDet)
                                    {
                                        double BaseImponible = Documento.Subtotal0 + Documento.SubtotalIVA;
                                        cp_XML_Documento_Retencion_Info deta = new cp_XML_Documento_Retencion_Info
                                        {
                                            re_tipoRet          = Detalle.re_tipo,
                                            IdCodigo_SRI        = Detalle.IdCodigo_SRI,
                                            re_Codigo_impuesto  = Detalle.re_Codigo_impuesto,
                                            re_Porcen_retencion = Detalle.re_Porcen_retencion
                                        };
                                        if (DividirBases && Detalle.re_tipo != "IVA")
                                        {
                                            var LstBase = (from a in Documento.lstDetalle
                                                           join b in ListaProveedorProducto
                                                           on a.CodigoProducto equals b.CodProducto
                                                           select new
                                            {
                                                b.BienServicio,
                                                a.Precio
                                            }).ToList();

                                            if (LstBase.Count == 0)
                                            {
                                                deta.re_baseRetencion   = Math.Round(BaseImponible, 2, MidpointRounding.AwayFromZero);
                                                deta.re_valor_retencion = Math.Round(Math.Round(deta.re_baseRetencion, 2, MidpointRounding.AwayFromZero) * (Detalle.re_Porcen_retencion / 100), 2, MidpointRounding.AwayFromZero);
                                            }
                                            else
                                            {
                                                if (!string.IsNullOrEmpty(Detalle.BienServicio))
                                                {
                                                    BaseImponible = Math.Round(LstBase.Sum(q => q.Precio ?? 0), 2, MidpointRounding.AwayFromZero);
                                                }
                                                else
                                                {
                                                    BaseImponible = BaseImponible - Math.Round(LstBase.Sum(q => q.Precio ?? 0), 2, MidpointRounding.AwayFromZero);
                                                }
                                                deta.re_baseRetencion   = Math.Round(BaseImponible, 2, MidpointRounding.AwayFromZero);
                                                deta.re_valor_retencion = Math.Round(Math.Round(deta.re_baseRetencion, 2, MidpointRounding.AwayFromZero) * (Detalle.re_Porcen_retencion / 100), 2, MidpointRounding.AwayFromZero);
                                            }
                                        }
                                        else
                                        {
                                            deta.re_baseRetencion   = Math.Round(Detalle.re_tipo == "IVA" ? Documento.ValorIVA : BaseImponible, 2, MidpointRounding.AwayFromZero);
                                            deta.re_valor_retencion = Math.Round(Math.Round(deta.re_baseRetencion, 2, MidpointRounding.AwayFromZero) * (Detalle.re_Porcen_retencion / 100), 2, MidpointRounding.AwayFromZero);
                                        }
                                        Documento.lstRetencion.Add(deta);
                                    }

                                    frmCP_XML_RetencionSubida frmRet = new frmCP_XML_RetencionSubida();
                                    frmRet.info = Documento;
                                    frmRet.ShowDialog();
                                    Documento = frmRet.info;
                                }
                                ListaCodigoProveedor.AddRange(ListaDet);
                            }
                        }
                        else
                        {
                            var ListaDet = ListaCodigoProveedor.Where(q => q.IdEmpresa == param.IdEmpresa && q.pe_cedulRuc == Documento.emi_Ruc).ToList();
                            var lstDup   = ListaDet.GroupBy(q => q.re_tipo).Select(q => new
                            {
                                re_tipo  = q.Key,
                                Contador = q.Count()
                            }).ToList();

                            if (ListaDet.Where(q => string.IsNullOrEmpty(q.BienServicio)).Count() == 1)
                            {
                                DividirBases = true;
                            }

                            if (lstDup.Where(q => q.Contador > 1).Count() > 0 && Documento.Imagen == 1)
                            {
                                foreach (var Detalle in ListaDet)
                                {
                                    double BaseImponible = Documento.Subtotal0 + Documento.SubtotalIVA;
                                    cp_XML_Documento_Retencion_Info deta = new cp_XML_Documento_Retencion_Info
                                    {
                                        re_tipoRet          = Detalle.re_tipo,
                                        IdCodigo_SRI        = Detalle.IdCodigo_SRI,
                                        re_Codigo_impuesto  = Detalle.re_Codigo_impuesto,
                                        re_Porcen_retencion = Detalle.re_Porcen_retencion
                                    };
                                    if (DividirBases && Detalle.re_tipo != "IVA")
                                    {
                                        var LstBase = (from a in Documento.lstDetalle
                                                       join b in ListaProveedorProducto
                                                       on a.CodigoProducto equals b.CodProducto
                                                       select new
                                        {
                                            b.BienServicio,
                                            a.Precio
                                        }).ToList();
                                        if (LstBase.Count == 0)
                                        {
                                            deta.re_baseRetencion   = Math.Round(BaseImponible, 2, MidpointRounding.AwayFromZero);
                                            deta.re_valor_retencion = Math.Round(Math.Round(deta.re_baseRetencion, 2, MidpointRounding.AwayFromZero) * (Detalle.re_Porcen_retencion / 100), 2, MidpointRounding.AwayFromZero);
                                        }
                                        else
                                        {
                                            if (!string.IsNullOrEmpty(Detalle.BienServicio))
                                            {
                                                BaseImponible = Math.Round(LstBase.Sum(q => q.Precio ?? 0), 2, MidpointRounding.AwayFromZero);
                                            }
                                            else
                                            {
                                                BaseImponible = BaseImponible - Math.Round(LstBase.Sum(q => q.Precio ?? 0), 2, MidpointRounding.AwayFromZero);
                                            }
                                            deta.re_baseRetencion   = Math.Round(BaseImponible, 2, MidpointRounding.AwayFromZero);
                                            deta.re_valor_retencion = Math.Round(Math.Round(deta.re_baseRetencion, 2, MidpointRounding.AwayFromZero) * (Detalle.re_Porcen_retencion / 100), 2, MidpointRounding.AwayFromZero);
                                        }
                                    }
                                    else
                                    {
                                        deta.re_baseRetencion   = Math.Round(Detalle.re_tipo == "IVA" ? Documento.ValorIVA : BaseImponible, 2, MidpointRounding.AwayFromZero);
                                        deta.re_valor_retencion = Math.Round(Math.Round(deta.re_baseRetencion, 2, MidpointRounding.AwayFromZero) * (Detalle.re_Porcen_retencion / 100), 2, MidpointRounding.AwayFromZero);
                                    }
                                    Documento.lstRetencion.Add(deta);
                                }

                                frmCP_XML_RetencionSubida frmRet = new frmCP_XML_RetencionSubida();
                                frmRet.info = Documento;
                                frmRet.ShowDialog();
                                Documento = frmRet.info;
                            }
                            Documento.Automatico = true;
                        }
                        if (blst.Where(q => q.Comprobante == Documento.Comprobante && q.emi_Ruc == Documento.emi_Ruc).Count() == 0)
                        {
                            blst.Add(Documento);
                        }
                        #endregion

                        gcDetalle.DataSource = null;
                        gcDetalle.DataSource = blst;
                    }
                }
                lblContador.Text     = blst.Count.ToString();
                gcDetalle.DataSource = blst;
            }
            catch (Exception ex)
            {
                gcDetalle.DataSource = blst;
                lblContador.Text     = blst.Count.ToString();
                MessageBox.Show(ex.Message, param.Nombre_sistema, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
Example #2
0
        private void btnVerificarCarpeta_Click(object sender, EventArgs e)
        {
            try
            {
                ListaMicroEmpresa = new List <cp_proveedor_microempresa_Info>();
                bus_ruta.GuardarDB(new cp_RutaPorEmpresaPorUsuario_Info
                {
                    IdEmpresa = param.IdEmpresa,
                    IdUsuario = param.IdUsuario,
                    RutaXML   = txtRutaXml.Text
                });

                blst = new BindingList <cp_XML_Documento_Info>();
                string   folder = txtRutaXml.Text;
                string   filter = "*.XML*";
                string[] files  = Directory.GetFiles(folder, filter);

                foreach (var item in files)
                {
                    string      readText             = File.ReadAllText(item);
                    XmlDocument xmlComprobanteOrigen = new XmlDocument();
                    xmlComprobanteOrigen.Load(new StringReader(readText));
                    string mensajeErrorOut      = string.Empty;
                    string sXml_a_descerializar = Quitar_a_xml_CDATA_y_Signature(xmlComprobanteOrigen.GetElementsByTagName("comprobante")[0].InnerXml, ref mensajeErrorOut);

                    var rootElement             = XElement.Parse(sXml_a_descerializar);
                    var infoFactura             = rootElement.Element("infoFactura");
                    var infoTributaria          = rootElement.Element("infoTributaria");
                    var IdentificacionComprador = infoFactura.Element("identificacionComprador").Value;

                    if (IdentificacionComprador == param.InfoEmpresa.em_ruc)
                    {
                        var Documento = new cp_XML_Documento_Info
                        {
                            XML                       = sXml_a_descerializar,
                            Tipo                      = infoTributaria.Element("codDoc").Value == "01" ? "FACTURA" : "NOTA DE CREDITO",
                            emi_Ruc                   = infoTributaria.Element("ruc").Value,
                            emi_RazonSocial           = infoTributaria.Element("razonSocial").Value,
                            emi_NombreComercial       = infoTributaria.Element("nombreComercial") == null?infoTributaria.Element("razonSocial").Value : infoTributaria.Element("nombreComercial").Value,
                            ClaveAcceso               = infoTributaria.Element("claveAcceso").Value,
                            emi_ContribuyenteEspecial = infoFactura.Element("contribuyenteEspecial") == null ?  "NO" : infoFactura.Element("contribuyenteEspecial").Value,
                            CodDocumento              = infoTributaria.Element("codDoc").Value,
                            Establecimiento           = infoTributaria.Element("estab").Value,
                            PuntoEmision              = infoTributaria.Element("ptoEmi").Value,
                            NumeroDocumento           = infoTributaria.Element("secuencial").Value,
                            emi_DireccionMatriz       = infoTributaria.Element("dirMatriz").Value,


                            FechaEmision       = DateTime.ParseExact(infoFactura.Element("fechaEmision").Value, "dd/MM/yyyy", System.Globalization.CultureInfo.CurrentCulture),
                            rec_RazonSocial    = infoFactura.Element("razonSocialComprador").Value,
                            rec_Identificacion = infoFactura.Element("identificacionComprador").Value
                        };
                        Documento.FormaPago = infoFactura.Element("pagos") == null ? null : infoFactura.Element("pagos").Element("pago") == null ? null : (infoFactura.Element("pagos").Element("pago").Element("formaPago") == null ? null : infoFactura.Element("pagos").Element("pago").Element("formaPago").Value);
                        Documento.Plazo     = infoFactura.Element("pagos") == null ? 0 : infoFactura.Element("pagos").Element("pago") == null ? 0 : (infoFactura.Element("pagos").Element("pago").Element("plazo") == null ? 0 : Convert.ToInt32(Convert.ToDecimal(infoFactura.Element("pagos").Element("pago").Element("plazo").Value)));

                        var list = infoFactura.Element("totalConImpuestos").Elements("totalImpuesto")
                                   .Select(element => element)
                                   .ToList();
                        Documento.SubtotalIVA = 0;
                        Documento.Subtotal0   = 0;
                        Documento.ValorIVA    = 0;

                        foreach (var Impuesto in list)
                        {
                            if (Impuesto.Element("codigo").Value.ToString() != "3")
                            {
                                Documento.Porcentaje = Convert.ToDouble(Impuesto.Element("valor").Value);

                                if (Documento.Porcentaje == 0)
                                {
                                    Documento.Descuento += Impuesto.Element("descuentoAdicional") == null ? 0 : Convert.ToDouble(Impuesto.Element("descuentoAdicional").Value);
                                    Documento.Subtotal0 += Convert.ToDouble(Impuesto.Element("baseImponible").Value) - Documento.Descuento;
                                }
                                else
                                {
                                    Documento.Descuento   += Impuesto.Element("descuentoAdicional") == null ? 0 : Convert.ToDouble(Impuesto.Element("descuentoAdicional").Value);
                                    Documento.SubtotalIVA += Convert.ToDouble(Impuesto.Element("baseImponible").Value) - Documento.Descuento;
                                    Documento.ValorIVA    += Convert.ToDouble(Impuesto.Element("valor").Value);
                                    Documento.Porcentaje   = bus_impuesto.Get_Info_impuesto(param.Get_Parametro_Info(tb_parametro_enum.P_IVA).Valor).porcentaje;
                                }
                            }
                        }
                        Documento.Total = Documento.Subtotal0 + Documento.SubtotalIVA + Documento.ValorIVA;
                        double ValorIva = Math.Round((double)Documento.SubtotalIVA * 0.12, 2, MidpointRounding.AwayFromZero);
                        if (ValorIva != Documento.ValorIVA)
                        {
                            MessageBox.Show("Revisar: \n" + item + "\nIVA no cuadra con el subtotal con IVA :\nIVA calculado: " + ValorIva.ToString("c2") + "\nIVA en factura: " + Convert.ToDouble(Documento.ValorIVA).ToString("c2"));
                        }
                        Documento.Comprobante = Documento.CodDocumento + '-' + Documento.Establecimiento + "-" + Documento.PuntoEmision + "-" + Documento.NumeroDocumento;

                        var listD = rootElement.Element("detalles").Elements("detalle")
                                    .Select(element => element)
                                    .ToList();

                        Documento.lstDetalle = new List <cp_XML_DocumentoDet_Info>();
                        foreach (var Detalle in listD)
                        {
                            var d = new cp_XML_DocumentoDet_Info
                            {
                                NombreProducto = Detalle.Element("descripcion").Value.ToString(),
                                Cantidad       = Convert.ToDouble(Detalle.Element("cantidad").Value),
                                Precio         = Convert.ToDouble(Detalle.Element("precioTotalSinImpuesto").Value)
                            };

                            var ImpuestoD = Detalle.Element("impuestos").Elements("impuesto")
                                            .Select(element => element)
                                            .FirstOrDefault();

                            d.PorcentajeIVA = Convert.ToDouble(ImpuestoD.Element("tarifa").Value);
                            d.ValorIva      = Convert.ToDouble(ImpuestoD.Element("valor").Value);
                            d.Total         = d.Precio + d.ValorIva;
                            Documento.lstDetalle.Add(d);
                        }

                        if (Documento.Total == 0)
                        {
                            Documento.Descuento = infoFactura.Element("totalDescuento") == null ? 0 : Convert.ToDouble(infoFactura.Element("totalDescuento").Value);
                            Documento.Subtotal0 = Convert.ToDouble(infoFactura.Element("totalSinImpuestos").Value) - Documento.Descuento;
                            Documento.Total     = Documento.Subtotal0;
                        }


                        if (ListaCodigoProveedor.Where(q => q.IdEmpresa == param.IdEmpresa && q.pe_cedulRuc == Documento.emi_Ruc).Count() == 0)
                        {
                            var ListaDet = bus_codigoProveedor.GetList(param.IdEmpresa, Documento.emi_Ruc);
                            if (ListaDet.Count > 0)
                            {
                                Documento.Automatico = true;
                                ListaCodigoProveedor.AddRange(ListaDet);
                            }
                        }
                        else
                        {
                            Documento.Automatico = true;
                        }

                        var CodigoProveedor = ListaCodigoProveedor.Where(q => q.IdEmpresa == param.IdEmpresa && q.pe_cedulRuc == Documento.emi_Ruc).ToList();
                        if (CodigoProveedor != null && CodigoProveedor.Count > 0 && Documento.ValorIVA > 0)
                        {
                            if (CodigoProveedor.Where(q => q.re_tipo == "IVA").Count() == 0)
                            {
                                MessageBox.Show("El proveedor " + Documento.emi_RazonSocial + " no tiene parametrizada un código para retención de IVA para el documento " + Documento.Comprobante, param.Nombre_sistema, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                            }
                        }

                        #region Validar microempresas
                        var MicroEmpresa = ListaMicroEmpresa.Where(q => q.Ruc == Documento.emi_Ruc).FirstOrDefault();
                        if (MicroEmpresa == null)
                        {
                            MicroEmpresa = busMicroEmpresa.GetInfo(Documento.emi_Ruc);
                            if (MicroEmpresa == null)
                            {
                                ListaMicroEmpresa.Add(new cp_proveedor_microempresa_Info
                                {
                                    Ruc            = Documento.emi_Ruc,
                                    EsMicroEmpresa = false
                                });
                            }
                            else
                            {
                                ListaMicroEmpresa.Add(new cp_proveedor_microempresa_Info
                                {
                                    Ruc            = MicroEmpresa.Ruc,
                                    EsMicroEmpresa = true,
                                    Nombre         = MicroEmpresa.Nombre
                                });
                                Documento.EsMicroEmpresa = true;
                            }
                        }
                        else
                        {
                            Documento.EsMicroEmpresa = MicroEmpresa.EsMicroEmpresa;
                        }
                        #endregion

                        Documento.Imagen = bus_xml.Existe(param.IdEmpresa, Documento.emi_Ruc, Documento.CodDocumento, Documento.Establecimiento, Documento.PuntoEmision, Documento.NumeroDocumento);
                        if (blst.Where(q => q.Comprobante == Documento.Comprobante && q.emi_Ruc == Documento.emi_Ruc).Count() == 0)
                        {
                            blst.Add(Documento);
                        }
                        gcDetalle.DataSource = null;
                        gcDetalle.DataSource = blst;
                    }
                }
                lblContador.Text     = blst.Count.ToString();
                gcDetalle.DataSource = blst;
                if (blst.Where(q => q.EsMicroEmpresa == true).Count() > 0)
                {
                    MessageBox.Show("Existen microempresas en el listado de documentos, revise la parametrización", param.Nombre_sistema, MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
            catch (Exception ex)
            {
                gcDetalle.DataSource = blst;
                lblContador.Text     = blst.Count.ToString();
                MessageBox.Show(ex.Message, param.Nombre_sistema, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }