Ir para o conteúdo principal

ProtheusCliente (STATUS: PARCIAL)

Documentação Técnica

Nome do cliente TO-DO
Nome do projeto TO-DO
Biblioteca wosk_protheus_cliente
Token da Biblioteca
04c0adf0-ee2a-4f36-aa5a-358420676cb6
URL de Produção
https://isnapp.illimitar.pro/bibliotecas/04c0adf0-ee2a-4f36-aa5a-358420676cb6/wosk_protheus_cliente
URL de Homologação https://hmg-isnapp.illimitar.pro/bibliotecas/04c0adf0-ee2a-4f36-aa5a-358420676cb6/wosk_protheus_cliente
Data 23/02/2026

Sumário


    Histórico de Versões

    Data Versão Modificado por Descrição da Mudança
    23/02/2026 1.0 Maykon/Gustavo Documentação inicial

    Descrição Geral dos Processos

    Escopo deste arquivo:

    - Este documento foi gerado exclusivamente a partir de wosk_protheuscliente/protheusCliente.php.
    - Classes presentes neste arquivo: Monitor e Queue.
    - Classe ausente neste arquivo: Webservice (não há endpoint implementado aqui).

    Monitor

    Processo: 
    1. DESCRIÇÃO DO FLUXO

    - Responsabilidade: executar captura incremental de clientes a partir de uma fonte SQL e enfileirar cada registro para processamento assíncrono.
    - Disparo: execução agendada (cron) chamando Monitor::run().

    Ao iniciar, o processo carrega o estado persistido do monitor via get("ProtheusCliente"), obtendo:
    - data_posicao, data_iniciado, offset, chave_posicao, filtro, token e situacao.

    Regras de continuidade:
    - Se situacao = 2 (Concluído) → redefine para 0 (Parado) e permite nova execução.
    - Se situacao estiver em [0, 1] → inicia/continua o processamento.

    Quando inicia a partir de estado não-executando (situacao ≠ 1):
    - dataPosicao ← agora
    - dataIniciado ← agora
    - offset ← 0
    - chavePosicao ← vazio

    Em seguida, normaliza o filtro (garantindo defaults) e define a data mínima de captura:
    - A1_LOJA, A1_COD, CGC_CPF → string vazia quando ausente
    - DATA_PARA_TRANSFERENCIA → se ausente, define 2023-05-01 00:00:00

    O monitor executa paginação com OFFSET/FETCH NEXT usando limite configurado em woskLimiteCaptura::ProtheusCliente, consultando a fonte WOSK_SERVICO_ENVIA_PROTHEUS_CLIENTES com:
    - WHERE DATA_PARA_TRANSFERENCIA >= filtro.DATA_PARA_TRANSFERENCIA
    - ORDER BY DATA_PARA_TRANSFERENCIA ASC

    Para cada registro retornado:
    - Sanitiza os valores com trim() (recursivo em todos os campos).
    - Atualiza o filtro de posição (A1_LOJA, A1_COD, CGC_CPF, DATA_PARA_TRANSFERENCIA).
    - Monta a chave da fila no formato: A1_LOJA-A1_COD-CGC_CPF.
    - Enfileira via Queue::set() com status Aguardando Integração e situacao = 0.
    - Persiste incrementalmente offset, chavePosicao e dataPosicao após enfileirar.

    Encerramento:
    - Quando não há mais registros, marca o monitor como situacao = 2 (Concluído) e persiste o último filtro efetivo.

    Em caso de erro (catch):
    - Marca o monitor como situacao = 4 (Problema).
    - Armazena a mensagem em filtro.ERRORS[] com data e descrição do erro.


    2. DADOS NECESSÁRIOS PARA O ENDPOINT

    Não há endpoint (WebService) implementado neste arquivo. Para o Monitor, os dados de entrada são originados da fonte SQL consultada em viewQuery.

    Fonte de dados:
    - View/Tabela lógica: WOSK_SERVICO_ENVIA_PROTHEUS_CLIENTES

    Campos capturados (conjunto completo):
    - Identificação: A1_COD, A1_LOJA, CGC_CPF
    - Cadastro: NOME, PESSOA, NOME_REDUZ, TIPO, STATUS
    - Endereço: ENDERECO, BAIRRO, COMPLEMENTO, UF, CEP, COD_MUNICIPIO_IBGE
    - Contato: DDI, DDD, TELEFONE, CONTATO, EMAIL
    - Documentos/Complementos: A1_PFISICA, A1_INSCR, INSC_MUNICIPAL, DATA_NASC
    - País/Tributos/Outros: COD_PAIS_SISCOMEX, COD_PAIS_BC, A1_CONTA, A1_CONTRIB, A1_TPESSOA, A1_SUFRAMA, A1_CALCSUF, A1_CODMUN
    - Controle incremental: DATA_PARA_TRANSFERENCIA

    Observação: no fluxo automático (run()), apenas DATA_PARA_TRANSFERENCIA é aplicada na cláusula WHERE da consulta (os demais filtros são normalizados e persistidos como estado).


    3. REESTRUTURAÇÃO DOS DADOS

    3.1 Recuperação do estado do monitor
    Momento: Início do run()
    - Lê estado via get("ProtheusCliente") (offset, chave, datas, filtro, token, situação).
    - Regra: se situacao = 2, redefine para 0 antes de prosseguir.

    3.2 Reset ao iniciar execução
    Momento: Quando situacao ≠ 1
    - Reseta dataPosicao, dataIniciado, offset e chavePosicao para reinício controlado.

    3.3 Normalização dos filtros
    Momento: Antes da query
    - Preenche A1_LOJA, A1_COD, CGC_CPF com string vazia quando ausente.
    - Define DATA_PARA_TRANSFERENCIA:
        - informado → convertido para datetime e formatado
        - ausente → 2023-05-01 00:00:00

    3.4 Atualização do estado para EXECUTANDO
    Momento: Antes da consulta
    - Persiste situacao = 1 com o estado atual (offset, chave, datas, filtro, token).

    3.5 Paginação dos registros
    Momento: Execução da query
    - Ordena por DATA_PARA_TRANSFERENCIA ASC.
    - Aplica paginação com OFFSET baseado no estado e FETCH NEXT no limite configurado.

    3.6 Sanitização dos dados
    Momento: Ao ler cada registro (loop de fetch)
    - Aplica trim() recursivamente em todos os campos do registro.

    3.7 Atualização do filtro de posição
    Momento: Após ler cada registro
    - Atualiza novoFiltro com os campos-chave do registro e a DATA_PARA_TRANSFERENCIA normalizada.

    3.8 Enfileiramento
    Momento: Dentro do loop de registros
    - Monta chave no padrão A1_LOJA-A1_COD-CGC_CPF.
    - Enfileira com Queue::set(chave, registro, ...).
    - Status gravado: Aguardando Integração.
    - Situação gravada: 0.

    3.9 Atualização incremental da posição
    Momento: Após inserir na fila
    - offsetoffset + 1
    - chavePosicaochave
    - dataPosicaoDATA_PARA_TRANSFERENCIA
    - Persiste o estado imediatamente para garantir retomada em caso de interrupção.

    3.10 Finalização
    Momento: Encerramento do loop
    - Persiste situacao = 2 com o último novoFiltro (estado efetivo de posição).

    3.11 Tratamento de erro
    Momento: catch(Exception)
    - Adiciona registro em filtro.ERRORS[] contendo DATE e MESSAGE.
    - Persiste situacao = 4 (Problema).


    4. PERSISTÊNCIA DOS DADOS (BANCO DE DADOS)

    4.1 Controle do monitor
    Momento: Durante a execução e finalização do run()
    - Persistência ocorre via Monitor::set() (método _set da biblioteca wosk_monitor).
    - Campos persistidos (visíveis neste arquivo): offset, chave_posicao, data_posicao, filtro, situacao, data_iniciado, token.
    - Tabela/estrutura física do armazenamento: não há SQL explícito neste arquivo, portanto o nome da tabela não está identificado aqui.

    4.2 Fila de integração
    Momento: Enfileiramento (3.8)
    - Operação executada por Queue::set() (persistência interna via biblioteca wosk_queue).
    - Tabela explicitamente referenciada neste arquivo: wosk_queue (consultas e notificação de erros).


    5. RESULTADO DO PROCESSAMENTO

    Execução normal:
    - Monitor marcado como Concluído (2) ao final.
    - Registros enfileirados com status Aguardando Integração para processamento posterior.

    Execução com erro:
    - Monitor marcado como Problema (4).
    - Erro registrado em filtro.ERRORS[].


    6. OPERAÇÃO MANUAL – capturar()

    Objetivo: capturar (re-enfileirar) manualmente um ou mais clientes a partir da chave.

    Fluxo:
    - Entrada: chave string ou array, no padrão A1_LOJA-A1_COD[-CGC_CPF].
    - Para cada chave:
        - Consulta a fila via Queue::get('', chave) para reaproveitar token quando existir.
        - Consulta a fonte por A1_LOJA, A1_COD e opcionalmente CGC_CPF.
        - Sanitiza com trim() e enfileira via Queue::set() com o token reaproveitado.

    Queue

    Processo:
    1. DESCRIÇÃO DO FLUXO

    - Responsabilidade: consumir um item da fila, transformar/normalizar o payload e enviar para o Protheus, registrando retorno e status na própria fila.
    - Disparo: execução agendada (cron) chamando Queue::run(token).

    Ao iniciar, a fila busca um registro via get(token). Se houver registro, atualiza o mesmo para status Enviando e situacao = 1 antes do envio.

    Montagem e transformação do payload:
    - O conteúdo armazenado na fila é convertido em estrutura de envio por getConteudo() (internamente _getConteudo), usando o mapeamento de campos definido em $field.
    - Normalizações aplicadas antes do envio:
        - A1_NOME e A1_NREDUZ: remove | e acentos.
        - A1_END, A1_BAIRRO, A1_CONTATO: remove acentos.
        - A1_CODPAIS: converte para inteiro e aplica zero-pad à esquerda até 5 dígitos.

    Envio ao Protheus:
    - Executa integração via setProtheus("cliente", payload, "POST", headers).
    - Header aplicado: tenantId no formato "01,01SD0001" (derivado de 01SD0001).

    Validação e classificação do retorno:
    - Se não houver resposta → erro.
    - Se resposta não for array ou não contiver Mensagem → erro.
    - situacao final do item:
        - 2 quando sucesso.
        - 4 quando houver code no retorno ou quando Mensagem = "ERRO".
    - mensagem gravada prioriza Mensagem Detalhada (quando presente).

    Ações adicionais por resultado:
    - Sucesso (situacao = 2): marca o cliente como integrado via setProtheusClienteIntegrado("A1_LOJA-A1_COD", true).
    - Erro (situacao = 4): tenta reprocesso alternativo acionando WOSK\\ProtheusClientePadrao\\Monitor::capturar() para a mesma chave (estratégia de fallback). Se existir item correspondente na fila com acao = 'ProtheusClientePadrao' e token, o registro atual pode ser removido do fluxo original.

    Persistência do status do item (fila):
    - Em fluxo padrão, ao final atualiza o mesmo registro com retorno, mensagem, dump de requisição (_CURL_DUMP), tempo e situação final.
    - Em caso de remoção condicional (erro + fallback capturado), executa exclusão via setProtheusExcluir(['ProtheusCliente'], 'chave', chave).


    2. DADOS NECESSÁRIOS PARA O ENDPOINT

    Não há endpoint (WebService) implementado neste arquivo. Para a Queue, os dados de entrada são os registros persistidos na fila.

    Estrutura do item de fila (visível pelo uso neste arquivo):
    - token: identificador do item para consumo.
    - chave: A1_LOJA-A1_COD-CGC_CPF.
    - conteudo: registro completo capturado pelo monitor (campos do cliente).
    - data_adicionado: referência temporal gravada no enfileiramento.


    3. REESTRUTURAÇÃO DOS DADOS

    3.1 Recuperação do item de fila
    Momento: Início do run(token)
    - Lê item via get(token).

    3.2 Reset ao iniciar execução
    Momento: Antes do envio
    - Atualiza o item para status Enviando e situacao = 1 para indicar consumo em andamento.

    3.3 Normalização do payload
    Momento: Pré-envio
    - Aplica mapeamento de campos via $field durante a preparação do conteúdo.

    3.4 Atualização do estado para EXECUTANDO
    Momento: Pré-requisição
    - Mantém o item como situacao = 1 até concluir o envio e classificar o retorno.

    3.5 Paginação dos registros
    Momento: Não aplicável (a Queue processa um item por execução).

    3.6 Sanitização dos dados
    Momento: Pré-envio ao Protheus
    - Remove acentos e caracteres | em campos textuais.
    - Normaliza A1_CODPAIS para 5 dígitos com zero-pad.

    3.7 Atualização do filtro de posição
    Momento: Não aplicável (controle de posição é do Monitor).

    3.8 Envio / Integração
    Momento: Envio ao Protheus
    - Dispara setProtheus('cliente', payload, 'POST', headers) com tenantId configurado.

    3.9 Atualização incremental da posição
    Momento: Não aplicável (não há offset nesta classe).

    3.10 Finalização
    Momento: Pós-resposta do Protheus
    - Define situacao final (2 ou 4) e atualiza o registro da fila com retorno, mensagem, dump e tempo.

    3.11 Tratamento de erro
    Momento: catch(Exception) interno do processamento do item
    - Registra erro no retorno, define situacao = 4 e persiste a mensagem no item de fila.


    4. PERSISTÊNCIA DOS DADOS (BANCO DE DADOS)

    4.1 Controle do monitor
    Não aplicável (esta classe não persiste estado de monitor).

    4.2 Fila de integração
    - Tabela explicitamente referenciada neste arquivo: wosk_queue.
    - Atualizações ocorrem via Queue::set() em fases distintas:
        - Pré-envio: status Enviando, situacao = 1
        - Pós-envio: persistência de retorno, mensagem, dump de requisição, tempo e situacao final


    5. RESULTADO DO PROCESSAMENTO

    Execução normal:
    - Item de fila finaliza com situacao = 2 e registra retorno do Protheus.

    Execução com erro:
    - Item de fila finaliza com situacao = 4 e registra a mensagem de erro.
    - Pode acionar fallback para captura por ProtheusClientePadrao e, se confirmado, remover o item do fluxo original.


    6. OPERAÇÃO MANUAL

    Não há operação manual específica nesta classe além do consumo via run(token). A notificação de erros é realizada por notificar(), que consulta itens com situacao = 4 e envia e-mail para uma lista fixa de destinatários.

    Fluxo do Processo

    Diagrama sem nome.jpg

    Critérios de Aceitação

    Processo Subprocesso Descrição Situação esperada