123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\Customer\Model\ResourceModel;
- use Magento\Customer\Api\Data\GroupInterface;
- use Magento\Customer\Model\ResourceModel\Group\Collection;
- use Magento\Framework\Api\Search\FilterGroup;
- use Magento\Framework\Api\SearchCriteriaInterface;
- use Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface;
- use Magento\Framework\Exception\InputException;
- use Magento\Framework\Exception\State\InvalidTransitionException;
- use Magento\Tax\Api\Data\TaxClassInterface;
- use Magento\Tax\Api\TaxClassManagementInterface;
- use Magento\Framework\Api\ExtensibleDataInterface;
- use Magento\Customer\Api\Data\GroupExtensionInterface;
- /**
- * Customer group CRUD class
- *
- * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
- */
- class GroupRepository implements \Magento\Customer\Api\GroupRepositoryInterface
- {
- /**
- * The default tax class id if no tax class id is specified
- */
- const DEFAULT_TAX_CLASS_ID = 3;
- /**
- * @var \Magento\Customer\Model\GroupRegistry
- */
- protected $groupRegistry;
- /**
- * @var \Magento\Customer\Model\GroupFactory
- */
- protected $groupFactory;
- /**
- * @var \Magento\Customer\Api\Data\GroupInterfaceFactory
- */
- protected $groupDataFactory;
- /**
- * @var \Magento\Customer\Model\ResourceModel\Group
- */
- protected $groupResourceModel;
- /**
- * @var \Magento\Framework\Reflection\DataObjectProcessor
- */
- protected $dataObjectProcessor;
- /**
- * @var \Magento\Customer\Api\Data\GroupSearchResultsInterfaceFactory
- */
- protected $searchResultsFactory;
- /**
- * @var \Magento\Tax\Api\TaxClassRepositoryInterface
- */
- private $taxClassRepository;
- /**
- * @var \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface
- */
- protected $extensionAttributesJoinProcessor;
- /**
- * @var CollectionProcessorInterface
- */
- private $collectionProcessor;
- /**
- * @param \Magento\Customer\Model\GroupRegistry $groupRegistry
- * @param \Magento\Customer\Model\GroupFactory $groupFactory
- * @param \Magento\Customer\Api\Data\GroupInterfaceFactory $groupDataFactory
- * @param \Magento\Customer\Model\ResourceModel\Group $groupResourceModel
- * @param \Magento\Framework\Reflection\DataObjectProcessor $dataObjectProcessor
- * @param \Magento\Customer\Api\Data\GroupSearchResultsInterfaceFactory $searchResultsFactory
- * @param \Magento\Tax\Api\TaxClassRepositoryInterface $taxClassRepositoryInterface
- * @param \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $extensionAttributesJoinProcessor
- * @param CollectionProcessorInterface $collectionProcessor
- */
- public function __construct(
- \Magento\Customer\Model\GroupRegistry $groupRegistry,
- \Magento\Customer\Model\GroupFactory $groupFactory,
- \Magento\Customer\Api\Data\GroupInterfaceFactory $groupDataFactory,
- \Magento\Customer\Model\ResourceModel\Group $groupResourceModel,
- \Magento\Framework\Reflection\DataObjectProcessor $dataObjectProcessor,
- \Magento\Customer\Api\Data\GroupSearchResultsInterfaceFactory $searchResultsFactory,
- \Magento\Tax\Api\TaxClassRepositoryInterface $taxClassRepositoryInterface,
- \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $extensionAttributesJoinProcessor,
- CollectionProcessorInterface $collectionProcessor = null
- ) {
- $this->groupRegistry = $groupRegistry;
- $this->groupFactory = $groupFactory;
- $this->groupDataFactory = $groupDataFactory;
- $this->groupResourceModel = $groupResourceModel;
- $this->dataObjectProcessor = $dataObjectProcessor;
- $this->searchResultsFactory = $searchResultsFactory;
- $this->taxClassRepository = $taxClassRepositoryInterface;
- $this->extensionAttributesJoinProcessor = $extensionAttributesJoinProcessor;
- $this->collectionProcessor = $collectionProcessor ?: $this->getCollectionProcessor();
- }
- /**
- * {@inheritdoc}
- */
- public function save(\Magento\Customer\Api\Data\GroupInterface $group)
- {
- $this->_validate($group);
- /** @var \Magento\Customer\Model\Group $groupModel */
- $groupModel = null;
- if ($group->getId() || (string)$group->getId() === '0') {
- $this->_verifyTaxClassModel($group->getTaxClassId(), $group);
- $groupModel = $this->groupRegistry->retrieve($group->getId());
- $groupDataAttributes = $this->dataObjectProcessor->buildOutputDataArray(
- $group,
- \Magento\Customer\Api\Data\GroupInterface::class
- );
- foreach ($groupDataAttributes as $attributeCode => $attributeData) {
- $groupModel->setDataUsingMethod($attributeCode, $attributeData);
- }
- } else {
- $groupModel = $this->groupFactory->create();
- $groupModel->setCode($group->getCode());
- $taxClassId = $group->getTaxClassId() ?: self::DEFAULT_TAX_CLASS_ID;
- $this->_verifyTaxClassModel($taxClassId, $group);
- $groupModel->setTaxClassId($taxClassId);
- }
- try {
- $this->groupResourceModel->save($groupModel);
- } catch (\Magento\Framework\Exception\LocalizedException $e) {
- /**
- * Would like a better way to determine this error condition but
- * difficult to do without imposing more database calls
- */
- if ($e->getMessage() == (string)__('Customer Group already exists.')) {
- throw new InvalidTransitionException(__('Customer Group already exists.'));
- }
- throw $e;
- }
- $this->groupRegistry->remove($groupModel->getId());
- $groupDataObject = $this->groupDataFactory->create()
- ->setId($groupModel->getId())
- ->setCode($groupModel->getCode())
- ->setTaxClassId($groupModel->getTaxClassId())
- ->setTaxClassName($groupModel->getTaxClassName());
- if ($group->getExtensionAttributes()) {
- $groupDataObject->setExtensionAttributes($group->getExtensionAttributes());
- }
- return $groupDataObject;
- }
- /**
- * {@inheritdoc}
- */
- public function getById($id)
- {
- $groupModel = $this->groupRegistry->retrieve($id);
- $groupDataObject = $this->groupDataFactory->create()
- ->setId($groupModel->getId())
- ->setCode($groupModel->getCode())
- ->setTaxClassId($groupModel->getTaxClassId())
- ->setTaxClassName($groupModel->getTaxClassName());
- return $groupDataObject;
- }
- /**
- * {@inheritdoc}
- */
- public function getList(SearchCriteriaInterface $searchCriteria)
- {
- $searchResults = $this->searchResultsFactory->create();
- $searchResults->setSearchCriteria($searchCriteria);
- /** @var \Magento\Customer\Model\ResourceModel\Group\Collection $collection */
- $collection = $this->groupFactory->create()->getCollection();
- $groupInterfaceName = \Magento\Customer\Api\Data\GroupInterface::class;
- $this->extensionAttributesJoinProcessor->process($collection, $groupInterfaceName);
- $collection->addTaxClass();
- $this->collectionProcessor->process($searchCriteria, $collection);
- /** @var \Magento\Customer\Api\Data\GroupInterface[] $groups */
- $groups = [];
- /** @var \Magento\Customer\Model\Group $group */
- foreach ($collection as $group) {
- /** @var \Magento\Customer\Api\Data\GroupInterface $groupDataObject */
- $groupDataObject = $this->groupDataFactory->create()
- ->setId($group->getId())
- ->setCode($group->getCode())
- ->setTaxClassId($group->getTaxClassId())
- ->setTaxClassName($group->getTaxClassName());
- $data = $group->getData();
- $data = $this->extensionAttributesJoinProcessor->extractExtensionAttributes($groupInterfaceName, $data);
- if (isset($data[ExtensibleDataInterface::EXTENSION_ATTRIBUTES_KEY])
- && ($data[ExtensibleDataInterface::EXTENSION_ATTRIBUTES_KEY] instanceof GroupExtensionInterface)
- ) {
- $groupDataObject->setExtensionAttributes($data[ExtensibleDataInterface::EXTENSION_ATTRIBUTES_KEY]);
- }
- $groups[] = $groupDataObject;
- }
- $searchResults->setTotalCount($collection->getSize());
- return $searchResults->setItems($groups);
- }
- /**
- * Helper function that adds a FilterGroup to the collection.
- *
- * @deprecated 101.0.0
- * @param FilterGroup $filterGroup
- * @param Collection $collection
- * @return void
- * @throws \Magento\Framework\Exception\InputException
- */
- protected function addFilterGroupToCollection(FilterGroup $filterGroup, Collection $collection)
- {
- $fields = [];
- $conditions = [];
- foreach ($filterGroup->getFilters() as $filter) {
- $condition = $filter->getConditionType() ? $filter->getConditionType() : 'eq';
- $fields[] = $this->translateField($filter->getField());
- $conditions[] = [$condition => $filter->getValue()];
- }
- if ($fields) {
- $collection->addFieldToFilter($fields, $conditions);
- }
- }
- /**
- * Translates a field name to a DB column name for use in collection queries.
- *
- * @deprecated 101.0.0
- * @param string $field a field name that should be translated to a DB column name.
- * @return string
- */
- protected function translateField($field)
- {
- switch ($field) {
- case GroupInterface::CODE:
- return 'customer_group_code';
- case GroupInterface::ID:
- return 'customer_group_id';
- case GroupInterface::TAX_CLASS_NAME:
- return 'class_name';
- default:
- return $field;
- }
- }
- /**
- * Delete customer group.
- *
- * @param GroupInterface $group
- * @return bool true on success
- * @throws \Magento\Framework\Exception\StateException If customer group cannot be deleted
- * @throws \Magento\Framework\Exception\LocalizedException
- */
- public function delete(GroupInterface $group)
- {
- return $this->deleteById($group->getId());
- }
- /**
- * Delete customer group by ID.
- *
- * @param int $id
- * @return bool true on success
- * @throws \Magento\Framework\Exception\NoSuchEntityException
- * @throws \Magento\Framework\Exception\StateException If customer group cannot be deleted
- * @throws \Magento\Framework\Exception\LocalizedException
- */
- public function deleteById($id)
- {
- $groupModel = $this->groupRegistry->retrieve($id);
- if ($id <= 0 || $groupModel->usesAsDefault()) {
- throw new \Magento\Framework\Exception\StateException(__('Cannot delete group.'));
- }
- $groupModel->delete();
- $this->groupRegistry->remove($id);
- return true;
- }
- /**
- * Validate group values.
- *
- * @param \Magento\Customer\Api\Data\GroupInterface $group
- * @throws InputException
- * @return void
- *
- * @SuppressWarnings(PHPMD.NPathComplexity)
- * @SuppressWarnings(PHPMD.CyclomaticComplexity)
- */
- private function _validate($group)
- {
- $exception = new InputException();
- if (!\Zend_Validate::is($group->getCode(), 'NotEmpty')) {
- $exception->addError(__('"%fieldName" is required. Enter and try again.', ['fieldName' => 'code']));
- }
- if ($exception->wasErrorAdded()) {
- throw $exception;
- }
- }
- /**
- * Verifies that the tax class model exists and is a customer tax class type.
- *
- * @param int $taxClassId The id of the tax class model to check
- * @param \Magento\Customer\Api\Data\GroupInterface $group The original group parameters
- * @return void
- * @throws InputException Thrown if the tax class model is invalid
- */
- protected function _verifyTaxClassModel($taxClassId, $group)
- {
- try {
- /* @var TaxClassInterface $taxClassData */
- $taxClassData = $this->taxClassRepository->get($taxClassId);
- } catch (\Magento\Framework\Exception\NoSuchEntityException $e) {
- throw InputException::invalidFieldValue('taxClassId', $group->getTaxClassId());
- }
- if ($taxClassData->getClassType() !== TaxClassManagementInterface::TYPE_CUSTOMER) {
- throw InputException::invalidFieldValue('taxClassId', $group->getTaxClassId());
- }
- }
- /**
- * Retrieve collection processor
- *
- * @deprecated 101.0.0
- * @return CollectionProcessorInterface
- */
- private function getCollectionProcessor()
- {
- if (!$this->collectionProcessor) {
- $this->collectionProcessor = \Magento\Framework\App\ObjectManager::getInstance()->get(
- 'Magento\Customer\Model\Api\SearchCriteria\GroupCollectionProcessor'
- );
- }
- return $this->collectionProcessor;
- }
- }
|