arch-8.x-1.x-dev/modules/payment/src/PaymentMethodBase.php
modules/payment/src/PaymentMethodBase.php
<?php
namespace Drupal\arch_payment;
use Drupal\arch_order\Entity\OrderInterface;
use Drupal\arch_price\Price\PriceFactoryInterface;
use Drupal\Core\Access\AccessResult;
use Drupal\Core\Extension\ModuleHandlerInterface;
use Drupal\Core\KeyValueStore\KeyValueFactoryInterface;
use Drupal\Core\Plugin\PluginBase;
use Drupal\Core\Plugin\PluginFormFactoryInterface;
use Drupal\Core\Session\AccountInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
/**
* Payment method base.
*
* @package Drupal\arch_payment
*/
abstract class PaymentMethodBase extends PluginBase implements PaymentMethodInterface {
/**
* Payment method settings.
*
* @var \Drupal\Core\KeyValueStore\KeyValueStoreInterface
*/
protected $settings;
/**
* Module handler.
*
* @var \Drupal\Core\Extension\ModuleHandlerInterface
*/
protected $moduleHandler;
/**
* Plugin form factory.
*
* @var \Drupal\Core\Plugin\PluginFormFactoryInterface
*/
protected $pluginFormFactory;
/**
* Current user.
*
* @var \Drupal\Core\Session\AccountInterface
*/
protected $currentUser;
/**
* Price factory.
*
* @var \Drupal\arch_price\Price\PriceFactoryInterface
*/
protected $priceFactory;
/**
* Constructs a \Drupal\Component\Plugin\PluginBase object.
*
* @param array $configuration
* A configuration array containing information about the plugin instance.
* @param string $plugin_id
* The plugin_id for the plugin instance.
* @param mixed $plugin_definition
* The plugin implementation definition.
* @param \Drupal\Core\KeyValueStore\KeyValueFactoryInterface $key_value_factory
* Key value factory.
* @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
* Module handler.
* @param \Drupal\Core\Plugin\PluginFormFactoryInterface $plugin_form_factory
* Plugin form factory.
* @param \Drupal\Core\Session\AccountInterface $current_user
* Current user.
* @param \Drupal\arch_price\Price\PriceFactoryInterface $priceFactory
* Price factory.
*/
public function __construct(
array $configuration,
$plugin_id,
$plugin_definition,
KeyValueFactoryInterface $key_value_factory,
ModuleHandlerInterface $module_handler,
PluginFormFactoryInterface $plugin_form_factory,
AccountInterface $current_user,
PriceFactoryInterface $priceFactory,
) {
parent::__construct(
$configuration,
$plugin_id,
$plugin_definition
);
$this->settings = $key_value_factory->get('arch_payment.' . $this->getPluginId());
$this->moduleHandler = $module_handler;
$this->pluginFormFactory = $plugin_form_factory;
$this->currentUser = $current_user;
$this->priceFactory = $priceFactory;
}
/**
* {@inheritdoc}
*/
public static function create(
ContainerInterface $container,
array $configuration,
$plugin_id,
$plugin_definition,
) {
return new static(
$configuration,
$plugin_id,
$plugin_definition,
$container->get('keyvalue'),
$container->get('module_handler'),
$container->get('plugin_form.factory'),
$container->get('current_user'),
$container->get('price_factory')
);
}
/**
* {@inheritdoc}
*/
public function getAdminLabel() {
$definition = $this->getPluginDefinition();
if (!empty($definition['administrative_label'])) {
return (string) $definition['administrative_label'];
}
return $this->getLabel();
}
/**
* {@inheritdoc}
*/
public function getLabel() {
$definition = $this->getPluginDefinition();
return (string) $definition['label'];
}
/**
* {@inheritdoc}
*/
public function isActive() {
return $this->settings->get('status', TRUE);
}
/**
* {@inheritdoc}
*/
public function enable() {
$this->settings->set('status', TRUE);
return $this;
}
/**
* {@inheritdoc}
*/
public function disable() {
$this->settings->set('status', FALSE);
return $this;
}
/**
* {@inheritdoc}
*/
public function getWeight() {
return (int) $this->settings->get('weight', 0);
}
/**
* {@inheritdoc}
*/
public function setWeight($weight) {
$this->settings->set('weight', (int) $weight);
return $this;
}
/**
* {@inheritdoc}
*/
public function getDescription() {
return NULL;
}
/**
* {@inheritdoc}
*/
public function getImage() {
return NULL;
}
/**
* {@inheritdoc}
*/
public function hasDescription() {
$description = (string) $this->getDescription();
return !empty($description);
}
/**
* {@inheritdoc}
*/
public function hasImage() {
$image = $this->getImage();
if (empty($image)) {
return FALSE;
}
// @todo check this.
return $image->isValid();
}
/**
* {@inheritdoc}
*/
public function isAvailable(OrderInterface $order) {
if (!$this->isActive()) {
return FALSE;
}
// @todo Check this.
$result = AccessResult::neutral();
/** @var \Drupal\Core\Access\AccessResultInterface $result */
$access = $this->moduleHandler->invokeAll('payment_method_access', [
$this,
$order,
$this->currentUser,
]);
foreach ($access as $other) {
$result = $result->orIf($other);
}
return !$result->isForbidden();
}
/**
* {@inheritdoc}
*/
public function getCallbackRoute() {
$definition = $this->getPluginDefinition();
return $definition['callback_route'];
}
/**
* {@inheritdoc}
*/
public function getSettings() {
return $this->settings->getAll();
}
/**
* {@inheritdoc}
*/
public function getSetting($key, $default = NULL) {
return $this->settings->get($key, $default);
}
/**
* {@inheritdoc}
*/
public function setSetting($key, $value) {
$this->settings->set($key, $value);
return $this;
}
/**
* {@inheritdoc}
*/
public function getPaymentFee(OrderInterface $order) {
$price_default = [
'currency' => $order->get('currency')->getString(),
'base' => 'gross',
'net' => 0,
'gross' => 0,
'vat_category' => 'custom',
'vat_rate' => 0,
'vat_value' => 0,
];
$fees = $this->settings->get('fees');
if (
!empty($fees)
&& isset($fees['default'])
&& (
isset($fees['default'])
&& !empty($fees['default']['fee'])
)
) {
$default = $fees['default'];
$price_default = [
'base' => 'gross',
'price_type' => 'default',
'currency' => $default['currency'],
'net' => 0,
'gross' => (float) $default['fee'],
'vat_category' => 'custom',
'vat_rate' => ((float) $default['vat_rate'] / 100),
'vat_value' => 0,
'date_from' => NULL,
'date_to' => NULL,
];
}
$price = $this->priceFactory->getInstance($price_default);
$context = [
'settings' => $this->getSettings(),
'plugin_id' => $this->getPluginId(),
];
$this->moduleHandler->alter('payment_method_fee', $order, $price, $context);
return $price;
}
}
