/// <summary>
        /// Carregando as informações da tabela para a classe de OS.
        /// </summary>
        /// <param name="ID">I.</param>
        public static OrdemServico Carregar(int ID)
        {
            System.Data.DataTable tabela = new DataTable("OrdemDeServico");
            OrdemServico OSBase = new OrdemServico();
            Spartacus.Database.Generic database;
            Spartacus.Database.Command cmd = new Spartacus.Database.Command();

            cmd.v_text = "Select * from OrdemDeServico Where ID = #id#";

            cmd.AddParameter("id", Spartacus.Database.Type.INTEGER);
            cmd.SetValue("id", ID.ToString());

            try
            {
                database = new Spartacus.Database.Sqlite(DB.GetStrConection());

                tabela = database.Query(cmd.GetUpdatedText(), "OrdemDeServico");

                OSBase = PreencherOS(tabela);
            }
            catch (Spartacus.Database.Exception ex)
            {
                ControllerArquivoLog.GeraraLog(ex);
            }

            return OSBase;
        }
        /// <summary>
        /// Finalizando Ordem de serviço (Botão).
        /// </summary>
        private void finalizarToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (!string.IsNullOrEmpty(Txt_OS.Text))
            {
                OrdemServico OSbase = new OrdemServico();
                Servico ServicoBase = new Servico();

                ControllerOrdemServico controllerOS = new ControllerOrdemServico();
                ControllerServico controllerServico = new ControllerServico();
                ControllerEmail controllerEmail = new ControllerEmail();

                bool Resultado = false;

                if (controllerOS.Verificar(Txt_OS.Text))//Verifica se a OS existe ou não
                {
                    Resultado = controllerOS.FinalizarOS(Txt_OS.Text);

                    if (Resultado)
                    {
                        MessageBox.Show("Ordem de serviço Finalizada com sucesso!", "Informação", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                    else
                    {
                        MessageBox.Show("Ocorreu um problema ao finalizar sua Ordem de serviço, informações foram salvas no arquivo log no diretorio do sue software", "Informação", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    }

                    //Gerando o serviço
                    controllerServico.Save(Txt_Descricao.Text, double.Parse(Txt_Valor.Text), Txt_OS.Text);

                    if (MessageBox.Show("Enviar E-mail para o cliente informando sobre o término do serviço?", "Pergunta", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                    {
                        Model.Email EmailBase = new Model.Email();

                        //Decodificando Email Base para enviar!
                        String EmailDecoficado = controllerEmail.DecodificarEmailBase(RecuperandoEmailBase(), NomeEmpresa(), InformacaoCliente()[0]);

                        string ResultadoEnvio = controllerEmail.Enviar(InformacaoCliente()[0], InformacaoCliente()[1], NomeEmpresa(), EmailDecoficado);

                        MessageBox.Show(ResultadoEnvio, "Informação", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }
            }
            else
            {
                MessageBox.Show("Informe o numero da ordem de serviço!", "Informação", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }
        /// <summary>
        /// Recuperando informações do cliente.
        /// </summary>
        /// <returns>Nome e E-mail do cliente</returns>
        private string[] InformacaoCliente()
        {
            OrdemServico OSBase = new OrdemServico();
            Fisica PessoaFisicaBase = new Fisica();
            Juridica PessoaJuridicaBase = new Juridica();

            ControllerOrdemServico controllerOS = new ControllerOrdemServico();
            ControllerFisica controllerPF = new ControllerFisica();
            ControllerJuridica controllerPJ = new ControllerJuridica();

            string NomeDoCliente = "Não Econtrado";
            string EmailCliente = "Não encontrado";
            string[] Informacoes = new string[2];

            NomeDoCliente = controllerOS.LoadOSFinalizada(Txt_OS.Text).Cliente;

            //TODO:Arrumar para verificar o tipo de pessoa

            //Verificando o tipo e o Email do usuario

            if (true) //Verifica se é PessoaFisica
            {
                EmailCliente = controllerPF.Load(NomeDoCliente).Email;
                NomeDoCliente = controllerPF.Load(NomeDoCliente).Nome;

                Informacoes[0] = NomeDoCliente;
                Informacoes[1] = EmailCliente;
            }
            else if (controllerPJ.Verificar(NomeDoCliente)) //Verifica se é pessoa Juridica
            {
                PessoaJuridicaBase = controllerPJ.Load(NomeDoCliente);
                EmailCliente = PessoaFisicaBase.Email;
                NomeDoCliente = PessoaFisicaBase.Nome;

                Informacoes[0] = NomeDoCliente;
                Informacoes[1] = EmailCliente;
            }

            return Informacoes;
        }
        /// <summary>
        ///  Enviando Email inicial, quando e aberto uma Ordem de Serviço
        /// </summary>
        /// <param name="NomeUsuario"></param>
        public static string EnviarOrdemDeServiço(OrdemServico OS, Empresa InfoEmpresa, Pessoa cliente)
        {
            string Saida = " ";
            string MenssagemBase = string.Format("Olá {0}, sua ordem de serviço n° {1} foi criado com sucesso! O arquivo segue em anexo a este e-mail", cliente.Nome, OS.ID);

            Email EmailBase = new Email();

            EmailBase = ControllerEmail.CarregarInformacoesLoginServidor();//Carregando informações do servidor.

            SmtpClient smtp = new SmtpClient(EmailBase.Host, EmailBase.Port);   //Servidor
            MailMessage mail = new MailMessage(); //Menssagem
            mail.From = new MailAddress(EmailBase.email);

            //Configurando servidor.
            smtp.EnableSsl = true;
            smtp.UseDefaultCredentials = false;
            smtp.Credentials = new System.Net.NetworkCredential(EmailBase.email, EmailBase.Senha);//Passando Login e senha do e-mail da empresa(para enviar)

            //Assunto do email.
            mail.Subject = String.Format("Ordem de serviço [ {0} ]", InfoEmpresa.Nome);

            //Informando sobre o corpo.
            mail.IsBodyHtml = true;

            //Conteúdo do email.
            mail.Body = MenssagemBase;

            //Adicionando E-mail do cliente para enviar.
            mail.To.Add(cliente.Email);

            //Prioridade de Envio.
            mail.Priority = MailPriority.High;
            // Criar o arquivo anexo para esse e-mail.
            string file = String.Format("{0}/OS.pdf", Path.GetTempPath());//TODO:Rever Esse Código.

            Attachment data = new Attachment(file);

            data.Name = String.Format("{0}.pdf", OS.ID); //Mudando o nome do arquivo antes de enviar o E-mail.

            //Inclui o arquivo anexo.
            mail.Attachments.Add(data); //Caminho de onde o arquivo da Ordem de serviço é salvo.

            try
            {
                //Envia o email.
                smtp.Send(mail);

                Saida = "E-mail enviado com sucesso!";
            }
            catch (System.Exception exc)
            {
                //Gerando arquivo de Log
                ControllerArquivoLog.GeraraLog(exc);

                Saida = "Ocorreu um erro ao enviar o Email " + exc.Message;
            }

            return Saida;
        }
        /// <summary>
        /// Carregando as informações dos TxtBox para a Classe Cliente.
        /// </summary>
        /// <returns></returns>
        private OrdemServico PreencherOS()
        {
            OrdemServico OSBase = new OrdemServico();

            OSBase.dataEntradaServico = Txt_DataEntrada.Text;
            OSBase.Defeito = Txt_Defeito.Text;
            OSBase.Descricao = Txt_Descricao.Text;
            OSBase.Equipamento = Txt_Equipamento.Text;
            OSBase.IDCliente = ControllerPessoa.VerificarID(Txt_Clientes.Text);
            OSBase.IDTecnico = IDTecnico;
            OSBase.NumeroSerie = Txt_Nserie.Text;
            OSBase.Observacao = Txt_Observacoes.Text;
            OSBase.Situacao = Txt_Situacao.Text;
            return OSBase;
        }
        /// <summary>
        /// Preenchendo a classe OS com as informações do DataTable
        /// </summary>
        /// <param name="tabela">todo: describe tabela parameter on PreencherOS</param>
        /// <returns>The cliente.</returns>
        private static OrdemServico PreencherOS(DataTable tabela)
        {
            List<string> OSBaseLista = new List<string>();
            OrdemServico OSBase = new OrdemServico();

            try
            {
                foreach (DataRow r in tabela.Rows)
                {
                    foreach (DataColumn c in tabela.Columns)
                    {
                        OSBaseLista.Add(r[c].ToString());
                    }
                }

                OSBase.ID = Convert.ToInt32(OSBaseLista[0]);
                OSBase.Situacao = OSBaseLista[1];
                OSBase.Defeito = OSBaseLista[2];
                OSBase.Descricao = OSBaseLista[3];
                OSBase.Observacao = OSBaseLista[4];
                OSBase.NumeroSerie = OSBaseLista[5];
                OSBase.Equipamento = OSBaseLista[6];
                OSBase.dataEntradaServico = OSBaseLista[7];
                OSBase.IDCliente = Convert.ToInt32(OSBaseLista[8]);
                OSBase.IDTecnico = Convert.ToInt32(OSBaseLista[9]);

            }
            catch (Exception ex)
            {
                ControllerArquivoLog.GeraraLog(ex);
            }
            return OSBase;
        }
        /// <summary>
        /// Editando Ordem de serviço
        /// </summary>
        /// <param name="OS">O.</param>
        public static string Editar(OrdemServico Os)
        {
            string Saida = "";

            Spartacus.Database.Generic database;
            Spartacus.Database.Command cmd = new Spartacus.Database.Command();

            cmd.v_text = @"update OrdemDeServico set
                       Situacao = #situacao#,
                       Defeito = #defeito#,
                       Descricao = #descricao#,
                       Observacao = #observacao#,
                       NumeroDeSerie = #numerodeserie#,
                       Equipamento = #equipamento#,
                       DataEntradaServico = #dataentradaservico#,
                       IdCliente = #idcliente#,
                       IdTecnico = #idtecnico#
                       Where ID = #id#";

            cmd.AddParameter("ID", Spartacus.Database.Type.INTEGER);
            cmd.AddParameter("Situacao", Spartacus.Database.Type.STRING);
            cmd.AddParameter("Defeito", Spartacus.Database.Type.STRING);
            cmd.AddParameter("Descricao", Spartacus.Database.Type.STRING);
            cmd.AddParameter("Observacao", Spartacus.Database.Type.STRING);
            cmd.AddParameter("NumeroDeSerie", Spartacus.Database.Type.STRING);
            cmd.AddParameter("Equipamento", Spartacus.Database.Type.STRING);
            cmd.AddParameter("DataEntradaServico", Spartacus.Database.Type.STRING);
            cmd.AddParameter("IdCliente", Spartacus.Database.Type.INTEGER);
            cmd.AddParameter("IdTecnico", Spartacus.Database.Type.INTEGER);

            // valor com acento será mantido por causa do false
            cmd.SetValue("id", Os.ID.ToString());
            cmd.SetValue("situacao", Os.Situacao, false);
            cmd.SetValue("defeito", Os.Defeito, false);
            cmd.SetValue("descricao", Os.Descricao, false);
            cmd.SetValue("observacao", Os.Observacao, false);
            cmd.SetValue("numeroDeSerie", Os.NumeroSerie);
            cmd.SetValue("equipamento", Os.Equipamento, false);
            cmd.SetValue("dataEntradaServico", Os.dataEntradaServico);
            cmd.SetValue("idCliente", Os.IDCliente.ToString());
            cmd.SetValue("idTecnico", Os.IDTecnico.ToString());

            try
            {
                database = new Spartacus.Database.Sqlite(DB.GetStrConection());

                // desabilitando seguranca de execucao de comandos
                database.SetExecuteSecurity(false);

                database.Execute(cmd.GetUpdatedText());

                Saida = "A Ordem de serviço foi editada com sucesso!";
            }
            catch (Exception exc)
            {
                ControllerArquivoLog.GeraraLog(exc);

                Saida = "Ocorreu um erro inesperado: " + exc.Message;
            }

            return Saida;
        }
        /// <summary>
        /// Salvando Ordem De Serviço
        /// </summary>
        /// <param name="Os">Os.</param>
        public static string Criar(OrdemServico Os)
        {
            Spartacus.Database.Generic database;
            Spartacus.Database.Command cmd = new Spartacus.Database.Command();

            cmd.v_text = @"insert into OrdemDeServico
                           (Situacao,Defeito,Descricao,Observacao,NumeroDeSerie,Equipamento,DataEntradaServico,IdCliente,IdTecnico)
                           values(#situacao#,#defeito#,#descricao#,#observacao#,#numerodeserie#,#equipamento#,#dataentradaservico#,#idcliente#,#idtecnico#)";

            cmd.AddParameter("situacao", Spartacus.Database.Type.STRING);
            cmd.AddParameter("defeito", Spartacus.Database.Type.STRING);
            cmd.AddParameter("descricao", Spartacus.Database.Type.STRING);
            cmd.AddParameter("observacao", Spartacus.Database.Type.STRING);
            cmd.AddParameter("numeroDeSerie", Spartacus.Database.Type.STRING);
            cmd.AddParameter("equipamento", Spartacus.Database.Type.STRING);
            cmd.AddParameter("dataEntradaServico", Spartacus.Database.Type.STRING);
            cmd.AddParameter("idCliente", Spartacus.Database.Type.INTEGER);
            cmd.AddParameter("idTecnico", Spartacus.Database.Type.INTEGER);

            // valor com acento será mantido por causa do false
            cmd.SetValue("situacao", Os.Situacao, false);
            cmd.SetValue("defeito", Os.Defeito, false);
            cmd.SetValue("descricao", Os.Descricao, false);
            cmd.SetValue("observacao", Os.Observacao, false);
            cmd.SetValue("numeroDeSerie", Os.NumeroSerie);
            cmd.SetValue("equipamento", Os.Equipamento, false);
            cmd.SetValue("dataEntradaServico", Os.dataEntradaServico);
            cmd.SetValue("idCliente", Os.IDCliente.ToString());
            cmd.SetValue("idTecnico", Os.IDTecnico.ToString());

            try
            {
                database = new Spartacus.Database.Sqlite(DB.GetStrConection());

                // desabilitando seguranca de execucao de comandos
                database.SetExecuteSecurity(false);

                database.Execute(cmd.GetUpdatedText());

                return "Ordem de serviço numero foi salva com sucesso!";
            }
            catch (Exception ex)
            {
                ControllerArquivoLog.GeraraLog(ex);
                return String.Format("Ocorreu um erro ao tental salvar a Ordem de serviço:{0}", ex.Message);
            }
        }
        /// <summary>
        /// Salvando a ordem de serviço em arquivo de Texto.
        /// </summary>
        /// <param name="Identificador"></param>
        /// <param name="Referencia"></param>
        /// <param name="Situacao"></param>
        /// <param name="Defeito"></param>
        /// <param name="Descricao"></param>
        /// <param name="Observacao"></param>
        /// <param name="NumeroSerie"></param>
        /// <param name="Equipamento"></param>
        /// <param name="DataEntradaServico"></param>
        /// <param name="Cliente"></param>
        /// <returns></returns>
        public string Save(string Identificador, string Referencia, string Situacao, string Defeito, string Descricao, string Observacao, string NumeroSerie, string Equipamento, string DataEntradaServico, string Cliente)
        {
            OrdemServico OSBase = new OrdemServico();

            string Saida = null;

            OSBase.Identificador = Identificador;
            OSBase.Equipamento = Equipamento;
            OSBase.Situacao = Situacao;
            OSBase.NumeroSerie = NumeroSerie;
            OSBase.Defeito = Defeito;
            OSBase.Referencia = Referencia;
            OSBase.DataEntradaServico = DataEntradaServico;
            OSBase.Observacao = Observacao;
            OSBase.Descricao = Descricao;
            OSBase.Cliente = Cliente;

            StreamWriter sw = null;

            if (Verificar(OSBase.Identificador) == false)
            {
                try
                {
                    sw = new StreamWriter(String.Format("OS/{0}.os", Identificador));

                    sw.WriteLine(OSBase.Identificador);
                    sw.WriteLine(OSBase.Cliente);
                    sw.WriteLine(OSBase.Equipamento);
                    sw.WriteLine(OSBase.Situacao);
                    sw.WriteLine(OSBase.NumeroSerie);
                    sw.WriteLine(OSBase.Defeito);
                    sw.WriteLine(OSBase.Referencia);
                    sw.WriteLine(OSBase.DataEntradaServico);
                    sw.WriteLine(OSBase.Observacao);
                    sw.WriteLine(OSBase.Descricao);

                }
                catch (System.Exception Exc)
                {
                    Arquivos.ArquivoLog Log = new Arquivos.ArquivoLog();

                    Log.ArquivoExceptionLog(Exc);

                    Saida = "Ocorreu um erro inesperado! Um arquivo com as informações desse erro foi criado no diretorio do seu software";
                }
                finally
                {
                    if (sw != null)
                    {
                        sw.Close();

                        Saida = "Ordem de Serviço registrada com sucesso!";
                    }

                }
            }
            else
            {
                //Chamara a função de salvar novamente se for verificado que o numero "sorteado já existe na base de dados."
                Save(OSBase.Identificador, OSBase.Referencia, OSBase.Situacao, OSBase.Defeito, OSBase.Descricao, OSBase.Observacao, OSBase.NumeroSerie, OSBase.Equipamento, OSBase.DataEntradaServico, OSBase.Cliente);
            }

            return Saida;
        }
        /// <summary>
        /// Carregando a ordem de serviço(Finalizada) atraves do arquivo de texto.
        /// </summary>
        /// <param name="_Identificador"></param>
        /// <returns>Ordem de serviço</returns>
        public OrdemServico LoadOSFinalizada(string _Identificador)
        {
            OrdemServico OSBase = new OrdemServico();
            StreamReader sr = null;

            try
            {
                sr = new StreamReader(String.Format("OS/Finalizadas/{0}.os", _Identificador));

                OSBase.Identificador = sr.ReadLine();
                OSBase.Cliente = sr.ReadLine();
                OSBase.Equipamento = sr.ReadLine();
                OSBase.Situacao = sr.ReadLine();
                OSBase.NumeroSerie = sr.ReadLine();
                OSBase.Defeito = sr.ReadLine();
                OSBase.Referencia = sr.ReadLine();
                OSBase.DataEntradaServico = sr.ReadLine();
                OSBase.Observacao = sr.ReadLine();
                OSBase.Descricao = sr.ReadLine();
            }
            catch (Exception Exc)
            {
                Arquivos.ArquivoLog Log = new Arquivos.ArquivoLog();

                Log.ArquivoExceptionLog(Exc);
            }
            finally
            {
                if (sr != null)
                    sr.Close();
            }

            return OSBase;
        }
        //Ordens finalizadas
        /// <summary>
        /// Finalizando Ordem de serviço.
        /// </summary>
        /// <param name="NumeroOS"></param>
        /// <returns>Menssagen informando se deu certo ou não</returns>
        public bool FinalizarOS(string NumeroOS)
        {
            bool Saida;
            OrdemServico OSBase = new OrdemServico();

            //TODO:trocar situação da ordem de serviço para finaliza aqui.

            if (Verificar(NumeroOS))
            {

                File.Move(String.Format("OS/{0}.os", NumeroOS), String.Format("OS/Finalizadas/{0}.os", NumeroOS));

                Saida = true;
            }
            else
            {
                //Se não for encotrada a OS ira retornar um valor False.
                Saida = false;
            }

            return Saida;
        }
        private void PreencherCamposDeTexto(int id)
        {
            OrdemServico InformacoesOrdemDeServico = new OrdemServico();
            InformacoesOrdemDeServico = ControllerOrdemServico.Carregar(id);

            IDChamado = InformacoesOrdemDeServico.ID;
            Txt_IDPesquisa.Text = InformacoesOrdemDeServico.ID.ToString();
            Txt_Situacao.Text = InformacoesOrdemDeServico.Situacao;
            Txt_Defeito.Text = InformacoesOrdemDeServico.Defeito;
            Txt_Descricao.Text = InformacoesOrdemDeServico.Descricao;
            Txt_Observacoes.Text = InformacoesOrdemDeServico.Observacao;
            Txt_Nserie.Text = InformacoesOrdemDeServico.NumeroSerie;
            Txt_Equipamento.Text = InformacoesOrdemDeServico.Equipamento;
            Txt_DataEntrada.Text = InformacoesOrdemDeServico.dataEntradaServico;
            Txt_Descricao.Text = InformacoesOrdemDeServico.Descricao;
            Txt_Cliente.Text = ControllerPessoa.VerificarNome(InformacoesOrdemDeServico.IDCliente);

            //Caso o estatus da OS for finalizado, não é possível mudar.
            if (InformacoesOrdemDeServico.Situacao == "Finalizado")
            {
                Txt_Situacao.Enabled = false;
            }
            else
            {
                Txt_Situacao.Enabled = true;
            }
        }