Ir para o conteúdo principal

ProtheusCupomFiscalFull (STATUS: PARCIAL)

Documentação Técnica

Nome do clienteOSKLEN
Nome do projetoIntegração LINX → Protheus
Bibliotecawosk_protheus_cupom_fiscal_full
Data27/02/2026


Histórico de Versões

DataVersãoModificado porDescrição da Mudança
27/02/20261.0Maykon/GustavoCriação da documentação técnica do processo ProtheusCupomFiscalFull.

Descrição

Esta biblioteca organiza a integração de cupons fiscais completos do LINX para o Protheus, garantindo captura por data ou por chave e envio com validação do retorno.

Capturador

Descrição Conceitual

Permite a captura manual (por identificador composto no padrão F2_FILIAL-F2_DOC-F2_SERIE) e a captura automática (por agendador de tarefas) dos cupons fiscais pendentes, consultando a origem e registrando os itens para processamento assíncrono.

A captura automática segue processamento cronológico (ordenação/paginação por data) para priorizar registros mais antigos e manter continuidade por posição; link conceitual: Processamento cronológico.

Fonte

Origem consultada: view WOSK_SERVICO_ENVIA_PROTHEUS_CUPOM_FULL.

Origem consultada (itens do cupom): view WOSK_SERVICO_ENVIA_PROTHEUS_CUPOM_ITEM_FULL.

Consulta base (utilizada como origem para composição dinâmica de filtros):

SELECT
    TEMP_FILIAL,
    TEMP_NF_SAIDA,
    TEMP_SERIE_NF,
    F2_FILIAL,
    F2_DOC,
    F2_SERIE,
    F2_CLIENTE,
    F2_LOJA,
    F2_TIPOCLI,
    F2_EST,
    F2_DUPL,
    F2_EMISSAO,
    F2_DTDIGIT,
    F2_ESPECIE,
    F2_TIPO,
    F2_COND,
    F2_XNATOPE,
    F2_XCANAL,
    F2_XNATUR,
    F2_TPFRETE,
    F2_VALMERC,
    F2_VALBRUT,
    F2_FRETE,
    F2_SEGURO,
    F2_DESPESA,
    F2_DESCONT,
    F2_VALFAT,
    F2_PREFIXO,
    F2_VALICM,
    F2_BASEICM,
    F2_ICMFRETE,
    F2_VALIPI,
    F2_BASEIPI,
    F2_ICMSRET,
    F2_BRICMS,
    F2_BASIMP6,
    F2_BASIMP5,
    F2_VALIMP6,
    F2_VALIMP5,
    F2_BASFECP,
    F2_BSFCCMP,
    F2_BSFCPST,
    F2_BASEPS3,
    F2_VALPS3,
    F2_BASECF3,
    F2_VALCF3,
    F2_MOEDA,
    F2_NFORI,
    F2_SERIORI,
    F2_UFDEST,
    F2_UFORIG,
    F2_ESPECI1,
    F2_VOLUME1,
    F2_PLIQUI,
    F2_PBRUTO,
    F2_TRANSP,
    F2_SDOC,
    F2_CHVNFE,
    F1_DAUTNFE,
    F1_HAUTNFE,
    F1_PROTOC,
    C5_PARC1,
    C5_PARC2,
    C5_PARC3,
    C5_PARC4,
    C5_PARC5,
    C5_PARC6,
    C5_PARC7,
    C5_PARC8,
    C5_PARC9,
    C5_PARC10,
    C5_PARC11,
    C5_PARC12,
    C5_DATA1,
    C5_DATA2,
    C5_DATA3,
    C5_DATA4,
    C5_DATA5,
    C5_DATA6,
    C5_DATA7,
    C5_DATA8,
    C5_DATA9,
    C5_DATA10,
    C5_DATA11,
    C5_DATA12,
    F3_DTCANC,
    F3_CODRSEF,
    CREPROCESSA,
    F2_XCODREP,
    F2_XCNPJRE,
    F2_XMARCA,
    DATA_PARA_TRANSFERENCIA
FROM
    WOSK_SERVICO_ENVIA_PROTHEUS_CUPOM_FULL (NOLOCK)



Consulta utilizada na captura automática (filtro por data e paginação por posição):

