/// <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 }
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); }
/// <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 }
/// <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 }
/// <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 }
/// <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 }
/// <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); }
/// <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 }