Abaixo iremos mostrar como configurar o Processo de Venda no Protheus visando realizar a integração de vendas entre Protheus x Totvs Chef. Siga o Passo a Passo.


Cadastrando o Processo VENDA

Para integrarmos as vendas do Totvs Chef com o Protheus é necessário primeiramente realizar o cadastro do processo VENDA no Protheus.


1- No módulo 12 (Controle de Lojas), acesse Atualizações/ RMI/ Cadastros/ Processos.

2- No Browse clique em Incluir e preencha os campos:

Processo: VENDA

Tabela: SL1

Chave: L1_FILIAL+L1_NUM

3- Na guia Tabelas Secundárias preencha os campos :

Tabela: SL2

Descrição: Preenchido automaticamente com o nome da tabela informada

Chave: L2_FILIAL+L2_NUM

4- Ainda na guia Tabelas Secundárias adicione uma nova linha e preencha os campos:

Tabela: SL4

Descrição: Preenchido automaticamente com o nome da tabela informada

Chave: L4_FILIAL+L4_NUM


Exemplo do cadastro de Processo do VENDA:


Vinculando o Processo VENDA ao Assinante CHEF


1- No módulo 12 (Controle de Lojas), acesse Atualizações/ RMI/ Cadastros/ Assinantes.

2- Com o assinante CHEF previamente cadastrado, posicione no assinante CHEF e clique em alterar.

3- Na guia Assinantes x Processos, preencha os seguintes campos:

Processo: Venda

Ativo: Sim

Tipo Process: Busca

Filiais Proc: Informe o código das filiais que deseja integrar a Venda: Lembre-se que deve ter sido realizado o De/Para entre o código da loja do Totvs Chef e a Filial correspondente no Protheus:  Cadastro de De/Para.

Configuração: Preencha este campo de acordo com a sua URL da API  Capa Venda, como mostra o exemplo abaixo:

{
    "url":"http://{url_do_servidor}/api/CapaVenda/ListPorDataMovimento",
    "SL2":"self:oRegistro['Itens']",
    "SL4":"self:oRegistro['Pagamentos']"
}

Layout Envio: Preencha este campo de acordo com o exemplo abaixo: 

{
    "CodigoLoja":"&self:aArrayFil[self:nFil][1]",
    "DataMovimentoInicial":"&Str( Year(dDatabase), 4) +'-'+  StrZero( Month(dDatabase), 2) +'-'+ StrZero( Day(dDatabase), 2)",
    "DataMovimentoFinal":"&Str( Year(dDatabase), 4) +'-'+  StrZero( Month(dDatabase), 2) +'-'+ StrZero( Day(dDatabase), 2)"
}

Layout Publicação: Preencha este campo de acordo com o exemplo abaixo:

{
    "L1_FILIAL":"&self:aArrayFil[self:nFil][2]",
    "L1_VEND":"&SUPERGETMV('MV_VENDPAD', .F., '01')",
    "L1_CLIENTE":"&IIF(self:oRegistro['Cliente'] <> Nil,self:oRegistro['Cliente'],SuperGetMV('MV_CLIPAD'))",
    "L1_LOJA":"&SuperGetMV('MV_LOJAPAD',.F., '01')",
    "L1_OPERADO":"&cValToChar(self:oRegistro['Caixa']['Operador']['Codigo'])",
    "L1_EMISSAO":"&self:oRegistro['DataMovimento']",
    "L1_DTLIM":"&self:oRegistro['DataMovimento']",
    "L1_NUMMOV":"&SubStr(cValToChar(self:oRegistro['Caixa']['NumeroFechamento']),1,2)",
    "L1_NUMCFIS":"&cValToChar(self:oRegistro['NumeroCupom'])",
    "L1_DOC":"&cValToChar(self:oRegistro['NumeroNota'])",
    "L1_SERIE":"&self:oRegistro['SerieNota']",
    "L1_SERPDV":"&self:oRegistro['SerieECF']",
    "L1_SERSAT":"&self:oRegistro['SerieSAT']",
    "L1_KEYNFCE":"&self:oRegistro['ChaveSefaz']",
    "L1_PRONFCE":"&self:oRegistro['ProtocoloAutorizacaoSefaz']",
    "L1_COMIS": 0,
    "L1_ORIGEM":"N",
    "L1_VLRTOT":"&self:oRegistro['TotalizadorVenda']['ValorTotal']",
    "L1_VALBRUT":"&self:oRegistro['TotalizadorVenda']['ValorSubTotal']",
    "L1_VLRLIQ":"&self:oRegistro['TotalizadorVenda']['ValorSubTotal']",
    "L1_VALMERC":"&self:oRegistro['TotalizadorVenda']['ValorSubTotal']",
    "L1_DESCONT":"&self:oRegistro['TotalizadorVenda']['ValorTotalDescontoSistema']",
    "L1_DESCFIN":"&self:oRegistro['TotalizadorVenda']['ValorTotalDescontoFiscal']",
    "L1_VALICM":"&self:oRegistro['TotalizadorVenda']['ValorTotalICMS']",
    "L1_VALPIS":"&self:oRegistro['TotalizadorVenda']['ValorTotalPIS']",
    "L1_VALCOFI":"&self:oRegistro['TotalizadorVenda']['ValorTotalCOFINS']",
    "L1_CGCCLI":"&IIF(self:oRegistro['Cliente'] <> Nil, self:oRegistro['Cliente']['Documento'], '')",
    "L1_CONDPG":"CN",
    "L1_SITUA":"IP",
    "L1_TIPO":"V",
    "L1_TIPOCLI":"F",
    "L1_PDV":"001",
    "SL2": [{
            "L2_FILIAL":"&self:aArrayFil[self:nFil][2]",
            "L2_PRODUTO":"&cValToChar(self:oRegistro['Itens'][nItem]['Produto']['Codigo'])",
            "L2_ITEM":"&StrZero(nItem, TamSx3('L2_ITEM')[1])",
            "L2_DESCRI":"&self:oRegistro['Itens'][nItem]['Produto']['Nome']",
            "L2_QUANT":"&self:oRegistro['Itens'][nItem]['Quantidade']",
            "L2_VRUNIT":"&self:oRegistro['Itens'][nItem]['ValorUnitario']",
            "L2_VLRITEM":"&self:oRegistro['Itens'][nItem]['ValorTotal']",
            "L2_LOCAL":"&SuperGetMV('MV_LOCPAD',.F., '01')",
            "L2_UM":"&self:oRegistro['Itens'][nItem]['Produto']['Unidade']",
            "L2_VALDESC":"&self:oRegistro['Itens'][nItem]['ValorDesconto']",
            "L2_TES":"&SUPERGETMV('MV_TESSAI', .F., '501')",
            "L2_CF":"&self:oRegistro['Itens'][nItem]['Cfop']",
            "L2_PICM":"&self:oRegistro['Itens'][nItem]['Icms']['Aliquota']",
            "L2_BASEICM":"&self:oRegistro['Itens'][nItem]['Icms']['BaseCalculo']",
            "L2_VALICM":"&self:oRegistro['Itens'][nItem]['Icms']['Valor']",
            "L2_EMISSAO":"&self:oRegistro['DataMovimento']"
        }
    ],
    "SL4": [{
            "L4_FILIAL":"&self:aArrayFil[self:nFil][2]",
            "L4_DATA":"&self:oRegistro['DataMovimento']",
            "L4_VALOR":"&self:oRegistro['Pagamentos'][nItem]['ValorRecebido']",
            "L4_ADMINIS":"&IIF(self:oRegistro['Pagamentos'][nItem]['Descricao'] <> 'DINHEIRO',self:oRegistro['Pagamentos'][nItem]['Descricao'],'')",
            "L4_FORMA":"&IIF(cValToChar(self:oRegistro['Pagamentos'][nItem]['TipoFormaPagamento']) == '3',self:oRegistro['Pagamentos'][nItem]['Descricao'],cValToChar(self:oRegistro['Pagamentos'][nItem]['TipoFormaPagamento']))"
        }
    ]
}


