Conceito

O conceito de multiloja visa fazer o compartilhamento de algumas informações entre empresas franqueadoras e franqueadas. Permite que o franqueador tenha uma visão gerencial sobre as movimentações de seus franqueados, assim como os franqueados realizarem cadastros feitos pela franqueadora.

Hoje, cada aplicativo da plataforma (Compras, Faturamento, etc), possuem seus próprios bancos de dados, e em determinados momentos, acontece o sincronismo dos dados entre eles.

Cada registro pertence à empresa que os cadastrou. Ou seja, para um produto “Coca Cola 2,5L" da empresa “04712593000170”, o registro ficará conforme abaixo:

Assim como um cliente dessa mesma empresa:

Para que possamos fazer o vínculo entre empresas franqueadoras e franqueadas, foi criado uma nova tabela chamada EmpresaVinculo, que basicamente informa como as empresas estão associadas.


Nesse cenário de exemplo, temos o FoodTruck - Rio Grande do Sul como uma franqueadora, com apenas 1 franqueado: FoodTruck - Porto Alegre e Região Metropolitana. Que por sua vez, é subdividida em 3 cidades diferentes: Canoas, Porto Alegre e Esteio.

O recurso do multiloja permite que o FoodTruck - Rio Grande do Sul cadastre produtos para serem vendidos em qualquer empresa abaixo dela… Assim como, poderá consultar os dados de vendas, movimentações de estoque, pedidos, etc, dessas empresas.

Permite também, que a FoodTruck - Canoas visualize os dados cadastrados pelas empresas acima dela.

Solução

Cada aplicativo da plataforma, para consumir dados da API, passa obrigatoriamente pelo gateway, onde é responsável por garantir a autenticação, e também por fazer o redirecionamento das chamadas para as APIs de cada aplicativo. Ou seja, o front não acessa diretamente a API dos apps.

Essa arquitetura nos proporciona um ponto único onde possamos fazer a tratativa de empresas vinculadas, sem termos que alterar o código fonte de cada um dos aplicativos.

Quando o gateway recebe uma requisição para acessar alguma API dos aplicativos, automaticamente já inclui no header da requisição a lista de empresas vinculadas a empresa onde o usuário está logado.

Com isso, sempre teremos 2 informações importantes no header de cada requisição:

As consultas ao banco de dados foram alteradas para garantir o compartilhamento dos cadastros entre as empresas vinculadas.

Ex:

ANTES:

SELECT * FROM Produto WHERE PlataformId = ‘04712593000170.fly01.com.br

DEPOIS:

SELECT * FROM PRODUTO WHERE PlatfaformaId IN (‘04712593000170.fly01.com.br’, ‘15786413987565.fly01.com.br’, ‘65486546831054.fly01.com.br’)

DrillUp / DrillDown

Teremos dois cenários para compartilhamento dos dados entre franqueadoras e franqueadas... 

Na visão DrillUp, a franqueada visualiza dados como Produtos, Clientes, Centro de Custo, etc, cadastrados por ela mesma, e ainda por seus franqueadores.

Por outro lado, na visão DrillDown, a franqueadora visualiza dados como Vendas, Notas Fiscais, Inventário, Contas a Pagar/Receber, cadastrados por ela, e também por seus franqueados, para uma visão mais gerencial.

Controllers Gateway

Foi criada uma propriedade na ApiODataBaseController chamado MultiLojaVisibility, que definirá o comportamento para cada API chamada do Gateway.

Os valores possíveis do MultiLojaVisibility são:

Exemplo DrillUp

Por definição de negócio, o cadastro de Produto terá uma visualização “DrillUp”, que permite aos franqueados visualizarem produtos do franqueador.

Empresas vinculadas:

Considerando um produto Coca-Cola cadastrado no Rio Grande do Sul, tanto a empresa Porto Alegre e Região Metropolitana, quanto a Esteio irão visualizar esse produto e poder vender.

Outro produto Água com Gás cadastrado na empresa, Porto Alegre e Região Metropolitana, será visualizado pela Esteio, por estar abaixo dela, e a entidade produto seguir a visualização DrillUp.

RESUMO:

Cadastros:

Visualizações:

Exemplo DrillDown

Por definição de negócio, as Notas Fiscais terão uma visualização “DrillDown”, que permite aos franqueadores visualizarem notas dos franqueados.

RESUMO:

Cadastros:

Visualizações:

Queries Customizadas

Na maioria das implementações, as queries que são executadas no banco de dados são geradas automaticamente baseado no padrão ODATA. Nesse caso, o filtro de PlataformaUrlList já é tratado para contemplar o MultiLoja.

Porém, em algumas situações (Ex: Listagem de Produtos no App Estoque), o método GetAll() do Repository foi sobrescrito, e foi criada uma query customizada para retornar os dados. Com isso, precisamos alterar manualmente a query para considerar a cláusula IN na PlataformaUrlList.

Exemplos:

Antes:

Depois: