Ir para o conteúdo principal

ProtheusDocumentoEntradaFull (STATUS: PARCIAL)

Documentação Técnica

Nome do cliente OSKLEN
Nome do projeto Integração LINX → Protheus
Biblioteca wosk_protheus_documento_entrada_full
Data 03/03/2026


Histórico de Versões

Data Versão Modificado por Descrição da Mudança
03/03/2026 1.0 Maykon/Gustavo Criação da documentação técnica do processo ProtheusDocumentoEntradaFull.

Descrição

Este processo captura documentos de entrada completos do LINX e os prepara para integração no Protheus.
O fluxo garante paginação por data, estruturação integral do payload e registro do resultado de processamento na fila.

Capturador

Descrição Conceitual

Captura documentos de entrada pendentes na origem e registra cada documento para processamento em fila, mantendo controle de continuidade por offset, chave de posição e data de posição.

A captura aplica filtro por DATA_PARA_TRANSFERENCIA e usa ordenação/paginação por data, caracterizando processamento cronológico (ordenação/paginação por data).
link: Cronológico

Fonte

Origem consultada: view WOSK_SERVICO_ENVIA_PROTHEUS_ENTRADAS_FULL.

Consulta base (a condição de filtro/paginação é aplicada dinamicamente durante o fluxo):

SELECT
                                F1_FILIAL,
                                F1_DOC,
                                F1_SERIE,
                                F1_FORNECE,
                                F1_LOJA,
                                F1_COND,
                                F1_XNATUR,
                                F1_DUPL,
                                F1_EMISSAO,
                                F1_DTDIGIT,
                                F1_RECBMTO,
                                F1_EST,
                                F1_ESTPRES,
                                F1_TIPO,
                                F1_FORMUL,
                                F1_ESPECIE,
                                F1_VALMERC,
                                F1_VALBRUT,
                                F1_FRETE,
                                F1_DESPESA,
                                F1_SEGURO,
                                F1_DESCONT,
                                F1_BASEICM,
                                F1_VALICM,
                                F1_BASEIPI,
                                F1_VALIPI,
                                F1_BRICMS,
                                F1_ICMSRET,
                                F1_BASIMP5,
                                F1_VALIMP5,
                                F1_BASIMP6,
                                F1_VALIMP6,
                                BASEPS3,
                                VALPS3,
                                BASECF3,
                                VALCF3,
                                F1_MUORITR,
                                F1_UFORITR,
                                F1_MUDESTR,
                                F1_UFDESTR,
                                F1_II,
                                F1CIF,
                                F1_TIPO_NF,
                                F1_CHVNFE,
                                F1_DAUTNFE,
                                F1_HAUTNFE,
                                F1_PROTOC,
                                F1_NFELETR,
                                F1_EMINFE,
                                F1_HORNFE,
                                F1_TPFRETE,
                                F1_TPCTE,
                                P1_PLIQUI,
                                P1_PBRUTO,
                                P1_ESPECI1,
                                P1_VOLUME1,
                                F1_ORIGLAN,
                                F1_NFORIG,
                                F1_SERORIG,
                                F1_NUMTRIB,
                                F1_MOEDA,
                                F1_PREFIXO,
                                F1_STATUS,
                                F1_SDOC,
                                F1_TRANSP,
                                F1_XNATOPE,
                                F1_XCANAL,
                                F3_DTCANC,
                                F3_CODRSEF,
                                CREPROCESSA,
                                DATA_PARA_TRANSFERENCIA
                            FROM 
                                WOSK_SERVICO_ENVIA_PROTHEUS_ENTRADAS_FULL (NOLOCK)

Operações com Dados

Leitura: consulta documentos na origem com filtro por DATA_PARA_TRANSFERENCIA e paginação por data, com limite por lote configurável. Para cada documento recuperado, monta a chave do item, consulta os itens completos e registra o conteúdo para processamento.

Consulta de itens do documento:

