Esempio n. 1
0
        public string GetData(int nroFactura, int idCliente, int nroAtencion, string urlPdfFactura)
        {
            logFacturas.Info("Se recibe factura con siguietnes datos:Factura Internacional:" + nroFactura + "  IdCliente:" + idCliente + " nroAtencion:" + nroAtencion + " urlPdf:" + urlPdfFactura);
            try
            {
                Int32    _idContrato       = 0;
                Decimal  _Valtotal         = 0;
                Decimal  _ValDescuento     = 0;
                Decimal  _ValDescuentoT    = 0;
                Decimal  _ValPagos         = 0;
                Decimal  _ValImpuesto      = 0;
                Decimal  _ValCobrar        = 0;
                DateTime _FecFactura       = DateTime.Now;
                Decimal  _valPos           = 0;
                string   _direccionCliente = string.Empty;
                string   _IdUsuarioR       = string.Empty;
                string   _usrNombre        = string.Empty;
                string   _usrNumDocumento  = string.Empty;
                //Byte _usrIdTipoDoc = 0;
                Int32  _idTercero          = 0;
                string _numDocCliente      = string.Empty;
                string _telefonoCliente    = string.Empty;
                string _municipioCliente   = string.Empty;
                string _ciudad             = string.Empty;
                string _departamento       = string.Empty;
                string _correoCliente      = string.Empty;
                Byte   _tipoDocCliente     = 0;
                string _razonSocial        = string.Empty;
                string _repLegal           = string.Empty;
                string _RegimenFiscal      = string.Empty;
                Byte   _tipoDocClienteDian = 0;
                Int16  _idNaturaleza       = 0;
                //int concepto = 0;
                FormaPago formaPagoTmp = new FormaPago();
                //string monedaFactura = "USD";
                //Fin de Inicializacion
                documentoRoot documentoF2   = new documentoRoot();
                Documento     facturaEnviar = new Documento();
                facturaEnviar.identificadorTransaccion = "bf37ed2a-ea9b-436a-88d7-2dbf9e1e0006";
                facturaEnviar.URLPDF                      = urlPdfFactura;
                facturaEnviar.NITFacturador               = Properties.Settings.Default.NitHusi;
                facturaEnviar.prefijo                     = Properties.Settings.Default.Prefijo;
                facturaEnviar.numeroDocumento             = nroFactura.ToString();
                facturaEnviar.tipoDocumento               = 1;
                facturaEnviar.subTipoDocumento            = "01";
                facturaEnviar.tipoOperacion               = "10";
                facturaEnviar.generaRepresentacionGrafica = false;

                //ClienteInternacional cliente;
                string urlClientes = $"{Properties.Settings.Default.urlServicioClientes}ClienteJuridico?idFactura={nroFactura}";
                logFacturas.Info("URL de Request:" + urlClientes);
                HttpWebRequest peticion = WebRequest.Create(urlClientes) as HttpWebRequest;
                peticion.Method      = "GET";
                peticion.ContentType = "application/json";
                HttpWebResponse respuestaClientes = peticion.GetResponse() as HttpWebResponse;
                StreamReader    sr         = new StreamReader(respuestaClientes.GetResponseStream());
                string          infCliente = sr.ReadToEnd();
                logFacturas.Info("Cliente:" + infCliente);
                ClienteJuridicoConsulta cliente = JsonConvert.DeserializeObject <ClienteJuridicoConsulta>(infCliente);

                using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.DBConexion))
                {
                    conn.Open();
                    string     qryFacturaEnc = @"SELECT c.idtercero,b.idcontrato,a.valtotalUSD as ValorTotalFactura, a.*
FROM facfacturapacint a
INNER JOIN facfactura b on a.idfactura=b.idfactura
INNER JOIN concontrato c on b.idcontrato=c.idcontrato
WHERE a.indhabilitado=1 and  a.idfactura=@nroFactura";
                    SqlCommand cmdFacturaEnc = new SqlCommand(qryFacturaEnc, conn);
                    cmdFacturaEnc.Parameters.Add("@nroFactura", SqlDbType.Int).Value = nroFactura;
                    SqlDataReader rdFacturaEnc = cmdFacturaEnc.ExecuteReader();
                    if (rdFacturaEnc.HasRows)
                    {
                        rdFacturaEnc.Read();
                        _idContrato    = rdFacturaEnc.GetInt32(1);
                        _Valtotal      = Math.Round(rdFacturaEnc.GetDecimal(36), 2);
                        _ValDescuento  = Math.Round(rdFacturaEnc.GetDecimal(38), 2);                        //ValDescuentoUSD
                        _ValDescuentoT = Math.Round(rdFacturaEnc.GetDecimal(38), 2);
                        _ValPagos      = Math.Round(rdFacturaEnc.GetDecimal(40), 2);
                        _ValImpuesto   = 0;                      // Math.Round(rdFacturaEnc.GetDecimal(5), 0);
                        _ValCobrar     = _Valtotal - _ValDescuento - _ValDescuentoT + _ValImpuesto;
                        _FecFactura    = rdFacturaEnc.GetDateTime(13);
                        _valPos        = Math.Round(rdFacturaEnc.GetDecimal(36), 2);
                        _idTercero     = rdFacturaEnc.GetInt32(0);
//                        Decimal _valNoPos = 0;
                        _IdUsuarioR = rdFacturaEnc.GetString(43);
                        //_usrNombre = $"{rdFacturaEnc.GetString(16)} {rdFacturaEnc.GetString(17)}";
                        //_usrNumDocumento = rdFacturaEnc.GetString(18);
                        //_usrIdTipoDoc = rdFacturaEnc.GetByte(49);
                        _razonSocial      = rdFacturaEnc.GetString(6);
                        _repLegal         = rdFacturaEnc.GetString(11);
                        _direccionCliente = rdFacturaEnc.GetString(8);
                        _numDocCliente    = rdFacturaEnc.GetString(7);
                        _municipioCliente = rdFacturaEnc.GetString(9);
                        _telefonoCliente  = rdFacturaEnc.GetString(10);
                    }

                    string     qryDatosGenerales = @"SELECT ter.NumDocumento,ter.IdTipoDoc,ter.NomTercero,ter.CodTercero,con.NomRepComercial,ter.IdTercero,ter.idRegimen,ter.IdNaturaleza  
FROM facFactura fact
INNER JOIN ASI_USUA usr ON fact.IdUsuarioR = usr.IdUsuario
INNER JOIN conContrato con ON fact.IdContrato = con.IdContrato
INNER JOIN genTercero ter ON con.IdTercero = ter.IdTercero
WHERE IdFactura = @idFactura";
                    SqlCommand cmdDatosGenerales = new SqlCommand(qryDatosGenerales, conn);
                    cmdDatosGenerales.Parameters.Add("@idFactura", SqlDbType.Int).Value = nroFactura;
                    SqlDataReader rdDatosGenerales = cmdDatosGenerales.ExecuteReader();
                    if (rdDatosGenerales.HasRows)
                    {
                        rdDatosGenerales.Read();
                        _idNaturaleza   = rdDatosGenerales.GetInt16(7);
                        _tipoDocCliente = rdDatosGenerales.GetByte(1);
                    }
                }

                string formatoWrk = formatosFecha.formatofecha(_FecFactura);
                facturaEnviar.fechaEmision = formatoWrk.Split('T')[0];
                facturaEnviar.horaEmision  = formatoWrk.Split('T')[1];
                facturaEnviar.moneda       = "USD";
                formaPagoTmp.tipoPago      = 1;
                formaPagoTmp.codigoMedio   = "10";
                facturaEnviar.formaPago    = formaPagoTmp;

                List <DetallesItem> detalleProductos = new List <DetallesItem>();
                //****************** CLIENTE
                //  Variables Inicializacion
                //string _direccionCliente = string.Empty;
                //string _telefonoCliente = string.Empty;
                //string _municipioCliente = string.Empty;
                //string _departamento = string.Empty;
                int _localizacionCliente = 0;
                //string _correoCliente = string.Empty;
                using (SqlConnection connx = new SqlConnection(Properties.Settings.Default.DBConexion))
                {
                    connx.Open();
                    string     qryDatosCliente1 = @"SELECT IdLocalizaTipo,DesLocalizacion,B.nom_dipo,A.IdLugar,RIGHT(B.cod_dipo,5),cod_dipo FROM genTerceroLocaliza A
LEFT JOIN GEN_DIVI_POLI B ON A.IdLugar=B.IdLugar
WHERE IdTercero=@idTercero and IdLocalizaTipo IN (2,3)
ORDER BY IdLocalizaTipo";
                    SqlCommand cmdDatosCliente1 = new SqlCommand(qryDatosCliente1, connx);
                    cmdDatosCliente1.Parameters.Add("@idTercero", SqlDbType.Int).Value = _idTercero;
                    SqlDataReader rdDatosCliente1 = cmdDatosCliente1.ExecuteReader();
                    if (rdDatosCliente1.HasRows)
                    {
                        while (rdDatosCliente1.Read())
                        {
                            if (rdDatosCliente1.GetInt32(0) == 2)
                            {
                                _direccionCliente = rdDatosCliente1.GetString(1);
                                //_municipioCliente = rdDatosCliente1.GetString(5);
                                //_municipioCliente = "533";
                                _municipioCliente = "00000";
                                int inicio = _direccionCliente.Length - 12;
                                _ciudad = _direccionCliente.Substring(inicio, 10);
                                _localizacionCliente = rdDatosCliente1.GetInt32(3);
                            }
                            else if (rdDatosCliente1.GetInt32(0) == 3)
                            {
                                _telefonoCliente = rdDatosCliente1.GetString(1);
                                if (_telefonoCliente.Length > 10)
                                {
                                    _telefonoCliente = _telefonoCliente.Substring(0, 10);
                                }
                            }
                        }
                    }

                    //connx.Open();
                    string     qryDatosCliente3 = @"SELECT A.Correo FROM concontratocorreo A
INNER JOIN facFactura B ON A.IdContrato=B.IdContrato
WHERE A.indhabilitado=1 AND B.idFactura=@idFactura
UNION ALL
SELECT A.Deslocalizacion As Correo FROM gentercerolocaliza A
INNER JOIN conContrato C ON C.IdTercero=A.IdTercero
INNER JOIN  facFactura D ON D.IdContrato=C.IdContrato
LEFT JOIN concontratocorreo B ON  B.indhabilitado=1 and B.idcontrato=D.IdContrato  
WHERE B.idcontrato is null and A.IdLocalizaTipo=1 and A.indhabilitado=1 and D.IdFactura=@idFactura";
                    SqlCommand cmdDatosCliente3 = new SqlCommand(qryDatosCliente3, connx);
                    cmdDatosCliente3.Parameters.Add("@idFactura", SqlDbType.Int).Value = nroFactura;
                    SqlDataReader rdDatosCliente3 = cmdDatosCliente3.ExecuteReader();
                    if (rdDatosCliente3.HasRows)
                    {
                        rdDatosCliente3.Read();
                        _correoCliente = rdDatosCliente3.GetString(0);
                    }
                    else
                    {
                        _correoCliente = "";
                    }
                }

                List <NotificacionesItem> notificaciones = new List <NotificacionesItem>();
                NotificacionesItem        notificaItem   = new NotificacionesItem();
                notificaItem.tipo = 1;
                List <string> valorNotificacion = new List <string>();
                valorNotificacion.Add(cliente.cuenta_correo.Trim());
                notificaItem.valor = valorNotificacion;
                notificaciones.Add(notificaItem);
                facturaEnviar.notificaciones = notificaciones;


                Adquiriente adquirienteTmp = new Adquiriente();
                //adquirienteTmp.identificacion = _numDocCliente;
                //if (_tipoDocCliente == 1)//TODO: validar la Homologacion para este campo
                //{
                //    adquirienteTmp.tipoIdentificacion = 31;
                //}
                //else if (_tipoDocCliente == 2)
                //{
                //    adquirienteTmp.tipoIdentificacion = 13;
                //}

                using (SqlConnection connXX = new SqlConnection(Properties.Settings.Default.DBConexion))
                {
                    connXX.Open();
                    string     qryTipoDocDian = "SELECT TipoDocDian FROM homologaTipoDocDian WHERE IdTipoDoc=@tipoDoc";
                    SqlCommand cmdTipoDocDian = new SqlCommand(qryTipoDocDian, connXX);
                    cmdTipoDocDian.Parameters.Add("@tipoDoc", SqlDbType.TinyInt).Value = cliente.TipoDoc_Cliente;
                    Int16 tipoDoc = Int16.Parse(cmdTipoDocDian.ExecuteScalar().ToString());
                    _tipoDocClienteDian = byte.Parse(tipoDoc.ToString());
                }
                adquirienteTmp.tipoIdentificacion = _tipoDocClienteDian;

                adquirienteTmp.identificacion = cliente.NroDoc_Cliente;
                adquirienteTmp.codigoInterno  = cliente.IdTercero.ToString();
                adquirienteTmp.razonSocial    = cliente.NomTercero;
                adquirienteTmp.nombreSucursal = cliente.NomTercero;
                adquirienteTmp.correo         = cliente.cuenta_correo.Trim().Split(';')[0];
                adquirienteTmp.telefono       = cliente.telefono;

                //adquirienteTmp.codigoInterno = _idTercero.ToString();
                //adquirienteTmp.razonSocial = _razonSocial;
                //adquirienteTmp.nombreSucursal = _razonSocial;
                //adquirienteTmp.correo = _correoCliente.Trim();
                //adquirienteTmp.telefono = _telefonoCliente;

                if (_RegimenFiscal.Equals("C"))
                {
                    adquirienteTmp.tipoRegimen = "48";
                }
                else
                {
                    adquirienteTmp.tipoRegimen = "49";
                }
                //TODO: Aqui insertar lo que se defina de Responsabilidades  RUT documentoF2.adquiriente.responsabilidadesRUT
                if (_idNaturaleza == 3)
                {
                    adquirienteTmp.tipoPersona = "1";
                }
                else if (_idNaturaleza == 4)
                {
                    adquirienteTmp.tipoPersona = "2";
                }
                else
                {
                    adquirienteTmp.tipoPersona = "0";
                }
                List <string> responsanbilidadesR = new List <string>();
                using (SqlConnection conexion01 = new SqlConnection(Properties.Settings.Default.DBConexion))
                {
                    conexion01.Open();
                    SqlCommand sqlValidaDet = new SqlCommand("spTerceroResponsabilidadRut", conexion01);
                    sqlValidaDet.CommandType = CommandType.StoredProcedure;
                    sqlValidaDet.Parameters.Add("@idtercero", SqlDbType.Int).Value = _idTercero;
                    SqlDataReader rdValidaDet = sqlValidaDet.ExecuteReader();
                    if (rdValidaDet.HasRows)
                    {
                        rdValidaDet.Read();
                        responsanbilidadesR.Add(rdValidaDet.GetString(0));
                    }
                    else
                    {
                        responsanbilidadesR.Add("R-99-PN");
                    }
                }
                adquirienteTmp.responsabilidadesRUT = responsanbilidadesR;
                Ubicacion ubicacionCliente = new Ubicacion();
                ubicacionCliente.pais            = cliente.codigoPais;    // "AW";
                ubicacionCliente.codigoMunicipio = _municipioCliente;
                ubicacionCliente.departamento    = cliente.Nombre_Depto;  // "Aruba";
                ubicacionCliente.direccion       = cliente.direccion;     // _direccionCliente;
                ubicacionCliente.ciudad          = cliente.Nom_Municipio; // _ciudad;
                adquirienteTmp.ubicacion         = ubicacionCliente;
                documentoF2.adquiriente          = adquirienteTmp;
                double TotalGravadoIva = 0;
                //double TotalGravadoIca = 0;
                #region MyRegion
                //            idenCliente.SchemeID = "31";
                //idenCliente.ID = _numDocCliente;

                //Cliente.AdditionalAccountID = "1"; //TODO: Tipo de contribuyente. Buscar en SAHI

                //datosCliente.PartyIdentification = idenCliente;
                //datosCliente.Name = _razonSocial;
                //objDireccionCliente.Line = _direccionCliente;
                //objDireccionCliente.CityName = _municipioCliente;
                //objDireccionCliente.CountryCode = "AW"; //TODO: DEfinir de Donde Obtener(Pais del Cliente) desde Base de Datos
                //objDireccionCliente.CitySubdivisionName = ""; //TODO: De Donde  Se obtiene de la Base de Datos. Especificidad en la direccion(Barrio, Edifico etc)
                //objDireccionCliente.Department = "";
                //ubicacionFisicaCliente.Address = objDireccionCliente;
                //datosCliente.PhysicalLocation = ubicacionFisicaCliente;

                //RegimenCliente.TaxLevelCode = "2";// TODO: Validar si este codigo (TaxLevelCode) es Fijo. ??
                //datosCliente.PartyTaxScheme = RegimenCliente;
                //string primerNombre = string.Empty;
                //string segundoNombre = string.Empty;
                //string Apellidos = string.Empty;
                //if (_repLegal.Length > 1)
                //{
                //	string[] nombreRepresentante = _repLegal.Split(' ');
                //	if (nombreRepresentante.Length == 2)
                //	{
                //		primerNombre = nombreRepresentante[0];
                //		segundoNombre = " ";
                //		Apellidos = nombreRepresentante[1];
                //	}
                //	else if (nombreRepresentante.Length > 2)
                //	{
                //		primerNombre = nombreRepresentante[0];
                //		segundoNombre = nombreRepresentante[1];
                //		Apellidos = nombreRepresentante[2];
                //	}
                //	if (nombreRepresentante.Length > 3)
                //	{
                //		Apellidos = Apellidos + nombreRepresentante[3];
                //	}
                //}
                //repLegalCliente.FirstName = _razonSocial;
                //repLegalCliente.MiddleName = " ";
                //repLegalCliente.FamilyName = " ";
                //repLegalCliente.Telephone = " ";
                //repLegalCliente.Email = _correoCliente; // TODO: DEfinir la ubicacion de Envio de las cuentas de correo.

                ////Cliente.Party.PartyTaxScheme.TaxLevelCode = "2"; // Regimen Comun;
                //datosCliente.Person = repLegalCliente;

                //Cliente.Party = datosCliente;
                #endregion

                #region MyRegion
                //            ivaFactura.ID = "01";
                //taxIVA.Amount = 0;
                //taxIVA.Currency = monedaFactura;
                //ivaFactura.TaxAmount = taxIVA;
                //ivaFactura.TaxEvidenceIndicator = "true";

                //ipoconsumoFactura.ID = "02";
                //taxCONSUMO.Amount = 0;
                //taxCONSUMO.Currency = monedaFactura;
                //ipoconsumoFactura.TaxAmount = taxCONSUMO;
                //ipoconsumoFactura.TaxEvidenceIndicator = "true";

                //icaFactura.ID = "03";
                //taxICA.Amount = 0;
                //taxICA.Currency = monedaFactura;
                //icaFactura.TaxAmount = taxICA;
                //icaFactura.TaxEvidenceIndicator = "true";

                //camposAdicionalesICA.Amount = _Valtotal.TomarDecimales(2);
                //camposAdicionalesICA.Currency = monedaFactura;
                //icaFactura.TaxableAmount = camposAdicionalesICA;
                //icaFactura.Percent = 0;

                //impuestosFactura.Add(ivaFactura);
                //impuestosFactura.Add(ipoconsumoFactura);
                //impuestosFactura.Add(icaFactura);
                //// Queda pendiente Definir el porque de los campos adicionales en la documentacion del Servicio.
                //lineaExtCant.Amount = _ValCobrar.TomarDecimales(2);
                //lineaExtCant.Currency = monedaFactura;
                //subtotalesFactura.LineExtensionAmount = lineaExtCant;
                //// aqui va el TaxExclusiveAmount

                //totalImpuesto.Amount = _Valtotal; //Total Base Imponible (Importe Bruto + Cargos- Descuentos): Base imponible para el cálculo de los impuestos. Todos los impuestos los calculan sobre una misma base???
                //totalImpuesto.Currency = monedaFactura;
                //subtotalesFactura.TaxExclusiveAmount = totalImpuesto;
                //Decimal totalFacturapago = _Valtotal.TomarDecimales(2) + _ValImpuesto.TomarDecimales(2) - _ValPagos.TomarDecimales(2);
                //totalPagar.Amount = totalFacturapago.TomarDecimales(2);
                //totalPagar.Currency = monedaFactura;
                //subtotalesFactura.PayableAmount = totalPagar;
                #endregion

                //************************************************************ Detalle de Factura Internacional ***********************************************************
                using (SqlConnection conexion01 = new SqlConnection(Properties.Settings.Default.DBConexion))
                {
                    string qryFactura = @"select c.idtercero,b.idcontrato,a.* from facfacturapacint a 
inner join facfactura b on a.idfactura = b.idfactura
inner join concontrato c on b.idcontrato = c.idcontrato 
where a.indhabilitado = 1 and a.idfactura =@idFactura";
                    conexion01.Open();
                    SqlCommand cmdFactura = new SqlCommand(qryFactura, conexion01);
                    cmdFactura.Parameters.Add("@idFactura", SqlDbType.Int).Value = nroFactura;
                    //cmdFactura.Parameters.Add("@idAtencion", SqlDbType.Int).Value = nroAtencion;
                    SqlDataReader rdFactura = cmdFactura.ExecuteReader();
                    if (rdFactura.HasRows)
                    {
                        rdFactura.Read();
                        string strDetalleFac = @"SELECT b.idfactura,d.cantidad,case when d.cantidad=1 then d.valtotalusd else d.valunitusd end as Valorunitario, d.valtotalUSD as Valortotal , d.*  
FROM facfacturapacint a
INNER JOIN facfactura b on a.idfactura=b.idfactura
INNER JOIN facfacturapacintdet d on a.idfacturapacint=d.idfacturapacint
INNER JOIN facfacturapacintdetorden e on d.IdFacturaPacInt=e.IdFacturaPacInt AND  d.IdCategoria=e.IdCategoria AND d.IdProducto=e.IdProducto AND d.IdMovimiento=e.IdMovimiento
INNER JOIN concontrato c on b.idcontrato=c.idcontrato
WHERE a.indhabilitado=1 and a.idfactura=@idFactura
ORDER BY e.Idorden";

                        SqlCommand cmdDetalleFac = new SqlCommand(strDetalleFac, conexion01);
                        cmdDetalleFac.Parameters.Add("@idFactura", SqlDbType.Int).Value = nroFactura;
                        SqlDataReader rdDetalleFac = cmdDetalleFac.ExecuteReader();
                        if (rdDetalleFac.HasRows)
                        {
                            Int16 nroLinea = 1;
                            while (rdDetalleFac.Read())
                            {
                                try
                                {
                                    List <TibutosDetalle> listaTributos = new List <TibutosDetalle>();
                                    DetallesItem          lineaProducto = new DetallesItem();
                                    lineaProducto.tipoDetalle = 1; // Linea Normal
                                    string codigoProducto = rdDetalleFac.GetString(7);
                                    lineaProducto.valorCodigoInterno = codigoProducto;

                                    double valorUnitario = double.Parse(rdDetalleFac.GetDecimal(2).ToString());
                                    double cantidad      = double.Parse(rdDetalleFac.GetInt32(1).ToString()).TomarDecimales(2);

                                    lineaProducto.codigoEstandar      = "999";
                                    lineaProducto.valorCodigoEstandar = codigoProducto;
                                    lineaProducto.descripcion         = rdDetalleFac.GetString(8);
                                    lineaProducto.unidades            = double.Parse(rdDetalleFac.GetInt32(1).ToString()).TomarDecimales(2);
                                    lineaProducto.unidadMedida        = "94";// rdDetalleFac.GetString(19);
                                    lineaProducto.valorUnitarioBruto  = double.Parse(rdDetalleFac.GetDecimal(2).ToString());
                                    //lineaProducto.valorBruto = double.Parse(rdDetalleFac.GetDecimal(3).ToString()).TomarDecimales(2);
                                    lineaProducto.valorBruto       = valorUnitario * cantidad;
                                    lineaProducto.valorBrutoMoneda = "USD";

                                    TibutosDetalle tributosWRKIva = new TibutosDetalle();
                                    tributosWRKIva.id                      = "01";
                                    tributosWRKIva.nombre                  = "Iva";
                                    tributosWRKIva.esImpuesto              = true;
                                    tributosWRKIva.porcentaje              = 0;
                                    tributosWRKIva.valorBase               = double.Parse(rdDetalleFac.GetDecimal(3).ToString());
                                    tributosWRKIva.valorImporte            = double.Parse(rdDetalleFac.GetDecimal(3).ToString()) * 0;
                                    TotalGravadoIva                        = TotalGravadoIva + double.Parse(rdDetalleFac.GetDecimal(3).ToString());
                                    tributosWRKIva.tributoFijoUnidades     = 0;
                                    tributosWRKIva.tributoFijoValorImporte = 0;
                                    listaTributos.Add(tributosWRKIva);
                                    lineaProducto.tributos = listaTributos;
                                    detalleProductos.Add(lineaProducto);
                                    nroLinea++;
                                }
                                catch (Exception sqlExp)
                                {
                                    string error = sqlExp.Message + "   " + sqlExp.StackTrace;
                                    throw;
                                }
                            }
                        }
                        else                         // Si No  hay Detalle de Productos
                        {
                            logFacturas.Info("No se encontro Detalle de productos para la factura. " + strDetalleFac);
                        }
                    }
                    else                     // No se encuentra Informacion de la Factura y Atencion
                    {
                        logFacturas.Info("No se encontro Informacion de Factura y Atencion." + qryFactura);
                    }
                }

                #region MyRegion

                //peticion.AccountingCustomerParty = Cliente;
                ////peticion.TaxTotal = impuestosFactura;
                //peticion.LegalMonetaryTotal = subtotalesFactura;
                //peticion.DocumentLines = detalleProductos;
                //objData.OriginalRequest = peticion;
                //facturaEnviar.Data = objData;

                //facturaEnviar.Data.OriginalRequest.AccountingCustomerParty.Party = Cliente.Party;
                //facturaEnviar.Data.OriginalRequest.TaxTotal = impuestosFactura;
                //facturaEnviar.Data.OriginalRequest.LegalMonetaryTotal = subtotalesFactura;
                //facturaEnviar.Data.OriginalRequest.DocumentLines = detalleProductos;
                #endregion

                documentoF2.detalles = detalleProductos;
                List <TributosItem>    tributosTMP     = new List <TributosItem>();
                List <DetalleTributos> tributosDetalle = new List <DetalleTributos>();
                DetalleTributos        detalleTributos = new DetalleTributos() // Un Objeto por cada Tipo de Iva
                {
                    valorImporte = 0,
                    valorBase    = TotalGravadoIva,
                    porcentaje   = 0
                };
                tributosDetalle.Add(detalleTributos);
                TributosItem itemTributo = new TributosItem()
                {
                    id                = "01", //Total de Iva
                    nombre            = "Iva",
                    esImpuesto        = true,
                    valorImporteTotal = 0,
                    detalles          = tributosDetalle // DEtalle de los Ivas
                };
                tributosTMP.Add(itemTributo);
                documentoF2.tributos = tributosTMP;
                double difRedondeo = 0;
                if (Math.Abs(TotalGravadoIva - double.Parse(_Valtotal.ToString())) > 0)
                {
                    difRedondeo = Math.Abs(TotalGravadoIva - double.Parse(_Valtotal.ToString()));
                }
                if (difRedondeo > 1.04)
                {
                    throw new Exception("El valor de Redondeos, es superior a 1.04");
                }
                ///<summary>
                ///Inicio de Totales de la Factura
                /// </summary
                Totales totalesTmp = new Totales()
                {
                    valorBruto             = double.Parse(_Valtotal.ToString()),
                    valorAnticipos         = double.Parse(_ValPagos.ToString()),
                    valorTotalSinImpuestos = double.Parse(_Valtotal.ToString()),
                    valorTotalConImpuestos = double.Parse(_Valtotal.ToString()),
                    valorNeto     = double.Parse(_ValCobrar.ToString()),
                    valorRedondeo = difRedondeo.TomarDecimales(2)
                };
                double   tasa          = 0;
                string   monedaDestino = String.Empty;
                DateTime fechaTrm      = DateTime.Now;
                using (SqlConnection connX1 = new SqlConnection(Properties.Settings.Default.DBConexion))
                {
                    connX1.Open();
                    string     qryTasa = "SELECT Trm,FechaTrm,MonedaOrigen FROM facFacturaTasaTrm WHERE idFactura=@idFactura";
                    SqlCommand cmdTasa = new SqlCommand(qryTasa, connX1);
                    cmdTasa.Parameters.Add("@idFactura", SqlDbType.Int).Value = nroFactura;
                    SqlDataReader rdTasa = cmdTasa.ExecuteReader();
                    if (rdTasa.HasRows)
                    {
                        rdTasa.Read();
                        tasa          = rdTasa.GetDouble(0);
                        fechaTrm      = rdTasa.GetDateTime(1);
                        monedaDestino = rdTasa.GetString(2);
                    }
                    else
                    {
                        logFacturas.Info($"No se encontro Tasa de Cambio para la Factura Numero:{nroFactura}");
                    }
                }
                formatoWrk = formatosFecha.formatofecha(fechaTrm);

                TRM tasaInf = new TRM();
                tasaInf.valor         = tasa;
                tasaInf.monedaDestino = monedaDestino;
                tasaInf.fecha         = formatoWrk.Split('T')[0];
                facturaEnviar.TRM     = tasaInf;

                documentoF2.totales = totalesTmp;
                logFacturas.Info("Numero de Productos Procesados, para JSon:" + detalleProductos.Count);
                //****************************************
                try
                {
                    //string urlConsumo = Properties.Settings.Default.urlFacturaElectronica + Properties.Settings.Default.recursoFacturaE;
                    string urlConsumo = Properties.Settings.Default.urlFacturaElectronica;// + Properties.Settings.Default.recursoFacturaE;
                    logFacturas.Info("URL de Request:" + urlConsumo);
                    HttpWebRequest request = WebRequest.Create(urlConsumo) as HttpWebRequest;
                    //request.Timeout = 60 * 1000;
                    documentoF2.documento = facturaEnviar;
                    string facturaJson = JsonConvert.SerializeObject(documentoF2);
                    logFacturas.Info("Json de la Factura:" + facturaJson);
                    request.Method      = "POST";
                    request.ContentType = "application/json";
                    string Usuario      = Properties.Settings.Default.usuario;
                    string Clave        = Properties.Settings.Default.clave;
                    string credenciales = Convert.ToBase64String(Encoding.ASCII.GetBytes(Usuario + ":" + Clave));
                    request.Headers.Add("Authorization", "Basic " + credenciales);
                    Byte[] data = Encoding.UTF8.GetBytes(facturaJson);
                    Stream st   = request.GetRequestStream();
                    st.Write(data, 0, data.Length);
                    st.Close();

                    int loop1, loop2;
                    NameValueCollection valores;
                    valores = request.Headers;

                    // Pone todos los nombres en un Arreglo
                    string[] arr1 = valores.AllKeys;
                    for (loop1 = 0; loop1 < arr1.Length; loop1++)
                    {
                        logFacturas.Info("Key: " + arr1[loop1] + "<br>");
                        // Todos los valores
                        string[] arr2 = valores.GetValues(arr1[loop1]);
                        for (loop2 = 0; loop2 < arr2.Length; loop2++)
                        {
                            logFacturas.Info("Value " + loop2 + ": " + arr2[loop2]);
                        }
                    }
                    HttpWebResponse response = request.GetResponse() as HttpWebResponse;
                    logFacturas.Info("Codigo Status:" + response.StatusCode);
                    logFacturas.Info("Descripcion Status:" + response.StatusDescription);
                    StreamReader LecturaRespuesta = new StreamReader(response.GetResponseStream());
                    string       strsb            = LecturaRespuesta.ReadToEnd();
                    logFacturas.Info("Respuesta:" + strsb);
                    string valorRpta = "00";
                    RespuestaTransfiriendo respuesta = JsonConvert.DeserializeObject <RespuestaTransfiriendo>(strsb);
                    if (respuesta.esExitoso)
                    {
                        logFacturas.Info($"PDF:{respuesta.resultado.URLPDF}");
                        logFacturas.Info($"XML:{respuesta.resultado.URLXML}");
                        logFacturas.Info($"UUID:{ respuesta.resultado.UUID}");
                        logFacturas.Info($"QR:{respuesta.resultado.QR}");
                        using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.DBConexion))
                        {
                            conn.Open();
                            string     strActualiza = @"UPDATE dbo.facFacturaTempWEBService SET identificador=@identificador WHERE IdFactura=@nrofactura";
                            SqlCommand cmdActualiza = new SqlCommand(strActualiza, conn);
                            cmdActualiza.Parameters.Add("@identificador", SqlDbType.VarChar).Value = respuesta.resultado.UUID;
                            cmdActualiza.Parameters.Add("@nrofactura", SqlDbType.Int).Value        = nroFactura;
                            if (cmdActualiza.ExecuteNonQuery() > 0)
                            {
                                logFacturas.Info("Factura Actualizada con UUID en facFacturaTempWEBService");
                                using (WebClient webClient = new WebClient())
                                {
                                    try
                                    {
                                        string carpetaDescarga = Properties.Settings.Default.urlDescargaPdfFACT + DateTime.Now.Year + @"\" + respuesta.resultado.UUID + ".pdf";
                                        logFacturas.Info("Carpeta de Descarga:" + carpetaDescarga);
                                        webClient.DownloadFile(respuesta.resultado.URLPDF, carpetaDescarga);
                                        //System.Threading.Thread.Sleep(1000);
                                        logFacturas.Info($"Descarga de PDF Factura...Terminada");
                                        carpetaDescarga = Properties.Settings.Default.urlDescargaPdfFACT + DateTime.Now.Year + @"\" + respuesta.resultado.UUID + ".XML";
                                        webClient.DownloadFile(respuesta.resultado.URLXML, carpetaDescarga);
                                        //System.Threading.Thread.Sleep(1000);
                                        logFacturas.Info($"Descarga de XML...Terminada");
                                        using (SqlConnection conn3 = new SqlConnection(Properties.Settings.Default.DBConexion))
                                        {
                                            conn3.Open();
                                            string     qryActualizaTempWEBService = @"UPDATE dbo.facFacturaTempWEBService SET CodCUFE=@cufe,cadenaQR=@cadenaQR WHERE identificador=@identificador";
                                            SqlCommand cmdActualizaTempWEBService = new SqlCommand(qryActualizaTempWEBService, conn);
                                            cmdActualizaTempWEBService.Parameters.Add("@cufe", SqlDbType.VarChar).Value          = respuesta.resultado.UUID;
                                            cmdActualizaTempWEBService.Parameters.Add("@cadenaQR", SqlDbType.NVarChar).Value     = respuesta.resultado.QR;
                                            cmdActualizaTempWEBService.Parameters.Add("@identificador", SqlDbType.VarChar).Value = respuesta.resultado.UUID;
                                            if (cmdActualizaTempWEBService.ExecuteNonQuery() > 0)
                                            {
                                                logFacturas.Info("Descarga Existosa de Archivos de la Factura con Identificadotr:" + respuesta.resultado.UUID + " Destino:" + carpetaDescarga);
                                                if (!(respuesta.advertencias is null))
                                                {
                                                    string     qryAdvertencia         = @"INSERT INTO dbo.facFacturaTempWSAdvertencias(IdFactura,CodAdvertencia,FecRegistro,DescripcionAdv) 
VALUES(@IdFactura, @CodAdvertencia, @FecRegistro, @DescripcionAdv)";
                                                    SqlCommand cmdInsertarAdvertencia = new SqlCommand(qryAdvertencia, conn);
                                                    cmdInsertarAdvertencia.Parameters.Add("@IdFactura", SqlDbType.Int);
                                                    cmdInsertarAdvertencia.Parameters.Add("@CodAdvertencia", SqlDbType.VarChar);
                                                    cmdInsertarAdvertencia.Parameters.Add("@DescripcionAdv", SqlDbType.NVarChar);
                                                    cmdInsertarAdvertencia.Parameters.Add("@FecRegistro", SqlDbType.DateTime);

                                                    foreach (AdvertenciasItem itemAdv in respuesta.advertencias)
                                                    {
                                                        cmdInsertarAdvertencia.Parameters["@IdFactura"].Value      = nroFactura;
                                                        cmdInsertarAdvertencia.Parameters["@CodAdvertencia"].Value = itemAdv.codigo;
                                                        //cmdInsertarAdvertencia.Parameters["@consecutivo"].Value = consecutivo;
                                                        cmdInsertarAdvertencia.Parameters["@FecRegistro"].Value    = DateTime.Now;
                                                        cmdInsertarAdvertencia.Parameters["@DescripcionAdv"].Value = itemAdv.mensaje;
                                                        if (cmdInsertarAdvertencia.ExecuteNonQuery() > 0)
                                                        {
                                                            logFacturas.Info($"Se Inserta Detalle de Advertencias: Codigo Advertencia{itemAdv.codigo} Mensaje Advertencia:{itemAdv.mensaje}");
                                                            valorRpta = nroFactura.ToString();
                                                        }
                                                        else
                                                        {
                                                            logFacturas.Info($"No es Posible Insertar Detalle de Advertencias: Codigo Advertencia{itemAdv.codigo} Mensaje Advertencia:{itemAdv.mensaje}");
                                                            valorRpta = nroFactura.ToString();
                                                        }
                                                    }
                                                }
                                                valorRpta = nroFactura.ToString();
                                            }
                                            else
                                            {
                                                logFacturas.Info($"No fue Posible Realizar la Descarga de Archivos de la Factura con Identificadotr:{respuesta.resultado.UUID} Estado Proceso de Factura:{respuesta.esExitoso}");
                                            }
                                        }
                                    }
                                    catch (NotSupportedException nSuppExp)
                                    {
                                        logFacturas.Info("Se ha presentado una NotSupportedException durante la descarga de los objetos de la Factura:" + nSuppExp.Message + "     " + nSuppExp.InnerException.Message);
                                        valorRpta = "9X";
                                    }
                                    catch (ArgumentNullException argNull)
                                    {
                                        logFacturas.Info("Se ha presentado una ArgumentNullException durante la descarga de los objetos de la Factura:" + argNull.Message + "     " + argNull.InnerException.Message);
                                        valorRpta = "9X";
                                    }
                                    catch (WebException webEx1)
                                    {
                                        logFacturas.Info("Se ha presentado una Falla durante la descarga de los objetos de la factura:" + webEx1.Message + "     " + webEx1.InnerException.Message);
                                        logFacturas.Warn($"Pila de Mensajes:::::{webEx1.StackTrace}");
                                        valorRpta = "93";
                                    }
                                    catch (Exception exx)
                                    {
                                        logFacturas.Info("No fue posible descargar los archivos.PDF, XML y QR  !!! Causa:" + exx.Message);
                                        valorRpta = "98";
                                    }
                                }
                            }
                            else
                            {
                                valorRpta = "98";
                                logFacturas.Info("!!!   No fue posible Actualizar la Factura en la Tabla: facFacturaTempWEBService   !!!");
                            }
                        }
                        return(valorRpta);
                    }
                    else
                    {
                        using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.DBConexion))
                        {
                            conn.Open();
                            string     qryInsertaError  = @"INSERT INTO facFacturaTempWEBServiceError (IdFactura,CodError,DescripcionError,FecRegistro) 
VALUES(@IdFactura, @CodError, @DescripcionError, @FecRegistro)";
                            SqlCommand cmdInsertarError = new SqlCommand(qryInsertaError, conn);
                            cmdInsertarError.Parameters.Add("@IdFactura", SqlDbType.Int).Value             = nroFactura;
                            cmdInsertarError.Parameters.Add("@CodError", SqlDbType.VarChar).Value          = respuesta.codigo;
                            cmdInsertarError.Parameters.Add("@DescripcionError", SqlDbType.NVarChar).Value = respuesta.mensaje;
                            cmdInsertarError.Parameters.Add("@FecRegistro", SqlDbType.DateTime).Value      = DateTime.Parse(respuesta.fecha);
                            if (cmdInsertarError.ExecuteNonQuery() > 0)
                            {
                                valorRpta = nroFactura.ToString();
                                string     qryDetErr = @"INSERT INTO facFacturaTempWSErrorDetalle (IdFactura,CodError,consecutivo,FecRegistro,DescripcionError) 
VALUES(@IdFactura, @CodError, @consecutivo, @FecRegistro, @DescripcionError)";
                                SqlCommand cmdDetErr = new SqlCommand(qryDetErr, conn);
                                cmdDetErr.Parameters.Add("@IdFactura", SqlDbType.Int);
                                cmdDetErr.Parameters.Add("@CodError", SqlDbType.VarChar);
                                cmdDetErr.Parameters.Add("@consecutivo", SqlDbType.Int);
                                cmdDetErr.Parameters.Add("@FecRegistro", SqlDbType.DateTime);
                                cmdDetErr.Parameters.Add("@DescripcionError", SqlDbType.NVarChar);
                                List <ErroresItem> listaErrores = new List <ErroresItem>();
                                int consecutivo = 1;
                                foreach (ErroresItem itemErr in respuesta.errores)
                                {
                                    cmdDetErr.Parameters["@IdFactura"].Value        = nroFactura;
                                    cmdDetErr.Parameters["@CodError"].Value         = itemErr.codigo;
                                    cmdDetErr.Parameters["@consecutivo"].Value      = consecutivo;
                                    cmdDetErr.Parameters["@FecRegistro"].Value      = DateTime.Parse(respuesta.fecha);
                                    cmdDetErr.Parameters["@DescripcionError"].Value = itemErr.mensaje;
                                    if (cmdDetErr.ExecuteNonQuery() > 0)
                                    {
                                        logFacturas.Info($"Se Inserta Detalle de Errores:codigo{itemErr.codigo} Mensaje:{itemErr.mensaje}");
                                    }
                                    else
                                    {
                                        logFacturas.Info($"No es Posible Insertar Detalle de Errores: Codigo{itemErr.codigo} Mensaje:{itemErr.mensaje}");
                                    }
                                }
                            }
                            else
                            {
                                valorRpta = "99";
                            }
                        }
                    }

                    return(valorRpta);
                }
                catch (Exception e)
                {
                    logFacturas.Warn("Se ha presentado una excepcion:" + e.Message + " Pila de LLamdos:" + e.StackTrace);
                    return("98");
                }
            }
            catch (Exception exp)
            {
                logFacturas.Warn("Se ha presentado una Excepcion:" + exp.Message + "Pila de LLamadas:" + exp.StackTrace);
                return("99");
            }
        }