SELECT
    TEMP_FILIAL,
    TEMP_NF_SAIDA,
    TEMP_SERIE_NF,
    F2_FILIAL,
    F2_DOC,
    F2_SERIE,
    F2_CLIENTE,
    F2_LOJA,
    F2_TIPOCLI,
    F2_EST,
    F2_DUPL,
    F2_EMISSAO,
    F2_DTDIGIT,
    F2_ESPECIE,
    F2_TIPO,
    F2_COND,
    F2_XNATOPE,
    F2_XCANAL,
    F2_XNATUR,
    F2_TPFRETE,
    F2_VALMERC,
    F2_VALBRUT,
    F2_FRETE,
    F2_SEGURO,
    F2_DESPESA,
    F2_DESCONT,
    F2_VALFAT,
    F2_PREFIXO,
    F2_VALICM,
    F2_BASEICM,
    F2_ICMFRETE,
    F2_VALIPI,
    F2_BASEIPI,
    F2_ICMSRET,
    F2_BRICMS,
    F2_BASIMP6,
    F2_BASIMP5,
    F2_VALIMP6,
    F2_VALIMP5,
    F2_BASFECP,
    F2_BSFCCMP,
    F2_BSFCPST,
    F2_BASEPS3,
    F2_VALPS3,
    F2_BASECF3,
    F2_VALCF3,
    F2_MOEDA,
    F2_NFORI,
    F2_SERIORI,
    F2_UFDEST,
    F2_UFORIG,
    F2_ESPECI1,
    F2_VOLUME1,
    F2_PLIQUI,
    F2_PBRUTO,
    F2_TRANSP,
    F2_SDOC,
    F2_CHVNFE,
    F1_DAUTNFE,
    F1_HAUTNFE,
    F1_PROTOC,
    C5_PARC1,
    C5_PARC2,
    C5_PARC3,
    C5_PARC4,
    C5_PARC5,
    C5_PARC6,
    C5_PARC7,
    C5_PARC8,
    C5_PARC9,
    C5_PARC10,
    C5_PARC11,
    C5_PARC12,
    C5_DATA1,
    C5_DATA2,
    C5_DATA3,
    C5_DATA4,
    C5_DATA5,
    C5_DATA6,
    C5_DATA7,
    C5_DATA8,
    C5_DATA9,
    C5_DATA10,
    C5_DATA11,
    C5_DATA12,
    F3_DTCANC,
    F3_CODRSEF,
    CREPROCESSA,
    F2_XCODREP,
    F2_XCNPJRE,
    F2_XMARCA,
    DATA_PARA_TRANSFERENCIA
FROM
    WOSK_SERVICO_ENVIA_PROTHEUS_CUPOM_FULL (NOLOCK)
WHERE
    DATA_PARA_TRANSFERENCIA >= '<DATA_PARA_TRANSFERENCIA>'
ORDER BY
    DATA_PARA_TRANSFERENCIA ASC
OFFSET
    <OFFSET> ROWS FETCH NEXT <LIMITE> ROWS ONLY



Consulta utilizada na captura manual (filtros dinâmicos a partir do identificador informado):

SELECT
    TEMP_FILIAL,
    TEMP_NF_SAIDA,
    TEMP_SERIE_NF,
    F2_FILIAL,
    F2_DOC,
    F2_SERIE,
    F2_CLIENTE,
    F2_LOJA,
    F2_TIPOCLI,
    F2_EST,
    F2_DUPL,
    F2_EMISSAO,
    F2_DTDIGIT,
    F2_ESPECIE,
    F2_TIPO,
    F2_COND,
    F2_XNATOPE,
    F2_XCANAL,
    F2_XNATUR,
    F2_TPFRETE,
    F2_VALMERC,
    F2_VALBRUT,
    F2_FRETE,
    F2_SEGURO,
    F2_DESPESA,
    F2_DESCONT,
    F2_VALFAT,
    F2_PREFIXO,
    F2_VALICM,
    F2_BASEICM,
    F2_ICMFRETE,
    F2_VALIPI,
    F2_BASEIPI,
    F2_ICMSRET,
    F2_BRICMS,
    F2_BASIMP6,
    F2_BASIMP5,
    F2_VALIMP6,
    F2_VALIMP5,
    F2_BASFECP,
    F2_BSFCCMP,
    F2_BSFCPST,
    F2_BASEPS3,
    F2_VALPS3,
    F2_BASECF3,
    F2_VALCF3,
    F2_MOEDA,
    F2_NFORI,
    F2_SERIORI,
    F2_UFDEST,
    F2_UFORIG,
    F2_ESPECI1,
    F2_VOLUME1,
    F2_PLIQUI,
    F2_PBRUTO,
    F2_TRANSP,
    F2_SDOC,
    F2_CHVNFE,
    F1_DAUTNFE,
    F1_HAUTNFE,
    F1_PROTOC,
    C5_PARC1,
    C5_PARC2,
    C5_PARC3,
    C5_PARC4,
    C5_PARC5,
    C5_PARC6,
    C5_PARC7,
    C5_PARC8,
    C5_PARC9,
    C5_PARC10,
    C5_PARC11,
    C5_PARC12,
    C5_DATA1,
    C5_DATA2,
    C5_DATA3,
    C5_DATA4,
    C5_DATA5,
    C5_DATA6,
    C5_DATA7,
    C5_DATA8,
    C5_DATA9,
    C5_DATA10,
    C5_DATA11,
    C5_DATA12,
    F3_DTCANC,
    F3_CODRSEF,
    CREPROCESSA,
    F2_XCODREP,
    F2_XCNPJRE,
    F2_XMARCA,
    DATA_PARA_TRANSFERENCIA