SELECT
                        D1_FILIAL,
                        FORMAT(ROW_NUMBER() OVER (ORDER BY (SELECT NULL)), '000') AS D1_ITEM,
                        D1_COD,
                        B1_TP,
                        B1_UM,
                        B1_LOCAL,
                        B1_GRUPO,
                        D1_TEC,
                        D1_QUANT,
                        D1_VUNIT,
                        D1_TOTAL,
                        D1_DESC,
                        D1_VALDESC,
                        D1_SEGURO,
                        D1_VALFRE,
                        D1_DESPESA,
                        D1_EMISSAO,
                        D1_DTDIGIT,
                        D1_DOC,
                        D1_SERIE,
                        F1_SDOC,
                        D1_TIPO,
                        D1_FORNECE,
                        D1_LOJA,
                        D1_CLASFIS,
                        D1_OPER,
                        D1_CF,
                        D1_BASEIPI,
                        D1_IPI,
                        D1_VALIPI,
                        D1_BASEICM,
                        D1_PICM,
                        D1_VALICM,
                        D1_VRDICMS,
                        D1_VALANTI,
                        D1_ICMSDIF,
                        D1_BASFECP,
                        D1_ALQFECP,
                        D1_VALFECP,
                        D1_ALIQCMP,
                        D1_DIFAL,
                        D1_BSFCCMP,
                        D1_ALFCCMP,
                        D1_VFCPDIF,
                        D1_AFCPANT,
                        D1_VFCPANT,
                        D1_BRICMS,
                        D1_ALIQSOL,
                        D1_MARGEM,
                        D1_ICMSRET,
                        D1_BSFCPST,
                        D1_ALFCPST,
                        D1_VFECPST,
                        D1_BASIMP5,
                        D1_ALQIMP5,
                        D1_VALIMP5,
                        D1_BASIMP6,
                        D1_ALQIMP6,
                        D1_VALIMP6,
                        D1_ALIQII,
                        D1_II,
                        D1_CIF,
                        D1_TIPO_NF,
                        D1_OP,
                        D1_CC,
                        D1_CONTA,
                        D1_PESO,
                        D1_DATORI,
                        D1_NFORI,
                        D1_SERIORI,
                        D1_ITEMORI,
                        D1_ORIGLAN,
                        DATA_PARA_TRANSFERENCIA
                    FROM 
                        WOSK_SERVICO_ENVIA_PROTHEUS_ENTRADAS_ITEM_FULL (NOLOCK)
                    WHERE
                        D1_FILIAL = '{F1_FILIAL}'
                        AND D1_DOC = '{F1_DOC}'
                        AND D1_SERIE = '{F1_SERIE}'
                        AND D1_FORNECE = '{F1_FORNECE}'
                        AND D1_LOJA = '{F1_LOJA}'

Reestruturação aplicada na consulta de itens
- D1_ITEM: gerado por ROW_NUMBER() e formatado com 3 dígitos ('000') para garantir numeração sequencial e padronizada dos itens no payload.

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 é marcado como “Enviando” no início, tem os valores numéricos normalizados (cabeçalho e itens) e, ao final, registra o retorno e a situação final (sucesso/erro/suspenso) para auditoria.

Estruturação de Dados

O payload enviado ao Protheus segue o schema definido na lista de campos da fila. Abaixo está o mapeamento oficial de origem → payload.

Cabeçalho do documento

