Skip to content

Instantly share code, notes, and snippets.

@clrockwell
Created December 6, 2017 21:50
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save clrockwell/61eabb16bd4e02f5ffd69a4c6d2f5e03 to your computer and use it in GitHub Desktop.
Save clrockwell/61eabb16bd4e02f5ffd69a4c6d2f5e03 to your computer and use it in GitHub Desktop.
commerce_order_report plugin
<?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