software‎ > ‎módulos‎ > ‎engine‎ > ‎

perguntas frequentes


Como obter os arquivos de log de um Engine?

postado em 5 de abr de 2016 06:19 por Paulo Cesar Moreno   [ 5 de abr de 2016 06:26 atualizado‎(s)‎ ]

Os arquivos de log de um Engine são importantes para a análise de erros pela equipe de desenvolvimento e podem ser obtidos por meio do Manage do Engine. Para acessa-los, utilize a URL http://<endereco_do_engine:porta>/manage.

Deve ser observado que cada Engine instalado terá um diretório de logs próprio, portanto é importante saber o endereço do Engine do qual se deseja obter os logs. Para utilizar o Manage é necessário que o Engine seja acessível a partir do computador utilizado por quem deseja consultar os logs. Há cenários onde esse acesso não é possível, como no caso dos Engines instalados dentro de uma rede interna de um cliente. Para realizar esse acesso, é possível fazer um acesso indireto por meio de um script agendado remotamente. Para isso:
  1. Acesse o sistema em um Engine que tenha acesso ao outro Engine do qual se deseja obter os logs. Por exemplo: é comum que o Engine servidor tenha acesso a todos os demais Engines.
  2. Abra o processo Admin > Agendador de Scripts. Na grade parâmetros, informe o endereço e porta do Engine do qual deseje obter os logs. Caso o servidor acessado não tenha acesso ao Engine desejado, será apresentado um erro. Nesse caso, deve ser utilizado um outro Engine como meio de acesso.
  3. Crie uma tarefa com os seguintes dados:
    1. Nome: Envio de logs
    2. Período: Uma vez
    3. Hora: h
    4. Script VFS: Send Logs
    5. Parâmetros
      email="alice@bematech.com,bob@bematech.com"
      days="2"
  4. O parâmetro email é uma lista dos endereços de email, separados por ",", que devem receber os logs. O parâmetro "days" indica a quantidade de dias dos logs a partir da data atual. No exemplo acima, o valor 2 indica que devem ser obtidos os logs de hoje e ontem.
  5. Grave e inicie a tarefa criada.
  6. Aguarde a conclusão da tarefa. Caso ela seja executada com sucesso, ele será excluída automaticamente. Caso ela conclua com erro, verifique no campo Resultado o motivo da falha. Normalmente as falhas serão de autenticação no envio do email. Para que o envio de email ocorra com sucesso, deve ser configurada uma conta de SMTP no Manage do Engine servidor.
Esse procedimento também pode ser utilizado para enviar o backup dos bancos de dados da aplicação, o diretório appdbsbkp. Esse diretório é útil para a análise das informações gravadas nos bancos de dados criados por meio da API idoDBManager. Siga o procedimento acima, mas utilize o script "Send App Databases Backup" em vez do "Send Logs", e não informe o parâmetro "days".

Como desabilitar um algoritmo de criptografia do HTTPS?

postado em 9 de mar de 2016 04:36 por Paulo Cesar Moreno

Eventualmente, um algoritmo de criptografia utilizado no protocolo HTTPS pode ser comprometido, sendo necessário que ele seja desabilitado. Periodicamente o Engine atualiza a versão da biblioteca OpenSSL, utilizada para implementar o protocolo HTTPS, para garantir a proteção aos ataques descobertos pela comunidade. No entanto, enquanto o Engine não é atualizado, o administrador do sistema pode desabilitar manualmente os algoritmos comprometidos por meio da opção Ports > Cipher List no Manage. O formato da lista a ser informada é determinada pelo OpenSSL, conforme descrito no manual https://www.openssl.org/docs/manmaster/apps/ciphers.html.

Por exemplo: para desativar os algoritmos vulneráveis do SSLv2, pode ser utilizada a lista "ALL:!EXPORT:!aNULL:!eNULL:!LOW:!SSLv2:!RC4:!3DES".