Campo no payload Campo de origem
F1_FILIAL F1_FILIAL
F1_DOC F1_DOC
F1_SERIE F1_SERIE
F1_FORNECE F1_FORNECE
F1_LOJA F1_LOJA
F1_COND F1_COND
F1_XNATUR F1_XNATUR
F1_DUPL F1_DUPL
F1_EMISSAO F1_EMISSAO
F1_DTDIGIT F1_DTDIGIT
F1_RECBMTO F1_RECBMTO
F1_EST F1_EST
F1_ESTPRES F1_ESTPRES
F1_TIPO F1_TIPO
F1_FORMUL F1_FORMUL
F1_ESPECIE F1_ESPECIE
F1_VALMERC F1_VALMERC
F1_VALBRUT F1_VALBRUT
F1_FRETE F1_FRETE
F1_DESPESA F1_DESPESA
F1_SEGURO F1_SEGURO
F1_DESCONT F1_DESCONT
F1_BASEICM F1_BASEICM
F1_VALICM F1_VALICM
F1_BASEIPI F1_BASEIPI
F1_VALIPI F1_VALIPI
F1_BRICMS F1_BRICMS
F1_ICMSRET F1_ICMSRET
F1_BASIMP5 F1_BASIMP5
F1_VALIMP5 F1_VALIMP5
F1_BASIMP6 F1_BASIMP6
F1_VALIMP6 F1_VALIMP6
F1_BASEPS3 BASEPS3
F1_VALPS3 VALPS3
F1_BASECF3 BASECF3
F1_VALCF3 VALCF3
F1_MUORITR F1_MUORITR
F1_UFORITR F1_UFORITR
F1_MUDESTR F1_MUDESTR
F1_UFDESTR F1_UFDESTR
F1_II F1_II
F1_CIF F1CIF
F1_TIPO_NF F1_TIPO_NF
F1_CHVNFE F1_CHVNFE
F1_DAUTNFE F1_DAUTNFE
F1_HAUTNFE F1_HAUTNFE
F3_PROTOC F1_PROTOC
F1_NFELETR F1_NFELETR
F1_EMINFE F1_EMINFE
F1_HORNFE F1_HORNFE
F1_TPFRETE F1_TPFRETE
F1_TPCTE F1_TPCTE
F1_PLIQUI P1_PLIQUI
F1_PBRUTO P1_PBRUTO
F1_ESPECI1 P1_ESPECI1
F1_VOLUME1 P1_VOLUME1
F1_ORIGLAN F1_ORIGLAN
F1_NFORIG F1_NFORIG
F1_SERORIG F1_SERORIG
F1_NUMTRIB F1_NUMTRIB
F1_MOEDA F1_MOEDA
F1_PREFIXO F1_PREFIXO
F1_STATUS F1_STATUS
F1_SDOC F1_SDOC
F1_TRANSP F1_TRANSP
F1_XNATOPE F1_XNATOPE
F1_XCANAL F1_XCANAL
F3_DTCANC F3_DTCANC
F3_CODRSEF F3_CODRSEF
CREPROCESSA CREPROCESSA

ITENS

Campo no payload Campo de origem
D1_FILIAL D1_FILIAL
D1_ITEM D1_ITEM
D1_COD D1_COD
D1_TP B1_TP
D1_UM B1_UM
D1_LOCAL B1_LOCAL
D1_GRUPO B1_GRUPO
D1_TEC D1_TEC
D1_QUANT D1_QUANT
D1_VUNIT D1_VUNIT
D1_TOTAL D1_TOTAL
D1_DESC D1_DESC
D1_VALDESC D1_VALDESC
D1_SEGURO D1_SEGURO
D1_VALFRE D1_VALFRE
D1_DESPESA D1_DESPESA
D1_EMISSAO D1_EMISSAO
D1_DTDIGIT D1_DTDIGIT
D1_DOC D1_DOC
D1_SERIE D1_SERIE
D1_SDOC F1_SDOC
D1_TIPO D1_TIPO
D1_FORNECE D1_FORNECE
D1_LOJA D1_LOJA
D1_CLASFIS D1_CLASFIS
D1_OPER D1_OPER
D1_CF D1_CF
D1_BASEIPI D1_BASEIPI
D1_IPI D1_IPI
D1_VALIPI D1_VALIPI
D1_BASEICM D1_BASEICM
D1_PICM D1_PICM
D1_VALICM D1_VALICM
D1_VRDICMS D1_VRDICMS
D1_VALANTI D1_VALANTI
D1_ICMSDIF D1_ICMSDIF
D1_BASFECP D1_BASFECP
D1_ALQFECP D1_ALQFECP
D1_VALFECP D1_VALFECP
D1_ALIQCMP D1_ALIQCMP
D1_DIFAL D1_DIFAL
D1_BSFCCMP D1_BSFCCMP
D1_ALFCCMP D1_ALFCCMP
D1_VFCPDIF D1_VFCPDIF
D1_AFCPANT D1_AFCPANT
D1_VFCPANT D1_VFCPANT
D1_BRICMS D1_BRICMS
D1_ALIQSOL D1_ALIQSOL
D1_MARGEM D1_MARGEM
D1_ICMSRET D1_ICMSRET
D1_BSFCPST D1_BSFCPST
D1_ALFCPST D1_ALFCPST
D1_VFECPST D1_VFECPST
D1_BASIMP5 D1_BASIMP5
D1_ALQIMP5 D1_ALQIMP5
D1_VALIMP5 D1_VALIMP5
D1_BASIMP6 D1_BASIMP6
D1_ALQIMP6 D1_ALQIMP6
D1_VALIMP6 D1_VALIMP6
D1_ALIQII D1_ALIQII
D1_II D1_II
D1_CIF D1_CIF
D1_TIPO_NF D1_TIPO_NF
D1_OP D1_OP
D1_CC D1_CC
D1_CONTA D1_CONTA
D1_PESO D1_PESO
D1_DATORI D1_DATORI
D1_NFORI D1_NFORI
D1_SERIORI D1_SERIORI
D1_ITEMORI D1_ITEMORI
D1_ORIGLAN D1_ORIGLAN

