This commit is contained in:
Lizandro Guarnizo
2026-01-19 13:21:11 -05:00
parent b63995d74a
commit ce8a479097
8 changed files with 495 additions and 8 deletions
@@ -6,7 +6,137 @@ use App\Filament\Resources\InventarioPrendaResource;
use Filament\Actions;
use Filament\Resources\Pages\CreateRecord;
use Illuminate\Support\Facades\DB;
use Illuminate\Validation\ValidationException;
use App\Models\ProductVariant;
use App\Models\InventarioPrendaDistribucion;
class CreateInventarioPrenda extends CreateRecord
{
protected static string $resource = InventarioPrendaResource::class;
protected function handleRecordCreation(array $data): \Illuminate\Database\Eloquent\Model
{
$distribuciones = $data['distribuciones'] ?? [];
$cantidadTerminada = $data['cantidad_terminada'] ?? 0;
// Validación: la suma de las distribuciones no puede exceder la cantidad terminada
$sum = 0;
foreach ($distribuciones as $d) {
$sum += intval($d['cantidad'] ?? 0);
}
if ($sum > $cantidadTerminada) {
throw ValidationException::withMessages(['distribuciones' => 'La suma de las cantidades asignadas excede la cantidad terminada.']);
}
// Remover distribuciones del payload antes de crear el registro principal
unset($data['distribuciones']);
$record = parent::handleRecordCreation($data);
// Procesar distribuciones y actualizar stock en bodegas
foreach ($distribuciones as $d) {
$cantidad = intval($d['cantidad'] ?? 0);
if ($cantidad <= 0) continue;
// Crear registro de distribución
$created = InventarioPrendaDistribucion::create([
'inventario_prenda_id' => $record->id,
'bodega_id' => $d['bodega_id'] ?? null,
'color_id' => $d['color_id'] ?? null,
'size_id' => $d['size_id'] ?? null,
'cantidad' => $cantidad,
]);
// Actualizar stock en bodegas
$bodegaId = $d['bodega_id'] ?? null;
// Si tiene color y talla -> variante
if (!empty($d['color_id']) && !empty($d['size_id'])) {
$productoId = $record->producto_id ?? ($record->ordenProduccion->producto_id ?? null);
// Si no hay producto, intentar obtener por OP
if (! $productoId && $record->ordenProduccion) {
$productoId = $record->ordenProduccion->producto_id;
}
if ($productoId) {
$variant = ProductVariant::firstOrCreate(
[
'producto_id' => $productoId,
'color_id' => $d['color_id'],
'size_id' => $d['size_id'],
],
[
'stock' => 0,
'sku' => null,
'barcode' => null,
]
);
$existing = DB::table('variante_bodega')
->where('variante_id', $variant->id)
->where('bodega_id', $bodegaId)
->first();
if ($existing) {
DB::table('variante_bodega')
->where('variante_id', $variant->id)
->where('bodega_id', $bodegaId)
->update([
'stock' => ($existing->stock ?? 0) + $cantidad,
'updated_at' => now(),
]);
} else {
DB::table('variante_bodega')->insert([
'variante_id' => $variant->id,
'bodega_id' => $bodegaId,
'stock' => $cantidad,
'created_at' => now(),
'updated_at' => now(),
]);
}
// También incrementar stock total de la variante
$variant->increment('stock', $cantidad);
}
} else {
// Producto a nivel general
$productoId = $record->producto_id ?? ($record->ordenProduccion->producto_id ?? null);
if ($productoId) {
$existing = DB::table('producto_bodega')
->where('producto_id', $productoId)
->where('bodega_id', $bodegaId)
->first();
if ($existing) {
DB::table('producto_bodega')
->where('producto_id', $productoId)
->where('bodega_id', $bodegaId)
->update([
'stock' => ($existing->stock ?? 0) + $cantidad,
'updated_at' => now(),
]);
} else {
DB::table('producto_bodega')->insert([
'producto_id' => $productoId,
'bodega_id' => $bodegaId,
'stock' => $cantidad,
'created_at' => now(),
'updated_at' => now(),
]);
}
// Incrementar stock total del producto si no tiene variantes
$prod = \App\Models\Producto::find($productoId);
if ($prod && ! $prod->variants()->exists()) {
$prod->increment('stock', $cantidad);
}
}
}
}
return $record;
}
}
@@ -0,0 +1,44 @@
<?php
namespace App\Filament\Resources\InventarioPrendaResource\RelationManagers;
use Filament\Resources\RelationManagers\RelationManager;
use Filament\Tables;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Tables\Table;
class DistribucionesRelationManager extends RelationManager
{
protected static string $relationship = 'distribuciones';
protected static ?string $recordTitleAttribute = 'id';
public function form(Form $form): Form
{
return $form->schema([
Forms\Components\Select::make('bodega_id')->relationship('bodega', 'nombre')->required(),
Forms\Components\Select::make('color_id')->relationship('color', 'nombre')->nullable(),
Forms\Components\Select::make('size_id')->relationship('size', 'nombre')->nullable(),
Forms\Components\TextInput::make('cantidad')->numeric()->required()->minValue(1),
]);
}
public function table(Table $table): Table
{
return $table->columns([
Tables\Columns\TextColumn::make('bodega.nombre')->label('Bodega'),
Tables\Columns\TextColumn::make('color.nombre')->label('Color'),
Tables\Columns\TextColumn::make('size.nombre')->label('Talla'),
Tables\Columns\TextColumn::make('cantidad'),
Tables\Columns\TextColumn::make('created_at')->label('Creado')->dateTime(),
])->filters([
//
])->headerActions([
Tables\Actions\CreateAction::make(),
])->actions([
Tables\Actions\EditAction::make(),
Tables\Actions\DeleteAction::make(),
]);
}
}