Add new product images and implement SeedMutualSmepCatalogTest for catalog migration

- Added multiple new product images for smart TVs, audio devices, and accessories in WEBP format.
- Created a new test class SeedMutualSmepCatalogTest to validate the catalog migration process.
- Implemented setup and teardown methods to manage database schema and data during tests.
- Verified the integrity of catalog items, inventories, and associated attributes after migration.
This commit is contained in:
2026-09-24 12:41:24 -03:00
parent 16e2ca679c
commit 74b72a7d4e
516 changed files with 3953 additions and 0 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,356 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
return new class extends Migration
{
private const TENANT_CODE = 'mutual_smep';
private const MANIFEST = 'data/mutual_smep_catalog_v1.json';
private const STORAGE_PREFIX = 'tenants/mutual_smep/catalog-v1/';
private const BRAND_MARKER = 'Provisioned by Mutual SMEP catalog migration v1.';
private const FEATURED_GROUP_CODE = 'productos-smep';
/** @var list<string> */
private array $storedPaths = [];
public function up(): void
{
if (! DB::table('tenants')->where('codigo', self::TENANT_CODE)->exists()) {
throw new RuntimeException("Tenant '".self::TENANT_CODE."' not found.");
}
$manifest = $this->manifest();
$slugs = array_column($manifest['items'], 'slug');
$existingSlug = DB::table('catalog_items')
->where('tenant_code', self::TENANT_CODE)
->whereIn('slug', $slugs)
->value('slug');
if ($existingSlug !== null) {
throw new RuntimeException("Catalog item '{$existingSlug}' already exists for Mutual SMEP.");
}
try {
DB::transaction(function () use ($manifest): void {
$brandIds = [];
$categoryIds = [];
$attributeIds = [];
foreach ($manifest['items'] as $order => $item) {
$brandId = $this->brandId($item['brand'], $brandIds);
$categoryId = $this->categoryId(
$item['parent_category'],
$item['category'],
$categoryIds,
);
$hasVariants = $item['variants'] !== [];
$inventoryId = $hasVariants
? null
: $this->createInventory((int) $item['stock']);
$catalogItemId = DB::table('catalog_items')->insertGetId([
'tenant_code' => self::TENANT_CODE,
'category_id' => $categoryId,
'brand_id' => $brandId,
'inventory_id' => $inventoryId,
'type' => 'standard',
'slug' => $item['slug'],
'nombre' => $item['name'],
'group_order' => $order + 1,
'descripcion' => $item['description'],
'precio' => $item['price'],
'inventory_policy' => 'tracked',
'inventory_subject' => 'product',
'has_tickets' => false,
]);
$this->attachImages($catalogItemId, null, $item['images']);
if (! $hasVariants) {
continue;
}
$itemAttributeIds = [];
foreach ($item['attribute_codes'] as $attributeOrder => $attributeCode) {
$attributeId = $this->attributeId($attributeCode, $attributeIds);
$itemAttributeIds[$attributeCode] = DB::table('item_attributes')->insertGetId([
'catalog_item_id' => $catalogItemId,
'attribute_id' => $attributeId,
'allow_multi_select' => false,
'sort_order' => $attributeOrder + 1,
'show_in_selector' => true,
'ticket_label' => null,
'created_at' => now(),
'updated_at' => now(),
]);
}
foreach ($item['variants'] as $variant) {
$variantId = DB::table('variantes')->insertGetId([
'catalog_item_id' => $catalogItemId,
'inventory_id' => $this->createInventory((int) $variant['stock']),
'descripcion' => $variant['description'],
'precio' => $variant['price'],
]);
foreach ($variant['values'] as $attributeCode => $value) {
$itemAttributeId = $itemAttributeIds[$attributeCode] ?? null;
if ($itemAttributeId === null) {
throw new RuntimeException(
"Attribute '{$attributeCode}' is not assigned to '{$item['slug']}'."
);
}
DB::table('variant_values')->insert([
'variant_id' => $variantId,
'item_attribute_id' => $itemAttributeId,
'value' => $value,
'created_at' => now(),
'updated_at' => now(),
]);
}
$this->attachImages($catalogItemId, $variantId, $variant['images']);
}
}
DB::table('featured_groups')->insert([
'tenant_code' => self::TENANT_CODE,
'code' => self::FEATURED_GROUP_CODE,
'source_type' => 'all',
'category_id' => null,
'product_layout' => 'column_with_image',
'group_layout' => 'paginated',
'group_name' => 'Productos',
'group_order' => 1,
]);
});
} catch (Throwable $throwable) {
Storage::disk('s3')->delete($this->storedPaths);
throw $throwable;
}
}
public function down(): void
{
$manifest = $this->manifest();
$catalogItemIds = DB::table('catalog_items')
->where('tenant_code', self::TENANT_CODE)
->whereIn('slug', array_column($manifest['items'], 'slug'))
->pluck('id');
$variantInventoryIds = DB::table('variantes')
->whereIn('catalog_item_id', $catalogItemIds)
->pluck('inventory_id');
$itemInventoryIds = DB::table('catalog_items')
->whereIn('id', $catalogItemIds)
->whereNotNull('inventory_id')
->pluck('inventory_id');
$attachmentIds = DB::table('catalog_items_attachments')
->whereIn('catalog_item_id', $catalogItemIds)
->pluck('attachment_id')
->unique()
->values();
$storedPaths = DB::table('attachments')
->whereIn('id', $attachmentIds)
->where('path', 'like', self::STORAGE_PREFIX.'%')
->pluck('path')
->all();
DB::transaction(function () use (
$catalogItemIds,
$variantInventoryIds,
$itemInventoryIds,
$attachmentIds,
): void {
DB::table('featured_groups')
->where('tenant_code', self::TENANT_CODE)
->where('code', self::FEATURED_GROUP_CODE)
->delete();
DB::table('catalog_items')->whereIn('id', $catalogItemIds)->delete();
DB::table('inventories')
->whereIn('id', $variantInventoryIds->merge($itemInventoryIds)->unique())
->delete();
DB::table('attachments')->whereIn('id', $attachmentIds)->delete();
DB::table('brands')
->where('tenant_codigo', self::TENANT_CODE)
->where('descripcion', self::BRAND_MARKER)
->whereNotExists(fn ($query) => $query
->selectRaw('1')
->from('catalog_items')
->whereColumn('catalog_items.brand_id', 'brands.id'))
->delete();
});
Storage::disk('s3')->delete($storedPaths);
}
/** @return array<string, mixed> */
private function manifest(): array
{
$path = database_path(self::MANIFEST);
if (! is_file($path)) {
throw new RuntimeException("Mutual SMEP catalog manifest not found: {$path}");
}
$manifest = json_decode(
(string) file_get_contents($path),
true,
flags: JSON_THROW_ON_ERROR,
);
if (
($manifest['version'] ?? null) !== 1
|| ($manifest['tenant_code'] ?? null) !== self::TENANT_CODE
|| count($manifest['items'] ?? []) !== 142
|| ($manifest['image_count'] ?? null) !== 511
) {
throw new RuntimeException('Mutual SMEP catalog manifest is invalid.');
}
return $manifest;
}
/** @param array<string, int> $cache */
private function brandId(?string $name, array &$cache): ?int
{
if ($name === null) {
return null;
}
if (isset($cache[$name])) {
return $cache[$name];
}
$brandId = DB::table('brands')
->where('tenant_codigo', self::TENANT_CODE)
->where('nombre', $name)
->value('id');
if ($brandId === null) {
$brandId = DB::table('brands')->insertGetId([
'tenant_codigo' => self::TENANT_CODE,
'nombre' => $name,
'descripcion' => self::BRAND_MARKER,
'created_at' => now(),
'updated_at' => now(),
]);
}
return $cache[$name] = (int) $brandId;
}
/** @param array<string, int> $cache */
private function categoryId(string $parentName, string $name, array &$cache): int
{
$key = "{$parentName}|{$name}";
if (isset($cache[$key])) {
return $cache[$key];
}
$parentId = DB::table('categorias')
->where('tenant_code', self::TENANT_CODE)
->where('nombre', $parentName)
->whereNull('categoria_id')
->value('id');
$categoryId = $parentId === null
? null
: DB::table('categorias')
->where('tenant_code', self::TENANT_CODE)
->where('categoria_id', $parentId)
->where('nombre', $name)
->value('id');
if ($categoryId === null) {
throw new RuntimeException("Category '{$parentName} > {$name}' not found for Mutual SMEP.");
}
return $cache[$key] = (int) $categoryId;
}
/** @param array<string, int> $cache */
private function attributeId(string $code, array &$cache): int
{
if (isset($cache[$code])) {
return $cache[$code];
}
$attributeId = DB::table('attribute')
->where('tenant_codigo', self::TENANT_CODE)
->where('codigo', $code)
->value('id');
if ($attributeId === null) {
throw new RuntimeException("Attribute '{$code}' not found for Mutual SMEP.");
}
return $cache[$code] = (int) $attributeId;
}
private function createInventory(int $stock): int
{
return (int) DB::table('inventories')->insertGetId([
'sold_units' => 0,
'refunded_units' => 0,
'reserved_stock' => 0,
'real_stock' => $stock,
]);
}
/** @param list<string> $images */
private function attachImages(int $catalogItemId, ?int $variantId, array $images): void
{
foreach ($images as $order => $relativePath) {
$sourcePath = public_path($relativePath);
if (! is_file($sourcePath)) {
throw new RuntimeException("Catalog image not found: {$sourcePath}");
}
$contents = file_get_contents($sourcePath);
if ($contents === false) {
throw new RuntimeException("Catalog image could not be read: {$sourcePath}");
}
$catalogRelativePath = Str::after(
str_replace('\\', '/', $relativePath),
'images/tennants/mutual_smep/catalog/',
);
$storedPath = self::STORAGE_PREFIX.$catalogRelativePath;
if (! Storage::disk('s3')->put($storedPath, $contents)) {
throw new RuntimeException("Catalog image could not be stored: {$storedPath}");
}
$this->storedPaths[] = $storedPath;
$attachmentId = DB::table('attachments')->insertGetId([
'key' => (string) Str::uuid(),
'path' => $storedPath,
'filename' => basename($relativePath),
'type' => 'image',
'mime_type' => 'image/webp',
'extension' => 'webp',
'size' => strlen($contents),
'created_at' => now(),
'updated_at' => now(),
]);
DB::table('catalog_items_attachments')->insert([
'catalog_item_id' => $catalogItemId,
'variant_id' => $variantId,
'attachment_id' => $attachmentId,
'orden' => $order,
'is_enabled' => true,
]);
}
}
};

