Created
December 6, 2017 21:50
-
-
Save clrockwell/61eabb16bd4e02f5ffd69a4c6d2f5e03 to your computer and use it in GitHub Desktop.
commerce_order_report plugin
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
namespace Drupal\scholarrx_reports\Plugin\Commerce\ReportType; | |
use Drupal\commerce_order\Adjustment; | |
use Drupal\commerce_order\Entity\OrderInterface; | |
use Drupal\commerce_order\Entity\OrderItemInterface; | |
use Drupal\commerce_promotion\Entity\CouponInterface; | |
use Drupal\commerce_promotion\Entity\Promotion; | |
use Drupal\commerce_reports\Annotation\CommerceReportType; | |
use Drupal\commerce_reports\Plugin\Commerce\ReportType\ReportTypeBase; | |
use Drupal\Core\Annotation\Translation; | |
use Drupal\Core\Entity\EntityStorageInterface; | |
use Drupal\entity\BundleFieldDefinition; | |
/** | |
* Provide a report for Promotions on behalf of commerce_promotion | |
* | |
* @CommerceReportType( | |
* id = "promotion_advanced_report", | |
* label = @Translation("Promotion Advanced Report"), | |
* description = @Translation("Advanced promotion report") | |
* ) | |
*/ | |
class PromotionAdvanced extends ReportTypeBase { | |
/** | |
* {@inheritdoc} | |
*/ | |
public function generateReport(OrderInterface $order) { | |
$entity_type_manager = \Drupal::service('entity_type.manager'); | |
/** @var EntityStorageInterface $orderReportStorage */ | |
$orderReportStorage = $entity_type_manager->getStorage('commerce_order_report'); | |
$adjustments = []; | |
$aggregate_adjustments['order_adjustments'] = $this->getOrderAdjustments($order); | |
$aggregate_adjustments['item_adjustments'] = $this->getOrderItemAdjustments($order); | |
$coupons = $this->getCouponsKeyedByPromotion($order); | |
foreach ($aggregate_adjustments as $type => $adjustments) { | |
foreach ($adjustments as $adjustment) { | |
/** @var Adjustment $adjustment */ | |
if ($type == 'item_adjustments') { | |
/** @var OrderItemInterface $order_item */ | |
$order_item = $adjustment['order_item']; | |
$adjustment = $adjustment['adjustment']; | |
} | |
/** @var Promotion $promotion */ | |
$promotion = $entity_type_manager->getStorage('commerce_promotion') | |
->load($adjustment->getSourceId()); | |
if (!$promotion) { | |
continue; | |
} | |
$time = $order->get('placed')->value; | |
$values = [ | |
'type' => $this->getPluginId(), | |
'pa_order_id' => $order->id(), | |
'created' => $order->getPlacedTime(), | |
'updated' => $order->getPlacedTime(), | |
'pa_promotion_id' => $adjustment->getSourceId(), | |
'pa_coupon' => '', | |
'pa_coupon_code' => '', | |
'pa_bulk' => 'N/A', | |
'pa_order_item' => isset($order_item) ? $order_item->id() : NULL, | |
'pa_offer_target' => $promotion->getOffer()->getPluginId(), | |
'pa_offer_type' => '', | |
'pa_offer_amount' => '', | |
'pa_offer_adjustment' => $adjustment->getAmount(), | |
'pa_order_subtotal' => $order->getSubtotalPrice(), | |
'pa_order_total' => $order->getTotalPrice(), | |
]; | |
/** Coupon stuff */ | |
if (array_key_exists($adjustment->getSourceId(), $coupons)) { | |
$values['pa_coupon'] = $coupons[$adjustment->getSourceId()]->id(); | |
$values['pa_coupon_code'] = $coupons[$adjustment->getSourceId()]->getCode(); | |
if ($coupons[$adjustment->getSourceId()]->bulk->value == 0) { | |
$values['pa_bulk'] = 'No'; | |
} | |
else { | |
$values['pa_bulk'] = 'Yes'; | |
} | |
} | |
/** Offer stuff */ | |
if (!empty($promotion->getOffer()->getConfiguration())) { | |
$config = $promotion->getOffer()->getConfiguration(); | |
$keys = array_keys($config); | |
$type_key = reset($keys); | |
$values['pa_offer_type'] = $type_key; | |
switch ($type_key) { | |
case 'percentage': | |
$values['pa_offer_amount'] = round((float)$config['percentage'] * 100 ) . '%'; | |
break; | |
case 'amount': | |
$values['pa_offer_amount'] = '$' . $config['amount']['number']; | |
break; | |
default: | |
$values['pa_offer_amount'] = 'error'; | |
} | |
} | |
$order_report = $orderReportStorage->create($values); | |
$order_report->save(); | |
} | |
} | |
} | |
/** | |
* Get all promotion adjustments for an order item. | |
* | |
* @param OrderInterface $order | |
* @return Adjustment[] | |
*/ | |
protected function getOrderItemAdjustments(OrderInterface $order) { | |
$adjustments = []; | |
/** @var OrderItemInterface $orderItem */ | |
foreach ($order->getItems() as $orderItem) { | |
/** @var Adjustment $adjustment */ | |
foreach ($orderItem->getAdjustments() as $adjustment) { | |
if ($adjustment->getType() == 'promotion') { | |
$adjustments[] = [ | |
'adjustment' => $adjustment, | |
'order_item' => $orderItem | |
]; | |
} | |
} | |
} | |
return $adjustments; | |
} | |
/** | |
* Get all promotion adjustments for an order. | |
* | |
* @param OrderInterface $order | |
* @return Adjustment[] | |
*/ | |
protected function getOrderAdjustments(OrderInterface $order) { | |
$adjustments = []; | |
/** @var Adjustment $adjustment */ | |
foreach ($order->getAdjustments() as $adjustment) { | |
if ($adjustment->getType() == 'promotion') { | |
$adjustments[] = $adjustment; | |
} | |
} | |
return $adjustments; | |
} | |
/** | |
* Get coupons keyed by promotion id. | |
* @param \Drupal\commerce_order\Entity\OrderInterface $order | |
* | |
* @return CouponInterface[] | |
*/ | |
protected function getCouponsKeyedByPromotion(OrderInterface $order) { | |
$coupons = $order->coupons->referencedEntities(); | |
if (empty($coupons)) return []; | |
$keyed_coupons = []; | |
/** @var CouponInterface $coupon */ | |
foreach ($coupons as $coupon) { | |
$keyed_coupons[$coupon->getPromotionId()] = $coupon; | |
} | |
return $keyed_coupons; | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function buildFieldDefinitions() { | |
$fields = []; | |
$fields['pa_order_id'] = BundleFieldDefinition::create('entity_reference') | |
->setLabel(t('Order')) | |
->setDescription(t('The parent order.')) | |
->setSetting('target_type', 'commerce_order') | |
->setReadOnly(TRUE); | |
$fields['pa_promotion_id'] = BundleFieldDefinition::create('entity_reference') | |
->setLabel(t('Promotion')) | |
->setSetting('target_type', 'commerce_promotion') | |
->setCardinality(1) | |
->setRequired(TRUE) | |
->setDisplayConfigurable('view', TRUE); | |
$fields['pa_coupon'] = BundleFieldDefinition::create('entity_reference') | |
->setLabel(t('Coupon')) | |
->setSetting('target_type', 'commerce_promotion_coupon') | |
->setCardinality(1) | |
->setRequired(FALSE) | |
->setDisplayConfigurable('view', TRUE); | |
$fields['pa_coupon_code'] = BundleFieldDefinition::create('string') | |
->setLabel(t('Coupon Code')) | |
->setDescription(t('The coupon code used')) | |
->setRequired(FALSE); | |
$fields['pa_bulk'] = BundleFieldDefinition::create('string') | |
->setLabel(t('Bulk Coupon')); | |
$fields['pa_order_item'] = BundleFieldDefinition::create('entity_reference') | |
->setLabel(t('Order item')) | |
->setSetting('target_type', 'commerce_order_item') | |
->setCardinality(1) | |
->setRequired(FALSE) | |
->setDisplayConfigurable('view', TRUE); | |
$fields['pa_offer_target'] = BundleFieldDefinition::create('string') | |
->setLabel(t('Offer target')) | |
->setDescription(t('The target plugin for this offer')) | |
->setRequired(TRUE); | |
$fields['pa_offer_type'] = BundleFieldDefinition::create('string') | |
->setLabel(t('Offer type')) | |
->setDescription(t('The offer type, i.e. percentage or amount')) | |
->setRequired(TRUE); | |
$fields['pa_offer_amount'] = BundleFieldDefinition::create('string') | |
->setLabel(t('Offer Amount')) | |
->setDescription(t('The last few digits of the credit card number')) | |
->setRequired(TRUE); | |
$fields['pa_offer_adjustment'] = BundleFieldDefinition::create('commerce_price') | |
->setLabel(t('Adjustment amount')) | |
->setCardinality(1) | |
->setRequired(TRUE) | |
->setDisplayConfigurable('view', TRUE); | |
$fields['pa_order_subtotal'] = BundleFieldDefinition::create('commerce_price') | |
->setLabel(t('Order sub total')) | |
->setCardinality(1) | |
->setRequired(TRUE) | |
->setDisplayConfigurable('view', TRUE); | |
$fields['pa_order_total'] = BundleFieldDefinition::create('commerce_price') | |
->setLabel(t('Aggregate order amount')) | |
->setCardinality(1) | |
->setRequired(TRUE) | |
->setDisplayConfigurable('view', TRUE); | |
return $fields; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment