ProtheusCliente (STATUS: PARCIAL)
Documentação Técnica
| Nome do cliente | |
| Nome do projeto | |
| Biblioteca | |
| Data |
Sumário
Documentação TécnicaSumárioHistórico de Versões
Descrição Geral dos ProcessosFluxo do ProcessoCritérios de Aceitação
Histórico de Versões
| Data | Versão | Modificado por | Descrição da Mudança |
| 1.0 | Maykon/Gustavo |
Descrição Geral dos Processos
EscopoEsta destebiblioteca arquivo:-integra 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 incrementalcadastro de clientes a(padrão) partirdo deLINX umaao fonteProtheus, SQLpreparando os dados e enfileirarregistrando cadao registroresultado do envio para processamentoacompanhamento.
Capturador
Descriçã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 ← vazioEm 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:00Conceitual
O monitorcapturador executarecebe paginaçãouma comchave OFFSET/FETCH(ou NEXTlista usandode limitechaves) configuradono emformato woskLimiteCaptura::ProtheusClienteA1_LOJA-A1_COD, consultandoconsulta a fonte WOSK_SERVICO_ENVIA_PROTHEUS_CLIENTESde com:-dados WHEREe DATA_PARA_TRANSFERENCIAlocaliza >=os filtro.DATA_PARA_TRANSFERENCIA-registros ORDERcorrespondentes BYna DATA_PARA_TRANSFERENCIAview ASCde integração.
Para cada registro retornado:- Sanitiza os valores com trim() (recursivo em todos os campos).- Atualizaencontrado, o filtroconteúdo é encaminhado para a fila de posiçãoprocessamento, (A1_LOJA,onde A1_COD,será 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çãotransformado e situacaoenviado =ao 0Protheus.
Fonte
A entrada é obtida por consulta na view WOSK_SERVICO_ENVIA_PROTHEUS_CLIENTES_PADRAO.- 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 últimoO 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 ENDPOINTNã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_CLIENTESCampos 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_TRANSFERENCIAObservação: no fluxo automático (run(WHERE)), apenas DATA_PARA_TRANSFERENCIA é aplicadamontado na cláusula WHERE da consulta (os demais filtros são normalizados e persistidos como estado).3. REESTRUTURAÇÃO DOS DADOS3.1 Recuperação do estado do monitorMomento: 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çãoMomento: Quando situacao ≠ 1- Reseta dataPosicao, dataIniciado, offset e chavePosicao para reinício controlado.3.3 Normalização dos filtrosMomento: 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:003.4 Atualização do estado para EXECUTANDOMomento: Antes da consulta- Persiste situacao = 1 com o estado atual (offset, chave, datas, filtro, token).3.5 Paginação dos registrosMomento: 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 dadosMomento: Ao ler cada registro (loop de fetch)- Aplica trim() recursivamente em todos os campos do registro.3.7 Atualização do filtro de posiçãoMomento: Após ler cada registro- Atualiza novoFiltro com os campos-chave do registro e a DATA_PARA_TRANSFERENCIA normalizada.3.8 EnfileiramentoMomento: 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çãoMomento: Após inserir na fila- offset ← offset + 1- chavePosicao ← chave- dataPosicao ← DATA_PARA_TRANSFERENCIA- Persiste o estado imediatamente para garantir retomada em caso de interrupção.3.10 FinalizaçãoMomento: Encerramento do loop- Persiste situacao = 2 com o último novoFiltro (estado efetivo de posição).3.11 Tratamento de erroMomento: 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 monitorMomento: 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çãoMomento: 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 PROCESSAMENTOExecuçã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 clientesdinamicamente a partir da chave.Fluxo:-chave Entrada:informada 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_CPFA1_COD). - Sanitiza com trim() e enfileira via Queue::set() com o token reaproveitado.
Queue
SELECT
A1_COD,
A1_LOJA,
CGC_CPF,
NOME,
PESSOA,
NOME_REDUZ,
ENDERECO,
BAIRRO,
COMPLEMENTO,
TIPO,
UF,
COD_MUNICIPIO_IBGE,
CEP,
DDI,
DDD,
TELEFONE,
CONTATO,
A1_PFISICA,
A1_INSCR,
INSC_MUNICIPAL,
DATA_NASC,
EMAIL,
COD_PAIS_SISCOMEX,
COD_PAIS_BC,
A1_CONTA,
A1_CONTRIB,
A1_TPESSOA,
A1_SUFRAMA,
A1_CALCSUF,
A1_CODMUN,
STATUS,
DATA_PARA_TRANSFERENCIA
FROM
WOSK_SERVICO_ENVIA_PROTHEUS_CLIENTES_PADRAO
WHERE
A1_LOJA = '<A1_LOJA>'
AND A1_COD = '<A1_COD>'
Operações com Dados
- Processo:Leitura:
consulta 1.na DESCRIÇÃOview DOWOSK_SERVICO_ENVIA_PROTHEUS_CLIENTES_PADRAO FLUXO
para obter os dados do cliente a partir da chave informada.
- Responsabilidade:Persistência: consumiros registros capturados são registrados para processamento assíncrono na tabela wosk_queue (base de integração), permitindo rastreabilidade do processamento e do resultado (sucesso/erro).
Fila de Processamento
A fila recebe um item dapendente fila,e transformar/normalizarutiliza o conteúdo do cliente como base do payload de integração. Em seguida, aplica transformações obrigatórias de padronização e enviarrealiza paraa chamada ao Protheus.
Ao final, o Protheus,resultado registrandoé retorno e statuspersistido na própria fila.-tabela Disparo:wosk_queue, execuçregistrando situação, mensagem e resposta para auditoria e reprocessamento quando aplicável.
Estruturaçã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 envioDados
Mapa de campos definidodo empayload
| Campo no payload | Origem no conteúdo do |
A1_COD |
A1_COD |
A1_LOJA |
A1_LOJA |
A1_CGC |
CGC_CPF |
A1_NOME |
NOME |
A1_PESSOA |
PESSOA |
A1_NREDUZ |
NOME_REDUZ |
A1_END |
ENDERECO |
A1_BAIRRO |
BAIRRO |
A1_COMPLEM |
COMPLEMENTO |
A1_TIPO |
TIPO |
A1_EST |
UF |
A1_COD_MUN |
COD_MUNICIPIO_IBGE |
A1_CEP |
CEP |
A1_DDI |
DDI |
A1_DDD |
DDD |
A1_TEL |
TELEFONE |
A1_CONTATO |
CONTATO |
A1_PFISICA |
A1_PFISICA |
A1_INSCR |
A1_INSCR |
A1_INSCRM |
INSC_MUNICIPAL |
A1_DTNASC |
DATA_NASC |
A1_EMAIL |
EMAIL |
A1_PAIS |
COD_PAIS_SISCOMEX |
A1_CODPAIS |
COD_PAIS_BC |
A1_CONTA |
A1_CONTA |
A1_CONTRIB |
A1_CONTRIB |
A1_TPESSOA |
A1_TPESSOA |
A1_SUFRAMA |
A1_SUFRAMA |
A1_CALCSUF |
A1_CALCSUF |
A1_CODMUN |
A1_CODMUN |
A1_MSBLQL |
STATUS |
Exemplo -de payload enviado
{
"A1_COD": "000001",
"A1_LOJA": "01",
"A1_CGC": "00000000000000",
"A1_NOME": "NOME DO CLIENTE",
"A1_PESSOA": "F",
"A1_NREDUZ": "NOME REDUZIDO",
"A1_END": "RUA EXEMPLO 123",
"A1_BAIRRO": "CENTRO",
"A1_COMPLEM": "APTO 101",
"A1_TIPO": "N",
"A1_EST": "SP",
"A1_COD_MUN": "3550308",
"A1_CEP": "01000000",
"A1_DDI": "55",
"A1_DDD": "11",
"A1_TEL": "999999999",
"A1_CONTATO": "CONTATO",
"A1_PFISICA": "1",
"A1_INSCR": "",
"A1_INSCRM": "",
"A1_DTNASC": "1980-01-01",
"A1_EMAIL": "cliente@exemplo.com",
"A1_PAIS": "1058",
"A1_CODPAIS": "01058",
"A1_CONTA": "",
"A1_CONTRIB": "",
"A1_TPESSOA": "",
"A1_SUFRAMA": "",
"A1_CALCSUF": "",
"A1_CODMUN": "",
"A1_MSBLQL": "N"
}
Tratamento de Dados
Antes do envio ao Protheus, o conteúdo do cliente passa pelas seguintes alterações:
A1_NOME: remove o caractereeA1_NREDUZ|e aplica remoção de acentos.A1_NREDUZ: remove o caractere|e aplica remoção de acentos.A1_END: aplica remoção de acentos.A1_BAIRRO: aplica remoção de acentos.A1_CONTATO: aplica remoção de acentos.A1_CODPAIS: converte para inteiro eaplicapadronizazero-padcom 5 dígitos, preenchendo com zeros à esquerdaaté(ex.:51058dígitos.Envio→ao01058).
Integração com o Protheus
Chamada de integração viacom setProtheus("cliente",o payload,Protheus
- Recurso:
Headercliente - Método HTTP:
POST - Cabeçalhos:
tenantId:no01,01SD0001
formato"01,01SD0001"
Tratamento de 01SD0001).Validaçãoretorno e(obrigatório)
- Ausência
retorno:-deSeresposta: registra erro com a mensagemJSON: NÃO HOUVE RESPOSTA. - Resposta inválida/inesperada: quando não
houver resposta → erro.- Se resposta não foré array ou nãocontiverpossuiMensagem,→registraerro.-errosituacaocomfinaladomensagemitem:JSON:-NÃO2FOI POSSÍVEL DECODIFICAR A RESPOSTA. - Indicadores de erro: quando
sucesso.Mensagem-é4ERROquando houvercodeno retorno(ou quandoMensagemhá=presença"ERRO".-demensagemcode),gravadaopriorizaitemMensageméDetalhadamarcado(como erro na fila e a resposta é armazenada para auditoria. - Condição de sucesso: quando
presente).Açõesnãoadicionaisháporindicadorresultado:-deSucessoerro,(situacaoa= 2):rotina marca o cliente como integradoviasetProtheusClienteIntegrado("A1_LOJA-A1_COD", true).- Erro (situacao = 4): tenta reprocesso alternativo acionandoWOSK\\ProtheusClientePadrao\\Monitor::capturar()para a mesma chave (estratégia de fallback). Se existir item correspondente na fila comacao = 'ProtheusClientePadrao'etoken, 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 viasetProtheusExcluir(['ProtheusCliente'], 'chave', chave).2. DADOS NECESSÁRIOS PARA O ENDPOINTNão há endpoint (WebService) implementado neste arquivo. Para aQueue, 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 DADOS3.1 Recuperação do item de filaMomento: Início dorun(token)- Lê item viaget(token).3.2 Reset ao iniciar execuçãoMomento: Antes do envio- Atualiza o item para statusEnviandoesituacao = 1para indicar consumo em andamento.3.3 Normalização do payloadMomento: Pré-envio- Aplica mapeamento de campos via$fielddurante a preparação do conteúdo.3.4 Atualização do estado para EXECUTANDOMomento: Pré-requisição- Mantémconclui o item comosituacaosucesso=na1fila.
Rotinas Inteligentes
Foi identificada a chamada da rotina inteligente setProtheusClienteIntegrado, utilizada para registrar o enviocliente como integrado após o retorno de sucesso do Protheus.
Persistência e classificarlimpeza após sucesso
- Persistência: o
retorno.3.5resultadoPaginaçda integraçãodos(sucesso/erro), mensagem e resposta são registrados na tabelawosk_queue. - Limpeza: em caso de sucesso, a rotina remove registros
Momento:Nãoauxiliaresaplicável (a Queue processa um item por execução).3.6 Sanitização dos dadosMomento: Pré-enviorelacionados aoProtheus-processoRemoveemacentostabelas/estruturas de controle do integrador (ex.: entidadesProtheusClienteecaracteresProtheusClienteFull),|evitandoem campos textuais.- NormalizaA1_CODPAISpara 5 dígitos comzero-pad.3.7 Atualização do filtroacúmulo deposiçãoMomento:referências.
(controle
Tratamento de retorno
- Sucesso: quando a resposta não indica erro, o item é concluído como sucesso na fila e o cliente é marcado como integrado.
- Erro: quando ocorre exceção, retorno ausente/invalidado ou resposta com erro, o item permanece registrado com erro e a mensagem detalhada é armazenada para consulta.Momento:- catch(Exception)Auditoria: internoo dotempo de processamento doe item-os Registradetalhes da requisição/resposta são persistidos na tabela wosk_queue para rastreabilidade.
Encaminhamento em cenário de erro
Quando há erro no retorno,envio defineou situacaona =validação 4da resposta, o item é mantido na tabela wosk_queue com situação de erro e persiste a mensagem nocorrespondente, itempermitindo dereprocessamento fila.4.conforme PERSISTÊNCIAas DOSrotinas DADOS (BANCO DE DADOS)4.1 Controle do monitorNã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çõpadrõ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 final5. RESULTADO DO PROCESSAMENTOExecução normal:- Item de fila finaliza com situacao = 2 e registra retorno do Protheus.Execuçintegrador.
Notificação
wosk_queue (ação ProtheusClientePadrao e situação de erro), ordenando pelo horário de processamento para priorizar ocorrências mais antigas.SELECT
`token`,
`acao`,
`chave`,
`data_adicionado`,
`data`,
`mensagem` AS 'ERRO'
FROM
`<bancoIntegrador>`.`wosk_queue`
WHERE
`acao` = 'ProtheusClientePadrao' AND `situacao` = 4
ORDER BY
`data` ASC
Tratamento do relatório
- Decomposição da chave: extrai
A1_LOJAeenviaA1_CODe-maila partir do campochaveparaumaexibiçãolistanofixarelatório. - Normalização da mensagem: quando a mensagem contém informações do SQL Server, remove prefixos técnicos e mantém o trecho mais relevante para leitura; também padroniza quebras de
destinatários.
linha para exibição. - Formatação de datas: exibe
data_adicionadoedatano formatodd/mm/YYYY HH:ii:ss.
Destinatários: os e-mails de destino estão definidos no código da biblioteca e recebem o relatório de erros do processo.
Fluxo do Processo
Critérios de Aceitação
| Processo | Subprocesso | Descrição | Situação esperada |
Capturador |
Captura por chave |
Ao informar uma chave válida no padrão A1_LOJA-A1_COD, deve consultar a view WOSK_SERVICO_ENVIA_PROTHEUS_CLIENTES_PADRAO e registrar o item correspondente na fila de processamento. |
Item pendente registrado na wosk_queue, pronto para processamento. |
| Fila de Processamento | Transformação e envio | Ao processar um item pendente, deve montar o payload com os campos A1_* e aplicar as alterações documentadas (remoção de |, remoção de acentos e padronização de A1_CODPAIS), realizando a chamada de integração ao Protheus. |
Fila atualizada com resultado: sucesso (cliente marcado como integrado) ou erro (mensagem e resposta registradas). |
| Fila de Processamento | Notificação de erros | Quando existirem itens com erro, deve gerar relatório a partir da wosk_queue filtrando pela ação ProtheusClientePadrao e ordenando por data de processamento, enviando aos destinatários configurados. |
Relatório enviado e erros apresentados com mensagem legível e datas formatadas. |