FROM
    WOSK_SERVICO_ENVIA_PROTHEUS_CUPOM_FULL (NOLOCK)
WHERE
    F2_FILIAL = '<F2_FILIAL>'
    AND F2_DOC = '<F2_DOC>'
    AND F2_SERIE = '<F2_SERIE>'



Consulta utilizada para compor os itens do cupom:

SELECT
    D2_FILIAL,
    D2_ITEM,
    D2_COD,
    D2_TP,
    D2_UM,
    D2_LOCAL,
    D2_QUANT,
    D2_PRCVEN,
    D2_PRUNIT,
    D2_TOTAL,
    D2_DESC,
    D2_DESCON,
    D2_SEGURO,
    D2_VALFRE,
    D2_DESPESA,
    D2_VALBRUT,
    D2_EMISSAO,
    D2_DTDIGIT,
    D2_DOC,
    D2_SERIE,
    D2_SDOC,
    D2_TIPO,
    D2_ESPECIE,
    D2_CLIENTE,
    D2_LOJA,
    D2_EST,
    D2_CLASFIS,
    D2_TES,
    D2_CF,
    D2_BASEIPI,
    D2_IPI,
    D2_VALIPI,
    D2_BASEICM,
    D2_PICM,
    D2_VALICM,
    D2_BASFECP,
    D2_ALQFECP,
    D2_VALFECP,
    D2_BRICMS,
    D2_ALIQSOL,
    D2_MARGEM,
    D2_ICMSRET,
    D2_BSFCPST,
    D2_ALFCPST,
    D2_VFECPST,
    D2_BASIMP5,
    D2_ALQIMP5,
    D2_VALIMP5,
    D2_BASIMP6,
    D2_ALQIMP6,
    D2_VALIMP6,
    D2_BASEPS3,
    D2_ALIQPS3,
    D2_VALPS3,
    D2_BASECF3,
    D2_ALIQCF3,
    D2_VALCF3,
    D2_DESCZFP,
    D2_DESCZFC,
    D2_BASEDES,
    D2_ALIQCMP,
    D2_PDORI,
    D2_PDDES,
    D2_PDIFAL,
    D2_BSFCCMP,
    D2_ALFCCMP,
    D2_VFCPDIF,
    D2_CC,
    D2_CONTA,
    D2_PESO,
    D2_ESTOQUE,
    D2_NFORI,
    D2_SERIORI,
    D2_ITEMORI,
    D2_XPRMDPR,
    D2_XALIQBA,
    D2_ORIGLAN,
    D2_OP,
    D2_XPDWISE,
    D2_XPDLINX,
    D2_XCOLEC,
    D2_XCOLDE,
    DATA_PARA_TRANSFERENCIA
FROM
    WOSK_SERVICO_ENVIA_PROTHEUS_CUPOM_ITEM_FULL (NOLOCK)
WHERE
    D2_FILIAL = '<D2_FILIAL>'
    AND D2_DOC = '<D2_DOC>'
    AND D2_SERIE = '<D2_SERIE>'
    AND D2_CLIENTE = '<D2_CLIENTE>'
    AND D2_LOJA = '<D2_LOJA>'

 

Operações com Dados

- Leitura: consulta as views WOSK_SERVICO_ENVIA_PROTHEUS_CUPOM_FULL e WOSK_SERVICO_ENVIA_PROTHEUS_CUPOM_ITEM_FULL (itens) para obter o registro atual e compor a lista ITENS antes de registrar para processamento assíncrono.

- Captura automática (processamento cronológico): aplica filtro por DATA_PARA_TRANSFERENCIA, ordena por DATA_PARA_TRANSFERENCIA e pagina com OFFSET ... FETCH NEXT ..., garantindo priorização dos registros mais antigos e continuidade por posição.

- Captura manual: recebe um identificador composto no padrão F2_FILIAL-F2_DOC-F2_SERIE, valida o formato (quantidade de partes) e consulta a origem com filtros exatos (F2_FILIAL, F2_DOC, F2_SERIE) para recuperar o cupom solicitado e seus itens.

- Chave de identificação do item: composta no padrão F2_FILIAL-F2_DOC-F2_SERIE, utilizada para registrar o item na fila e para reconstrução de campos na notificação de falhas.

- Persistência de posição/continuidade: registra e atualiza o controle do capturador na tabela wosk_monitor (banco {$this->bancoIntegrador}) usando evento = 'ProtheusCupomFiscalFull', mantendo token, offset, filtro, chave_posicao, situacao, data_posicao, data_iniciado e data.

