Ir para o conteúdo principal

PRINCIPAL

Documentação Técnica
Nome do clienteOSKLEN
Nome do projetoIntegração LINX (Venda PDV)
Bibliotecawosk_loja_venda
Data27/03/2026

Histórico de Versões
DataVersãoModificado porDescrição da Mudança
26/03/20261.0Maykon/GustavoCriação da documentação técnica do processo Loja Venda (LINX).

Descrição

Este serviço de venda do PDV é exposto como endpoint e recebe, por requisição HTTP, estruturas aninhadas (venda, pagamentos, produtos, troca, vitrine, vendedores, cancelamentos, cancelamento fora do prazo e fechamento de caixa, entre outros blocos opcionais). O processamento valida o corpo, aplica regras de negócio e persiste no banco LINX em tabelas como LOJA_VENDA, LOJA_VENDA_PGTO, LOJA_CAIXA_LANCAMENTOS, ILLIMITAR_PDV_CONTROLE_VENDA e demais entidades tratadas pelos métodos internos.

Endpoint (API)

O método principal valida o payload raiz e processa blocos opcionais: VENDAS (com validação de produtos quando informados, comissão de vendedor, lançamento de caixa, controle de ticket, pagamentos e parcelas, venda, vendedores e produtos da venda), VENDEDORES, CANCELAMENTOS, CANCELAMENTO_PRAZO e FECHAMENTO_CAIXA, cada um com try/catch próprio e retorno de Mensagem/Mensagem Detalhada no sub-objeto.

  • Chamada: Requisição HTTP
  • Recurso: /bibliotecas/2cd82f28-3bbf-4f82-bbd8-383f7a912b4f/wosk_loja_venda
  • Método HTTP: POST

Estruturação de Dados

A tabela a seguir descreve o objeto raiz do corpo JSON. Os blocos opcionais VENDEDORES, CANCELAMENTOS, CANCELAMENTO_PRAZO e FECHAMENTO_CAIXA são processados quando o primeiro elemento do array estiver presente, cada um com tratamento de retorno próprio no fluxo de processamento do serviço.

Objeto raiz do payload
CampoTipo
keystring
VENDASarray
VENDEDORESarray
CANCELAMENTOSarray
CANCELAMENTO_PRAZOarray
FECHAMENTO_CAIXAarray
eventIdstring

Cada elemento de VENDAS[]
CampoTipo
COstring
XMLstring
DATAstring
MOBILEstring
TICKETstring
DESCONTOstring
NF_CHAVEstring
NF_SERIEnumber
PRODUTOSarray
TERMINALnumber
VENDEDORstring
NF_MODELOnumber
NF_NUMEROnumber
UF_FILIALstring
XML_TROCAstring
COD_FILIALstring
DATA_TROCAstring
PAGAMENTOSarray
QTDE_TOTALnumber
UF_CLIENTEstring
VALOR_PAGOnumber
VALOR_FRETEnumber
VALOR_TROCAnumber
DATA_VITRINEstring
VALOR_VITRINEnumber
CODIGO_CLIENTEstring
NF_CHAVE_TROCAstring
NF_SERIE_TROCAstring
OPERACAO_VENDAstring
PRODUTOS_TROCAarray
NF_MODELO_TROCAstring
NF_NUMERO_TROCAstring
UF_FILIAL_TROCAstring
CODIGO_TAB_PRECOstring
LANCAMENTO_CAIXAstring
PRODUTOS_VITRINEarray
QTDE_TROCA_TOTALnumber
UF_CLIENTE_TROCAstring
ID_PEDIDO_VITRINEstring
VALOR_VENDA_BRUTAstring
ID_EXCECAO_IMPOSTOstring
QTDE_VITRINE_TOTALnumber
CODIGO_CLIENTE_TROCAstring
NUMERO_TITULO_VITRINEstring
CODIGO_TAB_PRECO_TROCAstring
VALOR_DESCONTO_VITRINEnumber
CODIGO_TAB_PRECO_VITRINEstring
ID_EXCECAO_IMPOSTO_TROCAstring
NATUREZA_OPERACAO_CODIGOstring
NATUREZA_OPERACAO_CODIGO_TROCAstring

O valor de VENDAS[].XML é uma única string com o XML integral. Na NFC-e em layout 4.00, a hierarquia típica inclui os blocos abaixo (nomes de elemento conforme schema da NF-e; quantidade de det e autXML varia por nota).

Cada elemento de VENDAS[].PRODUTOS[]
CampoTipo
ITEMnumber
QTDEnumber
CUSTOnumber
VENDAnumber
CODIGO_EANstring
QTDE_BRINDEnumber
VALOR_TOTALnumber
CODIGO_BARRAstring
DESCONTO_ITEMnumber
PRECO_LIQUIDOnumber
ID_EXCECAO_IMPOSTOstring
RATEIO_DESCONTO_VENDAnumber
INSUMOstring

