I needed something similar: user purchased an item (points) and depending on the purchased product a value (points) should be added to the user profile. The rule below is ready to accept (loop through) multiple products/lineItems. In my case I only need the first one:
"value" : [ "commerce-order:commerce-line-items:0:line-item-id" ],
"limit" : "1"
First I fetch the purchased products (line items) by property (line_item_id). The result is an array (list of purchased products).
Next you need to loop through this array/list and add the desired action to the individual/current purchased product. If you need a condition (product 1 -> role 1) you can use conditional rules. It is an awesome rules addon that lets you insert IF conditions within loops (so you dont have to create a component that checks the product).
{ "rules_purchasing_points" : {
"LABEL" : "PURCHASE Points",
"PLUGIN" : "reaction rule",
"OWNER" : "rules",
"REQUIRES" : [ "rules", "commerce_payment" ],
"ON" : { "commerce_payment_order_paid_in_full" : [] },
"DO" : [
{ "entity_query" : {
"USING" : {
"type" : "commerce_line_item",
"property" : "line_item_id",
"value" : [ "commerce-order:commerce-line-items:0:line-item-id" ],
"limit" : "1"
},
"PROVIDE" : { "entity_fetched" : { "entity_fetched" : "Fetched entity" } }
}
},
{ "LOOP" : {
"USING" : { "list" : [ "entity-fetched" ] },
"ITEM" : { "list_item" : "Current list item" },
"DO" : [
{ "data_convert" : {
"USING" : { "type" : "decimal", "value" : [ "list-item:line-item-label" ] },
"PROVIDE" : { "conversion_result" : { "conversion_result" : "Conversion result" } }
}
},
{ "component_rules_set_points" : {
"recipient" : [ "site:current-user" ],
"sender" : "1",
"points" : [ "conversion-result" ]
}
},