/**
  * Migrate Attributes
  */
 public function actionStep3()
 {
     $step = MigrateSteps::model()->find("sorder = 3");
     $result = MigrateSteps::checkStep($step->sorder);
     if ($result['allowed']) {
         //get migrated data of step1 from session
         $migrated_store_ids = isset(Yii::app()->session['migrated_store_ids']) ? Yii::app()->session['migrated_store_ids'] : array();
         $migrated_attribute_set_ids = $migrated_attribute_group_ids = $migrated_attribute_ids = array();
         //get product entity type id
         $product_entity_type_id = MigrateSteps::getMage1EntityTypeId(MigrateSteps::PRODUCT_TYPE_CODE);
         //get all product attribute sets in magento1
         $attribute_sets = Mage1AttributeSet::model()->findAll("entity_type_id = {$product_entity_type_id}");
         //get all product attributes
         //$condition = "entity_type_id = {$product_entity_type_id} AND is_user_defined = 1";
         $attributes = Mage1Attribute::model()->findAll("entity_type_id = {$product_entity_type_id}");
         if (Yii::app()->request->isPostRequest && $step->status == MigrateSteps::STATUS_NOT_DONE) {
             //uncheck foreign key
             Yii::app()->mage2->createCommand("SET FOREIGN_KEY_CHECKS=0")->execute();
             //migrate attribute sets
             //eav_attribute_set
             if ($attribute_sets) {
                 foreach ($attribute_sets as $attribute_set) {
                     $entity_type_id2 = MigrateSteps::_getMage2EntityTypeId($attribute_set->entity_type_id);
                     $condition = "entity_type_id = {$entity_type_id2} AND attribute_set_name = '{$attribute_set->attribute_set_name}'";
                     $attribute_set2 = Mage2AttributeSet::model()->find($condition);
                     if (!$attribute_set2) {
                         $attribute_set2 = new Mage2AttributeSet();
                         $attribute_set2->entity_type_id = MigrateSteps::_getMage2EntityTypeId($attribute_set->entity_type_id);
                         $attribute_set2->attribute_set_name = $attribute_set->attribute_set_name;
                         $attribute_set2->sort_order = $attribute_set->sort_order;
                     }
                     if ($attribute_set2->save()) {
                         $migrated_attribute_set_ids[] = $attribute_set->attribute_set_id;
                     }
                     //get all attribute groups of current attribute set
                     $condition = "attribute_set_id = {$attribute_set->attribute_set_id}";
                     $attribute_groups = Mage1AttributeGroup::model()->findAll($condition);
                     if ($attribute_groups) {
                         foreach ($attribute_groups as $attribute_group) {
                             $attribute_set_id2 = MigrateSteps::getMage2AttributeSetId($attribute_group->attribute_set_id, MigrateSteps::PRODUCT_TYPE_CODE);
                             $condition = "attribute_set_id = {$attribute_set_id2} AND attribute_group_name = '{$attribute_group->attribute_group_name}'";
                             $attribute_group2 = Mage2AttributeGroup::model()->find($condition);
                             if (!$attribute_group2) {
                                 $attribute_group2 = new Mage2AttributeGroup();
                                 $attribute_group2->attribute_set_id = $attribute_set_id2;
                                 $attribute_group2->attribute_group_name = $attribute_group->attribute_group_name;
                                 $attribute_group2->sort_order = $attribute_group->sort_order;
                                 $attribute_group2->default_id = $attribute_group->default_id;
                                 //NOTE: this values is new added in Magento2, we will update after migrated in back-end of Magento2
                                 $attribute_group2->attribute_group_code = null;
                                 $attribute_group2->tab_group_code = null;
                             }
                             if ($attribute_group2->save()) {
                                 $migrated_attribute_group_ids[] = $attribute_group->attribute_group_id;
                             }
                         }
                     }
                 }
             }
             //migrate product attributes
             if ($attributes) {
                 //Some tables need to reset before migrate
                 Mage2AttributeOption::model()->deleteAll();
                 Mage2AttributeOptionValue::model()->deleteAll();
                 foreach ($attributes as $attribute) {
                     //msrp_enabled was changed to msrp in magento2
                     if ($attribute->attribute_code == 'msrp_enabled') {
                         $attribute_code2 = 'msrp';
                     } else {
                         $attribute_code2 = $attribute->attribute_code;
                     }
                     $entity_type_id2 = MigrateSteps::_getMage2EntityTypeId($attribute->entity_type_id);
                     $condition = "entity_type_id = {$entity_type_id2} AND attribute_code = '{$attribute_code2}'";
                     $attribute2 = Mage2Attribute::model()->find($condition);
                     if (!$attribute2) {
                         $attribute2 = new Mage2Attribute();
                         foreach ($attribute2->attributes as $key => $value) {
                             if (isset($attribute->{$key})) {
                                 $attribute2->{$key} = $attribute->{$key};
                             }
                         }
                         //We need re-update some values
                         $attribute2->attribute_id = null;
                         $attribute2->entity_type_id = MigrateSteps::_getMage2EntityTypeId($attribute->entity_type_id);
                         $attribute2->attribute_model = null;
                         $attribute2->backend_model = null;
                         $attribute2->frontend_model = null;
                         $attribute2->source_model = null;
                     }
                     //save or update data of a attribute
                     if ($attribute2->save()) {
                         //update total
                         $migrated_attribute_ids[] = $attribute->attribute_id;
                         if ($migrated_store_ids) {
                             //eav_attribute_label
                             $condition = "attribute_id = {$attribute->attribute_id}";
                             $str_store_ids = implode(',', $migrated_store_ids);
                             $condition .= " AND store_id IN ({$str_store_ids})";
                             $attribute_labels = Mage1AttributeLabel::model()->findAll($condition);
                             if ($attribute_labels) {
                                 foreach ($attribute_labels as $attribute_label) {
                                     $attribute_label2 = new Mage2AttributeLabel();
                                     $attribute_label2->attribute_label_id = $attribute_label->attribute_label_id;
                                     $attribute_label2->attribute_id = $attribute2->attribute_id;
                                     $attribute_label2->store_id = MigrateSteps::getMage2StoreId($attribute_label->store_id);
                                     $attribute_label2->value = $attribute_label->value;
                                     //save or update
                                     $attribute_label2->save();
                                 }
                             }
                         }
                         //eav_attribute_option
                         $attribute_options = Mage1AttributeOption::model()->findAll("attribute_id = {$attribute->attribute_id}");
                         if ($attribute_options) {
                             foreach ($attribute_options as $attribute_option) {
                                 $attribute_option2 = new Mage2AttributeOption();
                                 $attribute_option2->option_id = $attribute_option->option_id;
                                 $attribute_option2->attribute_id = $attribute2->attribute_id;
                                 $attribute_option2->sort_order = $attribute_option->sort_order;
                                 //save or update
                                 if ($attribute_option2->save()) {
                                     //eav_attribute_option_value,
                                     if ($migrated_store_ids) {
                                         //get all option values of current option in Magento1
                                         $condition = "option_id = {$attribute_option->option_id}";
                                         $str_store_ids = implode(',', $migrated_store_ids);
                                         $condition .= " AND store_id IN ({$str_store_ids})";
                                         $option_values = Mage1AttributeOptionValue::model()->findAll($condition);
                                         if ($option_values) {
                                             foreach ($option_values as $option_value) {
                                                 $option_value2 = new Mage2AttributeOptionValue();
                                                 $option_value2->value_id = $option_value->value_id;
                                                 $option_value2->option_id = $option_value->option_id;
                                                 $option_value2->store_id = MigrateSteps::getMage2StoreId($option_value->store_id);
                                                 $option_value2->value = $option_value->value;
                                                 //update or save
                                                 $option_value2->save();
                                             }
                                         }
                                     }
                                 }
                             }
                         }
                         //catalog_eav_attribute
                         $catalog_eav_attribute = Mage1CatalogEavAttribute::model()->find("attribute_id = {$attribute->attribute_id}");
                         if ($catalog_eav_attribute) {
                             $catalog_eav_attribute2 = Mage2CatalogEavAttribute::model()->find("attribute_id = {$attribute2->attribute_id}");
                             if (!$catalog_eav_attribute2) {
                                 //create new
                                 $catalog_eav_attribute2 = new Mage2CatalogEavAttribute();
                                 foreach ($catalog_eav_attribute2->attributes as $key => $value) {
                                     if (isset($catalog_eav_attribute->{$key})) {
                                         $catalog_eav_attribute2->{$key} = $catalog_eav_attribute->{$key};
                                     }
                                 }
                                 //update new attribute_id
                                 $catalog_eav_attribute2->attribute_id = $attribute2->attribute_id;
                                 $catalog_eav_attribute2->is_required_in_admin_store = 0;
                                 //this not take because was changed in magento2
                                 $catalog_eav_attribute2->frontend_input_renderer = null;
                             } else {
                                 //                                    //update settings values
                                 //                                    $catalog_eav_attribute2->is_global = $catalog_eav_attribute->is_global;
                                 //                                    $catalog_eav_attribute2->is_visible = $catalog_eav_attribute->is_visible;
                                 //                                    $catalog_eav_attribute2->is_searchable = $catalog_eav_attribute->is_searchable;
                                 //                                    $catalog_eav_attribute2->is_filterable = $catalog_eav_attribute->is_filterable;
                                 //                                    $catalog_eav_attribute2->is_comparable = $catalog_eav_attribute->is_comparable;
                                 //                                    $catalog_eav_attribute2->is_visible_on_front = $catalog_eav_attribute->is_visible_on_front;
                                 //                                    $catalog_eav_attribute2->is_html_allowed_on_front = $catalog_eav_attribute->is_html_allowed_on_front;
                                 //                                    $catalog_eav_attribute2->is_filterable_in_search = $catalog_eav_attribute->is_filterable_in_search;
                                 //                                    $catalog_eav_attribute2->used_in_product_listing = $catalog_eav_attribute->used_in_product_listing;
                                 //                                    $catalog_eav_attribute2->used_for_sort_by = $catalog_eav_attribute->used_for_sort_by;
                                 //                                    $catalog_eav_attribute2->apply_to = $catalog_eav_attribute->apply_to;
                                 //                                    $catalog_eav_attribute2->is_visible_in_advanced_search = $catalog_eav_attribute->is_visible_in_advanced_search;
                                 $catalog_eav_attribute2->position = $catalog_eav_attribute->position;
                                 $catalog_eav_attribute2->is_wysiwyg_enabled = $catalog_eav_attribute->is_wysiwyg_enabled;
                                 $catalog_eav_attribute2->is_used_for_price_rules = $catalog_eav_attribute->is_used_for_price_rules;
                                 $catalog_eav_attribute2->is_used_for_promo_rules = $catalog_eav_attribute->is_used_for_promo_rules;
                             }
                             //save
                             $catalog_eav_attribute2->save();
                         }
                     }
                 }
                 //end foreach attributes
             }
             //eav_entity_attribute
             //we only migrate related with products
             if ($migrated_attribute_set_ids && $migrated_attribute_group_ids && $migrated_attribute_ids) {
                 //make condition
                 $str_migrated_attribute_ids = implode(',', $migrated_attribute_ids);
                 $str_migrated_attribute_set_ids = implode(',', $migrated_attribute_set_ids);
                 $str_migrated_attribute_group_ids = implode(',', $migrated_attribute_group_ids);
                 $condition = "entity_type_id = {$product_entity_type_id} AND attribute_id IN ({$str_migrated_attribute_ids})";
                 $condition .= " AND attribute_set_id IN ({$str_migrated_attribute_set_ids})";
                 $condition .= " AND attribute_group_id IN ({$str_migrated_attribute_group_ids})";
                 $entity_attributes = Mage1EntityAttribute::model()->findAll($condition);
                 if ($entity_attributes) {
                     foreach ($entity_attributes as $entity_attribute) {
                         $attribute_id2 = MigrateSteps::getMage2AttributeId($entity_attribute->attribute_id, '4');
                         $attribute_set_id2 = MigrateSteps::getMage2AttributeSetId($entity_attribute->attribute_set_id, MigrateSteps::PRODUCT_TYPE_CODE);
                         $attribute_group_id2 = MigrateSteps::getMage2AttributeGroupId($entity_attribute->attribute_group_id);
                         if ($attribute_id2 && $attribute_set_id2 && $attribute_group_id2) {
                             $condition = "attribute_id = {$attribute_id2} AND entity_type_id = 4";
                             $condition .= " AND attribute_set_id = {$attribute_set_id2}";
                             $entity_attribute2 = Mage2EntityAttribute::model()->find($condition);
                             if (!$entity_attribute2) {
                                 $entity_attribute2 = new Mage2EntityAttribute();
                                 $entity_attribute2->entity_type_id = MigrateSteps::_getMage2EntityTypeId($entity_attribute->entity_type_id);
                                 $entity_attribute2->attribute_set_id = $attribute_set_id2;
                                 $entity_attribute2->attribute_group_id = $attribute_group_id2;
                                 $entity_attribute2->attribute_id = $attribute_id2;
                                 $entity_attribute2->sort_order = $entity_attribute->sort_order;
                             }
                             //save or update
                             $entity_attribute2->save();
                         }
                     }
                 }
             }
             //Update step status
             if ($migrated_attribute_set_ids && $migrated_attribute_group_ids && $migrated_attribute_ids) {
                 $step->status = MigrateSteps::STATUS_DONE;
                 if ($step->update()) {
                     //check foreign key
                     Yii::app()->mage2->createCommand("SET FOREIGN_KEY_CHECKS=1")->execute();
                     $message = "Migrated successfully. Total Attribute Sets: %s1, Total Attribute Groups: %s2, Total Attributes: %s3";
                     $message = Yii::t('frontend', $message, array('%s1' => sizeof($migrated_attribute_set_ids), '%s2' => sizeof($migrated_attribute_group_ids), '%s3' => sizeof($migrated_attribute_ids)));
                     Yii::app()->user->setFlash('success', $message);
                 }
             }
         } else {
             if ($step->status == MigrateSteps::STATUS_DONE) {
                 Yii::app()->user->setFlash('note', Yii::t('frontend', "This step was finished. If you want to update data of this step, the first you have to click to 'Reset' button."));
             }
         }
         $assign_data = array('step' => $step, 'attribute_sets' => $attribute_sets, 'attributes' => $attributes);
         $this->render("step{$step->sorder}", $assign_data);
     } else {
         Yii::app()->user->setFlash('note', Yii::t('frontend', "The first you need to finish the %s.", array("%s" => ucfirst($result['back_step']))));
         $this->redirect(array($result['back_step']));
     }
 }
 public static function getMage2AttributeId($mage1AttrId, $entityTypeId = 3)
 {
     $id = null;
     if (isset($mage1AttrId)) {
         $cacheId = "attrubute_id2_{$entityTypeId}_{$mage1AttrId}";
         $val = Yii::app()->cache->get($cacheId);
         if (!$val) {
             $attr1 = Mage1Attribute::model()->findByPk($mage1AttrId);
             if ($attr1) {
                 //msrp_enabled was changed to msrp in magento2
                 if ($attr1->attribute_code == 'msrp_enabled') {
                     $attribute_code2 = 'msrp';
                 } else {
                     $attribute_code2 = $attr1->attribute_code;
                 }
                 $attr2 = Mage2Attribute::model()->find("entity_type_id = {$entityTypeId} AND attribute_code = '{$attribute_code2}'");
                 if ($attr2) {
                     $id = $attr2->attribute_id;
                 }
             }
             //save to cache for later
             Yii::app()->cache->set($cacheId, $id, 86400);
             // one day
         } else {
             $id = $val;
         }
     }
     return $id;
 }
 public static function getMage2AttributeId($mage1AttrId, $entityTypeId = 3)
 {
     $id = null;
     if (isset($mage1AttrId)) {
         $attr1 = Mage1Attribute::model()->findByPk($mage1AttrId);
         if ($attr1) {
             //msrp_enabled was changed to msrp in magento2
             if ($attr1->attribute_code == 'msrp_enabled') {
                 $attribute_code2 = 'msrp';
             } else {
                 $attribute_code2 = $attr1->attribute_code;
             }
             $attr2 = Mage2Attribute::model()->find("entity_type_id = {$entityTypeId} AND attribute_code = '{$attribute_code2}'");
             if ($attr2) {
                 $id = $attr2->attribute_id;
             }
         }
     }
     return $id;
 }