View File

@@ -0,0 +1,308 @@
<?php
declare(strict_types=1);
$sourceRoot = 'C:\\Users\\ncoronel\\Documents\\catalogo_smep_limpio';
$projectRoot = dirname(__DIR__, 2);
$assetRoot = $projectRoot.'/public/images/tennants/mutual_smep/catalog';
$manifestPath = $projectRoot.'/database/data/mutual_smep_catalog_v1.json';
$defaultStock = 10;
if (! is_dir($sourceRoot)) {
throw new RuntimeException("Source catalog not found: {$sourceRoot}");
}
/** @return array{0: string, 1: string} */
function catalogDestination(string $source, string $name): array
{
return match ($source) {
'acolchados-frazadas-y-edredon' => preg_match('/^(Frazada|Manta)/iu', $name)
? ['Dormitorio y Blanco', 'Frazadas y Mantas']
: ['Dormitorio y Blanco', 'Acolchados y Edredones'],
'acolchados-y-sabanas-infantil' => ['Dormitorio y Blanco', 'Infantil y Cuna'],
'base-sommier-1-pl-0-80x1-90', 'base-sommier-2-pl-1-40x1-90' => ['Dormitorio y Blanco', 'Bases y Sommiers'],
'colchon-1-plaza-0-80x1-90', 'colchon-2-plazas-1-40x1-90' => str_starts_with(mb_strtolower($name), 'soporte')
? ['Tecnología', 'Soportes para TV']
: ['Dormitorio y Blanco', 'Colchones'],
'aires-acondicionados' => ['Climatización', 'Aires Acondicionados'],
'calefaccion-con-salida-al-ext' => ['Climatización', 'Calefactores a Gas con Salida'],
'calefactor-sin-salida-al-ext' => ['Climatización', 'Calefactores a Gas sin Salida'],
'calefaccion-electrica' => ['Climatización', 'Calefacción Eléctrica'],
'calefones-y-termotanques' => ['Electrodomésticos', 'Calefones y Termotanques'],
'heladeras' => ['Electrodomésticos', 'Heladeras'],
'lavarropas-automaticos' => ['Electrodomésticos', 'Lavarropas y Secarropas'],
'cocinas' => ['Electrodomésticos', 'Cocinas'],
'purificador-de-aire' => ['Electrodomésticos', 'Purificadores y Extractores de Cocina'],
'microondas-y-hornos-electricos' => str_starts_with(mb_strtolower($name), 'horno')
? ['Electrodomésticos', 'Hornos Eléctricos']
: ['Electrodomésticos', 'Microondas'],
'electrodomesticos-pequenos' => smallApplianceCategory($name),
'celulares' => ['Tecnología', 'Celulares'],
'notebooks-y-tablets' => ['Tecnología', 'Notebooks'],
'smart-tv' => str_starts_with(mb_strtolower($name), 'soporte')
? ['Tecnología', 'Soportes para TV']
: ['Tecnología', 'Smart TV'],
'tecnologia' => preg_match('/^(Mouse|Teclado)/iu', $name)
? ['Tecnología', 'Accesorios de Computación']
: ['Tecnología', 'Audio'],
'bicicletas' => preg_match('/\bR16\b/iu', $name)
? ['Bicicletas y Aire Libre', 'Bicicletas Infantiles']
: ['Bicicletas y Aire Libre', 'Bicicletas para Adultos'],
'piletas' => ['Bicicletas y Aire Libre', 'Piletas'],
'bazar' => ['Bazar', 'Termos'],
default => throw new RuntimeException("Unmapped source category: {$source}"),
};
}
/** @return array{0: string, 1: string} */
function smallApplianceCategory(string $name): array
{
return match (true) {
preg_match('/^(Cafetera|Pava eléctrica|Tostadora)/iu', $name) === 1 => ['Electrodomésticos', 'Café y Desayuno'],
preg_match('/^(Freidora|Waflera|Pochoclera)/iu', $name) === 1 => ['Electrodomésticos', 'Freidoras y Cocción'],
preg_match('/^(Secador|Cortacabello|Cortabarba)/iu', $name) === 1 => ['Electrodomésticos', 'Cuidado Personal'],
preg_match('/^(Lustraspiradora|Plancha)/iu', $name) === 1 => ['Electrodomésticos', 'Limpieza y Planchado'],
default => ['Electrodomésticos', 'Preparación de Alimentos'],
};
}
function productBrand(string $name): ?string
{
if (preg_match('/\bJC\b/u', $name)) {
return 'Jean Cartier';
}
if (mb_stripos($name, 'Liliana') !== false) {
return 'Liliana';
}
foreach ([
'Rosario Central', 'Jean Cartier', 'King Koil', 'Fire Bird', 'Xtrike Me',
'Whitenblack', 'Electrolux', 'Kavanagh', 'Pelopincho', 'Suavegom',
'Motorola', 'Samsung', 'Xiaomi', 'Moulinex', 'Peabody', 'Philips',
'Florencia', 'Kohinoor', 'Inducol', 'Longvie', 'Stanley', 'Noblex',
'Moonki', 'Lenovo', 'Piero', 'Eskabe', 'Oster', 'Drean', 'Gafa', 'Atma',
'Spar', 'Stark', 'Venzo', 'Havit', 'Acer', 'ASUS', 'MSI', 'Philco',
'Gama', 'GIGO', 'Ross', 'Nakan', 'TCL', 'BGH', 'JBL', 'TST', 'GBS', 'BLU',
] as $brand) {
if (mb_stripos($name, $brand) !== false) {
return $brand;
}
}
return null;
}
/** @return array{key: string, name: string, values: array<string, string>}|null */
function variantGroup(string $name): ?array
{
$measure = bedMeasureValue($name);
$groups = [
'/(?:Kavanagh.*[Ss][ií]mil plumón reversible|[Ss][ií]mil plumón reversible.*Kavanagh)/iu' => ['acolchado-kavanagh-simil-plumon-reversible', 'Acolchado Kavanagh Símil Plumón Reversible'],
'/Edredón.*Lisboa/iu' => ['edredon-lisboa-jean-cartier', 'Edredón Lisboa Jean Cartier'],
'/Sense Dúo Bitono con corderito/iu' => ['acolchado-sense-duo-bitono-corderito', 'Acolchado Sense Dúo Bitono con Corderito'],
'/Frazada polar.*Kavanagh Premium Soft/iu' => ['frazada-kavanagh-premium-soft', 'Frazada Kavanagh Premium Soft'],
'/Kit Edredón.*Alaska.*corderito/iu' => ['kit-edredon-alaska-corderito', 'Kit Edredón Alaska con Corderito'],
'/Colch[oó]n Inducol Constanza/iu' => ['colchon-inducol-constanza', 'Colchón Inducol Constanza'],
];
foreach ($groups as $pattern => [$key, $itemName]) {
if ($measure !== null && preg_match($pattern, $name)) {
return [
'key' => $key,
'name' => $itemName,
'values' => ['medida_cama' => $measure],
];
}
}
if (preg_match('/Motorola G15\s+4\/(256|512)\s*GB/iu', $name, $match)) {
return [
'key' => 'motorola-g15',
'name' => 'Motorola G15',
'values' => [
'memoria_ram' => '4 GB',
'almacenamiento' => "{$match[1]} GB",
],
];
}
return null;
}
function bedMeasureValue(string $name): ?string
{
return match (true) {
preg_match('/\bcuna\b/iu', $name) === 1 => 'Cuna',
preg_match('/\bKing\b/iu', $name) === 1 => 'King',
preg_match('/\bQueen\b/iu', $name) === 1 => 'Queen',
preg_match('/2\s*1\/2\s*pl/iu', $name) === 1 => '2 1/2 Plazas',
preg_match('/1\s*1\/2\s*pl/iu', $name) === 1 => '1 1/2 Plazas',
preg_match('/1[,.]40\s*x?\s*1[,.]90|140x190|140x24/iu', $name) === 1 => '2 Plazas',
preg_match('/0[,.](80|90)\s*x?\s*1[,.]90|080x|090x|0,8x/iu', $name) === 1 => '1 Plaza',
default => null,
};
}
function compressCatalogImage(string $source, string $destination): void
{
$sourceImage = @imagecreatefromjpeg($source);
if ($sourceImage === false) {
throw new RuntimeException("Unable to read JPEG image: {$source}");
}
$width = imagesx($sourceImage);
$height = imagesy($sourceImage);
$scale = min(1, 1200 / max($width, $height));
$targetWidth = max(1, (int) round($width * $scale));
$targetHeight = max(1, (int) round($height * $scale));
$targetImage = imagecreatetruecolor($targetWidth, $targetHeight);
if ($targetImage === false) {
throw new RuntimeException("Unable to allocate image: {$source}");
}
imagefill($targetImage, 0, 0, imagecolorallocate($targetImage, 255, 255, 255));
imagecopyresampled(
$targetImage,
$sourceImage,
0,
0,
0,
0,
$targetWidth,
$targetHeight,
$width,
$height,
);
$destinationDirectory = dirname($destination);
if (! is_dir($destinationDirectory) && ! mkdir($destinationDirectory, 0777, true) && ! is_dir($destinationDirectory)) {
throw new RuntimeException("Unable to create directory: {$destinationDirectory}");
}
if (! imagewebp($targetImage, $destination, 82)) {
throw new RuntimeException("Unable to write WebP image: {$destination}");
}
}
$rawProducts = [];
$jsonFiles = glob($sourceRoot.'\\*\\*.json') ?: [];
sort($jsonFiles);
foreach ($jsonFiles as $jsonFile) {
$data = json_decode((string) file_get_contents($jsonFile), true, flags: JSON_THROW_ON_ERROR);
$sourceCategory = (string) $data['categoria']['slug'];
foreach ($data['productos'] as $product) {
[$parentCategory, $category] = catalogDestination($sourceCategory, $product['nombre']);
$images = [];
foreach ($product['imagenes'] as $relativeImage) {
$sourceImage = dirname($jsonFile).'/'.str_replace('/', DIRECTORY_SEPARATOR, $relativeImage);
$basename = pathinfo($relativeImage, PATHINFO_FILENAME).'.webp';
$publicRelativePath = "images/tennants/mutual_smep/catalog/{$sourceCategory}/{$basename}";
$destination = $projectRoot.'/public/'.$publicRelativePath;
compressCatalogImage($sourceImage, $destination);
$images[] = $publicRelativePath;
}
$rawProducts[] = [
'source_slug' => $product['slug'],
'name' => $product['nombre'],
'description' => $product['descripcion'] ?? null,
'price' => (float) $product['precio']['importe'],
'brand' => productBrand($product['nombre']),
'parent_category' => $parentCategory,
'category' => $category,
'images' => $images,
'variant_group' => variantGroup($product['nombre']),
];
}
}
$items = [];
foreach ($rawProducts as $product) {
$group = $product['variant_group'];
if ($group === null) {
$items[$product['source_slug']] = [
'slug' => $product['source_slug'],
'name' => $product['name'],
'description' => $product['description'],
'price' => $product['price'],
'stock' => $defaultStock,
'brand' => $product['brand'],
'parent_category' => $product['parent_category'],
'category' => $product['category'],
'images' => $product['images'],
'attribute_codes' => [],
'variants' => [],
];
continue;
}
$key = $group['key'];
if (! isset($items[$key])) {
$items[$key] = [
'slug' => $key,
'name' => $group['name'],
'description' => $product['description'],
'price' => $product['price'],
'stock' => null,
'brand' => $product['brand'],
'parent_category' => $product['parent_category'],
'category' => $product['category'],
'images' => [],
'attribute_codes' => [],
'variants' => [],
];
}
$items[$key]['price'] = min($items[$key]['price'], $product['price']);
$items[$key]['description'] ??= $product['description'];
$items[$key]['brand'] ??= $product['brand'];
$items[$key]['attribute_codes'] = array_values(array_unique([
...$items[$key]['attribute_codes'],
...array_keys($group['values']),
]));
$items[$key]['variants'][] = [
'source_slug' => $product['source_slug'],
'description' => $product['description'],
'price' => $product['price'],
'stock' => $defaultStock,
'values' => $group['values'],
'images' => $product['images'],
];
}
ksort($items);
$manifest = [
'version' => 1,
'tenant_code' => 'mutual_smep',
'default_stock' => $defaultStock,
'source_product_count' => count($rawProducts),
'catalog_item_count' => count($items),
'image_count' => array_sum(array_map(fn (array $product): int => count($product['images']), $rawProducts)),
'items' => array_values($items),
];
$manifestDirectory = dirname($manifestPath);
if (! is_dir($manifestDirectory) && ! mkdir($manifestDirectory, 0777, true) && ! is_dir($manifestDirectory)) {
throw new RuntimeException("Unable to create directory: {$manifestDirectory}");
}
file_put_contents(
$manifestPath,
json_encode($manifest, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_THROW_ON_ERROR).PHP_EOL,
);
echo json_encode([
'manifest' => $manifestPath,
'source_products' => count($rawProducts),
'catalog_items' => count($items),
'images' => $manifest['image_count'],
], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES), PHP_EOL;

