arch-8.x-1.x-dev/modules/order/src/Plugin/Field/FieldType/OrderLineItemFieldItem.php
modules/order/src/Plugin/Field/FieldType/OrderLineItemFieldItem.php
<?php
namespace Drupal\arch_order\Plugin\Field\FieldType;
use Drupal\Core\Field\FieldItemBase;
use Drupal\Core\Field\FieldStorageDefinitionInterface;
use Drupal\Core\TypedData\DataDefinition;
/**
* Plugin implementation of the 'order_line_item' field type.
*
* @FieldType (
* id = "order_line_item",
* label = @Translation("Line item", context = "arch_order"),
* default_widget = "order_line_item_widget",
* default_formatter = "order_line_item_formatter",
* cardinality = \Drupal\Core\Field\FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED
* )
*/
class OrderLineItemFieldItem extends FieldItemBase implements OrderLineItemInterface {
/**
* Entity type manager.
*
* @var \Drupal\Core\Entity\EntityTypeManagerInterface
*/
protected $entityTypeManager;
/**
* {@inheritdoc}
*/
public static function schema(FieldStorageDefinitionInterface $field_definition) {
return [
'columns' => [
'created' => [
'description' => 'Created date',
'type' => 'int',
'length' => 20,
],
'type' => [
'type' => 'int',
'length' => 2,
],
'quantity' => [
'type' => 'numeric',
'precision' => 14,
'scale' => 2,
],
'product_id' => [
'type' => 'int',
'length' => 10,
],
'product_bundle' => [
'type' => 'varchar',
'length' => 32,
],
'price_net' => [
'type' => 'numeric',
'precision' => 14,
'scale' => 3,
],
'price_gross' => [
'type' => 'numeric',
'precision' => 14,
'scale' => 3,
],
'price_vat_rate' => [
'type' => 'numeric',
'precision' => 8,
'scale' => 4,
],
'price_vat_cat_name' => [
'type' => 'varchar_ascii',
'length' => 255,
],
'price_vat_amount' => [
'type' => 'numeric',
'precision' => 14,
'scale' => 3,
],
'calculated_net' => [
'type' => 'numeric',
'precision' => 14,
'scale' => 3,
],
'calculated_gross' => [
'type' => 'numeric',
'precision' => 14,
'scale' => 3,
],
'calculated_vat_rate' => [
'type' => 'numeric',
'precision' => 8,
'scale' => 4,
],
'calculated_vat_cat_name' => [
'type' => 'varchar_ascii',
'length' => 255,
],
'calculated_vat_amount' => [
'type' => 'numeric',
'precision' => 14,
'scale' => 3,
],
'reason_of_diff' => [
'type' => 'varchar_ascii',
'length' => 255,
],
'data' => [
'type' => 'blob',
'size' => 'big',
'serialize' => TRUE,
],
],
'indexed' => [
'product' => ['product_id'],
'type' => ['type'],
],
];
}
/**
* {@inheritdoc}
*/
public static function propertyDefinitions(FieldStorageDefinitionInterface $field_definition) {
$properties['created'] = DataDefinition::create('integer')
->setLabel(t('Created on', [], ['context' => 'arch_line_item']));
$properties['type'] = DataDefinition::create('integer')
->setLabel(t('Type', [], ['context' => 'arch_line_item']))
->setRequired(TRUE);
$properties['quantity'] = DataDefinition::create('float')
->setLabel(t('Quantity', [], ['context' => 'arch_line_item']))
->setSetting('precision', 2)
->setSetting('size', 14);
$properties['product_id'] = DataDefinition::create('integer')
->setLabel(t('Product ID', [], ['context' => 'arch_line_item']))
->setRequired(TRUE);
$properties['product_bundle'] = DataDefinition::create('string')
->setLabel(t('Product type', [], ['context' => 'arch_product']))
->setRequired(TRUE);
$properties['price_net'] = DataDefinition::create('float')
->setLabel(t('Net price', [], ['context' => 'arch_price']))
->setSetting('precision', 3)
->setSetting('size', 14)
->setRequired(TRUE);
$properties['price_gross'] = DataDefinition::create('float')
->setLabel(t('Gross price', [], ['context' => 'arch_price']))
->setSetting('precision', 3)
->setSetting('size', 14)
->setRequired(TRUE);
$properties['price_vat_rate'] = DataDefinition::create('float')
->setLabel(t('VAT rate', [], ['context' => 'arch_price']))
->setSetting('precision', 4)
->setSetting('size', 8)
->setRequired(TRUE);
$properties['price_vat_cat_name'] = DataDefinition::create('string')
->setLabel(t('VAT category', [], ['context' => 'arch_line_item']))
->addConstraint('Length', ['max' => 32]);
$properties['price_vat_amount'] = DataDefinition::create('float')
->setLabel(t('VAT amount', [], ['context' => 'arch_price']))
->setSetting('precision', 3)
->setSetting('size', 14)
->setRequired(TRUE);
$properties['calculated_net'] = DataDefinition::create('float')
->setLabel(t('Calculated net price', [], ['context' => 'arch_line_item']))
->setSetting('precision', 3)
->setSetting('size', 14)
->setRequired(TRUE);
$properties['calculated_gross'] = DataDefinition::create('float')
->setLabel(t('Calculated gross price', [], ['context' => 'arch_line_item']))
->setSetting('precision', 3)
->setSetting('size', 14)
->setRequired(TRUE);
$properties['calculated_vat_rate'] = DataDefinition::create('float')
->setLabel(t('Calculated VAT rate', [], ['context' => 'arch_line_item']))
->setSetting('precision', 4)
->setSetting('size', 8)
->setRequired(TRUE);
$properties['calculated_vat_cat_name'] = DataDefinition::create('string')
->setLabel(t('Calculated VAT category', [], ['context' => 'arch_line_item']))
->addConstraint('Length', ['max' => 32]);
$properties['calculated_vat_amount'] = DataDefinition::create('float')
->setLabel(t('Calculated VAT amount', [], ['context' => 'arch_line_item']))
->setSetting('precision', 3)
->setSetting('size', 14)
->setRequired(TRUE);
$properties['reason_of_diff'] = DataDefinition::create('string')
->setLabel(t('Reason of diff', [], ['context' => 'arch_line_item']));
$properties['data'] = DataDefinition::create('any')
->setLabel(t('Serialized array of options for the line item.', [], ['context' => 'arch_line_item']));
return $properties;
}
/**
* {@inheritdoc}
*/
public function isEmpty() {
foreach ($this->definition->getPropertyDefinitions() as $name => $definition) {
if ($this->get($name)->getValue()) {
return FALSE;
}
}
return TRUE;
}
/**
* {@inheritdoc}
*/
public function getLineItemTypeId() {
return (int) $this->get('type')->getValue();
}
/**
* {@inheritdoc}
*/
public function isProduct() {
return $this->getLineItemTypeId() === self::ORDER_LINE_ITEM_TYPE_PRODUCT;
}
/**
* {@inheritdoc}
*/
public function isDiscount() {
return $this->getLineItemTypeId() === self::ORDER_LINE_ITEM_TYPE_DISCOUNT;
}
/**
* {@inheritdoc}
*/
public function isShipping() {
return $this->getLineItemTypeId() === self::ORDER_LINE_ITEM_TYPE_SHIPPING;
}
/**
* {@inheritdoc}
*/
public function isShippingExtra() {
return $this->getLineItemTypeId() === self::ORDER_LINE_ITEM_TYPE_SHIPPING_EXTRA;
}
/**
* {@inheritdoc}
*/
public function isPaymentFee() {
return $this->getLineItemTypeId() === self::ORDER_LINE_ITEM_TYPE_PAYMENT_FEE;
}
/**
* {@inheritdoc}
*/
public function getProduct() {
$pid = (int) $this->get('product_id')->getValue();
/** @var \Drupal\arch_product\Entity\Storage\ProductStorageInterface $product_storage */
$product_storage = $this->getEntityTypeManager()->getStorage('product');
return $product_storage->load($pid);
}
/**
* {@inheritdoc}
*/
public function getQuantity() {
/** @var \Drupal\Core\TypedData\Plugin\DataType\FloatData $property */
$property = $this->get('quantity');
if (empty($property->getValue())) {
return NULL;
}
return (float) $property->getValue();
}
/**
* {@inheritdoc}
*/
public function setQuantity($quantity) {
$this->set('qantity', $quantity);
return $this;
}
/**
* Get entity type manager.
*
* @return \Drupal\Core\Entity\EntityTypeManagerInterface
* Entity type manager.
*/
protected function getEntityTypeManager() {
if (!isset($this->entityTypeManager)) {
// @codingStandardsIgnoreStart
$this->entityTypeManager = \Drupal::entityTypeManager();
// @codingStandardsIgnoreEnd
}
return $this->entityTypeManager;
}
}