É importante observar que quando o Engine está configurado em um ambiente com balanceamento de carga, a configuração do SSL normalmente é realizada no proxy reverso, tendo que ser observada a documentação dessa ferramenta para determinar o procedimento para desativar os algoritmos comprometidos.

Como emitir NFe Complementar de Impostos.

postado em 4 de fev de 2014 06:47 por Usuário desconhecido

Para que seja emitida a Nota Fiscal Complementar nesta operação a grade de itens deverá ser preenchida com as seguintes variáveis para recurso, quantidade e valor do item.

Recurso: "Nome do Imposto Complementar: Ex: ICMS Complementar"
Quantidade: 1
Valor: Base de calculo do imposto complementar.

Na NFe Complementar constará também as mesmas informação sobre o tipo de tributação ocorrida na operação original.

Como executar um código JavaScript diretamente no IDE?

postado em 29 de nov de 2011 07:25 por Usuário desconhecido   [ atualizado em 4 de set de 2014 19:57 por Usuário desconhecido ]

O ambiente de desenvolvimento do sistema UNUM é composto basicamente por dois tipos de guias: 
  • IDE: para criar, alterar e excluir os diretórios e arquivos;
  • iDBC SQL: para executar consultas no banco de dados e executar códigos JavaScript;
Como podemos ver, a guia do tipo iDBC SQL é o ambiente propício à execução de códigos JavaScript. Assim, quando queremos executar um código JavaScript, devemos simplesmente escrever o código nesta guia e clicar no botão "Run the script":
.
 Este botão está localizado no canto superior esquerdo da barra de botões. Segue uma janela que exemplifica este uso:



Neste mesmo ambiente, podemos executar um código já escrito em um dos arquivos do tipo ".ijs". Estes arquivos são guardados em nosso sistema de arquivos virtual, a Virtual File System. Cada arquivo tem uma chave única associada a ele. Esta chave é seu identificador único e pode ser referenciado, entre outros locais, no iDBC SQL.

Agora imaginemos que o código do exemplo acima esteja em um arquivo de chave 123456. Para executar o script deste arquivo, basta escrever o código abaixo no iDBC SQL e clicar no botão "Run the script":

var scriptRunner = new ngin.js.ScriptRunner(123456);
scriptRunner.loginBySession(session);
scriptRunner.run();

Para maiores detalhes sobre o funcionamento do ScriptRunner, segue o link para sua documentação: http://desenvolve.unum.com.br:8001/help/symbols/ngin.js.ScriptRunner.html.

Caso suas dúvidas sobre o Engine não sejam sanadas aqui na seção de Perguntas Frequentes e em nossa Documentação de APIs, solicitamos que a dúvida seja registrada na página de nossa comunidade técnica.

Aproveitamos para lembrar que o suporte oficial estabelecido no contrato com a UNUM é feito através do site https://scrum.bematech.com/. Esta página da comunidade técnica é um esforço de ampliar a interação entre os desenvolvedores de toda a comunidade, ou seja, tanto profissionais da UNUM como os próprios clientes e parceiros. Com esta ampliação na comunicação, desejamos prover respostas em diferentes perspectivas e, devido ao maior número de participantes, quem sabe, respostas realizadas com maior velocidade.

Como fazer para criar e publicar WebServices?

postado em 31 de mar de 2011 12:52 por Usuário desconhecido   [ 31 de mar de 2011 13:03 atualizado‎(s)‎ ]

A partir da versão 9.1.0.3 do iEngine já é possível criar e publicar WebServices. A publicação é toda feita em java, enquanto que a implementação da regra de negócio é feita em iJavaScript  no iEngine. A comunição entre o ambiente Java e o ambiente iJavaScript é feita através do protocolo HTTP. Antes de iniciar a leitura do passo-à-passo, recomendamos a leitura do artigo Como fazer para executar codigo Java no iEngine?. Segue abaixo o passo-à-passo que demonstra uma construção de um serviço:

Requisitos

