Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

Pré-Requisitos:

 Para implantar a integração do envio de reservas do Gemco para o Protheus é necessário que as seguintes configurações estejam instaladas corretamente.

  • Configuração Base de Dados Gemco
  • Configuração Adapter Reserva
  • Configuração Mozart
  • Configuração Protheus (Adapter e Schedule) 

1 - Detalhes técnico no Gemco                  

  1.1 Configurações de Banco

No banco de dados do gemco é necessário criar a tabela MOZART_PEDVENDA 

Script :

/****** Object: Table [dbo].[MOZART_PEDVENDA] Script Date: 17/08/2018 14:53:57 *****/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON

GO

CREATE TABLE [dbo].[MOZART_PEDVENDA](
[CODFIL] [numeric](3, 0) NOT NULL,
[TIPOPED] [numeric](1, 0) NOT NULL,
[NUMPEDVEN] [numeric](12, 0) NOT NULL,
[DTHR] [datetime] NULL,
[RESERVA] [numeric](1, 0) NULL,
[RECEBIMENTO] [numeric](1, 0) NULL,
CONSTRAINT [MOZART_PEDVENDA_PK] PRIMARY KEY NONCLUSTERED
(
[CODFIL] ASC,
[TIPOPED] ASC,
[NUMPEDVEN] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

A seguir é necessário criar Triggers nas seguintes tabelas do Gemco MOV_PEDIDO e MOV_ITPED essas triggers são responsáveis em salvar, atualizar e deletar os dados do pedido na tabela MOZART_PEDVENDA.

 


Scripts.:

/****** Object: Trigger [dbo].[MOZART_PEDVENDA_TR_INS] Script Date: 17/08/2018 18:03:52 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO


CREATE TRIGGER [dbo].[MOZART_PEDVENDA_TR_INS] ON [dbo].[MOV_PEDIDO]
FOR INSERT
AS
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SET NOCOUNT ON;

DECLARE @RESERVA AS INT, @RECEBIMENTO AS INT, @STATUSNOVO AS INT
DECLARE @TPNOTA NUMERIC(10), @TIPOPED NUMERIC(1)

SET @RESERVA = (SELECT TOP 1 A.RESERVA FROM MOZART_PEDVENDA AS A WITH(NOLOCK) INNER JOIN INSERTED AS B ON A.CODFIL = B.CODFIL AND A.TIPOPED = B.TIPOPED AND A.NUMPEDVEN = B.NUMPEDVEN)
SET @RECEBIMENTO = (SELECT TOP 1 A.RECEBIMENTO FROM MOZART_PEDVENDA AS A WITH(NOLOCK) INNER JOIN INSERTED AS B ON A.CODFIL = B.CODFIL AND A.TIPOPED = B.TIPOPED AND A.NUMPEDVEN = B.NUMPEDVEN)
SET @STATUSNOVO = (SELECT STATUS FROM INSERTED)
SELECT @TPNOTA = TPNOTA, @TIPOPED = TIPOPED FROM INSERTED

IF (SELECT COUNT(1) FROM CAD_TPNOTA (NOLOCK) WHERE TPNOTA = @TPNOTA AND TIPO = 'S' AND (TPREM = 'L' OR TPREM = 'D' OR TPREM = 'G') AND (TPDEST = 'L' OR TPDEST = 'D' OR TPDEST = 'G')) > 0 AND @TIPOPED = 2
BEGIN
IF @STATUSNOVO < 5 AND @RESERVA IS NULL --CRIACAO PEDIDO
INSERT INTO MOZART_PEDVENDA (CODFIL, TIPOPED, NUMPEDVEN, DTHR, RESERVA, RECEBIMENTO)
SELECT CODFIL, TIPOPED, NUMPEDVEN, GETDATE(), 0, NULL FROM INSERTED
END

GO


/****** Object: Trigger [dbo].[MOZART_PEDVENDA_TR_UPD] Script Date: 17/08/2018 18:04:37 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO


CREATE TRIGGER [dbo].[MOZART_PEDVENDA_TR_UPD] ON [dbo].[MOV_PEDIDO]
FOR UPDATE
AS
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SET NOCOUNT ON;

DECLARE @RESERVA AS INT, @RECEBIMENTO AS INT, @STATUSNOVO AS INT, @STATUSANTIGO AS INT
DECLARE @TPNOTA NUMERIC(10), @TIPOPED NUMERIC(1)

SET @RESERVA = (SELECT TOP 1 A.RESERVA FROM MOZART_PEDVENDA AS A WITH(NOLOCK) INNER JOIN INSERTED AS B ON A.CODFIL = B.CODFIL AND A.TIPOPED = B.TIPOPED AND A.NUMPEDVEN = B.NUMPEDVEN)
SET @RECEBIMENTO = (SELECT TOP 1 A.RECEBIMENTO FROM MOZART_PEDVENDA AS A WITH(NOLOCK) INNER JOIN INSERTED AS B ON A.CODFIL = B.CODFIL AND A.TIPOPED = B.TIPOPED AND A.NUMPEDVEN = B.NUMPEDVEN)
SET @STATUSNOVO = (SELECT STATUS FROM INSERTED)
SET @STATUSANTIGO = (SELECT DELETED.STATUS FROM MOV_PEDIDO AS PED INNER JOIN DELETED ON PED.CODFIL = DELETED.CODFIL AND PED.TIPOPED = DELETED.TIPOPED AND PED.NUMPEDVEN = DELETED.NUMPEDVEN )
SELECT @TPNOTA = TPNOTA, @TIPOPED = TIPOPED FROM INSERTED

IF (SELECT COUNT(1) FROM CAD_TPNOTA (NOLOCK) WHERE TPNOTA = @TPNOTA AND FLVENDA = 'S') > 0 AND @TIPOPED = 0
BEGIN
IF @STATUSNOVO < 5 AND @RESERVA IS NULL --CRIACAO PEDIDO
INSERT INTO MOZART_PEDVENDA (CODFIL, TIPOPED, NUMPEDVEN, DTHR, RESERVA, RECEBIMENTO)
SELECT CODFIL, TIPOPED, NUMPEDVEN, GETDATE(), 0, NULL FROM INSERTED
ELSE
IF (@STATUSNOVO IN(5,4) AND @RECEBIMENTO IS NULL) --PASSOU CAIXA
UPDATE MOZART_PEDVENDA
SET RECEBIMENTO = 0, DTHR = GETDATE()
FROM MOV_PEDIDO AS A
INNER JOIN INSERTED AS B ON A.CODFIL = B.CODFIL AND A.TIPOPED = B.TIPOPED AND A.NUMPEDVEN = B.NUMPEDVEN
INNER JOIN MOZART_PEDVENDA AS C WITH(NOLOCK) ON A.CODFIL = C.CODFIL AND A.TIPOPED = C.TIPOPED AND A.NUMPEDVEN = C.NUMPEDVEN
ELSE IF (@STATUSNOVO = 9 AND (@RECEBIMENTO = 0 OR @RECEBIMENTO IS NULL) AND @STATUSANTIGO = 3 ) -- CANCELAMENTO ANTES DE PASSAR PELO CAIXA
UPDATE MOZART_PEDVENDA
SET RESERVA = 0
FROM MOV_PEDIDO AS A
INNER JOIN INSERTED AS B ON A.CODFIL = B.CODFIL AND A.TIPOPED = B.TIPOPED AND A.NUMPEDVEN = B.NUMPEDVEN
INNER JOIN MOZART_PEDVENDA AS C WITH(NOLOCK) ON A.CODFIL = C.CODFIL AND A.TIPOPED = C.TIPOPED AND A.NUMPEDVEN = C.NUMPEDVEN
END

GO

/****** Object: Trigger [dbo].[MOZART_PEDVENDA_IT_TR_INS_UPD] Script Date: 17/08/2018 18:01:58 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TRIGGER [dbo].[MOZART_PEDVENDA_IT_TR_INS_UPD] ON [dbo].[MOV_ITPED]
FOR INSERT, UPDATE
AS
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SET NOCOUNT ON;

DECLARE @RESERVA AS INT, @RECEBIMENTO AS INT, @STATUSNOVO AS INT
DECLARE @TPNOTA NUMERIC(10), @TIPOPED NUMERIC(1)

SET @RESERVA = (SELECT TOP 1 A.RESERVA FROM MOZART_PEDVENDA AS A WITH(NOLOCK) INNER JOIN INSERTED AS B ON A.CODFIL = B.CODFIL AND A.TIPOPED = B.TIPOPED AND A.NUMPEDVEN = B.NUMPEDVEN)
SET @RECEBIMENTO = (SELECT TOP 1 A.RECEBIMENTO FROM MOZART_PEDVENDA AS A WITH(NOLOCK) INNER JOIN INSERTED AS B ON A.CODFIL = B.CODFIL AND A.TIPOPED = B.TIPOPED AND A.NUMPEDVEN = B.NUMPEDVEN)
SET @STATUSNOVO = (SELECT TOP 1 STATUS FROM INSERTED)
SELECT @TPNOTA = TPNOTA, @TIPOPED = TIPOPED FROM INSERTED

IF (SELECT COUNT(1) FROM CAD_TPNOTA (NOLOCK) WHERE TPNOTA = @TPNOTA AND FLVENDA = 'S') > 0 AND @TIPOPED = 0
BEGIN
IF @RESERVA = 2 AND @RECEBIMENTO IS NULL AND ((UPDATE(STATUS) AND @STATUSNOVO = 9) OR UPDATE(FILORIG))
UPDATE MOZART_PEDVENDA
SET RESERVA = 0
FROM INSERTED AS A
INNER JOIN MOZART_PEDVENDA AS B WITH(NOLOCK) ON A.CODFIL = B.CODFIL AND A.TIPOPED = B.TIPOPED AND A.NUMPEDVEN = B.NUMPEDVEN
WHERE A.STATUS <= 4;
END

ELSE IF (SELECT COUNT(1) FROM CAD_TPNOTA (NOLOCK) WHERE TPNOTA = @TPNOTA AND TIPO = 'S' AND (TPREM = 'L' OR TPREM = 'D' OR TPREM = 'G') AND (TPDEST = 'L' OR TPDEST = 'D' OR TPDEST = 'G')) > 0 AND @TIPOPED = 2
BEGIN
IF @RESERVA = 2 AND (@RECEBIMENTO IS NULL OR @RECEBIMENTO = 0) AND ((UPDATE(STATUS) AND @STATUSNOVO = 9))
UPDATE MOZART_PEDVENDA
SET RESERVA = 0
FROM INSERTED AS A
INNER JOIN MOZART_PEDVENDA AS B WITH(NOLOCK) ON A.CODFIL = B.CODFIL AND A.TIPOPED = B.TIPOPED AND A.NUMPEDVEN = B.NUMPEDVEN

END

GO


/****** Object: Trigger [dbo].[MOZART_PEDVENDA_IT_TR_DEL] Script Date: 17/08/2018 18:02:39 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO


CREATE TRIGGER [dbo].[MOZART_PEDVENDA_IT_TR_DEL] ON [dbo].[MOV_ITPED]
FOR DELETE
AS
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SET NOCOUNT ON;

DECLARE @RESERVA AS INT, @RECEBIMENTO AS INT
DECLARE @TPNOTA NUMERIC(10), @TIPOPED NUMERIC(1)

SET @RESERVA = (SELECT TOP 1 A.RESERVA FROM MOZART_PEDVENDA AS A WITH(NOLOCK) INNER JOIN DELETED AS B ON A.CODFIL = B.CODFIL AND A.TIPOPED = B.TIPOPED AND A.NUMPEDVEN = B.NUMPEDVEN)
SET @RECEBIMENTO = (SELECT TOP 1 A.RECEBIMENTO FROM MOZART_PEDVENDA AS A WITH(NOLOCK) INNER JOIN DELETED AS B ON A.CODFIL = B.CODFIL AND A.TIPOPED = B.TIPOPED AND A.NUMPEDVEN = B.NUMPEDVEN)
SELECT @TPNOTA = TPNOTA, @TIPOPED = TIPOPED FROM INSERTED

IF (SELECT COUNT(1) FROM CAD_TPNOTA (NOLOCK) WHERE TPNOTA = @TPNOTA AND FLVENDA = 'S') > 0 AND @TIPOPED = 0
BEGIN
IF @RESERVA = 2 AND @RECEBIMENTO IS NULL
UPDATE MOZART_PEDVENDA
SET RESERVA = 0
FROM deleted AS A
INNER JOIN MOZART_PEDVENDA AS B WITH(NOLOCK) ON A.CODFIL = B.CODFIL AND A.TIPOPED = B.TIPOPED AND A.NUMPEDVEN = B.NUMPEDVEN
WHERE A.STATUS <= 4;
END
ELSE IF (SELECT COUNT(1) FROM CAD_TPNOTA (NOLOCK) WHERE TPNOTA = @TPNOTA AND TIPO = 'S' AND (TPREM = 'L' OR TPREM = 'D' OR TPREM = 'G') AND (TPDEST = 'L' OR TPDEST = 'D' OR TPDEST = 'G')) > 0 AND @TIPOPED = 2
BEGIN
IF @RESERVA = 2 AND (@RECEBIMENTO IS NULL OR @RECEBIMENTO = 0)
UPDATE MOZART_PEDVENDA
SET RESERVA = 0
FROM deleted AS A
INNER JOIN MOZART_PEDVENDA AS B WITH(NOLOCK) ON A.CODFIL = B.CODFIL AND A.TIPOPED = B.TIPOPED AND A.NUMPEDVEN = B.NUMPEDVEN
WHERE A.STATUS <= 4;
END

GO

Deve ser criado também uma tabela de De/Para chamada MSGPDR_PEDIDORESERVA_DEPARA no banco do Gemco, essa tabela será responsável em armazernar os internalId dos dois sitemas 

exemplo:

Script.: 

/****** Object: Table [dbo].[MSGPDR_PEDIDORESERVA_DEPARA] Script Date: 17/08/2018 19:12:39 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[MSGPDR_PEDIDORESERVA_DEPARA](
[SISTEMA_INT] [varchar](30) NOT NULL,
[COD_INT] [varchar](50) NOT NULL,
[CODFIL] [numeric](5, 0) NOT NULL,
[NUMPEDVEN] [numeric](9, 0) NOT NULL,
[TIPOPED] [numeric](5, 0) NOT NULL,
[DATA_INT] [datetime] NOT NULL
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

ALTER TABLE [dbo].[MSGPDR_PEDIDORESERVA_DEPARA] ADD DEFAULT (getdate()) FOR [DATA_INT]
GO


1.2 Adapter Reserva 

O Adapter de Reserva deve ser instalado para enviar os dados ao Mozart, e o mesmo enviar ao EAI Totvs.

O Adapter Reserva é uma Web Api, tecnologia rest que utiliza .Net Core 2.0, ela será responsável em consultar a tabela Mozart_PedVenda para verificar se existem pedidos de venda válidos para serem reservados no Protheus.

Atraves da coluna PublicacaoMozart na Tabela Mozart_PedVenda quando a trigger inseri um novo numero de pedido de venda, por default está coluna recebe o status 0, quando o Adapter Reserva inicia o processamento ele atualiza o status da PublicacaoMozart para 1, ao termino do processo de gerar uma mensagem padronizada de ItemReserve e envia lo ao Mozart, o status da coluna PublicacaoMozart é atualizado para 2. 

Caso o mesmo pedido sofra alguma alteração no gemco a coluna PublicacaoMozart será atualizada para 0 novamente para ser enviado ao Protheus uma atualização da reserva anterior. Se o pedido for excluido no Gemco, também será gerado uma mensagem de ItemReserve com status de cancelamento.

A imagem abaixo mostra a api já publicada no iis e em funcionamento.

No Adapter Reserva há dois métodos :

 O método BuscarTodosIntegraçãoMozart que será configurado no Timer do Mozart para ser chamado para buscar no banco do Gemco pedidos de venda válidos para serem reservados suas mercadorias via Protheus.

 Há também o método ToUpsertBusinessMessageResponse responsável em receber o retorno de um envio de uma reserva, salva o id do Protheus no de/para e informa a mensagem do resultado da integração.

Exemplo de uma mensagem padronizada de ItemReserve gerado pelo Adapter Reserva :

<?xml version="1.0" encoding="utf-8"?><soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tot="http://www.totvs.com"><soapenv:Header /><soapenv:Body><tot:RECEIVEMESSAGE><tot:INMSG><![CDATA[<?xml version="1.0" encoding="utf-8"?>
<TOTVSMessage>
<MessageInformation version="1.000">
<UUID>5a5a36ee-0558-42a7-9f61-893d65287810</UUID>
<Type>BusinessMessage</Type>
<Transaction>ItemReserve</Transaction>
<StandardVersion>1.000</StandardVersion>
<SourceApplication>GEMCO</SourceApplication>
<CompanyId>40</CompanyId>
<BranchId>1</BranchId>
<Product name="GEMCO" version="1.000" />
<GeneratedOn>2018-08-17T17:04:04</GeneratedOn>
<DeliveryType>Async</DeliveryType>
</MessageInformation>
<BusinessMessage>
<BusinessEvent>
<Entity>ItemReserve</Entity>
<Event>Upsert</Event>
<Identification name="" />
</BusinessEvent>
<BusinessContent>
<CompanyId>40</CompanyId>
<BranchId>1</BranchId>
<InternalId>40|1|0|600</InternalId>
<CompanyInternalId>40|1</CompanyInternalId>
<ReserveType>LJ</ReserveType>
<DocumentReserve>600</DocumentReserve>
<Requester>Gemco</Requester>
<RequestBranch>1</RequestBranch>
<ReserveItemType>
<Item>
<ItemCode>8718</ItemCode>
<ItemInternalId>8718</ItemInternalId>
<WarehouseCode>01</WarehouseCode>
<WarehouseInternalId>01</WarehouseInternalId>
<Quantity>12.000000000</Quantity>
<ReserveExpiration>2018-08-18T17:04:04</ReserveExpiration>
<IssueDateReserve>2018-08-17T17:04:04</IssueDateReserve>
<SubLotNumber />
<SeriesItem />
<AddressingItem />
<NoteReserveItem>VENDEDOR 05</NoteReserveItem>
<ReserveBranch>1</ReserveBranch>
<IsCanceled>F</IsCanceled>
</Item>
</ReserveItemType>
</BusinessContent>
</BusinessMessage>
</TOTVSMessage>]]></tot:INMSG></tot:RECEIVEMESSAGE></soapenv:Body></soapenv:Envelope>


1.3 Configurações no Mozart 

Os seguintes procedimento deve ser configurados no Mozart :

Em sua pasta de publicação existe um arquivo chamado Configuracao.json neste arquivo deve ser executados os trecho de configuração abaix

{

"Id": "GEMCO PARA PROTHEUS - PEDIDO VENDA - RESERVAR VENDA",
"IdOperacao": 3134,
"Frequencia": 20000,
"QuantidadeRegistrosEnfileirar": 5,
"LimiteReprocessamento": 3,
"TimeoutEmSegundos": 190,
"Coletores": [
{
"Id": "Reciclagem: Processando - Aguard. Proc.",
"FrequenciaEmMilissegundos": 30000,
"TempoOciosoEmSegundos": 120,
"StatusOrigem": 2,
"StatusDestino": 1
},
{
"Id": "Reciclagem: Reprocessar - Aguard. Proc.",
"FrequenciaEmMilissegundos": 30000,
"TempoOciosoEmSegundos": 60,
"StatusOrigem": 5,
"StatusDestino": 1
}
]
},

{
"Id": "GEMCO PARA PROTHEUS - PEDIDO VENDA - CANCELAR RESERVA",
"IdOperacao": 3135,
"Frequencia": 30000,
"QuantidadeRegistrosEnfileirar": 1,
"LimiteReprocessamento": 3,
"TimeoutEmSegundos": 120,
"Coletores": [
{
"Id": "Reciclagem: Processando - Aguard. Proc.",
"FrequenciaEmMilissegundos": 30000,
"TempoOciosoEmSegundos": 120,
"StatusOrigem": 2,
"StatusDestino": 1
},
{
"Id": "Reciclagem: Reprocessar - Aguard. Proc.",
"FrequenciaEmMilissegundos": 30000,
"TempoOciosoEmSegundos": 60,
"StatusOrigem": 5,
"StatusDestino": 1
}
]
},

No arquivo de configuração do Mozart para processos em que o sistema Gemco envia para o Protheus, deve ser configurado o seguinte código :


{
"Nome": "GEMCO PARA PROTHEUS - PEDIDO VENDA - RESERVAR VENDA",
"Api": {
"Url": "http://localhost:84/Reserva/api/Gemco/Reserva/BuscarTodosIntegracaoMozart",
"Method": "GET",
"TimeoutEmSegundos": 60,
"Headers": {
"Authorization": "bearer 71EC877E31CC3DF7BE52BC4D2F595"
}
},
"TempoEsperaExecucaoEmMilisegundos": 30000
},

Com está configuração, o mozart recebe um endereço de método em uma api "Url": "http://localhost:84/Reserva/api/Gemco/Reserva/BuscarTodosIntegracaoMozartrecebe qual o tipo de requisição terá que ser feita, neste caso ele executará um GET como está configurado "Method": "GET", receberá a configuração de quanto tempo no máximo ele pode processar um requisição, na configuração acima está definida em 60 segundo "TimeoutEmSegundos": 60, para saber de quanto em quanto tempo o Mozart deve chamar o método BuscarTodosIntegracaoMozart foi configurado "TempoEsperaExecucaoEmMilisegundos": 30000 que equivalem a 30 segundos. Então, a cada 30 segundos o Mozart via seu timer (Tarefas em segundo plano) fará a chamada.

As querys devem ser executadas no banco de dados do Mozart 

INSERT [dbo].[MzOperacao] ([Id], [Descricao], [Request], [RequestCallback], [IdCallback]) VALUES (3134, N'GEMCO PARA PROTHEUS - PEDIDO DE VENDA - RESERVAR VENDA', NULL, NULL, NULL)
INSERT [dbo].[MzOperacao] ([Id], [Descricao], [Request], [RequestCallback], [IdCallback]) VALUES (3135, N'GEMCO PARA PROTHEUS - PEDIDO DE VENDA - CANCELAR RESERVA', NULL, NULL, NULL)

INSERT [dbo].[MzOperacaoCliente] ([Id], [IdOperacao], [IdCliente], [Request], [RequestCallback]) VALUES (46, 3134, 8, NULL, NULL)
INSERT [dbo].[MzOperacaoCliente] ([Id], [IdOperacao], [IdCliente], [Request], [RequestCallback]) VALUES (47, 3135, 8, NULL, NULL)

INSERT [dbo].[MzTransacao] ([Id], [Nome]) VALUES (25, N'RESERVA')
INSERT [dbo].[MzTransacao] ([Id], [Nome]) VALUES (26, N'RESERVACANCELAMENTO')

INSERT [dbo].[MzAplicacaoEvento] ([Id], [IdAplicacao], [Evento], [TipoIntegracao], [IdOperacao], [IdTransacao]) VALUES (72, 13, N'UPSERT', NULL, 3134, 25)
INSERT [dbo].[MzAplicacaoEvento] ([Id], [IdAplicacao], [Evento], [TipoIntegracao], [IdOperacao], [IdTransacao]) VALUES (73, 13, N'DELETE', NULL, 3135, 26)

INSERT [dbo].[MzAssinatura] ([Id], [IdAplicacaoEvento], [IdAplicacaoAssinante], [IdCliente], [Tenant], [IdOperacao]) VALUES (72, 75, 15, 8, N'T3', NULL)
INSERT [dbo].[MzAssinatura] ([Id], [IdAplicacaoEvento], [IdAplicacaoAssinante], [IdCliente], [Tenant], [IdOperacao]) VALUES (73, 76, 15, 8, N'T3', NULL)

INSERT [dbo].[MzAssinaturaPasso] ([Id], [IdAssinatura], [Ordem], [Request]) VALUES (187, 69, 1, N'{"AwaitCallback": true, "Url": "http://10.171.67.163:8175/EAISERVICE.apw", "Method": "POST","TimeoutEmSegundos": 30, "Headers": { "Content-Type": "text/xml", "SOAPAction" : "http://www.totvs.com/RECEIVEMESSAGE" }}')
INSERT [dbo].[MzAssinaturaPasso] ([Id], [IdAssinatura], [Ordem], [Request]) VALUES (188, 69, 2, N'{"Adapter": false, "Url": "http://localhost:84/Reserva/api/gemco/Reserva/ToUpsertBusinessMessageResponse", "Method": "POST", "Headers": { "Content-Type": "application/json" } }')
INSERT [dbo].[MzAssinaturaPasso] ([Id], [IdAssinatura], [Ordem], [Request]) VALUES (189, 70, 1, N'{"AwaitCallback": true, "Url": "http://10.171.67.163:8175/EAISERVICE.apw", "Method": "POST","TimeoutEmSegundos": 30, "Headers": { "Content-Type": "text/xml", "SOAPAction" : "http://www.totvs.com/RECEIVEMESSAGE" }}')
INSERT [dbo].[MzAssinaturaPasso] ([Id], [IdAssinatura], [Ordem], [Request]) VALUES (190, 70, 2, N'{"Adapter": false, "Url": "http://localhost:84/Reserva/api/gemco/Reserva/ToUpsertBusinessMessageResponse", "Method": "POST", "Headers": {    "Content-Type": "application/json" } }')

2.0 Configurações no Protheus

         Exemplo de Mensagem: ItemReserve - Mensagem para Integração da Reserva de Produtos 

FielddocumentationmaxLengthERPFieldERPReq.TypeLengthDescription
CompanyIdEmpresa

-> PROTHEUS

-> Não possui campo físico na tabela

-> não

-> char

-> 2

-> Será enviado o valor da variável cEmpAnt(Empresa)
BranchIdFilial

-> PROTHEUS

-> C0_FILIAL

-> Não

-> char

-> 12

-> Será enviado o valor da variável cFilAnt indicando em qual Filial Será feita a Reserva
CompanyInternalIdInternalId da chave completa de empresa da venda

-> PROTHEUS

-> 

-> 

-> 

-> 

-> para o Protheus é esperado que com o cabeçalho da mensagem seja identificado empresa e filial já pelo Framework estando no ambiente (Empresa x Filial) correto
InternalIdInternalId da Reserva

-> PROTHEUS

-> Não possui campo físico na tabela

-> Sim

-> Varchar

-> 50

-> O InternalID da Reserva é formado por EMPRESA|C0_FILIAL|C0_NUM|C0_PRODUTO
ReserveNumberNumero da Reserva

-> PROTHEUS

-> C0_NUM

-> Sim

-> Varchar

-> 6

-> Numero da Reserva no Protheus
ReserveTypeTipo de Reserva

-> PROTHEUS

-> SC0.C0_TIPO

-> Sim 

-> Varchar

-> 2

-> Tipo de Reserva
DocumentReserveDocumento que Originou a Reserva

-> PROTHEUS

-> C0_DOCRES

-> Não

-> Varchar

-> 9

-> Número do documento que originou a reserva.
RequesterSolicitante

-> PROTHEUS

-> C0_SOLICIT

-> Sim

-> varchar

-> 20

-> Nome do usuário solicitante da reserva.
RequestBranchFilial Responsável pela Solicitação de Reserva

-> PROTHEUS

-> C0_FILRES

-> Não

-> VarChar

-> 12

-> Filial solicitante da reserva.
ReserveItemTypeItens da Reserva

-> PROTHEUS

-> 

-> 

-> 

-> 

-> 
ItemCodeCódigo do Produto

-> PROTHEUS

-> C0_PRODUTO

-> sim

-> varchar

-> 15

-> Código identificador do produto junto ao sistema.
ItemInternalIdInternalId do Produto

-> PROTHEUS

-> Não possui campo físico na tabela

-> Sim

-> Varchar

-> 50

-> O InternalID do Produto é formado por EMPRESA|FILIAL| PRODUTO
WarehouseCodeCodigo do Local de Estoque(Armazem)

-> PROTHEUS

-> C0_LOCAL

-> nao

-> varchar

-> 2

-> Código do Local de Estoque
WarehouseInternalIdId de integração do Local de Estoque(Armazem)

-> PROTHEUS

-> 

-> sim

-> varchar

-> 50

-> O InternalId do Local de Estoque é formado por EMPRESA|NNR_FILIAL|NNR_CODIGO
QuantityQuantidade do Item

-> PROTHEUS

-> C0_QUANT

-> Sim

-> Decimal

-> 7,2

-> Quantidade do Item
ReserveExpirationData de Vencimento da Reserva

-> PROTHEUS

-> C0_VALIDA

-> Sim

-> Date

-> 8

-> Data de Vencimento da Reserva
IssueDateReserveData de Emissão da Reserva

-> PROTHEUS

-> C0_EMISSAO

-> Sim

-> DateTime

-> 8

-> Data de Emissão da Reserva
LotNumberNúmero do Lote

-> PROTHEUS

-> C0_LOTECTL

-> não

-> char

-> 10

-> Número do lote usado no Controle de Reservas
SubLotNumberNúmero do SubLote6
-> PROTHEUS

-> C0_NUMLOTE

-> não

-> char

-> 6

-> Código do Lote associado ao produto.
SeriesItemNúmero de Serie do Produto

-> PROTHEUS

-> C0_NUMSERI

-> Não

-> VarChar

-> 20

-> Número de Série do produto, caso o produto faça o controle.
AddressingItemEndereço do produto reservado.

-> PROTHEUS

-> C0_LOCALIZ

-> Não

-> VarChar

-> 15

-> Endereço do produto reservado, utilizado nos casos que o estique di produto tem endereços.
NoteReserveItemObservacao

-> PROTHEUS

-> C0_OBS

-> Não

-> varchar

-> 80

-> Observacao da Reserva
ReserveBranchFilial onde será realizada a Reserva

-> PROTHEUS

-> C0_FILIAL

-> Não

-> VarChar

-> 12

-> Filial onde será realizada a reserva do item.
IsCanceledNão possui campo físico na tabela.

-> PROTHEUS

-> 

-> Sim

-> boolean

-> 1

-> Indica se o Item deverá ser excluído, apenas em casos de updade.
ListOfInternalId






         O cadastro de adapters são rotinas responsáveis por realizar o processamento das mensagens enviadas e recebidas, possibilitando a inclusão, alteração e exclusão do adapter no Protheus.

         Atenção:

         Todos os Adapters devem ser cadastrados. Pois a versão da mensagem pode influenciar na correta geração ou recebimento das mensagens dependentes.

          Caso não deseje usar alguns dos Adapters basta desmarcar as opções de Envio/recebimento conforme necessário.

      1. No Configurador (SIFACFG), acesse Ambientes/Schedule/Adapter E.a.i

      2.1 Efetue a Inclusão de  uma nova rotina  para os Adapters do sistema Protheus.Configure a rotina do Adapter, de acordo com  os dados abaixo e que já foram pré estabelecidos  para a integração:

      Mensagem única: Sim
      Rotina: Nome do adapter 
      Mensagem: Nome da mensagem única que o Adapter EAI  espera receber.
      Descrição: Identificação da mensagem.
      Envia: SIM (se envia a informação para o outro sistema) ou NÃO ( Se não envia nenhuma informação deste adapter para o outro sistema).
      Recebe: SIM (se recebe a informação do outro sistema) ou NÃO ( Se não recebe nenhuma informação deste adapter do outro sistema).
      Método: Síncrono/Assincrono
      Operação: Todas
      Canal de Envio: EAI
       

      Observe que ao preencher o campo Canal Envio, com a opção 2 - EAI, o sistema preenche automaticamente o campo Rota padrão, com o conteúdo preenchido no parâmetro MV_EAIURL2.

      Atenção: Efetue a inclusão dos Adapters e Versões conforme tabela abaixo: 

Mensagem Única

Rotina Protheus

Mensagem

Descrição

Envia

Recebe

Método Protheus

Operação

Condição de envio

Canal de Envio

Versão

Sim

MATA030

CustomerVendor

Cliente

Não

Sim

Assíncrono

Todas


EAI

2.005
Sim MATA010 ItemProdutoSim  SimAssíncrono Todas ALLTRIM(SB1->B1_TIPO) == "PA" EAI 4.000
SimMATA020MCustomerVendorFornecedorNãoSimAssíncronoTodas
EAI2.005
SimOMSA010PriceListHeaderItemTabela de PreçoSimNãoAssíncronoTodas
EAI1.000

Sim

LOJA160

Reduction

Redução Z

Não

Sim

Assíncrono

Todas


EAI

1.001
SimFINA040AccountReceivableDocumentContas a ReceberSimNãoAssíncronoTodas
EAI3.000

Sim

MATA461InvoiceNota fiscal de saídaSimNãoAssíncronoTodas !EMPTY(SF2->F2_CHVNFE)EAI3.009
SimLOJA121ListOfStationSalePointLista de Estações de TrabalhoNãoSim

Assíncrono


Todas
EAI1.000
SimLOJA210ItemCódigo de barrasSimNãoAssíncronoTodas
EAI4.000
Sim

LOJA701

RetailsalesRegistro de VendasNãoSimAssíncronoTodas
EAI

2.000

SimLOJA070APAYMENTMETHODForma de PagamentoNãoSimAssíncronoTodas
EAI1.000

Sim

LOJA140

RetailsallesCancellationCancelamento de VendasNãoSimAssíncronoTodas
EAI1.001
SimMATA410OrderPedido de VendaSimSimAssíncronoTodas
EAI4.003
SimMATA103InputDocumentDocumento de EntradaNãoSimAssíncronoTodas
EAI2.005
SimMATA270InventoryInventárioNãoSimAssíncronoTodas
EAI2.001
SimMATA410BDocumentTraceabilityOrderOrdem de Rastreabilidade de DocumentosSimNãoAssíncronoTodas
EAI1.000
SimLOJA057ACashierConferenceConferência de CaixaNãoSimAssíncronoTodas
EAI2.000
SimOMSA010PriceListHeaderItemCadastro de Tabela de PreçoSimSimAssíncronoTodas
EAI

1.000

SimLOJA704ItemReserveReserva itens de PedidosNãoSimAssíncronoTodas
EAI1.000
SimMATA040SellerVendedorNãoSimAssíncronoTodas
EAI2.001

                 

Importante!

        Os adapters devem ser adicionados somente na Retaguarda.   

2.2  Cadastro de De/Para de Empresas:

No EAI Protheus existe a possibilidade de se cadastrar, para as Mensagens Únicas TOTVS, um relacionamento entre a Empresa e Filial de processamento que chegou na mensagem com uma existente no Protheus. Isto se deve ao fato de que, na Mensagem Única TOTVS

os valores trafegados na mensagem são sempre do sistema que enviou a mensagem, cabendo ao sistema receptor a tradução das informações trafegadas.

      1. No Configurador (SIFACFG), acesse Ambientes/Schedule/Emp.Fil.Msg.Unica.
      2. Cadastre  De-Para de Empresas e Filiais e configure-os conforme os valores a seguir:
      • Referência: BEMATECH
      • Empresa :  Código da Empresa Bematech a integrar.
      • Filial: Código da Filial Bematech a integrar
      • Grupo Emp. Protheus: Código da Empresa no Protheus a integrar com o sistema Bematech
      • Fil. Protheus: Código da Filial no Protheus  a integrar com o sistema  Bematech 

        Exemplo:
      • Referência: BEMATECH
      • Empresa : 2200000032   
      • Filial: 5001182
      • Grupo Emp. Protheus: T1  
      • Fil. Protheus: D MG 01

     

2.3 Inclusão De / Para dos Caixas cadastrados no Protheus e Gemco:

       Pré - requisitos:

          Efetuar o cadastro do caixa no Protheus e solicitar junto a Bematech, o código do operador Live.

      1. No Configurador, acesse Ambiente Schedule De /para de Mensagem Unica.

      Preencha os campos abaixo

      • Referência: BEMATECH
      • Tabela: Informe a tabela SLF
      • Alias: Informe SLF
      • Campo: LF_COD
      • Valor Externo: Informe o código do Caixa Cadastrado no Live, conforme exemplo abaixo.
      • Valor Interno: Informe a Empresa| Filial | e o Código do Caixa cadastrado no Protheus, conforme exemplo abaixo.
         
        Atenção: O campo de valor Interno deve ser preenchido com os valores de  Empresa e filial mais o conteudo separados por  "|" (Pipe). Caso a tabela seja compartilhada deve-se preencher de acordo com a regra de compartilhamento.
        Exemplo:  T1|D RJ 01|C02
          

           Segue  exemplo do código do caixa Cadastrado no Protheus,

 

2.4 Cadastro de De/Para CFOP/TES:

O cadastro de De/Para da CFOP/TES, é de extrema importância para que as mensagens transmitidas, tenham suas movimentações dentro do Sistema Protheus definidas de acordo com as operações.

       Pré - requisitos:

       -   Efetuar o cadastro do CFOP.

        -  Solicitar junto a Bematech, o código do CFOP utilizados nas operações Gemco.

      1. No Configurador, acesse Ambiente Schedule De /para de Mensagem Única.

      Preencha os campos abaixo.

      • Referência: BEMATECH
      • Tabela: Informe a tabela SF4XXX
      • Alias: Informe SF4
      • Campo: F4_CODIGO
      • Valor Externo: Informe o código do CFOP cadastrado no Live, conforme exemplo abaixo.
      • Valor Interno: Informe a Empresa|Filial | Código da TES cadastrada no Protheus, conforme exemplo abaixo.

         Atenção: O campo de valor Interno deve ser preenchido com os valores de  Empresa e filial mais o conteudo separados por  "|" (Pipe). Caso a tabela seja compartilhada deve-se preencher de acordo com a regra de compartilhamento.
              Exemplo:  T3||506