Beispiel #1
0
        /// <summary>
        /// Verifica se o pedido pode ser cancelado.
        /// </summary>
        public bool VerificaCancelarPedido(uint idComissao, uint idPedido, Pedido.TipoComissao tipoComissao)
        {
            var sql = string.Format("SELECT COUNT(*) FROM debito_comissao WHERE IdComissao IS NOT NULL AND IdComissao<>{0} AND IdPedido={1} AND TipoFunc={2} AND (IdTrocaDevolucao IS NULL OR IdTrocaDevolucao=0)",
                                    idComissao, idPedido, (int)tipoComissao);

            return(objPersistence.ExecuteSqlQueryCount(sql) == 0);
        }
Beispiel #2
0
        /// <summary>
        /// Remove os dados da comissão da lista de débitos, informando que os débitos continuam para geração.
        /// </summary>
        /// <param name="idComissao"></param>
        /// <param name="idPedido"></param>
        public void CancelaPedido(uint idPedido, Pedido.TipoComissao tipoComissao)
        {
            string sql = "delete from debito_comissao where idComissao is null and idPedido=" + idPedido +
                         " and tipoFunc=" + (int)tipoComissao;

            objPersistence.ExecuteCommand(sql);
        }
Beispiel #3
0
        /// <summary>
        /// Retorna os débitos que serão descontados da comissão.
        /// </summary>
        /// <param name="idFuncionario">O identificador do funcionário.</param>
        /// <param name="tipoComissao">O tipo de comissão que está sendo paga.</param>
        /// <returns></returns>
        public KeyValuePair <string, decimal> GetDebitos(uint idFuncionario, Pedido.TipoComissao tipoComissao)
        {
            List <string> ids     = new List <string>();
            decimal       retorno = 0;

            if (idFuncionario > 0)
            {
                foreach (DebitoComissao d in GetListDebitos(null, idFuncionario, tipoComissao))
                {
                    ids.Add(d.IdPedido.ToString());
                    retorno += d.ValorDebito;
                }
            }

            return(new KeyValuePair <string, decimal>(String.Join(",", ids.ToArray()), retorno));
        }
Beispiel #4
0
        /// <summary>
        /// Retorna o percentual total da comissão do funcionário.
        /// </summary>
        /// <param name="idFunc">O identificador do funcionário.</param>
        /// <param name="idsPedidos">Os IDs dos pedidos.</param>
        /// <returns>A porcentagem correspondente à comissão.</returns>
        public decimal GetComissaoPerc(Pedido.TipoComissao tipoFunc, uint idFunc, string dataIni, string dataFim, string idsPedidos)
        {
            // Soma o total usado como base de cálculo de comissão
            decimal total = 0;

            foreach (Pedido p in PedidoDAO.Instance.GetByString(idsPedidos, idFunc, tipoFunc, dataIni, dataFim))
            {
                total += p.ValorBaseCalcComissao;
            }

            // Calcula o valor da comissão
            decimal valorComissao = GetComissaoValor(tipoFunc, idFunc, dataIni, dataFim, idsPedidos);

            // Retorna o percentual de comissão
            return(valorComissao * 100 / total);
        }
Beispiel #5
0
        /// <summary>
        /// Retorna o percentual total da comissão do funcionário.
        /// </summary>
        /// <param name="idFunc">O identificador do funcionário.</param>
        /// <param name="idsPedidos">Os IDs dos pedidos.</param>
        /// <returns>A porcentagem correspondente à comissão.</returns>
        public decimal GetComissaoPerc(Pedido.TipoComissao tipoFunc, uint idFunc, string dataIni, string dataFim, params uint[] idsPedidos)
        {
            if (idsPedidos.Length == 0)
            {
                return(0);
            }

            string idsPedidosStr = "";

            foreach (uint id in idsPedidos)
            {
                idsPedidosStr += "," + id;
            }

            return(GetComissaoPerc(tipoFunc, idFunc, dataIni, dataFim, idsPedidosStr.Substring(1)));
        }
Beispiel #6
0
        /// <summary>
        /// Retorna o valor correspondente à comissão do funcionário.
        /// </summary>
        /// <param name="idFunc">O identificador do funcionário.</param>
        /// <param name="idsPedidos">Os IDs dos pedidos.</param>
        /// <returns>O valor da comissão.</returns>
        public decimal GetComissaoValor(Pedido.TipoComissao tipoFunc, uint idFunc, string dataIni, string dataFim, string idsPedidos)
        {
            if (string.IsNullOrEmpty(idsPedidos))
            {
                return(0);
            }

            decimal valorComissaoRetorno = 0;

            Model.ComissaoConfig comissao = GetComissaoConfig(idFunc);

            var pedidos = PedidoDAO.Instance.GetByString(idsPedidos, idFunc, tipoFunc, dataIni, dataFim);

            if (tipoFunc == Pedido.TipoComissao.Gerente)
            {
                valorComissaoRetorno = ComissaoConfigGerenteDAO.Instance.GetValorComissaoPedidos(pedidos, idFunc, dataIni, dataFim);
            }
            else if (PedidoConfig.Comissao.PerComissaoPedido)
            {
                // Calcula o valor da comissão dos pedidos, considerando o percentual de desconto de cada pedido,
                // caso a empresa trabalhe dessa forma
                foreach (Pedido p in pedidos)
                {
                    valorComissaoRetorno += p.ValorComissaoPagar;
                }
            }
            else
            {
                /* Chamado 54760. */
                foreach (var pedido in pedidos)
                {
                    valorComissaoRetorno += GetComissaoValor(pedido.ValorBaseCalcComissao, idFunc, pedido.IdPedido, Pedido.TipoComissao.Funcionario);
                }
            }

            return(valorComissaoRetorno);
        }