Esempio n. 2
0
        public string GetData(Int32 nroFactura, Int32 idCliente, Int32 nroAtencion, string urlPdfFactura)
        {
            logFacturas.Info("Se recibe factura con siguientes datos:Factura x Actividad:" + nroFactura + "  IdCliente:" + idCliente + " nroAtencion:" + nroAtencion + " urlPdf:" + urlPdfFactura);
            try
            {
                // Inicializacion
                Int32                _idContrato         = 0;
                Decimal              _Valtotal           = 0;
                Decimal              _ValDescuento       = 0;
                Decimal              _ValDescuentoT      = 0;
                Decimal              _ValPagos           = 0;
                Decimal              _ValImpuesto        = 0;
                Decimal              _ValCobrar          = 0;
                DateTime             _FecFactura         = DateTime.Now;
                Decimal              _valPos             = 0;
                Decimal              _valNoPos           = 0;
                Int32                _IdUsuarioR         = 0;
                Int32                _idTercero          = 0;
                Byte                 _tipoDocClienteDian = 0;
                string               _usrNombre          = string.Empty;
                string               _usrNumDocumento    = string.Empty;
                Byte                 _usrIdTipoDoc       = 0;
                string               _numDocCliente      = string.Empty;
                Byte                 _tipoDocCliente     = 0;
                string               _razonSocial        = string.Empty;
                string               _repLegal           = string.Empty;
                string               _RegimenFiscal      = string.Empty;
                Int16                _idNaturaleza       = 0;
                int                  concepto            = 0;
                FormaPago            formaPagoTmp        = new FormaPago();
                List <AnticiposItem> anticiposWrk        = new List <AnticiposItem>();

                //Fin de Inicializacion
                documentoRoot documentoF2   = new documentoRoot();
                Documento     facturaEnviar = new Documento();
                facturaEnviar.identificadorTransaccion = "D7F719C2 - 75F4 - 4F06 - B7CB - F583FC28DBEE";
                facturaEnviar.URLPDF                      = urlPdfFactura;
                facturaEnviar.NITFacturador               = Properties.Settings.Default.NitHusi;
                facturaEnviar.prefijo                     = Properties.Settings.Default.Prefijo;
                facturaEnviar.numeroDocumento             = nroFactura.ToString();
                facturaEnviar.tipoDocumento               = 1;
                facturaEnviar.subTipoDocumento            = "01";
                facturaEnviar.tipoOperacion               = "10";
                facturaEnviar.generaRepresentacionGrafica = false;

                // ClienteJuridico cliente = new ClienteJuridico();
                string urlClientes = $"{Properties.Settings.Default.urlServicioClientes}ClienteJuridico?idFactura={nroFactura}";
                logFacturas.Info("URL de Request:" + urlClientes);
                HttpWebRequest peticion = WebRequest.Create(urlClientes) as HttpWebRequest;
                peticion.Method      = "GET";
                peticion.ContentType = "application/json";
                HttpWebResponse respuestaClientes = peticion.GetResponse() as HttpWebResponse;
                StreamReader    sr         = new StreamReader(respuestaClientes.GetResponseStream());
                string          infCliente = sr.ReadToEnd();
                logFacturas.Info("Cliente:" + infCliente);
                ClienteJuridicoConsulta cliente = JsonConvert.DeserializeObject <ClienteJuridicoConsulta>(infCliente);

                using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.DBConexion))
                {
                    conn.Open();
                    string     qryFacturaEnc = @"SELECT fact.idContrato,Valtotal,ValDescuento,ValDescuentoT,ValPagos,ValImpuesto,ValCobrar,FecFactura,valPos,valNoPos,fact.IdUsuarioR,
usr.nom_usua,usr.NumDocumento,usr.IdTipoDoc,ter.NumDocumento,ter.IdTipoDoc,ter.NomTercero,ter.CodTercero,con.NomRepComercial,ter.IdTercero,ter.idRegimen,ter.IdNaturaleza  
FROM facFactura fact
INNER JOIN ASI_USUA usr ON fact.IdUsuarioR = usr.IdUsuario
INNER JOIN conContrato con ON fact.IdContrato=con.IdContrato
INNER JOIN genTercero ter ON con.IdTercero=ter.IdTercero
WHERE IdFactura =  @nroFactura";
                    SqlCommand cmdFacturaEnc = new SqlCommand(qryFacturaEnc, conn);
                    cmdFacturaEnc.Parameters.Add("@nroFactura", SqlDbType.Int).Value = nroFactura;
                    SqlDataReader rdFacturaEnc = cmdFacturaEnc.ExecuteReader();
                    if (rdFacturaEnc.HasRows)
                    {
                        rdFacturaEnc.Read();
                        _idContrato      = rdFacturaEnc.GetInt32(0);
                        _Valtotal        = Math.Round(rdFacturaEnc.GetDecimal(1), 2);
                        _ValDescuento    = Math.Round(rdFacturaEnc.GetDecimal(2), 2);
                        _ValDescuentoT   = Math.Round(rdFacturaEnc.GetDecimal(3), 2);
                        _ValPagos        = Math.Round(rdFacturaEnc.GetDecimal(4), 2);
                        _ValImpuesto     = Math.Round(rdFacturaEnc.GetDecimal(5), 2);
                        _ValCobrar       = Math.Round(rdFacturaEnc.GetDecimal(6), 2);
                        _FecFactura      = rdFacturaEnc.GetDateTime(7);
                        _valPos          = Math.Round(rdFacturaEnc.GetDecimal(8), 2);
                        _valNoPos        = Math.Round(rdFacturaEnc.GetDecimal(9), 2);
                        _IdUsuarioR      = rdFacturaEnc.GetInt32(10);
                        _usrNombre       = rdFacturaEnc.GetString(11);
                        _usrNumDocumento = rdFacturaEnc.GetString(12);
                        _usrIdTipoDoc    = rdFacturaEnc.GetByte(13);
                        _numDocCliente   = rdFacturaEnc.GetString(14);
                        _tipoDocCliente  = rdFacturaEnc.GetByte(15);
                        _razonSocial     = rdFacturaEnc.GetString(16);
                        _repLegal        = rdFacturaEnc.GetString(18);
                        _idTercero       = rdFacturaEnc.GetInt32(19);
                        _RegimenFiscal   = rdFacturaEnc.GetString(20);
                        _idNaturaleza    = rdFacturaEnc.GetInt16(21);
                    }
                    if (_ValPagos > 0)
                    {
                        string     Consultapagos    = "SELECT IdConcepto,Valor FROM facFacAtenConcepto WHERE IdFactura=@idFactura";
                        SqlCommand cmdConsultaPagos = new SqlCommand(Consultapagos, conn);
                        cmdConsultaPagos.Parameters.Add("@idfactura", SqlDbType.Int).Value = nroFactura;
                        SqlDataReader rdConsultapagos = cmdConsultaPagos.ExecuteReader();
                        if (rdConsultapagos.HasRows)
                        {
                            while (rdConsultapagos.Read())
                            {
                                AnticiposItem anticipoWrk = new AnticiposItem();
                                anticipoWrk.comprobante   = $"{rdConsultapagos.GetInt32(0)}-{nroFactura}";
                                anticipoWrk.valorAnticipo = double.Parse(rdConsultapagos.GetDouble(1).ToString());
                                anticiposWrk.Add(anticipoWrk);
                            }
                        }
                    }
                }
                string formatoWrk = formatosFecha.formatofecha(_FecFactura);
                facturaEnviar.fechaEmision = formatoWrk.Split('T')[0];
                facturaEnviar.horaEmision  = formatoWrk.Split('T')[1];
                facturaEnviar.moneda       = "COP";
                formaPagoTmp.tipoPago      = 1;
                formaPagoTmp.codigoMedio   = "10";
                facturaEnviar.formaPago    = formaPagoTmp;

                List <DetallesItem> detalleProductos = new List <DetallesItem>();
                //****************** CLIENTE
                //  Variables Inicializacion
                string _direccionCliente = string.Empty;
                string _telefonoCliente  = string.Empty;
                string _municipioCliente = string.Empty;
                string _departamento     = string.Empty;
                //int _localizacionCliente = 0;
                string _correoCliente = string.Empty;
                //****

                Adquiriente adquirienteTmp = new Adquiriente
                {
                    identificacion = cliente.NroDoc_Cliente,
                    codigoInterno  = cliente.IdTercero.ToString(),
                    razonSocial    = cliente.NomTercero,
                    nombreSucursal = cliente.NomTercero,
                    correo         = cliente.cuenta_correo.Trim().Split(';')[0],
                    telefono       = cliente.telefono
                };
                using (SqlConnection connXX = new SqlConnection(Properties.Settings.Default.DBConexion))
                {
                    connXX.Open();
                    string     qryTipoDocDian = "SELECT TipoDocDian FROM homologaTipoDocDian WHERE IdTipoDoc=@tipoDoc";
                    SqlCommand cmdTipoDocDian = new SqlCommand(qryTipoDocDian, connXX);
                    cmdTipoDocDian.Parameters.Add("@tipoDoc", SqlDbType.TinyInt).Value = cliente.TipoDoc_Cliente;
                    Int16 tipoDoc = Int16.Parse(cmdTipoDocDian.ExecuteScalar().ToString());
                    _tipoDocClienteDian = byte.Parse(tipoDoc.ToString());
                }
                adquirienteTmp.tipoIdentificacion = _tipoDocClienteDian;
                //if (_tipoDocCliente == 1)//TODO: validar la Homologacion para este campo
                //{
                //    adquirienteTmp.tipoIdentificacion = 31;
                //}
                //else if (_tipoDocCliente == 2)
                //{
                //    adquirienteTmp.tipoIdentificacion = 13;
                //}
                List <NotificacionesItem> notificaciones = new List <NotificacionesItem>();
                NotificacionesItem        notificaItem   = new NotificacionesItem();
                notificaItem.tipo = 1;
                List <string> valorNotificacion = new List <string>();
                valorNotificacion.Add(cliente.cuenta_correo.Trim());
                notificaItem.valor = valorNotificacion;
                notificaciones.Add(notificaItem);
                facturaEnviar.notificaciones = notificaciones;

                if (_RegimenFiscal.Equals("C"))
                {
                    adquirienteTmp.tipoRegimen = "48";
                }
                else
                {
                    adquirienteTmp.tipoRegimen = "49";
                }
                //TODO: Aqui insertar lo que se defina de Responsabilidades  RUT documentoF2.adquiriente.responsabilidadesRUT
                if (cliente.IdNaturaleza == 3)
                {
                    adquirienteTmp.tipoPersona = "1";
                }
                else if (cliente.IdNaturaleza == 4)
                {
                    adquirienteTmp.tipoPersona = "2";
                }
                else
                {
                    adquirienteTmp.tipoPersona = "0";
                }

                List <string> responsanbilidadesR = new List <string>();
                using (SqlConnection conexion01 = new SqlConnection(Properties.Settings.Default.DBConexion))
                {
                    conexion01.Open();
                    SqlCommand sqlValidaDet = new SqlCommand("spTerceroResponsabilidadRut", conexion01);
                    sqlValidaDet.CommandType = CommandType.StoredProcedure;
                    sqlValidaDet.Parameters.Add("@idtercero", SqlDbType.Int).Value = _idTercero;
                    SqlDataReader rdValidaDet = sqlValidaDet.ExecuteReader();
                    if (rdValidaDet.HasRows)
                    {
                        rdValidaDet.Read();
                        responsanbilidadesR.Add(rdValidaDet.GetString(0));
                    }
                    else
                    {
                        responsanbilidadesR.Add("R-99-PN");
                    }
                }

                adquirienteTmp.responsabilidadesRUT = responsanbilidadesR;

                Ubicacion ubicacionCliente = new Ubicacion();
                ubicacionCliente.pais            = cliente.codigoPais;
                ubicacionCliente.departamento    = cliente.Nombre_Depto;
                ubicacionCliente.codigoMunicipio = cliente.codMunicipio;
                ubicacionCliente.direccion       = cliente.direccion;
                if (!cliente.codigoPais.Equals("CO"))
                {
                    TRM tasaInf = new TRM();
                    tasaInf.valor         = 1;
                    tasaInf.monedaDestino = "COP";
                    tasaInf.fecha         = formatoWrk.Split('T')[0];
                    facturaEnviar.TRM     = tasaInf;
                }
                adquirienteTmp.ubicacion = ubicacionCliente;
                documentoF2.adquiriente  = adquirienteTmp;
                #region MyRegion

                //TODO:Definir Los pagos por Copago y Cuota Moderadora, si se envian como Anticipos y Abonos
                //TODO:Definir si aplica para algun caso. Cargos y Descuentos

                //List<TributosItem> tributosTMP = new List<TributosItem>();
                //List<DetalleTributos> tributosDetalle = new List<DetalleTributos>();
                //DetalleTributos detalleTributos = new DetalleTributos() // Un Objeto por cada Tipo de Iva
                //{
                //    valorImporte = 0,
                //    valorBase = 0,
                //    porcentaje = 0
                //};
                //tributosDetalle.Add(detalleTributos);
                //TributosItem itemTributo = new TributosItem()
                //{
                //    id = "01", //Total de Iva
                //    nombre = "Iva",
                //    esImpuesto = true,
                //    valorImporteTotal = 0,
                //    detalles = tributosDetalle // DEtalle de los Ivas
                //};
                //tributosTMP.Add(itemTributo);
                //documentoF2.tributos = tributosTMP;
                /////<summary>
                /////Inicio de Totales de la Factura
                ///// </summary>
                #endregion
                double TotalGravadoIva = 0;
                //double TotalGravadoIca = 0;
                //List<AnticiposItem> anticiposWrk = new List<AnticiposItem>();
                //AnticiposItem anticipoWrk = new AnticiposItem();
                //anticipoWrk.comprobante = "22";
                //anticipoWrk.valorAnticipo = double.Parse(_ValPagos.ToString());
                //anticiposWrk.Add(anticipoWrk);
                documentoF2.anticipos = anticiposWrk;

                //************************************************************ Detalle de Factura por Actividad ***********************************************************

                using (SqlConnection conexion01 = new SqlConnection(Properties.Settings.Default.DBConexion))
                {
                    string qryFactura = "SELECT IdFactura,NumFactura,IdDestino,IdTransaccion,IdPlan,IdContrato,ValTotal,ValDescuento,ValDescuentoT,ValPagos,ValImpuesto,ValCobrar,IndNotaCred,IndTipoFactura,CodEnti,CodEsor,FecFactura,Ruta,IdCausal,IdUsuarioR,IndHabilitado,IdNoFacturado,valPos,valNoPos FROM  facFactura WHERE idFactura=@idFactura AND idDestino=@idAtencion";
                    conexion01.Open();
                    SqlCommand cmdFactura = new SqlCommand(qryFactura, conexion01);
                    cmdFactura.Parameters.Add("@idFactura", SqlDbType.Int).Value  = nroFactura;
                    cmdFactura.Parameters.Add("@idAtencion", SqlDbType.Int).Value = nroAtencion;
                    SqlDataReader rdFactura = cmdFactura.ExecuteReader();
                    if (rdFactura.HasRows)
                    {
                        rdFactura.Read();
                        string strDetalleFac = @"SELECT isnull(h.NumAutorizacionInicial,'0')   AS Nro_Autorizacion,
upper(isnull(J.CodProMan,CASE ISNULL(f.REGCUM,'0') WHEN '0' THEN P.CodProducto ELSE F.REGCUM END )) as Cod_Servicio,
upper(( isnull(J.NomPRoman,P.NomProducto)) ) as Des_Servicio, f.Cantidad as Cantidad, f.ValTotal as Vlr_Unitario_Serv, 
isnull(AD.ValTotal,round(F.Cantidad*F.ValTotal,0)) as Vlr_Total_Serv,
a.IdFactura,F.IdProducto,p.codproducto,p.NomProducto,F.IdMovimiento,F.ValDescuento,F.CantidadFNC,F.IdTasaVenta,F.ValTasa,F.ValCuotaMod,F.indPos,F.Regcum, p.IdProductoTipo,
--dbo.unidadProducto (p.IdProducto,p.IdProductoTipo) as 'Unidad'
'Unidad' as 'Unidad',O.idOrden
FROM facfactura a
INNER JOIN  concontrato b on a.idcontrato=b.idcontrato
INNER JOIN  admatencion c on a.iddestino=c.idatencion
INNER JOIN  admcliente d on d.idcliente=c.idcliente
INNER JOIN  gentipodoc e on e.idtipodoc=d.idtipodoc
INNER JOIN  facfacturadet f on f.idfactura=a.idfactura
INNER JOIN facFacturaDetOrden O on f.idFactura=O.idFactura AND f.idProducto=O.idProducto AND f.idMovimiento=O.idMovimiento
LEFT JOIN facFacturaDetAjuDec AD ON AD.IdFactura = F.IdFactura and AD.IdProducto = F.IdProducto and AD.IdMovimiento = F.IdMovimiento
INNER JOIN  proproducto p on p.idproducto=f.idproducto AND p.IdProductoTipo not IN (8,12)
INNER JOIN  facmovimiento g on   g.idmovimiento=f.idmovimiento and g.iddestino=a.iddestino 
LEFT JOIN admatencioncontrato h on h.idatencion=a.iddestino and a.idcontrato=h.idcontrato and a.idplan=h.idplan and h.indhabilitado=1
LEFT JOIN contarifa i on i.idtarifa=b.idtarifa
LEFT JOIN conManualAltDet J ON J.IdProducto = F.IdProducto AND J.IndHabilitado = 1 AND J.IdManual = i.IdManual
WHERE a.IndTipoFactura='ACT' AND  a.idfactura= @idFactura ORDER BY A.IdFactura,o.Idorden";
                        //logFacturas.Info("consulta de Productos:" + strDetalleFac);
                        SqlCommand cmdDetalleFac = new SqlCommand(strDetalleFac, conexion01);
                        logFacturas.Info("Nro Factura:" + rdFactura.GetInt32(0));
                        cmdDetalleFac.Parameters.Add("@idFactura", SqlDbType.Int).Value = rdFactura.GetInt32(0);
                        SqlDataReader rdDetalleFac = cmdDetalleFac.ExecuteReader();
                        if (rdDetalleFac.HasRows)
                        {
                            Int16 nroLinea = 1;

                            while (rdDetalleFac.Read())
                            {
                                try
                                {
                                    List <TibutosDetalle> listaTributos = new List <TibutosDetalle>();
                                    DetallesItem          lineaProducto = new DetallesItem();
                                    // lineaProducto.Item=XXXXXXX CAmpo de consecutivo.
                                    lineaProducto.tipoDetalle = 1; // Linea Normal
                                    string codigoProducto = rdDetalleFac.GetString(1);
                                    lineaProducto.valorCodigoInterno = codigoProducto;
                                    if (rdDetalleFac.GetInt16(18) == 5 || rdDetalleFac.GetInt16(18) == 6)
                                    {
                                        lineaProducto.codigoEstandar = "999";
                                    }
                                    else
                                    {
                                        lineaProducto.codigoEstandar = "999";
                                    }
                                    lineaProducto.valorCodigoEstandar = codigoProducto;
                                    lineaProducto.descripcion         = rdDetalleFac.GetString(2);
                                    lineaProducto.unidades            = double.Parse(rdDetalleFac.GetDouble(3).ToString());
                                    lineaProducto.unidadMedida        = "94";// rdDetalleFac.GetString(19);
                                    lineaProducto.valorUnitarioBruto  = double.Parse(rdDetalleFac.GetDouble(4).ToString());
                                    lineaProducto.valorBruto          = double.Parse(rdDetalleFac.GetDouble(5).ToString());
                                    lineaProducto.valorBrutoMoneda    = "COP";

                                    TibutosDetalle tributosWRKIva = new TibutosDetalle();
                                    tributosWRKIva.id                      = "01";
                                    tributosWRKIva.nombre                  = "Iva";
                                    tributosWRKIva.esImpuesto              = true;
                                    tributosWRKIva.porcentaje              = 0;
                                    tributosWRKIva.valorBase               = double.Parse(rdDetalleFac.GetDouble(5).ToString());
                                    tributosWRKIva.valorImporte            = rdDetalleFac.GetDouble(5) * 0;
                                    TotalGravadoIva                        = TotalGravadoIva + rdDetalleFac.GetDouble(5);
                                    tributosWRKIva.tributoFijoUnidades     = 0;
                                    tributosWRKIva.tributoFijoValorImporte = 0;
                                    listaTributos.Add(tributosWRKIva);

                                    //TibutosDetalle tributosWRKIca = new TibutosDetalle();
                                    //tributosWRKIca.id = "02";
                                    //tributosWRKIca.nombre = "ICA";
                                    //tributosWRKIca.esImpuesto = true;
                                    //tributosWRKIca.porcentaje = 0;
                                    //tributosWRKIca.valorBase = double.Parse(rdDetalleFac.GetDouble(5).ToString());
                                    //tributosWRKIca.valorImporte = rdDetalleFac.GetDouble(5) * 0;
                                    //TotalGravadoIca = TotalGravadoIca + rdDetalleFac.GetDouble(5);
                                    //tributosWRKIca.tributoFijoUnidades = 0;
                                    //tributosWRKIca.tributoFijoValorImporte = 0;

                                    //listaTributos.Add(tributosWRKIca);
                                    lineaProducto.tributos = listaTributos;

                                    detalleProductos.Add(lineaProducto);
                                    nroLinea++;
                                }
                                catch (Exception sqlExp)
                                {
                                    string error = sqlExp.Message + "   " + sqlExp.StackTrace;
                                    throw;
                                }
                            }
                            logFacturas.Info("Numero de productos procesados" + nroLinea);
                        }
                        else // Si No  hay Detalle de Productos
                        {
                            logFacturas.Info("No se encontro Detalle de productos para la factura. " + strDetalleFac);
                        }
                    }
                    else // No se encuentra Informacion de la Factura y Atencion
                    {
                        logFacturas.Info("No se encontro Informacion de Factura y Atencion." + qryFactura);
                    }
                }
                documentoF2.detalles = detalleProductos;
                List <TributosItem>    tributosTMP     = new List <TributosItem>();
                List <DetalleTributos> tributosDetalle = new List <DetalleTributos>();
                DetalleTributos        detalleTributos = new DetalleTributos() // Un Objeto por cada Tipo de Iva
                {
                    valorImporte = 0,
                    valorBase    = TotalGravadoIva,
                    porcentaje   = 0
                };
                tributosDetalle.Add(detalleTributos);
                TributosItem itemTributo = new TributosItem()
                {
                    id                = "01", //Total de Iva
                    nombre            = "Iva",
                    esImpuesto        = true,
                    valorImporteTotal = 0,
                    detalles          = tributosDetalle // DEtalle de los Ivas
                };
                tributosTMP.Add(itemTributo);
                documentoF2.tributos = tributosTMP;
                ///<summary>
                ///Inicio de Totales de la Factura
                /// </summary>
                Totales totalesTmp = new Totales()
                {
                    valorBruto             = double.Parse(_Valtotal.ToString()),
                    valorAnticipos         = double.Parse(_ValPagos.ToString()),
                    valorTotalSinImpuestos = TotalGravadoIva,
                    valorTotalConImpuestos = double.Parse(_Valtotal.ToString()) + double.Parse(_ValImpuesto.ToString()),
                    valorNeto = double.Parse(_ValCobrar.ToString())
                };
                documentoF2.totales = totalesTmp;
                logFacturas.Info("Numero de Productos Procesados, para JSon:" + detalleProductos.Count);
                try
                {
                    //string urlConsumo = Properties.Settings.Default.urlFacturaElectronica + Properties.Settings.Default.recursoFacturaE;
                    string urlConsumo = Properties.Settings.Default.urlFacturaElectronica;// + Properties.Settings.Default.recursoFacturaE;
                    logFacturas.Info("URL de Request:" + urlConsumo);
                    HttpWebRequest request = WebRequest.Create(urlConsumo) as HttpWebRequest;
                    request.Timeout       = 30 * 1000;
                    documentoF2.documento = facturaEnviar;
                    string facturaJson = JsonConvert.SerializeObject(documentoF2);
                    logFacturas.Info("Json de la Factura:" + facturaJson);
                    request.Method      = "POST";
                    request.ContentType = "application/json";
                    string Usuario      = Properties.Settings.Default.usuario;
                    string Clave        = Properties.Settings.Default.clave;
                    string credenciales = Convert.ToBase64String(Encoding.ASCII.GetBytes(Usuario + ":" + Clave));
                    request.Headers.Add("Authorization", "Basic " + credenciales);

                    Byte[] data = Encoding.UTF8.GetBytes(facturaJson);

                    Stream st = request.GetRequestStream();
                    st.Write(data, 0, data.Length);
                    st.Close();

                    int loop1, loop2;
                    NameValueCollection valores;
                    valores = request.Headers;

                    // Pone todos los nombres en un Arreglo
                    string[] arr1 = valores.AllKeys;
                    for (loop1 = 0; loop1 < arr1.Length; loop1++)
                    {
                        logFacturas.Info("Key: " + arr1[loop1] + "<br>");
                        // Todos los valores
                        string[] arr2 = valores.GetValues(arr1[loop1]);
                        for (loop2 = 0; loop2 < arr2.Length; loop2++)
                        {
                            logFacturas.Info("Value " + loop2 + ": " + arr2[loop2]);
                        }
                    }

                    HttpWebResponse response = request.GetResponse() as HttpWebResponse;

                    logFacturas.Info("Codigo Status:" + response.StatusCode);
                    logFacturas.Info("Descripcion Status:" + response.StatusDescription);
                    StreamReader lectura = new StreamReader(response.GetResponseStream());
                    string       strsb   = lectura.ReadToEnd();
                    logFacturas.Info("Respuesta:" + strsb);
                    string valorRpta = "00";
                    RespuestaTransfiriendo respuesta = JsonConvert.DeserializeObject <RespuestaTransfiriendo>(strsb);
                    if (respuesta.esExitoso)
                    {
                        logFacturas.Info($"PDF:{respuesta.resultado.URLPDF}");
                        logFacturas.Info($"XML:{respuesta.resultado.URLXML}");
                        logFacturas.Info($"UUID:{ respuesta.resultado.UUID}");
                        logFacturas.Info($"QR:{respuesta.resultado.QR}");
                        using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.DBConexion))
                        {
                            conn.Open();
                            string     strActualiza = @"UPDATE dbo.facFacturaTempWEBService SET identificador=@identificador WHERE IdFactura=@nrofactura";
                            SqlCommand cmdActualiza = new SqlCommand(strActualiza, conn);
                            cmdActualiza.Parameters.Add("@identificador", SqlDbType.VarChar).Value = respuesta.resultado.UUID;
                            cmdActualiza.Parameters.Add("@nrofactura", SqlDbType.Int).Value        = nroFactura;
                            if (cmdActualiza.ExecuteNonQuery() > 0)
                            {
                                logFacturas.Info("Factura Actualizada con UUID en facFacturaTempWEBService");
                                using (WebClient webClient = new WebClient())
                                {
                                    try
                                    {
                                        string carpetaDescarga = Properties.Settings.Default.urlDescargaPdfFACT + DateTime.Now.Year + @"\" + respuesta.resultado.UUID + ".pdf";
                                        logFacturas.Info("Carpeta de Descarga:" + carpetaDescarga);
                                        webClient.DownloadFile(respuesta.resultado.URLPDF, carpetaDescarga);
                                        //System.Threading.Thread.Sleep(1000);
                                        logFacturas.Info($"Descarga de PDF Factura...Terminada");
                                        carpetaDescarga = Properties.Settings.Default.urlDescargaPdfFACT + DateTime.Now.Year + @"\" + respuesta.resultado.UUID + ".XML";
                                        webClient.DownloadFile(respuesta.resultado.URLXML, carpetaDescarga);
                                        //System.Threading.Thread.Sleep(1000);
                                        logFacturas.Info($"Descarga de XML...Terminada");
                                        using (SqlConnection conn3 = new SqlConnection(Properties.Settings.Default.DBConexion))
                                        {
                                            conn3.Open();
                                            string     qryActualizaTempWEBService = @"UPDATE dbo.facFacturaTempWEBService SET CodCUFE=@cufe,cadenaQR=@cadenaQR WHERE identificador=@identificador";
                                            SqlCommand cmdActualizaTempWEBService = new SqlCommand(qryActualizaTempWEBService, conn);
                                            cmdActualizaTempWEBService.Parameters.Add("@cufe", SqlDbType.VarChar).Value          = respuesta.resultado.UUID;
                                            cmdActualizaTempWEBService.Parameters.Add("@cadenaQR", SqlDbType.NVarChar).Value     = respuesta.resultado.QR;
                                            cmdActualizaTempWEBService.Parameters.Add("@identificador", SqlDbType.VarChar).Value = respuesta.resultado.UUID;
                                            if (cmdActualizaTempWEBService.ExecuteNonQuery() > 0)
                                            {
                                                logFacturas.Info("Descarga Existosa de Archivos de la Factura con Identificadotr:" + respuesta.resultado.UUID + " Destino:" + carpetaDescarga);

                                                if (!(respuesta.advertencias is null))
                                                {
                                                    string     qryAdvertencia         = @"INSERT INTO dbo.facFacturaTempWSAdvertencias(IdFactura,CodAdvertencia,FecRegistro,DescripcionAdv) 
VALUES(@IdFactura, @CodAdvertencia, @FecRegistro, @DescripcionAdv)";
                                                    SqlCommand cmdInsertarAdvertencia = new SqlCommand(qryAdvertencia, conn);
                                                    cmdInsertarAdvertencia.Parameters.Add("@IdFactura", SqlDbType.Int);
                                                    cmdInsertarAdvertencia.Parameters.Add("@CodAdvertencia", SqlDbType.VarChar);
                                                    cmdInsertarAdvertencia.Parameters.Add("@DescripcionAdv", SqlDbType.NVarChar);
                                                    cmdInsertarAdvertencia.Parameters.Add("@FecRegistro", SqlDbType.DateTime);
                                                    foreach (AdvertenciasItem itemAdv in respuesta.advertencias)
                                                    {
                                                        cmdInsertarAdvertencia.Parameters["@IdFactura"].Value      = nroFactura;
                                                        cmdInsertarAdvertencia.Parameters["@CodAdvertencia"].Value = itemAdv.codigo;
                                                        //cmdInsertarAdvertencia.Parameters["@consecutivo"].Value = consecutivo;
                                                        cmdInsertarAdvertencia.Parameters["@FecRegistro"].Value    = DateTime.Now;
                                                        cmdInsertarAdvertencia.Parameters["@DescripcionAdv"].Value = itemAdv.mensaje;
                                                        if (cmdInsertarAdvertencia.ExecuteNonQuery() > 0)
                                                        {
                                                            logFacturas.Info($"Se Inserta Detalle de Advertencias: Codigo Advertencia{itemAdv.codigo} Mensaje Advertencia:{itemAdv.mensaje}");
                                                            valorRpta = nroFactura.ToString();
                                                        }
                                                        else
                                                        {
                                                            logFacturas.Info($"No es Posible Insertar Detalle de Advertencias: Codigo Advertencia{itemAdv.codigo} Mensaje Advertencia:{itemAdv.mensaje}");
                                                            valorRpta = nroFactura.ToString();
                                                        }
                                                    }
                                                }
                                                else
                                                {
                                                    logFacturas.Info($"No existen advertencias de DIAN !!! factura{nroFactura}");
                                                    valorRpta = nroFactura.ToString();
                                                }
                                                valorRpta = nroFactura.ToString();
                                            }
                                            else
                                            {
                                                logFacturas.Info("No fue Posible Realizar la Descarga de Archivos de la Factura con Identificadotr:" + respuesta.resultado.UUID);
                                            }
                                        }
                                    }
                                    catch (NotSupportedException nSuppExp)
                                    {
                                        logFacturas.Info("Se ha presentado una NotSupportedException durante la descarga de los objetos de la Factura:" + nSuppExp.Message + "     " + nSuppExp.InnerException.Message);
                                        valorRpta = "9X";
                                    }
                                    catch (ArgumentNullException argNull)
                                    {
                                        logFacturas.Info("Se ha presentado una ArgumentNullException durante la descarga de los objetos de la Factura:" + argNull.Message + "     " + argNull.InnerException.Message);
                                        valorRpta = "9X";
                                    }
                                    catch (WebException webEx1)
                                    {
                                        logFacturas.Info("Se ha presentado una Falla durante la descarga de los objetos de la factura:" + webEx1.Message + "     " + webEx1.InnerException.Message);
                                        logFacturas.Warn($"Pila de Mensajes:::::{webEx1.StackTrace}");
                                        valorRpta = "93";
                                    }
                                    catch (Exception exx)
                                    {
                                        logFacturas.Info($"No fue posible descargar los archivos.PDF, XML y QR  !!! Causa:{exx.Message}  Pila:{exx.StackTrace}");
                                        valorRpta = "98";
                                    }
                                }
                            }
        /// <summary>
        /// /Nota Credito Internacional. Con Iva. Monesa Extranjera y COP.
        /// </summary>
        /// <param name="nroNotaCredito"></param>
        /// <param name="idCliente"></param>
        /// <param name="nroAtencion"></param>
        /// <param name="monedaNota"></param>
        /// <param name="nroFactura"></param>
        /// <param name="urlPdfNotaCredito"></param>
        /// <returns></returns>
        public string getData(int nroNotaCredito, int idCliente, int nroAtencion, string monedaNota, int nroFactura, string urlPdfNotaCredito)
        {
            logFacturas.Info("Se recibe Nota Credito con siguientes datos:nroNota:" + nroNotaCredito + "  IdCliente:" + idCliente + " nroAtencion:" + nroAtencion + " urlPdf:" + urlPdfNotaCredito);
            try
            {
                #region inicializar
                Decimal  _Valtotal           = 0;
                Decimal  _ValPagos           = 0;
                Decimal  _ValCobrar          = 0;
                DateTime _FecNotaCredito     = DateTime.Now;
                Int32    _idMovimiento       = 0;
                Int32    _idTercero          = 0;
                Int32    _facturaRelacionada = 0;
                string   _repLegal           = string.Empty;
                string   DescNota            = string.Empty;
                Int16    _codigoCausal       = 0;
                Int32    _tipoDocClienteDian = 0;
                double   _valorImporteIva    = 0;
                double   _porcentajeIva      = 0;
                double   _totalBruto         = 0;
                double   _totalSinImpto      = 0;
                double   _totalConImpto      = 0;
                double   _valorNeto          = 0;
                #endregion

                //Fin de Inicializacion
                documentoRoot documentoF2       = new documentoRoot();
                Documento     NotaCreditoEnviar = new Documento();
                NotaCreditoEnviar.identificadorTransaccion = "D7F719C2 - 75F4 - 4F06 - B7CB - F583FC28DBEE";
                NotaCreditoEnviar.URLPDF                      = urlPdfNotaCredito;
                NotaCreditoEnviar.NITFacturador               = Properties.Settings.Default.NitHusi;
                NotaCreditoEnviar.prefijo                     = Properties.Settings.Default.PrefijoNotasNC;
                NotaCreditoEnviar.numeroDocumento             = nroNotaCredito.ToString();
                NotaCreditoEnviar.tipoDocumento               = 2;
                NotaCreditoEnviar.subTipoDocumento            = "91";
                NotaCreditoEnviar.tipoOperacion               = "10"; //Standar
                NotaCreditoEnviar.generaRepresentacionGrafica = false;

                bool facXRel = false;
                using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.DBConexion))
                {
                    conn.Open();
                    string     qryEspeciales = "SELECT IdDestino,IndTipoFactura FROM facFactura where IdFactura=@idFactura";
                    SqlCommand cmdEspeciales = new SqlCommand(qryEspeciales, conn);
                    cmdEspeciales.Parameters.Add("@idFactura", SqlDbType.Int).Value = nroFactura;
                    SqlDataReader rdEspeciales = cmdEspeciales.ExecuteReader();
                    if (rdEspeciales.HasRows)
                    {
                        if (rdEspeciales.Read())
                        {
                            if (rdEspeciales.GetInt32(0) == 0 && rdEspeciales.GetString(1) == "RAC")
                            {
                                facXRel = true;
                            }
                        }
                    }
                }
                string urlClientes = string.Empty;
                if (idCliente == 0 && nroAtencion == 0 && !facXRel)
                {
                    urlClientes = $"{Properties.Settings.Default.urlServicioClientes}ClienteInternacional?idFactura={nroFactura}";
                }
                else
                {
                    urlClientes = $"{Properties.Settings.Default.urlServicioClientes}ClienteJuridico?idFactura={nroFactura}";
                }
                logFacturas.Info("URL de Request:" + urlClientes);
                HttpWebRequest peticion = WebRequest.Create(urlClientes) as HttpWebRequest;
                peticion.Method      = "GET";
                peticion.ContentType = "application/json";
                HttpWebResponse respuestaClientes = peticion.GetResponse() as HttpWebResponse;
                StreamReader    sr         = new StreamReader(respuestaClientes.GetResponseStream());
                string          infCliente = sr.ReadToEnd();
                logFacturas.Info("Cliente:" + infCliente);
                Cliente cliente = JsonConvert.DeserializeObject <Cliente>(infCliente);


                //****************** CLIENTE
                //  Variables Inicializacion
                string _direccionCliente = string.Empty;
                string _telefonoCliente  = string.Empty;
                string _municipioCliente = string.Empty;
                string _departamento     = string.Empty;
                //int _localizacionCliente = 0;
                string _correoCliente = string.Empty;
                //****
                string codCufeFactura = string.Empty;
                List <DetallesItem> detalleProductos = new List <DetallesItem>();
                using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.DBConexion))
                {
                    conn.Open();
                    //string codCufeFact = "SELECT CodCUFE FROM facFacturaTempWEBService WHERE IdFactura=@idFactura";
                    string     qrycodCufeFact = @"SELECT CodCufe FROM facFacturaTempWEBService
WHERE idFactura = @idFactura
UNION
SELECT CodCufe FROM facFacturaTempWEBServiceHist
WHERE idFactura = @idFactura";
                    SqlCommand cmdCodCufe     = new SqlCommand(qrycodCufeFact, conn);
                    cmdCodCufe.Parameters.Add("@idFactura", SqlDbType.Int).Value = nroFactura;
                    SqlDataReader rdCufe = cmdCodCufe.ExecuteReader();
                    if (rdCufe.HasRows)
                    {
                        rdCufe.Read();
                        codCufeFactura = rdCufe.GetString(0);
                    }
                    else
                    {
                        List <ErroresItem> detalle = new List <ErroresItem>();
                        ErroresItem        item    = new ErroresItem();
                        item.codigo  = "990102";
                        item.mensaje = "No se ha encontrado el CUFE, para la Factura afectada con esta  Nota Credito. CUFE de Factura NO existe. Revisar SAHI";
                        detalle.Add(item);
                        return(UtilidadRespuestas.insertarErrorND("NC", nroNotaCredito, "9901", "CUFE de la FacturaRelacionada No Encontado", DateTime.Now, detalle));
                    }
                    string     qryNotaCredito = @"SELECT B.IdCuenta,B.NumDocumento,B.IdCausal,B.fecMovimiento,B.FecRegistro,B.ValMonto,C.PorcentajeIVA,C.ValMontoIVA,C.FechaTRM,C.ValorTRM,
cxcCta.IdCuenta,cxcCta.IdTercero,cxcCta.IdCliente,cxcCta.NomCliente,cxcCta.IdTipoDocCliente,cxcCta.NumDocumento,cxcCta.NumDocRespaldo,cxcCta.ValFactura,
B.IdMovimiento,6 as 'Causal'
 FROM cxcTipoMovimientoEfectoNotas A
INNER JOIN cxcCarteraMovi B ON A.IdTipoMovimiento=B.IdTipoMovimiento
INNER JOIN cxcCuenta cxcCta ON cxcCta.IdCuenta=B.IdCuenta
INNER JOIN cxcCarteraMoviNoNota C ON B.IdMovimiento=C.IdMovimiento
WHERE A.Indhabilitado=1 AND C.IdNumeroNota=@nroNotaCredito AND A.IndTipoNota='C' AND ISNULL(C.ValorTRM,0)=0

UNION

SELECT B.IdCuenta,B.NumDocumento,B.IdCausal,B.fecMovimiento,B.FecRegistro,c.ValMontoInte,c.PorcentajeIVA,c.ValMontoIVAInte,c.FechaTRM,c.ValorTRM,
cxcCta.IdCuenta,cxcCta.IdTercero,cxcCta.IdCliente,cxcCta.NomCliente,cxcCta.IdTipoDocCliente,cxcCta.NumDocumento,cxcCta.NumDocRespaldo,cxcCta.ValFactura,
B.IdMovimiento,6 as 'Causal'
 FROM cxcTipoMovimientoEfectoNotas A
INNER JOIN cxcCarteraMovi B ON A.IdTipoMovimiento=B.IdTipoMovimiento
INNER JOIN cxcCuenta cxcCta ON cxcCta.IdCuenta=B.IdCuenta
INNER JOIN cxcCarteraMoviNoNota C ON B.IdMovimiento=C.IdMovimiento
WHERE A.Indhabilitado=1 and C.IdNumeroNota=@nroNotaCredito and A.IndTipoNota='C' AND ISNULL(C.ValorTRM,0)>0";
                    SqlCommand cmdNotaCredito = new SqlCommand(qryNotaCredito, conn);
                    cmdNotaCredito.Parameters.Add("@nroNotaCredito", SqlDbType.VarChar).Value = nroNotaCredito;
                    SqlDataReader rdNotaCredito = cmdNotaCredito.ExecuteReader();
                    if (rdNotaCredito.HasRows)
                    {
                        rdNotaCredito.Read();
                        _idMovimiento = rdNotaCredito.GetInt32(18);
                        var valorTNota = rdNotaCredito["ValMonto"];
                        _Valtotal           = Decimal.Parse(valorTNota.ToString());
                        _ValCobrar          = Decimal.Parse(valorTNota.ToString());
                        _FecNotaCredito     = rdNotaCredito.GetDateTime(3);
                        _facturaRelacionada = nroFactura;
                        _idTercero          = cliente.IdTercero;
                        _codigoCausal       = short.Parse(rdNotaCredito.GetInt32(19).ToString());
                    }
                    else
                    {
                        List <ErroresItem> detalle = new List <ErroresItem>();
                        ErroresItem        item    = new ErroresItem();
                        item.codigo  = "990101";
                        item.mensaje = "No hay informacion disponible de la Nota Credito, para obtener informacion necesaria. La Nota NO existe. Revisar SAHI";
                        detalle.Add(item);
                        return(UtilidadRespuestas.insertarErrorND("NC", nroNotaCredito, "9901", "Informacion de la Nota Credito No Encontada", DateTime.Now, detalle));
                    }
                    FormaPago formaPagoTmp = new FormaPago();
                    string    formatoWrk   = formatosFecha.formatofecha(_FecNotaCredito);
                    NotaCreditoEnviar.fechaEmision = formatoWrk.Split('T')[0];
                    NotaCreditoEnviar.horaEmision  = formatoWrk.Split('T')[1];
                    NotaCreditoEnviar.moneda       = monedaNota;
                    formaPagoTmp.tipoPago          = 1;
                    formaPagoTmp.codigoMedio       = "10";
                    NotaCreditoEnviar.formaPago    = formaPagoTmp;

                    Adquiriente adquirienteTmp = new Adquiriente();

                    using (SqlConnection connXX = new SqlConnection(Properties.Settings.Default.DBConexion))
                    {
                        connXX.Open();
                        string     qryTipoDocDian = "SELECT TipoDocDian FROM homologaTipoDocDian WHERE IdTipoDoc=@tipoDoc";
                        SqlCommand cmdTipoDocDian = new SqlCommand(qryTipoDocDian, connXX);
                        cmdTipoDocDian.Parameters.Add("@tipoDoc", SqlDbType.TinyInt).Value = cliente.TipoDoc_Cliente;
                        logFacturas.Info($" cliente.TipoDoc_Cliente:{ cliente.TipoDoc_Cliente}");
                        Int16 tipoDoc = Int16.Parse(cmdTipoDocDian.ExecuteScalar().ToString());
                        _tipoDocClienteDian = Int32.Parse(tipoDoc.ToString());
                        logFacturas.Info($"_tipoDocClienteDian:{_tipoDocClienteDian}");
                    }
                    adquirienteTmp.tipoIdentificacion = _tipoDocClienteDian;
                    adquirienteTmp.identificacion     = cliente.NroDoc_Cliente;
                    adquirienteTmp.codigoInterno      = cliente.IdTercero.ToString();
                    adquirienteTmp.razonSocial        = cliente.NomTercero;
                    adquirienteTmp.nombreSucursal     = cliente.NomTercero;
                    adquirienteTmp.correo             = cliente.cuenta_correo.Trim().Split(';')[0];
                    if (cliente.telefono.Length > 10)
                    {
                        cliente.telefono = cliente.telefono.Substring(0, 10);
                    }
                    adquirienteTmp.telefono = cliente.telefono;
                    if (cliente.idRegimen.Equals("C"))
                    {
                        adquirienteTmp.tipoRegimen = "48";
                    }
                    else
                    {
                        adquirienteTmp.tipoRegimen = "49";
                    }
                    List <NotificacionesItem> notificaciones = new List <NotificacionesItem>();
                    NotificacionesItem        notificaItem   = new NotificacionesItem();
                    notificaItem.tipo = 1;
                    List <string> valorNotificacion = new List <string>();
                    valorNotificacion.Add(cliente.cuenta_correo.Trim());
                    notificaItem.valor = valorNotificacion;
                    notificaciones.Add(notificaItem);
                    NotaCreditoEnviar.notificaciones = notificaciones;
                    //TODO: Aqui insertar lo que se defina de Responsabilidades  RUT documentoF2.adquiriente.responsabilidadesRUT
                    if (cliente.IdNaturaleza == 3)
                    {
                        adquirienteTmp.tipoPersona = "1";
                    }
                    else if (cliente.IdNaturaleza == 4)
                    {
                        adquirienteTmp.tipoPersona = "2";
                    }
                    else
                    {
                        adquirienteTmp.tipoPersona = "0";
                    }
                    List <string> responsanbilidadesR = new List <string>();
                    using (SqlConnection conexion01 = new SqlConnection(Properties.Settings.Default.DBConexion))
                    {
                        conexion01.Open();
                        SqlCommand sqlValidaDet = new SqlCommand("spTerceroResponsabilidadRut", conexion01);
                        sqlValidaDet.CommandType = CommandType.StoredProcedure;
                        sqlValidaDet.Parameters.Add("@idtercero", SqlDbType.Int).Value = _idTercero;
                        SqlDataReader rdValidaDet = sqlValidaDet.ExecuteReader();
                        if (rdValidaDet.HasRows)
                        {
                            rdValidaDet.Read();
                            responsanbilidadesR.Add(rdValidaDet.GetString(0));
                        }
                        else
                        {
                            responsanbilidadesR.Add("R-99-PN");
                        }
                        SqlCommand sqlValidaFactura = new SqlCommand("spFACEIdentificadorTipoOperaNota", conexion01);
                        sqlValidaFactura.CommandType = CommandType.StoredProcedure;
                        sqlValidaFactura.Parameters.Add("@idFactura", SqlDbType.Int).Value = nroFactura;
                        SqlDataReader rdValidaFactura = sqlValidaFactura.ExecuteReader();
                        if (rdValidaFactura.HasRows)
                        {
                            rdValidaFactura.Read();
                            if (rdValidaFactura.GetInt32(0) == 0)
                            {
                                NotaCreditoEnviar.tipoOperacion = "10"; //Standar
                            }
                            else
                            {
                                NotaCreditoEnviar.tipoOperacion = "22"; //Standar
                            }
                        }
                        else
                        {
                            logFacturas.Error($"No hay Datos de Factura, para la Factura:{nroFactura}");
                        }
                    }

                    adquirienteTmp.responsabilidadesRUT = responsanbilidadesR;
                    Ubicacion ubicacionCliente = new Ubicacion();
                    ubicacionCliente.pais         = cliente.codigoPais;
                    ubicacionCliente.departamento = cliente.Nombre_Depto;
                    //ubicacionCliente.codigoMunicipio = cliente.codMunicipio;
                    if (cliente.codigoPais == "CO")
                    {
                        ubicacionCliente.codigoMunicipio = cliente.codMunicipio;// "00000"; // se ajusta para factura 6180330 Cliente Internacional
                    }
                    else
                    {
                        ubicacionCliente.codigoMunicipio = "00000";
                    }
                    ubicacionCliente.direccion = cliente.direccion;
                    adquirienteTmp.ubicacion   = ubicacionCliente;
                    documentoF2.adquiriente    = adquirienteTmp;
                    double TotalGravadoIva = 0;
                    //double TotalGravadoIca = 0;

                    //************************************************************ Detalle de Nota Credito   ***********************************************************
                    using (SqlConnection conexion01 = new SqlConnection(Properties.Settings.Default.DBConexion))
                    {
                        conexion01.Open();
                        try
                        {
                            SqlCommand sqlValidaDet = new SqlCommand("spTraeDetalleNotasIVAMonExt", conexion01);
                            sqlValidaDet.CommandType = CommandType.StoredProcedure;
                            sqlValidaDet.Parameters.Add("@idNota", SqlDbType.Int).Value = nroNotaCredito;
                            SqlDataReader rdValidaDet = sqlValidaDet.ExecuteReader();
                            if (rdValidaDet.HasRows)
                            {
                                while (rdValidaDet.Read())
                                {
                                    List <TibutosDetalle> listaTributos = new List <TibutosDetalle>();
                                    DetallesItem          lineaProducto = new DetallesItem();
                                    lineaProducto.tipoDetalle = 1; // Linea Normal
                                    string codigoProducto = rdValidaDet.GetString(0);
                                    lineaProducto.valorCodigoInterno  = codigoProducto;
                                    lineaProducto.codigoEstandar      = "999";
                                    lineaProducto.valorCodigoEstandar = codigoProducto;
                                    lineaProducto.descripcion         = rdValidaDet.GetString(1);
                                    lineaProducto.unidades            = double.Parse(rdValidaDet.GetInt32(2).ToString()); //Siempre es uno por definicion
                                    lineaProducto.unidadMedida        = "94";                                             // rdDetalleFac.GetString(19);
                                    lineaProducto.valorUnitarioBruto  = double.Parse(rdValidaDet.GetDecimal(3).ToString());
                                    _totalSinImpto           = double.Parse(rdValidaDet.GetDecimal(3).ToString());
                                    lineaProducto.valorBruto = double.Parse(rdValidaDet.GetDecimal(3).ToString());
                                    _totalBruto    = double.Parse(rdValidaDet.GetDecimal(3).ToString());
                                    _totalConImpto = double.Parse(rdValidaDet.GetDecimal(4).ToString());
                                    _valorNeto     = double.Parse(rdValidaDet.GetDecimal(4).ToString());
                                    lineaProducto.valorBrutoMoneda = monedaNota;

                                    TibutosDetalle tributosWRKIva = new TibutosDetalle();
                                    tributosWRKIva.id                      = "01";
                                    tributosWRKIva.nombre                  = "Iva";
                                    tributosWRKIva.esImpuesto              = true;
                                    tributosWRKIva.porcentaje              = double.Parse(rdValidaDet.GetDecimal(9).ToString()); //********************************
                                    _porcentajeIva                         = double.Parse(rdValidaDet.GetDecimal(9).ToString());
                                    tributosWRKIva.valorBase               = double.Parse(rdValidaDet.GetDecimal(3).ToString());
                                    tributosWRKIva.valorImporte            = double.Parse(rdValidaDet.GetDecimal(8).ToString());
                                    _valorImporteIva                       = double.Parse(rdValidaDet.GetDecimal(8).ToString());
                                    TotalGravadoIva                        = TotalGravadoIva + double.Parse(rdValidaDet.GetDecimal(3).ToString());
                                    tributosWRKIva.tributoFijoUnidades     = 0;
                                    tributosWRKIva.tributoFijoValorImporte = 0;
                                    listaTributos.Add(tributosWRKIva);
                                    lineaProducto.tributos = listaTributos;
                                    detalleProductos.Add(lineaProducto);
                                }
                            }
                            else
                            {
                                string     qryTipoNota = @"SELECT IdMovimiento,NumDocumento,DesMovimiento,b.IdTipoHomologoDian from cxccarteramovi a
inner join CXCTIPOMOVIMIENTOEFECTONOTAS b on a.idtipomovimiento=b.idtipomovimiento and b.indhabilitado=1
WHERE a.IdMovimiento=@idMovimiento";
                                SqlCommand cmdTipoNota = new SqlCommand(qryTipoNota, conexion01);
                                cmdTipoNota.Parameters.Add("@idMovimiento", SqlDbType.Int).Value = _idMovimiento;
                                SqlDataReader rdTipoNota = cmdTipoNota.ExecuteReader();
                                if (rdTipoNota.HasRows)
                                {
                                    rdTipoNota.Read();
                                    DescNota = rdTipoNota.GetString(2);
                                    DetallesItem lineaProducto = new DetallesItem();
                                    lineaProducto.tipoDetalle = 1; // Linea Normal
                                    string codigoProducto = "NC1";
                                    lineaProducto.valorCodigoInterno  = codigoProducto;
                                    lineaProducto.codigoEstandar      = "999";
                                    lineaProducto.valorCodigoEstandar = codigoProducto;
                                    lineaProducto.descripcion         = DescNota;
                                    lineaProducto.unidades            = 1;    // double.Parse(rdValidaDet.GetInt32(2).ToString());
                                    lineaProducto.unidadMedida        = "94"; // rdDetalleFac.GetString(19);
                                    lineaProducto.valorUnitarioBruto  = double.Parse(_Valtotal.ToString());
                                    lineaProducto.valorBruto          = double.Parse(_Valtotal.ToString());
                                    lineaProducto.valorBrutoMoneda    = monedaNota;
                                    detalleProductos.Add(lineaProducto);
                                }
                            }
                        }
                        catch (Exception sqlExp)
                        {
                            string errorSQL = sqlExp.Message + "     " + sqlExp.StackTrace;
                            logFacturas.Warn("Se ha presentado una excepcion de SQL" + errorSQL);
                            throw;
                        }
                    }
                    string ObservacionesNota = string.Empty;
                    string qryObservaciones  = @"SELECT Top 1 isnull(b.NomCausal, A.DesMovimiento) Observacion FROM cxcCarteraMovi A
LEFT JOIN genCausal B ON A.IdCausal = B.IdCausal
WHERE IdMovimiento = @idMovimiento";
                    using (SqlCommand cmdObservaciones = new SqlCommand(qryObservaciones, conn))
                    {
                        cmdObservaciones.Parameters.Add("@idMovimiento", SqlDbType.Int).Value = _idMovimiento;
                        SqlDataReader rdObservaciones = cmdObservaciones.ExecuteReader();
                        if (rdObservaciones.HasRows)
                        {
                            rdObservaciones.Read();
                            ObservacionesNota = rdObservaciones.GetString(0);
                        }
                        else
                        {
                            if (_codigoCausal == 6)
                            {
                                ObservacionesNota = $"Nota Credito por Concepto de Otros Motivos No codificados Factura{nroFactura} ";
                            }
                            else if (_codigoCausal == 2)
                            {
                                ObservacionesNota = $"Anulacion de Factura:{nroFactura}";
                            }
                        }
                    }
                    DocumentosAfectadosItem itemAfectado = new DocumentosAfectadosItem();
                    itemAfectado.numeroDocumento = $"{Properties.Settings.Default.Prefijo}-{_facturaRelacionada.ToString()}"; //todo: Ingresar el nro de Factura o Nota;
                    itemAfectado.UUID            = codCufeFactura;                                                            //todo:Ingresar el UUID del Docuemtno afectado
                    itemAfectado.codigoCausal    = _codigoCausal;
                    //itemAfectado.fecha = formatosFecha.formatofecha(DateTime.Now); //todo: registrar fechz de la factura o Nota afectada
                    List <string> observaciones = new List <string>();
                    observaciones.Add(ObservacionesNota);
                    itemAfectado.observaciones = observaciones;
                    List <DocumentosAfectadosItem> DocumentosAfectados = new List <DocumentosAfectadosItem>();
                    DocumentosAfectados.Add(itemAfectado);
                    NotaCreditoEnviar.documentosAfectados = DocumentosAfectados;
                    documentoF2.detalles = detalleProductos;
                    List <TributosItem>    tributosTMP     = new List <TributosItem>();
                    List <DetalleTributos> tributosDetalle = new List <DetalleTributos>();
                    DetalleTributos        detalleTributos = new DetalleTributos() // Un Objeto por cada Tipo de Iva
                    {
                        valorImporte = _valorImporteIva,
                        valorBase    = TotalGravadoIva,
                        porcentaje   = _porcentajeIva
                    };
                    tributosDetalle.Add(detalleTributos);
                    TributosItem itemTributo = new TributosItem()
                    {
                        id                = "01", //Total de Iva
                        nombre            = "Iva",
                        esImpuesto        = true,
                        valorImporteTotal = _valorImporteIva,
                        detalles          = tributosDetalle // Detalle de los Ivas
                    };
                    tributosTMP.Add(itemTributo);
                    documentoF2.tributos = tributosTMP;
                    ///<summary>
                    ///Inicio de Totales de la Factura
                    /// </summary>
                    Totales totalesTmp = new Totales()
                    {
                        valorBruto             = _totalBruto,
                        valorAnticipos         = double.Parse(_ValPagos.ToString()),
                        valorTotalSinImpuestos = _totalSinImpto,
                        valorTotalConImpuestos = _totalConImpto,// + double.Parse(_ValImpuesto.ToString()),
                        valorNeto = _valorNeto
                    };
                    documentoF2.totales = totalesTmp;
                    logFacturas.Info("Numero de Productos Procesados, para JSon:" + detalleProductos.Count);
                    try
                    {
                        //string urlConsumo = Properties.Settings.Default.urlFacturaElectronica + Properties.Settings.Default.recursoFacturaE;
                        string urlConsumo = Properties.Settings.Default.urlFacturaElectronica;// + Properties.Settings.Default.recursoFacturaE;
                        logFacturas.Info("URL de Request:" + urlConsumo);
                        HttpWebRequest request = WebRequest.Create(urlConsumo) as HttpWebRequest;
                        //request.Timeout = 60 * 1000;
                        documentoF2.documento = NotaCreditoEnviar;
                        string NotaCreditoJson = JsonConvert.SerializeObject(documentoF2);
                        logFacturas.Info("Json de la Nota Credito::" + NotaCreditoJson);
                        request.Method      = "POST";
                        request.ContentType = "application/json";
                        string Usuario      = Properties.Settings.Default.usuario;
                        string Clave        = Properties.Settings.Default.clave;
                        string credenciales = Convert.ToBase64String(Encoding.ASCII.GetBytes(Usuario + ":" + Clave));
                        request.Headers.Add("Authorization", "Basic " + credenciales);
                        Byte[] data = Encoding.UTF8.GetBytes(NotaCreditoJson);
                        Stream st   = request.GetRequestStream();
                        st.Write(data, 0, data.Length);
                        st.Close();
                        int loop1, loop2;
                        NameValueCollection valores;
                        valores = request.Headers;

                        // Pone todos los nombres en un Arreglo
                        string[] arr1 = valores.AllKeys;
                        for (loop1 = 0; loop1 < arr1.Length; loop1++)
                        {
                            logFacturas.Info("Key: " + arr1[loop1] + "<br>");
                            // Todos los valores
                            string[] arr2 = valores.GetValues(arr1[loop1]);
                            for (loop2 = 0; loop2 < arr2.Length; loop2++)
                            {
                                logFacturas.Info("Value " + loop2 + ": " + arr2[loop2]);
                            }
                        }
                        HttpWebResponse response = request.GetResponse() as HttpWebResponse;
                        logFacturas.Info("Codigo Status:" + response.StatusCode);
                        logFacturas.Info("Descripcion Status:" + response.StatusDescription);
                        StreamReader lecturaDatos   = new StreamReader(response.GetResponseStream());
                        string       datosRespuesta = lecturaDatos.ReadToEnd();
                        logFacturas.Info("Respuesta:" + datosRespuesta);
                        string valorRpta = "00";
                        RespuestaTransfiriendo respuesta = JsonConvert.DeserializeObject <RespuestaTransfiriendo>(datosRespuesta);
                        if (respuesta.esExitoso)
                        {
                            logFacturas.Info($"PDF:{respuesta.resultado.URLPDF}");
                            logFacturas.Info($"XML:{respuesta.resultado.URLXML}");
                            logFacturas.Info($"UUID:{ respuesta.resultado.UUID}");
                            logFacturas.Info($"QR:{respuesta.resultado.QR}");
                            using (SqlConnection connUpdate = new SqlConnection(Properties.Settings.Default.DBConexion))
                            {
                                connUpdate.Open();
                                string     strActualiza = @"UPDATE dbo.facNotaTempWEBService SET identificador=@identificador WHERE IdNota=@nroNota AND IdTipoNota=@idTipoNota";
                                SqlCommand cmdActualiza = new SqlCommand(strActualiza, connUpdate);
                                cmdActualiza.Parameters.Add("@identificador", SqlDbType.VarChar).Value = respuesta.resultado.UUID;
                                cmdActualiza.Parameters.Add("@nroNota", SqlDbType.Int).Value           = nroNotaCredito;
                                cmdActualiza.Parameters.Add("@idTipoNota", SqlDbType.VarChar).Value    = "NC";

                                if (cmdActualiza.ExecuteNonQuery() > 0)
                                {
                                    logFacturas.Info("Nota Credito Actualizada con UUID en facNotaTempWEBService");
                                    using (WebClient webClient = new WebClient())
                                    {
                                        try
                                        {
                                            //string carpetaDescarga = Properties.Settings.Default.urlDescargaPdfFACT + DateTime.Now.Year + @"\" + respuesta.resultado.UUID + ".pdf";
                                            string carpetaDescarga = Properties.Settings.Default.urlDescargaPdfNC + DateTime.Now.Year + @"\" + respuesta.resultado.UUID + ".pdf";
                                            logFacturas.Info("Carpeta de Descarga:" + carpetaDescarga);
                                            webClient.DownloadFile(respuesta.resultado.URLPDF, carpetaDescarga);
                                            //System.Threading.Thread.Sleep(1000);
                                            logFacturas.Info($"Descarga de PDF Nota Credito...Terminada en: {carpetaDescarga}");
                                            carpetaDescarga = Properties.Settings.Default.urlDescargaPdfNC + DateTime.Now.Year + @"\" + respuesta.resultado.UUID + ".XML";
                                            webClient.DownloadFile(respuesta.resultado.URLXML, carpetaDescarga);
                                            //System.Threading.Thread.Sleep(1000);
                                            logFacturas.Info($"Descarga de XML(ZIP) Nota Credito...Terminada en {carpetaDescarga}");
                                            using (SqlConnection conn3 = new SqlConnection(Properties.Settings.Default.DBConexion))
                                            {
                                                conn3.Open();
                                                string     qryActualizaTempWEBService = @"UPDATE dbo.facNotaTempWEBService SET CodCUFE=@cufe,cadenaQR=@cadenaQR WHERE identificador=@identificador";
                                                SqlCommand cmdActualizaTempWEBService = new SqlCommand(qryActualizaTempWEBService, conn3);
                                                cmdActualizaTempWEBService.Parameters.Add("@cufe", SqlDbType.VarChar).Value          = respuesta.resultado.UUID;
                                                cmdActualizaTempWEBService.Parameters.Add("@cadenaQR", SqlDbType.NVarChar).Value     = respuesta.resultado.QR;
                                                cmdActualizaTempWEBService.Parameters.Add("@identificador", SqlDbType.VarChar).Value = respuesta.resultado.UUID;
                                                if (cmdActualizaTempWEBService.ExecuteNonQuery() > 0)
                                                {
                                                    logFacturas.Info("Descarga Existosa de Archivos de la Nota Credito con Identificadotr:" + respuesta.resultado.UUID + " Destino:" + carpetaDescarga);
                                                    if (!(respuesta.advertencias is null))
                                                    {
                                                        string     qryAdvertencia         = @"INSERT INTO dbo.facNotaTempWSAdvertencias(IdNota,CodAdvertencia,FecRegistro,DescripcionAdv,idTipoNota) 
VALUES(@IdNota, @CodAdvertencia, @FecRegistro, @DescripcionAdv,@idTipoNota)";
                                                        SqlCommand cmdInsertarAdvertencia = new SqlCommand(qryAdvertencia, conn3);
                                                        cmdInsertarAdvertencia.Parameters.Add("@IdNota", SqlDbType.Int);
                                                        cmdInsertarAdvertencia.Parameters.Add("@CodAdvertencia", SqlDbType.VarChar);
                                                        cmdInsertarAdvertencia.Parameters.Add("@DescripcionAdv", SqlDbType.NVarChar);
                                                        cmdInsertarAdvertencia.Parameters.Add("@FecRegistro", SqlDbType.DateTime);
                                                        cmdInsertarAdvertencia.Parameters.Add("@idTipoNota", SqlDbType.VarChar);
                                                        foreach (AdvertenciasItem itemAdv in respuesta.advertencias)
                                                        {
                                                            cmdInsertarAdvertencia.Parameters["@IdNota"].Value         = nroNotaCredito;
                                                            cmdInsertarAdvertencia.Parameters["@CodAdvertencia"].Value = itemAdv.codigo;
                                                            //cmdInsertarAdvertencia.Parameters["@consecutivo"].Value = consecutivo;
                                                            cmdInsertarAdvertencia.Parameters["@FecRegistro"].Value    = DateTime.Now;
                                                            cmdInsertarAdvertencia.Parameters["@DescripcionAdv"].Value = itemAdv.mensaje;
                                                            cmdInsertarAdvertencia.Parameters["@idTipoNota"].Value     = "NCE";
                                                            if (cmdInsertarAdvertencia.ExecuteNonQuery() > 0)
                                                            {
                                                                logFacturas.Info($"Se Inserta Detalle de Advertencias: Codigo Advertencia{itemAdv.codigo} Mensaje Advertencia:{itemAdv.mensaje}");
                                                                valorRpta = nroNotaCredito.ToString();
                                                            }
                                                            else
                                                            {
                                                                logFacturas.Info($"No es Posible Insertar Detalle de Advertencias: Codigo Advertencia{itemAdv.codigo} Mensaje Advertencia:{itemAdv.mensaje}");
                                                                valorRpta = nroNotaCredito.ToString();
                                                            }
                                                        }
                                                    }
                                                    valorRpta = nroNotaCredito.ToString();
                                                }
                                                else
                                                {
                                                    logFacturas.Info("No fue Posible Actualizar la Tabla facNotaTempWEBService de la Nota Credito con Identificador:" + respuesta.resultado.UUID);
                                                }
                                            }
                                        }
                                        catch (NotSupportedException nSuppExp)
                                        {
                                            logFacturas.Info("Se ha presentado una NotSupportedException durante la descarga de los objetos de la Factura:" + nSuppExp.Message + "     " + nSuppExp.InnerException.Message);
                                            valorRpta = "9X";
                                        }
                                        catch (ArgumentNullException argNull)
                                        {
                                            logFacturas.Info("Se ha presentado una ArgumentNullException durante la descarga de los objetos de la Factura:" + argNull.Message + "     " + argNull.InnerException.Message);
                                            valorRpta = "9X";
                                        }
                                        catch (WebException webEx1)
                                        {
                                            logFacturas.Info($"Se ha presentado una Falla durante la descarga de los objetos de la factura: {webEx1.Message} InnerException: {webEx1.InnerException.Message}");
                                            logFacturas.Warn($"Pila de Mensajes:::::{webEx1.StackTrace}");
                                            valorRpta = "93";
                                        }
                                        catch (Exception exx)
                                        {
                                            logFacturas.Info("No fue posible descargar los archivos.PDF, XML y QR  !!! Causa:" + exx.Message);
                                            valorRpta = "98";
                                        }
                                    }
                                }
                                else
                                {
                                    logFacturas.Info("!!!   No fue posible Actualizar la Factura en la Tabla: facFacturaTempWEBService   !!!");
                                }
                            }
                        }
                        else
                        {
                            using (SqlConnection connError = new SqlConnection(Properties.Settings.Default.DBConexion))
                            {
                                connError.Open();
                                string     qryInsertaError  = @"INSERT INTO facNotaTempWEBServiceError (IdTipoNota,IdNota,CodError,DescripcionError,FecRegistro) 
VALUES(@idTipo,@IdNota, @CodError, @DescripcionError, @FecRegistro)";
                                SqlCommand cmdInsertarError = new SqlCommand(qryInsertaError, connError);
                                cmdInsertarError.Parameters.AddWithValue("@idTipo", SqlDbType.VarChar).Value = "NC";
                                cmdInsertarError.Parameters.Add("@IdNota", SqlDbType.Int).Value                = nroNotaCredito;
                                cmdInsertarError.Parameters.Add("@CodError", SqlDbType.VarChar).Value          = respuesta.codigo;
                                cmdInsertarError.Parameters.Add("@DescripcionError", SqlDbType.NVarChar).Value = respuesta.mensaje;
                                cmdInsertarError.Parameters.Add("@FecRegistro", SqlDbType.DateTime).Value      = DateTime.Parse(respuesta.fecha);
                                if (cmdInsertarError.ExecuteNonQuery() > 0)
                                {
                                    valorRpta = nroNotaCredito.ToString();
                                    string     qryDetErr = @"INSERT INTO facNotaTempWSErrorDetalle (IdNota,CodError,consecutivo,FecRegistro,DescripcionError) 
VALUES(@IdNota, @CodError, @consecutivo, @FecRegistro, @DescripcionError)";
                                    SqlCommand cmdDetErr = new SqlCommand(qryDetErr, conn);
                                    cmdDetErr.Parameters.Add("@IdNota", SqlDbType.Int);
                                    cmdDetErr.Parameters.Add("@CodError", SqlDbType.VarChar);
                                    cmdDetErr.Parameters.Add("@consecutivo", SqlDbType.Int);
                                    cmdDetErr.Parameters.Add("@FecRegistro", SqlDbType.DateTime);
                                    cmdDetErr.Parameters.Add("@DescripcionError", SqlDbType.NVarChar);
                                    List <ErroresItem> listaErrores = new List <ErroresItem>();
                                    int consecutivo = 1;
                                    foreach (ErroresItem itemErr in respuesta.errores)
                                    {
                                        cmdDetErr.Parameters["@IdNota"].Value           = nroNotaCredito;
                                        cmdDetErr.Parameters["@CodError"].Value         = itemErr.codigo;
                                        cmdDetErr.Parameters["@consecutivo"].Value      = consecutivo;
                                        cmdDetErr.Parameters["@FecRegistro"].Value      = DateTime.Parse(respuesta.fecha);
                                        cmdDetErr.Parameters["@DescripcionError"].Value = itemErr.mensaje;
                                        if (cmdDetErr.ExecuteNonQuery() > 0)
                                        {
                                            logFacturas.Info($"Se Inserta Detalle de Errores Nota Credito:codigo{itemErr.codigo} Mensaje:{itemErr.mensaje}");
                                            consecutivo++;
                                        }
                                        else
                                        {
                                            logFacturas.Info($"No es Posible Insertar Detalle de Errores Nota Credito: Codigo{itemErr.codigo} Mensaje:{itemErr.mensaje}");
                                        }
                                        consecutivo++;
                                    }
                                }
                                else
                                {
                                    valorRpta = "99";
                                }
                            }
                        }
                        return(valorRpta);
                    }
                    catch (WebException wExp01)
                    {
                        logFacturas.Warn("Se ha presentado una excepcion Http:" + wExp01.Message + " Pila de LLamados:" + wExp01.StackTrace);
                        return("93");
                    }
                    catch (NotSupportedException nsExp01)
                    {
                        logFacturas.Warn("Se ha presentado una excepcion Http:" + nsExp01.Message + " Pila de LLamados:" + nsExp01.StackTrace);
                        return("94");
                    }
                    catch (ProtocolViolationException pexp01)
                    {
                        logFacturas.Warn("Se ha presentado una excepcion Http:" + pexp01.Message + " Pila de LLamados:" + pexp01.StackTrace);
                        return("95");
                    }
                    catch (InvalidOperationException inExp01)
                    {
                        logFacturas.Warn("Se ha presentado una excepcion Http:" + inExp01.Message + " Pila de LLamados:" + inExp01.StackTrace);
                        return("96");
                    }
                    catch (HttpListenerException httpExp)
                    {
                        logFacturas.Warn("Se ha presentado una excepcion Http:" + httpExp.Message + " Pila de LLamados:" + httpExp.StackTrace);
                        return("97");
                    }

                    catch (Exception e)
                    {
                        logFacturas.Warn("Se ha presentado una excepcion:" + e.Message + " Pila de LLamados:" + e.StackTrace);
                        return("98");
                    }
                }
            }
            catch (Exception ex1)
            {
                logFacturas.Warn("Se ha presentado una excepcion:" + ex1.Message + " Pila de LLamados:" + ex1.StackTrace);
                return("98");
            }
        }
