/// <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); }
/// <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); }
/// <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)); }
/// <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); }
/// <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))); }
/// <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); }
/// <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; } } }
/// <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); }
private void GerarDebito(GDASession session, uint idPedido, uint?idFunc, Pedido.TipoComissao tipo, decimal valor) { GerarDebito(session, idPedido, idFunc, tipo, valor, null); }
/// <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); }
/// <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); }
/// <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); }
//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()); }
/// <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)); } } }
/// <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); } }
/// <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); }
/// <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); }
/// <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); }
//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)); }
/// <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); }
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)); }
public decimal GetComissaoValor(decimal valor, uint idFunc, uint idPedido, Glass.Data.Model.ComissaoConfig config, Pedido.TipoComissao tipoComissao) { return(GetValorComissao(valor, config, idPedido, tipoComissao)); }
/// <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 }
/// <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)); }