Exemplo de payload enviado

{
  "F1_FILIAL": "",
  "F1_DOC": "",
  "F1_SERIE": "",
  "F1_FORNECE": "",
  "F1_LOJA": "",
  "F1_COND": "",
  "F1_XNATUR": "",
  "F1_DUPL": "",
  "F1_EMISSAO": "",
  "F1_DTDIGIT": "",
  "F1_RECBMTO": "",
  "F1_EST": "",
  "F1_ESTPRES": "",
  "F1_TIPO": "",
  "F1_FORMUL": "",
  "F1_ESPECIE": "",
  "F1_VALMERC": 0,
  "F1_VALBRUT": 0,
  "F1_FRETE": 0,
  "F1_DESPESA": 0,
  "F1_SEGURO": 0,
  "F1_DESCONT": 0,
  "F1_BASEICM": 0,
  "F1_VALICM": 0,
  "F1_BASEIPI": 0,
  "F1_VALIPI": 0,
  "F1_BRICMS": 0,
  "F1_ICMSRET": 0,
  "F1_BASIMP5": 0,
  "F1_VALIMP5": 0,
  "F1_BASIMP6": 0,
  "F1_VALIMP6": 0,
  "F1_BASEPS3": 0,
  "F1_VALPS3": 0,
  "F1_BASECF3": 0,
  "F1_VALCF3": 0,
  "F1_MUORITR": "",
  "F1_UFORITR": "",
  "F1_MUDESTR": "",
  "F1_UFDESTR": "",
  "F1_II": 0,
  "F1_CIF": 0,
  "F1_TIPO_NF": "",
  "F1_CHVNFE": "",
  "F1_DAUTNFE": "",
  "F1_HAUTNFE": "",
  "F3_PROTOC": "",
  "F1_NFELETR": "",
  "F1_EMINFE": "",
  "F1_HORNFE": "",
  "F1_TPFRETE": "",
  "F1_TPCTE": "",
  "F1_PLIQUI": 0,
  "F1_PBRUTO": 0,
  "F1_ESPECI1": "",
  "F1_VOLUME1": 0,
  "F1_ORIGLAN": "",
  "F1_NFORIG": "",
  "F1_SERORIG": "",
  "F1_NUMTRIB": "",
  "F1_MOEDA": 0,
  "F1_PREFIXO": "",
  "F1_STATUS": "",
  "F1_SDOC": "",
  "F1_TRANSP": "",
  "F1_XNATOPE": "",
  "F1_XCANAL": "",
  "F3_DTCANC": "",
  "F3_CODRSEF": "",
  "CREPROCESSA": "",
  "ITENS": [
    {
      "D1_FILIAL": "",
      "D1_ITEM": "",
      "D1_COD": "",
      "D1_TP": "",
      "D1_UM": "",
      "D1_LOCAL": "",
      "D1_GRUPO": "",
      "D1_TEC": "",
      "D1_QUANT": 0,
      "D1_VUNIT": 0,
      "D1_TOTAL": 0,
      "D1_DESC": 0,
      "D1_VALDESC": 0,
      "D1_SEGURO": 0,
      "D1_VALFRE": 0,
      "D1_DESPESA": 0,
      "D1_EMISSAO": "",
      "D1_DTDIGIT": "",
      "D1_DOC": "",
      "D1_SERIE": "",
      "D1_SDOC": "",
      "D1_TIPO": "",
      "D1_FORNECE": "",
      "D1_LOJA": "",
      "D1_CLASFIS": "",
      "D1_OPER": "",
      "D1_CF": "",
      "D1_BASEIPI": 0,
      "D1_IPI": 0,
      "D1_VALIPI": 0,
      "D1_BASEICM": 0,
      "D1_PICM": 0,
      "D1_VALICM": 0,
      "D1_VRDICMS": 0,
      "D1_VALANTI": 0,
      "D1_ICMSDIF": 0,
      "D1_BASFECP": 0,
      "D1_ALQFECP": 0,
      "D1_VALFECP": 0,
      "D1_ALIQCMP": 0,
      "D1_DIFAL": 0,
      "D1_BSFCCMP": 0,
      "D1_ALFCCMP": 0,
      "D1_VFCPDIF": 0,
      "D1_AFCPANT": 0,
      "D1_VFCPANT": 0,
      "D1_BRICMS": 0,
      "D1_ALIQSOL": 0,
      "D1_MARGEM": 0,
      "D1_ICMSRET": 0,
      "D1_BSFCPST": 0,
      "D1_ALFCPST": 0,
      "D1_VFECPST": 0,
      "D1_BASIMP5": 0,
      "D1_ALQIMP5": 0,
      "D1_VALIMP5": 0,
      "D1_BASIMP6": 0,
      "D1_ALQIMP6": 0,
      "D1_VALIMP6": 0,
      "D1_ALIQII": 0,
      "D1_II": 0,
      "D1_CIF": 0,
      "D1_TIPO_NF": "",
      "D1_OP": "",
      "D1_CC": "",
      "D1_CONTA": "",
      "D1_PESO": 0,
      "D1_DATORI": "",
      "D1_NFORI": "",
      "D1_SERIORI": "",
      "D1_ITEMORI": "",
      "D1_ORIGLAN": ""
    }
  ]
}



