示例#1
0
        public List <string> ListarAtividadesCheckup(Guid compromissoId)
        {
            List <string> lstTarefas = new List <string>();

            ParametroGlobal parametroGlobal = new ParametroGlobalService(RepositoryService.NomeDaOrganizacao, RepositoryService.IsOffline, RepositoryService.Provider)
                                              .ObterPor((int)Enum.TipoParametroGlobal.AtividadesChecklist, null, null, null, null, compromissoId, null, null);

            if (parametroGlobal != null && !string.IsNullOrEmpty(parametroGlobal.Valor))
            {
                return(ConverterParametroParaLista(parametroGlobal.Valor));
            }
            else
            {
                return(new List <string>());
            }
        }
示例#2
0
        public void TestarTarefaVisitaComercial()
        {
            string organizationName = ConfigurationManager.GetSettingValue("OrganizacaoIntelbras");

            Domain.Servicos.TarefaService ServiceTarefas = new Domain.Servicos.TarefaService(organizationName, false);
            Domain.Model.Tarefa           Tarefa         = ServiceTarefas.BuscaTarefa(new Guid("BEC979ED-A74F-E411-93F5-00155D013E70"));

            if (Tarefa.ReferenteA.Type.Equals("account"))
            {
                Domain.Model.Conta canal = new Intelbras.CRM2013.Domain.Servicos.ContaService(organizationName, false).BuscaConta(Tarefa.ReferenteA.Id);
                if (canal == null || canal.Classificacao == null)
                {
                    throw new ArgumentException("Conta cadastrada no campo 'Referente a' não encontrada!");
                }

                Domain.Model.ParametroGlobal paramGlobal = new Intelbras.CRM2013.Domain.Servicos.ParametroGlobalService(organizationName, false).ObterPor((int)Domain.Enum.TipoParametroGlobal.FrequenciaChecklist, null, canal.Classificacao.Id, null, null, null, null, (int)Domain.Enum.ParametroGlobal.Parametrizar.VisitaComercial);
                Domain.Model.ParametroGlobal paramGlobalListaAtividades = new Intelbras.CRM2013.Domain.Servicos.ParametroGlobalService(organizationName, false).ObterPor((int)Domain.Enum.TipoParametroGlobal.AtividadesChecklist, null, canal.Classificacao.Id, null, null, null, null, (int)Domain.Enum.ParametroGlobal.Parametrizar.VisitaComercial);

                List <String> lstAtividades = new Intelbras.CRM2013.Domain.Servicos.TarefaService(organizationName, false).ConverterParametroParaLista(paramGlobalListaAtividades.Valor);

                if (lstAtividades.Count > 0)
                {
                    string atividade = ServiceTarefas.ObterProximaAtividadeCheckup(lstAtividades, Tarefa.Assunto);

                    if (!string.IsNullOrEmpty(atividade))
                    {
                        Domain.Model.Tarefa novaTarefa = new Domain.Model.Tarefa(organizationName, false);

                        novaTarefa.Assunto = atividade;

                        Domain.Model.TipoDeAtividade tipoAtividade = new Domain.Servicos.TarefaService(organizationName, false).BuscarTipoTarefa("Checklist");
                        if (tipoAtividade != null)
                        {
                            novaTarefa.TipoDeAtividade = new SDKore.DomainModel.Lookup(tipoAtividade.ID.Value, tipoAtividade.Nome, "");
                        }
                        novaTarefa.Conclusao = DateTime.Now.AddDays(Convert.ToInt16(paramGlobal.Valor));

                        novaTarefa.ReferenteA = new SDKore.DomainModel.Lookup(canal.ID.Value, "account");

                        novaTarefa.ID = new Domain.Servicos.TarefaService(organizationName, false).Persistir(novaTarefa);
                    }
                }
            }
        }
        public DateTime?ObterValidade(CompromissosDoCanal CompromissoTarget)
        {
            if (CompromissoTarget.StatusCompromisso.Name == Enum.CompromissoCanal.StatusCompromisso.Cumprido)
            {
                if (CompromissoTarget.Compromisso != null && CompromissoTarget.Compromisso.Id != Guid.Empty)
                {
                    ParametroGlobal paramGlobal = new ParametroGlobalService(RepositoryService.NomeDaOrganizacao, RepositoryService.IsOffline, RepositoryService.Provider)
                                                  .ObterFrequenciaAtividadeChecklist(CompromissoTarget.Compromisso.Id);

                    if (paramGlobal == null)
                    {
                        throw new ApplicationException("”(CRM)Não foi possível alterar o status do compromisso devido a falta do parâmetro global "
                                                       + (int)Enum.TipoParametroGlobal.FrequenciaChecklist + ". Entrar em contato com o suporte");
                    }
                    else
                    {
                        return(DateTime.Today.AddDays(paramGlobal.GetValue <int>()));
                    }
                }
            }

            return(null);
        }
示例#4
0
        static int Main(string[] args)
        {
            try
            {
                var f = CriaArquivoStatus();

                if (f == null)
                {
                    Console.WriteLine("Já existe um processo em andamento.");
                    return(0);
                }

                string organizationName = SDKore.Configuration.ConfigurationManager.GetSettingValue("OrganizacaoIntelbras");

                if (args != null && args.Length > 0)
                {
                    organizationName = args[0].ToString();
                }

                var logger = new SDKore.Helper.Logger("PCI-Log de Revalidação da Adesão", false);
                logger.Log("Inicio do processo.", true, true);

                var parametroGlobalService = new Intelbras.CRM2013.Domain.Servicos.ParametroGlobalService(organizationName, false);

                var parametroGLobal = parametroGlobalService.ObterEmailContatosAdministrativos();
                if (parametroGLobal == null ||
                    !parametroGLobal.ID.HasValue ||
                    parametroGLobal.ID.Value == Guid.Empty ||
                    string.IsNullOrEmpty(parametroGLobal.Valor))
                {
                    logger.Log("Erro: (CRM) Parametro Global Contatos Administrativos não configurado.", true, true);
                    logger.Log("Fim do processo.", true, true);
                    File.Delete(statusFileName);
                    return(6666);
                }

                logger.Log("Obtendo contas participantes do programa de benefícios.", true, true);

                var beneficioDoCanalService = new Intelbras.CRM2013.Domain.Servicos.BeneficioDoCanalService(organizationName, false);

                var lstMatrizParticipante = beneficioDoCanalService.ListarContasParticipantes();

                logger.Log(lstMatrizParticipante.Count.ToString() + " contas participantes do programa de benefícios.", true, true);

                int count = 0;
                foreach (var matriz in lstMatrizParticipante)
                {
                    count++;

                    logger.Log(string.Format("{0} - {1} - {2}", count, matriz.RazaoSocial, matriz.CpfCnpj), true, true);

                    try
                    {
                        AtualizaStatus(f, dataInicio, count, lstMatrizParticipante.Count);

                        beneficioDoCanalService.AdesaoAoPrograma(matriz);
                    }
                    catch (Exception ex)
                    {
                        logger.Log(string.Format("\nErro: {0}\n Stack: {1}\n", ex.Message, ex.StackTrace), true, true);
                    }
                }

                f.Flush();

                f.Close();

                File.Delete(statusFileName);
                logger.Log("Fim do processo.", true, true);

                EnviaEmail(organizationName, parametroGLobal.Valor, logger.FileName);
                return(0);
            }
            catch (Exception ex)
            {
                string mensagem = SDKore.Helper.Error.Handler(ex);
                Console.WriteLine(mensagem);
                return(ex.GetHashCode());
            }
        }
