🛒 Magento Migration

Migrate categories from Magento 1 to Magento 2 with multi-store support

📡 Database Connections

Magento 1: {{ $connectionTest['magento1'] ? '✓ Connected' : '✗ Failed' }} @if(!$connectionTest['magento1'] && isset($connectionTest['magento1_error']))
{{ $connectionTest['magento1_error'] }}
@endif
Magento 2: {{ $connectionTest['magento2'] ? '✓ Connected' : '✗ Failed' }} @if(!$connectionTest['magento2'] && isset($connectionTest['magento2_error']))
{{ $connectionTest['magento2_error'] }}
@endif

📊 Statistics

{{ $m1Stores->count() }}
Magento 1 Stores
{{ $m2Stores->count() }}
Magento 2 Stores
{{ $m1CategoriesCount }}
Magento 1 Categories
{{ $m2CategoriesCount }}
Magento 2 Categories

🔄 Store Mapping

Map each Magento 1 store to its corresponding Magento 2 store:

@foreach($m1Stores as $m1Store)
M1 Store: {{ $m1Store->name }} ({{ $m1Store->code }})
@endforeach
@if($m1Stores->isEmpty())

No Magento 1 stores found. Please check your database connection.

@endif

⚡ Actions

What happens when you click "Start Migration"?

The migration process will:

  • Migrate category structure: Create categories in Magento 2 based on the hierarchy from Magento 1, preserving parent-child relationships and positions
  • Migrate category attributes: For each mapped store, migrate category names, URL keys, and active status from Magento 1 to Magento 2
  • Preserve hierarchy: Maintain the exact category tree structure with proper levels and paths
  • Handle existing categories: If a category with the same name and parent already exists in Magento 2, it will be reused instead of creating a duplicate
  • Generate logs: Provide detailed migration logs showing which categories were added, updated, or encountered errors

⚠️ Warning: This will modify your Magento 2 database. Make sure you have a backup before proceeding.

Migration in progress...

📋 Migration Logs

Detailed logs showing which categories were added, updated, or encountered errors during migration:

No migration logs yet. Click "Start Migration" to begin.

📊 Category Statistics

{{ $m1CategoriesCount }}
Magento 1 Categories
{{ $m2CategoriesCount }}
Magento 2 Categories
{{ $m1CategoriesCount - $m2CategoriesCount }}
Difference

⚠️ Magento 2 Categories Not Found in Magento 1

These categories exist in Magento 2 but do not have a matching name in Magento 1:

@if($m2CategoriesNotInM1->count() > 0)
@foreach($m2CategoriesNotInM1 as $category) @endforeach
ID Category Name Level Status Root Category Path Actions
{{ $category->entity_id }} {{ $category->name ?? 'Unnamed Category' }} {{ $category->level ?? 'N/A' }} {{ ($category->is_active ?? 0) ? 'Active' : 'Inactive' }} @if(isset($category->root_category_name) && $category->root_category_name !== 'N/A') {{ $category->root_category_name }} @if(isset($category->root_category_id)) (ID: {{ $category->root_category_id }}) @endif @else N/A @endif {{ $category->path ?? 'N/A' }}
Total: {{ $m2CategoriesNotInM1->count() }} {{ Str::plural('category', $m2CategoriesNotInM1->count()) }} found in Magento 2 but not in Magento 1.
@else
✓ All Magento 2 categories have matching names in Magento 1.
@endif

🌳 Category Trees

View category hierarchies from Magento 1 and Magento 2

Magento 1 Categories

Loading categories...

Magento 2 Categories

Loading categories...

📦 Attribute Groups

View attribute groups that organize attributes within attribute sets:

Magento 1 Attribute Groups ({{ $m1AttributeGroups->count() }})