Tratamento de Dados

Antes do envio ao Protheus, o payload é normalizado para consistência numérica no cabeçalho e nos itens.

Padronização numérica (setNumeric)
- F1_VALMERC, F1_VALBRUT, F1_FRETE, F1_DESPESA, F1_SEGURO, F1_DESCONT, F1_BASEICM, F1_VALICM, F1_BASEIPI, F1_VALIPI, F1_BRICMS, F1_ICMSRET, F1_BASIMP5, F1_VALIMP5, F1_BASIMP6, F1_VALIMP6, F1_BASEPS3, F1_VALPS3, F1_BASECF3, F1_VALCF3, F1_II, F1_CIF, F1_PLIQUI, F1_PBRUTO, F1_VOLUME1, F1_MOEDA: normalizados com o padrão do setNumeric(...).
- D1_QUANT: normalizado com 3 casas decimais (setNumeric(..., 3, false)).
- D1_VUNIT: normalizado com 5 casas decimais (setNumeric(..., 5, false)).
- D1_TOTAL, D1_DESC, D1_VALDESC, D1_SEGURO, D1_VALFRE, D1_DESPESA, D1_BASEIPI, D1_IPI, D1_VALIPI, D1_BASEICM, D1_PICM, D1_VALICM, D1_VRDICMS, D1_VALANTI, D1_ICMSDIF, D1_BASFECP, D1_ALQFECP, D1_VALFECP, D1_ALIQCMP, D1_DIFAL, D1_BSFCCMP, D1_ALFCCMP, D1_VFCPDIF, D1_AFCPANT, D1_VFCPANT, D1_BRICMS, D1_ALIQSOL, D1_MARGEM, D1_ICMSRET, D1_BSFCPST, D1_ALFCPST, D1_VFECPST, D1_BASIMP5, D1_ALQIMP5, D1_VALIMP5, D1_BASIMP6, D1_ALQIMP6, D1_VALIMP6, D1_ALIQII, D1_II, D1_CIF, D1_PESO: normalizados com o padrão do setNumeric(...).

Integração com o Protheus

Chamada de integração com o Protheus
- Chamada: Requisição HTTP
- Recurso: documento_entrada
- Método HTTP: POST
- Cabeçalhos:
  - tenantId: <primeiros 2 caracteres de F1_FILIAL>,<F1_FILIAL>

