public ServicioConsulta()
 {
     ContribuyenteCopiaLocal = new DataModel.EF.Contribuyente();
     FacturasPendientes      = new BlockingCollection <ConsultaRequest>();
     LeerFacturasPendientes();
     Iniciar();
 }
        public void Iniciar()
        {
            lock (ContribuyenteCopiaLocal)
            {
                ContribuyenteCopiaLocal = new DataModel.EF.Contribuyente()
                {
                    Id_Contribuyente       = RecursosSistema.Contribuyente.Id_Contribuyente,
                    Certificado            = RecursosSistema.Contribuyente.Certificado,
                    Contrasena_Certificado = RecursosSistema.Contribuyente.Contrasena_Certificado,
                    UsuarioHacienda        = RecursosSistema.Contribuyente.UsuarioHacienda,
                    ContrasenaHacienda     = RecursosSistema.Contribuyente.ContrasenaHacienda
                };
            }

            if (ServicioConsultaThread == null)
            {
                ServicioConsultaThread      = new Thread(Loop);
                ServicioConsultaThread.Name = "ServicioConsultaThread";
                ServicioConsultaThread.Start();
            }
        }
        private void CargarContribuyente()
        {
            try
            {
                DataModel.EF.Contribuyente Contribuyente = null;
                using (db_FacturaDigital db = new db_FacturaDigital())
                {
                    Contribuyente = db.Contribuyente.FirstOrDefault();
                }

                UbicacionesData        ubi        = new UbicacionesData();
                List <UbicacionesType> Provincias = ubi.GetProvincias();
                cb_Provincia.ItemsSource = Provincias;
                if (Contribuyente == null)
                {
                    return;
                }

                #region Load Provincias
                cb_Provincia.SelectedItem = Provincias.First(q => q.Id == Contribuyente.Provincia);

                List <UbicacionesType> Cantones = ubi.GetCantones(Contribuyente.Provincia);
                cb_canton.ItemsSource  = Cantones;
                cb_canton.SelectedItem = Cantones.First(q => q.Id == Contribuyente.Canton);

                List <UbicacionesType> Distritos = ubi.GetDistritos(Contribuyente.Provincia, Contribuyente.Canton);
                cb_distrito.ItemsSource  = Distritos;
                cb_distrito.SelectedItem = Distritos.First(q => q.Id == Contribuyente.Distrito);


                List <UbicacionesType> Barrio = ubi.GetBarrios(Contribuyente.Provincia, Contribuyente.Canton, Contribuyente.Distrito);
                cb_barrio.ItemsSource  = Barrio;
                cb_barrio.SelectedItem = Barrio.First(q => q.Id == Contribuyente.Barrio);

                #endregion
                txt_Nombre.Text                = Contribuyente.Nombre;
                txt_comercial.Text             = Contribuyente.NombreComercial;
                txt_Correo.Text                = Contribuyente.CorreoElectronico;
                txt_TelefonoNumero.Text        = Contribuyente.Telefono_Numero.ToString();
                txt_TelefonoRegion.Text        = Contribuyente.Telefono_Codigo.ToString();
                txt_UsuarioHacienda.Text       = Contribuyente.UsuarioHacienda;
                txt_otrasSenas.Text            = Contribuyente.OtrasSenas;
                txt_Identificacion.Text        = Contribuyente.Identificacion_Numero;
                txt_contrasenaCertificado.Text = Contribuyente.Contrasena_Certificado;
                txt_contrasena.Text            = Contribuyente.ContrasenaHacienda;
                if (Contribuyente.Identificacion_Tipo == "01")
                {
                    cb_Cedula.SelectedIndex = 0;
                }
                else if (Contribuyente.Identificacion_Tipo == "02")
                {
                    cb_Cedula.SelectedIndex = 1;
                }
                else if (Contribuyente.Identificacion_Tipo == "03")
                {
                    cb_Cedula.SelectedIndex = 2;
                }
                else if (Contribuyente.Identificacion_Tipo == "04")
                {
                    cb_Cedula.SelectedIndex = 3;
                }
            }
            catch (Exception ex)
            {
                this.LogError(ex);
                MessageBox.Show("Ocurrio un error al obtener los datos del contribuyente", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }
        private void Guardar(object sender, RoutedEventArgs e)
        {
            try
            {
                bool ExisteContribuyente = true;
                using (db_FacturaDigital db = new db_FacturaDigital())
                {
                    DataModel.EF.Contribuyente Contribuyente = db.Contribuyente.FirstOrDefault();
                    if (Contribuyente == null)
                    {
                        ExisteContribuyente = false;
                        Contribuyente       = new DataModel.EF.Contribuyente();
                    }

                    #region DatosGenerales
                    if (string.IsNullOrEmpty(txt_Identificacion.Text))
                    {
                        MessageBox.Show("Favor llenar el campo de identificacion", "Validacion", MessageBoxButton.OK, MessageBoxImage.Stop);
                        return;
                    }
                    Contribuyente.Identificacion_Numero = txt_Identificacion.Text;
                    Contribuyente.Identificacion_Tipo   = (cb_Cedula.SelectedItem as ComboBoxItem).Tag.ToString();


                    if (string.IsNullOrEmpty(txt_Nombre.Text))
                    {
                        MessageBox.Show("Favor llenar el campo de nombre", "Validacion", MessageBoxButton.OK, MessageBoxImage.Stop);
                        return;
                    }
                    Contribuyente.Nombre = txt_Nombre.Text;



                    if (string.IsNullOrEmpty(txt_comercial.Text))
                    {
                        MessageBox.Show("Favor llenar el campo de nombre comercial", "Validacion", MessageBoxButton.OK, MessageBoxImage.Stop);
                        return;
                    }
                    Contribuyente.NombreComercial = txt_comercial.Text;

                    if (string.IsNullOrEmpty(txt_Correo.Text))
                    {
                        MessageBox.Show("Favor llenar el campo de correo", "Validacion", MessageBoxButton.OK, MessageBoxImage.Stop);
                        return;
                    }
                    Contribuyente.CorreoElectronico = txt_Correo.Text;
                    int Region;
                    if (!int.TryParse(txt_TelefonoRegion.Text, out Region))
                    {
                        MessageBox.Show("Favor llenar el campo de region (solamente numeros) ", "Validacion", MessageBoxButton.OK, MessageBoxImage.Stop);
                        return;
                    }
                    Contribuyente.Telefono_Codigo = Region;

                    int telefono;
                    if (!int.TryParse(txt_TelefonoNumero.Text, out telefono))
                    {
                        MessageBox.Show("Favor llenar el campo de telefono (solamente numeros)", "Validacion", MessageBoxButton.OK, MessageBoxImage.Stop);
                        return;
                    }
                    Contribuyente.Telefono_Numero = telefono;
                    #endregion

                    #region Ubicacion
                    UbicacionesType provincia = cb_Provincia.SelectedItem as UbicacionesType;
                    if (provincia == null)
                    {
                        MessageBox.Show("Favor seleccionar una provincia", "Validacion", MessageBoxButton.OK, MessageBoxImage.Stop);
                        return;
                    }
                    Contribuyente.Provincia = provincia.Id;


                    UbicacionesType canton = cb_canton.SelectedItem as UbicacionesType;
                    if (canton == null)
                    {
                        MessageBox.Show("Favor seleccionar una Canton", "Validacion", MessageBoxButton.OK, MessageBoxImage.Stop);
                        return;
                    }
                    Contribuyente.Canton = canton.Id;


                    UbicacionesType Distrito = cb_distrito.SelectedItem as UbicacionesType;
                    if (Distrito == null)
                    {
                        MessageBox.Show("Favor seleccionar una Distrito", "Validacion", MessageBoxButton.OK, MessageBoxImage.Stop);
                        return;
                    }
                    Contribuyente.Distrito = Distrito.Id;


                    UbicacionesType Barrio = cb_barrio.SelectedItem as UbicacionesType;
                    if (Distrito == null)
                    {
                        MessageBox.Show("Favor seleccionar una Barrio", "Validacion", MessageBoxButton.OK, MessageBoxImage.Stop);
                        return;
                    }
                    Contribuyente.Barrio = Barrio.Id;


                    if (string.IsNullOrEmpty(txt_otrasSenas.Text))
                    {
                        MessageBox.Show("Favor llenar el campo de otras senas", "Validacion", MessageBoxButton.OK, MessageBoxImage.Stop);
                        return;
                    }
                    Contribuyente.OtrasSenas = txt_otrasSenas.Text;
                    #endregion

                    #region Datos Hacienda
                    if (string.IsNullOrEmpty(txt_UsuarioHacienda.Text))
                    {
                        MessageBox.Show("Favor llenar el campo de usuario de hacienda ", "Validacion", MessageBoxButton.OK, MessageBoxImage.Stop);
                        return;
                    }
                    Contribuyente.UsuarioHacienda = txt_UsuarioHacienda.Text;


                    if (string.IsNullOrEmpty(txt_contrasena.Text))
                    {
                        MessageBox.Show("Favor llenar el campo de contrasena de hacienda", "Validacion", MessageBoxButton.OK, MessageBoxImage.Stop);
                        return;
                    }
                    Contribuyente.ContrasenaHacienda = txt_contrasena.Text;
                    #endregion

                    #region Certificado
                    if (string.IsNullOrEmpty(CertificadoUrl) && (Contribuyente.Certificado == null || Contribuyente.Certificado.Length == 0))
                    {
                        MessageBox.Show("Favor seleccionar un certificado", "Validacion", MessageBoxButton.OK, MessageBoxImage.Stop);
                        return;
                    }

                    if (!string.IsNullOrEmpty(CertificadoUrl))
                    {
                        Contribuyente.Certificado = File.ReadAllBytes(CertificadoUrl);
                    }

                    if (string.IsNullOrEmpty(txt_contrasenaCertificado.Text))
                    {
                        MessageBox.Show("Favor llenar el campo de contrasena de certificado", "Validacion", MessageBoxButton.OK, MessageBoxImage.Stop);
                        return;
                    }
                    Contribuyente.Contrasena_Certificado = txt_contrasenaCertificado.Text;


                    try
                    {
                        X509Certificate2 x509 = new X509Certificate2(Contribuyente.Certificado, Contribuyente.Contrasena_Certificado, X509KeyStorageFlags.Exportable);
                        x509.Verify();
                        string Values       = x509.Subject.Split(',').First(q => q.ToUpper().Contains("SERIALNUMBER"));
                        string SerialNumber = Values.Split('=')[1];
                        string OnlyNumber   = new string(SerialNumber.Where(c => char.IsDigit(c)).ToArray());
                        if (!OnlyNumber.Contains(Contribuyente.Identificacion_Numero) && !Contribuyente.Identificacion_Numero.Contains(OnlyNumber))
                        {
                            if (MessageBox.Show("El numero de identificacion registrado en el certificado no concuerda con el ingresado por el usuario en el campo [Identificacion]. Aun asi desea continuar?", "Validacion", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.No)
                            {
                                return;
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        this.LogError(ex);
                        MessageBox.Show("No se pudo abrir el ceritificado. Esto se puede deber a que la contrasena indicada no es valida o que el contenido del certificado es invalido", "Error", MessageBoxButton.OK, MessageBoxImage.Stop);
                        return;
                    }


                    #endregion

                    if (!ExisteContribuyente)
                    {
                        db.Contribuyente.Add(Contribuyente);
                    }

                    db.SaveChanges();

                    Contribuyente_Consecutivos conse = db.Contribuyente_Consecutivos.FirstOrDefault(q => q.Id_Contribuyente == Contribuyente.Id_Contribuyente);

                    if (conse == null)
                    {
                        conse = new Contribuyente_Consecutivos()
                        {
                            Consecutivo_Facturas            = 1,
                            Consecutivo_NotasCredito        = 1,
                            Consecutivo_Tiquete_Electrónico = 1,
                            Consecutivo_Confirmacion        = 1,
                            Id_Contribuyente = Contribuyente.Id_Contribuyente
                        };
                        db.Contribuyente_Consecutivos.Add(conse);
                        db.SaveChanges();
                    }

                    MessageBox.Show("Perfil actualizado correctamente", "Informacion", MessageBoxButton.OK, MessageBoxImage.Information);
                    try
                    {
                        RecursosSistema.Contribuyente = Contribuyente;
                        RecursosSistema.OnStartMain_Load();
                    }catch (Exception ex)
                    {
                        this.LogError(ex);
                        MessageBox.Show("Reinicie el sistema para continuar");
                    }
                }
            }
            catch (Exception ex)
            {
                this.LogError(ex);
                MessageBox.Show("Ocurrio al guardar el perfil del contribuyente", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }
        private void BuscarXML(object sender, RoutedEventArgs e)
        {
            string FileUrl = null;

            try
            {
                OpenFileDialog openFileDialog = new OpenFileDialog
                {
                    Multiselect = false,
                    DefaultExt  = "*.xml",
                    Filter      = "Documentos Electronicos (*.xml) | *.xml;"
                };
                if (openFileDialog.ShowDialog() == true)
                {
                    FileUrl = openFileDialog.FileName;
                }
                else
                {
                    return;
                }
            }
            catch (Exception ex)
            {
                FileUrl = null;
                this.LogError(ex);
            }


            if (string.IsNullOrEmpty(FileUrl))
            {
                MessageBox.Show("Error al obtener la direccion del archivo de XML", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }


            try
            {
                Tipo_documento typeDocument = Tipo_documento.Factura_electrónica;
                XmlDocument    xml          = new XmlDocument();
                xml.Load(FileUrl);
                string NS_String = xml.DocumentElement.NamespaceURI;

                if (NS_String != "https://tribunet.hacienda.go.cr/docs/esquemas/2017/v4.2/facturaElectronica" && NS_String != "https://tribunet.hacienda.go.cr/docs/esquemas/2017/v4.2/tiqueteElectronico")
                {
                    MessageBox.Show("El tipo de xml seleccionado es incorrecto", "Validacion", MessageBoxButton.OK, MessageBoxImage.Stop);
                    return;
                }

                if (NS_String == "https://tribunet.hacienda.go.cr/docs/esquemas/2017/v4.2/tiqueteElectronico")
                {
                    typeDocument = Tipo_documento.Tiquete_Electrónico;
                }

                if (typeDocument == Tipo_documento.Factura_electrónica)
                {
                    XmlSerializer      serializer = new XmlSerializer(typeof(FacturaElectronica));
                    FacturaElectronica Factura    = null;
                    using (XmlReader reader = new XmlNodeReader(xml))
                    {
                        Factura = (FacturaElectronica)serializer.Deserialize(reader);
                    }

                    FacturaResolucion = new ConvertirFacturaXml_FacturaDB().Convertir(Factura, xml.InnerXml);
                }
            }
            catch (Exception ex)
            {
                this.LogError(ex);
                MessageBox.Show("Error al abrir el archivo de XML", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }

            bool Encontrada = false;

            using (db_FacturaDigital db = new db_FacturaDigital())
            {
                Encontrada = db.Factura_Resolucion.Any(q => q.Clave == FacturaResolucion.Clave);
            }

            if (Encontrada)
            {
                MessageBox.Show("La factura seleccionada ya se encuentra en el sistema", "Validacion", MessageBoxButton.OK, MessageBoxImage.Stop);
                return;
            }

            DataModel.EF.Contribuyente con = Recursos.RecursosSistema.Contribuyente;
            if (con.Identificacion_Numero != FacturaResolucion.Receptor_Identificacion)
            {
                MessageBoxResult result = MessageBox.Show("El  numero de identicacion de la factura no concuerda con el numero de identificacion del actual contribuyente Identificacion receptor factura[" + FacturaResolucion.Receptor_Identificacion + "] Identificacion del contribuyente actual [" + con.Identificacion_Numero + "] La factura esta a nombre de [" + FacturaResolucion.Receptor__Nombre + "]. Sabiendo lo anterior desea continuar ?", "Validacion", MessageBoxButton.YesNo, MessageBoxImage.Question);
                if (result != MessageBoxResult.Yes)
                {
                    return;
                }
            }

            RenderFactura();
        }