Esempio n. 4
0
        public string GetData(int nroFactura, int idCliente, string urlPdfFactura, string moneda)
        {
            #region Definicion de Factura
            logFacturas.Info($"****************************************************** Factura Numero: {nroFactura}    ***********************************");
            logFacturas.Info("Se recibe factura con siguientes datos nroFactura: " + nroFactura + "  IdCliente:" + idCliente + " urlPdf:" + urlPdfFactura);
            try
            {
                decimal  _Valtotal        = 0;
                double   TotalGravadoIva  = 0;
                double   TotalExcentoIva  = 0;
                double   ValorTotalIva    = 0;
                Int32    ValorTasaIva     = 0;
                double   ValorBruto       = 0;
                Decimal  _ValPagos        = 0;
                decimal  _ValCobrar       = 0;
                DateTime _FecFactura      = DateTime.Now;
                Decimal  _valorIva        = 0;
                Int32    _IdUsuarioR      = 0;
                Int32    _idTercero       = 0;
                string   _usrNombre       = string.Empty;
                string   _usrNumDocumento = string.Empty;
                string   _numDocCliente   = string.Empty;
                Byte     _tipoDocCliente  = 0;
                string   _razonSocial     = string.Empty;
                string   _repLegal        = string.Empty;
                string   _RegimenFiscal   = string.Empty;
                string   _Ciudad          = string.Empty;

                Int16  _idNaturaleza = 0;
                int    concepto      = 0;
                string _Pais         = string.Empty;

                FormaPago formaPagoTmp = new FormaPago();

                //Fin de Inicializacion
                documentoRoot documentoF2   = new documentoRoot();
                Documento     facturaEnviar = new Documento();
                facturaEnviar.identificadorTransaccion = "cb601e82-f1c7-42fe-ba93-6afd6807137f";
                facturaEnviar.URLPDF                      = urlPdfFactura;
                facturaEnviar.NITFacturador               = Properties.Settings.Default.NitHusi;
                facturaEnviar.prefijo                     = Properties.Settings.Default.Prefijo;
                facturaEnviar.numeroDocumento             = nroFactura.ToString();
                facturaEnviar.tipoDocumento               = 1;
                facturaEnviar.subTipoDocumento            = "01";
                facturaEnviar.tipoOperacion               = "10";
                facturaEnviar.generaRepresentacionGrafica = false;
                using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.DBConexion))
                {
                    conn.Open();
                    //string qryFacturaEnc = @"SELECT  b.numdocrespaldo,IdTipoDocRespaldo,B.IdTercero,B.IdCliente,nomcliente,IdTipoDocCliente,B.NumDocumento,ValMonto,ValSaldo,FecRegistroC,FecRadicacion,IndEstado,ValFactura,a.IdUsuarioR,t.NomTercero,t.IdNaturaleza from cxcfacmanual a
                    //inner join cxccuenta b on a.idcuenta=b.idcuenta
                    //inner join genTercero t ON b.IdTercero=t.IdTercero
                    //WHERE b.numdocrespaldo=@nroFactura";
                    string qryFacturaEnc = @"SELECT  b.numdocrespaldo,IdTipoDocRespaldo,B.IdTercero,B.IdCliente,nomcliente,tdoc.TipoDocDian,B.NumDocumento,ValMonto,ValSaldo,FecRegistroC,FecRadicacion,IndEstado,ValFactura,a.IdUsuarioR,t.NomTercero,t.IdNaturaleza from cxcfacmanual a
inner join cxccuenta b on a.idcuenta=b.idcuenta 
inner join genTercero t ON b.IdTercero=t.IdTercero
inner join homologaTipoDocDian tdoc on b.IdTipoDocCliente=tdoc.IdTipoDoc
WHERE b.numdocrespaldo=@nroFactura"; //**************REvisar los campos que se afectan

                    SqlCommand cmdFacturaEnc = new SqlCommand(qryFacturaEnc, conn);
                    cmdFacturaEnc.Parameters.Add("@nroFactura", SqlDbType.Int).Value = nroFactura;
                    SqlDataReader rdFacturaEnc = cmdFacturaEnc.ExecuteReader();
                    if (rdFacturaEnc.HasRows)
                    {
                        rdFacturaEnc.Read();
                        string valorTf = Math.Round(rdFacturaEnc.GetDouble(12), 0).ToString();
                        _Valtotal       = Decimal.Parse(valorTf);
                        _ValPagos       = 0;
                        _ValCobrar      = Decimal.Parse(Math.Round(rdFacturaEnc.GetDouble(12), 0).ToString());
                        _FecFactura     = rdFacturaEnc.GetDateTime(9);
                        _IdUsuarioR     = rdFacturaEnc.GetInt32(13);
                        _numDocCliente  = rdFacturaEnc.GetString(6);
                        _tipoDocCliente = rdFacturaEnc.GetByte(5);
                        _razonSocial    = rdFacturaEnc.GetString(4);
                        _repLegal       = rdFacturaEnc.GetString(4);
                        _idTercero      = rdFacturaEnc.GetInt32(2);
                        _idNaturaleza   = rdFacturaEnc.GetInt16(15);
                    }
                    else
                    {
                        return("No se encontro Informacion General de Encabezado de Factura.");
                    }
                    if (_ValPagos > 0)
                    {
                        string     Consultapagos    = "SELECT IdConcepto FROM facFacAtenConcepto WHERE IdFactura=@idFactura";
                        SqlCommand cmdConsultaPagos = new SqlCommand(Consultapagos, conn);
                        cmdConsultaPagos.Parameters.Add("@idfactura", SqlDbType.Int).Value = nroFactura;
                        concepto = int.Parse(cmdConsultaPagos.ExecuteScalar().ToString());
                    }
                }

                string formatoWrk = formatosFecha.formatofecha(_FecFactura);
                facturaEnviar.fechaEmision = formatoWrk.Split('T')[0];
                facturaEnviar.horaEmision  = formatoWrk.Split('T')[1];
                facturaEnviar.moneda       = "COP";
                formaPagoTmp.tipoPago      = 1;
                formaPagoTmp.codigoMedio   = "10";
                facturaEnviar.formaPago    = formaPagoTmp;

                List <DetallesItem> detalleProductos = new List <DetallesItem>();
                //****************** CLIENTE
                //  Variables Inicializacion
                string _direccionCliente    = string.Empty;
                string _telefonoCliente     = string.Empty;
                string _municipioCliente    = string.Empty;
                string _departamento        = string.Empty;
                int    _localizacionCliente = 0;
                string _correoCliente       = string.Empty;
                using (SqlConnection connx = new SqlConnection(Properties.Settings.Default.DBConexion))
                {
                    connx.Open();
                    string     qryDatosCliente1 = @"SELECT IdLocalizaTipo,DesLocalizacion,B.nom_dipo,A.IdLugar,SUBSTRING(B.cod_dipo,5,5) AS 'Ciudad',
       pd.CodigoAlfa2,pd.NombreComun,c.nom_dipo as Depto, substring(c.cod_dipo, 5, 2) as CodDepto
FROM genTerceroLocaliza A
LEFT JOIN GEN_DIVI_POLI B ON A.IdLugar = B.IdLugar
INNER JOIN GEN_PAISES_DIAN AS pd ON cod_dipo_sahi = substring(cod_dipo, 1, 3)
inner join GEN_DIVI_POLI as c ON substring(c.cod_dipo,1,6) = substring(b.cod_dipo, 1, 6) AND c.tip_dipo = 'D'
WHERE IdTercero = @idTercero and IdLocalizaTipo IN(2, 3)
ORDER BY IdLocalizaTipo ";
                    SqlCommand cmdDatosCliente1 = new SqlCommand(qryDatosCliente1, connx);
                    cmdDatosCliente1.Parameters.Add("@idTercero", SqlDbType.Int).Value = _idTercero;
                    SqlDataReader rdDatosCliente1 = cmdDatosCliente1.ExecuteReader();
                    if (rdDatosCliente1.HasRows)
                    {
                        while (rdDatosCliente1.Read())
                        {
                            if (rdDatosCliente1.GetInt32(0) == 2)
                            {
                                _direccionCliente    = rdDatosCliente1.GetString(1);
                                _localizacionCliente = rdDatosCliente1.GetInt32(3);
                                _Pais         = rdDatosCliente1.GetString(5);
                                _Ciudad       = rdDatosCliente1.GetString(2);
                                _departamento = rdDatosCliente1.GetString(7);
                                if (rdDatosCliente1.GetSqlString(5) == "CO")
                                {
                                    _municipioCliente = rdDatosCliente1.GetString(4);
                                }
                                else
                                {
                                    _municipioCliente = "00000"; //Ajustado Para Facturas Administrativas, Clientes Extranjeros, Facturado eb Pessos 2020-08-03
                                }
                            }
                            else if (rdDatosCliente1.GetInt32(0) == 3)
                            {
                                _telefonoCliente = rdDatosCliente1.GetString(1);
                                if (_telefonoCliente.Length > 10)
                                {
                                    _telefonoCliente = _telefonoCliente.Substring(0, 10);
                                }
                                else if (_telefonoCliente.Length == 0)
                                {
                                    _telefonoCliente = "5716519494";
                                }
                            }
                        }
                    }
                    else
                    {
                        _telefonoCliente = "5716519494";
                    }

                    string     qryDatosCliente2 = @"SELECT COD_DEPTO,COD_MPIO,DPTO,NOM_MPIO FROM GEN_DIVI_POLI A
                    INNER JOIN HUSI_Divipola HB ON a.num_ptel=COD_DEPTO
                    WHERE a.IdLugar=@idLugar";
                    SqlCommand cmdDatosCliente2 = new SqlCommand(qryDatosCliente2, connx);
                    cmdDatosCliente2.Parameters.Add("@idLugar", SqlDbType.Int).Value = _localizacionCliente;
                    SqlDataReader rdDatosCliente2 = cmdDatosCliente2.ExecuteReader();
                    if (rdDatosCliente2.HasRows && _Pais == "CO")
                    {
                        rdDatosCliente2.Read();
                        _departamento = rdDatosCliente2.GetString(2);
                    }

                    string     qryDatosCliente3 = @"SELECT A.Correo FROM concontratocorreo A
INNER JOIN facFactura B ON A.IdContrato=B.IdContrato
WHERE A.indhabilitado=1 AND B.idFactura=@idFactura
UNION ALL
SELECT A.Deslocalizacion As Correo FROM gentercerolocaliza A
INNER JOIN conContrato C ON C.IdTercero=A.IdTercero
INNER JOIN  facFactura D ON D.IdContrato=C.IdContrato
LEFT JOIN concontratocorreo B ON  B.indhabilitado=1 and B.idcontrato=D.IdContrato  
WHERE B.idcontrato is null and A.IdLocalizaTipo=1 and A.indhabilitado=1 and D.IdFactura=@idFactura";
                    SqlCommand cmdDatosCliente3 = new SqlCommand(qryDatosCliente3, connx);
                    cmdDatosCliente3.Parameters.Add("@idFactura", SqlDbType.Int).Value = nroFactura;
                    SqlDataReader rdDatosCliente3 = cmdDatosCliente3.ExecuteReader();
                    if (rdDatosCliente3.HasRows)
                    {
                        rdDatosCliente3.Read();
                        if (rdDatosCliente3.IsDBNull(0))
                        {
                            _correoCliente = "*****@*****.**";
                        }
                        else
                        {
                            if (rdDatosCliente3.GetString(0).Length == 0)
                            {
                                _correoCliente = "*****@*****.**";
                            }
                            else
                            {
                                _correoCliente = rdDatosCliente3.GetString(0);
                            }
                        }
                    }
                    else
                    {
                        _correoCliente = "*****@*****.**";
                    }
                    List <NotificacionesItem> notificaciones = new List <NotificacionesItem>();
                    NotificacionesItem        notificaItem   = new NotificacionesItem();
                    notificaItem.tipo = 1;
                    List <string> valorNotificacion = new List <string>();
                    valorNotificacion.Add(_correoCliente.Trim());
                    notificaItem.valor = valorNotificacion;
                    notificaciones.Add(notificaItem);
                    if (_correoCliente.Length > 0)
                    {
                        facturaEnviar.notificaciones = notificaciones;
                    }

                    Adquiriente adquirienteTmp = new Adquiriente();
                    adquirienteTmp.identificacion     = _numDocCliente;
                    adquirienteTmp.tipoIdentificacion = _tipoDocCliente;
                    adquirienteTmp.codigoInterno      = _idTercero.ToString();
                    adquirienteTmp.razonSocial        = _razonSocial;
                    adquirienteTmp.nombreSucursal     = _razonSocial;
                    adquirienteTmp.correo             = _correoCliente.Trim().Split(';')[0];
                    if (_telefonoCliente.Length == 0)
                    {
                        _telefonoCliente = "5716519494";
                    }
                    adquirienteTmp.telefono = _telefonoCliente;

                    if (_RegimenFiscal.Equals("C"))
                    {
                        adquirienteTmp.tipoRegimen = "48";
                    }
                    else
                    {
                        adquirienteTmp.tipoRegimen = "49";
                    }
                    //TODO: Aqui insertar lo que se defina de Responsabilidades  RUT documentoF2.adquiriente.responsabilidadesRUT
                    if (_idNaturaleza == 3)
                    {
                        adquirienteTmp.tipoPersona = "1";
                    }
                    else if (_idNaturaleza == 4)
                    {
                        adquirienteTmp.tipoPersona = "2";
                    }
                    else
                    {
                        adquirienteTmp.tipoPersona = "0";
                    }
                    List <string> responsanbilidadesR = new List <string>();
                    using (SqlConnection conexion01 = new SqlConnection(Properties.Settings.Default.DBConexion))
                    {
                        conexion01.Open();
                        SqlCommand sqlValidaDet = new SqlCommand("spTerceroResponsabilidadRut", conexion01);
                        sqlValidaDet.CommandType = CommandType.StoredProcedure;
                        sqlValidaDet.Parameters.Add("@idtercero", SqlDbType.Int).Value = _idTercero;
                        SqlDataReader rdValidaDet = sqlValidaDet.ExecuteReader();
                        if (rdValidaDet.HasRows)
                        {
                            rdValidaDet.Read();
                            responsanbilidadesR.Add(rdValidaDet.GetString(0));
                        }
                        else
                        {
                            responsanbilidadesR.Add("R-99-PN");
                        }
                    }

                    adquirienteTmp.responsabilidadesRUT = responsanbilidadesR;
                    Ubicacion ubicacionCliente = new Ubicacion();
                    ubicacionCliente.pais            = _Pais;
                    ubicacionCliente.codigoMunicipio = _municipioCliente;
                    ubicacionCliente.ciudad          = _Ciudad;
                    ubicacionCliente.direccion       = _direccionCliente;
                    adquirienteTmp.ubicacion         = ubicacionCliente;
                    ubicacionCliente.departamento    = _departamento;
                    documentoF2.adquiriente          = adquirienteTmp;
                    documentoF2.documento            = facturaEnviar;


                    List <AnticiposItem> anticiposWrk = new List <AnticiposItem>();
                    AnticiposItem        anticipoWrk  = new AnticiposItem();
                    anticipoWrk.comprobante   = "22";
                    anticipoWrk.valorAnticipo = double.Parse(_ValPagos.ToString());
                    anticiposWrk.Add(anticipoWrk);
                    documentoF2.anticipos = anticiposWrk;

                    //************************************************************ Detalle de Factura por Administrativa *********************************************
                    using (SqlConnection conexion01 = new SqlConnection(Properties.Settings.Default.DBConexion))
                    {
                        conexion01.Open();//***este select sigue igual, con 4 columnas
                        string     strDetalleFac = @"SELECT top 1000 b.numdocrespaldo as factura,CONVERT(VARCHAR,c.IdCuenta)+'-'+CONVERT(varchar,C.num_regi) AS codProducto,c.Descripcion,c.Cantidad,c.val_unit,
c.val_unit*c.Cantidad as valBruto,ISNULL(c.Vr_IVA,0) AS ValorIva,ISNULL(c.Porcen_IVA,0) as 'PorcentajeIva',c.*
 FROM cxcfacmanual a 
INNER JOIN cxccuenta b on a.idcuenta = b.idcuenta
INNER JOIN cxcfacmanualconc c on c.IdCuenta = a.idcuenta
WHERE c.val_unit_inte is null and NumDocRespaldo = @idFactura ORDER BY c.num_regi";
                        SqlCommand cmdDetalleFac = new SqlCommand(strDetalleFac, conexion01);
                        cmdDetalleFac.Parameters.Add("@idFactura", SqlDbType.Int).Value = nroFactura;
                        SqlDataReader rdDetalleFac = cmdDetalleFac.ExecuteReader();
                        if (rdDetalleFac.HasRows)
                        {
                            Int16 nroLinea = 1;
                            while (rdDetalleFac.Read())
                            {
                                try
                                {
                                    List <TibutosDetalle> listaTributos = new List <TibutosDetalle>(); //Tributos para lalinea de producto
                                    DetallesItem          lineaProducto = new DetallesItem();
                                    lineaProducto.tipoDetalle = 1;                                     // Linea Normal
                                    string codigoProducto = rdDetalleFac.GetString(1);
                                    lineaProducto.descripcion         = rdDetalleFac.GetString(2);
                                    lineaProducto.valorCodigoInterno  = codigoProducto;
                                    lineaProducto.codigoEstandar      = "999";
                                    lineaProducto.valorCodigoEstandar = codigoProducto;
                                    lineaProducto.unidades            = double.Parse(rdDetalleFac.GetInt32(3).ToString());
                                    lineaProducto.unidadMedida        = "94";
                                    lineaProducto.valorUnitarioBruto  = double.Parse(rdDetalleFac.GetSqlMoney(4).ToString());
                                    lineaProducto.valorBruto          = double.Parse(rdDetalleFac.GetSqlMoney(5).ToString());
                                    lineaProducto.valorBrutoMoneda    = "COP";
                                    ValorBruto += double.Parse(rdDetalleFac.GetSqlMoney(5).ToString());

                                    TibutosDetalle tributosWRKIva = new TibutosDetalle(); //Detalle de tributos, para el producto
                                    tributosWRKIva.id         = "01";
                                    tributosWRKIva.nombre     = "Iva";
                                    tributosWRKIva.esImpuesto = true;
                                    tributosWRKIva.porcentaje = double.Parse(rdDetalleFac.GetInt32(16).ToString()).TomarDecimales(2);
                                    tributosWRKIva.valorBase  = double.Parse(rdDetalleFac.GetSqlMoney(5).ToString());

                                    tributosWRKIva.valorImporte = double.Parse(rdDetalleFac.GetSqlDouble(6).ToString()).TomarDecimales(2);

                                    tributosWRKIva.tributoFijoUnidades     = 0;
                                    tributosWRKIva.tributoFijoValorImporte = 0;
                                    listaTributos.Add(tributosWRKIva);
                                    lineaProducto.tributos = listaTributos;
                                    if (rdDetalleFac.GetInt32(16) > 0)
                                    {
                                        ValorTasaIva     = rdDetalleFac.GetInt32(16);
                                        TotalGravadoIva += double.Parse(rdDetalleFac.GetSqlMoney(5).ToString());
                                        ValorTotalIva   += double.Parse(rdDetalleFac.GetSqlDouble(6).ToString()).TomarDecimales(2);
                                    }
                                    else
                                    {
                                        TotalExcentoIva += double.Parse(rdDetalleFac.GetSqlMoney(5).ToString());
                                    }
                                    detalleProductos.Add(lineaProducto);
                                    nroLinea++;
                                    // Para moneda extranjera:vr_Total_Inte-vr_IVA_Inte de la tabla
                                }
                                catch (Exception sqlExp)
                                {
                                    string error = $"Mensaje de Error:{sqlExp.Message}   Traza de la Pila:{sqlExp.StackTrace}";
                                    logFacturas.Warn($"Se ha presentado una Excepcion:{error}");
                                    throw;
                                }
                            }
                        }
                        else // Si No  hay Detalle de Productos
                        {
                        }
                    }
                    #endregion
                    //***************************** Finalizacion Y Liquidacion **************************************************************************************
                    documentoF2.detalles = detalleProductos;
                    ///<summary>
                    List <TributosItem>    tributosTMP         = new List <TributosItem>(); //Segmento de Iva  pata Totales de Factura
                    List <DetalleTributos> tributosDetalle     = new List <DetalleTributos>();
                    DetalleTributos        detalleTributosItem = new DetalleTributos();     // Un Objeto por cada Tipo de Iva
                                                                                            //***estos valores se deben tomar del select o Tabla
                                                                                            //double valorImporte = double.Parse(_valorIva.ToString());
                                                                                            //double valorBase = double.Parse((_Valtotal - _valorIva).ToString());
                                                                                            //double porcentaje = Math.Round(((valorImporte / valorBase) * 100).TomarDecimales(2), 0);
                                                                                            //detalleTributosItem.valorImporte = valorImporte;
                                                                                            //detalleTributosItem.valorBase = valorBase;
                                                                                            //detalleTributosItem.porcentaje = porcentaje;
                    detalleTributosItem.valorImporte = ValorTotalIva;
                    detalleTributosItem.valorBase    = TotalGravadoIva;
                    detalleTributosItem.porcentaje   = double.Parse(ValorTasaIva.ToString()).TomarDecimales(2);
                    tributosDetalle.Add(detalleTributosItem);
                    TributosItem itemTributo = new TributosItem()
                    {
                        id                = "01", //Total de Iva
                        nombre            = "Iva",
                        esImpuesto        = true,
                        valorImporteTotal = ValorTotalIva,
                        detalles          = tributosDetalle // Detalle de los Ivas
                    };
                    tributosTMP.Add(itemTributo);
                    documentoF2.tributos = tributosTMP;///

                    Totales totalesTmp = new Totales()
                    {
                        valorBruto             = ValorBruto, // double.Parse(ValorBruto.ToString()),
                        valorAnticipos         = double.Parse(_ValPagos.ToString()),
                        valorTotalSinImpuestos = ValorBruto,
                        valorTotalConImpuestos = ValorBruto - double.Parse(_ValPagos.ToString()) + double.Parse(ValorTotalIva.ToString()),
                        valorNeto = ValorBruto - double.Parse(_ValPagos.ToString()) + double.Parse(ValorTotalIva.ToString()) //double.Parse(_ValCobrar.ToString())
                    };
                    documentoF2.totales = totalesTmp;
                    logFacturas.Info("Numero de Productos procesados, para JSon:" + detalleProductos.Count);

                    try
                    {
                        string urlConsumo = Properties.Settings.Default.urlFacturaElectronica; //+ Properties.Settings.Default.recursoFacturaE;
                        logFacturas.Info("URL de Request:" + urlConsumo);
                        HttpWebRequest request = WebRequest.Create(urlConsumo) as HttpWebRequest;
                        request.Timeout = 60 * 1000;
                        string facturaJson = JsonConvert.SerializeObject(documentoF2);
                        logFacturas.Info("Json de la Factura:" + facturaJson);
                        request.Method      = "POST";
                        request.ContentType = "application/json";
                        string Usuario      = Properties.Settings.Default.usuario;
                        string Clave        = Properties.Settings.Default.clave;
                        string credenciales = Convert.ToBase64String(Encoding.ASCII.GetBytes(Usuario + ":" + Clave));
                        request.Headers.Add("Authorization", "Basic " + credenciales);

                        Byte[] data = Encoding.UTF8.GetBytes(facturaJson);

                        Stream st = request.GetRequestStream();
                        st.Write(data, 0, data.Length);
                        st.Close();

                        int loop1, loop2;
                        NameValueCollection valores;
                        valores = request.Headers;

                        // Pone todos los nombres en un Arregle
                        string[] arr1 = valores.AllKeys;
                        for (loop1 = 0; loop1 < arr1.Length; loop1++)
                        {
                            logFacturas.Info("Key: " + arr1[loop1] + "<br>");
                            // Todos los valores
                            string[] arr2 = valores.GetValues(arr1[loop1]);
                            for (loop2 = 0; loop2 < arr2.Length; loop2++)
                            {
                                logFacturas.Info("Value " + loop2 + ": " + arr2[loop2]);
                            }
                        }

                        HttpWebResponse response = request.GetResponse() as HttpWebResponse;
                        logFacturas.Info("Codigo Status:" + response.StatusCode);
                        logFacturas.Info("Descripcion Status:" + response.StatusDescription);
                        StreamReader sr    = new StreamReader(response.GetResponseStream());
                        string       strsb = sr.ReadToEnd();
                        logFacturas.Info("Respuesta Recibida Transfiriendo:" + strsb);
                        string valorRpta = "00";

                        RespuestaTransfiriendo respuesta = JsonConvert.DeserializeObject <RespuestaTransfiriendo>(strsb);
                        if (respuesta.esExitoso)
                        {
                            logFacturas.Info($"PDF:{respuesta.resultado.URLPDF}");
                            logFacturas.Info($"XML:{respuesta.resultado.URLXML}");
                            logFacturas.Info($"UUID:{ respuesta.resultado.UUID}");
                            logFacturas.Info($"QR:{respuesta.resultado.QR}");
                            using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.DBConexion))
                            {
                                conn.Open();
                                string     strActualiza = @"UPDATE dbo.facFacturaTempWEBService SET identificador=@identificador WHERE IdFactura=@nrofactura";
                                SqlCommand cmdActualiza = new SqlCommand(strActualiza, conn);
                                cmdActualiza.Parameters.Add("@identificador", SqlDbType.VarChar).Value = respuesta.resultado.UUID;
                                cmdActualiza.Parameters.Add("@nrofactura", SqlDbType.Int).Value        = nroFactura;
                                if (cmdActualiza.ExecuteNonQuery() > 0)
                                {
                                    logFacturas.Info("Factura Actualizada con UUID en facFacturaTempWEBService");
                                    using (WebClient webClient = new WebClient())
                                    {
                                        try
                                        {
                                            string carpetaDescarga = Properties.Settings.Default.urlDescargaPdfFACT + DateTime.Now.Year + @"\" + respuesta.resultado.UUID + ".pdf";
                                            logFacturas.Info("Carpeta de Descarga:" + carpetaDescarga);
                                            webClient.DownloadFile(respuesta.resultado.URLPDF, carpetaDescarga);
                                            //System.Threading.Thread.Sleep(1000);
                                            logFacturas.Info($"Descarga de PDF Factura...Terminada");
                                            carpetaDescarga = Properties.Settings.Default.urlDescargaPdfFACT + DateTime.Now.Year + @"\" + respuesta.resultado.UUID + ".XML";
                                            webClient.DownloadFile(respuesta.resultado.URLXML, carpetaDescarga);
                                            //System.Threading.Thread.Sleep(1000);
                                            logFacturas.Info($"Descarga de XML...Terminada");
                                            using (SqlConnection conn3 = new SqlConnection(Properties.Settings.Default.DBConexion))
                                            {
                                                conn3.Open();
                                                string     qryActualizaTempWEBService = @"UPDATE dbo.facFacturaTempWEBService SET CodCUFE=@cufe,cadenaQR=@cadenaQR WHERE identificador=@identificador";
                                                SqlCommand cmdActualizaTempWEBService = new SqlCommand(qryActualizaTempWEBService, conn);
                                                cmdActualizaTempWEBService.Parameters.Add("@cufe", SqlDbType.VarChar).Value          = respuesta.resultado.UUID;
                                                cmdActualizaTempWEBService.Parameters.Add("@cadenaQR", SqlDbType.NVarChar).Value     = respuesta.resultado.QR;
                                                cmdActualizaTempWEBService.Parameters.Add("@identificador", SqlDbType.VarChar).Value = respuesta.resultado.UUID;
                                                if (cmdActualizaTempWEBService.ExecuteNonQuery() > 0)
                                                {
                                                    logFacturas.Info("Descarga Existosa de Archivos de la Factura con Identificadotr:" + respuesta.resultado.UUID + " Destino:" + carpetaDescarga);
                                                    if (!(respuesta.advertencias is null))
                                                    {
                                                        string     qryAdvertencia         = @"INSERT INTO dbo.facFacturaTempWSAdvertencias(IdFactura,CodAdvertencia,FecRegistro,DescripcionAdv) 
VALUES(@IdFactura, @CodAdvertencia, @FecRegistro, @DescripcionAdv)";
                                                        SqlCommand cmdInsertarAdvertencia = new SqlCommand(qryAdvertencia, conn);
                                                        cmdInsertarAdvertencia.Parameters.Add("@IdFactura", SqlDbType.Int);
                                                        cmdInsertarAdvertencia.Parameters.Add("@CodAdvertencia", SqlDbType.VarChar);
                                                        cmdInsertarAdvertencia.Parameters.Add("@DescripcionAdv", SqlDbType.NVarChar);
                                                        cmdInsertarAdvertencia.Parameters.Add("@FecRegistro", SqlDbType.DateTime);

                                                        foreach (AdvertenciasItem itemAdv in respuesta.advertencias)
                                                        {
                                                            cmdInsertarAdvertencia.Parameters["@IdFactura"].Value = nroFactura;
                                                            cmdInsertarAdvertencia.Parameters["@CodError"].Value  = itemAdv.codigo;
                                                            //cmdInsertarAdvertencia.Parameters["@consecutivo"].Value = consecutivo;
                                                            cmdInsertarAdvertencia.Parameters["@FecRegistro"].Value      = DateTime.Now;
                                                            cmdInsertarAdvertencia.Parameters["@DescripcionError"].Value = itemAdv.mensaje;
                                                            if (cmdInsertarAdvertencia.ExecuteNonQuery() > 0)
                                                            {
                                                                logFacturas.Info($"Se Inserta Detalle de Advertencias: Codigo Advertencia{itemAdv.codigo} Mensaje Advertencia:{itemAdv.mensaje}");
                                                            }
                                                            else
                                                            {
                                                                logFacturas.Info($"No es Posible Insertar Detalle de Advertencias: Codigo Advertencia{itemAdv.codigo} Mensaje Advertencia:{itemAdv.mensaje}");
                                                            }
                                                        }
                                                    }
                                                    valorRpta = nroFactura.ToString();
                                                }
                                                else
                                                {
                                                    logFacturas.Info($"No fue Posible Realizar la Descarga de Archivos de la Factura con Identificadotr:{respuesta.resultado.UUID} Estado Proceso de Factura:{respuesta.esExitoso}");
                                                }
                                            }
                                        }
                                        catch (NotSupportedException nSuppExp)
                                        {
                                            logFacturas.Info("Se ha presentado una NotSupportedException durante la descarga de los objetos de la Factura:" + nSuppExp.Message + "     " + nSuppExp.InnerException.Message);
                                            valorRpta = "9X";
                                        }
                                        catch (ArgumentNullException argNull)
                                        {
                                            logFacturas.Info("Se ha presentado una ArgumentNullException durante la descarga de los objetos de la Factura:" + argNull.Message + "     " + argNull.InnerException.Message);
                                            valorRpta = "9X";
                                        }
                                        catch (WebException webEx1)
                                        {
                                            logFacturas.Info("Se ha presentado una Falla durante la descarga de los objetos de la factura:" + webEx1.Message + "     " + webEx1.InnerException.Message);
                                            logFacturas.Warn($"Pila de Mensajes:::::{webEx1.StackTrace}");
                                            valorRpta = "93";
                                        }
                                        catch (Exception exx)
                                        {
                                            logFacturas.Info($"No fue posible descargar los archivos.PDF, XML y QR  !!! Causa:{exx.Message}  Pila:{exx.StackTrace}");
                                            valorRpta = "98";
                                        }
                                    }
                                }
                                else
                                {
                                    valorRpta = "98";
                                    logFacturas.Info("!!!   No fue posible Actualizar la Factura en la Tabla: facFacturaTempWEBService   !!!");
                                }
                            }
                            return(valorRpta);
                        }
                        else
                        {
                            using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.DBConexion))
                            {
                                conn.Open();
                                string     qryInsertaError  = @"INSERT INTO facFacturaTempWEBServiceError (IdFactura,CodError,DescripcionError,FecRegistro) 
VALUES(@IdFactura, @CodError, @DescripcionError, @FecRegistro)";
                                SqlCommand cmdInsertarError = new SqlCommand(qryInsertaError, conn);
                                cmdInsertarError.Parameters.Add("@IdFactura", SqlDbType.Int).Value             = nroFactura;
                                cmdInsertarError.Parameters.Add("@CodError", SqlDbType.VarChar).Value          = respuesta.codigo;
                                cmdInsertarError.Parameters.Add("@DescripcionError", SqlDbType.NVarChar).Value = respuesta.mensaje;
                                cmdInsertarError.Parameters.Add("@FecRegistro", SqlDbType.DateTime).Value      = DateTime.Parse(respuesta.fecha);
                                if (cmdInsertarError.ExecuteNonQuery() > 0)
                                {
                                    valorRpta = nroFactura.ToString();
                                    string     qryDetErr = @"INSERT INTO facFacturaTempWSErrorDetalle (IdFactura,CodError,consecutivo,FecRegistro,DescripcionError) 
VALUES(@IdFactura, @CodError, @consecutivo, @FecRegistro, @DescripcionError)";
                                    SqlCommand cmdDetErr = new SqlCommand(qryDetErr, conn);
                                    cmdDetErr.Parameters.Add("@IdFactura", SqlDbType.Int);
                                    cmdDetErr.Parameters.Add("@CodError", SqlDbType.VarChar);
                                    cmdDetErr.Parameters.Add("@consecutivo", SqlDbType.Int);
                                    cmdDetErr.Parameters.Add("@FecRegistro", SqlDbType.DateTime);
                                    cmdDetErr.Parameters.Add("@DescripcionError", SqlDbType.NVarChar);
                                    List <ErroresItem> listaErrores = new List <ErroresItem>();
                                    int consecutivo = 1;
                                    foreach (ErroresItem itemErr in respuesta.errores)
                                    {
                                        cmdDetErr.Parameters["@IdFactura"].Value        = nroFactura;
                                        cmdDetErr.Parameters["@CodError"].Value         = itemErr.codigo;
                                        cmdDetErr.Parameters["@consecutivo"].Value      = consecutivo;
                                        cmdDetErr.Parameters["@FecRegistro"].Value      = DateTime.Parse(respuesta.fecha);
                                        cmdDetErr.Parameters["@DescripcionError"].Value = itemErr.mensaje;
                                        if (cmdDetErr.ExecuteNonQuery() > 0)
                                        {
                                            logFacturas.Info($"Se Inserta Detalle de Errores:codigo{itemErr.codigo} Mensaje:{itemErr.mensaje}");
                                        }
                                        else
                                        {
                                            logFacturas.Info($"No es Posible Insertar Detalle de Errores: Codigo{itemErr.codigo} Mensaje:{itemErr.mensaje}");
                                        }
                                    }
                                }
                                else
                                {
                                    valorRpta = "99";
                                }
                            }
                        }

                        return(valorRpta);
                        //               }
                        //else
                        //{
                        //	logFacturas.Info("!!!  Recuperacion Documentos de la Factura, No fue posible. No se Actualiza la Factura en facFacturaTempWEBService   !!!");
                        //	logFacturas.Warn("Respuesta recibida:" + strsb);
                        //	//*Aqui se debe insertar en la tabla de fallas
                        //	return "Recuperacion Documentos de la Factura, No fue posible. No se Actualiza la Factura en facFacturaTempWEBService";
                        //}
                    }
                    catch (WebException wExp01)
                    {
                        logFacturas.Warn("Se ha presentado una excepcion Http:" + wExp01.Message + " Pila de LLamados:" + wExp01.StackTrace);
                        return("93");
                    }
                    catch (NotSupportedException nsExp01)
                    {
                        logFacturas.Warn("Se ha presentado una excepcion Http:" + nsExp01.Message + " Pila de LLamados:" + nsExp01.StackTrace);
                        return("94");
                    }
                    catch (ProtocolViolationException pexp01)
                    {
                        logFacturas.Warn("Se ha presentado una excepcion Http:" + pexp01.Message + " Pila de LLamados:" + pexp01.StackTrace);
                        return("95");
                    }
                    catch (InvalidOperationException inExp01)
                    {
                        logFacturas.Warn("Se ha presentado una excepcion Http:" + inExp01.Message + " Pila de LLamados:" + inExp01.StackTrace);
                        return("96");
                    }
                    catch (HttpListenerException httpExp)
                    {
                        logFacturas.Warn("Se ha presentado una excepcion Http:" + httpExp.Message + " Pila de LLamados:" + httpExp.StackTrace);
                        return("97");
                    }

                    catch (Exception e)
                    {
                        logFacturas.Warn("Se ha presentado una excepcion:" + e.Message + " Pila de LLamados:" + e.StackTrace);
                        return("98");
                    }
                }
            }
            catch (Exception exp)
            {
                logFacturas.Warn("Se ha presentado una Excepcion:" + exp.Message + "Pila de LLamadas:" + exp.StackTrace);
                return("99");
            }
        }
