/// <summary> /// Recupera a data da rota por cliente. /// </summary> public DateTime?GetDataRota(GDASession session, uint idCli, DateTime dataInicial, bool somarDiasUteisRota, Pedido.TipoPedidoEnum?tipoPedido, bool recalculaDataRota = false) { Rota rota = this.GetByCliente(session, idCli); if (rota == null || (rota.DiasSemana == Model.DiasSemana.Nenhum && rota.NumeroMinimoDiasEntrega == 0)) { return(null); } var diasConsiderar = tipoPedido == Pedido.TipoPedidoEnum.Revenda ? PedidoConfig.DataEntrega.NumeroDiasUteisDataEntregaPedidoRevenda : rota.NumeroMinimoDiasEntrega; int numeroDias = (dataInicial - DateTime.Now).Days; // Calcula a rota considerando dias corridos if (RotaConfig.UsarDiasCorridosCalculoRota && tipoPedido != Pedido.TipoPedidoEnum.Revenda) { // A comparação do número de dias percorrido com o número mínimo de dias da rota deve ser "numeroDias++ < rota.NumeroMinimoDiasEntrega", // porque dessa forma caso o último dia da contagem caia no dia da rota, esta data será usada, porém da forma como estava antes, // "numeroDias++ <= rota.NumeroMinimoDiasEntrega", a data usada será a da outra semana. // while (numeroDias++ < rota.NumeroMinimoDiasEntrega || dataInicial.Feriado() || /* Chamado 54042. */ while ((somarDiasUteisRota ? numeroDias++ < diasConsiderar : false) || dataInicial.Feriado() || (rota.DiasSemana != Model.DiasSemana.Nenhum && !this.TemODia(dataInicial.DayOfWeek, rota.DiasSemana))) { dataInicial = dataInicial.AddDays(1); } } // Calcula a rota considerando dias úteis else { /* Chamado 54042. */ if (somarDiasUteisRota && !recalculaDataRota) { for (var i = 0; i < diasConsiderar; i++) { dataInicial = dataInicial.AddDays(1); // Enquanto não for dia útil, continua avançando a data while (!FuncoesData.DiaUtil(dataInicial)) { dataInicial = dataInicial.AddDays(1); } } } // Depois de calcular os dias mínimos da rota, verifica se a data é um dia da rota if (rota.DiasSemana != Model.DiasSemana.Nenhum && !this.TemODia(dataInicial.DayOfWeek, rota.DiasSemana)) { while (!this.TemODia(dataInicial.DayOfWeek, rota.DiasSemana) || dataInicial.Feriado()) { dataInicial = dataInicial.AddDays(1); } } } return(dataInicial); }
/// <summary> /// Verifica se a data passada é um dia útil /// </summary> /// <param name="idGrupo"></param> public static string IsDiaUtil(string data) { if (data.IndexOf("GMT") > -1) { data = data.Substring(0, data.IndexOf("GMT") - 1); } var dataRetorno = DateTime.Parse(data, System.Globalization.CultureInfo.InvariantCulture); return(FuncoesData.DiaUtil(dataRetorno).ToString().ToLower()); }
public bool VerificaDiaUtil(DateTime data) { return(FuncoesData.DiaUtil(data)); }
public FluxoCaixa[] GetForRpt(string dataIni, string dataFim, bool prevCustoFixo, string tipoConta) { SaldoInicial saldoInicial = null; if (String.IsNullOrEmpty(dataFim) || String.IsNullOrEmpty(dataIni)) { return(new FluxoCaixa[0]); } GDAParameter[] param = new GDAParameter[] { new GDAParameter("?dataIni", DateTime.Parse(dataIni + " 00:00")), new GDAParameter("?dataFim", DateTime.Parse(dataFim + " 23:59")) }; var sql = Sql("?dataIni", "?dataFim", tipoConta); var lstFluxoCaixa = objPersistence.LoadData(sql, param).ToList(); #region Busca os custos fixos se previsão estiver marcada if (prevCustoFixo) { // Data Inicial/Final para a previsão de custos fixos DateTime dataIniPrev = DateTime.Parse(dataIni); DateTime dataFimPrev = DateTime.Parse(dataFim); // Pega a quantidade de meses que serão buscados os custos fixos int qtdMeses = (int)FuncoesData.DateDiff(DateInterval.Month, dataIniPrev, dataFimPrev) + 1; // Contador do mês que serão buscados os custos fixos int contMesAtual = 1; // Datas utilizadas como parâmetros para a busca de custos fixos DateTime dataIniParam = DateTime.Parse(dataIniPrev.ToString("dd/MM/yyyy 00:00")); DateTime dataFimParam = DateTime.Parse(dataIniParam.AddMonths(1).ToString("dd/MM/yyyy 00:00")); while (contMesAtual <= qtdMeses) { // Busca todos os custos fixos ativos do mês que não foram gerados ainda sql = @"Select Str_To_Date(Concat(Least(cf.DiaVenc, Day(Last_Day(Str_To_Date(Concat('01,', Month(?dataIni), ',', Year(?dataIni)), '%d,%m,%Y')))), ',', Month(?dataIni), ',', Year(?dataIni)), '%d,%m,%Y') as Data, cast(cf.idConta as signed) as idConta, Concat(g.Descricao, ' - ', p.Descricao) as Descricao, Coalesce(f.NomeFantasia, f.RazaoSocial, '') as Parceiro, cf.valorVenc as Valor, 2 as TipoMov, 1 as prevCustoFixo From custo_fixo cf Left Join fornecedor f On (cf.IdFornec=f.IdFornec) Left Join plano_contas p On (cf.IdConta=p.IdConta) Left Join grupo_conta g On (p.IdGrupo=g.IdGrupo) Where cf.situacao=" + (int)CustoFixo.SituacaoEnum.Ativo + FiltroTipoConta("cf", "contabil", tipoConta) + @" And cf.idCustoFixo Not In (select * from (Select Coalesce(cp.idCustoFixo, 0) From contas_pagar cp Where cp.dataVenc>=?dataIni And cp.dataVenc<?dataFim) as temp)"; // Se for o primeiro mês, busca custos fixos a partir do dia especificado pelo usuário em dataIni if (contMesAtual == 1) { sql += " And cf.diaVenc>=" + dataIniPrev.Day; } // Se for o primeiro mês, busca custos fixos até o dia especificado pelo usuário em dataFim if (contMesAtual == qtdMeses) { sql += " And cf.diaVenc<=" + dataFimPrev.Day; } // Se a dataFimParam for maior que o filtro de dataFim aplicado pelo usuário, utiliza a dataFim aplicada pelo usuário dataFimParam = dataFimParam > dataFimPrev ? dataFimPrev : dataFimParam; lstFluxoCaixa.AddRange(objPersistence.LoadData(sql, new GDAParameter[] { new GDAParameter("?dataIni", dataIniParam), new GDAParameter("?dataFim", dataFimParam) })); // Incrementa em 1 mês a data de verificação de custos fixos dataIniParam = dataIniParam.AddMonths(1); dataFimParam = dataIniParam.AddMonths(1); contMesAtual++; } // Ordena a lista pelo nome do grupo e pelo nome dos itens lstFluxoCaixa.Sort(new Comparison <FluxoCaixa>(delegate(FluxoCaixa x, FluxoCaixa y) { int sortOrder = DateTime.Compare(x.Data, y.Data); return(sortOrder != 0 ? sortOrder : DateTime.Compare(x.Data, y.Data)); })); } #endregion foreach (var item in lstFluxoCaixa) { var idTipoCartao = item.IdConta != null?Helper.UtilsPlanoConta.ObterTipoCartaoPorConta((uint)item.IdConta) : null; item.Data = idTipoCartao == null?item.Data.AddDays(1) : item.Data; while (!FuncoesData.DiaUtil(item.Data)) { item.Data = item.Data.AddDays(1); } } if (lstFluxoCaixa.Count > 0) { DateTime currDate = lstFluxoCaixa[0].Data.Date; decimal saldoDiario = 0; saldoInicial = GetSaldoInicial(!String.IsNullOrEmpty(dataIni) ? dataIni : lstFluxoCaixa.Min(x => x.Data).ToString("dd/MM/yyyy")); decimal valorSaldoInicial = saldoInicial.Saldo; uint numSeq = saldoInicial.Count; lstFluxoCaixa.ForEach(x => x.NumSeqMov = ++numSeq); // Obtém os saldos diário e geral foreach (FluxoCaixa fc in lstFluxoCaixa) { if (currDate != fc.Data.Date) { saldoDiario = 0; currDate = fc.Data.Date; } decimal valorParaSaldo = fc.TipoMov == 1 ? fc.Valor : -fc.Valor; // Calcula o saldo diário fc.SaldoDoDia = (saldoDiario += valorParaSaldo); // Calcula o saldo geral fc.SaldoGeral = (valorSaldoInicial += valorParaSaldo); } // Insere as movimentações de saldo inicial no início da lista lstFluxoCaixa.InsertRange(0, saldoInicial.Movimentacoes.OrderBy(x => x.NumSeqMov)); lstFluxoCaixa[0].Criterio = "Período: " + dataIni + " até " + dataFim; } return(lstFluxoCaixa.ToArray()); }