@if($m1AttributeGroups->count() > 0) @foreach($m1AttributeGroups as $group) @php $groupKey = ($group->attribute_set_name ?? 'Default') . '|' . ($group->attribute_group_name ?? ''); $isMissing = $m1AttributeGroupsMissingInM2->contains(function($missingGroup) use ($groupKey) { $missingKey = ($missingGroup->attribute_set_name ?? 'Default') . '|' . ($missingGroup->attribute_group_name ?? ''); return $missingKey === $groupKey; }); @endphp @endforeach
Group ID Group Name Attribute Set Attributes Sort Order Actions
{{ $group->attribute_group_id }} {{ $group->attribute_group_name ?? 'N/A' }} {{ $group->attribute_set_name ?? 'N/A' }} {{ $group->attribute_count ?? 0 }} {{ $group->sort_order ?? 'N/A' }} @if($isMissing) @else ✓ Exists @endif
@else
No attribute groups found. Please check your database connection.
@endif

Magento 2 Attribute Groups ({{ $m2AttributeGroups->count() }})

@if($m2AttributeGroups->count() > 0) @foreach($m2AttributeGroups as $group) @endforeach
Group ID Group Name Attribute Set Attributes Sort Order
{{ $group->attribute_group_id }} {{ $group->attribute_group_name ?? 'N/A' }} {{ $group->attribute_set_name ?? 'N/A' }} {{ $group->attribute_count ?? 0 }} {{ $group->sort_order ?? 'N/A' }}
@else
No attribute groups found. Please check your database connection.
@endif

⚠️ Magento 1 Attributes Missing in Magento 2

These attributes exist in Magento 1 but do not have a matching attribute code in Magento 2:

@if($m1AttributesMissingInM2->count() > 0)
@foreach($m1AttributesMissingInM2 as $attr) @endforeach
ID Attribute Code Label Type Input Required User Defined Actions
{{ $attr->attribute_id }} {{ $attr->attribute_code }} {{ $attr->frontend_label ?? 'N/A' }} {{ $attr->backend_type ?? 'N/A' }} {{ $attr->frontend_input ?? 'N/A' }} @if($attr->is_required ?? 0) Yes @else No @endif @if($attr->is_user_defined ?? 0) Yes @else No @endif
Total: {{ $m1AttributesMissingInM2->count() }} {{ Str::plural('attribute', $m1AttributesMissingInM2->count()) }} found in Magento 1 but not in Magento 2.
@else
✓ All Magento 1 attributes have matching attribute codes in Magento 2.
@endif

📋 Category Attributes

View all category attributes from Magento 1 and Magento 2

Magento 1 Attributes ({{ $m1Attributes->count() }})

@if($m1Attributes->count() > 0) @foreach($m1Attributes as $attr) @endforeach
ID Code Label Type Input Required
{{ $attr->attribute_id }} {{ $attr->attribute_code }} {{ $attr->frontend_label ?? 'N/A' }} {{ $attr->backend_type ?? 'N/A' }} {{ $attr->frontend_input ?? 'N/A' }} @if($attr->is_required ?? 0) Yes @else No @endif
@else
No attributes found. Please check your database connection.
@endif

Magento 2 Attributes ({{ $m2Attributes->count() }})

@if($m2Attributes->count() > 0) @foreach($m2Attributes as $attr) @endforeach
ID Code Label Type Input Required
{{ $attr->attribute_id }} {{ $attr->attribute_code }} {{ $attr->frontend_label ?? 'N/A' }} {{ $attr->backend_type ?? 'N/A' }} {{ $attr->frontend_input ?? 'N/A' }} @if($attr->is_required ?? 0) Yes @else No @endif
@else
No attributes found. Please check your database connection.
@endif

🚀 Product Migration

What happens when you click "Start Product Migration"?

The product migration process will:

  • Create new products: If a product with the same SKU doesn't exist in Magento 2, it will be created with all its attributes (name, description, price, weight, status, etc.)
  • Update existing products: If a product with the same SKU already exists in Magento 2, it will be updated with the latest data from Magento 1
  • Migrate product attributes: All product attributes including SKU, name, description, price, weight, status, visibility, and tax class will be migrated
  • Assign to categories: Products will be assigned to the corresponding categories in Magento 2 based on the category mapping from previous migrations
  • Preserve product types: Product types (simple, configurable, etc.) will be maintained
  • Generate logs: Detailed migration logs showing which products were added, updated, or encountered errors