Esempio n. 5
0
        public string GetData(int nroFactura, int idCliente, int nroAtencion, string urlPdfFactura)
        {
            logFacturas.Info("Se recibe factura con siguietnes datos:Factura por Relacion:" + nroFactura + "  IdCliente:" + idCliente + " nroAtencion:" + nroAtencion + " urlPdf:" + urlPdfFactura);
            try
            {
                Int32     _idContrato      = 0;
                Decimal   _Valtotal        = 0;
                Decimal   _ValDescuento    = 0;
                Decimal   _ValDescuentoT   = 0;
                Decimal   _ValPagos        = 0;
                Decimal   _ValImpuesto     = 0;
                Decimal   _ValCobrar       = 0;
                DateTime  _FecFactura      = DateTime.Now;
                Decimal   _valPos          = 0;
                Decimal   _valNoPos        = 0;
                Int32     _IdUsuarioR      = 0;
                Int32     _idTercero       = 0;
                string    _usrNombre       = string.Empty;
                string    _usrNumDocumento = string.Empty;
                Byte      _usrIdTipoDoc    = 0;
                string    _numDocCliente   = string.Empty;
                Byte      _tipoDocCliente  = 0;
                string    _razonSocial     = string.Empty;
                string    _repLegal        = string.Empty;
                string    _RegimenFiscal   = string.Empty;
                Int16     _idNaturaleza    = 0;
                int       concepto         = 0;
                FormaPago formaPagoTmp     = new FormaPago();

                documentoRoot documentoF2   = new documentoRoot();
                Documento     facturaEnviar = new Documento();
                facturaEnviar.identificadorTransaccion = "D7F719C2 - 75F4 - 4F06 - B7CB - F583FC28DBEE";
                facturaEnviar.URLPDF                      = urlPdfFactura;
                facturaEnviar.NITFacturador               = Properties.Settings.Default.NitHusi;
                facturaEnviar.prefijo                     = Properties.Settings.Default.Prefijo;
                facturaEnviar.numeroDocumento             = nroFactura.ToString();
                facturaEnviar.tipoDocumento               = 1;
                facturaEnviar.subTipoDocumento            = "01";
                facturaEnviar.tipoOperacion               = "10";
                facturaEnviar.generaRepresentacionGrafica = false;
                using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.DBConexion))
                {
                    conn.Open();
                    string     qryFacturaEnc = @"SELECT fact.idContrato,Valtotal,ValDescuento,ValDescuentoT,ValPagos,ValImpuesto,ValCobrar,FecFactura,valPos,valNoPos,fact.IdUsuarioR,
usr.nom_usua,usr.NumDocumento,usr.IdTipoDoc,ter.NumDocumento,ter.IdTipoDoc,ter.NomTercero,ter.CodTercero,con.NomRepComercial,ter.IdTercero,ter.idRegimen,ter.IdNaturaleza    
FROM facFactura fact
INNER JOIN ASI_USUA usr ON fact.IdUsuarioR = usr.IdUsuario
INNER JOIN conContrato con ON fact.IdContrato=con.IdContrato
INNER JOIN genTercero ter ON con.IdTercero=ter.IdTercero
WHERE IdFactura =  @nroFactura";
                    SqlCommand cmdFacturaEnc = new SqlCommand(qryFacturaEnc, conn);
                    cmdFacturaEnc.Parameters.Add("@nroFactura", SqlDbType.Int).Value = nroFactura;
                    SqlDataReader rdFacturaEnc = cmdFacturaEnc.ExecuteReader();
                    if (rdFacturaEnc.HasRows)
                    {
                        rdFacturaEnc.Read();
                        _idContrato    = rdFacturaEnc.GetInt32(0);
                        _Valtotal      = Math.Round(rdFacturaEnc.GetDecimal(1), 0);
                        _ValDescuento  = Math.Round(rdFacturaEnc.GetDecimal(2), 0);
                        _ValDescuentoT = Math.Round(rdFacturaEnc.GetDecimal(3), 0);
                        _ValPagos      = Math.Round(rdFacturaEnc.GetDecimal(4), 0);
                        _ValImpuesto   = Math.Round(rdFacturaEnc.GetDecimal(5), 0);
                        _ValCobrar     = Math.Round(rdFacturaEnc.GetDecimal(6), 0);
                        _FecFactura    = rdFacturaEnc.GetDateTime(7);
                        if (rdFacturaEnc.IsDBNull(8))
                        {
                            _valPos = 0;
                        }
                        else
                        {
                            _valPos = Math.Round(rdFacturaEnc.GetDecimal(8), 0);
                        }
                        if (rdFacturaEnc.IsDBNull(9))
                        {
                            _valNoPos = 0;
                        }
                        else
                        {
                            _valNoPos = Math.Round(rdFacturaEnc.GetDecimal(9), 0);
                        }
                        _IdUsuarioR      = rdFacturaEnc.GetInt32(10);
                        _usrNombre       = rdFacturaEnc.GetString(11);
                        _usrNumDocumento = rdFacturaEnc.GetString(12);
                        _usrIdTipoDoc    = rdFacturaEnc.GetByte(13);
                        _numDocCliente   = rdFacturaEnc.GetString(14);
                        _tipoDocCliente  = rdFacturaEnc.GetByte(15);
                        _razonSocial     = rdFacturaEnc.GetString(16);
                        _repLegal        = rdFacturaEnc.GetString(18);
                        _idTercero       = rdFacturaEnc.GetInt32(19);
                        _RegimenFiscal   = rdFacturaEnc.GetString(20);
                        _idNaturaleza    = rdFacturaEnc.GetInt16(21);
                    }
                    if (_ValPagos > 0)
                    {
                        string     Consultapagos    = "SELECT IdConcepto FROM facFacAtenConcepto WHERE IdFactura=@idFactura";
                        SqlCommand cmdConsultaPagos = new SqlCommand(Consultapagos, conn);
                        cmdConsultaPagos.Parameters.Add("@idfactura", SqlDbType.Int).Value = nroFactura;
                        concepto = int.Parse(cmdConsultaPagos.ExecuteScalar().ToString());
                    }
                }
                string formatoWrk = formatosFecha.formatofecha(_FecFactura);
                facturaEnviar.fechaEmision = formatoWrk.Split('T')[0];
                facturaEnviar.horaEmision  = formatoWrk.Split('T')[1];
                facturaEnviar.moneda       = "COP";
                formaPagoTmp.tipoPago      = 1;
                formaPagoTmp.codigoMedio   = "10";
                facturaEnviar.formaPago    = formaPagoTmp;

                List <DetallesItem> detalleProductos = new List <DetallesItem>();
                //****************** CLIENTE
                //  Variables Inicializacion
                string _direccionCliente    = string.Empty;
                string _telefonoCliente     = string.Empty;
                string _municipioCliente    = string.Empty;
                string _departamento        = string.Empty;
                int    _localizacionCliente = 0;
                string _correoCliente       = string.Empty;
                #region MyRegion
                //****
                //eFactura facturaEnviar = new eFactura();
                //AdditionalInformation iteminfAdicionalEnc = new AdditionalInformation();
                //List<AdditionalInformation> InformacionAdicionalEn = new List<AdditionalInformation>();
                //if (concepto == 1 && concepto > 0)
                //{
                //    InformacionAdicionalEn.Add(new AdditionalInformation() { Position = "2", Value = _ValPagos.ToString() });
                //    InformacionAdicionalEn.Add(new AdditionalInformation() { Position = "3", Value = "0" });
                //}
                //else
                //{
                //    InformacionAdicionalEn.Add(new AdditionalInformation() { Position = "2", Value = "0" });
                //    InformacionAdicionalEn.Add(new AdditionalInformation() { Position = "3", Value = _ValPagos.ToString() });
                //}

                //Data objData = new Data
                //{
                //    UrlPdf = urlPdfFactura
                //};
                //OriginalRequest peticion = new OriginalRequest
                //{
                //    //Currency = _monedaFactura,
                //    EventName = "FAC-SYNC",
                //    DocumentType = "Invoice",
                //    BroadCastDate = DateTime.Now.ToString("yyyy-MM-dd"),
                //    BroadCastTime = DateTime.Now.ToString("HH:mm:ss"),
                //    IdMotivo = "1",
                //    BillType = "1",
                //    InvoiceId = nroFactura.ToString(),
                //    Prefix = Properties.Settings.Default.Prefijo,
                //    IdBusiness = "860015536",
                //    AdditionalInformation = InformacionAdicionalEn
                //};

                //peticion.DocumentType = "01";
                //TODO:Agregar todos los campos adicionales

                //InformacionAdicionalEn.Add(new AdditionalInformation() { Position = "3", Value = "Codigo Habilitacion HUSI" });
                //InformacionAdicionalEn.Add(new AdditionalInformation() { Position = "4", Value = "0" });
                //InformacionAdicionalEn.Add(new AdditionalInformation() { Position = "5", Value = 0.ToString() });
                //InformacionAdicionalEn.Add(new AdditionalInformation() { Position = "6", Value = nroAtencion.ToString() });
                //InformacionAdicionalEn.Add(new AdditionalInformation() { Position = "7", Value = "2018-09-16" });
                //InformacionAdicionalEn.Add(new AdditionalInformation() { Position = "8", Value = "2018-09-23" });
                //InformacionAdicionalEn.Add(new AdditionalInformation() { Position = "9", Value = "0" });
                //InformacionAdicionalEn.Add(new AdditionalInformation() { Position = "10", Value = "0" });
                //InformacionAdicionalEn.Add(new AdditionalInformation() { Position = "11", Value = "false" });


                ////  SellerSupplierParty datosHUSI = new SellerSupplierParty();
                //AccountingCustomerParty Cliente = new AccountingCustomerParty();
                //Address objDireccionHusi = new Address();
                //Address1 objDireccionCliente = new Address1();
                //TaxTotal ivaFactura = new TaxTotal();
                //TaxTotal ipoconsumoFactura = new TaxTotal();
                //TaxTotal icaFactura = new TaxTotal();
                //List<TaxTotal> impuestosFactura = new List<TaxTotal>();
                //LegalMonetaryTotal subtotalesFactura = new LegalMonetaryTotal();

                //LineExtensionAmount lineaExtCant = new LineExtensionAmount();
                //TaxExclusiveAmount totalImpuesto = new TaxExclusiveAmount();
                //PayableAmount totalPagar = new PayableAmount();

                //Contract contrato = new Contract();
                //Party datosHospital = new Party();
                //Party1 datosCliente = new Party1();
                //PhysicalLocation ubicacionFisicaHusi = new PhysicalLocation();
                //PhysicalLocation1 ubicacionFisicaCliente = new PhysicalLocation1();
                //PartyTaxScheme RegimenImpuesto = new PartyTaxScheme();
                //PartyTaxScheme RegimenCliente = new PartyTaxScheme();
                //PartyIdentification idenHusi = new PartyIdentification();
                //PartyIdentification idenCliente = new PartyIdentification();
                //Person repLegalHusi = new Person();
                //Person1 repLegalCliente = new Person1();
                ////********** Definicion Elementos del Detalle de Factura
                //List<DocumentLine> detalleProductos = new List<DocumentLine>();
                //SubDetalle subDetProducto = new SubDetalle();
                //TaxAmount taxIVA = new TaxAmount();
                //TaxAmount taxCONSUMO = new TaxAmount();
                //TaxAmount taxICA = new TaxAmount();
                //TaxableAmount camposAdicionalesICA = new TaxableAmount();
                ////********** Fin Definicion de Detalle de Factura
                //contrato.ID = _idContrato.ToString();
                //contrato.IssueDate = _FecFactura.ToString("yyyy-MM-dd");
                //contrato.ContractType = "1";

                //// datosHUSI.Contract = contrato;
                ////**********
                ////   datosHUSI.AdditionalAccountID = "1";
                //datosHospital.Name = "Hospital Universitario San Ignacio";
                //idenHusi.ID = "860015536";
                //idenHusi.SchemeID = "31";
                //datosHospital.PartyIdentification = idenHusi;


                //objDireccionHusi.Line = "Kra 7 No. 40-62";
                //objDireccionHusi.CityName = "Bogota D.C";
                //objDireccionHusi.CountryCode = "57";
                //objDireccionHusi.Department = "Cundinamarca";

                //ubicacionFisicaHusi.Address = objDireccionHusi;
                //datosHospital.PhysicalLocation = ubicacionFisicaHusi;

                //repLegalHusi.FirstName = "JULIO";
                //repLegalHusi.MiddleName = "CESAR";
                //repLegalHusi.FamilyName = "CASTELLANOS RAMIREZ";

                //datosHospital.Person = repLegalHusi;

                //RegimenImpuesto.TaxLevelCode = "2";
                //datosHospital.PartyTaxScheme = RegimenImpuesto;

                ////  datosHUSI.Party = datosHospital;

                ////****************** CLIENTE
                ////  Variables Inicializacion
                //string _direccionCliente = string.Empty;
                //string _telefonoCliente = string.Empty;
                //string _municipioCliente = string.Empty;
                //string _departamento = string.Empty;
                //int _localizacionCliente = 0;
                //string _correoCliente = string.Empty;
                ////****
                #endregion
                using (SqlConnection connx = new SqlConnection(Properties.Settings.Default.DBConexion))
                {
                    connx.Open();
                    string     qryDatosCliente1 = @"SELECT IdLocalizaTipo,DesLocalizacion,B.nom_dipo,A.IdLugar,RIGHT(B.cod_dipo,5) FROM genTerceroLocaliza A
LEFT JOIN GEN_DIVI_POLI B ON A.IdLugar=B.IdLugar
WHERE IdTercero=@idTercero and IdLocalizaTipo IN (2,3)
ORDER BY IdLocalizaTipo";
                    SqlCommand cmdDatosCliente1 = new SqlCommand(qryDatosCliente1, connx);
                    cmdDatosCliente1.Parameters.Add("@idTercero", SqlDbType.Int).Value = _idTercero;
                    SqlDataReader rdDatosCliente1 = cmdDatosCliente1.ExecuteReader();
                    if (rdDatosCliente1.HasRows)
                    {
                        while (rdDatosCliente1.Read())
                        {
                            if (rdDatosCliente1.GetInt32(0) == 2)
                            {
                                _direccionCliente    = rdDatosCliente1.GetString(1);
                                _municipioCliente    = rdDatosCliente1.GetString(4);
                                _localizacionCliente = rdDatosCliente1.GetInt32(3);
                            }
                            else if (rdDatosCliente1.GetInt32(0) == 3)
                            {
                                _telefonoCliente = rdDatosCliente1.GetString(1);
                                if (_telefonoCliente.Length > 10)
                                {
                                    _telefonoCliente = _telefonoCliente.Substring(0, 10);
                                }
                            }
                        }
                    }

                    string     qryDatosCliente2 = @"SELECT COD_DEPTO,COD_MPIO,DPTO,NOM_MPIO FROM GEN_DIVI_POLI A
                    INNER JOIN HUSI_Divipola HB ON a.num_ptel=COD_DEPTO
                    WHERE a.IdLugar=@idLugar";
                    SqlCommand cmdDatosCliente2 = new SqlCommand(qryDatosCliente2, connx);
                    cmdDatosCliente2.Parameters.Add("@idLugar", SqlDbType.Int).Value = _localizacionCliente;
                    SqlDataReader rdDatosCliente2 = cmdDatosCliente2.ExecuteReader();
                    if (rdDatosCliente2.HasRows)
                    {
                        rdDatosCliente2.Read();
                        _departamento = rdDatosCliente2.GetString(2);
                    }

                    string     qryDatosCliente3 = @"SELECT A.Correo FROM concontratocorreo A
INNER JOIN facFactura B ON A.IdContrato=B.IdContrato
WHERE A.indhabilitado=1 AND B.idFactura=@idFactura
UNION ALL
SELECT A.Deslocalizacion As Correo FROM gentercerolocaliza A
INNER JOIN conContrato C ON C.IdTercero=A.IdTercero
INNER JOIN  facFactura D ON D.IdContrato=C.IdContrato
LEFT JOIN concontratocorreo B ON  B.indhabilitado=1 and B.idcontrato=D.IdContrato  
WHERE B.idcontrato is null and A.IdLocalizaTipo=1 and A.indhabilitado=1 and D.IdFactura=@idFactura";
                    SqlCommand cmdDatosCliente3 = new SqlCommand(qryDatosCliente3, connx);
                    cmdDatosCliente3.Parameters.Add("@idFactura", SqlDbType.Int).Value = nroFactura;
                    SqlDataReader rdDatosCliente3 = cmdDatosCliente3.ExecuteReader();
                    if (rdDatosCliente3.HasRows)
                    {
                        rdDatosCliente3.Read();
                        _correoCliente = rdDatosCliente3.GetString(0);
                    }
                    else
                    {
                        _correoCliente = "*****@*****.**";
                    }
                }

                List <NotificacionesItem> notificaciones = new List <NotificacionesItem>();
                NotificacionesItem        notificaItem   = new NotificacionesItem();
                notificaItem.tipo = 1;
                List <string> valorNotificacion = new List <string>();
                valorNotificacion.Add(_correoCliente.Trim());
                notificaItem.valor = valorNotificacion;
                notificaciones.Add(notificaItem);
                facturaEnviar.notificaciones = notificaciones;

                Adquiriente adquirienteTmp = new Adquiriente();
                adquirienteTmp.identificacion = _numDocCliente;
                if (_tipoDocCliente == 1)//TODO: validar la Homologacion para este campo
                {
                    adquirienteTmp.tipoIdentificacion = 31;
                }
                else if (_tipoDocCliente == 2)
                {
                    adquirienteTmp.tipoIdentificacion = 13;
                }
                adquirienteTmp.codigoInterno  = _idTercero.ToString();
                adquirienteTmp.razonSocial    = _razonSocial;
                adquirienteTmp.nombreSucursal = _razonSocial;
                adquirienteTmp.correo         = _correoCliente.Trim().Split(';')[0];
                adquirienteTmp.telefono       = _telefonoCliente;

                if (_RegimenFiscal.Equals("C"))
                {
                    adquirienteTmp.tipoRegimen = "48";
                }
                else
                {
                    adquirienteTmp.tipoRegimen = "49";
                }
                //TODO: Aqui insertar lo que se defina de Responsabilidades  RUT documentoF2.adquiriente.responsabilidadesRUT
                if (_idNaturaleza == 3)
                {
                    adquirienteTmp.tipoPersona = "1";
                }
                else if (_idNaturaleza == 4)
                {
                    adquirienteTmp.tipoPersona = "2";
                }
                else
                {
                    adquirienteTmp.tipoPersona = "0";
                }
                List <string> responsanbilidadesR = new List <string>();
                using (SqlConnection conexion01 = new SqlConnection(Properties.Settings.Default.DBConexion))
                {
                    conexion01.Open();
                    SqlCommand sqlValidaDet = new SqlCommand("spTerceroResponsabilidadRut", conexion01);
                    sqlValidaDet.CommandType = CommandType.StoredProcedure;
                    sqlValidaDet.Parameters.Add("@idtercero", SqlDbType.Int).Value = _idTercero;
                    SqlDataReader rdValidaDet = sqlValidaDet.ExecuteReader();
                    if (rdValidaDet.HasRows)
                    {
                        rdValidaDet.Read();
                        responsanbilidadesR.Add(rdValidaDet.GetString(0));
                    }
                    else
                    {
                        responsanbilidadesR.Add("R-99-PN");
                    }
                }

                adquirienteTmp.responsabilidadesRUT = responsanbilidadesR;
                Ubicacion ubicacionCliente = new Ubicacion();
                ubicacionCliente.pais            = "CO";
                ubicacionCliente.codigoMunicipio = _municipioCliente;
                ubicacionCliente.direccion       = _direccionCliente;
                adquirienteTmp.ubicacion         = ubicacionCliente;
                documentoF2.adquiriente          = adquirienteTmp;

                #region MyRegion
                //TODO:Definir Los pagos por Copago y Cuota Moderadora, si se envian como Anticipos y Abonos
                //TODO:Definir si aplica para algun caso. Cargos y Descuentos

                //List<TributosItem> tributosTMP = new List<TributosItem>();
                //List<DetalleTributos> tributosDetalle = new List<DetalleTributos>();
                //DetalleTributos detalleTributos = new DetalleTributos() // Un Objeto por cada Tipo de Iva
                //{
                //    valorImporte = 0,
                //    valorBase = 0,
                //    porcentaje = 0
                //};
                //tributosDetalle.Add(detalleTributos);
                //TributosItem itemTributo = new TributosItem()
                //{
                //    id = "01", //Total de Iva
                //    nombre = "Iva",
                //    esImpuesto = true,
                //    valorImporteTotal = 0,
                //    detalles = tributosDetalle // DEtalle de los Ivas
                //};
                //tributosTMP.Add(itemTributo);
                //documentoF2.tributos = tributosTMP;
                #endregion
                ///<summary>
                ///Inicio de Totales de la Factura
                /// </summary>
                double TotalGravadoIva = 0;
                double TotalGravadoIca = 0;
                #region MyRegion
                //Totales totalesTmp = new Totales()
                //{
                //    valorBruto = double.Parse(_Valtotal.ToString()),
                //    valorAnticipos = double.Parse(_ValPagos.ToString()),
                //    valorTotalSinImpuestos = double.Parse(_Valtotal.ToString()),
                //    valorTotalConImpuestos = double.Parse(_Valtotal.ToString()) + double.Parse(_ValImpuesto.ToString()),
                //    valorNeto = double.Parse(_ValCobrar.ToString())
                //};
                //documentoF2.totales = totalesTmp;
                #endregion

                List <AnticiposItem> anticiposWrk = new List <AnticiposItem>();
                AnticiposItem        anticipoWrk  = new AnticiposItem();
                anticipoWrk.comprobante   = "22";
                anticipoWrk.valorAnticipo = double.Parse(_ValPagos.ToString());
                anticiposWrk.Add(anticipoWrk);
                documentoF2.anticipos = anticiposWrk;

                //************************************************************ Detalle de Factura
                using (SqlConnection conexion01 = new SqlConnection(Properties.Settings.Default.DBConexion))
                {
                    string qryFactura = "SELECT IdFactura,NumFactura,IdDestino,IdTransaccion,IdPlan,IdContrato,ValTotal,ValDescuento,ValDescuentoT,ValPagos,ValImpuesto,ValCobrar,IndNotaCred,IndTipoFactura,CodEnti,CodEsor,FecFactura,Ruta,IdCausal,IdUsuarioR,IndHabilitado,IdNoFacturado,valPos,valNoPos FROM  facFactura WHERE idFactura=@idFactura AND idDestino=@idAtencion";
                    conexion01.Open();
                    SqlCommand cmdFactura = new SqlCommand(qryFactura, conexion01);
                    cmdFactura.Parameters.Add("@idFactura", SqlDbType.Int).Value  = nroFactura;
                    cmdFactura.Parameters.Add("@idAtencion", SqlDbType.Int).Value = nroAtencion;
                    SqlDataReader rdFactura = cmdFactura.ExecuteReader();
                    if (rdFactura.HasRows)
                    {
                        rdFactura.Read();
                        string     strDetalleFac = @"SELECT UNI.Cod_Servicio,UNI.Des_Servicio,UNI.Cantidad,UNI.Vlr_Unitario_Serv,UNI.Vlr_Total_Serv,UNI.idProducto,UNI.CodProducto,UNI.nomproducto,O.idOrden FROM (
SELECT upper(isnull(J.CodProMan,CASE ISNULL(f.REGCUM,'0') WHEN '0' THEN P.CodProducto ELSE F.REGCUM END )) as Cod_Servicio,
upper(( isnull(J.NomPRoman,P.NomProducto)) ) as Des_Servicio,SUM(f.Cantidad) as Cantidad, f.ValTotal as Vlr_Unitario_Serv,
SUM(isnull(AD.ValTotal,round(F.Cantidad*F.ValTotal,0))) as Vlr_Total_Serv, p.idProducto,p.CodProducto,p.nomproducto
FROM facfactura a
INNER JOIN  concontrato b on a.idcontrato=b.idcontrato
INNER JOIN  facfacturadet f on f.idfactura=a.idfactura
LEFT JOIN facFacturaDetAjuDec AD ON AD.IdFactura = F.IdFactura and AD.IdProducto = F.IdProducto and AD.IdMovimiento = F.IdMovimiento
INNER JOIN  proproducto p on p.idproducto=f.idproducto AND p.IdProductoTipo not IN (8,12)
INNER JOIN  facmovimiento g on   g.idmovimiento=f.idmovimiento
INNER JOIN  admatencion c on g.iddestino=c.idatencion
INNER JOIN  admcliente d on d.idcliente=c.idcliente
INNER JOIN  gentipodoc e on e.idtipodoc=d.idtipodoc
LEFT JOIN admatencioncontrato h on h.idatencion=g.iddestino and a.idcontrato=h.idcontrato and a.idplan=h.idplan and h.indhabilitado=1
LEFT JOIN contarifa i on i.idtarifa=b.idtarifa
LEFT JOIN conManualAltDet J ON J.IdProducto = F.IdProducto AND J.IndHabilitado = 1 AND J.IdManual = i.IdManual
WHERE a.IndTipoFactura='RAC' AND  a.idfactura=@idFactura
GROUP BY
upper(isnull(J.CodProMan,CASE ISNULL(f.REGCUM,'0') WHEN '0' THEN P.CodProducto ELSE F.REGCUM END )),upper(( isnull(J.NomPRoman,P.NomProducto))),f.ValTotal,
p.idProducto,p.CodProducto,p.nomproducto
) as UNI
INNER JOIN facFacturaDetOrden O on O.idFactura=@idFactura AND UNI.idProducto=O.idProducto
ORDER BY o.Idorden";
                        SqlCommand cmdDetalleFac = new SqlCommand(strDetalleFac, conexion01);
                        cmdDetalleFac.Parameters.Add("@idFactura", SqlDbType.Int).Value = rdFactura.GetInt32(0);
                        SqlDataReader rdDetalleFac = cmdDetalleFac.ExecuteReader();
                        if (rdDetalleFac.HasRows)
                        {
                            Int16 nroLinea = 1;
                            while (rdDetalleFac.Read())
                            {
                                try
                                {
                                    List <TibutosDetalle> listaTributos = new List <TibutosDetalle>();
                                    DetallesItem          lineaProducto = new DetallesItem();
                                    lineaProducto.tipoDetalle = 1; // Linea Normal
                                    string codigoProducto = rdDetalleFac.GetString(0);
                                    lineaProducto.valorCodigoInterno = codigoProducto;
                                    #region MyRegion
                                    //if (rdDetalleFac.GetInt16(18) == 5 || rdDetalleFac.GetInt16(18) == 6)
                                    //{
                                    //    lineaProducto.codigoEstandar = "999";
                                    //}
                                    //else
                                    //{
                                    //    lineaProducto.codigoEstandar = "999";
                                    //}
                                    #endregion
                                    lineaProducto.codigoEstandar      = "999";
                                    lineaProducto.valorCodigoEstandar = codigoProducto;
                                    lineaProducto.descripcion         = rdDetalleFac.GetString(1);
                                    lineaProducto.unidades            = double.Parse(rdDetalleFac.GetDouble(2).ToString());
                                    lineaProducto.unidadMedida        = "94";// rdDetalleFac.GetString(19);
                                    lineaProducto.valorUnitarioBruto  = double.Parse(rdDetalleFac.GetDouble(3).ToString());
                                    lineaProducto.valorBruto          = double.Parse(rdDetalleFac.GetDouble(4).ToString());
                                    lineaProducto.valorBrutoMoneda    = "COP";

                                    TibutosDetalle tributosWRKIva = new TibutosDetalle();
                                    tributosWRKIva.id                      = "01";
                                    tributosWRKIva.nombre                  = "Iva";
                                    tributosWRKIva.esImpuesto              = true;
                                    tributosWRKIva.porcentaje              = 0;
                                    tributosWRKIva.valorBase               = double.Parse(rdDetalleFac.GetDouble(4).ToString());
                                    tributosWRKIva.valorImporte            = rdDetalleFac.GetDouble(4) * 0;
                                    TotalGravadoIva                        = TotalGravadoIva + rdDetalleFac.GetDouble(4);
                                    tributosWRKIva.tributoFijoUnidades     = 0;
                                    tributosWRKIva.tributoFijoValorImporte = 0;
                                    listaTributos.Add(tributosWRKIva);

                                    #region MyRegion
                                    //TibutosDetalle tributosWRKIca = new TibutosDetalle();
                                    //tributosWRKIca.id = "02";
                                    //tributosWRKIca.nombre = "ICA";
                                    //tributosWRKIca.esImpuesto = true;
                                    //tributosWRKIca.porcentaje = 0;
                                    //tributosWRKIca.valorBase = double.Parse(rdDetalleFac.GetDouble(4).ToString());
                                    //tributosWRKIca.valorImporte = rdDetalleFac.GetDouble(4) * 0;
                                    //TotalGravadoIca = TotalGravadoIca+ rdDetalleFac.GetDouble(4);
                                    //tributosWRKIca.tributoFijoUnidades = 0;
                                    //tributosWRKIca.tributoFijoValorImporte = 0;

                                    //listaTributos.Add(tributosWRKIca);
                                    #endregion
                                    lineaProducto.tributos = listaTributos;
                                    detalleProductos.Add(lineaProducto);
                                    nroLinea++;
                                }
                                catch (Exception sqlExp)
                                {
                                    string error = sqlExp.Message + "   " + sqlExp.StackTrace;
                                    throw;
                                }
                            }
                        }
                        else // Si No  hay Detalle de Productos
                        {
                            logFacturas.Info("No se encontro Detalle de productos para la factura. " + strDetalleFac);
                        }
                    }
                    else // No se encuentra Informacion de la Factura y Atencion
                    {
                        logFacturas.Info("No se encontro Informacion nde Factura y Atencion." + qryFactura);
                    }
                }
                documentoF2.detalles = detalleProductos;
                List <TributosItem>    tributosTMP     = new List <TributosItem>();
                List <DetalleTributos> tributosDetalle = new List <DetalleTributos>();
                DetalleTributos        detalleTributos = new DetalleTributos() // Un Objeto por cada Tipo de Iva
                {
                    valorImporte = 0,
                    valorBase    = TotalGravadoIva,
                    porcentaje   = 0
                };
                tributosDetalle.Add(detalleTributos);
                TributosItem itemTributo = new TributosItem()
                {
                    id                = "01", //Total de Iva
                    nombre            = "Iva",
                    esImpuesto        = true,
                    valorImporteTotal = 0,
                    detalles          = tributosDetalle // DEtalle de los Ivas
                };
                tributosTMP.Add(itemTributo);
                documentoF2.tributos = tributosTMP;
                Totales totalesTmp = new Totales()
                {
                    valorBruto             = double.Parse(_Valtotal.ToString()),
                    valorAnticipos         = double.Parse(_ValPagos.ToString()),
                    valorTotalSinImpuestos = TotalGravadoIva + TotalGravadoIca,
                    valorTotalConImpuestos = double.Parse(_Valtotal.ToString()) + double.Parse(_ValImpuesto.ToString()),
                    valorNeto = double.Parse(_ValCobrar.ToString())
                };
                documentoF2.totales = totalesTmp;
                logFacturas.Info("Numero de Productos procesados, para JSon:" + detalleProductos.Count);
                ////************************************** Adicionar elementos a la Factura **********************************

                try
                {
                    string urlConsumo = Properties.Settings.Default.urlFacturaElectronica;// + Properties.Settings.Default.recursoFacturaE;
                    logFacturas.Info("URL de Request:" + urlConsumo);
                    HttpWebRequest request = WebRequest.Create(urlConsumo) as HttpWebRequest;
                    //request.Timeout = 60 * 1000;
                    documentoF2.documento = facturaEnviar;
                    string facturaJson = JsonConvert.SerializeObject(documentoF2);
                    logFacturas.Info("Json de la Factura:" + facturaJson);
                    request.Method      = "POST";
                    request.ContentType = "application/json";
                    //string Usuario = "administrador";
                    //string Clave = "Transfiriendo@2016";
                    string Usuario      = Properties.Settings.Default.usuario;
                    string Clave        = Properties.Settings.Default.clave;
                    string credenciales = Convert.ToBase64String(Encoding.ASCII.GetBytes(Usuario + ":" + Clave));
                    request.Headers.Add("Authorization", "Basic " + credenciales);

                    Byte[] data = Encoding.UTF8.GetBytes(facturaJson);

                    Stream st = request.GetRequestStream();
                    st.Write(data, 0, data.Length);
                    st.Close();

                    int loop1, loop2;
                    NameValueCollection valores;
                    valores = request.Headers;

                    // Pone todos los nombres en un Arreglo
                    string[] arr1 = valores.AllKeys;
                    for (loop1 = 0; loop1 < arr1.Length; loop1++)
                    {
                        logFacturas.Info("Key: " + arr1[loop1] + "<br>");
                        // Todos los valores
                        string[] arr2 = valores.GetValues(arr1[loop1]);
                        for (loop2 = 0; loop2 < arr2.Length; loop2++)
                        {
                            logFacturas.Info("Value " + loop2 + ": " + arr2[loop2]);
                        }
                    }
                    HttpWebResponse response = request.GetResponse() as HttpWebResponse;
                    StreamReader    sr       = new StreamReader(response.GetResponseStream());
                    string          strsb    = sr.ReadToEnd();
                    logFacturas.Info("Respuesta:" + strsb);
                    string valorRpta = "00";
                    RespuestaTransfiriendo respuesta = JsonConvert.DeserializeObject <RespuestaTransfiriendo>(strsb);
                    if (respuesta.esExitoso)
                    {
                        logFacturas.Info($"PDF:{respuesta.resultado.URLPDF}");
                        logFacturas.Info($"XML:{respuesta.resultado.URLXML}");
                        logFacturas.Info($"UUID:{ respuesta.resultado.UUID}");
                        logFacturas.Info($"QR:{respuesta.resultado.QR}");
                        using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.DBConexion))
                        {
                            conn.Open();
                            string     strActualiza = @"UPDATE dbo.facFacturaTempWEBService SET identificador=@identificador WHERE IdFactura=@nrofactura";
                            SqlCommand cmdActualiza = new SqlCommand(strActualiza, conn);
                            cmdActualiza.Parameters.Add("@identificador", SqlDbType.VarChar).Value = respuesta.resultado.UUID;
                            cmdActualiza.Parameters.Add("@nrofactura", SqlDbType.Int).Value        = nroFactura;
                            if (cmdActualiza.ExecuteNonQuery() > 0)
                            {
                                logFacturas.Info("Factura Actualizada con UUID en facFacturaTempWEBService");
                                using (WebClient webClient = new WebClient())
                                {
                                    try
                                    {
                                        string carpetaDescarga = Properties.Settings.Default.urlDescargaPdfFACT + DateTime.Now.Year + @"\" + respuesta.resultado.UUID + ".pdf";
                                        logFacturas.Info("Carpeta de Descarga:" + carpetaDescarga);
                                        webClient.DownloadFile(respuesta.resultado.URLPDF, carpetaDescarga);
                                        //System.Threading.Thread.Sleep(1000);
                                        logFacturas.Info($"Descarga de PDF Factura...Terminada");
                                        carpetaDescarga = Properties.Settings.Default.urlDescargaPdfFACT + DateTime.Now.Year + @"\" + respuesta.resultado.UUID + ".XML";
                                        webClient.DownloadFile(respuesta.resultado.URLXML, carpetaDescarga);
                                        //System.Threading.Thread.Sleep(1000);
                                        logFacturas.Info($"Descarga de XML...Terminada");
                                        using (SqlConnection conn3 = new SqlConnection(Properties.Settings.Default.DBConexion))
                                        {
                                            conn3.Open();
                                            string     qryActualizaTempWEBService = @"UPDATE dbo.facFacturaTempWEBService SET CodCUFE=@cufe,cadenaQR=@cadenaQR WHERE identificador=@identificador";
                                            SqlCommand cmdActualizaTempWEBService = new SqlCommand(qryActualizaTempWEBService, conn);
                                            cmdActualizaTempWEBService.Parameters.Add("@cufe", SqlDbType.VarChar).Value          = respuesta.resultado.UUID;
                                            cmdActualizaTempWEBService.Parameters.Add("@cadenaQR", SqlDbType.NVarChar).Value     = respuesta.resultado.QR;
                                            cmdActualizaTempWEBService.Parameters.Add("@identificador", SqlDbType.VarChar).Value = respuesta.resultado.UUID;
                                            if (cmdActualizaTempWEBService.ExecuteNonQuery() > 0)
                                            {
                                                logFacturas.Info("Descarga Existosa de Archivos de la Factura con Identificadotr:" + respuesta.resultado.UUID + " Destino:" + carpetaDescarga);
                                                if (!(respuesta.advertencias is null))
                                                {
                                                    string     qryAdvertencia         = @"INSERT INTO dbo.facFacturaTempWSAdvertencias(IdFactura,CodAdvertencia,FecRegistro,DescripcionAdv) 
VALUES(@IdFactura, @CodAdvertencia, @FecRegistro, @DescripcionAdv)";
                                                    SqlCommand cmdInsertarAdvertencia = new SqlCommand(qryAdvertencia, conn);
                                                    cmdInsertarAdvertencia.Parameters.Add("@IdFactura", SqlDbType.Int);
                                                    cmdInsertarAdvertencia.Parameters.Add("@CodAdvertencia", SqlDbType.VarChar);
                                                    cmdInsertarAdvertencia.Parameters.Add("@DescripcionAdv", SqlDbType.NVarChar);
                                                    cmdInsertarAdvertencia.Parameters.Add("@FecRegistro", SqlDbType.DateTime);

                                                    foreach (AdvertenciasItem itemAdv in respuesta.advertencias)
                                                    {
                                                        cmdInsertarAdvertencia.Parameters["@IdFactura"].Value      = nroFactura;
                                                        cmdInsertarAdvertencia.Parameters["@CodAdvertencia"].Value = itemAdv.codigo;
                                                        //cmdInsertarAdvertencia.Parameters["@consecutivo"].Value = consecutivo;
                                                        cmdInsertarAdvertencia.Parameters["@FecRegistro"].Value    = DateTime.Now;
                                                        cmdInsertarAdvertencia.Parameters["@DescripcionAdv"].Value = itemAdv.mensaje;
                                                        if (cmdInsertarAdvertencia.ExecuteNonQuery() > 0)
                                                        {
                                                            logFacturas.Info($"Se Inserta Detalle de Advertencias: Codigo Advertencia{itemAdv.codigo} Mensaje Advertencia:{itemAdv.mensaje}");
                                                            valorRpta = nroFactura.ToString();
                                                        }
                                                        else
                                                        {
                                                            logFacturas.Info($"No es Posible Insertar Detalle de Advertencias: Codigo Advertencia{itemAdv.codigo} Mensaje Advertencia:{itemAdv.mensaje} Estado del Proceso de la Factura:{respuesta.esExitoso}");
                                                            valorRpta = nroFactura.ToString();
                                                        }
                                                    }
                                                }
                                                valorRpta = nroFactura.ToString();
                                            }
                                            else
                                            {
                                                logFacturas.Info($"No fue Posible Realizar la Descarga de Archivos de la Factura con Identificadotr:{respuesta.resultado.UUID} Estado Proceso de Factura:{respuesta.esExitoso}");
                                            }
                                        }
                                    }
                                    catch (NotSupportedException nSuppExp)
                                    {
                                        logFacturas.Info("Se ha presentado una NotSupportedException durante la descarga de los objetos de la Factura:" + nSuppExp.Message + "     " + nSuppExp.InnerException.Message);
                                        valorRpta = "9X";
                                    }
                                    catch (ArgumentNullException argNull)
                                    {
                                        logFacturas.Info("Se ha presentado una ArgumentNullException durante la descarga de los objetos de la Factura:" + argNull.Message + "     " + argNull.InnerException.Message);
                                        valorRpta = "9X";
                                    }
                                    catch (WebException webEx1)
                                    {
                                        logFacturas.Info("Se ha presentado una Falla durante la descarga de los objetos de la factura:" + webEx1.Message + "     " + webEx1.InnerException.Message);
                                        logFacturas.Warn($"Pila de Mensajes:::::{webEx1.StackTrace}");
                                        valorRpta = "93";
                                    }
                                    catch (Exception exx)
                                    {
                                        logFacturas.Info("No fue posible descargar los archivos.PDF, XML y QR  !!! Causa:" + exx.Message);
                                        valorRpta = "98";
                                    }
                                }
                            }
                            else
                            {
                                logFacturas.Info("!!!   No fue posible Actualizar la Factura en la Tabla: facFacturaTempWEBService   !!!");
                            }
                        }
                    }
                    else
                    {
                        using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.DBConexion))
                        {
                            conn.Open();
                            string     qryInsertaError  = @"INSERT INTO facFacturaTempWEBServiceError (IdFactura,CodError,DescripcionError,FecRegistro) 
VALUES(@IdFactura, @CodError, @DescripcionError, @FecRegistro)";
                            SqlCommand cmdInsertarError = new SqlCommand(qryInsertaError, conn);
                            cmdInsertarError.Parameters.Add("@IdFactura", SqlDbType.Int).Value             = nroFactura;
                            cmdInsertarError.Parameters.Add("@CodError", SqlDbType.VarChar).Value          = respuesta.codigo;
                            cmdInsertarError.Parameters.Add("@DescripcionError", SqlDbType.NVarChar).Value = respuesta.mensaje;
                            cmdInsertarError.Parameters.Add("@FecRegistro", SqlDbType.DateTime).Value      = DateTime.Parse(respuesta.fecha);
                            if (cmdInsertarError.ExecuteNonQuery() > 0)
                            {
                                valorRpta = nroFactura.ToString();
                                string     qryDetErr = @"INSERT INTO facFacturaTempWSErrorDetalle (IdFactura,CodError,consecutivo,FecRegistro,DescripcionError) 
VALUES(@IdFactura, @CodError, @consecutivo, @FecRegistro, @DescripcionError)";
                                SqlCommand cmdDetErr = new SqlCommand(qryDetErr, conn);
                                cmdDetErr.Parameters.Add("@IdFactura", SqlDbType.Int);
                                cmdDetErr.Parameters.Add("@CodError", SqlDbType.VarChar);
                                cmdDetErr.Parameters.Add("@consecutivo", SqlDbType.Int);
                                cmdDetErr.Parameters.Add("@FecRegistro", SqlDbType.DateTime);
                                cmdDetErr.Parameters.Add("@DescripcionError", SqlDbType.NVarChar);
                                List <ErroresItem> listaErrores = new List <ErroresItem>();
                                int consecutivo = 1;
                                foreach (ErroresItem itemErr in respuesta.errores)
                                {
                                    cmdDetErr.Parameters["@IdFactura"].Value        = nroFactura;
                                    cmdDetErr.Parameters["@CodError"].Value         = itemErr.codigo;
                                    cmdDetErr.Parameters["@consecutivo"].Value      = consecutivo;
                                    cmdDetErr.Parameters["@FecRegistro"].Value      = DateTime.Parse(respuesta.fecha);
                                    cmdDetErr.Parameters["@DescripcionError"].Value = itemErr.mensaje;
                                    if (cmdDetErr.ExecuteNonQuery() > 0)
                                    {
                                        logFacturas.Info($"Se Inserta Detalle de Errores:codigo{itemErr.codigo} Mensaje:{itemErr.mensaje}");
                                    }
                                    else
                                    {
                                        logFacturas.Info($"No es Posible Insertar Detalle de Errores: Codigo{itemErr.codigo} Mensaje:{itemErr.mensaje}");
                                    }
                                }
                            }
                            else
                            {
                                valorRpta = "99";
                            }
                        }
                    }

                    return(valorRpta);
                }
                catch (Exception e)
                {
                    logFacturas.Warn("Se ha presentado una excepcion:" + e.Message + " Pila de LLamdos:" + e.StackTrace);
                    return("98");
                }
            }
            catch (Exception exp)
            {
                logFacturas.Warn("Se ha presentado una Excepcion:" + exp.Message + "Pila de LLamadas:" + exp.StackTrace);
                return("99");
            }
        }
        public string GetData(int nroFactura, int idCliente, string urlPdfFactura, string moneda)
        {
            logFacturas.Info("***************************************************************************************************************************");
            logFacturas.Info("Se recibe factura con siguientes datos nroFactura: " + nroFactura + "  IdCliente:" + idCliente + " urlPdf:" + urlPdfFactura);
            try
            {
                decimal  _Valtotal       = 0;
                double   TotalGravadoIva = 0;
                double   TotalExcentoIva = 0;
                double   ValorTotalIva   = 0;
                Int32    ValorTasaIva    = 0;
                double   ValorBruto      = 0;
                Decimal  _ValPagos       = 0;
                decimal  _ValCobrar      = 0;
                DateTime _FecFactura     = DateTime.Now;
                //Decimal _valPos = 0;
                //Decimal _valNoPos = 0;
                Decimal _valorIvaPesos = 0;
                //double tasaIva = 0;
                //Int32 _IdUsuarioR = 0;
                Int32  _idTercero       = 0;
                string _usrNombre       = string.Empty;
                string _usrNumDocumento = string.Empty;
                //Byte _usrIdTipoDoc = 0;
                string _numDocCliente = string.Empty;
                //Byte _tipoDocCliente = 0;
                Byte   _tipoDocClienteDian = 0;
                string _razonSocial        = string.Empty;
                string _repLegal           = string.Empty;
                string _RegimenFiscal      = string.Empty;
                //Int16 _idNaturaleza = 0;
                int concepto = 0;

                FormaPago     formaPagoTmp  = new FormaPago();
                documentoRoot documentoF2   = new documentoRoot();
                Documento     facturaEnviar = new Documento();
                facturaEnviar.identificadorTransaccion = "3462c5-c24b-464e-ad46-da9c6cd94de3";
                facturaEnviar.URLPDF                      = urlPdfFactura;
                facturaEnviar.NITFacturador               = Properties.Settings.Default.NitHusi;
                facturaEnviar.prefijo                     = Properties.Settings.Default.Prefijo;
                facturaEnviar.numeroDocumento             = nroFactura.ToString();
                facturaEnviar.tipoDocumento               = 1;
                facturaEnviar.subTipoDocumento            = "01";
                facturaEnviar.tipoOperacion               = "10";
                facturaEnviar.moneda                      = moneda;
                facturaEnviar.generaRepresentacionGrafica = false;
                //ClienteInternacional cliente = new ClienteInternacional();
                string urlClientes = $"{Properties.Settings.Default.urlServicioClientes}ClienteInternacional?idFactura={nroFactura}";
                logFacturas.Info("URL de Request:" + urlClientes);
                HttpWebRequest peticion = WebRequest.Create(urlClientes) as HttpWebRequest;
                peticion.Method      = "GET";
                peticion.ContentType = "application/json";
                HttpWebResponse respuestaClientes = peticion.GetResponse() as HttpWebResponse;
                StreamReader    sr         = new StreamReader(respuestaClientes.GetResponseStream());
                string          infCliente = sr.ReadToEnd();
                logFacturas.Info("Cliente:" + infCliente);
                Cliente cliente = JsonConvert.DeserializeObject <Cliente>(infCliente);
                using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.DBConexion))
                {
                    conn.Open();
                    string     qryFacturaEnc = @"SELECT  b.numdocrespaldo,IdTipoDocRespaldo,B.IdTercero,B.IdCliente,nomcliente,tdoc.TipoDocDian,B.NumDocumento,ValMonto,ValSaldo,FecRegistroC,FecRadicacion,IndEstado,ValFactura,a.IdUsuarioR,t.NomTercero,t.IdNaturaleza from cxcfacmanual a
inner join cxccuenta b on a.idcuenta=b.idcuenta 
inner join genTercero t ON b.IdTercero=t.IdTercero
inner join homologaTipoDocDian tdoc on b.IdTipoDocCliente=tdoc.IdTipoDoc
WHERE b.numdocrespaldo=@nroFactura";
                    SqlCommand cmdFacturaEnc = new SqlCommand(qryFacturaEnc, conn);
                    cmdFacturaEnc.Parameters.Add("@nroFactura", SqlDbType.Int).Value = nroFactura;
                    SqlDataReader rdFacturaEnc = cmdFacturaEnc.ExecuteReader();
                    if (rdFacturaEnc.HasRows)
                    {
                        rdFacturaEnc.Read();
                        string valorTf = Math.Round(rdFacturaEnc.GetDouble(12), 0).ToString(); // Valor Toal de la factura Incluido el IVA
                        _Valtotal = Decimal.Parse(valorTf);
                        _ValPagos = 0;
                        //_ValImpuesto = 0;
                        _ValCobrar          = Decimal.Parse(Math.Round(rdFacturaEnc.GetDouble(12), 0).ToString()); // Valor a Cobrar
                        cliente.FecFactura  = rdFacturaEnc.GetDateTime(9);
                        _tipoDocClienteDian = rdFacturaEnc.GetByte(5);
                    }
                    else
                    {
                        return("No se encontro Informacion General de Encabezado de Factura.");
                    }
                    if (_ValPagos > 0)
                    {
                        string     Consultapagos    = "SELECT IdConcepto FROM facFacAtenConcepto WHERE IdFactura=@idFactura";
                        SqlCommand cmdConsultaPagos = new SqlCommand(Consultapagos, conn);
                        cmdConsultaPagos.Parameters.Add("@idfactura", SqlDbType.Int).Value = nroFactura;
                        concepto = int.Parse(cmdConsultaPagos.ExecuteScalar().ToString());
                    }
                }
                string formatoWrk = formatosFecha.formatofecha(_FecFactura);
                facturaEnviar.fechaEmision = formatoWrk.Split('T')[0];
                facturaEnviar.horaEmision  = formatoWrk.Split('T')[1];
                facturaEnviar.moneda       = moneda;
                formaPagoTmp.tipoPago      = 1;
                formaPagoTmp.codigoMedio   = "10";
                facturaEnviar.formaPago    = formaPagoTmp;
                List <DetallesItem> detalleProductos = new List <DetallesItem>();
                //****************** CLIENTE
                //  Variables Inicializacion
                string _direccionCliente = string.Empty;
                string _telefonoCliente  = string.Empty;
                string _municipioCliente = string.Empty;
                string _departamento     = string.Empty;
                //int _localizacionCliente = 0;
                string _correoCliente = string.Empty;
                string codigoPais     = string.Empty;

                using (SqlConnection connx = new SqlConnection(Properties.Settings.Default.DBConexion))
                {
                    connx.Open();
                    List <NotificacionesItem> notificaciones = new List <NotificacionesItem>();
                    NotificacionesItem        notificaItem   = new NotificacionesItem();
                    notificaItem.tipo = 1;
                    List <string> valorNotificacion = new List <string>();
                    valorNotificacion.Add(cliente.cuenta_correo.Trim());
                    notificaItem.valor = valorNotificacion;
                    notificaciones.Add(notificaItem);
                    facturaEnviar.notificaciones = notificaciones;
                    string     qryIvaFact = @"SELECT sum(a.val_cuen) as totalIva
FROM cxcfacmanualdet a 
inner join cxccuenta b on a.idcuenta=b.idcuenta and  b.numdocrespaldo=@factura
WHERE a.cod_cuen in (  select replace (val_camp, ';','') from gen_enti_dato where  nom_camp='CXC_FIVA')";
                    SqlCommand cmdIvaFact = new SqlCommand(qryIvaFact, connx);
                    cmdIvaFact.Parameters.Add("@factura", SqlDbType.Int).Value = nroFactura;
                    SqlDataReader rdIvaFact = cmdIvaFact.ExecuteReader();
                    if (rdIvaFact.HasRows)
                    {
                        rdIvaFact.Read();
                        if (!rdIvaFact.IsDBNull(0))
                        {
                            _valorIvaPesos = rdIvaFact.GetDecimal(0); /// valor del IVA de la Factura
                        }
                    }
                    string     qryPais = @"SELECT CodigoAlfa2 FROM GEN_DIVI_POLI a 
LEFT JOIN GEN_DIVI_POLI b on substring(a.cod_dipo,1,3) = b.cod_dipo
LEFT JOIN GEN_PAISES_DIAN c on c.idLugarSAHI = b.IdLugar
WHERE a.IdLugar = @idLugar";
                    SqlCommand cmdPais = new SqlCommand(qryPais, connx);
                    cmdPais.Parameters.Add("@idLugar", SqlDbType.VarChar).Value = cliente.idLugar;
                    SqlDataReader rdCodigoPais = cmdPais.ExecuteReader();
                    if (rdCodigoPais.HasRows)
                    {
                        rdCodigoPais.Read();
                        if (rdCodigoPais.IsDBNull(0))
                        {
                            codigoPais = "CO";
                        }
                        else
                        {
                            codigoPais = rdCodigoPais.GetString(0);
                        }
                    }
                    else
                    {
                        codigoPais = "CO";
                    }
                }
                Adquiriente adquirienteTmp = new Adquiriente();
                adquirienteTmp.identificacion     = cliente.NroDoc_Cliente;
                adquirienteTmp.tipoIdentificacion = _tipoDocClienteDian;
                adquirienteTmp.codigoInterno      = cliente.IdTercero.ToString();
                adquirienteTmp.razonSocial        = cliente.NomTercero;
                adquirienteTmp.nombreSucursal     = cliente.NomTercero;
                adquirienteTmp.correo             = cliente.cuenta_correo.Trim().Split(';')[0];
                adquirienteTmp.telefono           = cliente.telefono;
                if (cliente.idRegimen.Equals("C"))
                {
                    adquirienteTmp.tipoRegimen = "48";
                }
                else
                {
                    adquirienteTmp.tipoRegimen = "49";
                }

                if (cliente.IdNaturaleza == 3)
                {
                    adquirienteTmp.tipoPersona = "1";
                }
                else if (cliente.IdNaturaleza == 4)
                {
                    adquirienteTmp.tipoPersona = "2";
                }
                else
                {
                    adquirienteTmp.tipoPersona = "0";
                }
                List <string> responsanbilidadesR = new List <string>();
                using (SqlConnection conexion01 = new SqlConnection(Properties.Settings.Default.DBConexion))
                {
                    conexion01.Open();
                    SqlCommand sqlValidaDet = new SqlCommand("spTerceroResponsabilidadRut", conexion01);
                    sqlValidaDet.CommandType = CommandType.StoredProcedure;
                    sqlValidaDet.Parameters.Add("@idtercero", SqlDbType.Int).Value = _idTercero;
                    SqlDataReader rdValidaDet = sqlValidaDet.ExecuteReader();
                    if (rdValidaDet.HasRows)
                    {
                        rdValidaDet.Read();
                        responsanbilidadesR.Add(rdValidaDet.GetString(0));
                    }
                    else
                    {
                        responsanbilidadesR.Add("R-99-PN");
                    }
                }

                adquirienteTmp.responsabilidadesRUT = responsanbilidadesR;
                Ubicacion ubicacionCliente = new Ubicacion();
                ubicacionCliente.pais = codigoPais;

                if (cliente.codigoPais == "CO")
                {
                    ubicacionCliente.codigoMunicipio = cliente.codMunicipio;// "00000"; // se ajusta para factura 6180330 Cliente Internacional
                }
                else
                {
                    ubicacionCliente.codigoMunicipio = "00000";
                }
                ubicacionCliente.departamento = cliente.Nombre_Depto;
                ubicacionCliente.ciudad       = cliente.Nom_Municipio;
                ubicacionCliente.direccion    = cliente.direccion;
                adquirienteTmp.ubicacion      = ubicacionCliente;
                documentoF2.adquiriente       = adquirienteTmp;
                List <AnticiposItem> anticiposWrk = new List <AnticiposItem>();
                AnticiposItem        anticipoWrk  = new AnticiposItem();
                anticipoWrk.comprobante   = "22";
                anticipoWrk.valorAnticipo = double.Parse(_ValPagos.ToString());
                anticiposWrk.Add(anticipoWrk);
                documentoF2.anticipos = anticiposWrk;
                //************************************************************ Detalle de Factura por Administrativa Moneda Extranjera ***********************************************************
                using (SqlConnection conexion01 = new SqlConnection(Properties.Settings.Default.DBConexion))
                {
                    conexion01.Open();
                    string     strDetalleFac = @"SELECT top 1000 b.numdocrespaldo as factura,CONVERT(VARCHAR,c.IdCuenta)+'-'+CONVERT(varchar,C.num_regi) AS codProducto,c.Descripcion,c.Cantidad,c.val_unit,
c.val_unit* c.Cantidad as valBruto,ISNULL(c.Vr_IVA, 0) AS ValorIva, ISNULL(c.Porcen_IVA, 0) as 'PorcentajeIva',c.*
     FROM cxcfacmanual a
INNER JOIN cxccuenta b on a.idcuenta = b.idcuenta
INNER JOIN cxcfacmanualconc c on c.IdCuenta = a.idcuenta
WHERE c.val_unit_inte is NOT null and NumDocRespaldo = @idFactura ORDER BY c.num_regi";
                    SqlCommand cmdDetalleFac = new SqlCommand(strDetalleFac, conexion01);
                    cmdDetalleFac.Parameters.Add("@idFactura", SqlDbType.Int).Value = nroFactura;
                    SqlDataReader rdDetalleFac = cmdDetalleFac.ExecuteReader();
                    if (rdDetalleFac.HasRows)
                    {
                        #region MyRegion
                        //Int16 nroLinea = 1;
                        //while (rdDetalleFac.Read())
                        //{
                        //    tasaIva = ((double.Parse(_valorIvaPesos.ToString())) / (double.Parse(rdDetalleFac.GetDecimal(6).ToString())) * 100).TomarDecimales(2); ;
                        //    tasaIva = Math.Round(tasaIva, 0);
                        //    try
                        //    {
                        //        List<TibutosDetalle> listaTributos = new List<TibutosDetalle>();
                        //        DetallesItem lineaProducto = new DetallesItem();
                        //        lineaProducto.tipoDetalle = 1; // Linea Normal
                        //        string codigoProducto = rdDetalleFac.GetInt32(1).ToString();
                        //        lineaProducto.valorCodigoInterno = codigoProducto;
                        //        lineaProducto.codigoEstandar = "999";
                        //        lineaProducto.valorCodigoEstandar = codigoProducto;
                        //        lineaProducto.descripcion = rdDetalleFac.GetString(4);
                        //        lineaProducto.unidades = double.Parse(rdDetalleFac.GetInt32(3).ToString());
                        //        lineaProducto.unidadMedida = "94";// rdDetalleFac.GetString(19);
                        //        lineaProducto.valorUnitarioBruto = double.Parse(rdDetalleFac.GetDecimal(7).ToString());
                        //        ValBrutoProd = ValBrutoProd + (double.Parse(rdDetalleFac.GetDecimal(7).ToString()) * double.Parse(rdDetalleFac.GetInt32(3).ToString()));
                        //        lineaProducto.valorBruto = double.Parse(rdDetalleFac.GetInt32(3).ToString()) * double.Parse(rdDetalleFac.GetDecimal(7).ToString());
                        //        lineaProducto.valorBrutoMoneda = moneda;
                        //        //detalleProductos.Add(lineaProducto);

                        //        TibutosDetalle tributosWRKIva = new TibutosDetalle();
                        //        tributosWRKIva.id = "01";
                        //        tributosWRKIva.nombre = "Iva";
                        //        tributosWRKIva.esImpuesto = true;
                        //        tributosWRKIva.porcentaje = double.Parse(tasaIva.ToString());

                        //        tributosWRKIva.valorBase = double.Parse(rdDetalleFac.GetDecimal(7).ToString());
                        //        _totalIvaProd = _totalIvaProd+((double.Parse(rdDetalleFac.GetDecimal(7).ToString()) * double.Parse(tasaIva.ToString())) / 100).TomarDecimales(2);

                        //        tributosWRKIva.valorImporte = ((double.Parse(rdDetalleFac.GetDecimal(7).ToString()) * double.Parse(tasaIva.ToString()))/100).TomarDecimales(2);
                        //        TotalGravadoIva = TotalGravadoIva + double.Parse(rdDetalleFac.GetDecimal(7).ToString());
                        //        tributosWRKIva.tributoFijoUnidades = 0;
                        //        tributosWRKIva.tributoFijoValorImporte = 0;
                        //        listaTributos.Add(tributosWRKIva);

                        //        lineaProducto.tributos = listaTributos;
                        //        detalleProductos.Add(lineaProducto);
                        //        nroLinea++;
                        //    }
                        //    catch (Exception sqlExp)
                        //    {
                        //        string error = $"Mensaje de Error:{sqlExp.Message}   Traza de la Pila:{sqlExp.StackTrace}";
                        //        logFacturas.Warn($"Se ha presentado una Excepcion:{error}");
                        //        throw;
                        //    }
                        //}
                        #endregion
                        Int16 nroLinea = 1;
                        while (rdDetalleFac.Read())
                        {
                            try
                            {
                                List <TibutosDetalle> listaTributos = new List <TibutosDetalle>(); //Tributos para lalinea de producto
                                DetallesItem          lineaProducto = new DetallesItem();
                                lineaProducto.tipoDetalle = 1;                                     // Linea Normal
                                string codigoProducto = rdDetalleFac.GetString(1);
                                lineaProducto.descripcion         = rdDetalleFac.GetString(2);
                                lineaProducto.valorCodigoInterno  = codigoProducto;
                                lineaProducto.codigoEstandar      = "999";
                                lineaProducto.valorCodigoEstandar = codigoProducto;
                                lineaProducto.unidades            = double.Parse(rdDetalleFac.GetInt32(3).ToString());
                                lineaProducto.unidadMedida        = "94";
                                lineaProducto.valorUnitarioBruto  = double.Parse(rdDetalleFac.GetSqlMoney(14).ToString()).TomarDecimales(2);
                                lineaProducto.valorBrutoMoneda    = moneda;                 // "COP";
                                double totalUnitario = lineaProducto.valorUnitarioBruto * lineaProducto.unidades;
                                lineaProducto.valorBruto = totalUnitario.TomarDecimales(2); // double.Parse(rdDetalleFac.GetSqlDouble(18).ToString());
                                ValorBruto += totalUnitario.TomarDecimales(2);              // double.Parse(rdDetalleFac.GetSqlDouble(18).ToString());
                                TibutosDetalle tributosWRKIva = new TibutosDetalle();       //Detalle de tributos, para el producto
                                tributosWRKIva.id         = "01";
                                tributosWRKIva.nombre     = "Iva";
                                tributosWRKIva.esImpuesto = true;
                                tributosWRKIva.porcentaje = double.Parse(rdDetalleFac.GetInt32(16).ToString()).TomarDecimales(2);
                                tributosWRKIva.valorBase  = totalUnitario;// double.Parse(rdDetalleFac.GetSqlDouble(18).ToString());

                                tributosWRKIva.valorImporte = double.Parse(rdDetalleFac.GetSqlDouble(19).ToString()).TomarDecimales(2);

                                tributosWRKIva.tributoFijoUnidades     = 0;
                                tributosWRKIva.tributoFijoValorImporte = 0;
                                listaTributos.Add(tributosWRKIva);
                                lineaProducto.tributos = listaTributos;
                                if (rdDetalleFac.GetInt32(16) > 0)
                                {
                                    ValorTasaIva     = rdDetalleFac.GetInt32(16);
                                    TotalGravadoIva += totalUnitario;// double.Parse(rdDetalleFac.GetSqlMoney(14).ToString());
                                    ValorTotalIva   += double.Parse(rdDetalleFac.GetSqlDouble(19).ToString()).TomarDecimales(2);
                                }
                                else
                                {
                                    TotalExcentoIva += totalUnitario;// double.Parse(rdDetalleFac.GetSqlDouble(18).ToString());
                                }

                                detalleProductos.Add(lineaProducto);
                                nroLinea++;

                                // Para moneda extranjera:vr_Total_Inte-vr_IVA_Inte de la tabla
                            }
                            catch (Exception sqlExp)
                            {
                                string error = $"Mensaje de Error:{sqlExp.Message}   Traza de la Pila:{sqlExp.StackTrace}";
                                logFacturas.Warn($"Se ha presentado una Excepcion:{error}");
                                throw;
                            }
                        }
                    }
                    else // Si No  hay Detalle de Productos
                    {
                    }
                }

                documentoF2.detalles = detalleProductos;

                List <TributosItem>    tributosTMP         = new List <TributosItem>(); //Segmento de Iva  pata Totales de Factura
                List <DetalleTributos> tributosDetalle     = new List <DetalleTributos>();
                DetalleTributos        detalleTributosItem = new DetalleTributos();     // Un Objeto por cada Tipo de Iva
                //***estos valores se deben tomar del select o Tabla
                //double valorImporte = double.Parse(_valorIva.ToString());
                //double valorBase = double.Parse((_Valtotal - _valorIva).ToString());
                //double porcentaje = Math.Round(((valorImporte / valorBase) * 100).TomarDecimales(2), 0);
                //detalleTributosItem.valorImporte = valorImporte;
                //detalleTributosItem.valorBase = valorBase;
                //detalleTributosItem.porcentaje = porcentaje;
                detalleTributosItem.valorImporte = ValorTotalIva;
                detalleTributosItem.valorBase    = TotalGravadoIva;
                detalleTributosItem.porcentaje   = double.Parse(ValorTasaIva.ToString()).TomarDecimales(2);
                tributosDetalle.Add(detalleTributosItem);
                TributosItem itemTributo = new TributosItem()
                {
                    id                = "01", //Total de Iva
                    nombre            = "Iva",
                    esImpuesto        = true,
                    valorImporteTotal = ValorTotalIva,
                    detalles          = tributosDetalle // Detalle de los Ivas
                };
                tributosTMP.Add(itemTributo);
                documentoF2.tributos = tributosTMP;///
                Totales totalesTmp = new Totales()
                {
                    valorBruto             = ValorBruto, // double.Parse(ValorBruto.ToString()),
                    valorAnticipos         = double.Parse(_ValPagos.ToString()),
                    valorTotalSinImpuestos = ValorBruto,
                    valorTotalConImpuestos = ValorBruto - double.Parse(_ValPagos.ToString()) + double.Parse(ValorTotalIva.ToString()),
                    valorNeto = ValorBruto - double.Parse(_ValPagos.ToString()) + double.Parse(ValorTotalIva.ToString()) //double.Parse(_ValCobrar.ToString())
                };
                documentoF2.totales = totalesTmp;
                logFacturas.Info("Numero de Productos procesados, para JSon:" + detalleProductos.Count);

                double   tasa          = 0;
                string   monedaDestino = String.Empty;
                DateTime fechaTrm      = DateTime.Now;
                using (SqlConnection connX1 = new SqlConnection(Properties.Settings.Default.DBConexion))
                {
                    connX1.Open();
                    string     qryTasa = "SELECT Trm,FechaTrm,MonedaOrigen FROM facFacturaTasaTrm WHERE idFactura=@idFactura";
                    SqlCommand cmdTasa = new SqlCommand(qryTasa, connX1);
                    cmdTasa.Parameters.Add("@idFactura", SqlDbType.Int).Value = nroFactura;
                    SqlDataReader rdTasa = cmdTasa.ExecuteReader();
                    if (rdTasa.HasRows)
                    {
                        rdTasa.Read();
                        tasa          = rdTasa.GetDouble(0);
                        fechaTrm      = rdTasa.GetDateTime(1);
                        monedaDestino = rdTasa.GetString(2);
                    }
                    else
                    {
                        logFacturas.Info($"No se encontro Tasa de Cambio para la Factura Numero:{nroFactura}");
                    }
                }
                formatoWrk = formatosFecha.formatofecha(fechaTrm);
                TRM tasaInf = new TRM();
                tasaInf.valor         = tasa;
                tasaInf.monedaDestino = monedaDestino;
                tasaInf.fecha         = formatoWrk.Split('T')[0];
                facturaEnviar.TRM     = tasaInf;

                logFacturas.Info("Numero de Productos procesados, para JSon:" + detalleProductos.Count);
                try
                {
                    string urlConsumo = Properties.Settings.Default.urlFacturaElectronica;// + Properties.Settings.Default.recursoFacturaE;
                    logFacturas.Info("URL de Request:" + urlConsumo);
                    HttpWebRequest request = WebRequest.Create(urlConsumo) as HttpWebRequest;
                    //request.Timeout = 60 * 1000;
                    documentoF2.documento = facturaEnviar;
                    string facturaJson = JsonConvert.SerializeObject(documentoF2);
                    logFacturas.Info("Json de la Factura:" + facturaJson);
                    request.Method      = "POST";
                    request.ContentType = "application/json";
                    string Usuario      = Properties.Settings.Default.usuario;
                    string Clave        = Properties.Settings.Default.clave;
                    string credenciales = Convert.ToBase64String(Encoding.ASCII.GetBytes(Usuario + ":" + Clave));
                    request.Headers.Add("Authorization", "Basic " + credenciales);
                    Byte[] data = Encoding.UTF8.GetBytes(facturaJson);

                    Stream st = request.GetRequestStream();
                    st.Write(data, 0, data.Length);
                    st.Close();

                    int loop1, loop2;
                    NameValueCollection valores;
                    valores = request.Headers;

                    // Pone todos los nombres en un Arregle
                    string[] arr1 = valores.AllKeys;
                    for (loop1 = 0; loop1 < arr1.Length; loop1++)
                    {
                        logFacturas.Info("Key: " + arr1[loop1] + "<br>");
                        // Todos los valores
                        string[] arr2 = valores.GetValues(arr1[loop1]);
                        for (loop2 = 0; loop2 < arr2.Length; loop2++)
                        {
                            logFacturas.Info("Value " + loop2 + ": " + arr2[loop2]);
                        }
                    }

                    HttpWebResponse response = request.GetResponse() as HttpWebResponse;
                    logFacturas.Info("Codigo Status:" + response.StatusCode);
                    logFacturas.Info("Descripcion Status:" + response.StatusDescription);
                    StreamReader lectorDatos    = new StreamReader(response.GetResponseStream());
                    string       datosRespuesta = lectorDatos.ReadToEnd();
                    logFacturas.Info("Respuesta Recibida Transfiriendo:" + datosRespuesta);
                    string valorRpta = "00";

                    RespuestaTransfiriendo respuesta = JsonConvert.DeserializeObject <RespuestaTransfiriendo>(datosRespuesta);
                    if (respuesta.esExitoso)
                    {
                        logFacturas.Info($"PDF:{respuesta.resultado.URLPDF}");
                        logFacturas.Info($"XML:{respuesta.resultado.URLXML}");
                        logFacturas.Info($"UUID:{ respuesta.resultado.UUID}");
                        logFacturas.Info($"QR:{respuesta.resultado.QR}");
                        using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.DBConexion))
                        {
                            conn.Open();
                            string     strActualiza = @"UPDATE dbo.facFacturaTempWEBService SET identificador=@identificador WHERE IdFactura=@nrofactura";
                            SqlCommand cmdActualiza = new SqlCommand(strActualiza, conn);
                            cmdActualiza.Parameters.Add("@identificador", SqlDbType.VarChar).Value = respuesta.resultado.UUID;
                            cmdActualiza.Parameters.Add("@nrofactura", SqlDbType.Int).Value        = nroFactura;
                            if (cmdActualiza.ExecuteNonQuery() > 0)
                            {
                                logFacturas.Info("Factura Actualizada con UUID en facFacturaTempWEBService");
                                using (WebClient webClient = new WebClient())
                                {
                                    try
                                    {
                                        string carpetaDescarga = Properties.Settings.Default.urlDescargaPdfFACT + DateTime.Now.Year + @"\" + respuesta.resultado.UUID + ".pdf";
                                        logFacturas.Info("Carpeta de Descarga:" + carpetaDescarga);
                                        webClient.DownloadFile(respuesta.resultado.URLPDF, carpetaDescarga);
                                        //System.Threading.Thread.Sleep(1000);
                                        logFacturas.Info($"Descarga de PDF Factura...Terminada");
                                        carpetaDescarga = Properties.Settings.Default.urlDescargaPdfFACT + DateTime.Now.Year + @"\" + respuesta.resultado.UUID + ".XML";
                                        webClient.DownloadFile(respuesta.resultado.URLXML, carpetaDescarga);
                                        //System.Threading.Thread.Sleep(1000);
                                        logFacturas.Info($"Descarga de XML...Terminada");
                                        using (SqlConnection conn3 = new SqlConnection(Properties.Settings.Default.DBConexion))
                                        {
                                            conn3.Open();
                                            string     qryActualizaTempWEBService = @"UPDATE dbo.facFacturaTempWEBService SET CodCUFE=@cufe,cadenaQR=@cadenaQR WHERE identificador=@identificador";
                                            SqlCommand cmdActualizaTempWEBService = new SqlCommand(qryActualizaTempWEBService, conn);
                                            cmdActualizaTempWEBService.Parameters.Add("@cufe", SqlDbType.VarChar).Value          = respuesta.resultado.UUID;
                                            cmdActualizaTempWEBService.Parameters.Add("@cadenaQR", SqlDbType.NVarChar).Value     = respuesta.resultado.QR;
                                            cmdActualizaTempWEBService.Parameters.Add("@identificador", SqlDbType.VarChar).Value = respuesta.resultado.UUID;
                                            if (cmdActualizaTempWEBService.ExecuteNonQuery() > 0)
                                            {
                                                logFacturas.Info("Descarga Existosa de Archivos de la Factura con Identificadotr:" + respuesta.resultado.UUID + " Destino:" + carpetaDescarga);
                                                if (!(respuesta.advertencias is null))
                                                {
                                                    string     qryAdvertencia         = @"INSERT INTO dbo.facFacturaTempWSAdvertencias(IdFactura,CodAdvertencia,FecRegistro,DescripcionAdv) 
VALUES(@IdFactura, @CodAdvertencia, @FecRegistro, @DescripcionAdv)";
                                                    SqlCommand cmdInsertarAdvertencia = new SqlCommand(qryAdvertencia, conn);
                                                    cmdInsertarAdvertencia.Parameters.Add("@IdFactura", SqlDbType.Int);
                                                    cmdInsertarAdvertencia.Parameters.Add("@CodAdvertencia", SqlDbType.VarChar);
                                                    cmdInsertarAdvertencia.Parameters.Add("@DescripcionAdv", SqlDbType.NVarChar);
                                                    cmdInsertarAdvertencia.Parameters.Add("@FecRegistro", SqlDbType.DateTime);
                                                    foreach (AdvertenciasItem itemAdv in respuesta.advertencias)
                                                    {
                                                        cmdInsertarAdvertencia.Parameters["@IdFactura"].Value      = nroFactura;
                                                        cmdInsertarAdvertencia.Parameters["@CodAdvertencia"].Value = itemAdv.codigo;
                                                        //cmdInsertarAdvertencia.Parameters["@consecutivo"].Value = consecutivo;
                                                        cmdInsertarAdvertencia.Parameters["@FecRegistro"].Value    = DateTime.Now;
                                                        cmdInsertarAdvertencia.Parameters["@DescripcionAdv"].Value = itemAdv.mensaje;
                                                        if (cmdInsertarAdvertencia.ExecuteNonQuery() > 0)
                                                        {
                                                            logFacturas.Info($"Se Inserta Detalle de Advertencias: Codigo Advertencia{itemAdv.codigo} Mensaje Advertencia:{itemAdv.mensaje}");
                                                        }
                                                        else
                                                        {
                                                            logFacturas.Info($"No es Posible Insertar Detalle de Advertencias: Codigo Advertencia{itemAdv.codigo} Mensaje Advertencia:{itemAdv.mensaje}");
                                                        }
                                                    }
                                                }
                                                valorRpta = nroFactura.ToString();
                                            }
                                            else
                                            {
                                                logFacturas.Info($"No fue Posible Realizar la Descarga de Archivos de la Factura con Identificadotr:{respuesta.resultado.UUID} Estado Proceso de Factura:{respuesta.esExitoso}");
                                            }
                                        }
                                    }
                                    catch (NotSupportedException nSuppExp)
                                    {
                                        logFacturas.Info("Se ha presentado una NotSupportedException durante la descarga de los objetos de la Factura:" + nSuppExp.Message + "     " + nSuppExp.InnerException.Message);
                                        valorRpta = "9X";
                                    }
                                    catch (ArgumentNullException argNull)
                                    {
                                        logFacturas.Info("Se ha presentado una ArgumentNullException durante la descarga de los objetos de la Factura:" + argNull.Message + "     " + argNull.InnerException.Message);
                                        valorRpta = "9X";
                                    }
                                    catch (WebException webEx1)
                                    {
                                        logFacturas.Info("Se ha presentado una Falla durante la descarga de los objetos de la factura:" + webEx1.Message + "     " + webEx1.InnerException.Message);
                                        logFacturas.Warn($"Pila de Mensajes:::::{webEx1.StackTrace}");
                                        valorRpta = "93";
                                    }
                                    catch (Exception exx)
                                    {
                                        logFacturas.Info("No fue posible descargar los archivos.PDF, XML y QR  !!! Causa:" + exx.Message);
                                        valorRpta = "98";
                                    }
                                }
                            }
                            else
                            {
                                logFacturas.Info("!!!   No fue posible Actualizar la Factura en la Tabla: facFacturaTempWEBService   !!!");
                            }
                        }
                    }
                    else
                    {
                        using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.DBConexion))
                        {
                            conn.Open();
                            string     qryInsertaError  = @"INSERT INTO facFacturaTempWEBServiceError (IdFactura,CodError,DescripcionError,FecRegistro) 
VALUES(@IdFactura, @CodError, @DescripcionError, @FecRegistro)";
                            SqlCommand cmdInsertarError = new SqlCommand(qryInsertaError, conn);
                            cmdInsertarError.Parameters.Add("@IdFactura", SqlDbType.Int).Value             = nroFactura;
                            cmdInsertarError.Parameters.Add("@CodError", SqlDbType.VarChar).Value          = respuesta.codigo;
                            cmdInsertarError.Parameters.Add("@DescripcionError", SqlDbType.NVarChar).Value = respuesta.mensaje;
                            cmdInsertarError.Parameters.Add("@FecRegistro", SqlDbType.DateTime).Value      = DateTime.Parse(respuesta.fecha);
                            if (cmdInsertarError.ExecuteNonQuery() > 0)
                            {
                                valorRpta = nroFactura.ToString();
                                string     qryDetErr = @"INSERT INTO facFacturaTempWSErrorDetalle (IdFactura,CodError,consecutivo,FecRegistro,DescripcionError) 
VALUES(@IdFactura, @CodError, @consecutivo, @FecRegistro, @DescripcionError)";
                                SqlCommand cmdDetErr = new SqlCommand(qryDetErr, conn);
                                cmdDetErr.Parameters.Add("@IdFactura", SqlDbType.Int);
                                cmdDetErr.Parameters.Add("@CodError", SqlDbType.VarChar);
                                cmdDetErr.Parameters.Add("@consecutivo", SqlDbType.Int);
                                cmdDetErr.Parameters.Add("@FecRegistro", SqlDbType.DateTime);
                                cmdDetErr.Parameters.Add("@DescripcionError", SqlDbType.NVarChar);
                                List <ErroresItem> listaErrores = new List <ErroresItem>();
                                int consecutivo = 1;
                                foreach (ErroresItem itemErr in respuesta.errores)
                                {
                                    cmdDetErr.Parameters["@IdFactura"].Value        = nroFactura;
                                    cmdDetErr.Parameters["@CodError"].Value         = itemErr.codigo;
                                    cmdDetErr.Parameters["@consecutivo"].Value      = consecutivo;
                                    cmdDetErr.Parameters["@FecRegistro"].Value      = DateTime.Parse(respuesta.fecha);
                                    cmdDetErr.Parameters["@DescripcionError"].Value = itemErr.mensaje;
                                    if (cmdDetErr.ExecuteNonQuery() > 0)
                                    {
                                        logFacturas.Info($"Se Inserta Detalle de Errores:codigo{itemErr.codigo} Mensaje:{itemErr.mensaje}");
                                    }
                                    else
                                    {
                                        logFacturas.Info($"No es Posible Insertar Detalle de Errores: Codigo{itemErr.codigo} Mensaje:{itemErr.mensaje}");
                                    }
                                    consecutivo++;
                                }
                            }
                            else
                            {
                                valorRpta = "99";
                            }
                        }
                    }
                    return(valorRpta);
                    //}
                    //else
                    //{
                    //    logFacturas.Info("!!!  Recuperacion Documentos de la Factura, No fue posible. No se Actualiza la Factura en facFacturaTempWEBService   !!!");
                    //    logFacturas.Warn("Respuesta recibida:" + strsb);
                    //    //*Aqui se debe insertar en la tabla de fallas
                    //    return "Recuperacion Documentos de la Factura, No fue posible. No se Actualiza la Factura en facFacturaTempWEBService";
                    //}

                    //}
                }
                catch (WebException wExp01)
                {
                    logFacturas.Warn("Se ha presentado una excepcion Http:" + wExp01.Message + " Pila de LLamados:" + wExp01.StackTrace);
                    return("93");
                }
                catch (NotSupportedException nsExp01)
                {
                    logFacturas.Warn("Se ha presentado una excepcion Http:" + nsExp01.Message + " Pila de LLamados:" + nsExp01.StackTrace);
                    return("94");
                }
                catch (ProtocolViolationException pexp01)
                {
                    logFacturas.Warn("Se ha presentado una excepcion Http:" + pexp01.Message + " Pila de LLamados:" + pexp01.StackTrace);
                    return("95");
                }
                catch (InvalidOperationException inExp01)
                {
                    logFacturas.Warn("Se ha presentado una excepcion Http:" + inExp01.Message + " Pila de LLamados:" + inExp01.StackTrace);
                    return("96");
                }
                catch (HttpListenerException httpExp)
                {
                    logFacturas.Warn("Se ha presentado una excepcion Http:" + httpExp.Message + " Pila de LLamados:" + httpExp.StackTrace);
                    return("97");
                }

                catch (Exception e)
                {
                    logFacturas.Warn("Se ha presentado una excepcion:" + e.Message + " Pila de LLamados:" + e.StackTrace);
                    return("98");
                }
            }
            catch (Exception exp)
            {
                logFacturas.Warn("Se ha presentado una Excepcion:" + exp.Message + "Pila de LLamadas:" + exp.StackTrace);
                return("99");
            }
        }