示例#5
0
        public void Execute(IServiceProvider serviceProvider)
        {
            lock (thisLock)
            {
                var                         context        = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
                ITracingService             trace          = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
                IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
                IOrganizationService        service        = serviceFactory.CreateOrganizationService(null);

                TarefaService ServiceTarefas = new TarefaService(context.OrganizationName, context.IsExecutingOffline, service);
                CompromissosDoCanalService ServiceCompromissosDoCanal = new CompromissosDoCanalService(context.OrganizationName, context.IsExecutingOffline, service);

                try
                {
                    trace.Trace(context.MessageName);

                    Intelbras.CRM2013.Domain.Model.Tarefa mTarefa = null;
                    switch (Util.Utilitario.ConverterEnum <Domain.Enum.Plugin.MessageName>(context.MessageName))
                    {
                    case Domain.Enum.Plugin.MessageName.Create:
                        var entidade = (Entity)context.InputParameters["Target"];
                        mTarefa = ServiceTarefas.BuscaTarefa(entidade.Id);


                        new Intelbras.CRM2013.Domain.Servicos.TarefaService(context.OrganizationName, context.IsExecutingOffline, service).CriarParecerParaSolicitacao(mTarefa);
                        Guid tipoAtividadeExecucao;

                        if (!Guid.TryParse(SDKore.Configuration.ConfigurationManager.GetSettingValue("TipoAtividadeExecucao"), out tipoAtividadeExecucao))
                        {
                            throw new ArgumentException("(CRM) Faltando parâmetro TipoAtividadeExecucao no SDKore");
                        }

                        trace.Trace("Parâmetro do Config: TipoAtividadeExecucao '{0}'", tipoAtividadeExecucao);

                        if (mTarefa.ReferenteA != null && mTarefa.TipoDeAtividade != null && mTarefa.TipoDeAtividade.Id == tipoAtividadeExecucao)
                        {
                            trace.Trace("Tarefa do tipo Execução.");

                            SolicitacaoBeneficio solBenef = new Intelbras.CRM2013.Domain.Servicos.SolicitacaoBeneficioService(context.OrganizationName, context.IsExecutingOffline, service).ObterPor(mTarefa.ReferenteA.Id);

                            if (solBenef == null)
                            {
                                throw new ArgumentException("(CRM) Solicitação não encontrada.");
                            }

                            if (solBenef.TipoSolicitacao != null && solBenef.AjusteSaldo.Value)
                            {
                                trace.Trace("Solicitação do tipo Ajuste.");

                                Tarefa _mTarefa = new Intelbras.CRM2013.Domain.Model.Tarefa(context.OrganizationName, context.IsExecutingOffline, service);
                                _mTarefa.ID        = context.PrimaryEntityId;
                                _mTarefa.Resultado = (int)Domain.Enum.Tarefa.Resultado.PagamentoEfetuadoPedidoGerado;
                                _mTarefa.State     = 1;
                                string retorno;

                                TarefaService tarefaService = new Intelbras.CRM2013.Domain.Servicos.TarefaService(context.OrganizationName, context.IsExecutingOffline, service);
                                tarefaService.Persistir(_mTarefa, out retorno);

                                trace.Trace(tarefaService.Trace.StringTrace.ToString());
                                tarefaService.Trace.Save();
                            }
                        }

                        mTarefa.TempoAtuacao = 0;
                        break;

                    case Domain.Enum.Plugin.MessageName.SetStateDynamicEntity:

                        if (context.PostEntityImages.Contains("imagem") && context.PostEntityImages["imagem"] is Entity)
                        {
                            Tarefa Tarefa = context.PostEntityImages["imagem"].Parse <Tarefa>(context.OrganizationName, context.IsExecutingOffline, service);

                            if (Tarefa.ReferenteA == null || Tarefa.State.Value != (int)Domain.Enum.Tarefa.StateCode.Fechada)
                            {
                                break;
                            }

                            if (Tarefa.ReferenteA.Type.ToLower() == SDKore.Crm.Util.Utility.GetEntityName <SolicitacaoBeneficio>().ToLower())
                            {
                                new ProcessoDeSolicitacoesService(context.OrganizationName, context.IsExecutingOffline, service)
                                .ConcluirTarefaSolicitacaoBeneficio(Tarefa, context.UserId);
                            }
                            else if (Tarefa.ReferenteA.Type.ToLower() == SDKore.Crm.Util.Utility.GetEntityName <SolicitacaoCadastro>().ToLower())
                            {
                                new ProcessoDeSolicitacoesService(context.OrganizationName, context.IsExecutingOffline, service)
                                .ConcluirTarefaSolicitacaoDeCadastro(Tarefa, context.UserId);
                            }
                            else if (Tarefa.ReferenteA.Type.ToLower() == SDKore.Crm.Util.Utility.GetEntityName <CompromissosDoCanal>().ToLower())
                            {
                                new ProcessoDeSolicitacoesService(context.OrganizationName, context.IsExecutingOffline, service)
                                .ConcluirTarefaCompromissoCanal(Tarefa);
                            }
                            else if (Tarefa.ReferenteA.Type.ToLower() == SDKore.Crm.Util.Utility.GetEntityName <Conta>().ToLower())
                            {
                                if (Tarefa.TipoDeAtividade.Name.Contains("Checklist"))
                                {
                                    #region Pendencia Key-Account comentada

                                    Conta canal = new Intelbras.CRM2013.Domain.Servicos.ContaService(context.OrganizationName, context.IsExecutingOffline, service).BuscaConta(Tarefa.ReferenteA.Id);
                                    if (canal == null || canal.Classificacao == null)
                                    {
                                        throw new ArgumentException("(CRM) Conta cadastrada no campo 'Referente a' não encontrada!");
                                    }

                                    ParametroGlobal paramGlobal = new Intelbras.CRM2013.Domain.Servicos.ParametroGlobalService(context.OrganizationName, context.IsExecutingOffline, service).ObterPor((int)Domain.Enum.TipoParametroGlobal.FrequenciaChecklist, null, canal.Classificacao.Id, null, null, null, null, (int)Domain.Enum.ParametroGlobal.Parametrizar.VisitaComercial);
                                    ParametroGlobal paramGlobalListaAtividades = new Intelbras.CRM2013.Domain.Servicos.ParametroGlobalService(context.OrganizationName, context.IsExecutingOffline, service).ObterPor((int)Domain.Enum.TipoParametroGlobal.AtividadesChecklist, null, canal.Classificacao.Id, null, null, null, null, (int)Domain.Enum.ParametroGlobal.Parametrizar.VisitaComercial);

                                    List <String> lstAtividades = new Intelbras.CRM2013.Domain.Servicos.TarefaService(context.OrganizationName, context.IsExecutingOffline, service).ConverterParametroParaLista(paramGlobalListaAtividades.Valor);

                                    if (lstAtividades.Count > 0)
                                    {
                                        string atividade = ServiceTarefas.ObterProximaAtividadeCheckup(lstAtividades, Tarefa.Assunto);

                                        if (!string.IsNullOrEmpty(atividade))
                                        {
                                            Domain.Model.Tarefa novaTarefa = new Domain.Model.Tarefa(context.OrganizationName, context.IsExecutingOffline, service);

                                            Domain.Model.TipoDeAtividade tipoAtividade = new Domain.Servicos.TarefaService(context.OrganizationName, context.IsExecutingOffline, service).BuscarTipoTarefa("Checklist");
                                            if (tipoAtividade != null)
                                            {
                                                novaTarefa.TipoDeAtividade = new SDKore.DomainModel.Lookup(tipoAtividade.ID.Value, tipoAtividade.Nome, "");
                                            }

                                            novaTarefa.Assunto    = atividade;
                                            novaTarefa.Conclusao  = DateTime.Now.AddDays(Convert.ToInt16(paramGlobal.Valor));
                                            novaTarefa.ReferenteA = new SDKore.DomainModel.Lookup(canal.ID.Value, "account");

                                            novaTarefa.ID = new Domain.Servicos.TarefaService(context.OrganizationName, context.IsExecutingOffline, service).Persistir(novaTarefa);
                                            if (novaTarefa.ID.HasValue)
                                            {
                                                Usuario proprietario = new Domain.Servicos.UsuarioService(context.OrganizationName, context.IsExecutingOffline, service).BuscarProprietario("task", "activityid", Tarefa.Id);
                                                if (proprietario != null)
                                                {
                                                    new Domain.Servicos.UtilService(context.OrganizationName, context.IsExecutingOffline, service).MudarProprietarioRegistro("systemuser", proprietario.ID.Value, "task", novaTarefa.ID.Value);
                                                }
                                            }
                                        }
                                    }
                                    else
                                    {
                                        Domain.Model.CompromissosDoCanal CompromissoCanal = ServiceCompromissosDoCanal.BuscarPorGuid(Tarefa.ReferenteA.Id);

                                        if (CompromissoCanal != null && CompromissoCanal.Compromisso != null)
                                        {
                                            List <string> listaAtividadesCheckup2 = ServiceTarefas.ListarAtividadesCheckup(CompromissoCanal.Compromisso.Id);

                                            if (listaAtividadesCheckup2.Count > 0)
                                            {
                                                string atividade = ServiceTarefas.ObterProximaAtividadeCheckup(listaAtividadesCheckup2, Tarefa.Assunto);

                                                if (!string.IsNullOrEmpty(atividade))
                                                {
                                                    Domain.Model.Usuario proprietario = new Domain.Servicos.UsuarioService(context.OrganizationName, context.IsExecutingOffline, service).BuscarProprietario("itbc_compdocanal", "itbc_compdocanalid", CompromissoCanal.Id);
                                                    if (proprietario != null)
                                                    {
                                                        new Intelbras.CRM2013.Domain.Servicos.CompromissosDoCanalService(context.OrganizationName, context.IsExecutingOffline, service).GerarAtividadeChecklist(atividade, CompromissoCanal, proprietario);
                                                    }
                                                }
                                            }
                                        }
                                    }
                                    #endregion
                                }
                            }
                        }
                        break;
                    }
                }
                catch (Exception ex)
                {
                    string message = SDKore.Helper.Error.Handler(ex);

                    trace.Trace(SDKore.Helper.Error.GetMessageError(ex));
                    throw new InvalidPluginExecutionException(message, ex);
                }
            }
        }
