LojaAjusteEstoque (STATUS: CRIADO)
Documentação Técnica
| Nome do cliente | OSKLEN |
| Nome do projeto | Integração LINX → ILLI ( |
| Biblioteca | |
| Data |
Histórico de Versões
| Data | Versão | Modificado por | Descrição da Mudança |
| 1.0 | Maykon/Gustavo | Criação da documentação técnica do processo Loja |
Descrição
Este serviço de clientesajuste de varejoestoque no LINX aenvia partircontagens doajustadas PDVe integraitens comde grade para o ILLIILLI, viaalinhando filao quandoestoque necessário.da loja ao processo corporativo.CoordenaGarante capturaque automáticaapenas oufiliais porprevistas código,participem, validarespeitando endereçodatas de transferência e documento e registra o resultadoestado de cada enviocaptura paraantes acompanhamento.de enfileirar e processar o envio.
Capturador
A captura automática consulta quando o estado do serviço CLIENTES_VAREJOESTOQUE_PROD_CONTAGEM está apto, com filtro por LojaClienteLojaAjusteEstoqueDATA_PARA_TRANSFERENCIA, ESTOQUE_AJUSTADO, filiais permitidas e exclusões de filiais centrais, ordenação por data e código e paginação conforme o limite configurado para o serviço , alinhada ao processamento cronológicoLojaClienteLojaAjusteEstoque. e ao semáforo de captura. Para cada linha, atualizamonta posição,a chave NOME_CONTAGEM-FILIAL, anexa os itens de ESTOQUE_PROD_CTG_AJUSTE e grava na fila de integração com serviço LojaClienteLojaAjusteEstoque e chave CODIGO_CLIENTE; ao final do lote ou em erro, atualiza o estado do capturador..
A origem dos dados é a tabela CLIENTES_VAREJO com enriquecimento por município e país via view W_LCF_LX_MUNICIPIO e tabela LCF_LX_PAIS. A captura por códigochave aceita umuma ou mais chaves no padrão -CODIGO_CLIENTENOME_CONTAGEMFILIAL; para cada chave válida, relê o cabeçalho da contagem em ESTOQUE_PROD_CONTAGEM, reutilizarecarrega aos mesma projeção com filtroitens em listaESTOQUE_PROD_CTG_AJUSTE e enfileira cada registro,reenfileira preservando o token quando já existir para ao mesmamesmo chave.registro na fila.
Fonte
Origem consultada: tabela ESTOQUE_PROD_CONTAGEM.
Consulta principal:
SELECT
CLI.CODIGO_CLIENTE,NOME_CONTAGEM,
CLI.CLIENTE_VAREJO,
CLI.CPF_CGC,
CLI.RG_IE,
CLI.ANIVERSARIO,
CLI.TIPO_LOGRADOURO,
CLI.ENDERECO,
CLI.NUMERO,
CLI.COMPLEMENTO,
CLI.BAIRRO,
CLI.CIDADE,
CLI.UF,
CLI.CEP,
CLI.PAIS,
LLM.COD_MUNICIPIO_IBGE AS IBGE,
LLP.COD_PAIS_BC AS PAIS_BC,
CLI.DDD,
CLI.TELEFONE,
CLI.DDD_CELULAR,
CLI.CELULAR,
CLI.EMAIL,
CLI.CODIGO_CONTATO,
CLI.FILIAL,
CLI.ESTRANGEIRO,EMISSAO,
CLI.TIPO_VAREJO,RESPONSAVEL,
CLI.TIPO_BLOQUEIO,
CLI.CADASTRAMENTO,
CLI.OBS,
CLI.SEXO,ESTOQUE_AJUSTADO,
CLI.STATUS,DATA_AJUSTE,
CLI.DATA_PARA_TRANSFERENCIATIPO,
SALDO_ARMAZENADO,
CONTAGEM_POR_AREA_FECHADA,
DATA_PARA_TRANSFERENCIA,
NOME_CONTAGEM_ANTERIOR
FROM
CLIENTES_VAREJO CLIESTOQUE_PROD_CONTAGEM (NOLOCK)
LEFT JOIN W_LCF_LX_MUNICIPIO LLM (NOLOCK) ON (
DBO.FX_REPLACE_CARACTER_ESPECIAL_NFE(DEFAULT, LTRIM(RTRIM(CLI.CIDADE))) = LLM.DESC_MUNICIPIO
AND CLI.UF = LLM.UF
)
LEFT JOIN LCF_LX_PAIS LLP (NOLOCK) ON (CLI.PAIS = LLP.DESC_PAIS)
Operações com Dados
Leitura: Consulta da tabela CLIENTES_VAREJOESTOQUE_PROD_CONTAGEM com LEFT JOIN em W_LCF_LX_MUNICIPIO e LCF_LX_PAIS, conforme SQL da seção Fonte.; itens de linha carregados a partir de ESTOQUE_PROD_CTG_AJUSTE pela mesma NOME_CONTAGEM usada no registro atual.
Consulta dinâmica (captura automática): reutiliza a projeção com filtroWHERE (lista derivada de emFILIAL IN (...)FILIAIS excluindo códigos fixos de estoque central e centro de distribuição), ESTOQUE_AJUSTADO = '1', DATA_PARA_TRANSFERENCIA >= o filtro efetivo (padrão de data quando não informado), ordenaçãoORDER BY DATA_PARA_TRANSFERENCIA ASC e paginação (OFFSET ... ROWS FETCH NEXT ... ROWS ONLY/FETCH) conforme o limite configurado para o serviço e o estado do LojaClienteLojaAjusteEstoquecapturador.capturador (offset, chave e data de posição).
Consulta dinâmica (captura por código)chave): mesma projeção com obtidos ao partir a chave informada.CODIGO_CLIENTEWHERE INNOME_CONTAGEM (= ... AND FILIAL = ...
Validação (captura por chave): a chave deve conter exatamente duas partes separadas por hífen (NOME_CONTAGEM e FILIAL).; caso contrário o fluxo interrompe com erro de chave inválida.
Persistência: grava itens pendentes na Fila de Processamento, com serviço e chave LojaClienteLojaAjusteEstoque-CODIGO_CLIENTENOME_CONTAGEMFILIAL (preservando token existente quando jáaplicável existirna para a mesma chave)recaptura); o estado do capturador mantém offset, chave de posiçãoo, data de posição, filtro e situação da(parado, captura.em execução, concluído ou erro).
Fila de Processamento
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 ILLI.
O fluxo marca o registro como em envio, montaenvia o corpo JSON para oao endpoint ILLI de pessoa/cliente,ajuste validade IBGE e código BACEN quando aplicável,estoque, interpreta o retorno JSON (success, message) e grava situação final, mensagem, tempo e auditoria de requisição na tabela da fila de integração.
Estruturação de Dados
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| Campo no payload ILLI | Campo de origem |
|
|
| |
| |
| |
| |
|
|
|
|
| |
|
|
|
|
ESTOQUE_AJUSTADO |
ESTOQUE_AJUSTADO |
DATA_AJUSTE |
DATA_AJUSTE |
TIPO |
TIPO |
SALDO_ARMAZENADO |
SALDO_ARMAZENADO |
CONTAGEM_POR_AREA_FECHADA |
CONTAGEM_POR_AREA_FECHADA |
DATA_PARA_TRANSFERENCIA |
DATA_PARA_TRANSFERENCIA |
NOME_CONTAGEM_ANTERIOR |
NOME_CONTAGEM_ANTERIOR |
ITENS |
Array montado a partir de ESTOQUE_PROD_CTG_AJUSTE (ver tabela dos elementos de ITENS) |
| Campo | Tipo | Obrigatório | Descrição |
|
string | sim | da |
|
string | sim | |
COR_PRODUTO |
string | sim | Cor do produto na grade. |
QTDE_AJUSTE |
string | sim | Quantidade de ajuste informada na contagem. |
A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20, A21, A22, A23, A24, A25, A26, A27, A28, A29, A30, A31, A32, A33, A34, A35, A36, A37, A38, A39, A40, A41, A42, A43, A44, A45, A46, A47, A48 |
string | não | Dimensões da grade do produto conforme definição no LINX. |
CUSTO1, CUSTO2, CUSTO3, CUSTO4 |
string | não | Valores de custo associados à linha de ajuste. |
CM_OPERACAO |
string | não | Indicador de operação de custo médio. |
DATA_PARA_TRANSFERENCIA |
string | sim | Data/hora de transferência da linha, alinhada ao cabeçalho quando aplicável. |
Exemplo ilustrativo de trecho do corpo enviado ao ILLI (estrutura resumida)alinhada ao conteudo):
{
"codigo"NOME_CONTAGEM": "...<NOME_CONTAGEM>",
"nome"FILIAL": "...<FILIAL>",
"endereco": {
"cep"EMISSAO": "00000000",
"referencia": "<EMISSAO>",
"logradouro"RESPONSAVEL": "...<RESPONSAVEL>",
"numero"OBS": "...<OBS>",
"complemento"ESTOQUE_AJUSTADO": "...<ESTOQUE_AJUSTADO>",
"bairro"DATA_AJUSTE": "...<DATA_AJUSTE>",
"cidade"TIPO": "...<TIPO>",
"uf"SALDO_ARMAZENADO": "...<SALDO_ARMAZENADO>",
"pais"CONTAGEM_POR_AREA_FECHADA": "...<CONTAGEM_POR_AREA_FECHADA>",
"codigo_ibge"DATA_PARA_TRANSFERENCIA": "...<DATA_PARA_TRANSFERENCIA>",
"codigo_bacen"NOME_CONTAGEM_ANTERIOR": "..."
},
"tipo_cliente": ["CLIENTE"],
"filialCadastro": "...<NOME_CONTAGEM_ANTERIOR>",
"contatos"ITENS": [
{
"tipo"NOME_CONTAGEM": "TELEFONE"<NOME_CONTAGEM>",
"contato"PRODUTO": "11999999999"<PRODUTO>",
"COR_PRODUTO": "<COR_PRODUTO>",
"QTDE_AJUSTE": "<QTDE_AJUSTE>",
"A1": "<A1>",
"A2": "<A2>",
"DATA_PARA_TRANSFERENCIA": "<DATA_PARA_TRANSFERENCIA_ITEM>"
}
],
"situacao": "1",
"tipo": "FISICA",
"cpf": "00000000000"
}
Tratamento de Dados
Sobre o registroprocessamento atualna lidoclasse Queue antes do conteudo na fila:envio:
DDD,Base do envio: o arrayTELEFONEconteudo,DDD_CELULAR,doCELULAR:registronormalizadosatualcoméremoçutilizado diretamente como corpo da requisição ao ILLI, sem mapeamento adicional declarado em lista de campos no arquivo analisado.- Registro atual em exceção: quando a mensagem de exceção indica retorno JSON não
dígitosreconhecidoe(prefixomontagemtextualdepadronizadoentradasnoemfluxo),o retorno persistido pode incluir estrutura comcontatostiposTELEFONE,CELULAReEMAILquando informados. TIPO_LOGRADOURO,ENDERECO:concatenados para formar o logradouro completo; se o resultado exceder 250 caracteres, aplicadosubstraté 250.COMPLEMENTO:se o comprimento exceder 250 caracteres, aplicadosubstraté 250.CEP:somente dígitos e preenchimento à esquerda com zeros até tamanho 8.NUMERO:somente dígitos no payload de endereço.UF:se vazio ou com mais de 2 caracteres, usa regra condicionada aESTRANGEIRO(incluindo uso deEXpara estrangeiro).CPF_CGC,RG_IE:documentos numéricos padronizados com zeros à esquerda conforme tipo físico ou jurídico; tipo derivado pelo tamanho numérico deCPF_CGCapós normalização.Validação pré-envio:para não estrangeiro comUFdiferente deEX, exigeIBGEpreenchido; para qualquer registro, exigePAIS_BCpreenchido (mensagensindicador de erroespecíficasesetrechoausentes).de dados interpretado.
Integração com o ILLI
Chamada de integração com o ILLI (via rotina de integração):
- Chamada:
Requisição HTTP(encapsulada pela rotina de envio ao ILLI). - Recurso:
/bibliotecas/48df1d4a-2a73-4afc-be75-a8104533cda0/ilx_pessoa/setClientee3a6737d-ac74-4ed6-9668-e3921320c29f/ilx_ajuste_estoque/setAjuste - Método HTTP:
POST - Cabeçalhos: os definidos internamente pela rotina de integração ILLI (não fixados neste arquivo).
- Corpo: objeto JSON
comcorrespondenteos campos mapeados a partir doaoconteudodo registro da fila, incluindoendereco,o arraycontatosITENS, documentos e metadados de cadastro..
Exemplo de corpo enviado (estrutura alinhada ao objeto montado no código; valores ilustrativos):
{
"id": false,
"codigo": "00000000000123",
"nome": "Cliente Exemplo",
"endereco": {
"cep": "01310100",
"referencia": "",
"logradouro": "RUA EXEMPLO 100",
"numero": "100",
"complemento": "SALA 1",
"bairro": "CENTRO",
"cidade": "SAO PAULO",
"uf": "SP",
"pais": "BRASIL",
"codigo_ibge": "3550308",
"codigo_bacen": "1058"
},
"tipo_cliente": ["CLIENTE"],
"filialCadastro": "FILIAL01",
"genero": "M",
"grupo": "CLIENTE VAREJO",
"complemento": "OBS",
"contatos": [
{ "tipo": "TELEFONE", "contato": "11999999999" }
],
"situacao": "1",
"data_nascimento": "1990-01-01 00:00:00",
"data_cadastro": "2024-01-01 10:00:00",
"data": "2024-01-02 08:00:00",
"tipo": "FISICA",
"cpf": "12345678901",
"identidade": "1234567"
}
Tratamento de retorno
Ausência de resposta: lança exceção indicando que não houve resposta JSON; situação final 4 na tabela da fila de integração.
Resposta vazia decom success e message: ambos vazios: tratada como retorno não reconhecido (exceção), situação 4.
Sucesso: quando success não está vazio, situação 2; caso contrário situação 4 com mensagem em message quando existir.
Em exceção genérica, a mensagem é persistida; se a mensagem indicar JSON não reconhecido, o retorno estruturado pode incluir campos de erro e errordados datacom o trecho analisado.parseados.
Notificação
A notificação de erros consulta registros com falha na tabela da fila de integração para o serviço e situação de erro, ordenando pelo horário de processamento para priorizar ocorrências mais antigas.LojaClienteLojaAjusteEstoque
Endpoint (API)
O endpoint processa o cadastro de cliente de varejo a partir do corpo da requisição: o fluxo de entrada é o array de parâmetros no processamento principal, validado contra tipo e obrigatoriedade conforme o schema do serviço, com persistência em CLIENTES_VAREJO e regras de inclusão, atualização, filial e documento. O payload de entrada é um objeto JSON (ou equivalente) cujas chaves correspondem aos campos da tabela ao final da subseção Estruturação de Dados; campos adicionais usados apenas no fluxo interno (CODIGO_CLIENTE, TIPO_VAREJO, OMS, entre outros) podem acompanhar o mesmo corpo quando o chamador os informar.
Estruturação de Dados
Campos adicionais tratados no fluxo interno de gravação (validação complementar e insert/update em CLIENTES_VAREJO): CODIGO_CLIENTE, TIPO_VAREJO, CADASTRAMENTO, DATA_PARA_TRANSFERENCIA, OMS, entre outros previstos no processamento de persistência.
Chamada:Requisição HTTPRecurso:/bibliotecas/1be199d8-98e8-4de7-a92c-e59c2f08edd6/wosk_loja_cliente(caminho declarado no arquivo PHP da biblioteca)Método HTTP:POST
Exemplo de payload enviado para o endpoint (JSON):
{
"key": "<API_KEY_OU_VAZIO>",
"CLIENTE_VAREJO": "Nome do Cliente",
"FILIAL": "01",
"PF_PJ": true,
"ESTRANGEIRO": false,
"CPF_CGC": "12345678901",
"ENDERECO": "Rua Exemplo",
"UF": "SP",
"CEP": "01310100"
} | |||
| |||
| |||
| |||
| |||
| | ||
| |||
| |||
| |||
| |||
| |||
| |||
| |||
| |||
| |||
| |||
| |||
| |||
| | ||
| |||
| |||
| |||
| | ||
| |||
|
Tratamento de Dados
No método de gravação do cadastro (pré-insert/update e persistência):
CADASTRAMENTO,DATA_PARA_TRANSFERENCIA:definidos com data/hora atual no início do processamento da requisição.TIPO_VAREJO:se não existir na lista carregada deCLIENTE_VAR_TIPOS, forçado paraCLIENTE VAREJO.ESTRANGEIRO:se vazio, definido como0; seUFforEX, definido como1.SEXO:se vazio, removido do conjunto de parâmetros antes da gravação.CEP:se informado e numericamente zero após avaliação, substituído por sentinelaNULL()para o insert.CODIGO_CLIENTE:se vazio após normalização, preenchido comCPF_CGCou, para estrangeiro, comRG_IE; validação específica de obrigatoriedade e tamanho aplicada em seguida.Inclusão:verifica duplicidade de documento versus código para não estrangeiro; converteFILIALnumérica para nome viaFILIAIS; prefixaOBScom texto fixo de origem PDV; executa insert parametrizado emCLIENTES_VAREJOconforme colunas previstas para o cadastro.Alteração:reaproveitaCODIGO_CLIENTE,FILIAL,CADASTRAMENTOeTIPO_VAREJOdo registro localizado; seOMSfor diferente de1, recalculaDATA_PARA_TRANSFERENCIAe aplica estratégia de mesclagem campo a campo conformeCADASTRAMENTOanterior antes doUPDATE; seOMSfor1, o bloco de atualização é ignorado.
Persistência no LINX
Chamada de persistência no banco LINX:
Chamada:Operação em banco(insert ou update parametrizado).Tabelas:CLIENTES_VAREJO(principal); consultas auxiliares aCLIENTE_VAR_TIPOSeFILIAISpara listas e resolução de filial.Processamento:transação com commit ao sucesso ou rollback em falha; erros encapsulados com prefixoCLIENTES_VAREJO:na mensagem.
Tratamento de retorno
Sucesso: retorno com Mensagem igual a OK e Mensagem Detalhada indicando registro com sucesso, além dos campos CODIGO_CLIENTE, CADASTRAMENTO e DATA_PARA_TRANSFERENCIA atualizados no array de resposta.Falha de validação inicial: exceção com mensagens concatenadas dos erros de campo.Falha na gravação: exceção com mensagem originada do banco ou regra de negócio (incluindo conflito de documento/código).
O endpoint não implementa envio de notificação de erros; o acompanhamento de falhas da integração em fila é tratado na Fila de Processamento.
Fluxo do Processo
Critérios de Aceitação
| Processo | Subprocesso | Descrição | Situação esperada |
| Capturador | Captura e enfileiramento | Com estado apto e com ESTOQUE_AJUSTADO, data mínima de transferência e ESTOQUE_PROD_CTG_AJUSTE e gravar cada e chave -FILIAL. |
Registro pendente na fila com conteúdo alinhado às |
| Capturador | Captura por |
Para cada chave no padrão FILIAL, deve token quando |
|
| Fila de Processamento | Integração ILLI | Ao processar registro pendente, deve conteudo /bibliotecas/, interpretar o retorno quanto à situação de sucesso ou erro com mensagem (success, message) e persistir na tabela da fila de integração a situação final (códigos 2 ou 4 conforme o caso), a mensagem retornada e o tempo de processamento. |
Fila atualizada com situação final e auditoria coerentes com o retorno do ILLI. |
|