- Situações registradas no controle: parado/início (0), em processamento (1), concluído (2) e problema (4). Em caso de falha, o campo filtro recebe um histórico em ERRORS[] com DATE e MESSAGE para auditoria.

Fila de Processamento

Descrição Conceitual

A fila recupera um registro pendente e utiliza o conteúdo do registro como base do payload de integração. Em seguida, aplica transformações obrigatórias de padronização e realiza a chamada ao Protheus.

O item de fila é persistido e atualizado na tabela wosk_queue (banco {$this->bancoIntegrador}) ao longo do processamento, registrando conteúdo, retorno, mensagem, tempo e situação final para auditoria e acompanhamento operacional.

Estruturação de Dados

A estrutura oficial do payload de integração é definida pelo array $field da fila, refletindo os campos enviados ao Protheus no recurso documento_saida.

Campo no payloadOrigem no registro atual
F2_FILIALF2_FILIAL
F2_DOCF2_DOC
F2_SERIEF2_SERIE
F2_CLIENTEF2_CLIENTE
F2_LOJAF2_LOJA
F2_TIPOCLIF2_TIPOCLI
F2_ESTF2_EST
F2_DUPLF2_DUPL
F2_EMISSAOF2_EMISSAO
F2_DTDIGITF2_DTDIGIT
F2_ESPECIEF2_ESPECIE
F2_TIPOF2_TIPO
F2_CONDF2_COND
F2_XNATOPEF2_XNATOPE
F2_XCANALF2_XCANAL
F2_XNATURF2_XNATUR
F2_TPFRETEF2_TPFRETE
F2_VALMERCF2_VALMERC
F2_VALBRUTF2_VALBRUT
F2_FRETEF2_FRETE
F2_SEGUROF2_SEGURO
F2_DESPESAF2_DESPESA
F2_DESCONTF2_DESCONT
F2_VALFATF2_VALFAT
F2_PREFIXOF2_PREFIXO
F2_VALICMF2_VALICM
F2_BASEICMF2_BASEICM
F2_ICMFRETF2_ICMFRETE
F2_VALIPIF2_VALIPI
F2_BASEIPIF2_BASEIPI
F2_ICMSRETF2_ICMSRET
F2_BRICMSF2_BRICMS
F2_BASIMP5F2_BASIMP5
F2_BASIMP6F2_BASIMP6
F2_VALIMP5F2_VALIMP5
F2_VALIMP6F2_VALIMP6
F2_BASFECPF2_BASFECP
F2_BSFCCMPF2_BSFCCMP
F2_BSFCPSTF2_BSFCPST
F2_BASEPS3F2_BASEPS3
F2_VALPS3F2_VALPS3
F2_BASECF3F2_BASECF3
F2_VALCF3F2_VALCF3
F2_MOEDAF2_MOEDA
F2_NFORIF2_NFORI
F2_SERIORIF2_SERIORI
F2_UFDESTF2_UFDEST
F2_UFORIGF2_UFORIG
F2_ESPECI1F2_ESPECI1
F2_VOLUME1F2_VOLUME1
F2_PLIQUIF2_PLIQUI
F2_PBRUTOF2_PBRUTO
F2_TRANSPF2_TRANSP
F2_SDOCF2_SDOC
F2_CHVNFEF2_CHVNFE
F2_DAUTNFEF1_DAUTNFE
F2_HAUTNFEF1_HAUTNFE
F2_XVENPREF2_XVENPRE
F3_PROTOCF1_PROTOC
C5_PARC1C5_PARC1
C5_PARC2C5_PARC2
C5_PARC3C5_PARC3
C5_PARC4C5_PARC4
C5_PARC5C5_PARC5
C5_PARC6C5_PARC6
C5_PARC7C5_PARC7
C5_PARC8C5_PARC8
C5_PARC9C5_PARC9
C5_PARC10C5_PARC10
C5_PARC11C5_PARC11
C5_PARC12C5_PARC12
C5_DATA1C5_DATA1
C5_DATA2C5_DATA2
C5_DATA3C5_DATA3
C5_DATA4C5_DATA4
C5_DATA5C5_DATA5
C5_DATA6C5_DATA6
C5_DATA7C5_DATA7
C5_DATA8C5_DATA8
C5_DATA9C5_DATA9
C5_DATA10C5_DATA10
C5_DATA11C5_DATA11
C5_DATA12C5_DATA12
F3_DTCANCF3_DTCANC
F3_CODRSEFF3_CODRSEF
CREPROCESSACREPROCESSA
F2_XCODREPF2_XCODREP
F2_XCNPJREF2_XCNPJRE
F2_XMARCAF2_XMARCA
ITENSLista de itens obtida na origem de itens, composta como ITENS[].
ITENS[].D2_FILIALD2_FILIAL
ITENS[].D2_ITEMD2_ITEM
ITENS[].D2_CODD2_COD
ITENS[].D2_TPD2_TP
ITENS[].D2_UMD2_UM
ITENS[].D2_LOCALD2_LOCAL
ITENS[].D2_QUANTD2_QUANT
ITENS[].D2_PRCVEND2_PRCVEN
ITENS[].D2_PRUNITD2_PRUNIT
ITENS[].D2_TOTALD2_TOTAL
ITENS[].D2_DESCD2_DESC
ITENS[].D2_DESCOND2_DESCON
ITENS[].D2_SEGUROD2_SEGURO
ITENS[].D2_VALFRED2_VALFRE
ITENS[].D2_DESPESAD2_DESPESA
ITENS[].D2_VALBRUTD2_VALBRUT
ITENS[].D2_EMISSAOD2_EMISSAO
ITENS[].D2_DTDIGITD2_DTDIGIT
ITENS[].D2_DOCD2_DOC
ITENS[].D2_SERIED2_SERIE
ITENS[].D2_SDOCD2_SDOC
ITENS[].D2_TIPOD2_TIPO
ITENS[].D2_ESPECIED2_ESPECIE
ITENS[].D2_CLIENTED2_CLIENTE
ITENS[].D2_LOJAD2_LOJA
ITENS[].D2_ESTD2_EST
ITENS[].D2_CLASFISD2_CLASFIS
ITENS[].D2_TESD2_TES
ITENS[].D2_CFD2_CF
ITENS[].D2_BASEIPID2_BASEIPI
ITENS[].D2_IPID2_IPI
ITENS[].D2_VALIPID2_VALIPI
ITENS[].D2_BASEICMD2_BASEICM
ITENS[].D2_PICMD2_PICM
ITENS[].D2_VALICMD2_VALICM
ITENS[].D2_BASFECPD2_BASFECP
ITENS[].D2_ALQFECPD2_ALQFECP
ITENS[].D2_VALFECPD2_VALFECP
ITENS[].D2_BRICMSD2_BRICMS
ITENS[].D2_ALIQSOLD2_ALIQSOL
ITENS[].D2_MARGEMD2_MARGEM
ITENS[].D2_ICMSRETD2_ICMSRET
ITENS[].D2_BSFCPSTD2_BSFCPST
ITENS[].D2_ALFCPSTD2_ALFCPST
ITENS[].D2_VFECPSTD2_VFECPST
ITENS[].D2_BASIMP5D2_BASIMP5
ITENS[].D2_ALQIMP5D2_ALQIMP5
ITENS[].D2_VALIMP5D2_VALIMP5
ITENS[].D2_BASIMP6D2_BASIMP6
ITENS[].D2_ALQIMP6D2_ALQIMP6
ITENS[].D2_VALIMP6D2_VALIMP6
ITENS[].D2_BASEPS3D2_BASEPS3
ITENS[].D2_ALIQPS3D2_ALIQPS3
ITENS[].D2_VALPS3D2_VALPS3
ITENS[].D2_BASECF3D2_BASECF3
ITENS[].D2_ALIQCF3D2_ALIQCF3
ITENS[].D2_VALCF3D2_VALCF3
ITENS[].D2_DESCZFPD2_DESCZFP
ITENS[].D2_DESCZFCD2_DESCZFC
ITENS[].D2_BASEDESD2_BASEDES
ITENS[].D2_ALIQCMPD2_ALIQCMP
ITENS[].D2_PDORID2_PDORI
ITENS[].D2_PDDESD2_PDDES
ITENS[].D2_DIFALD2_PDIFAL
ITENS[].D2_BSFCCMPD2_BSFCCMP
ITENS[].D2_ALFCCMPD2_ALFCCMP
ITENS[].D2_VFCPDIFD2_VFCPDIF
ITENS[].D2_CCUSTOD2_CC
ITENS[].D2_CONTAD2_CONTA
ITENS[].D2_PESOD2_PESO
ITENS[].D2_ESTOQUED2_ESTOQUE
ITENS[].D2_NFORID2_NFORI
ITENS[].D2_SERIORID2_SERIORI
ITENS[].D2_ITEMORID2_ITEMORI
ITENS[].D2_XPRMDPRD2_XPRMDPR
ITENS[].D2_XALIQBAD2_XALIQBA
ITENS[].D2_ORIGLAND2_ORIGLAN
ITENS[].D2_OPD2_OP
ITENS[].D2_XPDWISED2_XPDWISE
ITENS[].D2_XPDLINXD2_XPDLINX
ITENS[].D2_XCOLECD2_XCOLEC
ITENS[].D2_XCOLDED2_XCOLDE

