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 (semnão há endpoint implementado aqui).

    Monitor

    Processo: 
    1. DESCRIÇÃO DO FLUXO

    - Responsabilidade: capturar (de forma pontual/manual) registros de clienteclientes porda chavefonte SQL WOSK_SERVICO_ENVIA_PROTHEUS_CLIENTES_PADRAO e enfileirar cada registro para integração assíncrona no Protheus.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.
    Para
    No fluxo manual, para cada chave recebida,informada, o processo executa:
    - Normaliza a entrada para lista de chaves (suporta chave única ou array).processo:
    - Reaproveita token existente dona fila (quando houver item de fila,criado) consultando Queue::get('', chaveOriginal)chave) quando houver registro.
    - Valida formato da chave e deriva filtros (A1_LOJA e A1_COD).
    - ExecutaConsulta consulta naa fonte de dados do monitor (viewQuery)SQL filtrando por A1_LOJA e A1_COD.
    - Sanitiza o registro retornado com trim() recursivo em todos os campos.
    - Reestrutura o controle de posiçãoposicionamento (novoFiltro) com aA1_LOJA, chave do clienteA1_COD e a DATA_PARA_TRANSFERENCIA normalizada.(normalizada).
    - Monta a chave da fila no formato A1_LOJA-A1_COD e gravaenfileira ovia item para processamento assíncronoQueue::set() com status Aguardando Integração e situacao = 0.


    2. DADOS NECESSÁRIOS PARA O ENDPOINT

    Este arquivo não implementa endpoint (WebService). implementado neste arquivo. Para o Monitor, oos dadodados necessáriorios para execução manual é a chave do cliente.são:

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

    Fonte de dados (captura):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: InícioNão doaplicado no fluxo atual (capturar(run()
    - Constrói a lista de execução (chaves) a partir do parâmetro chavevazio).
    - RecuperaO token prévio do itemcontrole de filaestado (existe via Monitor::get()/Monitor::set(), persistindo em wosk_monitor quando existir),utilizado garantindopor rastreabilidadeintegrações naque regravaçãoexigem do item.retomada/continuidade.

    3.2 Reset ao iniciar execução
    Momento: InícioNão doaplicado loopno defluxo chaves
    - Para cada chave, prepara variáveis de contextoatual (chaverun() atual, token associado e filtros derivados)vazio).

    3.3 Normalização dos filtros
    Momento: Pré-consulta no fluxo manual (por chave)capturar()).
    - DivideDeriva afiltros diretamente da chave em: A1_LOJA e A1_COD.
    - Monta a consulta SQL com filtros exatos para recuperar o registro correspondente.

    3.4 Atualização do estado para EXECUTANDO
    Momento: AntesNão doaplicado enfileiramento
    -no Ofluxo itematual é(não gravado com status textualpersiste Aguardando Integraçãosituacao e situação inicialno 0capturar(), estabelecendo o ponto de partida do processamento assíncrono.).

    3.5 Paginação dos registros
    Momento: Execução da consultaaplicável.
    - A consulta émanual executadafiltra por chave;chave e processa o processamento percorre as linhas retornadasresultado 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 novoFiltronovoFiltro['A1_LOJA'] com:e novoFiltro['A1_COD'] com valores do registro.
        - A1_LOJA
        -Normaliza A1_COD
        - DATA_PARA_TRANSFERENCIAnovoFiltro['DATA_PARA_TRANSFERENCIA'] normalizada empara Y-m-d H:i:s.

    3.8 Enfileiramento
    Momento: Pós-sanitizaçãoDentro (pordo registro)loop do capturar().
    - Monta akey chave:no padrão A1_LOJA-A1_COD.
    - Enfileira via Queue::set(chave,key, registro, [], 'Aguardando Integração', ...).
    - QuandoReaproveita houvertoken tokense prévio,o eleitem é reaproveitadoexistir na gravaçãofila do(obtido item.via Queue::get).

    3.9 Atualização incremental da posição
    Momento: ApósNão inserir na filaaplicável.
    - O controle incremental deste fluxo manual ficanão registrado no próprio item de fila, via chave eatualiza data_adicionadooffset/chave_posicao doem item gravado/atualizado.wosk_monitor.

    3.10 Finalização
    Momento: ConclusãoFinal do processamentocapturar().
    - Não há persistência de todas as chaves
    - Encerramentoencerramento do lotemonitor (situação) neste fluxo manual; a finalização é implícita após enfileirar todos os registros encontrados para as chaves informadas.enfileirar.

    3.11 Tratamento de erro
    Momento: catch(Exception) do capturar().
    - Registra a exceçãoerro via errorByexception e encerra o cicloprocessamento do lote em execução.atual.


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

    4.1 Controle do monitor
    Momento: PersistênciaQuando deMonitor::set() estadoé do monitorutilizado (não ocorre no capturar()).
    - Tabela persistida (implementação da trait wosk_monitor)
    - Tabela:: {$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: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 envioprocessamento posterior ao Protheus pela Queue.

    Execução com erro:
    - ExceçãoO registradaerro é registrado e o loteitem pode encerrar antesdeixar de enfileirarser todosenfileirado os(dependendo registrosdo planejados.ponto de falha).


    6. OPERAÇÃO MANUAL – capturar()

    Objetivo: enfileirar manualmente um ou mais clientes apara partirintegração, dausando chave.chave conhecida.

    Fluxo:
    - Entrada: chave string ou array, no padrão A1_LOJA-A1_COD.
    - Para cada chave:
        - ReaproveitaConsulta a fila para reaproveitar token do item (quando existir na fila.existir).
        - Consulta o registro correspondente naa fonte SQL filtrando por WOSK_SERVICO_ENVIA_PROTHEUS_CLIENTES_PADRAOA1_LOJA e A1_COD.
        - Sanitiza o registro ecom enfileiratrim() pararecursivo.
        integração- 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 dadoso do clientepayload para o padrão Protheus e executar o envio, persistindo retorno, tempo e situaçãostatus dona processamento.própria fila.
    - Disparo: execução agendada (cron) chamando Queue::run(token).

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

    Transformações e normalizações pré-envio: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 (STR_PAD_LEFT).gitos.

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

    Validação e classificação do retorno:
    - Se anão houver resposta vier vazia,erro: o processamento gera erro de integração (JSON: NÃO HOUVE RESPOSTA.).
    - Se a resposta não puder ser interpretada comofor array ou não contiver Mensagem, o processamentoerro: geraJSON: erroNÃO deFOI decodificação.POSSÍVEL DECODIFICAR A RESPOSTA.
    - A mensagem persistida prioriza Mensagem Detalhada quando existir.
    - A situacaoSituação final édo definida por:item:
        - 2 quando sucesso.sucesso (sem code e Mensagem diferente de ERRO).
        - 4 quando houver erro (por code no retorno ou quando Mensagem = "ERRO").
    - Mensagem gravada prioriza Mensagem Detalhada (quando presente).

    Ações pós-sucesso:adicionais por resultado:
    - MarcaSucesso o(situacao cliente= 2): marca como integrado via setProtheusClienteIntegrado(chave, true).
    - Removee sinaliza remoção de itens correlatos na fila.
    - Pós-sucesso (limpeza de filafila): paratenta evitarremover duplicidade,registros executando exclusõesrelacionados em wosk_queue para as ações ProtheusCliente (por SUBSTRING_INDEX(chave, '-', 2)) e ProtheusClienteFull (chavespor derivadaschave), daevitando chaveduplicidade original).de processamento.

    Persistência do resultadostatus do item:item (fila):
    - Atualiza o próprio item de fila com retorno, mensagem, dump de requisição (_CURL_DUMP), tempo e situação final.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 interno (_getNotificarErros).


    2. DADOS NECESSÁRIOS PARA O ENDPOINT

    Este arquivo não implementa endpoint (WebService). implementado neste arquivo. Para a Queue, os dados de entradanecessá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 docapturado cliente, conforme viewQuery(campos do monitor.cliente).
    - data_adicionado: referênciadata/hora temporalde 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é concluir o envio e classificar o retorno.

    3.5 Paginação dos registros
    Momento: Execução aplicável (processa 1 item por item (consumo unitário)execução).

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

    3.7 Atualização do filtro de posição
    Momento: Pós-processamentoNão aplicável (controle de posição é do item
    - O item permanece rastreável pela chave e pelo token, com retorno e situação persistidos na fila.Monitor).

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

    3.9 Atualização incremental da posição
    Momento: Atualização doaplicável item
    - A posiçã(não do processamentooffset énesta refletida na própria fila por status e situação (1 durante envio; 2 ou 4 ao concluir)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 no retorno,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: PersistênciaNão doaplicável estadopara doesta monitorclasse (quandonão utilizado pela integração)
    - Tabela:grava {$this->bancoIntegrador}.wosk_monitor).

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


    5. RESULTADO DO PROCESSAMENTO

    Execução normal:
    - Item finalizadoatualizado compara situacao = 2, com retorno persistido e marcaçãocliente do clientemarcado como integrado.

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


    6. OPERAÇÃO MANUAL – capturar()

    OperaçNão aplicável para esta classe (a operação manual está definidana noclasse Monitor deste arquivo, com enfileiramento do item para consumo pela Queue).

    Fluxo do Processo

    Diagrama sem nome.jpg

    Critérios de Aceitação

    Processo Subprocesso Descrição Situação esperada