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.

As vendas compatíveis: NFC-e, SAT e ECF

Não existe integração de ficha técnica. A integração da venda é realizada utilizando as rotinas padrão do Venda Assistida, atualmente não existe no padrão a funcionalidade de baixa de estoque por ficha técnica. 

Não existe integração de Impostos. Os dados de impostos devem ser complementados na camada do TOTVS CH

EF.

Não existe integração de Inutilização de documento NFC-e

Não existe integração de Troca/Devolução de Venda

Não existe integração de venda com pagamento em NCC (Crédito)

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.

Esta disponível para busca de venda dois tipos de Api: Por Data de Movimento Por Data de Integração.

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]",
	"notasinutilizadas": 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)",
}

Para Reprocessar vendas com erro é necessário incluir tags de controle no layout de envio:

  • DataReprocessamento: data de controle para funcionamento do mecanismo de reprocessamento.
  • DiasRetroceder: dias definido pelo usuário para controle da DataReprocessamento. 

Exemplo:

"DataReprocessamento": "20230321",
"DiasRetroceder": 10

Neste cenário começará a partir de 11/03/23 e terminará na data atual rodando apenas 1x o processo completo.

No dia seguinte o processo fará "DataReprocessamento": "20230322", "DiasRetroceder": 10 a partir de 12/03/23.

Exemplo:

{
    "CodigoLoja": "&self:aArrayFil[self:nFil][1]",
    "notasinutilizadas": 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)",

    "DataReprocessamento": "20230101",
    "DiasRetroceder": 10
}


Obs: Essa opção foi descontinuada, deve utilizar a configuração acima: Por Data de Movimentação 
Veja toda a documentação tecnica sobre a configuração da API: Busca de Venda ListPorDataIntegracao


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/ListPorDataIntegracaoChefWeb",
    "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]",
	"DataInicialIntegracaoChefweb":"&Str( Year(dDatabase), 4) +'-'+  StrZero( Month(dDatabase), 2) +'-'+ StrZero( Day(dDatabase), 2)",
	"DataFinalIntegracaoChefweb":"&Str( Year(dDatabase), 4) +'-'+  StrZero( Month(dDatabase), 2) +'-'+ StrZero( Day(dDatabase), 2)",
	"DataHoraUltimaIntegracaoChefWeb":""
}


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

