/**
  * @param Record $recordToHandle
  * @param Record $oppositeRecord
  * @return mixed
  */
 public function handle(Record $recordToHandle, Record $oppositeRecord)
 {
     $this->validate($recordToHandle);
     $sourcePatterns = [];
     $destinationPatters = [];
     foreach ($this->source->getDocumentList() as $document) {
         $destDocumentName = $this->getDestDocumentName($document);
         if ($destDocumentName === false) {
             continue;
         }
         $sourcePatterns[] = sprintf('`%s`', $this->source->addDocumentPrefix($document));
         $destinationPatters[] = sprintf('`%s`', $this->destination->addDocumentPrefix($destDocumentName));
     }
     $newValue = str_replace($sourcePatterns, $destinationPatters, $recordToHandle->getValue($this->field));
     $recordToHandle->setValue($this->field, $newValue);
 }
 /**
  * @throws \Zend_Db_Adapter_Exception
  * @return void
  */
 public function updateEavAttributes()
 {
     /** @var Mysql $adapter */
     $adapter = $this->destination->getAdapter();
     $query = $adapter->getSelect()->from($this->destination->addDocumentPrefix('eav_entity_type'), ['entity_type_id', 'entity_type_code']);
     $entityTypes = $query->getAdapter()->fetchAll($query);
     $entityTypesByCode = [];
     foreach ($entityTypes as $entityType) {
         $entityTypesByCode[$entityType['entity_type_code']] = $entityType['entity_type_id'];
     }
     $where = [];
     $entities = array_keys($this->readerGroups->getGroup('eav_entities'));
     foreach ($entities as $entity) {
         $documents = $this->readerGroups->getGroup($entity);
         $codes = [];
         foreach ($documents as $document => $key) {
             if ($key != 'entity_id') {
                 continue;
             }
             $codes = implode("','", array_keys($this->readerAttributes->getGroup($document)));
         }
         $where += [sprintf("attribute_code IN ('%s')", $codes), sprintf("entity_type_id = '%s'", $entityTypesByCode[$entity])];
     }
     $adapter->getSelect()->getAdapter()->update($this->destination->addDocumentPrefix('eav_attribute'), ['backend_type' => 'static'], $where);
 }
 /**
  * @param string $documentName
  * @param string $idKey
  * @param string $destinationName
  * @return void
  */
 protected function processDeletedRecords($documentName, $idKey, $destinationName)
 {
     $this->destination->getAdapter()->setForeignKeyChecks(1);
     while (!empty($items = $this->source->getDeletedRecords($documentName, $idKey))) {
         $this->destination->deleteRecords($this->destination->addDocumentPrefix($destinationName), $idKey, $items);
         $documentNameDelta = $this->source->getDeltaLogName($documentName);
         $documentNameDelta = $this->source->addDocumentPrefix($documentNameDelta);
         $this->markRecordsProcessed($documentNameDelta, $idKey, $items);
     }
     $this->destination->getAdapter()->setForeignKeyChecks(0);
 }
 /**
  * @param array $columns
  * @param \Zend_Db_Expr|array $entityIds
  * @return \Magento\Framework\DB\Select
  */
 public function getSelectSalesCreditmemoGrid(array $columns, $entityIds)
 {
     foreach ($columns as $key => $value) {
         $columns[$key] = new \Zend_Db_Expr($value);
     }
     /** @var \Magento\Framework\DB\Select $select */
     $select = $this->destinationAdapter->getSelect();
     $select->from(['sales_creditmemo' => $this->destination->addDocumentPrefix('sales_creditmemo')], [])->joinLeft(['sales_order' => $this->destination->addDocumentPrefix('sales_order')], 'sales_creditmemo.order_id = sales_order.entity_id', [])->joinLeft(['sales_shipping_address' => $this->destination->addDocumentPrefix('sales_order_address')], 'sales_creditmemo.shipping_address_id = sales_shipping_address.entity_id', [])->joinLeft(['sales_billing_address' => $this->destination->addDocumentPrefix('sales_order_address')], 'sales_creditmemo.billing_address_id = sales_billing_address.entity_id', [])->where('sales_creditmemo.entity_id in (?)', $entityIds);
     $select->columns($columns);
     return $select;
 }
 /**
  * @return array
  */
 protected function getSalesCreditMemoColumnsGrid()
 {
     $paymentSelect = sprintf('(SELECT `sales_order_payment`.`method`
         FROM `%s` as sales_order_payment
         WHERE (`parent_id` = sales_order.entity_id) LIMIT 1)', $this->destination->addDocumentPrefix('sales_order_payment'));
     $fields = array_keys($this->destination->getStructure('sales_creditmemo_grid')->getFields());
     $result = [];
     $fields = array_fill_keys($fields, null);
     $columns = ['entity_id' => 'sales_creditmemo.entity_id', 'increment_id' => 'sales_creditmemo.increment_id', 'created_at' => 'sales_creditmemo.created_at', 'updated_at' => 'sales_creditmemo.updated_at', 'order_id' => 'sales_order.entity_id', 'order_increment_id' => 'sales_order.increment_id', 'order_created_at' => 'sales_order.created_at', 'billing_name' => 'trim(concat(ifnull(sales_billing_address.firstname, \'\'), \' \' ' . ',ifnull(sales_billing_address.lastname, \'\')))', 'state' => 'sales_creditmemo.state', 'base_grand_total' => 'sales_creditmemo.base_grand_total', 'order_status' => 'sales_order.status', 'store_id' => 'sales_creditmemo.store_id', 'billing_address' => 'trim(concat(ifnull(sales_billing_address.street, \'\'), \', \' ' . ',ifnull(sales_billing_address.city, \'\'), \', \' ,ifnull(sales_billing_address.region,' . ' \'\'), \', \' ,ifnull(sales_billing_address.postcode, \'\')))', 'shipping_address' => 'trim(concat(ifnull(sales_shipping_address.street, \'\'), \', \' ' . ',ifnull(sales_shipping_address.city, \'\'), \', \' ,ifnull(sales_shipping_address.region,' . ' \'\'), \', \' ,ifnull(sales_shipping_address.postcode, \'\')))', 'customer_name' => 'trim(concat(ifnull(sales_order.customer_firstname, \'\'), \' \' ' . ',ifnull(sales_order.customer_lastname, \'\')))', 'customer_email' => 'sales_order.customer_email', 'customer_group_id' => 'sales_order.customer_group_id', 'payment_method' => $paymentSelect, 'shipping_information' => 'sales_order.shipping_description', 'subtotal' => 'sales_creditmemo.subtotal', 'shipping_and_handling' => 'sales_creditmemo.shipping_amount', 'adjustment_positive' => 'sales_creditmemo.adjustment_positive', 'adjustment_negative' => 'sales_creditmemo.adjustment_negative', 'order_base_grand_total' => 'sales_order.base_grand_total'];
     foreach (array_keys($fields) as $key) {
         $result[$key] = isset($columns[$key]) ? $columns[$key] : 'null';
     }
     return $result;
 }
