Guia da Extensão #11 Promoções

Uso da extensão que gerencia a exibição de preços, desconto por meios de pagamento, categorias e produtos e cupom (em breve)

Índice


1. Preços

2. Descontos por forma de pagamento

3. Descontos 

3.1 Descontos para a loja

3.2 Descontos para categorias

3.3 Descontos para produtos

4. Cupons

1. Preços

Os preços contram como o preço é exibido na loja virtual.


A composição dos preços tem o objetivo de customizar sua exibição conforme intenções do lojistas e contatenar todos os descontos e frete grátis.

Como o preço é consumido no layout:


$priceLabelData = getPriceLabelData();

$priceLabelData['pricelabelInstallments']; /*installments (quantity)*/
$priceLabelData['pricelabelShowFess']; /* 0 = "sem juros"; 1 = "com juros"*/
$priceLabelData['pricelabelShowBiggestPaymentDiscount']; /*0 = no ; 1 = yes*/
$priceLabelData['pricelabelShowFullPriceCrossedOut']; /*show full price; 0 = no ; 1 = yes;*/
$priceLabelData['pricelabelApplyToLists']; /* 0 = no; 1 = yes; ... if not, price label is used only on product page;*/


 ⚠️ Sem dúvida as diretrizes de preços necessitam das outras funções que irão consumir os descontos e realizar os cálculos. Por exemplo, vai precisar calcular o maior desconto da forma de pagamento caso queira exibí-la.


2. Desconto das formas de pagamento

São descontos aplicados em porcentagem para as formas de pagamento.

⚠️ Mercado Pago: É aplicado um desconto único, independente de pagar com cartão, PIX ou Boleto.

Como coletar as formas de pagamento no layout (pegar o maior desconto e exibir uma publicidade sobre isso):


$paymentDiscounts = getPaymentDiscounts();

//get the biggest discount from $paymentDiscounts array
$bestPaymentDiscount = max($paymentDiscounts);
$bestPaymentMethod = array_search($bestPaymentDiscount, $paymentDiscounts);
//0 = manual ; 1 = mercado pago; 2 = picpay; 
$paymentMethods = ['depósito ou PIX', 'Mercado Pago', 'PicPay'];
$bestPaymentMethod = $paymentMethods[$bestPaymentMethod];

//show best payment advertise
if($bestPaymentDiscount > 0) {
   $home .= '<div class="row"><div class="col-12"><h1 class="paymentMethodAdvertise">Toda a loja com          <strong>'.$bestPaymentDiscount.'%</strong> no pagamento com <strong>'.$bestPaymentMethod.'</strong>  </h1></div></div>';
}

$home .= '<div class="row productsList" id="listProductsContainer">
<div class="col-12">
<h1 class="mt-0">Produtos em <strong>destaque</strong></h1>
</div>';

3. Descontos

De forma geral, os descontos vão aplicar subtração em valor absoluto ou porcentagem no valor de cada produto.

Os descontos seguem a sequência de descontos globais, categoria principal, adicionais, produto e forma de pagamento, conforme a imagem:


Os descontos são aplicados sob o resultado do desconto anterior e não simplesmente somados.

Situação:
- 5% de desconto global
- 5% de desconto na categoria principal
- Duas categorias adicionais do produto também tem o desconto de 5%
- O produto em si tem desconto de 5%
- O meio de pagamento escolhido possui 5% de desconto
- O produto custa R$100


O mesmo para valores absolutos. Por exemplo: Uma loja com todos os produtos R$10 OFF tem um produto de R$100 com 5% de desconto ficaria (100-10) = 90 - (90*0.05) = 85,50. 

🚚 Desconto com frete grátis

O frete grátis é aplicado desde que esteja presente em qualquer nível para que na loja não haja falácia, conforme a imagem abaixo:


⚠️ Caso um ou mais produtos não tiverem frete grátis o frete é cobrado normalmente no checkout.


3.1 Descontos para lojas

⚠️ Só pode haver um desconto para a loja. Caso a loja tenha um desconto e se cadastre outro, o antigo será deletado.

O desconto pode ser em % ou em R$.

Como chama o desconto para o layout:


//o desconto para toda loja é o categoryDiscounts[0] (categoria 0 = toda a loja), $productPrice é o preço do produto
$categoryDiscounts = getCategoriesDiscount();



