¿Cómo otorgar puntos de usuario iguales al precio de un producto de comercio?

9

Me gustaría otorgar un punto de usuario al propietario del producto en la cantidad del precio del producto después de que se venda un producto.

Para esto definí una regla de la siguiente manera:

  • Eventos: completar el proceso de pago

  • Acciones: Loop ( commerce-order:commerce-line-items)

Y definí un componente de reglas de la siguiente manera:

  • Condiciones: Entidad dispone de campo (Entidad: commerce-line-itemField: commerce_product)

  • Acciones: Puntos permita a un usuario: (Usuario: commerce-line-item:commerce-product:creator,: Puntos commerce-line-item:commerce-product:commerce-price:amount)

Pero cuando guardo el componente genera este mensaje de error:

Selector de datos artículo-línea-comercio: producto-comercio: precio-comercio: la cantidad de puntos de parámetros no es válida.

¿Como puedo hacer eso?

usuario1468966
fuente
¿Por qué necesitas esta condición?
subhojit777
Probablemente, la razón es que el producto comercial ya está fuera de alcance a medida que se completa el pago (no estoy seguro). Intente imprimir el valor y verifíquelo una vez.
Gokul NK
@Daniele, ¿estás seguro de que quieres otorgar puntos al usuario que creó el producto?
subhojit777
@ subhojit777 Sí, por ejemplo, para administrar puntos de usuario como crédito de usuario. Creo un producto virtual que, una vez comprado, me da el punto de usuario necesario para comprar productos reales. Lamentablemente, commerce_credits no tiene flexibilidad ni cambio de moneda como commerce_userpoints.
Daniele Napolitano
@DanieleNapolitano, ¿por qué necesitas esa condición? Veo que la pregunta tiene condición en el componente de regla.
subhojit777

Respuestas:

5

Al principio traté de responder a su pregunta usando reglas y userpoints módulo, pero vi que mientras que la adición de puntos de Grant a un usuario como una acción que no hay tal selector de datos para seleccionar el usuario que ha creado el producto. Encontré el selector de datos para seleccionar el usuario que es el propietario del pedido, pero ese no es su requisito. (Es por eso que aclaré esto en los comentarios).

Encontré una solución de módulo para su pregunta. El módulo usa hook_commerce_checkout_complete () . Desde la página de gancho:

Permite que los módulos realicen lógica de negocios cuando un pedido completa el pago.

Este enlace coincide con el evento "El cliente completa el pago". Solo se debe realizar la lógica de negocios cuando se invoca, como actualizar el estado del pedido, asignar el pedido a una cuenta de usuario o enviar correos electrónicos de notificación. En cambio, la interacción con el usuario debería ocurrir a través de los paneles de pago en la página de finalización del pago.

Esta es la codificación del módulo que diseñé:

Archivo YOURMODULE.info :

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

ACTUALIZACIÓN Según lo sugerido por Clive , he cambiado el archivo del módulo para que este módulo personalizado también funcione con sitios multilingües.

Archivo 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);
    }
  }
}

Enlaces de referencia:

userpoints_userpointsapi ($ params)

comercio_checkout API

commerce_line_item_load ($ line_item_id)

commerce_product_load ($ product_id)

Puntos de usuario: deduzca puntos mediante programación

commerce_currency_amount_to_decimal ()

subhojit777
fuente
Gran solución, eso será útil. ¿Puedo sugerir un pequeño cambio? Sería mejor usar field_get_items()para recuperar $order->commerce_line_items, de esa manera esto también funcionará con sitios multilingües
Clive
@Clive gracias por la sugerencia ... pero nunca he usado field_get_item () antes ... Tengo que aprender su uso y aplicarlo en esta respuesta. Necesita algo de tiempo :)
subhojit777
0

Como alternativa a la respuesta anterior, que requiere un código personalizado, es posible que desee probar la alternativa que se describe a continuación para evitar ese mensaje de error ...

Su pregunta parece ser una variación (no un duplicado) de la pregunta " ¿Cómo otorgar al Usuario Puntos de Usuario iguales al valor de cierto campo / valor calculado? ". Similar a la respuesta aceptada a esa pregunta, intente adaptar su componente de reglas de la siguiente manera:

  1. Agregue estas acciones de reglas adicionales antes de la acción de reglas en su componente de reglas que causa el error:

    • Set a variableeso corresponde a la " cantidad del precio del producto " (como en su pregunta), que parece ser commerce-line-item:commerce-product:commerce-price:amount. Supongamos que nombra esa variable price_amount.
    • Convert data typede esa price_amountvariable a entero . Supongamos que nombra ese resultado de conversión amount_of_points.
  2. Adapte su Acción de Reglas existente (en ese Componente de Reglas) para que el número de puntos de usuario que se otorguen use esto (calculado + convertido) amount_of_points.

PD 1: Tal "Convertir tipo de datos" es simplemente una cuestión de cómo funcionan las Reglas (por diseño), por lo que tampoco debe considerarse como un error ...

PD 2: supongo que tu pregunta es sobre D7.

Pierre.Vriens
fuente