Exemplo de payload enviado (com todos os campos previstos em $field):

{
  "F2_FILIAL": "",
  "F2_DOC": "",
  "F2_SERIE": "",
  "F2_CLIENTE": "",
  "F2_LOJA": "",
  "F2_TIPOCLI": "",
  "F2_EST": "",
  "F2_DUPL": "",
  "F2_EMISSAO": "",
  "F2_DTDIGIT": "",
  "F2_ESPECIE": "",
  "F2_TIPO": "",
  "F2_COND": "",
  "F2_XNATOPE": "",
  "F2_XCANAL": "",
  "F2_XNATUR": "",
  "F2_TPFRETE": "",
  "F2_VALMERC": "",
  "F2_VALBRUT": "",
  "F2_FRETE": "",
  "F2_SEGURO": "",
  "F2_DESPESA": "",
  "F2_DESCONT": "",
  "F2_VALFAT": "",
  "F2_PREFIXO": "",
  "F2_VALICM": "",
  "F2_BASEICM": "",
  "F2_ICMFRET": "",
  "F2_VALIPI": "",
  "F2_BASEIPI": "",
  "F2_ICMSRET": "",
  "F2_BRICMS": "",
  "F2_BASIMP5": "",
  "F2_BASIMP6": "",
  "F2_VALIMP5": "",
  "F2_VALIMP6": "",
  "F2_BASFECP": "",
  "F2_BSFCCMP": "",
  "F2_BSFCPST": "",
  "F2_BASEPS3": "",
  "F2_VALPS3": "",
  "F2_BASECF3": "",
  "F2_VALCF3": "",
  "F2_MOEDA": "",
  "F2_NFORI": "",
  "F2_SERIORI": "",
  "F2_UFDEST": "",
  "F2_UFORIG": "",
  "F2_ESPECI1": "",
  "F2_VOLUME1": "",
  "F2_PLIQUI": "",
  "F2_PBRUTO": "",
  "F2_TRANSP": "",
  "F2_SDOC": "",
  "F2_CHVNFE": "",
  "F2_DAUTNFE": "",
  "F2_HAUTNFE": "",
  "F2_XVENPRE": "",
  "F3_PROTOC": "",
  "C5_PARC1": "",
  "C5_PARC2": "",
  "C5_PARC3": "",
  "C5_PARC4": "",
  "C5_PARC5": "",
  "C5_PARC6": "",
  "C5_PARC7": "",
  "C5_PARC8": "",
  "C5_PARC9": "",
  "C5_PARC10": "",
  "C5_PARC11": "",
  "C5_PARC12": "",
  "C5_DATA1": "",
  "C5_DATA2": "",
  "C5_DATA3": "",
  "C5_DATA4": "",
  "C5_DATA5": "",
  "C5_DATA6": "",
  "C5_DATA7": "",
  "C5_DATA8": "",
  "C5_DATA9": "",
  "C5_DATA10": "",
  "C5_DATA11": "",
  "C5_DATA12": "",
  "F3_DTCANC": "",
  "F3_CODRSEF": "",
  "CREPROCESSA": "",
  "F2_XCODREP": "",
  "F2_XCNPJRE": "",
  "F2_XMARCA": "",
  "ITENS": [
    {
      "D2_FILIAL": "",
      "D2_ITEM": "",
      "D2_COD": "",
      "D2_TP": "",
      "D2_UM": "",
      "D2_LOCAL": "",
      "D2_QUANT": "",
      "D2_PRCVEN": "",
      "D2_PRUNIT": "",
      "D2_TOTAL": "",
      "D2_DESC": "",
      "D2_DESCON": "",
      "D2_SEGURO": "",
      "D2_VALFRE": "",
      "D2_DESPESA": "",
      "D2_VALBRUT": "",
      "D2_EMISSAO": "",
      "D2_DTDIGIT": "",
      "D2_DOC": "",
      "D2_SERIE": "",
      "D2_SDOC": "",
      "D2_TIPO": "",
      "D2_ESPECIE": "",
      "D2_CLIENTE": "",
      "D2_LOJA": "",
      "D2_EST": "",
      "D2_CLASFIS": "",
      "D2_TES": "",
      "D2_CF": "",
      "D2_BASEIPI": "",
      "D2_IPI": "",
      "D2_VALIPI": "",
      "D2_BASEICM": "",
      "D2_PICM": "",
      "D2_VALICM": "",
      "D2_BASFECP": "",
      "D2_ALQFECP": "",
      "D2_VALFECP": "",
      "D2_BRICMS": "",
      "D2_ALIQSOL": "",
      "D2_MARGEM": "",
      "D2_ICMSRET": "",
      "D2_BSFCPST": "",
      "D2_ALFCPST": "",
      "D2_VFECPST": "",
      "D2_BASIMP5": "",
      "D2_ALQIMP5": "",
      "D2_VALIMP5": "",
      "D2_BASIMP6": "",
      "D2_ALQIMP6": "",
      "D2_VALIMP6": "",
      "D2_BASEPS3": "",
      "D2_ALIQPS3": "",
      "D2_VALPS3": "",
      "D2_BASECF3": "",
      "D2_ALIQCF3": "",
      "D2_VALCF3": "",
      "D2_DESCZFP": "",
      "D2_DESCZFC": "",
      "D2_BASEDES": "",
      "D2_ALIQCMP": "",
      "D2_PDORI": "",
      "D2_PDDES": "",
      "D2_DIFAL": "",
      "D2_BSFCCMP": "",
      "D2_ALFCCMP": "",
      "D2_VFCPDIF": "",
      "D2_CCUSTO": "",
      "D2_CONTA": "",
      "D2_PESO": "",
      "D2_ESTOQUE": "",
      "D2_NFORI": "",
      "D2_SERIORI": "",
      "D2_ITEMORI": "",
      "D2_XPRMDPR": "",
      "D2_XALIQBA": "",
      "D2_ORIGLAN": "",
      "D2_OP": "",
      "D2_XPDWISE": "",
      "D2_XPDLINX": "",
      "D2_XCOLEC": "",
      "D2_XCOLDE": ""
    }
  ]
}



