예제 #1
0
파일: RotaDAO.cs 프로젝트: ertprs/Estudo
        /// <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);
        }
예제 #2
0
        /// <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());
        }
예제 #3
0
 public bool VerificaDiaUtil(DateTime data)
 {
     return(FuncoesData.DiaUtil(data));
 }
예제 #4
0
        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());
        }