⚠️ Warning: This will modify your Magento 2 database. Make sure you have a backup before proceeding.

📋 Product Migration Logs

Detailed logs showing which products were added, updated, or encountered errors during migration:

No product migration logs yet. Click "Run Dry Run" or "Start Product Migration" to begin.

🌳 Category Tree with Products

View all categories with their associated products in a tree structure.

Magento 1 Categories

Click "Load M1 Category Tree" to view categories and their products.

Magento 2 Categories

Click "Load M2 Category Tree" to view categories and their products.

🔄 Sync Product Categories

This tool will update Magento 2 products to be in the same categories as their Magento 1 counterparts.

  • Matches products between M1 and M2 by SKU or Product ID
  • Uses the category mapping from previous migrations
  • Adds missing category associations
  • Removes category associations that don't exist in M1
  • Preserves product positions in categories

⚠️ Warning: This will modify product-category associations in your Magento 2 database. Make sure you have a backup before proceeding.

Sync Logs

⚠️ Magento 1 Products Not Found in Magento 2

These products exist in Magento 1 but do not have a matching SKU or ID in Magento 2:

@if($m1ProductsNotInM2->count() > 0)
@foreach($m1ProductsNotInM2 as $product) @endforeach
ID SKU Name Type Created
{{ $product->entity_id }} {{ $product->sku ?? 'N/A' }} {{ $product->name ?? 'Unnamed Product' }} {{ $product->type_id ?? 'N/A' }} @if($product->created_at) {{ \Carbon\Carbon::parse($product->created_at)->format('Y-m-d') }} @else N/A @endif
Total: {{ $m1ProductsNotInM2->count() }} {{ Str::plural('product', $m1ProductsNotInM2->count()) }} found in Magento 1 but not in Magento 2.
@else
✓ All Magento 1 products have matching SKUs or IDs in Magento 2.
@endif

⚠️ Magento 2 Products Not Found in Magento 1

These products exist in Magento 2 but do not have a matching SKU or ID in Magento 1:

@if($m2ProductsNotInM1->count() > 0)
@foreach($m2ProductsNotInM1 as $product) @endforeach
ID SKU Name Type Created Actions
{{ $product->entity_id }} {{ $product->sku ?? 'N/A' }} {{ $product->name ?? 'Unnamed Product' }} {{ $product->type_id ?? 'N/A' }} @if($product->created_at) {{ \Carbon\Carbon::parse($product->created_at)->format('Y-m-d') }} @else N/A @endif
Total: {{ $m2ProductsNotInM1->count() }} {{ Str::plural('product', $m2ProductsNotInM1->count()) }} found in Magento 2 but not in Magento 1.
@else
✓ All Magento 2 products have matching SKUs or IDs in Magento 1.
@endif

📦 Products

View all products from Magento 1 and Magento 2

Magento 1 Products ({{ $m1Products->count() }})

@if($m1Products->count() > 0) @foreach($m1Products as $product) @endforeach
ID SKU Name Type Created
{{ $product->entity_id }} {{ $product->sku ?? 'N/A' }} {{ $product->name ?? 'Unnamed Product' }} {{ $product->type_id ?? 'N/A' }} @if($product->created_at) {{ \Carbon\Carbon::parse($product->created_at)->format('Y-m-d') }} @else N/A @endif
@else
No products found. Please check your database connection.
@endif

Magento 2 Products ({{ $m2Products->count() }})

@if($m2Products->count() > 0) @foreach($m2Products as $product) @endforeach
ID SKU Name Type Created
{{ $product->entity_id }} {{ $product->sku ?? 'N/A' }} {{ $product->name ?? 'Unnamed Product' }} {{ $product->type_id ?? 'N/A' }} @if($product->created_at) {{ \Carbon\Carbon::parse($product->created_at)->format('Y-m-d') }} @else N/A @endif
@else
No products found. Please check your database connection.
@endif