private static void DivergenciaPernoiteOcorrenciaWS(Entities.Ocorrencia ocorrencia, DT_CUSTO_ADICIONAL_FRETE_HBSIS_RequestIntegracaoOcorrencia ocorrenciaWS)
        {
            DivergenciaPernoite divergenciaPernoite = (DivergenciaPernoite)ocorrencia;

            ocorrenciaWS.Codigo = divergenciaPernoite.Codigo;
            ocorrenciaWS.Nome   = divergenciaPernoite.Nome;
            ocorrenciaWS.QuantidadePernoitePrevista  = divergenciaPernoite.QuantidadePrevista.ToString();
            ocorrenciaWS.QuantidadePernoiteRealizada = divergenciaPernoite.QuantidadeRealizada.ToString();
        }
        public static DivergenciaPernoite Processar(Rota rota, IEnumerable <Infra.Ocorrencia> ocorrenciasRepouso, IEnumerable <Deposito> depositos)
        {
            DivergenciaPernoite divergenciaPernoite = new DivergenciaPernoite();
            int quantidadeRealizada = DivergenciaDiariaOcorrencia.Processar(rota).QuantidadeDiariaRealizada - 1;
            int quantidadePrevista  = DivergenciaDiariaOcorrencia.Processar(rota).QuantidadeDiariaPrevista - 1;

            var pernoites = ObtemPernoites(ocorrenciasRepouso);

            foreach (var pernoite in pernoites)
            {
                decimal latInicioRepouso = pernoite.GetCoordenadasInicioRepouso().lat;
                decimal lonInicioRepouso = pernoite.GetCoordenadasInicioRepouso().lon;

                decimal latFimRepouso = pernoite.GetCoordenadasFimRepouso().lat;
                decimal lonFimRepouso = pernoite.GetCoordenadasFimRepouso().lon;

                foreach (var deposito in depositos)
                {
                    if (deposito.PontoInteresse != null)
                    {
                        int metrosRaioDeposito = deposito.PontoInteresse.QtMetrosRaio;

                        decimal latDeposito = deposito.PontoInteresse.NrLatitude;
                        decimal lonDeposito = deposito.PontoInteresse.NrLongitude;

                        (double distInicioRepousoAoDeposito, _) = Coordenada.DistanciaLinhaReta(latInicioRepouso, lonInicioRepouso, latDeposito, lonDeposito);
                        (double distFimRepousoAoDeposito, _)    = Coordenada.DistanciaLinhaReta(latFimRepouso, lonFimRepouso, latDeposito, lonDeposito);

                        // Se o motorista estiver dentro do raio de algum dos CDs
                        // (ou seja, dormiu em um CD),
                        // então é desconsiderada a pernoite referente a esse repouso.
                        if (distInicioRepousoAoDeposito <= metrosRaioDeposito || distFimRepousoAoDeposito <= metrosRaioDeposito)
                        {
                            quantidadeRealizada--;
                            break;
                        }
                    }
                }
            }

            divergenciaPernoite.QuantidadeRealizada = quantidadeRealizada < 0 ? 0 : quantidadeRealizada;
            divergenciaPernoite.QuantidadePrevista  = quantidadePrevista < 0 ? 0 : quantidadePrevista;

            // Não envia o indicador ao WS quando os dias realizados estiverem dentro do previsto
            if (divergenciaPernoite.QuantidadeRealizada <= divergenciaPernoite.QuantidadePrevista)
            {
                divergenciaPernoite.SetExibirOcorrenciaNoXml(false);
            }

            return(divergenciaPernoite);
        }