<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Integração GT x Akita no formato Cloud (gtsoft-rest-api e akitasoft-rest-api)]]></title><description><![CDATA[<h1>Integração GT x Akita no formato Cloud</h1>
<h2>Configuração básica dos artefatos</h2>
<h3>akitasoft</h3>
<p dir="auto">ASW0140:</p>
<ul>
<li>campo "Considera Documento" com a opção "GT Soft Cloud" salva.</li>
</ul>
<p dir="auto">-&gt; Não precisa de configuração específica no application.yml</p>
<h3>gtsoft</h3>
<p dir="auto">GT0110:</p>
<ul>
<li>campo "Tipo Integração API" com a opção "Webhook" salva;</li>
<li>campo "Url Webhook Sistema Integrado" com a url da akitasoft-rest-api. Exemplo: <a href="http://insoft-lnx25:7480/akitasoft-rest-api/" rel="nofollow ugc">http://insoft-lnx25:7480/akitasoft-rest-api/</a><br />
a url precisa estar completa nesse formato '<a href="http://site" rel="nofollow ugc">http://site</a>:porta/akitasoft-rest-api/'</li>
</ul>
<p dir="auto">GT0115:<br />
Nessa tela deve ser cadastrado o de-para de tipos de pessoas que as contratantes vão considerar para integrar.</p>
<ul>
<li>campo "Contratante" é a contratante do GT, integrando pessoas que tenham o turno nesta contratante.</li>
<li>campo "Tipo Pessoa" é o tipo de pessoa do GT</li>
<li>campo "Tipo Pessoa Integração" é o tipo de pessoa do Akita<br />
Quando a pessoa do GT tem o "Tipo Pessoa" igual ao deste cadastro, e turno nessa contratante, a integração vai inserir ela no Akita com o "Tipo Pessoa Integração" especificado.</li>
</ul>
<p dir="auto">GT0810:<br />
Nessa tela fica salvo alguns dados usados pelas APIs da integração.<br />
Cada contratante que precisa integrar seus prestadores com o Akita precisam dos atributos USUARIO_API_AKITA, SENHA_API_AKITA e URL_WEBHOOK_SISTEMA_INTEGRADO cadastrados aqui nesta tela.</p>
<ul>
<li>
<p dir="auto">campo "Nome Parametro" com valor "USUARIO_API_AKITA"</p>
</li>
<li>
<p dir="auto">campo "Tipo Parametro" com valor "Texto"</p>
</li>
<li>
<p dir="auto">campo "Valor Parametro" com valor relativo ao login de usuário usado para a integração. Utilizar um login do tipo admin e que tenha o tipo de usuário como "Integração".</p>
</li>
<li>
<p dir="auto">campo "Nome Parametro" com valor "SENHA_API_AKITA"</p>
</li>
<li>
<p dir="auto">campo "Tipo Parametro" com valor "Texto"</p>
</li>
<li>
<p dir="auto">campo "Valor Parametro" com valor relativo a senha do login usado em USUARIO_API_AKITA.</p>
</li>
<li>
<p dir="auto">campo "Nome Parametro" com valor "URL_WEBHOOK_SISTEMA_INTEGRADO"</p>
</li>
<li>
<p dir="auto">campo "Tipo Parametro" com valor "Texto"</p>
</li>
<li>
<p dir="auto">campo "Valor Parametro" com valor relativo a url da akitasoft-rest-api. Aqui deve-se usar o mesmo valor salvo no GT0110 para a contratante.</p>
</li>
</ul>
<p dir="auto">GT0280:<br />
Nesta tela ficam salvos os turnos das contratantes e os cod_perfil que eles representam no Akita.<br />
Ou seja, cada turno do GT representa um perfil de acesso para a pessoa no akita. Diferentes turnos podem apontar para um mesmo cod_perfil do Akita, não há problemas nisso.</p>
<p dir="auto">GT0815:<br />
Nesta tela ficam salvos os de-paras de motivos de afastamentos. O codMotivo 1 do GT poderá ser o codMotivo 2 do Akita, conforme o necessário no cliente. Sempre levando em conta a contratante.</p>
<p dir="auto">-&gt; Não precisa de configuração específica no application.yml</p>
<h3>gtsoft-rest-api</h3>
<p dir="auto">Configurações do application.yml:</p>
<ul>
<li>conexão de banco com a base do GT</li>
<li>plugin.insoftApiSecurity.authenticator.url: '<a href="http://insoft-lnx26.insoft.local:8880/insoft-auth" rel="nofollow ugc">http://insoft-lnx26.insoft.local:8880/insoft-auth</a>' # Url do insoft-auth do GT</li>
<li>akita.urlBase: '<a href="http://localhost:8680/gtsoft-rest-api" rel="nofollow ugc">http://localhost:8680/gtsoft-rest-api</a>' # Url da própria API. Esse valor é enviado ao akitasoft-rest-api para ele conseguir acionar esta API de novo. Aqui não pode ter barra no final da url. Possivelmente só precisa trocar a porta da url quando aplicado em produção.</li>
<li>akita.delayRepeatPonteiro: 15 # Repetição em segundos para excussão do JOB que manda as ponteiros_integracoes_acessos para o akitasoft-rest-api integrar</li>
<li>akita.qtdRegistro: Quantidade de registros da ponteiros_integracoes_acessos enviados por job ao akitasoft-rest-api</li>
</ul>
<h3>akitasoft-rest-api</h3>
<p dir="auto">Configurações do application.yml:</p>
<ul>
<li>conexão de banco com a base do Akita/Ponto</li>
<li>plugin.insoftApiSecurity.authenticator.url: '<a href="http://insoft-lnx25.insoft.local:7280/insoft-auth" rel="nofollow ugc">http://insoft-lnx25.insoft.local:7280/insoft-auth</a>' # Url do insoft-auth do Akita</li>
<li>gt.url: '<a href="http://localhost:8080/gtsoft-rest-api/" rel="nofollow ugc">http://localhost:8080/gtsoft-rest-api/</a>'</li>
<li>gt.username: 'admin' # usuário do GT que é admin, pode ser um dos cadastrados em USUARIO_API_AKITA do GT0810</li>
<li>gt.password: 'admin' # senha salva em SENHA_API_AKITA para o USUARIO_API_AKITA escolhido<br />
Obs: o usuário informado em gt.username precisa estar cadastrado na GT0500 do GT (tabela in4fw_usuarios da base do GT)</li>
</ul>
<h2>Fluxo da integração GT -&gt; Akita</h2>
<p dir="auto">A integração funciona somente no sentido GT envia dados ao Akita.<br />
O Akita não altera dados cadastrais do prestador/empresa no GT.</p>
<p dir="auto">Etapa 1 - Alterações de dados em tabelas do GT, por meio do uso das telas do sistema e procedimentos feitos pelo banco. As seguintes tabelas do GT disparam a integração:</p>
<ul>
<li>
<p dir="auto">dados da Empresa Prestadora:</p>
</li>
<li>
<p dir="auto">AFASTAMENTOS_EMPRESAS         -&gt; TRIG_AF_RW_AE_ATZ_PNT_INT_AC</p>
</li>
<li>
<p dir="auto">EMPRESAS_PESSOAS              -&gt; TRIG_AF_RW_EP_ATZ_PNT_INT_AC</p>
</li>
<li>
<p dir="auto">PERIODOS_DOCUMENTOS_EMPRESAS  -&gt; TRIG_AF_RW_PDE_ATZ_PNT_INT_AC</p>
</li>
<li>
<p dir="auto">RELACOES_SERVICOS_EMPRESAS    -&gt; TRIG_AF_RW_RSE_ATZ_PNT_INT_AC</p>
</li>
<li>
<p dir="auto">dados do Prestador de Serviço:</p>
</li>
<li>
<p dir="auto">AFASTAMENTOS_PESSOAS          -&gt; TRIG_AF_RW_AP_ATZ_PNT_INT_AC</p>
</li>
<li>
<p dir="auto">CONTROLES_PESSOAS             -&gt; TRIG_AF_RW_CP_ATZ_PNT_INT_AC</p>
</li>
<li>
<p dir="auto">PERIODOS_DOCUMENTOS_PESSOAS   -&gt; TRIG_AF_RW_PDP_ATZ_PNT_INT_AC</p>
</li>
<li>
<p dir="auto">RELACOES_PESSOAS_CONTRATANTES -&gt; TRIG_AF_RW_RPC_ATZ_PNT_INT_AC</p>
</li>
<li>
<p dir="auto">SOLICITACOES_LIBER_PESSOAS    -&gt; TRIG_AF_RW_SLP_ATZ_PNT_INT_AC</p>
</li>
<li>
<p dir="auto">TIPOS_CONTROLES_PESSOAS       -&gt; TRIG_AF_RW_TCP_ATZ_PNT_INT_AC</p>
</li>
</ul>
<p dir="auto">Alterações nessa tabela criam um registro na tabela ponteiros_integracoes_acessos.</p>
<p dir="auto">Etapa 2 - Coleta destes dados da ponteiros e envio ao akitasoft-rest-api. A gtsoft-rest-api executa o Job e coleta os registros da ponteiros_integracoes_acessos que estão com 'situacao' = 1, 'tipo_integracao_api' = 'W', ordenada por 'tipo_dado' 'ASC'.</p>
<p dir="auto">Para cada registro encontrado nessa coleta, a gtsoft-rest-api realiza:</p>
<ul>
<li>
<p dir="auto">login na akitasoft-rest-api</p>
</li>
<li>
<p dir="auto">com o token da autenticacao, envia uma request POST para 'akitasoft-rest-api/v1/AlteracaoGT', conforme a url base presente na coluna url_webhook_sistema_integrado deste registro da ponteiros_integracoes_acessos</p>
</li>
<li>
<p dir="auto">se a integração for de dados de empresa prestadora, enviará o seguinte conjunto de dados:<br />
{<br />
id           : ponteiros_integracoes_acessos.id,<br />
tipoDado     : ponteiros_integracoes_acessos.tipoDado,<br />
identificador: [<br />
cnpj          : ponteiros_integracoes_acessos.cnpj,<br />
cpf           : ponteiros_integracoes_acessos.cpf,<br />
outroDocumento: ponteiros_integracoes_acessos.outroDocumento<br />
],<br />
urlDados     : urlBase + '/v1/empresa' -&gt; urlBase é o valor do atributo 'akita.urlBase' do application.yml do gtsoft-rest-api<br />
}</p>
</li>
<li>
<p dir="auto">se a integração for de dados do prestador de serviço, enviará o conjunto de dados:<br />
{<br />
id                    : ponteiros_integracoes_acessos.id,<br />
tipoDado              : ponteiros_integracoes_acessos.tipoDado,<br />
identificador         : [<br />
rg            : ponteiros_integracoes_acessos.rg,<br />
ufRg          : ponteiros_integracoes_acessos.ufRg,<br />
cpf           : ponteiros_integracoes_acessos.cpf,<br />
outroDocumento: ponteiros_integracoes_acessos.outroDocumento,<br />
tcpId         : ponteiros_integracoes_acessos.tcpId<br />
],<br />
urlDados              : urlBase + '/v1/pessoa', -&gt; urlBase é o valor do atributo 'akita.urlBase' do application.yml do gtsoft-rest-api<br />
tipoOperacaoIntegracao: ponteiros_integracoes_acessos.tipoOperacaoIntegracao<br />
}</p>
</li>
<li>
<p dir="auto">dentro da akitasoft-rest-api/v1/AlteracaoGT, será feito o login no gtsoft-rest-api com o login e senha configurados no atributo gt.username e gt.password do application.tml do akitasoft-rest-api</p>
</li>
<li>
<p dir="auto">com o token da autenticacao, quando for integraão da empresa, o akitasoft-rest-api fará uma request para ponteiros_integracoes_acessos.urlBase(gtsoft-rest-api) + '/v1/empresa' passando os identificadores da empresa(cpf, cnpj, outro_documento) e o id da ponteiro como parametros</p>
</li>
<li>
<p dir="auto">a gtsoft-rest-api recebe a request v1/empresa e devolverá o conjunto:<br />
codEmpresa       : <a href="http://empresaPessoa.id" rel="nofollow ugc">empresaPessoa.id</a>,<br />
identificador    : [<br />
cnpj          : empresaPessoa.cnpj,<br />
cpf           : empresaPessoa.cpf,<br />
outroDocumento: empresaPessoa.codIdentificador<br />
],<br />
nomeEmpresa      : empresaPessoa.nomeEmpresa,<br />
statusAcesso     : resultado de as_bloq_empresa(<a href="http://empresaPessoa.id" rel="nofollow ugc">empresaPessoa.id</a>),<br />
inscricaoEstadual: empresaPessoa.inscricaoEstadual,<br />
tipoEmpresa      : empresaPessoa.tipoEmpresa,<br />
tipoPessoa       : empresaPessoa.tipoPessoa,<br />
telefone         : empresaPessoa.telefone,<br />
email            : empresaPessoa.email,<br />
contato          : empresaPessoa.contato,<br />
endereco         : empresaPessoa.endereco,<br />
cep              : empresaPessoa.cep,<br />
dataDesativacao  : empresaPessoa.dataEmpresaDesativada?.format(DATE_FORMATTER),<br />
dataInclusao     : empresaPessoa.dataInclusao.format(DATE_FORMATTER),<br />
observacao       : empresaPessoa.observacao,<br />
documentos       : docEmpresa,<br />
afastamentos     : afastamentosEmpresas(<a href="http://empresaPessoa.id" rel="nofollow ugc">empresaPessoa.id</a>, contratantes)</p>
</li>
<li>
<p dir="auto">docEmpresa são os registros da consulta:</p>
<pre><code>select distinct vde.cod_documento coddocumento 
           , tda.descr_documento descrdocumento 
           , as_bloq_documento_empresa(vde.cod_empresa, vde.cod_documento) statusdocumento 
           , as_bloq_empresa(vde.cod_empresa) statusacesso 
        from v_documentos_empresas    vde 
           , tipos_documentos_acessos tda 
       where vde.cod_empresa   = ${codEmpresa} 
         and tda.cod_documento = vde.cod_documento 
         and as_bloq_documento_empresa(vde.cod_empresa, vde.cod_documento) not in ('N','R','I')  
         and vde.emp_cnt_id is null 
 union 
select distinct vde.cod_documento coddocumento 
           , tda.descr_documento descrdocumento 
           , as_bloq_documento_empresa(vde.cod_empresa, vde.cod_documento) statusdocumento 
           , as_bloq_empresa(vde.cod_empresa, vde.emp_cnt_id) statusacesso 
        from v_documentos_empresas    vde 
           , tipos_documentos_acessos tda 
       where vde.cod_empresa   = ${codEmpresa} 
         and tda.cod_documento = vde.cod_documento 
         and as_bloq_documento_empresa(vde.cod_empresa, vde.cod_documento) not in ('N','R','I')  
         and vde.emp_cnt_id in (select rse.emp_cnt_id 
                                  from relacoes_servicos_empresas rse 
                                 where rse.cod_empresa = ${codEmpresa} 
                                   and rse.emp_cnt_id in (${contratantes.id.join(',')})
                                   and rse.data_inicial &lt;= trunc(sysdate) 
                                   and ( rse.data_final &gt;= trunc(sysdate) or rse.data_final is null ) ) 
         and vde.emp_cnt_id is not null; 
</code></pre>
</li>
<li>
<p dir="auto">afastamentosEmpresas são os registros da consulta:<br />
select to_char(ae.data_inicial,'yyyy-mm-dd') dataInicial<br />
, to_char(ae.data_final,'yyyy-mm-dd') dataFinal<br />
, rse.cod_empresa<br />
, mai.cod_motivo_integracao codMotivo<br />
from afastamentos_empresas ae<br />
, relacoes_servicos_empresas rse<br />
, motivos_afast_integracoes mai<br />
where ae.rlc_srv_em_id = <a href="http://rse.id" rel="nofollow ugc">rse.id</a><br />
and ae.maa_cod_motivo = mai.cod_motivo<br />
and mai.ec_id = rse.emp_cnt_id<br />
and ae.data_inicial &lt;= trunc(sysdate)<br />
and (ae.data_final is null or ae.data_final &gt;= trunc(sysdate))<br />
and rse.emp_cnt_id in (${contratantes.id.join(',')})<br />
and rse.cod_empresa = ${codEmpresa}</p>
</li>
<li>
<p dir="auto">o objeto contratantes, usando tanto para buscar os docs e afastamentos da empresa, são as contratantes retornadas na consulta:<br />
select id from empresas_contratantes where url_webhook_sistema_integrado = ponterios.url_webhook_sistema_integrado (url salva no ponteiro que está sendo integrado)</p>
</li>
<li>
<p dir="auto">com a gtsoft-rest-api retornando estes dados da empresa, a akitasoft-rest-api vai fazer:</p>
<ul>
<li>
<p dir="auto">insert/update da empresas_pessoas:</p>
<ul>
<li>se não houver uma empresas_pessoas com os identificadores do GT, vai fazer o insert:
<ul>
<li>
<p dir="auto">id -&gt; neste insert será sempre o código disponível pela function pack_proximo_codigo.empresa_pessoa</p>
</li>
<li>
<p dir="auto">cnpj -&gt; este e demais campos conforme o que foi cadastrado no GT</p>
</li>
<li>
<p dir="auto">cpf</p>
</li>
<li>
<p dir="auto">codIdentificador</p>
</li>
<li>
<p dir="auto">nomeEmpresa</p>
</li>
<li>
<p dir="auto">inscricaoEstadual</p>
</li>
<li>
<p dir="auto">telefone</p>
</li>
<li>
<p dir="auto">email</p>
</li>
<li>
<p dir="auto">contato</p>
</li>
<li>
<p dir="auto">endereco</p>
</li>
<li>
<p dir="auto">cep</p>
</li>
<li>
<p dir="auto">se já houver empresa cadastrada com os identificadores do GT, vai fazer o update nos campos:</p>
<ul>
<li>nomeEmpresa -&gt; este e demais campos conforme o que foi cadastrado no GT. Com isso, percebe-se que a integração da empresa não vai integrar os identificadores. Ou seja, se for necessário atualizar o cnpj, cpf ou cod_identificador no GT, será criada uma nova empresa no Akita nesta alteração do GT.</li>
<li>inscricaoEstadual</li>
<li>telefone</li>
<li>email</li>
<li>contato</li>
<li>endereco</li>
<li>cep</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>
<p dir="auto">delete em documentos_empresas_integracao para esse cod_empresa</p>
</li>
<li>
<p dir="auto">inserir em documentos_empresas_integracao cada documento com seu status de acesso conforme recebido em docEmpresa, quando status_acesso deste doc é diferente de 'N' - Liberado</p>
</li>
<li>
<p dir="auto">refazer os afastamentos de pessoas da empresa:</p>
<ul>
<li>se não tiver afastamentos, remove todos os afastamentos para as pessoas dessa empresa que estão com afastamentos de tipo_origem com vaor 'E'</li>
<li>pesquisa tipos_controles_pessoas sem data de desligamento na empresa em questão</li>
<li>pesquisa afastamentos de cada tipos_controles_pessoas encontrado, filtrando pelo codMotivo de cada afastamento</li>
<li>se localizar o afastamento no Akita que veio do GT, vai atualizar a data final caso esteja presente desta vez</li>
<li>se não localizar o afastamento no AKita que veio do GT, vai criar o afastamento dessa vez.</li>
<li>estes afastamentos de integração oriundos do cadastro da empresa, possuem o campo tipo_origem com valor 'E'</li>
</ul>
</li>
</ul>
</li>
<li>
<p dir="auto">se for integração de pessoa, com o token da autenticacao, o akitasoft-rest-api fará uma request para ponteiros_integracoes_acessos.urlBase(gtsoft-rest-api) + '/v1/pessoa' passando os identificadores da pessoa(cpf, rg/uf_rg, outro_documento) e o id da ponteiro como parametros</p>
</li>
<li>
<p dir="auto">a gtsoft-rest-api recebe a request v1/pessoa e devolverá o conjunto:<br />
{<br />
codPessoa       : <a href="http://pessoa.id" rel="nofollow ugc">pessoa.id</a>,<br />
identificador   : [<br />
rg            : pessoa.rg,<br />
ufRg          : pessoa.ufRg,<br />
cpf           : pessoa.cpf,<br />
outroDocumento: pessoa.outroDocumento<br />
],<br />
nomePessoa      : pessoa.nomePessoa,<br />
sexo            : pessoa.sexo,<br />
dataNascimento  : pessoa.dataNascimento?.format(DATE_FORMATER),<br />
nroCtps         : pessoa.nroCtps,<br />
serieCtps       : pessoa.serieCtps,<br />
ufCtps          : pessoa.ufCtps,<br />
cnhPessoa       : pessoa.cnhPessoa,<br />
validadeCnh     : pessoa.validadeCnh?.format(DATE_FORMATER),<br />
telefoneCelular : pessoa.telefoneCelular,<br />
contatoFamiliar : pessoa.contatoFamiliar,<br />
telefoneFamiliar: pessoa.telefoneFamiliar,<br />
cidade          : pessoa.cidade?.nome,<br />
endereco        : pessoa.endereco,<br />
bairro          : pessoa.bairro,<br />
obsDocumentos   : pessoa.obsDocumentos,<br />
codIntegracao   : pessoa.codIntegracao,<br />
nroSite         : packIntegracaoDao.getPlantaPadrao() -&gt; "select to_number(valor_parametro) nroSite from parametros_gerais where nome_parametro = 'NRO_SITE_PADRAO_AKITA'"<br />
empresas        : historicosPessoa<br />
}</p>
</li>
<li>
<p dir="auto">historicosPessoa são os registros retornados da consulta:<br />
select * from tipos_controles_pessoas<br />
where exists(select 1<br />
from relacoes_servicos_empresas   rse,<br />
relacoes_pessoas_contratantes   rpc,<br />
turnos_contratantes tuc<br />
where rse.cod_empresa   = this_.cod_empresa<br />
and   rse.data_inicial &lt;= trunc(sysdate)<br />
and  (rse.data_final   &gt;= trunc(sysdate) or rse.data_final is null )<br />
and   rse.emp_cnt_id    = tuc.emp_cnt_id<br />
and   rpc.tur_cnt_id    = <a href="http://tuc.id" rel="nofollow ugc">tuc.id</a><br />
and   rpc.tcp_id        = this_.id<br />
and   rpc.data_inicial &lt;= trunc(sysdate)<br />
and  (rpc.data_final   &gt;= trunc(sysdate) or rpc.data_final is null )<br />
and   rse.emp_cnt_id   in (pcontratantes) )</p>
</li>
<li>
<p dir="auto">o objeto pcontratantes, usa na consulta dos históricos, são as contratantes retornadas na consulta:<br />
select id from empresas_contratantes where url_webhook_sistema_integrado = ponterios.url_webhook_sistema_integrado (url salva no ponteiro que está sendo integrado)</p>
</li>
<li>
<p dir="auto">ou seja, só retorna os históricos com turno ativo e contrato de serviço ativo na contratante que integra dados</p>
</li>
<li>
<p dir="auto">continuando, o objeto historicosPessoa é uma lista com os históricos da pessoa. Cada histórico possui o seguinte conjunto:<br />
{<br />
codEmpresa          : tcp.codEmpresa,<br />
cnpj                : ep.cnpj, -&gt; dado da empresa do histórico<br />
cpf                 : ep.cpf, -&gt; dado da empresa do histórico<br />
outroDocumento      : ep.codIdentificador, -&gt; dado da empresa do histórico<br />
tcpId               : <a href="http://tcp.id" rel="nofollow ugc">tcp.id</a>,<br />
tipoPessoa          : packIntegracaoDao.trataTipoPessoa(<a href="http://tcp.tipoPessoa.id" rel="nofollow ugc">tcp.tipoPessoa.id</a>, contratantes), -&gt; com base no tipo de pessoa do histórico, usa o valor da consulta: select tpi.tipo_pessoa_integracao codTipo from tipos_pessoas_integracoes tpi where tpi.tipo_pessoa = ${<a href="http://tcp.tipoPessoa.id" rel="nofollow ugc">tcp.tipoPessoa.id</a>} and tpi.ec_id in (${pcontratantes}). Ou seja, este atributo vai conter o valor do tipo_pessoa lá do Akita, baseado no cadastro do de-para da tela GT0115.<br />
email               : tcp.email,<br />
dataCadastro        : tcp.dataCadastro.format(DATE_FORMATER),<br />
dataAdmissao        : tcp.dataAdmissao.format(DATE_FORMATER),<br />
dataDesligamento    : tcp.dataDesligamento?.format(DATE_FORMATER),<br />
statusAcesso        : statusAcesso, -&gt; resultado da consulta: select as_bloq_pessoa(cod_pessoa, tcp_id) status from dual<br />
documentos          : documentos,<br />
afastamentos        : packIntegracaoDao.trataAfastamentoPessoa(afastamento, contratantes),<br />
turnos              : turnos,<br />
liberacoesExtraTurno: liberacoes<br />
}</p>
</li>
<li>
<p dir="auto">o objeto documentos, presente em cada historicoPessoa, será o resultado da consulta:<br />
select distinct tda.cod_documento coddocumento<br />
, tda.descr_documento descrdocumento<br />
, as_bloq_documento_pessoa(pdp.cod_pessoa,tda.cod_documento, pdp.tcp_id,null,null) statusdocumento<br />
, as_bloq_pessoa(pdp.cod_pessoa,pdp.tcp_id) statusacesso<br />
from v_periodos_documentos_pessoas pdp<br />
, tipos_documentos_acessos      tda<br />
where pdp.cod_documento = tda.cod_documento<br />
and as_bloq_documento_pessoa(pdp.cod_pessoa,tda.cod_documento, pdp.tcp_id,null,null) not in ('N','R','I')<br />
and pdp.cod_pessoa              = ${codPessoa}<br />
and pdp.tcp_id                  = ${tcpId}<br />
and pdp.id_empresa_contratante is null<br />
union<br />
select distinct tda.cod_documento coddocumento<br />
, tda.descr_documento descrdocumento<br />
, as_bloq_documento_pessoa(pdp.cod_pessoa,tda.cod_documento, pdp.tcp_id,null,null) statusdocumento<br />
, as_bloq_pessoa(pdp.cod_pessoa,pdp.tcp_id,pdp.id_empresa_contratante) statusacesso<br />
from v_periodos_documentos_pessoas pdp<br />
, tipos_documentos_acessos      tda<br />
where pdp.cod_documento = tda.cod_documento<br />
and as_bloq_documento_pessoa(pdp.cod_pessoa,tda.cod_documento, pdp.tcp_id,null,null) not in ('N','R','I')<br />
and pdp.cod_pessoa              = ${codPessoa}<br />
and pdp.tcp_id                  = ${tcpId}<br />
and pdp.id_empresa_contratante in ( select rse.emp_cnt_id<br />
from relacoes_servicos_empresas rse<br />
where rse.cod_empresa = ${codEmpresa}<br />
and rse.emp_cnt_id in (${pcontratantes})<br />
and rse.data_inicial &lt;= trunc(sysdate)<br />
and ( rse.data_final &gt;= trunc(sysdate) or rse.data_final is null ) )<br />
and pdp.id_empresa_contratante is not null;</p>
</li>
<li>
<p dir="auto">o objeto packIntegracaoDao.trataAfastamentoPessoa(afastamento, contratantes) vem de um processamento dos afastamentos vigentes do histórico:<br />
Pesquisa os afastamentos que estão ativos para a pessoa, e cada um desses afastamentos tem o codMotivo trocado pelo codMotivo que está configurado no de-para de motivos de afastamentos. Sendo assim, se a pessoa tem afastamento com codMotivo 1, mas o codMotivo 1 é codMotivo 2 no Akita, conforme o de-para, este afastamento listado aqui terá o codMotivo 2 sendo exibido. Esse de-para sempre leva em conta as contratantes do objeto pcontratantes.</p>
</li>
<li>
<p dir="auto">o objeto turnos vem da consulta:<br />
select to_char(rpc.data_inicial, 'dd/mm/yyyy') data_inicial<br />
, to_char(rpc.data_final, 'dd/mm/yyyy') data_final<br />
, rpc.utiliza_refeitorio<br />
, rpc.utiliza_transporte<br />
, tc.cod_perfil_akita<br />
, <a href="http://tc.id" rel="nofollow ugc">tc.id</a> codTurno<br />
from relacoes_pessoas_contratantes rpc<br />
, turnos_contratantes tc<br />
where rpc.tur_cnt_id = <a href="http://tc.id" rel="nofollow ugc">tc.id</a><br />
and tc.emp_cnt_id in (${pcontratantes})<br />
and (rpc.data_final &gt;=  trunc(sysdate)<br />
or rpc.data_final is null)<br />
and rpc.data_inicial &gt;= (select max(rpc2.data_inicial)<br />
from relacoes_pessoas_contratantes rpc2<br />
, turnos_contratantes tc2<br />
where rpc2.tur_cnt_id = <a href="http://tc2.id" rel="nofollow ugc">tc2.id</a><br />
and rpc2.tcp_id = rpc.tcp_id<br />
and tc2.emp_cnt_id in (${pcontratantes}))<br />
and rpc.tcp_id = ${tcpId}</p>
</li>
<li>
<p dir="auto">o objeto liberacoes vem da consulta:<br />
select slp.tcp_id<br />
, to_char(sl.data_inicial, 'yyyy-mm-dd')<br />
, to_char(sl.data_final, 'yyyy-mm-dd')<br />
, to_char(sl.hora_final,'hh24:mi') horaFinal<br />
, to_char(sl.hora_inicial,'hh24:mi')<br />
from solicitacoes_liber_pessoas slp<br />
, solicitacoes_liberacoes sl<br />
where <a href="http://sl.id" rel="nofollow ugc">sl.id</a> = slp.slc_lbr_id<br />
and sl.data_inicial &gt;= trunc(sysdate)<br />
and sl.status = 'A'<br />
and slp.aprovado = 'S'<br />
and slp.tcp_id = $tcpId<br />
order by sl.data_inicial</p>
</li>
<li>
<p dir="auto">com a gtsoft-rest-api retornando estes dados da pessoa, a akitasoft-rest-api vai fazer para cada histórico recebido (cada conjunto de turnos, liberacoes etc. dentro do objeto da pessoa):</p>
<ul>
<li>insert na intfol_cadastros_pessoas com os dados  da pessoa e do historico</li>
<li>atualiza os dados da empresa do histórico direto no cadastro de empresas_pessoas, para a empresa sempre estar sincronizada entre gt e akita</li>
<li>busca o cadastro da pessoa na base do akita. Se a pessoa ainda não existe para o cpf, rg e outro_documento informado no GT, vai inserir a pessoa no akita e junto o histórico conforme os dados recebidos do gtsoft-rest-api</li>
<li>se a pessoa já existe, caso o tipo_operacao_integracao da ponteiros tiver o valor 'H', a akitasoft-rest-api vai buscar o histórico no akita conforme os dados do histórico do GT. Se não houver histórico cadastrado, que pode ser o caso de uma inclusão de histórico no GT para uma controles_pessoas já cadastrada, a API vai inserir este novo histórico no akita.</li>
<li>se a pessoa já existe, o histórico do GT já existe no Akita, os unicos dados do histórico que são atualizados serão a data_desligamento, tipo_pessoa e email quando necessário.</li>
<li>durante a atualização do histórico, os dados da controles_pessoas que foram alterados no GT também já são atualizados no Akita.</li>
<li>se a tipo_operacao_integracao tiver valor 'C', vai apenas atualizar a controles_pessoas e ignorar as verificações e atualizações da tipos_controles_pessoas.</li>
</ul>
</li>
<li>
<p dir="auto">caso o tipo_operacao_integracao for igual a 'T', os turnos serão sincronizados. Isto é, cada turno do GT será um perfis_acessos_pessoas para o histórico da pessoa integrada.</p>
</li>
<li>
<p dir="auto">caso o tipo_operacao_integracao for igual a 'A', os afastamentos serão sincronizados. Isto é, se não há afastamentos vindos do GT, os afastamentos do Akita são removidos. Cada afastamento vindo do GT ou será incluído no Akita, caso ainda não esteja na base, ou atualizado, setando a dataFinal do Akita conforme a que foi atualizada no GT. Aqui é levado em conta o codMotivo do de-para.</p>
</li>
<li>
<p dir="auto">caso o tipo_operacao_integracao for igual a 'L', as liberações de acesso serão sincronizadas.</p>
<ul>
<li>as liberações sincronizadas levarão em conta o codMotivo da liberação conforme o retorno do select: select cod_motivo motivo from motivos_liberacoes d where indica_integracao_terceiro = 'S'. Então somente as liberações de integração de terceiro que são sincronizadas entre as duas bases.</li>
<li>a sincronização remove o que já existe de liberação para a pessoa nas datas vindas do GT e reinsere com essas datas corretas conforme o GT. Aqui será sempre delete seguido de insert, sem ocorrer updates.</li>
</ul>
</li>
<li>
<p dir="auto">caso o tipo_operacao_integracao for igual a 'D', os documentos do histórico da pessoa serão integrados.</p>
</li>
<li>
<p dir="auto">faz delete em documentos_pessoas_integracao para os registros da tcp_id deste histórico sendo integrado</p>
</li>
<li>
<p dir="auto">para cada documento do objeto documentos vindos da integração, será um insert na documentos_pessoas_integracao com a situação atual desse documento, caso o status de acesso for diferente de 'N' - Liberado.</p>
</li>
<li>
<p dir="auto">agora, já quase no final do fluxo, a API sincroniza a informação de "Utiliza Refeitório" do histórico integrado.</p>
<ul>
<li>faz uma request para gtsoft-rest-api/v1/tiposControlesPessoas, passando codPessoa e codEmpresa. Essa request vai devolver os históricos do GT dessa pessoa e empresa, com a informação do campo utilizaRefeitório do histórico no GT.</li>
<li>cada histórico dessa request também é um histórico no akita, então caso esse histórico do GT usa refeitório, será feito um insert na setores_Acessos_pessoas, garantindo acesso aos refeitórios da planta deste histórico, com data inicial igual a data de cadastro deste histórico e também tipoLiberacao = 'I'.</li>
</ul>
</li>
<li>
<p dir="auto">por fim, após ter realizado todas as integrações necessárias, executa a proc_atz_perfil_pessoa com o cod_pessoa que foi sincronizado no akita.</p>
</li>
<li>
<p dir="auto">caso tenha chego até aqui, a ponteiro do GT será atualizada com a situação 2 de Ok.</p>
</li>
<li>
<p dir="auto">durante os fluxos da integração, caso ocorra erro, a ponteiro é atualizada com situação 2 de Erro, junto com o campo descricao_erro e data_hora_processamento para facilitar a identificação do problema ocorrido.</p>
</li>
</ul>
]]></description><link>http://insoft-docker1:4567/topic/395/integração-gt-x-akita-no-formato-cloud-gtsoft-rest-api-e-akitasoft-rest-api</link><generator>RSS for Node</generator><lastBuildDate>Fri, 23 Oct 2026 08:16:07 GMT</lastBuildDate><atom:link href="http://insoft-docker1:4567/topic/395.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 17 Jun 2025 19:04:09 GMT</pubDate><ttl>60</ttl></channel></rss>