Esempio n. 7
0
        public string GetData(int nroFactura, int idCliente, string urlPdfFactura, string moneda)
        {
            logFacturas.Info($"Se recibe factura con siguientes datos:Factura x Actividad:{nroFactura} IdCliente:{idCliente} urlPdf:{urlPdfFactura}");
            try
            {
                decimal _Valtotal       = 0;
                double  TotalGravadoIva = 0;
                double  TotalExcentoIva = 0;
                double  ValorTotalIva   = 0;
                Int32   ValorTasaIva    = 0;
                double  ValorBruto      = 0;
                Decimal _ValPagos       = 0;
                decimal _ValCobrar      = 0;
                // Inicializacion
                //Int32 _idContrato = 0;
                //Decimal _ValDescuento = 0;
                //Decimal _ValDescuentoT = 0;
                //Decimal _ValImpuesto = 0;
                Decimal  _valorIva   = 0;
                DateTime _FecFactura = DateTime.Now;
                //Decimal _valPos = 0;
                //Decimal _valNoPos = 0;
                Int32  _IdUsuarioR      = 0;
                Int32  _idTercero       = 0;
                string _usrNombre       = string.Empty;
                string _usrNumDocumento = string.Empty;
                //Byte _usrIdTipoDoc = 0;
                string    _numDocCliente  = string.Empty;
                Byte      _tipoDocCliente = 0;
                string    _razonSocial    = string.Empty;
                string    _repLegal       = string.Empty;
                string    _RegimenFiscal  = string.Empty;
                Int16     _idNaturaleza   = 0;
                int       concepto        = 0;
                FormaPago formaPagoTmp    = new FormaPago();

                //Fin de Inicializacion
                documentoRoot documentoF2   = new documentoRoot();
                Documento     facturaEnviar = new Documento();
                facturaEnviar.identificadorTransaccion = "78ed919a-6382-48a8-acdc-0ae8c3e3761f";
                facturaEnviar.URLPDF                      = urlPdfFactura;
                facturaEnviar.NITFacturador               = Properties.Settings.Default.NitHusi;
                facturaEnviar.prefijo                     = Properties.Settings.Default.Prefijo;
                facturaEnviar.numeroDocumento             = nroFactura.ToString();
                facturaEnviar.tipoDocumento               = 1;
                facturaEnviar.subTipoDocumento            = "01";
                facturaEnviar.tipoOperacion               = "10";
                facturaEnviar.generaRepresentacionGrafica = false;

                using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.DBConexion))
                {
                    conn.Open();
                    string     qryFacturaEnc = @"SELECT  b.numdocrespaldo,IdTipoDocRespaldo,B.IdTercero,B.IdCliente,nomcliente,IdTipoDocCliente,B.NumDocumento,ValMonto,ValSaldo,FecRegistroC,FecRadicacion,IndEstado,ValFactura,a.IdUsuarioR,t.NomTercero,t.IdNaturaleza from cxcfacmanual a
inner join cxccuenta b on a.idcuenta=b.idcuenta 
inner join genTercero t ON b.IdTercero=t.IdTercero
WHERE b.numdocrespaldo=@nroFactura";
                    SqlCommand cmdFacturaEnc = new SqlCommand(qryFacturaEnc, conn);
                    cmdFacturaEnc.Parameters.Add("@nroFactura", SqlDbType.Int).Value = nroFactura;
                    SqlDataReader rdFacturaEnc = cmdFacturaEnc.ExecuteReader();
                    if (rdFacturaEnc.HasRows)
                    {
                        rdFacturaEnc.Read();
                        //_idContrato = rdFacturaEnc.GetInt32(0);
                        string valorTf = Math.Round(rdFacturaEnc.GetDouble(12), 0).ToString();
                        _Valtotal = Decimal.Parse(valorTf);
                        //_ValDescuento = 0;
                        //_ValDescuentoT = 0;
                        _ValPagos = 0;
                        //_ValImpuesto = 0;
                        _ValCobrar  = Decimal.Parse(Math.Round(rdFacturaEnc.GetDouble(12), 0).ToString());
                        _FecFactura = rdFacturaEnc.GetDateTime(9);
                        //_valPos = 0;
                        //_valNoPos = 0;

                        _IdUsuarioR = rdFacturaEnc.GetInt32(13);
                        //_usrNombre = rdFacturaEnc.GetString(11);
                        //_usrNumDocumento = rdFacturaEnc.GetString(12);
                        //_usrIdTipoDoc = rdFacturaEnc.GetByte(13);
                        _numDocCliente  = rdFacturaEnc.GetString(6);
                        _tipoDocCliente = rdFacturaEnc.GetByte(5);
                        _razonSocial    = rdFacturaEnc.GetString(4);
                        _repLegal       = rdFacturaEnc.GetString(4);
                        _idTercero      = rdFacturaEnc.GetInt32(2);
                        _idNaturaleza   = rdFacturaEnc.GetInt16(15);
                    }
                    if (_ValPagos > 0)
                    {
                        string     Consultapagos    = "SELECT IdConcepto FROM facFacAtenConcepto WHERE IdFactura=@idFactura";
                        SqlCommand cmdConsultaPagos = new SqlCommand(Consultapagos, conn);
                        cmdConsultaPagos.Parameters.Add("@idfactura", SqlDbType.Int).Value = nroFactura;
                        concepto = int.Parse(cmdConsultaPagos.ExecuteScalar().ToString());
                    }
                }
                string formatoWrk = formatosFecha.formatofecha(_FecFactura);
                facturaEnviar.fechaEmision = formatoWrk.Split('T')[0];
                facturaEnviar.horaEmision  = formatoWrk.Split('T')[1];
                facturaEnviar.moneda       = "COP";
                formaPagoTmp.tipoPago      = 1;
                formaPagoTmp.codigoMedio   = "10";
                facturaEnviar.formaPago    = formaPagoTmp;

                List <DetallesItem> detalleProductos = new List <DetallesItem>();
                //****************** CLIENTE
                //  Variables Inicializacion
                string _direccionCliente    = string.Empty;
                string _telefonoCliente     = string.Empty;
                string _municipioCliente    = string.Empty;
                string _departamento        = string.Empty;
                int    _localizacionCliente = 0;
                string _correoCliente       = string.Empty;
                //****
                using (SqlConnection connx = new SqlConnection(Properties.Settings.Default.DBConexion))
                {
                    connx.Open();
                    //                    string qryDatosCliente1 = @"SELECT C.DirCasa,C.DirOficina,IdLugarCliente,C.TelCasa,C.TelCelular,C.TelOficina,C.CorreoE,pp.nom_dipo,RIGHT(PP.cod_dipo,5) AS 'Codigo' FROM facfactura F
                    //INNER JOIN admAtencion A ON F.IdDestino=A.IdAtencion
                    //INNER JOIN admCliente C ON A.IdCliente=C.IdCliente
                    //INNER JOIN GEN_DIVI_POLI PP ON c.IdLugarCliente=PP.IdLugar
                    //WHERE IdFactura=@idFactura";
                    string     qryDatosCliente = @"SELECT IdLocalizaTipo,DesLocalizacion,B.nom_dipo,A.IdLugar,RIGHT(B.cod_dipo,5) FROM genTerceroLocaliza A
LEFT JOIN GEN_DIVI_POLI B ON A.IdLugar=B.IdLugar
WHERE IdTercero=@idTercero and IdLocalizaTipo IN (2,3)
ORDER BY IdLocalizaTipo";
                    SqlCommand cmdDatosCliente = new SqlCommand(qryDatosCliente, connx);
                    //logFacturas.Info($"_idTercero, para la busqueda del Correo, Administrativa, particular PN:{_idTercero}");
                    cmdDatosCliente.Parameters.Add("@idTercero", SqlDbType.Int).Value = _idTercero;
                    SqlDataReader rdDatosCliente = cmdDatosCliente.ExecuteReader();
                    if (rdDatosCliente.HasRows)
                    {
                        while (rdDatosCliente.Read())
                        {
                            if (rdDatosCliente.GetInt32(0) == 2)
                            {
                                _direccionCliente = rdDatosCliente.GetString(1);
                            }
                            else if (rdDatosCliente.GetInt32(0) == 3)
                            {
                                _localizacionCliente = rdDatosCliente.GetInt32(3);
                                _municipioCliente    = rdDatosCliente.GetString(4);
                                _telefonoCliente     = rdDatosCliente.GetString(1);
                                if (_telefonoCliente.Length > 10)
                                {
                                    _telefonoCliente = _telefonoCliente.Substring(0, 10);
                                }
                                else if (_telefonoCliente.Length == 0)
                                {
                                    _telefonoCliente = "5716519494";
                                }
                            }
                        }
                        //**
                        qryDatosCliente = @"SELECT C.DirCasa,C.DirOficina,IdLugarCliente,C.TelCasa,C.TelCelular,C.TelOficina,C.CorreoE,pp.nom_dipo,RIGHT(PP.cod_dipo,5) AS 'Codigo'  FROM admCliente C
                    INNER JOIN genTercero T ON C.idtercero = T.IdTercero
                    INNER JOIN GEN_DIVI_POLI PP ON c.IdLugarCliente = PP.IdLugar
                    WHERE T.IdTercero = @idTercero ";
                        using (SqlCommand cmdCorreo = new SqlCommand(qryDatosCliente, connx))
                        {
                            logFacturas.Info($"_idTercero, para la busqueda del Correo, Administrativa, particular PN:{_idTercero}");
                            cmdCorreo.Parameters.Add("@idTercero", SqlDbType.Int).Value = _idTercero;
                            SqlDataReader rdCorreo = cmdCorreo.ExecuteReader();
                            if (rdCorreo.HasRows)
                            {
                                rdCorreo.Read();
                                if (rdCorreo.IsDBNull(6))
                                {
                                    _correoCliente = "*****@*****.**";
                                }
                                else
                                {
                                    if (rdCorreo.GetString(6).Length == 0)
                                    {
                                        _correoCliente = "*****@*****.**";
                                    }
                                    else
                                    {
                                        _correoCliente = rdCorreo.GetString(6);
                                    }
                                }
                            }
                            else
                            {
                                _correoCliente = "*****@*****.**";
                            }
                        }
                        //**
                    }
                    else
                    {
                        qryDatosCliente = @"SELECT C.DirCasa,C.DirOficina,IdLugarCliente,C.TelCasa,C.TelCelular,C.TelOficina,C.CorreoE,pp.nom_dipo,RIGHT(PP.cod_dipo,5) AS 'Codigo'  FROM admCliente C
                    INNER JOIN genTercero T ON C.idtercero = T.IdTercero
                    INNER JOIN GEN_DIVI_POLI PP ON c.IdLugarCliente = PP.IdLugar
                    WHERE T.IdTercero = @idTercero ";
                        using (SqlCommand cmdCorreo = new SqlCommand(qryDatosCliente, connx))
                        {
                            logFacturas.Info($"_idTercero, para la busqueda del Correo, Administrativa, particular PN:{_idTercero}");
                            cmdCorreo.Parameters.Add("@idTercero", SqlDbType.Int).Value = _idTercero;
                            SqlDataReader rdCorreo = cmdCorreo.ExecuteReader();
                            if (rdCorreo.HasRows)
                            {
                                rdCorreo.Read();
                                if (rdCorreo.IsDBNull(6))
                                {
                                    _correoCliente = "*****@*****.**";
                                }
                                else
                                {
                                    if (rdCorreo.GetString(6).Length == 0)
                                    {
                                        _correoCliente = "*****@*****.**";
                                    }
                                    else
                                    {
                                        _correoCliente       = rdCorreo.GetString(6);
                                        _localizacionCliente = rdCorreo.GetInt32(2);
                                        _municipioCliente    = rdCorreo.GetString(8);
                                        _direccionCliente    = rdCorreo.GetString(0);
                                    }
                                }
                            }
                            else
                            {
                                _correoCliente = "*****@*****.**";
                            }
                        }
                    }
                    //                        string qryuCorreo = @"SELECT CorreoE FROM genTercero T
                    //INNER JOIN admCliente C ON T.IdCliente = C.IdCliente
                    //WHERE T.IdTercero = @idTercero";

                    string     qryDatosCliente2 = @"SELECT COD_DEPTO,COD_MPIO,DPTO,NOM_MPIO FROM GEN_DIVI_POLI A
                    INNER JOIN HUSI_Divipola HB ON a.num_ptel=COD_DEPTO
                    WHERE a.IdLugar=@idLugar";
                    SqlCommand cmdDatosCliente2 = new SqlCommand(qryDatosCliente2, connx);
                    cmdDatosCliente2.Parameters.Add("@idLugar", SqlDbType.Int).Value = _localizacionCliente;
                    SqlDataReader rdDatosCliente2 = cmdDatosCliente2.ExecuteReader();
                    if (rdDatosCliente2.HasRows)
                    {
                        rdDatosCliente2.Read();
                        _departamento = rdDatosCliente2.GetString(2);
                    }
                    string     qryIvaFact = @"SELECT sum(a.val_cuen) as totalIva
FROM cxcfacmanualdet a 
inner join cxccuenta b on a.idcuenta=b.idcuenta and  b.numdocrespaldo=@factura
WHERE a.cod_cuen in (  select replace (val_camp, ';','') from gen_enti_dato where  nom_camp='CXC_FIVA')";
                    SqlCommand cmdIvaFact = new SqlCommand(qryIvaFact, connx);
                    cmdIvaFact.Parameters.Add("@factura", SqlDbType.Int).Value = nroFactura;
                    SqlDataReader rdIvaFact = cmdIvaFact.ExecuteReader();
                    if (rdIvaFact.HasRows)
                    {
                        rdIvaFact.Read();
                        if (!rdIvaFact.IsDBNull(0))
                        {
                            _valorIva = Math.Round(rdIvaFact.GetDecimal(0), 0);
                        }
                    }
                }
                if (_telefonoCliente.Length == 0)
                {
                    _telefonoCliente = "5716519494";
                }
                Adquiriente adquirienteTmp = new Adquiriente
                {
                    identificacion = _numDocCliente,
                    codigoInterno  = _idTercero.ToString(),
                    razonSocial    = _razonSocial,
                    nombreSucursal = _razonSocial,
                    correo         = _correoCliente.Trim().Split(';')[0],
                    telefono       = _telefonoCliente,
                };

                using (SqlConnection connXX = new SqlConnection(Properties.Settings.Default.DBConexion))
                {
                    connXX.Open();
                    string     qryTipoDocDian = "SELECT TipoDocDian FROM homologaTipoDocDian WHERE IdTipoDoc=@tipoDoc";
                    SqlCommand cmdTipoDocDian = new SqlCommand(qryTipoDocDian, connXX);
                    cmdTipoDocDian.Parameters.Add("@tipoDoc", SqlDbType.TinyInt).Value = _tipoDocCliente;
                    Int16 tipoDoc = Int16.Parse(cmdTipoDocDian.ExecuteScalar().ToString());
                    _tipoDocCliente = byte.Parse(tipoDoc.ToString());
                }
                adquirienteTmp.tipoIdentificacion = _tipoDocCliente;
                List <NotificacionesItem> notificaciones = new List <NotificacionesItem>();
                NotificacionesItem        notificaItem   = new NotificacionesItem();
                notificaItem.tipo = 1;
                List <string> valorNotificacion = new List <string>();
                valorNotificacion.Add(_correoCliente.Trim());
                notificaItem.valor = valorNotificacion;
                notificaciones.Add(notificaItem);
                facturaEnviar.notificaciones = notificaciones;

                if (_RegimenFiscal.Equals("C"))
                {
                    adquirienteTmp.tipoRegimen = "48";
                }
                else
                {
                    adquirienteTmp.tipoRegimen = "49";
                }
                //TODO: Aqui insertar lo que se defina de Responsabilidades  RUT documentoF2.adquiriente.responsabilidadesRUT
                if (_idNaturaleza == 3)
                {
                    adquirienteTmp.tipoPersona = "1";
                }
                else if (_idNaturaleza == 4)
                {
                    adquirienteTmp.tipoPersona = "2";
                }
                else
                {
                    adquirienteTmp.tipoPersona = "0";
                }
                List <string> responsanbilidadesR = new List <string>();
                using (SqlConnection conexion01 = new SqlConnection(Properties.Settings.Default.DBConexion))
                {
                    conexion01.Open();
                    SqlCommand sqlValidaDet = new SqlCommand("spTerceroResponsabilidadRut", conexion01);
                    sqlValidaDet.CommandType = CommandType.StoredProcedure;
                    sqlValidaDet.Parameters.Add("@idtercero", SqlDbType.Int).Value = _idTercero;
                    SqlDataReader rdValidaDet = sqlValidaDet.ExecuteReader();
                    if (rdValidaDet.HasRows)
                    {
                        rdValidaDet.Read();
                        responsanbilidadesR.Add(rdValidaDet.GetString(0));
                    }
                    else
                    {
                        responsanbilidadesR.Add("R-99-PN");
                    }
                }

                adquirienteTmp.responsabilidadesRUT = responsanbilidadesR;
                Ubicacion ubicacionCliente = new Ubicacion();
                ubicacionCliente.pais            = "CO";
                ubicacionCliente.codigoMunicipio = _municipioCliente;
                ubicacionCliente.direccion       = _direccionCliente;
                adquirienteTmp.ubicacion         = ubicacionCliente;
                documentoF2.adquiriente          = adquirienteTmp;

                //double TotalGravadoIva = 0;
                //double TotalGravadoIca = 0;

                List <AnticiposItem> anticiposWrk = new List <AnticiposItem>();
                AnticiposItem        anticipoWrk  = new AnticiposItem();
                anticipoWrk.comprobante   = "22";
                anticipoWrk.valorAnticipo = double.Parse(_ValPagos.ToString());
                anticiposWrk.Add(anticipoWrk);
                documentoF2.anticipos = anticiposWrk;

                List <TributosItem>    tributosTMP     = new List <TributosItem>();
                List <DetalleTributos> tributosDetalle = new List <DetalleTributos>();
                DetalleTributos        detalleTributos = new DetalleTributos(); // Un Objeto por cada Tipo de Iva

                double valorImporte = double.Parse(_valorIva.ToString());
                double valorBase    = double.Parse((_Valtotal - _valorIva).ToString());
                double porcentaje   = Math.Round(((valorImporte / valorBase) * 100).TomarDecimales(2), 0);
                detalleTributos.valorImporte = valorImporte;
                detalleTributos.valorBase    = valorBase;
                detalleTributos.porcentaje   = porcentaje;

                tributosDetalle.Add(detalleTributos);
                TributosItem itemTributo = new TributosItem()
                {
                    id                = "01", //Total de Iva
                    nombre            = "Iva",
                    esImpuesto        = true,
                    valorImporteTotal = valorImporte,
                    detalles          = tributosDetalle // Detalle de los Ivas
                };
                //tributosTMP.Add(itemTributo);
                //************************************************************ Detalle de Factura por Administrativa Particular ***********************************************************
                using (SqlConnection conexion01 = new SqlConnection(Properties.Settings.Default.DBConexion))
                {
                    conexion01.Open();
                    //string strDetalleFac = @"SELECT top 10 b.numdocrespaldo, c.* FROM cxcfacmanual a
                    string     strDetalleFac = @"SELECT  top 1000 b.numdocrespaldo as factura,CONVERT(VARCHAR,c.IdCuenta)+'-'+CONVERT(varchar,C.num_regi) AS codProducto, c.* FROM cxcfacmanual a
INNER JOIN cxccuenta b on a.idcuenta = b.idcuenta
INNER JOIN cxcfacmanualconc c on c.IdCuenta = a.idcuenta
WHERE c.val_unit_inte is null and NumDocRespaldo = @idFactura ORDER BY c.num_regi";
                    SqlCommand cmdDetalleFac = new SqlCommand(strDetalleFac, conexion01);
                    cmdDetalleFac.Parameters.Add("@idFactura", SqlDbType.Int).Value = nroFactura;
                    SqlDataReader rdDetalleFac = cmdDetalleFac.ExecuteReader();
                    if (rdDetalleFac.HasRows)
                    {
                        Int16 nroLinea = 1;
                        while (rdDetalleFac.Read())
                        {
                            try
                            {
                                List <TibutosDetalle> listaTributos = new List <TibutosDetalle>(); //Tributos para lalinea de producto
                                DetallesItem          lineaProducto = new DetallesItem();
                                lineaProducto.tipoDetalle = 1;                                     // Linea Normal
                                string codigoProducto = rdDetalleFac.GetString(1);
                                lineaProducto.descripcion         = rdDetalleFac.GetString(5);
                                lineaProducto.valorCodigoInterno  = codigoProducto;
                                lineaProducto.codigoEstandar      = "999";
                                lineaProducto.valorCodigoEstandar = codigoProducto;
                                double cantidad = double.Parse(rdDetalleFac.GetInt32(4).ToString());
                                lineaProducto.unidades     = cantidad;// double.Parse(rdDetalleFac.GetInt32(4).ToString());
                                lineaProducto.unidadMedida = "94";
                                double valUnitario = double.Parse(rdDetalleFac.GetSqlMoney(6).ToString());
                                lineaProducto.valorUnitarioBruto = valUnitario;            // double.Parse(rdDetalleFac.GetSqlMoney(6).ToString());
                                lineaProducto.valorBruto         = valUnitario * cantidad; //double.Parse(rdDetalleFac.GetSqlMoney(6).ToString());
                                lineaProducto.valorBrutoMoneda   = "COP";
                                double totalProducto = valUnitario * cantidad;
                                ValorBruto += totalProducto;                          //double.Parse(rdDetalleFac.GetSqlMoney(6).ToString());
                                int            tasaIva        = 0;
                                TibutosDetalle tributosWRKIva = new TibutosDetalle(); //Detalle de tributos, para el producto
                                tributosWRKIva.id         = "01";
                                tributosWRKIva.nombre     = "Iva";
                                tributosWRKIva.esImpuesto = true;
                                if (rdDetalleFac.IsDBNull(10))
                                {
                                    tributosWRKIva.porcentaje = 0;
                                }
                                else
                                {
                                    tasaIva = (rdDetalleFac.GetInt32(10));
                                    tributosWRKIva.porcentaje = double.Parse(rdDetalleFac.GetInt32(10).ToString()).TomarDecimales(2); //**************************
                                }
                                tributosWRKIva.valorBase               = totalProducto;                                               // double.Parse(rdDetalleFac.GetSqlMoney(6).ToString());
                                tributosWRKIva.valorImporte            = double.Parse(rdDetalleFac.GetSqlDouble(11).ToString()).TomarDecimales(2);
                                tributosWRKIva.tributoFijoUnidades     = 0;
                                tributosWRKIva.tributoFijoValorImporte = 0;
                                listaTributos.Add(tributosWRKIva);
                                lineaProducto.tributos = listaTributos;
                                if (rdDetalleFac.GetInt32(10) > 0)
                                {
                                    ValorTasaIva     = rdDetalleFac.GetInt32(10);
                                    TotalGravadoIva += totalProducto;// double.Parse(rdDetalleFac.GetSqlMoney(5).ToString());
                                    ValorTotalIva   += double.Parse(rdDetalleFac.GetSqlDouble(11).ToString()).TomarDecimales(2);
                                }
                                else
                                {
                                    TotalExcentoIva += totalProducto;// double.Parse(rdDetalleFac.GetSqlMoney(5).ToString());
                                }
                                detalleProductos.Add(lineaProducto);
                                nroLinea++;
                            }
                            catch (Exception sqlExp)
                            {
                                string error = $"Mensaje de Error:{sqlExp.Message}   Traza de la Pila:{sqlExp.StackTrace}";
                                logFacturas.Warn($"Se ha presentado una Excepcion:{error}");
                                throw;
                            }
                        }
                    }
                    else // Si No  hay Detalle de Productos
                    {
                        //todo: Insertar la funcion para el cargue de errores
                    }
                }
                //***************************** Finalizacion Y Liquidacion
                documentoF2.detalles = detalleProductos;
                tributosTMP.Add(itemTributo);
                documentoF2.tributos = tributosTMP;
                ///<summary>
                ///Inicio de Totales de la Factura
                /// </summary>
                Totales totalesTmp = new Totales()
                {
                    valorBruto             = double.Parse(valorBase.ToString()),
                    valorAnticipos         = double.Parse(_ValPagos.ToString()),
                    valorTotalSinImpuestos = valorBase,
                    valorTotalConImpuestos = double.Parse(valorBase.ToString()) + double.Parse(valorImporte.ToString()),
                    valorNeto = double.Parse(_ValCobrar.ToString())
                };
                documentoF2.totales   = totalesTmp;
                documentoF2.documento = facturaEnviar;
                logFacturas.Info("Numero de Productos procesados, para JSon:" + detalleProductos.Count);

                try
                {
                    string urlConsumo = Properties.Settings.Default.urlFacturaElectronica; //+ Properties.Settings.Default.recursoFacturaE;
                    logFacturas.Info("URL de Request:" + urlConsumo);
                    HttpWebRequest request = WebRequest.Create(urlConsumo) as HttpWebRequest;
                    request.Timeout = 60 * 1000;
                    string facturaJson = JsonConvert.SerializeObject(documentoF2);
                    logFacturas.Info("Json de la Factura:" + facturaJson);
                    request.Method      = "POST";
                    request.ContentType = "application/json";
                    string Usuario      = Properties.Settings.Default.usuario;
                    string Clave        = Properties.Settings.Default.clave;
                    string credenciales = Convert.ToBase64String(Encoding.ASCII.GetBytes(Usuario + ":" + Clave));
                    request.Headers.Add("Authorization", "Basic " + credenciales);

                    Byte[] data = Encoding.UTF8.GetBytes(facturaJson);

                    Stream st = request.GetRequestStream();
                    st.Write(data, 0, data.Length);
                    st.Close();

                    int loop1, loop2;
                    NameValueCollection valores;
                    valores = request.Headers;

                    // Pone todos los nombres en un Arregle
                    string[] arr1 = valores.AllKeys;
                    for (loop1 = 0; loop1 < arr1.Length; loop1++)
                    {
                        logFacturas.Info("Key: " + arr1[loop1] + "<br>");
                        // Todos los valores
                        string[] arr2 = valores.GetValues(arr1[loop1]);
                        for (loop2 = 0; loop2 < arr2.Length; loop2++)
                        {
                            logFacturas.Info("Value " + loop2 + ": " + arr2[loop2]);
                        }
                    }

                    HttpWebResponse response = request.GetResponse() as HttpWebResponse;
                    logFacturas.Info("Codigo Status:" + response.StatusCode);
                    logFacturas.Info("Descripcion Status:" + response.StatusDescription);
                    StreamReader sr    = new StreamReader(response.GetResponseStream());
                    string       strsb = sr.ReadToEnd();
                    logFacturas.Info("Respuesta Recibida Transfiriendo:" + strsb);
                    string valorRpta = "00";

                    RespuestaTransfiriendo respuesta = JsonConvert.DeserializeObject <RespuestaTransfiriendo>(strsb);
                    if (respuesta.esExitoso)
                    {
                        logFacturas.Info($"PDF:{respuesta.resultado.URLPDF}");
                        logFacturas.Info($"XML:{respuesta.resultado.URLXML}");
                        logFacturas.Info($"UUID:{ respuesta.resultado.UUID}");
                        logFacturas.Info($"QR:{respuesta.resultado.QR}");
                        using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.DBConexion))
                        {
                            conn.Open();
                            string     strActualiza = @"UPDATE dbo.facFacturaTempWEBService SET identificador=@identificador WHERE IdFactura=@nrofactura";
                            SqlCommand cmdActualiza = new SqlCommand(strActualiza, conn);
                            cmdActualiza.Parameters.Add("@identificador", SqlDbType.VarChar).Value = respuesta.resultado.UUID;
                            cmdActualiza.Parameters.Add("@nrofactura", SqlDbType.Int).Value        = nroFactura;
                            if (cmdActualiza.ExecuteNonQuery() > 0)
                            {
                                logFacturas.Info("Factura Actualizada con UUID en facFacturaTempWEBService");
                                using (WebClient webClient = new WebClient())
                                {
                                    try
                                    {
                                        string carpetaDescarga = Properties.Settings.Default.urlDescargaPdfFACT + DateTime.Now.Year + @"\" + respuesta.resultado.UUID + ".pdf";
                                        logFacturas.Info("Carpeta de Descarga:" + carpetaDescarga);
                                        webClient.DownloadFile(respuesta.resultado.URLPDF, carpetaDescarga);
                                        //System.Threading.Thread.Sleep(1000);
                                        logFacturas.Info($"Descarga de PDF Factura...Terminada");
                                        carpetaDescarga = Properties.Settings.Default.urlDescargaPdfFACT + DateTime.Now.Year + @"\" + respuesta.resultado.UUID + ".XML";
                                        webClient.DownloadFile(respuesta.resultado.URLXML, carpetaDescarga);
                                        //System.Threading.Thread.Sleep(1000);
                                        logFacturas.Info($"Descarga de XML...Terminada");
                                        using (SqlConnection conn3 = new SqlConnection(Properties.Settings.Default.DBConexion))
                                        {
                                            conn3.Open();
                                            string     qryActualizaTempWEBService = @"UPDATE dbo.facFacturaTempWEBService SET CodCUFE=@cufe,cadenaQR=@cadenaQR WHERE identificador=@identificador";
                                            SqlCommand cmdActualizaTempWEBService = new SqlCommand(qryActualizaTempWEBService, conn);
                                            cmdActualizaTempWEBService.Parameters.Add("@cufe", SqlDbType.VarChar).Value          = respuesta.resultado.UUID;
                                            cmdActualizaTempWEBService.Parameters.Add("@cadenaQR", SqlDbType.NVarChar).Value     = respuesta.resultado.QR;
                                            cmdActualizaTempWEBService.Parameters.Add("@identificador", SqlDbType.VarChar).Value = respuesta.resultado.UUID;
                                            if (cmdActualizaTempWEBService.ExecuteNonQuery() > 0)
                                            {
                                                logFacturas.Info("Descarga Existosa de Archivos de la Factura con Identificadotr:" + respuesta.resultado.UUID + " Destino:" + carpetaDescarga);
                                                if (!(respuesta.advertencias is null))
                                                {
                                                    string     qryAdvertencia         = @"INSERT INTO dbo.facFacturaTempWSAdvertencias(IdFactura,CodAdvertencia,FecRegistro,DescripcionAdv) 
VALUES(@IdFactura, @CodAdvertencia, @FecRegistro, @DescripcionAdv)";
                                                    SqlCommand cmdInsertarAdvertencia = new SqlCommand(qryAdvertencia, conn);
                                                    cmdInsertarAdvertencia.Parameters.Add("@IdFactura", SqlDbType.Int);
                                                    cmdInsertarAdvertencia.Parameters.Add("@CodAdvertencia", SqlDbType.VarChar);
                                                    cmdInsertarAdvertencia.Parameters.Add("@DescripcionAdv", SqlDbType.NVarChar);
                                                    cmdInsertarAdvertencia.Parameters.Add("@FecRegistro", SqlDbType.DateTime);

                                                    foreach (AdvertenciasItem itemAdv in respuesta.advertencias)
                                                    {
                                                        cmdInsertarAdvertencia.Parameters["@IdFactura"].Value = nroFactura;
                                                        cmdInsertarAdvertencia.Parameters["@CodError"].Value  = itemAdv.codigo;
                                                        //cmdInsertarAdvertencia.Parameters["@consecutivo"].Value = consecutivo;
                                                        cmdInsertarAdvertencia.Parameters["@FecRegistro"].Value      = DateTime.Now;
                                                        cmdInsertarAdvertencia.Parameters["@DescripcionError"].Value = itemAdv.mensaje;
                                                        if (cmdInsertarAdvertencia.ExecuteNonQuery() > 0)
                                                        {
                                                            logFacturas.Info($"Se Inserta Detalle de Advertencias: Codigo Advertencia{itemAdv.codigo} Mensaje Advertencia:{itemAdv.mensaje}");
                                                        }
                                                        else
                                                        {
                                                            logFacturas.Info($"No es Posible Insertar Detalle de Advertencias: Codigo Advertencia{itemAdv.codigo} Mensaje Advertencia:{itemAdv.mensaje}");
                                                        }
                                                    }
                                                }
                                                valorRpta = nroFactura.ToString();
                                            }
                                            else
                                            {
                                                valorRpta = "99";
                                                logFacturas.Info($"No fue Posible Realizar la Descarga de Archivos de la Factura con Identificadotr:{respuesta.resultado.UUID} Estado Proceso de Factura:{respuesta.esExitoso}");
                                            }
                                        }
                                    }
                                    catch (NotSupportedException nSuppExp)
                                    {
                                        logFacturas.Info("Se ha presentado una NotSupportedException durante la descarga de los objetos de la Factura:" + nSuppExp.Message + "     " + nSuppExp.InnerException.Message);
                                        valorRpta = "9X";
                                    }
                                    catch (ArgumentNullException argNull)
                                    {
                                        logFacturas.Info("Se ha presentado una ArgumentNullException durante la descarga de los objetos de la Factura:" + argNull.Message + "     " + argNull.InnerException.Message);
                                        valorRpta = "9X";
                                    }
                                    catch (WebException webEx1)
                                    {
                                        logFacturas.Info("Se ha presentado una Falla durante la descarga de los objetos de la factura:" + webEx1.Message + "     " + webEx1.InnerException.Message);
                                        logFacturas.Warn($"Pila de Mensajes:::::{webEx1.StackTrace}");
                                        valorRpta = "93";
                                    }
                                    catch (Exception exx)
                                    {
                                        logFacturas.Info($"No fue posible descargar los archivos.PDF, XML y QR  !!! Causa:{exx.Message}  Pila:{exx.StackTrace}");
                                        valorRpta = "98";
                                    }
                                }
                            }
                            else
                            {
                                valorRpta = "98";
                                logFacturas.Info("!!!   No fue posible Actualizar la Factura en la Tabla: facFacturaTempWEBService   !!!");
                            }
                        }
                        return(valorRpta);
                    }
                    else
                    {
                        using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.DBConexion))
                        {
                            conn.Open();
                            string     qryInsertaError  = @"INSERT INTO facFacturaTempWEBServiceError (IdFactura,CodError,DescripcionError,FecRegistro) 
VALUES(@IdFactura, @CodError, @DescripcionError, @FecRegistro)";
                            SqlCommand cmdInsertarError = new SqlCommand(qryInsertaError, conn);
                            cmdInsertarError.Parameters.Add("@IdFactura", SqlDbType.Int).Value             = nroFactura;
                            cmdInsertarError.Parameters.Add("@CodError", SqlDbType.VarChar).Value          = respuesta.codigo;
                            cmdInsertarError.Parameters.Add("@DescripcionError", SqlDbType.NVarChar).Value = respuesta.mensaje;
                            cmdInsertarError.Parameters.Add("@FecRegistro", SqlDbType.DateTime).Value      = DateTime.Parse(respuesta.fecha);
                            if (cmdInsertarError.ExecuteNonQuery() > 0)
                            {
                                valorRpta = nroFactura.ToString();
                                string     qryDetErr = @"INSERT INTO facFacturaTempWSErrorDetalle (IdFactura,CodError,consecutivo,FecRegistro,DescripcionError) 
VALUES(@IdFactura, @CodError, @consecutivo, @FecRegistro, @DescripcionError)";
                                SqlCommand cmdDetErr = new SqlCommand(qryDetErr, conn);
                                cmdDetErr.Parameters.Add("@IdFactura", SqlDbType.Int);
                                cmdDetErr.Parameters.Add("@CodError", SqlDbType.VarChar);
                                cmdDetErr.Parameters.Add("@consecutivo", SqlDbType.Int);
                                cmdDetErr.Parameters.Add("@FecRegistro", SqlDbType.DateTime);
                                cmdDetErr.Parameters.Add("@DescripcionError", SqlDbType.NVarChar);
                                List <ErroresItem> listaErrores = new List <ErroresItem>();
                                int consecutivo = 1;
                                foreach (ErroresItem itemErr in respuesta.errores)
                                {
                                    cmdDetErr.Parameters["@IdFactura"].Value        = nroFactura;
                                    cmdDetErr.Parameters["@CodError"].Value         = itemErr.codigo;
                                    cmdDetErr.Parameters["@consecutivo"].Value      = consecutivo;
                                    cmdDetErr.Parameters["@FecRegistro"].Value      = DateTime.Parse(respuesta.fecha);
                                    cmdDetErr.Parameters["@DescripcionError"].Value = itemErr.mensaje;
                                    if (cmdDetErr.ExecuteNonQuery() > 0)
                                    {
                                        logFacturas.Info($"Se Inserta Detalle de Errores:codigo{itemErr.codigo} Mensaje:{itemErr.mensaje}");
                                    }
                                    else
                                    {
                                        logFacturas.Info($"No es Posible Insertar Detalle de Errores: Codigo{itemErr.codigo} Mensaje:{itemErr.mensaje}");
                                    }
                                }
                            }
                            else
                            {
                                valorRpta = "99";
                            }
                        }
                    }

                    return(valorRpta);
                    //               }
                    //else
                    //{
                    //	logFacturas.Info("!!!  Recuperacion Documentos de la Factura, No fue posible. No se Actualiza la Factura en facFacturaTempWEBService   !!!");
                    //	logFacturas.Warn("Respuesta recibida:" + strsb);
                    //	//*Aqui se debe insertar en la tabla de fallas
                    //	return "Recuperacion Documentos de la Factura, No fue posible. No se Actualiza la Factura en facFacturaTempWEBService";
                    //}
                }
                catch (WebException wExp01)
                {
                    logFacturas.Warn("Se ha presentado una excepcion Http:" + wExp01.Message + " Pila de LLamados:" + wExp01.StackTrace);
                    return("93");
                }
                catch (NotSupportedException nsExp01)
                {
                    logFacturas.Warn("Se ha presentado una excepcion Http:" + nsExp01.Message + " Pila de LLamados:" + nsExp01.StackTrace);
                    return("94");
                }
                catch (ProtocolViolationException pexp01)
                {
                    logFacturas.Warn("Se ha presentado una excepcion Http:" + pexp01.Message + " Pila de LLamados:" + pexp01.StackTrace);
                    return("95");
                }
                catch (InvalidOperationException inExp01)
                {
                    logFacturas.Warn("Se ha presentado una excepcion Http:" + inExp01.Message + " Pila de LLamados:" + inExp01.StackTrace);
                    return("96");
                }
                catch (HttpListenerException httpExp)
                {
                    logFacturas.Warn("Se ha presentado una excepcion Http:" + httpExp.Message + " Pila de LLamados:" + httpExp.StackTrace);
                    return("97");
                }

                catch (Exception e)
                {
                    logFacturas.Warn("Se ha presentado una excepcion:" + e.Message + " Pila de LLamados:" + e.StackTrace);
                    return("98");
                }
            }
            catch (Exception exp)
            {
                logFacturas.Warn("Se ha presentado una Excepcion:" + exp.Message + "Pila de LLamadas:" + exp.StackTrace);
                return("99");
            }
        }
