@extends('layouts.admin') @section('content') {{ Aire::open()->route('products.update', $product)->bind($product)->enctype('multipart/form-data')}}

{{ $product->name }}

Ver

Información

{{ Aire::input('name', "Nombre")->groupClass('col-span-3') }} {{ Aire::input('slug', "Slug")->groupClass('col-span-3') }} {{ Aire::input('sku', "SKU")->groupClass('col-span-3') }} @php $discount_on = $product->finalPrice['discount_on']; $discount = $product->finalPrice['discount']; @endphp {{ Aire::input('price', "Precio")->groupClass('col-span-3')->helpText( $discount_on ? "Descuento del {$discount}% aplicado en {$discount_on}" : "Sin descuento" ) }} {{ Aire::input('delivery_days', "Tiempo de entrega")->helpText('Días')->groupClass('col-span-3') }} {{ Aire::input('quantity_min', "Cantidad mínima")->groupClass('col-span-3') }} {{ Aire::input('quantity_max', "Cantidad maxima")->helpText('Si esta en cero no hay límite')->groupClass('col-span-3') }} {{ Aire::input('safety_stock', 'Stock de seguridad')->type('number')->min(0)->helpText('Nivel mínimo de inventario permitido por producto')->groupClass('col-span-3') }}
{{ Aire::hidden('inventory_opt_out')->value(0)}}

Descuentos por marca y proveedor

Marca o proveedor pueden tener descuentos globales. Activa estas opciones para que este producto no reciba ese descuento de marca o de proveedor. El descuento configurado en este producto (tipo y valor más abajo) sigue aplicando con normalidad.

{{ Aire::hidden('exclude_from_brand_discount')->value(0)}}
{{ Aire::hidden('exclude_from_vendor_discount')->value(0)}}
@if(!$product->is_combined) {{Aire::select($variations, 'variation_id', "Variación")->groupClass('col-span-3')}} @endif {{ Aire::select(['percentage' => 'Porcentaje (%)', 'fixed_amount' => 'Valor Fijo ($)'], 'discount_type', 'Tipo de Descuento')->groupClass('col-span-2') }} {{Aire::input('discount', 'Valor del Descuento')->id('discount')->min(0)->step(0.01)->groupClass('col-span-2')}}
{{ Aire::hidden('first_purchase_only')->value(0)}}
{{Aire::input('package_quantity', 'Cantidad por Empaque')->id('package_quantity')->groupClass('col-span-3')}} {{Aire::input('step', 'Steps')->min(1)->max(100)->groupClass('col-span-3')->helpText('Salto de cantidad para el precio')}} {{ Aire::input('coordinadora_weight_kg', 'Peso Coordinadora (kg)')->type('number')->step(0.001)->min(0)->groupClass('col-span-3') }} {{ Aire::input('coordinadora_height_cm', 'Alto Coordinadora (cm)')->type('number')->step(0.01)->min(0)->groupClass('col-span-1') }} {{ Aire::input('coordinadora_width_cm', 'Ancho Coordinadora (cm)')->type('number')->step(0.01)->min(0)->groupClass('col-span-1') }} {{ Aire::input('coordinadora_length_cm', 'Largo Coordinadora (cm)')->type('number')->step(0.01)->min(0)->groupClass('col-span-1') }}
{{ Aire::hidden('calculate_package_price')->value(0)}}

Cuando está desactivado, el empaque se trata como 1 unidad en el procesamiento de órdenes

{{ Aire::hidden('sync_variations_with_dynamics')->value(0)}}

Cuando está activado, las variaciones heredan el precio del producto padre al actualizar desde Dynamics

{{ Aire::textarea('short_description', "")->id('sort_description')->rows(3)->groupClass('mb-0')->helpText('Descripción breve para listados de productos') }}
@if($product->specifications_pdf)

PDF cargado

Ver PDF actual
@endif

{{ $product->specifications_pdf ? 'Cargar un nuevo PDF reemplazará el actual.' : 'Cargar un archivo PDF con las especificaciones del producto.' }} Máximo 10MB.

{{ Aire::hidden('active')->value(0)}}
@includeWhen($product->variation, 'products.variations', ['product' => $product])

{{ Aire::submit('Actualizar')->variant()->submit() }} Cancelar

{{-- Inventory overview --}}

Inventario del producto padre por bodega

@if($product->variation_id)

Este producto tiene variaciones. Si el SKU del padre es dummy, el inventario real puede estar en los SKU de las variaciones.

@endif @php $inventories = ($product->inventories ?? collect())->whereNull('variation_item_id'); @endphp @if($inventories->count() === 0)

Sin registros de inventario.

@else
@foreach($inventories as $inv)
Bodega
{{ $inv->bodega_code }}
Disponible
{{ (int) $inv->available }}
Reservado
{{ (int) $inv->reserved }}
Físico
{{ (int) $inv->physical }}
@endforeach
@endif @if($product->variation_id && $product->items->count())

Inventario por variación

@foreach($product->items->where('pivot.enabled', 1)->sortBy('id') as $item) @php $variationSku = $product->selectedVariationSku((int) $item->id); $variationInventories = $product->inventoriesForSelectedVariation((int) $item->id)->orderBy('bodega_code')->get(); @endphp
{{ $item->name }}
SKU variación: {{ $variationSku ?: 'Sin SKU' }}
@if(! $variationSku) Sin SKU para sincronizar @endif
@if($variationInventories->count() === 0)

Sin registros de inventario para esta variación.

@else
@foreach($variationInventories as $inv)
Bodega
{{ $inv->bodega_code }}
Disponible
{{ (int) $inv->available }}
Reservado
{{ (int) $inv->reserved }}
Físico
{{ (int) $inv->physical }}
@endforeach
@endif
@endforeach
@endif

Productos Relacionados

Marca

{{Aire::select($brands, 'brand_id')}}

Impuesto

{{Aire::select($taxes, 'tax_id')}}

Bonificacion

{{Aire::select($bonifications, 'bonification_id')->value(old('bonification_id', $product->bonifications->first()?->id))}}
{{ Aire::close() }} @includeWhen($product->is_combined, 'products.combinations', ['product' => $product, 'products' => $products])

Imagenes

@php $enabledVariationItems = $product->items->where('pivot.enabled', 1)->values(); $imagesPayload = $product->images->map(function ($img) use ($product) { return [ 'id' => $img->id, 'url' => asset('storage/'.$img->path), 'delete_url' => route('products.images_delete', [$product, $img]), 'update_variation_url' => route('products.images_variation', [$product, $img]), 'variation_item_id' => $img->variation_item_id, ]; })->values()->all(); $variationItemsPayload = $enabledVariationItems->map(function ($item) { return [ 'id' => $item->id, 'name' => $item->name, ]; })->values()->all(); @endphp
{{ Aire::open()->route('products.images', $product)->bind($product)->enctype('multipart/form-data')}}

Imagenes

@php $enabledVariationItems = $product->items->where('pivot.enabled', 1)->values(); @endphp @if($product->variation && $enabledVariationItems->count())

Las imágenes ya cargadas se asignan en la cuadrícula de la izquierda. Aquí puedes elegir la variación al subir imágenes nuevas.

@endif

Puede seleccionar múltiples archivos (máx. 4MB cada uno)

{{ Aire::submit('Agregar')->variant()->submit() }}
{{ Aire::close() }}
@endsection @section('scripts') @endsection