//global category discount
if(isset($categoryDiscounts[0])) {
   //show price with R$ discount
   if($categoryDiscounts[0]['categorydiscountType'] == 0) {
      $productPrice = round((($productPrice-$categoryDiscounts[0]['categorydiscountValue'])), 2);
   }
   else {
   //show price with % discount
      $productPrice = round((($productPrice*(100-$categoryDiscounts[0]['categorydiscountValue']))/100), 2);
   }
   //show free shipping label
   if($categoryDiscounts[0]['categorydiscountFreeShipping'] == 1) {
      $categoryDiscount[0]['categorydiscountMessage'] == '' ? $freeShippingLabel = 'Frete Grátis' : $freeShippingLabel = $categoryDiscount[0]['categorydiscountMessage'];
    }
 }


3.2 Descontos para categorias

Semelhante ao descontos para as lojas, entretanto, usando o id da categoria principal e iterando entre as categorias adicionais.

⚠️ Página do produto: A mensagem de frete grátis aplicada à loja é a última utilizada no desconto, por exemplo: a mensagem de frete grátis do desconto do produto sempre sobreescreverá a mensagem de frete grátis da categoria.


⚠️ Frete grátis no cálculo do carrinho e checkout: Para o pedido ter frete grátis, é necessário que a mensagem contenha a palavra "grátis"todos os produtos estejam em categorias com o desconto, senão, o desconto é descartado. 


⚠️ Frete grátis no cálculo do carrinho e checkout, mas sem a palavra "grátis": Nesta situação, supondo que a mensagem seja "Frete a combinar" (sem a palavra grátis), a mensagem será exibida no cálculo de frete do carrinho e no checkout. No checkout, o usuário poderá escolher a forma para os demais produtos. 


//apply discount for product main category
if(array_key_exists($categoryData['categoryId'], $categoryDiscounts)) {
   if($categoryDiscounts[$categoryData['categoryId']]['categorydiscountType'] == 0) {
      //discount value
      $productPrice = round((($productPrice-$categoryDiscounts[$categoryData['categoryId']]['categorydiscountValue'])), 2);
   }
   else {
      //discount percent
      $productPrice = round((($productPrice*(100-$categoryDiscounts[$categoryData['categoryId']]['categorydiscountValue']))/100), 2);
   }
   if($categoryDiscounts[$categoryData['categoryId']]['categorydiscountFreeShipping'] == 1) {
      $categoryDiscounts[$categoryData['categoryId']]['categorydiscountMessage'] == '' ? $freeShippingLabel = 'Frete Grátis' : $freeShippingLabel = $categoryDiscounts[$categoryData['categoryId']]['categorydiscountMessage'];
   }
}