Esempio n. 8
0
        public string GetData(int nroFactura, int idCliente, int nroAtencion, string urlPdfFactura)
        {
            logFacturas.Info($"Se recibe factura con siguientes datos:Factura por Paquete:{ nroFactura}   IdCliente:{ idCliente}  nroAtencion:{ nroAtencion} urlPdf:{ urlPdfFactura}");
            try
            {
                Int32   _idContrato    = 0;
                Decimal _Valtotal      = 0;
                Decimal _ValDescuento  = 0;
                Decimal _ValDescuentoT = 0;
                Decimal _ValPagos      = 0;
                Decimal _ValImpuesto   = 0;
                //Int32 totalIvaFactura = 0;
                Decimal              _ValCobrar       = 0;
                DateTime             _FecFactura      = DateTime.Now;
                Decimal              _valPos          = 0;
                Decimal              _valNoPos        = 0;
                Int32                _IdUsuarioR      = 0;
                string               _usrNombre       = string.Empty;
                string               _usrNumDocumento = string.Empty;
                Byte                 _usrIdTipoDoc    = 0;
                string               _numDocCliente   = string.Empty;
                Byte                 _tipoDocCliente  = 0;
                string               _razonSocial     = string.Empty;
                string               _repLegal        = string.Empty;
                Int32                _idTercero       = 0;
                string               _RegimenFiscal   = string.Empty;
                Int16                _idNaturaleza    = 0;
                int                  concepto         = 0;
                FormaPago            formaPagoTmp     = new FormaPago();
                List <AnticiposItem> anticiposWrk     = new List <AnticiposItem>();
                //Fin de Inicializacion
                documentoRoot documentoF2   = new documentoRoot();
                Documento     facturaEnviar = new Documento();
                facturaEnviar.identificadorTransaccion = "D7F719C2 - 75F4 - 4F06 - B7CB - F583FC28DBEE";
                facturaEnviar.URLPDF                      = urlPdfFactura;
                facturaEnviar.NITFacturador               = Properties.Settings.Default.NitHusi;
                facturaEnviar.prefijo                     = Properties.Settings.Default.Prefijo;
                facturaEnviar.numeroDocumento             = nroFactura.ToString();
                facturaEnviar.tipoDocumento               = 1;
                facturaEnviar.subTipoDocumento            = "01";
                facturaEnviar.tipoOperacion               = "10";
                facturaEnviar.generaRepresentacionGrafica = false;

                using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.DBConexion))
                {
                    conn.Open();
                    string     qryFacturaEnc = @"SELECT fact.idContrato,Valtotal,ValDescuento,ValDescuentoT,ValPagos,ValImpuesto,ValCobrar,FecFactura,valPos,valNoPos,fact.IdUsuarioR,
usr.nom_usua,usr.NumDocumento,usr.IdTipoDoc,ter.IdTercero,ter.idRegimen,ter.IdNaturaleza,Cli.NomCliente,Cli.ApeCliente,cli.NumDocumento,Cli.IdTipoDoc 
FROM facFactura fact
INNER JOIN ASI_USUA usr ON fact.IdUsuarioR = usr.IdUsuario
INNER JOIN admAtencion Atn ON fact.IdDestino=Atn.IdAtencion
INNER JOIN AdmCliente Cli ON Atn.IdCliente=Cli.IdCliente
INNER JOIN genTercero ter ON Cli.IdTercero=ter.IdTercero
WHERE IdFactura  =  @nroFactura";
                    SqlCommand cmdFacturaEnc = new SqlCommand(qryFacturaEnc, conn);
                    cmdFacturaEnc.Parameters.Add("@nroFactura", SqlDbType.Int).Value = nroFactura;
                    SqlDataReader rdFacturaEnc = cmdFacturaEnc.ExecuteReader();
                    if (rdFacturaEnc.HasRows)
                    {
                        rdFacturaEnc.Read();
                        _idContrato      = rdFacturaEnc.GetInt32(0);
                        _Valtotal        = Math.Round(rdFacturaEnc.GetDecimal(1), 0);
                        _ValDescuento    = Math.Round(rdFacturaEnc.GetDecimal(2), 0);
                        _ValDescuentoT   = Math.Round(rdFacturaEnc.GetDecimal(3), 0);
                        _ValPagos        = Math.Round(rdFacturaEnc.GetDecimal(4), 0);
                        _ValImpuesto     = Math.Round(rdFacturaEnc.GetDecimal(5), 0);
                        _ValCobrar       = Math.Round(rdFacturaEnc.GetDecimal(6), 0);
                        _FecFactura      = rdFacturaEnc.GetDateTime(7);
                        _valPos          = Math.Round(rdFacturaEnc.GetDecimal(8), 0);
                        _valNoPos        = Math.Round(rdFacturaEnc.GetDecimal(9), 0);
                        _IdUsuarioR      = rdFacturaEnc.GetInt32(10);
                        _usrNombre       = rdFacturaEnc.GetString(11);
                        _usrNumDocumento = rdFacturaEnc.GetString(12);
                        _usrIdTipoDoc    = rdFacturaEnc.GetByte(13);
                        _numDocCliente   = rdFacturaEnc.GetString(19);
                        _tipoDocCliente  = rdFacturaEnc.GetByte(20);
                        _razonSocial     = $"{rdFacturaEnc.GetString(17)} {rdFacturaEnc.GetString(18)}";
                        //_repLegal = rdFacturaEnc.GetString(18);
                        _idTercero     = rdFacturaEnc.GetInt32(14);
                        _RegimenFiscal = rdFacturaEnc.GetString(15);
                        _idNaturaleza  = rdFacturaEnc.GetInt16(16);
                    }

                    if (_ValPagos > 0)
                    {
                        string     Consultapagos    = "SELECT IdConcepto,Valor FROM facFacAtenConcepto WHERE IdFactura=@idFactura";
                        SqlCommand cmdConsultaPagos = new SqlCommand(Consultapagos, conn);
                        cmdConsultaPagos.Parameters.Add("@idfactura", SqlDbType.Int).Value = nroFactura;
                        SqlDataReader rdConsultapagos = cmdConsultaPagos.ExecuteReader();
                        if (rdConsultapagos.HasRows)
                        {
                            while (rdConsultapagos.Read())
                            {
                                AnticiposItem anticipoWrk = new AnticiposItem();
                                anticipoWrk.comprobante   = $"{rdConsultapagos.GetInt32(0)}-{nroFactura}";
                                anticipoWrk.valorAnticipo = double.Parse(rdConsultapagos.GetDouble(1).ToString());
                                anticiposWrk.Add(anticipoWrk);
                            }
                        }
                    }
                }

                string formatoWrk = formatosFecha.formatofecha(_FecFactura);
                facturaEnviar.fechaEmision = formatoWrk.Split('T')[0];
                facturaEnviar.horaEmision  = formatoWrk.Split('T')[1];
                facturaEnviar.moneda       = "COP";
                formaPagoTmp.tipoPago      = 1;
                formaPagoTmp.codigoMedio   = "10";
                facturaEnviar.formaPago    = formaPagoTmp;

                List <DetallesItem> detalleProductos = new List <DetallesItem>();
                //****************** CLIENTE
                //  Variables Inicializacion
                string _direccionCliente    = string.Empty;
                string _telefonoCliente     = string.Empty;
                string _municipioCliente    = string.Empty;
                string _departamento        = string.Empty;
                int    _localizacionCliente = 0;
                string _correoCliente       = string.Empty;
                facturaEnviar.fechaEmision = formatoWrk.Split('T')[0];
                facturaEnviar.horaEmision  = formatoWrk.Split('T')[1];
                facturaEnviar.moneda       = "COP";
                formaPagoTmp.tipoPago      = 1;
                formaPagoTmp.codigoMedio   = "10";
                facturaEnviar.formaPago    = formaPagoTmp;
                using (SqlConnection connx = new SqlConnection(Properties.Settings.Default.DBConexion))
                {
                    connx.Open();
                    string     qryDatosCliente1 = @"SELECT C.DirCasa,C.DirOficina,IdLugarCliente,C.TelCasa,C.TelCelular,C.TelOficina,C.CorreoE,pp.nom_dipo,SUBSTRING(PP.cod_dipo,5,5) AS 'Codigo' FROM facfactura F
INNER JOIN admAtencion A ON F.IdDestino=A.IdAtencion
INNER JOIN admCliente C ON A.IdCliente=C.IdCliente
INNER JOIN GEN_DIVI_POLI PP ON c.IdLugarCliente=PP.IdLugar
WHERE IdFactura=@idFactura";
                    SqlCommand cmdDatosCliente1 = new SqlCommand(qryDatosCliente1, connx);
                    cmdDatosCliente1.Parameters.Add("@idFactura", SqlDbType.Int).Value = nroFactura;
                    SqlDataReader rdDatosCliente = cmdDatosCliente1.ExecuteReader();
                    if (rdDatosCliente.HasRows)
                    {
                        rdDatosCliente.Read();
                        if (rdDatosCliente.GetString(0).Length > 0)
                        {
                            _direccionCliente = rdDatosCliente.GetString(0);
                        }
                        else if (rdDatosCliente.GetString(1).Length > 0)
                        {
                            _direccionCliente = rdDatosCliente.GetString(1);
                        }
                        else
                        {
                            _direccionCliente = "Cra 7 No:40-62 Bogota";
                        }
                        _municipioCliente    = rdDatosCliente.GetString(8);
                        _localizacionCliente = rdDatosCliente.GetInt32(2);
                        if (rdDatosCliente.IsDBNull(6))
                        {
                            _correoCliente = "*****@*****.**";
                        }
                        else
                        {
                            _correoCliente = rdDatosCliente.GetString(6);
                        }
                        if (rdDatosCliente.GetString(3).Length > 0)
                        {
                            _telefonoCliente = rdDatosCliente.GetString(3);
                        }
                        else if (rdDatosCliente.GetString(4).Length > 0)
                        {
                            _telefonoCliente = rdDatosCliente.GetString(4);
                        }
                        else if (rdDatosCliente.GetString(5).Length > 0)
                        {
                            _telefonoCliente = rdDatosCliente.GetString(1);
                        }
                        if (_telefonoCliente.Length > 10)
                        {
                            _telefonoCliente = _telefonoCliente.Substring(0, 10);
                        }
                    }
                    string     qryDatosCliente2 = @"SELECT COD_DEPTO,COD_MPIO,DPTO,NOM_MPIO FROM GEN_DIVI_POLI A
                    INNER JOIN HUSI_Divipola HB ON a.num_ptel=COD_DEPTO
                    WHERE a.IdLugar=@idLugar";
                    SqlCommand cmdDatosCliente2 = new SqlCommand(qryDatosCliente2, connx);
                    cmdDatosCliente2.Parameters.Add("@idLugar", SqlDbType.Int).Value = _localizacionCliente;
                    SqlDataReader rdDatosCliente2 = cmdDatosCliente2.ExecuteReader();
                    if (rdDatosCliente2.HasRows)
                    {
                        rdDatosCliente2.Read();
                        _departamento = rdDatosCliente2.GetString(2);
                    }
                }
                Adquiriente adquirienteTmp = new Adquiriente
                {
                    identificacion = _numDocCliente,
                    codigoInterno  = _idTercero.ToString(),
                    razonSocial    = _razonSocial,
                    nombreSucursal = _razonSocial,
                    correo         = _correoCliente.Trim().Split(';')[0],
                    telefono       = _telefonoCliente,
                };

                using (SqlConnection connXX = new SqlConnection(Properties.Settings.Default.DBConexion))
                {
                    connXX.Open();
                    string     qryTipoDocDian = "SELECT TipoDocDian FROM homologaTipoDocDian WHERE IdTipoDoc=@tipoDoc";
                    SqlCommand cmdTipoDocDian = new SqlCommand(qryTipoDocDian, connXX);
                    cmdTipoDocDian.Parameters.Add("@tipoDoc", SqlDbType.TinyInt).Value = _tipoDocCliente;
                    Int16 tipoDoc = Int16.Parse(cmdTipoDocDian.ExecuteScalar().ToString());
                    _tipoDocCliente = byte.Parse(tipoDoc.ToString());
                }
                adquirienteTmp.tipoIdentificacion = _tipoDocCliente;
                List <NotificacionesItem> notificaciones = new List <NotificacionesItem>();
                NotificacionesItem        notificaItem   = new NotificacionesItem();
                notificaItem.tipo = 1;
                List <string> valorNotificacion = new List <string>();
                valorNotificacion.Add(_correoCliente.Trim());
                notificaItem.valor = valorNotificacion;
                notificaciones.Add(notificaItem);
                facturaEnviar.notificaciones = notificaciones;

                if (_RegimenFiscal.Equals("C"))
                {
                    adquirienteTmp.tipoRegimen = "48";
                }
                else
                {
                    adquirienteTmp.tipoRegimen = "49";
                }
                //TODO: Aqui insertar lo que se defina de Responsabilidades  RUT documentoF2.adquiriente.responsabilidadesRUT
                if (_idNaturaleza == 3)
                {
                    adquirienteTmp.tipoPersona = "1";
                }
                else if (_idNaturaleza == 4)
                {
                    adquirienteTmp.tipoPersona = "2";
                }
                else
                {
                    adquirienteTmp.tipoPersona = "0";
                }
                List <string> responsanbilidadesR = new List <string>();
                using (SqlConnection conexion01 = new SqlConnection(Properties.Settings.Default.DBConexion))
                {
                    conexion01.Open();
                    SqlCommand sqlValidaDet = new SqlCommand("spTerceroResponsabilidadRut", conexion01);
                    sqlValidaDet.CommandType = CommandType.StoredProcedure;
                    sqlValidaDet.Parameters.Add("@idtercero", SqlDbType.Int).Value = _idTercero;
                    SqlDataReader rdValidaDet = sqlValidaDet.ExecuteReader();
                    if (rdValidaDet.HasRows)
                    {
                        rdValidaDet.Read();
                        responsanbilidadesR.Add(rdValidaDet.GetString(0));
                    }
                    else
                    {
                        responsanbilidadesR.Add("R-99-PN");
                    }
                }

                adquirienteTmp.responsabilidadesRUT = responsanbilidadesR;

                Ubicacion ubicacionCliente = new Ubicacion();
                ubicacionCliente.pais            = "CO";
                ubicacionCliente.codigoMunicipio = _municipioCliente;
                ubicacionCliente.direccion       = _direccionCliente;
                adquirienteTmp.ubicacion         = ubicacionCliente;
                documentoF2.adquiriente          = adquirienteTmp;

                double TotalGravadoIva = 0;
                double TotalGravadoIca = 0;
                ///<summary>
                ///Inicio de Totales de la Factura
                /// </summary>

                ////List<AnticiposItem> anticiposWrk = new List<AnticiposItem>();
                ////AnticiposItem anticipoWrk = new AnticiposItem();
                ////anticipoWrk.comprobante = "22";
                ////anticipoWrk.valorAnticipo = double.Parse(_ValPagos.ToString());
                ////anticiposWrk.Add(anticipoWrk);
                documentoF2.anticipos = anticiposWrk;

                //************************************************************ Detalle de Factura
                using (SqlConnection conexion01 = new SqlConnection(Properties.Settings.Default.DBConexion))
                {
                    conexion01.Open();
                    string     qryFactura = "SELECT IdFactura,NumFactura,IdDestino,IdTransaccion,IdPlan,IdContrato,ValTotal,ValDescuento,ValDescuentoT,ValPagos,ValImpuesto,ValCobrar,IndNotaCred,IndTipoFactura,CodEnti,CodEsor,FecFactura,Ruta,IdCausal,IdUsuarioR,IndHabilitado,IdNoFacturado,valPos,valNoPos FROM  facFactura WHERE idFactura=@idFactura AND idDestino=@idAtencion";
                    SqlCommand cmdFactura = new SqlCommand(qryFactura, conexion01);
                    cmdFactura.Parameters.Add("@idFactura", SqlDbType.Int).Value  = nroFactura;
                    cmdFactura.Parameters.Add("@idAtencion", SqlDbType.Int).Value = nroAtencion;
                    SqlDataReader rdFactura = cmdFactura.ExecuteReader();
                    if (rdFactura.HasRows)
                    {
                        rdFactura.Read();
                        string     strDetalleFac = @"SELECT   isnull(h.NumAutorizacionInicial,'0')   AS Nro_Autorizacion,
upper(isnull(J.CodProMan,CASE ISNULL(f.REGCUM,'0') WHEN '0' THEN P.CodProducto ELSE F.REGCUM END )) as Cod_Servicio,
upper(( isnull(J.NomPRoman,P.NomProducto)) ) as Des_Servicio, f.Cantidad as Cantidad, f.ValTotal as Vlr_Unitario_Serv, 
isnull(AD.ValTotal,round(F.Cantidad*F.ValTotal,0)) as Vlr_Total_Serv,O.idOrden
FROM facfactura a
INNER JOIN  concontrato b on a.idcontrato=b.idcontrato
INNER JOIN  admatencion c on a.iddestino=c.idatencion
INNER JOIN  admcliente d on d.idcliente=c.idcliente
INNER JOIN  gentipodoc e on e.idtipodoc=d.idtipodoc
INNER JOIN  facfacturadet f on f.idfactura=a.idfactura
LEFT JOIN facFacturaDetAjuDec AD ON AD.IdFactura = F.IdFactura and AD.IdProducto = F.IdProducto and AD.IdMovimiento = F.IdMovimiento
INNER JOIN facFacturaDetOrden O on f.idFactura=O.idFactura AND f.idProducto=O.idProducto AND f.idMovimiento=O.idMovimiento
INNER JOIN  proproducto p on p.idproducto=f.idproducto AND p.IdProductoTipo IN (8,12)
INNER JOIN  facmovimiento g on   g.idmovimiento=f.idmovimiento and g.iddestino=a.iddestino
LEFT JOIN admatencioncontrato h on h.idatencion=a.iddestino and a.idcontrato=h.idcontrato and a.idplan=h.idplan and h.indhabilitado=1
LEFT JOIN contarifa i on i.idtarifa=b.idtarifa
LEFT JOIN conManualAltDet J ON J.IdProducto = F.IdProducto AND J.IndHabilitado = 1 AND J.IdManual = i.IdManual
WHERE a.IndTipoFactura='PAQ' AND  a.IdFactura=@idFactura 
UNION ALL
SELECT isnull(h.NumAutorizacionInicial,'0')   AS Nro_Autorizacion,
upper(isnull(J.CodProMan,CASE ISNULL(f.REGCUM,'0') WHEN '0' THEN P.CodProducto ELSE F.REGCUM END )) as Cod_Servicio,
upper(( isnull(J.NomPRoman,P.NomProducto)) ) as Des_Servicio, f.Cantidad as Cantidad, f.ValTotal as Vlr_Unitario_Serv, 
isnull(AD.ValTotal,round(F.Cantidad*F.ValTotal,0)) as Vlr_Total_Serv,O.idOrden
FROM facfactura a
INNER JOIN  concontrato b on a.idcontrato=b.idcontrato
INNER JOIN  admatencion c on a.iddestino=c.idatencion
INNER JOIN  admcliente d on d.idcliente=c.idcliente
INNER JOIN  gentipodoc e on e.idtipodoc=d.idtipodoc
INNER JOIN  facfacturadet f on f.idfactura=a.idfactura
LEFT JOIN facFacturaDetAjuDec AD ON AD.IdFactura = F.IdFactura and AD.IdProducto = F.IdProducto and AD.IdMovimiento = F.IdMovimiento
INNER JOIN facFacturaDetOrden O on f.idFactura=O.idFactura AND f.idProducto=O.idProducto AND f.idMovimiento=O.idMovimiento
INNER JOIN  proproducto p on p.idproducto=f.idproducto AND p.IdProductoTipo not IN (8,12,5)
INNER JOIN  facmovimiento g on   g.idmovimiento=f.idmovimiento and g.iddestino=a.iddestino and g.IdProcPrincipal=2513
LEFT JOIN admatencioncontrato h on h.idatencion=a.iddestino and a.idcontrato=h.idcontrato and a.idplan=h.idplan and h.indhabilitado=1
LEFT JOIN contarifa i on i.idtarifa=b.idtarifa
LEFT JOIN conManualAltDet J ON J.IdProducto = F.IdProducto AND J.IndHabilitado = 1 AND J.IdManual = i.IdManual
WHERE a.IndTipoFactura='PAQ' AND  a.idfactura=@idFactura 
UNION ALL
SELECT isnull(h.NumAutorizacionInicial,'0')   AS Nro_Autorizacion,
upper(isnull(J.CodProMan,CASE ISNULL(f.REGCUM,'0') WHEN '0' THEN P.CodProducto ELSE F.REGCUM END )) as Cod_Servicio,
upper(( isnull(J.NomPRoman,P.NomProducto)) ) as Des_Servicio, f.Cantidad as Cantidad, f.ValTotal as Vlr_Unitario_Serv, 
isnull(AD.ValTotal,round(F.Cantidad*F.ValTotal,0)) as Vlr_Total_Serv,O.idOrden
FROM facfactura a
INNER JOIN  concontrato b on a.idcontrato=b.idcontrato
INNER JOIN  admatencion c on a.iddestino=c.idatencion
INNER JOIN  admcliente d on d.idcliente=c.idcliente
INNER JOIN  gentipodoc e on e.idtipodoc=d.idtipodoc
INNER JOIN  facfacturadet f on f.idfactura=a.idfactura
LEFT JOIN facFacturaDetAjuDec AD ON AD.IdFactura = F.IdFactura and AD.IdProducto = F.IdProducto and AD.IdMovimiento = F.IdMovimiento
INNER JOIN facFacturaDetOrden O on f.idFactura=O.idFactura AND f.idProducto=O.idProducto AND f.idMovimiento=O.idMovimiento
INNER JOIN  proproducto p on p.idproducto=f.idproducto AND p.IdProductoTipo not IN (8,12,5)
INNER JOIN  facmovimiento g on   g.idmovimiento=f.idmovimiento and g.iddestino=a.iddestino and g.IdProcPrincipal<>2513
LEFT JOIN vwFacProcPrincAsocPaq PQ on PQ.idfactura = a.idfactura and g.IdProcPrincipal=PQ.IdProcPrincipal 
LEFT JOIN admatencioncontrato h on h.idatencion=a.iddestino and a.idcontrato=h.idcontrato and a.idplan=h.idplan and h.indhabilitado=1
LEFT JOIN contarifa i on i.idtarifa=b.idtarifa
LEFT JOIN conManualAltDet J ON J.IdProducto = F.IdProducto AND J.IndHabilitado = 1 AND J.IdManual = i.IdManual
WHERE PQ.idfactura is null and a.IndTipoFactura='PAQ' AND a.idfactura=@idFactura 
UNION ALL
SELECT  isnull(h.NumAutorizacionInicial,'0')   AS Nro_Autorizacion,
upper(isnull(J.CodProMan,CASE ISNULL(f.REGCUM,'0') WHEN '0' THEN P.CodProducto ELSE F.REGCUM END )) as Cod_Servicio,
upper(( isnull(J.NomPRoman,P.NomProducto)) ) as Des_Servicio, f.Cantidad as Cantidad, f.ValTotal as Vlr_Unitario_Serv, 
isnull(AD.ValTotal,round(F.Cantidad*F.ValTotal,0)) as Vlr_Total_Serv,O.idOrden
FROM facfactura a
INNER JOIN  concontrato b on a.idcontrato=b.idcontrato
INNER JOIN  admatencion c on a.iddestino=c.idatencion
INNER JOIN  admcliente d on d.idcliente=c.idcliente
INNER JOIN  gentipodoc e on e.idtipodoc=d.idtipodoc
INNER JOIN  facfacturadet f on f.idfactura=a.idfactura
LEFT JOIN facFacturaDetAjuDec AD ON AD.IdFactura = F.IdFactura and AD.IdProducto = F.IdProducto and AD.IdMovimiento = F.IdMovimiento
INNER JOIN facFacturaDetOrden O on f.idFactura=O.idFactura AND f.idProducto=O.idProducto AND f.idMovimiento=O.idMovimiento
INNER JOIN  proproducto p on p.idproducto=f.idproducto AND p.IdProductoTipo not IN (8,12)
INNER JOIN  facmovimiento g on   g.idmovimiento=f.idmovimiento and g.iddestino=a.iddestino
INNER JOIN  (   select distinct IdMovimiento,IdProductoCx,IdProcPrincipal from  facMovimientoDetCx  )  GX ON GX.IdMovimiento=g.IdMovimiento AND GX.IdProductoCx=f.IdProducto
LEFT JOIN vwFacProcPrincAsocPaq PQ on PQ.idfactura = a.idfactura and GX.IdProcPrincipal=PQ.IdProcPrincipal 
LEFT JOIN admatencioncontrato h on h.idatencion=a.iddestino and a.idcontrato=h.idcontrato and a.idplan=h.idplan and h.indhabilitado=1
LEFT JOIN contarifa i on i.idtarifa=b.idtarifa
LEFT JOIN conManualAltDet J ON J.IdProducto = F.IdProducto AND J.IndHabilitado = 1 AND J.IdManual = i.IdManual
WHERE PQ.idfactura is null and a.IndTipoFactura='PAQ' AND a.idfactura=@idFactura
 ORDER BY o.Idorden";
                        SqlCommand cmdDetalleFac = new SqlCommand(strDetalleFac, conexion01);
                        cmdDetalleFac.Parameters.Add("@idFactura", SqlDbType.Int).Value = rdFactura.GetInt32(0);
                        SqlDataReader rdDetalleFac = cmdDetalleFac.ExecuteReader();
                        if (rdDetalleFac.HasRows)
                        {
                            Int16 nroLinea = 1;

                            while (rdDetalleFac.Read()) // Armar Detalle Fase II
                            {
                                try
                                {
                                    List <TibutosDetalle> listaTributos = new List <TibutosDetalle>();
                                    DetallesItem          lineaProducto = new DetallesItem();
                                    lineaProducto.tipoDetalle = 1; // Linea Normal
                                    string codigoProducto = rdDetalleFac.GetString(1);
                                    lineaProducto.valorCodigoInterno = codigoProducto;

                                    lineaProducto.codigoEstandar      = "999";
                                    lineaProducto.valorCodigoEstandar = codigoProducto;
                                    lineaProducto.descripcion         = rdDetalleFac.GetString(2);
                                    lineaProducto.unidades            = double.Parse(rdDetalleFac.GetDouble(3).ToString());
                                    lineaProducto.unidadMedida        = "94";// rdDetalleFac.GetString(19);
                                    lineaProducto.valorUnitarioBruto  = double.Parse(rdDetalleFac.GetDouble(4).ToString());
                                    lineaProducto.valorBruto          = double.Parse(rdDetalleFac.GetDouble(5).ToString());
                                    lineaProducto.valorBrutoMoneda    = "COP";
                                    TibutosDetalle tributosWRKIva = new TibutosDetalle();
                                    tributosWRKIva.id                      = "01";
                                    tributosWRKIva.nombre                  = "Iva";
                                    tributosWRKIva.esImpuesto              = true;
                                    tributosWRKIva.porcentaje              = 0;
                                    tributosWRKIva.valorBase               = double.Parse(rdDetalleFac.GetDouble(5).ToString());
                                    tributosWRKIva.valorImporte            = rdDetalleFac.GetDouble(5) * 0;
                                    TotalGravadoIva                        = TotalGravadoIva + rdDetalleFac.GetDouble(5);
                                    tributosWRKIva.tributoFijoUnidades     = 0;
                                    tributosWRKIva.tributoFijoValorImporte = 0;
                                    listaTributos.Add(tributosWRKIva);


                                    TibutosDetalle tributosWRKIca = new TibutosDetalle();
                                    tributosWRKIca.id                      = "02";
                                    tributosWRKIca.nombre                  = "ICA";
                                    tributosWRKIca.esImpuesto              = true;
                                    tributosWRKIca.porcentaje              = 0;
                                    tributosWRKIca.valorBase               = double.Parse(rdDetalleFac.GetDouble(5).ToString());
                                    tributosWRKIca.valorImporte            = rdDetalleFac.GetDouble(5) * 0;
                                    TotalGravadoIca                        = TotalGravadoIca + rdDetalleFac.GetDouble(5);
                                    tributosWRKIca.tributoFijoUnidades     = 0;
                                    tributosWRKIca.tributoFijoValorImporte = 0;

                                    //listaTributos.Add(tributosWRKIca);
                                    lineaProducto.tributos = listaTributos;
                                    detalleProductos.Add(lineaProducto);
                                    nroLinea++;
                                }
                                catch (Exception sqlExp)
                                {
                                    logFacturas.Warn($"Se ha presentado Excepcion: {sqlExp.Message }    Pilade llamados:{sqlExp.StackTrace}");
                                    throw;
                                }
                            }
                        }
                        else // Si No  hay Detalle de Productos
                        {
                            logFacturas.Info("No se encontro Detalle de productos para la factura. " + strDetalleFac);
                        }
                    }
                    else // No se encuentra Informacion de la Factura y Atencion
                    {
                        logFacturas.Info("No se encontro Informacion de Factura y Atencion En  facFactura." + qryFactura + "      Parametros::::  Numero Factura:" + nroFactura + "     Numero de Atencion:" + nroAtencion);
                    }
                }

                List <TributosItem>    tributosTMP     = new List <TributosItem>();
                List <DetalleTributos> tributosDetalle = new List <DetalleTributos>();
                DetalleTributos        detalleTributos = new DetalleTributos() // Un Objeto por cada Tipo de Iva
                {
                    valorImporte = 0,
                    valorBase    = TotalGravadoIva,
                    porcentaje   = 0
                };

                tributosDetalle.Add(detalleTributos);

                TributosItem itemTributo = new TributosItem()
                {
                    id                = "01", //Total de Iva
                    nombre            = "Iva",
                    esImpuesto        = true,
                    valorImporteTotal = 0,
                    detalles          = tributosDetalle // DEtalle de los Ivas
                };
                tributosTMP.Add(itemTributo);
                documentoF2.tributos = tributosTMP;

                Totales totalesTmp = new Totales()
                {
                    valorBruto             = double.Parse(_Valtotal.ToString()),
                    valorAnticipos         = double.Parse(_ValPagos.ToString()),
                    valorTotalSinImpuestos = double.Parse(_Valtotal.ToString()),
                    valorTotalConImpuestos = TotalGravadoIva,
                    valorNeto = double.Parse(_ValCobrar.ToString())
                };
                documentoF2.totales  = totalesTmp;
                documentoF2.detalles = detalleProductos;
                try
                {
                    //string urlConsumo = Properties.Settings.Default.urlFacturaElectronica + Properties.Settings.Default.recursoFacturaE;
                    string urlConsumo = Properties.Settings.Default.urlFacturaElectronica;// + Properties.Settings.Default.recursoFacturaE;
                    logFacturas.Info("URL de Request:" + urlConsumo);
                    HttpWebRequest request = WebRequest.Create(urlConsumo) as HttpWebRequest;
                    //request.Timeout = 60 * 1000;
                    documentoF2.documento = facturaEnviar;
                    string facturaJson = JsonConvert.SerializeObject(documentoF2);
                    logFacturas.Info("Json de la Factura:" + facturaJson);
                    request.Method      = "POST";
                    request.ContentType = "application/json";
                    string Usuario      = Properties.Settings.Default.usuario;
                    string Clave        = Properties.Settings.Default.clave;
                    string credenciales = Convert.ToBase64String(Encoding.ASCII.GetBytes(Usuario + ":" + Clave));
                    request.Headers.Add("Authorization", "Basic " + credenciales);

                    Byte[] data = Encoding.UTF8.GetBytes(facturaJson);

                    Stream st = request.GetRequestStream();
                    st.Write(data, 0, data.Length);
                    st.Close();

                    int loop1, loop2;
                    NameValueCollection valores;
                    valores = request.Headers;

                    // Pone todos los nombres en un Arreglo
                    string[] arr1 = valores.AllKeys;
                    for (loop1 = 0; loop1 < arr1.Length; loop1++)
                    {
                        logFacturas.Info("Key: " + arr1[loop1] + "<br>");
                        // Todos los valores
                        string[] arr2 = valores.GetValues(arr1[loop1]);
                        for (loop2 = 0; loop2 < arr2.Length; loop2++)
                        {
                            logFacturas.Info("Value " + loop2 + ": " + arr2[loop2]);
                        }
                    }
                    HttpWebResponse response = request.GetResponse() as HttpWebResponse;
                    logFacturas.Info("Codigo Status:" + response.StatusCode);
                    logFacturas.Info("Descripcion Status:" + response.StatusDescription);
                    StreamReader sr    = new StreamReader(response.GetResponseStream());
                    string       strsb = sr.ReadToEnd();
                    logFacturas.Info("Respuesta:" + strsb);
                    string valorRpta = "00";
                    RespuestaTransfiriendo respuesta = JsonConvert.DeserializeObject <RespuestaTransfiriendo>(strsb);
                    if (respuesta.esExitoso)
                    {
                        logFacturas.Info($"PDF:{respuesta.resultado.URLPDF}");
                        logFacturas.Info($"XML:{respuesta.resultado.URLXML}");
                        logFacturas.Info($"UUID:{ respuesta.resultado.UUID}");
                        logFacturas.Info($"QR:{respuesta.resultado.QR}");
                        using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.DBConexion))
                        {
                            conn.Open();
                            string     strActualiza = @"UPDATE dbo.facFacturaTempWEBService SET identificador=@identificador WHERE IdFactura=@nrofactura";
                            SqlCommand cmdActualiza = new SqlCommand(strActualiza, conn);
                            cmdActualiza.Parameters.Add("@identificador", SqlDbType.VarChar).Value = respuesta.resultado.UUID;
                            cmdActualiza.Parameters.Add("@nrofactura", SqlDbType.Int).Value        = nroFactura;
                            if (cmdActualiza.ExecuteNonQuery() > 0)
                            {
                                logFacturas.Info("Factura Actualizada con UUID en facFacturaTempWEBService");
                                using (WebClient webClient = new WebClient())
                                {
                                    try
                                    {
                                        string carpetaDescarga = Properties.Settings.Default.urlDescargaPdfFACT + DateTime.Now.Year + @"\" + respuesta.resultado.UUID + ".pdf";
                                        logFacturas.Info("Carpeta de Descarga:" + carpetaDescarga);
                                        webClient.DownloadFile(respuesta.resultado.URLPDF, carpetaDescarga);
                                        //System.Threading.Thread.Sleep(1000);
                                        logFacturas.Info($"Descarga de PDF Factura...Terminada");
                                        carpetaDescarga = Properties.Settings.Default.urlDescargaPdfFACT + DateTime.Now.Year + @"\" + respuesta.resultado.UUID + ".XML";
                                        webClient.DownloadFile(respuesta.resultado.URLXML, carpetaDescarga);
                                        //System.Threading.Thread.Sleep(1000);
                                        logFacturas.Info($"Descarga de XML...Terminada");
                                        using (SqlConnection conn3 = new SqlConnection(Properties.Settings.Default.DBConexion))
                                        {
                                            conn3.Open();
                                            string     qryActualizaTempWEBService = @"UPDATE dbo.facFacturaTempWEBService SET CodCUFE=@cufe,cadenaQR=@cadenaQR WHERE identificador=@identificador";
                                            SqlCommand cmdActualizaTempWEBService = new SqlCommand(qryActualizaTempWEBService, conn);
                                            cmdActualizaTempWEBService.Parameters.Add("@cufe", SqlDbType.VarChar).Value          = respuesta.resultado.UUID;
                                            cmdActualizaTempWEBService.Parameters.Add("@cadenaQR", SqlDbType.NVarChar).Value     = respuesta.resultado.QR;
                                            cmdActualizaTempWEBService.Parameters.Add("@identificador", SqlDbType.VarChar).Value = respuesta.resultado.UUID;
                                            if (cmdActualizaTempWEBService.ExecuteNonQuery() > 0)
                                            {
                                                logFacturas.Info("Descarga Existosa de Archivos de la Factura con Identificadotr:" + respuesta.resultado.UUID + " Destino:" + carpetaDescarga);

                                                if (!(respuesta.advertencias is null))
                                                {
                                                    string     qryAdvertencia         = @"INSERT INTO dbo.facFacturaTempWSAdvertencias(IdFactura,CodAdvertencia,FecRegistro,DescripcionAdv) 
VALUES(@IdFactura, @CodAdvertencia, @FecRegistro, @DescripcionAdv)";
                                                    SqlCommand cmdInsertarAdvertencia = new SqlCommand(qryAdvertencia, conn);
                                                    cmdInsertarAdvertencia.Parameters.Add("@IdFactura", SqlDbType.Int);
                                                    cmdInsertarAdvertencia.Parameters.Add("@CodAdvertencia", SqlDbType.VarChar);
                                                    cmdInsertarAdvertencia.Parameters.Add("@DescripcionAdv", SqlDbType.NVarChar);
                                                    cmdInsertarAdvertencia.Parameters.Add("@FecRegistro", SqlDbType.DateTime);
                                                    foreach (AdvertenciasItem itemAdv in respuesta.advertencias)
                                                    {
                                                        cmdInsertarAdvertencia.Parameters["@IdFactura"].Value      = nroFactura;
                                                        cmdInsertarAdvertencia.Parameters["@CodAdvertencia"].Value = itemAdv.codigo;
                                                        //cmdInsertarAdvertencia.Parameters["@consecutivo"].Value = consecutivo;
                                                        cmdInsertarAdvertencia.Parameters["@FecRegistro"].Value    = DateTime.Now;
                                                        cmdInsertarAdvertencia.Parameters["@DescripcionAdv"].Value = itemAdv.mensaje;
                                                        if (cmdInsertarAdvertencia.ExecuteNonQuery() > 0)
                                                        {
                                                            logFacturas.Info($"Se Inserta Detalle de Advertencias: Codigo Advertencia{itemAdv.codigo} Mensaje Advertencia:{itemAdv.mensaje}");
                                                            valorRpta = nroFactura.ToString();
                                                        }
                                                        else
                                                        {
                                                            logFacturas.Info($"No es Posible Insertar Detalle de Advertencias: Codigo Advertencia{itemAdv.codigo} Mensaje Advertencia:{itemAdv.mensaje}");
                                                            valorRpta = nroFactura.ToString();
                                                        }
                                                    }
                                                }
                                                else
                                                {
                                                    logFacturas.Info($"No existen advertencias de DIAN !!! factura{nroFactura}");
                                                    valorRpta = nroFactura.ToString();
                                                }
                                                valorRpta = nroFactura.ToString();
                                            }
                                            else
                                            {
                                                logFacturas.Info("No fue Posible Realizar la Descarga de Archivos de la Factura con Identificadotr:" + respuesta.resultado.UUID);
                                            }
                                        }
                                    }
                                    catch (NotSupportedException nSuppExp)
                                    {
                                        logFacturas.Info("Se ha presentado una NotSupportedException durante la descarga de los objetos de la Factura:" + nSuppExp.Message + "     " + nSuppExp.InnerException.Message);
                                        valorRpta = "9X";
                                    }
                                    catch (ArgumentNullException argNull)
                                    {
                                        logFacturas.Info("Se ha presentado una ArgumentNullException durante la descarga de los objetos de la Factura:" + argNull.Message + "     " + argNull.InnerException.Message);
                                        valorRpta = "9X";
                                    }
                                    catch (WebException webEx1)
                                    {
                                        logFacturas.Info("Se ha presentado una Falla durante la descarga de los objetos de la factura:" + webEx1.Message + "     " + webEx1.InnerException.Message);
                                        logFacturas.Warn($"Pila de Mensajes:::::{webEx1.StackTrace}");
                                        valorRpta = "93";
                                    }
                                    catch (Exception exx)
                                    {
                                        logFacturas.Info($"No fue posible descargar los archivos.PDF, XML y QR  !!! Causa:{exx.Message}  Pila:{exx.StackTrace}");
                                        valorRpta = "98";
                                    }
                                }
                            }