void salvarGrafoEquipe(SuperiorSubordinado relacao, Object listagemId, PersistenceManager pm) { String cmd = String.Concat("if(NOT EXISTS(SELECT NULL FROM listagem_relacao_grafo WHERE listagemrelacaografo_listagemId=", listagemId, " AND listagemrelacaografo_superiorId=", relacao.SuperiorID, " AND listagemrelacaografo_imediatoId=", relacao.SubordinadoID, " AND listagemrelacaografo_superiorPerfilId=", relacao.SuperiorPerfilID, "AND listagemrelacaografo_imediatoPerfilId=", relacao.SubordinadoPerfilID, ")) ", " BEGIN ", " INSERT INTO listagem_relacao_grafo (listagemrelacaografo_listagemId,listagemrelacaografo_superiorId,listagemrelacaografo_superiorPerfilId,listagemrelacaografo_imediatoId,listagemrelacaografo_imediatoPerfilId) VALUES (", listagemId, ", ", relacao.SuperiorID, ", ", relacao.SuperiorPerfilID, ", ", relacao.SubordinadoID, ", ", relacao.SubordinadoPerfilID, ")", " END "); NonQueryHelper.Instance.ExecuteNonQuery(cmd, pm); }
/// <summary> /// TODO: refatorar para otimizar. /// </summary> public DataTable CarregaRelacaoEmAberto(String nomeListagem, String mensagemListagem, String[] filialIDs, String[] operadoraIDs, String[] perfilIDs, DateTime?dataCorte, Object produtorId) { #region variáveis Object grupoId = null; List <CobrancaCorretorChefiaVO> vos = new List <CobrancaCorretorChefiaVO>(); DataTable dt = null, resultado = new DataTable(); Usuario corretor = null; ComissionamentoUsuario comU = null; DateTime?vigencia = null, admissao = null; IList <ComissionamentoItem> itensComissionamento = null; ComissionamentoVitaliciedade itemVitaliciedade = null; IList <SuperiorSubordinado> superiores = null; System.Globalization.CultureInfo cinfo = new System.Globalization.CultureInfo("pt-Br"); Int32 tipoContrato = -1, parcela = -1; Decimal valorComissao = 0, creditos = 0, percentualComissao = 0, valorPago = 0; List <MovimentacaoContaCorrente> itensCC = null; MovimentacaoContaCorrente itemCC = null; TipoContrato.TipoComissionamentoProdutorOuOperadora tipoComissionamento = TipoContrato.TipoComissionamentoProdutorOuOperadora.Normal; UsuarioFilial usuarioFilial = null; Comissionamento comissionamentoModelo = null; Contrato contrato = null; IList <TabelaValor> tabelasValor = null; Taxa taxa = null; #endregion #region configura DataTable resultado resultado.Columns.Add("CobrancaID"); resultado.Columns.Add("CobrancaVencimento"); resultado.Columns.Add("ContratoNumero"); resultado.Columns.Add("ContratoID"); resultado.Columns.Add("ContratoVigencia"); resultado.Columns.Add("OperadoraID"); resultado.Columns.Add("OperadoraNome"); resultado.Columns.Add("CobrancaValorPago"); resultado.Columns.Add("CobrancaDataPago"); resultado.Columns.Add("CobrancaParcela"); resultado.Columns.Add("ProdutorID"); resultado.Columns.Add("ProdutorNome"); resultado.Columns.Add("ProdutorValor"); resultado.Columns.Add("ProdutorPercentualComissao"); resultado.Columns.Add("ProdutorCredito"); resultado.Columns.Add("ProdutorPerfilID"); resultado.Columns.Add("ProdutorApelido"); resultado.Columns.Add("SuperiorApelido"); resultado.Columns.Add("NomeTitular"); resultado.Columns.Add("ContratoAdmissao"); resultado.Columns.Add("FecharComissao"); resultado.Columns.Add("ProdutorBanco"); resultado.Columns.Add("ProdutorAgencia"); resultado.Columns.Add("ProdutorConta"); #endregion #region configura parâmetros da query String filiaisParam = "", operadorasParam = "", perfisParam = "", dataParam = ""; if (filialIDs != null && filialIDs.Length > 0) { filiaisParam = String.Concat(" AND usuariofilial_filialId IN (", String.Join(",", filialIDs), ") "); //String.Concat(" AND almox_produto_filialId IN (", String.Join(",", filialIDs), ") "); //filiaisParam = String.Concat(" AND usuariofilial_data <= contrato_admissao AND usuario_filialId IN (", String.Join(",", filialIDs), ") "); } if (operadoraIDs != null && operadoraIDs.Length > 0) { operadorasParam = String.Concat(" AND contrato_operadoraId IN (", String.Join(",", operadoraIDs), ") "); } if (perfilIDs != null && perfilIDs.Length > 0) { perfisParam = String.Join(",", perfilIDs); } if (dataCorte != null) { dataParam = String.Concat(" AND cobranca_dataPagto <= '", dataCorte.Value.ToString("yyyy-MM-dd 23:59:59.700"), "' "); } #endregion //faz join com a tabela de usuários para poder usar o filtro por filiais! String qry = String.Concat("cobranca.*, beneficiario_nome, contrato_cobrarTaxaAssociativa, contrato_donoId, contrato_numero, contrato_contratoAdmId, contrato_admissao, contrato_vigencia, contrato_tipoContratoId, operadora_id, operadora_nome ", " FROM cobranca ", " INNER JOIN contrato ON cobranca_propostaId=contrato_id ", //" INNER JOIN almox_contrato_impresso ON almox_contratoimp_id=contrato_numeroId ", //" INNER JOIN almox_produto ON almox_produto_id=almox_contratoimp_produtoId ", " INNER JOIN operadora ON operadora_id=contrato_operadoraId ", " INNER JOIN contrato_beneficiario ON contratobeneficiario_contratoId=contrato_id AND contratobeneficiario_tipo=", Convert.ToInt32(ContratoBeneficiario.TipoRelacao.Titular), " INNER JOIN beneficiario ON beneficiario_id=contratobeneficiario_beneficiarioId AND contratobeneficiario_tipo=", Convert.ToInt32(ContratoBeneficiario.TipoRelacao.Titular), " INNER JOIN usuario ON usuario_id=contrato_donoId ", " INNER JOIN usuario_filial ON usuario_id=usuariofilial_usuarioId ", " WHERE ", " (cobranca_comissaoPaga=0 OR cobranca_comissaoPaga IS NULL) AND cobranca_pago=1 AND cobranca_parcela > 1 ", filiaisParam, operadorasParam, dataParam); PersistenceManager pm = new PersistenceManager(); pm.BeginTransactionContext(); try { dt = LocatorHelper.Instance.ExecuteQuery(qry, "resultset", pm).Tables[0]; if (dt.Rows.Count == 0) { pm.Commit(); dt.Dispose(); return(null); } //ARMAZENA todos os corretores em uma colecao de ids de corretor, sem duplicar. System.Collections.ArrayList array = new System.Collections.ArrayList(); foreach (DataRow row in dt.Rows) { if (!array.Contains(Convert.ToString(row["contrato_donoId"]))) { array.Add(Convert.ToString(row["contrato_donoId"])); } } #region Salva a listagem ------------------------------------------------------------ Listagem listagem = new Listagem(); listagem.Nome = nomeListagem; listagem.Mensagem = mensagemListagem; if (dataCorte != null) { listagem.DataCorte = dataCorte.Value; } pm.Save(listagem); #region filiais if (filialIDs != null && filialIDs.Length > 0) { Listagem.Filial lf; foreach (String filialID in filialIDs) { lf = new Listagem.Filial(); lf.ListagemID = listagem.ID; lf.FilialID = filialID; pm.Save(lf); } } #endregion #region operadoras if (operadoraIDs != null && operadoraIDs.Length > 0) { Listagem.Operadora lo; foreach (String operadoraID in operadoraIDs) { lo = new Listagem.Operadora(); lo.ListagemID = listagem.ID; lo.OperadoraID = operadoraID; pm.Save(lo); } } #endregion #region perfis if (perfilIDs != null && perfilIDs.Length > 0) { Listagem.Perfil lp; foreach (String perfilID in perfilIDs) { lp = new Listagem.Perfil(); lp.ListagemID = listagem.ID; lp.PerfilID = perfilID; pm.Save(lp); } } #endregion #endregion //passeia por todos os corretores DataRow[] rows; DataRow resultadoLinha; foreach (Object corretorId in array) { //percorre os contratos do corretor corrente rows = dt.Select("contrato_donoId=" + corretorId); foreach (DataRow row in rows) { valorComissao = 0; vigencia = Convert.ToDateTime(row["contrato_vigencia"], cinfo); admissao = Convert.ToDateTime(row["contrato_admissao"], cinfo); usuarioFilial = UsuarioFilial.CarregarVigente(row["contrato_donoId"], admissao.Value, pm); if (usuarioFilial == null || !contemValor(filialIDs, usuarioFilial.FilialID)) { continue; } //Corretor corretor = new Usuario(row["contrato_donoId"]); pm.Load(corretor); //comissao do corretor - leva em consideracao a data de admissao do contrato comU = ComissionamentoUsuario.CarregarVigente(corretor.ID, vigencia, pm); if (comU != null) { resultadoLinha = resultado.NewRow(); #region preenche a linha resultadoLinha["CobrancaID"] = row["cobranca_id"]; resultadoLinha["CobrancaVencimento"] = Convert.ToDateTime(row["cobranca_dataVencimento"], cinfo).ToString("dd/MM/yyyy"); valorPago = Convert.ToDecimal(row["cobranca_valor"], cinfo); //if (cToString(row["contrato_cobrarTaxaAssociativa"]) == "1") //{ // contrato = Contrato.CarregarParcial(row["cobranca_propostaId"], pm); // valorPago -= Contrato.CalculaValorDaTaxaAssociativa(contrato, -1, pm); //} //tabelasValor = TabelaValor.CarregarPorContratoID_Parcial(row["contrato_contratoAdmId"], pm); //if (tabelasValor != null) //{ // if (tabelasValor.Count == 1) // { // taxa = Taxa.CarregarPorTabela(tabelasValor[0].ID, pm); // if (taxa != null && !taxa.Embutido && taxa.ValorEmbutido > 0) // { // valorPago -= taxa.ValorEmbutido; // } // } // else // { // //o que fazer... // } //} resultadoLinha["CobrancaValorPago"] = valorPago.ToString("N2"); resultadoLinha["CobrancaDataPago"] = Convert.ToDateTime(row["cobranca_dataPagto"], cinfo).ToString("dd/MM/yyyy"); resultadoLinha["ContratoNumero"] = row["contrato_numero"]; resultadoLinha["ContratoID"] = row["cobranca_propostaId"]; resultadoLinha["ContratoVigencia"] = Convert.ToDateTime(row["contrato_vigencia"], cinfo).ToString("dd/MM/yyyy"); resultadoLinha["CobrancaParcela"] = row["cobranca_parcela"]; resultadoLinha["OperadoraID"] = row["operadora_id"]; resultadoLinha["OperadoraNome"] = row["operadora_nome"]; resultadoLinha["ProdutorID"] = row["contrato_donoId"]; resultadoLinha["ProdutorPerfilID"] = corretor.PerfilID; resultadoLinha["ProdutorApelido"] = corretor.Apelido; resultadoLinha["NomeTitular"] = row["beneficiario_nome"]; resultadoLinha["ContratoAdmissao"] = Convert.ToDateTime(row["contrato_admissao"], cinfo).ToString("dd/MM/yyyy"); resultadoLinha["ProdutorBanco"] = corretor.Banco; resultadoLinha["ProdutorAgencia"] = corretor.Agencia; resultadoLinha["ProdutorConta"] = corretor.Conta; resultadoLinha["FecharComissao"] = "0"; #endregion #region Comissionamento percentualComissao = 0; comissionamentoModelo = new Comissionamento(comU.TabelaComissionamentoID); pm.Load(comissionamentoModelo); grupoId = ComissionamentoGrupo.ObterID(comissionamentoModelo.ID, row["contrato_contratoAdmId"], pm); if (grupoId != null) { itensComissionamento = ComissionamentoItem.Carregar(grupoId, pm); } else { continue; } if (itensComissionamento != null) { parcela = Convert.ToInt32(row["cobranca_parcela"]); tipoContrato = Convert.ToInt32(row["contrato_tipoContratoId"]); foreach (ComissionamentoItem item in itensComissionamento) { if (parcela == item.Parcela) { if (tipoContrato == 1) //normal { tipoComissionamento = TipoContrato.TipoComissionamentoProdutorOuOperadora.Normal; valorComissao = valorPago * (item.Percentual / 100); percentualComissao = item.Percentual; break; } else if (tipoContrato == 4) //carencia { tipoComissionamento = TipoContrato.TipoComissionamentoProdutorOuOperadora.Carencia; valorComissao = valorPago * (item.PercentualCompraCarencia / 100); percentualComissao = item.PercentualCompraCarencia; break; } else if (tipoContrato == 3) //migracao { tipoComissionamento = TipoContrato.TipoComissionamentoProdutorOuOperadora.Migracao; valorComissao = valorPago * (item.PercentualMigracao / 100); percentualComissao = item.PercentualMigracao; break; } else if (tipoContrato == 2) //adm { tipoComissionamento = TipoContrato.TipoComissionamentoProdutorOuOperadora.Administrativa; valorComissao = valorPago * (item.PercentualADM / 100); percentualComissao = item.PercentualADM; break; } else if (tipoContrato == 5) //especial { tipoComissionamento = TipoContrato.TipoComissionamentoProdutorOuOperadora.Especial; valorComissao = valorPago * (item.PercentualEspecial / 100); percentualComissao = item.PercentualEspecial; break; } else if (tipoContrato == 6) //idade { tipoComissionamento = TipoContrato.TipoComissionamentoProdutorOuOperadora.Idade; valorComissao = valorPago * (item.Idade / 100); percentualComissao = item.Idade; break; } } } } #endregion #region Vitaliciedade - COMO EXIBIR NO RELATORIO ESTE PERCENTUAL DE COMISSAO ??? //itemVitaliciedade = ComissionamentoVitaliciedade.Carregar(comU.TabelaComissionamentoID, row["contrato_contratoAdmId"], tipoComissionamento, pm); itemVitaliciedade = ComissionamentoVitaliciedade.Carregar(grupoId, tipoComissionamento, pm); if (itemVitaliciedade != null && itemVitaliciedade.ParcelaInicio >= parcela) { valorComissao += (valorPago * (itemVitaliciedade.Percentual / 100)); } #endregion resultadoLinha["ProdutorNome"] = corretor.Nome; resultadoLinha["ProdutorValor"] = valorComissao.ToString("N2"); resultadoLinha["ProdutorPercentualComissao"] = percentualComissao.ToString("N2"); //se nao foi informado um produtor especifico ou //foi informado e é o mesmo que o dono do contrato (corretor que vendeu) if (produtorId == null || Convert.ToString(produtorId) == Convert.ToString(corretor.ID)) { //checa também se o perfil está incluso na relacao de perfis enviada por parametro if (perfilIDs == null || contemValor(perfilIDs, corretor.PerfilID)) { resultadoLinha["FecharComissao"] = "1"; #region itens abertos na conta corrente creditos = 0; itensCC = (List <MovimentacaoContaCorrente>)MovimentacaoContaCorrente.CarregarEmAberto(corretor.ID, dataCorte.Value, pm); if (itensCC == null) { itensCC = new List <MovimentacaoContaCorrente>(); } //só salva o credito se ele ainda nao foi feito. if (valorComissao > 0 && !MovimentacaoContaCorrente.CreditoJaFeitoPara(corretor.ID, row["cobranca_id"], pm)) //itemCC != null && itemCC.Valor > 0) { itemCC = new MovimentacaoContaCorrente(); itemCC.CategoriaID = CategoriaContaCorrente.SysPremiacaoCategoriaID; itemCC.CobrancaID = row["cobranca_id"]; itemCC.Data = DateTime.Now; itemCC.LisagemFechamentoID = listagem.ID; itemCC.ProdutorID = corretor.ID; itemCC.Valor = valorComissao; pm.Save(itemCC); } foreach (MovimentacaoContaCorrente _item in itensCC) { if (CategoriaContaCorrente.eTipo.Credito == (CategoriaContaCorrente.eTipo)_item.CategoriaTipo) { creditos += _item.Valor; } else { creditos -= _item.Valor; } _item.LisagemFechamentoID = listagem.ID; pm.Save(_item); } #endregion } } resultadoLinha["ProdutorCredito"] = creditos.ToString("N2"); resultado.Rows.Add(resultadoLinha); adicionaGrafoDeProdutoresParaCobranca(ref vos, row["cobranca_id"], corretor.ID, false); //salvarGrafoEquipe(corretor.ID, corretor.PerfilID, listagem.ID, pm); } //Superiores superiores = SuperiorSubordinado.CarregarSuperiores(corretor.ID, admissao, pm); while (superiores != null && superiores.Count > 0) { valorComissao = 0; comU = ComissionamentoUsuario.CarregarVigente(superiores[0].SuperiorID, vigencia, pm); if (superiores[0].SubordinadoID.ToString() == corretor.ID.ToString()) { salvarGrafoEquipeCorretor(corretor.ID, corretor.PerfilID, listagem.ID, pm); } //salvarGrafoEquipe(superiores[0], listagem.ID, pm); if (comU == null) { superiores = SuperiorSubordinado.CarregarSuperiores(superiores[0].SuperiorID, admissao, pm); continue; } comissionamentoModelo = new Comissionamento(comU.TabelaComissionamentoID); pm.Load(comissionamentoModelo); salvarGrafoEquipe(superiores[0], listagem.ID, pm); if (comU != null) { resultadoLinha = resultado.NewRow(); #region preenche a linha resultadoLinha["CobrancaID"] = row["cobranca_id"]; resultadoLinha["CobrancaVencimento"] = Convert.ToDateTime(row["cobranca_dataVencimento"], cinfo).ToString("dd/MM/yyyy"); resultadoLinha["CobrancaValorPago"] = valorPago; //Convert.ToDecimal(row["cobranca_valorPagto"], cinfo).ToString("N2"); resultadoLinha["CobrancaDataPago"] = Convert.ToDateTime(row["cobranca_dataPagto"], cinfo).ToString("dd/MM/yyyy"); resultadoLinha["CobrancaParcela"] = row["cobranca_parcela"]; resultadoLinha["ContratoNumero"] = row["contrato_numero"]; resultadoLinha["ContratoID"] = row["cobranca_propostaId"]; resultadoLinha["ContratoVigencia"] = Convert.ToDateTime(row["contrato_vigencia"], cinfo).ToString("dd/MM/yyyy"); resultadoLinha["OperadoraID"] = row["operadora_id"]; resultadoLinha["OperadoraNome"] = row["operadora_nome"]; resultadoLinha["ProdutorID"] = superiores[0].SuperiorID; resultadoLinha["ProdutorPerfilID"] = superiores[0].SuperiorPerfilID; resultadoLinha["ProdutorApelido"] = superiores[0].SuperiorApelido; resultadoLinha["NomeTitular"] = row["beneficiario_nome"]; resultadoLinha["ContratoAdmissao"] = Convert.ToDateTime(row["contrato_admissao"], cinfo).ToString("dd/MM/yyyy"); resultadoLinha["FecharComissao"] = "0"; resultadoLinha["ProdutorBanco"] = superiores[0].SuperiorBanco; resultadoLinha["ProdutorAgencia"] = superiores[0].SuperiorAgencia; resultadoLinha["ProdutorConta"] = superiores[0].SuperiorConta; #endregion #region Comissionamento comissionamentoModelo = new Comissionamento(comU.TabelaComissionamentoID); pm.Load(comissionamentoModelo); itensComissionamento = ComissionamentoItem.Carregar(comissionamentoModelo.GrupoID, pm); valorComissao = 0; percentualComissao = 0; if (itensComissionamento != null) { parcela = Convert.ToInt32(row["cobranca_parcela"]); tipoContrato = Convert.ToInt32(row["contrato_tipoContratoId"]); foreach (ComissionamentoItem item in itensComissionamento) { if (parcela == item.Parcela) { if (tipoContrato == 1) //normal { tipoComissionamento = TipoContrato.TipoComissionamentoProdutorOuOperadora.Normal; valorComissao = valorPago * (item.Percentual / 100); percentualComissao = item.Percentual; break; } else if (tipoContrato == 4) //carencia { tipoComissionamento = TipoContrato.TipoComissionamentoProdutorOuOperadora.Carencia; valorComissao = valorPago * (item.PercentualCompraCarencia / 100); percentualComissao = item.PercentualCompraCarencia; break; } else if (tipoContrato == 3) //migracao { tipoComissionamento = TipoContrato.TipoComissionamentoProdutorOuOperadora.Migracao; valorComissao = valorPago * (item.PercentualMigracao / 100); percentualComissao = item.PercentualMigracao; break; } else if (tipoContrato == 2) //adm { tipoComissionamento = TipoContrato.TipoComissionamentoProdutorOuOperadora.Administrativa; valorComissao = valorPago * (item.PercentualADM / 100); percentualComissao = item.PercentualADM; break; } else if (tipoContrato == 5) //especial { tipoComissionamento = TipoContrato.TipoComissionamentoProdutorOuOperadora.Especial; valorComissao = valorPago * (item.PercentualEspecial / 100); percentualComissao = item.PercentualEspecial; break; } else if (tipoContrato == 6) //idade { tipoComissionamento = TipoContrato.TipoComissionamentoProdutorOuOperadora.Idade; valorComissao = valorPago * (item.Idade / 100); percentualComissao = item.Idade; break; } } } } #endregion #region Vitaliciedade COMO EXIBIR NO RELATORIO ESTE PERCENTUAL DE COMISSAO ??? itemVitaliciedade = ComissionamentoVitaliciedade.Carregar(grupoId, tipoComissionamento, pm); //ComissionamentoVitaliciedade.Carregar(comissionamentoModelo.GrupoID, tipoComissionamento, pm); if (itemVitaliciedade != null && itemVitaliciedade.ParcelaInicio >= parcela) { valorComissao += (valorPago * (itemVitaliciedade.Percentual / 100)); } #endregion atualizaApelidoSuperior(ref resultado, superiores[0].SubordinadoID, superiores[0].SuperiorApelido); resultadoLinha["ProdutorNome"] = superiores[0].SuperiorNome; resultadoLinha["ProdutorValor"] = valorComissao.ToString("N2"); resultadoLinha["ProdutorPercentualComissao"] = percentualComissao.ToString("N2"); //se nao foi informado um produtor especifico ou //foi informado e é o mesmo que o produtor corrente if (produtorId == null || Convert.ToString(produtorId) == Convert.ToString(superiores[0].SuperiorID)) { //checa também se o perfil está incluso na relacao de perfis enviada por parametro if (perfilIDs == null || contemValor(perfilIDs, superiores[0].SuperiorPerfilID)) { resultadoLinha["FecharComissao"] = "1"; #region itens abertos na conta corrente creditos = 0; itensCC = (List <MovimentacaoContaCorrente>)MovimentacaoContaCorrente.CarregarEmAberto(superiores[0].SuperiorID, dataCorte.Value, pm); if (itensCC == null) { itensCC = new List <MovimentacaoContaCorrente>(); } //só salva o credito se ele ainda nao foi feito. if (valorComissao > 0 && !MovimentacaoContaCorrente.CreditoJaFeitoPara(superiores[0].SuperiorID, row["cobranca_id"], pm)) { itemCC = new MovimentacaoContaCorrente(); itemCC.CategoriaID = CategoriaContaCorrente.SysPremiacaoCategoriaID; itemCC.CobrancaID = row["cobranca_id"]; itemCC.Data = DateTime.Now; itemCC.LisagemFechamentoID = listagem.ID; itemCC.ProdutorID = superiores[0].SuperiorID; itemCC.Valor = valorComissao; pm.Save(itemCC); } foreach (MovimentacaoContaCorrente _item in itensCC) { if (CategoriaContaCorrente.eTipo.Credito == (CategoriaContaCorrente.eTipo)_item.CategoriaTipo) { creditos += _item.Valor; } else { creditos -= _item.Valor; } _item.LisagemFechamentoID = listagem.ID; pm.Save(_item); } #endregion } } resultadoLinha["ProdutorCredito"] = creditos.ToString("N2"); resultado.Rows.Add(resultadoLinha); adicionaGrafoDeProdutoresParaCobranca(ref vos, row["cobranca_id"], superiores[0].SuperiorID, true); } superiores = SuperiorSubordinado.CarregarSuperiores(superiores[0].SuperiorID, admissao, pm); } } } //salva a relacao de pagamento de comissao salvarRelacao(resultado, listagem.ID, pm); //baixa as cobrancas que devem ser baixadas //baixarCobrancas(vos, pm); pm.Commit(); } catch (Exception ex) { pm.Rollback(); throw ex; } finally { dt.Dispose(); pm = null; } return(resultado); }