Beispiel #7
0
        /// <summary>
        /// (APAGAR: quando alterar para utilizar transação)
        /// Gera comissão para o funcionário/comissionado referente aos pedidos passados
        /// </summary>
        public decimal GerarComissao(Pedido.TipoComissao tipoComissao, uint idFuncComissionado, string idsPedido, string dataRefIni, string dataRefFim,
                                     decimal valorCalculadoPagina, string dataContaPagar)
        {
            using (var transaction = new GDATransaction())
            {
                try
                {
                    transaction.BeginTransaction();

                    var retorno = GerarComissao(transaction, tipoComissao, idFuncComissionado, idsPedido, dataRefIni, dataRefFim, valorCalculadoPagina, dataContaPagar);

                    transaction.Commit();
                    transaction.Close();

                    return(retorno);
                }
                catch
                {
                    transaction.Rollback();
                    transaction.Close();
                    throw;
                }
            }
        }
Beispiel #8
0
        /// <summary>
        /// Gera os débitos para os pedidos.
        /// </summary>
        /// <param name="session"></param>
        /// <param name="idPedido"></param>
        /// <param name="idFunc"></param>
        /// <param name="tipo"></param>
        /// <param name="valor"></param>
        private void GerarDebito(GDASession session, uint idPedido, uint?idFunc, Pedido.TipoComissao tipo, decimal valor, uint?idTrocaDevolucao)
        {
            if (idFunc == null)
            {
                return;
            }

            if (objPersistence.ExecuteSqlQueryCount(session, @"select count(*) from debito_comissao
                where tipoFunc=" + (int)tipo + " and idPedido=" + idPedido +
                                                    (idTrocaDevolucao.GetValueOrDefault() > 0 ? " and idTrocaDevolucao=" + idTrocaDevolucao : " and idTrocaDevolucao is null")) > 0)
            {
                throw new Exception("Débito de comissão já existente para o pedido.");
            }

            DebitoComissao novo = new DebitoComissao();

            novo.IdPedido         = idPedido;
            novo.ValorDebito      = valor;
            novo.Tipo             = tipo;
            novo.IdFunc           = idFunc.Value;
            novo.IdTrocaDevolucao = idTrocaDevolucao;

            Insert(session, novo);
        }
Beispiel #9
0
 private void GerarDebito(GDASession session, uint idPedido, uint?idFunc, Pedido.TipoComissao tipo, decimal valor)
 {
     GerarDebito(session, idPedido, idFunc, tipo, valor, null);
 }
Beispiel #10
0
 /// <summary>
 /// Gera os débitos para os pedidos.
 /// </summary>
 /// <param name="idPedido"></param>
 /// <param name="idFunc"></param>
 /// <param name="tipo"></param>
 /// <param name="valor"></param>
 private void GerarDebito(uint idPedido, uint?idFunc, Pedido.TipoComissao tipo, decimal valor)
 {
     GerarDebito(null, idPedido, idFunc, tipo, valor);
 }
Beispiel #11
0
        /// <summary>
        /// Indica que os débitos foram quitados em uma comissão.
        /// </summary>
        /// <param name="idsPedidos"></param>
        /// <param name="idComissao"></param>
        /// <param name="tipoComissao"></param>
        public void MarcaComissao(GDASession sessao, string idsPedidos, uint idComissao, Pedido.TipoComissao tipoComissao)
        {
            if (String.IsNullOrEmpty(idsPedidos))
            {
                return;
            }

            string sql = "update debito_comissao set idComissao=" + idComissao + " where idPedido in (" + idsPedidos +
                         ") and tipoFunc=" + (int)tipoComissao + " AND IdComissao IS NULL";

            objPersistence.ExecuteCommand(sessao, sql);
        }
Beispiel #12
0
 /// <summary>
 /// Indica que os débitos foram quitados em uma comissão.
 /// </summary>
 /// <param name="idsPedidos"></param>
 /// <param name="idComissao"></param>
 /// <param name="tipoComissao"></param>
 public void MarcaComissao(string idsPedidos, uint idComissao, Pedido.TipoComissao tipoComissao)
 {
     MarcaComissao(null, idsPedidos, idComissao, tipoComissao);
 }
Beispiel #13
0
        //private DebitoComissaoDAO() { }

        #region Recupera os débitos

        private IList <DebitoComissao> GetListDebitos(uint[] idsComissao, uint idFuncionario, Pedido.TipoComissao tipoComissao)
        {
            string sql = "select * from debito_comissao where 1";

            if (idsComissao != null && idsComissao.Length > 0)
            {
                string ids = "";
                foreach (uint i in idsComissao)
                {
                    ids += i + ",";
                }

                sql += " and idComissao in (" + ids.TrimEnd(',') + ")";
            }

            if (idFuncionario > 0)
            {
                sql += " and idFunc=" + idFuncionario;
            }

            if (tipoComissao != Pedido.TipoComissao.Todos)
            {
                sql += " and idComissao is null and tipoFunc=" + (int)tipoComissao;
            }

            return(objPersistence.LoadData(sql).ToList());
        }
