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.
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/BuscarTodosIntegracaoMozart" recebe 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
Field | documentation | maxLength | ERP | FieldERP | Req. | Type | Length | Description |
---|---|---|---|---|---|---|---|---|
CompanyId | Empresa | -> PROTHEUS | -> Não possui campo físico na tabela | -> não | -> char | -> 2 | -> Será enviado o valor da variável cEmpAnt(Empresa) | |
BranchId | Filial | -> PROTHEUS | -> C0_FILIAL | -> Não | -> char | -> 12 | -> Será enviado o valor da variável cFilAnt indicando em qual Filial Será feita a Reserva | |
CompanyInternalId | InternalId 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 | |
InternalId | InternalId 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 | |
ReserveNumber | Numero da Reserva | -> PROTHEUS | -> C0_NUM | -> Sim | -> Varchar | -> 6 | -> Numero da Reserva no Protheus | |
ReserveType | Tipo de Reserva | -> PROTHEUS | -> SC0.C0_TIPO | -> Sim | -> Varchar | -> 2 | -> Tipo de Reserva | |
DocumentReserve | Documento que Originou a Reserva | -> PROTHEUS | -> C0_DOCRES | -> Não | -> Varchar | -> 9 | -> Número do documento que originou a reserva. | |
Requester | Solicitante | -> PROTHEUS | -> C0_SOLICIT | -> Sim | -> varchar | -> 20 | -> Nome do usuário solicitante da reserva. | |
RequestBranch | Filial Responsável pela Solicitação de Reserva | -> PROTHEUS | -> C0_FILRES | -> Não | -> VarChar | -> 12 | -> Filial solicitante da reserva. | |
ReserveItemType | Itens da Reserva | -> PROTHEUS | -> | -> | -> | -> | -> | |
ItemCode | Código do Produto | -> PROTHEUS | -> C0_PRODUTO | -> sim | -> varchar | -> 15 | -> Código identificador do produto junto ao sistema. | |
ItemInternalId | InternalId do Produto | -> PROTHEUS | -> Não possui campo físico na tabela | -> Sim | -> Varchar | -> 50 | -> O InternalID do Produto é formado por EMPRESA|FILIAL| PRODUTO | |
WarehouseCode | Codigo do Local de Estoque(Armazem) | -> PROTHEUS | -> C0_LOCAL | -> nao | -> varchar | -> 2 | -> Código do Local de Estoque | |
WarehouseInternalId | Id 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 | |
Quantity | Quantidade do Item | -> PROTHEUS | -> C0_QUANT | -> Sim | -> Decimal | -> 7,2 | -> Quantidade do Item | |
ReserveExpiration | Data de Vencimento da Reserva | -> PROTHEUS | -> C0_VALIDA | -> Sim | -> Date | -> 8 | -> Data de Vencimento da Reserva | |
IssueDateReserve | Data de Emissão da Reserva | -> PROTHEUS | -> C0_EMISSAO | -> Sim | -> DateTime | -> 8 | -> Data de Emissão da Reserva | |
LotNumber | Número do Lote | -> PROTHEUS | -> C0_LOTECTL | -> não | -> char | -> 10 | -> Número do lote usado no Controle de Reservas | |
SubLotNumber | Número do SubLote | 6 | -> PROTHEUS | -> C0_NUMLOTE | -> não | -> char | -> 6 | -> Código do Lote associado ao produto. |
SeriesItem | Nú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. | |
AddressingItem | Endereç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. | |
NoteReserveItem | Observacao | -> PROTHEUS | -> C0_OBS | -> Não | -> varchar | -> 80 | -> Observacao da Reserva | |
ReserveBranch | Filial onde será realizada a Reserva | -> PROTHEUS | -> C0_FILIAL | -> Não | -> VarChar | -> 12 | -> Filial onde será realizada a reserva do item. | |
IsCanceled | Nã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.
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 | Item | Produto | Sim | Sim | Assíncrono | Todas | ALLTRIM(SB1->B1_TIPO) == "PA" | EAI | 4.000 |
Sim | MATA020M | CustomerVendor | Fornecedor | Não | Sim | Assíncrono | Todas | EAI | 2.005 | |
Sim | OMSA010 | PriceListHeaderItem | Tabela de Preço | Sim | Não | Assíncrono | Todas | EAI | 1.000 | |
Sim | LOJA160 | Reduction | Redução Z | Não | Sim | Assíncrono | Todas | EAI | 1.001 | |
Sim | FINA040 | AccountReceivableDocument | Contas a Receber | Sim | Não | Assíncrono | Todas | EAI | 3.000 | |
Sim | MATA461 | Invoice | Nota fiscal de saída | Sim | Não | Assíncrono | Todas | !EMPTY(SF2->F2_CHVNFE) | EAI | 3.009 |
Sim | LOJA121 | ListOfStationSalePoint | Lista de Estações de Trabalho | Não | Sim | Assíncrono | Todas | EAI | 1.000 | |
Sim | LOJA210 | Item | Código de barras | Sim | Não | Assíncrono | Todas | EAI | 4.000 | |
Sim | LOJA701 | Retailsales | Registro de Vendas | Não | Sim | Assíncrono | Todas | EAI | 2.000 | |
Sim | LOJA070A | PAYMENTMETHOD | Forma de Pagamento | Não | Sim | Assíncrono | Todas | EAI | 1.000 | |
Sim | LOJA140 | RetailsallesCancellation | Cancelamento de Vendas | Não | Sim | Assíncrono | Todas | EAI | 1.001 | |
Sim | MATA410 | Order | Pedido de Venda | Sim | Sim | Assíncrono | Todas | EAI | 4.003 | |
Sim | MATA103 | InputDocument | Documento de Entrada | Não | Sim | Assíncrono | Todas | EAI | 2.005 | |
Sim | MATA270 | Inventory | Inventário | Não | Sim | Assíncrono | Todas | EAI | 2.001 | |
Sim | MATA410B | DocumentTraceabilityOrder | Ordem de Rastreabilidade de Documentos | Sim | Não | Assíncrono | Todas | EAI | 1.000 | |
Sim | LOJA057A | CashierConference | Conferência de Caixa | Não | Sim | Assíncrono | Todas | EAI | 2.000 | |
Sim | OMSA010 | PriceListHeaderItem | Cadastro de Tabela de Preço | Sim | Sim | Assíncrono | Todas | EAI | 1.000 | |
Sim | LOJA704 | ItemReserve | Reserva itens de Pedidos | Não | Sim | Assíncrono | Todas | EAI | 1.000 | |
Sim | MATA040 | Seller | Vendedor | Não | Sim | Assíncrono | Todas | EAI | 2.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.
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.
Preencha os campos abaixo
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.
Preencha os campos 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