diff --git a/app/Domains/Commerce/Catalog/Enums/InventoryMovementOperation.php b/app/Domains/Commerce/Catalog/Enums/InventoryMovementOperation.php deleted file mode 100644 index 53870d5e..00000000 --- a/app/Domains/Commerce/Catalog/Enums/InventoryMovementOperation.php +++ /dev/null @@ -1,18 +0,0 @@ - $query */ public function scopeWhereAvailable(Builder $query): Builder { - $availableInventory = static fn (Builder $inventoryQuery): Builder => Schema::hasColumn('inventories', 'available_stock') - ? $inventoryQuery->where('inventories.available_stock', '>', 0) - : $inventoryQuery->whereRaw('inventories.real_stock > inventories.reserved_stock + inventories.entry_reserved_stock'); - return $query->where(function (Builder $query): void { $query->whereNull('catalog_items.sales_end_at') ->orWhere('catalog_items.sales_end_at', '>', now()); - })->where(function (Builder $query) use ($availableInventory): void { + })->where(function (Builder $query): void { $query ->where(function (Builder $unlimitedQuery): void { $unlimitedQuery @@ -241,18 +236,20 @@ class CatalogItem extends Model ->whereNull('replaced_by_variant_id') ->whereHas( 'inventory', - $availableInventory + fn (Builder $inventoryQuery): Builder => $inventoryQuery + ->whereRaw('inventories.real_stock > inventories.reserved_stock + inventories.entry_reserved_stock') ) ) - ->orWhere(function (Builder $directItemQuery) use ($availableInventory): void { + ->orWhere(function (Builder $directItemQuery): void { $directItemQuery ->whereDoesntHave('variants') - ->where(function (Builder $inventoryQuery) use ($availableInventory): void { + ->where(function (Builder $inventoryQuery): void { $inventoryQuery ->whereNull('catalog_items.inventory_id') ->orWhereHas( 'inventory', - $availableInventory + fn (Builder $availableInventoryQuery): Builder => $availableInventoryQuery + ->whereRaw('inventories.real_stock > inventories.reserved_stock + inventories.entry_reserved_stock') ); }); }); diff --git a/app/Domains/Commerce/Catalog/Models/Inventory.php b/app/Domains/Commerce/Catalog/Models/Inventory.php index 137dca39..d18af516 100644 --- a/app/Domains/Commerce/Catalog/Models/Inventory.php +++ b/app/Domains/Commerce/Catalog/Models/Inventory.php @@ -2,17 +2,11 @@ namespace App\Domains\Commerce\Catalog\Models; -use App\Domains\Commerce\Catalog\Enums\InventoryMovementOperation; -use App\Domains\Core\Auth\Models\User; use Illuminate\Database\Eloquent\Attributes\Fillable; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Relations\HasOne; -use Illuminate\Support\Facades\Auth; -use Illuminate\Support\Facades\DB; -use Illuminate\Support\Facades\Schema; -use Illuminate\Validation\ValidationException; #[Fillable([ 'sold_units', @@ -44,7 +38,6 @@ class Inventory extends Model 'reserved_stock' => 'integer', 'entry_reserved_stock' => 'integer', 'real_stock' => 'integer', - 'available_stock' => 'integer', ]; } @@ -66,295 +59,70 @@ class Inventory extends Model return $this->hasMany(StockReservationLine::class); } - /** @return HasMany */ - public function movements(): HasMany - { - return $this->hasMany(InventoryMovement::class); - } - public function availableStock(): int { - if (! array_key_exists('available_stock', $this->attributes)) { - return max(0, $this->real_stock - $this->reserved_stock - ($this->entry_reserved_stock ?? 0)); - } - - return (int) $this->getAttribute('available_stock'); + return max(0, $this->real_stock - $this->reserved_stock - $this->entry_reserved_stock); } public function reserveEntry(int $amount, bool $tracksInventory): void { - $this->mutate( - InventoryMovementOperation::EntryStockReserved, - ['entry_reserved_stock' => $amount], - function (self $inventory) use ($amount, $tracksInventory): void { - if ($amount < 1 || ($tracksInventory && $inventory->availableStock() < $amount)) { - throw new \InvalidArgumentException('No hay stock disponible para la reserva de entradas.'); - } - }, - ); + if ($amount < 1 || ($tracksInventory && $this->availableStock() < $amount)) { + throw new \InvalidArgumentException('No hay stock disponible para la reserva de entradas.'); + } + $this->entry_reserved_stock += $amount; + $this->save(); } public function releaseEntry(int $amount): void { - $this->mutate( - InventoryMovementOperation::EntryStockReleased, - ['entry_reserved_stock' => -$amount], - function (self $inventory) use ($amount): void { - if ($amount < 1 || $inventory->entry_reserved_stock < $amount) { - throw new \InvalidArgumentException('La cantidad de entradas reservadas no es válida.'); - } - }, - ); + if ($amount < 1 || $this->entry_reserved_stock < $amount) { + throw new \InvalidArgumentException('La cantidad de entradas reservadas no es válida.'); + } + + $this->entry_reserved_stock -= $amount; + $this->save(); } public function reserve(int $amount, bool $tracksInventory): void { - $this->mutate( - InventoryMovementOperation::StockReserved, - ['reserved_stock' => $amount], - function (self $inventory) use ($amount, $tracksInventory): void { - if ($amount < 0) { - throw new \InvalidArgumentException('La cantidad a reservar debe ser positiva.'); - } - if ($tracksInventory && $inventory->availableStock() < $amount) { - throw new \InvalidArgumentException('No hay suficiente stock disponible para reservar.'); - } - }, - ); + if ($amount < 0) { + throw new \InvalidArgumentException('La cantidad a reservar debe ser positiva.'); + } + + if ($tracksInventory && $this->availableStock() < $amount) { + throw new \InvalidArgumentException('No hay suficiente stock disponible para reservar.'); + } + + $this->reserved_stock += $amount; + $this->save(); } public function release(int $amount): void { - $this->mutate( - InventoryMovementOperation::StockReleased, - ['reserved_stock' => -$amount], - function (self $inventory) use ($amount): void { - if ($amount < 0 || $inventory->reserved_stock < $amount) { - throw new \InvalidArgumentException('La cantidad reservada no es válida.'); - } - }, - ); + if ($amount < 0 || $this->reserved_stock < $amount) { + throw new \InvalidArgumentException('La cantidad reservada no es válida.'); + } + + $this->reserved_stock -= $amount; + $this->save(); } public function buy(int $amount, bool $tracksInventory): void { - $counterDeltas = ['reserved_stock' => -$amount, 'sold_units' => $amount]; - if (! array_key_exists('available_stock', $this->attributes) && $tracksInventory) { - $counterDeltas['real_stock'] = -$amount; + if ($amount < 0 || $this->reserved_stock < $amount) { + throw new \InvalidArgumentException('La cantidad reservada no alcanza para confirmar la compra.'); } - $this->mutate( - InventoryMovementOperation::PurchaseCommitted, - $counterDeltas, - function (self $inventory) use ($amount, $tracksInventory): void { - if ($amount < 0 || $inventory->reserved_stock < $amount) { - throw new \InvalidArgumentException('La cantidad reservada no alcanza para confirmar la compra.'); - } - if ($tracksInventory && $inventory->availableStock() < 0) { - throw new \InvalidArgumentException('No hay suficiente stock real para confirmar la compra.'); - } - }, - ); - } - - public function adjustAvailableStock( - int $delta, - ?User $responsibleUser = null, - ?string $idempotencyKey = null, - ): void { - if ($delta === 0) { - return; + if ($tracksInventory && $this->real_stock - $this->entry_reserved_stock < $amount) { + throw new \InvalidArgumentException('No hay suficiente stock real para confirmar la compra.'); } - $operation = $delta > 0 - ? InventoryMovementOperation::StockIncreased - : InventoryMovementOperation::StockDecreased; - - $this->mutate( - $operation, - ['real_stock' => $delta], - function (self $inventory) use ($delta): void { - if ($inventory->real_stock + $delta < 0 || $inventory->availableStock() + $delta < 0) { - throw ValidationException::withMessages([ - 'stock_difference' => ['El ajuste dejaría el stock en un valor inválido.'], - ]); - } - }, - $responsibleUser, - $idempotencyKey, - ); - } - - public function refundStock(int $amount, ?User $responsibleUser = null): void - { - $counterDeltas = ['refunded_units' => $amount]; - if (! array_key_exists('available_stock', $this->attributes)) { - $counterDeltas['real_stock'] = $amount; + if ($tracksInventory) { + $this->real_stock -= $amount; } - $this->mutate( - InventoryMovementOperation::StockRefunded, - $counterDeltas, - function () use ($amount): void { - if ($amount < 1) { - throw new \InvalidArgumentException('La cantidad devuelta debe ser positiva.'); - } - }, - $responsibleUser, - ); - } - - public function commitDirectSale(int $amount, bool $tracksInventory = true): void - { - $this->mutate( - InventoryMovementOperation::PurchaseCommitted, - ['sold_units' => $amount], - function (self $inventory) use ($amount, $tracksInventory): void { - if ($amount < 1 || ($tracksInventory && $inventory->availableStock() < $amount)) { - throw new \InvalidArgumentException('No hay suficiente stock para confirmar la compra.'); - } - }, - ); - } - - public function recordInitialization(?User $responsibleUser = null): void - { - $this->recordCurrentState(InventoryMovementOperation::StockInitialized, $responsibleUser); - } - - public function recordTransferInitialization(?User $responsibleUser = null): void - { - $this->recordCurrentState(InventoryMovementOperation::InventoryTransferred, $responsibleUser); - } - - /** @param array $counterDeltas */ - public function transferCounters(array $counterDeltas, ?User $responsibleUser = null): void - { - $counterDeltas = array_filter($counterDeltas, fn (int $delta): bool => $delta !== 0); - if ($counterDeltas === []) { - return; - } - - $this->mutate( - InventoryMovementOperation::InventoryTransferred, - $counterDeltas, - function (self $inventory) use ($counterDeltas): void { - foreach ($counterDeltas as $counter => $delta) { - if ((int) $inventory->getAttribute($counter) + $delta < 0) { - throw new \LogicException("El traslado dejaría {$counter} en un valor negativo."); - } - } - }, - $responsibleUser, - ); - } - - private function recordCurrentState( - InventoryMovementOperation $operation, - ?User $responsibleUser, - ): void { - if (! Schema::hasTable('inventory_movements')) { - return; - } - - $this->refresh(); - $counterDeltas = array_filter([ - 'real_stock' => $this->real_stock, - 'sold_units' => $this->sold_units, - 'reserved_stock' => $this->reserved_stock, - 'entry_reserved_stock' => $this->entry_reserved_stock, - 'refunded_units' => $this->refunded_units, - ], fn (int $delta): bool => $delta !== 0); - - $this->movements()->create([ - 'operation' => $operation, - 'available_stock_delta' => $this->availableStock(), - 'available_stock_before' => 0, - 'available_stock_after' => $this->availableStock(), - 'counter_deltas' => $counterDeltas, - 'responsible_user_id' => $responsibleUser?->getKey() ?? Auth::id(), - ]); - } - - public function resetTransactionCounters(?User $responsibleUser = null): void - { - $this->refresh(); - $counterDeltas = array_filter([ - 'sold_units' => -$this->sold_units, - 'reserved_stock' => -$this->reserved_stock, - 'entry_reserved_stock' => -$this->entry_reserved_stock, - 'refunded_units' => -$this->refunded_units, - ], fn (int $delta): bool => $delta !== 0); - - if ($counterDeltas === []) { - return; - } - - $this->mutate( - InventoryMovementOperation::InventoryReset, - $counterDeltas, - static function (): void {}, - $responsibleUser, - ); - } - - /** - * @param array $counterDeltas - * @param callable(self): void $validate - */ - private function mutate( - InventoryMovementOperation $operation, - array $counterDeltas, - callable $validate, - ?User $responsibleUser = null, - ?string $idempotencyKey = null, - ): void { - DB::transaction(function () use ($operation, $counterDeltas, $validate, $responsibleUser, $idempotencyKey): void { - /** @var self $inventory */ - $inventory = self::query()->lockForUpdate()->findOrFail($this->getKey()); - $this->setRawAttributes($inventory->getAttributes(), true); - - $recordsMovements = Schema::hasTable('inventory_movements'); - if ($recordsMovements && $idempotencyKey !== null) { - $existing = $this->movements() - ->where('idempotency_key', $idempotencyKey) - ->first(); - if ($existing !== null) { - if ($existing->counter_deltas !== $counterDeltas) { - throw ValidationException::withMessages([ - 'stock_adjustment_id' => ['La operación ya fue utilizada con otro ajuste.'], - ]); - } - - return; - } - } - - $validate($this); - $counterDeltas = array_filter($counterDeltas, fn (int $delta): bool => $delta !== 0); - if ($counterDeltas === []) { - return; - } - - $availableBefore = $this->availableStock(); - foreach ($counterDeltas as $counter => $delta) { - $this->setAttribute($counter, (int) $this->getAttribute($counter) + $delta); - } - $this->save(); - $this->refresh(); - - $availableAfter = $this->availableStock(); - if ($recordsMovements) { - $this->movements()->create([ - 'operation' => $operation, - 'available_stock_delta' => $availableAfter - $availableBefore, - 'available_stock_before' => $availableBefore, - 'available_stock_after' => $availableAfter, - 'counter_deltas' => $counterDeltas, - 'responsible_user_id' => $responsibleUser?->getKey() ?? Auth::id(), - 'idempotency_key' => $idempotencyKey, - ]); - } - }); + $this->reserved_stock -= $amount; + $this->sold_units += $amount; + $this->save(); } } diff --git a/app/Domains/Commerce/Catalog/Models/InventoryMovement.php b/app/Domains/Commerce/Catalog/Models/InventoryMovement.php deleted file mode 100644 index d2d65de9..00000000 --- a/app/Domains/Commerce/Catalog/Models/InventoryMovement.php +++ /dev/null @@ -1,45 +0,0 @@ - InventoryMovementOperation::class, - 'available_stock_delta' => 'integer', - 'available_stock_before' => 'integer', - 'available_stock_after' => 'integer', - 'counter_deltas' => 'array', - ]; - } - - /** @return BelongsTo */ - public function inventory(): BelongsTo - { - return $this->belongsTo(Inventory::class); - } - - /** @return BelongsTo */ - public function responsibleUser(): BelongsTo - { - return $this->belongsTo(User::class, 'responsible_user_id'); - } -} diff --git a/app/Domains/Commerce/Catalog/Services/CatalogInventoryService.php b/app/Domains/Commerce/Catalog/Services/CatalogInventoryService.php index d79a7638..5819fe73 100644 --- a/app/Domains/Commerce/Catalog/Services/CatalogInventoryService.php +++ b/app/Domains/Commerce/Catalog/Services/CatalogInventoryService.php @@ -64,7 +64,6 @@ class CatalogInventoryService $selection->loadMissing('variants.inventory'); return $selection->variants - ->each(fn (Variant $variant) => $variant->setRelation('catalogItem', $selection)) ->filter(fn (Variant $variant): bool => $variant->isSellable()) ->unique(fn (Variant $variant): string => $variant->inventory_id === null ? 'object:'.spl_object_id($variant->inventory) @@ -154,7 +153,7 @@ class CatalogInventoryService if ($operation === 'commit' && $requirement['tracks_inventory'] - && $inventory->availableStock() < 0) { + && $inventory->real_stock - $inventory->entry_reserved_stock < $requiredQuantity) { throw new \InvalidArgumentException('No hay suficiente stock real para confirmar la compra.'); } } diff --git a/app/Domains/Commerce/Catalog/Services/CatalogService.php b/app/Domains/Commerce/Catalog/Services/CatalogService.php index 4b87a505..61cef228 100644 --- a/app/Domains/Commerce/Catalog/Services/CatalogService.php +++ b/app/Domains/Commerce/Catalog/Services/CatalogService.php @@ -2,6 +2,8 @@ namespace App\Domains\Commerce\Catalog\Services; +use App\Shared\Attachable\Models\Attachment; +use App\Shared\Attachable\Services\AttachmentService; use App\Domains\Commerce\Catalog\Enums\CatalogItemType; use App\Domains\Commerce\Catalog\Models\Attribute; use App\Domains\Commerce\Catalog\Models\CatalogItem; @@ -9,10 +11,8 @@ use App\Domains\Commerce\Catalog\Models\Category; use App\Domains\Commerce\Catalog\Models\Inventory; use App\Domains\Commerce\Catalog\Models\ItemAttribute; use App\Domains\Commerce\Catalog\Models\Variant; -use App\Domains\Core\Tenant\Models\Tenant; use App\Domains\Ticketing\Event\Models\EventDate; -use App\Shared\Attachable\Models\Attachment; -use App\Shared\Attachable\Services\AttachmentService; +use App\Domains\Core\Tenant\Models\Tenant; use Illuminate\Database\Eloquent\Builder; use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Support\Facades\DB; @@ -286,11 +286,9 @@ class CatalogService int $perPage, int $page, ): LengthAwarePaginator { - $categoryIds = $this->categoryAndDescendantIds($tenant, $category); - return CatalogItem::query() ->forTenantCatalog($tenant) - ->whereIn('category_id', $categoryIds) + ->where('category_id', $category->id) ->whereAvailable() ->with([ 'attachments', @@ -308,34 +306,6 @@ class CatalogService ->paginate(perPage: $perPage, pageName: 'page', page: $page); } - /** @return array */ - private function categoryAndDescendantIds(Tenant $tenant, Category $category): array - { - $childrenByParent = Category::query() - ->where('tenant_code', $tenant->codigo) - ->get(['id', 'categoria_id']) - ->groupBy('categoria_id'); - - $categoryIds = []; - $pendingIds = [$category->id]; - - while ($pendingIds !== []) { - $categoryId = array_shift($pendingIds); - - if (isset($categoryIds[$categoryId])) { - continue; - } - - $categoryIds[$categoryId] = $categoryId; - - foreach ($childrenByParent->get($categoryId, collect()) as $child) { - $pendingIds[] = $child->id; - } - } - - return array_values($categoryIds); - } - public function delete(CatalogItem $catalogItem): void { DB::transaction(function () use ($catalogItem): void { @@ -370,12 +340,9 @@ class CatalogService private function createInventory(int $realStock): Inventory { - $inventory = Inventory::query()->create([ + return Inventory::query()->create([ 'real_stock' => $realStock, ]); - $inventory->recordInitialization(); - - return $inventory; } /** diff --git a/app/Domains/Commerce/Catalog/Services/StockReservationService.php b/app/Domains/Commerce/Catalog/Services/StockReservationService.php index 2412ee76..a9216474 100644 --- a/app/Domains/Commerce/Catalog/Services/StockReservationService.php +++ b/app/Domains/Commerce/Catalog/Services/StockReservationService.php @@ -225,7 +225,7 @@ class StockReservationService $inventory = $inventories->get($line->inventory_id) ?? throw new \InvalidArgumentException('No se encontró el inventario reservado.'); if ($inventory->reserved_stock < $line->quantity - || ($line->tracks_inventory && $inventory->availableStock() < 0)) { + || ($line->tracks_inventory && $inventory->real_stock - $inventory->entry_reserved_stock < $line->quantity)) { throw new \InvalidArgumentException('La reserva de stock no alcanza para confirmar la compra.'); } } diff --git a/app/Domains/Commerce/Catalog/Services/VariantReplacementService.php b/app/Domains/Commerce/Catalog/Services/VariantReplacementService.php index ac28cf69..317c4972 100644 --- a/app/Domains/Commerce/Catalog/Services/VariantReplacementService.php +++ b/app/Domains/Commerce/Catalog/Services/VariantReplacementService.php @@ -194,7 +194,6 @@ class VariantReplacementService 'entry_reserved_stock' => $sourceInventory->entry_reserved_stock, 'real_stock' => $sourceInventory->real_stock, ]); - $replacementInventory->recordTransferInitialization(); if ($activeLines->isNotEmpty()) { StockReservationLine::query() @@ -203,10 +202,7 @@ class VariantReplacementService } EntryReservation::query()->where('inventory_id', $sourceInventory->id) ->update(['inventory_id' => $replacementInventory->id]); - $sourceInventory->transferCounters([ - 'reserved_stock' => -$sourceInventory->reserved_stock, - 'entry_reserved_stock' => -$sourceInventory->entry_reserved_stock, - ]); + $sourceInventory->update(['reserved_stock' => 0, 'entry_reserved_stock' => 0]); return $replacementInventory; } @@ -240,14 +236,13 @@ class VariantReplacementService throw new \LogicException('El inventario reservado de la variante es inconsistente.'); } - $transferredCounters = [ - 'real_stock' => $sourceInventory->real_stock, - 'reserved_stock' => $sourceInventory->reserved_stock, - 'entry_reserved_stock' => $sourceInventory->entry_reserved_stock, - 'sold_units' => $sourceInventory->sold_units, - 'refunded_units' => $sourceInventory->refunded_units, - ]; - $destinationInventory->transferCounters($transferredCounters); + $destinationInventory->update([ + 'real_stock' => $destinationInventory->real_stock + $sourceInventory->real_stock, + 'reserved_stock' => $destinationInventory->reserved_stock + $sourceInventory->reserved_stock, + 'entry_reserved_stock' => $destinationInventory->entry_reserved_stock + $sourceInventory->entry_reserved_stock, + 'sold_units' => $destinationInventory->sold_units + $sourceInventory->sold_units, + 'refunded_units' => $destinationInventory->refunded_units + $sourceInventory->refunded_units, + ]); if ($activeLines->isNotEmpty()) { StockReservationLine::query() ->whereKey($activeLines->modelKeys()) @@ -255,10 +250,13 @@ class VariantReplacementService } EntryReservation::query()->where('inventory_id', $sourceInventory->id) ->update(['inventory_id' => $destinationInventory->id]); - $sourceInventory->transferCounters(array_map( - fn (int $value): int => -$value, - $transferredCounters, - )); + $sourceInventory->update([ + 'real_stock' => 0, + 'reserved_stock' => 0, + 'entry_reserved_stock' => 0, + 'sold_units' => 0, + 'refunded_units' => 0, + ]); } /** @return list */ diff --git a/app/Domains/Commerce/Purchase/Controllers/PurchaseController.php b/app/Domains/Commerce/Purchase/Controllers/PurchaseController.php index 19a94804..f2036131 100644 --- a/app/Domains/Commerce/Purchase/Controllers/PurchaseController.php +++ b/app/Domains/Commerce/Purchase/Controllers/PurchaseController.php @@ -2,6 +2,7 @@ namespace App\Domains\Commerce\Purchase\Controllers; +use App\Shared\Integration\Services\TelepagosIntegrationService; use App\Domains\Commerce\Purchase\Models\Purchase; use App\Domains\Commerce\Purchase\Requests\PaymentIntentRequest; use App\Domains\Commerce\Purchase\Requests\StartCheckoutRequest; @@ -12,7 +13,6 @@ use App\Domains\Commerce\Purchase\Services\CheckoutService; use App\Domains\Commerce\Purchase\Services\PurchaseStateGuard; use App\Domains\Core\Tenant\Models\Tenant; use App\Http\Controllers\Controller; -use App\Shared\Integration\Services\TelepagosIntegrationService; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; @@ -151,14 +151,11 @@ class PurchaseController extends Controller } $compra->refresh(); - $compra->loadMissing('event'); $totalAmount = (float) $compra->total; if ($method === 'transfer') { $telepagosService = new TelepagosIntegrationService; - $compra->event - ? $telepagosService->forEvent($compra->event) - : $telepagosService->forTenant($tenant->codigo); + $telepagosService->forTenant($tenant->codigo); try { $accountInfo = $telepagosService->getAccountInfo(); @@ -194,9 +191,7 @@ class PurchaseController extends Controller if ($method === 'qr') { $telepagosService = new TelepagosIntegrationService; - $compra->event - ? $telepagosService->forEvent($compra->event) - : $telepagosService->forTenant($tenant->codigo); + $telepagosService->forTenant($tenant->codigo); try { Log::channel('telepagos')->info('Generating Telepagos QR.', [ diff --git a/app/Domains/Commerce/Purchase/Models/Purchase.php b/app/Domains/Commerce/Purchase/Models/Purchase.php index 68fec2f3..5c75fa7f 100644 --- a/app/Domains/Commerce/Purchase/Models/Purchase.php +++ b/app/Domains/Commerce/Purchase/Models/Purchase.php @@ -2,14 +2,13 @@ namespace App\Domains\Commerce\Purchase\Models; +use App\Domains\Core\Auth\Models\User; use App\Domains\Commerce\Cart\Models\Cart; use App\Domains\Commerce\Catalog\Models\StockReservation; -use App\Domains\Commerce\Purchase\Events\PurchasePaid; -use App\Domains\Core\Auth\Models\User; -use App\Domains\Core\Tenant\Models\Tenant; -use App\Domains\Ticketing\Event\Models\Event; -use App\Domains\Ticketing\Ticket\Models\Ticket; use App\Shared\Logging\Models\Concerns\LogsValueChanges; +use App\Domains\Commerce\Purchase\Events\PurchasePaid; +use App\Domains\Core\Tenant\Models\Tenant; +use App\Domains\Ticketing\Ticket\Models\Ticket; use Illuminate\Database\Eloquent\Attributes\Fillable; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; @@ -22,7 +21,6 @@ use Illuminate\Support\Facades\DB; #[Fillable([ 'cart_id', 'stock_reservation_id', - 'event_id', 'tenant_codigo', 'user_id', 'status', @@ -151,7 +149,6 @@ class Purchase extends Model return [ 'cart_id' => 'integer', 'stock_reservation_id' => 'integer', - 'event_id' => 'integer', 'user_id' => 'integer', 'total' => 'decimal:2', ]; @@ -165,12 +162,6 @@ class Purchase extends Model return $this->belongsTo(Tenant::class, 'tenant_codigo', 'codigo'); } - /** @return BelongsTo */ - public function event(): BelongsTo - { - return $this->belongsTo(Event::class); - } - /** * @return BelongsTo */ diff --git a/app/Domains/Commerce/Purchase/Resources/PurchaseResource.php b/app/Domains/Commerce/Purchase/Resources/PurchaseResource.php index d5624cf5..2e98a2e8 100644 --- a/app/Domains/Commerce/Purchase/Resources/PurchaseResource.php +++ b/app/Domains/Commerce/Purchase/Resources/PurchaseResource.php @@ -36,11 +36,11 @@ class PurchaseResource extends JsonResource === StorefrontWebsiteType::CHECKOUT_SUMMARY_EVENT; /** @var Event|null $checkoutEvent */ $checkoutEvent = $usesEventSummary - ? ($this->event ?? $items + ? $items ->map(fn (PurchaseItem $item) => $item->sourceCatalogItem?->event) ->filter() ->unique('id') - ->first()) + ->first() : null; $subtotal = $items->isNotEmpty() @@ -62,7 +62,6 @@ class PurchaseResource extends JsonResource return [ 'id' => $this->id, 'cart_id' => $this->cart_id, - 'event_id' => $this->event_id, 'tenant_codigo' => $this->tenant_codigo, 'user_id' => $this->user_id, 'created_at' => $this->created_at, diff --git a/app/Domains/Commerce/Purchase/Services/Checkout/PurchaseResponseLoader.php b/app/Domains/Commerce/Purchase/Services/Checkout/PurchaseResponseLoader.php index 88dfb5f3..ed82d2d6 100644 --- a/app/Domains/Commerce/Purchase/Services/Checkout/PurchaseResponseLoader.php +++ b/app/Domains/Commerce/Purchase/Services/Checkout/PurchaseResponseLoader.php @@ -14,7 +14,6 @@ class PurchaseResponseLoader === StorefrontWebsiteType::CHECKOUT_SUMMARY_EVENT; $relations = [ 'tenant', - 'event.attachment', 'items.sourceCatalogItem.event.attachment', 'stockReservation', ]; diff --git a/app/Domains/Commerce/Purchase/Services/Checkout/StartCheckoutService.php b/app/Domains/Commerce/Purchase/Services/Checkout/StartCheckoutService.php index e21ab889..e2a1bf14 100644 --- a/app/Domains/Commerce/Purchase/Services/Checkout/StartCheckoutService.php +++ b/app/Domains/Commerce/Purchase/Services/Checkout/StartCheckoutService.php @@ -206,7 +206,6 @@ class StartCheckoutService fn (array $line): float => $line['selection']->getPrice() * $line['quantity'], ), $cart->getKey(), - $cartItems->first()?->catalogItem?->event_id, ); $cart->update(['current_purchase_id' => $purchase->getKey()]); $this->reservations->attachToPurchase($cart, $purchase, $this->checkoutExpiration()); @@ -274,7 +273,6 @@ class StartCheckoutService $purchaseData, $cart->getTotalAmount(), $cart->getKey(), - $cartItems->first()?->catalogItem?->event_id, ); $cart->update(['current_purchase_id' => $purchase->getKey()]); $this->reservations->attachToPurchase($cart, $purchase, $this->checkoutExpiration()); @@ -412,12 +410,10 @@ class StartCheckoutService array $purchaseData, float $total, ?int $cartId, - ?int $eventId, ): Purchase { return Purchase::query()->create([ ...$purchaseData, 'cart_id' => $cartId, - 'event_id' => $eventId, 'tenant_codigo' => $tenant->codigo, 'user_id' => $userId, 'status' => Purchase::STATUS_CREATED, diff --git a/app/Domains/Commerce/Purchase/Services/TenantTransactionResetService.php b/app/Domains/Commerce/Purchase/Services/TenantTransactionResetService.php index 815b2663..37931061 100644 --- a/app/Domains/Commerce/Purchase/Services/TenantTransactionResetService.php +++ b/app/Domains/Commerce/Purchase/Services/TenantTransactionResetService.php @@ -2,7 +2,6 @@ namespace App\Domains\Commerce\Purchase\Services; -use App\Domains\Commerce\Catalog\Models\Inventory; use App\Domains\Commerce\Purchase\Models\Purchase; use Illuminate\Database\Query\Builder; use Illuminate\Support\Collection; @@ -70,12 +69,15 @@ class TenantTransactionResetService 'users_preserved' => DB::table('users')->where('tenant_codigo', $tenantCode)->count(), ]; - Inventory::query() - ->whereKey($scope['inventory_ids']) - ->orderBy('id') - ->lockForUpdate() - ->get() - ->each(fn (Inventory $inventory) => $inventory->resetTransactionCounters()); + DB::table('inventories') + ->whereIn('id', $scope['inventory_ids']) + ->update([ + 'real_stock' => DB::raw('real_stock + sold_units - refunded_units'), + 'reserved_stock' => 0, + 'entry_reserved_stock' => 0, + 'sold_units' => 0, + 'refunded_units' => 0, + ]); return $summary; }); diff --git a/app/Domains/Core/Client/Models/Client.php b/app/Domains/Core/Client/Models/Client.php index e7381320..f52054ff 100644 --- a/app/Domains/Core/Client/Models/Client.php +++ b/app/Domains/Core/Client/Models/Client.php @@ -2,9 +2,8 @@ namespace App\Domains\Core\Client\Models; -use App\Domains\Core\Tenant\Models\Tenant; -use App\Domains\Ticketing\Event\Models\Event; use App\Shared\Integration\Models\ClientIntegration; +use App\Domains\Core\Tenant\Models\Tenant; use Illuminate\Database\Eloquent\Attributes\Fillable; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\HasMany; @@ -23,12 +22,6 @@ class Client extends Model return $this->hasMany(Tenant::class); } - /** @return HasMany */ - public function events(): HasMany - { - return $this->hasMany(Event::class); - } - /** @return HasMany */ public function integrations(): HasMany { diff --git a/app/Domains/Ticketing/Desfile/Services/InvitationPurchaseProvisioner.php b/app/Domains/Ticketing/Desfile/Services/InvitationPurchaseProvisioner.php index 2fcb5e29..a2be68ea 100644 --- a/app/Domains/Ticketing/Desfile/Services/InvitationPurchaseProvisioner.php +++ b/app/Domains/Ticketing/Desfile/Services/InvitationPurchaseProvisioner.php @@ -2,7 +2,6 @@ namespace App\Domains\Ticketing\Desfile\Services; -use App\Domains\Commerce\Catalog\Models\Inventory; use DateTimeInterface; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Hash; @@ -394,22 +393,14 @@ class InvitationPurchaseProvisioner $inventory = DB::table('inventories')->where('id', $variant->inventory_id)->lockForUpdate()->first(); - $available = $inventory?->available_stock - ?? ($inventory === null ? 0 : $inventory->real_stock - $inventory->reserved_stock - ($inventory->entry_reserved_stock ?? 0)); - if ($available < 1) { + if ($inventory === null || $inventory->real_stock < 1 || $inventory->reserved_stock > 0 || ($inventory->entry_reserved_stock ?? 0) > 0) { throw new RuntimeException("El asiento {$variant->descripcion} ya no está disponible."); } - if (property_exists($inventory, 'available_stock')) { - Inventory::query()->findOrFail($inventory->id)->commitDirectSale(1); - } else { - // This provisioner is also used by historical migrations that run - // before generated availability and the movement ledger exist. - DB::table('inventories')->where('id', $inventory->id)->update([ - 'real_stock' => $inventory->real_stock - 1, - 'sold_units' => $inventory->sold_units + 1, - ]); - } + DB::table('inventories')->where('id', $inventory->id)->update([ + 'real_stock' => $inventory->real_stock - 1, + 'sold_units' => $inventory->sold_units + 1, + ]); $reservationId = DB::table('compras')->where('id', $purchaseId)->value('stock_reservation_id'); if ($reservationId === null) { diff --git a/app/Domains/Ticketing/Event/Models/Event.php b/app/Domains/Ticketing/Event/Models/Event.php index ca3e042d..d27905f1 100644 --- a/app/Domains/Ticketing/Event/Models/Event.php +++ b/app/Domains/Ticketing/Event/Models/Event.php @@ -3,7 +3,6 @@ namespace App\Domains\Ticketing\Event\Models; use App\Domains\Commerce\Catalog\Models\CatalogItem; -use App\Domains\Core\Client\Models\Client; use App\Domains\Core\Tenant\Models\SocialMedia; use App\Domains\Core\Tenant\Models\Tenant; use App\Domains\Ticketing\Ticket\Models\Ticket; @@ -15,14 +14,14 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Database\Eloquent\Relations\HasMany; -#[Fillable(['client_id', 'tenant_code', 'slug', 'event_category_id', 'title', 'subtitle', 'description', 'location', 'exact_location', 'date_text', 'published_at', 'attachment_id'])] +#[Fillable(['tenant_code', 'slug', 'event_category_id', 'title', 'subtitle', 'description', 'location', 'exact_location', 'date_text', 'published_at', 'attachment_id'])] class Event extends Model { use HasFactory; protected function casts(): array { - return ['client_id' => 'integer', 'published_at' => 'datetime', 'exact_location' => 'array']; + return ['published_at' => 'datetime', 'exact_location' => 'array']; } /** @return BelongsTo */ @@ -31,17 +30,6 @@ class Event extends Model return $this->belongsTo(Tenant::class, 'tenant_code', 'codigo'); } - /** @return BelongsTo */ - public function client(): BelongsTo - { - return $this->belongsTo(Client::class); - } - - public function effectiveClient(): Client - { - return $this->client ?? $this->tenant->client; - } - /** @return BelongsTo */ public function eventCategory(): BelongsTo { diff --git a/app/Domains/Ticketing/FiestaFutbolInfantil/Controllers/AccommodationController.php b/app/Domains/Ticketing/FiestaFutbolInfantil/Controllers/AccommodationController.php index e21425d3..fb9ca451 100644 --- a/app/Domains/Ticketing/FiestaFutbolInfantil/Controllers/AccommodationController.php +++ b/app/Domains/Ticketing/FiestaFutbolInfantil/Controllers/AccommodationController.php @@ -28,7 +28,6 @@ class AccommodationController extends Controller $this->accommodationService->upsertMany( $tenant, $request->validated('variants'), - $request->validated('stock_adjustment_id'), ) ); } diff --git a/app/Domains/Ticketing/FiestaFutbolInfantil/Controllers/EntryController.php b/app/Domains/Ticketing/FiestaFutbolInfantil/Controllers/EntryController.php index 2fa4d1e1..68b11636 100644 --- a/app/Domains/Ticketing/FiestaFutbolInfantil/Controllers/EntryController.php +++ b/app/Domains/Ticketing/FiestaFutbolInfantil/Controllers/EntryController.php @@ -29,7 +29,6 @@ class EntryController extends Controller $entries = $this->entryService->upsertMany( $tenant, $request->validated('entries'), - $request->validated('stock_adjustment_id'), ); return EntryResource::collection($entries) diff --git a/app/Domains/Ticketing/FiestaFutbolInfantil/Controllers/FoodController.php b/app/Domains/Ticketing/FiestaFutbolInfantil/Controllers/FoodController.php index 86d5b5f4..e580cc8d 100644 --- a/app/Domains/Ticketing/FiestaFutbolInfantil/Controllers/FoodController.php +++ b/app/Domains/Ticketing/FiestaFutbolInfantil/Controllers/FoodController.php @@ -29,7 +29,6 @@ class FoodController extends Controller $this->foodService->upsertMany( $tenant, $request->validated('variants'), - $request->validated('stock_adjustment_id'), ) ); } @@ -40,7 +39,6 @@ class FoodController extends Controller $this->foodService->updateHistoricalStock( $request->user()->tenant()->firstOrFail(), $request->validated('variants'), - $request->validated('stock_adjustment_id'), ) ); } diff --git a/app/Domains/Ticketing/FiestaFutbolInfantil/Controllers/MerchandiseController.php b/app/Domains/Ticketing/FiestaFutbolInfantil/Controllers/MerchandiseController.php index dd52f9a0..10b0307f 100644 --- a/app/Domains/Ticketing/FiestaFutbolInfantil/Controllers/MerchandiseController.php +++ b/app/Domains/Ticketing/FiestaFutbolInfantil/Controllers/MerchandiseController.php @@ -28,7 +28,6 @@ class MerchandiseController extends Controller $items = $this->merchandiseService->upsertMany( $tenant, $request->validated('items'), - $request->validated('stock_adjustment_id'), ); return MerchandiseResource::collection($items) diff --git a/app/Domains/Ticketing/FiestaFutbolInfantil/Requests/UpdateHistoricalFoodStockRequest.php b/app/Domains/Ticketing/FiestaFutbolInfantil/Requests/UpdateHistoricalFoodStockRequest.php index caa5e853..aa784622 100644 --- a/app/Domains/Ticketing/FiestaFutbolInfantil/Requests/UpdateHistoricalFoodStockRequest.php +++ b/app/Domains/Ticketing/FiestaFutbolInfantil/Requests/UpdateHistoricalFoodStockRequest.php @@ -16,10 +16,9 @@ class UpdateHistoricalFoodStockRequest extends FormRequest { return [ 'variants' => ['required', 'array', 'min:1', 'max:500'], - 'stock_adjustment_id' => ['nullable', 'uuid'], - 'variants.*' => ['required', 'array:id,stock_difference'], + 'variants.*' => ['required', 'array:id,stock'], 'variants.*.id' => ['required', 'integer', 'distinct'], - 'variants.*.stock_difference' => ['required', 'integer'], + 'variants.*.stock' => ['required', 'integer', 'min:0'], ]; } } diff --git a/app/Domains/Ticketing/FiestaFutbolInfantil/Requests/UpsertAccommodationVariantsRequest.php b/app/Domains/Ticketing/FiestaFutbolInfantil/Requests/UpsertAccommodationVariantsRequest.php index 7e2475eb..d275c487 100644 --- a/app/Domains/Ticketing/FiestaFutbolInfantil/Requests/UpsertAccommodationVariantsRequest.php +++ b/app/Domains/Ticketing/FiestaFutbolInfantil/Requests/UpsertAccommodationVariantsRequest.php @@ -3,7 +3,6 @@ namespace App\Domains\Ticketing\FiestaFutbolInfantil\Requests; use Illuminate\Foundation\Http\FormRequest; -use Illuminate\Validation\Validator; class UpsertAccommodationVariantsRequest extends FormRequest { @@ -17,42 +16,12 @@ class UpsertAccommodationVariantsRequest extends FormRequest { return [ 'variants' => ['required', 'array', 'min:1', 'max:500'], - 'stock_adjustment_id' => ['nullable', 'uuid'], - 'variants.*' => ['required', 'array:id,title,description,stock,stock_difference,price'], + 'variants.*' => ['required', 'array:id,title,description,stock,price'], 'variants.*.id' => ['sometimes', 'nullable', 'integer', 'distinct'], 'variants.*.title' => ['required', 'string', 'max:255'], 'variants.*.description' => ['sometimes', 'nullable', 'string'], - 'variants.*.stock' => ['sometimes', 'integer', 'min:0'], - 'variants.*.stock_difference' => ['sometimes', 'integer'], + 'variants.*.stock' => ['required', 'integer', 'min:0'], 'variants.*.price' => ['required', 'numeric', 'min:0', 'max:99999999.99'], ]; } - - /** @return array */ - public function after(): array - { - return [ - function (Validator $validator): void { - foreach ($this->input('variants', []) as $index => $variant) { - if (! is_array($variant)) { - continue; - } - - if (isset($variant['id']) && ! array_key_exists('stock_difference', $variant)) { - $validator->errors()->add( - "variants.{$index}.stock_difference", - 'La diferencia de stock es obligatoria al actualizar una variante.', - ); - } - - if (! isset($variant['id']) && ! array_key_exists('stock', $variant)) { - $validator->errors()->add( - "variants.{$index}.stock", - 'El stock inicial es obligatorio al crear una variante.', - ); - } - } - }, - ]; - } } diff --git a/app/Domains/Ticketing/FiestaFutbolInfantil/Requests/UpsertEntriesRequest.php b/app/Domains/Ticketing/FiestaFutbolInfantil/Requests/UpsertEntriesRequest.php index 2b982850..6827fc4b 100644 --- a/app/Domains/Ticketing/FiestaFutbolInfantil/Requests/UpsertEntriesRequest.php +++ b/app/Domains/Ticketing/FiestaFutbolInfantil/Requests/UpsertEntriesRequest.php @@ -20,8 +20,7 @@ class UpsertEntriesRequest extends FormRequest return [ 'entries' => ['required', 'array', 'min:1', 'max:100'], - 'stock_adjustment_id' => ['nullable', 'uuid'], - 'entries.*' => ['required', 'array:id,title,description,event_date_ids,stock,stock_difference,price'], + 'entries.*' => ['required', 'array:id,title,description,event_date_ids,stock,price'], 'entries.*.id' => [ 'sometimes', 'nullable', @@ -47,8 +46,7 @@ class UpsertEntriesRequest extends FormRequest fn ($query) => $query->where('tenant_code', $tenantCode) ), ], - 'entries.*.stock' => ['sometimes', 'integer', 'min:0'], - 'entries.*.stock_difference' => ['sometimes', 'integer'], + 'entries.*.stock' => ['required', 'integer', 'min:0'], 'entries.*.price' => ['required', 'numeric', 'min:0', 'max:99999999.99'], ]; } @@ -63,20 +61,6 @@ class UpsertEntriesRequest extends FormRequest continue; } - if (isset($entry['id']) && ! array_key_exists('stock_difference', $entry)) { - $validator->errors()->add( - "entries.{$index}.stock_difference", - 'La diferencia de stock es obligatoria al actualizar una entrada.', - ); - } - - if (! isset($entry['id']) && ! array_key_exists('stock', $entry)) { - $validator->errors()->add( - "entries.{$index}.stock", - 'El stock inicial es obligatorio al crear una entrada.', - ); - } - $dateIds = $entry['event_date_ids'] ?? []; if (! is_array($dateIds)) { diff --git a/app/Domains/Ticketing/FiestaFutbolInfantil/Requests/UpsertFoodVariantsRequest.php b/app/Domains/Ticketing/FiestaFutbolInfantil/Requests/UpsertFoodVariantsRequest.php index 50b557d5..164ca981 100644 --- a/app/Domains/Ticketing/FiestaFutbolInfantil/Requests/UpsertFoodVariantsRequest.php +++ b/app/Domains/Ticketing/FiestaFutbolInfantil/Requests/UpsertFoodVariantsRequest.php @@ -20,8 +20,7 @@ class UpsertFoodVariantsRequest extends FormRequest return [ 'variants' => ['required', 'array', 'min:1', 'max:500'], - 'stock_adjustment_id' => ['nullable', 'uuid'], - 'variants.*' => ['required', 'array:id,event_date_id,schedule,service,description,stock,stock_difference,price'], + 'variants.*' => ['required', 'array:id,event_date_id,schedule,service,description,stock,price'], 'variants.*.id' => ['sometimes', 'nullable', 'integer', 'distinct'], 'variants.*.event_date_id' => [ 'required', @@ -33,8 +32,7 @@ class UpsertFoodVariantsRequest extends FormRequest 'variants.*.schedule' => ['required', 'string', 'max:255'], 'variants.*.service' => ['required', 'string', 'max:255'], 'variants.*.description' => ['sometimes', 'nullable', 'string'], - 'variants.*.stock' => ['sometimes', 'integer', 'min:0'], - 'variants.*.stock_difference' => ['sometimes', 'integer'], + 'variants.*.stock' => ['required', 'integer', 'min:0'], 'variants.*.price' => ['required', 'numeric', 'min:0', 'max:99999999.99'], ]; } @@ -51,20 +49,6 @@ class UpsertFoodVariantsRequest extends FormRequest continue; } - if (isset($variant['id']) && ! array_key_exists('stock_difference', $variant)) { - $validator->errors()->add( - "variants.{$index}.stock_difference", - 'La diferencia de stock es obligatoria al actualizar una variante.', - ); - } - - if (! isset($variant['id']) && ! array_key_exists('stock', $variant)) { - $validator->errors()->add( - "variants.{$index}.stock", - 'El stock inicial es obligatorio al crear una variante.', - ); - } - $key = implode('|', [ $variant['event_date_id'] ?? '', mb_strtolower(trim((string) ($variant['schedule'] ?? ''))), diff --git a/app/Domains/Ticketing/FiestaFutbolInfantil/Requests/UpsertMerchandiseRequest.php b/app/Domains/Ticketing/FiestaFutbolInfantil/Requests/UpsertMerchandiseRequest.php index 0e683413..862a59a0 100644 --- a/app/Domains/Ticketing/FiestaFutbolInfantil/Requests/UpsertMerchandiseRequest.php +++ b/app/Domains/Ticketing/FiestaFutbolInfantil/Requests/UpsertMerchandiseRequest.php @@ -4,7 +4,6 @@ namespace App\Domains\Ticketing\FiestaFutbolInfantil\Requests; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Validation\Rule; -use Illuminate\Validation\Validator; class UpsertMerchandiseRequest extends FormRequest { @@ -40,49 +39,12 @@ class UpsertMerchandiseRequest extends FormRequest 'items.*.description' => ['sometimes', 'nullable', 'string'], 'items.*.max_units_per_user' => ['required', 'integer', 'min:1'], 'items.*.variants' => ['required', 'array', 'min:1', 'max:500'], - 'stock_adjustment_id' => ['nullable', 'uuid'], - 'items.*.variants.*' => ['required', 'array:id,color,size,stock,stock_difference,price'], + 'items.*.variants.*' => ['required', 'array:id,color,size,stock,price'], 'items.*.variants.*.id' => ['sometimes', 'nullable', 'integer', 'distinct'], 'items.*.variants.*.color' => ['required', 'string', 'max:255'], 'items.*.variants.*.size' => ['required', 'string', 'max:255'], - 'items.*.variants.*.stock' => ['sometimes', 'integer', 'min:0'], - 'items.*.variants.*.stock_difference' => ['sometimes', 'integer'], + 'items.*.variants.*.stock' => ['required', 'integer', 'min:0'], 'items.*.variants.*.price' => ['required', 'numeric', 'min:0', 'max:99999999.99'], ]; } - - /** @return array */ - public function after(): array - { - return [ - function (Validator $validator): void { - foreach ($this->input('items', []) as $itemIndex => $item) { - if (! is_array($item)) { - continue; - } - - foreach ($item['variants'] ?? [] as $variantIndex => $variant) { - if (! is_array($variant)) { - continue; - } - - $prefix = "items.{$itemIndex}.variants.{$variantIndex}"; - if (isset($variant['id']) && ! array_key_exists('stock_difference', $variant)) { - $validator->errors()->add( - "{$prefix}.stock_difference", - 'La diferencia de stock es obligatoria al actualizar una variante.', - ); - } - - if (! isset($variant['id']) && ! array_key_exists('stock', $variant)) { - $validator->errors()->add( - "{$prefix}.stock", - 'El stock inicial es obligatorio al crear una variante.', - ); - } - } - } - }, - ]; - } } diff --git a/app/Domains/Ticketing/FiestaFutbolInfantil/Resources/AccommodationResource.php b/app/Domains/Ticketing/FiestaFutbolInfantil/Resources/AccommodationResource.php index 9b3a9d06..b3cb3186 100644 --- a/app/Domains/Ticketing/FiestaFutbolInfantil/Resources/AccommodationResource.php +++ b/app/Domains/Ticketing/FiestaFutbolInfantil/Resources/AccommodationResource.php @@ -37,7 +37,7 @@ class AccommodationResource extends JsonResource 'title' => $options->get($value)?->label ?? $value, 'value' => $value, 'description' => $variant->descripcion, - 'stock' => $variant->inventory->availableStock(), + 'stock' => $variant->inventory->real_stock, 'price' => number_format($variant->getPrice(), 2, '.', ''), ]; })->values(), diff --git a/app/Domains/Ticketing/FiestaFutbolInfantil/Resources/EntryResource.php b/app/Domains/Ticketing/FiestaFutbolInfantil/Resources/EntryResource.php index 7da32839..efce8a91 100644 --- a/app/Domains/Ticketing/FiestaFutbolInfantil/Resources/EntryResource.php +++ b/app/Domains/Ticketing/FiestaFutbolInfantil/Resources/EntryResource.php @@ -33,7 +33,7 @@ class EntryResource extends JsonResource 'title' => $this->nombre, 'description' => $this->descripcion, 'event_date_ids' => $variant->selectedEventDates()->pluck('id')->values(), - 'stock' => $variant->inventory->availableStock(), + 'stock' => $variant->inventory->real_stock, 'price' => $this->precio, ]; } diff --git a/app/Domains/Ticketing/FiestaFutbolInfantil/Resources/FoodResource.php b/app/Domains/Ticketing/FiestaFutbolInfantil/Resources/FoodResource.php index 34d7abfb..436e62da 100644 --- a/app/Domains/Ticketing/FiestaFutbolInfantil/Resources/FoodResource.php +++ b/app/Domains/Ticketing/FiestaFutbolInfantil/Resources/FoodResource.php @@ -81,7 +81,7 @@ class FoodResource extends JsonResource 'schedule' => $values->get('horario'), 'service' => $values->get('servicio'), 'description' => $variant->descripcion, - 'stock' => $variant->inventory->availableStock(), + 'stock' => $variant->inventory->real_stock, 'price' => number_format($variant->getPrice(), 2, '.', ''), ]; } diff --git a/app/Domains/Ticketing/FiestaFutbolInfantil/Resources/MerchandiseResource.php b/app/Domains/Ticketing/FiestaFutbolInfantil/Resources/MerchandiseResource.php index 369e0783..2b6f2a26 100644 --- a/app/Domains/Ticketing/FiestaFutbolInfantil/Resources/MerchandiseResource.php +++ b/app/Domains/Ticketing/FiestaFutbolInfantil/Resources/MerchandiseResource.php @@ -44,7 +44,7 @@ class MerchandiseResource extends JsonResource 'color_value' => $colorValue, 'size' => $sizeOptions->get($sizeValue)?->label ?? $sizeValue, 'size_value' => $sizeValue, - 'stock' => $variant->inventory->availableStock(), + 'stock' => $variant->inventory->real_stock, 'price' => number_format($variant->getPrice(), 2, '.', ''), ]; })->values(), diff --git a/app/Domains/Ticketing/FiestaFutbolInfantil/Services/AccommodationService.php b/app/Domains/Ticketing/FiestaFutbolInfantil/Services/AccommodationService.php index 4e33b50e..6e5baae2 100644 --- a/app/Domains/Ticketing/FiestaFutbolInfantil/Services/AccommodationService.php +++ b/app/Domains/Ticketing/FiestaFutbolInfantil/Services/AccommodationService.php @@ -39,9 +39,9 @@ class AccommodationService /** * @param array> $variants */ - public function upsertMany(Tenant $tenant, array $variants, ?string $stockAdjustmentId = null): CatalogItem + public function upsertMany(Tenant $tenant, array $variants): CatalogItem { - return DB::transaction(function () use ($tenant, $variants, $stockAdjustmentId): CatalogItem { + return DB::transaction(function () use ($tenant, $variants): CatalogItem { $attribute = $this->attribute($tenant); $accommodation = $this->accommodation($tenant, $variants); $itemAttribute = $accommodation->itemAttributes()->firstOrCreate( @@ -70,7 +70,7 @@ class AccommodationService if ($variant === null) { $this->createVariant($attribute, $accommodation, $itemAttribute, $data); } else { - $this->updateVariant($attribute, $variant, $itemAttribute, $data, $index, $stockAdjustmentId); + $this->updateVariant($attribute, $variant, $itemAttribute, $data, $index); } } @@ -169,7 +169,7 @@ class AccommodationService 'title' => trim($variant['title']), 'value' => $this->valueCode($variant['title']), 'description' => $variant['description'] ?? null, - ...(array_key_exists('stock', $variant) ? ['stock' => (int) $variant['stock']] : []), + 'stock' => (int) $variant['stock'], ])->all(); } @@ -212,7 +212,6 @@ class AccommodationService $this->createOption($attribute, $data['value'], $data['title']); $inventory = Inventory::query()->create(['real_stock' => $data['stock']]); - $inventory->recordInitialization(); $variant = $accommodation->variants()->create([ 'inventory_id' => $inventory->id, 'descripcion' => $data['description'], @@ -231,13 +230,20 @@ class AccommodationService ItemAttribute $itemAttribute, array $data, int $index, - ?string $stockAdjustmentId, ): void { $inventory = Inventory::query() ->whereKey($variant->inventory_id) ->lockForUpdate() ->firstOrFail(); + if ($data['stock'] < $inventory->reserved_stock) { + throw ValidationException::withMessages([ + "variants.{$index}.stock" => [ + 'El stock no puede ser menor que la cantidad actualmente reservada.', + ], + ]); + } + $definition = $variant->definitions ->firstWhere('item_attribute_id', $itemAttribute->id); $option = $definition === null @@ -257,10 +263,7 @@ class AccommodationService 'descripcion' => $data['description'], 'precio' => $data['price'], ]); - $inventory->adjustAvailableStock( - (int) $data['stock_difference'], - idempotencyKey: $stockAdjustmentId, - ); + $inventory->update(['real_stock' => $data['stock']]); $variant->definitions()->updateOrCreate( ['item_attribute_id' => $itemAttribute->id], ['value' => $data['value']], diff --git a/app/Domains/Ticketing/FiestaFutbolInfantil/Services/EntryService.php b/app/Domains/Ticketing/FiestaFutbolInfantil/Services/EntryService.php index 06ac4e09..5d028f5d 100644 --- a/app/Domains/Ticketing/FiestaFutbolInfantil/Services/EntryService.php +++ b/app/Domains/Ticketing/FiestaFutbolInfantil/Services/EntryService.php @@ -43,18 +43,18 @@ class EntryService * @param array> $entries * @return Collection */ - public function upsertMany(Tenant $tenant, array $entries, ?string $stockAdjustmentId = null): Collection + public function upsertMany(Tenant $tenant, array $entries): Collection { - return DB::transaction(function () use ($tenant, $entries, $stockAdjustmentId): Collection { + return DB::transaction(function () use ($tenant, $entries): Collection { $reservedSlugs = []; $category = Category::query()->firstOrCreate([ 'tenant_code' => $tenant->codigo, 'nombre' => 'Entradas', ]); - return collect($entries)->map(function (array $entry, int $index) use ($tenant, $category, $stockAdjustmentId, &$reservedSlugs): CatalogItem { + return collect($entries)->map(function (array $entry, int $index) use ($tenant, $category, &$reservedSlugs): CatalogItem { if (isset($entry['id'])) { - return $this->update($tenant, $category, $entry, $index, $stockAdjustmentId); + return $this->update($tenant, $category, $entry, $index); } $slug = $this->uniqueSlug($tenant, $entry['title'], $reservedSlugs); @@ -92,7 +92,7 @@ class EntryService } /** @param array $entry */ - private function update(Tenant $tenant, Category $category, array $entry, int $index, ?string $stockAdjustmentId): CatalogItem + private function update(Tenant $tenant, Category $category, array $entry, int $index): CatalogItem { $catalogItem = CatalogItem::query() ->whereKey($entry['id']) @@ -121,6 +121,14 @@ class EntryService ->lockForUpdate() ->firstOrFail(); + if ((int) $entry['stock'] < $inventory->reserved_stock) { + throw ValidationException::withMessages([ + "entries.{$index}.stock" => [ + 'El stock no puede ser menor que la cantidad actualmente reservada.', + ], + ]); + } + $eventDateIds = collect($entry['event_date_ids']) ->map(fn ($id): int => (int) $id) ->unique() @@ -141,10 +149,7 @@ class EntryService $catalogItem->itemAttributes() ->whereHas('attribute', fn ($query) => $query->where('codigo', 'event_date')) ->update(['allow_multi_select' => true]); - $inventory->adjustAvailableStock( - (int) $entry['stock_difference'], - idempotencyKey: $stockAdjustmentId, - ); + $inventory->update(['real_stock' => $entry['stock']]); return $catalogItem->load([ 'variants.inventory', diff --git a/app/Domains/Ticketing/FiestaFutbolInfantil/Services/FoodService.php b/app/Domains/Ticketing/FiestaFutbolInfantil/Services/FoodService.php index 1e194eaf..88488541 100644 --- a/app/Domains/Ticketing/FiestaFutbolInfantil/Services/FoodService.php +++ b/app/Domains/Ticketing/FiestaFutbolInfantil/Services/FoodService.php @@ -11,9 +11,9 @@ use App\Domains\Commerce\Catalog\Models\Inventory; use App\Domains\Commerce\Catalog\Models\ItemAttribute; use App\Domains\Commerce\Catalog\Models\Variant; use App\Domains\Commerce\Catalog\Services\CatalogService; -use App\Domains\Core\Tenant\Models\Tenant; use App\Domains\Ticketing\Event\Enums\EventDateStatus; use App\Domains\Ticketing\Event\Models\EventDate; +use App\Domains\Core\Tenant\Models\Tenant; use Illuminate\Support\Collection; use Illuminate\Support\Facades\DB; use Illuminate\Validation\ValidationException; @@ -50,9 +50,9 @@ class FoodService /** * @param array> $variants */ - public function upsertMany(Tenant $tenant, array $variants, ?string $stockAdjustmentId = null): CatalogItem + public function upsertMany(Tenant $tenant, array $variants): CatalogItem { - return DB::transaction(function () use ($tenant, $variants, $stockAdjustmentId): CatalogItem { + return DB::transaction(function () use ($tenant, $variants): CatalogItem { $attributes = $this->attributes($tenant); $food = $this->food($tenant, $variants); $itemAttributes = $this->itemAttributes($food, $attributes); @@ -85,7 +85,7 @@ class FoodService if ($variant === null) { $this->createVariant($food, $itemAttributes, $data); } else { - $this->updateVariant($variant, $itemAttributes, $data, $index, $stockAdjustmentId); + $this->updateVariant($variant, $itemAttributes, $data, $index); } } @@ -113,11 +113,11 @@ class FoodService } /** - * @param array $variants + * @param array $variants */ - public function updateHistoricalStock(Tenant $tenant, array $variants, ?string $stockAdjustmentId = null): CatalogItem + public function updateHistoricalStock(Tenant $tenant, array $variants): CatalogItem { - return DB::transaction(function () use ($tenant, $variants, $stockAdjustmentId): CatalogItem { + return DB::transaction(function () use ($tenant, $variants): CatalogItem { $food = CatalogItem::query() ->forTenantCatalog($tenant) ->where('slug', 'comida') @@ -142,11 +142,17 @@ class FoodService ]); } + $stock = (int) $data['stock']; $inventory = $this->inventoryForHistoricalStockUpdate($variant); - $inventory->adjustAvailableStock( - (int) $data['stock_difference'], - idempotencyKey: $stockAdjustmentId, - ); + if ($stock < $inventory->reserved_stock) { + throw ValidationException::withMessages([ + "variants.{$index}.stock" => [ + 'El stock no puede ser menor que la cantidad actualmente reservada.', + ], + ]); + } + + $inventory->update(['real_stock' => $stock]); } return $this->current($tenant) ?? $food; @@ -175,7 +181,6 @@ class FoodService 'reserved_stock' => 0, 'real_stock' => $inventory->real_stock, ]); - $historicalInventory->recordTransferInitialization(); $variant->update(['inventory_id' => $historicalInventory->getKey()]); return $historicalInventory; @@ -296,7 +301,7 @@ class FoodService 'schedule' => $schedule->value, 'service' => $service->value, 'description' => (string) ($variant['description'] ?? ''), - ...(array_key_exists('stock', $variant) ? ['stock' => (int) $variant['stock']] : []), + 'stock' => (int) $variant['stock'], ]; })->all(); } @@ -379,7 +384,6 @@ class FoodService private function createVariant(CatalogItem $food, Collection $itemAttributes, array $data): void { $inventory = Inventory::query()->create(['real_stock' => $data['stock']]); - $inventory->recordInitialization(); $variant = $food->variants()->create([ 'event_date_id' => $data['event_date_id'], 'inventory_id' => $inventory->id, @@ -396,23 +400,27 @@ class FoodService Collection $itemAttributes, array $data, int $index, - ?string $stockAdjustmentId, ): void { $inventory = Inventory::query() ->whereKey($variant->inventory_id) ->lockForUpdate() ->firstOrFail(); + if ($data['stock'] < $inventory->reserved_stock) { + throw ValidationException::withMessages([ + "variants.{$index}.stock" => [ + 'El stock no puede ser menor que la cantidad actualmente reservada.', + ], + ]); + } + $variant->update([ 'event_date_id' => $data['event_date_id'], 'descripcion' => $data['description'], 'precio' => $data['price'], ]); $variant->eventDates()->sync([$data['event_date_id']]); - $inventory->adjustAvailableStock( - (int) $data['stock_difference'], - idempotencyKey: $stockAdjustmentId, - ); + $inventory->update(['real_stock' => $data['stock']]); $this->syncDefinitions($variant, $itemAttributes, $data); } diff --git a/app/Domains/Ticketing/FiestaFutbolInfantil/Services/MerchandiseService.php b/app/Domains/Ticketing/FiestaFutbolInfantil/Services/MerchandiseService.php index 9beaac2d..3d3183ca 100644 --- a/app/Domains/Ticketing/FiestaFutbolInfantil/Services/MerchandiseService.php +++ b/app/Domains/Ticketing/FiestaFutbolInfantil/Services/MerchandiseService.php @@ -43,9 +43,9 @@ class MerchandiseService * @param array> $items * @return Collection */ - public function upsertMany(Tenant $tenant, array $items, ?string $stockAdjustmentId = null): Collection + public function upsertMany(Tenant $tenant, array $items): Collection { - return DB::transaction(function () use ($tenant, $items, $stockAdjustmentId): Collection { + return DB::transaction(function () use ($tenant, $items): Collection { $attributes = $this->attributes($tenant); $category = Category::query()->firstOrCreate([ 'tenant_code' => $tenant->codigo, @@ -57,7 +57,6 @@ class MerchandiseService $tenant, $attributes, $category, - $stockAdjustmentId, &$reservedSlugs, ): CatalogItem { $item = isset($data['id']) @@ -102,7 +101,7 @@ class MerchandiseService if ($variant === null) { $this->createVariant($item, $itemAttributes, $variantData); } else { - $this->updateVariant($variant, $itemAttributes, $variantData, $index, $variantIndex, $stockAdjustmentId); + $this->updateVariant($variant, $itemAttributes, $variantData, $index, $variantIndex); } } @@ -245,7 +244,7 @@ class MerchandiseService ...$variant, 'color' => $color->value, 'size' => $size->value, - ...(array_key_exists('stock', $variant) ? ['stock' => (int) $variant['stock']] : []), + 'stock' => (int) $variant['stock'], ]; })->all(); } @@ -343,7 +342,6 @@ class MerchandiseService array $data, ): void { $inventory = Inventory::query()->create(['real_stock' => $data['stock']]); - $inventory->recordInitialization(); $variant = $item->variants()->create([ 'inventory_id' => $inventory->id, 'precio' => $data['price'], @@ -361,18 +359,22 @@ class MerchandiseService array $data, int $itemIndex, int $variantIndex, - ?string $stockAdjustmentId, ): void { $inventory = Inventory::query() ->whereKey($variant->inventory_id) ->lockForUpdate() ->firstOrFail(); + if ($data['stock'] < $inventory->reserved_stock) { + throw ValidationException::withMessages([ + "items.{$itemIndex}.variants.{$variantIndex}.stock" => [ + 'El stock no puede ser menor que la cantidad actualmente reservada.', + ], + ]); + } + $variant->update(['precio' => $data['price']]); - $inventory->adjustAvailableStock( - (int) $data['stock_difference'], - idempotencyKey: $stockAdjustmentId, - ); + $inventory->update(['real_stock' => $data['stock']]); $this->syncDefinitions($variant, $itemAttributes, $data); } diff --git a/app/Domains/Ticketing/Ticket/Services/AdminAppTicketService.php b/app/Domains/Ticketing/Ticket/Services/AdminAppTicketService.php index 2dede24a..81dbfa0f 100644 --- a/app/Domains/Ticketing/Ticket/Services/AdminAppTicketService.php +++ b/app/Domains/Ticketing/Ticket/Services/AdminAppTicketService.php @@ -228,13 +228,13 @@ class AdminAppTicketService 'amount' => number_format($refundAmount, 2, '.', ''), ]); - $this->restoreInventory($ticket, $purchaseItem, $createdBy); + $this->restoreInventory($ticket, $purchaseItem); return $ticket->refresh()->load(self::RELATIONS); }); } - private function restoreInventory(Ticket $ticket, PurchaseItem $purchaseItem, ?User $createdBy): void + private function restoreInventory(Ticket $ticket, PurchaseItem $purchaseItem): void { $catalogItem = $ticket->sourceCatalogItem; if ($catalogItem === null) { @@ -272,7 +272,11 @@ class AdminAppTicketService throw ValidationException::withMessages(['ticket' => 'No se encontró el inventario del ticket.']); } - $inventory->refundStock(1, $createdBy); + if ($catalogItem->inventory_policy === InventoryPolicy::Tracked) { + $inventory->real_stock++; + } + $inventory->refunded_units++; + $inventory->save(); } private function refundedAmountForPurchaseItem(PurchaseItem $purchaseItem): float diff --git a/app/Domains/Ticketing/Ticket/Services/BackfillRefundedUnitsService.php b/app/Domains/Ticketing/Ticket/Services/BackfillRefundedUnitsService.php index dd9acdc7..d403ded8 100644 --- a/app/Domains/Ticketing/Ticket/Services/BackfillRefundedUnitsService.php +++ b/app/Domains/Ticketing/Ticket/Services/BackfillRefundedUnitsService.php @@ -2,7 +2,6 @@ namespace App\Domains\Ticketing\Ticket\Services; -use App\Domains\Commerce\Catalog\Models\Inventory; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Log; use RuntimeException; @@ -65,9 +64,14 @@ class BackfillRefundedUnitsService }, 'refunds.id', 'id'); foreach ($counts as $inventoryId => $count) { - $inventory = Inventory::query()->lockForUpdate()->find($inventoryId) - ?? throw new RuntimeException("No se encontró el inventario {$inventoryId} para reponerlo."); - $inventory->refundStock($count['refunded']); + $updates = ['refunded_units' => DB::raw('refunded_units + '.$count['refunded'])]; + if (($count['stock'] ?? 0) > 0) { + $updates['real_stock'] = DB::raw('real_stock + '.$count['stock']); + } + + if (DB::table('inventories')->where('id', $inventoryId)->update($updates) !== 1) { + throw new RuntimeException("No se encontró el inventario {$inventoryId} para reponerlo."); + } } $refundedUnitsAdded = array_sum(array_column($counts, 'refunded')); @@ -78,8 +82,7 @@ class BackfillRefundedUnitsService 'bundles_skipped' => $bundlesSkipped, 'inventories_updated' => count($counts), 'refunded_units_added' => $refundedUnitsAdded, - 'real_stock_added' => 0, - 'available_stock_added' => $refundedUnitsAdded, + 'real_stock_added' => array_sum(array_column($counts, 'stock')), ]; }); diff --git a/app/Shared/Integration/Services/BaseIntegrationService.php b/app/Shared/Integration/Services/BaseIntegrationService.php index 09f16b1b..a0244730 100644 --- a/app/Shared/Integration/Services/BaseIntegrationService.php +++ b/app/Shared/Integration/Services/BaseIntegrationService.php @@ -3,12 +3,11 @@ namespace App\Shared\Integration\Services; use App\Domains\Core\Client\Models\Client; -use App\Domains\Core\Tenant\Models\Tenant; -use App\Domains\Ticketing\Event\Models\Event; -use App\Shared\Integration\Models\AdminWebsiteTypeIntegration; use App\Shared\Integration\Models\ClientIntegration; use App\Shared\Integration\Models\Integration; use App\Shared\Integration\Models\IntegrationInstance; +use App\Shared\Integration\Models\AdminWebsiteTypeIntegration; +use App\Domains\Core\Tenant\Models\Tenant; use Exception; use Illuminate\Http\Client\PendingRequest; use Illuminate\Support\Facades\Http; @@ -87,17 +86,6 @@ abstract class BaseIntegrationService return $this; } - public function forEvent(Event $event): self - { - $event->loadMissing(['client', 'tenant.client']); - $this->tenant = $event->tenant; - $this->tenantCode = $event->tenant_code; - $this->clientContext = $event->effectiveClient(); - $this->loadIntegration(); - - return $this; - } - /** * Load the integration definition and its effective instance configuration. * diff --git a/app/Shared/Integration/Services/MailService.php b/app/Shared/Integration/Services/MailService.php index cadffb0b..71682e0a 100644 --- a/app/Shared/Integration/Services/MailService.php +++ b/app/Shared/Integration/Services/MailService.php @@ -3,9 +3,8 @@ namespace App\Shared\Integration\Services; use App\Domains\Core\Client\Models\Client; -use App\Domains\Core\Tenant\Models\AdminWebsiteType; use App\Domains\Core\Tenant\Models\Tenant; -use App\Domains\Ticketing\Event\Models\Event; +use App\Domains\Core\Tenant\Models\AdminWebsiteType; use Exception; use Illuminate\Contracts\Mail\Factory as MailFactory; use Illuminate\Contracts\Mail\Mailer; @@ -40,7 +39,14 @@ class MailService extends BaseIntegrationService public function forTenant(string $tenantCode): self { parent::forTenant($tenantCode); - $this->configureMailer(); + + if ($this->integrationInstance) { + $this->mailer = $this->resolveMailer(); + $this->usesInstanceMailer = true; + } else { + $this->mailer = $this->mailFactory->mailer(); + $this->usesInstanceMailer = false; + } return $this; } @@ -49,30 +55,16 @@ class MailService extends BaseIntegrationService { parent::forClient($client); $this->tenant = $this->clientContext?->tenants()->first(); - $this->configureMailer(); - return $this; - } - - public function forEvent(Event $event): self - { - parent::forEvent($event); - $this->configureMailer(); - - return $this; - } - - private function configureMailer(): void - { if ($this->integrationInstance) { $this->mailer = $this->resolveMailer(); $this->usesInstanceMailer = true; - - return; + } else { + $this->mailer = $this->mailFactory->mailer(); + $this->usesInstanceMailer = false; } - $this->mailer = $this->mailFactory->mailer(); - $this->usesInstanceMailer = false; + return $this; } public function getHeaders(): array @@ -91,7 +83,7 @@ class MailService extends BaseIntegrationService array $attachments = [], ): void { if (! $this->mailer || ! $this->tenant) { - throw new Exception('MailService no está configurado. Llamá a forTenant(), forClient() o forEvent() primero.'); + throw new Exception('MailService no está configurado. Llamá a forTenant() o forClient() primero.'); } $brand ??= $this->tenant; @@ -168,7 +160,7 @@ class MailService extends BaseIntegrationService public function onSetup(): void { if (! $this->mailer || ! $this->clientContext) { - throw new Exception('MailService no está configurado. Llamá a forTenant(), forClient() o forEvent() primero.'); + throw new Exception('MailService no está configurado. Llamá a forTenant() o forClient() primero.'); } $recipient = $this->getIntegrationSetting('MAIL_FROM_ADDRESS'); diff --git a/app/Shared/Integration/Services/TelepagosIntegrationService.php b/app/Shared/Integration/Services/TelepagosIntegrationService.php index 424d02b5..83ac8101 100644 --- a/app/Shared/Integration/Services/TelepagosIntegrationService.php +++ b/app/Shared/Integration/Services/TelepagosIntegrationService.php @@ -46,7 +46,7 @@ class TelepagosIntegrationService extends BaseIntegrationService public function getToken(): string { if (! $this->integrationInstance) { - throw new Exception('Client integration is not loaded. Call forTenant(), forClient(), or forEvent() first.'); + throw new Exception('Client integration is not loaded. Call forTenant() or forClient() first.'); } $cacheKey = $this->integrationInstance->tokenCacheKey(); diff --git a/app/Shared/Integration/Services/TelepagosWebhookService.php b/app/Shared/Integration/Services/TelepagosWebhookService.php index 20699e8a..8c120cb7 100644 --- a/app/Shared/Integration/Services/TelepagosWebhookService.php +++ b/app/Shared/Integration/Services/TelepagosWebhookService.php @@ -2,12 +2,12 @@ namespace App\Shared\Integration\Services; +use App\Domains\Core\Client\Models\Client; use App\Domains\Commerce\Purchase\Models\Purchase; use App\Domains\Commerce\Purchase\Models\TelepagosPayment; use App\Domains\Commerce\Purchase\Models\TelepagosQr; use App\Domains\Commerce\Purchase\Services\CheckoutService; use App\Domains\Commerce\Purchase\Services\DniDistanceService; -use App\Domains\Core\Client\Models\Client; use Exception; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Collection; @@ -75,30 +75,9 @@ class TelepagosWebhookService $dni = substr($cuit, 2, -1); + $tenantCodes = $client->tenants()->pluck('codigo'); $eligiblePurchases = Purchase::query() - ->where(function (Builder $purchases) use ($client): void { - $purchases - ->whereHas('event', function (Builder $events) use ($client): void { - $events - ->where('client_id', $client->id) - ->orWhere(function (Builder $fallback) use ($client): void { - $fallback - ->whereNull('client_id') - ->whereHas( - 'tenant', - fn (Builder $tenants): Builder => $tenants->where('client_id', $client->id), - ); - }); - }) - ->orWhere(function (Builder $legacy) use ($client): void { - $legacy - ->whereNull('event_id') - ->whereHas( - 'tenant', - fn (Builder $tenants): Builder => $tenants->where('client_id', $client->id), - ); - }); - }) + ->whereIn('tenant_codigo', $tenantCodes) ->whereIn('status', [ Purchase::STATUS_CREATED, Purchase::STATUS_PENDING_PAYMENT, @@ -191,7 +170,7 @@ class TelepagosWebhookService return; } - if (! $this->purchaseBelongsToClient($compra, $client)) { + if (! $client->tenants()->where('codigo', $compra->tenant_codigo)->exists()) { Log::channel('telepagos')->warning('Telepagos webhook: Purchase does not belong to client.', [ 'client_code' => $client->code, 'cashin_id' => $cashinId, @@ -265,16 +244,6 @@ class TelepagosWebhookService return number_format((float) $amount, 2, '.', ''); } - private function purchaseBelongsToClient(Purchase $purchase, Client $client): bool - { - $purchase->loadMissing(['event.client', 'event.tenant.client', 'tenant.client']); - - $effectiveClient = $purchase->event?->effectiveClient() - ?? $purchase->tenant?->client; - - return $effectiveClient?->is($client) ?? false; - } - /** * @param Builder $eligiblePurchases * @return Collection diff --git a/app/Shared/Notification/Services/NotificationMailService.php b/app/Shared/Notification/Services/NotificationMailService.php index 00866957..707436d3 100644 --- a/app/Shared/Notification/Services/NotificationMailService.php +++ b/app/Shared/Notification/Services/NotificationMailService.php @@ -2,16 +2,16 @@ namespace App\Shared\Notification\Services; -use App\Domains\Commerce\Purchase\Models\Purchase; use App\Domains\Core\Auth\Models\ResetPasswordAttempt; use App\Domains\Core\Auth\Models\User; +use App\Shared\Integration\Services\MailService; +use App\Shared\Notification\Events\PasswordResetRequested; +use App\Domains\Commerce\Purchase\Models\Purchase; use App\Domains\Core\Tenant\Models\Tenant; use App\Domains\Ticketing\Ticket\Models\Ticket; use App\Domains\Ticketing\Ticket\Services\TicketPdfService; use App\Domains\Ticketing\Ticket\Services\TicketPresentationResolver; use App\Domains\Ticketing\Ticket\Services\TicketValidityResolver; -use App\Shared\Integration\Services\MailService; -use App\Shared\Notification\Events\PasswordResetRequested; use Closure; use Illuminate\Support\Collection; use Illuminate\Support\Facades\Log; @@ -158,7 +158,7 @@ class NotificationMailService $context = ['purchase_id' => $purchaseId]; $purchase = Purchase::query() - ->with(['event', 'tenant', 'user', 'items']) + ->with(['tenant', 'user', 'items']) ->find($purchaseId); if ($purchase === null) { @@ -197,7 +197,8 @@ class NotificationMailService 'mime' => 'application/pdf', ]]; - $this->mailForPurchase($purchase) + $this->mailService + ->forTenant($purchase->tenant_codigo) ->send( $recipient, "Compra confirmada - Compra #{$purchase->getKey()}", @@ -285,6 +286,7 @@ class NotificationMailService $context, $recipient, function () use ( + $tenantCode, $purchase, $recipient, $previousDate, @@ -293,7 +295,8 @@ class NotificationMailService ): array { $brand = $purchase->tenant; - $this->mailForPurchase($purchase) + $this->mailService + ->forTenant($tenantCode) ->send( $recipient, "Tu evento fue reprogramado - N° de Orden #{$purchase->getKey()}", @@ -384,6 +387,7 @@ class NotificationMailService $context, $recipient, function () use ( + $tenantCode, $purchase, $recipient, $date, @@ -392,7 +396,8 @@ class NotificationMailService ): array { $brand = $purchase->tenant; - $this->mailForPurchase($purchase) + $this->mailService + ->forTenant($tenantCode) ->send( $recipient, "Una fecha de tu evento fue suspendida - N° de Orden #{$purchase->getKey()}", @@ -416,17 +421,10 @@ class NotificationMailService { return Purchase::query() ->where('tenant_codigo', $tenantCode) - ->with(['event', 'tenant', 'user']) + ->with(['tenant', 'user']) ->find($purchaseId); } - private function mailForPurchase(Purchase $purchase): MailService - { - return $purchase->event - ? $this->mailService->forEvent($purchase->event) - : $this->mailService->forTenant($purchase->tenant_codigo); - } - private function recipientFor(Purchase $purchase): string { return (string) ($purchase->email ?: $purchase->user?->email); diff --git a/database/data/mutual_smep_catalog_v1.json b/database/data/mutual_smep_catalog_v1.json deleted file mode 100644 index ab9f26d1..00000000 --- a/database/data/mutual_smep_catalog_v1.json +++ /dev/null @@ -1,2691 +0,0 @@ -{ - "version": 1, - "tenant_code": "mutual_smep", - "default_stock": 10, - "source_product_count": 150, - "catalog_item_count": 142, - "image_count": 511, - "items": [ - { - "slug": "acolchado-1-1-2-pl-dobby-kavanagh-negro", - "name": "Acolchado 1 1/2 pl Dobby Kavanagh negro", - "description": null, - "price": 82000, - "stock": 10, - "brand": "Kavanagh", - "parent_category": "Dormitorio y Blanco", - "category": "Acolchados y Edredones", - "images": [ - "images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/acolchado-1-1-2-pl-dobby-kavanagh-negro-01.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "acolchado-kavanagh-simil-plumon-reversible", - "name": "Acolchado Kavanagh Símil Plumón Reversible", - "description": "Color sujeto a disponibilidad", - "price": 86000, - "stock": null, - "brand": "Kavanagh", - "parent_category": "Dormitorio y Blanco", - "category": "Acolchados y Edredones", - "images": [], - "attribute_codes": [ - "medida_cama" - ], - "variants": [ - { - "source_slug": "acolchado-queen-simil-plumon-reversible-kavanagh", - "description": "Color sujeto a disponibilidad", - "price": 100000, - "stock": 10, - "values": { - "medida_cama": "Queen" - }, - "images": [ - "images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/acolchado-queen-simil-plumon-reversible-kavanagh-01.webp", - "images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/acolchado-queen-simil-plumon-reversible-kavanagh-02.webp" - ] - }, - { - "source_slug": "acolchado-1-1-2-pl-kavanagh-simil-plumon-reversible", - "description": null, - "price": 86000, - "stock": 10, - "values": { - "medida_cama": "1 1/2 Plazas" - }, - "images": [ - "images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/acolchado-1-1-2-pl-kavanagh-simil-plumon-reversible-01.webp" - ] - }, - { - "source_slug": "acolchado-king-kavanagh-simil-plumon-reversible", - "description": null, - "price": 125000, - "stock": 10, - "values": { - "medida_cama": "King" - }, - "images": [ - "images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/acolchado-king-kavanagh-simil-plumon-reversible-01.webp" - ] - } - ] - }, - { - "slug": "acolchado-king-kavanagh-simil-plumon-con-2-fundas-almohadon", - "name": "Acolchado King Kavanagh Simil plumón con 2 fundas almohadón", - "description": null, - "price": 130000, - "stock": 10, - "brand": "Kavanagh", - "parent_category": "Dormitorio y Blanco", - "category": "Acolchados y Edredones", - "images": [ - "images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/acolchado-king-kavanagh-simil-plumon-con-2-fundas-almohadon-01.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "acolchado-queen-hotel-oxford-platinum-700-h-jc", - "name": "Acolchado Queen Hotel Oxford Platinum 700 H JC", - "description": "Color sujeto a disponibilidad", - "price": 100000, - "stock": 10, - "brand": "Jean Cartier", - "parent_category": "Dormitorio y Blanco", - "category": "Acolchados y Edredones", - "images": [ - "images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/acolchado-queen-hotel-oxford-platinum-700-h-jc-01.webp", - "images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/acolchado-queen-hotel-oxford-platinum-700-h-jc-02.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "acolchado-sense-duo-bitono-corderito", - "name": "Acolchado Sense Dúo Bitono con Corderito", - "description": "Color sujeto a disponibilidad", - "price": 70000, - "stock": null, - "brand": "Jean Cartier", - "parent_category": "Dormitorio y Blanco", - "category": "Acolchados y Edredones", - "images": [], - "attribute_codes": [ - "medida_cama" - ], - "variants": [ - { - "source_slug": "acolchado-king-sense-duo-bitono-con-corderito-jc", - "description": "Color sujeto a disponibilidad", - "price": 100000, - "stock": 10, - "values": { - "medida_cama": "King" - }, - "images": [ - "images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/acolchado-king-sense-duo-bitono-con-corderito-jc-01.webp", - "images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/acolchado-king-sense-duo-bitono-con-corderito-jc-02.webp", - "images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/acolchado-king-sense-duo-bitono-con-corderito-jc-03.webp" - ] - }, - { - "source_slug": "acolchado-1-1-2-pl-sense-duo-bitono-con-corderito-jc", - "description": "Color sujeto a disponibilidad", - "price": 70000, - "stock": 10, - "values": { - "medida_cama": "1 1/2 Plazas" - }, - "images": [ - "images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/acolchado-1-1-2-pl-sense-duo-bitono-con-corderito-jc-01.webp", - "images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/acolchado-1-1-2-pl-sense-duo-bitono-con-corderito-jc-02.webp", - "images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/acolchado-1-1-2-pl-sense-duo-bitono-con-corderito-jc-03.webp" - ] - } - ] - }, - { - "slug": "auricular-bt-negro-on-ear-moonki-sound-mh-0510bt", - "name": "Auricular BT negro on ear Moonki sound MH-0510BT", - "description": "Color sujeto a disponibilidad", - "price": 30000, - "stock": 10, - "brand": "Moonki", - "parent_category": "Tecnología", - "category": "Audio", - "images": [ - "images/tennants/mutual_smep/catalog/tecnologia/auricular-bt-negro-on-ear-moonki-sound-mh-0510bt-01.webp", - "images/tennants/mutual_smep/catalog/tecnologia/auricular-bt-negro-on-ear-moonki-sound-mh-0510bt-02.webp", - "images/tennants/mutual_smep/catalog/tecnologia/auricular-bt-negro-on-ear-moonki-sound-mh-0510bt-03.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "auricular-moonki-earbuds-sound-ma-tws66-black", - "name": "Auricular Moonki Earbuds sound MA-TWS66 black", - "description": null, - "price": 16000, - "stock": 10, - "brand": "Moonki", - "parent_category": "Tecnología", - "category": "Audio", - "images": [ - "images/tennants/mutual_smep/catalog/tecnologia/auricular-moonki-earbuds-sound-ma-tws66-black-01.webp", - "images/tennants/mutual_smep/catalog/tecnologia/auricular-moonki-earbuds-sound-ma-tws66-black-02.webp", - "images/tennants/mutual_smep/catalog/tecnologia/auricular-moonki-earbuds-sound-ma-tws66-black-03.webp", - "images/tennants/mutual_smep/catalog/tecnologia/auricular-moonki-earbuds-sound-ma-tws66-black-04.webp", - "images/tennants/mutual_smep/catalog/tecnologia/auricular-moonki-earbuds-sound-ma-tws66-black-05.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "auricular-on-ear-moonki-sound-mh-0613", - "name": "Auricular on ear Moonki sound MH-0613", - "description": "Color sujeto a disponibilidad", - "price": 15000, - "stock": 10, - "brand": "Moonki", - "parent_category": "Tecnología", - "category": "Audio", - "images": [ - "images/tennants/mutual_smep/catalog/tecnologia/auricular-on-ear-moonki-sound-mh-0613-01.webp", - "images/tennants/mutual_smep/catalog/tecnologia/auricular-on-ear-moonki-sound-mh-0613-02.webp", - "images/tennants/mutual_smep/catalog/tecnologia/auricular-on-ear-moonki-sound-mh-0613-03.webp", - "images/tennants/mutual_smep/catalog/tecnologia/auricular-on-ear-moonki-sound-mh-0613-04.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "bafle-havit-bluetooth-sk-816bt", - "name": "Bafle Havit Bluetooth SK-816BT", - "description": null, - "price": 145000, - "stock": 10, - "brand": "Havit", - "parent_category": "Tecnología", - "category": "Audio", - "images": [ - "images/tennants/mutual_smep/catalog/tecnologia/bafle-havit-bluetooth-sk-816bt-01.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "batidora-de-mano-oster-hm-2600-negra", - "name": "Batidora de mano Oster HM 2600 negra", - "description": null, - "price": 97000, - "stock": 10, - "brand": "Oster", - "parent_category": "Electrodomésticos", - "category": "Preparación de Alimentos", - "images": [ - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/batidora-de-mano-oster-hm-2600-negra-01.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/batidora-de-mano-oster-hm-2600-negra-02.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/batidora-de-mano-oster-hm-2600-negra-03.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "batidora-planetaria-atma-bpat21wp", - "name": "Batidora planetaria Atma BPAT21WP", - "description": null, - "price": 225000, - "stock": 10, - "brand": "Atma", - "parent_category": "Electrodomésticos", - "category": "Preparación de Alimentos", - "images": [ - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/batidora-planetaria-atma-bpat21wp-01.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/batidora-planetaria-atma-bpat21wp-02.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/batidora-planetaria-atma-bpat21wp-03.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/batidora-planetaria-atma-bpat21wp-04.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/batidora-planetaria-atma-bpat21wp-05.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/batidora-planetaria-atma-bpat21wp-06.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "bici-stark-r16-flowers-pink-nena-c-acc-6095", - "name": "BICI STARK R16 FLOWERS/PINK NENA C/ACC 6095", - "description": "El color de los accesorios puede variar", - "price": 320000, - "stock": 10, - "brand": "Stark", - "parent_category": "Bicicletas y Aire Libre", - "category": "Bicicletas Infantiles", - "images": [ - "images/tennants/mutual_smep/catalog/bicicletas/bici-stark-r16-flowers-pink-nena-c-acc-6095-01.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "bici-stark-r16-team-junior-nene-6064", - "name": "BICI STARK R16 TEAM JUNIOR NENE 6064", - "description": null, - "price": 300000, - "stock": 10, - "brand": "Stark", - "parent_category": "Bicicletas y Aire Libre", - "category": "Bicicletas Infantiles", - "images": [ - "images/tennants/mutual_smep/catalog/bicicletas/bici-stark-r16-team-junior-nene-6064-01.webp", - "images/tennants/mutual_smep/catalog/bicicletas/bici-stark-r16-team-junior-nene-6064-02.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "bicicleta-fire-bird-r29-frenio-disco", - "name": "BICICLETA FIRE BIRD R29 FRENIO DISCO", - "description": null, - "price": 399000, - "stock": 10, - "brand": "Fire Bird", - "parent_category": "Bicicletas y Aire Libre", - "category": "Bicicletas para Adultos", - "images": [ - "images/tennants/mutual_smep/catalog/bicicletas/bicicleta-fire-bird-r29-frenio-disco-01.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "bicicleta-playera-ross-full-r26", - "name": "BICICLETA PLAYERA ROSS FULL R26", - "description": null, - "price": 300000, - "stock": 10, - "brand": "Ross", - "parent_category": "Bicicletas y Aire Libre", - "category": "Bicicletas para Adultos", - "images": [ - "images/tennants/mutual_smep/catalog/bicicletas/bicicleta-playera-ross-full-r26-01.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "bicicleta-venzo-loki-r29-fd-21-v-shimano", - "name": "BICICLETA VENZO LOKI R29 FD 21 V SHIMANO", - "description": null, - "price": 660000, - "stock": 10, - "brand": "Venzo", - "parent_category": "Bicicletas y Aire Libre", - "category": "Bicicletas para Adultos", - "images": [ - "images/tennants/mutual_smep/catalog/bicicletas/bicicleta-venzo-loki-r29-fd-21-v-shimano-01.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "blu-g73-128-gb", - "name": "BLU G73 128 GB", - "description": "Color sujeto a disponibilidad", - "price": 225000, - "stock": 10, - "brand": "BLU", - "parent_category": "Tecnología", - "category": "Celulares", - "images": [ - "images/tennants/mutual_smep/catalog/celulares/blu-g73-128-gb-01.webp", - "images/tennants/mutual_smep/catalog/celulares/blu-g73-128-gb-02.webp", - "images/tennants/mutual_smep/catalog/celulares/blu-g73-128-gb-03.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "cafetera-atma-ca-8182p-digital-1000-w-1-8-l", - "name": "Cafetera Atma CA-8182P digital 1000 W 1,8 L", - "description": null, - "price": 85000, - "stock": 10, - "brand": "Atma", - "parent_category": "Electrodomésticos", - "category": "Café y Desayuno", - "images": [ - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-atma-ca-8182p-digital-1000-w-1-8-l-01.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-atma-ca-8182p-digital-1000-w-1-8-l-02.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-atma-ca-8182p-digital-1000-w-1-8-l-03.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "cafetera-express-atma-ceat-5418p-1-litro", - "name": "Cafetera Express Atma CEAT-5418P 1 Litro", - "description": null, - "price": 275000, - "stock": 10, - "brand": "Atma", - "parent_category": "Electrodomésticos", - "category": "Café y Desayuno", - "images": [ - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-atma-ceat-5418p-1-litro-01.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-atma-ceat-5418p-1-litro-02.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-atma-ceat-5418p-1-litro-03.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-atma-ceat-5418p-1-litro-04.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-atma-ceat-5418p-1-litro-05.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-atma-ceat-5418p-1-litro-06.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-atma-ceat-5418p-1-litro-07.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-atma-ceat-5418p-1-litro-08.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-atma-ceat-5418p-1-litro-09.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-atma-ceat-5418p-1-litro-10.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "cafetera-express-liliana-ac-980-3-en-1", - "name": "Cafetera Express Liliana AC-980 3 en 1", - "description": null, - "price": 310000, - "stock": 10, - "brand": "Liliana", - "parent_category": "Electrodomésticos", - "category": "Café y Desayuno", - "images": [ - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-liliana-ac-980-3-en-1-01.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-liliana-ac-980-3-en-1-02.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-liliana-ac-980-3-en-1-03.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-liliana-ac-980-3-en-1-04.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-liliana-ac-980-3-en-1-05.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-liliana-ac-980-3-en-1-06.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-liliana-ac-980-3-en-1-07.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-liliana-ac-980-3-en-1-08.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "cafetera-moulinex-mini-me-dolce-capsulas", - "name": "Cafetera Moulinex mini me Dolce cápsulas", - "description": null, - "price": 230000, - "stock": 10, - "brand": "Moulinex", - "parent_category": "Electrodomésticos", - "category": "Café y Desayuno", - "images": [ - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-moulinex-mini-me-dolce-capsulas-01.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-moulinex-mini-me-dolce-capsulas-02.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-moulinex-mini-me-dolce-capsulas-03.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "calefactor-de-vidrio-whitenblack-pvwb-01-pie-pared", - "name": "Calefactor de vidrio Whitenblack PVWB-01 Pie/Pared", - "description": null, - "price": 100000, - "stock": 10, - "brand": "Whitenblack", - "parent_category": "Climatización", - "category": "Calefacción Eléctrica", - "images": [ - "images/tennants/mutual_smep/catalog/calefaccion-electrica/calefactor-de-vidrio-whitenblack-pvwb-01-pie-pared-01.webp", - "images/tennants/mutual_smep/catalog/calefaccion-electrica/calefactor-de-vidrio-whitenblack-pvwb-01-pie-pared-02.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "calefactor-infrarrojo-liliana-calore-ci-080-fijo-1400-w", - "name": "Calefactor infrarrojo Liliana Calore CI-080 fijo 1400 W", - "description": null, - "price": 70000, - "stock": 10, - "brand": "Liliana", - "parent_category": "Climatización", - "category": "Calefacción Eléctrica", - "images": [ - "images/tennants/mutual_smep/catalog/calefaccion-electrica/calefactor-infrarrojo-liliana-calore-ci-080-fijo-1400-w-01.webp", - "images/tennants/mutual_smep/catalog/calefaccion-electrica/calefactor-infrarrojo-liliana-calore-ci-080-fijo-1400-w-02.webp", - "images/tennants/mutual_smep/catalog/calefaccion-electrica/calefactor-infrarrojo-liliana-calore-ci-080-fijo-1400-w-03.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "calefon-longvie-14-l-cn-514-ss-n-enc-sensor", - "name": "Calefón Longvie 14 L CN-514 SS-N Enc. Sensor", - "description": null, - "price": 690000, - "stock": 10, - "brand": "Longvie", - "parent_category": "Electrodomésticos", - "category": "Calefones y Termotanques", - "images": [ - "images/tennants/mutual_smep/catalog/calefones-y-termotanques/calefon-longvie-14-l-cn-514-ss-n-enc-sensor-01.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "caloventor-liliana-cfh417-hotwind-2000-w", - "name": "Caloventor Liliana CFH417 Hotwind 2000 W", - "description": null, - "price": 58000, - "stock": 10, - "brand": "Liliana", - "parent_category": "Climatización", - "category": "Calefacción Eléctrica", - "images": [ - "images/tennants/mutual_smep/catalog/calefaccion-electrica/caloventor-liliana-cfh417-hotwind-2000-w-01.webp", - "images/tennants/mutual_smep/catalog/calefaccion-electrica/caloventor-liliana-cfh417-hotwind-2000-w-02.webp", - "images/tennants/mutual_smep/catalog/calefaccion-electrica/caloventor-liliana-cfh417-hotwind-2000-w-03.webp", - "images/tennants/mutual_smep/catalog/calefaccion-electrica/caloventor-liliana-cfh417-hotwind-2000-w-04.webp", - "images/tennants/mutual_smep/catalog/calefaccion-electrica/caloventor-liliana-cfh417-hotwind-2000-w-05.webp", - "images/tennants/mutual_smep/catalog/calefaccion-electrica/caloventor-liliana-cfh417-hotwind-2000-w-06.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "caloventor-split-liliana-whitenblack-cpwb-01-2000-w", - "name": "Caloventor split Liliana Whitenblack CPWB-01 2000 W", - "description": null, - "price": 110000, - "stock": 10, - "brand": "Liliana", - "parent_category": "Climatización", - "category": "Calefacción Eléctrica", - "images": [ - "images/tennants/mutual_smep/catalog/calefaccion-electrica/caloventor-split-liliana-whitenblack-cpwb-01-2000-w-01.webp", - "images/tennants/mutual_smep/catalog/calefaccion-electrica/caloventor-split-liliana-whitenblack-cpwb-01-2000-w-02.webp", - "images/tennants/mutual_smep/catalog/calefaccion-electrica/caloventor-split-liliana-whitenblack-cpwb-01-2000-w-03.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "caloventor-whitenblack-cawb-02-2000-w-doble-posicion", - "name": "Caloventor Whitenblack CAWB-02 2000 W doble posición", - "description": null, - "price": 46000, - "stock": 10, - "brand": "Whitenblack", - "parent_category": "Climatización", - "category": "Calefacción Eléctrica", - "images": [ - "images/tennants/mutual_smep/catalog/calefaccion-electrica/caloventor-whitenblack-cawb-02-2000-w-doble-posicion-01.webp", - "images/tennants/mutual_smep/catalog/calefaccion-electrica/caloventor-whitenblack-cawb-02-2000-w-doble-posicion-02.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "cocina-florencia-5536-f-56-cm-color-blanca", - "name": "Cocina Florencia 5536-F 56 cm color Blanca", - "description": "Multigas", - "price": 620000, - "stock": 10, - "brand": "Florencia", - "parent_category": "Electrodomésticos", - "category": "Cocinas", - "images": [ - "images/tennants/mutual_smep/catalog/cocinas/cocina-florencia-5536-f-56-cm-color-blanca-01.webp", - "images/tennants/mutual_smep/catalog/cocinas/cocina-florencia-5536-f-56-cm-color-blanca-02.webp", - "images/tennants/mutual_smep/catalog/cocinas/cocina-florencia-5536-f-56-cm-color-blanca-03.webp", - "images/tennants/mutual_smep/catalog/cocinas/cocina-florencia-5536-f-56-cm-color-blanca-04.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "cocina-longvie-13331bf-56-cm-color-blanca", - "name": "Cocina Longvie 13331BF 56 cm color blanca", - "description": "Multigas", - "price": 940000, - "stock": 10, - "brand": "Longvie", - "parent_category": "Electrodomésticos", - "category": "Cocinas", - "images": [ - "images/tennants/mutual_smep/catalog/cocinas/cocina-longvie-13331bf-56-cm-color-blanca-01.webp", - "images/tennants/mutual_smep/catalog/cocinas/cocina-longvie-13331bf-56-cm-color-blanca-02.webp", - "images/tennants/mutual_smep/catalog/cocinas/cocina-longvie-13331bf-56-cm-color-blanca-03.webp", - "images/tennants/mutual_smep/catalog/cocinas/cocina-longvie-13331bf-56-cm-color-blanca-04.webp", - "images/tennants/mutual_smep/catalog/cocinas/cocina-longvie-13331bf-56-cm-color-blanca-05.webp", - "images/tennants/mutual_smep/catalog/cocinas/cocina-longvie-13331bf-56-cm-color-blanca-06.webp", - "images/tennants/mutual_smep/catalog/cocinas/cocina-longvie-13331bf-56-cm-color-blanca-07.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "cocina-longvie-13331xf-56cm-acero-inoxidable", - "name": "Cocina Longvie 13331XF 56cm Acero inoxidable", - "description": null, - "price": 999000, - "stock": 10, - "brand": "Longvie", - "parent_category": "Electrodomésticos", - "category": "Cocinas", - "images": [ - "images/tennants/mutual_smep/catalog/cocinas/cocina-longvie-13331xf-56cm-acero-inoxidable-01.webp", - "images/tennants/mutual_smep/catalog/cocinas/cocina-longvie-13331xf-56cm-acero-inoxidable-02.webp", - "images/tennants/mutual_smep/catalog/cocinas/cocina-longvie-13331xf-56cm-acero-inoxidable-03.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "cocina-longvie-13501bf-56-cm-color-blanca", - "name": "Cocina Longvie 13501BF 56 cm color Blanca", - "description": "Multigas", - "price": 1100000, - "stock": 10, - "brand": "Longvie", - "parent_category": "Electrodomésticos", - "category": "Cocinas", - "images": [ - "images/tennants/mutual_smep/catalog/cocinas/cocina-longvie-13501bf-56-cm-color-blanca-01.webp", - "images/tennants/mutual_smep/catalog/cocinas/cocina-longvie-13501bf-56-cm-color-blanca-02.webp", - "images/tennants/mutual_smep/catalog/cocinas/cocina-longvie-13501bf-56-cm-color-blanca-03.webp", - "images/tennants/mutual_smep/catalog/cocinas/cocina-longvie-13501bf-56-cm-color-blanca-04.webp", - "images/tennants/mutual_smep/catalog/cocinas/cocina-longvie-13501bf-56-cm-color-blanca-05.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "colchon-espuma-inducol-aurelia-0-80x1-90x0-20", - "name": "Colchón Espuma Inducol Aurelia 0,80x1,90x0,20", - "description": null, - "price": 175000, - "stock": 10, - "brand": "Inducol", - "parent_category": "Dormitorio y Blanco", - "category": "Colchones", - "images": [ - "images/tennants/mutual_smep/catalog/colchon-1-plaza-0-80x1-90/colchon-espuma-inducol-aurelia-0-80x1-90x0-20-01.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "colchon-inducol-constanza", - "name": "Colchón Inducol Constanza", - "description": null, - "price": 280000, - "stock": null, - "brand": "Inducol", - "parent_category": "Dormitorio y Blanco", - "category": "Colchones", - "images": [], - "attribute_codes": [ - "medida_cama" - ], - "variants": [ - { - "source_slug": "colchon-inducol-constanza-espuma-alta-densidad-080x24", - "description": null, - "price": 280000, - "stock": 10, - "values": { - "medida_cama": "1 Plaza" - }, - "images": [ - "images/tennants/mutual_smep/catalog/colchon-1-plaza-0-80x1-90/colchon-inducol-constanza-espuma-alta-densidad-080x24-01.webp", - "images/tennants/mutual_smep/catalog/colchon-1-plaza-0-80x1-90/colchon-inducol-constanza-espuma-alta-densidad-080x24-02.webp" - ] - }, - { - "source_slug": "colchon-inducol-constanza-espuma-alta-densidad-1-40x1-90x0-24", - "description": null, - "price": 475000, - "stock": 10, - "values": { - "medida_cama": "2 Plazas" - }, - "images": [ - "images/tennants/mutual_smep/catalog/colchon-2-plazas-1-40x1-90/colchon-inducol-constanza-espuma-alta-densidad-1-40x1-90x0-24-01.webp", - "images/tennants/mutual_smep/catalog/colchon-2-plazas-1-40x1-90/colchon-inducol-constanza-espuma-alta-densidad-1-40x1-90x0-24-02.webp" - ] - } - ] - }, - { - "slug": "colchon-king-koil-g22-espuma-alta-densidad-1-40x1-90x0-24", - "name": "Colchón King Koil G22 Espuma Alta Densidad 1,40x1,90x0,24", - "description": "Viene en bolsa, fácil traslado. \n\nEl fabricante recomienda esperar 24hs luego de desenrollado para comenzar a usarse.", - "price": 347000, - "stock": 10, - "brand": "King Koil", - "parent_category": "Dormitorio y Blanco", - "category": "Colchones", - "images": [ - "images/tennants/mutual_smep/catalog/colchon-2-plazas-1-40x1-90/colchon-king-koil-g22-espuma-alta-densidad-1-40x1-90x0-24-01.webp", - "images/tennants/mutual_smep/catalog/colchon-2-plazas-1-40x1-90/colchon-king-koil-g22-espuma-alta-densidad-1-40x1-90x0-24-02.webp", - "images/tennants/mutual_smep/catalog/colchon-2-plazas-1-40x1-90/colchon-king-koil-g22-espuma-alta-densidad-1-40x1-90x0-24-03.webp", - "images/tennants/mutual_smep/catalog/colchon-2-plazas-1-40x1-90/colchon-king-koil-g22-espuma-alta-densidad-1-40x1-90x0-24-04.webp", - "images/tennants/mutual_smep/catalog/colchon-2-plazas-1-40x1-90/colchon-king-koil-g22-espuma-alta-densidad-1-40x1-90x0-24-05.webp", - "images/tennants/mutual_smep/catalog/colchon-2-plazas-1-40x1-90/colchon-king-koil-g22-espuma-alta-densidad-1-40x1-90x0-24-06.webp", - "images/tennants/mutual_smep/catalog/colchon-2-plazas-1-40x1-90/colchon-king-koil-g22-espuma-alta-densidad-1-40x1-90x0-24-07.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "colchon-king-koil-resortes-bradley-080x190x026", - "name": "Colchón King Koil resortes Bradley 080x190x026", - "description": null, - "price": 400000, - "stock": 10, - "brand": "King Koil", - "parent_category": "Dormitorio y Blanco", - "category": "Colchones", - "images": [ - "images/tennants/mutual_smep/catalog/colchon-1-plaza-0-80x1-90/colchon-king-koil-resortes-bradley-080x190x026-01.webp", - "images/tennants/mutual_smep/catalog/colchon-1-plaza-0-80x1-90/colchon-king-koil-resortes-bradley-080x190x026-02.webp", - "images/tennants/mutual_smep/catalog/colchon-1-plaza-0-80x1-90/colchon-king-koil-resortes-bradley-080x190x026-03.webp", - "images/tennants/mutual_smep/catalog/colchon-1-plaza-0-80x1-90/colchon-king-koil-resortes-bradley-080x190x026-04.webp", - "images/tennants/mutual_smep/catalog/colchon-1-plaza-0-80x1-90/colchon-king-koil-resortes-bradley-080x190x026-05.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "colchon-piero-body-matelasse-espuma-media-densidad-0-90x1-90x0-20", - "name": "Colchón Piero Body Matelasse Espuma Media Densidad 0,90x1,90x0,20", - "description": null, - "price": 300000, - "stock": 10, - "brand": "Piero", - "parent_category": "Dormitorio y Blanco", - "category": "Colchones", - "images": [ - "images/tennants/mutual_smep/catalog/colchon-1-plaza-0-80x1-90/colchon-piero-body-matelasse-espuma-media-densidad-0-90x1-90x0-20-01.webp", - "images/tennants/mutual_smep/catalog/colchon-1-plaza-0-80x1-90/colchon-piero-body-matelasse-espuma-media-densidad-0-90x1-90x0-20-02.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "colchon-piero-resorte-corona-real-0-8x1-90x0-26", - "name": "COLCHON PIERO RESORTE CORONA REAL 0,8X1,90X0,26", - "description": null, - "price": 325000, - "stock": 10, - "brand": "Piero", - "parent_category": "Dormitorio y Blanco", - "category": "Colchones", - "images": [ - "images/tennants/mutual_smep/catalog/colchon-1-plaza-0-80x1-90/colchon-piero-resorte-corona-real-0-8x1-90x0-26-01.webp", - "images/tennants/mutual_smep/catalog/colchon-1-plaza-0-80x1-90/colchon-piero-resorte-corona-real-0-8x1-90x0-26-02.webp", - "images/tennants/mutual_smep/catalog/colchon-1-plaza-0-80x1-90/colchon-piero-resorte-corona-real-0-8x1-90x0-26-03.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "colchon-suavegom-espuma-merit-doble-pillow-140x190x029", - "name": "Colchón Suavegom Espuma Merit Doble Pillow 140x190x029", - "description": "Color sujeto a disponibilidad", - "price": 650000, - "stock": 10, - "brand": "Suavegom", - "parent_category": "Dormitorio y Blanco", - "category": "Colchones", - "images": [ - "images/tennants/mutual_smep/catalog/colchon-2-plazas-1-40x1-90/colchon-suavegom-espuma-merit-doble-pillow-140x190x029-01.webp", - "images/tennants/mutual_smep/catalog/colchon-2-plazas-1-40x1-90/colchon-suavegom-espuma-merit-doble-pillow-140x190x029-02.webp", - "images/tennants/mutual_smep/catalog/colchon-2-plazas-1-40x1-90/colchon-suavegom-espuma-merit-doble-pillow-140x190x029-03.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "cortabarba-philips-bt-7201", - "name": "Cortabarba Philips BT-7201", - "description": null, - "price": 70000, - "stock": 10, - "brand": "Philips", - "parent_category": "Electrodomésticos", - "category": "Cuidado Personal", - "images": [ - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cortabarba-philips-bt-7201-01.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cortabarba-philips-bt-7201-02.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cortabarba-philips-bt-7201-03.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "cortacabello-philips-qc-5560-8-posiciones", - "name": "Cortacabello Philips QC 5560 8 Posiciones", - "description": null, - "price": 45000, - "stock": 10, - "brand": "Philips", - "parent_category": "Electrodomésticos", - "category": "Cuidado Personal", - "images": [ - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cortacabello-philips-qc-5560-8-posiciones-01.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cortacabello-philips-qc-5560-8-posiciones-02.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cortacabello-philips-qc-5560-8-posiciones-03.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "edredon-1-1-2-pl-londres-jc", - "name": "Edredón 1 1/2 pl Londres JC", - "description": "Color sujeto a disponibilidad", - "price": 50000, - "stock": 10, - "brand": "Jean Cartier", - "parent_category": "Dormitorio y Blanco", - "category": "Acolchados y Edredones", - "images": [ - "images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/edredon-1-1-2-pl-londres-jc-01.webp", - "images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/edredon-1-1-2-pl-londres-jc-02.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "edredon-lisboa-jean-cartier", - "name": "Edredón Lisboa Jean Cartier", - "description": "Color sujeto a disponibilidad", - "price": 90000, - "stock": null, - "brand": "Jean Cartier", - "parent_category": "Dormitorio y Blanco", - "category": "Acolchados y Edredones", - "images": [], - "attribute_codes": [ - "medida_cama" - ], - "variants": [ - { - "source_slug": "edredon-2-1-2-pl-lisboa-jc", - "description": "Color sujeto a disponibilidad", - "price": 120000, - "stock": 10, - "values": { - "medida_cama": "2 1/2 Plazas" - }, - "images": [ - "images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/edredon-2-1-2-pl-lisboa-jc-01.webp", - "images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/edredon-2-1-2-pl-lisboa-jc-02.webp" - ] - }, - { - "source_slug": "edredon-1-1-2-pl-lisboa-jc", - "description": null, - "price": 90000, - "stock": 10, - "values": { - "medida_cama": "1 1/2 Plazas" - }, - "images": [ - "images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/edredon-1-1-2-pl-lisboa-jc-01.webp" - ] - } - ] - }, - { - "slug": "eskabe-3000-cal-s21-mx3-sin-salida", - "name": "Eskabe 3000 cal. S21 MX3 sin salida", - "description": "Color marfil", - "price": 290000, - "stock": 10, - "brand": "Eskabe", - "parent_category": "Climatización", - "category": "Calefactores a Gas sin Salida", - "images": [ - "images/tennants/mutual_smep/catalog/calefactor-sin-salida-al-ext/eskabe-3000-cal-s21-mx3-sin-salida-01.webp", - "images/tennants/mutual_smep/catalog/calefactor-sin-salida-al-ext/eskabe-3000-cal-s21-mx3-sin-salida-02.webp", - "images/tennants/mutual_smep/catalog/calefactor-sin-salida-al-ext/eskabe-3000-cal-s21-mx3-sin-salida-03.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "eskabe-3000-cal-s21-tiro-balanceado-sin-termostato", - "name": "Eskabe 3000 cal. S21 Tiro Balanceado sin termostato", - "description": null, - "price": 430000, - "stock": 10, - "brand": "Eskabe", - "parent_category": "Climatización", - "category": "Calefactores a Gas con Salida", - "images": [ - "images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/eskabe-3000-cal-s21-tiro-balanceado-sin-termostato-01.webp", - "images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/eskabe-3000-cal-s21-tiro-balanceado-sin-termostato-02.webp", - "images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/eskabe-3000-cal-s21-tiro-balanceado-sin-termostato-03.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "eskabe-3000-cal-tiro-balanceado-con-termostato", - "name": "Eskabe 3000 cal. Tiro Balanceado con termostato", - "description": null, - "price": 450000, - "stock": 10, - "brand": "Eskabe", - "parent_category": "Climatización", - "category": "Calefactores a Gas con Salida", - "images": [ - "images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/eskabe-3000-cal-tiro-balanceado-con-termostato-01.webp", - "images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/eskabe-3000-cal-tiro-balanceado-con-termostato-02.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "eskabe-tt-2000-cal-tiro-balanceado-con-termostato", - "name": "Eskabe TT 2000 cal. Tiro Balanceado con termostato", - "description": null, - "price": 450000, - "stock": 10, - "brand": "Eskabe", - "parent_category": "Climatización", - "category": "Calefactores a Gas con Salida", - "images": [ - "images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/eskabe-tt-2000-cal-tiro-balanceado-con-termostato-01.webp", - "images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/eskabe-tt-2000-cal-tiro-balanceado-con-termostato-02.webp", - "images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/eskabe-tt-2000-cal-tiro-balanceado-con-termostato-03.webp", - "images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/eskabe-tt-2000-cal-tiro-balanceado-con-termostato-04.webp", - "images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/eskabe-tt-2000-cal-tiro-balanceado-con-termostato-05.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "eskabe-tt-3000-cal-tiro-balanceado-con-termostato", - "name": "Eskabe TT 3000 cal. Tiro Balanceado con termostato", - "description": null, - "price": 499000, - "stock": 10, - "brand": "Eskabe", - "parent_category": "Climatización", - "category": "Calefactores a Gas con Salida", - "images": [ - "images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/eskabe-tt-3000-cal-tiro-balanceado-con-termostato-01.webp", - "images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/eskabe-tt-3000-cal-tiro-balanceado-con-termostato-02.webp", - "images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/eskabe-tt-3000-cal-tiro-balanceado-con-termostato-03.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "exprimidor-electrico-liliana-ae-920-citrijug-40-w", - "name": "Exprimidor eléctrico Liliana AE-920 Citrijug 40 W", - "description": null, - "price": 35000, - "stock": 10, - "brand": "Liliana", - "parent_category": "Electrodomésticos", - "category": "Preparación de Alimentos", - "images": [ - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/exprimidor-electrico-liliana-ae-920-citrijug-40-w-01.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/exprimidor-electrico-liliana-ae-920-citrijug-40-w-02.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/exprimidor-electrico-liliana-ae-920-citrijug-40-w-03.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "frazada-2-1-2-pl-sherpa-doble-corderito-y-polar-jc", - "name": "Frazada 2 1/2 pl Sherpa doble corderito y polar JC", - "description": "Color sujeto a disponibilidad", - "price": 70000, - "stock": 10, - "brand": "Jean Cartier", - "parent_category": "Dormitorio y Blanco", - "category": "Frazadas y Mantas", - "images": [ - "images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/frazada-2-1-2-pl-sherpa-doble-corderito-y-polar-jc-01.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "frazada-kavanagh-premium-soft", - "name": "Frazada Kavanagh Premium Soft", - "description": "Color sujeto a disponibilidad", - "price": 47000, - "stock": null, - "brand": "Kavanagh", - "parent_category": "Dormitorio y Blanco", - "category": "Frazadas y Mantas", - "images": [], - "attribute_codes": [ - "medida_cama" - ], - "variants": [ - { - "source_slug": "frazada-polar-1-1-2-pl-kavanagh-premium-soft", - "description": null, - "price": 47000, - "stock": 10, - "values": { - "medida_cama": "1 1/2 Plazas" - }, - "images": [ - "images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/frazada-polar-1-1-2-pl-kavanagh-premium-soft-01.webp" - ] - }, - { - "source_slug": "frazada-polar-king-kavanagh-premium-soft", - "description": "Color sujeto a disponibilidad", - "price": 72000, - "stock": 10, - "values": { - "medida_cama": "King" - }, - "images": [ - "images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/frazada-polar-king-kavanagh-premium-soft-01.webp" - ] - } - ] - }, - { - "slug": "freidora-de-aire-peabody-pe-afd420n-4-2-l-digital", - "name": "Freidora de aire Peabody PE-AFD420N 4,2 L digital", - "description": null, - "price": 115000, - "stock": 10, - "brand": "Peabody", - "parent_category": "Electrodomésticos", - "category": "Freidoras y Cocción", - "images": [ - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/freidora-de-aire-peabody-pe-afd420n-4-2-l-digital-01.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/freidora-de-aire-peabody-pe-afd420n-4-2-l-digital-02.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/freidora-de-aire-peabody-pe-afd420n-4-2-l-digital-03.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/freidora-de-aire-peabody-pe-afd420n-4-2-l-digital-04.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/freidora-de-aire-peabody-pe-afd420n-4-2-l-digital-05.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/freidora-de-aire-peabody-pe-afd420n-4-2-l-digital-06.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/freidora-de-aire-peabody-pe-afd420n-4-2-l-digital-07.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/freidora-de-aire-peabody-pe-afd420n-4-2-l-digital-08.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "freidora-de-aire-peabody-pe-afg03n-7-l-grill", - "name": "Freidora de aire Peabody PE-AFG03N 7 L Grill", - "description": null, - "price": 260000, - "stock": 10, - "brand": "Peabody", - "parent_category": "Electrodomésticos", - "category": "Freidoras y Cocción", - "images": [ - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/freidora-de-aire-peabody-pe-afg03n-7-l-grill-01.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/freidora-de-aire-peabody-pe-afg03n-7-l-grill-02.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/freidora-de-aire-peabody-pe-afg03n-7-l-grill-03.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/freidora-de-aire-peabody-pe-afg03n-7-l-grill-04.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/freidora-de-aire-peabody-pe-afg03n-7-l-grill-05.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "heladera-gafa-hgf-358-afb-282-litros-blanca", - "name": "Heladera Gafa HGF 358 AFB 282 LITROS BLANCA", - "description": null, - "price": 780000, - "stock": 10, - "brand": "Gafa", - "parent_category": "Electrodomésticos", - "category": "Heladeras", - "images": [ - "images/tennants/mutual_smep/catalog/heladeras/heladera-gafa-hgf-358-afb-282-litros-blanca-01.webp", - "images/tennants/mutual_smep/catalog/heladeras/heladera-gafa-hgf-358-afb-282-litros-blanca-02.webp", - "images/tennants/mutual_smep/catalog/heladeras/heladera-gafa-hgf-358-afb-282-litros-blanca-03.webp", - "images/tennants/mutual_smep/catalog/heladeras/heladera-gafa-hgf-358-afb-282-litros-blanca-04.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "heladera-gafa-hgf-368afp-330-lt-color-plata", - "name": "Heladera Gafa HGF-368AFP 330 LT color plata", - "description": null, - "price": 910000, - "stock": 10, - "brand": "Gafa", - "parent_category": "Electrodomésticos", - "category": "Heladeras", - "images": [ - "images/tennants/mutual_smep/catalog/heladeras/heladera-gafa-hgf-368afp-330-lt-color-plata-01.webp", - "images/tennants/mutual_smep/catalog/heladeras/heladera-gafa-hgf-368afp-330-lt-color-plata-02.webp", - "images/tennants/mutual_smep/catalog/heladeras/heladera-gafa-hgf-368afp-330-lt-color-plata-03.webp", - "images/tennants/mutual_smep/catalog/heladeras/heladera-gafa-hgf-368afp-330-lt-color-plata-04.webp", - "images/tennants/mutual_smep/catalog/heladeras/heladera-gafa-hgf-368afp-330-lt-color-plata-05.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "heladera-gafa-hgf-388-afb-374-litros-blanca", - "name": "Heladera Gafa HGF 388 AFB 374 LITROS BLANCA", - "description": null, - "price": 950000, - "stock": 10, - "brand": "Gafa", - "parent_category": "Electrodomésticos", - "category": "Heladeras", - "images": [ - "images/tennants/mutual_smep/catalog/heladeras/heladera-gafa-hgf-388-afb-374-litros-blanca-01.webp", - "images/tennants/mutual_smep/catalog/heladeras/heladera-gafa-hgf-388-afb-374-litros-blanca-02.webp", - "images/tennants/mutual_smep/catalog/heladeras/heladera-gafa-hgf-388-afb-374-litros-blanca-03.webp", - "images/tennants/mutual_smep/catalog/heladeras/heladera-gafa-hgf-388-afb-374-litros-blanca-04.webp", - "images/tennants/mutual_smep/catalog/heladeras/heladera-gafa-hgf-388-afb-374-litros-blanca-05.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "heladera-no-frost-gafa-hgnf333p-inverter-356-l-plata", - "name": "Heladera No Frost Gafa HGNF333P Inverter 356 L plata", - "description": null, - "price": 950000, - "stock": 10, - "brand": "Gafa", - "parent_category": "Electrodomésticos", - "category": "Heladeras", - "images": [ - "images/tennants/mutual_smep/catalog/heladeras/heladera-no-frost-gafa-hgnf333p-inverter-356-l-plata-01.webp", - "images/tennants/mutual_smep/catalog/heladeras/heladera-no-frost-gafa-hgnf333p-inverter-356-l-plata-02.webp", - "images/tennants/mutual_smep/catalog/heladeras/heladera-no-frost-gafa-hgnf333p-inverter-356-l-plata-03.webp", - "images/tennants/mutual_smep/catalog/heladeras/heladera-no-frost-gafa-hgnf333p-inverter-356-l-plata-04.webp", - "images/tennants/mutual_smep/catalog/heladeras/heladera-no-frost-gafa-hgnf333p-inverter-356-l-plata-05.webp", - "images/tennants/mutual_smep/catalog/heladeras/heladera-no-frost-gafa-hgnf333p-inverter-356-l-plata-06.webp", - "images/tennants/mutual_smep/catalog/heladeras/heladera-no-frost-gafa-hgnf333p-inverter-356-l-plata-07.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "horno-electrico-25l-bgh-bhe-25m25i-duo-negro", - "name": "Horno Eléctrico 25L BGH BHE-25M25I Dúo negro", - "description": null, - "price": 145000, - "stock": 10, - "brand": "BGH", - "parent_category": "Electrodomésticos", - "category": "Hornos Eléctricos", - "images": [ - "images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/horno-electrico-25l-bgh-bhe-25m25i-duo-negro-01.webp", - "images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/horno-electrico-25l-bgh-bhe-25m25i-duo-negro-02.webp", - "images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/horno-electrico-25l-bgh-bhe-25m25i-duo-negro-03.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "horno-electrico-atma-grill-40-litros-c-2-anafes-hg-4022api", - "name": "Horno eléctrico Atma Grill 40 litros c/2 anafes HG-4022API", - "description": null, - "price": 250000, - "stock": 10, - "brand": "Atma", - "parent_category": "Electrodomésticos", - "category": "Hornos Eléctricos", - "images": [ - "images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/horno-electrico-atma-grill-40-litros-c-2-anafes-hg-4022api-01.webp", - "images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/horno-electrico-atma-grill-40-litros-c-2-anafes-hg-4022api-02.webp", - "images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/horno-electrico-atma-grill-40-litros-c-2-anafes-hg-4022api-03.webp", - "images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/horno-electrico-atma-grill-40-litros-c-2-anafes-hg-4022api-04.webp", - "images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/horno-electrico-atma-grill-40-litros-c-2-anafes-hg-4022api-05.webp", - "images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/horno-electrico-atma-grill-40-litros-c-2-anafes-hg-4022api-06.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "juguera-liliana-aj-950-nutrijug-vaso-350-ml-2-velocidades", - "name": "Juguera Liliana AJ-950 Nutrijug vaso 350 ml 2 velocidades", - "description": null, - "price": 120000, - "stock": 10, - "brand": "Liliana", - "parent_category": "Electrodomésticos", - "category": "Preparación de Alimentos", - "images": [ - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/juguera-liliana-aj-950-nutrijug-vaso-350-ml-2-velocidades-01.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/juguera-liliana-aj-950-nutrijug-vaso-350-ml-2-velocidades-02.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/juguera-liliana-aj-950-nutrijug-vaso-350-ml-2-velocidades-03.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "kit-acolchado-queen-zurich-2-fundas-almohadon-jc", - "name": "Kit Acolchado Queen Zúrich + 2 fundas almohadón JC", - "description": "Color sujeto a disponibilidad", - "price": 80000, - "stock": 10, - "brand": "Jean Cartier", - "parent_category": "Dormitorio y Blanco", - "category": "Acolchados y Edredones", - "images": [ - "images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/kit-acolchado-queen-zurich-2-fundas-almohadon-jc-01.webp", - "images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/kit-acolchado-queen-zurich-2-fundas-almohadon-jc-02.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "kit-edredon-alaska-corderito", - "name": "Kit Edredón Alaska con Corderito", - "description": "Color sujeto a disponibilidad", - "price": 130000, - "stock": null, - "brand": "Jean Cartier", - "parent_category": "Dormitorio y Blanco", - "category": "Acolchados y Edredones", - "images": [], - "attribute_codes": [ - "medida_cama" - ], - "variants": [ - { - "source_slug": "kit-edredon-2-1-2-pl-alaska-c-corderito-jc-2-fundas-almohadones", - "description": "Color sujeto a disponibilidad", - "price": 130000, - "stock": 10, - "values": { - "medida_cama": "2 1/2 Plazas" - }, - "images": [ - "images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/kit-edredon-2-1-2-pl-alaska-c-corderito-jc-2-fundas-almohadones-01.webp", - "images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/kit-edredon-2-1-2-pl-alaska-c-corderito-jc-2-fundas-almohadones-02.webp", - "images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/kit-edredon-2-1-2-pl-alaska-c-corderito-jc-2-fundas-almohadones-03.webp" - ] - }, - { - "source_slug": "kit-edredon-king-alaska-c-corderito-2-fundas-almohadones", - "description": "Para colchón 2 x 2", - "price": 160000, - "stock": 10, - "values": { - "medida_cama": "King" - }, - "images": [ - "images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/kit-edredon-king-alaska-c-corderito-2-fundas-almohadones-01.webp" - ] - } - ] - }, - { - "slug": "lavarropas-automatico-drean-concept-5-05-v1-5-kg-500-rpm", - "name": "Lavarropas automático Drean Concept 5.05 V1 5 Kg 500 rpm", - "description": "Carga superior", - "price": 650000, - "stock": 10, - "brand": "Drean", - "parent_category": "Electrodomésticos", - "category": "Lavarropas y Secarropas", - "images": [ - "images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-drean-concept-5-05-v1-5-kg-500-rpm-01.webp", - "images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-drean-concept-5-05-v1-5-kg-500-rpm-02.webp", - "images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-drean-concept-5-05-v1-5-kg-500-rpm-03.webp", - "images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-drean-concept-5-05-v1-5-kg-500-rpm-04.webp", - "images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-drean-concept-5-05-v1-5-kg-500-rpm-05.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "lavarropas-automatico-gafa-fuzzy-fit-7-kg-760-rpm-color-blanco", - "name": "Lavarropas automático Gafa Fuzzy Fit 7 kg 760 rpm color blanco", - "description": "Carga superior", - "price": 650000, - "stock": 10, - "brand": "Gafa", - "parent_category": "Electrodomésticos", - "category": "Lavarropas y Secarropas", - "images": [ - "images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-gafa-fuzzy-fit-7-kg-760-rpm-color-blanco-01.webp", - "images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-gafa-fuzzy-fit-7-kg-760-rpm-color-blanco-02.webp", - "images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-gafa-fuzzy-fit-7-kg-760-rpm-color-blanco-03.webp", - "images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-gafa-fuzzy-fit-7-kg-760-rpm-color-blanco-04.webp", - "images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-gafa-fuzzy-fit-7-kg-760-rpm-color-blanco-05.webp", - "images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-gafa-fuzzy-fit-7-kg-760-rpm-color-blanco-06.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "lavarropas-automatico-philco-phlf-6510b2-6-5-kg-1000-rpm-blanco", - "name": "Lavarropas automático Philco PHLF-6510B2 6,5 KG 1000 rpm blanco", - "description": null, - "price": 600000, - "stock": 10, - "brand": "Philco", - "parent_category": "Electrodomésticos", - "category": "Lavarropas y Secarropas", - "images": [ - "images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-philco-phlf-6510b2-6-5-kg-1000-rpm-blanco-01.webp", - "images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-philco-phlf-6510b2-6-5-kg-1000-rpm-blanco-02.webp", - "images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-philco-phlf-6510b2-6-5-kg-1000-rpm-blanco-03.webp", - "images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-philco-phlf-6510b2-6-5-kg-1000-rpm-blanco-04.webp", - "images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-philco-phlf-6510b2-6-5-kg-1000-rpm-blanco-05.webp", - "images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-philco-phlf-6510b2-6-5-kg-1000-rpm-blanco-06.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "lavarropas-automatico-samsung-ww65-6-5-kg-1000-rpm-blanco", - "name": "Lavarropas automático Samsung WW65 6,5 Kg 1000 rpm blanco", - "description": "Carga frontal", - "price": 920000, - "stock": 10, - "brand": "Samsung", - "parent_category": "Electrodomésticos", - "category": "Lavarropas y Secarropas", - "images": [ - "images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-samsung-ww65-6-5-kg-1000-rpm-blanco-01.webp", - "images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-samsung-ww65-6-5-kg-1000-rpm-blanco-02.webp", - "images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-samsung-ww65-6-5-kg-1000-rpm-blanco-03.webp", - "images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-samsung-ww65-6-5-kg-1000-rpm-blanco-04.webp", - "images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-samsung-ww65-6-5-kg-1000-rpm-blanco-05.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "licuadora-electrolux-sba10-personal-600-ml", - "name": "Licuadora Electrolux SBA10 personal 600 ml", - "description": null, - "price": 75000, - "stock": 10, - "brand": "Electrolux", - "parent_category": "Electrodomésticos", - "category": "Preparación de Alimentos", - "images": [ - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/licuadora-electrolux-sba10-personal-600-ml-01.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/licuadora-electrolux-sba10-personal-600-ml-02.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/licuadora-electrolux-sba10-personal-600-ml-03.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "longvie-eba2s-2000-cal-tiro-balanceado", - "name": "Longvie EBA2S 2000 cal. Tiro Balanceado", - "description": null, - "price": 280000, - "stock": 10, - "brand": "Longvie", - "parent_category": "Climatización", - "category": "Calefactores a Gas con Salida", - "images": [ - "images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/longvie-eba2s-2000-cal-tiro-balanceado-01.webp", - "images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/longvie-eba2s-2000-cal-tiro-balanceado-02.webp", - "images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/longvie-eba2s-2000-cal-tiro-balanceado-03.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "longvie-eba3s-3000-cal-tiro-balanceado", - "name": "Longvie EBA3S 3000 cal. Tiro Balanceado", - "description": null, - "price": 420000, - "stock": 10, - "brand": "Longvie", - "parent_category": "Climatización", - "category": "Calefactores a Gas con Salida", - "images": [ - "images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/longvie-eba3s-3000-cal-tiro-balanceado-01.webp", - "images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/longvie-eba3s-3000-cal-tiro-balanceado-02.webp", - "images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/longvie-eba3s-3000-cal-tiro-balanceado-03.webp", - "images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/longvie-eba3s-3000-cal-tiro-balanceado-04.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "longvie-eca-3kv-3200-cal-infr-visor-grafito-sin-salida", - "name": "Longvie ECA-3KV 3200 cal. Infr visor grafito sin salida", - "description": null, - "price": 300000, - "stock": 10, - "brand": "Longvie", - "parent_category": "Climatización", - "category": "Calefactores a Gas sin Salida", - "images": [ - "images/tennants/mutual_smep/catalog/calefactor-sin-salida-al-ext/longvie-eca-3kv-3200-cal-infr-visor-grafito-sin-salida-01.webp", - "images/tennants/mutual_smep/catalog/calefactor-sin-salida-al-ext/longvie-eca-3kv-3200-cal-infr-visor-grafito-sin-salida-02.webp", - "images/tennants/mutual_smep/catalog/calefactor-sin-salida-al-ext/longvie-eca-3kv-3200-cal-infr-visor-grafito-sin-salida-03.webp", - "images/tennants/mutual_smep/catalog/calefactor-sin-salida-al-ext/longvie-eca-3kv-3200-cal-infr-visor-grafito-sin-salida-04.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "lustraspiradora-liliana-espejo-ll350-850-w", - "name": "Lustraspiradora Liliana espejo LL350 850 W", - "description": null, - "price": 210000, - "stock": 10, - "brand": "Liliana", - "parent_category": "Electrodomésticos", - "category": "Limpieza y Planchado", - "images": [ - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/lustraspiradora-liliana-espejo-ll350-850-w-01.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/lustraspiradora-liliana-espejo-ll350-850-w-02.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/lustraspiradora-liliana-espejo-ll350-850-w-03.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "manta-simil-piel-de-conejo-con-reverso-aterciopelado-jean-cartier", - "name": "Manta simil piel de conejo con reverso aterciopelado Jean Cartier", - "description": "Color sujeto a disponibilidad", - "price": 50000, - "stock": 10, - "brand": "Jean Cartier", - "parent_category": "Dormitorio y Blanco", - "category": "Frazadas y Mantas", - "images": [ - "images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/manta-simil-piel-de-conejo-con-reverso-aterciopelado-jean-cartier-01.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "microondas-bgh-28-l-bgh-b-228ds20i-plata-digital-con-grill", - "name": "Microondas BGH 28 L BGH B-228DS20I Plata Digital con grill", - "description": null, - "price": 350000, - "stock": 10, - "brand": "BGH", - "parent_category": "Electrodomésticos", - "category": "Microondas", - "images": [ - "images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/microondas-bgh-28-l-bgh-b-228ds20i-plata-digital-con-grill-01.webp", - "images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/microondas-bgh-28-l-bgh-b-228ds20i-plata-digital-con-grill-02.webp", - "images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/microondas-bgh-28-l-bgh-b-228ds20i-plata-digital-con-grill-03.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "microondas-samsung-mg23-f3k3tak-23-litros-grill-color-negro", - "name": "Microondas Samsung MG23 F3K3TAK 23 litros Grill color negro", - "description": null, - "price": 335000, - "stock": 10, - "brand": "Samsung", - "parent_category": "Electrodomésticos", - "category": "Microondas", - "images": [ - "images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/microondas-samsung-mg23-f3k3tak-23-litros-grill-color-negro-01.webp", - "images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/microondas-samsung-mg23-f3k3tak-23-litros-grill-color-negro-02.webp", - "images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/microondas-samsung-mg23-f3k3tak-23-litros-grill-color-negro-03.webp", - "images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/microondas-samsung-mg23-f3k3tak-23-litros-grill-color-negro-04.webp", - "images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/microondas-samsung-mg23-f3k3tak-23-litros-grill-color-negro-05.webp", - "images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/microondas-samsung-mg23-f3k3tak-23-litros-grill-color-negro-06.webp", - "images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/microondas-samsung-mg23-f3k3tak-23-litros-grill-color-negro-07.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "mixer-liliana-ah-300-450-w-vaso", - "name": "Mixer Liliana AH-300 450 W + Vaso", - "description": null, - "price": 56000, - "stock": 10, - "brand": "Liliana", - "parent_category": "Electrodomésticos", - "category": "Preparación de Alimentos", - "images": [ - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/mixer-liliana-ah-300-450-w-vaso-01.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/mixer-liliana-ah-300-450-w-vaso-02.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "mixer-liliana-rainbow-mix-ah-101-2-3-vaso-medidor", - "name": "Mixer Liliana Rainbow Mix AH-101/2/3 + Vaso medidor", - "description": null, - "price": 67000, - "stock": 10, - "brand": "Liliana", - "parent_category": "Electrodomésticos", - "category": "Preparación de Alimentos", - "images": [ - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/mixer-liliana-rainbow-mix-ah-101-2-3-vaso-medidor-01.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/mixer-liliana-rainbow-mix-ah-101-2-3-vaso-medidor-02.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "mixer-philips-hr-2531-50-promix-400-w-vaso", - "name": "Mixer Philips HR-2531/50 Promix 400 W + Vaso", - "description": null, - "price": 83000, - "stock": 10, - "brand": "Philips", - "parent_category": "Electrodomésticos", - "category": "Preparación de Alimentos", - "images": [ - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/mixer-philips-hr-2531-50-promix-400-w-vaso-01.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/mixer-philips-hr-2531-50-promix-400-w-vaso-02.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/mixer-philips-hr-2531-50-promix-400-w-vaso-03.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/mixer-philips-hr-2531-50-promix-400-w-vaso-04.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/mixer-philips-hr-2531-50-promix-400-w-vaso-05.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/mixer-philips-hr-2531-50-promix-400-w-vaso-06.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/mixer-philips-hr-2531-50-promix-400-w-vaso-07.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "motorola-g15", - "name": "Motorola G15", - "description": "Color sujeto a disponibilidad", - "price": 330000, - "stock": null, - "brand": "Motorola", - "parent_category": "Tecnología", - "category": "Celulares", - "images": [], - "attribute_codes": [ - "memoria_ram", - "almacenamiento" - ], - "variants": [ - { - "source_slug": "motorola-g15-4-256-gb", - "description": "Color sujeto a disponibilidad", - "price": 330000, - "stock": 10, - "values": { - "memoria_ram": "4 GB", - "almacenamiento": "256 GB" - }, - "images": [ - "images/tennants/mutual_smep/catalog/celulares/motorola-g15-4-256-gb-01.webp", - "images/tennants/mutual_smep/catalog/celulares/motorola-g15-4-256-gb-02.webp", - "images/tennants/mutual_smep/catalog/celulares/motorola-g15-4-256-gb-03.webp" - ] - }, - { - "source_slug": "motorola-g15-4-512-gb", - "description": "Color sujeto a disponibilidad", - "price": 430000, - "stock": 10, - "values": { - "memoria_ram": "4 GB", - "almacenamiento": "512 GB" - }, - "images": [ - "images/tennants/mutual_smep/catalog/celulares/motorola-g15-4-512-gb-01.webp", - "images/tennants/mutual_smep/catalog/celulares/motorola-g15-4-512-gb-02.webp" - ] - } - ] - }, - { - "slug": "motorola-g35-4-256-gb", - "name": "Motorola G35 4/256 GB", - "description": "Color sujeto a disponibilidad", - "price": 410000, - "stock": 10, - "brand": "Motorola", - "parent_category": "Tecnología", - "category": "Celulares", - "images": [ - "images/tennants/mutual_smep/catalog/celulares/motorola-g35-4-256-gb-01.webp", - "images/tennants/mutual_smep/catalog/celulares/motorola-g35-4-256-gb-02.webp", - "images/tennants/mutual_smep/catalog/celulares/motorola-g35-4-256-gb-03.webp", - "images/tennants/mutual_smep/catalog/celulares/motorola-g35-4-256-gb-04.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "mouse-xtrike-me-backlit", - "name": "Mouse Xtrike Me Backlit", - "description": null, - "price": 12000, - "stock": 10, - "brand": "Xtrike Me", - "parent_category": "Tecnología", - "category": "Accesorios de Computación", - "images": [ - "images/tennants/mutual_smep/catalog/tecnologia/mouse-xtrike-me-backlit-01.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "multiprocesadora-liliana-am-700-simplix-700-w", - "name": "Multiprocesadora Liliana AM-700 Simplix 700 W", - "description": null, - "price": 137000, - "stock": 10, - "brand": "Liliana", - "parent_category": "Electrodomésticos", - "category": "Preparación de Alimentos", - "images": [ - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/multiprocesadora-liliana-am-700-simplix-700-w-01.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/multiprocesadora-liliana-am-700-simplix-700-w-02.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/multiprocesadora-liliana-am-700-simplix-700-w-03.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "notebook-acer-aspire-7-i5-13420h-512ssd-16gb-15-6-rtx3050", - "name": "Notebook Acer Aspire 7 I5-13420H/512SSD/16GB/15.6/RTX3050", - "description": null, - "price": 2800000, - "stock": 10, - "brand": "Acer", - "parent_category": "Tecnología", - "category": "Notebooks", - "images": [ - "images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-acer-aspire-7-i5-13420h-512ssd-16gb-15-6-rtx3050-01.webp", - "images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-acer-aspire-7-i5-13420h-512ssd-16gb-15-6-rtx3050-02.webp", - "images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-acer-aspire-7-i5-13420h-512ssd-16gb-15-6-rtx3050-03.webp", - "images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-acer-aspire-7-i5-13420h-512ssd-16gb-15-6-rtx3050-04.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "notebook-asus-vivobook-f1504vap-intel-core-7-512gb-ssd-8gb-15-6-touch-win-11", - "name": "NOTEBOOK ASUS VIVOBOOK F1504VAP Intel Core 7 512GB SSD 8GB 15.6 Touch WIN 11", - "description": null, - "price": 1700000, - "stock": 10, - "brand": "ASUS", - "parent_category": "Tecnología", - "category": "Notebooks", - "images": [ - "images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-asus-vivobook-f1504vap-intel-core-7-512gb-ssd-8gb-15-6-touch-win-11-01.webp", - "images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-asus-vivobook-f1504vap-intel-core-7-512gb-ssd-8gb-15-6-touch-win-11-02.webp", - "images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-asus-vivobook-f1504vap-intel-core-7-512gb-ssd-8gb-15-6-touch-win-11-03.webp", - "images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-asus-vivobook-f1504vap-intel-core-7-512gb-ssd-8gb-15-6-touch-win-11-04.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "notebook-asus-vivobook-go-15-e1504ga-ws35-intel-core-i3-n305-8-256-gb-win11", - "name": "Notebook ASUS Vivobook Go 15 E1504GA-WS35 Intel Core i3 N305 8/256 GB Win11", - "description": null, - "price": 1300000, - "stock": 10, - "brand": "ASUS", - "parent_category": "Tecnología", - "category": "Notebooks", - "images": [ - "images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-asus-vivobook-go-15-e1504ga-ws35-intel-core-i3-n305-8-256-gb-win11-01.webp", - "images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-asus-vivobook-go-15-e1504ga-ws35-intel-core-i3-n305-8-256-gb-win11-02.webp", - "images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-asus-vivobook-go-15-e1504ga-ws35-intel-core-i3-n305-8-256-gb-win11-03.webp", - "images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-asus-vivobook-go-15-e1504ga-ws35-intel-core-i3-n305-8-256-gb-win11-04.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "notebook-lenovo-ideapad-slim-3-amd-ryzen-5-8-512gb-ssd-15-6-full-hd-win11", - "name": "Notebook Lenovo IdeaPad Slim 3 AMD Ryzen 5 8/512GB SSD 15.6\" Full HD Win11", - "description": null, - "price": 1400000, - "stock": 10, - "brand": "Lenovo", - "parent_category": "Tecnología", - "category": "Notebooks", - "images": [ - "images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-lenovo-ideapad-slim-3-amd-ryzen-5-8-512gb-ssd-15-6-full-hd-win11-01.webp", - "images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-lenovo-ideapad-slim-3-amd-ryzen-5-8-512gb-ssd-15-6-full-hd-win11-02.webp", - "images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-lenovo-ideapad-slim-3-amd-ryzen-5-8-512gb-ssd-15-6-full-hd-win11-03.webp", - "images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-lenovo-ideapad-slim-3-amd-ryzen-5-8-512gb-ssd-15-6-full-hd-win11-04.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "notebook-lenovo-ryzen-7-8840hs-16-512gb-15-6", - "name": "Notebook Lenovo Ryzen 7 8840HS 16/512GB 15,6\"", - "description": null, - "price": 1700000, - "stock": 10, - "brand": "Lenovo", - "parent_category": "Tecnología", - "category": "Notebooks", - "images": [ - "images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-lenovo-ryzen-7-8840hs-16-512gb-15-6-01.webp", - "images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-lenovo-ryzen-7-8840hs-16-512gb-15-6-02.webp", - "images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-lenovo-ryzen-7-8840hs-16-512gb-15-6-03.webp", - "images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-lenovo-ryzen-7-8840hs-16-512gb-15-6-04.webp", - "images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-lenovo-ryzen-7-8840hs-16-512gb-15-6-05.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "notebook-lenovo-s3-15q8x10-snapdragon-x-512gb-ssd-16gb-ddr5-15-3-win11", - "name": "Notebook Lenovo S3 15Q8X10 SNAPDRAGON X 512GB SSD 16GB DDR5 15.3\" WIN11", - "description": null, - "price": 1500000, - "stock": 10, - "brand": "Lenovo", - "parent_category": "Tecnología", - "category": "Notebooks", - "images": [ - "images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-lenovo-s3-15q8x10-snapdragon-x-512gb-ssd-16gb-ddr5-15-3-win11-01.webp", - "images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-lenovo-s3-15q8x10-snapdragon-x-512gb-ssd-16gb-ddr5-15-3-win11-02.webp", - "images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-lenovo-s3-15q8x10-snapdragon-x-512gb-ssd-16gb-ddr5-15-3-win11-03.webp", - "images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-lenovo-s3-15q8x10-snapdragon-x-512gb-ssd-16gb-ddr5-15-3-win11-04.webp", - "images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-lenovo-s3-15q8x10-snapdragon-x-512gb-ssd-16gb-ddr5-15-3-win11-05.webp", - "images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-lenovo-s3-15q8x10-snapdragon-x-512gb-ssd-16gb-ddr5-15-3-win11-06.webp", - "images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-lenovo-s3-15q8x10-snapdragon-x-512gb-ssd-16gb-ddr5-15-3-win11-07.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "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", - "name": "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", - "description": null, - "price": 3800000, - "stock": 10, - "brand": "MSI", - "parent_category": "Tecnología", - "category": "Notebooks", - "images": [ - "images/tennants/mutual_smep/catalog/notebooks-y-tablets/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-01.webp", - "images/tennants/mutual_smep/catalog/notebooks-y-tablets/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-02.webp", - "images/tennants/mutual_smep/catalog/notebooks-y-tablets/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-03.webp", - "images/tennants/mutual_smep/catalog/notebooks-y-tablets/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-04.webp", - "images/tennants/mutual_smep/catalog/notebooks-y-tablets/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-05.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "parlante-jbl-go-4-bluetooth-altavoz-ultraportatil", - "name": "Parlante JBL GO 4 Bluetooth altavoz ultraportátil", - "description": "Color sujeto a disponibilidad", - "price": 97000, - "stock": 10, - "brand": "JBL", - "parent_category": "Tecnología", - "category": "Audio", - "images": [ - "images/tennants/mutual_smep/catalog/tecnologia/parlante-jbl-go-4-bluetooth-altavoz-ultraportatil-01.webp", - "images/tennants/mutual_smep/catalog/tecnologia/parlante-jbl-go-4-bluetooth-altavoz-ultraportatil-02.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "pava-electrica-atma-pe-0821ap-nap-1-7-l", - "name": "Pava eléctrica Atma PE-0821AP/NAP 1,7 L", - "description": null, - "price": 40000, - "stock": 10, - "brand": "Atma", - "parent_category": "Electrodomésticos", - "category": "Café y Desayuno", - "images": [ - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-atma-pe-0821ap-nap-1-7-l-01.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-atma-pe-0821ap-nap-1-7-l-02.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-atma-pe-0821ap-nap-1-7-l-03.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "pava-electrica-atma-ped23mp-disney-vintage", - "name": "Pava eléctrica Atma PED23MP Disney vintage", - "description": null, - "price": 90000, - "stock": 10, - "brand": "Atma", - "parent_category": "Electrodomésticos", - "category": "Café y Desayuno", - "images": [ - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-atma-ped23mp-disney-vintage-01.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-atma-ped23mp-disney-vintage-02.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-atma-ped23mp-disney-vintage-03.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-atma-ped23mp-disney-vintage-04.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-atma-ped23mp-disney-vintage-05.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "pava-electrica-gigo-g-17898-sd-1-7-l-digital-cromada", - "name": "Pava eléctrica GIGO G-17898 SD 1,7 L Digital cromada", - "description": null, - "price": 76000, - "stock": 10, - "brand": "GIGO", - "parent_category": "Electrodomésticos", - "category": "Café y Desayuno", - "images": [ - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-gigo-g-17898-sd-1-7-l-digital-cromada-01.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-gigo-g-17898-sd-1-7-l-digital-cromada-02.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-gigo-g-17898-sd-1-7-l-digital-cromada-03.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-gigo-g-17898-sd-1-7-l-digital-cromada-04.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-gigo-g-17898-sd-1-7-l-digital-cromada-05.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-gigo-g-17898-sd-1-7-l-digital-cromada-06.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "pava-electrica-liliana-ap-165-matera-color-negra", - "name": "Pava eléctrica Liliana AP-165 matera color negra", - "description": null, - "price": 59000, - "stock": 10, - "brand": "Liliana", - "parent_category": "Electrodomésticos", - "category": "Café y Desayuno", - "images": [ - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-liliana-ap-165-matera-color-negra-01.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-liliana-ap-165-matera-color-negra-02.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-liliana-ap-165-matera-color-negra-03.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-liliana-ap-165-matera-color-negra-04.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "pava-electrica-liliana-ap-200-infustyle-1-7-l", - "name": "Pava eléctrica Liliana AP-200 Infustyle 1,7 L", - "description": null, - "price": 85000, - "stock": 10, - "brand": "Liliana", - "parent_category": "Electrodomésticos", - "category": "Café y Desayuno", - "images": [ - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-liliana-ap-200-infustyle-1-7-l-01.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-liliana-ap-200-infustyle-1-7-l-02.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-liliana-ap-200-infustyle-1-7-l-03.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-liliana-ap-200-infustyle-1-7-l-04.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-liliana-ap-200-infustyle-1-7-l-05.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "picadora-moulinex-ad-6011ar-750-w-blanca", - "name": "Picadora Moulinex AD-6011AR 750 W Blanca", - "description": null, - "price": 98000, - "stock": 10, - "brand": "Moulinex", - "parent_category": "Electrodomésticos", - "category": "Preparación de Alimentos", - "images": [ - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/picadora-moulinex-ad-6011ar-750-w-blanca-01.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/picadora-moulinex-ad-6011ar-750-w-blanca-02.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/picadora-moulinex-ad-6011ar-750-w-blanca-03.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/picadora-moulinex-ad-6011ar-750-w-blanca-04.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/picadora-moulinex-ad-6011ar-750-w-blanca-05.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/picadora-moulinex-ad-6011ar-750-w-blanca-06.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/picadora-moulinex-ad-6011ar-750-w-blanca-07.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "pileta-pelopincho-1010", - "name": "Pileta Pelopincho 1010", - "description": null, - "price": 87000, - "stock": 10, - "brand": "Pelopincho", - "parent_category": "Bicicletas y Aire Libre", - "category": "Piletas", - "images": [ - "images/tennants/mutual_smep/catalog/piletas/pileta-pelopincho-1010-01.webp", - "images/tennants/mutual_smep/catalog/piletas/pileta-pelopincho-1010-02.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "pileta-pelopincho-1020", - "name": "Pileta Pelopincho 1020", - "description": null, - "price": 115000, - "stock": 10, - "brand": "Pelopincho", - "parent_category": "Bicicletas y Aire Libre", - "category": "Piletas", - "images": [ - "images/tennants/mutual_smep/catalog/piletas/pileta-pelopincho-1020-01.webp", - "images/tennants/mutual_smep/catalog/piletas/pileta-pelopincho-1020-02.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "pileta-pelopincho-1030", - "name": "Pileta Pelopincho 1030", - "description": null, - "price": 140000, - "stock": 10, - "brand": "Pelopincho", - "parent_category": "Bicicletas y Aire Libre", - "category": "Piletas", - "images": [ - "images/tennants/mutual_smep/catalog/piletas/pileta-pelopincho-1030-01.webp", - "images/tennants/mutual_smep/catalog/piletas/pileta-pelopincho-1030-02.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "pileta-pelopincho-1043", - "name": "Pileta Pelopincho 1043", - "description": null, - "price": 240000, - "stock": 10, - "brand": "Pelopincho", - "parent_category": "Bicicletas y Aire Libre", - "category": "Piletas", - "images": [ - "images/tennants/mutual_smep/catalog/piletas/pileta-pelopincho-1043-01.webp", - "images/tennants/mutual_smep/catalog/piletas/pileta-pelopincho-1043-02.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "pileta-pelopincho-1055", - "name": "Pileta Pelopincho 1055", - "description": null, - "price": 315000, - "stock": 10, - "brand": "Pelopincho", - "parent_category": "Bicicletas y Aire Libre", - "category": "Piletas", - "images": [ - "images/tennants/mutual_smep/catalog/piletas/pileta-pelopincho-1055-01.webp", - "images/tennants/mutual_smep/catalog/piletas/pileta-pelopincho-1055-02.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "plancha-vapor-philips-gc-1022-40-2000-w", - "name": "Plancha vapor Philips GC-1022/40 2000 W", - "description": null, - "price": 91000, - "stock": 10, - "brand": "Philips", - "parent_category": "Electrodomésticos", - "category": "Limpieza y Planchado", - "images": [ - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/plancha-vapor-philips-gc-1022-40-2000-w-01.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/plancha-vapor-philips-gc-1022-40-2000-w-02.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/plancha-vapor-philips-gc-1022-40-2000-w-03.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "pochoclera-atma-po-at9801dnp-disney-mickey", - "name": "Pochoclera Atma PO-AT9801DNP Disney Mickey", - "description": null, - "price": 64000, - "stock": 10, - "brand": "Atma", - "parent_category": "Electrodomésticos", - "category": "Freidoras y Cocción", - "images": [ - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pochoclera-atma-po-at9801dnp-disney-mickey-01.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pochoclera-atma-po-at9801dnp-disney-mickey-02.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pochoclera-atma-po-at9801dnp-disney-mickey-03.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pochoclera-atma-po-at9801dnp-disney-mickey-04.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pochoclera-atma-po-at9801dnp-disney-mickey-05.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "purificador-spar-bios-3766-boo-color-blanco", - "name": "Purificador Spar Bios 3766-BOO color blanco", - "description": "1 motor", - "price": 200000, - "stock": 10, - "brand": "Spar", - "parent_category": "Electrodomésticos", - "category": "Purificadores y Extractores de Cocina", - "images": [ - "images/tennants/mutual_smep/catalog/purificador-de-aire/purificador-spar-bios-3766-boo-color-blanco-01.webp", - "images/tennants/mutual_smep/catalog/purificador-de-aire/purificador-spar-bios-3766-boo-color-blanco-02.webp", - "images/tennants/mutual_smep/catalog/purificador-de-aire/purificador-spar-bios-3766-boo-color-blanco-03.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "purificador-tst-360-60-estratto-acero-inox-60-cm", - "name": "Purificador Tst #360-60 Estratto acero inox. 60 cm", - "description": null, - "price": 200000, - "stock": 10, - "brand": "Acer", - "parent_category": "Electrodomésticos", - "category": "Purificadores y Extractores de Cocina", - "images": [ - "images/tennants/mutual_smep/catalog/purificador-de-aire/purificador-tst-360-60-estratto-acero-inox-60-cm-01.webp", - "images/tennants/mutual_smep/catalog/purificador-de-aire/purificador-tst-360-60-estratto-acero-inox-60-cm-02.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "samsung-a07-4-128-gb", - "name": "Samsung A07 4/128 GB", - "description": "Color sujeto a disponibilidad", - "price": 310000, - "stock": 10, - "brand": "Samsung", - "parent_category": "Tecnología", - "category": "Celulares", - "images": [ - "images/tennants/mutual_smep/catalog/celulares/samsung-a07-4-128-gb-01.webp", - "images/tennants/mutual_smep/catalog/celulares/samsung-a07-4-128-gb-02.webp", - "images/tennants/mutual_smep/catalog/celulares/samsung-a07-4-128-gb-03.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "samsung-a17-4-128-gb", - "name": "SAMSUNG A17 4/128 GB", - "description": "Color sujeto a disponibilidad", - "price": 390000, - "stock": 10, - "brand": "Samsung", - "parent_category": "Tecnología", - "category": "Celulares", - "images": [ - "images/tennants/mutual_smep/catalog/celulares/samsung-a17-4-128-gb-01.webp", - "images/tennants/mutual_smep/catalog/celulares/samsung-a17-4-128-gb-02.webp", - "images/tennants/mutual_smep/catalog/celulares/samsung-a17-4-128-gb-03.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "samsung-a17-5g-8-256-gb", - "name": "SAMSUNG A17 5G 8/256 GB", - "description": "Color sujeto a disponibilidad", - "price": 620000, - "stock": 10, - "brand": "Samsung", - "parent_category": "Tecnología", - "category": "Celulares", - "images": [ - "images/tennants/mutual_smep/catalog/celulares/samsung-a17-5g-8-256-gb-01.webp", - "images/tennants/mutual_smep/catalog/celulares/samsung-a17-5g-8-256-gb-02.webp", - "images/tennants/mutual_smep/catalog/celulares/samsung-a17-5g-8-256-gb-03.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "samsung-a26-5g-8-256-gb", - "name": "SAMSUNG A26 5G 8/256 GB", - "description": "Color sujeto a disponibilidad", - "price": 650000, - "stock": 10, - "brand": "Samsung", - "parent_category": "Tecnología", - "category": "Celulares", - "images": [ - "images/tennants/mutual_smep/catalog/celulares/samsung-a26-5g-8-256-gb-01.webp", - "images/tennants/mutual_smep/catalog/celulares/samsung-a26-5g-8-256-gb-02.webp", - "images/tennants/mutual_smep/catalog/celulares/samsung-a26-5g-8-256-gb-03.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "samsung-a36-5g-8-256-gb", - "name": "Samsung A36 5G 8/256 GB", - "description": "Color sujeto a disponibilidad", - "price": 780000, - "stock": 10, - "brand": "Samsung", - "parent_category": "Tecnología", - "category": "Celulares", - "images": [ - "images/tennants/mutual_smep/catalog/celulares/samsung-a36-5g-8-256-gb-01.webp", - "images/tennants/mutual_smep/catalog/celulares/samsung-a36-5g-8-256-gb-02.webp", - "images/tennants/mutual_smep/catalog/celulares/samsung-a36-5g-8-256-gb-03.webp", - "images/tennants/mutual_smep/catalog/celulares/samsung-a36-5g-8-256-gb-04.webp", - "images/tennants/mutual_smep/catalog/celulares/samsung-a36-5g-8-256-gb-05.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "samsung-a56-5g-8-256-gb", - "name": "Samsung A56 5G 8/256 GB", - "description": null, - "price": 920000, - "stock": 10, - "brand": "Samsung", - "parent_category": "Tecnología", - "category": "Celulares", - "images": [ - "images/tennants/mutual_smep/catalog/celulares/samsung-a56-5g-8-256-gb-01.webp", - "images/tennants/mutual_smep/catalog/celulares/samsung-a56-5g-8-256-gb-02.webp", - "images/tennants/mutual_smep/catalog/celulares/samsung-a56-5g-8-256-gb-03.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "samsung-galaxy-a16-4-128-gb", - "name": "Samsung Galaxy A16 4/128 GB", - "description": "Color sujeto a disponibilidad", - "price": 340000, - "stock": 10, - "brand": "Samsung", - "parent_category": "Tecnología", - "category": "Celulares", - "images": [ - "images/tennants/mutual_smep/catalog/celulares/samsung-galaxy-a16-4-128-gb-01.webp", - "images/tennants/mutual_smep/catalog/celulares/samsung-galaxy-a16-4-128-gb-02.webp", - "images/tennants/mutual_smep/catalog/celulares/samsung-galaxy-a16-4-128-gb-03.webp", - "images/tennants/mutual_smep/catalog/celulares/samsung-galaxy-a16-4-128-gb-04.webp", - "images/tennants/mutual_smep/catalog/celulares/samsung-galaxy-a16-4-128-gb-05.webp", - "images/tennants/mutual_smep/catalog/celulares/samsung-galaxy-a16-4-128-gb-06.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "secador-cabello-atma-sp-8970-classic-3-velocidades", - "name": "Secador cabello Atma SP-8970 Classic 3 Velocidades", - "description": null, - "price": 60000, - "stock": 10, - "brand": "Atma", - "parent_category": "Electrodomésticos", - "category": "Cuidado Personal", - "images": [ - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/secador-cabello-atma-sp-8970-classic-3-velocidades-01.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/secador-cabello-atma-sp-8970-classic-3-velocidades-02.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "secador-cabello-gama-9465-brillant-blue-titanium", - "name": "Secador cabello Gama 9465 Brillant Blue Titanium", - "description": null, - "price": 120000, - "stock": 10, - "brand": "Gama", - "parent_category": "Electrodomésticos", - "category": "Cuidado Personal", - "images": [ - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/secador-cabello-gama-9465-brillant-blue-titanium-01.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/secador-cabello-gama-9465-brillant-blue-titanium-02.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/secador-cabello-gama-9465-brillant-blue-titanium-03.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "secador-cabello-philips-bhd-302-10-1600-w", - "name": "Secador cabello Philips BHD-302/10 1600 W", - "description": null, - "price": 110000, - "stock": 10, - "brand": "Philips", - "parent_category": "Electrodomésticos", - "category": "Cuidado Personal", - "images": [ - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/secador-cabello-philips-bhd-302-10-1600-w-01.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/secador-cabello-philips-bhd-302-10-1600-w-02.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/secador-cabello-philips-bhd-302-10-1600-w-03.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "secarropas-kohinoor-a-665-acero-inoxidable-6-5-kg", - "name": "Secarropas Kohinoor A-665 acero inoxidable 6,5 Kg", - "description": null, - "price": 300000, - "stock": 10, - "brand": "Kohinoor", - "parent_category": "Electrodomésticos", - "category": "Lavarropas y Secarropas", - "images": [ - "images/tennants/mutual_smep/catalog/lavarropas-automaticos/secarropas-kohinoor-a-665-acero-inoxidable-6-5-kg-01.webp", - "images/tennants/mutual_smep/catalog/lavarropas-automaticos/secarropas-kohinoor-a-665-acero-inoxidable-6-5-kg-02.webp", - "images/tennants/mutual_smep/catalog/lavarropas-automaticos/secarropas-kohinoor-a-665-acero-inoxidable-6-5-kg-03.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "set-cuna-de-6-piezas-acolchado-sabanas-arcoiris-multicolor-jc", - "name": "Set Cuna de 6 piezas Acolchado + Sabanas Arcoiris multicolor JC", - "description": null, - "price": 50000, - "stock": 10, - "brand": "Jean Cartier", - "parent_category": "Dormitorio y Blanco", - "category": "Infantil y Cuna", - "images": [ - "images/tennants/mutual_smep/catalog/acolchados-y-sabanas-infantil/set-cuna-de-6-piezas-acolchado-sabanas-arcoiris-multicolor-jc-01.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "smart-32-bgh-b-3225s5a-android", - "name": "SMART 32\" BGH B-3225S5A ANDROID", - "description": null, - "price": 340000, - "stock": 10, - "brand": "BGH", - "parent_category": "Tecnología", - "category": "Smart TV", - "images": [ - "images/tennants/mutual_smep/catalog/smart-tv/smart-32-bgh-b-3225s5a-android-01.webp", - "images/tennants/mutual_smep/catalog/smart-tv/smart-32-bgh-b-3225s5a-android-02.webp", - "images/tennants/mutual_smep/catalog/smart-tv/smart-32-bgh-b-3225s5a-android-03.webp", - "images/tennants/mutual_smep/catalog/smart-tv/smart-32-bgh-b-3225s5a-android-04.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "smart-tv-43-noblex-dr43-x7180-android", - "name": "Smart TV 43\" Noblex DR43-X7180 Android", - "description": null, - "price": 510000, - "stock": 10, - "brand": "Noblex", - "parent_category": "Tecnología", - "category": "Smart TV", - "images": [ - "images/tennants/mutual_smep/catalog/smart-tv/smart-tv-43-noblex-dr43-x7180-android-01.webp", - "images/tennants/mutual_smep/catalog/smart-tv/smart-tv-43-noblex-dr43-x7180-android-02.webp", - "images/tennants/mutual_smep/catalog/smart-tv/smart-tv-43-noblex-dr43-x7180-android-03.webp", - "images/tennants/mutual_smep/catalog/smart-tv/smart-tv-43-noblex-dr43-x7180-android-04.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "smart-tv-noblex-32-dk32-x7000-android", - "name": "Smart TV Noblex 32\" DK32-X7000 Android", - "description": null, - "price": 340000, - "stock": 10, - "brand": "Noblex", - "parent_category": "Tecnología", - "category": "Smart TV", - "images": [ - "images/tennants/mutual_smep/catalog/smart-tv/smart-tv-noblex-32-dk32-x7000-android-01.webp", - "images/tennants/mutual_smep/catalog/smart-tv/smart-tv-noblex-32-dk32-x7000-android-02.webp", - "images/tennants/mutual_smep/catalog/smart-tv/smart-tv-noblex-32-dk32-x7000-android-03.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "smart-tv-noblex-50-dr50-x8500-google-tv", - "name": "SMART TV NOBLEX 50\" DR50-X8500 GOOGLE TV", - "description": null, - "price": 730000, - "stock": 10, - "brand": "Noblex", - "parent_category": "Tecnología", - "category": "Smart TV", - "images": [ - "images/tennants/mutual_smep/catalog/smart-tv/smart-tv-noblex-50-dr50-x8500-google-tv-01.webp", - "images/tennants/mutual_smep/catalog/smart-tv/smart-tv-noblex-50-dr50-x8500-google-tv-02.webp", - "images/tennants/mutual_smep/catalog/smart-tv/smart-tv-noblex-50-dr50-x8500-google-tv-03.webp", - "images/tennants/mutual_smep/catalog/smart-tv/smart-tv-noblex-50-dr50-x8500-google-tv-04.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "sommier-inducol-0-80x1-90", - "name": "Sommier Inducol 0,80x1,90", - "description": null, - "price": 180000, - "stock": 10, - "brand": "Inducol", - "parent_category": "Dormitorio y Blanco", - "category": "Bases y Sommiers", - "images": [ - "images/tennants/mutual_smep/catalog/base-sommier-1-pl-0-80x1-90/sommier-inducol-0-80x1-90-01.webp", - "images/tennants/mutual_smep/catalog/base-sommier-1-pl-0-80x1-90/sommier-inducol-0-80x1-90-02.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "sommier-king-koil-elite-contour-140x190", - "name": "Sommier King Koil Elite Contour 140x190", - "description": "Ideal para armar el conjunto con el Colchón Inducol Vinson Espuma. Color sujeto a disponibilidad.", - "price": 260000, - "stock": 10, - "brand": "King Koil", - "parent_category": "Dormitorio y Blanco", - "category": "Bases y Sommiers", - "images": [ - "images/tennants/mutual_smep/catalog/base-sommier-2-pl-1-40x1-90/sommier-king-koil-elite-contour-140x190-01.webp", - "images/tennants/mutual_smep/catalog/base-sommier-2-pl-1-40x1-90/sommier-king-koil-elite-contour-140x190-02.webp", - "images/tennants/mutual_smep/catalog/base-sommier-2-pl-1-40x1-90/sommier-king-koil-elite-contour-140x190-03.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "sommier-piero-legrand-140x190x020", - "name": "Sommier Piero Legrand 140x190x020", - "description": null, - "price": 280000, - "stock": 10, - "brand": "Piero", - "parent_category": "Dormitorio y Blanco", - "category": "Bases y Sommiers", - "images": [ - "images/tennants/mutual_smep/catalog/base-sommier-2-pl-1-40x1-90/sommier-piero-legrand-140x190x020-01.webp", - "images/tennants/mutual_smep/catalog/base-sommier-2-pl-1-40x1-90/sommier-piero-legrand-140x190x020-02.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "sommier-piero-paraiso-0-90x1-90x0-20", - "name": "Sommier Piero Paraíso 0,90x1,90x0,20", - "description": "Base de sommier Piero para colchón de 0,90x1,90", - "price": 200000, - "stock": 10, - "brand": "Piero", - "parent_category": "Dormitorio y Blanco", - "category": "Bases y Sommiers", - "images": [ - "images/tennants/mutual_smep/catalog/base-sommier-1-pl-0-80x1-90/sommier-piero-paraiso-0-90x1-90x0-20-01.webp", - "images/tennants/mutual_smep/catalog/base-sommier-1-pl-0-80x1-90/sommier-piero-paraiso-0-90x1-90x0-20-02.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "soporte-led-26-60-nakan-spl-375e-extensible-y-giratorio", - "name": "Soporte led 26\"-60\" Nakan SPL-375E extensible y giratorio", - "description": null, - "price": 55000, - "stock": 10, - "brand": "Nakan", - "parent_category": "Tecnología", - "category": "Soportes para TV", - "images": [ - "images/tennants/mutual_smep/catalog/colchon-1-plaza-0-80x1-90/soporte-led-26-60-nakan-spl-375e-extensible-y-giratorio-01.webp", - "images/tennants/mutual_smep/catalog/colchon-1-plaza-0-80x1-90/soporte-led-26-60-nakan-spl-375e-extensible-y-giratorio-02.webp", - "images/tennants/mutual_smep/catalog/colchon-1-plaza-0-80x1-90/soporte-led-26-60-nakan-spl-375e-extensible-y-giratorio-03.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "soporte-led-32-55-gbs-con-inclinacion", - "name": "Soporte led 32\"-55\" GBS con inclinacion", - "description": null, - "price": 20000, - "stock": 10, - "brand": "GBS", - "parent_category": "Tecnología", - "category": "Soportes para TV", - "images": [ - "images/tennants/mutual_smep/catalog/smart-tv/soporte-led-32-55-gbs-con-inclinacion-01.webp", - "images/tennants/mutual_smep/catalog/smart-tv/soporte-led-32-55-gbs-con-inclinacion-02.webp", - "images/tennants/mutual_smep/catalog/smart-tv/soporte-led-32-55-gbs-con-inclinacion-03.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "soporte-led-gbs-32-55-fijo", - "name": "Soporte led GBS 32\"-55\" fijo", - "description": null, - "price": 20000, - "stock": 10, - "brand": "GBS", - "parent_category": "Tecnología", - "category": "Soportes para TV", - "images": [ - "images/tennants/mutual_smep/catalog/smart-tv/soporte-led-gbs-32-55-fijo-01.webp", - "images/tennants/mutual_smep/catalog/smart-tv/soporte-led-gbs-32-55-fijo-02.webp", - "images/tennants/mutual_smep/catalog/smart-tv/soporte-led-gbs-32-55-fijo-03.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "split-3300-w-tcl-taca-3300fcsa-frio-calor", - "name": "Split 3300 W TCL TACA-3300FCSA frío/calor", - "description": null, - "price": 840000, - "stock": 10, - "brand": "TCL", - "parent_category": "Climatización", - "category": "Aires Acondicionados", - "images": [ - "images/tennants/mutual_smep/catalog/aires-acondicionados/split-3300-w-tcl-taca-3300fcsa-frio-calor-01.webp", - "images/tennants/mutual_smep/catalog/aires-acondicionados/split-3300-w-tcl-taca-3300fcsa-frio-calor-02.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "split-bgh-5200-w-bsh-52wcu-frio-calor-silent-air-4300-frigorias", - "name": "Split BGH 5200 W BSH-52WCU frío/calor Silent Air 4300 frigorías", - "description": null, - "price": 1200000, - "stock": 10, - "brand": "BGH", - "parent_category": "Climatización", - "category": "Aires Acondicionados", - "images": [ - "images/tennants/mutual_smep/catalog/aires-acondicionados/split-bgh-5200-w-bsh-52wcu-frio-calor-silent-air-4300-frigorias-01.webp", - "images/tennants/mutual_smep/catalog/aires-acondicionados/split-bgh-5200-w-bsh-52wcu-frio-calor-silent-air-4300-frigorias-02.webp", - "images/tennants/mutual_smep/catalog/aires-acondicionados/split-bgh-5200-w-bsh-52wcu-frio-calor-silent-air-4300-frigorias-03.webp", - "images/tennants/mutual_smep/catalog/aires-acondicionados/split-bgh-5200-w-bsh-52wcu-frio-calor-silent-air-4300-frigorias-04.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "teclado-xtrike-me-rainbow-mecanico", - "name": "Teclado Xtrike Me Rainbow mecánico", - "description": null, - "price": 40000, - "stock": 10, - "brand": "Xtrike Me", - "parent_category": "Tecnología", - "category": "Accesorios de Computación", - "images": [ - "images/tennants/mutual_smep/catalog/tecnologia/teclado-xtrike-me-rainbow-mecanico-01.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "termo-stanley-1-l-adventure-go-to-con-tapon", - "name": "Termo Stanley 1 L Adventure Go-To con tapón", - "description": "Color sujeto a disponibilidad", - "price": 170000, - "stock": 10, - "brand": "Stanley", - "parent_category": "Bazar", - "category": "Termos", - "images": [ - "images/tennants/mutual_smep/catalog/bazar/termo-stanley-1-l-adventure-go-to-con-tapon-01.webp", - "images/tennants/mutual_smep/catalog/bazar/termo-stanley-1-l-adventure-go-to-con-tapon-02.webp", - "images/tennants/mutual_smep/catalog/bazar/termo-stanley-1-l-adventure-go-to-con-tapon-03.webp", - "images/tennants/mutual_smep/catalog/bazar/termo-stanley-1-l-adventure-go-to-con-tapon-04.webp", - "images/tennants/mutual_smep/catalog/bazar/termo-stanley-1-l-adventure-go-to-con-tapon-05.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "termo-stanley-800-ml-mate-system-classic", - "name": "Termo Stanley 800 ml Mate System classic", - "description": "Color sujeto a disponibilidad", - "price": 160000, - "stock": 10, - "brand": "Stanley", - "parent_category": "Bazar", - "category": "Termos", - "images": [ - "images/tennants/mutual_smep/catalog/bazar/termo-stanley-800-ml-mate-system-classic-01.webp", - "images/tennants/mutual_smep/catalog/bazar/termo-stanley-800-ml-mate-system-classic-02.webp", - "images/tennants/mutual_smep/catalog/bazar/termo-stanley-800-ml-mate-system-classic-03.webp", - "images/tennants/mutual_smep/catalog/bazar/termo-stanley-800-ml-mate-system-classic-04.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "termo-stanley-950-ml-clasico-con-manija", - "name": "Termo Stanley 950 ml clásico con manija", - "description": "Color sujeto a disponibilidad", - "price": 155000, - "stock": 10, - "brand": "Stanley", - "parent_category": "Bazar", - "category": "Termos", - "images": [ - "images/tennants/mutual_smep/catalog/bazar/termo-stanley-950-ml-clasico-con-manija-01.webp", - "images/tennants/mutual_smep/catalog/bazar/termo-stanley-950-ml-clasico-con-manija-02.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "torre-liliana-tropic-ftp-530-1500-w", - "name": "Torre Liliana Tropic FTP-530 1500 W", - "description": null, - "price": 164000, - "stock": 10, - "brand": "Liliana", - "parent_category": "Climatización", - "category": "Calefacción Eléctrica", - "images": [ - "images/tennants/mutual_smep/catalog/calefaccion-electrica/torre-liliana-tropic-ftp-530-1500-w-01.webp", - "images/tennants/mutual_smep/catalog/calefaccion-electrica/torre-liliana-tropic-ftp-530-1500-w-02.webp", - "images/tennants/mutual_smep/catalog/calefaccion-electrica/torre-liliana-tropic-ftp-530-1500-w-03.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "tostadora-atma-toat-21vcp-vintage-color-crema", - "name": "Tostadora Atma TOAT-21VCP Vintage color crema", - "description": null, - "price": 60000, - "stock": 10, - "brand": "Atma", - "parent_category": "Electrodomésticos", - "category": "Café y Desayuno", - "images": [ - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/tostadora-atma-toat-21vcp-vintage-color-crema-01.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/tostadora-atma-toat-21vcp-vintage-color-crema-02.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/tostadora-atma-toat-21vcp-vintage-color-crema-03.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/tostadora-atma-toat-21vcp-vintage-color-crema-04.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "tostadora-oster-tr500-acero-inoxidable", - "name": "Tostadora Oster TR500 Acero Inoxidable", - "description": null, - "price": 84000, - "stock": 10, - "brand": "Oster", - "parent_category": "Electrodomésticos", - "category": "Café y Desayuno", - "images": [ - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/tostadora-oster-tr500-acero-inoxidable-01.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/tostadora-oster-tr500-acero-inoxidable-02.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/tostadora-oster-tr500-acero-inoxidable-03.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/tostadora-oster-tr500-acero-inoxidable-04.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "waflera-atma-ws-027drn-disney-2-en-1", - "name": "Waflera Atma WS-027DRN disney 2 en 1", - "description": null, - "price": 64000, - "stock": 10, - "brand": "Atma", - "parent_category": "Electrodomésticos", - "category": "Freidoras y Cocción", - "images": [ - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/waflera-atma-ws-027drn-disney-2-en-1-01.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/waflera-atma-ws-027drn-disney-2-en-1-02.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/waflera-atma-ws-027drn-disney-2-en-1-03.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/waflera-atma-ws-027drn-disney-2-en-1-04.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/waflera-atma-ws-027drn-disney-2-en-1-05.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/waflera-atma-ws-027drn-disney-2-en-1-06.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/waflera-atma-ws-027drn-disney-2-en-1-07.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/waflera-atma-ws-027drn-disney-2-en-1-08.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/waflera-atma-ws-027drn-disney-2-en-1-09.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/waflera-atma-ws-027drn-disney-2-en-1-10.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "xiaomi-poco-c85-8-256-gb", - "name": "XIAOMI POCO C85 8/256 GB", - "description": "Color sujeto a disponibilidad", - "price": 430000, - "stock": 10, - "brand": "Xiaomi", - "parent_category": "Tecnología", - "category": "Celulares", - "images": [ - "images/tennants/mutual_smep/catalog/celulares/xiaomi-poco-c85-8-256-gb-01.webp", - "images/tennants/mutual_smep/catalog/celulares/xiaomi-poco-c85-8-256-gb-02.webp", - "images/tennants/mutual_smep/catalog/celulares/xiaomi-poco-c85-8-256-gb-03.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "xiaomi-poco-m7-8-256-gb", - "name": "XIAOMI POCO M7 8/256 GB", - "description": "Color sujeto a disponibilidad", - "price": 420000, - "stock": 10, - "brand": "Xiaomi", - "parent_category": "Tecnología", - "category": "Celulares", - "images": [ - "images/tennants/mutual_smep/catalog/celulares/xiaomi-poco-m7-8-256-gb-01.webp", - "images/tennants/mutual_smep/catalog/celulares/xiaomi-poco-m7-8-256-gb-02.webp", - "images/tennants/mutual_smep/catalog/celulares/xiaomi-poco-m7-8-256-gb-03.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "xiaomi-redmi-15c-8-256-gb", - "name": "Xiaomi Redmi 15C 8/256 GB", - "description": "Color sujeto a disponibilidad", - "price": 380000, - "stock": 10, - "brand": "Xiaomi", - "parent_category": "Tecnología", - "category": "Celulares", - "images": [ - "images/tennants/mutual_smep/catalog/celulares/xiaomi-redmi-15c-8-256-gb-01.webp", - "images/tennants/mutual_smep/catalog/celulares/xiaomi-redmi-15c-8-256-gb-02.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "xiaomi-redmi-note-14-pro-5g-8-256-gb", - "name": "Xiaomi Redmi Note 14 Pro 5G 8/256 GB", - "description": "Color sujeto a disponibilidad", - "price": 630000, - "stock": 10, - "brand": "Xiaomi", - "parent_category": "Tecnología", - "category": "Celulares", - "images": [ - "images/tennants/mutual_smep/catalog/celulares/xiaomi-redmi-note-14-pro-5g-8-256-gb-01.webp", - "images/tennants/mutual_smep/catalog/celulares/xiaomi-redmi-note-14-pro-5g-8-256-gb-02.webp", - "images/tennants/mutual_smep/catalog/celulares/xiaomi-redmi-note-14-pro-5g-8-256-gb-03.webp", - "images/tennants/mutual_smep/catalog/celulares/xiaomi-redmi-note-14-pro-5g-8-256-gb-04.webp", - "images/tennants/mutual_smep/catalog/celulares/xiaomi-redmi-note-14-pro-5g-8-256-gb-05.webp", - "images/tennants/mutual_smep/catalog/celulares/xiaomi-redmi-note-14-pro-5g-8-256-gb-06.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "xiaomi-redmi-note-15-8-256-gb", - "name": "Xiaomi Redmi Note 15 8/256 GB", - "description": "Color sujeto a disponibilidad", - "price": 496000, - "stock": 10, - "brand": "Xiaomi", - "parent_category": "Tecnología", - "category": "Celulares", - "images": [ - "images/tennants/mutual_smep/catalog/celulares/xiaomi-redmi-note-15-8-256-gb-01.webp", - "images/tennants/mutual_smep/catalog/celulares/xiaomi-redmi-note-15-8-256-gb-02.webp", - "images/tennants/mutual_smep/catalog/celulares/xiaomi-redmi-note-15-8-256-gb-03.webp", - "images/tennants/mutual_smep/catalog/celulares/xiaomi-redmi-note-15-8-256-gb-04.webp", - "images/tennants/mutual_smep/catalog/celulares/xiaomi-redmi-note-15-8-256-gb-05.webp" - ], - "attribute_codes": [], - "variants": [] - }, - { - "slug": "yogurtera-atma-ym3010p-7-porciones", - "name": "Yogurtera Atma YM3010P 7 porciones", - "description": null, - "price": 65000, - "stock": 10, - "brand": "Atma", - "parent_category": "Electrodomésticos", - "category": "Preparación de Alimentos", - "images": [ - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/yogurtera-atma-ym3010p-7-porciones-01.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/yogurtera-atma-ym3010p-7-porciones-02.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/yogurtera-atma-ym3010p-7-porciones-03.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/yogurtera-atma-ym3010p-7-porciones-04.webp", - "images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/yogurtera-atma-ym3010p-7-porciones-05.webp" - ], - "attribute_codes": [], - "variants": [] - } - ] -} diff --git a/database/migrations/2026_09_24_000000_provision_mutual_smep_tenant.php b/database/migrations/2026_09_24_000000_provision_mutual_smep_tenant.php deleted file mode 100644 index f118f6e8..00000000 --- a/database/migrations/2026_09_24_000000_provision_mutual_smep_tenant.php +++ /dev/null @@ -1,326 +0,0 @@ - */ - private array $storedPaths = []; - - public function up(): void - { - if (DB::table('tenants')->where('codigo', self::TENANT_CODE)->exists()) { - return; - } - - if ( - ! DB::table('admin_website_types')->where('codigo', 'shopit')->exists() - || ! DB::table('storefront_website_types')->where('codigo', 'shopit')->exists() - ) { - // Fresh installations provision website-type reference data separately. - return; - } - - try { - DB::transaction(function (): void { - $clientId = $this->clientId(); - $headerLogoId = $this->storeImage( - 'images/tennants/mutual_smep/mutual_smep_header.png', - 'mutual_smep_header.png', - ); - $footerLogoId = $this->storeImage( - 'images/tennants/mutual_smep/mutual_smep_footer.png', - 'mutual_smep_footer.png', - ); - $faviconId = $this->storeImage( - 'images/tennants/mutual_smep/mutual_smep_favicon.png', - 'mutual_smep_favicon.png', - ); - $now = now(); - - DB::table('tenants')->insert([ - 'client_id' => $clientId, - 'codigo' => self::TENANT_CODE, - 'nombre' => 'Mutual SMEP', - 'timezone' => 'America/Argentina/Buenos_Aires', - 'dominio' => 'mutual-smep.localhost', - 'base_path' => '/', - 'site_title' => 'Tienda Mutual SMEP', - 'address' => 'San Lorenzo 1543, Rosario, Santa Fe', - 'phone' => '+54 9 341 247-4530', - 'primary_color' => '#4A7FF5', - 'secondary_color' => '#0051A4', - 'danger_color' => '#FF8888', - 'success_color' => '#198754', - 'header_bg_color' => '#FFFFFF', - 'footer_bg_color' => '#0051A4', - 'header_logo_id' => $headerLogoId, - 'footer_logo_id' => $footerLogoId, - 'favicon_id' => $faviconId, - 'admin_website_type_code' => 'shopit', - 'storefront_website_type_code' => 'shopit', - 'display_categories' => true, - 'display_seach_bar' => true, - 'display_cart' => true, - 'cart_editing_policy' => 'quantity_and_remove', - 'checkout_editing_policy' => 'disabled', - 'created_at' => $now, - 'updated_at' => $now, - ]); - - $this->assignSocialMedia($now); - $this->assignMenus($now); - }); - } catch (Throwable $throwable) { - Storage::disk('s3')->delete($this->storedPaths); - - throw $throwable; - } - } - - public function down(): void - { - $tenant = DB::table('tenants') - ->where('codigo', self::TENANT_CODE) - ->first(['id', 'client_id', 'header_logo_id', 'footer_logo_id', 'favicon_id']); - - if ($tenant === null) { - return; - } - - $attachmentIds = collect([ - $tenant->header_logo_id, - $tenant->footer_logo_id, - $tenant->favicon_id, - ])->filter()->unique()->values(); - $storedPaths = DB::table('attachments') - ->whereIn('id', $attachmentIds) - ->pluck('path') - ->all(); - - DB::transaction(function () use ($tenant, $attachmentIds): void { - DB::table('tenant_social_media') - ->where('tenant_code', self::TENANT_CODE) - ->delete(); - DB::table('tenants_menues') - ->where('tenant_code', self::TENANT_CODE) - ->delete(); - DB::table('tenants') - ->where('id', $tenant->id) - ->delete(); - DB::table('attachments') - ->whereIn('id', $attachmentIds) - ->delete(); - - $clientHasTenants = DB::table('tenants') - ->where('client_id', $tenant->client_id) - ->exists(); - - if (! $clientHasTenants) { - DB::table('clients') - ->where('id', $tenant->client_id) - ->where('code', self::CLIENT_CODE) - ->delete(); - } - }); - - Storage::disk('s3')->delete($storedPaths); - } - - private function clientId(): int - { - $clientId = DB::table('clients')->where('code', self::CLIENT_CODE)->value('id'); - - if ($clientId !== null) { - DB::table('clients')->where('id', $clientId)->update([ - 'name' => 'Mutual SMEP', - 'updated_at' => now(), - ]); - - return (int) $clientId; - } - - return (int) DB::table('clients')->insertGetId([ - 'code' => self::CLIENT_CODE, - 'name' => 'Mutual SMEP', - 'created_at' => now(), - 'updated_at' => now(), - ]); - } - - private function assignSocialMedia(DateTimeInterface $now): void - { - $socialMedia = [ - [ - 'code' => 'instagram', - 'icon' => 'fa-brands fa-instagram', - 'name' => 'Instagram', - 'url' => 'https://www.instagram.com/mutualsmep/', - 'orden' => 0, - ], - [ - 'code' => 'facebook', - 'icon' => 'fa-brands fa-facebook', - 'name' => 'Facebook', - 'url' => 'https://www.facebook.com/smeprosario', - 'orden' => 1, - ], - [ - 'code' => 'whatsapp', - 'icon' => 'fa-brands fa-whatsapp', - 'name' => 'WhatsApp', - 'url' => 'https://wa.me/5493412474530', - 'orden' => 2, - ], - ]; - - foreach ($socialMedia as $network) { - DB::table('social_media')->insertOrIgnore([ - 'code' => $network['code'], - 'icon' => $network['icon'], - 'name' => $network['name'], - 'created_at' => $now, - 'updated_at' => $now, - ]); - - DB::table('tenant_social_media')->insertOrIgnore([ - 'tenant_code' => self::TENANT_CODE, - 'social_media_code' => $network['code'], - 'url' => $network['url'], - 'orden' => $network['orden'], - 'created_at' => $now, - 'updated_at' => $now, - ]); - } - } - - private function assignMenus(DateTimeInterface $now): void - { - DB::table('menues') - ->whereNotIn('code', self::EXCLUDED_MENU_CODES) - ->pluck('code') - ->each(function (string $menuCode) use ($now): void { - $staticContent = match ($menuCode) { - 'help.faq' => $this->frequentlyAskedQuestions(), - 'help.contact' => $this->contactContent(), - default => null, - }; - - DB::table('tenants_menues')->updateOrInsert( - [ - 'tenant_code' => self::TENANT_CODE, - 'menu_code' => $menuCode, - ], - [ - 'static_content' => $staticContent === null - ? null - : json_encode($staticContent, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES), - 'created_at' => $now, - 'updated_at' => $now, - ], - ); - }); - } - - /** @return list */ - private function frequentlyAskedQuestions(): array - { - return [ - [ - 'pregunta' => '¿Hay algún límite de compra?', - 'respuesta' => 'La cantidad disponible depende del stock de cada producto.', - 'is_active' => true, - ], - [ - 'pregunta' => '¿Cuáles son los medios de pago disponibles?', - 'respuesta' => 'Podés consultar y seleccionar los medios de pago habilitados al finalizar tu compra.', - 'is_active' => false, - ], - [ - 'pregunta' => '¿Cómo puedo recibir asesoramiento antes de comprar?', - 'respuesta' => 'Podés comunicarte con Mutual SMEP por WhatsApp al +54 9 341 247-4530.', - 'is_active' => false, - ], - ]; - } - - /** @return array */ - private function contactContent(): array - { - return [ - 'whatsapp' => [ - 'whatsapp_url' => 'https://wa.me/5493412474530', - 'whatsapp_label' => 'Chateá con Mutual SMEP', - ], - 'phone' => '+54 9 341 247-4530', - 'locations' => [ - 'rosario' => [ - 'label' => 'Rosario', - 'addresses' => [ - [ - 'label' => 'Mutual SMEP', - 'address' => 'San Lorenzo 1543, Rosario, Santa Fe', - 'coordinates' => [-32.9431184, -60.6437991], - ], - ], - ], - ], - ]; - } - - private function storeImage(string $relativePath, string $filename): int - { - $sourcePath = public_path($relativePath); - - if (! is_file($sourcePath)) { - throw new RuntimeException("Image not found at path: {$sourcePath}"); - } - - $contents = file_get_contents($sourcePath); - - if ($contents === false) { - throw new RuntimeException("Could not read image at path: {$sourcePath}"); - } - - $key = (string) Str::uuid(); - $storedPath = 'tenants/'.self::TENANT_CODE."/{$key}.png"; - - if (! Storage::disk('s3')->put($storedPath, $contents)) { - throw new RuntimeException("Could not store image at path: {$storedPath}"); - } - - $this->storedPaths[] = $storedPath; - - return DB::table('attachments')->insertGetId([ - 'key' => $key, - 'path' => $storedPath, - 'filename' => $filename, - 'type' => 'image', - 'mime_type' => 'image/png', - 'extension' => 'png', - 'size' => strlen($contents), - 'created_at' => now(), - 'updated_at' => now(), - ]); - } -}; diff --git a/database/migrations/2026_09_24_010000_seed_mutual_smep_categories.php b/database/migrations/2026_09_24_010000_seed_mutual_smep_categories.php deleted file mode 100644 index f89abb0c..00000000 --- a/database/migrations/2026_09_24_010000_seed_mutual_smep_categories.php +++ /dev/null @@ -1,141 +0,0 @@ -> */ - private const CATEGORIES = [ - 'Dormitorio y Blanco' => [ - 'Colchones', - 'Bases y Sommiers', - 'Acolchados y Edredones', - 'Frazadas y Mantas', - 'Infantil y Cuna', - ], - 'Electrodomésticos' => [ - 'Heladeras', - 'Lavarropas y Secarropas', - 'Cocinas', - 'Microondas', - 'Hornos Eléctricos', - 'Calefones y Termotanques', - 'Purificadores y Extractores de Cocina', - 'Preparación de Alimentos', - 'Café y Desayuno', - 'Freidoras y Cocción', - 'Cuidado Personal', - 'Limpieza y Planchado', - ], - 'Climatización' => [ - 'Aires Acondicionados', - 'Calefactores a Gas con Salida', - 'Calefactores a Gas sin Salida', - 'Calefacción Eléctrica', - ], - 'Tecnología' => [ - 'Celulares', - 'Notebooks', - 'Smart TV', - 'Audio', - 'Accesorios de Computación', - 'Soportes para TV', - ], - 'Bicicletas y Aire Libre' => [ - 'Bicicletas Infantiles', - 'Bicicletas para Adultos', - 'Piletas', - ], - 'Bazar' => [ - 'Termos', - ], - ]; - - public function up(): void - { - if (! DB::table('tenants')->where('codigo', self::TENANT_CODE)->exists()) { - return; - } - - DB::transaction(function (): void { - foreach (self::CATEGORIES as $parentName => $subcategoryNames) { - $parentId = $this->upsertCategory($parentName, null); - - foreach ($subcategoryNames as $subcategoryName) { - $this->upsertCategory($subcategoryName, $parentId); - } - } - }); - } - - public function down(): void - { - DB::transaction(function (): void { - foreach (self::CATEGORIES as $parentName => $subcategoryNames) { - $parentId = DB::table('categorias') - ->where('tenant_code', self::TENANT_CODE) - ->where('nombre', $parentName) - ->whereNull('categoria_id') - ->value('id'); - - if ($parentId === null) { - continue; - } - - $subcategoryIds = DB::table('categorias') - ->where('tenant_code', self::TENANT_CODE) - ->where('categoria_id', $parentId) - ->whereIn('nombre', $subcategoryNames) - ->pluck('id'); - - foreach ($subcategoryIds as $subcategoryId) { - $hasChildren = DB::table('categorias') - ->where('categoria_id', $subcategoryId) - ->exists(); - - if (! $hasChildren) { - DB::table('categorias')->where('id', $subcategoryId)->delete(); - } - } - - $hasChildren = DB::table('categorias') - ->where('categoria_id', $parentId) - ->exists(); - - if (! $hasChildren) { - DB::table('categorias')->where('id', $parentId)->delete(); - } - } - }); - } - - private function upsertCategory(string $name, ?int $parentId): int - { - $categoryId = DB::table('categorias') - ->where('tenant_code', self::TENANT_CODE) - ->where('nombre', $name) - ->value('id'); - - if ($categoryId !== null) { - DB::table('categorias')->where('id', $categoryId)->update([ - 'categoria_id' => $parentId, - 'is_enabled' => true, - 'updated_at' => now(), - ]); - - return (int) $categoryId; - } - - return (int) DB::table('categorias')->insertGetId([ - 'tenant_code' => self::TENANT_CODE, - 'categoria_id' => $parentId, - 'nombre' => $name, - 'is_enabled' => true, - 'created_at' => now(), - 'updated_at' => now(), - ]); - } -}; diff --git a/database/migrations/2026_09_24_020000_seed_mutual_smep_attributes.php b/database/migrations/2026_09_24_020000_seed_mutual_smep_attributes.php deleted file mode 100644 index 7d5a17ee..00000000 --- a/database/migrations/2026_09_24_020000_seed_mutual_smep_attributes.php +++ /dev/null @@ -1,139 +0,0 @@ -> */ - private const ATTRIBUTES = [ - [ - 'codigo' => 'color', - 'nombre' => 'Color', - 'metadata_schema' => [ - 'hex' => ['type' => 'string'], - ], - 'options' => [ - ['value' => 'Negro', 'label' => 'Negro', 'metadata' => ['hex' => '#000000']], - ['value' => 'Blanco', 'label' => 'Blanco', 'metadata' => ['hex' => '#FFFFFF']], - ['value' => 'Gris', 'label' => 'Gris', 'metadata' => ['hex' => '#808080']], - ['value' => 'Plata', 'label' => 'Plata', 'metadata' => ['hex' => '#C0C0C0']], - ['value' => 'Azul', 'label' => 'Azul', 'metadata' => ['hex' => '#0000FF']], - ['value' => 'Rojo', 'label' => 'Rojo', 'metadata' => ['hex' => '#DC3545']], - ['value' => 'Rosa', 'label' => 'Rosa', 'metadata' => ['hex' => '#FFC0CB']], - ['value' => 'Multicolor', 'label' => 'Multicolor'], - ], - ], - [ - 'codigo' => 'medida_cama', - 'nombre' => 'Medida', - 'options' => [ - ['value' => 'Cuna', 'label' => 'Cuna'], - ['value' => '1 Plaza', 'label' => '1 Plaza'], - ['value' => '1 1/2 Plazas', 'label' => '1 1/2 Plazas'], - ['value' => '2 Plazas', 'label' => '2 Plazas'], - ['value' => '2 1/2 Plazas', 'label' => '2 1/2 Plazas'], - ['value' => 'Queen', 'label' => 'Queen'], - ['value' => 'King', 'label' => 'King'], - ], - ], - [ - 'codigo' => 'almacenamiento', - 'nombre' => 'Almacenamiento', - 'options' => [ - ['value' => '128 GB', 'label' => '128 GB'], - ['value' => '256 GB', 'label' => '256 GB'], - ['value' => '512 GB', 'label' => '512 GB'], - ['value' => '1 TB', 'label' => '1 TB'], - ], - ], - [ - 'codigo' => 'memoria_ram', - 'nombre' => 'Memoria RAM', - 'options' => [ - ['value' => '4 GB', 'label' => '4 GB'], - ['value' => '8 GB', 'label' => '8 GB'], - ['value' => '16 GB', 'label' => '16 GB'], - ], - ], - [ - 'codigo' => 'rodado', - 'nombre' => 'Rodado', - 'options' => [ - ['value' => '16', 'label' => '16'], - ['value' => '26', 'label' => '26'], - ['value' => '29', 'label' => '29'], - ], - ], - ]; - - public function up(): void - { - if (! DB::table('tenants')->where('codigo', self::TENANT_CODE)->exists()) { - return; - } - - DB::transaction(function (): void { - foreach (self::ATTRIBUTES as $definition) { - $attributeId = $this->upsertAttribute($definition); - - DB::table('attribute_options')->where('attribute_id', $attributeId)->delete(); - - foreach ($definition['options'] as $index => $option) { - DB::table('attribute_options')->insert([ - 'attribute_id' => $attributeId, - 'value' => $option['value'], - 'label' => $option['label'], - 'sort_order' => $index + 1, - 'metadata' => isset($option['metadata']) - ? json_encode($option['metadata'], JSON_THROW_ON_ERROR) - : null, - 'created_at' => now(), - 'updated_at' => now(), - ]); - } - } - }); - } - - public function down(): void - { - DB::table('attribute') - ->where('tenant_codigo', self::TENANT_CODE) - ->whereIn('codigo', array_column(self::ATTRIBUTES, 'codigo')) - ->delete(); - } - - /** @param array $definition */ - private function upsertAttribute(array $definition): int - { - $attributeId = DB::table('attribute') - ->where('tenant_codigo', self::TENANT_CODE) - ->where('codigo', $definition['codigo']) - ->value('id'); - $values = [ - 'nombre' => $definition['nombre'], - 'is_required' => false, - 'metadata_schema' => isset($definition['metadata_schema']) - ? json_encode($definition['metadata_schema'], JSON_THROW_ON_ERROR) - : null, - 'type' => 'select', - 'updated_at' => now(), - ]; - - if ($attributeId !== null) { - DB::table('attribute')->where('id', $attributeId)->update($values); - - return (int) $attributeId; - } - - return (int) DB::table('attribute')->insertGetId([ - 'tenant_codigo' => self::TENANT_CODE, - 'codigo' => $definition['codigo'], - ...$values, - 'created_at' => now(), - ]); - } -}; diff --git a/database/migrations/2026_09_24_030000_seed_mutual_smep_catalog.php b/database/migrations/2026_09_24_030000_seed_mutual_smep_catalog.php deleted file mode 100644 index 3ab824aa..00000000 --- a/database/migrations/2026_09_24_030000_seed_mutual_smep_catalog.php +++ /dev/null @@ -1,462 +0,0 @@ - */ - private const FEATURED_GROUPS = [ - ['code' => 'smep-dormitorio-y-blanco', 'category' => 'Dormitorio y Blanco'], - ['code' => 'smep-electrodomesticos', 'category' => 'Electrodomésticos'], - ['code' => 'smep-climatizacion', 'category' => 'Climatización'], - ['code' => 'smep-tecnologia', 'category' => 'Tecnología'], - ['code' => 'smep-bicicletas-y-aire-libre', 'category' => 'Bicicletas y Aire Libre'], - ['code' => 'smep-bazar', 'category' => 'Bazar'], - ]; - - private const HIGHLIGHTED_GROUP_CODE = 'productos-destacados-smep'; - - private const CATEGORY_FEATURED_ITEM_LIMIT = 6; - - /** @var list */ - private const HIGHLIGHTED_PRODUCT_SLUGS = [ - 'acolchado-kavanagh-simil-plumon-reversible', - 'acolchado-sense-duo-bitono-corderito', - 'colchon-inducol-constanza', - 'edredon-lisboa-jean-cartier', - 'frazada-kavanagh-premium-soft', - 'kit-edredon-alaska-corderito', - 'motorola-g15', - 'smart-tv-noblex-50-dr50-x8500-google-tv', - 'heladera-gafa-hgf-368afp-330-lt-color-plata', - 'cafetera-express-atma-ceat-5418p-1-litro', - 'split-3300-w-tcl-taca-3300fcsa-frio-calor', - 'bicicleta-venzo-loki-r29-fd-21-v-shimano', - 'termo-stanley-1-l-adventure-go-to-con-tapon', - ]; - - /** @var list */ - 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']); - } - } - - $this->createFeaturedGroups(); - }); - } 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(fn ($query) => $query - ->where('path', 'like', self::STORAGE_PREFIX.'%') - ->orWhere('path', 'like', self::LEGACY_STORAGE_PREFIX.'%')) - ->pluck('path') - ->all(); - - DB::transaction(function () use ( - $catalogItemIds, - $variantInventoryIds, - $itemInventoryIds, - $attachmentIds, - ): void { - DB::table('featured_groups') - ->where('tenant_code', self::TENANT_CODE) - ->whereIn('code', [ - self::HIGHLIGHTED_GROUP_CODE, - ...array_column(self::FEATURED_GROUPS, '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 */ - 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 $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 $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 $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, - ]); - } - - private function createFeaturedGroups(): void - { - $this->createHighlightedGroup(); - - foreach (self::FEATURED_GROUPS as $order => $group) { - $categoryId = DB::table('categorias') - ->where('tenant_code', self::TENANT_CODE) - ->whereNull('categoria_id') - ->where('nombre', $group['category']) - ->value('id'); - - if ($categoryId === null) { - throw new RuntimeException("Parent category '{$group['category']}' not found for Mutual SMEP."); - } - - $featuredGroupId = DB::table('featured_groups')->insertGetId([ - 'tenant_code' => self::TENANT_CODE, - 'code' => $group['code'], - 'source_type' => 'manual', - 'category_id' => $categoryId, - 'product_layout' => 'column_with_image', - 'group_layout' => 'carousel', - 'group_name' => $group['category'], - 'group_order' => $order + 2, - ]); - - $catalogItemIds = DB::table('catalog_items') - ->join('categorias', 'categorias.id', '=', 'catalog_items.category_id') - ->where('catalog_items.tenant_code', self::TENANT_CODE) - ->where('categorias.tenant_code', self::TENANT_CODE) - ->where('categorias.categoria_id', $categoryId) - ->orderBy('catalog_items.group_order') - ->orderBy('catalog_items.id') - ->limit(self::CATEGORY_FEATURED_ITEM_LIMIT) - ->pluck('catalog_items.id'); - - foreach ($catalogItemIds as $itemOrder => $catalogItemId) { - DB::table('featured_items')->insert([ - 'featured_group_id' => $featuredGroupId, - 'catalog_item_id' => $catalogItemId, - 'order' => $itemOrder + 1, - ]); - } - } - } - - private function createHighlightedGroup(): void - { - $featuredGroupId = DB::table('featured_groups')->insertGetId([ - 'tenant_code' => self::TENANT_CODE, - 'code' => self::HIGHLIGHTED_GROUP_CODE, - 'source_type' => 'manual', - 'category_id' => null, - 'product_layout' => 'column_with_image', - 'group_layout' => 'carousel', - 'group_name' => 'Productos destacados', - 'group_order' => 1, - ]); - - $catalogItemIds = DB::table('catalog_items') - ->where('tenant_code', self::TENANT_CODE) - ->whereIn('slug', self::HIGHLIGHTED_PRODUCT_SLUGS) - ->pluck('id', 'slug'); - - foreach (self::HIGHLIGHTED_PRODUCT_SLUGS as $order => $slug) { - $catalogItemId = $catalogItemIds->get($slug); - - if ($catalogItemId === null) { - throw new RuntimeException("Highlighted product '{$slug}' not found for Mutual SMEP."); - } - - DB::table('featured_items')->insert([ - 'featured_group_id' => $featuredGroupId, - 'catalog_item_id' => $catalogItemId, - 'order' => $order + 1, - ]); - } - } - - /** @param list $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, - ]); - } - } -}; diff --git a/database/migrations/2026_09_24_040000_seed_mutual_smep_carousel.php b/database/migrations/2026_09_24_040000_seed_mutual_smep_carousel.php deleted file mode 100644 index 8f686a2a..00000000 --- a/database/migrations/2026_09_24_040000_seed_mutual_smep_carousel.php +++ /dev/null @@ -1,140 +0,0 @@ - */ - private const IMAGES = [ - '01-tecnologia.webp', - '02-hogar.webp', - '03-vida-activa.webp', - '04-descanso.webp', - ]; - - /** @var list */ - private array $storedPaths = []; - - public function up(): void - { - $tenant = DB::table('tenants') - ->where('codigo', self::TENANT_CODE) - ->first(['codigo', 'storefront_website_type_code']); - - if ($tenant === null) { - return; - } - - $extraId = DB::table('storefront_website_type_extras') - ->where('storefront_website_type_code', $tenant->storefront_website_type_code) - ->where('codigo', self::EXTRA_CODE) - ->value('id'); - - if ($extraId === null || DB::table('websites_extras')->where([ - 'website_code' => self::TENANT_CODE, - 'website_type_extra_id' => $extraId, - ])->exists()) { - return; - } - - try { - DB::transaction(function () use ($extraId): void { - $attachmentIds = []; - - foreach (self::IMAGES as $filename) { - $attachmentIds[] = $this->storeImage($filename); - } - - DB::table('websites_extras')->insert([ - 'website_code' => self::TENANT_CODE, - 'website_type_extra_id' => $extraId, - 'config' => json_encode($attachmentIds, JSON_THROW_ON_ERROR), - 'is_enabled' => true, - 'created_at' => now(), - 'updated_at' => now(), - ]); - }); - } catch (Throwable $throwable) { - Storage::disk('s3')->delete($this->storedPaths); - - throw $throwable; - } - } - - public function down(): void - { - $attachments = DB::table('attachments') - ->where('path', 'like', self::STORAGE_PREFIX.'%') - ->get(['id', 'path']); - - if ($attachments->isEmpty()) { - return; - } - - $attachmentIds = $attachments->pluck('id')->map(fn ($id): int => (int) $id)->all(); - $extraId = DB::table('storefront_website_type_extras') - ->where('storefront_website_type_code', 'shopit') - ->where('codigo', self::EXTRA_CODE) - ->value('id'); - - DB::transaction(function () use ($attachmentIds, $extraId): void { - if ($extraId !== null) { - DB::table('websites_extras') - ->where('website_code', self::TENANT_CODE) - ->where('website_type_extra_id', $extraId) - ->where('config', json_encode($attachmentIds, JSON_THROW_ON_ERROR)) - ->delete(); - } - - DB::table('attachments')->whereIn('id', $attachmentIds)->delete(); - }); - - Storage::disk('s3')->delete($attachments->pluck('path')->all()); - } - - private function storeImage(string $filename): int - { - $sourcePath = public_path(self::IMAGE_DIRECTORY."/{$filename}"); - - if (! is_file($sourcePath)) { - throw new RuntimeException("Carousel image not found: {$sourcePath}"); - } - - $contents = file_get_contents($sourcePath); - - if ($contents === false) { - throw new RuntimeException("Carousel image could not be read: {$sourcePath}"); - } - - $storedPath = self::STORAGE_PREFIX.$filename; - - if (! Storage::disk('s3')->put($storedPath, $contents)) { - throw new RuntimeException("Carousel image could not be stored: {$storedPath}"); - } - - $this->storedPaths[] = $storedPath; - - return (int) DB::table('attachments')->insertGetId([ - 'key' => (string) Str::uuid(), - 'path' => $storedPath, - 'filename' => $filename, - 'type' => 'image', - 'mime_type' => 'image/webp', - 'extension' => 'webp', - 'size' => strlen($contents), - 'created_at' => now(), - 'updated_at' => now(), - ]); - } -}; diff --git a/database/migrations/2026_09_24_050000_limit_mutual_smep_category_featured_groups.php b/database/migrations/2026_09_24_050000_limit_mutual_smep_category_featured_groups.php deleted file mode 100644 index 0e7f9762..00000000 --- a/database/migrations/2026_09_24_050000_limit_mutual_smep_category_featured_groups.php +++ /dev/null @@ -1,88 +0,0 @@ - */ - private const GROUPS = [ - 'smep-dormitorio-y-blanco' => 'Dormitorio y Blanco', - 'smep-electrodomesticos' => 'Electrodomésticos', - 'smep-climatizacion' => 'Climatización', - 'smep-tecnologia' => 'Tecnología', - 'smep-bicicletas-y-aire-libre' => 'Bicicletas y Aire Libre', - 'smep-bazar' => 'Bazar', - ]; - - public function up(): void - { - foreach (array_keys(self::GROUPS) as $code) { - $groupId = DB::table('featured_groups') - ->where('tenant_code', self::TENANT_CODE) - ->where('code', $code) - ->value('id'); - - if ($groupId === null) { - continue; - } - - $keptItemIds = DB::table('featured_items') - ->where('featured_group_id', $groupId) - ->orderBy('order') - ->orderBy('id') - ->limit(self::ITEM_LIMIT) - ->pluck('id'); - - DB::table('featured_items') - ->where('featured_group_id', $groupId) - ->when( - $keptItemIds->isNotEmpty(), - fn ($query) => $query->whereNotIn('id', $keptItemIds), - ) - ->delete(); - } - } - - public function down(): void - { - foreach (self::GROUPS as $code => $parentCategoryName) { - $groupId = DB::table('featured_groups') - ->where('tenant_code', self::TENANT_CODE) - ->where('code', $code) - ->value('id'); - $parentCategoryId = DB::table('categorias') - ->where('tenant_code', self::TENANT_CODE) - ->whereNull('categoria_id') - ->where('nombre', $parentCategoryName) - ->value('id'); - - if ($groupId === null || $parentCategoryId === null) { - continue; - } - - $catalogItemIds = DB::table('catalog_items') - ->join('categorias', 'categorias.id', '=', 'catalog_items.category_id') - ->where('catalog_items.tenant_code', self::TENANT_CODE) - ->where('categorias.tenant_code', self::TENANT_CODE) - ->where('categorias.categoria_id', $parentCategoryId) - ->orderBy('catalog_items.group_order') - ->orderBy('catalog_items.id') - ->pluck('catalog_items.id'); - - DB::table('featured_items')->where('featured_group_id', $groupId)->delete(); - - foreach ($catalogItemIds as $order => $catalogItemId) { - DB::table('featured_items')->insert([ - 'featured_group_id' => $groupId, - 'catalog_item_id' => $catalogItemId, - 'order' => $order + 1, - ]); - } - } - } -}; diff --git a/database/migrations/2026_09_24_060000_optimize_mutual_smep_catalog_images.php b/database/migrations/2026_09_24_060000_optimize_mutual_smep_catalog_images.php deleted file mode 100644 index d419d627..00000000 --- a/database/migrations/2026_09_24_060000_optimize_mutual_smep_catalog_images.php +++ /dev/null @@ -1,112 +0,0 @@ -attachments(self::LEGACY_PREFIX); - $uploadedPaths = []; - - try { - foreach ($attachments as $attachment) { - $relativePath = Str::after($attachment->path, self::LEGACY_PREFIX); - $localPath = public_path(self::LOCAL_PREFIX.$relativePath); - - if (! is_file($localPath)) { - throw new RuntimeException("Optimized catalog image not found: {$localPath}"); - } - - $contents = file_get_contents($localPath); - if ($contents === false) { - throw new RuntimeException("Optimized catalog image could not be read: {$localPath}"); - } - - $optimizedPath = self::OPTIMIZED_PREFIX.$relativePath; - if (! Storage::disk('s3')->put($optimizedPath, $contents)) { - throw new RuntimeException("Optimized catalog image could not be stored: {$optimizedPath}"); - } - - $uploadedPaths[] = $optimizedPath; - $attachment->optimized_path = $optimizedPath; - $attachment->optimized_size = strlen($contents); - } - - DB::transaction(function () use ($attachments): void { - foreach ($attachments as $attachment) { - DB::table('attachments')->where('id', $attachment->id)->update([ - 'path' => $attachment->optimized_path, - 'size' => $attachment->optimized_size, - 'updated_at' => now(), - ]); - } - }); - } catch (Throwable $throwable) { - Storage::disk('s3')->delete($uploadedPaths); - - throw $throwable; - } - } - - public function down(): void - { - $attachments = $this->attachments(self::OPTIMIZED_PREFIX) - ->filter(function (object $attachment): bool { - $relativePath = Str::after($attachment->path, self::OPTIMIZED_PREFIX); - $legacyPath = self::LEGACY_PREFIX.$relativePath; - - if (! Storage::disk('s3')->exists($legacyPath)) { - return false; - } - - $attachment->legacy_path = $legacyPath; - $attachment->legacy_size = Storage::disk('s3')->size($legacyPath); - - return true; - }) - ->values(); - - DB::transaction(function () use ($attachments): void { - foreach ($attachments as $attachment) { - DB::table('attachments')->where('id', $attachment->id)->update([ - 'path' => $attachment->legacy_path, - 'size' => $attachment->legacy_size, - 'updated_at' => now(), - ]); - } - }); - - Storage::disk('s3')->delete($attachments->pluck('path')->all()); - } - - private function attachments(string $prefix): Collection - { - return DB::table('attachments') - ->join( - 'catalog_items_attachments', - 'catalog_items_attachments.attachment_id', - '=', - 'attachments.id', - ) - ->join('catalog_items', 'catalog_items.id', '=', 'catalog_items_attachments.catalog_item_id') - ->where('catalog_items.tenant_code', self::TENANT_CODE) - ->where('attachments.path', 'like', $prefix.'%') - ->select('attachments.id', 'attachments.path', 'attachments.size') - ->distinct() - ->orderBy('attachments.id') - ->get(); - } -}; diff --git a/database/migrations/2026_09_25_000000_generate_available_inventory_stock.php b/database/migrations/2026_09_25_000000_generate_available_inventory_stock.php deleted file mode 100644 index 533a02bf..00000000 --- a/database/migrations/2026_09_25_000000_generate_available_inventory_stock.php +++ /dev/null @@ -1,89 +0,0 @@ -assertNonNegative($conversion, 'la conversión produciría un stock real negativo'); - $this->assertNonNegative( - "({$conversion}) - CAST(sold_units AS SIGNED) - CAST(reserved_stock AS SIGNED) - CAST(entry_reserved_stock AS SIGNED) + CAST(refunded_units AS SIGNED)", - 'el stock disponible actual es negativo', - ); - - if (DB::getDriverName() === 'sqlite') { - Schema::table('inventories', function (Blueprint $table): void { - $table->bigInteger('available_stock')->virtualAs(self::FORMULA); - }); - DB::table('inventories')->update(['real_stock' => DB::raw($conversion)]); - } else { - Schema::table('inventories', function (Blueprint $table): void { - $table->unsignedBigInteger('real_stock')->default(0)->change(); - $table->bigInteger('available_stock')->storedAs(self::FORMULA); - }); - DB::table('inventories')->update(['real_stock' => DB::raw($conversion)]); - } - } - - public function down(): void - { - $conversion = 'CAST(real_stock AS SIGNED) - CAST(sold_units AS SIGNED) + CAST(refunded_units AS SIGNED)'; - $this->assertNonNegative($conversion, 'el rollback produciría un stock real negativo'); - - if (DB::getDriverName() === 'sqlite') { - DB::table('inventories')->update(['real_stock' => DB::raw($conversion)]); - Schema::table('inventories', fn (Blueprint $table) => $table->dropColumn('available_stock')); - - return; - } - - DB::table('inventories')->update(['real_stock' => DB::raw($conversion)]); - Schema::table('inventories', fn (Blueprint $table) => $table->dropColumn('available_stock')); - } - - private function assertNonNegative(string $expression, string $reason): void - { - $invalidInventories = DB::table('inventories') - ->select([ - 'id', - 'real_stock', - 'sold_units', - 'refunded_units', - 'reserved_stock', - 'entry_reserved_stock', - ]) - ->selectRaw("({$expression}) as calculated_stock") - ->whereRaw("({$expression}) < 0") - ->orderBy('id') - ->limit(20) - ->get(); - - if ($invalidInventories->isNotEmpty()) { - $details = $invalidInventories - ->map(static fn (object $inventory): string => sprintf( - 'id=%d [real=%d, vendidas=%d, reintegradas=%d, reservadas=%d, reservas_entradas=%d, resultado=%d]', - $inventory->id, - $inventory->real_stock, - $inventory->sold_units, - $inventory->refunded_units, - $inventory->reserved_stock, - $inventory->entry_reserved_stock, - $inventory->calculated_stock, - )) - ->implode('; '); - - throw new RuntimeException( - "Hay inventarios inconsistentes: {$reason}. Inventarios detectados (máximo 20): {$details}." - ); - } - } -}; diff --git a/database/migrations/2026_09_25_010000_create_inventory_movements_table.php b/database/migrations/2026_09_25_010000_create_inventory_movements_table.php deleted file mode 100644 index b43c57c1..00000000 --- a/database/migrations/2026_09_25_010000_create_inventory_movements_table.php +++ /dev/null @@ -1,33 +0,0 @@ -id(); - $table->foreignId('inventory_id')->constrained('inventories')->restrictOnDelete(); - $table->string('operation', 40); - $table->bigInteger('available_stock_delta'); - $table->bigInteger('available_stock_before'); - $table->bigInteger('available_stock_after'); - $table->json('counter_deltas'); - $table->foreignId('responsible_user_id')->nullable()->constrained('users')->restrictOnDelete(); - $table->uuid('idempotency_key')->nullable(); - $table->timestamps(); - - $table->unique(['inventory_id', 'idempotency_key']); - $table->index(['inventory_id', 'created_at']); - $table->index(['operation', 'created_at']); - }); - } - - public function down(): void - { - Schema::dropIfExists('inventory_movements'); - } -}; diff --git a/database/migrations/2026_09_28_000000_add_client_id_to_events.php b/database/migrations/2026_09_28_000000_add_client_id_to_events.php deleted file mode 100644 index 039f6804..00000000 --- a/database/migrations/2026_09_28_000000_add_client_id_to_events.php +++ /dev/null @@ -1,26 +0,0 @@ -foreignId('client_id') - ->nullable() - ->after('id') - ->constrained('clients') - ->restrictOnDelete(); - }); - } - - public function down(): void - { - Schema::table('events', function (Blueprint $table): void { - $table->dropConstrainedForeignId('client_id'); - }); - } -}; diff --git a/database/migrations/2026_09_28_000100_add_event_id_to_compras.php b/database/migrations/2026_09_28_000100_add_event_id_to_compras.php deleted file mode 100644 index 0dad3a5b..00000000 --- a/database/migrations/2026_09_28_000100_add_event_id_to_compras.php +++ /dev/null @@ -1,44 +0,0 @@ -foreignId('event_id') - ->nullable() - ->after('tenant_codigo') - ->constrained('events') - ->nullOnDelete(); - }); - - DB::table('compras') - ->orderBy('id') - ->each(function (object $purchase): void { - $eventIds = DB::table('compra_items') - ->join('catalog_items', 'catalog_items.id', '=', 'compra_items.source_catalog_item_id') - ->where('compra_items.compra_id', $purchase->id) - ->whereNotNull('catalog_items.event_id') - ->distinct() - ->pluck('catalog_items.event_id'); - - if ($eventIds->count() === 1) { - DB::table('compras') - ->where('id', $purchase->id) - ->update(['event_id' => $eventIds->first()]); - } - }); - } - - public function down(): void - { - Schema::table('compras', function (Blueprint $table): void { - $table->dropConstrainedForeignId('event_id'); - }); - } -}; diff --git a/database/migrations/2026_09_28_000200_assign_arrufo_event_to_pyme_rural_client.php b/database/migrations/2026_09_28_000200_assign_arrufo_event_to_pyme_rural_client.php deleted file mode 100644 index 601f22e8..00000000 --- a/database/migrations/2026_09_28_000200_assign_arrufo_event_to_pyme_rural_client.php +++ /dev/null @@ -1,42 +0,0 @@ -where('code', 'pyme_rural') - ->value('id'); - - if ($clientId === null) { - return; - } - - DB::table('events') - ->where('tenant_code', 'onticket') - ->where('title', self::EVENT_TITLE) - ->update(['client_id' => $clientId]); - } - - public function down(): void - { - $clientId = DB::table('clients') - ->where('code', 'pyme_rural') - ->value('id'); - - if ($clientId === null) { - return; - } - - DB::table('events') - ->where('tenant_code', 'onticket') - ->where('title', self::EVENT_TITLE) - ->where('client_id', $clientId) - ->update(['client_id' => null]); - } -}; diff --git a/database/scripts/build_mutual_smep_catalog_assets.php b/database/scripts/build_mutual_smep_catalog_assets.php deleted file mode 100644 index c9bc6f98..00000000 --- a/database/scripts/build_mutual_smep_catalog_assets.php +++ /dev/null @@ -1,311 +0,0 @@ - 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}|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, CATALOG_IMAGE_MAX_DIMENSION / 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, CATALOG_IMAGE_WEBP_QUALITY)) { - 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; diff --git a/database/seeders/AttributeSeeder.php b/database/seeders/AttributeSeeder.php index 142d8b10..f19e67bd 100644 --- a/database/seeders/AttributeSeeder.php +++ b/database/seeders/AttributeSeeder.php @@ -3,10 +3,10 @@ namespace Database\Seeders; use App\Domains\Commerce\Catalog\Models\Attribute; +use App\Shared\Enums\FieldType; use App\Domains\Core\Tenant\Models\Tenant; use App\Domains\Ticketing\Ticket\Enums\ValidityTimeType; use App\Domains\Ticketing\Ticket\Models\ValidityTime; -use App\Shared\Enums\FieldType; use Illuminate\Database\Seeder; class AttributeSeeder extends Seeder @@ -25,10 +25,6 @@ class AttributeSeeder extends Seeder continue; } - if ($tenant->codigo === 'mutual_smep') { - continue; - } - $this->seedAttribute($tenant, [ 'codigo' => 'color', 'nombre' => 'Color', diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index e1185e3a..b5be6dc1 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -29,9 +29,7 @@ class DatabaseSeeder extends Seeder TenantSeeder::class, DesfilePuraTendenciaSeeder::class, AttributeSeeder::class, - MutualSmepAttributeSeeder::class, CategorySeeder::class, - MutualSmepCategorySeeder::class, BrandSeeder::class, ProductCatalogFromImagesSeeder::class, FiestaFutbolInfantilProductSeeder::class, diff --git a/database/seeders/FiestaTradicionArrufoSeeder.php b/database/seeders/FiestaTradicionArrufoSeeder.php index 69263cb7..79b0dbbd 100644 --- a/database/seeders/FiestaTradicionArrufoSeeder.php +++ b/database/seeders/FiestaTradicionArrufoSeeder.php @@ -6,7 +6,6 @@ use App\Domains\Commerce\Catalog\Enums\InventoryPolicy; use App\Domains\Commerce\Catalog\Models\Attribute; use App\Domains\Commerce\Catalog\Models\CatalogItem; use App\Domains\Commerce\Catalog\Services\CatalogService; -use App\Domains\Core\Client\Models\Client; use App\Domains\Core\Tenant\Models\Tenant; use App\Domains\Ticketing\Event\Models\Event; use App\Shared\Attachable\Services\AttachmentService; @@ -36,12 +35,6 @@ class FiestaTradicionArrufoSeeder extends Seeder throw new RuntimeException("Tenant 'onticket' no encontrado."); } - $client = Client::query()->where('code', 'pyme_rural')->first(); - - if ($client === null) { - throw new RuntimeException("Client 'pyme_rural' no encontrado."); - } - Attribute::query()->firstOrCreate( ['tenant_codigo' => $tenant->codigo, 'codigo' => 'event_date'], ['nombre' => 'Fecha', 'type' => FieldType::EventDate, 'is_required' => true], @@ -52,7 +45,6 @@ class FiestaTradicionArrufoSeeder extends Seeder ['published_at' => now()], ); $event->update([ - 'client_id' => $client->id, 'subtitle' => 'Una noche para celebrar nuestras raíces y mantener viva la tradición gaucha.', 'description' => 'La 26.º Fiesta de la Tradición y 4.º Encuentro de Agrupaciones Gauchas reunirá a agrupaciones, artesanos, pilcheros y público en general para compartir una jornada dedicada a nuestras costumbres y cultura.' ."\n\n".'Un encuentro para disfrutar de la tradición, la identidad gaucha y el espíritu de camaradería, en el Predio de Doma del Club Unión Deportiva Arrufó.' diff --git a/database/seeders/MenuSeeder.php b/database/seeders/MenuSeeder.php index 25a61dcb..c589f7a2 100644 --- a/database/seeders/MenuSeeder.php +++ b/database/seeders/MenuSeeder.php @@ -296,7 +296,6 @@ class MenuSeeder extends Seeder $helpTenantCodes = [ 'sonder', 'fiesta_futbol_infantil', - 'mutual_smep', ]; $ticketAdminMenuCodes = [ 'adminapp.tickets', @@ -366,42 +365,6 @@ class MenuSeeder extends Seeder ], ], ]; - $mutualSmepFrequentlyAskedQuestions = [ - [ - 'pregunta' => '¿Hay algún límite de compra?', - 'respuesta' => 'La cantidad disponible depende del stock de cada producto.', - 'is_active' => true, - ], - [ - 'pregunta' => '¿Cuáles son los medios de pago disponibles?', - 'respuesta' => 'Podés consultar y seleccionar los medios de pago habilitados al finalizar tu compra.', - 'is_active' => false, - ], - [ - 'pregunta' => '¿Cómo puedo recibir asesoramiento antes de comprar?', - 'respuesta' => 'Podés comunicarte con Mutual SMEP por WhatsApp al +54 9 341 247-4530.', - 'is_active' => false, - ], - ]; - $mutualSmepContactContent = [ - 'whatsapp' => [ - 'whatsapp_url' => 'https://wa.me/5493412474530', - 'whatsapp_label' => 'Chateá con Mutual SMEP', - ], - 'phone' => '+54 9 341 247-4530', - 'locations' => [ - 'rosario' => [ - 'label' => 'Rosario', - 'addresses' => [ - [ - 'label' => 'Mutual SMEP', - 'address' => 'San Lorenzo 1543, Rosario, Santa Fe', - 'coordinates' => [-32.9431184, -60.6437991], - ], - ], - ], - ], - ]; foreach ($tenants as $tenant) { $menuCodes = $allMenus; @@ -443,14 +406,10 @@ class MenuSeeder extends Seeder if (in_array($tenant->codigo, $helpTenantCodes, true)) { $tenant->menues()->updateExistingPivot('help.faq', [ - 'static_content' => $tenant->codigo === 'mutual_smep' - ? $mutualSmepFrequentlyAskedQuestions - : $frequentlyAskedQuestions, + 'static_content' => $frequentlyAskedQuestions, ]); $tenant->menues()->updateExistingPivot('help.contact', [ - 'static_content' => $tenant->codigo === 'mutual_smep' - ? $mutualSmepContactContent - : $contactContent, + 'static_content' => $contactContent, ]); } } diff --git a/database/seeders/MutualSmepAttributeSeeder.php b/database/seeders/MutualSmepAttributeSeeder.php deleted file mode 100644 index 9b6d0cae..00000000 --- a/database/seeders/MutualSmepAttributeSeeder.php +++ /dev/null @@ -1,122 +0,0 @@ -> */ - private const ATTRIBUTES = [ - [ - 'codigo' => 'color', - 'nombre' => 'Color', - 'metadata_schema' => [ - 'hex' => ['type' => 'string'], - ], - 'options' => [ - ['value' => 'Negro', 'label' => 'Negro', 'metadata' => ['hex' => '#000000']], - ['value' => 'Blanco', 'label' => 'Blanco', 'metadata' => ['hex' => '#FFFFFF']], - ['value' => 'Gris', 'label' => 'Gris', 'metadata' => ['hex' => '#808080']], - ['value' => 'Plata', 'label' => 'Plata', 'metadata' => ['hex' => '#C0C0C0']], - ['value' => 'Azul', 'label' => 'Azul', 'metadata' => ['hex' => '#0000FF']], - ['value' => 'Rojo', 'label' => 'Rojo', 'metadata' => ['hex' => '#DC3545']], - ['value' => 'Rosa', 'label' => 'Rosa', 'metadata' => ['hex' => '#FFC0CB']], - ['value' => 'Multicolor', 'label' => 'Multicolor'], - ], - ], - [ - 'codigo' => 'medida_cama', - 'nombre' => 'Medida', - 'options' => [ - ['value' => 'Cuna', 'label' => 'Cuna'], - ['value' => '1 Plaza', 'label' => '1 Plaza'], - ['value' => '1 1/2 Plazas', 'label' => '1 1/2 Plazas'], - ['value' => '2 Plazas', 'label' => '2 Plazas'], - ['value' => '2 1/2 Plazas', 'label' => '2 1/2 Plazas'], - ['value' => 'Queen', 'label' => 'Queen'], - ['value' => 'King', 'label' => 'King'], - ], - ], - [ - 'codigo' => 'almacenamiento', - 'nombre' => 'Almacenamiento', - 'options' => [ - ['value' => '128 GB', 'label' => '128 GB'], - ['value' => '256 GB', 'label' => '256 GB'], - ['value' => '512 GB', 'label' => '512 GB'], - ['value' => '1 TB', 'label' => '1 TB'], - ], - ], - [ - 'codigo' => 'memoria_ram', - 'nombre' => 'Memoria RAM', - 'options' => [ - ['value' => '4 GB', 'label' => '4 GB'], - ['value' => '8 GB', 'label' => '8 GB'], - ['value' => '16 GB', 'label' => '16 GB'], - ], - ], - [ - 'codigo' => 'rodado', - 'nombre' => 'Rodado', - 'options' => [ - ['value' => '16', 'label' => '16'], - ['value' => '26', 'label' => '26'], - ['value' => '29', 'label' => '29'], - ], - ], - ]; - - public function run(): void - { - if (! Tenant::query()->where('codigo', self::TENANT_CODE)->exists()) { - return; - } - - DB::transaction(function (): void { - foreach (self::ATTRIBUTES as $definition) { - $options = $definition['options']; - unset($definition['options']); - - $attribute = Attribute::query()->updateOrCreate( - [ - 'tenant_codigo' => self::TENANT_CODE, - 'codigo' => $definition['codigo'], - ], - [ - ...$definition, - 'type' => FieldType::Select->value, - 'is_required' => false, - 'metadata_schema' => $definition['metadata_schema'] ?? null, - ], - ); - - $attribute->options()->delete(); - $attribute->options()->createMany( - collect($options) - ->values() - ->map(fn (array $option, int $index): array => [ - ...$option, - 'sort_order' => $index + 1, - ]) - ->all() - ); - } - }); - } - - public function down(): void - { - Attribute::query() - ->where('tenant_codigo', self::TENANT_CODE) - ->whereIn('codigo', array_column(self::ATTRIBUTES, 'codigo')) - ->delete(); - } -} diff --git a/database/seeders/MutualSmepCategorySeeder.php b/database/seeders/MutualSmepCategorySeeder.php deleted file mode 100644 index 8b820607..00000000 --- a/database/seeders/MutualSmepCategorySeeder.php +++ /dev/null @@ -1,123 +0,0 @@ -> */ - private const CATEGORIES = [ - 'Dormitorio y Blanco' => [ - 'Colchones', - 'Bases y Sommiers', - 'Acolchados y Edredones', - 'Frazadas y Mantas', - 'Infantil y Cuna', - ], - 'Electrodomésticos' => [ - 'Heladeras', - 'Lavarropas y Secarropas', - 'Cocinas', - 'Microondas', - 'Hornos Eléctricos', - 'Calefones y Termotanques', - 'Purificadores y Extractores de Cocina', - 'Preparación de Alimentos', - 'Café y Desayuno', - 'Freidoras y Cocción', - 'Cuidado Personal', - 'Limpieza y Planchado', - ], - 'Climatización' => [ - 'Aires Acondicionados', - 'Calefactores a Gas con Salida', - 'Calefactores a Gas sin Salida', - 'Calefacción Eléctrica', - ], - 'Tecnología' => [ - 'Celulares', - 'Notebooks', - 'Smart TV', - 'Audio', - 'Accesorios de Computación', - 'Soportes para TV', - ], - 'Bicicletas y Aire Libre' => [ - 'Bicicletas Infantiles', - 'Bicicletas para Adultos', - 'Piletas', - ], - 'Bazar' => [ - 'Termos', - ], - ]; - - public function run(): void - { - if (! Tenant::query()->where('codigo', self::TENANT_CODE)->exists()) { - return; - } - - DB::transaction(function (): void { - foreach (self::CATEGORIES as $parentName => $subcategoryNames) { - $parent = Category::query()->updateOrCreate( - [ - 'tenant_code' => self::TENANT_CODE, - 'nombre' => $parentName, - ], - [ - 'categoria_id' => null, - 'is_enabled' => true, - ], - ); - - foreach ($subcategoryNames as $subcategoryName) { - Category::query()->updateOrCreate( - [ - 'tenant_code' => self::TENANT_CODE, - 'nombre' => $subcategoryName, - ], - [ - 'categoria_id' => $parent->id, - 'is_enabled' => true, - ], - ); - } - } - }); - } - - public function down(): void - { - DB::transaction(function (): void { - foreach (self::CATEGORIES as $parentName => $subcategoryNames) { - $parent = Category::query() - ->where('tenant_code', self::TENANT_CODE) - ->where('nombre', $parentName) - ->whereNull('categoria_id') - ->first(); - - if (! $parent instanceof Category) { - continue; - } - - Category::query() - ->where('tenant_code', self::TENANT_CODE) - ->where('categoria_id', $parent->id) - ->whereIn('nombre', $subcategoryNames) - ->whereDoesntHave('subCategories') - ->delete(); - - if (! $parent->subCategories()->exists()) { - $parent->delete(); - } - } - }); - } -} diff --git a/docs/informe-carga-catalogo-mutual-smep.md b/docs/informe-carga-catalogo-mutual-smep.md deleted file mode 100644 index 34c57e67..00000000 --- a/docs/informe-carga-catalogo-mutual-smep.md +++ /dev/null @@ -1,368 +0,0 @@ -# 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. diff --git a/docs/informe-migracion-catalogo-whatsapp-mutual-smep.md b/docs/informe-migracion-catalogo-whatsapp-mutual-smep.md deleted file mode 100644 index 60326d8f..00000000 --- a/docs/informe-migracion-catalogo-whatsapp-mutual-smep.md +++ /dev/null @@ -1,229 +0,0 @@ -# Informe de migración del catálogo de WhatsApp Business - -## Tienda Mutual SMEP - -**Fecha del informe:** 24 de septiembre de 2026 -**Estado:** catálogo preparado y revisado para su incorporación a la nueva tienda. La publicación definitiva todavía requiere la validación comercial de SMEP. - ---- - -## 1. Objetivo del trabajo - -El objetivo de esta migración fue trasladar el catálogo que Mutual SMEP utilizaba en WhatsApp Business a una tienda en línea propia, conservando la información disponible y reorganizándola para que los clientes puedan encontrar los productos con mayor facilidad. - -Además del traslado de los productos, se preparó la identidad de la tienda, la navegación por categorías, las secciones destacadas y las imágenes principales de la página de inicio. - -## 2. Resumen general - -| Elemento | Resultado de la migración | -|---|---:| -| Publicaciones revisadas del catálogo anterior | 150 | -| Productos que tendrá la nueva tienda | 142 | -| Productos agrupados con opciones | 7 | -| Categorías principales | 6 | -| Subcategorías | 31 | -| Marcas identificadas | 47 | -| Imágenes de productos incorporadas | 511 | -| Secciones de productos destacados | 7 | -| Imágenes principales para la portada | 4 | - -La diferencia entre las **150 publicaciones anteriores** y los **142 productos nuevos** no representa una pérdida de mercadería. Algunas publicaciones de WhatsApp correspondían al mismo producto en distintos colores, medidas o capacidades. En la nueva tienda esas publicaciones se reunieron en una sola ficha, donde el cliente podrá elegir la opción que prefiera. - -## 3. Creación de una tienda propia para Mutual SMEP (tenant) - -Se preparó una tienda exclusiva para Mutual SMEP, separada de las demás tiendas que pueda administrar la plataforma. Esto permite que SMEP tenga su propia imagen, productos, categorías, promociones y datos de contacto. - -La tienda quedó identificada como **Tienda Mutual SMEP** y se configuró con: - -- Los colores azul y celeste utilizados por la institución. -- Logotipo, encabezado, pie de página e ícono propios. -- Domicilio: San Lorenzo 1543, Rosario, Santa Fe. -- Teléfono y contacto de WhatsApp: +54 9 341 247-4530. -- Enlaces a Instagram y Facebook de Mutual SMEP. -- Buscador de productos, acceso a categorías y carrito de compras. -- Información de ayuda y preguntas frecuentes adaptadas a la tienda. - -La dirección utilizada durante la preparación es interna y de prueba. Antes de la publicación deberá definirse o confirmarse la dirección pública que utilizarán los clientes. - -## 4. Nueva organización por categorías - -En WhatsApp Business el catálogo se recorría principalmente como una lista de publicaciones. En la nueva tienda, los productos se organizaron en categorías y subcategorías para facilitar la búsqueda. - -### Dormitorio y Blanco - -- Colchones -- Bases y Sommiers -- Acolchados y Edredones -- Frazadas y Mantas -- Infantil y Cuna - -### Electrodomésticos - -- Heladeras -- Lavarropas y Secarropas -- Cocinas -- Microondas -- Hornos Eléctricos -- Calefones y Termotanques -- Purificadores y Extractores de Cocina -- Preparación de Alimentos -- Café y Desayuno -- Freidoras y Cocción -- Cuidado Personal -- Limpieza y Planchado - -### Climatización - -- Aires Acondicionados -- Calefactores a Gas con Salida -- Calefactores a Gas sin Salida -- Calefacción Eléctrica - -### Tecnología - -- Celulares -- Notebooks -- Smart TV -- Audio -- Accesorios de Computación -- Soportes para TV - -### Bicicletas y Aire Libre - -- Bicicletas Infantiles -- Bicicletas para Adultos -- Piletas - -### Bazar - -- Termos - -Esta estructura se armó a partir de los productos reales del catálogo. También se corrigieron ubicaciones poco claras del catálogo anterior; por ejemplo, un soporte para TV que figuraba junto a colchones fue colocado en **Tecnología > Soportes para TV**. - -## 5. Conversión de los productos - -Cada publicación del catálogo anterior fue revisada para definir cómo debía mostrarse en la nueva tienda. - -### Productos simples - -Los artículos que tienen una sola presentación se convirtieron en una ficha individual. En ella se muestran el nombre, el precio, la marca, las imágenes disponibles y la categoría correspondiente. - -### Productos con distintas opciones - -Cuando varias publicaciones representaban el mismo artículo con una diferencia de medida, capacidad o presentación, se reunieron en una única ficha. De esta forma, el cliente no verá productos repetidos y podrá elegir la opción antes de agregar el artículo al carrito. - -Los siete productos agrupados de esta manera son: - -- Acolchado Kavanagh Símil Plumón Reversible: 3 opciones. -- Acolchado Sense Dúo Bitono con Corderito: 2 opciones. -- Colchón Inducol Constanza: 2 opciones. -- Edredón Lisboa Jean Cartier: 2 opciones. -- Frazada Kavanagh Premium Soft: 2 opciones. -- Kit Edredón Alaska con Corderito: 2 opciones. -- Motorola G15: 2 opciones. - -Para facilitar futuras incorporaciones, también quedaron preparadas opciones habituales del rubro, como color, medida, almacenamiento, memoria y rodado. Estas opciones solamente se mostrarán cuando el cliente tenga una elección real para realizar. - -### Información conservada - -- Se mantuvieron los precios informados en el catálogo de origen. -- Se utilizaron las marcas que pudieron identificarse con seguridad. -- No se inventaron códigos, códigos de barras ni costos internos. -- Las fotografías disponibles se asociaron con el producto correspondiente. - -### Imágenes optimizadas - -Se incorporaron **511 imágenes de productos**. Fueron optimizadas para reducir su peso aproximado de 30 MB a 9,2 MB, sin modificar el contenido de las fotografías. Esto ayuda a que la tienda cargue más rápido y consuma menos datos móviles. - -### Existencias iniciales - -Para poder visualizar y probar todos los artículos, se asignaron provisoriamente **10 unidades por producto u opción**, equivalentes a 1.500 unidades en total. - -Esta cifra es solamente demostrativa y **no representa el inventario real de Mutual SMEP**. Antes de habilitar las ventas debe reemplazarse por las existencias verdaderas o definirse otra forma de administrar la disponibilidad. - -## 6. Presentación de la página de inicio - -La nueva portada se organizó en dos tipos de contenido: imágenes institucionales de gran tamaño y filas de productos destacados. - -### Carrusel principal de imágenes (carousel) - -Se prepararon cuatro imágenes panorámicas que se alternan en la parte superior de la tienda: - -1. **Tecnología:** televisores, celulares y audio. -2. **Hogar:** heladeras, cafeteras y electrodomésticos. -3. **Vida activa:** bicicletas y actividades al aire libre. -4. **Descanso:** colchones, camas y ropa de cama. - -Todas respetan una línea visual azul y amarilla vinculada con la identidad de SMEP. También cuentan con espacio para colocar títulos, promociones o botones cuando se definan los mensajes comerciales. - -### Secciones de productos destacados (featured groups) - -La primera de estas secciones es una fila visual de **13 productos destacados**, pensada como el carrusel circular que verá el cliente en la portada. - -Incluye primero los siete productos que permiten elegir variantes y, a continuación, una selección representativa del catálogo: - -- Smart TV Noblex de 50 pulgadas. -- Heladera Gafa de 330 litros. -- Cafetera express Atma. -- Aire acondicionado split TCL de 3300 W. -- Bicicleta Venzo Loki rodado 29. -- Termo Stanley de 1 litro. - -La intención es mostrar variedad y permitir que el cliente descubra rápidamente productos importantes de distintas áreas de la tienda. - -### Secciones por categoría principal - -También se crearon seis filas adicionales, una por cada categoría principal: - -| Sección | Productos incluidos | -|---|---:| -| Dormitorio y Blanco | 6 | -| Electrodomésticos | 6 | -| Climatización | 6 | -| Tecnología | 6 | -| Bicicletas y Aire Libre | 6 | -| Bazar | 3 | - -Estas filas funcionan como una vidriera breve: muestran una selección de cada rubro sin sobrecargar la portada. Los **142 productos** continúan disponibles mediante las categorías, subcategorías y el buscador. Algunos artículos también se repiten en “Productos destacados” de manera intencional. - -## 7. Principales mejoras para los clientes - -Con esta migración, el cliente pasará de recorrer una lista de WhatsApp a contar con una tienda donde podrá: - -- Buscar un producto por su nombre. -- Navegar por rubro y subcategoría. -- Comparar opciones dentro de una misma ficha. -- Consultar varias imágenes antes de decidir. -- Identificar productos destacados desde la portada. -- Agregar artículos al carrito y modificar cantidades. -- Acceder fácilmente a los canales de contacto de SMEP. - -Para los responsables del comercio, la nueva organización facilita la incorporación de productos, el cambio de precios, el control futuro de existencias y la selección de promociones para la portada. - -## 8. Puntos que SMEP debería revisar antes de publicar - -El catálogo está preparado, pero se recomienda que los responsables comerciales confirmen los siguientes puntos: - -1. **Precios:** validar que los importes del catálogo anterior continúen vigentes. -2. **Existencias:** reemplazar las 10 unidades demostrativas por cantidades reales o definir la política de disponibilidad. -3. **Descripciones:** 104 productos no contaban con una descripción suficiente en el material de origen. Conviene completarlas gradualmente con medidas, funciones, garantía y condiciones de entrega. -4. **Marca pendiente:** existe un artículo cuya marca no pudo determinarse con seguridad y requiere revisión. -5. **Opciones de productos:** confirmar las medidas, capacidades y demás variantes agrupadas. -6. **Orden de los destacados:** revisar si los 13 artículos elegidos son los que SMEP desea impulsar comercialmente. -7. **Mensajes de portada:** definir los textos, promociones y llamados a la acción que acompañarán las cuatro imágenes principales. -8. **Dirección pública de la tienda:** confirmar el nombre o dominio que utilizarán los clientes. -9. **Venta y entrega:** acordar medios de pago, retiro, envío y condiciones comerciales antes del lanzamiento. - -## 9. Estado y seguridad de la migración - -La preparación fue realizada de forma ordenada y reversible. Se verificó que puedan incorporarse y retirarse tanto el catálogo como las secciones de portada sin alterar el funcionamiento general de la tienda. - -También se realizaron pruebas sobre la carga de productos, imágenes, categorías, opciones, existencias y contenidos destacados. El resultado de esas verificaciones fue satisfactorio. - -Hasta el momento, el trabajo quedó **preparado para ser aplicado**, pero no se publicó como tienda definitiva ni se reemplazó el inventario real del comercio. - -## 10. Conclusión - -La migración convierte el catálogo de WhatsApp Business en una tienda organizada, navegable y preparada para crecer. Se conservaron los productos, precios e imágenes disponibles, y se mejoró su presentación mediante categorías, opciones agrupadas, secciones destacadas y una portada visual propia de Mutual SMEP. - -El paso siguiente recomendado es una revisión comercial breve por parte de los responsables de SMEP, especialmente sobre precios, existencias, descripciones y promociones. Una vez confirmados esos puntos, el catálogo estará en condiciones de avanzar hacia su publicación. diff --git a/public/images/tennants/mutual_smep/carousel/01-tecnologia.webp b/public/images/tennants/mutual_smep/carousel/01-tecnologia.webp deleted file mode 100644 index 8759d6d2..00000000 Binary files a/public/images/tennants/mutual_smep/carousel/01-tecnologia.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/carousel/02-hogar.webp b/public/images/tennants/mutual_smep/carousel/02-hogar.webp deleted file mode 100644 index 9b6efe26..00000000 Binary files a/public/images/tennants/mutual_smep/carousel/02-hogar.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/carousel/03-vida-activa.webp b/public/images/tennants/mutual_smep/carousel/03-vida-activa.webp deleted file mode 100644 index e7400be3..00000000 Binary files a/public/images/tennants/mutual_smep/carousel/03-vida-activa.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/carousel/04-descanso.webp b/public/images/tennants/mutual_smep/carousel/04-descanso.webp deleted file mode 100644 index 831b8da3..00000000 Binary files a/public/images/tennants/mutual_smep/carousel/04-descanso.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/acolchado-1-1-2-pl-dobby-kavanagh-negro-01.webp b/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/acolchado-1-1-2-pl-dobby-kavanagh-negro-01.webp deleted file mode 100644 index 8c1611af..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/acolchado-1-1-2-pl-dobby-kavanagh-negro-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/acolchado-1-1-2-pl-kavanagh-simil-plumon-reversible-01.webp b/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/acolchado-1-1-2-pl-kavanagh-simil-plumon-reversible-01.webp deleted file mode 100644 index b23df65b..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/acolchado-1-1-2-pl-kavanagh-simil-plumon-reversible-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/acolchado-1-1-2-pl-sense-duo-bitono-con-corderito-jc-01.webp b/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/acolchado-1-1-2-pl-sense-duo-bitono-con-corderito-jc-01.webp deleted file mode 100644 index 5df81e38..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/acolchado-1-1-2-pl-sense-duo-bitono-con-corderito-jc-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/acolchado-1-1-2-pl-sense-duo-bitono-con-corderito-jc-02.webp b/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/acolchado-1-1-2-pl-sense-duo-bitono-con-corderito-jc-02.webp deleted file mode 100644 index e0f08b45..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/acolchado-1-1-2-pl-sense-duo-bitono-con-corderito-jc-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/acolchado-1-1-2-pl-sense-duo-bitono-con-corderito-jc-03.webp b/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/acolchado-1-1-2-pl-sense-duo-bitono-con-corderito-jc-03.webp deleted file mode 100644 index fd7e4188..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/acolchado-1-1-2-pl-sense-duo-bitono-con-corderito-jc-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/acolchado-king-kavanagh-simil-plumon-con-2-fundas-almohadon-01.webp b/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/acolchado-king-kavanagh-simil-plumon-con-2-fundas-almohadon-01.webp deleted file mode 100644 index 1f21774b..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/acolchado-king-kavanagh-simil-plumon-con-2-fundas-almohadon-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/acolchado-king-kavanagh-simil-plumon-reversible-01.webp b/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/acolchado-king-kavanagh-simil-plumon-reversible-01.webp deleted file mode 100644 index 0a4ad3c2..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/acolchado-king-kavanagh-simil-plumon-reversible-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/acolchado-king-sense-duo-bitono-con-corderito-jc-01.webp b/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/acolchado-king-sense-duo-bitono-con-corderito-jc-01.webp deleted file mode 100644 index e0f08b45..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/acolchado-king-sense-duo-bitono-con-corderito-jc-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/acolchado-king-sense-duo-bitono-con-corderito-jc-02.webp b/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/acolchado-king-sense-duo-bitono-con-corderito-jc-02.webp deleted file mode 100644 index fd7e4188..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/acolchado-king-sense-duo-bitono-con-corderito-jc-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/acolchado-king-sense-duo-bitono-con-corderito-jc-03.webp b/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/acolchado-king-sense-duo-bitono-con-corderito-jc-03.webp deleted file mode 100644 index 5df81e38..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/acolchado-king-sense-duo-bitono-con-corderito-jc-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/acolchado-queen-hotel-oxford-platinum-700-h-jc-01.webp b/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/acolchado-queen-hotel-oxford-platinum-700-h-jc-01.webp deleted file mode 100644 index 1ec394da..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/acolchado-queen-hotel-oxford-platinum-700-h-jc-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/acolchado-queen-hotel-oxford-platinum-700-h-jc-02.webp b/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/acolchado-queen-hotel-oxford-platinum-700-h-jc-02.webp deleted file mode 100644 index 1ca466a0..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/acolchado-queen-hotel-oxford-platinum-700-h-jc-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/acolchado-queen-simil-plumon-reversible-kavanagh-01.webp b/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/acolchado-queen-simil-plumon-reversible-kavanagh-01.webp deleted file mode 100644 index f6982ab2..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/acolchado-queen-simil-plumon-reversible-kavanagh-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/acolchado-queen-simil-plumon-reversible-kavanagh-02.webp b/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/acolchado-queen-simil-plumon-reversible-kavanagh-02.webp deleted file mode 100644 index 44c6485c..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/acolchado-queen-simil-plumon-reversible-kavanagh-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/edredon-1-1-2-pl-lisboa-jc-01.webp b/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/edredon-1-1-2-pl-lisboa-jc-01.webp deleted file mode 100644 index d784b579..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/edredon-1-1-2-pl-lisboa-jc-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/edredon-1-1-2-pl-londres-jc-01.webp b/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/edredon-1-1-2-pl-londres-jc-01.webp deleted file mode 100644 index 441de3b4..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/edredon-1-1-2-pl-londres-jc-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/edredon-1-1-2-pl-londres-jc-02.webp b/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/edredon-1-1-2-pl-londres-jc-02.webp deleted file mode 100644 index 37829823..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/edredon-1-1-2-pl-londres-jc-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/edredon-2-1-2-pl-lisboa-jc-01.webp b/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/edredon-2-1-2-pl-lisboa-jc-01.webp deleted file mode 100644 index d784b579..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/edredon-2-1-2-pl-lisboa-jc-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/edredon-2-1-2-pl-lisboa-jc-02.webp b/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/edredon-2-1-2-pl-lisboa-jc-02.webp deleted file mode 100644 index ff02996f..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/edredon-2-1-2-pl-lisboa-jc-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/frazada-2-1-2-pl-sherpa-doble-corderito-y-polar-jc-01.webp b/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/frazada-2-1-2-pl-sherpa-doble-corderito-y-polar-jc-01.webp deleted file mode 100644 index d3d868fb..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/frazada-2-1-2-pl-sherpa-doble-corderito-y-polar-jc-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/frazada-polar-1-1-2-pl-kavanagh-premium-soft-01.webp b/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/frazada-polar-1-1-2-pl-kavanagh-premium-soft-01.webp deleted file mode 100644 index 6c8c40c8..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/frazada-polar-1-1-2-pl-kavanagh-premium-soft-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/frazada-polar-king-kavanagh-premium-soft-01.webp b/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/frazada-polar-king-kavanagh-premium-soft-01.webp deleted file mode 100644 index 6c8c40c8..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/frazada-polar-king-kavanagh-premium-soft-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/kit-acolchado-queen-zurich-2-fundas-almohadon-jc-01.webp b/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/kit-acolchado-queen-zurich-2-fundas-almohadon-jc-01.webp deleted file mode 100644 index a8362f08..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/kit-acolchado-queen-zurich-2-fundas-almohadon-jc-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/kit-acolchado-queen-zurich-2-fundas-almohadon-jc-02.webp b/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/kit-acolchado-queen-zurich-2-fundas-almohadon-jc-02.webp deleted file mode 100644 index 840cd12c..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/kit-acolchado-queen-zurich-2-fundas-almohadon-jc-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/kit-edredon-2-1-2-pl-alaska-c-corderito-jc-2-fundas-almohadones-01.webp b/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/kit-edredon-2-1-2-pl-alaska-c-corderito-jc-2-fundas-almohadones-01.webp deleted file mode 100644 index 6d00e357..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/kit-edredon-2-1-2-pl-alaska-c-corderito-jc-2-fundas-almohadones-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/kit-edredon-2-1-2-pl-alaska-c-corderito-jc-2-fundas-almohadones-02.webp b/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/kit-edredon-2-1-2-pl-alaska-c-corderito-jc-2-fundas-almohadones-02.webp deleted file mode 100644 index 9225a130..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/kit-edredon-2-1-2-pl-alaska-c-corderito-jc-2-fundas-almohadones-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/kit-edredon-2-1-2-pl-alaska-c-corderito-jc-2-fundas-almohadones-03.webp b/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/kit-edredon-2-1-2-pl-alaska-c-corderito-jc-2-fundas-almohadones-03.webp deleted file mode 100644 index 24aed11c..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/kit-edredon-2-1-2-pl-alaska-c-corderito-jc-2-fundas-almohadones-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/kit-edredon-king-alaska-c-corderito-2-fundas-almohadones-01.webp b/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/kit-edredon-king-alaska-c-corderito-2-fundas-almohadones-01.webp deleted file mode 100644 index 6508c5fe..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/kit-edredon-king-alaska-c-corderito-2-fundas-almohadones-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/manta-simil-piel-de-conejo-con-reverso-aterciopelado-jean-cartier-01.webp b/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/manta-simil-piel-de-conejo-con-reverso-aterciopelado-jean-cartier-01.webp deleted file mode 100644 index f93a8a08..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/acolchados-frazadas-y-edredon/manta-simil-piel-de-conejo-con-reverso-aterciopelado-jean-cartier-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/acolchados-y-sabanas-infantil/set-cuna-de-6-piezas-acolchado-sabanas-arcoiris-multicolor-jc-01.webp b/public/images/tennants/mutual_smep/catalog/acolchados-y-sabanas-infantil/set-cuna-de-6-piezas-acolchado-sabanas-arcoiris-multicolor-jc-01.webp deleted file mode 100644 index 15044f1d..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/acolchados-y-sabanas-infantil/set-cuna-de-6-piezas-acolchado-sabanas-arcoiris-multicolor-jc-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/aires-acondicionados/split-3300-w-tcl-taca-3300fcsa-frio-calor-01.webp b/public/images/tennants/mutual_smep/catalog/aires-acondicionados/split-3300-w-tcl-taca-3300fcsa-frio-calor-01.webp deleted file mode 100644 index 65dae964..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/aires-acondicionados/split-3300-w-tcl-taca-3300fcsa-frio-calor-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/aires-acondicionados/split-3300-w-tcl-taca-3300fcsa-frio-calor-02.webp b/public/images/tennants/mutual_smep/catalog/aires-acondicionados/split-3300-w-tcl-taca-3300fcsa-frio-calor-02.webp deleted file mode 100644 index 35468467..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/aires-acondicionados/split-3300-w-tcl-taca-3300fcsa-frio-calor-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/aires-acondicionados/split-bgh-5200-w-bsh-52wcu-frio-calor-silent-air-4300-frigorias-01.webp b/public/images/tennants/mutual_smep/catalog/aires-acondicionados/split-bgh-5200-w-bsh-52wcu-frio-calor-silent-air-4300-frigorias-01.webp deleted file mode 100644 index 2596527a..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/aires-acondicionados/split-bgh-5200-w-bsh-52wcu-frio-calor-silent-air-4300-frigorias-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/aires-acondicionados/split-bgh-5200-w-bsh-52wcu-frio-calor-silent-air-4300-frigorias-02.webp b/public/images/tennants/mutual_smep/catalog/aires-acondicionados/split-bgh-5200-w-bsh-52wcu-frio-calor-silent-air-4300-frigorias-02.webp deleted file mode 100644 index ff81c506..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/aires-acondicionados/split-bgh-5200-w-bsh-52wcu-frio-calor-silent-air-4300-frigorias-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/aires-acondicionados/split-bgh-5200-w-bsh-52wcu-frio-calor-silent-air-4300-frigorias-03.webp b/public/images/tennants/mutual_smep/catalog/aires-acondicionados/split-bgh-5200-w-bsh-52wcu-frio-calor-silent-air-4300-frigorias-03.webp deleted file mode 100644 index d8f1f565..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/aires-acondicionados/split-bgh-5200-w-bsh-52wcu-frio-calor-silent-air-4300-frigorias-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/aires-acondicionados/split-bgh-5200-w-bsh-52wcu-frio-calor-silent-air-4300-frigorias-04.webp b/public/images/tennants/mutual_smep/catalog/aires-acondicionados/split-bgh-5200-w-bsh-52wcu-frio-calor-silent-air-4300-frigorias-04.webp deleted file mode 100644 index 392b661b..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/aires-acondicionados/split-bgh-5200-w-bsh-52wcu-frio-calor-silent-air-4300-frigorias-04.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/base-sommier-1-pl-0-80x1-90/sommier-inducol-0-80x1-90-01.webp b/public/images/tennants/mutual_smep/catalog/base-sommier-1-pl-0-80x1-90/sommier-inducol-0-80x1-90-01.webp deleted file mode 100644 index 2a622b8f..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/base-sommier-1-pl-0-80x1-90/sommier-inducol-0-80x1-90-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/base-sommier-1-pl-0-80x1-90/sommier-inducol-0-80x1-90-02.webp b/public/images/tennants/mutual_smep/catalog/base-sommier-1-pl-0-80x1-90/sommier-inducol-0-80x1-90-02.webp deleted file mode 100644 index b2fd19ad..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/base-sommier-1-pl-0-80x1-90/sommier-inducol-0-80x1-90-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/base-sommier-1-pl-0-80x1-90/sommier-piero-paraiso-0-90x1-90x0-20-01.webp b/public/images/tennants/mutual_smep/catalog/base-sommier-1-pl-0-80x1-90/sommier-piero-paraiso-0-90x1-90x0-20-01.webp deleted file mode 100644 index 791f542c..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/base-sommier-1-pl-0-80x1-90/sommier-piero-paraiso-0-90x1-90x0-20-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/base-sommier-1-pl-0-80x1-90/sommier-piero-paraiso-0-90x1-90x0-20-02.webp b/public/images/tennants/mutual_smep/catalog/base-sommier-1-pl-0-80x1-90/sommier-piero-paraiso-0-90x1-90x0-20-02.webp deleted file mode 100644 index bd73a5f8..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/base-sommier-1-pl-0-80x1-90/sommier-piero-paraiso-0-90x1-90x0-20-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/base-sommier-2-pl-1-40x1-90/sommier-king-koil-elite-contour-140x190-01.webp b/public/images/tennants/mutual_smep/catalog/base-sommier-2-pl-1-40x1-90/sommier-king-koil-elite-contour-140x190-01.webp deleted file mode 100644 index cc08f185..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/base-sommier-2-pl-1-40x1-90/sommier-king-koil-elite-contour-140x190-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/base-sommier-2-pl-1-40x1-90/sommier-king-koil-elite-contour-140x190-02.webp b/public/images/tennants/mutual_smep/catalog/base-sommier-2-pl-1-40x1-90/sommier-king-koil-elite-contour-140x190-02.webp deleted file mode 100644 index bb4a9cbf..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/base-sommier-2-pl-1-40x1-90/sommier-king-koil-elite-contour-140x190-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/base-sommier-2-pl-1-40x1-90/sommier-king-koil-elite-contour-140x190-03.webp b/public/images/tennants/mutual_smep/catalog/base-sommier-2-pl-1-40x1-90/sommier-king-koil-elite-contour-140x190-03.webp deleted file mode 100644 index 47a0391b..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/base-sommier-2-pl-1-40x1-90/sommier-king-koil-elite-contour-140x190-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/base-sommier-2-pl-1-40x1-90/sommier-piero-legrand-140x190x020-01.webp b/public/images/tennants/mutual_smep/catalog/base-sommier-2-pl-1-40x1-90/sommier-piero-legrand-140x190x020-01.webp deleted file mode 100644 index 62087d0b..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/base-sommier-2-pl-1-40x1-90/sommier-piero-legrand-140x190x020-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/base-sommier-2-pl-1-40x1-90/sommier-piero-legrand-140x190x020-02.webp b/public/images/tennants/mutual_smep/catalog/base-sommier-2-pl-1-40x1-90/sommier-piero-legrand-140x190x020-02.webp deleted file mode 100644 index a5374969..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/base-sommier-2-pl-1-40x1-90/sommier-piero-legrand-140x190x020-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/bazar/termo-stanley-1-l-adventure-go-to-con-tapon-01.webp b/public/images/tennants/mutual_smep/catalog/bazar/termo-stanley-1-l-adventure-go-to-con-tapon-01.webp deleted file mode 100644 index 2c5df450..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/bazar/termo-stanley-1-l-adventure-go-to-con-tapon-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/bazar/termo-stanley-1-l-adventure-go-to-con-tapon-02.webp b/public/images/tennants/mutual_smep/catalog/bazar/termo-stanley-1-l-adventure-go-to-con-tapon-02.webp deleted file mode 100644 index 0b17f5e0..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/bazar/termo-stanley-1-l-adventure-go-to-con-tapon-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/bazar/termo-stanley-1-l-adventure-go-to-con-tapon-03.webp b/public/images/tennants/mutual_smep/catalog/bazar/termo-stanley-1-l-adventure-go-to-con-tapon-03.webp deleted file mode 100644 index e767533b..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/bazar/termo-stanley-1-l-adventure-go-to-con-tapon-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/bazar/termo-stanley-1-l-adventure-go-to-con-tapon-04.webp b/public/images/tennants/mutual_smep/catalog/bazar/termo-stanley-1-l-adventure-go-to-con-tapon-04.webp deleted file mode 100644 index 992b5d88..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/bazar/termo-stanley-1-l-adventure-go-to-con-tapon-04.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/bazar/termo-stanley-1-l-adventure-go-to-con-tapon-05.webp b/public/images/tennants/mutual_smep/catalog/bazar/termo-stanley-1-l-adventure-go-to-con-tapon-05.webp deleted file mode 100644 index 44f0502c..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/bazar/termo-stanley-1-l-adventure-go-to-con-tapon-05.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/bazar/termo-stanley-800-ml-mate-system-classic-01.webp b/public/images/tennants/mutual_smep/catalog/bazar/termo-stanley-800-ml-mate-system-classic-01.webp deleted file mode 100644 index 3937e956..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/bazar/termo-stanley-800-ml-mate-system-classic-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/bazar/termo-stanley-800-ml-mate-system-classic-02.webp b/public/images/tennants/mutual_smep/catalog/bazar/termo-stanley-800-ml-mate-system-classic-02.webp deleted file mode 100644 index 45d8e5f7..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/bazar/termo-stanley-800-ml-mate-system-classic-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/bazar/termo-stanley-800-ml-mate-system-classic-03.webp b/public/images/tennants/mutual_smep/catalog/bazar/termo-stanley-800-ml-mate-system-classic-03.webp deleted file mode 100644 index d7c0502e..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/bazar/termo-stanley-800-ml-mate-system-classic-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/bazar/termo-stanley-800-ml-mate-system-classic-04.webp b/public/images/tennants/mutual_smep/catalog/bazar/termo-stanley-800-ml-mate-system-classic-04.webp deleted file mode 100644 index f99f5830..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/bazar/termo-stanley-800-ml-mate-system-classic-04.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/bazar/termo-stanley-950-ml-clasico-con-manija-01.webp b/public/images/tennants/mutual_smep/catalog/bazar/termo-stanley-950-ml-clasico-con-manija-01.webp deleted file mode 100644 index 9c21e90b..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/bazar/termo-stanley-950-ml-clasico-con-manija-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/bazar/termo-stanley-950-ml-clasico-con-manija-02.webp b/public/images/tennants/mutual_smep/catalog/bazar/termo-stanley-950-ml-clasico-con-manija-02.webp deleted file mode 100644 index 08b58691..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/bazar/termo-stanley-950-ml-clasico-con-manija-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/bicicletas/bici-stark-r16-flowers-pink-nena-c-acc-6095-01.webp b/public/images/tennants/mutual_smep/catalog/bicicletas/bici-stark-r16-flowers-pink-nena-c-acc-6095-01.webp deleted file mode 100644 index 1454df7d..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/bicicletas/bici-stark-r16-flowers-pink-nena-c-acc-6095-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/bicicletas/bici-stark-r16-team-junior-nene-6064-01.webp b/public/images/tennants/mutual_smep/catalog/bicicletas/bici-stark-r16-team-junior-nene-6064-01.webp deleted file mode 100644 index 3f78dbe5..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/bicicletas/bici-stark-r16-team-junior-nene-6064-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/bicicletas/bici-stark-r16-team-junior-nene-6064-02.webp b/public/images/tennants/mutual_smep/catalog/bicicletas/bici-stark-r16-team-junior-nene-6064-02.webp deleted file mode 100644 index eb7b9b9e..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/bicicletas/bici-stark-r16-team-junior-nene-6064-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/bicicletas/bicicleta-fire-bird-r29-frenio-disco-01.webp b/public/images/tennants/mutual_smep/catalog/bicicletas/bicicleta-fire-bird-r29-frenio-disco-01.webp deleted file mode 100644 index 1279434c..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/bicicletas/bicicleta-fire-bird-r29-frenio-disco-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/bicicletas/bicicleta-playera-ross-full-r26-01.webp b/public/images/tennants/mutual_smep/catalog/bicicletas/bicicleta-playera-ross-full-r26-01.webp deleted file mode 100644 index 8a3db04d..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/bicicletas/bicicleta-playera-ross-full-r26-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/bicicletas/bicicleta-venzo-loki-r29-fd-21-v-shimano-01.webp b/public/images/tennants/mutual_smep/catalog/bicicletas/bicicleta-venzo-loki-r29-fd-21-v-shimano-01.webp deleted file mode 100644 index d630cb29..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/bicicletas/bicicleta-venzo-loki-r29-fd-21-v-shimano-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/eskabe-3000-cal-s21-tiro-balanceado-sin-termostato-01.webp b/public/images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/eskabe-3000-cal-s21-tiro-balanceado-sin-termostato-01.webp deleted file mode 100644 index c9c77761..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/eskabe-3000-cal-s21-tiro-balanceado-sin-termostato-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/eskabe-3000-cal-s21-tiro-balanceado-sin-termostato-02.webp b/public/images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/eskabe-3000-cal-s21-tiro-balanceado-sin-termostato-02.webp deleted file mode 100644 index f00a4960..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/eskabe-3000-cal-s21-tiro-balanceado-sin-termostato-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/eskabe-3000-cal-s21-tiro-balanceado-sin-termostato-03.webp b/public/images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/eskabe-3000-cal-s21-tiro-balanceado-sin-termostato-03.webp deleted file mode 100644 index 3977d74e..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/eskabe-3000-cal-s21-tiro-balanceado-sin-termostato-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/eskabe-3000-cal-tiro-balanceado-con-termostato-01.webp b/public/images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/eskabe-3000-cal-tiro-balanceado-con-termostato-01.webp deleted file mode 100644 index f8556916..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/eskabe-3000-cal-tiro-balanceado-con-termostato-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/eskabe-3000-cal-tiro-balanceado-con-termostato-02.webp b/public/images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/eskabe-3000-cal-tiro-balanceado-con-termostato-02.webp deleted file mode 100644 index 6a6a1871..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/eskabe-3000-cal-tiro-balanceado-con-termostato-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/eskabe-tt-2000-cal-tiro-balanceado-con-termostato-01.webp b/public/images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/eskabe-tt-2000-cal-tiro-balanceado-con-termostato-01.webp deleted file mode 100644 index dabe6b94..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/eskabe-tt-2000-cal-tiro-balanceado-con-termostato-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/eskabe-tt-2000-cal-tiro-balanceado-con-termostato-02.webp b/public/images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/eskabe-tt-2000-cal-tiro-balanceado-con-termostato-02.webp deleted file mode 100644 index b4c7bb2a..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/eskabe-tt-2000-cal-tiro-balanceado-con-termostato-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/eskabe-tt-2000-cal-tiro-balanceado-con-termostato-03.webp b/public/images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/eskabe-tt-2000-cal-tiro-balanceado-con-termostato-03.webp deleted file mode 100644 index b06bbef8..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/eskabe-tt-2000-cal-tiro-balanceado-con-termostato-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/eskabe-tt-2000-cal-tiro-balanceado-con-termostato-04.webp b/public/images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/eskabe-tt-2000-cal-tiro-balanceado-con-termostato-04.webp deleted file mode 100644 index 6bf6203c..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/eskabe-tt-2000-cal-tiro-balanceado-con-termostato-04.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/eskabe-tt-2000-cal-tiro-balanceado-con-termostato-05.webp b/public/images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/eskabe-tt-2000-cal-tiro-balanceado-con-termostato-05.webp deleted file mode 100644 index c0923578..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/eskabe-tt-2000-cal-tiro-balanceado-con-termostato-05.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/eskabe-tt-3000-cal-tiro-balanceado-con-termostato-01.webp b/public/images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/eskabe-tt-3000-cal-tiro-balanceado-con-termostato-01.webp deleted file mode 100644 index fa22d9e4..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/eskabe-tt-3000-cal-tiro-balanceado-con-termostato-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/eskabe-tt-3000-cal-tiro-balanceado-con-termostato-02.webp b/public/images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/eskabe-tt-3000-cal-tiro-balanceado-con-termostato-02.webp deleted file mode 100644 index 7da56ad5..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/eskabe-tt-3000-cal-tiro-balanceado-con-termostato-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/eskabe-tt-3000-cal-tiro-balanceado-con-termostato-03.webp b/public/images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/eskabe-tt-3000-cal-tiro-balanceado-con-termostato-03.webp deleted file mode 100644 index 33a2cb85..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/eskabe-tt-3000-cal-tiro-balanceado-con-termostato-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/longvie-eba2s-2000-cal-tiro-balanceado-01.webp b/public/images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/longvie-eba2s-2000-cal-tiro-balanceado-01.webp deleted file mode 100644 index 8208af4c..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/longvie-eba2s-2000-cal-tiro-balanceado-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/longvie-eba2s-2000-cal-tiro-balanceado-02.webp b/public/images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/longvie-eba2s-2000-cal-tiro-balanceado-02.webp deleted file mode 100644 index 0d15ef15..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/longvie-eba2s-2000-cal-tiro-balanceado-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/longvie-eba2s-2000-cal-tiro-balanceado-03.webp b/public/images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/longvie-eba2s-2000-cal-tiro-balanceado-03.webp deleted file mode 100644 index 927077d2..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/longvie-eba2s-2000-cal-tiro-balanceado-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/longvie-eba3s-3000-cal-tiro-balanceado-01.webp b/public/images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/longvie-eba3s-3000-cal-tiro-balanceado-01.webp deleted file mode 100644 index 622668bc..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/longvie-eba3s-3000-cal-tiro-balanceado-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/longvie-eba3s-3000-cal-tiro-balanceado-02.webp b/public/images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/longvie-eba3s-3000-cal-tiro-balanceado-02.webp deleted file mode 100644 index 6c47069d..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/longvie-eba3s-3000-cal-tiro-balanceado-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/longvie-eba3s-3000-cal-tiro-balanceado-03.webp b/public/images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/longvie-eba3s-3000-cal-tiro-balanceado-03.webp deleted file mode 100644 index 0d15ef15..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/longvie-eba3s-3000-cal-tiro-balanceado-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/longvie-eba3s-3000-cal-tiro-balanceado-04.webp b/public/images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/longvie-eba3s-3000-cal-tiro-balanceado-04.webp deleted file mode 100644 index 927077d2..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/calefaccion-con-salida-al-ext/longvie-eba3s-3000-cal-tiro-balanceado-04.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/calefaccion-electrica/calefactor-de-vidrio-whitenblack-pvwb-01-pie-pared-01.webp b/public/images/tennants/mutual_smep/catalog/calefaccion-electrica/calefactor-de-vidrio-whitenblack-pvwb-01-pie-pared-01.webp deleted file mode 100644 index 965b7190..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/calefaccion-electrica/calefactor-de-vidrio-whitenblack-pvwb-01-pie-pared-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/calefaccion-electrica/calefactor-de-vidrio-whitenblack-pvwb-01-pie-pared-02.webp b/public/images/tennants/mutual_smep/catalog/calefaccion-electrica/calefactor-de-vidrio-whitenblack-pvwb-01-pie-pared-02.webp deleted file mode 100644 index a3378cca..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/calefaccion-electrica/calefactor-de-vidrio-whitenblack-pvwb-01-pie-pared-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/calefaccion-electrica/calefactor-infrarrojo-liliana-calore-ci-080-fijo-1400-w-01.webp b/public/images/tennants/mutual_smep/catalog/calefaccion-electrica/calefactor-infrarrojo-liliana-calore-ci-080-fijo-1400-w-01.webp deleted file mode 100644 index e64f0e7d..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/calefaccion-electrica/calefactor-infrarrojo-liliana-calore-ci-080-fijo-1400-w-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/calefaccion-electrica/calefactor-infrarrojo-liliana-calore-ci-080-fijo-1400-w-02.webp b/public/images/tennants/mutual_smep/catalog/calefaccion-electrica/calefactor-infrarrojo-liliana-calore-ci-080-fijo-1400-w-02.webp deleted file mode 100644 index 6f6c5393..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/calefaccion-electrica/calefactor-infrarrojo-liliana-calore-ci-080-fijo-1400-w-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/calefaccion-electrica/calefactor-infrarrojo-liliana-calore-ci-080-fijo-1400-w-03.webp b/public/images/tennants/mutual_smep/catalog/calefaccion-electrica/calefactor-infrarrojo-liliana-calore-ci-080-fijo-1400-w-03.webp deleted file mode 100644 index b3d82824..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/calefaccion-electrica/calefactor-infrarrojo-liliana-calore-ci-080-fijo-1400-w-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/calefaccion-electrica/caloventor-liliana-cfh417-hotwind-2000-w-01.webp b/public/images/tennants/mutual_smep/catalog/calefaccion-electrica/caloventor-liliana-cfh417-hotwind-2000-w-01.webp deleted file mode 100644 index ae7f7876..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/calefaccion-electrica/caloventor-liliana-cfh417-hotwind-2000-w-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/calefaccion-electrica/caloventor-liliana-cfh417-hotwind-2000-w-02.webp b/public/images/tennants/mutual_smep/catalog/calefaccion-electrica/caloventor-liliana-cfh417-hotwind-2000-w-02.webp deleted file mode 100644 index 4869226d..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/calefaccion-electrica/caloventor-liliana-cfh417-hotwind-2000-w-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/calefaccion-electrica/caloventor-liliana-cfh417-hotwind-2000-w-03.webp b/public/images/tennants/mutual_smep/catalog/calefaccion-electrica/caloventor-liliana-cfh417-hotwind-2000-w-03.webp deleted file mode 100644 index 5239a168..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/calefaccion-electrica/caloventor-liliana-cfh417-hotwind-2000-w-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/calefaccion-electrica/caloventor-liliana-cfh417-hotwind-2000-w-04.webp b/public/images/tennants/mutual_smep/catalog/calefaccion-electrica/caloventor-liliana-cfh417-hotwind-2000-w-04.webp deleted file mode 100644 index 91e7e621..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/calefaccion-electrica/caloventor-liliana-cfh417-hotwind-2000-w-04.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/calefaccion-electrica/caloventor-liliana-cfh417-hotwind-2000-w-05.webp b/public/images/tennants/mutual_smep/catalog/calefaccion-electrica/caloventor-liliana-cfh417-hotwind-2000-w-05.webp deleted file mode 100644 index 43221bf9..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/calefaccion-electrica/caloventor-liliana-cfh417-hotwind-2000-w-05.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/calefaccion-electrica/caloventor-liliana-cfh417-hotwind-2000-w-06.webp b/public/images/tennants/mutual_smep/catalog/calefaccion-electrica/caloventor-liliana-cfh417-hotwind-2000-w-06.webp deleted file mode 100644 index cd67727f..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/calefaccion-electrica/caloventor-liliana-cfh417-hotwind-2000-w-06.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/calefaccion-electrica/caloventor-split-liliana-whitenblack-cpwb-01-2000-w-01.webp b/public/images/tennants/mutual_smep/catalog/calefaccion-electrica/caloventor-split-liliana-whitenblack-cpwb-01-2000-w-01.webp deleted file mode 100644 index 1e4089d0..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/calefaccion-electrica/caloventor-split-liliana-whitenblack-cpwb-01-2000-w-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/calefaccion-electrica/caloventor-split-liliana-whitenblack-cpwb-01-2000-w-02.webp b/public/images/tennants/mutual_smep/catalog/calefaccion-electrica/caloventor-split-liliana-whitenblack-cpwb-01-2000-w-02.webp deleted file mode 100644 index 2c659226..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/calefaccion-electrica/caloventor-split-liliana-whitenblack-cpwb-01-2000-w-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/calefaccion-electrica/caloventor-split-liliana-whitenblack-cpwb-01-2000-w-03.webp b/public/images/tennants/mutual_smep/catalog/calefaccion-electrica/caloventor-split-liliana-whitenblack-cpwb-01-2000-w-03.webp deleted file mode 100644 index 400f6e00..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/calefaccion-electrica/caloventor-split-liliana-whitenblack-cpwb-01-2000-w-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/calefaccion-electrica/caloventor-whitenblack-cawb-02-2000-w-doble-posicion-01.webp b/public/images/tennants/mutual_smep/catalog/calefaccion-electrica/caloventor-whitenblack-cawb-02-2000-w-doble-posicion-01.webp deleted file mode 100644 index 8d15b1e8..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/calefaccion-electrica/caloventor-whitenblack-cawb-02-2000-w-doble-posicion-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/calefaccion-electrica/caloventor-whitenblack-cawb-02-2000-w-doble-posicion-02.webp b/public/images/tennants/mutual_smep/catalog/calefaccion-electrica/caloventor-whitenblack-cawb-02-2000-w-doble-posicion-02.webp deleted file mode 100644 index 148986c6..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/calefaccion-electrica/caloventor-whitenblack-cawb-02-2000-w-doble-posicion-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/calefaccion-electrica/torre-liliana-tropic-ftp-530-1500-w-01.webp b/public/images/tennants/mutual_smep/catalog/calefaccion-electrica/torre-liliana-tropic-ftp-530-1500-w-01.webp deleted file mode 100644 index 81ac023f..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/calefaccion-electrica/torre-liliana-tropic-ftp-530-1500-w-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/calefaccion-electrica/torre-liliana-tropic-ftp-530-1500-w-02.webp b/public/images/tennants/mutual_smep/catalog/calefaccion-electrica/torre-liliana-tropic-ftp-530-1500-w-02.webp deleted file mode 100644 index 167fc9d8..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/calefaccion-electrica/torre-liliana-tropic-ftp-530-1500-w-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/calefaccion-electrica/torre-liliana-tropic-ftp-530-1500-w-03.webp b/public/images/tennants/mutual_smep/catalog/calefaccion-electrica/torre-liliana-tropic-ftp-530-1500-w-03.webp deleted file mode 100644 index 4ab06c18..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/calefaccion-electrica/torre-liliana-tropic-ftp-530-1500-w-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/calefactor-sin-salida-al-ext/eskabe-3000-cal-s21-mx3-sin-salida-01.webp b/public/images/tennants/mutual_smep/catalog/calefactor-sin-salida-al-ext/eskabe-3000-cal-s21-mx3-sin-salida-01.webp deleted file mode 100644 index 742922b4..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/calefactor-sin-salida-al-ext/eskabe-3000-cal-s21-mx3-sin-salida-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/calefactor-sin-salida-al-ext/eskabe-3000-cal-s21-mx3-sin-salida-02.webp b/public/images/tennants/mutual_smep/catalog/calefactor-sin-salida-al-ext/eskabe-3000-cal-s21-mx3-sin-salida-02.webp deleted file mode 100644 index 82530e84..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/calefactor-sin-salida-al-ext/eskabe-3000-cal-s21-mx3-sin-salida-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/calefactor-sin-salida-al-ext/eskabe-3000-cal-s21-mx3-sin-salida-03.webp b/public/images/tennants/mutual_smep/catalog/calefactor-sin-salida-al-ext/eskabe-3000-cal-s21-mx3-sin-salida-03.webp deleted file mode 100644 index 4f3cc808..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/calefactor-sin-salida-al-ext/eskabe-3000-cal-s21-mx3-sin-salida-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/calefactor-sin-salida-al-ext/longvie-eca-3kv-3200-cal-infr-visor-grafito-sin-salida-01.webp b/public/images/tennants/mutual_smep/catalog/calefactor-sin-salida-al-ext/longvie-eca-3kv-3200-cal-infr-visor-grafito-sin-salida-01.webp deleted file mode 100644 index 2445e43d..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/calefactor-sin-salida-al-ext/longvie-eca-3kv-3200-cal-infr-visor-grafito-sin-salida-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/calefactor-sin-salida-al-ext/longvie-eca-3kv-3200-cal-infr-visor-grafito-sin-salida-02.webp b/public/images/tennants/mutual_smep/catalog/calefactor-sin-salida-al-ext/longvie-eca-3kv-3200-cal-infr-visor-grafito-sin-salida-02.webp deleted file mode 100644 index 2e347bc3..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/calefactor-sin-salida-al-ext/longvie-eca-3kv-3200-cal-infr-visor-grafito-sin-salida-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/calefactor-sin-salida-al-ext/longvie-eca-3kv-3200-cal-infr-visor-grafito-sin-salida-03.webp b/public/images/tennants/mutual_smep/catalog/calefactor-sin-salida-al-ext/longvie-eca-3kv-3200-cal-infr-visor-grafito-sin-salida-03.webp deleted file mode 100644 index f3a7241f..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/calefactor-sin-salida-al-ext/longvie-eca-3kv-3200-cal-infr-visor-grafito-sin-salida-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/calefactor-sin-salida-al-ext/longvie-eca-3kv-3200-cal-infr-visor-grafito-sin-salida-04.webp b/public/images/tennants/mutual_smep/catalog/calefactor-sin-salida-al-ext/longvie-eca-3kv-3200-cal-infr-visor-grafito-sin-salida-04.webp deleted file mode 100644 index 7bb7a6c5..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/calefactor-sin-salida-al-ext/longvie-eca-3kv-3200-cal-infr-visor-grafito-sin-salida-04.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/calefones-y-termotanques/calefon-longvie-14-l-cn-514-ss-n-enc-sensor-01.webp b/public/images/tennants/mutual_smep/catalog/calefones-y-termotanques/calefon-longvie-14-l-cn-514-ss-n-enc-sensor-01.webp deleted file mode 100644 index 3efc1689..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/calefones-y-termotanques/calefon-longvie-14-l-cn-514-ss-n-enc-sensor-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/celulares/blu-g73-128-gb-01.webp b/public/images/tennants/mutual_smep/catalog/celulares/blu-g73-128-gb-01.webp deleted file mode 100644 index d4ab4a7e..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/celulares/blu-g73-128-gb-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/celulares/blu-g73-128-gb-02.webp b/public/images/tennants/mutual_smep/catalog/celulares/blu-g73-128-gb-02.webp deleted file mode 100644 index 79fed0a2..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/celulares/blu-g73-128-gb-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/celulares/blu-g73-128-gb-03.webp b/public/images/tennants/mutual_smep/catalog/celulares/blu-g73-128-gb-03.webp deleted file mode 100644 index 224a1111..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/celulares/blu-g73-128-gb-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/celulares/motorola-g15-4-256-gb-01.webp b/public/images/tennants/mutual_smep/catalog/celulares/motorola-g15-4-256-gb-01.webp deleted file mode 100644 index 52ddcfd0..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/celulares/motorola-g15-4-256-gb-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/celulares/motorola-g15-4-256-gb-02.webp b/public/images/tennants/mutual_smep/catalog/celulares/motorola-g15-4-256-gb-02.webp deleted file mode 100644 index a6bb8e10..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/celulares/motorola-g15-4-256-gb-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/celulares/motorola-g15-4-256-gb-03.webp b/public/images/tennants/mutual_smep/catalog/celulares/motorola-g15-4-256-gb-03.webp deleted file mode 100644 index fa27b022..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/celulares/motorola-g15-4-256-gb-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/celulares/motorola-g15-4-512-gb-01.webp b/public/images/tennants/mutual_smep/catalog/celulares/motorola-g15-4-512-gb-01.webp deleted file mode 100644 index a3162e37..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/celulares/motorola-g15-4-512-gb-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/celulares/motorola-g15-4-512-gb-02.webp b/public/images/tennants/mutual_smep/catalog/celulares/motorola-g15-4-512-gb-02.webp deleted file mode 100644 index a3234354..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/celulares/motorola-g15-4-512-gb-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/celulares/motorola-g35-4-256-gb-01.webp b/public/images/tennants/mutual_smep/catalog/celulares/motorola-g35-4-256-gb-01.webp deleted file mode 100644 index 89ce3d36..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/celulares/motorola-g35-4-256-gb-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/celulares/motorola-g35-4-256-gb-02.webp b/public/images/tennants/mutual_smep/catalog/celulares/motorola-g35-4-256-gb-02.webp deleted file mode 100644 index 2d654e0c..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/celulares/motorola-g35-4-256-gb-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/celulares/motorola-g35-4-256-gb-03.webp b/public/images/tennants/mutual_smep/catalog/celulares/motorola-g35-4-256-gb-03.webp deleted file mode 100644 index e5b5a7dc..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/celulares/motorola-g35-4-256-gb-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/celulares/motorola-g35-4-256-gb-04.webp b/public/images/tennants/mutual_smep/catalog/celulares/motorola-g35-4-256-gb-04.webp deleted file mode 100644 index 10da9710..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/celulares/motorola-g35-4-256-gb-04.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/celulares/samsung-a07-4-128-gb-01.webp b/public/images/tennants/mutual_smep/catalog/celulares/samsung-a07-4-128-gb-01.webp deleted file mode 100644 index 62f1aec4..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/celulares/samsung-a07-4-128-gb-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/celulares/samsung-a07-4-128-gb-02.webp b/public/images/tennants/mutual_smep/catalog/celulares/samsung-a07-4-128-gb-02.webp deleted file mode 100644 index 64e6839c..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/celulares/samsung-a07-4-128-gb-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/celulares/samsung-a07-4-128-gb-03.webp b/public/images/tennants/mutual_smep/catalog/celulares/samsung-a07-4-128-gb-03.webp deleted file mode 100644 index ab640348..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/celulares/samsung-a07-4-128-gb-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/celulares/samsung-a17-4-128-gb-01.webp b/public/images/tennants/mutual_smep/catalog/celulares/samsung-a17-4-128-gb-01.webp deleted file mode 100644 index e5e983fa..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/celulares/samsung-a17-4-128-gb-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/celulares/samsung-a17-4-128-gb-02.webp b/public/images/tennants/mutual_smep/catalog/celulares/samsung-a17-4-128-gb-02.webp deleted file mode 100644 index ca14f9d3..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/celulares/samsung-a17-4-128-gb-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/celulares/samsung-a17-4-128-gb-03.webp b/public/images/tennants/mutual_smep/catalog/celulares/samsung-a17-4-128-gb-03.webp deleted file mode 100644 index 9d8f5700..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/celulares/samsung-a17-4-128-gb-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/celulares/samsung-a17-5g-8-256-gb-01.webp b/public/images/tennants/mutual_smep/catalog/celulares/samsung-a17-5g-8-256-gb-01.webp deleted file mode 100644 index b4b51d2b..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/celulares/samsung-a17-5g-8-256-gb-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/celulares/samsung-a17-5g-8-256-gb-02.webp b/public/images/tennants/mutual_smep/catalog/celulares/samsung-a17-5g-8-256-gb-02.webp deleted file mode 100644 index c81d3c06..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/celulares/samsung-a17-5g-8-256-gb-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/celulares/samsung-a17-5g-8-256-gb-03.webp b/public/images/tennants/mutual_smep/catalog/celulares/samsung-a17-5g-8-256-gb-03.webp deleted file mode 100644 index 42d2350f..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/celulares/samsung-a17-5g-8-256-gb-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/celulares/samsung-a26-5g-8-256-gb-01.webp b/public/images/tennants/mutual_smep/catalog/celulares/samsung-a26-5g-8-256-gb-01.webp deleted file mode 100644 index 5f415185..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/celulares/samsung-a26-5g-8-256-gb-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/celulares/samsung-a26-5g-8-256-gb-02.webp b/public/images/tennants/mutual_smep/catalog/celulares/samsung-a26-5g-8-256-gb-02.webp deleted file mode 100644 index 6904a867..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/celulares/samsung-a26-5g-8-256-gb-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/celulares/samsung-a26-5g-8-256-gb-03.webp b/public/images/tennants/mutual_smep/catalog/celulares/samsung-a26-5g-8-256-gb-03.webp deleted file mode 100644 index d5c5cd00..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/celulares/samsung-a26-5g-8-256-gb-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/celulares/samsung-a36-5g-8-256-gb-01.webp b/public/images/tennants/mutual_smep/catalog/celulares/samsung-a36-5g-8-256-gb-01.webp deleted file mode 100644 index 4746a0f9..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/celulares/samsung-a36-5g-8-256-gb-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/celulares/samsung-a36-5g-8-256-gb-02.webp b/public/images/tennants/mutual_smep/catalog/celulares/samsung-a36-5g-8-256-gb-02.webp deleted file mode 100644 index eb375791..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/celulares/samsung-a36-5g-8-256-gb-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/celulares/samsung-a36-5g-8-256-gb-03.webp b/public/images/tennants/mutual_smep/catalog/celulares/samsung-a36-5g-8-256-gb-03.webp deleted file mode 100644 index 67285f5a..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/celulares/samsung-a36-5g-8-256-gb-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/celulares/samsung-a36-5g-8-256-gb-04.webp b/public/images/tennants/mutual_smep/catalog/celulares/samsung-a36-5g-8-256-gb-04.webp deleted file mode 100644 index 5f6ef257..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/celulares/samsung-a36-5g-8-256-gb-04.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/celulares/samsung-a36-5g-8-256-gb-05.webp b/public/images/tennants/mutual_smep/catalog/celulares/samsung-a36-5g-8-256-gb-05.webp deleted file mode 100644 index afee2124..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/celulares/samsung-a36-5g-8-256-gb-05.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/celulares/samsung-a56-5g-8-256-gb-01.webp b/public/images/tennants/mutual_smep/catalog/celulares/samsung-a56-5g-8-256-gb-01.webp deleted file mode 100644 index 4b1f2adb..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/celulares/samsung-a56-5g-8-256-gb-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/celulares/samsung-a56-5g-8-256-gb-02.webp b/public/images/tennants/mutual_smep/catalog/celulares/samsung-a56-5g-8-256-gb-02.webp deleted file mode 100644 index 9ed6a366..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/celulares/samsung-a56-5g-8-256-gb-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/celulares/samsung-a56-5g-8-256-gb-03.webp b/public/images/tennants/mutual_smep/catalog/celulares/samsung-a56-5g-8-256-gb-03.webp deleted file mode 100644 index d46c2574..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/celulares/samsung-a56-5g-8-256-gb-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/celulares/samsung-galaxy-a16-4-128-gb-01.webp b/public/images/tennants/mutual_smep/catalog/celulares/samsung-galaxy-a16-4-128-gb-01.webp deleted file mode 100644 index 4718b0ed..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/celulares/samsung-galaxy-a16-4-128-gb-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/celulares/samsung-galaxy-a16-4-128-gb-02.webp b/public/images/tennants/mutual_smep/catalog/celulares/samsung-galaxy-a16-4-128-gb-02.webp deleted file mode 100644 index 30ae93b5..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/celulares/samsung-galaxy-a16-4-128-gb-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/celulares/samsung-galaxy-a16-4-128-gb-03.webp b/public/images/tennants/mutual_smep/catalog/celulares/samsung-galaxy-a16-4-128-gb-03.webp deleted file mode 100644 index a5476035..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/celulares/samsung-galaxy-a16-4-128-gb-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/celulares/samsung-galaxy-a16-4-128-gb-04.webp b/public/images/tennants/mutual_smep/catalog/celulares/samsung-galaxy-a16-4-128-gb-04.webp deleted file mode 100644 index 61138856..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/celulares/samsung-galaxy-a16-4-128-gb-04.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/celulares/samsung-galaxy-a16-4-128-gb-05.webp b/public/images/tennants/mutual_smep/catalog/celulares/samsung-galaxy-a16-4-128-gb-05.webp deleted file mode 100644 index 15620de2..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/celulares/samsung-galaxy-a16-4-128-gb-05.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/celulares/samsung-galaxy-a16-4-128-gb-06.webp b/public/images/tennants/mutual_smep/catalog/celulares/samsung-galaxy-a16-4-128-gb-06.webp deleted file mode 100644 index ad39f55d..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/celulares/samsung-galaxy-a16-4-128-gb-06.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/celulares/xiaomi-poco-c85-8-256-gb-01.webp b/public/images/tennants/mutual_smep/catalog/celulares/xiaomi-poco-c85-8-256-gb-01.webp deleted file mode 100644 index 10bdae83..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/celulares/xiaomi-poco-c85-8-256-gb-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/celulares/xiaomi-poco-c85-8-256-gb-02.webp b/public/images/tennants/mutual_smep/catalog/celulares/xiaomi-poco-c85-8-256-gb-02.webp deleted file mode 100644 index 45663f15..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/celulares/xiaomi-poco-c85-8-256-gb-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/celulares/xiaomi-poco-c85-8-256-gb-03.webp b/public/images/tennants/mutual_smep/catalog/celulares/xiaomi-poco-c85-8-256-gb-03.webp deleted file mode 100644 index 7489284b..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/celulares/xiaomi-poco-c85-8-256-gb-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/celulares/xiaomi-poco-m7-8-256-gb-01.webp b/public/images/tennants/mutual_smep/catalog/celulares/xiaomi-poco-m7-8-256-gb-01.webp deleted file mode 100644 index b8df1eba..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/celulares/xiaomi-poco-m7-8-256-gb-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/celulares/xiaomi-poco-m7-8-256-gb-02.webp b/public/images/tennants/mutual_smep/catalog/celulares/xiaomi-poco-m7-8-256-gb-02.webp deleted file mode 100644 index fe20a592..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/celulares/xiaomi-poco-m7-8-256-gb-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/celulares/xiaomi-poco-m7-8-256-gb-03.webp b/public/images/tennants/mutual_smep/catalog/celulares/xiaomi-poco-m7-8-256-gb-03.webp deleted file mode 100644 index 73464c9f..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/celulares/xiaomi-poco-m7-8-256-gb-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/celulares/xiaomi-redmi-15c-8-256-gb-01.webp b/public/images/tennants/mutual_smep/catalog/celulares/xiaomi-redmi-15c-8-256-gb-01.webp deleted file mode 100644 index 0aee9de2..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/celulares/xiaomi-redmi-15c-8-256-gb-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/celulares/xiaomi-redmi-15c-8-256-gb-02.webp b/public/images/tennants/mutual_smep/catalog/celulares/xiaomi-redmi-15c-8-256-gb-02.webp deleted file mode 100644 index cfcff827..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/celulares/xiaomi-redmi-15c-8-256-gb-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/celulares/xiaomi-redmi-note-14-pro-5g-8-256-gb-01.webp b/public/images/tennants/mutual_smep/catalog/celulares/xiaomi-redmi-note-14-pro-5g-8-256-gb-01.webp deleted file mode 100644 index 94f9359b..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/celulares/xiaomi-redmi-note-14-pro-5g-8-256-gb-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/celulares/xiaomi-redmi-note-14-pro-5g-8-256-gb-02.webp b/public/images/tennants/mutual_smep/catalog/celulares/xiaomi-redmi-note-14-pro-5g-8-256-gb-02.webp deleted file mode 100644 index 62423cc0..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/celulares/xiaomi-redmi-note-14-pro-5g-8-256-gb-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/celulares/xiaomi-redmi-note-14-pro-5g-8-256-gb-03.webp b/public/images/tennants/mutual_smep/catalog/celulares/xiaomi-redmi-note-14-pro-5g-8-256-gb-03.webp deleted file mode 100644 index 395b8d8c..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/celulares/xiaomi-redmi-note-14-pro-5g-8-256-gb-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/celulares/xiaomi-redmi-note-14-pro-5g-8-256-gb-04.webp b/public/images/tennants/mutual_smep/catalog/celulares/xiaomi-redmi-note-14-pro-5g-8-256-gb-04.webp deleted file mode 100644 index 7e447315..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/celulares/xiaomi-redmi-note-14-pro-5g-8-256-gb-04.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/celulares/xiaomi-redmi-note-14-pro-5g-8-256-gb-05.webp b/public/images/tennants/mutual_smep/catalog/celulares/xiaomi-redmi-note-14-pro-5g-8-256-gb-05.webp deleted file mode 100644 index 314d2fa9..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/celulares/xiaomi-redmi-note-14-pro-5g-8-256-gb-05.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/celulares/xiaomi-redmi-note-14-pro-5g-8-256-gb-06.webp b/public/images/tennants/mutual_smep/catalog/celulares/xiaomi-redmi-note-14-pro-5g-8-256-gb-06.webp deleted file mode 100644 index 3b534070..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/celulares/xiaomi-redmi-note-14-pro-5g-8-256-gb-06.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/celulares/xiaomi-redmi-note-15-8-256-gb-01.webp b/public/images/tennants/mutual_smep/catalog/celulares/xiaomi-redmi-note-15-8-256-gb-01.webp deleted file mode 100644 index a67752a0..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/celulares/xiaomi-redmi-note-15-8-256-gb-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/celulares/xiaomi-redmi-note-15-8-256-gb-02.webp b/public/images/tennants/mutual_smep/catalog/celulares/xiaomi-redmi-note-15-8-256-gb-02.webp deleted file mode 100644 index 26c9dae4..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/celulares/xiaomi-redmi-note-15-8-256-gb-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/celulares/xiaomi-redmi-note-15-8-256-gb-03.webp b/public/images/tennants/mutual_smep/catalog/celulares/xiaomi-redmi-note-15-8-256-gb-03.webp deleted file mode 100644 index 8a2d0bf8..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/celulares/xiaomi-redmi-note-15-8-256-gb-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/celulares/xiaomi-redmi-note-15-8-256-gb-04.webp b/public/images/tennants/mutual_smep/catalog/celulares/xiaomi-redmi-note-15-8-256-gb-04.webp deleted file mode 100644 index a0f45e63..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/celulares/xiaomi-redmi-note-15-8-256-gb-04.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/celulares/xiaomi-redmi-note-15-8-256-gb-05.webp b/public/images/tennants/mutual_smep/catalog/celulares/xiaomi-redmi-note-15-8-256-gb-05.webp deleted file mode 100644 index 176bc343..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/celulares/xiaomi-redmi-note-15-8-256-gb-05.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/cocinas/cocina-florencia-5536-f-56-cm-color-blanca-01.webp b/public/images/tennants/mutual_smep/catalog/cocinas/cocina-florencia-5536-f-56-cm-color-blanca-01.webp deleted file mode 100644 index 9f67ca48..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/cocinas/cocina-florencia-5536-f-56-cm-color-blanca-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/cocinas/cocina-florencia-5536-f-56-cm-color-blanca-02.webp b/public/images/tennants/mutual_smep/catalog/cocinas/cocina-florencia-5536-f-56-cm-color-blanca-02.webp deleted file mode 100644 index 614a8d99..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/cocinas/cocina-florencia-5536-f-56-cm-color-blanca-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/cocinas/cocina-florencia-5536-f-56-cm-color-blanca-03.webp b/public/images/tennants/mutual_smep/catalog/cocinas/cocina-florencia-5536-f-56-cm-color-blanca-03.webp deleted file mode 100644 index e978dff1..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/cocinas/cocina-florencia-5536-f-56-cm-color-blanca-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/cocinas/cocina-florencia-5536-f-56-cm-color-blanca-04.webp b/public/images/tennants/mutual_smep/catalog/cocinas/cocina-florencia-5536-f-56-cm-color-blanca-04.webp deleted file mode 100644 index d45e7e90..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/cocinas/cocina-florencia-5536-f-56-cm-color-blanca-04.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/cocinas/cocina-longvie-13331bf-56-cm-color-blanca-01.webp b/public/images/tennants/mutual_smep/catalog/cocinas/cocina-longvie-13331bf-56-cm-color-blanca-01.webp deleted file mode 100644 index 40c262e7..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/cocinas/cocina-longvie-13331bf-56-cm-color-blanca-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/cocinas/cocina-longvie-13331bf-56-cm-color-blanca-02.webp b/public/images/tennants/mutual_smep/catalog/cocinas/cocina-longvie-13331bf-56-cm-color-blanca-02.webp deleted file mode 100644 index 2ae97752..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/cocinas/cocina-longvie-13331bf-56-cm-color-blanca-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/cocinas/cocina-longvie-13331bf-56-cm-color-blanca-03.webp b/public/images/tennants/mutual_smep/catalog/cocinas/cocina-longvie-13331bf-56-cm-color-blanca-03.webp deleted file mode 100644 index 5d90bb98..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/cocinas/cocina-longvie-13331bf-56-cm-color-blanca-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/cocinas/cocina-longvie-13331bf-56-cm-color-blanca-04.webp b/public/images/tennants/mutual_smep/catalog/cocinas/cocina-longvie-13331bf-56-cm-color-blanca-04.webp deleted file mode 100644 index b496fb92..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/cocinas/cocina-longvie-13331bf-56-cm-color-blanca-04.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/cocinas/cocina-longvie-13331bf-56-cm-color-blanca-05.webp b/public/images/tennants/mutual_smep/catalog/cocinas/cocina-longvie-13331bf-56-cm-color-blanca-05.webp deleted file mode 100644 index d323053d..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/cocinas/cocina-longvie-13331bf-56-cm-color-blanca-05.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/cocinas/cocina-longvie-13331bf-56-cm-color-blanca-06.webp b/public/images/tennants/mutual_smep/catalog/cocinas/cocina-longvie-13331bf-56-cm-color-blanca-06.webp deleted file mode 100644 index 1667ee74..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/cocinas/cocina-longvie-13331bf-56-cm-color-blanca-06.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/cocinas/cocina-longvie-13331bf-56-cm-color-blanca-07.webp b/public/images/tennants/mutual_smep/catalog/cocinas/cocina-longvie-13331bf-56-cm-color-blanca-07.webp deleted file mode 100644 index 3b522f81..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/cocinas/cocina-longvie-13331bf-56-cm-color-blanca-07.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/cocinas/cocina-longvie-13331xf-56cm-acero-inoxidable-01.webp b/public/images/tennants/mutual_smep/catalog/cocinas/cocina-longvie-13331xf-56cm-acero-inoxidable-01.webp deleted file mode 100644 index b15924fb..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/cocinas/cocina-longvie-13331xf-56cm-acero-inoxidable-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/cocinas/cocina-longvie-13331xf-56cm-acero-inoxidable-02.webp b/public/images/tennants/mutual_smep/catalog/cocinas/cocina-longvie-13331xf-56cm-acero-inoxidable-02.webp deleted file mode 100644 index f31aec2c..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/cocinas/cocina-longvie-13331xf-56cm-acero-inoxidable-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/cocinas/cocina-longvie-13331xf-56cm-acero-inoxidable-03.webp b/public/images/tennants/mutual_smep/catalog/cocinas/cocina-longvie-13331xf-56cm-acero-inoxidable-03.webp deleted file mode 100644 index 95d13c5c..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/cocinas/cocina-longvie-13331xf-56cm-acero-inoxidable-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/cocinas/cocina-longvie-13501bf-56-cm-color-blanca-01.webp b/public/images/tennants/mutual_smep/catalog/cocinas/cocina-longvie-13501bf-56-cm-color-blanca-01.webp deleted file mode 100644 index 924ccd38..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/cocinas/cocina-longvie-13501bf-56-cm-color-blanca-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/cocinas/cocina-longvie-13501bf-56-cm-color-blanca-02.webp b/public/images/tennants/mutual_smep/catalog/cocinas/cocina-longvie-13501bf-56-cm-color-blanca-02.webp deleted file mode 100644 index 7a7d13f1..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/cocinas/cocina-longvie-13501bf-56-cm-color-blanca-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/cocinas/cocina-longvie-13501bf-56-cm-color-blanca-03.webp b/public/images/tennants/mutual_smep/catalog/cocinas/cocina-longvie-13501bf-56-cm-color-blanca-03.webp deleted file mode 100644 index d14d9473..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/cocinas/cocina-longvie-13501bf-56-cm-color-blanca-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/cocinas/cocina-longvie-13501bf-56-cm-color-blanca-04.webp b/public/images/tennants/mutual_smep/catalog/cocinas/cocina-longvie-13501bf-56-cm-color-blanca-04.webp deleted file mode 100644 index b21c8ec2..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/cocinas/cocina-longvie-13501bf-56-cm-color-blanca-04.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/cocinas/cocina-longvie-13501bf-56-cm-color-blanca-05.webp b/public/images/tennants/mutual_smep/catalog/cocinas/cocina-longvie-13501bf-56-cm-color-blanca-05.webp deleted file mode 100644 index ec2268bc..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/cocinas/cocina-longvie-13501bf-56-cm-color-blanca-05.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/colchon-1-plaza-0-80x1-90/colchon-espuma-inducol-aurelia-0-80x1-90x0-20-01.webp b/public/images/tennants/mutual_smep/catalog/colchon-1-plaza-0-80x1-90/colchon-espuma-inducol-aurelia-0-80x1-90x0-20-01.webp deleted file mode 100644 index 3807f0a4..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/colchon-1-plaza-0-80x1-90/colchon-espuma-inducol-aurelia-0-80x1-90x0-20-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/colchon-1-plaza-0-80x1-90/colchon-inducol-constanza-espuma-alta-densidad-080x24-01.webp b/public/images/tennants/mutual_smep/catalog/colchon-1-plaza-0-80x1-90/colchon-inducol-constanza-espuma-alta-densidad-080x24-01.webp deleted file mode 100644 index cecdc05c..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/colchon-1-plaza-0-80x1-90/colchon-inducol-constanza-espuma-alta-densidad-080x24-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/colchon-1-plaza-0-80x1-90/colchon-inducol-constanza-espuma-alta-densidad-080x24-02.webp b/public/images/tennants/mutual_smep/catalog/colchon-1-plaza-0-80x1-90/colchon-inducol-constanza-espuma-alta-densidad-080x24-02.webp deleted file mode 100644 index 1ac44723..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/colchon-1-plaza-0-80x1-90/colchon-inducol-constanza-espuma-alta-densidad-080x24-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/colchon-1-plaza-0-80x1-90/colchon-king-koil-resortes-bradley-080x190x026-01.webp b/public/images/tennants/mutual_smep/catalog/colchon-1-plaza-0-80x1-90/colchon-king-koil-resortes-bradley-080x190x026-01.webp deleted file mode 100644 index d4c76683..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/colchon-1-plaza-0-80x1-90/colchon-king-koil-resortes-bradley-080x190x026-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/colchon-1-plaza-0-80x1-90/colchon-king-koil-resortes-bradley-080x190x026-02.webp b/public/images/tennants/mutual_smep/catalog/colchon-1-plaza-0-80x1-90/colchon-king-koil-resortes-bradley-080x190x026-02.webp deleted file mode 100644 index 800ad844..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/colchon-1-plaza-0-80x1-90/colchon-king-koil-resortes-bradley-080x190x026-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/colchon-1-plaza-0-80x1-90/colchon-king-koil-resortes-bradley-080x190x026-03.webp b/public/images/tennants/mutual_smep/catalog/colchon-1-plaza-0-80x1-90/colchon-king-koil-resortes-bradley-080x190x026-03.webp deleted file mode 100644 index ce2e4607..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/colchon-1-plaza-0-80x1-90/colchon-king-koil-resortes-bradley-080x190x026-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/colchon-1-plaza-0-80x1-90/colchon-king-koil-resortes-bradley-080x190x026-04.webp b/public/images/tennants/mutual_smep/catalog/colchon-1-plaza-0-80x1-90/colchon-king-koil-resortes-bradley-080x190x026-04.webp deleted file mode 100644 index a855bd9a..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/colchon-1-plaza-0-80x1-90/colchon-king-koil-resortes-bradley-080x190x026-04.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/colchon-1-plaza-0-80x1-90/colchon-king-koil-resortes-bradley-080x190x026-05.webp b/public/images/tennants/mutual_smep/catalog/colchon-1-plaza-0-80x1-90/colchon-king-koil-resortes-bradley-080x190x026-05.webp deleted file mode 100644 index 1a726f6b..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/colchon-1-plaza-0-80x1-90/colchon-king-koil-resortes-bradley-080x190x026-05.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/colchon-1-plaza-0-80x1-90/colchon-piero-body-matelasse-espuma-media-densidad-0-90x1-90x0-20-01.webp b/public/images/tennants/mutual_smep/catalog/colchon-1-plaza-0-80x1-90/colchon-piero-body-matelasse-espuma-media-densidad-0-90x1-90x0-20-01.webp deleted file mode 100644 index 9454b256..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/colchon-1-plaza-0-80x1-90/colchon-piero-body-matelasse-espuma-media-densidad-0-90x1-90x0-20-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/colchon-1-plaza-0-80x1-90/colchon-piero-body-matelasse-espuma-media-densidad-0-90x1-90x0-20-02.webp b/public/images/tennants/mutual_smep/catalog/colchon-1-plaza-0-80x1-90/colchon-piero-body-matelasse-espuma-media-densidad-0-90x1-90x0-20-02.webp deleted file mode 100644 index 7baf2619..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/colchon-1-plaza-0-80x1-90/colchon-piero-body-matelasse-espuma-media-densidad-0-90x1-90x0-20-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/colchon-1-plaza-0-80x1-90/colchon-piero-resorte-corona-real-0-8x1-90x0-26-01.webp b/public/images/tennants/mutual_smep/catalog/colchon-1-plaza-0-80x1-90/colchon-piero-resorte-corona-real-0-8x1-90x0-26-01.webp deleted file mode 100644 index 05f5ea7a..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/colchon-1-plaza-0-80x1-90/colchon-piero-resorte-corona-real-0-8x1-90x0-26-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/colchon-1-plaza-0-80x1-90/colchon-piero-resorte-corona-real-0-8x1-90x0-26-02.webp b/public/images/tennants/mutual_smep/catalog/colchon-1-plaza-0-80x1-90/colchon-piero-resorte-corona-real-0-8x1-90x0-26-02.webp deleted file mode 100644 index 1b925c82..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/colchon-1-plaza-0-80x1-90/colchon-piero-resorte-corona-real-0-8x1-90x0-26-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/colchon-1-plaza-0-80x1-90/colchon-piero-resorte-corona-real-0-8x1-90x0-26-03.webp b/public/images/tennants/mutual_smep/catalog/colchon-1-plaza-0-80x1-90/colchon-piero-resorte-corona-real-0-8x1-90x0-26-03.webp deleted file mode 100644 index b58ee132..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/colchon-1-plaza-0-80x1-90/colchon-piero-resorte-corona-real-0-8x1-90x0-26-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/colchon-1-plaza-0-80x1-90/soporte-led-26-60-nakan-spl-375e-extensible-y-giratorio-01.webp b/public/images/tennants/mutual_smep/catalog/colchon-1-plaza-0-80x1-90/soporte-led-26-60-nakan-spl-375e-extensible-y-giratorio-01.webp deleted file mode 100644 index 91d2ffea..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/colchon-1-plaza-0-80x1-90/soporte-led-26-60-nakan-spl-375e-extensible-y-giratorio-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/colchon-1-plaza-0-80x1-90/soporte-led-26-60-nakan-spl-375e-extensible-y-giratorio-02.webp b/public/images/tennants/mutual_smep/catalog/colchon-1-plaza-0-80x1-90/soporte-led-26-60-nakan-spl-375e-extensible-y-giratorio-02.webp deleted file mode 100644 index 951dff54..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/colchon-1-plaza-0-80x1-90/soporte-led-26-60-nakan-spl-375e-extensible-y-giratorio-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/colchon-1-plaza-0-80x1-90/soporte-led-26-60-nakan-spl-375e-extensible-y-giratorio-03.webp b/public/images/tennants/mutual_smep/catalog/colchon-1-plaza-0-80x1-90/soporte-led-26-60-nakan-spl-375e-extensible-y-giratorio-03.webp deleted file mode 100644 index 4c1e9d88..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/colchon-1-plaza-0-80x1-90/soporte-led-26-60-nakan-spl-375e-extensible-y-giratorio-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/colchon-2-plazas-1-40x1-90/colchon-inducol-constanza-espuma-alta-densidad-1-40x1-90x0-24-01.webp b/public/images/tennants/mutual_smep/catalog/colchon-2-plazas-1-40x1-90/colchon-inducol-constanza-espuma-alta-densidad-1-40x1-90x0-24-01.webp deleted file mode 100644 index 3a8c401c..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/colchon-2-plazas-1-40x1-90/colchon-inducol-constanza-espuma-alta-densidad-1-40x1-90x0-24-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/colchon-2-plazas-1-40x1-90/colchon-inducol-constanza-espuma-alta-densidad-1-40x1-90x0-24-02.webp b/public/images/tennants/mutual_smep/catalog/colchon-2-plazas-1-40x1-90/colchon-inducol-constanza-espuma-alta-densidad-1-40x1-90x0-24-02.webp deleted file mode 100644 index 04b132a4..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/colchon-2-plazas-1-40x1-90/colchon-inducol-constanza-espuma-alta-densidad-1-40x1-90x0-24-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/colchon-2-plazas-1-40x1-90/colchon-king-koil-g22-espuma-alta-densidad-1-40x1-90x0-24-01.webp b/public/images/tennants/mutual_smep/catalog/colchon-2-plazas-1-40x1-90/colchon-king-koil-g22-espuma-alta-densidad-1-40x1-90x0-24-01.webp deleted file mode 100644 index 148491e8..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/colchon-2-plazas-1-40x1-90/colchon-king-koil-g22-espuma-alta-densidad-1-40x1-90x0-24-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/colchon-2-plazas-1-40x1-90/colchon-king-koil-g22-espuma-alta-densidad-1-40x1-90x0-24-02.webp b/public/images/tennants/mutual_smep/catalog/colchon-2-plazas-1-40x1-90/colchon-king-koil-g22-espuma-alta-densidad-1-40x1-90x0-24-02.webp deleted file mode 100644 index b5f5fa90..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/colchon-2-plazas-1-40x1-90/colchon-king-koil-g22-espuma-alta-densidad-1-40x1-90x0-24-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/colchon-2-plazas-1-40x1-90/colchon-king-koil-g22-espuma-alta-densidad-1-40x1-90x0-24-03.webp b/public/images/tennants/mutual_smep/catalog/colchon-2-plazas-1-40x1-90/colchon-king-koil-g22-espuma-alta-densidad-1-40x1-90x0-24-03.webp deleted file mode 100644 index 00d071c5..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/colchon-2-plazas-1-40x1-90/colchon-king-koil-g22-espuma-alta-densidad-1-40x1-90x0-24-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/colchon-2-plazas-1-40x1-90/colchon-king-koil-g22-espuma-alta-densidad-1-40x1-90x0-24-04.webp b/public/images/tennants/mutual_smep/catalog/colchon-2-plazas-1-40x1-90/colchon-king-koil-g22-espuma-alta-densidad-1-40x1-90x0-24-04.webp deleted file mode 100644 index 699efbc9..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/colchon-2-plazas-1-40x1-90/colchon-king-koil-g22-espuma-alta-densidad-1-40x1-90x0-24-04.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/colchon-2-plazas-1-40x1-90/colchon-king-koil-g22-espuma-alta-densidad-1-40x1-90x0-24-05.webp b/public/images/tennants/mutual_smep/catalog/colchon-2-plazas-1-40x1-90/colchon-king-koil-g22-espuma-alta-densidad-1-40x1-90x0-24-05.webp deleted file mode 100644 index 20afbd6c..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/colchon-2-plazas-1-40x1-90/colchon-king-koil-g22-espuma-alta-densidad-1-40x1-90x0-24-05.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/colchon-2-plazas-1-40x1-90/colchon-king-koil-g22-espuma-alta-densidad-1-40x1-90x0-24-06.webp b/public/images/tennants/mutual_smep/catalog/colchon-2-plazas-1-40x1-90/colchon-king-koil-g22-espuma-alta-densidad-1-40x1-90x0-24-06.webp deleted file mode 100644 index f483d2e3..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/colchon-2-plazas-1-40x1-90/colchon-king-koil-g22-espuma-alta-densidad-1-40x1-90x0-24-06.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/colchon-2-plazas-1-40x1-90/colchon-king-koil-g22-espuma-alta-densidad-1-40x1-90x0-24-07.webp b/public/images/tennants/mutual_smep/catalog/colchon-2-plazas-1-40x1-90/colchon-king-koil-g22-espuma-alta-densidad-1-40x1-90x0-24-07.webp deleted file mode 100644 index 0e3fb0e9..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/colchon-2-plazas-1-40x1-90/colchon-king-koil-g22-espuma-alta-densidad-1-40x1-90x0-24-07.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/colchon-2-plazas-1-40x1-90/colchon-suavegom-espuma-merit-doble-pillow-140x190x029-01.webp b/public/images/tennants/mutual_smep/catalog/colchon-2-plazas-1-40x1-90/colchon-suavegom-espuma-merit-doble-pillow-140x190x029-01.webp deleted file mode 100644 index 03a4f0af..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/colchon-2-plazas-1-40x1-90/colchon-suavegom-espuma-merit-doble-pillow-140x190x029-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/colchon-2-plazas-1-40x1-90/colchon-suavegom-espuma-merit-doble-pillow-140x190x029-02.webp b/public/images/tennants/mutual_smep/catalog/colchon-2-plazas-1-40x1-90/colchon-suavegom-espuma-merit-doble-pillow-140x190x029-02.webp deleted file mode 100644 index b9235fd0..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/colchon-2-plazas-1-40x1-90/colchon-suavegom-espuma-merit-doble-pillow-140x190x029-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/colchon-2-plazas-1-40x1-90/colchon-suavegom-espuma-merit-doble-pillow-140x190x029-03.webp b/public/images/tennants/mutual_smep/catalog/colchon-2-plazas-1-40x1-90/colchon-suavegom-espuma-merit-doble-pillow-140x190x029-03.webp deleted file mode 100644 index c31df4db..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/colchon-2-plazas-1-40x1-90/colchon-suavegom-espuma-merit-doble-pillow-140x190x029-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/batidora-de-mano-oster-hm-2600-negra-01.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/batidora-de-mano-oster-hm-2600-negra-01.webp deleted file mode 100644 index 1859f6d6..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/batidora-de-mano-oster-hm-2600-negra-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/batidora-de-mano-oster-hm-2600-negra-02.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/batidora-de-mano-oster-hm-2600-negra-02.webp deleted file mode 100644 index 4cf0e743..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/batidora-de-mano-oster-hm-2600-negra-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/batidora-de-mano-oster-hm-2600-negra-03.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/batidora-de-mano-oster-hm-2600-negra-03.webp deleted file mode 100644 index 3a645507..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/batidora-de-mano-oster-hm-2600-negra-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/batidora-planetaria-atma-bpat21wp-01.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/batidora-planetaria-atma-bpat21wp-01.webp deleted file mode 100644 index e9f668f4..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/batidora-planetaria-atma-bpat21wp-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/batidora-planetaria-atma-bpat21wp-02.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/batidora-planetaria-atma-bpat21wp-02.webp deleted file mode 100644 index 5a696d29..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/batidora-planetaria-atma-bpat21wp-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/batidora-planetaria-atma-bpat21wp-03.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/batidora-planetaria-atma-bpat21wp-03.webp deleted file mode 100644 index c06a3b18..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/batidora-planetaria-atma-bpat21wp-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/batidora-planetaria-atma-bpat21wp-04.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/batidora-planetaria-atma-bpat21wp-04.webp deleted file mode 100644 index f2350366..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/batidora-planetaria-atma-bpat21wp-04.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/batidora-planetaria-atma-bpat21wp-05.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/batidora-planetaria-atma-bpat21wp-05.webp deleted file mode 100644 index 4a3b488f..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/batidora-planetaria-atma-bpat21wp-05.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/batidora-planetaria-atma-bpat21wp-06.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/batidora-planetaria-atma-bpat21wp-06.webp deleted file mode 100644 index 5c6a777b..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/batidora-planetaria-atma-bpat21wp-06.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-atma-ca-8182p-digital-1000-w-1-8-l-01.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-atma-ca-8182p-digital-1000-w-1-8-l-01.webp deleted file mode 100644 index 4683ade5..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-atma-ca-8182p-digital-1000-w-1-8-l-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-atma-ca-8182p-digital-1000-w-1-8-l-02.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-atma-ca-8182p-digital-1000-w-1-8-l-02.webp deleted file mode 100644 index 12a164e8..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-atma-ca-8182p-digital-1000-w-1-8-l-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-atma-ca-8182p-digital-1000-w-1-8-l-03.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-atma-ca-8182p-digital-1000-w-1-8-l-03.webp deleted file mode 100644 index 56257998..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-atma-ca-8182p-digital-1000-w-1-8-l-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-atma-ceat-5418p-1-litro-01.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-atma-ceat-5418p-1-litro-01.webp deleted file mode 100644 index 942152d1..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-atma-ceat-5418p-1-litro-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-atma-ceat-5418p-1-litro-02.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-atma-ceat-5418p-1-litro-02.webp deleted file mode 100644 index 1743c54a..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-atma-ceat-5418p-1-litro-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-atma-ceat-5418p-1-litro-03.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-atma-ceat-5418p-1-litro-03.webp deleted file mode 100644 index 4e4ef19f..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-atma-ceat-5418p-1-litro-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-atma-ceat-5418p-1-litro-04.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-atma-ceat-5418p-1-litro-04.webp deleted file mode 100644 index 2f00223d..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-atma-ceat-5418p-1-litro-04.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-atma-ceat-5418p-1-litro-05.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-atma-ceat-5418p-1-litro-05.webp deleted file mode 100644 index 0482847a..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-atma-ceat-5418p-1-litro-05.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-atma-ceat-5418p-1-litro-06.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-atma-ceat-5418p-1-litro-06.webp deleted file mode 100644 index 7dbac106..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-atma-ceat-5418p-1-litro-06.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-atma-ceat-5418p-1-litro-07.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-atma-ceat-5418p-1-litro-07.webp deleted file mode 100644 index c99f9844..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-atma-ceat-5418p-1-litro-07.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-atma-ceat-5418p-1-litro-08.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-atma-ceat-5418p-1-litro-08.webp deleted file mode 100644 index eab8a295..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-atma-ceat-5418p-1-litro-08.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-atma-ceat-5418p-1-litro-09.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-atma-ceat-5418p-1-litro-09.webp deleted file mode 100644 index 7c168623..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-atma-ceat-5418p-1-litro-09.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-atma-ceat-5418p-1-litro-10.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-atma-ceat-5418p-1-litro-10.webp deleted file mode 100644 index 78f477b1..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-atma-ceat-5418p-1-litro-10.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-liliana-ac-980-3-en-1-01.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-liliana-ac-980-3-en-1-01.webp deleted file mode 100644 index 19776b08..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-liliana-ac-980-3-en-1-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-liliana-ac-980-3-en-1-02.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-liliana-ac-980-3-en-1-02.webp deleted file mode 100644 index 0b5a6a3c..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-liliana-ac-980-3-en-1-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-liliana-ac-980-3-en-1-03.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-liliana-ac-980-3-en-1-03.webp deleted file mode 100644 index dfa3fd66..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-liliana-ac-980-3-en-1-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-liliana-ac-980-3-en-1-04.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-liliana-ac-980-3-en-1-04.webp deleted file mode 100644 index 1562392d..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-liliana-ac-980-3-en-1-04.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-liliana-ac-980-3-en-1-05.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-liliana-ac-980-3-en-1-05.webp deleted file mode 100644 index 1821aa8e..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-liliana-ac-980-3-en-1-05.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-liliana-ac-980-3-en-1-06.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-liliana-ac-980-3-en-1-06.webp deleted file mode 100644 index e2fd7a5f..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-liliana-ac-980-3-en-1-06.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-liliana-ac-980-3-en-1-07.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-liliana-ac-980-3-en-1-07.webp deleted file mode 100644 index 0957787a..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-liliana-ac-980-3-en-1-07.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-liliana-ac-980-3-en-1-08.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-liliana-ac-980-3-en-1-08.webp deleted file mode 100644 index 8dbf3025..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-express-liliana-ac-980-3-en-1-08.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-moulinex-mini-me-dolce-capsulas-01.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-moulinex-mini-me-dolce-capsulas-01.webp deleted file mode 100644 index 0ff04d79..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-moulinex-mini-me-dolce-capsulas-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-moulinex-mini-me-dolce-capsulas-02.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-moulinex-mini-me-dolce-capsulas-02.webp deleted file mode 100644 index 05691f50..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-moulinex-mini-me-dolce-capsulas-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-moulinex-mini-me-dolce-capsulas-03.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-moulinex-mini-me-dolce-capsulas-03.webp deleted file mode 100644 index b1bc839e..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cafetera-moulinex-mini-me-dolce-capsulas-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cortabarba-philips-bt-7201-01.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cortabarba-philips-bt-7201-01.webp deleted file mode 100644 index 5e0dcde9..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cortabarba-philips-bt-7201-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cortabarba-philips-bt-7201-02.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cortabarba-philips-bt-7201-02.webp deleted file mode 100644 index 7100cc03..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cortabarba-philips-bt-7201-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cortabarba-philips-bt-7201-03.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cortabarba-philips-bt-7201-03.webp deleted file mode 100644 index da39edb3..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cortabarba-philips-bt-7201-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cortacabello-philips-qc-5560-8-posiciones-01.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cortacabello-philips-qc-5560-8-posiciones-01.webp deleted file mode 100644 index 52a604ac..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cortacabello-philips-qc-5560-8-posiciones-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cortacabello-philips-qc-5560-8-posiciones-02.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cortacabello-philips-qc-5560-8-posiciones-02.webp deleted file mode 100644 index 8a86225b..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cortacabello-philips-qc-5560-8-posiciones-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cortacabello-philips-qc-5560-8-posiciones-03.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cortacabello-philips-qc-5560-8-posiciones-03.webp deleted file mode 100644 index 71042b68..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/cortacabello-philips-qc-5560-8-posiciones-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/exprimidor-electrico-liliana-ae-920-citrijug-40-w-01.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/exprimidor-electrico-liliana-ae-920-citrijug-40-w-01.webp deleted file mode 100644 index a84dbe8b..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/exprimidor-electrico-liliana-ae-920-citrijug-40-w-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/exprimidor-electrico-liliana-ae-920-citrijug-40-w-02.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/exprimidor-electrico-liliana-ae-920-citrijug-40-w-02.webp deleted file mode 100644 index 609baac0..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/exprimidor-electrico-liliana-ae-920-citrijug-40-w-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/exprimidor-electrico-liliana-ae-920-citrijug-40-w-03.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/exprimidor-electrico-liliana-ae-920-citrijug-40-w-03.webp deleted file mode 100644 index 3f6b58c1..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/exprimidor-electrico-liliana-ae-920-citrijug-40-w-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/freidora-de-aire-peabody-pe-afd420n-4-2-l-digital-01.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/freidora-de-aire-peabody-pe-afd420n-4-2-l-digital-01.webp deleted file mode 100644 index 12128278..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/freidora-de-aire-peabody-pe-afd420n-4-2-l-digital-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/freidora-de-aire-peabody-pe-afd420n-4-2-l-digital-02.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/freidora-de-aire-peabody-pe-afd420n-4-2-l-digital-02.webp deleted file mode 100644 index f6bbf590..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/freidora-de-aire-peabody-pe-afd420n-4-2-l-digital-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/freidora-de-aire-peabody-pe-afd420n-4-2-l-digital-03.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/freidora-de-aire-peabody-pe-afd420n-4-2-l-digital-03.webp deleted file mode 100644 index d9b64a9d..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/freidora-de-aire-peabody-pe-afd420n-4-2-l-digital-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/freidora-de-aire-peabody-pe-afd420n-4-2-l-digital-04.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/freidora-de-aire-peabody-pe-afd420n-4-2-l-digital-04.webp deleted file mode 100644 index c065f4aa..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/freidora-de-aire-peabody-pe-afd420n-4-2-l-digital-04.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/freidora-de-aire-peabody-pe-afd420n-4-2-l-digital-05.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/freidora-de-aire-peabody-pe-afd420n-4-2-l-digital-05.webp deleted file mode 100644 index 46c2adaf..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/freidora-de-aire-peabody-pe-afd420n-4-2-l-digital-05.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/freidora-de-aire-peabody-pe-afd420n-4-2-l-digital-06.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/freidora-de-aire-peabody-pe-afd420n-4-2-l-digital-06.webp deleted file mode 100644 index 27e46a03..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/freidora-de-aire-peabody-pe-afd420n-4-2-l-digital-06.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/freidora-de-aire-peabody-pe-afd420n-4-2-l-digital-07.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/freidora-de-aire-peabody-pe-afd420n-4-2-l-digital-07.webp deleted file mode 100644 index 9b4865cf..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/freidora-de-aire-peabody-pe-afd420n-4-2-l-digital-07.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/freidora-de-aire-peabody-pe-afd420n-4-2-l-digital-08.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/freidora-de-aire-peabody-pe-afd420n-4-2-l-digital-08.webp deleted file mode 100644 index 357c9b6b..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/freidora-de-aire-peabody-pe-afd420n-4-2-l-digital-08.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/freidora-de-aire-peabody-pe-afg03n-7-l-grill-01.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/freidora-de-aire-peabody-pe-afg03n-7-l-grill-01.webp deleted file mode 100644 index ab463c1a..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/freidora-de-aire-peabody-pe-afg03n-7-l-grill-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/freidora-de-aire-peabody-pe-afg03n-7-l-grill-02.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/freidora-de-aire-peabody-pe-afg03n-7-l-grill-02.webp deleted file mode 100644 index 1d0ee496..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/freidora-de-aire-peabody-pe-afg03n-7-l-grill-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/freidora-de-aire-peabody-pe-afg03n-7-l-grill-03.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/freidora-de-aire-peabody-pe-afg03n-7-l-grill-03.webp deleted file mode 100644 index 129a5307..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/freidora-de-aire-peabody-pe-afg03n-7-l-grill-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/freidora-de-aire-peabody-pe-afg03n-7-l-grill-04.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/freidora-de-aire-peabody-pe-afg03n-7-l-grill-04.webp deleted file mode 100644 index 346f6de9..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/freidora-de-aire-peabody-pe-afg03n-7-l-grill-04.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/freidora-de-aire-peabody-pe-afg03n-7-l-grill-05.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/freidora-de-aire-peabody-pe-afg03n-7-l-grill-05.webp deleted file mode 100644 index 74a34aa4..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/freidora-de-aire-peabody-pe-afg03n-7-l-grill-05.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/juguera-liliana-aj-950-nutrijug-vaso-350-ml-2-velocidades-01.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/juguera-liliana-aj-950-nutrijug-vaso-350-ml-2-velocidades-01.webp deleted file mode 100644 index 682b2e9c..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/juguera-liliana-aj-950-nutrijug-vaso-350-ml-2-velocidades-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/juguera-liliana-aj-950-nutrijug-vaso-350-ml-2-velocidades-02.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/juguera-liliana-aj-950-nutrijug-vaso-350-ml-2-velocidades-02.webp deleted file mode 100644 index e08924c0..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/juguera-liliana-aj-950-nutrijug-vaso-350-ml-2-velocidades-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/juguera-liliana-aj-950-nutrijug-vaso-350-ml-2-velocidades-03.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/juguera-liliana-aj-950-nutrijug-vaso-350-ml-2-velocidades-03.webp deleted file mode 100644 index 8561f7a4..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/juguera-liliana-aj-950-nutrijug-vaso-350-ml-2-velocidades-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/licuadora-electrolux-sba10-personal-600-ml-01.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/licuadora-electrolux-sba10-personal-600-ml-01.webp deleted file mode 100644 index abf5adea..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/licuadora-electrolux-sba10-personal-600-ml-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/licuadora-electrolux-sba10-personal-600-ml-02.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/licuadora-electrolux-sba10-personal-600-ml-02.webp deleted file mode 100644 index 476de4e0..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/licuadora-electrolux-sba10-personal-600-ml-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/licuadora-electrolux-sba10-personal-600-ml-03.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/licuadora-electrolux-sba10-personal-600-ml-03.webp deleted file mode 100644 index 7a9f0f57..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/licuadora-electrolux-sba10-personal-600-ml-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/lustraspiradora-liliana-espejo-ll350-850-w-01.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/lustraspiradora-liliana-espejo-ll350-850-w-01.webp deleted file mode 100644 index bd1e5c56..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/lustraspiradora-liliana-espejo-ll350-850-w-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/lustraspiradora-liliana-espejo-ll350-850-w-02.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/lustraspiradora-liliana-espejo-ll350-850-w-02.webp deleted file mode 100644 index 9d1553b2..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/lustraspiradora-liliana-espejo-ll350-850-w-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/lustraspiradora-liliana-espejo-ll350-850-w-03.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/lustraspiradora-liliana-espejo-ll350-850-w-03.webp deleted file mode 100644 index e50806c3..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/lustraspiradora-liliana-espejo-ll350-850-w-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/mixer-liliana-ah-300-450-w-vaso-01.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/mixer-liliana-ah-300-450-w-vaso-01.webp deleted file mode 100644 index 6b1e983b..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/mixer-liliana-ah-300-450-w-vaso-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/mixer-liliana-ah-300-450-w-vaso-02.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/mixer-liliana-ah-300-450-w-vaso-02.webp deleted file mode 100644 index 8065a087..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/mixer-liliana-ah-300-450-w-vaso-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/mixer-liliana-rainbow-mix-ah-101-2-3-vaso-medidor-01.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/mixer-liliana-rainbow-mix-ah-101-2-3-vaso-medidor-01.webp deleted file mode 100644 index 80d28f17..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/mixer-liliana-rainbow-mix-ah-101-2-3-vaso-medidor-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/mixer-liliana-rainbow-mix-ah-101-2-3-vaso-medidor-02.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/mixer-liliana-rainbow-mix-ah-101-2-3-vaso-medidor-02.webp deleted file mode 100644 index 086d203d..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/mixer-liliana-rainbow-mix-ah-101-2-3-vaso-medidor-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/mixer-philips-hr-2531-50-promix-400-w-vaso-01.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/mixer-philips-hr-2531-50-promix-400-w-vaso-01.webp deleted file mode 100644 index 3c9bb7a9..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/mixer-philips-hr-2531-50-promix-400-w-vaso-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/mixer-philips-hr-2531-50-promix-400-w-vaso-02.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/mixer-philips-hr-2531-50-promix-400-w-vaso-02.webp deleted file mode 100644 index d013ba91..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/mixer-philips-hr-2531-50-promix-400-w-vaso-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/mixer-philips-hr-2531-50-promix-400-w-vaso-03.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/mixer-philips-hr-2531-50-promix-400-w-vaso-03.webp deleted file mode 100644 index 9533df36..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/mixer-philips-hr-2531-50-promix-400-w-vaso-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/mixer-philips-hr-2531-50-promix-400-w-vaso-04.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/mixer-philips-hr-2531-50-promix-400-w-vaso-04.webp deleted file mode 100644 index 3e545e88..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/mixer-philips-hr-2531-50-promix-400-w-vaso-04.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/mixer-philips-hr-2531-50-promix-400-w-vaso-05.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/mixer-philips-hr-2531-50-promix-400-w-vaso-05.webp deleted file mode 100644 index fd3554e6..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/mixer-philips-hr-2531-50-promix-400-w-vaso-05.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/mixer-philips-hr-2531-50-promix-400-w-vaso-06.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/mixer-philips-hr-2531-50-promix-400-w-vaso-06.webp deleted file mode 100644 index 2ad6c050..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/mixer-philips-hr-2531-50-promix-400-w-vaso-06.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/mixer-philips-hr-2531-50-promix-400-w-vaso-07.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/mixer-philips-hr-2531-50-promix-400-w-vaso-07.webp deleted file mode 100644 index 080c974d..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/mixer-philips-hr-2531-50-promix-400-w-vaso-07.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/multiprocesadora-liliana-am-700-simplix-700-w-01.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/multiprocesadora-liliana-am-700-simplix-700-w-01.webp deleted file mode 100644 index 1f59478a..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/multiprocesadora-liliana-am-700-simplix-700-w-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/multiprocesadora-liliana-am-700-simplix-700-w-02.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/multiprocesadora-liliana-am-700-simplix-700-w-02.webp deleted file mode 100644 index 9bb66fce..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/multiprocesadora-liliana-am-700-simplix-700-w-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/multiprocesadora-liliana-am-700-simplix-700-w-03.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/multiprocesadora-liliana-am-700-simplix-700-w-03.webp deleted file mode 100644 index bf219557..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/multiprocesadora-liliana-am-700-simplix-700-w-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-atma-pe-0821ap-nap-1-7-l-01.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-atma-pe-0821ap-nap-1-7-l-01.webp deleted file mode 100644 index e2a9354e..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-atma-pe-0821ap-nap-1-7-l-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-atma-pe-0821ap-nap-1-7-l-02.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-atma-pe-0821ap-nap-1-7-l-02.webp deleted file mode 100644 index 5a16a2b4..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-atma-pe-0821ap-nap-1-7-l-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-atma-pe-0821ap-nap-1-7-l-03.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-atma-pe-0821ap-nap-1-7-l-03.webp deleted file mode 100644 index 0967dc5d..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-atma-pe-0821ap-nap-1-7-l-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-atma-ped23mp-disney-vintage-01.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-atma-ped23mp-disney-vintage-01.webp deleted file mode 100644 index 5e8f35e2..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-atma-ped23mp-disney-vintage-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-atma-ped23mp-disney-vintage-02.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-atma-ped23mp-disney-vintage-02.webp deleted file mode 100644 index 66789efd..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-atma-ped23mp-disney-vintage-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-atma-ped23mp-disney-vintage-03.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-atma-ped23mp-disney-vintage-03.webp deleted file mode 100644 index cae74f5f..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-atma-ped23mp-disney-vintage-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-atma-ped23mp-disney-vintage-04.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-atma-ped23mp-disney-vintage-04.webp deleted file mode 100644 index 79962934..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-atma-ped23mp-disney-vintage-04.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-atma-ped23mp-disney-vintage-05.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-atma-ped23mp-disney-vintage-05.webp deleted file mode 100644 index 5b6ea358..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-atma-ped23mp-disney-vintage-05.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-gigo-g-17898-sd-1-7-l-digital-cromada-01.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-gigo-g-17898-sd-1-7-l-digital-cromada-01.webp deleted file mode 100644 index b15a7f15..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-gigo-g-17898-sd-1-7-l-digital-cromada-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-gigo-g-17898-sd-1-7-l-digital-cromada-02.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-gigo-g-17898-sd-1-7-l-digital-cromada-02.webp deleted file mode 100644 index aea93045..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-gigo-g-17898-sd-1-7-l-digital-cromada-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-gigo-g-17898-sd-1-7-l-digital-cromada-03.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-gigo-g-17898-sd-1-7-l-digital-cromada-03.webp deleted file mode 100644 index a5494a2a..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-gigo-g-17898-sd-1-7-l-digital-cromada-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-gigo-g-17898-sd-1-7-l-digital-cromada-04.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-gigo-g-17898-sd-1-7-l-digital-cromada-04.webp deleted file mode 100644 index 766f7a71..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-gigo-g-17898-sd-1-7-l-digital-cromada-04.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-gigo-g-17898-sd-1-7-l-digital-cromada-05.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-gigo-g-17898-sd-1-7-l-digital-cromada-05.webp deleted file mode 100644 index f0a46e66..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-gigo-g-17898-sd-1-7-l-digital-cromada-05.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-gigo-g-17898-sd-1-7-l-digital-cromada-06.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-gigo-g-17898-sd-1-7-l-digital-cromada-06.webp deleted file mode 100644 index f5db3d10..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-gigo-g-17898-sd-1-7-l-digital-cromada-06.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-liliana-ap-165-matera-color-negra-01.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-liliana-ap-165-matera-color-negra-01.webp deleted file mode 100644 index 899d47cc..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-liliana-ap-165-matera-color-negra-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-liliana-ap-165-matera-color-negra-02.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-liliana-ap-165-matera-color-negra-02.webp deleted file mode 100644 index a2afcf34..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-liliana-ap-165-matera-color-negra-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-liliana-ap-165-matera-color-negra-03.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-liliana-ap-165-matera-color-negra-03.webp deleted file mode 100644 index c9242e03..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-liliana-ap-165-matera-color-negra-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-liliana-ap-165-matera-color-negra-04.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-liliana-ap-165-matera-color-negra-04.webp deleted file mode 100644 index 8ed63e3c..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-liliana-ap-165-matera-color-negra-04.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-liliana-ap-200-infustyle-1-7-l-01.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-liliana-ap-200-infustyle-1-7-l-01.webp deleted file mode 100644 index d88aec9a..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-liliana-ap-200-infustyle-1-7-l-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-liliana-ap-200-infustyle-1-7-l-02.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-liliana-ap-200-infustyle-1-7-l-02.webp deleted file mode 100644 index 5f6c141e..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-liliana-ap-200-infustyle-1-7-l-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-liliana-ap-200-infustyle-1-7-l-03.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-liliana-ap-200-infustyle-1-7-l-03.webp deleted file mode 100644 index c898b274..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-liliana-ap-200-infustyle-1-7-l-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-liliana-ap-200-infustyle-1-7-l-04.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-liliana-ap-200-infustyle-1-7-l-04.webp deleted file mode 100644 index ebaf4246..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-liliana-ap-200-infustyle-1-7-l-04.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-liliana-ap-200-infustyle-1-7-l-05.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-liliana-ap-200-infustyle-1-7-l-05.webp deleted file mode 100644 index 336e3879..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pava-electrica-liliana-ap-200-infustyle-1-7-l-05.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/picadora-moulinex-ad-6011ar-750-w-blanca-01.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/picadora-moulinex-ad-6011ar-750-w-blanca-01.webp deleted file mode 100644 index a6417a45..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/picadora-moulinex-ad-6011ar-750-w-blanca-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/picadora-moulinex-ad-6011ar-750-w-blanca-02.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/picadora-moulinex-ad-6011ar-750-w-blanca-02.webp deleted file mode 100644 index 2367d60d..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/picadora-moulinex-ad-6011ar-750-w-blanca-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/picadora-moulinex-ad-6011ar-750-w-blanca-03.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/picadora-moulinex-ad-6011ar-750-w-blanca-03.webp deleted file mode 100644 index c8bc06bf..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/picadora-moulinex-ad-6011ar-750-w-blanca-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/picadora-moulinex-ad-6011ar-750-w-blanca-04.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/picadora-moulinex-ad-6011ar-750-w-blanca-04.webp deleted file mode 100644 index 192d8fee..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/picadora-moulinex-ad-6011ar-750-w-blanca-04.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/picadora-moulinex-ad-6011ar-750-w-blanca-05.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/picadora-moulinex-ad-6011ar-750-w-blanca-05.webp deleted file mode 100644 index ff3b5589..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/picadora-moulinex-ad-6011ar-750-w-blanca-05.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/picadora-moulinex-ad-6011ar-750-w-blanca-06.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/picadora-moulinex-ad-6011ar-750-w-blanca-06.webp deleted file mode 100644 index fadef21f..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/picadora-moulinex-ad-6011ar-750-w-blanca-06.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/picadora-moulinex-ad-6011ar-750-w-blanca-07.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/picadora-moulinex-ad-6011ar-750-w-blanca-07.webp deleted file mode 100644 index 86f8655e..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/picadora-moulinex-ad-6011ar-750-w-blanca-07.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/plancha-vapor-philips-gc-1022-40-2000-w-01.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/plancha-vapor-philips-gc-1022-40-2000-w-01.webp deleted file mode 100644 index ab4624f3..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/plancha-vapor-philips-gc-1022-40-2000-w-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/plancha-vapor-philips-gc-1022-40-2000-w-02.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/plancha-vapor-philips-gc-1022-40-2000-w-02.webp deleted file mode 100644 index 3e357b4c..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/plancha-vapor-philips-gc-1022-40-2000-w-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/plancha-vapor-philips-gc-1022-40-2000-w-03.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/plancha-vapor-philips-gc-1022-40-2000-w-03.webp deleted file mode 100644 index f99c419b..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/plancha-vapor-philips-gc-1022-40-2000-w-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pochoclera-atma-po-at9801dnp-disney-mickey-01.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pochoclera-atma-po-at9801dnp-disney-mickey-01.webp deleted file mode 100644 index 93293187..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pochoclera-atma-po-at9801dnp-disney-mickey-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pochoclera-atma-po-at9801dnp-disney-mickey-02.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pochoclera-atma-po-at9801dnp-disney-mickey-02.webp deleted file mode 100644 index b67e53cf..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pochoclera-atma-po-at9801dnp-disney-mickey-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pochoclera-atma-po-at9801dnp-disney-mickey-03.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pochoclera-atma-po-at9801dnp-disney-mickey-03.webp deleted file mode 100644 index 10fdb8f8..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pochoclera-atma-po-at9801dnp-disney-mickey-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pochoclera-atma-po-at9801dnp-disney-mickey-04.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pochoclera-atma-po-at9801dnp-disney-mickey-04.webp deleted file mode 100644 index 6dff54c7..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pochoclera-atma-po-at9801dnp-disney-mickey-04.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pochoclera-atma-po-at9801dnp-disney-mickey-05.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pochoclera-atma-po-at9801dnp-disney-mickey-05.webp deleted file mode 100644 index a715082d..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/pochoclera-atma-po-at9801dnp-disney-mickey-05.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/secador-cabello-atma-sp-8970-classic-3-velocidades-01.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/secador-cabello-atma-sp-8970-classic-3-velocidades-01.webp deleted file mode 100644 index 1c6c8004..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/secador-cabello-atma-sp-8970-classic-3-velocidades-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/secador-cabello-atma-sp-8970-classic-3-velocidades-02.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/secador-cabello-atma-sp-8970-classic-3-velocidades-02.webp deleted file mode 100644 index e98f5579..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/secador-cabello-atma-sp-8970-classic-3-velocidades-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/secador-cabello-gama-9465-brillant-blue-titanium-01.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/secador-cabello-gama-9465-brillant-blue-titanium-01.webp deleted file mode 100644 index 9e2bda0d..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/secador-cabello-gama-9465-brillant-blue-titanium-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/secador-cabello-gama-9465-brillant-blue-titanium-02.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/secador-cabello-gama-9465-brillant-blue-titanium-02.webp deleted file mode 100644 index a7cf84a0..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/secador-cabello-gama-9465-brillant-blue-titanium-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/secador-cabello-gama-9465-brillant-blue-titanium-03.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/secador-cabello-gama-9465-brillant-blue-titanium-03.webp deleted file mode 100644 index ff06c3b3..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/secador-cabello-gama-9465-brillant-blue-titanium-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/secador-cabello-philips-bhd-302-10-1600-w-01.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/secador-cabello-philips-bhd-302-10-1600-w-01.webp deleted file mode 100644 index 878bd970..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/secador-cabello-philips-bhd-302-10-1600-w-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/secador-cabello-philips-bhd-302-10-1600-w-02.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/secador-cabello-philips-bhd-302-10-1600-w-02.webp deleted file mode 100644 index 6e7628e0..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/secador-cabello-philips-bhd-302-10-1600-w-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/secador-cabello-philips-bhd-302-10-1600-w-03.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/secador-cabello-philips-bhd-302-10-1600-w-03.webp deleted file mode 100644 index fe78f005..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/secador-cabello-philips-bhd-302-10-1600-w-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/tostadora-atma-toat-21vcp-vintage-color-crema-01.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/tostadora-atma-toat-21vcp-vintage-color-crema-01.webp deleted file mode 100644 index 2486b6d0..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/tostadora-atma-toat-21vcp-vintage-color-crema-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/tostadora-atma-toat-21vcp-vintage-color-crema-02.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/tostadora-atma-toat-21vcp-vintage-color-crema-02.webp deleted file mode 100644 index 849d15a7..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/tostadora-atma-toat-21vcp-vintage-color-crema-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/tostadora-atma-toat-21vcp-vintage-color-crema-03.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/tostadora-atma-toat-21vcp-vintage-color-crema-03.webp deleted file mode 100644 index c5924b26..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/tostadora-atma-toat-21vcp-vintage-color-crema-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/tostadora-atma-toat-21vcp-vintage-color-crema-04.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/tostadora-atma-toat-21vcp-vintage-color-crema-04.webp deleted file mode 100644 index 528da9e5..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/tostadora-atma-toat-21vcp-vintage-color-crema-04.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/tostadora-oster-tr500-acero-inoxidable-01.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/tostadora-oster-tr500-acero-inoxidable-01.webp deleted file mode 100644 index e54f4007..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/tostadora-oster-tr500-acero-inoxidable-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/tostadora-oster-tr500-acero-inoxidable-02.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/tostadora-oster-tr500-acero-inoxidable-02.webp deleted file mode 100644 index 94a14f83..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/tostadora-oster-tr500-acero-inoxidable-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/tostadora-oster-tr500-acero-inoxidable-03.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/tostadora-oster-tr500-acero-inoxidable-03.webp deleted file mode 100644 index dc1f5cf5..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/tostadora-oster-tr500-acero-inoxidable-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/tostadora-oster-tr500-acero-inoxidable-04.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/tostadora-oster-tr500-acero-inoxidable-04.webp deleted file mode 100644 index 3c022bd3..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/tostadora-oster-tr500-acero-inoxidable-04.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/waflera-atma-ws-027drn-disney-2-en-1-01.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/waflera-atma-ws-027drn-disney-2-en-1-01.webp deleted file mode 100644 index e272083a..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/waflera-atma-ws-027drn-disney-2-en-1-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/waflera-atma-ws-027drn-disney-2-en-1-02.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/waflera-atma-ws-027drn-disney-2-en-1-02.webp deleted file mode 100644 index 351c95a8..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/waflera-atma-ws-027drn-disney-2-en-1-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/waflera-atma-ws-027drn-disney-2-en-1-03.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/waflera-atma-ws-027drn-disney-2-en-1-03.webp deleted file mode 100644 index 2a2848d6..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/waflera-atma-ws-027drn-disney-2-en-1-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/waflera-atma-ws-027drn-disney-2-en-1-04.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/waflera-atma-ws-027drn-disney-2-en-1-04.webp deleted file mode 100644 index d1548868..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/waflera-atma-ws-027drn-disney-2-en-1-04.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/waflera-atma-ws-027drn-disney-2-en-1-05.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/waflera-atma-ws-027drn-disney-2-en-1-05.webp deleted file mode 100644 index efd2f697..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/waflera-atma-ws-027drn-disney-2-en-1-05.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/waflera-atma-ws-027drn-disney-2-en-1-06.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/waflera-atma-ws-027drn-disney-2-en-1-06.webp deleted file mode 100644 index 9b8317f1..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/waflera-atma-ws-027drn-disney-2-en-1-06.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/waflera-atma-ws-027drn-disney-2-en-1-07.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/waflera-atma-ws-027drn-disney-2-en-1-07.webp deleted file mode 100644 index bf1f871a..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/waflera-atma-ws-027drn-disney-2-en-1-07.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/waflera-atma-ws-027drn-disney-2-en-1-08.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/waflera-atma-ws-027drn-disney-2-en-1-08.webp deleted file mode 100644 index f7101f8b..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/waflera-atma-ws-027drn-disney-2-en-1-08.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/waflera-atma-ws-027drn-disney-2-en-1-09.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/waflera-atma-ws-027drn-disney-2-en-1-09.webp deleted file mode 100644 index 1ca2f98d..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/waflera-atma-ws-027drn-disney-2-en-1-09.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/waflera-atma-ws-027drn-disney-2-en-1-10.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/waflera-atma-ws-027drn-disney-2-en-1-10.webp deleted file mode 100644 index e0553b9f..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/waflera-atma-ws-027drn-disney-2-en-1-10.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/yogurtera-atma-ym3010p-7-porciones-01.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/yogurtera-atma-ym3010p-7-porciones-01.webp deleted file mode 100644 index 7a46a291..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/yogurtera-atma-ym3010p-7-porciones-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/yogurtera-atma-ym3010p-7-porciones-02.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/yogurtera-atma-ym3010p-7-porciones-02.webp deleted file mode 100644 index 5986405e..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/yogurtera-atma-ym3010p-7-porciones-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/yogurtera-atma-ym3010p-7-porciones-03.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/yogurtera-atma-ym3010p-7-porciones-03.webp deleted file mode 100644 index 2eed7e82..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/yogurtera-atma-ym3010p-7-porciones-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/yogurtera-atma-ym3010p-7-porciones-04.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/yogurtera-atma-ym3010p-7-porciones-04.webp deleted file mode 100644 index ddb2a5b9..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/yogurtera-atma-ym3010p-7-porciones-04.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/yogurtera-atma-ym3010p-7-porciones-05.webp b/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/yogurtera-atma-ym3010p-7-porciones-05.webp deleted file mode 100644 index 33e4fc6d..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/electrodomesticos-pequenos/yogurtera-atma-ym3010p-7-porciones-05.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/heladeras/heladera-gafa-hgf-358-afb-282-litros-blanca-01.webp b/public/images/tennants/mutual_smep/catalog/heladeras/heladera-gafa-hgf-358-afb-282-litros-blanca-01.webp deleted file mode 100644 index 193b6248..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/heladeras/heladera-gafa-hgf-358-afb-282-litros-blanca-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/heladeras/heladera-gafa-hgf-358-afb-282-litros-blanca-02.webp b/public/images/tennants/mutual_smep/catalog/heladeras/heladera-gafa-hgf-358-afb-282-litros-blanca-02.webp deleted file mode 100644 index 9b3a01d5..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/heladeras/heladera-gafa-hgf-358-afb-282-litros-blanca-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/heladeras/heladera-gafa-hgf-358-afb-282-litros-blanca-03.webp b/public/images/tennants/mutual_smep/catalog/heladeras/heladera-gafa-hgf-358-afb-282-litros-blanca-03.webp deleted file mode 100644 index 3bd925f8..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/heladeras/heladera-gafa-hgf-358-afb-282-litros-blanca-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/heladeras/heladera-gafa-hgf-358-afb-282-litros-blanca-04.webp b/public/images/tennants/mutual_smep/catalog/heladeras/heladera-gafa-hgf-358-afb-282-litros-blanca-04.webp deleted file mode 100644 index 02dd6c50..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/heladeras/heladera-gafa-hgf-358-afb-282-litros-blanca-04.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/heladeras/heladera-gafa-hgf-368afp-330-lt-color-plata-01.webp b/public/images/tennants/mutual_smep/catalog/heladeras/heladera-gafa-hgf-368afp-330-lt-color-plata-01.webp deleted file mode 100644 index e0c21a56..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/heladeras/heladera-gafa-hgf-368afp-330-lt-color-plata-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/heladeras/heladera-gafa-hgf-368afp-330-lt-color-plata-02.webp b/public/images/tennants/mutual_smep/catalog/heladeras/heladera-gafa-hgf-368afp-330-lt-color-plata-02.webp deleted file mode 100644 index 65a18882..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/heladeras/heladera-gafa-hgf-368afp-330-lt-color-plata-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/heladeras/heladera-gafa-hgf-368afp-330-lt-color-plata-03.webp b/public/images/tennants/mutual_smep/catalog/heladeras/heladera-gafa-hgf-368afp-330-lt-color-plata-03.webp deleted file mode 100644 index fd62f7d5..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/heladeras/heladera-gafa-hgf-368afp-330-lt-color-plata-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/heladeras/heladera-gafa-hgf-368afp-330-lt-color-plata-04.webp b/public/images/tennants/mutual_smep/catalog/heladeras/heladera-gafa-hgf-368afp-330-lt-color-plata-04.webp deleted file mode 100644 index 1779e2b7..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/heladeras/heladera-gafa-hgf-368afp-330-lt-color-plata-04.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/heladeras/heladera-gafa-hgf-368afp-330-lt-color-plata-05.webp b/public/images/tennants/mutual_smep/catalog/heladeras/heladera-gafa-hgf-368afp-330-lt-color-plata-05.webp deleted file mode 100644 index 7e5144ef..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/heladeras/heladera-gafa-hgf-368afp-330-lt-color-plata-05.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/heladeras/heladera-gafa-hgf-388-afb-374-litros-blanca-01.webp b/public/images/tennants/mutual_smep/catalog/heladeras/heladera-gafa-hgf-388-afb-374-litros-blanca-01.webp deleted file mode 100644 index e94b2bb1..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/heladeras/heladera-gafa-hgf-388-afb-374-litros-blanca-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/heladeras/heladera-gafa-hgf-388-afb-374-litros-blanca-02.webp b/public/images/tennants/mutual_smep/catalog/heladeras/heladera-gafa-hgf-388-afb-374-litros-blanca-02.webp deleted file mode 100644 index b54448f0..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/heladeras/heladera-gafa-hgf-388-afb-374-litros-blanca-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/heladeras/heladera-gafa-hgf-388-afb-374-litros-blanca-03.webp b/public/images/tennants/mutual_smep/catalog/heladeras/heladera-gafa-hgf-388-afb-374-litros-blanca-03.webp deleted file mode 100644 index 9f20d5ac..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/heladeras/heladera-gafa-hgf-388-afb-374-litros-blanca-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/heladeras/heladera-gafa-hgf-388-afb-374-litros-blanca-04.webp b/public/images/tennants/mutual_smep/catalog/heladeras/heladera-gafa-hgf-388-afb-374-litros-blanca-04.webp deleted file mode 100644 index 30684dc8..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/heladeras/heladera-gafa-hgf-388-afb-374-litros-blanca-04.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/heladeras/heladera-gafa-hgf-388-afb-374-litros-blanca-05.webp b/public/images/tennants/mutual_smep/catalog/heladeras/heladera-gafa-hgf-388-afb-374-litros-blanca-05.webp deleted file mode 100644 index 757420ef..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/heladeras/heladera-gafa-hgf-388-afb-374-litros-blanca-05.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/heladeras/heladera-no-frost-gafa-hgnf333p-inverter-356-l-plata-01.webp b/public/images/tennants/mutual_smep/catalog/heladeras/heladera-no-frost-gafa-hgnf333p-inverter-356-l-plata-01.webp deleted file mode 100644 index 90df32be..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/heladeras/heladera-no-frost-gafa-hgnf333p-inverter-356-l-plata-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/heladeras/heladera-no-frost-gafa-hgnf333p-inverter-356-l-plata-02.webp b/public/images/tennants/mutual_smep/catalog/heladeras/heladera-no-frost-gafa-hgnf333p-inverter-356-l-plata-02.webp deleted file mode 100644 index e6abe124..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/heladeras/heladera-no-frost-gafa-hgnf333p-inverter-356-l-plata-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/heladeras/heladera-no-frost-gafa-hgnf333p-inverter-356-l-plata-03.webp b/public/images/tennants/mutual_smep/catalog/heladeras/heladera-no-frost-gafa-hgnf333p-inverter-356-l-plata-03.webp deleted file mode 100644 index becba7b7..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/heladeras/heladera-no-frost-gafa-hgnf333p-inverter-356-l-plata-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/heladeras/heladera-no-frost-gafa-hgnf333p-inverter-356-l-plata-04.webp b/public/images/tennants/mutual_smep/catalog/heladeras/heladera-no-frost-gafa-hgnf333p-inverter-356-l-plata-04.webp deleted file mode 100644 index 6c1ce023..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/heladeras/heladera-no-frost-gafa-hgnf333p-inverter-356-l-plata-04.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/heladeras/heladera-no-frost-gafa-hgnf333p-inverter-356-l-plata-05.webp b/public/images/tennants/mutual_smep/catalog/heladeras/heladera-no-frost-gafa-hgnf333p-inverter-356-l-plata-05.webp deleted file mode 100644 index ff694055..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/heladeras/heladera-no-frost-gafa-hgnf333p-inverter-356-l-plata-05.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/heladeras/heladera-no-frost-gafa-hgnf333p-inverter-356-l-plata-06.webp b/public/images/tennants/mutual_smep/catalog/heladeras/heladera-no-frost-gafa-hgnf333p-inverter-356-l-plata-06.webp deleted file mode 100644 index 1f287e0b..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/heladeras/heladera-no-frost-gafa-hgnf333p-inverter-356-l-plata-06.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/heladeras/heladera-no-frost-gafa-hgnf333p-inverter-356-l-plata-07.webp b/public/images/tennants/mutual_smep/catalog/heladeras/heladera-no-frost-gafa-hgnf333p-inverter-356-l-plata-07.webp deleted file mode 100644 index 62e6a724..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/heladeras/heladera-no-frost-gafa-hgnf333p-inverter-356-l-plata-07.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-drean-concept-5-05-v1-5-kg-500-rpm-01.webp b/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-drean-concept-5-05-v1-5-kg-500-rpm-01.webp deleted file mode 100644 index 12a9c98c..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-drean-concept-5-05-v1-5-kg-500-rpm-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-drean-concept-5-05-v1-5-kg-500-rpm-02.webp b/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-drean-concept-5-05-v1-5-kg-500-rpm-02.webp deleted file mode 100644 index 94ce6caf..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-drean-concept-5-05-v1-5-kg-500-rpm-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-drean-concept-5-05-v1-5-kg-500-rpm-03.webp b/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-drean-concept-5-05-v1-5-kg-500-rpm-03.webp deleted file mode 100644 index 576f27f2..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-drean-concept-5-05-v1-5-kg-500-rpm-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-drean-concept-5-05-v1-5-kg-500-rpm-04.webp b/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-drean-concept-5-05-v1-5-kg-500-rpm-04.webp deleted file mode 100644 index e3aae8d5..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-drean-concept-5-05-v1-5-kg-500-rpm-04.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-drean-concept-5-05-v1-5-kg-500-rpm-05.webp b/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-drean-concept-5-05-v1-5-kg-500-rpm-05.webp deleted file mode 100644 index e329f450..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-drean-concept-5-05-v1-5-kg-500-rpm-05.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-gafa-fuzzy-fit-7-kg-760-rpm-color-blanco-01.webp b/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-gafa-fuzzy-fit-7-kg-760-rpm-color-blanco-01.webp deleted file mode 100644 index 009eb3e2..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-gafa-fuzzy-fit-7-kg-760-rpm-color-blanco-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-gafa-fuzzy-fit-7-kg-760-rpm-color-blanco-02.webp b/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-gafa-fuzzy-fit-7-kg-760-rpm-color-blanco-02.webp deleted file mode 100644 index edaa80e9..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-gafa-fuzzy-fit-7-kg-760-rpm-color-blanco-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-gafa-fuzzy-fit-7-kg-760-rpm-color-blanco-03.webp b/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-gafa-fuzzy-fit-7-kg-760-rpm-color-blanco-03.webp deleted file mode 100644 index 8bada323..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-gafa-fuzzy-fit-7-kg-760-rpm-color-blanco-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-gafa-fuzzy-fit-7-kg-760-rpm-color-blanco-04.webp b/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-gafa-fuzzy-fit-7-kg-760-rpm-color-blanco-04.webp deleted file mode 100644 index 56c44fd0..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-gafa-fuzzy-fit-7-kg-760-rpm-color-blanco-04.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-gafa-fuzzy-fit-7-kg-760-rpm-color-blanco-05.webp b/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-gafa-fuzzy-fit-7-kg-760-rpm-color-blanco-05.webp deleted file mode 100644 index bf732f52..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-gafa-fuzzy-fit-7-kg-760-rpm-color-blanco-05.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-gafa-fuzzy-fit-7-kg-760-rpm-color-blanco-06.webp b/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-gafa-fuzzy-fit-7-kg-760-rpm-color-blanco-06.webp deleted file mode 100644 index 1f19b636..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-gafa-fuzzy-fit-7-kg-760-rpm-color-blanco-06.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-philco-phlf-6510b2-6-5-kg-1000-rpm-blanco-01.webp b/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-philco-phlf-6510b2-6-5-kg-1000-rpm-blanco-01.webp deleted file mode 100644 index 41bc281e..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-philco-phlf-6510b2-6-5-kg-1000-rpm-blanco-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-philco-phlf-6510b2-6-5-kg-1000-rpm-blanco-02.webp b/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-philco-phlf-6510b2-6-5-kg-1000-rpm-blanco-02.webp deleted file mode 100644 index 5f3bb56e..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-philco-phlf-6510b2-6-5-kg-1000-rpm-blanco-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-philco-phlf-6510b2-6-5-kg-1000-rpm-blanco-03.webp b/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-philco-phlf-6510b2-6-5-kg-1000-rpm-blanco-03.webp deleted file mode 100644 index 3953ca54..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-philco-phlf-6510b2-6-5-kg-1000-rpm-blanco-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-philco-phlf-6510b2-6-5-kg-1000-rpm-blanco-04.webp b/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-philco-phlf-6510b2-6-5-kg-1000-rpm-blanco-04.webp deleted file mode 100644 index 82d659d9..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-philco-phlf-6510b2-6-5-kg-1000-rpm-blanco-04.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-philco-phlf-6510b2-6-5-kg-1000-rpm-blanco-05.webp b/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-philco-phlf-6510b2-6-5-kg-1000-rpm-blanco-05.webp deleted file mode 100644 index c102adc8..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-philco-phlf-6510b2-6-5-kg-1000-rpm-blanco-05.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-philco-phlf-6510b2-6-5-kg-1000-rpm-blanco-06.webp b/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-philco-phlf-6510b2-6-5-kg-1000-rpm-blanco-06.webp deleted file mode 100644 index e053cbac..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-philco-phlf-6510b2-6-5-kg-1000-rpm-blanco-06.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-samsung-ww65-6-5-kg-1000-rpm-blanco-01.webp b/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-samsung-ww65-6-5-kg-1000-rpm-blanco-01.webp deleted file mode 100644 index 3d807685..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-samsung-ww65-6-5-kg-1000-rpm-blanco-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-samsung-ww65-6-5-kg-1000-rpm-blanco-02.webp b/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-samsung-ww65-6-5-kg-1000-rpm-blanco-02.webp deleted file mode 100644 index 1cf217d3..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-samsung-ww65-6-5-kg-1000-rpm-blanco-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-samsung-ww65-6-5-kg-1000-rpm-blanco-03.webp b/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-samsung-ww65-6-5-kg-1000-rpm-blanco-03.webp deleted file mode 100644 index 672fc8fe..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-samsung-ww65-6-5-kg-1000-rpm-blanco-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-samsung-ww65-6-5-kg-1000-rpm-blanco-04.webp b/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-samsung-ww65-6-5-kg-1000-rpm-blanco-04.webp deleted file mode 100644 index 6d1a7f67..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-samsung-ww65-6-5-kg-1000-rpm-blanco-04.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-samsung-ww65-6-5-kg-1000-rpm-blanco-05.webp b/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-samsung-ww65-6-5-kg-1000-rpm-blanco-05.webp deleted file mode 100644 index 7cd833b1..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/lavarropas-automatico-samsung-ww65-6-5-kg-1000-rpm-blanco-05.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/secarropas-kohinoor-a-665-acero-inoxidable-6-5-kg-01.webp b/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/secarropas-kohinoor-a-665-acero-inoxidable-6-5-kg-01.webp deleted file mode 100644 index 984b5f3d..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/secarropas-kohinoor-a-665-acero-inoxidable-6-5-kg-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/secarropas-kohinoor-a-665-acero-inoxidable-6-5-kg-02.webp b/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/secarropas-kohinoor-a-665-acero-inoxidable-6-5-kg-02.webp deleted file mode 100644 index 607f83e5..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/secarropas-kohinoor-a-665-acero-inoxidable-6-5-kg-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/secarropas-kohinoor-a-665-acero-inoxidable-6-5-kg-03.webp b/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/secarropas-kohinoor-a-665-acero-inoxidable-6-5-kg-03.webp deleted file mode 100644 index 571b9b96..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/lavarropas-automaticos/secarropas-kohinoor-a-665-acero-inoxidable-6-5-kg-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/horno-electrico-25l-bgh-bhe-25m25i-duo-negro-01.webp b/public/images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/horno-electrico-25l-bgh-bhe-25m25i-duo-negro-01.webp deleted file mode 100644 index 1f2a03c7..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/horno-electrico-25l-bgh-bhe-25m25i-duo-negro-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/horno-electrico-25l-bgh-bhe-25m25i-duo-negro-02.webp b/public/images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/horno-electrico-25l-bgh-bhe-25m25i-duo-negro-02.webp deleted file mode 100644 index ce8662bf..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/horno-electrico-25l-bgh-bhe-25m25i-duo-negro-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/horno-electrico-25l-bgh-bhe-25m25i-duo-negro-03.webp b/public/images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/horno-electrico-25l-bgh-bhe-25m25i-duo-negro-03.webp deleted file mode 100644 index 319f9a64..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/horno-electrico-25l-bgh-bhe-25m25i-duo-negro-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/horno-electrico-atma-grill-40-litros-c-2-anafes-hg-4022api-01.webp b/public/images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/horno-electrico-atma-grill-40-litros-c-2-anafes-hg-4022api-01.webp deleted file mode 100644 index 3d19d503..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/horno-electrico-atma-grill-40-litros-c-2-anafes-hg-4022api-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/horno-electrico-atma-grill-40-litros-c-2-anafes-hg-4022api-02.webp b/public/images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/horno-electrico-atma-grill-40-litros-c-2-anafes-hg-4022api-02.webp deleted file mode 100644 index f0c4e0a2..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/horno-electrico-atma-grill-40-litros-c-2-anafes-hg-4022api-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/horno-electrico-atma-grill-40-litros-c-2-anafes-hg-4022api-03.webp b/public/images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/horno-electrico-atma-grill-40-litros-c-2-anafes-hg-4022api-03.webp deleted file mode 100644 index 103b8934..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/horno-electrico-atma-grill-40-litros-c-2-anafes-hg-4022api-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/horno-electrico-atma-grill-40-litros-c-2-anafes-hg-4022api-04.webp b/public/images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/horno-electrico-atma-grill-40-litros-c-2-anafes-hg-4022api-04.webp deleted file mode 100644 index 4cea50e6..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/horno-electrico-atma-grill-40-litros-c-2-anafes-hg-4022api-04.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/horno-electrico-atma-grill-40-litros-c-2-anafes-hg-4022api-05.webp b/public/images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/horno-electrico-atma-grill-40-litros-c-2-anafes-hg-4022api-05.webp deleted file mode 100644 index 853a8fe1..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/horno-electrico-atma-grill-40-litros-c-2-anafes-hg-4022api-05.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/horno-electrico-atma-grill-40-litros-c-2-anafes-hg-4022api-06.webp b/public/images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/horno-electrico-atma-grill-40-litros-c-2-anafes-hg-4022api-06.webp deleted file mode 100644 index b749f175..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/horno-electrico-atma-grill-40-litros-c-2-anafes-hg-4022api-06.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/microondas-bgh-28-l-bgh-b-228ds20i-plata-digital-con-grill-01.webp b/public/images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/microondas-bgh-28-l-bgh-b-228ds20i-plata-digital-con-grill-01.webp deleted file mode 100644 index ec1d5a62..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/microondas-bgh-28-l-bgh-b-228ds20i-plata-digital-con-grill-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/microondas-bgh-28-l-bgh-b-228ds20i-plata-digital-con-grill-02.webp b/public/images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/microondas-bgh-28-l-bgh-b-228ds20i-plata-digital-con-grill-02.webp deleted file mode 100644 index 2d1810b7..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/microondas-bgh-28-l-bgh-b-228ds20i-plata-digital-con-grill-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/microondas-bgh-28-l-bgh-b-228ds20i-plata-digital-con-grill-03.webp b/public/images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/microondas-bgh-28-l-bgh-b-228ds20i-plata-digital-con-grill-03.webp deleted file mode 100644 index c9d63d7e..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/microondas-bgh-28-l-bgh-b-228ds20i-plata-digital-con-grill-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/microondas-samsung-mg23-f3k3tak-23-litros-grill-color-negro-01.webp b/public/images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/microondas-samsung-mg23-f3k3tak-23-litros-grill-color-negro-01.webp deleted file mode 100644 index 82bb4e1c..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/microondas-samsung-mg23-f3k3tak-23-litros-grill-color-negro-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/microondas-samsung-mg23-f3k3tak-23-litros-grill-color-negro-02.webp b/public/images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/microondas-samsung-mg23-f3k3tak-23-litros-grill-color-negro-02.webp deleted file mode 100644 index 0eeb20a6..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/microondas-samsung-mg23-f3k3tak-23-litros-grill-color-negro-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/microondas-samsung-mg23-f3k3tak-23-litros-grill-color-negro-03.webp b/public/images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/microondas-samsung-mg23-f3k3tak-23-litros-grill-color-negro-03.webp deleted file mode 100644 index 7f0acdb7..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/microondas-samsung-mg23-f3k3tak-23-litros-grill-color-negro-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/microondas-samsung-mg23-f3k3tak-23-litros-grill-color-negro-04.webp b/public/images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/microondas-samsung-mg23-f3k3tak-23-litros-grill-color-negro-04.webp deleted file mode 100644 index fd39aefc..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/microondas-samsung-mg23-f3k3tak-23-litros-grill-color-negro-04.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/microondas-samsung-mg23-f3k3tak-23-litros-grill-color-negro-05.webp b/public/images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/microondas-samsung-mg23-f3k3tak-23-litros-grill-color-negro-05.webp deleted file mode 100644 index c99157fe..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/microondas-samsung-mg23-f3k3tak-23-litros-grill-color-negro-05.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/microondas-samsung-mg23-f3k3tak-23-litros-grill-color-negro-06.webp b/public/images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/microondas-samsung-mg23-f3k3tak-23-litros-grill-color-negro-06.webp deleted file mode 100644 index f57f7e14..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/microondas-samsung-mg23-f3k3tak-23-litros-grill-color-negro-06.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/microondas-samsung-mg23-f3k3tak-23-litros-grill-color-negro-07.webp b/public/images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/microondas-samsung-mg23-f3k3tak-23-litros-grill-color-negro-07.webp deleted file mode 100644 index 4b50553a..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/microondas-y-hornos-electricos/microondas-samsung-mg23-f3k3tak-23-litros-grill-color-negro-07.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-acer-aspire-7-i5-13420h-512ssd-16gb-15-6-rtx3050-01.webp b/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-acer-aspire-7-i5-13420h-512ssd-16gb-15-6-rtx3050-01.webp deleted file mode 100644 index 37474384..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-acer-aspire-7-i5-13420h-512ssd-16gb-15-6-rtx3050-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-acer-aspire-7-i5-13420h-512ssd-16gb-15-6-rtx3050-02.webp b/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-acer-aspire-7-i5-13420h-512ssd-16gb-15-6-rtx3050-02.webp deleted file mode 100644 index 0343177a..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-acer-aspire-7-i5-13420h-512ssd-16gb-15-6-rtx3050-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-acer-aspire-7-i5-13420h-512ssd-16gb-15-6-rtx3050-03.webp b/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-acer-aspire-7-i5-13420h-512ssd-16gb-15-6-rtx3050-03.webp deleted file mode 100644 index f73f9515..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-acer-aspire-7-i5-13420h-512ssd-16gb-15-6-rtx3050-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-acer-aspire-7-i5-13420h-512ssd-16gb-15-6-rtx3050-04.webp b/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-acer-aspire-7-i5-13420h-512ssd-16gb-15-6-rtx3050-04.webp deleted file mode 100644 index 46dcba5f..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-acer-aspire-7-i5-13420h-512ssd-16gb-15-6-rtx3050-04.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-asus-vivobook-f1504vap-intel-core-7-512gb-ssd-8gb-15-6-touch-win-11-01.webp b/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-asus-vivobook-f1504vap-intel-core-7-512gb-ssd-8gb-15-6-touch-win-11-01.webp deleted file mode 100644 index df244e2d..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-asus-vivobook-f1504vap-intel-core-7-512gb-ssd-8gb-15-6-touch-win-11-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-asus-vivobook-f1504vap-intel-core-7-512gb-ssd-8gb-15-6-touch-win-11-02.webp b/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-asus-vivobook-f1504vap-intel-core-7-512gb-ssd-8gb-15-6-touch-win-11-02.webp deleted file mode 100644 index 151cb7b1..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-asus-vivobook-f1504vap-intel-core-7-512gb-ssd-8gb-15-6-touch-win-11-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-asus-vivobook-f1504vap-intel-core-7-512gb-ssd-8gb-15-6-touch-win-11-03.webp b/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-asus-vivobook-f1504vap-intel-core-7-512gb-ssd-8gb-15-6-touch-win-11-03.webp deleted file mode 100644 index 59b65cce..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-asus-vivobook-f1504vap-intel-core-7-512gb-ssd-8gb-15-6-touch-win-11-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-asus-vivobook-f1504vap-intel-core-7-512gb-ssd-8gb-15-6-touch-win-11-04.webp b/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-asus-vivobook-f1504vap-intel-core-7-512gb-ssd-8gb-15-6-touch-win-11-04.webp deleted file mode 100644 index d5826b1b..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-asus-vivobook-f1504vap-intel-core-7-512gb-ssd-8gb-15-6-touch-win-11-04.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-asus-vivobook-go-15-e1504ga-ws35-intel-core-i3-n305-8-256-gb-win11-01.webp b/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-asus-vivobook-go-15-e1504ga-ws35-intel-core-i3-n305-8-256-gb-win11-01.webp deleted file mode 100644 index 30cf5558..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-asus-vivobook-go-15-e1504ga-ws35-intel-core-i3-n305-8-256-gb-win11-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-asus-vivobook-go-15-e1504ga-ws35-intel-core-i3-n305-8-256-gb-win11-02.webp b/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-asus-vivobook-go-15-e1504ga-ws35-intel-core-i3-n305-8-256-gb-win11-02.webp deleted file mode 100644 index ebaee036..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-asus-vivobook-go-15-e1504ga-ws35-intel-core-i3-n305-8-256-gb-win11-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-asus-vivobook-go-15-e1504ga-ws35-intel-core-i3-n305-8-256-gb-win11-03.webp b/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-asus-vivobook-go-15-e1504ga-ws35-intel-core-i3-n305-8-256-gb-win11-03.webp deleted file mode 100644 index f739b115..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-asus-vivobook-go-15-e1504ga-ws35-intel-core-i3-n305-8-256-gb-win11-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-asus-vivobook-go-15-e1504ga-ws35-intel-core-i3-n305-8-256-gb-win11-04.webp b/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-asus-vivobook-go-15-e1504ga-ws35-intel-core-i3-n305-8-256-gb-win11-04.webp deleted file mode 100644 index afb38dd7..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-asus-vivobook-go-15-e1504ga-ws35-intel-core-i3-n305-8-256-gb-win11-04.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-lenovo-ideapad-slim-3-amd-ryzen-5-8-512gb-ssd-15-6-full-hd-win11-01.webp b/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-lenovo-ideapad-slim-3-amd-ryzen-5-8-512gb-ssd-15-6-full-hd-win11-01.webp deleted file mode 100644 index 71929377..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-lenovo-ideapad-slim-3-amd-ryzen-5-8-512gb-ssd-15-6-full-hd-win11-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-lenovo-ideapad-slim-3-amd-ryzen-5-8-512gb-ssd-15-6-full-hd-win11-02.webp b/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-lenovo-ideapad-slim-3-amd-ryzen-5-8-512gb-ssd-15-6-full-hd-win11-02.webp deleted file mode 100644 index 3680196b..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-lenovo-ideapad-slim-3-amd-ryzen-5-8-512gb-ssd-15-6-full-hd-win11-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-lenovo-ideapad-slim-3-amd-ryzen-5-8-512gb-ssd-15-6-full-hd-win11-03.webp b/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-lenovo-ideapad-slim-3-amd-ryzen-5-8-512gb-ssd-15-6-full-hd-win11-03.webp deleted file mode 100644 index 8b8c4e63..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-lenovo-ideapad-slim-3-amd-ryzen-5-8-512gb-ssd-15-6-full-hd-win11-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-lenovo-ideapad-slim-3-amd-ryzen-5-8-512gb-ssd-15-6-full-hd-win11-04.webp b/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-lenovo-ideapad-slim-3-amd-ryzen-5-8-512gb-ssd-15-6-full-hd-win11-04.webp deleted file mode 100644 index f3cf91f0..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-lenovo-ideapad-slim-3-amd-ryzen-5-8-512gb-ssd-15-6-full-hd-win11-04.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-lenovo-ryzen-7-8840hs-16-512gb-15-6-01.webp b/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-lenovo-ryzen-7-8840hs-16-512gb-15-6-01.webp deleted file mode 100644 index 8817deda..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-lenovo-ryzen-7-8840hs-16-512gb-15-6-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-lenovo-ryzen-7-8840hs-16-512gb-15-6-02.webp b/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-lenovo-ryzen-7-8840hs-16-512gb-15-6-02.webp deleted file mode 100644 index aa671a14..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-lenovo-ryzen-7-8840hs-16-512gb-15-6-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-lenovo-ryzen-7-8840hs-16-512gb-15-6-03.webp b/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-lenovo-ryzen-7-8840hs-16-512gb-15-6-03.webp deleted file mode 100644 index 82dd5cb0..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-lenovo-ryzen-7-8840hs-16-512gb-15-6-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-lenovo-ryzen-7-8840hs-16-512gb-15-6-04.webp b/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-lenovo-ryzen-7-8840hs-16-512gb-15-6-04.webp deleted file mode 100644 index 1864ef85..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-lenovo-ryzen-7-8840hs-16-512gb-15-6-04.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-lenovo-ryzen-7-8840hs-16-512gb-15-6-05.webp b/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-lenovo-ryzen-7-8840hs-16-512gb-15-6-05.webp deleted file mode 100644 index 0c12470c..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-lenovo-ryzen-7-8840hs-16-512gb-15-6-05.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-lenovo-s3-15q8x10-snapdragon-x-512gb-ssd-16gb-ddr5-15-3-win11-01.webp b/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-lenovo-s3-15q8x10-snapdragon-x-512gb-ssd-16gb-ddr5-15-3-win11-01.webp deleted file mode 100644 index b55d0b3a..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-lenovo-s3-15q8x10-snapdragon-x-512gb-ssd-16gb-ddr5-15-3-win11-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-lenovo-s3-15q8x10-snapdragon-x-512gb-ssd-16gb-ddr5-15-3-win11-02.webp b/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-lenovo-s3-15q8x10-snapdragon-x-512gb-ssd-16gb-ddr5-15-3-win11-02.webp deleted file mode 100644 index 39e49e1b..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-lenovo-s3-15q8x10-snapdragon-x-512gb-ssd-16gb-ddr5-15-3-win11-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-lenovo-s3-15q8x10-snapdragon-x-512gb-ssd-16gb-ddr5-15-3-win11-03.webp b/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-lenovo-s3-15q8x10-snapdragon-x-512gb-ssd-16gb-ddr5-15-3-win11-03.webp deleted file mode 100644 index ba304cbb..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-lenovo-s3-15q8x10-snapdragon-x-512gb-ssd-16gb-ddr5-15-3-win11-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-lenovo-s3-15q8x10-snapdragon-x-512gb-ssd-16gb-ddr5-15-3-win11-04.webp b/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-lenovo-s3-15q8x10-snapdragon-x-512gb-ssd-16gb-ddr5-15-3-win11-04.webp deleted file mode 100644 index ddf277af..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-lenovo-s3-15q8x10-snapdragon-x-512gb-ssd-16gb-ddr5-15-3-win11-04.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-lenovo-s3-15q8x10-snapdragon-x-512gb-ssd-16gb-ddr5-15-3-win11-05.webp b/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-lenovo-s3-15q8x10-snapdragon-x-512gb-ssd-16gb-ddr5-15-3-win11-05.webp deleted file mode 100644 index bec13c0c..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-lenovo-s3-15q8x10-snapdragon-x-512gb-ssd-16gb-ddr5-15-3-win11-05.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-lenovo-s3-15q8x10-snapdragon-x-512gb-ssd-16gb-ddr5-15-3-win11-06.webp b/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-lenovo-s3-15q8x10-snapdragon-x-512gb-ssd-16gb-ddr5-15-3-win11-06.webp deleted file mode 100644 index 5b3631f6..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-lenovo-s3-15q8x10-snapdragon-x-512gb-ssd-16gb-ddr5-15-3-win11-06.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-lenovo-s3-15q8x10-snapdragon-x-512gb-ssd-16gb-ddr5-15-3-win11-07.webp b/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-lenovo-s3-15q8x10-snapdragon-x-512gb-ssd-16gb-ddr5-15-3-win11-07.webp deleted file mode 100644 index 2ba07b32..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/notebook-lenovo-s3-15q8x10-snapdragon-x-512gb-ssd-16gb-ddr5-15-3-win11-07.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/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-01.webp b/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/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-01.webp deleted file mode 100644 index 36e85732..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/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-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/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-02.webp b/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/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-02.webp deleted file mode 100644 index 797f2eb9..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/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-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/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-03.webp b/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/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-03.webp deleted file mode 100644 index 47d0d5d4..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/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-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/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-04.webp b/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/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-04.webp deleted file mode 100644 index 1f7af7c0..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/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-04.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/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-05.webp b/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/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-05.webp deleted file mode 100644 index 47573360..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/notebooks-y-tablets/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-05.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/piletas/pileta-pelopincho-1010-01.webp b/public/images/tennants/mutual_smep/catalog/piletas/pileta-pelopincho-1010-01.webp deleted file mode 100644 index ab7aa51e..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/piletas/pileta-pelopincho-1010-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/piletas/pileta-pelopincho-1010-02.webp b/public/images/tennants/mutual_smep/catalog/piletas/pileta-pelopincho-1010-02.webp deleted file mode 100644 index 6aeba940..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/piletas/pileta-pelopincho-1010-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/piletas/pileta-pelopincho-1020-01.webp b/public/images/tennants/mutual_smep/catalog/piletas/pileta-pelopincho-1020-01.webp deleted file mode 100644 index 32941510..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/piletas/pileta-pelopincho-1020-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/piletas/pileta-pelopincho-1020-02.webp b/public/images/tennants/mutual_smep/catalog/piletas/pileta-pelopincho-1020-02.webp deleted file mode 100644 index 0d8291b3..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/piletas/pileta-pelopincho-1020-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/piletas/pileta-pelopincho-1030-01.webp b/public/images/tennants/mutual_smep/catalog/piletas/pileta-pelopincho-1030-01.webp deleted file mode 100644 index a834a53c..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/piletas/pileta-pelopincho-1030-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/piletas/pileta-pelopincho-1030-02.webp b/public/images/tennants/mutual_smep/catalog/piletas/pileta-pelopincho-1030-02.webp deleted file mode 100644 index dc5ac61e..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/piletas/pileta-pelopincho-1030-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/piletas/pileta-pelopincho-1043-01.webp b/public/images/tennants/mutual_smep/catalog/piletas/pileta-pelopincho-1043-01.webp deleted file mode 100644 index c4935406..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/piletas/pileta-pelopincho-1043-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/piletas/pileta-pelopincho-1043-02.webp b/public/images/tennants/mutual_smep/catalog/piletas/pileta-pelopincho-1043-02.webp deleted file mode 100644 index 0bfd285d..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/piletas/pileta-pelopincho-1043-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/piletas/pileta-pelopincho-1055-01.webp b/public/images/tennants/mutual_smep/catalog/piletas/pileta-pelopincho-1055-01.webp deleted file mode 100644 index 0d4d4dd5..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/piletas/pileta-pelopincho-1055-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/piletas/pileta-pelopincho-1055-02.webp b/public/images/tennants/mutual_smep/catalog/piletas/pileta-pelopincho-1055-02.webp deleted file mode 100644 index d9e041fd..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/piletas/pileta-pelopincho-1055-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/purificador-de-aire/purificador-spar-bios-3766-boo-color-blanco-01.webp b/public/images/tennants/mutual_smep/catalog/purificador-de-aire/purificador-spar-bios-3766-boo-color-blanco-01.webp deleted file mode 100644 index a9e6cab6..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/purificador-de-aire/purificador-spar-bios-3766-boo-color-blanco-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/purificador-de-aire/purificador-spar-bios-3766-boo-color-blanco-02.webp b/public/images/tennants/mutual_smep/catalog/purificador-de-aire/purificador-spar-bios-3766-boo-color-blanco-02.webp deleted file mode 100644 index 507312d2..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/purificador-de-aire/purificador-spar-bios-3766-boo-color-blanco-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/purificador-de-aire/purificador-spar-bios-3766-boo-color-blanco-03.webp b/public/images/tennants/mutual_smep/catalog/purificador-de-aire/purificador-spar-bios-3766-boo-color-blanco-03.webp deleted file mode 100644 index a2d83934..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/purificador-de-aire/purificador-spar-bios-3766-boo-color-blanco-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/purificador-de-aire/purificador-tst-360-60-estratto-acero-inox-60-cm-01.webp b/public/images/tennants/mutual_smep/catalog/purificador-de-aire/purificador-tst-360-60-estratto-acero-inox-60-cm-01.webp deleted file mode 100644 index e6891994..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/purificador-de-aire/purificador-tst-360-60-estratto-acero-inox-60-cm-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/purificador-de-aire/purificador-tst-360-60-estratto-acero-inox-60-cm-02.webp b/public/images/tennants/mutual_smep/catalog/purificador-de-aire/purificador-tst-360-60-estratto-acero-inox-60-cm-02.webp deleted file mode 100644 index d21ea9e4..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/purificador-de-aire/purificador-tst-360-60-estratto-acero-inox-60-cm-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/smart-tv/smart-32-bgh-b-3225s5a-android-01.webp b/public/images/tennants/mutual_smep/catalog/smart-tv/smart-32-bgh-b-3225s5a-android-01.webp deleted file mode 100644 index b1ec30d7..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/smart-tv/smart-32-bgh-b-3225s5a-android-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/smart-tv/smart-32-bgh-b-3225s5a-android-02.webp b/public/images/tennants/mutual_smep/catalog/smart-tv/smart-32-bgh-b-3225s5a-android-02.webp deleted file mode 100644 index aa3e1bbb..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/smart-tv/smart-32-bgh-b-3225s5a-android-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/smart-tv/smart-32-bgh-b-3225s5a-android-03.webp b/public/images/tennants/mutual_smep/catalog/smart-tv/smart-32-bgh-b-3225s5a-android-03.webp deleted file mode 100644 index eddbabbc..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/smart-tv/smart-32-bgh-b-3225s5a-android-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/smart-tv/smart-32-bgh-b-3225s5a-android-04.webp b/public/images/tennants/mutual_smep/catalog/smart-tv/smart-32-bgh-b-3225s5a-android-04.webp deleted file mode 100644 index 06f61f7f..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/smart-tv/smart-32-bgh-b-3225s5a-android-04.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/smart-tv/smart-tv-43-noblex-dr43-x7180-android-01.webp b/public/images/tennants/mutual_smep/catalog/smart-tv/smart-tv-43-noblex-dr43-x7180-android-01.webp deleted file mode 100644 index 1c697fb9..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/smart-tv/smart-tv-43-noblex-dr43-x7180-android-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/smart-tv/smart-tv-43-noblex-dr43-x7180-android-02.webp b/public/images/tennants/mutual_smep/catalog/smart-tv/smart-tv-43-noblex-dr43-x7180-android-02.webp deleted file mode 100644 index 0453582d..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/smart-tv/smart-tv-43-noblex-dr43-x7180-android-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/smart-tv/smart-tv-43-noblex-dr43-x7180-android-03.webp b/public/images/tennants/mutual_smep/catalog/smart-tv/smart-tv-43-noblex-dr43-x7180-android-03.webp deleted file mode 100644 index 2d7f614d..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/smart-tv/smart-tv-43-noblex-dr43-x7180-android-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/smart-tv/smart-tv-43-noblex-dr43-x7180-android-04.webp b/public/images/tennants/mutual_smep/catalog/smart-tv/smart-tv-43-noblex-dr43-x7180-android-04.webp deleted file mode 100644 index 821f0f31..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/smart-tv/smart-tv-43-noblex-dr43-x7180-android-04.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/smart-tv/smart-tv-noblex-32-dk32-x7000-android-01.webp b/public/images/tennants/mutual_smep/catalog/smart-tv/smart-tv-noblex-32-dk32-x7000-android-01.webp deleted file mode 100644 index b944f6ac..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/smart-tv/smart-tv-noblex-32-dk32-x7000-android-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/smart-tv/smart-tv-noblex-32-dk32-x7000-android-02.webp b/public/images/tennants/mutual_smep/catalog/smart-tv/smart-tv-noblex-32-dk32-x7000-android-02.webp deleted file mode 100644 index 2e97d76a..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/smart-tv/smart-tv-noblex-32-dk32-x7000-android-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/smart-tv/smart-tv-noblex-32-dk32-x7000-android-03.webp b/public/images/tennants/mutual_smep/catalog/smart-tv/smart-tv-noblex-32-dk32-x7000-android-03.webp deleted file mode 100644 index b9c449ce..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/smart-tv/smart-tv-noblex-32-dk32-x7000-android-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/smart-tv/smart-tv-noblex-50-dr50-x8500-google-tv-01.webp b/public/images/tennants/mutual_smep/catalog/smart-tv/smart-tv-noblex-50-dr50-x8500-google-tv-01.webp deleted file mode 100644 index 803f3f28..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/smart-tv/smart-tv-noblex-50-dr50-x8500-google-tv-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/smart-tv/smart-tv-noblex-50-dr50-x8500-google-tv-02.webp b/public/images/tennants/mutual_smep/catalog/smart-tv/smart-tv-noblex-50-dr50-x8500-google-tv-02.webp deleted file mode 100644 index c5435a34..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/smart-tv/smart-tv-noblex-50-dr50-x8500-google-tv-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/smart-tv/smart-tv-noblex-50-dr50-x8500-google-tv-03.webp b/public/images/tennants/mutual_smep/catalog/smart-tv/smart-tv-noblex-50-dr50-x8500-google-tv-03.webp deleted file mode 100644 index 1a786516..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/smart-tv/smart-tv-noblex-50-dr50-x8500-google-tv-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/smart-tv/smart-tv-noblex-50-dr50-x8500-google-tv-04.webp b/public/images/tennants/mutual_smep/catalog/smart-tv/smart-tv-noblex-50-dr50-x8500-google-tv-04.webp deleted file mode 100644 index 3f3061ea..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/smart-tv/smart-tv-noblex-50-dr50-x8500-google-tv-04.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/smart-tv/soporte-led-32-55-gbs-con-inclinacion-01.webp b/public/images/tennants/mutual_smep/catalog/smart-tv/soporte-led-32-55-gbs-con-inclinacion-01.webp deleted file mode 100644 index 5ed3b1e4..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/smart-tv/soporte-led-32-55-gbs-con-inclinacion-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/smart-tv/soporte-led-32-55-gbs-con-inclinacion-02.webp b/public/images/tennants/mutual_smep/catalog/smart-tv/soporte-led-32-55-gbs-con-inclinacion-02.webp deleted file mode 100644 index ddaea152..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/smart-tv/soporte-led-32-55-gbs-con-inclinacion-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/smart-tv/soporte-led-32-55-gbs-con-inclinacion-03.webp b/public/images/tennants/mutual_smep/catalog/smart-tv/soporte-led-32-55-gbs-con-inclinacion-03.webp deleted file mode 100644 index 283d3e8f..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/smart-tv/soporte-led-32-55-gbs-con-inclinacion-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/smart-tv/soporte-led-gbs-32-55-fijo-01.webp b/public/images/tennants/mutual_smep/catalog/smart-tv/soporte-led-gbs-32-55-fijo-01.webp deleted file mode 100644 index 122ee75d..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/smart-tv/soporte-led-gbs-32-55-fijo-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/smart-tv/soporte-led-gbs-32-55-fijo-02.webp b/public/images/tennants/mutual_smep/catalog/smart-tv/soporte-led-gbs-32-55-fijo-02.webp deleted file mode 100644 index 38e7295e..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/smart-tv/soporte-led-gbs-32-55-fijo-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/smart-tv/soporte-led-gbs-32-55-fijo-03.webp b/public/images/tennants/mutual_smep/catalog/smart-tv/soporte-led-gbs-32-55-fijo-03.webp deleted file mode 100644 index b5c6ef52..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/smart-tv/soporte-led-gbs-32-55-fijo-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/tecnologia/auricular-bt-negro-on-ear-moonki-sound-mh-0510bt-01.webp b/public/images/tennants/mutual_smep/catalog/tecnologia/auricular-bt-negro-on-ear-moonki-sound-mh-0510bt-01.webp deleted file mode 100644 index b37650ee..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/tecnologia/auricular-bt-negro-on-ear-moonki-sound-mh-0510bt-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/tecnologia/auricular-bt-negro-on-ear-moonki-sound-mh-0510bt-02.webp b/public/images/tennants/mutual_smep/catalog/tecnologia/auricular-bt-negro-on-ear-moonki-sound-mh-0510bt-02.webp deleted file mode 100644 index 66847e9d..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/tecnologia/auricular-bt-negro-on-ear-moonki-sound-mh-0510bt-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/tecnologia/auricular-bt-negro-on-ear-moonki-sound-mh-0510bt-03.webp b/public/images/tennants/mutual_smep/catalog/tecnologia/auricular-bt-negro-on-ear-moonki-sound-mh-0510bt-03.webp deleted file mode 100644 index 972164a0..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/tecnologia/auricular-bt-negro-on-ear-moonki-sound-mh-0510bt-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/tecnologia/auricular-moonki-earbuds-sound-ma-tws66-black-01.webp b/public/images/tennants/mutual_smep/catalog/tecnologia/auricular-moonki-earbuds-sound-ma-tws66-black-01.webp deleted file mode 100644 index 93b15047..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/tecnologia/auricular-moonki-earbuds-sound-ma-tws66-black-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/tecnologia/auricular-moonki-earbuds-sound-ma-tws66-black-02.webp b/public/images/tennants/mutual_smep/catalog/tecnologia/auricular-moonki-earbuds-sound-ma-tws66-black-02.webp deleted file mode 100644 index 9c968bfe..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/tecnologia/auricular-moonki-earbuds-sound-ma-tws66-black-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/tecnologia/auricular-moonki-earbuds-sound-ma-tws66-black-03.webp b/public/images/tennants/mutual_smep/catalog/tecnologia/auricular-moonki-earbuds-sound-ma-tws66-black-03.webp deleted file mode 100644 index 65b025db..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/tecnologia/auricular-moonki-earbuds-sound-ma-tws66-black-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/tecnologia/auricular-moonki-earbuds-sound-ma-tws66-black-04.webp b/public/images/tennants/mutual_smep/catalog/tecnologia/auricular-moonki-earbuds-sound-ma-tws66-black-04.webp deleted file mode 100644 index 187a002c..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/tecnologia/auricular-moonki-earbuds-sound-ma-tws66-black-04.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/tecnologia/auricular-moonki-earbuds-sound-ma-tws66-black-05.webp b/public/images/tennants/mutual_smep/catalog/tecnologia/auricular-moonki-earbuds-sound-ma-tws66-black-05.webp deleted file mode 100644 index f2337e3b..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/tecnologia/auricular-moonki-earbuds-sound-ma-tws66-black-05.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/tecnologia/auricular-on-ear-moonki-sound-mh-0613-01.webp b/public/images/tennants/mutual_smep/catalog/tecnologia/auricular-on-ear-moonki-sound-mh-0613-01.webp deleted file mode 100644 index ffc355eb..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/tecnologia/auricular-on-ear-moonki-sound-mh-0613-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/tecnologia/auricular-on-ear-moonki-sound-mh-0613-02.webp b/public/images/tennants/mutual_smep/catalog/tecnologia/auricular-on-ear-moonki-sound-mh-0613-02.webp deleted file mode 100644 index 8aece021..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/tecnologia/auricular-on-ear-moonki-sound-mh-0613-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/tecnologia/auricular-on-ear-moonki-sound-mh-0613-03.webp b/public/images/tennants/mutual_smep/catalog/tecnologia/auricular-on-ear-moonki-sound-mh-0613-03.webp deleted file mode 100644 index bd3f4bdd..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/tecnologia/auricular-on-ear-moonki-sound-mh-0613-03.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/tecnologia/auricular-on-ear-moonki-sound-mh-0613-04.webp b/public/images/tennants/mutual_smep/catalog/tecnologia/auricular-on-ear-moonki-sound-mh-0613-04.webp deleted file mode 100644 index 5b8e1b79..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/tecnologia/auricular-on-ear-moonki-sound-mh-0613-04.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/tecnologia/bafle-havit-bluetooth-sk-816bt-01.webp b/public/images/tennants/mutual_smep/catalog/tecnologia/bafle-havit-bluetooth-sk-816bt-01.webp deleted file mode 100644 index 4d4eafaa..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/tecnologia/bafle-havit-bluetooth-sk-816bt-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/tecnologia/mouse-xtrike-me-backlit-01.webp b/public/images/tennants/mutual_smep/catalog/tecnologia/mouse-xtrike-me-backlit-01.webp deleted file mode 100644 index d4905f09..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/tecnologia/mouse-xtrike-me-backlit-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/tecnologia/parlante-jbl-go-4-bluetooth-altavoz-ultraportatil-01.webp b/public/images/tennants/mutual_smep/catalog/tecnologia/parlante-jbl-go-4-bluetooth-altavoz-ultraportatil-01.webp deleted file mode 100644 index 6f3c7071..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/tecnologia/parlante-jbl-go-4-bluetooth-altavoz-ultraportatil-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/tecnologia/parlante-jbl-go-4-bluetooth-altavoz-ultraportatil-02.webp b/public/images/tennants/mutual_smep/catalog/tecnologia/parlante-jbl-go-4-bluetooth-altavoz-ultraportatil-02.webp deleted file mode 100644 index 285b0c86..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/tecnologia/parlante-jbl-go-4-bluetooth-altavoz-ultraportatil-02.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/catalog/tecnologia/teclado-xtrike-me-rainbow-mecanico-01.webp b/public/images/tennants/mutual_smep/catalog/tecnologia/teclado-xtrike-me-rainbow-mecanico-01.webp deleted file mode 100644 index 2f894210..00000000 Binary files a/public/images/tennants/mutual_smep/catalog/tecnologia/teclado-xtrike-me-rainbow-mecanico-01.webp and /dev/null differ diff --git a/public/images/tennants/mutual_smep/mutual_smep_favicon.png b/public/images/tennants/mutual_smep/mutual_smep_favicon.png deleted file mode 100644 index 1ec3be4a..00000000 Binary files a/public/images/tennants/mutual_smep/mutual_smep_favicon.png and /dev/null differ diff --git a/public/images/tennants/mutual_smep/mutual_smep_footer.png b/public/images/tennants/mutual_smep/mutual_smep_footer.png deleted file mode 100644 index 1ec3be4a..00000000 Binary files a/public/images/tennants/mutual_smep/mutual_smep_footer.png and /dev/null differ diff --git a/public/images/tennants/mutual_smep/mutual_smep_header.png b/public/images/tennants/mutual_smep/mutual_smep_header.png deleted file mode 100644 index c15429b8..00000000 Binary files a/public/images/tennants/mutual_smep/mutual_smep_header.png and /dev/null differ diff --git a/tests/Feature/Catalog/CategoryDetailTest.php b/tests/Feature/Catalog/CategoryDetailTest.php index ba22be2e..0eee7dbe 100644 --- a/tests/Feature/Catalog/CategoryDetailTest.php +++ b/tests/Feature/Catalog/CategoryDetailTest.php @@ -72,29 +72,6 @@ class CategoryDetailTest extends TestCase ->assertJsonCount(0, 'data'); } - public function test_it_includes_products_from_all_descendant_categories(): void - { - $tenant = $this->createTenant('category-descendants'); - $parent = $this->createCategory($tenant, 'Indumentaria'); - $child = $this->createCategory($tenant, 'Remeras', $parent); - $grandchild = $this->createCategory($tenant, 'Manga corta', $child); - $sibling = $this->createCategory($tenant, 'Pantalones'); - - $parentItem = $this->createCatalogItem($tenant, $parent, 'Producto padre'); - $childItem = $this->createCatalogItem($tenant, $child, 'Producto hijo'); - $grandchildItem = $this->createCatalogItem($tenant, $grandchild, 'Producto nieto'); - $this->createCatalogItem($tenant, $sibling, 'Producto ajeno'); - - $this->getJson("/api/tenants/{$tenant->codigo}/categories/{$parent->id}") - ->assertOk() - ->assertJsonPath('meta.total', 3) - ->assertJsonCount(3, 'data') - ->assertJsonPath('data.0.id', $childItem->id) - ->assertJsonPath('data.1.id', $grandchildItem->id) - ->assertJsonPath('data.2.id', $parentItem->id) - ->assertJsonMissing(['nombre' => 'Producto ajeno']); - } - public function test_it_rejects_categories_from_another_tenant(): void { $tenant = $this->createTenant('category-owner'); @@ -130,14 +107,10 @@ class CategoryDetailTest extends TestCase ]); } - private function createCategory( - Tenant $tenant, - string $name, - ?Category $parent = null, - ): Category { + private function createCategory(Tenant $tenant, string $name): Category + { return Category::query()->create([ 'tenant_code' => $tenant->codigo, - 'categoria_id' => $parent?->id, 'nombre' => $name, ]); } diff --git a/tests/Feature/FiestaFutbolInfantil/AccommodationControllerTest.php b/tests/Feature/FiestaFutbolInfantil/AccommodationControllerTest.php index 3050ac09..d04907fb 100644 --- a/tests/Feature/FiestaFutbolInfantil/AccommodationControllerTest.php +++ b/tests/Feature/FiestaFutbolInfantil/AccommodationControllerTest.php @@ -97,8 +97,6 @@ class AccommodationControllerTest extends TestCase $updated = $this->variantPayload('Casa Rodante Premium', 'Con electricidad', 15, 50000); $updated['id'] = $variantId; - unset($updated['stock']); - $updated['stock_difference'] = -5; $this->postJson('/api/v1/adminapp/tenant/accommodations', [ 'variants' => [ diff --git a/tests/Feature/FiestaFutbolInfantil/EntryControllerTest.php b/tests/Feature/FiestaFutbolInfantil/EntryControllerTest.php index b6066fe9..fb3b59fb 100644 --- a/tests/Feature/FiestaFutbolInfantil/EntryControllerTest.php +++ b/tests/Feature/FiestaFutbolInfantil/EntryControllerTest.php @@ -194,7 +194,7 @@ class EntryControllerTest extends TestCase 'title' => 'Abono actualizado', 'description' => 'Ahora incluye ambas fechas', 'event_date_ids' => [$firstDate->id, $secondDate->id], - 'stock_difference' => 10, + 'stock' => 20, 'price' => 250, ], [ @@ -268,7 +268,7 @@ class EntryControllerTest extends TestCase 'id' => $entryId, 'title' => 'Abono editado', 'event_date_ids' => [$date->id, $otherDate->id], - 'stock_difference' => 10, + 'stock' => 30, 'price' => 200, ]], ])->assertOk() @@ -329,7 +329,7 @@ class EntryControllerTest extends TestCase 'title' => 'Entrada inválida', 'description' => null, 'event_date_ids' => [$foreignDate->id], - 'stock_difference' => 0, + 'stock' => 10, 'price' => 100, ]], ]) @@ -371,7 +371,7 @@ class EntryControllerTest extends TestCase 'title' => 'Entrada inválida', 'description' => null, 'event_date_ids' => [$eventDate->id], - 'stock_difference' => 0, + 'stock' => 10, 'price' => 100, ]], ]) diff --git a/tests/Feature/FiestaFutbolInfantil/FoodControllerTest.php b/tests/Feature/FiestaFutbolInfantil/FoodControllerTest.php index c0339163..bef74360 100644 --- a/tests/Feature/FiestaFutbolInfantil/FoodControllerTest.php +++ b/tests/Feature/FiestaFutbolInfantil/FoodControllerTest.php @@ -124,8 +124,6 @@ class FoodControllerTest extends TestCase $updated = $this->variantPayload($secondDate->id, 'Cena', 'Vianda', 80, 8500); $updated['id'] = $variantId; - unset($updated['stock']); - $updated['stock_difference'] = -20; $updated['description'] = 'Cena para llevar'; $this->postJson('/api/v1/adminapp/tenant/foods', [ @@ -242,7 +240,7 @@ class FoodControllerTest extends TestCase Inventory::query()->whereKey($replacementInventoryId)->delete(); $updated = $this->patchJson('/api/v1/adminapp/tenant/foods/history-stock', [ - 'variants' => [['id' => $historicalVariantId, 'stock_difference' => -55]], + 'variants' => [['id' => $historicalVariantId, 'stock' => 45]], ]) ->assertOk() ->assertJsonPath('data.history.0.variants.0.id', $historicalVariantId) @@ -260,7 +258,7 @@ class FoodControllerTest extends TestCase ]); $this->patchJson('/api/v1/adminapp/tenant/foods/history-stock', [ - 'variants' => [['id' => $activeVariantId, 'stock_difference' => -60]], + 'variants' => [['id' => $activeVariantId, 'stock' => 20]], ]) ->assertUnprocessable() ->assertJsonValidationErrors(['variants.0.id']); diff --git a/tests/Feature/FiestaFutbolInfantil/MerchandiseControllerTest.php b/tests/Feature/FiestaFutbolInfantil/MerchandiseControllerTest.php index 7f8ddcf8..09752a40 100644 --- a/tests/Feature/FiestaFutbolInfantil/MerchandiseControllerTest.php +++ b/tests/Feature/FiestaFutbolInfantil/MerchandiseControllerTest.php @@ -112,8 +112,6 @@ class MerchandiseControllerTest extends TestCase $updatedVariant = $this->variantPayload('Blanco', 'M', 80, 12500); $updatedVariant['id'] = $variantId; - unset($updatedVariant['stock']); - $updatedVariant['stock_difference'] = -20; $updatedItem = $this->itemPayload('Camiseta oficial', 2, [ $updatedVariant, $this->variantPayload('Verde', 'L', 60, 15000), @@ -236,8 +234,6 @@ class MerchandiseControllerTest extends TestCase $secondItemVariantId = $created->json('data.1.variants.0.id'); $foreignVariant = $this->variantPayload('Azul Marino', 'XL', 20, 30000); $foreignVariant['id'] = $secondItemVariantId; - unset($foreignVariant['stock']); - $foreignVariant['stock_difference'] = 0; $firstItem = $this->itemPayload('Camiseta', 3, [$foreignVariant]); $firstItem['id'] = $firstItemId; diff --git a/tests/Feature/Integration/TelepagosWebhookTest.php b/tests/Feature/Integration/TelepagosWebhookTest.php index 4c823273..17518dce 100644 --- a/tests/Feature/Integration/TelepagosWebhookTest.php +++ b/tests/Feature/Integration/TelepagosWebhookTest.php @@ -2,22 +2,20 @@ namespace Tests\Feature\Integration; +use App\Shared\Attachable\Enums\AttachmentType; +use App\Shared\Attachable\Models\Attachment; +use App\Domains\Core\Auth\Models\User; use App\Domains\Commerce\Cart\Models\Cart; use App\Domains\Commerce\Catalog\Enums\InventoryPolicy; use App\Domains\Commerce\Catalog\Models\CatalogItem; use App\Domains\Commerce\Catalog\Models\Category; use App\Domains\Commerce\Catalog\Models\Inventory; use App\Domains\Commerce\Catalog\Models\Variant; +use App\Shared\Integration\Models\Integration; use App\Domains\Commerce\Purchase\Models\Purchase; use App\Domains\Commerce\Purchase\Models\TelepagosPayment; use App\Domains\Commerce\Purchase\Services\CheckoutService; -use App\Domains\Core\Auth\Models\User; -use App\Domains\Core\Client\Models\Client; use App\Domains\Core\Tenant\Models\Tenant; -use App\Domains\Ticketing\Event\Models\Event; -use App\Shared\Attachable\Enums\AttachmentType; -use App\Shared\Attachable\Models\Attachment; -use App\Shared\Integration\Models\Integration; use Illuminate\Foundation\Testing\RefreshDatabase; use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Http; @@ -229,77 +227,6 @@ class TelepagosWebhookTest extends TestCase ]); } - public function test_transfer_webhook_matches_the_client_configured_on_the_event(): void - { - $tenant = $this->createTenant('multi-event', 'Multi Event', 'multi-event.com.ar'); - $eventClient = Client::query()->create([ - 'code' => 'event-client', - 'name' => 'Event Client', - ]); - Integration::query()->create([ - 'integration_code' => 'telepagos_homo', - 'name' => 'Telepagos', - 'url' => 'https://api.telepagos.com.ar', - 'integration_data_schema' => [ - 'username' => 'required|string', - 'password' => 'required|string', - ], - ]); - $this->createClientIntegration([ - 'client_id' => $eventClient->id, - 'integration_code' => 'telepagos_homo', - 'integration_data' => ['username' => 'event-user', 'password' => 'event-password'], - ]); - $event = Event::query()->create([ - 'client_id' => $eventClient->id, - 'tenant_code' => $tenant->codigo, - 'title' => 'Event with its own client', - ]); - $tenant->update(['active_event_id' => $event->id]); - - $user = User::factory()->create(); - $variant = $this->createVariantForTenant($tenant->codigo, 10, '50.00'); - $purchase = $this->createPendingTransferPurchase( - $tenant, - $user->id, - $variant->id, - 1, - '12345678', - ); - - Http::fake([ - 'https://api.telepagos.com.ar/v2/auth/token' => Http::response([ - 'status' => 'ok', - 'token' => 'event-client-token', - 'expires_at' => now()->addHour()->toIso8601String(), - ]), - 'https://api.telepagos.com.ar/v2/payment/cashin/event-client-payment' => Http::response([ - 'status' => 'ok', - 'data' => [ - 'amount' => 50, - 'operation_id' => 1, - 'transaction_id' => 'tx-event-client', - 'buyer' => ['cuit' => '20123456789'], - ], - ]), - ]); - - $this->postJson('/api/webhooks/telepagos/event-client', [ - 'id' => 'event-client-payment', - ])->assertOk()->assertJsonPath('status', 'success'); - - $this->assertSame($event->id, $purchase->event_id); - $this->assertDatabaseHas('compras', [ - 'id' => $purchase->id, - 'event_id' => $event->id, - 'status' => Purchase::STATUS_PAID, - ]); - $this->assertDatabaseHas('telepagos_payments', [ - 'compra_id' => $purchase->id, - 'transaction_id' => 'tx-event-client', - ]); - } - public function test_transfer_webhook_buys_unlimited_inventory_without_reducing_real_stock(): void { $tenant = $this->createTenant('unlimited', 'Unlimited', 'unlimited.com.ar'); diff --git a/tests/Feature/Migrations/AddClientIdToEventsTest.php b/tests/Feature/Migrations/AddClientIdToEventsTest.php deleted file mode 100644 index 1fdb6e0d..00000000 --- a/tests/Feature/Migrations/AddClientIdToEventsTest.php +++ /dev/null @@ -1,57 +0,0 @@ -id(); - $table->string('code'); - $table->string('name'); - }); - Schema::create('tenants', function (Blueprint $table): void { - $table->id(); - $table->foreignId('client_id'); - $table->string('codigo'); - }); - Schema::create('events', function (Blueprint $table): void { - $table->id(); - $table->string('tenant_code'); - $table->string('title'); - $table->timestamps(); - }); - - DB::table('clients')->insert([ - ['id' => 10, 'code' => 'tenant-client', 'name' => 'Tenant Client'], - ['id' => 11, 'code' => 'event-client', 'name' => 'Event Client'], - ]); - DB::table('tenants')->insert(['id' => 20, 'client_id' => 10, 'codigo' => 'tenant']); - DB::table('events')->insert([ - 'id' => 30, - 'tenant_code' => 'tenant', - 'title' => 'Event', - 'created_at' => now(), - 'updated_at' => now(), - ]); - - $migration = require database_path('migrations/2026_09_28_000000_add_client_id_to_events.php'); - $migration->up(); - - $event = Event::query()->findOrFail(30); - $this->assertSame(10, $event->effectiveClient()->id); - - $event->update(['client_id' => 11]); - - $this->assertSame(11, $event->fresh()->effectiveClient()->id); - $this->assertTrue(Client::query()->findOrFail(11)->events()->whereKey(30)->exists()); - } -} diff --git a/tests/Feature/Migrations/AddEventIdToPurchasesTest.php b/tests/Feature/Migrations/AddEventIdToPurchasesTest.php deleted file mode 100644 index 2c6d24e3..00000000 --- a/tests/Feature/Migrations/AddEventIdToPurchasesTest.php +++ /dev/null @@ -1,44 +0,0 @@ - $table->id()); - Schema::create('compras', fn (Blueprint $table) => $table->id()); - Schema::create('catalog_items', function (Blueprint $table): void { - $table->id(); - $table->foreignId('event_id')->nullable(); - }); - Schema::create('compra_items', function (Blueprint $table): void { - $table->id(); - $table->foreignId('compra_id'); - $table->foreignId('source_catalog_item_id'); - }); - - DB::table('events')->insert([['id' => 10], ['id' => 11]]); - DB::table('compras')->insert([['id' => 20], ['id' => 21]]); - DB::table('catalog_items')->insert([ - ['id' => 30, 'event_id' => 10], - ['id' => 31, 'event_id' => 11], - ]); - DB::table('compra_items')->insert([ - ['compra_id' => 20, 'source_catalog_item_id' => 30], - ['compra_id' => 21, 'source_catalog_item_id' => 30], - ['compra_id' => 21, 'source_catalog_item_id' => 31], - ]); - - $migration = require database_path('migrations/2026_09_28_000100_add_event_id_to_compras.php'); - $migration->up(); - - $this->assertDatabaseHas('compras', ['id' => 20, 'event_id' => 10]); - $this->assertDatabaseHas('compras', ['id' => 21, 'event_id' => null]); - } -} diff --git a/tests/Feature/Migrations/AssignArrufoEventToPymeRuralClientTest.php b/tests/Feature/Migrations/AssignArrufoEventToPymeRuralClientTest.php deleted file mode 100644 index 91a80fd2..00000000 --- a/tests/Feature/Migrations/AssignArrufoEventToPymeRuralClientTest.php +++ /dev/null @@ -1,50 +0,0 @@ -id(); - $table->string('code'); - }); - Schema::create('events', function (Blueprint $table): void { - $table->id(); - $table->foreignId('client_id')->nullable(); - $table->string('tenant_code'); - $table->string('title'); - }); - - DB::table('clients')->insert([ - ['id' => 10, 'code' => 'pyme_rural'], - ['id' => 11, 'code' => 'onticket'], - ]); - DB::table('events')->insert([ - [ - 'id' => 20, - 'client_id' => null, - 'tenant_code' => 'onticket', - 'title' => '26.º Fiesta de la Tradición y 4.º Encuentro de Agrupaciones Gauchas', - ], - [ - 'id' => 21, - 'client_id' => 11, - 'tenant_code' => 'onticket', - 'title' => 'Otro evento', - ], - ]); - - $migration = require database_path('migrations/2026_09_28_000200_assign_arrufo_event_to_pyme_rural_client.php'); - $migration->up(); - - $this->assertDatabaseHas('events', ['id' => 20, 'client_id' => 10]); - $this->assertDatabaseHas('events', ['id' => 21, 'client_id' => 11]); - } -} diff --git a/tests/Feature/Migrations/InventoryStockMovementMigrationTest.php b/tests/Feature/Migrations/InventoryStockMovementMigrationTest.php deleted file mode 100644 index 8946f515..00000000 --- a/tests/Feature/Migrations/InventoryStockMovementMigrationTest.php +++ /dev/null @@ -1,139 +0,0 @@ -id(); - $table->softDeletes(); - }); - Schema::create('inventories', function (Blueprint $table): void { - $table->id(); - $table->unsignedBigInteger('sold_units')->default(0); - $table->unsignedInteger('reserved_stock')->default(0); - $table->unsignedInteger('real_stock')->default(0); - $table->unsignedBigInteger('refunded_units')->default(0); - $table->unsignedInteger('entry_reserved_stock')->default(0); - }); - } - - protected function tearDown(): void - { - Schema::disableForeignKeyConstraints(); - Schema::dropIfExists('inventory_movements'); - Schema::dropIfExists('inventories'); - Schema::dropIfExists('users'); - Schema::enableForeignKeyConstraints(); - - parent::tearDown(); - } - - public function test_migration_and_rollback_preserve_the_available_balance(): void - { - DB::table('inventories')->insert([ - 'id' => 17, - 'real_stock' => 10, - 'sold_units' => 3, - 'refunded_units' => 1, - 'reserved_stock' => 2, - 'entry_reserved_stock' => 1, - ]); - - $stockMigration = $this->stockMigration(); - $movementMigration = $this->movementMigration(); - $stockMigration->up(); - $movementMigration->up(); - - $inventory = Inventory::findOrFail(17); - $this->assertSame(12, $inventory->real_stock); - $this->assertSame(7, $inventory->availableStock()); - $this->assertTrue(Schema::hasTable('inventory_movements')); - - $inventory->adjustAvailableStock(2); - $this->assertSame(9, $inventory->availableStock()); - - $movementMigration->down(); - $stockMigration->down(); - - $this->assertFalse(Schema::hasColumn('inventories', 'available_stock')); - $this->assertFalse(Schema::hasTable('inventory_movements')); - $this->assertSame(12, Inventory::findOrFail(17)->real_stock); - $this->assertSame(9, Inventory::findOrFail(17)->availableStock()); - } - - public function test_movements_capture_counters_actor_and_idempotency(): void - { - $this->stockMigration()->up(); - $this->movementMigration()->up(); - DB::table('users')->insert(['id' => 5]); - $user = User::query()->findOrFail(5); - - $inventory = Inventory::query()->create(['real_stock' => 10]); - $inventory->recordInitialization($user); - $inventory->adjustAvailableStock(3, $user, '955d2afb-1e36-46df-a9db-d9ee31ed5eb4'); - $inventory->adjustAvailableStock(3, $user, '955d2afb-1e36-46df-a9db-d9ee31ed5eb4'); - $inventory->reserve(2, true); - $inventory->buy(2, true); - $inventory->refundStock(1, $user); - - $this->assertSame(12, $inventory->availableStock()); - $this->assertCount(5, $inventory->movements()->get()); - - $adjustment = InventoryMovement::query() - ->where('operation', InventoryMovementOperation::StockIncreased->value) - ->firstOrFail(); - $this->assertSame(3, $adjustment->available_stock_delta); - $this->assertSame(10, $adjustment->available_stock_before); - $this->assertSame(13, $adjustment->available_stock_after); - $this->assertSame(['real_stock' => 3], $adjustment->counter_deltas); - $this->assertSame(5, $adjustment->responsible_user_id); - - $purchase = InventoryMovement::query() - ->where('operation', InventoryMovementOperation::PurchaseCommitted->value) - ->firstOrFail(); - $this->assertSame(0, $purchase->available_stock_delta); - $this->assertSame(['reserved_stock' => -2, 'sold_units' => 2], $purchase->counter_deltas); - } - - public function test_migration_rejects_an_inventory_with_negative_available_stock(): void - { - DB::table('inventories')->insert([ - 'id' => 23, - 'real_stock' => 1, - 'reserved_stock' => 2, - ]); - - $this->expectException(\RuntimeException::class); - $this->expectExceptionMessage( - 'stock disponible actual es negativo. Inventarios detectados (máximo 20): ' - .'id=23 [real=1, vendidas=0, reintegradas=0, reservadas=2, reservas_entradas=0, resultado=-1]' - ); - - $this->stockMigration()->up(); - } - - private function stockMigration(): Migration - { - return require database_path('migrations/2026_09_25_000000_generate_available_inventory_stock.php'); - } - - private function movementMigration(): Migration - { - return require database_path('migrations/2026_09_25_010000_create_inventory_movements_table.php'); - } -} diff --git a/tests/Feature/Migrations/ProvisionMutualSmepTenantTest.php b/tests/Feature/Migrations/ProvisionMutualSmepTenantTest.php deleted file mode 100644 index f9a63b66..00000000 --- a/tests/Feature/Migrations/ProvisionMutualSmepTenantTest.php +++ /dev/null @@ -1,197 +0,0 @@ -createSchema(); - - DB::table('admin_website_types')->insert(['codigo' => 'shopit']); - DB::table('storefront_website_types')->insert(['codigo' => 'shopit']); - DB::table('menues')->insert([ - ['code' => 'product.detail'], - ['code' => 'help.faq'], - ['code' => 'help.contact'], - ['code' => 'account.tickets'], - ['code' => 'event.index'], - ]); - - $migration = require database_path('migrations/2026_09_24_000000_provision_mutual_smep_tenant.php'); - $migration->up(); - $migration->up(); - - $this->assertDatabaseCount('tenants', 1); - $this->assertDatabaseHas('clients', [ - 'code' => 'mutual_smep', - 'name' => 'Mutual SMEP', - ]); - $this->assertDatabaseHas('tenants', [ - 'codigo' => 'mutual_smep', - 'nombre' => 'Mutual SMEP', - 'dominio' => 'mutual-smep.localhost', - 'site_title' => 'Tienda Mutual SMEP', - 'primary_color' => '#4A7FF5', - 'secondary_color' => '#0051A4', - 'header_bg_color' => '#FFFFFF', - 'footer_bg_color' => '#0051A4', - 'admin_website_type_code' => 'shopit', - 'storefront_website_type_code' => 'shopit', - 'display_categories' => true, - 'display_seach_bar' => true, - 'display_cart' => true, - 'cart_editing_policy' => 'quantity_and_remove', - 'checkout_editing_policy' => 'disabled', - ]); - - $this->assertSame([ - 'mutual_smep_favicon.png', - 'mutual_smep_footer.png', - 'mutual_smep_header.png', - ], DB::table('attachments')->orderBy('filename')->pluck('filename')->all()); - - DB::table('attachments')->orderBy('id')->each( - fn (object $attachment) => Storage::disk('s3')->assertExists($attachment->path) - ); - - $this->assertSame( - ['instagram', 'facebook', 'whatsapp'], - DB::table('tenant_social_media') - ->where('tenant_code', 'mutual_smep') - ->orderBy('orden') - ->pluck('social_media_code') - ->all(), - ); - $this->assertDatabaseHas('tenants_menues', [ - 'tenant_code' => 'mutual_smep', - 'menu_code' => 'product.detail', - ]); - $this->assertDatabaseMissing('tenants_menues', [ - 'tenant_code' => 'mutual_smep', - 'menu_code' => 'account.tickets', - ]); - $this->assertDatabaseMissing('tenants_menues', [ - 'tenant_code' => 'mutual_smep', - 'menu_code' => 'event.index', - ]); - - $contact = json_decode( - DB::table('tenants_menues') - ->where('tenant_code', 'mutual_smep') - ->where('menu_code', 'help.contact') - ->value('static_content'), - true, - flags: JSON_THROW_ON_ERROR, - ); - - $this->assertSame('https://wa.me/5493412474530', $contact['whatsapp']['whatsapp_url']); - $this->assertSame('San Lorenzo 1543, Rosario, Santa Fe', $contact['locations']['rosario']['addresses'][0]['address']); - - $storedPaths = DB::table('attachments')->pluck('path')->all(); - $migration->down(); - - $this->assertDatabaseMissing('tenants', ['codigo' => 'mutual_smep']); - $this->assertDatabaseMissing('clients', ['code' => 'mutual_smep']); - $this->assertDatabaseCount('attachments', 0); - $this->assertDatabaseCount('tenant_social_media', 0); - $this->assertDatabaseCount('tenants_menues', 0); - - foreach ($storedPaths as $storedPath) { - Storage::disk('s3')->assertMissing($storedPath); - } - } - - private function createSchema(): void - { - Schema::create('clients', function (Blueprint $table): void { - $table->id(); - $table->string('code')->unique(); - $table->string('name'); - $table->timestamps(); - }); - Schema::create('attachments', function (Blueprint $table): void { - $table->id(); - $table->uuid('key'); - $table->string('path'); - $table->string('filename'); - $table->string('type'); - $table->string('mime_type'); - $table->string('extension'); - $table->unsignedBigInteger('size'); - $table->timestamps(); - }); - Schema::create('admin_website_types', function (Blueprint $table): void { - $table->id(); - $table->string('codigo')->unique(); - }); - Schema::create('storefront_website_types', function (Blueprint $table): void { - $table->id(); - $table->string('codigo')->unique(); - }); - Schema::create('tenants', function (Blueprint $table): void { - $table->id(); - $table->foreignId('client_id'); - $table->string('codigo')->unique(); - $table->string('nombre'); - $table->string('timezone'); - $table->string('dominio'); - $table->string('base_path'); - $table->string('site_title'); - $table->string('address'); - $table->string('phone'); - $table->string('primary_color'); - $table->string('secondary_color'); - $table->string('danger_color'); - $table->string('success_color'); - $table->string('header_bg_color'); - $table->string('footer_bg_color'); - $table->foreignId('header_logo_id'); - $table->foreignId('footer_logo_id'); - $table->foreignId('favicon_id'); - $table->string('admin_website_type_code'); - $table->string('storefront_website_type_code'); - $table->boolean('display_categories'); - $table->boolean('display_seach_bar'); - $table->boolean('display_cart'); - $table->string('cart_editing_policy'); - $table->string('checkout_editing_policy'); - $table->timestamps(); - }); - Schema::create('social_media', function (Blueprint $table): void { - $table->id(); - $table->string('code')->unique(); - $table->string('icon'); - $table->string('name'); - $table->timestamps(); - }); - Schema::create('tenant_social_media', function (Blueprint $table): void { - $table->id(); - $table->string('tenant_code'); - $table->string('social_media_code'); - $table->string('url'); - $table->unsignedInteger('orden'); - $table->timestamps(); - $table->unique(['tenant_code', 'social_media_code']); - }); - Schema::create('menues', function (Blueprint $table): void { - $table->id(); - $table->string('code')->unique(); - }); - Schema::create('tenants_menues', function (Blueprint $table): void { - $table->id(); - $table->string('tenant_code'); - $table->string('menu_code'); - $table->json('static_content')->nullable(); - $table->timestamps(); - $table->unique(['tenant_code', 'menu_code']); - }); - } -} diff --git a/tests/Feature/Migrations/SeedMutualSmepCarouselTest.php b/tests/Feature/Migrations/SeedMutualSmepCarouselTest.php deleted file mode 100644 index 0f554f22..00000000 --- a/tests/Feature/Migrations/SeedMutualSmepCarouselTest.php +++ /dev/null @@ -1,119 +0,0 @@ -createSchema(); - - DB::table('tenants')->insert([ - 'codigo' => 'mutual_smep', - 'storefront_website_type_code' => 'shopit', - ]); - DB::table('storefront_website_type_extras')->insert([ - 'storefront_website_type_code' => 'shopit', - 'codigo' => 'carousel', - ]); - } - - protected function tearDown(): void - { - foreach (['websites_extras', 'attachments', 'storefront_website_type_extras', 'tenants'] as $table) { - Schema::dropIfExists($table); - } - - parent::tearDown(); - } - - public function test_it_loads_and_rolls_back_the_mutual_smep_carousel(): void - { - $migration = require database_path( - 'migrations/2026_09_24_040000_seed_mutual_smep_carousel.php' - ); - - $migration->up(); - $migration->up(); - - $this->assertDatabaseCount('attachments', 4); - $this->assertDatabaseCount('websites_extras', 1); - - $attachments = DB::table('attachments')->orderBy('filename')->get(); - $this->assertSame([ - '01-tecnologia.webp', - '02-hogar.webp', - '03-vida-activa.webp', - '04-descanso.webp', - ], $attachments->pluck('filename')->all()); - $this->assertSame( - $attachments->pluck('id')->all(), - json_decode( - DB::table('websites_extras')->value('config'), - true, - flags: JSON_THROW_ON_ERROR, - ), - ); - - foreach ($attachments as $attachment) { - $this->assertSame('image/webp', $attachment->mime_type); - $this->assertStringStartsWith( - 'tenants/mutual_smep/extras/carousel-v1/', - $attachment->path, - ); - Storage::disk('s3')->assertExists($attachment->path); - } - - $storedPaths = $attachments->pluck('path')->all(); - $migration->down(); - - $this->assertDatabaseCount('websites_extras', 0); - $this->assertDatabaseCount('attachments', 0); - - foreach ($storedPaths as $storedPath) { - Storage::disk('s3')->assertMissing($storedPath); - } - } - - private function createSchema(): void - { - Schema::create('tenants', function (Blueprint $table): void { - $table->string('codigo')->primary(); - $table->string('storefront_website_type_code'); - }); - Schema::create('storefront_website_type_extras', function (Blueprint $table): void { - $table->id(); - $table->string('storefront_website_type_code'); - $table->string('codigo'); - }); - Schema::create('attachments', function (Blueprint $table): void { - $table->id(); - $table->uuid('key')->unique(); - $table->string('path'); - $table->string('filename'); - $table->string('type'); - $table->string('mime_type'); - $table->string('extension')->nullable(); - $table->unsignedBigInteger('size')->default(0); - $table->timestamps(); - }); - Schema::create('websites_extras', function (Blueprint $table): void { - $table->id(); - $table->string('website_code'); - $table->unsignedBigInteger('website_type_extra_id'); - $table->json('config'); - $table->boolean('is_enabled')->default(true); - $table->timestamps(); - $table->unique(['website_code', 'website_type_extra_id']); - }); - } -} diff --git a/tests/Feature/Migrations/SeedMutualSmepCatalogTest.php b/tests/Feature/Migrations/SeedMutualSmepCatalogTest.php deleted file mode 100644 index 685a1bcf..00000000 --- a/tests/Feature/Migrations/SeedMutualSmepCatalogTest.php +++ /dev/null @@ -1,375 +0,0 @@ -createSchema(); - DB::table('tenants')->insert(['codigo' => 'mutual_smep']); - $this->seedCategoriesAndAttributes(); - } - - protected function tearDown(): void - { - foreach ([ - 'featured_items', - 'featured_groups', - 'catalog_items_attachments', - 'attachments', - 'variant_values', - 'item_attributes', - 'variantes', - 'catalog_items', - 'inventories', - 'brands', - 'attribute', - 'categorias', - 'tenants', - ] as $table) { - Schema::dropIfExists($table); - } - - parent::tearDown(); - } - - public function test_it_loads_and_rolls_back_the_complete_catalog(): void - { - $migration = require database_path( - 'migrations/2026_09_24_030000_seed_mutual_smep_catalog.php' - ); - - $migration->up(); - - $this->assertSame(142, DB::table('catalog_items')->count()); - $this->assertSame(150, DB::table('inventories')->count()); - $this->assertSame(15, DB::table('variantes')->count()); - $this->assertSame(8, DB::table('item_attributes')->count()); - $this->assertSame(17, DB::table('variant_values')->count()); - $this->assertSame(511, DB::table('attachments')->count()); - $this->assertSame(511, DB::table('catalog_items_attachments')->count()); - $this->assertSame( - 511, - count(Storage::disk('s3')->allFiles('tenants/mutual_smep/catalog-v2')), - ); - $this->assertDatabaseCount('featured_groups', 7); - $this->assertSame([ - 'Productos destacados', - 'Dormitorio y Blanco', - 'Electrodomésticos', - 'Climatización', - 'Tecnología', - 'Bicicletas y Aire Libre', - 'Bazar', - ], DB::table('featured_groups')->orderBy('group_order')->pluck('group_name')->all()); - - DB::table('featured_groups')->orderBy('group_order')->each(function (object $group): void { - $this->assertSame('manual', $group->source_type); - $this->assertSame('carousel', $group->group_layout); - $this->assertSame('column_with_image', $group->product_layout); - if ($group->code === 'productos-destacados-smep') { - $this->assertNull($group->category_id); - } else { - $this->assertNotNull($group->category_id); - $this->assertDatabaseHas('categorias', [ - 'id' => $group->category_id, - 'tenant_code' => 'mutual_smep', - 'categoria_id' => null, - 'nombre' => $group->group_name, - ]); - } - $this->assertGreaterThan( - 0, - DB::table('featured_items')->where('featured_group_id', $group->id)->count(), - ); - }); - - $highlightedGroupId = DB::table('featured_groups') - ->where('code', 'productos-destacados-smep') - ->value('id'); - $highlightedSlugs = DB::table('featured_items') - ->join('catalog_items', 'catalog_items.id', '=', 'featured_items.catalog_item_id') - ->where('featured_items.featured_group_id', $highlightedGroupId) - ->orderBy('featured_items.order') - ->pluck('catalog_items.slug') - ->all(); - $variantProductSlugs = DB::table('catalog_items') - ->whereExists(fn ($query) => $query - ->selectRaw('1') - ->from('variantes') - ->whereColumn('variantes.catalog_item_id', 'catalog_items.id')) - ->pluck('slug') - ->all(); - - $this->assertCount(13, $highlightedSlugs); - $this->assertSame([], array_values(array_diff($variantProductSlugs, $highlightedSlugs))); - $this->assertSame(46, DB::table('featured_items')->count()); - DB::table('featured_groups') - ->where('code', '!=', 'productos-destacados-smep') - ->orderBy('id') - ->each(function (object $group): void { - $this->assertLessThanOrEqual( - 6, - DB::table('featured_items')->where('featured_group_id', $group->id)->count(), - ); - }); - $this->assertDatabaseHas('catalog_items', [ - 'tenant_code' => 'mutual_smep', - 'slug' => 'motorola-g15', - 'precio' => 330000, - ]); - $this->assertSame(10, DB::table('inventories')->min('real_stock')); - $this->assertSame(10, DB::table('inventories')->max('real_stock')); - - $migration->down(); - - foreach ([ - 'featured_items', - 'featured_groups', - 'catalog_items_attachments', - 'attachments', - 'variant_values', - 'item_attributes', - 'variantes', - 'catalog_items', - 'inventories', - 'brands', - ] as $table) { - $this->assertSame(0, DB::table($table)->count(), $table); - } - $this->assertSame([], Storage::disk('s3')->allFiles('tenants/mutual_smep/catalog-v2')); - } - - public function test_it_limits_existing_category_groups_and_restores_them_on_rollback(): void - { - $catalogMigration = require database_path( - 'migrations/2026_09_24_030000_seed_mutual_smep_catalog.php' - ); - $limitMigration = require database_path( - 'migrations/2026_09_24_050000_limit_mutual_smep_category_featured_groups.php' - ); - - $catalogMigration->up(); - - $limitMigration->down(); - $this->assertSame(155, DB::table('featured_items')->count()); - - $limitMigration->up(); - $this->assertSame(46, DB::table('featured_items')->count()); - - $categoryGroupCounts = DB::table('featured_groups') - ->leftJoin('featured_items', 'featured_items.featured_group_id', '=', 'featured_groups.id') - ->where('featured_groups.code', '!=', 'productos-destacados-smep') - ->groupBy('featured_groups.id', 'featured_groups.group_name', 'featured_groups.group_order') - ->orderBy('featured_groups.group_order') - ->selectRaw('featured_groups.group_name, COUNT(featured_items.id) AS item_count') - ->pluck('item_count', 'featured_groups.group_name') - ->map(fn ($count): int => (int) $count) - ->all(); - - $this->assertSame([ - 'Dormitorio y Blanco' => 6, - 'Electrodomésticos' => 6, - 'Climatización' => 6, - 'Tecnología' => 6, - 'Bicicletas y Aire Libre' => 6, - 'Bazar' => 3, - ], $categoryGroupCounts); - - $limitMigration->down(); - $this->assertSame(155, DB::table('featured_items')->count()); - - $catalogMigration->down(); - } - - public function test_it_upgrades_legacy_catalog_images_and_restores_them_on_rollback(): void - { - $catalogMigration = require database_path( - 'migrations/2026_09_24_030000_seed_mutual_smep_catalog.php' - ); - $imageMigration = require database_path( - 'migrations/2026_09_24_060000_optimize_mutual_smep_catalog_images.php' - ); - - $catalogMigration->up(); - - DB::table('attachments')->orderBy('id')->each(function (object $attachment): void { - $optimizedPath = (string) $attachment->path; - $legacyPath = str_replace('catalog-v2/', 'catalog-v1/', $optimizedPath); - $contents = Storage::disk('s3')->get($optimizedPath); - - Storage::disk('s3')->put($legacyPath, $contents.'legacy'); - Storage::disk('s3')->delete($optimizedPath); - DB::table('attachments')->where('id', $attachment->id)->update([ - 'path' => $legacyPath, - 'size' => strlen($contents.'legacy'), - ]); - }); - - $imageMigration->up(); - - $this->assertSame(511, count(Storage::disk('s3')->allFiles('tenants/mutual_smep/catalog-v2'))); - $this->assertSame(0, DB::table('attachments')->where('path', 'like', '%catalog-v1/%')->count()); - $this->assertSame(511, DB::table('attachments')->where('path', 'like', '%catalog-v2/%')->count()); - - $imageMigration->down(); - - $this->assertSame([], Storage::disk('s3')->allFiles('tenants/mutual_smep/catalog-v2')); - $this->assertSame(511, DB::table('attachments')->where('path', 'like', '%catalog-v1/%')->count()); - - $catalogMigration->down(); - $this->assertSame([], Storage::disk('s3')->allFiles('tenants/mutual_smep/catalog-v1')); - } - - private function seedCategoriesAndAttributes(): void - { - $manifest = json_decode( - (string) file_get_contents(database_path('data/mutual_smep_catalog_v1.json')), - true, - flags: JSON_THROW_ON_ERROR, - ); - $parents = []; - - foreach ($manifest['items'] as $item) { - $parentName = $item['parent_category']; - $parentId = $parents[$parentName] ??= DB::table('categorias')->insertGetId([ - 'tenant_code' => 'mutual_smep', - 'categoria_id' => null, - 'nombre' => $parentName, - ]); - - DB::table('categorias')->insertOrIgnore([ - 'tenant_code' => 'mutual_smep', - 'categoria_id' => $parentId, - 'nombre' => $item['category'], - ]); - } - - foreach (['color', 'medida_cama', 'almacenamiento', 'memoria_ram', 'rodado'] as $code) { - DB::table('attribute')->insert([ - 'tenant_codigo' => 'mutual_smep', - 'codigo' => $code, - 'nombre' => $code, - ]); - } - } - - private function createSchema(): void - { - Schema::create('tenants', fn (Blueprint $table) => $table->string('codigo')->primary()); - Schema::create('categorias', function (Blueprint $table): void { - $table->id(); - $table->string('tenant_code'); - $table->unsignedBigInteger('categoria_id')->nullable(); - $table->string('nombre'); - $table->unique(['tenant_code', 'categoria_id', 'nombre']); - }); - Schema::create('attribute', function (Blueprint $table): void { - $table->id(); - $table->string('tenant_codigo'); - $table->string('codigo'); - $table->string('nombre'); - }); - Schema::create('brands', function (Blueprint $table): void { - $table->id(); - $table->string('tenant_codigo'); - $table->string('nombre'); - $table->text('descripcion')->nullable(); - $table->timestamps(); - }); - Schema::create('inventories', function (Blueprint $table): void { - $table->id(); - $table->unsignedBigInteger('sold_units')->default(0); - $table->unsignedBigInteger('refunded_units')->default(0); - $table->unsignedInteger('reserved_stock')->default(0); - $table->unsignedInteger('real_stock')->default(0); - }); - Schema::create('catalog_items', function (Blueprint $table): void { - $table->id(); - $table->string('tenant_code'); - $table->unsignedBigInteger('category_id')->nullable(); - $table->unsignedBigInteger('brand_id')->nullable(); - $table->unsignedBigInteger('inventory_id')->nullable(); - $table->string('type'); - $table->string('slug'); - $table->string('nombre'); - $table->unsignedInteger('group_order')->default(0); - $table->text('descripcion')->nullable(); - $table->decimal('precio', 10, 2); - $table->string('inventory_policy'); - $table->string('inventory_subject'); - $table->boolean('has_tickets')->default(false); - $table->unique(['tenant_code', 'slug']); - }); - Schema::create('variantes', function (Blueprint $table): void { - $table->id(); - $table->foreignId('catalog_item_id')->constrained('catalog_items')->cascadeOnDelete(); - $table->unsignedBigInteger('inventory_id'); - $table->text('descripcion')->nullable(); - $table->decimal('precio', 10, 2)->nullable(); - }); - Schema::create('item_attributes', function (Blueprint $table): void { - $table->id(); - $table->foreignId('catalog_item_id')->constrained('catalog_items')->cascadeOnDelete(); - $table->unsignedBigInteger('attribute_id'); - $table->boolean('allow_multi_select')->default(false); - $table->unsignedInteger('sort_order')->default(0); - $table->boolean('show_in_selector')->default(true); - $table->string('ticket_label')->nullable(); - $table->timestamps(); - }); - Schema::create('variant_values', function (Blueprint $table): void { - $table->id(); - $table->foreignId('variant_id')->constrained('variantes')->cascadeOnDelete(); - $table->foreignId('item_attribute_id')->constrained('item_attributes')->cascadeOnDelete(); - $table->text('value')->nullable(); - $table->timestamps(); - }); - Schema::create('attachments', function (Blueprint $table): void { - $table->id(); - $table->uuid('key')->unique(); - $table->string('path'); - $table->string('filename'); - $table->string('type'); - $table->string('mime_type'); - $table->string('extension')->nullable(); - $table->unsignedBigInteger('size')->default(0); - $table->timestamps(); - }); - Schema::create('catalog_items_attachments', function (Blueprint $table): void { - $table->id(); - $table->foreignId('variant_id')->nullable()->constrained('variantes')->cascadeOnDelete(); - $table->foreignId('catalog_item_id')->constrained('catalog_items')->cascadeOnDelete(); - $table->foreignId('attachment_id')->constrained('attachments')->cascadeOnDelete(); - $table->unsignedInteger('orden')->default(0); - $table->boolean('is_enabled')->default(true); - }); - Schema::create('featured_groups', function (Blueprint $table): void { - $table->id(); - $table->string('tenant_code'); - $table->string('code'); - $table->string('source_type'); - $table->unsignedBigInteger('category_id')->nullable(); - $table->string('product_layout'); - $table->string('group_layout'); - $table->string('group_name'); - $table->unsignedInteger('group_order')->default(0); - }); - Schema::create('featured_items', function (Blueprint $table): void { - $table->id(); - $table->foreignId('featured_group_id')->constrained('featured_groups')->cascadeOnDelete(); - $table->foreignId('catalog_item_id')->constrained('catalog_items')->cascadeOnDelete(); - $table->unsignedInteger('order')->default(0); - }); - } -} diff --git a/tests/Feature/Seeders/MutualSmepAttributeSeederTest.php b/tests/Feature/Seeders/MutualSmepAttributeSeederTest.php deleted file mode 100644 index 8f849655..00000000 --- a/tests/Feature/Seeders/MutualSmepAttributeSeederTest.php +++ /dev/null @@ -1,119 +0,0 @@ -string('codigo')->primary(); - }); - Schema::create('attribute', function (Blueprint $table): void { - $table->id(); - $table->string('tenant_codigo'); - $table->string('codigo'); - $table->string('nombre'); - $table->boolean('is_required')->default(false); - $table->json('metadata_schema')->nullable(); - $table->string('type'); - $table->timestamps(); - $table->unique(['tenant_codigo', 'codigo']); - }); - Schema::create('attribute_options', function (Blueprint $table): void { - $table->id(); - $table->foreignId('attribute_id')->constrained('attribute')->cascadeOnDelete(); - $table->string('value'); - $table->string('label'); - $table->unsignedInteger('sort_order')->default(0); - $table->json('metadata')->nullable(); - $table->timestamps(); - }); - } - - protected function tearDown(): void - { - Schema::dropIfExists('attribute_options'); - Schema::dropIfExists('attribute'); - Schema::dropIfExists('tenants'); - - parent::tearDown(); - } - - public function test_it_creates_the_attributes_and_options_idempotently(): void - { - $this->createTenant('mutual_smep'); - - $this->seed(MutualSmepAttributeSeeder::class); - $this->seed(MutualSmepAttributeSeeder::class); - - $this->assertSame(5, DB::table('attribute')->where('tenant_codigo', 'mutual_smep')->count()); - $this->assertSame(25, DB::table('attribute_options')->count()); - $this->assertDatabaseHas('attribute', [ - 'tenant_codigo' => 'mutual_smep', - 'codigo' => 'medida_cama', - 'nombre' => 'Medida', - 'type' => 'select', - 'is_required' => false, - ]); - $this->assertDatabaseHas('attribute_options', [ - 'value' => '512 GB', - 'label' => '512 GB', - ]); - } - - public function test_down_only_removes_mutual_smep_attributes(): void - { - $this->createTenant('mutual_smep'); - $this->createTenant('other'); - DB::table('attribute')->insert([ - 'tenant_codigo' => 'other', - 'codigo' => 'color', - 'nombre' => 'Color', - 'type' => 'select', - 'created_at' => now(), - 'updated_at' => now(), - ]); - - $seeder = app(MutualSmepAttributeSeeder::class); - $seeder->run(); - $seeder->down(); - - $this->assertDatabaseMissing('attribute', ['tenant_codigo' => 'mutual_smep']); - $this->assertDatabaseHas('attribute', [ - 'tenant_codigo' => 'other', - 'codigo' => 'color', - ]); - } - - public function test_the_data_migration_runs_and_rolls_back_the_attributes(): void - { - $this->createTenant('mutual_smep'); - $migration = require database_path( - 'migrations/2026_09_24_020000_seed_mutual_smep_attributes.php' - ); - - $migration->up(); - - $this->assertSame(5, DB::table('attribute')->where('tenant_codigo', 'mutual_smep')->count()); - $this->assertSame(25, DB::table('attribute_options')->count()); - - $migration->down(); - - $this->assertDatabaseMissing('attribute', ['tenant_codigo' => 'mutual_smep']); - $this->assertSame(0, DB::table('attribute_options')->count()); - } - - private function createTenant(string $code): void - { - DB::table('tenants')->insert(['codigo' => $code]); - } -} diff --git a/tests/Feature/Seeders/MutualSmepCategorySeederTest.php b/tests/Feature/Seeders/MutualSmepCategorySeederTest.php deleted file mode 100644 index 9e516dca..00000000 --- a/tests/Feature/Seeders/MutualSmepCategorySeederTest.php +++ /dev/null @@ -1,119 +0,0 @@ -string('codigo')->primary(); - }); - - Schema::create('categorias', function (Blueprint $table): void { - $table->id(); - $table->string('tenant_code')->nullable(); - $table->unsignedBigInteger('categoria_id')->nullable(); - $table->string('nombre'); - $table->boolean('is_enabled')->default(true); - $table->timestamps(); - }); - } - - protected function tearDown(): void - { - Schema::dropIfExists('categorias'); - Schema::dropIfExists('tenants'); - - parent::tearDown(); - } - - public function test_it_creates_the_mutual_smep_category_hierarchy_idempotently(): void - { - $this->createTenant('mutual_smep'); - - $this->seed(MutualSmepCategorySeeder::class); - $this->seed(MutualSmepCategorySeeder::class); - - $parents = Category::query() - ->where('tenant_code', 'mutual_smep') - ->whereNull('categoria_id') - ->with('subCategories') - ->get() - ->keyBy('nombre'); - - $this->assertCount(6, $parents); - $this->assertCount(37, Category::query()->where('tenant_code', 'mutual_smep')->get()); - $this->assertEqualsCanonicalizing([ - 'Colchones', - 'Bases y Sommiers', - 'Acolchados y Edredones', - 'Frazadas y Mantas', - 'Infantil y Cuna', - ], $parents->get('Dormitorio y Blanco')->subCategories->pluck('nombre')->all()); - $this->assertEqualsCanonicalizing([ - 'Celulares', - 'Notebooks', - 'Smart TV', - 'Audio', - 'Accesorios de Computación', - 'Soportes para TV', - ], $parents->get('Tecnología')->subCategories->pluck('nombre')->all()); - } - - public function test_down_removes_only_the_seeded_mutual_smep_hierarchy(): void - { - $this->createTenant('mutual_smep'); - $this->createTenant('other'); - Category::query()->create([ - 'tenant_code' => 'other', - 'nombre' => 'Tecnología', - ]); - - $seeder = app(MutualSmepCategorySeeder::class); - $seeder->run(); - $seeder->down(); - - $this->assertDatabaseMissing('categorias', [ - 'tenant_code' => 'mutual_smep', - ]); - $this->assertDatabaseHas('categorias', [ - 'tenant_code' => 'other', - 'nombre' => 'Tecnología', - ]); - } - - public function test_the_data_migration_runs_and_rolls_back_the_seeder(): void - { - $this->createTenant('mutual_smep'); - $migration = require database_path( - 'migrations/2026_09_24_010000_seed_mutual_smep_categories.php' - ); - - $migration->up(); - - $this->assertCount(37, Category::query()->where('tenant_code', 'mutual_smep')->get()); - - $migration->down(); - - $this->assertDatabaseMissing('categorias', [ - 'tenant_code' => 'mutual_smep', - ]); - } - - private function createTenant(string $code): void - { - DB::table('tenants')->insert([ - 'codigo' => $code, - ]); - } -}