Como conceder pontos de usuário iguais ao preço de um produto comercial?

9

Gostaria de conceder o ponto de usuário ao proprietário do produto no valor do preço do produto após a venda do produto.

Para isso, defini uma regra como abaixo:

  • Eventos: Concluindo o processo de checkout

  • Ações: Loop ( commerce-order:commerce-line-items)

E eu defini um componente de regras como abaixo:

  • Condições: Entidade tem de campo (Entidade: commerce-line-item, Campo: commerce_product)

  • Ações: Pontos de conceder a um utilizador: (User: commerce-line-item:commerce-product:creator, Pontos: commerce-line-item:commerce-product:commerce-price:amount)

Mas quando eu salvo o componente, gera esta mensagem de erro:

Seletor de dados item de linha de comércio: produto de comércio: preço de comércio: a quantidade de pontos de parâmetro é inválida.

Como eu posso fazer isso?

user1468966
fonte
Por que você precisa dessa condição?
precisa saber é o seguinte
Provavelmente, o motivo é que o produto comercial já está fora do escopo quando a finalização da compra (não tenho certeza). Tente imprimir o valor e verifique uma vez.
Gokul NK
@Daniele tem certeza de que deseja conceder pontos ao usuário que criou o produto?
precisa saber é o seguinte
@ subhojit777 Sim, por exemplo, para gerenciar pontos de usuário como crédito do usuário. Crio um produto virtual que, uma vez comprado, fornece o ponto de usuário necessário para comprar produtos reais. Infelizmente, trade_credits não têm flexibilidade e substituição de moeda, como trade_userpoints.
Daniele Napolitano
@DanieleNapolitano, por que você precisa dessa condição? Vejo que a pergunta tem condição no componente de regra.
precisa saber é o seguinte

Respostas:

5

No começo eu tentei responder a sua pergunta usando regras e userpoints módulo, mas eu vi que ao adicionar pontos de conceder a um usuário como ação não existe tal seletor de dados para selecionar o usuário que criou o produto. Encontrei o seletor de dados para selecionar o usuário que é o proprietário do pedido, mas esse não é seu requisito. (Foi por isso que esclareci isso nos comentários).

Encontrei uma solução de módulo para sua pergunta. O módulo usa hook_commerce_checkout_complete () . Na página do gancho:

Permite que os módulos executem a lógica de negócios quando um pedido concluir a finalização da compra.

Esse gancho coincide com o evento "O cliente conclui a finalização da compra". Somente a lógica comercial deve ser executada quando isso é chamado, como atualizar o status do pedido, atribuir o pedido a uma conta de usuário ou enviar e-mails de notificação. Em vez disso, a interação com o usuário deve ocorrer através dos painéis de checkout na página de conclusão do checkout.

Esta é a codificação do módulo que eu projetei:

Arquivo YOURMODULE.info :

name = YOURMODULE
description = Module description
dependencies[] = commerce
dependencies[] = commerce_cart
dependencies[] = commerce_checkout
dependencies[] = userpoints
core = 7.x

ATUALIZAÇÃO Conforme sugerido por Clive , alterei o arquivo do módulo para que esse módulo personalizado também funcione com sites multilíngues.

Arquivo YOURMODULE.module :

/**                                                                             
 * Implements hook_commerce_checkout_complete().                                
 */                                                                             
function YOURMODULE_commerce_checkout_complete($order) {
  // Iterate through every commerce line item added in product.
  foreach (field_get_items('commerce_order', $order, 'commerce_line_items') as $line_item_id) {

    // Load commerce line item by line item id.
    $line_item = commerce_line_item_load($line_item_id['line_item_id']);

    // We do not want to include shipping cost in userpoints.
    if ($line_item->type != 'shipping') {
      // Load commerce product by product id.
      $product = commerce_product_load(field_get_items('commerce_line_item', $line_item, 'commerce_product')[0]['product_id']);

      // Create parameters.
      $params = array(
        'uid' => $product->uid,
        'points' => commerce_currency_amount_to_decimal(field_get_items('commerce_line_item', $line_item, 'commerce_total')[0]['amount'], field_get_items('commerce_line_item', $line_item, 'commerce_total')[0]['currency_code']),
      );

      // Grant userpoints programmatically.
      userpoints_userpointsapi($params);
    }
  }
}

Links de referência:

userpoints_userpointsapi ($ params)

API commerce_checkout

trade_line_item_load ($ line_item_id)

trade_product_load ($ product_id)

Pontos de usuário: deduzir pontos programaticamente

commerce_currency_amount_to_decimal ()

subhojit777
fonte
Ótima solução, que será útil. Posso sugerir uma pequena alteração? Seria melhor usar field_get_items()para recuperar $order->commerce_line_items, dessa maneira também funcionará com sites multilíngues
Clive
@ Clive obrigado pela sugestão .. mas eu nunca usei field_get_item () antes .. Eu tenho que aprender seu uso e aplicá-lo nesta resposta. Precisa de algum tempo :)
subhojit777
0

Como alternativa à resposta anterior, que requer código personalizado, tente a alternativa descrita abaixo para contornar a mensagem de erro ...

Sua pergunta parece ser uma variação (não uma duplicata) da pergunta " Como conceder pontos de usuário ao usuário igual ao valor de determinado campo / valor calculado? ". Semelhante à resposta aceita para essa pergunta, tente adaptar seu Componente de Regras da seguinte maneira:

  1. Adicione essas ações de regras extras antes da ação de regras no seu componente de regras que causa o erro:

    • Set a variableisso corresponde à " quantidade do preço do produto " (como na sua pergunta), que parece ser commerce-line-item:commerce-product:commerce-price:amount. Vamos supor que você nomeie essa variável price_amount.
    • Convert data typedessa price_amountvariável para inteiro . Vamos supor que você nomeie esse resultado de conversão amount_of_points.
  2. Adapte sua ação de regras existente (nesse componente de regras) para que o número de pontos de usuário a serem concedidos use isso (calculado + convertido) amount_of_points.

PS 1: Esse tipo de "Converter dados" é simplesmente uma questão de como as Regras funcionam (por design), por isso também não deve ser considerado um bug ...

PS 2: Presumo que sua pergunta seja sobre D7.

Pierre.Vriens
fonte