Ejemplo n.º 1
0
 /// <summary>
 /// Cálculos referentes ao CTE tmp1 da procedure
 /// </summary>
 /// <param name="parada"></param>
 private static void CalculaQtdPernoiteQtdDiarias(ParadaTratadaAnalitico parada)
 {
     #region tmp1
     parada.QtdDiarias   = parada.FimRealizado.Date.Subtract(parada.PartidaRealizada.Date).Days + 1;
     parada.QtdPernoites = parada.FimRealizado.Date.Subtract(parada.PartidaRealizada.Date).Days;
     #endregion
 }
Ejemplo n.º 2
0
        public static DivergenciaKm Processar(Rota rota,
                                              IEnumerable <Infra.Ocorrencia> ocorrencias,
                                              IEnumerable <Deslocamento> deslocamentosAlmoco,
                                              IEnumerable <Deslocamento> deslocamentosAbastecimento,
                                              IEnumerable <Deslocamento> deslocamentosPernoite,
                                              ParadaTratadaAnalitico parada,
                                              decimal vlMetaAderencia)
        {
            List <bool> subIndicadoresDivergenciaKm = new List <bool>();

            _divergenciaKm = new DivergenciaKm();

            subIndicadoresDivergenciaKm.Add(AderenciaRaioKPI(rota.Entregas, vlMetaAderencia));
            subIndicadoresDivergenciaKm.Add(InicioOuFimNoRaio(ocorrencias));
            subIndicadoresDivergenciaKm.Add(MotoristaOuSistemaFinalizouRota(rota));
            subIndicadoresDivergenciaKm.Add(DeslocamentosAlmocoPernoiteAbastecimento(rota, deslocamentosAlmoco, deslocamentosAbastecimento, deslocamentosPernoite));
            subIndicadoresDivergenciaKm.Add(AvaliarSombraCelularOuCelularDesligado(ocorrencias.ToList()));
            subIndicadoresDivergenciaKm.Add(AvaliarPNPRota(parada));

            _divergenciaKm.KMPrevisto  = rota.VlDistanciaTotalPrevista;
            _divergenciaKm.KMRealizado = rota.VlDistanciaTotalRealizada;

            // Se todas os sub indicadores forem verdadeiros significa que houve divergência no Km
            bool houveDivergencia = subIndicadoresDivergenciaKm.Count(indicador => indicador) == subIndicadoresDivergenciaKm.Count;

            _divergenciaKm.HouveDivergencia = houveDivergencia;

            if (!houveDivergencia)
            {
                _divergenciaKm.SetExibirOcorrenciaNoXml(false);
            }

            return(_divergenciaKm);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Cálculos referentes ao CTE tmp2 da procedure
        /// </summary>
        /// <param name="parada"></param>
        private static void CalculaRealEsperadoPIM(ParadaTratadaAnalitico parada)
        {
            #region tmp2
            Regex unNegocioRefeicaoEsperadaX120 = new Regex("^CD_BEL|CD_MCP|TSP\\-MC|TSP\\-NT|TSP\\-SLS|CL\\-VS|FTZ|TSP\\-AR|CD_CBA|SVD|ARACROSS|TSP\\-THE$");
            Regex unNegocioRefeicaoEsperadaX90  = new Regex("^JN|TSP_PELOTA|CDIAI|CDVDA|SVD|ITACROSS$");
            Regex unNegocioRefeicaoEsperadaX70  = new Regex("^PTG|APU|SJP$");

            if (unNegocioRefeicaoEsperadaX120.IsMatch(parada.CdUnNegocio))
            {
                parada.RefeicaoEsperada = parada.QtdDiarias * 120;
            }

            else if (unNegocioRefeicaoEsperadaX90.IsMatch(parada.CdUnNegocio))
            {
                parada.RefeicaoEsperada = parada.QtdDiarias * 90;
            }

            else if (unNegocioRefeicaoEsperadaX70.IsMatch(parada.CdUnNegocio))
            {
                parada.RefeicaoEsperada = parada.QtdDiarias * 70;
            }

            else
            {
                parada.RefeicaoEsperada = parada.QtdDiarias * 60;
            }

            parada.AbastecimentoEsperado = parada.QtdDiarias * 20;
            parada.PernoiteEsperada      = parada.QtdPernoites * 840;
            parada.RefeicaoReal          = parada.RefeicaoNaoApontada + parada.RefeicaoRealizada;
            parada.AbastecimentoReal     = parada.AbastecimentoNaoApontado + parada.AbastecimentoRealizado;
            parada.PernoiteReal          = parada.RepousoRealizado + parada.PernoiteNaoApontada;
            #endregion
        }
Ejemplo n.º 4
0
 /// <summary>
 /// Cálculos referentes ao CTE tmp4 da procedure
 /// </summary>
 /// <param name="parada"></param>
 private static void CalculaExcedentePNP(ParadaTratadaAnalitico parada)
 {
     #region tmp4
     parada.TempoEmRota      = (int)parada.FimRealizado.Subtract(parada.PartidaRealizada).TotalMinutes;
     parada.PNPExcedente     = parada.TotalProgramado < parada.TotalProgramadoEsperado ? 0 : parada.TotalProgramado - parada.TotalProgramadoEsperado;
     parada.PNPExcedenteNovo = parada.AlmocoExcedente + parada.AbastecimentoExcedente + parada.PernoiteExcedente;
     #endregion
 }
Ejemplo n.º 5
0
        /// <summary>
        /// Cálculos referentes ao CTE tmp5 da procedure
        /// </summary>
        /// <param name="parada"></param>
        private static void CalculaTotalReal(ParadaTratadaAnalitico parada)
        {
            #region tmp5
            parada.TotalProgramadoReal = parada.TotalProgramado - parada.PNPExcedente;

            parada.TotalPNPReal = parada.PNPToleradaClienteNaRotaIsNao + parada.ErroApontamentoClienteNaRotaIsNao +
                                  parada.PNPComportamentalClienteNaRotaIsNao + parada.PNPExcedente;

            parada.TotalPNPRealNovo = parada.PNPToleradaClienteNaRotaIsNao + parada.ErroApontamentoClienteNaRotaIsNao +
                                      parada.PNPComportamentalClienteNaRotaIsNao + parada.AguardandoDescargaClienteNaRotaIsNao + parada.PNPExcedenteNovo;
            #endregion
        }
Ejemplo n.º 6
0
        /// <summary>
        /// Cálculos referentes ao CTE tmp3 da procedure
        /// </summary>
        /// <param name="parada"></param>
        private static void CalculaExcedentePIM(ParadaTratadaAnalitico parada)
        {
            #region tmp3
            parada.TotalProgramadoEsperado = parada.RefeicaoEsperada + parada.AbastecimentoEsperado + parada.PernoiteEsperada;

            parada.TotalProgramado = parada.RefeicaoNaoApontada + parada.RefeicaoRealizada +
                                     parada.AbastecimentoNaoApontado + parada.AbastecimentoRealizado +
                                     parada.RepousoRealizado + parada.PernoiteNaoApontada;

            parada.AlmocoExcedente        = parada.RefeicaoReal > parada.RefeicaoEsperada ? parada.RefeicaoReal - parada.RefeicaoEsperada : 0;
            parada.AbastecimentoExcedente = parada.AbastecimentoReal > parada.AbastecimentoEsperado ? parada.AbastecimentoReal - parada.AbastecimentoEsperado : 0;
            parada.PernoiteExcedente      = parada.PernoiteReal > parada.PernoiteEsperada ? parada.PernoiteReal - parada.PernoiteEsperada : 0;
            #endregion
        }
Ejemplo n.º 7
0
        /// <summary>
        /// Este método é baseado na procedure de BI.
        /// A referida procedure possui regras específicas para avaliar as PNPs das rotas.
        /// O código abaixo reflete a conversão do T-SQL para C#.
        /// Sendo assim, não foram levados em consideração possíveis otimizações de código.
        /// </summary>
        /// <param name="parada"></param>
        /// <returns></returns>
        public static bool AvaliarPNPRota(ParadaTratadaAnalitico parada)
        {
            if (parada == null)
            {
                return(true);
            }

            CalculaQtdPernoiteQtdDiarias(parada);
            CalculaRealEsperadoPIM(parada);
            CalculaExcedentePIM(parada);
            CalculaExcedentePNP(parada);
            CalculaTotalReal(parada);
            AvaliaPNP(parada);

            return(parada.PNPAprovado);
        }
Ejemplo n.º 8
0
        /// <summary>
        /// Cálculos referentes ao CTE tmp6 da procedure
        /// </summary>
        /// <param name="parada"></param>
        private static void AvaliaPNP(ParadaTratadaAnalitico parada)
        {
            #region tmp6
            if (parada.TempoEmRota - parada.TotalProgramadoReal > 0)
            {
                parada.PorcentagemPNP     = (decimal)parada.TotalPNPReal / (parada.TempoEmRota - parada.TotalProgramadoReal);
                parada.PorcentagemPNPNovo = (decimal)parada.TotalPNPRealNovo / (parada.TempoEmRota - parada.TotalProgramadoReal);

                if (parada.TotalPNPReal <= 15 || parada.PorcentagemPNP <= 0.0288461538455726m)
                {
                    parada.PNP = "Aprovado";
                }

                else
                {
                    parada.PNP = "Reprovado";
                }

                if (parada.TotalPNPRealNovo <= 15 || parada.PorcentagemPNPNovo <= 0.0288461538455726m)
                {
                    parada.PNPNovo = "Aprovado";
                }

                else
                {
                    parada.PNPNovo = "Reprovado";
                }

                parada.PartidaRealizadoChave = parada.PartidaRealizada.AddDays(1).AddHours(12);
                parada.FimRealizadoChave     = parada.FimRealizado.AddDays(1).AddHours(12);
            }

            // Se o tempo em rota for menor que o tempo programado, então aprova todas as PNPs
            else
            {
                parada.PNP     = "Aprovado";
                parada.PNPNovo = "Aprovado";
            }
            #endregion

            #region tmp7
            parada.PNPAprovado  = parada.PNP == "Aprovado";
            parada.PNPReprovado = !parada.PNPAprovado;
            #endregion
        }