//check for additionalcategories array: additionalCatsIds[]
if(isset($product['additionalCatsIds'])) {
   $additionalCatsIds = $product['additionalCatsIds'];
   foreach($additionalCatsIds as $k => $v) {
      if(array_key_exists($v, $categoryDiscounts)) {
         if($categoryDiscounts[$v]['categorydiscountType'] == 0) {
         //discount value
         $productPrice = round((($productPrice-$categoryDiscounts[$v]['categorydiscountValue'])), 2);
      }
      else {
         //discount percent
         $productPrice = round((($productPrice*(100-$categoryDiscounts[$v]['categorydiscountValue']))/100), 2);
      }
      if($categoryDiscounts[$v]['categorydiscountFreeShipping'] == 1) {
         $categoryDiscounts[$v]['categorydiscountMessage'] == '' ? $freeShippingLabel = 'Frete Grátis' :       $freeShippingLabel = $categoryDiscounts[$v]['categorydiscountMessage'];
      }
   }
}


3.3 Descontos para os produtos


⚠️ Desconto de Frete Grátis na Página do produto: A mensagem aparece na página do produto. Caso a categoria também tenha frete grátis, a mensagem do produto sobrescreverá a da categoria (a do produto é mais importante).


⚠️ Produto com desconto de frete grátis no carrinho com outros sem frete grátis: Nesta situação o frete grátis é anulado e o cálculo é realizado normalmente pelo serviço de entrega. 


//check if product has discount
 if(array_key_exists($product['id'], $productsDiscounts)) {
  if($productsDiscounts[$product['id']]['productdiscountType'] == 0) {
   //discount value
   $productPrice = round((($productPrice-$productsDiscounts[$product['id']]['productdiscountValue'])), 2);
  }
  else {
   //discount percent
   $productPrice = round((($productPrice*(100-$productsDiscounts[$product['id']]['productdiscountValue']))/100), 2);
  }
  if($productsDiscounts[$product['id']]['productdiscountFreeShipping'] == 1) {
   $productsDiscounts[$product['id']]['productdiscountMessage'] == '' ? $freeShippingLabel = 'Frete Grátis' : $freeShippingLabel = $productsDiscounts[$product['id']]['productdiscountMessage'];
  } 
 }


É importante que no carrinho, o atributo discountedProductPrice esteja funcionando para conseguir manipular os dados por script, principalmente de variações.

Exemplo funcional do botão do carrinho no layout do produto:


<a class="cartAddProduct cartPopupView" cartitemid="'.$productData['productSKU'].'" cartitemname="'.$productData['productTitle'].'" cartitemimage="'.str_replace('w_0_', 'w_100_', $productImg).'" cartitemlink="'.$mainData['configPath'].'/item/'.$productData['productUrl'].'" cartitemprice="'.$productPrice.'" cartaddlimit="5" originalProductPrice="'.$productData['productPrice'].'" discountedProductPrice="'.$productPrice.'">Adicionar na sacola</a>


4. Cupom

O cupom está presente no checkout de forma automática. É importante entender suas políticas:

  1. O cupom não diminui o valor do frete.
    Um cupom de 10% off aplicado em uma compra de R$100 com frete de R$20 obterá R$ 90+R$ 20
  2. Um cupom nunca pode iniciar no passado.
  3. O código inserido do cupom pode ser minúsculo ou maiúsculo que funcionara;
  4. O cupom é checado no checkout, em qualquer etapa após confirmação do usuário (como alguns cupons são vinculados à usuários, é necessário que esteja logado para usar);
  5. O cupom aparece no pedido, tanto no painel quanto na tela do cliente. Os dados do cupom não são enviados por e-mail;


Sobre as funcionalidades:



  1. O valor do cupom é sempre um número inteiro;
  2. O cupom pode ser em porcentagem ou em valor real. Pedidos com valor igual a zero ou negativos não funcionam;
  3. Quantas vezes o cupom pode ser usado em toda a loja;
  4. Quantas vezes o cupom pode ser usado pela mesma pessoa;
  5. Código que o usuário precisa inserir para validar o cupom;
  6. Nome do cupom para uso interno, o usuário não vê;
  7. Descrição do cupom para uso interno, o usuário não vê;
  8. Início da validade do cupom;
  9. Data de expiração do cupom;
  10. Att (11/02) Agora é possível definir se o cupom possui frete grátis no botão de "habilitar frete grátis"


No checkout, o cupom (conforme imagem acima) altera o preço total da compra, escreve uma mensagem customizada avisando sobre o cupom e o mesmo pode ser removido a qualquer momento.

O cupom sempre está localizado após o botão de Finalizar compra do checkout.

Você também pode gostar de ler

Guia completo para o catálogo de produtos (Extensão)

Em 14/06/2022 às 13h38 - Atualizado em 11/04/2025 às 13h17

Carrinho de compras cart2.js

Em 29/11/2022 às 12h54 - Atualizado em 03/02/2025 às 11h54

Buscas e Pesquisas no Catálogo de produtos

Em 01/03/2023 às 09h23 - Atualizado em 16/12/2024 às 11h48

Extensão #9 Envios e cálculos de frete

Em 23/03/2023 às 20h22 - Atualizado em 15/09/2023 às 09h49

Checkout e Pedidos - Extensão #10

Em 01/06/2023 às 14h35 - Atualizado em 18/08/2023 às 08h36

Estoque do Catálogo de Produtos - Layout, Uso e Consultas

Em 13/02/2023 às 14h40 - Atualizado em 07/08/2023 às 22h28

Catálogo de Produtos - Listar Produtos com AJAX

Em 09/08/2022 às 11h03 - Atualizado em 26/12/2022 às 09h37

001. Catálogo em Lista - Formato Imobiliária

Em 29/06/2022 às 11h22 - Atualizado em 16/08/2022 às 09h09