Ir para o conteúdo principal

ProtheusClientePadrao (STATUS: PARCIAL)

Documentação Técnica

Nome do cliente TO-DO
Nome do projeto TO-DO
Biblioteca wosk_protheus_cliente_padrao
Token da Biblioteca
31e42d08-2d8e-4d74-b4ec-e66ef85f3c66
URL de Produção
https://isnapp.illimitar.pro/bibliotecas/31e42d08-2d8e-4d74-b4ec-e66ef85f3c66/wosk_protheus_cliente_padrao
URL de Homologação https://hmg-isnapp.illimitar.pro/bibliotecas/31e42d08-2d8e-4d74-b4ec-e66ef85f3c66/wosk_protheus_cliente_padrao
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_protheus_padrao/wosk_protheus_padrao.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: capturar (de forma pontual/manual) registros de clientes da fonte SQL WOSK_SERVICO_ENVIA_PROTHEUS_CLIENTES_PADRAO e enfileirar cada registro para integração assíncrona.
    - Disparo: operação manual via Monitor::capturar(chave).
    - Observação crítica: o método Monitor::run() está vazio neste arquivo; portanto, não há captura automática/cron implementada aqui.

    No fluxo manual, para cada chave informada, o processo:
    - Reaproveita token existente na fila (quando houver item já criado) consultando Queue::get('', chave).
    - Consulta a fonte SQL filtrando por A1_LOJA e A1_COD.
    - Sanitiza o registro com trim() recursivo em todos os campos.
    - Reestrutura o controle de posicionamento (novoFiltro) com A1_LOJA, A1_COD e DATA_PARA_TRANSFERENCIA (normalizada).
    - Monta a chave da fila no formato A1_LOJA-A1_COD e enfileira via Queue::set() com status Aguardando Integração e situacao = 0.


    2. DADOS NECESSÁRIOS PARA O ENDPOINT

    Não há endpoint (WebService) implementado neste arquivo. Para o Monitor, os dados necessários são:

    Entrada do processo manual:
    - Parâmetro chave: string ou array.
    - Formato obrigatório da chave: A1_LOJA-A1_COD.
    - Regra: se a chave não possuir exatamente 2 segmentos, o processo lança exceção (Chave inválida).

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

    Campos capturados (conjunto completo do viewQuery):
    - Identificação: A1_COD, A1_LOJA
    - Cadastro: CGC_CPF, 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


    3. REESTRUTURAÇÃO DOS DADOS

    3.1 Recuperação do estado do monitor
    Momento: Não aplicado no fluxo atual (run() vazio).
    - O controle de estado existe via Monitor::get()/Monitor::set(), persistindo em wosk_monitor quando utilizado por integrações que exigem retomada/continuidade.

    3.2 Reset ao iniciar execução
    Momento: Não aplicado no fluxo atual (run() vazio).

    3.3 Normalização dos filtros
    Momento: Pré-consulta no fluxo manual (capturar()).
    - Deriva filtros diretamente da chave: A1_LOJA e A1_COD.

    3.4 Atualização do estado para EXECUTANDO
    Momento: Não aplicado no fluxo atual (não persiste situacao no capturar()).

    3.5 Paginação dos registros
    Momento: Não aplicável.
    - A consulta manual filtra por chave e processa o resultado via fetch() sem paginação/offset.

    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 o registro (fluxo manual).
    - Define novoFiltro['A1_LOJA'] e novoFiltro['A1_COD'] com valores do registro.
    - Normaliza novoFiltro['DATA_PARA_TRANSFERENCIA'] para Y-m-d H:i:s.

    3.8 Enfileiramento
    Momento: Dentro do loop do capturar().
    - Monta key no padrão A1_LOJA-A1_COD.
    - Enfileira via Queue::set(key, registro, [], 'Aguardando Integração', ...).
    - Reaproveita token se o item já existir na fila (obtido via Queue::get).

    3.9 Atualização incremental da posição
    Momento: Não aplicável.
    - O fluxo manual não atualiza offset/chave_posicao em wosk_monitor.

    3.10 Finalização
    Momento: Final do capturar().
    - Não há persistência de encerramento do monitor (situação) neste fluxo manual; a finalização é implícita após enfileirar.

    3.11 Tratamento de erro
    Momento: catch(Exception) do capturar().
    - Registra erro via errorByexception e encerra o processamento do lote atual.


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

    4.1 Controle do monitor
    Momento: Quando Monitor::set() é utilizado (não ocorre no capturar()).
    - Tabela persistida (implementação da trait wosk_monitor): {$this->bancoIntegrador}.wosk_monitor.
    - Campos persistidos: token, evento, offset, filtro, chave_posicao, situacao, data_posicao, data_iniciado.

    4.2 Fila de integração
    Momento: Enfileiramento (3.8).
    - Tabela persistida (biblioteca wosk_queue): {$this->bancoIntegrador}.wosk_queue.


    5. RESULTADO DO PROCESSAMENTO

    Execução normal:
    - Itens gravados na fila com status Aguardando Integração para processamento posterior pela Queue.

    Execução com erro:
    - O erro é registrado e o item pode deixar de ser enfileirado (dependendo do ponto de falha).


    6. OPERAÇÃO MANUAL – capturar()

    Objetivo: enfileirar manualmente um ou mais clientes para integração, usando chave conhecida.

    Fluxo:
    - Entrada: chave string ou array, no padrão A1_LOJA-A1_COD.
    - Para cada chave:
        - Consulta a fila para reaproveitar token (quando existir).
        - Consulta a fonte SQL filtrando por A1_LOJA e A1_COD.
        - Sanitiza o registro com trim() recursivo.
        - Enfileira via Queue::set() com status Aguardando Integração e situacao = 0.

    Queue

    Processo:
    1. DESCRIÇÃO DO FLUXO

    - Responsabilidade: consumir um item da fila, reestruturar/normalizar o payload para o padrão Protheus e executar o envio, persistindo retorno, tempo e status na própria fila.
    - Disparo: execução agendada (cron) chamando Queue::run(token).

    Ao iniciar, o processo busca um item via get(token). Se houver registro:
    - Atualiza o mesmo para status Enviando e situacao = 1 antes do envio (marcando consumo em andamento).
    - Converte o conteúdo persistido em payload de integração via getConteudo() (internamente _getConteudo), aplicando o mapeamento definido em $field.

    Transformações e normalizações pré-envio (aplicadas no payload Protheus):
    - A1_NOME e A1_NREDUZ: remove o caractere | e remove 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: JSON: NÃO HOUVE RESPOSTA.
    - Se resposta não for array ou não contiver Mensagem → erro: JSON: NÃO FOI POSSÍVEL DECODIFICAR A RESPOSTA.
    - Situação final do item:
        - 2 quando sucesso (sem code e Mensagem diferente de ERRO).
        - 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 como integrado via setProtheusClienteIntegrado(chave, true) e sinaliza remoção de itens correlatos na fila.
    - Pós-sucesso (limpeza de fila): tenta remover registros relacionados em wosk_queue para as ações ProtheusCliente (por SUBSTRING_INDEX(chave, '-', 2)) e ProtheusClienteFull (por chave), evitando duplicidade de processamento.

    Persistência do status do item (fila):
    - Atualiza o item com retorno, mensagem, dump de requisição (_CURL_DUMP), tempo e situação final (2 ou 4).

    Notificação de erros:
    - O método notificar() consulta itens com acao = 'ProtheusClientePadrao' e situacao = 4 na tabela wosk_queue, formata a mensagem e aciona o mecanismo interno de notificação (_getNotificarErros).


    2. DADOS NECESSÁRIOS PARA O ENDPOINT

    Não há endpoint (WebService) implementado neste arquivo. Para a Queue, os dados necessários são os itens persistidos na fila.

    Estrutura do item de fila (campos utilizados neste arquivo):
    - token: identificador do item para consumo.
    - acao: ProtheusClientePadrao.
    - chave: A1_LOJA-A1_COD.
    - conteudo: registro completo capturado (campos do cliente).
    - data_adicionado: data/hora de captura 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.

    3.3 Normalização do payload
    Momento: Pré-envio
    - Aplica mapeamento de campos via $field durante getConteudo().

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

    3.5 Paginação dos registros
    Momento: Não aplicável (processa 1 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).

    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 item na fila com retorno, mensagem, dump e tempo.

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


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

    4.1 Controle do monitor
    Momento: Não aplicável para esta classe (não grava wosk_monitor).

    4.2 Fila de integração
    Momento: Durante todo o ciclo do item (get/set).
    - Tabela persistida: {$this->bancoIntegrador}.wosk_queue.
    - Atualização de log (em falhas internas da infraestrutura): {$this->bancoIntegrador}.wosk_queue_log (biblioteca wosk_queue).


    5. RESULTADO DO PROCESSAMENTO

    Execução normal:
    - Item atualizado para situacao = 2, com retorno persistido e cliente marcado como integrado.

    Execução com erro:
    - Item atualizado para situacao = 4, com retorno/mensagem persistidos para auditoria e notificação.


    6. OPERAÇÃO MANUAL – capturar()

    Não aplicável para esta classe (a operação manual está na classe Monitor).

    Fluxo do Processo

    Diagrama sem nome.jpg

    Critérios de Aceitação

    Processo Subprocesso Descrição Situação esperada