Esempio n. 6
0
 /**
  * @param Document $sourceDocument
  * @param Document $destinationDocument
  * @return bool
  */
 protected function isCopiedDirectly(Document $sourceDocument, Document $destinationDocument)
 {
     if (!$this->copyDirectly) {
         return;
     }
     $result = true;
     $schema = $this->config->getSource()['database']['name'];
     /** @var \Magento\Framework\DB\Select $select */
     $select = $this->source->getAdapter()->getSelect();
     $select->from($this->source->addDocumentPrefix($sourceDocument->getName()), '*', $schema);
     try {
         $this->destination->getAdapter()->insertFromSelect($select, $this->destination->addDocumentPrefix($destinationDocument->getName()), array_keys($sourceDocument->getStructure()->getFields()));
     } catch (\Exception $e) {
         $this->copyDirectly = false;
         $this->logger->error('Document ' . $sourceDocument->getName() . ' can not be copied directly because of error: ' . $e->getMessage());
         $result = false;
     }
     return $result;
 }
 /**
  * {@inheritdoc}
  */
 public function perform()
 {
     $updateData = $this->helper->getUpdateData();
     $selectData = $this->helper->getSelectData();
     $sourceDocuments = $this->readerGroups->getGroup('source_documents');
     foreach ($sourceDocuments as $sourceDocName => $idKey) {
         if ($this->source->getRecordsCount($this->source->getDeltaLogName($sourceDocName)) == 0) {
             continue;
         }
         $items = $this->source->getChangedRecords($sourceDocName, $idKey, 0, true);
         if (empty($items)) {
             continue;
         }
         $this->logger->debug(sprintf('%s has changes', $sourceDocName));
         if (!$this->eolOnce) {
             $this->eolOnce = true;
             echo PHP_EOL;
         }
         $gridIdKey = $updateData[$sourceDocName]['idKey'];
         $page = 1;
         do {
             $ids = [];
             foreach ($items as $data) {
                 echo '.';
                 $ids[] = $data[$gridIdKey];
             }
             foreach ($updateData[$sourceDocName]['methods'] as $method) {
                 echo '.';
                 $destinationDocumentName = $selectData[$method]['destination'];
                 $select = call_user_func_array([$this->data, $method], [$selectData[$method]['columns'], $ids]);
                 $this->destination->getAdapter()->insertFromSelect($select, $this->destination->addDocumentPrefix($destinationDocumentName), [], \Magento\Framework\Db\Adapter\AdapterInterface::INSERT_ON_DUPLICATE);
             }
             $documentNameDelta = $this->source->getDeltaLogName($sourceDocName);
             $documentNameDelta = $this->source->addDocumentPrefix($documentNameDelta);
             $this->markRecordsProcessed($documentNameDelta, $idKey, $ids);
         } while (!empty($items = $this->source->getChangedRecords($sourceDocName, $idKey, $page++)));
     }
     return true;
 }