Tratamento de Dados

Antes do envio, os campos numéricos do cupom são padronizados por rotina numérica, garantindo consistência de formato para integração.

- F2_VALMERC, F2_VALBRUT, F2_FRETE, F2_DESPESA, F2_SEGURO, F2_DESCONT, F2_VALFAT, F2_VALICM, F2_BASEICM, F2_ICMFRET, F2_VALIPI, F2_BASEIPI, F2_ICMSRET, F2_BRICMS, F2_BASIMP5, F2_VALIMP5, F2_BASIMP6, F2_VALIMP6, F2_BASFECP, F2_BSFCCMP, F2_BSFCPST, F2_BASEPS3, F2_VALPS3, F2_BASECF3, F2_VALCF3, F2_MOEDA, F2_VOLUME1, F2_PLIQUI, F2_PBRUTO, C5_PARC1, C5_PARC2, C5_PARC3, C5_PARC4, C5_PARC5, C5_PARC6, C5_PARC7, C5_PARC8, C5_PARC9, C5_PARC10, C5_PARC11, C5_PARC12: normalizados com o padrão da rotina numérica.

Nos itens (ITENS[]), os campos numéricos também são padronizados, com atenção especial à precisão:

- D2_QUANT: normalizado com 3 casas decimais (setNumeric(..., 3, false)).
- D2_PRCVEN, D2_PRUNIT: normalizado com 5 casas decimais (setNumeric(..., 5, false)).

