Flexy
Objetivo/Resumo
A Flexy é uma plataforma de E-commerce que atua com soluções inteligentes de venda online. Este conector permite a comunicação da plataforma de e-commerce com sistemas que realizam a gestão do seu negócio online. Sendo eles: softwares de controle de estoque (ERP), de relacionamento com o cliente (CRM), e-mail marketing, assim como os necessários à operação e gestão de sua loja.
Criando um fluxo utilizando o conector Flexy
Para criar um fluxo utilizando o conector Flexy é preciso criar uma conexão e em seguida configurar o fluxo.
Criando conexão Flexy
OBS: Clique aqui e acesse nosso passo a passo para saber como criar uma conexão.
Estes são os seguintes parâmetros de configuração da conexão Flexy que serão requisitados na criação:
- Nome: parâmetro padrão em qualquer criação de uma conexão, te ajudará a identificar melhor sua conexão (campo obrigatório);
- Descrição: parâmetro padrão e opcional em qualquer criação de uma conexão, aqui você pode relatar detalhadamente para que fins servirá sua conexão;
- Identidade: identificação na URL: <suaidentidade>.plataforma.flexy.com.br (campo obrigatório);
- Tipo de Acesso: referencia ao acesso que a conexão terá, sendo eles, acesso a loja ou ao shopping;
- Loja: para acessar a loja preencha os seguintes campos;
- Token: token de acesso da loja;
- Código da Loja: codigo de referência da loja;
- Shopping: para acessar o shopping preencha o seguinte campo;
- Token: token de acesso do shopping;
Configurando fluxo Flexy
Crie um fluxo e arraste o conector Flexy para o canvas.
OBS: Clique aqui e acesse nosso passo a passo para saber como criar um fluxo.
Selecione o conector e na aba de Parametrização preencha os seguintes parâmetros de configuração:
- Recurso: entidade para qual será realizada a ação. No momento o conector dispões três recursos sendo eles, Pedidos, Produtos e Notas;
- Operação: ação que será realizada para o recurso selecionado.
- Operações disponiveis para recurso Pedidos:
- Listar Pedidos: usado para buscar os pedidos da base, podendo informar o número do pedido caso queira buscar somente um, ou deixar o campo vazio para retornar todos os pedidos da base;
- Operações disponiveis para recurso Produtos:
- Listar Produtos: usado para buscar os produtos da base, podendo informar o número do produto caso queira buscar somente um, ou deixar o campo vazio para retornar todos os produtos da base;
- Operações disponiveis para recurso Notas:
Na aba Propriedades selecione a conexão desejada, dê um nome ao passo e se necessário detalhe uma descrição.
Na prática
Neste tópico criaremos um exemplo de um fluxo utilizando o conector da Flexy. O fluxo terá 3 passos porém será executado somente dois pois criaremos uma rule para identificar se o produto ja foi cadastrado ou não. O fluxo simulará uma integração com Bling, então teremos um payload de entrada referente a saída de uma busca da Bling.

Passo 'busca-produto'
Este passo fará uma busca nos produtos da Flexy utilizando o código do produto que é enviado no payload de entrada (lembrando que esse payload de entrada simula o payload de saída de uma busca de produtos na Bling, clique aqui para mais informações sobre nosso conector Bling). Por fim informaremos o código do produto utilizando uma função de parâmetros dinâmicos da fluid (para mais detalhes clique em saiba mais). Assim ficará a Parametrização do busca-produto:

Na aba Propriedades informamos o nome do passo e a conexão criada com as credenciais da loja:

Passo 'atualiza-produto'
Este passo terá uma rule mandatória que irá validar o retorno do passo 'busca-produto', se o retorno for vazio, o passo não será executado e pulará para o próximo pois não haverá produto para atualizar (para mais detalhes sobre rules clique em saiba mais). Assim ficará a Parametrização do atualiza-produto:

Para tratar os dados recebidos do passo anterior usamos o De/Para. E por fim utilizamos o Template para montar o corpo da requisição que a operação espera receber.
Assim ficou nosso De/para:
{
"json_obj": {
"product.name": "rule_descricao",
"product.referenceCode": "rule_codigo",
"product.ncm": "produto.class_fiscal",
"product.categories": "rule_categoriaProdutos",
"json_list&&product.images&&produto.imagem": "link",
"json_obj&&product.descriptionGroup&&json_obj": {
"product.descriptionGroup.descriptionOne": "produto.descricaoCurta",
"product.descriptionGroup.descriptionTwo": "produto.descricaoComplementar",
"product.descriptionGroup.descriptionThree": "produto.observacoes"
},
"json_list&&product.properties&&json_obj": {
"referenceCode": "default_Cor",
"value": "rule_marca"
},
"properties2": "produto.condicao",
"json_list&&product.videos&&json_obj": {
"code": "urlVideo"
},
"json_obj&&product.metaTags": {
"product.metaTags.title": "rule_descricao",
"product.metaTags.description": "produto.descricaoComplementar",
"product.metaTags.keyword": "produto.observacoes"
},
"product.availableFor": "default_sale",
"product.stockControl": "default_1",
"json_list&&product.variants&&json_obj": {
"price": "produto.preco",
"presentation": "rule_descricao",
"referenceCode": "rule_codigo",
"master": "default_1",
"eanCode": "produto.gtin",
"json_obj": {
"stock.quantity": "rule_estoqueAtual",
"json_obj": {
"distributionCenter.referenceCode": "default_96581798000262"
}
},
"json_obj&&dimensionGroup": {
"dimensionGroup.weight": "produto.pesoBruto",
"dimensionGroup.width": "produto.larguraProduto",
"dimensionGroup.height": "produto.alturaProduto",
"dimensionGroup.depth": "produto.profundidadeProduto"
}
}
}
}Para mais informações sobre como tratamos de/paras clique em saiba mais.
Se observar, alguns valores do nosso de/para estão sendo referenciado algumas rules, essas são rules internas, para mais informações acesse nossa documentação sobre Rules.
Para nós o que será relevante é a rule mandatória que definirá o percurso do nosso fluxo, assim ficou nossa rule:
[
{
"idRule": "flexy_atualiza_produto",
"rule": "{\"if\" : [ {\"!=\": [{\"var\":\"busca-produto\"}, \"[]\"] }, true, false]}",
"type": "mandatory",
"description": "Verifica se existe o produto cadastrado. Se existir só executa a atualização. Se não existir, só executa o cadastro."
}
...
]
E por fim, o template no formato esperado pela Flexy:
{
"product": {
"availableFor": "{{ .mapping.product.availableFor }}",
"categories": {{ .mapping.product.categories }},
"descriptionGroup": {
"descriptionOne": "{{ removeAspasQuebraEHTML .mapping.product.descriptionGroup.descriptionOne }}",
"descriptionTwo": "{{ removeAspasQuebraEHTML .mapping.product.descriptionGroup.descriptionTwo }}",
"descriptionThree": "{{ removeAspasQuebraEHTML .mapping.product.descriptionGroup.descriptionThree }}"
},
"images":[
{{ range $index1, $value1 := .mapping.product.images }}{{- if $index1}},{{end }}"{{ $value1 }}"{{ end }}
],
"metaTags": {
"description": "{{ removeAspasQuebraEHTML .mapping.product.metaTags.description }}",
"keyword": "{{ removeAspasQuebraEHTML .mapping.product.metaTags.keyword }}",
"title": "{{ removeAspasQuebraEHTML .mapping.product.metaTags.title }}"
},
"name": "{{ .mapping.product.name }}",
"referenceCode": "{{ .mapping.product.referenceCode | replace "_" "-"}}",
"ncm":"{{ .mapping.product.ncm }}",
"stockControl": "{{ .mapping.product.stockControl }}",
"variants":[
{{ $variant:= (index .mapping.product.variants 0) }}
{
"dimensionGroup":
{
"depth":"{{ $variant.dimensionGroup.depth }}",
"height":"{{ $variant.dimensionGroup.height }}",
"weight":"{{ $variant.dimensionGroup.weight }}",
"width":"{{ $variant.dimensionGroup.width }}"
},
"eanCode":"{{ $variant.eanCode }}",
"master":"{{ $variant.master }}",
"presentation":"{{ $variant.presentation }}",
"price":"{{ $variant.price }}",
"referenceCode":"{{ $variant.referenceCode | replace "_" "-"}}",
"stock":{
"quantity":{{ $variant.stock.quantity}}
}
}
]
}
}Na aba Propriedades informamos o nome do passo e a conexão criada com as credenciais da loja:

Passo 'cadastra-produto'
Este passo também terá uma rule mandatória que irá validar o retorno do passo 'busca-produto', porém se o retorno for vazio, o passo será executado e cadastrará o produto na flexy (para mais detalhes sobre rules clique em saiba mais). Assim ficará a Parametrização do cadastra-produto:

Para tratar os dados recebidos do passo anterior usamos o De/Para. E por fim utilizamos o Template para montar o corpo da requisição que a operação espera receber.
Assim ficou nosso De/para:
{
"json_obj": {
"product.name": "rule_descricao",
"product.referenceCode": "rule_codigo",
"product.ncm": "produto.class_fiscal",
"product.categories": "rule_categoriaProdutos",
"json_list&&product.images&&produto.imagem": "link",
"json_obj&&product.descriptionGroup&&json_obj": {
"product.descriptionGroup.descriptionOne": "produto.descricaoCurta",
"product.descriptionGroup.descriptionTwo": "rule_descricaoComplementar",
"product.descriptionGroup.descriptionThree": "rule_observacoes"
},
"json_list&&product.properties&&json_obj": {
"referenceCode": "default_marca",
"value": "rule_marca"
},
"properties2": "produto.condicao",
"json_list&&product.videos&&json_obj": {
"code": "urlVideo"
},
"json_obj&&product.metaTags": {
"product.metaTags.title": "rule_descricao",
"product.metaTags.description": "rule_descricaoComplementar",
"product.metaTags.keyword": "rule_observacoes"
},
"product.availableFor": "default_sale",
"product.stockControl": "default_1",
"json_list&&product.variants&&json_obj": {
"price": "produto.preco",
"presentation": "rule_descricao",
"referenceCode": "rule_codigo",
"master": "default_1",
"eanCode": "produto.gtin",
"json_obj": {
"stock.quantity": "rule_estoqueAtual",
"json_obj": {
"distributionCenter.referenceCode": "default_bike-no-vale"
}
},
"json_obj&&dimensionGroup": {
"dimensionGroup.weight": "produto.pesoBruto",
"dimensionGroup.width": "produto.larguraProduto",
"dimensionGroup.height": "produto.alturaProduto",
"dimensionGroup.depth": "produto.profundidadeProduto"
}
}
}
}para mais informações sobre como tratamos de/paras clique em saiba mais
Se observar, alguns valores do nosso de/para também estão sendo referenciado algumas rules, essas são rules internas, para mais informações acesse nossa documentação sobre Rules
Para nós o que será relevante é a rule mandatória que definirá o percurso do nosso fluxo, assim ficou nossa rule:
[
{
"idRule": "flexy_cadastra_produto",
"rule": "{\"if\" : [ {\"!=\": [{\"var\":\"busca-produto\"}, \"[]\"] }, false, true]}",
"type": "mandatory",
"description": "Verifica se existe o produto cadastrado. Se existir só executa a atualização. Se não existir, só executa o cadastro."
}
...
]E por fim, o template no formato esperado pela Flexy:
{
"product": {
"availableFor": "{{ .mapping.product.availableFor }}",
"categories":{{ .mapping.product.categories }},
"descriptionGroup": {
"descriptionOne": "{{removeAspasQuebraEHTML .mapping.product.descriptionGroup.descriptionOne }}",
"descriptionTwo": "{{ removeAspasQuebraEHTML .mapping.product.descriptionGroup.descriptionTwo }}",
"descriptionThree": "{{ removeAspasQuebraEHTML .mapping.product.descriptionGroup.descriptionThree }}"
},
"images":[
{{ range $index1, $value1 := .mapping.product.images }}{{- if $index1}},{{end }}"{{ $value1 }}"{{ end }}
],
"metaTags": {
"description": "{{removeAspasQuebraEHTML .mapping.product.metaTags.description }}",
"keyword": "{{ removeAspasQuebraEHTML .mapping.product.metaTags.keyword }}",
"title": "{{ removeAspasQuebraEHTML .mapping.product.metaTags.title }}"
},
"name": "{{ .mapping.product.name }}",
"referenceCode": "{{ .mapping.product.referenceCode | replace "_" "-"}}",
"ncm":"{{ .mapping.product.ncm }}",
"stockControl": "{{ .mapping.product.stockControl }}",
"variants":[
{{ $variant:= (index .mapping.product.variants 0) }}
{
"dimensionGroup":
{
"depth":"{{ $variant.dimensionGroup.depth }}",
"height":"{{ $variant.dimensionGroup.height }}",
"weight":"{{ $variant.dimensionGroup.weight }}",
"width":"{{ $variant.dimensionGroup.width }}"
},
"eanCode":"{{ $variant.eanCode }}",
"master":"{{ $variant.master }}",
"presentation":"{{ $variant.presentation }}",
"price":"{{ $variant.price }}",
"referenceCode":"{{ $variant.referenceCode | replace "_" "-"}}",
"stock":{
"quantity":{{ $variant.stock.quantity}}
}
}
]
}
}Na aba Propriedades informamos o nome do passo e a conexão criada com as credenciais da loja:

Conclusão
Com todos os passos configurados basta disparar o fluxo informando o payload de entrada simulando o retorno da busca de produtos na bling, que seria algo pareciso com isso:
{
"produto": {
"id": "15880597775",
"codigo": "fld-citrino",
"descricao": "Tênis Saucony Endorphin",
"tipo": "P",
"situacao": "Ativo",
"unidade": "",
"preco": "2000000.0000000000",
"precoCusto": null,
"descricaoCurta": "",
"descricaoComplementar": "",
"dataInclusao": "2022-06-07",
"dataAlteracao": "2022-11-22",
"imageThumbnail": null,
"urlVideo": "",
"nomeFornecedor": "",
"codigoFabricante": "",
"marca": "",
"class_fiscal": "",
"cest": "",
"origem": "0",
"idGrupoProduto": "0",
"linkExterno": "",
"observacoes": "",
"grupoProduto": null,
"garantia": null,
"descricaoFornecedor": null,
"idFabricante": "",
"categoria": {
"id": "4098280",
"descricao": "Categoria padr\u00e3o"
},
"pesoLiq": "0.00000",
"pesoBruto": "0.00000",
"estoqueMinimo": "0.00",
"estoqueMaximo": "0.00",
"gtin": "",
"gtinEmbalagem": "",
"larguraProduto": "0",
"alturaProduto": "0",
"profundidadeProduto": "0",
"unidadeMedida": "Cent\u00edmetros",
"itensPorCaixa": 0,
"volumes": 0,
"localizacao": "",
"crossdocking": "0",
"condicao": "N\u00e3o Especificado",
"freteGratis": "N",
"producao": "P",
"dataValidade": "0000-00-00",
"spedTipoItem": "",
"imagem": [
{
"link": "https://yt3.ggpht.com/ytc/AMLnZu9A574Fn2LsUmBlvFnNTQqsVGxI_W3KkF8uX6LwSA=s900-c-k-c0x00ffffff-no-rj",
"validade": "S\/ Validade",
"tipoArmazenamento": "externo"
}
],
"estoqueAtual": 200,
"depositos": [
{
"deposito": {
"id": "14886475711",
"nome": "Geral",
"saldo": 200,
"desconsiderar": "N",
"saldoVirtual": 200
}
}
]
}
}

Após o disparo, caso o produto já exista na Flexy:

Caso o produto não exista na Flexy:
