Configurações
- Guia para Emissão e Configuração de Certificado SSL no DOX Portal
- Integração do Active Directory com Aplicações Ema
- Liberando o Acesso Externo ao DOX Portal
- Pacote de funções - PostgreSQL
Guia para Emissão e Configuração de Certificado SSL no DOX Portal
Objetivo
Este documento orienta clientes da Ema Sistemas na emissão e configuração de certificados SSL para uso em domínios próprios no DOX Portal.
A utilização do HTTPS (HTTP sobre SSL/TLS) garante uma camada adicional de segurança na comunicação entre o navegador e o servidor, protegendo os dados transmitidos por meio de criptografia.
✅ Etapas para Emissão e Configuração do Certificado SSL
1. Registrar um Domínio Próprio
- Você deve possuir um domínio registrado em seu nome (ex:
suaempresa.com.br) - Este domínio servirá de base para criação do endereço de acesso ao DOX Portal (ex:
dox.suaempresa.com.br) - Se você não possui domínio, deve registrar através de:
- Registro.br
- Provedores de hospedagem (KingHost, GoDaddy, HostGator, etc.)
💡 Importante: A Ema não realiza o registro para os clientes, mas pode instruir como fazer. O registro de domínio é um serviço pago.
2. Hospedar o Domínio
- Após o registro, o domínio deve estar vinculado a um serviço de hospedagem com suporte à emissão de certificados SSL
- Recomendação: Serviços como KingHost ou similares, que já oferecem emissão de certificados SSL compatíveis
💰 A hospedagem do domínio também é um serviço pago.
3. Criar o Subdomínio e Emitir o Certificado SSL
Com o domínio hospedado:
- Crie o subdomínio que será utilizado no acesso ao DOX Portal (ex:
dox.suaempresa.com.br) - Solicite no serviço de hospedagem a emissão do certificado SSL para este subdomínio, garantindo que o formato gerado seja compatível com o sistema da Ema: .PEM ou .CRT
- Alternativa: Caso a hospedagem não ofereça emissão de certificado SSL, será necessário buscar uma certificadora terceirizada especializada. Esta alternativa exige atenção redobrada, pois envolve um processo mais técnico e pode demandar etapas adicionais de validação e configuração.
⏱️ A emissão pode levar até 1 dia útil, dependendo do provedor de hospedagem.
4. Configurar o Certificado no Ema Configurador
Com o certificado em mãos, siga os passos abaixo com apoio do Suporte da Ema:
- Abra o Ema Configurador e edite o registro da conexão
- Defina a porta principal como 443 (HTTPS padrão). Portas alternativas também são permitidas, desde que especificadas corretamente no endereço de conexão
- Marque a opção "Utiliza HTTPS"
- Nos campos "Certificado" e "Arq. Senha" procure e informe o certificado no formato .PEM ou .CRT
- Caso o cliente esteja executando o sistema anteriormente com conexão HTTP, altere o caminho de conexão no seguinte arquivo, substituindo o protocolo de
httpparahttpse ajustando a porta.:C:\Ema Software\Contas ERP\Ema_Conexao_Servidor.ini
5. Testar a Inicialização do Sistema com SSL
Caso os microserviços do sistema não iniciem, execute o seguinte teste manual:
- Abra o terminal do Windows (Prompt de Comando)
- Execute:
C:\Ema Software\Contas ERP\fabio.exe" -cfg fabio.properties - Este comando tenta inicializar o serviço com o certificado SSL configurado e mostrará mensagens de erro úteis para diagnóstico
🔧 Se o sistema estiver online, pare os serviços pelo Ema_Start antes de testar.
ℹ️ Informações Importantes
🌐 Clientes Cloud Server da Ema
- O domínio fornecido para acesso ao cloud não pode ser usado para emissão de certificados SSL
- O cliente deve possuir um domínio próprio
🆓 Opção Gratuita com Let's Encrypt
- Também é possível emitir certificados gratuitamente com o Let's Encrypt
- Esta opção exige:
- Conhecimento técnico em Linux
- Que o cliente renove o certificado a cada 90 dias
- Que o cliente renove o certificado a cada 90 dias
🔗 Documentação Relacionada
Para mais informações sobre configuração de acesso externo, consulte também: Liberando o Acesso Externo ao DOX Portal
Integração do Active Directory com Aplicações Ema
O que é Active Directory?
O Active Directory é uma implementação de serviço de diretório no protocolo LDAP que armazena informações sobre objetos em rede de computadores e disponibiliza essas informações a usuários e administradores desta rede.
Como Integrar com as Aplicações da Ema?
Primeiramente o ambiente do cliente precisar estar devidamente configurado com o AD DS (Active Directory Domain Service). Caso não esteja, não será possível utilizar o recurso. Caso queira configurar, deve entrar em contato com sua Equipe de TI para que seja realizada a configuração.
Habilitando o uso do AD nas aplicações
Para que o ERP/APS/DOX funcionem junto com o AD, precisamos habilitar o micro serviço Ema_AD, sem ele não será possível.
Vamos em C:\Ema Software\Contas ERP\ -> aqui procuramos pelo Ema_Configurador -> vamos na aba serviços -> habilitamos o micro serviço Ema_AD -> clicamos na opção salvar -> e depois reiniciamos o serviço Ema start.
Após subir os serviços, devemos abrir o DOX estúdio, pois a configuração atualmente é feita única e exclusivamente pela aplicação.
configurações -> parâmetros gerais -> aba Active Directory, habilitar as seguintes opções:
- Utilizar credenciais do AD: Esse é o único parâmetro que deve estar sempre marcado, sem ele, a integração com o AD não funciona.
- Utilizar login Automático: Serve para que ao acessar quaisquer aplicações exceto, PDV e DOX portal, já faça o login direto, sem precisar informar usuário e senha.
- Cadastrar automaticamente usuário/empregado no primeiro acesso: Serve para ao acessar pela primeira vez o software, já seja criado um usuário com base nas credenciais do AD, usando como grupo de usuário o padrão definido no ultimo parâmetro.
Liberando o Acesso Externo ao DOX Portal
Quer acessar o DOX Portal de qualquer lugar, com um endereço personalizado e seguro? Veja como liberar o acesso externo de forma simples e eficiente:
🛠️ O que você vai precisar
- Domínio próprio:
Registrado no Registro.br (ou outro provedor), com acesso ao painel de DNS para criar ou editar registros. - Internet com IP público fixo:
Necessário para garantir que seu endereço sempre aponte para o servidor correto.- Não sabe se sua conexão possui IP fixo? Consulte sua operadora de internet.
- Endereço IP público em mãos:
Para saber qual é o seu IP público, acesse: meuip.com.br. - Permissão de acesso ao roteador/firewall:
Será necessário criar uma regra de redirecionamento (NAT/Port Forward) para liberar o acesso ao servidor do DOX Portal. - Acesso ao servidor onde o DOX Portal está instalado:
Você vai precisar liberar portas no firewall do Windows e conferir as configurações do sistema.
1️⃣ Crie o subdomínio para o DOX Portal
- No painel de DNS do seu domínio, crie um subdomínio (ex: dox.suaempresa.com.br) e aponte para o IP público fixo da sua empresa. Usualmente, você deverá criar um registro de DNS do tipo A, vinculado ao seu endereço IP público.
- Confirme se está funcionando com o comando:
ping dox.suaempresa.com.br
2️⃣ Libere a porta de comunicação no seu firewall/gateway
- Descubra a porta usada pelo DOX:
Abra o Ema_Configurador (C:\Ema Software\Contas ERP\Ema_Configurador.exe) e veja qual porta está configurada como Porta Principal (padrão é 80, mas pode ser outra). - No firewall/roteador:
Crie uma regra de NAT/Port Forward redirecionando a porta configurada para o IP interno do servidor DOX. Essa configuração é realizada de maneira diferente, de acordo com cada sistema ou equipamento.- Exemplo:
- Porta externa: 80 (HTTP) ou a porta que estiver configurada
- Destino interno: IP do servidor DOX (ex: 192.168.1.100)
- Exemplo:
- No Windows Firewall:
Libere a mesma porta para entrada de conexões externas.
3️⃣ Acesse o DOX Portal de fora da empresa
Agora você já pode acessar de qualquer lugar, usando:
- Endereço padrão:
http://dox.suaempresa.com.br - Se usar porta diferente da 80:
Inclua na URL (ex: http://dox.suaempresa.com.br:8080)
💡 Dicas extras
- Redirecionamento automático: Se precisar, configure um redirecionamento de URL no seu serviço de hospedagem para facilitar o acesso sem precisar informar a porta, caso utilize uma porta alternativa a 80.
- Atualize a URL do portal no DOX:
No sistema DOX, vá em Configurações → Parâmetros Gerais → Aba Geral → URL do portal e informe o endereço externo criado.
Pacote de funções - PostgreSQL
Criando o SCHEMA PKG_EMA
CREATE SCHEMA pkg_ema AUTHORIZATION postgres;
RETORNA COLUNA GRADE
-- DROP FUNCTION pkg_ema.retorna_coluna_grade(int4, int4, int4, int4, int4);
CREATE OR REPLACE FUNCTION pkg_ema.retorna_coluna_grade(xidprocesso integer, xidatividade integer, xidformulario integer, xidgrade integer, xidvalor integer)
RETURNS character varying
LANGUAGE plpgsql
AS $function$
declare
leitura varchar(4000);
begin
select
resposta into leitura
from public.crm_processo_grade_valor
where idprocesso = xidprocesso
and idformulario = xidformulario
and idatividade = xidatividade
and idgrade = xidgrade
and idvalor = xidvalor
and idrepeticao = (select max(idrepeticao)
from crm_processo_grade_valor xx
where xx.idatividade = crm_processo_grade_valor.idatividade
and xx.idprocesso = crm_processo_grade_valor.idprocesso
and xx.idformulario = crm_processo_grade_valor.idformulario);
return(trim(leitura));
end;
$function$
;
RETORNA COLUNA GRADE GLOB
-- DROP FUNCTION pkg_ema.retorna_coluna_grade_clob(int4, int4, int4, int4, int4);
CREATE OR REPLACE FUNCTION pkg_ema.retorna_coluna_grade_clob(xidprocesso integer, xidatividade integer, xidformulario integer, xidgrade integer, xidvalor integer)
RETURNS text
LANGUAGE plpgsql
AS $function$
declare
leitura text;
begin
select
resposta into leitura
from public.crm_processo_grade_valor
where idprocesso = xidprocesso
and idformulario = xidformulario
and idatividade = xidatividade
and idgrade = xidgrade
and idvalor = xidvalor
and idrepeticao = (select max(idrepeticao)
from crm_processo_grade_valor xx
where xx.idatividade = crm_processo_grade_valor.idatividade
and xx.idprocesso = crm_processo_grade_valor.idprocesso
and xx.idformulario = crm_processo_grade_valor.idformulario);
return(trim(leitura));
end;
$function$
;
RETORNA COLUNA GRADE DATA
-- DROP FUNCTION pkg_ema.retorna_coluna_grade_data(int4, int4, int4, int4, int4);
CREATE OR REPLACE FUNCTION pkg_ema.retorna_coluna_grade_data(xidprocesso integer, xidatividade integer, xidformulario integer, xidgrade integer, xidvalor integer)
RETURNS date
LANGUAGE plpgsql
AS $function$
declare
leitura date;
begin
select respostadatahora into leitura
from public.crm_processo_grade_valor
where idprocesso = xidprocesso
and idformulario= xidformulario
and idatividade = xidatividade
and idgrade = xidgrade
and idvalor = xidvalor
and idrepeticao = (select max(idrepeticao)
from crm_processo_grade_valor xx
where xx.idatividade = crm_processo_grade_valor.idatividade
and xx.idprocesso = crm_processo_grade_valor.idprocesso
and xx.idformulario = crm_processo_grade_valor.idformulario);
return(leitura); --fazer o trim depois
end;
$function$
;
RETORNA COLUNA GRADE DATAHORA
-- DROP FUNCTION pkg_ema.retorna_coluna_grade_datahr(int4, int4, int4, int4, int4);
CREATE OR REPLACE FUNCTION pkg_ema.retorna_coluna_grade_datahr(xidprocesso integer, xidatividade integer, xidformulario integer, xidgrade integer, xidvalor integer)
RETURNS timestamp without time zone
LANGUAGE plpgsql
AS $function$
declare
leitura timestamp;
begin
select respostadatahora into leitura
from public.crm_processo_grade_valor
where idprocesso = xidprocesso
and idformulario= xidformulario
and idatividade = xidatividade
and idgrade = xidgrade
and idvalor = xidvalor
and idrepeticao = (select max(idrepeticao)
from crm_processo_grade_valor xx
where xx.idatividade = crm_processo_grade_valor.idatividade
and xx.idprocesso = crm_processo_grade_valor.idprocesso
and xx.idformulario = crm_processo_grade_valor.idformulario);
return(leitura);
end;
$function$
;
RETORNA COLUNA GRADE INTEIRO
-- DROP FUNCTION pkg_ema.retorna_coluna_grade_int(int4, int4, int4, int4, int4);
CREATE OR REPLACE FUNCTION pkg_ema.retorna_coluna_grade_int(xidprocesso integer, xidatividade integer, xidformulario integer, xidgrade integer, xidvalor integer)
RETURNS integer
LANGUAGE plpgsql
AS $function$
declare
leitura int4;
begin
/*leitura := 0 ;
select (select to_number(decode(respostainteiro,'.',0,respostainteiro)) from dual)*/
select respostainteiro into leitura
from public.crm_processo_grade_valor
where idprocesso = xidprocesso
and idformulario = xidformulario
and idatividade = xidatividade
and idgrade = xidgrade
and idvalor = xidvalor
and idrepeticao = (select max(idrepeticao)
from crm_processo_grade_valor xx
where xx.idatividade = crm_processo_grade_valor.idatividade
and xx.idprocesso = crm_processo_grade_valor.idprocesso);
return(leitura);
end;
$function$
;
RETORNA COLUNA GRADE TEXTO
-- DROP FUNCTION pkg_ema.retorna_coluna_grade_texto(int4, int4, int4, int4, int4);
CREATE OR REPLACE FUNCTION pkg_ema.retorna_coluna_grade_texto(xidprocesso integer, xidatividade integer, xidformulario integer, xidgrade integer, xidvalor integer)
RETURNS character varying
LANGUAGE plpgsql
AS $function$
declare
leitura varchar(4000);
begin
select
resposta into leitura
from public.crm_processo_grade_valor
where idprocesso = xidprocesso
and idformulario = xidformulario
and idatividade = xidatividade
and idgrade = xidgrade
and idvalor = xidvalor
and idrepeticao = (select max(idrepeticao)
from crm_processo_grade_valor xx
where xx.idatividade = crm_processo_grade_valor.idatividade
and xx.idprocesso = crm_processo_grade_valor.idprocesso
and xx.idformulario = crm_processo_grade_valor.idformulario);
return(trim(leitura));
end;
$function$
;
RETORNA COLUNA GRADE VALOR
-- DROP FUNCTION pkg_ema.retorna_coluna_grade_valor(int4, int4, int4, int4, int4);
CREATE OR REPLACE FUNCTION pkg_ema.retorna_coluna_grade_valor(xidprocesso integer, xidatividade integer, xidformulario integer, xidgrade integer, xidvalor integer)
RETURNS numeric
LANGUAGE plpgsql
AS $function$
declare
leitura numeric(15,2);
begin
select respostavalor into leitura
from public.crm_processo_grade_valor
where idprocesso = xidprocesso
and idformulario = xidformulario
and idatividade = xidatividade
and idgrade = xidgrade
and idvalor = xidvalor
and idrepeticao = (select max(idrepeticao)
from crm_processo_grade_valor xx
where xx.idatividade = crm_processo_grade_valor.idatividade
and xx.idprocesso = crm_processo_grade_valor.idprocesso);
return(leitura);
end;
$function$
;
RETORNA LISTA
-- DROP FUNCTION pkg_ema.retorna_lista(text, bpchar);
CREATE OR REPLACE FUNCTION pkg_ema.retorna_lista(in_lista text, delimitador character)
RETURNS TABLE(out_id integer, out_str text)
LANGUAGE plpgsql
AS $function$
declare
dados record;
begin
IN_LISTA = REPLACE(REPLACE(IN_LISTA,'(',''),')','');
IF DELIMITADOR = '' OR DELIMITADOR IS NULL THEN DELIMITADOR = ','; END IF;
IF IN_LISTA <> '.' and IN_LISTA is not null and IN_LISTA <> '' and (IN_LISTA not like '/%' and IN_LISTA not like '%/') THEN
for dados in (select unnest(string_to_array(IN_LISTA, DELIMITADOR)) LISTA)
LOOP
BEGIN
OUT_ID = cast(dados.lista as integer);
OUT_STR = dados.lista;
RETURN NEXT;
EXCEPTION
WHEN OTHERS then
OUT_ID = 0;
OUT_STR = dados.lista;
RETURN NEXT;
END;
END LOOP;
ELSE
OUT_ID = 0;
OUT_STR = '0';
RETURN NEXT;
END IF;
end;
$function$
;
RETORNA VALOR VARIAVEL
-- DROP FUNCTION pkg_ema.retorna_valor_variavel(int4, int4);
CREATE OR REPLACE FUNCTION pkg_ema.retorna_valor_variavel(xidprocesso integer, xidvariavel integer)
RETURNS character varying
LANGUAGE plpgsql
AS $function$
declare
valor varchar(5000);
begin
select valoratual into valor
from public.crm_processo_variavel
where crm_processo_variavel.idprocesso = xidprocesso
and crm_processo_variavel.idvariavel = xidvariavel ;
return valor;
end;
$function$
;
RETORNA VALOR VARIAVEL BLOB
-- DROP FUNCTION pkg_ema.retorna_valor_variavel_blob(int4, int4);
CREATE OR REPLACE FUNCTION pkg_ema.retorna_valor_variavel_blob(xidprocesso integer, xidvariavel integer)
RETURNS text
LANGUAGE plpgsql
AS $function$
declare
valor text;
begin
select valorblob into valor
from public.crm_processo_variavel
where crm_processo_variavel.idprocesso = xidprocesso
and crm_processo_variavel.idvariavel = xidvariavel ;
return trim(valor);
end;
$function$
;
RETORNA VALOR VARIAVEL CLOB
-- DROP FUNCTION pkg_ema.retorna_valor_variavel_clob(int4, int4);
CREATE OR REPLACE FUNCTION pkg_ema.retorna_valor_variavel_clob(xidprocesso integer, xidvariavel integer)
RETURNS text
LANGUAGE plpgsql
AS $function$
declare
valor text;
begin
select valoratual into valor
from public.crm_processo_variavel
where crm_processo_variavel.idprocesso = xidprocesso
and crm_processo_variavel.idvariavel = xidvariavel ;
return trim(valor);
end;
$function$
;
RETORNA VALOR VARIAVEL DATA
-- DROP FUNCTION pkg_ema.retorna_valor_variavel_data(int4, int4);
CREATE OR REPLACE FUNCTION pkg_ema.retorna_valor_variavel_data(xidprocesso integer, xidvariavel integer)
RETURNS date
LANGUAGE plpgsql
AS $function$
declare
valor date;
begin
if (xidprocesso > 0 and xidvariavel > 0) then
begin
select case when valoratual <> '.' then to_date(valoratual,'dd/mm/yyyy HH24:MI')
else to_date('01-01-1900','dd/mm/yyyy HH24:MI') end into valor
from public.crm_processo_variavel
where crm_processo_variavel.idprocesso = xidprocesso
and crm_processo_variavel.idvariavel = xidvariavel ;
end;
else
valor := to_date('01/01/1900','dd/mm/yyyy HH24:MI');
end if;
return valor;
end;
$function$
;
RETORNA VALOR VARIAVEL DATAHORA
-- DROP FUNCTION pkg_ema.retorna_valor_variavel_datahr(int4, int4);
CREATE OR REPLACE FUNCTION pkg_ema.retorna_valor_variavel_datahr(xidprocesso integer, xidvariavel integer)
RETURNS timestamp without time zone
LANGUAGE plpgsql
AS $function$
declare
valor timestamp;
begin
if (xidprocesso > 0 and xidvariavel > 0) then
begin
select case when valoratual <> '.' then to_timestamp(valoratual,'dd/mm/yyyy HH24:MI')
else to_timestamp('01-01-1900','dd/mm/yyyy HH24:MI') end into valor
from public.crm_processo_variavel
where crm_processo_variavel.idprocesso = xidprocesso
and crm_processo_variavel.idvariavel = xidvariavel ;
end;
else
valor := to_timestamp('01/01/1900','dd/mm/yyyy HH24:MI');
end if;
return valor;
end;
$function$
;
RETORNA VALOR VARIAVEL INTEIRO
-- DROP FUNCTION pkg_ema.retorna_valor_variavel_int(int4, int4);
CREATE OR REPLACE FUNCTION pkg_ema.retorna_valor_variavel_int(xidprocesso integer, xidvariavel integer)
RETURNS integer
LANGUAGE plpgsql
AS $function$
declare
valor int4;
begin
select cast(case when valoratual = '.' then '0' else valoratual end as int4)
into valor
from public.crm_processo_variavel
where crm_processo_variavel.idprocesso = xidprocesso
and crm_processo_variavel.idvariavel = xidvariavel ;
return valor;
end;
$function$
;
RETORNA VALOR VARIAVEL TEXTO
-- DROP FUNCTION pkg_ema.retorna_valor_variavel_texto(int4, int4);
CREATE OR REPLACE FUNCTION pkg_ema.retorna_valor_variavel_texto(xidprocesso integer, xidvariavel integer)
RETURNS character varying
LANGUAGE plpgsql
AS $function$
declare
valor varchar(5000);
begin
select valoratual into valor
from public.crm_processo_variavel
where crm_processo_variavel.idprocesso = xidprocesso
and crm_processo_variavel.idvariavel = xidvariavel ;
return valor;
end;
$function$
;
RETORNA VALOR VARIAVEL VALOR
-- DROP FUNCTION pkg_ema.retorna_valor_variavel_valor(int4, int4);
CREATE OR REPLACE FUNCTION pkg_ema.retorna_valor_variavel_valor(xidprocesso integer, xidvariavel integer)
RETURNS numeric
LANGUAGE plpgsql
AS $function$
declare
valor decimal(15,2) ;
begin
select replace(replace(case when valoratual = '.' then '0' else valoratual end, '.', ''), ',', '.')
into valor
from public.crm_processo_variavel
where crm_processo_variavel.idprocesso = xidprocesso
and crm_processo_variavel.idvariavel = xidvariavel ;
return valor;
end;
$function$
;
EXEMPLO RETORNO DE GRADE
SELECT PKG_EMA.RETORNA_COLUNA_GRADE_INT(X.IDPROCESSO, X.IDATIVIDADE, X.IDFORMULARIO, 1, X.IDVALOR) AS NOMECAMPO1,
PKG_EMA.RETORNA_COLUNA_GRADE_INT(X.IDPROCESSO, X.IDATIVIDADE, X.IDFORMULARIO, 2, X.IDVALOR) AS NOMECAMPO2,
PKG_EMA.RETORNA_COLUNA_GRADE_INT(X.IDPROCESSO, X.IDATIVIDADE, X.IDFORMULARIO, 3, X.IDVALOR) AS NOMECAMPO3,
PKG_EMA.RETORNA_COLUNA_GRADE_VALOR(X.IDPROCESSO, X.IDATIVIDADE, X.IDFORMULARIO, 4, X.IDVALOR) AS NOMECAMPO4,
0/*IDPROCESSO*/ AS IDPROCESSO
FROM CRM_PROCESSO_GRADE_VALOR X
WHERE IDPROCESSO = 0/*IDPROCESSO*/
AND IDATIVIDADE = 3/*IDATIVIDAE*/
AND IDFORMULARIO = 34/*IDFORMULARIO*/
AND IDREPETICAO = (SELECT MAX(IDREPETICAO)
FROM CRM_PROCESSO_GRADE_VALOR
WHERE IDPROCESSO = X.IDPROCESSO
AND IDATIVIDADE = X.IDATIVIDADE)
AND IDGRADE = 1