View File

@@ -0,0 +1,368 @@
# Informe de carga del catálogo de Mutual SMEP
## Resumen ejecutivo
- Fuente analizada: `C:\Users\ncoronel\Documents\catalogo_smep_limpio`.
- Registros de producto: **150**.
- Imágenes asociadas: **511**.
- Resultado propuesto: **142 ítems de catálogo**.
- Registros absorbidos como variantes: **15**.
- Stock inicial transitorio: **10 unidades por producto o variante**.
- Productos sin descripción de origen: **104**.
- Productos con marca no identificable de forma segura: **1**.
## Criterio de representación en Shopit
Cada registro se carga bajo el tenant `mutual_smep`. Los productos físicos utilizan `type=standard`, `inventory_policy=tracked`, `has_tickets=false` e inventario inicial de 10 unidades. Las imágenes se convierten en attachments y conservan el orden del JSON.
Un registro marcado como **Producto simple** genera un `catalog_item` con inventario directo. Un registro marcado como **Variante** se integra en el ítem indicado y genera una variante con precio, inventario e imágenes propios. Los datos técnicos detectados en productos simples permanecen en el nombre o la descripción: no se transforman en selectores cuando el comprador no tiene una alternativa real para elegir.
Los precios se toman literalmente del JSON. No se inventan SKU, códigos de barras, costos ni stock real. El stock 10 es deliberadamente provisional.
Para los ítems agrupados, el precio base del `catalog_item` será el menor precio de sus variantes y cada variante conservará el precio exacto de su registro original. De este modo, la tarjeta del catálogo podrá mostrar el precio inicial sin perder las diferencias entre medidas o configuraciones.
## Orden recomendado de carga
1. Confirmar que existan el tenant, las categorías, las subcategorías y los cinco atributos de SMEP.
2. Crear o actualizar las marcas identificadas en este informe.
3. Crear primero los productos simples, sus inventarios con `real_stock=10` y sus imágenes.
4. Crear los productos agrupados, asociar sus atributos y generar una variante por cada registro indicado.
5. Crear un inventario independiente con `real_stock=10` para cada variante.
6. Subir cada imagen al almacenamiento del tenant y asociarla al producto o variante correspondiente, respetando el orden del JSON.
7. Crear el grupo paginado general del catálogo y seleccionar los productos destacados en una operación posterior.
La importación debe ejecutarse dentro de una transacción para los datos de catálogo. Los archivos subidos deben registrarse para poder eliminarlos si la operación falla, dado que el almacenamiento de objetos no participa de la transacción de base de datos.
## Marcas que deberían existir para la importación
Acer, ASUS, Atma, BGH, BLU, Drean, Electrolux, Eskabe, Fire Bird, Florencia, Gafa, Gama, GBS, GIGO, Havit, Inducol, JBL, Jean Cartier, Kavanagh, King Koil, Kohinoor, Lenovo, Liliana, Longvie, Moonki, Motorola, Moulinex, MSI, Nakan, Noblex, Oster, Peabody, Pelopincho, Philco, Philips, Piero, Ross, Samsung, Spar, Stanley, Stark, Suavegom, TCL, Venzo, Whitenblack, Xiaomi, Xtrike Me.
## Detalle producto por producto
### Bazar → Termos
| # | Producto de origen | Representación en Shopit | Marca | Atributos/datos | Precio | Stock | Imágenes | Descripción/observación |
|---:|---|---|---|---|---:|---:|---:|---|
| 1 | Termo Stanley 1 L Adventure Go-To con tapón | Producto simple (`termo-stanley-1-l-adventure-go-to-con-tapon`) | Stanley | — | $170.000,00 | 10 | 5 | Color sujeto a disponibilidad |
| 2 | Termo Stanley 800 ml Mate System classic | Producto simple (`termo-stanley-800-ml-mate-system-classic`) | Stanley | — | $160.000,00 | 10 | 4 | Color sujeto a disponibilidad |
| 3 | Termo Stanley 950 ml clásico con manija | Producto simple (`termo-stanley-950-ml-clasico-con-manija`) | Stanley | — | $155.000,00 | 10 | 2 | Color sujeto a disponibilidad |
### Bicicletas y Aire Libre → Bicicletas Infantiles
| # | Producto de origen | Representación en Shopit | Marca | Atributos/datos | Precio | Stock | Imágenes | Descripción/observación |
|---:|---|---|---|---|---:|---:|---:|---|
| 4 | BICI STARK R16 FLOWERS/PINK NENA C/ACC 6095 | Producto simple (`bici-stark-r16-flowers-pink-nena-c-acc-6095`) | Stark | rodado 16 (dato descriptivo, sin selector) | $320.000,00 | 10 | 1 | El color de los accesorios puede variar |
| 5 | BICI STARK R16 TEAM JUNIOR NENE 6064 | Producto simple (`bici-stark-r16-team-junior-nene-6064`) | Stark | rodado 16 (dato descriptivo, sin selector) | $300.000,00 | 10 | 2 | — |
### Bicicletas y Aire Libre → Bicicletas para Adultos
| # | Producto de origen | Representación en Shopit | Marca | Atributos/datos | Precio | Stock | Imágenes | Descripción/observación |
|---:|---|---|---|---|---:|---:|---:|---|
| 6 | BICICLETA FIRE BIRD R29 FRENIO DISCO | Producto simple (`bicicleta-fire-bird-r29-frenio-disco`) | Fire Bird | rodado 29 (dato descriptivo, sin selector) | $399.000,00 | 10 | 1 | — |
| 7 | BICICLETA PLAYERA ROSS FULL R26 | Producto simple (`bicicleta-playera-ross-full-r26`) | Ross | rodado 26 (dato descriptivo, sin selector) | $300.000,00 | 10 | 1 | — |
| 8 | BICICLETA VENZO LOKI R29 FD 21 V SHIMANO | Producto simple (`bicicleta-venzo-loki-r29-fd-21-v-shimano`) | Venzo | rodado 29 (dato descriptivo, sin selector) | $660.000,00 | 10 | 1 | — |
### Bicicletas y Aire Libre → Piletas
| # | Producto de origen | Representación en Shopit | Marca | Atributos/datos | Precio | Stock | Imágenes | Descripción/observación |
|---:|---|---|---|---|---:|---:|---:|---|
| 9 | Pileta Pelopincho 1010 | Producto simple (`pileta-pelopincho-1010`) | Pelopincho | — | $87.000,00 | 10 | 2 | — |
| 10 | Pileta Pelopincho 1020 | Producto simple (`pileta-pelopincho-1020`) | Pelopincho | — | $115.000,00 | 10 | 2 | — |
| 11 | Pileta Pelopincho 1030 | Producto simple (`pileta-pelopincho-1030`) | Pelopincho | — | $140.000,00 | 10 | 2 | — |
| 12 | Pileta Pelopincho 1043 | Producto simple (`pileta-pelopincho-1043`) | Pelopincho | — | $240.000,00 | 10 | 2 | — |
| 13 | Pileta Pelopincho 1055 | Producto simple (`pileta-pelopincho-1055`) | Pelopincho | — | $315.000,00 | 10 | 2 | — |
### Climatización → Aires Acondicionados
| # | Producto de origen | Representación en Shopit | Marca | Atributos/datos | Precio | Stock | Imágenes | Descripción/observación |
|---:|---|---|---|---|---:|---:|---:|---|
| 14 | Split 3300 W TCL TACA-3300FCSA frío/calor | Producto simple (`split-3300-w-tcl-taca-3300fcsa-frio-calor`) | TCL | — | $840.000,00 | 10 | 2 | — |
| 15 | Split BGH 5200 W BSH-52WCU frío/calor Silent Air 4300 frigorías | Producto simple (`split-bgh-5200-w-bsh-52wcu-frio-calor-silent-air-4300-frigorias`) | BGH | — | $1.200.000,00 | 10 | 4 | — |
### Climatización → Calefacción Eléctrica
| # | Producto de origen | Representación en Shopit | Marca | Atributos/datos | Precio | Stock | Imágenes | Descripción/observación |
|---:|---|---|---|---|---:|---:|---:|---|
| 16 | Calefactor de vidrio Whitenblack PVWB-01 Pie/Pared | Producto simple (`calefactor-de-vidrio-whitenblack-pvwb-01-pie-pared`) | Whitenblack | — | $100.000,00 | 10 | 2 | — |
| 17 | Calefactor infrarrojo Liliana Calore CI-080 fijo 1400 W | Producto simple (`calefactor-infrarrojo-liliana-calore-ci-080-fijo-1400-w`) | Liliana | — | $70.000,00 | 10 | 3 | — |
| 18 | Caloventor Liliana CFH417 Hotwind 2000 W | Producto simple (`caloventor-liliana-cfh417-hotwind-2000-w`) | Liliana | — | $58.000,00 | 10 | 6 | — |
| 19 | Caloventor Whitenblack CAWB-02 2000 W doble posición | Producto simple (`caloventor-whitenblack-cawb-02-2000-w-doble-posicion`) | Whitenblack | — | $46.000,00 | 10 | 2 | — |
| 20 | Caloventor split Liliana Whitenblack CPWB-01 2000 W | Producto simple (`caloventor-split-liliana-whitenblack-cpwb-01-2000-w`) | Liliana | — | $110.000,00 | 10 | 3 | — |
| 21 | Torre Liliana Tropic FTP-530 1500 W | Producto simple (`torre-liliana-tropic-ftp-530-1500-w`) | Liliana | — | $164.000,00 | 10 | 3 | — |
### Climatización → Calefactores a Gas con Salida
| # | Producto de origen | Representación en Shopit | Marca | Atributos/datos | Precio | Stock | Imágenes | Descripción/observación |
|---:|---|---|---|---|---:|---:|---:|---|
| 22 | Eskabe 3000 cal. S21 Tiro Balanceado sin termostato | Producto simple (`eskabe-3000-cal-s21-tiro-balanceado-sin-termostato`) | Eskabe | — | $430.000,00 | 10 | 3 | — |
| 23 | Eskabe 3000 cal. Tiro Balanceado con termostato | Producto simple (`eskabe-3000-cal-tiro-balanceado-con-termostato`) | Eskabe | — | $450.000,00 | 10 | 2 | — |
| 24 | Eskabe TT 2000 cal. Tiro Balanceado con termostato | Producto simple (`eskabe-tt-2000-cal-tiro-balanceado-con-termostato`) | Eskabe | — | $450.000,00 | 10 | 5 | — |
| 25 | Eskabe TT 3000 cal. Tiro Balanceado con termostato | Producto simple (`eskabe-tt-3000-cal-tiro-balanceado-con-termostato`) | Eskabe | — | $499.000,00 | 10 | 3 | — |
| 26 | Longvie EBA2S 2000 cal. Tiro Balanceado | Producto simple (`longvie-eba2s-2000-cal-tiro-balanceado`) | Longvie | — | $280.000,00 | 10 | 3 | — |
| 27 | Longvie EBA3S 3000 cal. Tiro Balanceado | Producto simple (`longvie-eba3s-3000-cal-tiro-balanceado`) | Longvie | — | $420.000,00 | 10 | 4 | — |
### Climatización → Calefactores a Gas sin Salida
| # | Producto de origen | Representación en Shopit | Marca | Atributos/datos | Precio | Stock | Imágenes | Descripción/observación |
|---:|---|---|---|---|---:|---:|---:|---|
| 28 | Eskabe 3000 cal. S21 MX3 sin salida | Producto simple (`eskabe-3000-cal-s21-mx3-sin-salida`) | Eskabe | — | $290.000,00 | 10 | 3 | Color marfil |
| 29 | Longvie ECA-3KV 3200 cal. Infr visor grafito sin salida | Producto simple (`longvie-eca-3kv-3200-cal-infr-visor-grafito-sin-salida`) | Longvie | — | $300.000,00 | 10 | 4 | — |
### Dormitorio y Blanco → Acolchados y Edredones
| # | Producto de origen | Representación en Shopit | Marca | Atributos/datos | Precio | Stock | Imágenes | Descripción/observación |
|---:|---|---|---|---|---:|---:|---:|---|
| 30 | Acolchado 1 1/2 pl Dobby Kavanagh negro | Producto simple (`acolchado-1-1-2-pl-dobby-kavanagh-negro`) | Kavanagh | medida 1 1/2 Plazas (dato descriptivo, sin selector) | $82.000,00 | 10 | 1 | — |
| 31 | Acolchado 1 1/2 pl Kavanagh Simil plumón reversible | Variante de **Acolchado Kavanagh Símil Plumón Reversible** (`acolchado-kavanagh-simil-plumon-reversible`) | Kavanagh | medida_cama=1 1/2 Plazas | $86.000,00 | 10 | 1 | — |
| 32 | Acolchado 1 1/2 pl Sense Dúo Bitono con corderito JC | Variante de **Acolchado Sense Dúo Bitono con Corderito** (`acolchado-sense-duo-bitono-corderito`) | Jean Cartier | medida_cama=1 1/2 Plazas | $70.000,00 | 10 | 3 | Color sujeto a disponibilidad |
| 33 | Acolchado King Kavanagh Simil plumón con 2 fundas almohadón | Producto simple (`acolchado-king-kavanagh-simil-plumon-con-2-fundas-almohadon`) | Kavanagh | medida King (dato descriptivo, sin selector) | $130.000,00 | 10 | 1 | — |
| 34 | Acolchado King Kavanagh Simil plumón reversible | Variante de **Acolchado Kavanagh Símil Plumón Reversible** (`acolchado-kavanagh-simil-plumon-reversible`) | Kavanagh | medida_cama=King | $125.000,00 | 10 | 1 | — |
| 35 | Acolchado King Sense Dúo Bitono con corderito JC | Variante de **Acolchado Sense Dúo Bitono con Corderito** (`acolchado-sense-duo-bitono-corderito`) | Jean Cartier | medida_cama=King | $100.000,00 | 10 | 3 | Color sujeto a disponibilidad |
| 36 | Acolchado Queen Hotel Oxford Platinum 700 H JC | Producto simple (`acolchado-queen-hotel-oxford-platinum-700-h-jc`) | Jean Cartier | medida Queen (dato descriptivo, sin selector) | $100.000,00 | 10 | 2 | Color sujeto a disponibilidad |
| 37 | Acolchado Queen simil plumón reversible Kavanagh | Variante de **Acolchado Kavanagh Símil Plumón Reversible** (`acolchado-kavanagh-simil-plumon-reversible`) | Kavanagh | medida_cama=Queen | $100.000,00 | 10 | 2 | Color sujeto a disponibilidad |
| 38 | Edredón 1 1/2 pl Lisboa JC | Variante de **Edredón Lisboa Jean Cartier** (`edredon-lisboa-jean-cartier`) | Jean Cartier | medida_cama=1 1/2 Plazas | $90.000,00 | 10 | 1 | — |
| 39 | Edredón 1 1/2 pl Londres JC | Producto simple (`edredon-1-1-2-pl-londres-jc`) | Jean Cartier | medida 1 1/2 Plazas (dato descriptivo, sin selector) | $50.000,00 | 10 | 2 | Color sujeto a disponibilidad |
| 40 | Edredón 2 1/2 pl Lisboa JC | Variante de **Edredón Lisboa Jean Cartier** (`edredon-lisboa-jean-cartier`) | Jean Cartier | medida_cama=2 1/2 Plazas | $120.000,00 | 10 | 2 | Color sujeto a disponibilidad |
| 41 | Kit Acolchado Queen Zúrich + 2 fundas almohadón JC | Producto simple (`kit-acolchado-queen-zurich-2-fundas-almohadon-jc`) | Jean Cartier | medida Queen (dato descriptivo, sin selector) | $80.000,00 | 10 | 2 | Color sujeto a disponibilidad |
| 42 | Kit Edredón 2 1/2 pl. Alaska c/corderito JC + 2 fundas almohadones | Variante de **Kit Edredón Alaska con Corderito** (`kit-edredon-alaska-corderito`) | Jean Cartier | medida_cama=2 1/2 Plazas | $130.000,00 | 10 | 3 | Color sujeto a disponibilidad |
| 43 | Kit Edredón King Alaska c/corderito + 2 fundas almohadones | Variante de **Kit Edredón Alaska con Corderito** (`kit-edredon-alaska-corderito`) | Pendiente de identificar | medida_cama=King | $160.000,00 | 10 | 1 | Para colchón 2 x 2 |
### Dormitorio y Blanco → Bases y Sommiers
| # | Producto de origen | Representación en Shopit | Marca | Atributos/datos | Precio | Stock | Imágenes | Descripción/observación |
|---:|---|---|---|---|---:|---:|---:|---|
| 44 | Sommier Inducol 0,80x1,90 | Producto simple (`sommier-inducol-0-80x1-90`) | Inducol | medida 1 Plaza (dato descriptivo, sin selector) | $180.000,00 | 10 | 2 | — |
| 45 | Sommier King Koil Elite Contour 140x190 | Producto simple (`sommier-king-koil-elite-contour-140x190`) | King Koil | medida King (dato descriptivo, sin selector) | $260.000,00 | 10 | 3 | Ideal para armar el conjunto con el Colchón Inducol Vinson Espuma. Color sujeto a disponibilidad. |
| 46 | Sommier Piero Legrand 140x190x020 | Producto simple (`sommier-piero-legrand-140x190x020`) | Piero | medida 2 Plazas (dato descriptivo, sin selector) | $280.000,00 | 10 | 2 | — |
| 47 | Sommier Piero Paraíso 0,90x1,90x0,20 | Producto simple (`sommier-piero-paraiso-0-90x1-90x0-20`) | Piero | medida 1 Plaza (dato descriptivo, sin selector) | $200.000,00 | 10 | 2 | Base de sommier Piero para colchón de 0,90x1,90 |
### Dormitorio y Blanco → Colchones
| # | Producto de origen | Representación en Shopit | Marca | Atributos/datos | Precio | Stock | Imágenes | Descripción/observación |
|---:|---|---|---|---|---:|---:|---:|---|
| 48 | COLCHON PIERO RESORTE CORONA REAL 0,8X1,90X0,26 | Producto simple (`colchon-piero-resorte-corona-real-0-8x1-90x0-26`) | Piero | medida 1 Plaza (dato descriptivo, sin selector) | $325.000,00 | 10 | 3 | — |
| 49 | Colchon Inducol Constanza Espuma Alta Densidad 080x24 | Variante de **Colchón Inducol Constanza** (`colchon-inducol-constanza`) | Inducol | medida_cama=1 Plaza | $280.000,00 | 10 | 2 | — |
| 50 | Colchón Espuma Inducol Aurelia 0,80x1,90x0,20 | Producto simple (`colchon-espuma-inducol-aurelia-0-80x1-90x0-20`) | Inducol | medida 1 Plaza (dato descriptivo, sin selector) | $175.000,00 | 10 | 1 | — |
| 51 | Colchón Inducol Constanza Espuma Alta Densidad 1,40x1,90x0,24 | Variante de **Colchón Inducol Constanza** (`colchon-inducol-constanza`) | Inducol | medida_cama=2 Plazas | $475.000,00 | 10 | 2 | — |
| 52 | Colchón King Koil G22 Espuma Alta Densidad 1,40x1,90x0,24 | Producto simple (`colchon-king-koil-g22-espuma-alta-densidad-1-40x1-90x0-24`) | King Koil | medida King (dato descriptivo, sin selector) | $347.000,00 | 10 | 7 | Viene en bolsa, fácil traslado. El fabricante recomienda esperar 24hs luego de desenrollado para comenzar a usarse. |
| 53 | Colchón King Koil resortes Bradley 080x190x026 | Producto simple (`colchon-king-koil-resortes-bradley-080x190x026`) | King Koil | medida King (dato descriptivo, sin selector) | $400.000,00 | 10 | 5 | — |
| 54 | Colchón Piero Body Matelasse Espuma Media Densidad 0,90x1,90x0,20 | Producto simple (`colchon-piero-body-matelasse-espuma-media-densidad-0-90x1-90x0-20`) | Piero | medida 1 Plaza (dato descriptivo, sin selector) | $300.000,00 | 10 | 2 | — |
| 55 | Colchón Suavegom Espuma Merit Doble Pillow 140x190x029 | Producto simple (`colchon-suavegom-espuma-merit-doble-pillow-140x190x029`) | Suavegom | medida 2 Plazas (dato descriptivo, sin selector) | $650.000,00 | 10 | 3 | Color sujeto a disponibilidad |
### Dormitorio y Blanco → Frazadas y Mantas
| # | Producto de origen | Representación en Shopit | Marca | Atributos/datos | Precio | Stock | Imágenes | Descripción/observación |
|---:|---|---|---|---|---:|---:|---:|---|
| 56 | Frazada 2 1/2 pl Sherpa doble corderito y polar JC | Producto simple (`frazada-2-1-2-pl-sherpa-doble-corderito-y-polar-jc`) | Jean Cartier | medida 2 1/2 Plazas (dato descriptivo, sin selector) | $70.000,00 | 10 | 1 | Color sujeto a disponibilidad |
| 57 | Frazada polar 1 1/2 pl Kavanagh Premium Soft | Variante de **Frazada Kavanagh Premium Soft** (`frazada-kavanagh-premium-soft`) | Kavanagh | medida_cama=1 1/2 Plazas | $47.000,00 | 10 | 1 | — |
| 58 | Frazada polar King Kavanagh Premium Soft | Variante de **Frazada Kavanagh Premium Soft** (`frazada-kavanagh-premium-soft`) | Kavanagh | medida_cama=King | $72.000,00 | 10 | 1 | Color sujeto a disponibilidad |
| 59 | Manta simil piel de conejo con reverso aterciopelado Jean Cartier | Producto simple (`manta-simil-piel-de-conejo-con-reverso-aterciopelado-jean-cartier`) | Jean Cartier | — | $50.000,00 | 10 | 1 | Color sujeto a disponibilidad |
### Dormitorio y Blanco → Infantil y Cuna
| # | Producto de origen | Representación en Shopit | Marca | Atributos/datos | Precio | Stock | Imágenes | Descripción/observación |
|---:|---|---|---|---|---:|---:|---:|---|
| 60 | Set Cuna de 6 piezas Acolchado + Sabanas Arcoiris multicolor JC | Producto simple (`set-cuna-de-6-piezas-acolchado-sabanas-arcoiris-multicolor-jc`) | Jean Cartier | medida Cuna (dato descriptivo, sin selector) | $50.000,00 | 10 | 1 | — |
### Electrodomésticos → Café y Desayuno
| # | Producto de origen | Representación en Shopit | Marca | Atributos/datos | Precio | Stock | Imágenes | Descripción/observación |
|---:|---|---|---|---|---:|---:|---:|---|
| 61 | Cafetera Atma CA-8182P digital 1000 W 1,8 L | Producto simple (`cafetera-atma-ca-8182p-digital-1000-w-1-8-l`) | Atma | — | $85.000,00 | 10 | 3 | — |
| 62 | Cafetera Express Atma CEAT-5418P 1 Litro | Producto simple (`cafetera-express-atma-ceat-5418p-1-litro`) | Atma | — | $275.000,00 | 10 | 10 | — |
| 63 | Cafetera Express Liliana AC-980 3 en 1 | Producto simple (`cafetera-express-liliana-ac-980-3-en-1`) | Liliana | — | $310.000,00 | 10 | 8 | — |
| 64 | Cafetera Moulinex mini me Dolce cápsulas | Producto simple (`cafetera-moulinex-mini-me-dolce-capsulas`) | Moulinex | — | $230.000,00 | 10 | 3 | — |
| 65 | Pava eléctrica Atma PE-0821AP/NAP 1,7 L | Producto simple (`pava-electrica-atma-pe-0821ap-nap-1-7-l`) | Atma | — | $40.000,00 | 10 | 3 | — |
| 66 | Pava eléctrica Atma PED23MP Disney vintage | Producto simple (`pava-electrica-atma-ped23mp-disney-vintage`) | Atma | — | $90.000,00 | 10 | 5 | — |
| 67 | Pava eléctrica GIGO G-17898 SD 1,7 L Digital cromada | Producto simple (`pava-electrica-gigo-g-17898-sd-1-7-l-digital-cromada`) | GIGO | — | $76.000,00 | 10 | 6 | — |
| 68 | Pava eléctrica Liliana AP-165 matera color negra | Producto simple (`pava-electrica-liliana-ap-165-matera-color-negra`) | Liliana | — | $59.000,00 | 10 | 4 | — |
| 69 | Pava eléctrica Liliana AP-200 Infustyle 1,7 L | Producto simple (`pava-electrica-liliana-ap-200-infustyle-1-7-l`) | Liliana | — | $85.000,00 | 10 | 5 | — |
| 70 | Tostadora Atma TOAT-21VCP Vintage color crema | Producto simple (`tostadora-atma-toat-21vcp-vintage-color-crema`) | Atma | — | $60.000,00 | 10 | 4 | — |
| 71 | Tostadora Oster TR500 Acero Inoxidable | Producto simple (`tostadora-oster-tr500-acero-inoxidable`) | Oster | — | $84.000,00 | 10 | 4 | — |
### Electrodomésticos → Calefones y Termotanques
| # | Producto de origen | Representación en Shopit | Marca | Atributos/datos | Precio | Stock | Imágenes | Descripción/observación |
|---:|---|---|---|---|---:|---:|---:|---|
| 72 | Calefón Longvie 14 L CN-514 SS-N Enc. Sensor | Producto simple (`calefon-longvie-14-l-cn-514-ss-n-enc-sensor`) | Longvie | — | $690.000,00 | 10 | 1 | — |
### Electrodomésticos → Cocinas
| # | Producto de origen | Representación en Shopit | Marca | Atributos/datos | Precio | Stock | Imágenes | Descripción/observación |
|---:|---|---|---|---|---:|---:|---:|---|
| 73 | Cocina Florencia 5536-F 56 cm color Blanca | Producto simple (`cocina-florencia-5536-f-56-cm-color-blanca`) | Florencia | — | $620.000,00 | 10 | 4 | Multigas |
| 74 | Cocina Longvie 13331BF 56 cm color blanca | Producto simple (`cocina-longvie-13331bf-56-cm-color-blanca`) | Longvie | — | $940.000,00 | 10 | 7 | Multigas |
| 75 | Cocina Longvie 13331XF 56cm Acero inoxidable | Producto simple (`cocina-longvie-13331xf-56cm-acero-inoxidable`) | Longvie | — | $999.000,00 | 10 | 3 | — |
| 76 | Cocina Longvie 13501BF 56 cm color Blanca | Producto simple (`cocina-longvie-13501bf-56-cm-color-blanca`) | Longvie | — | $1.100.000,00 | 10 | 5 | Multigas |
### Electrodomésticos → Cuidado Personal
| # | Producto de origen | Representación en Shopit | Marca | Atributos/datos | Precio | Stock | Imágenes | Descripción/observación |
|---:|---|---|---|---|---:|---:|---:|---|
| 77 | Cortabarba Philips BT-7201 | Producto simple (`cortabarba-philips-bt-7201`) | Philips | — | $70.000,00 | 10 | 3 | — |
| 78 | Cortacabello Philips QC 5560 8 Posiciones | Producto simple (`cortacabello-philips-qc-5560-8-posiciones`) | Philips | — | $45.000,00 | 10 | 3 | — |
| 79 | Secador cabello Atma SP-8970 Classic 3 Velocidades | Producto simple (`secador-cabello-atma-sp-8970-classic-3-velocidades`) | Atma | — | $60.000,00 | 10 | 2 | — |
| 80 | Secador cabello Gama 9465 Brillant Blue Titanium | Producto simple (`secador-cabello-gama-9465-brillant-blue-titanium`) | Gama | — | $120.000,00 | 10 | 3 | — |
| 81 | Secador cabello Philips BHD-302/10 1600 W | Producto simple (`secador-cabello-philips-bhd-302-10-1600-w`) | Philips | — | $110.000,00 | 10 | 3 | — |
### Electrodomésticos → Freidoras y Cocción
| # | Producto de origen | Representación en Shopit | Marca | Atributos/datos | Precio | Stock | Imágenes | Descripción/observación |
|---:|---|---|---|---|---:|---:|---:|---|
| 82 | Freidora de aire Peabody PE-AFD420N 4,2 L digital | Producto simple (`freidora-de-aire-peabody-pe-afd420n-4-2-l-digital`) | Peabody | — | $115.000,00 | 10 | 8 | — |
| 83 | Freidora de aire Peabody PE-AFG03N 7 L Grill | Producto simple (`freidora-de-aire-peabody-pe-afg03n-7-l-grill`) | Peabody | — | $260.000,00 | 10 | 5 | — |
| 84 | Pochoclera Atma PO-AT9801DNP Disney Mickey | Producto simple (`pochoclera-atma-po-at9801dnp-disney-mickey`) | Atma | — | $64.000,00 | 10 | 5 | — |
| 85 | Waflera Atma WS-027DRN disney 2 en 1 | Producto simple (`waflera-atma-ws-027drn-disney-2-en-1`) | Atma | — | $64.000,00 | 10 | 10 | — |
### Electrodomésticos → Heladeras
| # | Producto de origen | Representación en Shopit | Marca | Atributos/datos | Precio | Stock | Imágenes | Descripción/observación |
|---:|---|---|---|---|---:|---:|---:|---|
| 86 | Heladera Gafa HGF 358 AFB 282 LITROS BLANCA | Producto simple (`heladera-gafa-hgf-358-afb-282-litros-blanca`) | Gafa | — | $780.000,00 | 10 | 4 | — |
| 87 | Heladera Gafa HGF 388 AFB 374 LITROS BLANCA | Producto simple (`heladera-gafa-hgf-388-afb-374-litros-blanca`) | Gafa | — | $950.000,00 | 10 | 5 | — |
| 88 | Heladera Gafa HGF-368AFP 330 LT color plata | Producto simple (`heladera-gafa-hgf-368afp-330-lt-color-plata`) | Gafa | — | $910.000,00 | 10 | 5 | — |
| 89 | Heladera No Frost Gafa HGNF333P Inverter 356 L plata | Producto simple (`heladera-no-frost-gafa-hgnf333p-inverter-356-l-plata`) | Gafa | — | $950.000,00 | 10 | 7 | — |
### Electrodomésticos → Hornos Eléctricos
| # | Producto de origen | Representación en Shopit | Marca | Atributos/datos | Precio | Stock | Imágenes | Descripción/observación |
|---:|---|---|---|---|---:|---:|---:|---|
| 90 | Horno Eléctrico 25L BGH BHE-25M25I Dúo negro | Producto simple (`horno-electrico-25l-bgh-bhe-25m25i-duo-negro`) | BGH | — | $145.000,00 | 10 | 3 | — |
| 91 | Horno eléctrico Atma Grill 40 litros c/2 anafes HG-4022API | Producto simple (`horno-electrico-atma-grill-40-litros-c-2-anafes-hg-4022api`) | Atma | — | $250.000,00 | 10 | 6 | — |
### Electrodomésticos → Lavarropas y Secarropas
| # | Producto de origen | Representación en Shopit | Marca | Atributos/datos | Precio | Stock | Imágenes | Descripción/observación |
|---:|---|---|---|---|---:|---:|---:|---|
| 92 | Lavarropas automático Drean Concept 5.05 V1 5 Kg 500 rpm | Producto simple (`lavarropas-automatico-drean-concept-5-05-v1-5-kg-500-rpm`) | Drean | — | $650.000,00 | 10 | 5 | Carga superior |
| 93 | Lavarropas automático Gafa Fuzzy Fit 7 kg 760 rpm color blanco | Producto simple (`lavarropas-automatico-gafa-fuzzy-fit-7-kg-760-rpm-color-blanco`) | Gafa | — | $650.000,00 | 10 | 6 | Carga superior |
| 94 | Lavarropas automático Philco PHLF-6510B2 6,5 KG 1000 rpm blanco | Producto simple (`lavarropas-automatico-philco-phlf-6510b2-6-5-kg-1000-rpm-blanco`) | Philco | — | $600.000,00 | 10 | 6 | — |
| 95 | Lavarropas automático Samsung WW65 6,5 Kg 1000 rpm blanco | Producto simple (`lavarropas-automatico-samsung-ww65-6-5-kg-1000-rpm-blanco`) | Samsung | — | $920.000,00 | 10 | 5 | Carga frontal |
| 96 | Secarropas Kohinoor A-665 acero inoxidable 6,5 Kg | Producto simple (`secarropas-kohinoor-a-665-acero-inoxidable-6-5-kg`) | Kohinoor | — | $300.000,00 | 10 | 3 | — |
### Electrodomésticos → Limpieza y Planchado
| # | Producto de origen | Representación en Shopit | Marca | Atributos/datos | Precio | Stock | Imágenes | Descripción/observación |
|---:|---|---|---|---|---:|---:|---:|---|
| 97 | Lustraspiradora Liliana espejo LL350 850 W | Producto simple (`lustraspiradora-liliana-espejo-ll350-850-w`) | Liliana | — | $210.000,00 | 10 | 3 | — |
| 98 | Plancha vapor Philips GC-1022/40 2000 W | Producto simple (`plancha-vapor-philips-gc-1022-40-2000-w`) | Philips | — | $91.000,00 | 10 | 3 | — |
### Electrodomésticos → Microondas
| # | Producto de origen | Representación en Shopit | Marca | Atributos/datos | Precio | Stock | Imágenes | Descripción/observación |
|---:|---|---|---|---|---:|---:|---:|---|
| 99 | Microondas BGH 28 L BGH B-228DS20I Plata Digital con grill | Producto simple (`microondas-bgh-28-l-bgh-b-228ds20i-plata-digital-con-grill`) | BGH | — | $350.000,00 | 10 | 3 | — |
| 100 | Microondas Samsung MG23 F3K3TAK 23 litros Grill color negro | Producto simple (`microondas-samsung-mg23-f3k3tak-23-litros-grill-color-negro`) | Samsung | — | $335.000,00 | 10 | 7 | — |
### Electrodomésticos → Preparación de Alimentos
| # | Producto de origen | Representación en Shopit | Marca | Atributos/datos | Precio | Stock | Imágenes | Descripción/observación |
|---:|---|---|---|---|---:|---:|---:|---|
| 101 | Batidora de mano Oster HM 2600 negra | Producto simple (`batidora-de-mano-oster-hm-2600-negra`) | Oster | — | $97.000,00 | 10 | 3 | — |
| 102 | Batidora planetaria Atma BPAT21WP | Producto simple (`batidora-planetaria-atma-bpat21wp`) | Atma | — | $225.000,00 | 10 | 6 | — |
| 103 | Exprimidor eléctrico Liliana AE-920 Citrijug 40 W | Producto simple (`exprimidor-electrico-liliana-ae-920-citrijug-40-w`) | Liliana | — | $35.000,00 | 10 | 3 | — |
| 104 | Juguera Liliana AJ-950 Nutrijug vaso 350 ml 2 velocidades | Producto simple (`juguera-liliana-aj-950-nutrijug-vaso-350-ml-2-velocidades`) | Liliana | — | $120.000,00 | 10 | 3 | — |
| 105 | Licuadora Electrolux SBA10 personal 600 ml | Producto simple (`licuadora-electrolux-sba10-personal-600-ml`) | Electrolux | — | $75.000,00 | 10 | 3 | — |
| 106 | Mixer Liliana AH-300 450 W + Vaso | Producto simple (`mixer-liliana-ah-300-450-w-vaso`) | Liliana | — | $56.000,00 | 10 | 2 | — |
| 107 | Mixer Liliana Rainbow Mix AH-101/2/3 + Vaso medidor | Producto simple (`mixer-liliana-rainbow-mix-ah-101-2-3-vaso-medidor`) | Liliana | — | $67.000,00 | 10 | 2 | — |
| 108 | Mixer Philips HR-2531/50 Promix 400 W + Vaso | Producto simple (`mixer-philips-hr-2531-50-promix-400-w-vaso`) | Philips | — | $83.000,00 | 10 | 7 | — |
| 109 | Multiprocesadora Liliana AM-700 Simplix 700 W | Producto simple (`multiprocesadora-liliana-am-700-simplix-700-w`) | Liliana | — | $137.000,00 | 10 | 3 | — |
| 110 | Picadora Moulinex AD-6011AR 750 W Blanca | Producto simple (`picadora-moulinex-ad-6011ar-750-w-blanca`) | Moulinex | — | $98.000,00 | 10 | 7 | — |
| 111 | Yogurtera Atma YM3010P 7 porciones | Producto simple (`yogurtera-atma-ym3010p-7-porciones`) | Atma | — | $65.000,00 | 10 | 5 | — |
### Electrodomésticos → Purificadores y Extractores de Cocina
| # | Producto de origen | Representación en Shopit | Marca | Atributos/datos | Precio | Stock | Imágenes | Descripción/observación |
|---:|---|---|---|---|---:|---:|---:|---|
| 112 | Purificador Spar Bios 3766-BOO color blanco | Producto simple (`purificador-spar-bios-3766-boo-color-blanco`) | Spar | — | $200.000,00 | 10 | 3 | 1 motor |
| 113 | Purificador Tst #360-60 Estratto acero inox. 60 cm | Producto simple (`purificador-tst-360-60-estratto-acero-inox-60-cm`) | Acer | — | $200.000,00 | 10 | 2 | — |
### Tecnología → Accesorios de Computación
| # | Producto de origen | Representación en Shopit | Marca | Atributos/datos | Precio | Stock | Imágenes | Descripción/observación |
|---:|---|---|---|---|---:|---:|---:|---|
| 114 | Mouse Xtrike Me Backlit | Producto simple (`mouse-xtrike-me-backlit`) | Xtrike Me | — | $12.000,00 | 10 | 1 | — |
| 115 | Teclado Xtrike Me Rainbow mecánico | Producto simple (`teclado-xtrike-me-rainbow-mecanico`) | Xtrike Me | — | $40.000,00 | 10 | 1 | — |
### Tecnología → Audio
| # | Producto de origen | Representación en Shopit | Marca | Atributos/datos | Precio | Stock | Imágenes | Descripción/observación |
|---:|---|---|---|---|---:|---:|---:|---|
| 116 | Auricular BT negro on ear Moonki sound MH-0510BT | Producto simple (`auricular-bt-negro-on-ear-moonki-sound-mh-0510bt`) | Moonki | — | $30.000,00 | 10 | 3 | Color sujeto a disponibilidad |
| 117 | Auricular Moonki Earbuds sound MA-TWS66 black | Producto simple (`auricular-moonki-earbuds-sound-ma-tws66-black`) | Moonki | — | $16.000,00 | 10 | 5 | — |
| 118 | Auricular on ear Moonki sound MH-0613 | Producto simple (`auricular-on-ear-moonki-sound-mh-0613`) | Moonki | — | $15.000,00 | 10 | 4 | Color sujeto a disponibilidad |
| 119 | Bafle Havit Bluetooth SK-816BT | Producto simple (`bafle-havit-bluetooth-sk-816bt`) | Havit | — | $145.000,00 | 10 | 1 | — |
| 120 | Parlante JBL GO 4 Bluetooth altavoz ultraportátil | Producto simple (`parlante-jbl-go-4-bluetooth-altavoz-ultraportatil`) | JBL | — | $97.000,00 | 10 | 2 | Color sujeto a disponibilidad |
### Tecnología → Celulares
| # | Producto de origen | Representación en Shopit | Marca | Atributos/datos | Precio | Stock | Imágenes | Descripción/observación |
|---:|---|---|---|---|---:|---:|---:|---|
| 121 | BLU G73 128 GB | Producto simple (`blu-g73-128-gb`) | BLU | almacenamiento 128 GB (dato descriptivo, sin selector) | $225.000,00 | 10 | 3 | Color sujeto a disponibilidad |
| 122 | MOTOROLA G15 4/512 GB | Variante de **Motorola G15** (`motorola-g15`) | Motorola | memoria_ram=4 GB; almacenamiento=512 GB | $430.000,00 | 10 | 2 | Color sujeto a disponibilidad |
| 123 | Motorola G15 4/256 GB | Variante de **Motorola G15** (`motorola-g15`) | Motorola | memoria_ram=4 GB; almacenamiento=256 GB | $330.000,00 | 10 | 3 | Color sujeto a disponibilidad |
| 124 | Motorola G35 4/256 GB | Producto simple (`motorola-g35-4-256-gb`) | Motorola | RAM 4 GB; almacenamiento 256 GB (dato descriptivo, sin selector) | $410.000,00 | 10 | 4 | Color sujeto a disponibilidad |
| 125 | SAMSUNG A17 4/128 GB | Producto simple (`samsung-a17-4-128-gb`) | Samsung | RAM 4 GB; almacenamiento 128 GB (dato descriptivo, sin selector) | $390.000,00 | 10 | 3 | Color sujeto a disponibilidad |
| 126 | SAMSUNG A17 5G 8/256 GB | Producto simple (`samsung-a17-5g-8-256-gb`) | Samsung | RAM 8 GB; almacenamiento 256 GB (dato descriptivo, sin selector) | $620.000,00 | 10 | 3 | Color sujeto a disponibilidad |
| 127 | SAMSUNG A26 5G 8/256 GB | Producto simple (`samsung-a26-5g-8-256-gb`) | Samsung | RAM 8 GB; almacenamiento 256 GB (dato descriptivo, sin selector) | $650.000,00 | 10 | 3 | Color sujeto a disponibilidad |
| 128 | Samsung A07 4/128 GB | Producto simple (`samsung-a07-4-128-gb`) | Samsung | RAM 4 GB; almacenamiento 128 GB (dato descriptivo, sin selector) | $310.000,00 | 10 | 3 | Color sujeto a disponibilidad |
| 129 | Samsung A36 5G 8/256 GB | Producto simple (`samsung-a36-5g-8-256-gb`) | Samsung | RAM 8 GB; almacenamiento 256 GB (dato descriptivo, sin selector) | $780.000,00 | 10 | 5 | Color sujeto a disponibilidad |
| 130 | Samsung A56 5G 8/256 GB | Producto simple (`samsung-a56-5g-8-256-gb`) | Samsung | RAM 8 GB; almacenamiento 256 GB (dato descriptivo, sin selector) | $920.000,00 | 10 | 3 | — |
| 131 | Samsung Galaxy A16 4/128 GB | Producto simple (`samsung-galaxy-a16-4-128-gb`) | Samsung | RAM 4 GB; almacenamiento 128 GB (dato descriptivo, sin selector) | $340.000,00 | 10 | 6 | Color sujeto a disponibilidad |
| 132 | XIAOMI POCO C85 8/256 GB | Producto simple (`xiaomi-poco-c85-8-256-gb`) | Xiaomi | RAM 8 GB; almacenamiento 256 GB (dato descriptivo, sin selector) | $430.000,00 | 10 | 3 | Color sujeto a disponibilidad |
| 133 | XIAOMI POCO M7 8/256 GB | Producto simple (`xiaomi-poco-m7-8-256-gb`) | Xiaomi | RAM 8 GB; almacenamiento 256 GB (dato descriptivo, sin selector) | $420.000,00 | 10 | 3 | Color sujeto a disponibilidad |
| 134 | Xiaomi Redmi 15C 8/256 GB | Producto simple (`xiaomi-redmi-15c-8-256-gb`) | Xiaomi | RAM 8 GB; almacenamiento 256 GB (dato descriptivo, sin selector) | $380.000,00 | 10 | 2 | Color sujeto a disponibilidad |
| 135 | Xiaomi Redmi Note 14 Pro 5G 8/256 GB | Producto simple (`xiaomi-redmi-note-14-pro-5g-8-256-gb`) | Xiaomi | RAM 8 GB; almacenamiento 256 GB (dato descriptivo, sin selector) | $630.000,00 | 10 | 6 | Color sujeto a disponibilidad |
| 136 | Xiaomi Redmi Note 15 8/256 GB | Producto simple (`xiaomi-redmi-note-15-8-256-gb`) | Xiaomi | RAM 8 GB; almacenamiento 256 GB (dato descriptivo, sin selector) | $496.000,00 | 10 | 5 | Color sujeto a disponibilidad |
### Tecnología → Notebooks
| # | Producto de origen | Representación en Shopit | Marca | Atributos/datos | Precio | Stock | Imágenes | Descripción/observación |
|---:|---|---|---|---|---:|---:|---:|---|
| 137 | NOTEBOOK ASUS VIVOBOOK F1504VAP Intel Core 7 512GB SSD 8GB 15.6 Touch WIN 11 | Producto simple (`notebook-asus-vivobook-f1504vap-intel-core-7-512gb-ssd-8gb-15-6-touch-win-11`) | ASUS | almacenamiento 512 GB; RAM 8 GB (dato descriptivo, sin selector) | $1.700.000,00 | 10 | 4 | — |
| 138 | Notebook ASUS Vivobook Go 15 E1504GA-WS35 Intel Core i3 N305 8/256 GB Win11 | Producto simple (`notebook-asus-vivobook-go-15-e1504ga-ws35-intel-core-i3-n305-8-256-gb-win11`) | ASUS | RAM 8 GB; almacenamiento 256 GB (dato descriptivo, sin selector) | $1.300.000,00 | 10 | 4 | — |
| 139 | Notebook Acer Aspire 7 I5-13420H/512SSD/16GB/15.6/RTX3050 | Producto simple (`notebook-acer-aspire-7-i5-13420h-512ssd-16gb-15-6-rtx3050`) | Acer | almacenamiento 512 GB; RAM 16 GB (dato descriptivo, sin selector) | $2.800.000,00 | 10 | 4 | — |
| 140 | Notebook Lenovo IdeaPad Slim 3 AMD Ryzen 5 8/512GB SSD 15.6" Full HD Win11 | Producto simple (`notebook-lenovo-ideapad-slim-3-amd-ryzen-5-8-512gb-ssd-15-6-full-hd-win11`) | Lenovo | RAM 8 GB; almacenamiento 512 GB (dato descriptivo, sin selector) | $1.400.000,00 | 10 | 4 | — |
| 141 | Notebook Lenovo Ryzen 7 8840HS 16/512GB 15,6" | Producto simple (`notebook-lenovo-ryzen-7-8840hs-16-512gb-15-6`) | Lenovo | RAM 16 GB; almacenamiento 512 GB (dato descriptivo, sin selector) | $1.700.000,00 | 10 | 5 | — |
| 142 | Notebook Lenovo S3 15Q8X10 SNAPDRAGON X 512GB SSD 16GB DDR5 15.3" WIN11 | Producto simple (`notebook-lenovo-s3-15q8x10-snapdragon-x-512gb-ssd-16gb-ddr5-15-3-win11`) | Lenovo | almacenamiento 512 GB; RAM 16 GB (dato descriptivo, sin selector) | $1.500.000,00 | 10 | 7 | — |
| 143 | Notebook MSI Katana 15 HX B14WGK-293US I7-14650HX UP TO 5.2GHZ 1TB SSD 16GB DDR5 Geforce RTX 5070 8GB 15.6" QHD 165HZ WIN 11 | Producto simple (`notebook-msi-katana-15-hx-b14wgk-293us-i7-14650hx-up-to-5-2ghz-1tb-ssd-16gb-ddr5-geforce-rtx-5070-8gb-15-6-qhd-165hz-win-11`) | MSI | almacenamiento 1 TB; RAM 16 GB (dato descriptivo, sin selector) | $3.800.000,00 | 10 | 5 | — |
### Tecnología → Smart TV
| # | Producto de origen | Representación en Shopit | Marca | Atributos/datos | Precio | Stock | Imágenes | Descripción/observación |
|---:|---|---|---|---|---:|---:|---:|---|
| 144 | SMART 32" BGH B-3225S5A ANDROID | Producto simple (`smart-32-bgh-b-3225s5a-android`) | BGH | — | $340.000,00 | 10 | 4 | — |
| 145 | SMART TV NOBLEX 50" DR50-X8500 GOOGLE TV | Producto simple (`smart-tv-noblex-50-dr50-x8500-google-tv`) | Noblex | — | $730.000,00 | 10 | 4 | — |
| 146 | Smart TV 43" Noblex DR43-X7180 Android | Producto simple (`smart-tv-43-noblex-dr43-x7180-android`) | Noblex | — | $510.000,00 | 10 | 4 | — |
| 147 | Smart TV Noblex 32" DK32-X7000 Android | Producto simple (`smart-tv-noblex-32-dk32-x7000-android`) | Noblex | — | $340.000,00 | 10 | 3 | — |
### Tecnología → Soportes para TV
| # | Producto de origen | Representación en Shopit | Marca | Atributos/datos | Precio | Stock | Imágenes | Descripción/observación |
|---:|---|---|---|---|---:|---:|---:|---|
| 148 | Soporte led 26"-60" Nakan SPL-375E extensible y giratorio | Producto simple (`soporte-led-26-60-nakan-spl-375e-extensible-y-giratorio`) | Nakan | — | $55.000,00 | 10 | 3 | — Corrección: el archivo de origen lo ubicó dentro de colchones. |
| 149 | Soporte led 32"-55" GBS con inclinacion | Producto simple (`soporte-led-32-55-gbs-con-inclinacion`) | GBS | — | $20.000,00 | 10 | 3 | — |
| 150 | Soporte led GBS 32"-55" fijo | Producto simple (`soporte-led-gbs-32-55-fijo`) | GBS | — | $20.000,00 | 10 | 3 | — |
## Consolidaciones propuestas como variantes
Se consolidan solamente coincidencias suficientemente claras:
- Motorola G15: variantes por RAM y almacenamiento.
- Acolchado Kavanagh Símil Plumón Reversible: variantes por medida.
- Edredón Lisboa Jean Cartier: variantes por medida.
- Acolchado Sense Dúo Bitono con Corderito: variantes por medida.
- Frazada Kavanagh Premium Soft: variantes por medida.
- Kit Edredón Alaska con Corderito: variantes por medida.
- Colchón Inducol Constanza: variantes por medida.
No se consolidan modelos parecidos cuando el nombre no permite asegurar que sean el mismo producto. Esto evita mezclar, por ejemplo, versiones 4G/5G, tecnologías diferentes o modelos visualmente similares.
## Pendientes antes de una importación definitiva
- Confirmar las marcas marcadas como pendientes.
- Reemplazar el stock provisional de 10 unidades por existencias reales.
- Completar las descripciones ausentes o demasiado breves.
- Definir SKU y códigos de barras si se integrará con otro sistema.
- Confirmar las consolidaciones propuestas antes de convertir registros independientes en variantes.
- Corregir definitivamente la clasificación del soporte Nakan que aparece en la carpeta de colchones.

Binary file not shown.

After

Width:  |  Height:  |  Size: 161 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 161 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Some files were not shown because too many files have changed in this diff Show More