Cada elemento de VENDAS[].PAGAMENTOS[]
CampoTipo
ITEMnumber
TXIDstring
TROCOnumber
VALORnumber
PARCELASnumber
TIPO_PGTOstring
ENDTOENDIDstring
VENCIMENTOstring
DATA_HORA_TEFstring
NUMERO_TITULOstring
COD_FORMA_PGTOstring
REDE_CONTROLADORAstring
CODIGO_ADMINISTRADORAstring
NUMERO_APROVACAO_CARTAOstring

Cada elemento de VENDEDORES[] (alteração de vendedor)
CampoTipo
COstring
COD_FILIALstring
TERMINALnumber
DATAstring
VENDEDORstring
CODIGO_CLIENTEstring
ACESSO_GERENCIALnumber

Cada elemento de CANCELAMENTOS[]
CampoTipo
COstring
COD_FILIALstring
TERMINALnumber
DATAstring
DATA_CANCELAMENTOstring

Cada elemento de CANCELAMENTO_PRAZO[]
CampoTipo
COstring
COD_FILIALstring
TERMINALnumber
DATAstring
NF_NUMEROnumber
NF_SERIEnumber
TICKETstring
LANCAMENTO_CAIXAstring
DATA_DEVOLUCAOstring
CODIGO_CLIENTEstring
CODIGO_TAB_PRECOstring
VENDEDORstring
NF_MODELOnumber
NF_CHAVEstring
XMLstring
NATUREZA_OPERACAO_CODIGOstring
ID_EXCECAO_IMPOSTOstring
UF_FILIALstring
UF_CLIENTEstring
PRODUTOSarray

Cada elemento de FECHAMENTO_CAIXA[]
CampoTipo
DATAstring
TERMINALnumber
LANCAMENTO_CAIXAstring
COD_FILIALstring

Exemplo de payload enviado para o endpoint (JSON):

Exemplo alinhado a um envio real de venda com NFC-e: todos os campos do objeto em VENDAS[0] aparecem na mesma ordem típica da integração. O campo XML contém, em produção, o documento XML completo (estrutura na tabela de blocos acima). Valores pessoais, fiscais e de transação foram substituídos por dados fictícios ou mascarados. Na mesma requisição podem ser enviados também VENDEDORES, CANCELAMENTOS, CANCELAMENTO_PRAZO e FECHAMENTO_CAIXA conforme tabelas desta seção.

{
  "key": "00000000-0000-4000-8000-000000000001",
  "VENDAS": [
    {
      "CO": "352-00000000000-00",
      "XML": "<?xml version=\"1.0\" encoding=\"UTF-8\"?><nfeProc versao=\"4.00\" xmlns=\"http://www.portalfiscal.inf.br/nfe\"><!-- XML completo da NFC-e autorizada: NFe, infNFe (ide, emit, dest, det, total, transp, pag, infAdic), infNFeSupl, Signature, protNFe --></nfeProc>",
      "DATA": "2025-10-04 16:14:24",
      "MOBILE": "0",
      "TICKET": "",
      "DESCONTO": "0",
      "NF_CHAVE": "29251000000000000000000000000000000000",
      "NF_SERIE": 65,
      "PRODUTOS": [
        {
          "ITEM": 1,
          "QTDE": 1,
          "CUSTO": 41.18,
          "VENDA": 247,
          "CODIGO_EAN": "",
          "QTDE_BRINDE": 0,
          "VALOR_TOTAL": 247,
          "CODIGO_BARRA": "0000000000X",
          "DESCONTO_ITEM": 0,
          "PRECO_LIQUIDO": 247,
          "ID_EXCECAO_IMPOSTO": "11422",
          "RATEIO_DESCONTO_VENDA": 0
        }
      ],
      "TERMINAL": 1,
      "VENDEDOR": "B000",
      "NF_MODELO": 65,
      "NF_NUMERO": 66664,
      "UF_FILIAL": "BA",
      "XML_TROCA": "",
      "COD_FILIAL": "000000",
      "DATA_TROCA": "",
      "PAGAMENTOS": [
        {
          "ITEM": 1,
          "TXID": "",
          "TROCO": 0,
          "VALOR": 247,
          "PARCELAS": 1,
          "TIPO_PGTO": "I",
          "ENDTOENDID": "",
          "VENCIMENTO": "2025-11-03 16:14:24",
          "DATA_HORA_TEF": "2025-10-04 16:13:49",
          "NUMERO_TITULO": "000000000",
          "COD_FORMA_PGTO": "##",
          "REDE_CONTROLADORA": "REDC",
          "CODIGO_ADMINISTRADORA": "25",
          "NUMERO_APROVACAO_CARTAO": "000000000"
        }
      ],
      "QTDE_TOTAL": 1,
      "UF_CLIENTE": "BA",
      "VALOR_PAGO": 247,
      "VALOR_FRETE": 0,
      "VALOR_TROCA": 0,
      "DATA_VITRINE": "",
      "VALOR_VITRINE": 0,
      "CODIGO_CLIENTE": "***000000**",
      "NF_CHAVE_TROCA": "",
      "NF_SERIE_TROCA": "000",
      "OPERACAO_VENDA": "01",
      "PRODUTOS_TROCA": [],
      "NF_MODELO_TROCA": "",
      "NF_NUMERO_TROCA": "",
      "UF_FILIAL_TROCA": "BA",
      "CODIGO_TAB_PRECO": "00",
      "LANCAMENTO_CAIXA": "",
      "PRODUTOS_VITRINE": [],
      "QTDE_TROCA_TOTAL": 0,
      "UF_CLIENTE_TROCA": "BA",
      "ID_PEDIDO_VITRINE": "",
      "VALOR_VENDA_BRUTA": "247",
      "ID_EXCECAO_IMPOSTO": "",
      "QTDE_VITRINE_TOTAL": 0,
      "CODIGO_CLIENTE_TROCA": "",
      "NUMERO_TITULO_VITRINE": "",
      "CODIGO_TAB_PRECO_TROCA": "00",
      "VALOR_DESCONTO_VITRINE": 0,
      "CODIGO_TAB_PRECO_VITRINE": "00",
      "ID_EXCECAO_IMPOSTO_TROCA": "",
      "NATUREZA_OPERACAO_CODIGO": "5102.",
      "NATUREZA_OPERACAO_CODIGO_TROCA": ""
    }
  ],
  "eventId": "00000000-0000-4000-8000-000000000002"
}