Tratamento de retorno
- Ausência de resposta: gera erro com mensagem JSON: NÃO HOUVE RESPOSTA.
- Resposta inválida/inesperada: se não for array ou não contiver Mensagem, gera erro com JSON: NÃO FOI POSSÍVEL DECODIFICAR A RESPOSTA.
- Ajuste de sucesso por mensagem: quando a mensagem detalhada contém indicação de “já cadastrado”, a resposta é tratada como sucesso (Mensagem = OK) e o campo code é removido (se existir).
- Condição de erro: quando existir code na resposta ou quando Mensagem = ERRO, o processamento é marcado como falha.
- Condição de sucesso: quando o retorno é considerado OK, o item é finalizado como sucesso e dispara os marcadores de integrado/cancelamento aplicáveis.

Rotinas Inteligentes
- Documento de Saida Integrado (rotina inteligente): chamada antes do envio ao Protheus, quando o documento de entrada representa devolução e existe chave de origem (D1_NFORI e D1_SERIORI). Garante que o documento de saída associado esteja integrado para permitir consistência do relacionamento.
link: Documento de Saida Integrado
- Nota Fiscal Omni Integrado (rotina inteligente): chamada antes do envio ao Protheus, quando o documento de entrada está relacionado a devolução no contexto omni. Evita prosseguir com dependências pendentes de integração.
link: Nota Fiscal Omni Integrado
- Documento de Cancelamento de Entrada (rotina inteligente): chamada após o retorno de sucesso do envio do documento de entrada. Encaminha o cancelamento correlato para manter o status consistente no Protheus.
link: Documento de Cancelamento de Entrada

Tratamento de retorno

Persistência do resultado: o item processado é atualizado na tabela wosk_queue (base integrador), registrando retorno, mensagem, requisicao, tempo e situacao.

Situações utilizadas:
- 1: Em envio.
- 2: Sucesso.
- 3: Suspenso por dependência (quando uma validação prévia falha e a continuidade depende de outro serviço).
- 4: Erro.

Encaminhamento em cenário de erro

Quando a falha ocorre por dependência prévia (ex.: integração de origem não concluída), o item pode ser marcado como suspenso e manter informações de tipo/chave para rastreio. Demais falhas permanecem como erro com mensagem registrada para correção e reprocessamento.

Notificação

Em cenário de falhas, a notificação recupera itens com erro na tabela wosk_queue para o serviço ProtheusDocumentoEntradaFull, ordenando por data de processamento para priorizar ocorrências mais antigas.
SELECT
    `token`,
    `acao`, 
    `chave`,
    `data_adicionado`,
    `data`,
    `mensagem` AS 'ERRO'
FROM 
    `{$this->bancoIntegrador}`.`wosk_queue`
WHERE 
    `acao` = 'ProtheusDocumentoEntradaFull' AND `situacao` = 4 ORDER BY `data` ASC

Fluxo do Processo

Diagrama sem nome.jpg


Critérios de Aceitação

Processo Subprocesso Descrição Situação esperada
Capturador Captura paginada por data Ao capturar documentos na view WOSK_SERVICO_ENVIA_PROTHEUS_ENTRADAS_FULL, deve filtrar por DATA_PARA_TRANSFERENCIA e paginar ordenando por data, atualizando o controle de posição (offset/chave/data) a cada lote processado. Processamento avança sem duplicidades, mantendo continuidade por posição e priorizando registros mais antigos.
Capturador Estruturação do conteúdo Para cada documento capturado, deve consultar os itens na view WOSK_SERVICO_ENVIA_PROTHEUS_ENTRADAS_ITEM_FULL e gerar D1_ITEM sequencial no formato '000', garantindo uma lista de itens consistente para composição do payload. Conteúdo do item na fila inclui ITENS completos, com numeração padronizada.
Fila de Processamento Normalização numérica Ao processar um item pendente, deve normalizar campos numéricos do cabeçalho e itens, aplicando precisão diferenciada para D1_QUANT (3 casas, false) e D1_VUNIT (5 casas, false). Payload com consistência numérica, pronto para envio ao Protheus.
Fila de Processamento Integração e persistência do retorno Após enviar ao Protheus (POST no recurso documento_entrada com header tenantId), deve validar a resposta e registrar em wosk_queue o retorno, mensagem e situação final. Quando a mensagem indicar “já cadastrado”, deve tratar como sucesso. Fila atualizada com situação final e detalhes para auditoria; em sucesso, os marcadores correlatos são acionados quando aplicável.