Cupom Desconto || Desconto no Carrinho

Fala Matheus, blz? Estou com uma aplicação aqui própria para recuperar carrinho via Whatsapp. A ideia é oferecer um desconto para os clientes com carrinhos abandonados. Mas estou com uma situação aqui a resolver: para que esse desconto seja aplicado posso gerar um cupom de desconto para o cliente e enviar o cupom por mensagem via Whats ou então aplicar um desconto diretamente no carrinho do cliente. Mas aí temos duas situações:

  1. Não achei um endpoint na doc da api para criar cupons. Também seria possível inserir esse cupom no carrinho (/carts) sem necessidade do cliente digitar o cupom? Em outras palavras, assim que o cliente clica no permalink do carrinho já esteja adicionado o cupom.

  2. Como não achei o endpoint, tentei inserir o desconto via api dando um patch no carrinho. Tive retorno com sucesso da api e após dar um get nesse mesmo carrinho o atributo “discount” está lá:

    “discount”: {
    “apply_at”: “subtotal”,
    “type”: “percentage”,
    “value”: 5
    }
    }…

No entanto, o desconto não entra quando clico no permalink do carrinho (id do carrinho: 64fa32c02cd6b65959425b14 // permalink: URBANNA )

Consegue me orientar como consigo resolver essa situação? Inserir o desconto no carrinho e não estar gerando o desconto no site seria um bug?

Boa noite, tudo bem?
Todos os cupons da loja são efetivados via backend pelo aplicativo cupons de descontos. Então, caso deseje inserir um cupom de desconto, teria que inserir diretamente nele. Para não misturar com regras atuais de cupons, é indicado inserir num campo hidden_data do app, vou te passar aqui as instruções:

Para manipular cupons através do aplicativo padrão de descontos:

  1. Busque o ID do aplicativo de descontos instalado na loja:
GET https://api.e-com.plus/v1/applications?app_id=1252&fields=_id
  -H "X-Store-ID: <store_id>"
  -H "X-My-ID: <authentication_id>"
  -H "X-Access-Token: <access_token>"

O ID estará na resposta em result[0]._id:

{
  "meta": {
    "limit": 1000,
    "offset": 0,
    "sort": [
    ],
    "fields": [
      "_id"
    ],
    "query": {
      "app_id": {
        "$in": [
          1252,
          "1252"
        ]
      }
    }
  },
  "result": [
    {
      "_id": "<discounts_app_id>"
    }
  ]
}

Ou apenas, acesse seu aplicativo pelo painel e na url constará o ID do app.

  1. Adicionar um cupom UMPORCLIENTE:
PATCH https://api.e-com.plus/v1/applications/<discounts_app_id>/hidden_data.json
  -H "X-Store-ID: <store_id>"
  -H "X-My-ID: <authentication_id>"
  -H "X-Access-Token: <access_token>"
  -d '{
    "UMPORCLIENTE": {
      "discount": {
        "apply_at": "subtotal",
        "type": "percentage",
        "value": 10
      },
      "cumulative_discount": true,
      "usage_limit": 1
    }
  }'
  1. Removendo o mesmo cupom:
PATCH https://api.e-com.plus/v1/applications/<discounts_app_id>/hidden_data.json
  -H "X-Store-ID: <store_id>"
  -H "X-My-ID: <authentication_id>"
  -H "X-Access-Token: <access_token>"
  -d '{
    "UMPORCLIENTE": null
  }'

Outros exemplos de cupons:

{
  "ATE100NOFRETE": {
    "discount": {
      "apply_at": "freight",
      "type": "fixed",
      "value": 50
    },
    "cumulative_discount": true,
    "total_usage_limit": 100
  }
}

{
  "PRAUMCLIENTE": {
    "discount": {
      "apply_at": "total",
      "type": "fixed",
      "value": 100
    },
    "customer_ids": ["abc122202020202"],
    "case_insensitive": true,
    "cumulative_discount": true
  }
}

{
  "ANONOVO": {
    "date_range": {
      "start": "2023-01-01T03:00:00.000Z",
      "end": "2023-02-01T03:00:00.000Z"
    },
    "discount": {
      "apply_at": "subtotal",
      "type": "percentage",
      "value": 5
    },
    "case_insensitive": true,
    "cumulative_discount": true
  }
}

JSON schema do objeto de cupom para referência completa e opções adicionais:

{
  "type": "object",
  "title": "Regra de desconto",
  "required": [
    "discount"
  ],
  "additionalProperties": false,
  "properties": {
    "date_range": {
      "type": "object",
      "title": "Período de validade",
      "description": "Preencha para programar a oferta a datas de início e/ou fim",
      "additionalProperties": false,
      "properties": {
        "start": {
          "type": "string",
          "format": "date-time",
          "title": "Início"
        },
        "end": {
          "type": "string",
          "format": "date-time",
          "title": "Encerramento"
        }
      }
    },
    "case_insensitive": {
      "type": "boolean",
      "title": "Case insensitive",
      "description": "Ative para não diferenciar letras maiúsculas e minúsculas no cupom ou campanha"
    },
    "usage_limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 1000,
      "title": "Limite de uso por cliente",
      "description": "Limite opcional de aplicação do desconto para cada cliente"
    },
    "total_usage_limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 1000,
      "title": "Limite de uso total",
      "description": "Limite opcional de aplicação do desconto até desativá-lo"
    },
    "customer_ids": {
      "title": "Lista de clientes selecionados",
      "description": "Se preenchido, o desconto será disponibilizado apenas para estes clientes",
      "type": "array",
      "items": {
        "type": "string",
        "pattern": "^[a-f0-9]{24}$",
        "title": "ID do cliente"
      }
    },
    "discount": {
      "title": "Desconto concedido",
      "type": "object",
      "required": [
        "value"
      ],
      "additionalProperties": false,
      "properties": {
        "apply_at": {
          "type": "string",
          "enum": [
            "total",
            "subtotal",
            "freight"
          ],
          "default": "total",
          "title": "Aplicar desconto em",
          "description": "Em qual valor o desconto deverá ser aplicado no checkout"
        },
        "min_amount": {
          "type": "integer",
          "minimum": 1,
          "maximum": 999999999,
          "title": "Valor mínimo",
          "description": "Montante mínimo para aplicar o desconto"
        },
        "amount_field": {
          "type": "string",
          "enum": [
            "total",
            "subtotal"
          ],
          "default": "total",
          "title": "Montante a validar",
          "description": "Checar valor mínimo no total ou subtotal do carrinho"
        },
        "type": {
          "type": "string",
          "enum": [
            "percentage",
            "fixed"
          ],
          "default": "fixed",
          "title": "Tipo de desconto",
          "description": "Desconto com valor percentual ou fixo"
        },
        "value": {
          "type": "number",
          "minimum": -99999999,
          "maximum": 99999999,
          "title": "Valor do desconto",
          "description": "Valor percentual ou fixo a ser descontado, dependendo to tipo configurado"
        }
      }
    },
    "product_ids": {
      "title": "Lista de produtos da campanha",
      "description": "Se preenchido, o desconto só será válido se um dos produtos estiver no carrinho",
      "type": "array",
      "items": {
        "type": "string",
        "pattern": "^[a-f0-9]{24}$",
        "title": "ID do produto"
      }
    },
    "excluded_product_ids": {
      "title": "Produtos excluídos",
      "description": "Se preenchido, o desconto será inválido se um dos produtos estiver no carrinho",
      "type": "array",
      "items": {
        "type": "string",
        "pattern": "^[a-f0-9]{24}$",
        "title": "ID do produto"
      }
    },
    "cumulative_discount": {
      "type": "boolean",
      "default": true,
      "title": "Desconto cumulativo",
      "description": "Se a promoção poderá ser aplicada junto a descontos de pagamento/entrega"
    }
  }
}

Matheus, blz? Boa tarde. Deu certinho a questão de recuperar os cupons no GET no entanto estou com problemas para criar um cupom: ao dar um PATCH com intuito de criar um novo cupom tenho retorno 204 mas o cupom não é criado lá no aplicativo. Será que estou fazendo algo errado?

Bom dia, quando é criado via api, não há intuito de mostrar ele no aplicativo. Poderia ficar uma lista infinita e a depender do computador da pessoa travar ao abrir o app, por isso que é enviado para o hidden_data, se quiser que ele seja visualizado é em outra rota e outro corpo, mas não é indicado.

Boa noite, depois me informe se o cupom funcionou, no exemplo acima

PRAUMCLIENTE

Seria um cupom gerado, para saber se ele foi inserido corretamente, realizando um GET para a rota hidden_data, você encontrará o cupom.

Caso queira colocar na rota que funcione na listagem do app, precisaria ler o hidden_data, retornará os cupons criados e um array de objetos chamado discount_rules, nele terá que fazer um push para inserir uma nova configuração com pelo menos os dados:

{
		"discount": {
			"value": 10,
			"min_amount": 0,
			"type": "percentage",
			"apply_at": "subtotal",
			"amount_field": "subtotal"
		},
		"label": "CUPOM PRIMEIRA COMPRA",
		"discount_coupon": "primeira10",
		"cumulative_discount": true,
		"case_insensitive": true,
		"description": "cupom site"
}

E posteriormente, editar o app com os demais objetos, realizando um PATCH. Resumindo, o processo é um pouco maior, um GET, busca as informações, salva, altera o discount_rules, insere o cupom desejado e realiza o PATCH com a informação salvada.

O procedimento anterior é apenas o PATCH.