Exemplo da configuração do Processo CEST no assinante CHEF:


Vinculando o Processo VENDA ao Assinante PROTHEUS


1- No módulo 12 (Controle de Lojas), acesse Atualizações/ RMI/ Cadastros/ Assinantes.

2- Com o assinante PROTHEUS previamente cadastrado, posicione no assinante PROTHEUS e clique em alterar.

3- Na guia Assinantes x Processos, preencha os seguintes campos:

Processo: Venda

Ativo: Sim

Tipo Process: Envio

Filiais Proc: Informe o código das filiais que deseja realizar o Processo

Configuração: Vazio

Layout Envio: Vazio

Layout Publi: Vazio


Exemplo da configuração do Processo CEST no assinante CHEF:



Após ter realizado as configurações acima a integração da VENDA seguirá o seguinte fluxo:

Serviço RMIBUSCA: Neste serviço o Protheus irá realizar a busca das vendas no sistema Totvs Chef, e grava-las na tabela MHQ - Mensagens Publicadas.  

Serviço RMIDISTRIB: Após as mensagens serem publicadas na tabela MHQ, o serviço RMIDISTRIB se encarregará de distribuir as vendas para seus assinantes, neste as mensagens serão distribuídas para o assinante Protheus, neste processo será gravado as distribuições na tabela MHR - Mensagens Distribuição  

Serviço RMIENVIA: Com as mensagens distribuídas para o assinante Protheus o serviço RMIENVIA é responsável por gerar a venda de cada mensagem distribuída. Neste momento é gravado as tabelas SL1, SL2 e SL4(Tabelas responsáveis pela venda) e caso a venda seja gerada com sucesso será gravado o numero da mesma no campo MHR_RETORN .Caso o seja encontrado algum erro no momento da geração da venda no Protheus, no campo MHR_ENVIO é gravado os dados que foram passados para gerar a venda e no campo MHR_RETORN é gravado o motivo da inconsistência na geração da venda.

Serviço RMICONTROL: Com as vendas geradas nas tabelas SL1, SL2 e SL4,  o campo L1_SITUA deve estar com o conteúdo IP (Integração Pendente), para que o serviço RMICONTROL realize as validações da venda. Caso seja encontrado alguma inconsistência na venda o campo L1_SITUA sera atualizado para IR (Integração com erro) e será gravado um log do motivo desta inconsistência na tabela MHL - Logs de Integração. Caso a venda seja validada com sucesso o campo L1_SITUA é atualizado para RX (Recebido pelo Server).

Serviço do GravaBacth:  Para as vendas que estejam campo L1_SITUA = RX, este serviço tem como objetivo: Gerar financeiro, Baixa de estoque, Livros fiscais etc. Caso seja encontrado alguma inconsistência no processamento deste serviço o campo L1_SITUA é atualizado para ER. Caso o processamento da venda seja finalizado com sucesso o campo L1_SITUA é atualizado para OK.


Também é possível monitorar a integração e processamento das vendas através do: Monitor de integração de Vendas

O Cancelamento de Venda seguirá o seguinte fluxo:

1 - Assim que o JOB RmiBusca recebe o JSON da Venda, o JOB verifica a tag StatusVenda, caso o valor da TAG seja igual a 3, significa que é um cancelamento;

2 - Neste momento o JOB verifica se já existe um registro de inclusão da venda na tabela de publicação (MHQ), caso não exista, então são inseridos nessa tabela duas linhas:

2.1 - É incluído uma informação de inclusão da venda com o campo MHQ_EVENTO = 1;

2.2 - Na sequencia é incluído a informação de exclusão da venda com o campo MHQ_EVENTO = 2

3 - Incluido as informações de publicação, então é realizado a distribuição dessas informações na tabela MHR, também gerando duas informações, uma de inclusão referente a primeira publicação e cancelamento referente a segunda publicação;

4 - Realizado a distribuição, o JOB RmiEnvia busca a primeira distribuição referente a inclusão e inclui a venda nas tabelas SL1, SL2 e SL4, feito isso, o mesmo JOB busca a segunda distribuição e inclui a informação