示例#6
0
        public void EnviaRegistroSellinFieloAstec()
        {
            #region recupera parametro global de data de envio

            var parametroGlobal = new ParametroGlobalService(RepositoryService).ObterPor((int)TipoParametroGlobal.DataEnvioRegistroSellinFielo);
            if (parametroGlobal == null)
            {
                throw new ArgumentException("(CRM) Parâmetro Global(" + (int)TipoParametroGlobal.DataEnvioRegistroSellinFielo + ") não encontrado!");
            }
            var dataConsulta = Convert.ToDateTime(parametroGlobal.Valor);
            #endregion

            try
            {
                if (dataConsulta.Date == DateTime.Now.Date)
                {
                    #region Recuperar revendas a enviar.
                    DateTime database = dataConsulta.AddMonths(-1);

                    String dt_inicio = new DateTime(database.Year, database.Month, 1).ToString("yyyy-MM-dd HH:mm:ss");
                    String dt_fim    = new DateTime(database.Year, database.Month, DateTime.DaysInMonth(database.Year, database.Month)).ToString("yyyy-MM-dd HH:mm:ss");

                    DataTable dtSellin = RepositoryService.Conta.ObterSellinAstec(dt_inicio, dt_fim);
                    #endregion

                    #region Montar CSV
                    string data = DateTime.Now.ToString();
                    data = data.Replace("/", "-").Replace(":", "-");
                    string nomeArquivo = "SELLIN_" + data + ".csv";

                    if (dtSellin != null)
                    {
                        StreamWriter csvArquivo = new StreamWriter(@"c:\\temp\\" + nomeArquivo, false, Encoding.UTF8);

                        //Preenche primeira linha da planilha com o cabeçalho
                        const string aspas = "******"";

                        csvArquivo.WriteLine("SellinId,IdRevendaCRM,CodigoEmitente,Emitente,CompAno,CompMes,TipoOperacao,Item,Valor");

                        int linha = 2;
                        foreach (DataRow item in dtSellin.Rows)
                        {
                            //Adiciona linhas de Sellin da Revenda na planilha do Excell
                            string line = aspas;
                            line += item.Field <string>("SellinId");
                            line += aspas + "," + aspas;
                            if (item.Field <string>("IdRevendaCRM") != "")
                            {
                                line += item.Field <string>("IdRevendaCRM");
                            }
                            line += aspas + "," + aspas;
                            line += item.Field <int>("CodigoEmitente");
                            line += aspas + "," + aspas;
                            if (item.Field <string>("Emitente") != "")
                            {
                                line += item.Field <string>("Emitente");
                            }
                            line += aspas + "," + aspas;
                            line += item.Field <Int16>("CompAno");
                            line += aspas + "," + aspas;
                            line += item.Field <byte>("CompMes");
                            line += aspas + "," + aspas;
                            if (item.Field <string>("TipoOperacao") != "")
                            {
                                line += item.Field <string>("TipoOperacao");
                            }
                            line += aspas + "," + aspas;
                            if (item.Field <string>("Item") != "")
                            {
                                line += item.Field <string>("Item");
                            }
                            line += aspas + "," + aspas;
                            line += item.Field <decimal>("Valor");
                            line += aspas;

                            csvArquivo.WriteLine(line);
                            linha++;
                        }
                        csvArquivo.Close();
                    }
                    #endregion

                    #region Enviar para Fielo via FTP
                    this.enviaArquivoFieloFTP(nomeArquivo);
                    #endregion

                    #region Atualiza data do próximo envio Sellin

                    if (DateTime.Now.Month == 12)
                    {
                        parametroGlobal.Valor = DateTime.Now.Day + "/" + 01 + "/" + (DateTime.Now.Year + 1);
                    }
                    else
                    {
                        parametroGlobal.Valor = DateTime.Now.Day + "/" + (DateTime.Now.Month + 1) + "/" + DateTime.Now.Year;
                    }

                    RepositoryService.ParametroGlobal.Update(parametroGlobal);

                    #endregion
                }
            }
            catch (Exception ex)
            {
                throw new ArgumentException("(CRM) ERRO Geração Sellin : " + ex.Message);
            }
        }
示例#7
0
        public void EnviaRegistroSellinFieloProvedoresSolucoes()
        {
            #region recupera parametro global de data de envio
            var parametroGlobal = new ParametroGlobalService(RepositoryService).ObterPor((int)TipoParametroGlobal.DataEnvioRegistroSellinProvedoresSolucoesFielo);
            if (parametroGlobal == null)
            {
                throw new ArgumentException("(CRM) Parâmetro Global(" + (int)TipoParametroGlobal.DataEnvioRegistroSellinProvedoresSolucoesFielo + ") não encontrado!");
            }
            var dataConsulta = Convert.ToDateTime(parametroGlobal.Valor);
            #endregion

            try
            {
                if (dataConsulta.Date == DateTime.Now.Date)
                {
                    #region Recuperar revendas a enviar.
                    DateTime  database  = dataConsulta.AddMonths(-1);
                    String    dt_inicio = new DateTime(database.Year, database.Month, 1).ToString("yyyy-MM-dd HH:mm:ss");
                    String    dt_fim    = new DateTime(database.Year, database.Month, DateTime.DaysInMonth(database.Year, database.Month)).ToString("yyyy-MM-dd HH:mm:ss");
                    DataTable dtSellin  = RepositoryService.Conta.ObterSellinProvedoresSolucoes(dt_inicio, dt_fim);
                    #endregion

                    #region Montar CSV
                    string data = DateTime.Now.ToString();
                    data = data.Replace("/", "-").Replace(":", "-");
                    string nomeBaseArquivo = "SELLIN_PROVEDORES_SOLUCOES" + data + ".csv";
                    string nomeArquivo     = "c:\\temp\\" + nomeBaseArquivo;

                    if (dtSellin != null)
                    {
                        StringBuilder sb          = new StringBuilder();
                        string[]      columnNames = dtSellin.Columns.Cast <DataColumn>().Select(column => column.ColumnName).ToArray();
                        sb.AppendLine(string.Join(",", columnNames));

                        foreach (DataRow row in dtSellin.Rows)
                        {
                            string[] fields = row.ItemArray.Select(field => field.ToString()).ToArray();
                            sb.AppendLine(string.Join(",", fields));
                        }

                        File.WriteAllText(nomeArquivo, sb.ToString(), Encoding.UTF8);

                        #region Enviar para Fielo via FTP
                        //this.enviaArquivoFieloFTP(nomeBaseArquivo);
                        // TODO: copia arquivo para uma pasta para conferencia, apos fase de teste, usar a funcao comentada a cima
                        System.IO.File.Copy(nomeArquivo, "c:\\ArquivoSellout-PCI\\" + nomeBaseArquivo, true);
                        #endregion
                    }
                    #endregion

                    #region Atualiza data do próximo envio Sellin
                    dataConsulta          = dataConsulta.AddMonths(1);
                    parametroGlobal.Valor = dataConsulta.GetDateTimeFormats('d')[0];
                    RepositoryService.ParametroGlobal.Update(parametroGlobal);

                    #endregion
                }
            }
            catch (Exception ex)
            {
                throw new ArgumentException("(CRM) ERRO Geração Sellin : " + ex.Message);
            }
        }