Processamento de Dados

{{VENDAS}}

{{VENDEDORES}}

{{CANCELAMENTOS}}

{{CANCELAMENTO_PRAZO}}

{{FECHAMENTO_CAIXA}}

    {{TRATAMENTO_DADOS}}

    Fonte

    Todas as operações usam conexão SQL Server via PDO. Inserções e atualizações são montadas por sqlPrepareInsert e sqlPrepareUpdate na cadeia de classes base (trait Common / util).

    Consulta utilizada para obter o próximo lançamento de caixa (@data no formato AAAA-MM-DD 00:00:00):

    SELECT dbo.fn_GetNextPaymentSequence('<codigoFilial>', '<terminal>', '<data>') AS LANCAMENTO_CAIXA

    Origem consultada: função dbo.fn_GetNextPaymentSequence. Uso no código: sqlGetLancamentoCaixa.

    Consulta utilizada para resolver o identificador da relação CEST/NCM (resultado pode ser cacheado em $_ENV['_CEST_NCM']):

    SELECT
        A.ID AS IDA
    FROM
        CEST_NCM A
        INNER JOIN TABELA_LX_NCM B ON (B.ID = A.ID_NCM)
        INNER JOIN TABELA_LX_CEST C ON (C.ID = A.ID_CEST)
    WHERE
        C.CODIGO_CEST = '<CEST>'
        AND B.CODIGO_NCM = '<NCM>'

    Origem consultada: tabelas CEST_NCM, TABELA_LX_NCM e TABELA_LX_CEST. Uso no código: getCestNCM.

    Consulta utilizada para obter os três últimos lançamentos de caixa do terminal e filial (WHERE com data completa e, quando aplicável, meia-noite do dia derivado de <DATA>):

    SELECT TOP 3
        *
    FROM
        LOJA_CAIXA_LANCAMENTOS
    WHERE
        TERMINAL = '<TERMINAL>'
        AND CODIGO_FILIAL = '<CODIGO_FILIAL>'
        AND TIPO_LANCAMENTO_CAIXA IN ('00', 'RT')
        AND (
            DIGITACAO <= '<DATA>'
            OR DIGITACAO = '<DATA_MEIA_NOITE>'
        )
    ORDER BY
        DIGITACAO DESC

    Origem consultada: tabela LOJA_CAIXA_LANCAMENTOS. Uso no código: getCaixaLancamento.

    Consulta utilizada para montar parte do NSU do pedido vitrine (<codigo> é o identificador numérico do pedido; o valor final concatenado no PHP inclui a data em formato Ymd):

    SELECT
        'I'
        + RIGHT('0' + RTRIM(CONVERT(CHAR(2), DATEPART(MONTH, '<data>'))), 2)
        + RIGHT('000000' + CONVERT(VARCHAR(8), <codigo>), 5) AS NSU

    Origem consultada: expressão escalar em T-SQL, sem objeto de tabela no FROM. Uso no código: sqlGetNsuVitrine.

    Consulta utilizada para calcular o próximo TICKET da filial; se não houver sequência e existir registro em ILLIMITAR_PDV_CONTROLE_VENDA para a filial, o fluxo lança exceção; caso contrário usa 00000001:

    SELECT
        RIGHT(REPLICATE('0', 8) + CONVERT(VARCHAR(8), CONVERT(INT, MAX(TICKET)) + 1), 8) AS SEQ
    FROM
        ILLIMITAR_PDV_CONTROLE_VENDA
    WHERE
        CODIGO_FILIAL = '<CODIGO_FILIAL>'

    Origem consultada: tabela ILLIMITAR_PDV_CONTROLE_VENDA. Uso no código: sqlGetTicket.

    Consultas de leitura montadas dinamicamente por sqlSimpleQuery (lista de colunas, tabela, WHERE a partir de pares campo/valor, ORDER BY e TOP opcionais):

    SELECT TOP <n>
        <col1>,
        <col2>,
        ...
    FROM
        [dbo].[NOME_TABELA] (NOLOCK)
    WHERE
        <coluna> = '<valor>'
        AND ...
    ORDER BY
        <coluna> ASC|DESC

    Operações com Dados

    Leitura: consultas às tabelas e à view listadas na secção Fonte para validar produto e preço, resolver CEST/NCM e regras fiscais auxiliares, carregar filial, loja varejo e terminal, obter ou confirmar lançamento de caixa, controle Illimitar e cabeçalhos/itens de venda existentes antes de inserir ou atualizar.

    Sequências e apoio de caixa: uso da função fn_GetNextPaymentSequence para LANCAMENTO_CAIXA, da consulta TOP 3 em LOJA_CAIXA_LANCAMENTOS para contexto de caixa, do cálculo de NSU para vitrine e da sequência de TICKET em ILLIMITAR_PDV_CONTROLE_VENDA.

    Persistência: gravação e atualização nas tabelas LINX do PDV (entre outras LOJA_VENDA, LOJA_VENDA_PGTO, LOJA_VENDA_PARCELAS, LOJA_VENDA_VENDEDORES, LOJA_VENDA_PRODUTO, LOJA_VENDA_TROCA, LOJA_VENDA_TROCA_ORIGEM, LOJA_CAIXA_LANCAMENTOS, ILLIMITAR_PDV_CONTROLE_VENDA) conforme cada bloco do payload processado pelo serviço.

    Tratamento de retorno

    Cada bloco opcional, quando o primeiro elemento do respectivo array estiver presente, atualiza o elemento processado com Mensagem OK ou ERROR e Mensagem Detalhada; o objeto raiz recebe os campos Mensagem e Mensagem Detalhada do último bloco executado; o retorno é registrado em auditoria antes de devolver o array.

    Fluxo do Processo

    Diagrama do processo


    Critérios de Aceitação
    ProcessoSubprocessoDescriçãoSituação esperada
    Endpoint (API)Venda completaCom VENDAS[0] válido, o fluxo monta lançamento de caixa, controle de ticket, pagamentos e parcelas, cabeçalho da venda, vendedores e itens (e troca/vitrine quando informados), interpreta sucesso ou falha com mensagem e retorna Mensagem e Mensagem Detalhada no objeto.Mensagem OK ou ERROR com detalhe em Mensagem Detalhada.
    Endpoint (API)Alteração de vendedorCom VENDEDORES[0] e CO informado, localiza a venda e aplica alteração de vendedor com comissão coerente.Mensagem OK ou ERROR com detalhe em Mensagem Detalhada.
    Endpoint (API)CancelamentoCom CANCELAMENTOS[0] e CO informado, executa cancelamento em cascata nas entidades de venda.Mensagem OK ou ERROR com detalhe em Mensagem Detalhada.
    Endpoint (API)Cancelamento fora do prazoCom CANCELAMENTO_PRAZO[0], atualiza dados fiscais de cancelamento quando a venda for localizada; valida produtos quando o array PRODUTOS vier preenchido.Mensagem OK ou ERROR com detalhe em Mensagem Detalhada.
    Endpoint (API)Fechamento de caixaCom FECHAMENTO_CAIXA[0] contendo DATA, TERMINAL, COD_FILIAL e LANCAMENTO_CAIXA (conforme integração), registra fechamento quando a abertura do dia existir; caso contrário mensagem informa que o fechamento foi ignorado.Mensagem OK com detalhe de sucesso ou de ignorado; ou ERROR com exceção.