- D2_TOTAL, D2_DESC, D2_DESCON, D2_SEGURO, D2_VALFRE, D2_DESPESA, D2_VALBRUT, D2_BASEIPI, D2_IPI, D2_VALIPI, D2_BASEICM, D2_PICM, D2_VALICM, D2_BASFECP, D2_ALQFECP, D2_VALFECP, D2_BRICMS, D2_ALIQSOL, D2_MARGEM, D2_ICMSRET, D2_BSFCPST, D2_ALFCPST, D2_VFECPST, D2_BASIMP5, D2_ALQIMP5, D2_VALIMP5, D2_BASIMP6, D2_ALQIMP6, D2_VALIMP6, D2_BASEPS3, D2_ALIQPS3, D2_VALPS3, D2_BASECF3, D2_ALIQCF3, D2_VALCF3, D2_DESCZFP, D2_DESCZFC, D2_BASEDES, D2_ALIQCMP, D2_XPRMDPR, D2_XALIQBA, D2_PDORI, D2_PDDES, D2_DIFAL, D2_BSFCCMP, D2_ALFCCMP, D2_VFCPDIF, D2_PESO: normalizados com o padrão da rotina numérica.

Integração com o Protheus

Chamada de integração com o Protheus
- Chamada: Requisição HTTP
- Recurso: documento_saida
- Método HTTP: POST
- Cabeçalhos:
  - tenantId: <UF_DA_FILIAL>,<F2_FILIAL> (montado a partir dos 2 primeiros caracteres de F2_FILIAL + vírgula + o valor completo de F2_FILIAL)
- Exemplo de payload enviado:
  - O payload segue a estrutura descrita na seção “Estruturação de Dados”, incluindo a lista ITENS.
- Tratamento de retorno:
  - Ausência de resposta: registra erro com mensagem de “não houve resposta” e finaliza o item como falha.
  - Resposta inválida/inesperada: se o retorno não puder ser interpretado como estrutura contendo Mensagem, registra erro de decodificação e finaliza como falha.
  - Indicadores de erro: finaliza como falha quando houver code no retorno ou quando Mensagem for ERRO. Quando disponível, utiliza Mensagem Detalhada como mensagem final, consolidando estrutura de erros quando ela vier como objeto/array.
  - Exceção de idempotência: quando a mensagem detalhada indicar que o documento já está cadastrado, ajusta o retorno para sucesso (Mensagem = OK) e remove o indicador code, permitindo concluir o item como integrado.
  - Sucesso: quando não houver indicadores de erro, finaliza como sucesso e persiste o retorno para auditoria.