Beispiel #14
0
        /// <summary>
        /// Chamado 48565. Cria/atualiza registros da tabela pedido_comissao com base nos dados de comissão.
        /// </summary>
        public void CriarPedidoComissaoPorPedidosEFuncionario(GDASession sessao, IEnumerable <Pedido> pedidos, int idFunc, Pedido.TipoComissao tipoComissao)
        {
            var sql = string.Empty;

            // SQL base da atualização do registro da tabela pedido_comissao.
            var       sqlAtualizacao = "UPDATE pedido_comissao SET ValorPagar={0}, ValorPago={1}, DataAlt=?dataAlt WHERE IdPedidoComissao={2};";
            var       p    = new string[3];
            var       cont = 0;
            const int QTD_COMANDOS_SQL_POR_EXECUCAO = 200;

            // O método deverá prosseguir somente se o ID do funcionário for maior que zero e se o tipo da comissão for por funcionário.
            // Isso porque esses métodos foram criados para sanar a lentidão ao filtrar um funcionário na tela de comissões a serem geradas.
            // Nessa tela, somente as comissões do tipo Funcionário são criadas.
            if (idFunc > 0 && tipoComissao == Pedido.TipoComissao.Funcionario)
            {
                // Obtem as comissões dos pedidos.
                var pedidosComissao = ObterPedidoComissaoFuncionarioPorPedidos(sessao, pedidos.Select(f => (int)f.IdPedido).ToList(), idFunc);

                foreach (var pedidoComissao in pedidosComissao)
                {
                    // Recupera o pedido equivalente ao pedido de comissão.
                    var pedido = pedidos.FirstOrDefault(f => f.IdPedido == pedidoComissao.IdPedido);

                    if (pedido == null || pedido.IdPedido == 0)
                    {
                        continue;
                    }

                    if (pedido.ComissaoConfig == null)
                    {
                        pedido.ComissaoConfig = ComissaoConfigDAO.Instance.GetComissaoConfig(sessao, (uint)idFunc);
                    }

                    pedido.ComissaoFuncionario = tipoComissao;

                    if (pedidoComissao.ValorPagar > 0 && pedidoComissao.ValorPagar <= pedidoComissao.ValorPago)
                    {
                        continue;
                    }

                    // Recupera a data da última alteração do pedido.
                    var dataUltimaAlteracaoPedido = PedidoDAO.Instance.ObterDataUltimaAlteracaoPedidoRecebimentoSinalouPagamentoAntecipado(sessao, pedido.IdPedido.ToString());

                    // Caso a data da última alteração do pedido seja menor que a data da última atualização do registro na tabela
                    // pedido_comissao, não atualiza o registro novamente.
                    if (dataUltimaAlteracaoPedido.HasValue && pedidoComissao.DataAlt.HasValue && dataUltimaAlteracaoPedido < pedidoComissao.DataAlt)
                    {
                        /* Chamado 54756. */
                        var houveAlteracaoConfiguracaoComissao = objPersistence.ExecuteSqlQueryCount(sessao, string.Format(@"SELECT COUNT(*) FROM log_alteracao la
	                            INNER JOIN comissao_config cc ON (la.IdRegistroAlt=cc.IdComissaoConfig)
                            WHERE cc.IdFunc={0} AND DataAlt>?dataAlt", idFunc), new GDAParameter("?dataAlt", pedidoComissao.DataAlt)) > 0;

                        if (!houveAlteracaoConfiguracaoComissao)
                        {
                            continue;
                        }
                    }

                    // Atualiza os valores da tabela pedido_comissao.
                    p[0] = Math.Round(pedido.ValorComissaoTotal, 2).ToString().Replace(',', '.');
                    p[1] = pedido.ValorComissaoRecebida.ToString().Replace(',', '.');
                    p[2] = pedidoComissao.IdPedidoComissao.ToString().Replace(',', '.');
                    sql += string.Format(sqlAtualizacao, p);

                    cont++;

                    // Caso tenham 200 SQLs a serem executados, executa-os, caso contrário segue o loop.
                    if (cont % QTD_COMANDOS_SQL_POR_EXECUCAO == 0)
                    {
                        objPersistence.ExecuteCommand(sessao, sql, new GDAParameter("?dataAlt", DateTime.Now));
                        sql = string.Empty;
                    }
                }

                // Executa os SQLs que não foram executados no loop dos pedidos de comissão.
                if (sql.Length > 0)
                {
                    objPersistence.ExecuteCommand(sessao, sql, new GDAParameter("?dataAlt", DateTime.Now));
                }
            }
        }
Beispiel #15
0
        /// <summary>
        /// Cria ou altera as comissões de uma lista de pedidos.
        /// </summary>
        public void Create(GDASession sessao, IEnumerable <Pedido> pedidos, Pedido.TipoComissao tipoComissao, int?idFuncionario)
        {
            string sql       = "";
            string sqlUpdate = "update pedido_comissao set ValorPagar={0}, ValorPago={1} where idPedidoComissao={2}; ";

            string[]  p    = new string[3];
            int       cont = 0;
            const int QTD_COMANDOS_SQL_POR_EXECUCAO = 200;

            PedidoComissao pc;

            var dicFuncPedido = new Dictionary <uint, ComissaoConfig>();

            switch (tipoComissao)
            {
            case Pedido.TipoComissao.Gerente:
                foreach (var ped in pedidos)
                {
                    var comissaoConfigGerente = ComissaoConfigGerenteDAO.Instance.GetByIdFuncIdLoja(sessao, ped.IdLoja, idFuncionario > 0 ? (uint)idFuncionario.Value : 0);

                    if (comissaoConfigGerente == null)
                    {
                        continue;
                    }

                    ped.ComissaoFuncionario = tipoComissao;

                    foreach (var comissao in comissaoConfigGerente)
                    {
                        pc = GetByPedidoFunc(sessao, ped.IdPedido, 3, comissao.IdFuncionario, true);

                        if (pc.ValorPagar > 0 && pc.ValorPagar <= pc.ValorPago)
                        {
                            continue;
                        }

                        var valorComissao = ComissaoConfigGerenteDAO.Instance.GetComissaoGerenteValor(comissao, (uint)ped.TipoPedido, ped.ValorBaseCalcComissao);

                        p[0] = Math.Round(valorComissao, 2).ToString().Replace(',', '.');
                        p[1] = ped.ValorComissaoRecebida.ToString().Replace(',', '.');
                        p[2] = pc.IdPedidoComissao.ToString().Replace(',', '.');
                        sql += string.Format(sqlUpdate, p);

                        cont++;

                        if (cont % QTD_COMANDOS_SQL_POR_EXECUCAO == 0)
                        {
                            objPersistence.ExecuteCommand(sessao, sql);
                            sql = string.Empty;
                        }
                    }
                }
                break;

            case Pedido.TipoComissao.Funcionario:
                foreach (Pedido ped in pedidos)
                {
                    if (ped.ComissaoConfig == null)
                    {
                        if (!dicFuncPedido.ContainsKey(ped.IdFunc))
                        {
                            dicFuncPedido.Add(ped.IdFunc, ComissaoConfigDAO.Instance.GetComissaoConfig(sessao, ped.IdFunc));
                        }

                        ped.ComissaoConfig = dicFuncPedido[ped.IdFunc];
                    }

                    ped.ComissaoFuncionario = tipoComissao;
                    pc = GetByPedidoFunc(sessao, ped.IdPedido, 0, ped.IdFunc, true);

                    if (pc.ValorPagar > 0 && pc.ValorPagar <= pc.ValorPago)
                    {
                        continue;
                    }

                    p[0] = Math.Round(ped.ValorComissaoTotal, 2).ToString().Replace(',', '.');
                    p[1] = ped.ValorComissaoRecebida.ToString().Replace(',', '.');
                    p[2] = pc.IdPedidoComissao.ToString().Replace(',', '.');
                    sql += String.Format(sqlUpdate, p);

                    cont++;

                    if (cont % QTD_COMANDOS_SQL_POR_EXECUCAO == 0)
                    {
                        objPersistence.ExecuteCommand(sessao, sql);
                        sql = String.Empty;
                    }
                }

                break;

            case Pedido.TipoComissao.Comissionado:
                foreach (Pedido ped in pedidos)
                {
                    if (ped.IdComissionado == null)
                    {
                        continue;
                    }

                    ped.ComissaoFuncionario = tipoComissao;
                    pc = GetByPedidoFunc(sessao, ped.IdPedido, 1, ped.IdComissionado.Value, true);

                    p[0] = Math.Round(ped.ValorComissaoTotal, 2).ToString().Replace(',', '.');
                    p[1] = ped.ValorComissaoRecebida.ToString().Replace(',', '.');
                    p[2] = pc.IdPedidoComissao.ToString().Replace(',', '.');
                    sql += String.Format(sqlUpdate, p);

                    cont++;

                    if (cont % QTD_COMANDOS_SQL_POR_EXECUCAO == 0)
                    {
                        objPersistence.ExecuteCommand(sessao, sql);
                        sql = String.Empty;
                    }
                }

                break;

            case Pedido.TipoComissao.Instalador:
                foreach (Pedido ped in pedidos)
                {
                    if (ped.IdInstalador == null)
                    {
                        continue;
                    }

                    ped.ComissaoFuncionario = tipoComissao;
                    pc = GetByPedidoFunc(sessao, ped.IdPedido, 2, ped.IdInstalador.Value, true);

                    p[0] = Math.Round(ped.ValorComissaoTotal, 2).ToString().Replace(',', '.');
                    p[1] = ped.ValorComissaoRecebida.ToString().Replace(',', '.');
                    p[2] = pc.IdPedidoComissao.ToString().Replace(',', '.');
                    sql += string.Format(sqlUpdate, p);

                    cont++;

                    if (cont % QTD_COMANDOS_SQL_POR_EXECUCAO == 0)
                    {
                        objPersistence.ExecuteCommand(sessao, sql);
                        sql = string.Empty;
                    }
                }

                break;

            case Pedido.TipoComissao.Todos:
                Create(sessao, pedidos, Pedido.TipoComissao.Funcionario);
                Create(sessao, pedidos, Pedido.TipoComissao.Comissionado);
                Create(sessao, pedidos, Pedido.TipoComissao.Instalador);
                Create(sessao, pedidos, Pedido.TipoComissao.Gerente);
                break;
            }

            if (sql.Length > 0)
            {
                objPersistence.ExecuteCommand(sessao, sql);
            }
        }
Beispiel #16
0
 /// <summary>
 /// Cria ou altera as comissões de uma lista de pedidos.
 /// </summary>
 public void Create(GDASession sessao, IEnumerable <Pedido> pedidos, Pedido.TipoComissao tipoComissao)
 {
     Create(sessao, pedidos, tipoComissao, null);
 }
Beispiel #17
0
 /// <summary>
 /// Cria ou altera as comissões de uma lista de pedidos.
 /// </summary>
 public void Create(IEnumerable <Pedido> pedidos, Pedido.TipoComissao tipoComissao)
 {
     Create(null, pedidos, tipoComissao);
 }
Beispiel #18
0
        /// <summary>
        /// Retorna o valor da comissão.
        /// </summary>
        /// <param name="valor"></param>
        /// <param name="comissao"></param>
        /// <param name="idPedido"></param>
        /// <returns></returns>
        internal decimal GetValorComissao(decimal valor, Model.ComissaoConfig comissao, uint idPedido, Pedido.TipoComissao tipoComissao)
        {
            decimal valorComissao = 0;

            // Recupera as informações da faixa que o valor se encontra
            string numFaixa    = GetNumeroFaixa(valor, comissao);
            int    numFaixaInt = GetNumeroFaixaInt(valor, comissao);

            // Recupera informações do pedido
            uint  idCli           = Configuracoes.ComissaoConfig.UsarPercComissaoCliente ? PedidoDAO.Instance.ObtemIdCliente(null, idPedido) : 0;
            uint  idFuncPedido    = Configuracoes.ComissaoConfig.UsarPercComissaoCliente ? PedidoDAO.Instance.ObtemIdFunc(null, idPedido) : 0;
            uint? idFuncCli       = Configuracoes.ComissaoConfig.UsarPercComissaoCliente ? ClienteDAO.Instance.ObtemIdFunc(idCli) : null;
            float percComissao    = Configuracoes.ComissaoConfig.UsarPercComissaoCliente ? ClienteDAO.Instance.ObtemPercComissaoFunc(idCli) : 0;
            float percComissaoPed = PedidoDAO.Instance.ObtemPercComissaoAdmin(idPedido);

            if (tipoComissao == Pedido.TipoComissao.Funcionario && PedidoConfig.Comissao.UsarComissaoPorTipoPedido)
            {
                var tipoPedido = PedidoDAO.Instance.ObterTipoPedido(null, idPedido);
                valorComissao = valor * (decimal)(comissao.ObterPercentualPorTipoPedido(tipoPedido) / 100);

                // Se a empresa trabalha com desconto por percentual, calcula o valor da comissão do pedido subtraindo o percentual de desconto.
                if (!Configuracoes.ComissaoConfig.DescontarComissaoPerc)
                {
                    var descontoComissao = valorComissao * ((decimal)DescontoComissaoConfigDAO.Instance.GetDescontoComissaoPerc(comissao.IdFunc, idPedido) / 100);
                    valorComissao -= valorComissao >= descontoComissao ? descontoComissao : 0;
                }
            }
            else if (tipoComissao != Pedido.TipoComissao.Instalador && PedidoConfig.Comissao.PerComissaoPedido && percComissaoPed > 0)
            {
                // Usa o percentual de comissão do pedido
                valorComissao = valor * (decimal)(percComissaoPed / 100);

                // Se a empresa trabalha com desconto por percentual, calcula o valor da comissão do pedido subtraindo o percentual de desconto.
                if (!Configuracoes.ComissaoConfig.DescontarComissaoPerc)
                {
                    var descontoComissao = valorComissao * ((decimal)DescontoComissaoConfigDAO.Instance.GetDescontoComissaoPerc(comissao.IdFunc, idPedido) / 100);
                    valorComissao -= valorComissao >= descontoComissao ? descontoComissao : 0;
                }
            }
            else if (tipoComissao != Pedido.TipoComissao.Instalador && Configuracoes.ComissaoConfig.UsarPercComissaoCliente && percComissao > 0)
            {
                // Usa o percentual de comissão do cliente
                valorComissao = valor * (decimal)(percComissao / 100);
            }
            /* Chamado 41319. */
            //else if (comissao.PercUnico)
            else if (comissao.PercUnico || PedidoConfig.Comissao.PerComissaoPedido)
            {
                // Usa o percentual de comissão da faixa, considerando o percentual de desconto do pedido
                float percFaixa = (float)typeof(Model.ComissaoConfig).GetProperty("PercFaixa" + numFaixa.ToString()).GetValue(comissao, null);
                percFaixa = Configuracoes.ComissaoConfig.DescontarComissaoPerc ? percFaixa - DescontoComissaoConfigDAO.Instance.GetDescontoComissaoPerc(comissao.IdFunc, idPedido) : percFaixa;

                if (percFaixa < 0)
                {
                    percFaixa = 0;
                }

                valorComissao = valor * (decimal)(percFaixa / 100);
            }
            else
            {
                // Calcula o percentual de comissão aplicando cada valor à sua respectiva faixa de comissão
                decimal valorTemp     = valor;
                decimal valorFaixaAnt = 0;

                for (int i = 1; i <= numFaixaInt; i++)
                {
                    string  descrNumFaixa  = i == 1 ? "Um" : i == 2 ? "Dois" : i == 3 ? "Tres" : i == 4 ? "Quatro" : "Cinco";
                    decimal valorFaixa     = (decimal)typeof(Model.ComissaoConfig).GetProperty("Faixa" + descrNumFaixa).GetValue(comissao, null);
                    decimal valorFaixaCalc = valorFaixa - valorFaixaAnt;
                    valorFaixaAnt = valorFaixa;

                    // Usa o percentual de comissão da faixa, considerando o percentual de desconto do pedido
                    float percFaixa = (float)typeof(Model.ComissaoConfig).GetProperty("PercFaixa" + descrNumFaixa).GetValue(comissao, null);
                    percFaixa = Configuracoes.ComissaoConfig.DescontarComissaoPerc && idPedido > 0 ? percFaixa - DescontoComissaoConfigDAO.Instance.GetDescontoComissaoPerc(comissao.IdFunc, idPedido) : percFaixa;

                    if (percFaixa < 0)
                    {
                        percFaixa = 0;
                    }

                    if (i < numFaixaInt)
                    {
                        // Calcula o valor da comissão considerando o valor máximo da faixa, e seu percentual
                        valorComissao += valorFaixaCalc * (decimal)(percFaixa / 100);
                        valorTemp     -= valorFaixaCalc;
                    }
                    else
                    {
                        // Calcula o valor da comissão considerando o valor restante (não calculado ainda)
                        valorComissao += valorTemp * (decimal)(percFaixa / 100);
                    }
                }
            }

            return(valorComissao);
        }
Beispiel #19
0
        //private ComissaoDAO() { }

        #region Busca Padrão

        private string Sql(uint idComissao, string idsComissoes, Pedido.TipoComissao tipoFunc, uint idFuncComissionado,
                           uint idPedido, string dataIni, string dataFim, bool selecionar)
        {
            return(Sql(null, idComissao, idsComissoes, tipoFunc, idFuncComissionado, idPedido, dataIni, dataFim, selecionar));
        }
Beispiel #20
0
        /// <summary>
        /// Gera comissão para o funcionário/comissionado referente aos pedidos passados
        /// </summary>
        /// <param name="tipoComissao">0-Funcionário, 1-Comissionado, 2-Instalador</param>
        /// <param name="idFuncComissionado">idFunc ou idComissionado</param>
        /// <param name="idsPedido"></param>
        /// <param name="dataRefIni"></param>
        /// <param name="dataRefFim"></param>
        /// <param name="valorCalculadoPagina"></param>
        /// <param name="dataContaPagar"></param>
        /// <returns></returns>
        public decimal GerarComissao(GDASession sessao, Pedido.TipoComissao tipoComissao, uint idFuncComissionado, string idsPedido, string dataRefIni, string dataRefFim,
                                     decimal valorCalculadoPagina, string dataContaPagar)
        {
            // Apenas administrador, financeiro geral e financeiro pagto podem gerar comissões
            if (!Config.PossuiPermissao(Config.FuncaoMenuFinanceiroPagto.ControleFinanceiroPagamento))
            {
                throw new Exception("Você não tem permissão para gerar comissões");
            }

            uint    idComissao    = 0;
            decimal valorComissao = 0;
            decimal percAcrescimo = 1;

            // Calcula o valor a pagar de comissão para todos os pedidos selecionados
            Pedido[] pedidos = PedidoDAO.Instance.GetByString(idsPedido, idFuncComissionado, tipoComissao, dataRefIni, dataRefFim);

            if (tipoComissao == Pedido.TipoComissao.Gerente)
            {
                valorComissao = ComissaoConfigGerenteDAO.Instance.GetValorComissaoPedidos(pedidos, idFuncComissionado, dataRefIni, dataRefFim);
            }
            else if (Configuracoes.ComissaoConfig.DescontarComissaoPerc || tipoComissao == Pedido.TipoComissao.Comissionado)
            {
                foreach (Pedido p in pedidos)
                {
                    valorComissao += p.ValorComissaoPagar;
                }
            }
            else
            {
                valorComissao = Math.Round(ComissaoConfigDAO.Instance.GetComissaoValor(tipoComissao, idFuncComissionado,
                                                                                       dataRefIni, dataRefFim, idsPedido), 2);
            }

            // Subtrai os débitos de comissão que o funcionário possa ter
            KeyValuePair <string, decimal> debitos = DebitoComissaoDAO.Instance.GetDebitos(idFuncComissionado, tipoComissao);

            valorComissao -= debitos.Value;

            // Ajusta o valor calculado ao valor exibido na página de comissão, se necessário
            if (valorCalculadoPagina > 0)
            {
                percAcrescimo = Math.Round(Math.Round(valorComissao, 2) / valorCalculadoPagina);
            }

            if (valorComissao <= 0)
            {
                throw new Exception("Comissão para o(os) pedido(os) já foi gerada, ou os pedidos não possuem valores a serem gerados.");
            }

            // Cria uma nova comissao
            Comissao comissao = new Comissao();

            comissao.Total      = valorComissao;
            comissao.DataRefIni = DateTime.Parse(dataRefIni);
            comissao.DataRefFim = DateTime.Parse(dataRefFim);
            comissao.DataCad    = DateTime.Now;

            // Define o tipo de funcionário para a nova comissão
            switch (tipoComissao)
            {
            case Pedido.TipoComissao.Funcionario:
                comissao.IdFunc = idFuncComissionado;
                break;

            case Pedido.TipoComissao.Comissionado:
                comissao.IdComissionado = idFuncComissionado;
                break;

            case Pedido.TipoComissao.Instalador:
                comissao.IdInstalador = idFuncComissionado;
                break;

            case Pedido.TipoComissao.Gerente:
                comissao.IdGerente = idFuncComissionado;
                break;
            }

            try
            {
                idComissao = Insert(sessao, comissao);

                // Associa os pedidos
                string sqlInsert = String.Empty;

                // Salva o valor pago por pedido
                foreach (Pedido p in pedidos)
                {
                    var     valorComissaoPedido = p.ValorComissaoPagar * percAcrescimo;
                    decimal baseCalcRecebido    = Convert.ToDecimal(ComissaoPedidoDAO.Instance.GetTotalBaseCalcComissaoPedido(p.IdPedido, (int)tipoComissao, idFuncComissionado));
                    decimal baseCalcAtual       = p.ValorBaseCalcComissao - (PedidoConfig.LiberarPedido ? 0 : baseCalcRecebido);

                    string baseCalc = baseCalcAtual.ToString().Replace(',', '.');

                    /* Chamado 58585. */
                    if (valorComissaoPedido <= 0)
                    {
                        throw new Exception("Comissão para o(os) pedido(os) já foi gerada, ou os pedidos não possuem valores a serem gerados.");
                    }

                    sqlInsert += "Insert Into comissao_pedido (idPedido, idComissao, valor, basecalccomissao)" +
                                 " values (" + p.IdPedido + ", " + idComissao + ", " + valorComissaoPedido.ToString().Replace(',', '.') + ", " + baseCalc + ");";

                    if (tipoComissao == Pedido.TipoComissao.Gerente)
                    {
                        p.ValorComissaoGerentePago = decimal.Round(valorComissaoPedido, 2);
                    }
                }

                objPersistence.ExecuteCommand(sessao, sqlInsert);

                // Atualiza a tabela de comissão por pedido
                if (tipoComissao != Pedido.TipoComissao.Gerente)
                {
                    pedidos = PedidoDAO.Instance.GetByString(idsPedido, idFuncComissionado, tipoComissao, dataRefIni, dataRefFim);
                }

                if (tipoComissao == Pedido.TipoComissao.Gerente)
                {
                    PedidoComissaoDAO.Instance.Create(sessao, pedidos, tipoComissao, (int?)idFuncComissionado);
                }

                else
                {
                    PedidoComissaoDAO.Instance.Create(sessao, pedidos, tipoComissao);
                }

                // Marca que os débitos foram quitados
                DebitoComissaoDAO.Instance.MarcaComissao(sessao, debitos.Key, idComissao, tipoComissao);

                #region Gera a conta a pagar para a comissão

                DateTime dataPagar;
                if (!DateTime.TryParse(dataContaPagar, out dataPagar))
                {
                    dataPagar = DateTime.Now.AddMonths(1);
                }

                ContasPagar cp = new ContasPagar();
                cp.IdComissao = idComissao;
                cp.IdConta    = FinanceiroConfig.PlanoContaComissao;
                cp.DataVenc   = dataPagar;
                cp.ValorVenc  = valorComissao;
                cp.IdLoja     = UserInfo.GetUserInfo.IdLoja;
                cp.NumParc    = 1;
                cp.NumParcMax = 1;
                cp.Usucad     = UserInfo.GetUserInfo.CodUser;

                ContasPagarDAO.Instance.Insert(sessao, cp);

                #endregion
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return(valorComissao);
        }
Beispiel #21
0
        private string Sql(GDASession session, uint idComissao, string idsComissoes, Pedido.TipoComissao tipoFunc, uint idFuncComissionado,
                           uint idPedido, string dataIni, string dataFim, bool selecionar)
        {
            string campos   = selecionar ? @"c.*, f.Nome as NomeFuncionario, com.Nome as NomeComissionado, i.Nome as NomeInstalador,
                '$$$' as criterio" : "Count(*)";
            string criterio = "";

            string sql = @"
                Select " + campos + @"
                From comissao c
                    Left Join comissionado com On (c.idComissionado=com.idComissionado)
                    Left Join funcionario f On (c.idFunc=f.idFunc)
                    Left Join funcionario i On (c.idInstalador=i.idFunc)
                    LEFT JOIN comissao_contas_receber ccr ON (ccr.IdComissao = c.IdComissao)
                Where ccr.IdComissaoContasReceber IS NULL";

            if (idComissao > 0)
            {
                sql += " And c.idComissao=" + idComissao;
            }
            else if (!String.IsNullOrEmpty(idsComissoes))
            {
                sql += " And c.idComissao in (" + idsComissoes + ")";
            }

            if (tipoFunc == Pedido.TipoComissao.Funcionario)
            {
                sql      += " And c.idFunc is not null";
                criterio += "Funcionários    ";
            }
            else if (tipoFunc == Pedido.TipoComissao.Comissionado)
            {
                sql      += " And c.idComissionado is not null";
                criterio += "Comissionados    ";
            }
            else if (tipoFunc == Pedido.TipoComissao.Instalador)
            {
                sql      += " And c.idInstalador is not null";
                criterio += "Instaladores    ";
            }

            else if (tipoFunc == Pedido.TipoComissao.Gerente)
            {
                sql      += " And c.idGerente is not null";
                criterio += "Gerentes    ";
            }

            if (idPedido > 0)
            {
                sql      += " and c.idComissao in (select idComissao from comissao_pedido where idPedido=" + idPedido + ")";
                criterio += "Pedido: " + idPedido + "    ";
            }
            else
            {
                if (idFuncComissionado > 0)
                {
                    if (tipoFunc == Pedido.TipoComissao.Funcionario)
                    {
                        sql      += " And c.idFunc=" + idFuncComissionado;
                        criterio += "Funcionário: " + FuncionarioDAO.Instance.GetNome(session, idFuncComissionado) + "    ";
                    }
                    else if (tipoFunc == Pedido.TipoComissao.Comissionado)
                    {
                        sql      += " And c.idComissionado=" + idFuncComissionado;
                        criterio += "Comissionado: " + ComissionadoDAO.Instance.GetNome(session, idFuncComissionado) + "    ";
                    }
                    else if (tipoFunc == Pedido.TipoComissao.Instalador)
                    {
                        sql      += " And c.idInstalador=" + idFuncComissionado;
                        criterio += "Instalador: " + FuncionarioDAO.Instance.GetNome(session, idFuncComissionado) + "    ";
                    }
                }

                if (!String.IsNullOrEmpty(dataIni))
                {
                    sql     += " And c.dataCad>=?dataIni";
                    criterio = "Data Início: " + dataIni + "    ";
                }

                if (!String.IsNullOrEmpty(dataFim))
                {
                    sql     += " And c.dataCad<=?dataFim";
                    criterio = "Data Fim: " + dataFim + "    ";
                }
            }

            return(sql.Replace("$$$", criterio));
        }
Beispiel #22
0
 public decimal GetComissaoValor(decimal valor, uint idFunc, uint idPedido, Glass.Data.Model.ComissaoConfig config, Pedido.TipoComissao tipoComissao)
 {
     return(GetValorComissao(valor, config, idPedido, tipoComissao));
 }
Beispiel #23
0
        /// <summary>
        /// Retifica comissão para o funcionário/comissionado referente aos pedidos passados
        /// </summary>
        /// <param name="tipoComissao">0-Funcionário, 1-Comissionado, 2-Instalador</param>
        /// <param name="idFuncComissionado">idFunc ou idComissionado</param>
        /// <param name="idsPedidoRetirar">Os ids dos pedidos que serão retirados da comissão.</param>
        public void RetificarComissao(uint idComissao, Pedido.TipoComissao tipoComissao, uint idFuncComissionado, string idsPedidoRetirar,
                                      decimal valorComissao, string dataContaPagar)
        {
            // Apenas financeiro pagto podem retificar comissões
            if (!Config.PossuiPermissao(Config.FuncaoMenuFinanceiroPagto.ControleFinanceiroPagamento))
            {
                throw new Exception("Você não tem permissão para retificar comissões");
            }

            decimal valorComissaoRetirar = 0;

            // Define os pedidos que serão retirados da comissão
            List <uint> idPedidoRetirar = new List <uint>();

            if (!String.IsNullOrEmpty(idsPedidoRetirar))
            {
                idPedidoRetirar.AddRange(Array.ConvertAll <string, uint>(idsPedidoRetirar.Split(','),
                                                                         new Converter <string, uint>(
                                                                             delegate(string x)
                {
                    return(Glass.Conversoes.StrParaUint(x));
                }
                                                                             )));
            }

            // Busca os pedidos da comissão
            var pedidos = PedidoDAO.Instance.GetPedidosByComissao(idComissao, tipoComissao, idFuncComissionado);

            // Calcula o valor que será removido da comissão
            foreach (Pedido p in pedidos)
            {
                if (idPedidoRetirar.Contains(p.IdPedido))
                {
                    if (!DebitoComissaoDAO.Instance.VerificaCancelarPedido(idComissao, p.IdPedido, tipoComissao))
                    {
                        throw new Exception("O pedido " + p.IdPedido + " já foi cancelado e tem um débito de comissão já quitado.");
                    }

                    valorComissaoRetirar += (decimal)p.ValorPagoComissao;
                }
            }

            // Remove os pedidos da lista de débitos de comissão
            foreach (Pedido p in pedidos)
            {
                if (idPedidoRetirar.Contains(p.IdPedido))
                {
                    DebitoComissaoDAO.Instance.CancelaPedido(p.IdPedido, tipoComissao);
                }
            }

            // Recupera as datas de início e fim da comissão paga
            string dataIni = ObtemValorCampo <string>("dataRefIni", "idComissao=" + idComissao);
            string dataFim = ObtemValorCampo <string>("dataRefFim", "idComissao=" + idComissao);

            if (!String.IsNullOrEmpty(dataIni))
            {
                dataIni = dataIni.Split(' ')[0];
            }

            if (!String.IsNullOrEmpty(dataFim))
            {
                dataFim = dataFim.Split(' ')[0];
            }

            // Altera a comissao
            objPersistence.ExecuteCommand("update comissao set total=total-" + valorComissaoRetirar.ToString().Replace(",", ".") + " where idComissao=" + idComissao);
            if (!String.IsNullOrEmpty(idsPedidoRetirar))
            {
                objPersistence.ExecuteCommand("delete from comissao_pedido where idComissao=" + idComissao + " and idPedido in (" + idsPedidoRetirar + ")");
            }

            if (tipoComissao == Pedido.TipoComissao.Gerente)
            {
                if (!string.IsNullOrEmpty(idsPedidoRetirar))
                {
                    objPersistence.ExecuteCommand("update pedido_comissao set valorpago = 0 where IdGerente = " + idFuncComissionado + " AND IdPedido IN (" + idsPedidoRetirar + ")");
                }
            }
            else
            {
                // Atualiza a tabela de comissão por pedido
                pedidos = PedidoDAO.Instance.GetByString(idsPedidoRetirar, idFuncComissionado, tipoComissao, dataIni, dataFim);
                PedidoComissaoDAO.Instance.Create(pedidos, tipoComissao);
            }

            #region Gera a conta a pagar para a comissão

            ContasPagarDAO.Instance.DeleteByComissao(idComissao, "Retificação");

            DateTime dataPagar;
            if (!DateTime.TryParse(dataContaPagar, out dataPagar))
            {
                dataPagar = DateTime.Now.AddMonths(1);
            }

            ContasPagar cp = new ContasPagar();
            cp.IdComissao = idComissao;
            cp.IdConta    = FinanceiroConfig.PlanoContaComissao;
            cp.DataVenc   = dataPagar;
            cp.ValorVenc  = valorComissao;
            cp.IdLoja     = UserInfo.GetUserInfo.IdLoja;
            cp.NumParc    = 1;
            cp.NumParcMax = 1;

            ContasPagarDAO.Instance.Insert(cp);

            #endregion
        }
Beispiel #24
0
 /// <summary>
 /// Retorna o valor da comissão.
 /// </summary>
 /// <param name="valor"></param>
 /// <param name="tipoFunc"></param>
 /// <param name="idFunc"></param>
 /// <param name="idPedido"></param>
 /// <returns></returns>
 public decimal GetComissaoValor(decimal valor, uint idFunc, uint idPedido, Pedido.TipoComissao tipoComissao)
 {
     Model.ComissaoConfig config = GetComissaoConfig(idFunc);
     return(GetValorComissao(valor, config, idPedido, tipoComissao));
 }