//
        // GET: /OS/Details/5

        public ActionResult Details(int id)
        {
            try
            {
                ViewBag.Title = "Detalhes - Ordens de Serviço";
                Conexao.Ativar(true);
                Usuario umUsuario = (Usuario)Session["UsuarioLogado"];
                INegocio<OrdemServico, int> umaOSBUS = new OrdemServicoBUS(Conexao.Instacia, umUsuario.Funcionario.Empresa, umUsuario.Funcionario.Filial);
                OrdemServico umaOS = umaOSBUS.Consultar(id);

                this.VerificaOsRemota(ref umaOS, umUsuario);

                if (umaOS != null)
                {
                    if (umUsuario.IsAdministrador)
                    {
                        return View(umaOS);
                    }
                    else
                    {
                        if (umUsuario.Funcionario.Codigo == umaOS.Funcionario.Codigo)
                        {
                            return View(umaOS);
                        }
                        else
                        {
                            return RedirectToAction("Index", new { st = "er" });
                        }
                    }
                }
                else
                {
                    return RedirectToAction("Index", new { st = "iv" });
                }
            }
            catch (Exception ex)
            {
                return RedirectToAction("Index", new { st = "er" });
            }
            finally
            {
                if (Conexao.Instacia.State == ConnectionState.Open)
                {
                    Conexao.Ativar(false);
                }
            }
        }
        public ActionResult Delete(int id, OrdemServico os)
        {
            try
            {
                Conexao.Ativar(true);
                Usuario umUsuario = (Usuario)Session["UsuarioLogado"]; 
                INegocio<OrdemServico, int> umaOSBUS = new OrdemServicoBUS(Conexao.Instacia, umUsuario.Funcionario.Empresa, umUsuario.Funcionario.Filial);
                os = umaOSBUS.Consultar(id);
                this.VerificaOsRemota(ref os, umUsuario);

                if (os.Remoto)
                {
                    IOrdemServicoRemotoNegocio umaOrdemServicoRemotoBUS;
                    OrdemServicoRemoto umaOrdemServicoRemota;
                    PrepararOsRemota(os, umUsuario, out umaOrdemServicoRemotoBUS, out umaOrdemServicoRemota);
                    umaOrdemServicoRemotoBUS.Excluir(umaOrdemServicoRemota);
                }
                else
                {                    
                    umaOSBUS.Excluir(os);
                }

                AtualizarOS(umUsuario, os.Data);
                return RedirectToAction("Index", new { st = "ok" });
            }
            catch (Exception ex)
            {
                return RedirectToAction("Index", new { st = "er" });
            }
            finally
            {
                if (Conexao.Instacia.State == ConnectionState.Open)
                {
                    Conexao.Ativar(false);
                }
            }
        }
        //
        // /OS/ViewReport/5

        public ActionResult ViewReport(int id)
        {
            try
            {
                Conexao.Ativar(true);
                Usuario umUsuario = (Usuario)Session["UsuarioLogado"];
                OrdemServicoBUS umOrdemServicoBUS = new OrdemServicoBUS(Conexao.Instacia, umUsuario.Funcionario.Empresa, umUsuario.Funcionario.Filial);
                OrdemServico umaOS = umOrdemServicoBUS.Consultar(id);
                this.VerificaOsRemota(ref umaOS, umUsuario);

                string query = string.Empty;
                string pathRelatorio = string.Empty;

                if (umaOS.Remoto)
                {
                    query = "SELECT O.CLIENTE, O.FUNCIONARIO, OSR.INICIO AS DATADE, OSR.FIM AS DATAATE, "+
                            "O.INICIO, O.FIM, O.TRANSLADO, OSR.TOTAL, O.ATIVIDADE, C.CODIGO AS CODIGOCLIENTE, "+
                            "C.NOME AS NOMECLIENTE, F.NOME AS NOMEFUNCIONARIO, "+
                            "F.CODIGO AS CODIGOFUNCIONARIO, F.DATACADASTRO, O.CODIGO AS CODIGOOS "+
                            "FROM (ORDEM_SERVICO O INNER JOIN CLIENTES C ON O.CLIENTE = C.CODIGO) "+
                            "INNER JOIN FUNCIONARIOS F ON O.FUNCIONARIO = F.CODIGO "+
                            "INNER JOIN ORDEM_SERVICO_REMOTO OSR ON O.CODIGO = OSR.ORDEMSERVICO "+
                            "WHERE O.CODIGO=@CODIGO";

                    pathRelatorio = "~/Relatorios/OrdensDeServicoRemoto.frx";
                }
                else
                {
                    query = "SELECT O.CLIENTE, O.FUNCIONARIO, O.DATA, O.INICIO, O.FIM, O.TRANSLADO, O.ATIVIDADE, " +
                            "C.CODIGO AS CODIGOCLIENTE, C.NOME AS NOMECLIENTE, F.NOME AS NOMEFUNCIONARIO, " +
                            "F.CODIGO AS CODIGOFUNCIONARIO, F.DATACADASTRO, O.CODIGO AS CODIGOOS " +
                            "FROM (\"ORDEM_SERVICO\" O INNER JOIN \"CLIENTES\" C ON O.CLIENTE = C.CODIGO " +
                            ") INNER JOIN \"FUNCIONARIOS\" F ON O.FUNCIONARIO = F.CODIGO " +
                            "WHERE O.CODIGO=@CODIGO";

                    pathRelatorio = "~/Relatorios/OrdensDeServico.frx";
                }

                FbParameter[] parametros = new FbParameter[1];
                parametros[0] = new FbParameter();
                parametros[0].ParameterName = "@CODIGO";

                if (umUsuario.IsAdministrador)
                {
                    GerarRelatorioOS(id, umOrdemServicoBUS, query, pathRelatorio, parametros);
                    return View();
                }
                else
                {
                    if (umUsuario.Funcionario.Codigo == umaOS.Funcionario.Codigo)
                    {
                        GerarRelatorioOS(id, umOrdemServicoBUS, query, pathRelatorio, parametros);
                        return View();
                    }
                    else
                    {
                        return RedirectToAction("Index", new { st = "er" });
                    }
                }
            }
            catch (Exception ex)
            {
                return RedirectToAction("Index", new { st = "er" });
            }
            finally
            {
                if (Conexao.Instacia.State == ConnectionState.Open)
                {
                    Conexao.Ativar(false);
                }
            }
        }
        //
        // GET: /OS/Edit/5

        public ActionResult Edit(int id)
        {
            try
            {
                ViewBag.Title = "Edição - Ordens de Serviço";
                Conexao.Ativar(true);
                Usuario umUsuario = (Usuario)Session["UsuarioLogado"];
                OrdemServicoBUS umaOSBUS = new OrdemServicoBUS(Conexao.Instacia, umUsuario.Funcionario.Empresa, umUsuario.Funcionario.Filial);

                OrdemServico umaOS = umaOSBUS.Consultar(id);

                this.VerificaOsRemota(ref umaOS, umUsuario);

                if (umaOSBUS.VerificaPrazoEdicao(umaOS, this._limiteDiasEdicao))
                {
                    umaOS.Clientes = new ClienteBUS(Conexao.Instacia, umUsuario.Funcionario.Empresa, umUsuario.Funcionario.Filial).Listar();
                    umaOS.Situacoes = new StatusOrdemServicoBUS(Conexao.Instacia, umUsuario.Funcionario.Empresa, umUsuario.Funcionario.Filial).Listar();
                    umaOS.Projetos = new ProjetoBUS(Conexao.Instacia, umUsuario.Funcionario.Empresa, umUsuario.Funcionario.Filial).Pesquisar(umaOS.Cliente.Codigo);
                    umaOS.TipoHoras = new TipoHoraBUS(Conexao.Instacia, umUsuario.Funcionario.Empresa, umUsuario.Funcionario.Filial).Listar();

                    if (umUsuario.IsAdministrador)
                    {
                        return View(umaOS);
                    }
                    else
                    {
                        if (umUsuario.Funcionario.Codigo == umaOS.Funcionario.Codigo)
                        {
                            return View(umaOS);
                        }
                        else
                        {
                            return RedirectToAction("Index", new { st = "er" });
                        }
                    }
                }
                else
                {
                    return RedirectToAction("Index", new { st = "tf" });
                }
            }
            catch (Exception ex)
            {
                return RedirectToAction("Index", new { st = "er" });
            }
            finally
            {
                if (Conexao.Instacia.State == ConnectionState.Open)
                {
                    Conexao.Ativar(false);
                }
            }
        }