123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\Sales\Setup;
- use Magento\Eav\Model\Entity\Setup\Context;
- use Magento\Eav\Model\ResourceModel\Entity\Attribute\Group\CollectionFactory;
- use Magento\Eav\Setup\EavSetup;
- use Magento\Framework\App\CacheInterface;
- use Magento\Framework\App\Config\ScopeConfigInterface;
- use Magento\Framework\App\ResourceConnection;
- use Magento\Framework\Encryption\EncryptorInterface;
- use Magento\Framework\Setup\ModuleDataSetupInterface;
- /**
- * Sales module setup class
- *
- * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
- * @codeCoverageIgnore
- */
- class SalesSetup extends EavSetup
- {
- /**
- * This should be set explicitly
- */
- const ORDER_ENTITY_TYPE_ID = 5;
- /**
- * This should be set explicitly
- */
- const INVOICE_PRODUCT_ENTITY_TYPE_ID = 6;
- /**
- * This should be set explicitly
- */
- const CREDITMEMO_PRODUCT_ENTITY_TYPE_ID = 7;
- /**
- * This should be set explicitly
- */
- const SHIPMENT_PRODUCT_ENTITY_TYPE_ID = 8;
- /**
- * @var ScopeConfigInterface
- */
- protected $config;
- /**
- * @var EncryptorInterface
- */
- protected $encryptor;
- /**
- * @var string
- */
- private static $connectionName = 'sales';
- /**
- * Constructor
- *
- * @param ModuleDataSetupInterface $setup
- * @param Context $context
- * @param CacheInterface $cache
- * @param CollectionFactory $attrGroupCollectionFactory
- * @param ScopeConfigInterface $config
- */
- public function __construct(
- ModuleDataSetupInterface $setup,
- Context $context,
- CacheInterface $cache,
- CollectionFactory $attrGroupCollectionFactory,
- ScopeConfigInterface $config
- ) {
- $this->config = $config;
- $this->encryptor = $context->getEncryptor();
- parent::__construct($setup, $context, $cache, $attrGroupCollectionFactory);
- }
- /**
- * List of entities converted from EAV to flat data structure
- *
- * @var $_flatEntityTables array
- */
- protected $_flatEntityTables = [
- 'order' => 'sales_order',
- 'order_payment' => 'sales_order_payment',
- 'order_item' => 'sales_order_item',
- 'order_address' => 'sales_order_address',
- 'order_status_history' => 'sales_order_status_history',
- 'invoice' => 'sales_invoice',
- 'invoice_item' => 'sales_invoice_item',
- 'invoice_comment' => 'sales_invoice_comment',
- 'creditmemo' => 'sales_creditmemo',
- 'creditmemo_item' => 'sales_creditmemo_item',
- 'creditmemo_comment' => 'sales_creditmemo_comment',
- 'shipment' => 'sales_shipment',
- 'shipment_item' => 'sales_shipment_item',
- 'shipment_track' => 'sales_shipment_track',
- 'shipment_comment' => 'sales_shipment_comment',
- ];
- /**
- * List of entities used with separate grid table
- *
- * @var string[] $_flatEntitiesGrid
- */
- protected $_flatEntitiesGrid = ['order', 'invoice', 'shipment', 'creditmemo'];
- /**
- * Check if table exist for flat entity
- *
- * @param string $table
- * @return bool
- */
- protected function _flatTableExist($table)
- {
- $tablesList = $this->getConnection()
- ->listTables();
- return in_array(
- strtoupper($this->getTable($table)),
- array_map('strtoupper', $tablesList)
- );
- }
- /**
- * Add entity attribute. Overwritten for flat entities support
- *
- * @param int|string $entityTypeId
- * @param string $code
- * @param array $attr
- * @return $this
- */
- public function addAttribute($entityTypeId, $code, array $attr)
- {
- if (isset(
- $this->_flatEntityTables[$entityTypeId]
- ) && $this->_flatTableExist(
- $this->_flatEntityTables[$entityTypeId]
- )
- ) {
- $this->_addFlatAttribute($this->_flatEntityTables[$entityTypeId], $code, $attr);
- $this->_addGridAttribute($this->_flatEntityTables[$entityTypeId], $code, $attr, $entityTypeId);
- } else {
- parent::addAttribute($entityTypeId, $code, $attr);
- }
- return $this;
- }
- /**
- * Add attribute as separate column in the table
- *
- * @param string $table
- * @param string $attribute
- * @param array $attr
- * @return $this
- */
- protected function _addFlatAttribute($table, $attribute, $attr)
- {
- $tableInfo = $this->getConnection()
- ->describeTable($this->getTable($table));
- if (isset($tableInfo[$attribute])) {
- return $this;
- }
- $columnDefinition = $this->_getAttributeColumnDefinition($attribute, $attr);
- $this->getConnection()->addColumn(
- $this->getTable($table),
- $attribute,
- $columnDefinition
- );
- return $this;
- }
- /**
- * Add attribute to grid table if necessary
- *
- * @param string $table
- * @param string $attribute
- * @param array $attr
- * @param string $entityTypeId
- * @return $this
- */
- protected function _addGridAttribute($table, $attribute, $attr, $entityTypeId)
- {
- if (in_array($entityTypeId, $this->_flatEntitiesGrid) && !empty($attr['grid'])) {
- $columnDefinition = $this->_getAttributeColumnDefinition($attribute, $attr);
- $this->getConnection()->addColumn(
- $this->getTable($table . '_grid'),
- $attribute,
- $columnDefinition
- );
- }
- return $this;
- }
- /**
- * Retrieve definition of column for create in flat table
- *
- * @param string $code
- * @param array $data
- * @return array
- * @SuppressWarnings(PHPMD.CyclomaticComplexity)
- * @SuppressWarnings(PHPMD.NPathComplexity)
- */
- protected function _getAttributeColumnDefinition($code, $data)
- {
- // Convert attribute type to column info
- $data['type'] = isset($data['type']) ? $data['type'] : 'varchar';
- $type = null;
- $length = null;
- switch ($data['type']) {
- case 'timestamp':
- $type = \Magento\Framework\DB\Ddl\Table::TYPE_TIMESTAMP;
- break;
- case 'datetime':
- $type = \Magento\Framework\DB\Ddl\Table::TYPE_DATETIME;
- break;
- case 'decimal':
- $type = \Magento\Framework\DB\Ddl\Table::TYPE_DECIMAL;
- $length = '12,4';
- break;
- case 'int':
- $type = \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER;
- break;
- case 'text':
- $type = \Magento\Framework\DB\Ddl\Table::TYPE_TEXT;
- $length = 65536;
- break;
- case 'char':
- case 'varchar':
- $type = \Magento\Framework\DB\Ddl\Table::TYPE_TEXT;
- $length = 255;
- break;
- }
- if ($type !== null) {
- $data['type'] = $type;
- $data['length'] = $length;
- }
- $data['nullable'] = isset($data['required']) ? !$data['required'] : true;
- $data['comment'] = isset($data['comment']) ? $data['comment'] : ucwords(str_replace('_', ' ', $code));
- return $data;
- }
- /**
- * @return array
- */
- public function getDefaultEntities()
- {
- $entities = [
- 'order' => [
- 'entity_type_id' => self::ORDER_ENTITY_TYPE_ID,
- 'entity_model' => \Magento\Sales\Model\ResourceModel\Order::class,
- 'table' => 'sales_order',
- 'increment_model' => \Magento\Eav\Model\Entity\Increment\NumericValue::class,
- 'increment_per_store' => true,
- 'attributes' => [],
- ],
- 'invoice' => [
- 'entity_type_id' => self::INVOICE_PRODUCT_ENTITY_TYPE_ID,
- 'entity_model' => \Magento\Sales\Model\ResourceModel\Order\Invoice::class,
- 'table' => 'sales_invoice',
- 'increment_model' => \Magento\Eav\Model\Entity\Increment\NumericValue::class,
- 'increment_per_store' => true,
- 'attributes' => [],
- ],
- 'creditmemo' => [
- 'entity_type_id' => self::CREDITMEMO_PRODUCT_ENTITY_TYPE_ID,
- 'entity_model' => \Magento\Sales\Model\ResourceModel\Order\Creditmemo::class,
- 'table' => 'sales_creditmemo',
- 'increment_model' => \Magento\Eav\Model\Entity\Increment\NumericValue::class,
- 'increment_per_store' => true,
- 'attributes' => [],
- ],
- 'shipment' => [
- 'entity_type_id' => self::SHIPMENT_PRODUCT_ENTITY_TYPE_ID,
- 'entity_model' => \Magento\Sales\Model\ResourceModel\Order\Shipment::class,
- 'table' => 'sales_shipment',
- 'increment_model' => \Magento\Eav\Model\Entity\Increment\NumericValue::class,
- 'increment_per_store' => true,
- 'attributes' => [],
- ],
- ];
- return $entities;
- }
- /**
- * Get config model
- *
- * @return ScopeConfigInterface
- */
- public function getConfigModel()
- {
- return $this->config;
- }
- /**
- * @return EncryptorInterface
- */
- public function getEncryptor()
- {
- return $this->encryptor;
- }
- /**
- * @return \Magento\Framework\DB\Adapter\AdapterInterface
- */
- public function getConnection()
- {
- return $this->getSetup()->getConnection(self::$connectionName);
- }
- /**
- * Get table name
- *
- * @param string $table
- * @return string
- */
- public function getTable($table)
- {
- return $this->getSetup()->getTable($table, self::$connectionName);
- }
- /**
- * Update entity types
- *
- * @return void
- */
- public function updateEntityTypes()
- {
- $this->updateEntityType(
- \Magento\Sales\Model\Order::ENTITY,
- 'entity_model',
- \Magento\Sales\Model\ResourceModel\Order::class
- );
- $this->updateEntityType(
- \Magento\Sales\Model\Order::ENTITY,
- 'increment_model',
- \Magento\Eav\Model\Entity\Increment\NumericValue::class
- );
- $this->updateEntityType(
- 'invoice',
- 'entity_model',
- \Magento\Sales\Model\ResourceModel\Order::class
- );
- $this->updateEntityType(
- 'invoice',
- 'increment_model',
- \Magento\Eav\Model\Entity\Increment\NumericValue::class
- );
- $this->updateEntityType(
- 'creditmemo',
- 'entity_model',
- \Magento\Sales\Model\ResourceModel\Order\Creditmemo::class
- );
- $this->updateEntityType(
- 'creditmemo',
- 'increment_model',
- \Magento\Eav\Model\Entity\Increment\NumericValue::class
- );
- $this->updateEntityType(
- 'shipment',
- 'entity_model',
- \Magento\Sales\Model\ResourceModel\Order\Shipment::class
- );
- $this->updateEntityType(
- 'shipment',
- 'increment_model',
- \Magento\Eav\Model\Entity\Increment\NumericValue::class
- );
- }
- }
|