ProtheusCliente
Documentação Técnica
| Nome do cliente | TO-DO |
| Nome do projeto | TO-DO |
| Biblioteca | |
| Token da Biblioteca |
|
|
URL de Produção
|
https://isnapp.illimitar.pro/bibliotecas/ |
| URL de Homologação | https://hmg-isnapp.illimitar.pro/bibliotecas/ |
| Data |
Sumário
- Documentação Técnica
- Sumário
- Histórico de Versões
- Descrição Geral dos Processos
- Fluxo do Processo
- Critérios de Aceitação
Histórico de Versões
| Data | Versão | Modificado por | Descrição da Mudança |
| 1.0 | Maykon/Gustavo | Documentação inicial |
Descrição Geral dos Processos
LoremEscopo Ipsumdeste arquivo:
- isEste simplydocumento dummyfoi textgerado of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer tookexclusivamente a galleypartir ofde typewosk_protheuscliente/protheusCliente.php.
- andClasses scrambledpresentes itneste toarquivo: makeMonitor ae typeQueue.
- specimenClasse book.ausente Itneste hasarquivo: survivedWebservice not(não onlyhá fiveendpoint centuries,implementado but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsumaqui).
Monitor
Processo: PROCESSO_MONITOR1. 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
- offset ← offset + 1
- chavePosicao ← chave
- dataPosicao ← DATA_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: PROCESSO_QUEUE
WebService
1. Processo:DESCRIÇÃO DO FLUXOPROCESSO_WEBSERVICE
-
- Disparo: execuçã
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
- 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 Momento: 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 6. OPERAÇÃO MANUAL Não há operação |
Exemplosalém do consumo via run(token). A notificação de Request:erros
{realizada "key":por "34a20688-1bb6-4fcd-9592-d58ca9876de5"notificar(), "INTEGRADOR":que "cupom",consulta "FILIAL": "01LJ0206",
"ID": "00000007188082",
"DATA_RETORNO": "2024-10-29 00:37:05",
"SITUACAO": "1",
"MENSAGEM": "GravaBatch Executadoitens com Sucesso",situacao "DETALHE":= {4 "ZB_ID":e "000000000004156",envia "LQ_DOC":e-mail "000051206",para "LQ_PDV":uma "003",lista "ERGRVBT": "",
"LQ_HORA": "20:41:19",
"LQ_LOJA": "68",
"LQ_VEND": "000001",
"SITUAGB": "OK",
"LQ_FORMA": "R$",
"LQ_FRETE": 0,
"LQ_SERIE": "65",
"LQ_SITUA": "RX",
"Mensagem": "OK",
"LQ_CARTAO": 752.14,
"LQ_CONDPG": "",
"LQ_EMISNF": "27/07/2025",
"LQ_FILIAL": "01LJ0299",
"LQ_FORMPG": "CC",
"LQ_NOMCLI": "XXXXXX",
"LQ_OUTROS": 139.65,
"LQ_SERSAT": "",
"LQ_TPFRET": "S",
"LQ_VALICM": 178.35,
"LQ_VLRLIQ": 891.79,
"LQ_VLRTOT": 891.79,
"LQ_XCANAL": "VAREJO",
"ZB_DATRET": "29/07/25",
"ZB_FILIAL": "01LJ0299",
"ZB_HORRET": "09:18:00",
"LQ_CLIENTE": "XXXXX",
"LQ_DINHEIR": 0,
"LQ_EMISSAO": "27/07/2025",
"LQ_ESPECIE": "NFCE",
"LQ_KEYNFCE": "XXXXX",
"LQ_NUMCFIS": "000051206",
"LQ_OPERADO": "C24",
"LQ_PARCELA": 0,
"LQ_TIPOCLI": "F",
"LQ_VALBRUT": 891.79,
"LQ_VALMERC": 1044,
"LQ_VENDTEF": "S",
"LQ_VLRDEBI": 0,
"LQ_XNATOPE": "100.80",
"Mensagem Detalhada": "GravaBatch Executado com Sucesso"
}
}
{
"key": "34a20688-1bb6-4fcd-9592-d58ca9876de5",
"INTEGRADOR": "cupom",
"FILIAL": "01LJ0269",
"ID": "00000001352422",
"DATA_RETORNO": "2024-10-29 11:23:20",
"SITUACAO": "0",
"MENSAGEM": "D2_TES: Tipo Operacao '', do Item '0001', Invalido."
}Exemplosfixa de Response: destinatários.
{
"INTEGRADOR": "cupom",
"FILIAL": "01LJ0269",
"ID": "00000001352422",
"DATA_RETORNO": "2024-10-29 11:23:20",
"SITUACAO": "0",
"Mensagem Detalhada": "Registrado com sucesso.",
"Mensagem": "OK"
}
{
"success":false,
"message":"Sess\u00e3o Expirou",
"data":false,
"errors":{"reason":"Sess\u00e3o Expirou"}
}
Fluxo do Processo
Critérios de Aceitação
| Processo | Subprocesso | Descrição | Situação esperada |