Rotinas Inteligentes
setProtheusClienteIntegrado: validada antes da integração do documento. Garante que o cliente relacionado já esteja integrado para evitar envio inconsistente.
link: https://kb.illimitar.pro/books/integracao-linx-protheus/page/setprotheusclienteintegrado

setProtheusDocumentoSaidaIntegrado: executada após confirmação de sucesso. Marca o documento de saída como integrado para consistência do processo completo.
link: https://kb.illimitar.pro/books/integracao-linx-protheus/page/setprotheusdocumentosaidaintegrado

setProtheusCupomEcommerceIntegrado: executada após confirmação de sucesso. Marca o cupom do e-commerce como integrado, evitando reenvios desnecessários.
link: https://kb.illimitar.pro/books/integracao-linx-protheus/page/setprotheuscupomecommerceintegrado

setProtheusCupomFiscalIntegrado: executada após confirmação de sucesso. Registra o cupom fiscal como integrado para encerramento do fluxo de integração.
link: https://kb.illimitar.pro/books/integracao-linx-protheus/page/setprotheuscupomfiscalintegrado

setProtheusDocumentoCancelamentoCupomFiscal: executada após confirmação de sucesso. Dispara o registro de cancelamento do cupom fiscal quando aplicável no processo completo.
link: https://kb.illimitar.pro/books/integracao-linx-protheus/page/setprotheusdocumentocancelamentocupomfiscal

Tratamento de retorno

Ao final do processamento, o item é atualizado na tabela wosk_queue com o retorno do Protheus (quando existir), a mensagem consolidada e a situação final (sucesso/erro/suspenso). O tempo de processamento é registrado para acompanhamento operacional.

Encaminhamento em cenário de erro

Quando ocorre erro na integração (ausência de resposta, resposta inválida ou retorno com indicador de falha), o item é finalizado como erro e permanece registrado em wosk_queue com detalhes de mensagem e retorno, permitindo acompanhamento e reprocessamento conforme necessidade operacional.

Quando a falha estiver relacionada à dependência de integração do cliente, o item pode ser marcado como suspenso até que a condição seja atendida, evitando envio incompleto ao Protheus.

Notificação

A notificação de erros consulta itens com falha na tabela wosk_queue (serviço ProtheusCupomFiscalFull e situação de erro), ordenando pela data de processamento para priorizar ocorrências mais antigas. Para compor a listagem, a chave do item é decomposta para preencher F2_FILIAL, F2_DOC e F2_SERIE, e as datas data_adicionado e data são formatadas para apresentação. A mensagem de erro é higienizada para remover prefixos técnicos recorrentes e manter o conteúdo mais relevante, e o alerta é encaminhado por e-mail para os destinatários configurados.

Fluxo do Processo

Diagrama sem nome.jpg


Critérios de Aceitação

ProcessoSubprocessoDescriçãoSituação esperada
CapturadorCaptura cronológica e controle de posiçãoAo consultar a view WOSK_SERVICO_ENVIA_PROTHEUS_CUPOM_FULL com filtro por DATA_PARA_TRANSFERENCIA, ordenação e paginação, deve manter continuidade por posição persistida em wosk_monitor (evento, offset, data_posicao).Posição atualizada no controle do capturador e itens pendentes registrados para processamento assíncrono.
CapturadorCaptura manual por identificador compostoAo informar um identificador composto no padrão F2_FILIAL-F2_DOC-F2_SERIE, deve consultar a origem com filtros exatos desses campos e registrar o item correspondente para processamento, incluindo a lista ITENS.Item pendente registrado para processamento, associado ao cupom solicitado e apto a integração.
Fila de ProcessamentoIntegração com ProtheusAo processar um item pendente em wosk_queue (serviço ProtheusCupomFiscalFull), deve montar o payload conforme $field, aplicar padronização numérica (incluindo D2_QUANT com 3 casas e D2_PRCVEN/D2_PRUNIT com 5 casas) e realizar a requisição ao recurso documento_saida com cabeçalho tenantId.Item atualizado em wosk_queue com retorno/mensagem e situação final coerente (sucesso quando não houver erro; erro quando houver ausência de resposta, resposta inválida, code ou Mensagem = ERRO).
Fila de ProcessamentoNotificação de falhasQuando existirem ocorrências com falha persistidas em wosk_queue para o serviço ProtheusCupomFiscalFull, deve gerar notificação por e-mail priorizando itens mais antigos pela data de processamento.Destinatários recebem o alerta com F2_FILIAL, F2_DOC, F2_SERIE e a mensagem higienizada para análise.