Java SE Development Kit (JDK) 6 (http://java.sun.com/javase/downloads/index.jsp)
Eclipse Web Tools Platform - WTP (http://download.eclipse.org/webtools/downloads/)
Apache CXF 2.1.3 (Libs disponíveis na iVFS) (http://cxf.apache.org/download.html)
JSON-Lib 2.2.2-jdk15 (Libs disponíveis na iVFS) (http://json-lib.sourceforge.net/)

Passo-à-Passo

Iremos implementar um serviço de consulta por CPF, ao informar o CPF para o serviço será retornado um JSON com os dados da pessoa consultada.
  1. Primeiramente criaremos a regra de negócio do WebService em um script iJavaScript:

    /**
     * Realiza um pesquisa por Entidade através do CPF e retorna os dados da Entidade Encontrada
     */

    //Tratamento para transformar o tipo Date em JSON deserializável pela JSON-Lib
    Date.prototype.toJson = function Date_toJson() {
       var json = '{
          "date": ' + this.getDate() + ',
          "day": ' + this.getDay() + ',
          "hours": ' + this.getHours() + ',
          "minutes": ' + this.getMinutes() + ',
          "month": ' + this.getMonth() + ',
          "seconds": ' + this.getSeconds() + ',
          "time": ' + this.getTime() + ',
          "timezoneOffset" : ' + this.getTimezoneOffset() + ',
          "year" : ' + this.getYear() + '
       }'
       return json
    }

    function execute() {
      var cpf = javaRequest.getParameter( "cpf" )
      var ds = connection.getDataSet(
          "Select
             NOME,
             NASCIMENTO,
             FONE,
             ENDERECO
          from
             ENTIDADE
          Where CGCCPF = '"+ cpf +"'"
       )

       var nascimento = !!ds.nascimento?ds.nascimento.toJson():"{}"

       var jsonEntidade = '{
          "nome" : "' + ds.nome + '",
          "nascimento": ' + nascimento + ',
          "fone": "' + ds.fone + '",
          "endereco": "' + ds.endereco + '"
       }'

       return jsonEntidade
    }

    execute()


    Note que foi adicionado um método chamado toJson() no protótipo Date(). Este método gera um JSON compatível com a classe java.lang.Date.


  2. Agora teremos que publicar o WebService, a publicação é feita em Java. Vamos lá: Crie um novo projeto do Eclipse(detalhes em: Como fazer para executar codigo Java no iEngine?) chamado MyService e adicione as seguintes javalibs no build path:
    1. commons-logging-1.1.1.jar
    2. cxf-2.1.3.jar
    3. geronimo-activation_1.1_spec-1.0.2.jar
    4. geronimo-annotation_1.0_spec-1.1.1.jar
    5. geronimo-javamail_1.4_spec-1.3.jar
    6. geronimo-servlet_2.5_spec-1.2.jar
    7. geronimo-ws-metadata_2.0_spec-1.1.2.jar
    8. jaxb-api-2.1.jar
    9. jaxb-impl-2.1.7.jar
    10. jaxws-api-2.1.jar
    11. jetty-6.1.9.jar
    12. jetty-util-6.1.9.jar
    13. neethi-2.0.4.jar
    14. saaj-api-1.3.jar
    15. saaj-impl-1.3.2.jar
    16. wsdl4j-1.6.2.jar
    17. wstx-asl-3.2.6.jar
    18. stax-api-1.0.1.jar
    19. xml-resolver-1.2.jar
    20. XmlSchema-1.4.2.jar
    21. enginelet-2.0.jar
    22. commons-beanutils.jar
    23. commons-beanutils-bean-collections.jar
    24. commons-beanutils-core.jar
    25. commons-collections-3.2.jar
    26. commons-lang-2.3.jar
    27. commons-logging-adapters-1.1.1.jar
    28. commons-logging-api-1.1.1.jar
    29. ezmorph-1.0.4.jar
    30. json-lib-2.2.2-jdk15.jar

      PS: As javalibs poderam ser obtidas a partir da iVFS. O artigo Como fazer para executar codigo Java no iEngine? mostra como obter elas no primeiro item do passo-à-passo.
  3. Selecione a pasta de src do projeto e crie um novo pacote. Vá em File/New/Package..., informe o nome "br.com.unum.engine.webservice.teste" para o pacote e clique no botão Finish.
  4. Selecione o pacote criado e cria um crie um classe chamada Entidade.
  5. Implemente a classe Entidade da seguinte forma:

    package br.com.unum.engine.webservice.teste;

    import java.util.Date;

    public class Entidade {
        private String nome;
        private Date nascimento;
        private String fone;
        private String endereco;
        
        public void setNome(String nome) {
            this.nome = nome;
        }
        
        public String getNome() {
            return nome;
        }
        
        public void setNascimento(Date nascimento) {
            this.nascimento = nascimento;
        }
        
        public Date getNascimento() {
            return nascimento;
        }
        
        public void setFone(String fone) {
            this.fone = fone;
        }
        
        public String getFone() {
            return fone;
        }
        
        public void setEndereco(String endereco) {
            this.endereco = endereco;
        }
        
        public String getEndereco() {
            return endereco;
        }
    }

    DICA: O Eclipse ajuda a implementar os métodos get's e set's. Basta digitar get e teclar CTRL+Espaço para auto-completar.
    Este JavaBean será utilizada na deserialização do JSON retornado pelo script da regra de negócio.

  6. Crie uma interface chamada MyService. Vá em File/New/Interface..., informe o nome MyService para a interface e clique no botão Finish.
  7. Codifique a interface da seguinte maneira:

    package br.com.unum.engine.webservice.teste;

    import javax.jws.WebParam;
    import javax.jws.WebService;

    @WebService
    public interface MyService {
        public String obterEntidadePorCPF( @WebParam(name="cpf") String cpf );
    }


    As anotações @WebServie e @WebParam são fundamentais para a publicação do WebService. A anotação @WebService indica que a interface é um WebService e a anotação @WebParam serve para informar o nome do parametro para o gerador do WSDL.

  8. Crie um classe chamada MyServiceImpl que implemente a interface MyService.
  9. Codifique a classe MyServiceImpl da seguite forma:

    package br.com.unum.engine.webservice.teste;

    import java.util.HashMap;
    import javax.jws.WebService;
    import br.com.inteq.engine.ieji.IEngineJavaInterface;
    import net.sf.json.JSONObject;

    @WebService(endpointInterface="br.com.unum.engine.webservice.teste.MyService", serviceName="MyService")
    public class MyServiceImpl implements MyService {

        public Entidade obterEntidadePorCPF(String cpf) {
            try {
                Entidade entidade;
                HashMap<String, String> parametes = new HashMap<String, String>();
                parametes.put("cpf", cpf);
                String entidadeJson = IEngineJavaInterface.runScript(<Chave do script javascript do passo 1>, parametes);

                JSONObject entidadeJsonObj = JSONObject.fromObject(entidadeJson);
                entidade = (Entidade)JSONObject.toBean(entidadeJsonObj, Entidade.class);
                return entidade;
            } catch (RunScriptException e) {
                e.printStackTrace();
                return null;
            }
        }
    }


    Tudo que o método obterEntidadePorCPF faz é executar o script que contém a regra de negócio no iEngine, e o JSON retornado pelo script é deserializado pelo biblioteca json-lib na JavaBean Entidade.
    A anotação @WebService, serve para indicar qual a interface do serviço e o nome do serviço que irá ser publicado no WSDL.

  10. Gere o JAR do WebService. O artigo Como fazer para executar codigo Java no iEngine? mostra com gerar arquivos JAR usando o ANT no Eclipse;
  11. Agora copie o JAR gerado para a pasta <Diretório do iEngine>\javalibs, se você não importou o JAR para a iVFS você deve usar criar o arquivo .ignoresync;
  12. Agora você deve publicar o serviço no JavaServer. JavaServer e o servidor HTTP Java integrado ao iEngine que publica Web Services. Há três formas de publicar Web Services:
    1. Atráves do processo Ir Para\Desenvolvimento\Web Services\Web Services Publicados: Sigua as instruções de ajuda do processo.
    2. Através do código javascript usando a API JavaServer(recomendavél usar durante o desenvolvimento):
      • Use javaServer.publishService( serviceUrl, serviceJavaClass ) para publicar um Web Service. Ex: javaServer.publishService( "http://127.0.0.1:8081/myservice", "br.com.unum.engine.webservice.teste.MyServiceImpl" ). Note que a classe java que deve ser usada é a classe que implementa a interface do serviço.
      • Use javaServer.unpublishService( serviceUrl ) para despublicar um Web Service. Ex.: javaServer.unpublishService( "http://127.0.0.1:8081/myservice" )
      • Use javaServer.listServices() para listar os Web Services publicados.
    3. Através da auto-inicialização de Web Services Ir Para\Desenvolvimento\Web Services\Auto inicialização de Web Services: O processo de auto-inicialização serve para cadastrar Web Services que seram inicializados a automaticamente por uma determinada instância do iEngine. Sigua as instruções de ajuda do processo.
  13. Você poderá conferir o WSDL de publicação do Web Service acessando a URL: http://127.0.0.1:8081/myservice?wsdl;
  14. Em anexo o código da parte desenvolvida em java do exemplo desenvolvido neste artigo;

    Tela demonstrando a consumação do Web Service deste artigo na plataforma .NET:

Como fazer o 'merge' de permissões?

postado em 9 de nov de 2010 10:19 por Usuário desconhecido   [ atualizado em 8 de set de 2016 11:11 por Paulo Cesar Moreno ]

Alguns desenvolvedores devem está se perguntando: 'Merge' de permissões? o que é isso?
Bom, neste caso fica mais fácil de entender através de um exemplo prático.

Suponha que a chave do seu usuário é 123456 e que ele usuário está associado aos grupos "Grupo 01" e "Grupo 02", nesta ordem. Suponha também que as permissões de palavras chaves(campo ikeywords da tabela ipermission) estejam cadastradas de forma:
  • Para o "Grupo 01" as palavras chaves do processo ABC.ip são "P1;P2"
  • Para o "Grupo 02" as palavras chaves do processo ABC.ip são "P3;P4"
Ao chamar o método security.getPermission( 7889099 /* ABC.ip */, "ikeywords", 123456) ou connection.getPermission( 7889099 /* ABC.ip */, "ikeywords", 123456) será retornado apenas a permissão de palavras chaves referentes ao "Grupo 01", ou seja "P1;P2", pois ele é o primeiro grupo associado ao seu usuário.

Este comportamento é comum para toda permissão do tipo string, com é o caso da permissão de palavra chave(campo ikeywords). Outras permissões que têm o mesmo comportamento é a permissão de campos visiveis(campo ivisiblefieldnames) e a de campos alteráveis(campo ichangeablefieldnames). Entretando este mesmo comportamento é deferente para as permissões do booleanas com as permissões de visão, alteração, exclusão, etc... Nas permissões booleanas valerá sempre a mais permissiva.

Bem, mas se a sua necessidade é juntar todas as permissões de todos os grupos então você deverá fazer os merge de permissões. Para fazer o merge de permissões basta usar o terceiro parâmetro do método getPermission() que é o getMode. Veja como:
security.getPermission( 7889099 /* ABC.ip */, "ikeywords", 123456, "distinct" ) ou connection.getPermission( 7889099 /* ABC.ip */, "ikeywords", 123456, "distinct" )

O modo distinct junta todas as permissões de todos os grupos do usuário e as retorna, sem repetição.

Para conhecer as outras opção para usar no parâmetro getMode consulte a documentação JsDoc do getPermission() aqui.


Como fazer para 'matar' uma sessão usando o sessionManager?

postado em 20 de out de 2010 06:58 por Usuário desconhecido   [ 5 de nov de 2010 12:16 atualizado‎(s)‎ ]

Uma sessão do Engine consome uma quantidade considerável de memória, pois nela é armazenada todo o ambiente JavaScript(variáveis globais, objetos, etc...).

Cada sessão possui um tempo de vida máximo definido em X-Class. Este tempo é contado a partir do momento em que a sessão fica inativa(sem uso). A propriedade this.session.maxSessionInactiveTime é usada para realizar esta configuração.

Entretanto, pode ocorrer que um usuário feche o browser e abra-o novamente criando outra sessão. Com isso haverá duas sessões para o mesmo usuário, sendo que uma delas não estará em uso e pode até ser 'matada', mas ela não será excluída de imediato por que ela deve aguardar a expiração do tempo máximo de inatividade.

Para resolve este tipo de problema, foram publicados nas versões 10.2.2.8 e 10.2.3.5 métodos no objeto sessionManager que permitem 'matar' sessões.

Veja como:


//O parâmetro "5653403AA414761D7FD58F6931FF28A866FC6DE0D8FD6D269EDB1D9015725A10"
//é o sessionID da sessão que será 'matada'.

engine.sessionManager.dropStatefulSession(
  "5653403AA414761D7FD58F6931FF28A866FC6DE0D8FD6D269EDB1D9015725A10"
)


O comando acima marca uma sessão stateful para ser coletada pelo garbage coletor, ela não é excluída de imediato. Há aí uma latência de mais ou menos 20segs.

Há também um comando para 'matar' sessões stateless. Veja:

engine.sessionManager.dropStatelessSession(
  "5653403AA414761D7FD58F6931FF28A866FC6DE0D8FD6D269EDB1D9015725A10"
)


Mas de onde eu pego o sessionId e como sei se uma sessão é stateful ou stateless?

Há um método chamado getStatistics() que trás as informações sobre as sessões criadas no Engine em um DataSet. Veja:

//Ao executar o comando abaixo
engine.sessionManager.getStatistics()

//Será retornado um DataSet semelhante a este:
 expiredid
 creationlastAccess 
maxInactiveTime
maxLifeTime
enviromentType
realm 
persistence
threadId
userKey
userName
profileName
ip
forwardedFor
 N5653403AA414761D7FD58F6931FF28A866FC6DE0D8FD6D269EDB1D9015725A1020/10/2010 10:56:34
20/10/2010 10:58:30
1800
0
stateless
Enginelet_RunScript
none
0
-1

DESENVOLVE
  
 NF09AC0E776621CFB2CE6E237DE42B6FAA8C7BDE6F98FA5E3B8B7B21ED267F92920/10/2010 11:15:53
20/10/2010 11:17:54
18000
stateful
WUI
none
0
-1

DESENVOLVE
127.0.0.1
 
 N96518B001BACA9624D48BC2170ADB957A4DC19853F4C189EB5FEF64B2017C4EE20/10/2010 11:02:43
20/10/2010 11:04:20
18000
stateful
WUI
none
0
-1
 DESENVOLVE
127.0.0.1
 

Segue abaixo a descrição de cada campo do dataset acima:
 CampoDescrição
 expiredIndica de a sessão está ou não expirada. 'S' Indica que a sessão expirou e 'N' indica que a sessão não expirou.
 idIndentificador da sessão ou SessionID
creation
Data e hora em que a sessão foi criada
 lastAccessData e hora em da última utilização da sessão.
 maxInactiveTime 
Tempo máximo de inatividade da sessão. Se este tempo for extrapolado, a sessão será marcada como expirada.
maxLifeTime
Tempo máximo de vida da sessão. Se for 0(zero) a sessão terá tempo ilimitado de vida.
enviromentType
Indica o tipo de ambiente da sessão. Sessões stateful, quando autenticadas, são associadas a um único usuário.
 realmRealm da sessão
 persistenceTipo de persistência da sessão
 threadIdIdentificador da thread que está utilizando a sessão. Se a sessão não estiver em uso, o valor será 0(zero).
 userKeyChave do usuário que se autenticou na sessão.
 userNameNome do usuário que se autenticou na sessão.
 profilerNameNome do perfil da sessão
 ipIP do cliente ou do proxy, se o cliente estiver usando um servidor de proxy.
 forwardedforSe o browser cliente estiver usando servidores de proxy, esta propriedade será preenchida com uma lista de IPs separados por vírgula começando pelo IP do cliente e seguido pelos IPs dos proxy. Obs: O proxy mais próximo do servidor não aparecerá nesta lista. Ele ficará registrado no campo ip.

Segue abaixo um exemplo para melhor compreender:

Seja a hipotética requisição abaixo:
Cliente --> Proxy 01  --> Proxy 02 --> Proxy 03 --> Servidor

Para esta requisição será criada uma sessão cujo os campos ip e forwardedfor seram preenchidos da seguinte forma:
 ipforwardedfor
IP do Proxy 03
 IP do Cliente, IP fo Proxy 01, IP do Proxy 02




O que é extrafilter e para que serve?

postado em 16 de set de 2010 11:14 por Usuário desconhecido   [ atualizado em 12 de fev de 2014 10:31 por Usuário desconhecido ]

O que é Extra Filter e para que serve?

O Extra Filter é um recurso que faz parte da API de segurança do Sistema UNUM. Para explicar o que é um Extra Filter é necessário primeiro abordarmos o conceito de permissões neste sistema.

Permissões e o Extra Filter

O cadastro de permissões do Sistema UNUM possui filtros de permissões que são pré-definidos. São eles:

Nome do campo físicoRótulo do nome do campo
iViewVer
iInsertInserir
iChangeAlterar
iDeleteApagar
iExportExportar
iVfsViewVer VFS
iVfsChangeMudar VFS

O recurso de Extra Filter é um filtro extra que trás a possibilidade de filtrar a permissão por um outro campo da tabela de permissões (iPermission).

Exemplo

Na tabela de permissões há um campo chamando ESTABELECI (Estabelecimento). É possível filtrar a permissão pelo valor deste campo.

Este exemplo checa se o usuário "37860639 - Teste" tem acesso à classe "43614400 - Contatos" e se o campo ESTABELECI no cadastro de permissões tem o valor "3002932 - Estab Demonstração".

security.getPermission( 43614400 /* Contatos */, "iView", 
    37860639 /* Teste*/, "withoutInheritance",
    [['ESTABELECI', 3002932 /* Estab Demonstração */]]
);

Se o campo informado não existir, o Extra Filter será desconsiderado e validará somente o filtro predefinido iview.

security.getPermission( 43614400 /* Contatos */, "iView", 
    37860639 /* joelTeste */, "withoutInheritance",
    [['Campo que não existe', 3002932 /* Estab Demonstração */]] 
);

Funcionamento do Extra Filter

Considere o exemplo acima. Ao utilizar o security.getPermission, informando-se o par [campo extrafiler, valor] no quinto parâmetro, o método irá procurar prioritariamente por este campo na tabela iGroupUser. Caso encontre o campo e ele tenha um valor para a chave "37860639 - Teste" e o valor desse campo coincidir com o valor informado no par, o método retornará true. Caso contrário o método fará a mesma avaliação na tabela iPermission.

O comportamento deste método é replicado na formação das queries pelo iQuery, caso a checagem de permissão esteja habilitada. Para maiores detalhes veja as documentações:

Método security.getPermission
iQuery.checkPermission
Exemplos de uso do iQuery

Configuração do Extra Filter

Ainda no exemplo do Extra Filter ESTABELECI na classe -2008879000 - Pedidos ou Provisões , na definição desta classe existe a seguinte linha:

this.permissionExtraFilter.push(['ESTABELECI', 'ESTABELECI']);

Esta linha insere um par [campo, campo] no array permissionExtraFilter. O primeiro ítem do par indica o nome do campo na classe "-2008879000 - Pedidos ou Provisões" que participará do Extra Filter. O segundo ítem do par indica o nome do campo que será avaliado nas tabelasiGroupUser e iPermission.

Como fazer para inserir imagem no conteúdo do e-mail gerado pelo objeto Mail

postado em 16 de ago de 2010 09:50 por Usuário desconhecido   [ atualizado em 5 de nov de 2010 07:23 por Usuário desconhecido ]

O objeto Mail permite que o desenvolvedor possa inserir uma imagem dentro do conteúdo do E-mail. A inserção é realizada usando HTML através da TAG <img>. Para inserir um imagem o desenvolvedor deverá executar basicamente os seguintes passos:
  1. Inserir o binário da imagem no e-mail usando o método addRelatedContent() e guarda o content-id gerado na adição da imagem.
  2. Inserir uma TAG <img> no conteúdo html do e-mail. Aqui o desenvolvedor deverá usar o prefixo CID(Contend-Id). Exemplo: <img src="cid: ...">

Segue abaixo um exemplo do uso do objeto Mail para inserir imagens dentro do conteúdo do e-mail:

var mail = new Mail()

//Configuração do SMTP
mail.userName = "seuemail@unum.com.br"
mail.fullSsl = true
mail.smtpServer = "smtp.gmail.com:465"
mail.password = "sua senha"

mail.senderName = "Seu Nome"
mail.senderMailAddress = "seuemail@unum.com.br"
mail.subject = "Anexando e exibindo imagens no e-mail"
mail.addRecipient( "destinatario@gmail.com" )

//Adiciona um arquivo de imagem e retorna o content-id gerado.
var imgId = mail.addRelatedContent( "img01.jpg", File.stringFromFile( "C:\\images\\foto.jpg" ) )

//Conteúdo HTML da mensagem
mail.htmlContent = "<html>"
mail.htmlContent += "Imagem de teste<br>"
mail.htmlContent += "<img src=\"cid:"+imgId+"\"><br>"
mail.htmlContent += "Fim do HTML."
mail.htmlContent += "</html>"


mail.logEnabled = true
var logError
try {
   mail.sendLocally() //Envia o e-mail
}
finally {
   logError = mail.log
}
logError


Durante a atualização de tabelas o sistema apresenta a seguinte mensagem "Atenção! Classes não instanciadas: -2008889000". Como resolvo?

postado em 11 de ago de 2010 05:53 por Usuário desconhecido   [ atualizado em 5 de nov de 2010 04:17 por Usuário desconhecido ]

Sempre que você receber uma mensagem semelhante a "Atenção! Classes não instanciadas: -2008889000" durante o processo de atualização de tabelas você deverá ter em mente que o problema é em algum X-Class. Provavelmente um X-Class recentemente alterado.

O primeiro passo para solucionar o problema é identificar o X-Class causador do defeito. Os seguintes métodos podem ser tomados para identificar o X-Class defeituoso:
  1. Se você sabe qual foi o X-Class alterado mais recente, então verifique o código dele. É bem provável que o defeito esteja lá.
  2. Se você não sabe qual o X-Class, então você poderá executar o seguinte código no IDBCSql:

  3. includeOnce -1898147512 /* /inteq/library/server/connection.js */

    connection.instanceClassDefinition( <Chave da classe com problema> )

    Onde <Chave da classe com problema> deverá ser substituído pela chave da classe que a mensagem de erro indicou.
    Ao executar o código acima, o Engine irá apresentar uma mensagem de erro com mais detalhes que lhe ajudará a identificar o X-Class causador do defeito.
A maioria dos tipos de defeitos encontrados nos X-Class são propriedades que estão sendo usadas sem estarem previamente declaradas.

O impacto da ocorrência de erros em determinadas classes durante a atualização de tabelas é que as tabelas e campos definidos nestas classes ou nas suas classes filhas não serão processados.

1-10 of 26