{
    "L1_FILIAL":"&self:aArrayFil[self:nFil][2]",
    "L1_CLIENTE":"&SuperGetMV('MV_CLIPAD',.F.,'000001')",
    "L1_LOJA":"&SuperGetMV('MV_LOJAPAD',.F., '01')",
	"L1_OPERADO": "&self:DePara('SA6',cValToChar(self:oRegistro['Caixa']['Operador']['Codigo']), 2,0, .F., 'CHEF')",
	"L1_TROCO1": "&self:oRegistro['TotalizadorVenda']['ValorTroco']",
    "L1_EMISSAO":"&self:oRegistro['DataMovimento']",
    "L1_EMISNF":"&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:LayEstAutoChef('LG_SERIE')",
    "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_ESPECIE": "&IIF(self:oRegistro['ModeloFiscal'] == 1,'SATCE',IIF(self:oRegistro['ModeloFiscal'] == 2,'NFCE','ECF'))",
	"L1_PDV": "&self:LayEstAutoChef('LG_PDV')",
    "SL2": [{
            "L2_FILIAL":"&self:aArrayFil[self:nFil][2]",
            "L2_PRODUTO":"&cValToChar(self:oRegistro['Itens'][nItem]['Produto']['Codigo'])",
            "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']",
			"L2_CSTPIS": "&self:oRegistro['Itens'][nItem]['Pis']['Cst']",
			"L2_CSTCOF": "&self:oRegistro['Itens'][nItem]['Cofins']['Cst']"
        }
    ],
    "SL4": [{
            "L4_FILIAL":"&self:aArrayFil[self:nFil][2]",
            "L4_DATA":"&self:oRegistro['DataMovimento']",
            "L4_VALOR": "&IIF(self:oRegistro['Pagamentos'][nItem]['Descricao'] == 'DINHEIRO',self:oRegistro['Pagamentos'][nItem]['ValorRecebido']+self:oRegistro['TotalizadorVenda']['ValorTroco'],self:oRegistro['Pagamentos'][nItem]['ValorRecebido'])",
            "L4_ADMINIS":"&IIF(self:oRegistro['Pagamentos'][nItem]['Descricao'] <> 'DINHEIRO',Substr(self:DePara('SAE',self:oRegistro['Pagamentos'][nItem]['Descricao'], 2, 0, .F., 'CHEF'),1,20),'')",
			"L4_TROCO": "&IIF(self:oRegistro['Pagamentos'][1] <> nil .and. self:oRegistro['Pagamentos'][1]['ValorRecebido'] > 0,self:oRegistro['TotalizadorVenda']['ValorTroco'],0)",
            "L4_FORMA":"&self:DePara('SX5',IIF(cValToChar(self:oRegistro['Pagamentos'][nItem]['TipoFormaPagamento']) == '3',self:oRegistro['Pagamentos'][nItem]['Descricao'],cValToChar(self:oRegistro['Pagamentos'][nItem]['TipoFormaPagamento'])), 2, 0, .F., 'CHEF')",
			"L4_NSUTEF": "&IIF(self:oRegistro['Pagamentos'][nItem]['FormaPagamentoCartao'] <> nil .and. cValToChar(self:oRegistro['Pagamentos'][nItem]['FormaPagamentoCartao']['TipoTransacao']) == '1',self:oRegistro['Pagamentos'][nItem]['FormaPagamentoCartao']['DadosTEF']['NSUTEF'],'')",
            "L4_DOCTEF": "&IIF(self:oRegistro['Pagamentos'][nItem]['FormaPagamentoCartao'] <> nil .and. cValToChar(self:oRegistro['Pagamentos'][nItem]['FormaPagamentoCartao']['TipoTransacao']) == '1',self:oRegistro['Pagamentos'][nItem]['FormaPagamentoCartao']['DadosTEF']['NSUHost'],'')",
            "L4_DATATEF": "&IIF(self:oRegistro['Pagamentos'][nItem]['FormaPagamentoCartao'] <> nil .and. cValToChar(self:oRegistro['Pagamentos'][nItem]['FormaPagamentoCartao']['TipoTransacao']) == '1',StrTran(Substr(self:oRegistro['DataRecebimento'],1, AT('T',self:oRegistro['DataRecebimento']) -1),'-',''),'  /  /  ')",
            "L4_HORATEF": "&IIF(self:oRegistro['Pagamentos'][nItem]['FormaPagamentoCartao'] <> nil .and. cValToChar(self:oRegistro['Pagamentos'][nItem]['FormaPagamentoCartao']['TipoTransacao']) == '1',StrTran(Substr(self:oRegistro['DataRecebimento'],AT('T',self:oRegistro['DataRecebimento']) +1 ,Len(self:oRegistro['DataRecebimento'])),':',''),'')",
            "L4_BANDEIR": "&IIF(self:oRegistro['Pagamentos'][nItem]['FormaPagamentoCartao'] <> nil .and. cValToChar(self:oRegistro['Pagamentos'][nItem]['FormaPagamentoCartao']['TipoTransacao']) == '1',self:oRegistro['Pagamentos'][nItem]['FormaPagamentoCartao']['DadosTEF']['CodigoBandeiraTexto'],'')"
        }
    ]
}



Para mais informações referente à campos na API do FOOD acesse: API - FOOD CAPA VENDA.

TipoFormaPagamento = 3 é para identificar as formas de pagamento do tipo cartão.

Exemplo da configuração do Processo VENDA 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 VENDA no assinante Protheus:



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 caso 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.

O Cancelamento de Venda seguirá o seguinte fluxo:

Serviço RMIBUSCA: Neste serviço é realizado a busca das vendas no Totvs Chef, o serviço identifica se a tag StatusVenda (Api Capa venda) é igual a 2, Caso seja significa que se trata de um cancelamento, com isso é gravado um registro na tabela MHQ - Mensagens Publicadas com o campo MHQ_EVENTO = 2 (Exclusão).

Serviço RMIDISTRIB: Após a Publicação do cancelamento o serviço RMIDISTRIB se encarregará de distribuir o cancelamento da venda  para o assinante Protheus, gerando um registro na tabela MHR - Mensagens Distribuição.

Serviço RMIENVIA: Realizado a distribuição, o serviço RMIENVIA inclui as informações do cancelamento da venda na tabela SLX - Log Cancelamento x Devolução.

Serviço RMICONTROL: Com as informações do cancelamento inseridos na tabela SLX - Log Cancelamento x Devolução este serviço realiza a leitura das informações e em seguida é executado a rotina padrão de cancelamento LOJA140, com isso realizando o cancelamento da venda no Protheus.


A Devolução não esta implementada nesta integração, caso tenha alguma devolução no sistema Totvs Chef, a devolução devera ser realizada manualmente no Protheus. Não existe integração de venda com NCC.

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