Esempio n. 8
0
 /**
  * Run step
  *
  * @return bool
  */
 public function perform()
 {
     /** @var \Migration\ResourceModel\Adapter\Mysql $sourceAdapter */
     $sourceAdapter = $this->source->getAdapter();
     /** @var \Migration\ResourceModel\Adapter\Mysql $destinationAdapter */
     $destinationAdapter = $this->destination->getAdapter();
     $sourceDocuments = array_keys($this->groups->getGroup('source_documents'));
     $this->progress->start($this->getIterationsCount(), LogManager::LOG_LEVEL_INFO);
     foreach ($sourceDocuments as $sourceDocumentName) {
         $destinationDocumentName = $this->map->getDocumentMap($sourceDocumentName, MapInterface::TYPE_SOURCE);
         $sourceTable = $sourceAdapter->getTableDdlCopy($this->source->addDocumentPrefix($sourceDocumentName), $this->destination->addDocumentPrefix($destinationDocumentName));
         $destinationTable = $destinationAdapter->getTableDdlCopy($this->destination->addDocumentPrefix($destinationDocumentName), $this->destination->addDocumentPrefix($destinationDocumentName));
         foreach ($sourceTable->getColumns() as $columnData) {
             $destinationTable->setColumn($columnData);
         }
         $destinationAdapter->createTableByDdl($destinationTable);
         $destinationDocument = $this->destination->getDocument($destinationDocumentName);
         $this->logger->debug('migrating', ['table' => $sourceDocumentName]);
         $pageNumber = 0;
         $this->progress->start($this->source->getRecordsCount($sourceDocumentName), LogManager::LOG_LEVEL_DEBUG);
         while (!empty($sourceRecords = $this->source->getRecords($sourceDocumentName, $pageNumber))) {
             $pageNumber++;
             $recordsToSave = $destinationDocument->getRecords();
             foreach ($sourceRecords as $recordData) {
                 $this->progress->advance(LogManager::LOG_LEVEL_INFO);
                 $this->progress->advance(LogManager::LOG_LEVEL_DEBUG);
                 /** @var Record $destinationRecord */
                 $destinationRecord = $this->recordFactory->create(['document' => $destinationDocument]);
                 $destinationRecord->setData($recordData);
                 $recordsToSave->addRecord($destinationRecord);
             }
             $this->destination->saveRecords($destinationDocument->getName(), $recordsToSave);
         }
         $this->progress->finish(LogManager::LOG_LEVEL_DEBUG);
     }
     $this->progress->finish(LogManager::LOG_LEVEL_INFO);
     return true;
 }
 /**
  * Returns rating store document name
  *
  * @return string
  */
 protected function getRatingStoreDocument()
 {
     return $this->destination->addDocumentPrefix(self::RATING_STORE_TABLE_NAME);
 }
 /**
  * @param string $table
  * @param bool $storeId
  * @return string
  */
 public function getTableName($table, $storeId = false)
 {
     return $storeId !== false ? $this->destination->addDocumentPrefix($table) . '_' . $storeId : $this->destination->addDocumentPrefix($table);
 }