This commit is contained in:
Lizandro Guarnizo
2026-01-29 20:28:26 -05:00
parent 560099c003
commit 324c83021e
6 changed files with 240 additions and 0 deletions
@@ -0,0 +1,161 @@
<?php
namespace App\Filament\Resources;
use App\Filament\Resources\OjalPresillaResource\Pages;
use App\Models\Ojal;
use App\Models\Prensilla;
use Filament\Forms;
use Filament\Resources\Resource;
use Filament\Tables;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Components\DatePicker;
use Filament\Tables\Filters\SelectFilter;
class OjalPresillaResource extends Resource
{
protected static ?string $model = Ojal::class;
protected static ?string $navigationIcon = 'heroicon-o-rectangle-stack';
protected static ?string $navigationGroup = 'Producción';
protected static ?string $navigationLabel = 'Ojales y Prensillas';
protected static ?string $pluralModelLabel = 'Ojales y Prensillas';
public static function canViewAny(): bool
{
return auth()->user()?->can('ver ojals') ?? false;
}
public static function form(Forms\Form $form): Forms\Form
{
return $form->schema([
Select::make('tipo')
->label('Tipo')
->options([
'ojal' => 'Ojal',
'prensilla' => 'Prensilla',
])
->required()
->live()
->afterStateUpdated(fn ($set) => $set('proveedor_id', null)),
Select::make('proveedor_id')
->label('Proveedor')
->options(function ($get) {
$tipo = $get('tipo') ?? 'prensilla_ojal';
return \App\Models\Proveedor::where('categoria', 'prensilla_ojal')->pluck('nombre', 'id');
})
->searchable()
->preload()
->nullable(),
Select::make('orden_produccion_id')
->label('Orden de Producción')
->relationship('ordenProduccion', 'numero_orden')
->searchable()
->preload()
->required(),
DatePicker::make('fecha_envio')
->label('Fecha de envío')
->default(now())
->required(),
TextInput::make('cantidad_enviada')
->label('Cantidad enviada')
->numeric()
->required()
->minValue(1),
DatePicker::make('fecha_recepcion')
->label('Fecha de recepción'),
TextInput::make('cantidad_recibida')
->label('Cantidad recibida')
->numeric()
->nullable(),
TextInput::make('perdidas')
->label('Pérdidas')
->numeric()
->default(0),
]);
}
public static function table(Tables\Table $table): Tables\Table
{
return $table
->modifyQueryUsing(function ($query) {
// Union de ambas tablas
$ojales = \App\Models\Ojal::select([
'id',
'proveedor_id',
'orden_produccion_id',
'fecha_envio',
'cantidad_enviada',
'fecha_recepcion',
'cantidad_recibida',
'perdidas',
'created_at',
\DB::raw("'ojal' as tipo")
]);
$prensillas = \App\Models\Prensilla::select([
'id',
'proveedor_id',
'orden_produccion_id',
'fecha_envio',
'cantidad_enviada',
'fecha_recepcion',
'cantidad_recibida',
'perdidas',
'created_at',
\DB::raw("'prensilla' as tipo")
]);
return $query->from(\DB::raw("({$ojales->toSql()} UNION ALL {$prensillas->toSql()}) as combined"))
->mergeBindings($ojales->getQuery())
->mergeBindings($prensillas->getQuery());
})
->columns([
Tables\Columns\TextColumn::make('tipo')
->badge()
->color(fn (string $state): string => match ($state) {
'ojal' => 'info',
'prensilla' => 'success',
})
->formatStateUsing(fn (string $state): string => ucfirst($state)),
Tables\Columns\TextColumn::make('proveedor_id')
->label('Proveedor')
->formatStateUsing(fn ($state) => \App\Models\Proveedor::find($state)?->nombre ?? 'N/A'),
Tables\Columns\TextColumn::make('orden_produccion_id')
->label('OP')
->formatStateUsing(fn ($state) => \App\Models\OrdenProduccion::find($state)?->numero_orden ?? 'N/A'),
Tables\Columns\TextColumn::make('cantidad_enviada')->label('Enviadas'),
Tables\Columns\TextColumn::make('cantidad_recibida')->label('Recibidas'),
Tables\Columns\TextColumn::make('perdidas')->label('Pérdidas'),
Tables\Columns\TextColumn::make('fecha_envio')->date()->label('F. Envío'),
Tables\Columns\TextColumn::make('fecha_recepcion')->date()->label('F. Recepción'),
])
->filters([
SelectFilter::make('tipo')
->options([
'ojal' => 'Ojal',
'prensilla' => 'Prensilla',
])
])
->defaultSort('created_at', 'desc');
}
public static function getPages(): array
{
return [
'index' => Pages\ListOjalPresillas::route('/'),
'create' => Pages\CreateOjalPresilla::route('/create'),
'edit' => Pages\EditOjalPresilla::route('/{record}/edit'),
];
}
}
@@ -0,0 +1,29 @@
<?php
namespace App\Filament\Resources\OjalPresillaResource\Pages;
use App\Filament\Resources\OjalPresillaResource;
use Filament\Resources\Pages\CreateRecord;
class CreateOjalPresilla extends CreateRecord
{
protected static string $resource = OjalPresillaResource::class;
protected function mutateFormDataBeforeCreate(array $data): array
{
$tipo = $data['tipo'] ?? 'ojal';
unset($data['tipo']);
// Guardar en la tabla correspondiente
if ($tipo === 'prensilla') {
$record = \App\Models\Prensilla::create($data);
} else {
$record = \App\Models\Ojal::create($data);
}
// Redirigir al listado
$this->redirect(OjalPresillaResource::getUrl('index'));
return $data;
}
}
@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\OjalPresillaResource\Pages;
use App\Filament\Resources\OjalPresillaResource;
use Filament\Actions;
use Filament\Resources\Pages\EditRecord;
class EditOjalPresilla extends EditRecord
{
protected static string $resource = OjalPresillaResource::class;
protected function getHeaderActions(): array
{
return [
Actions\DeleteAction::make(),
];
}
}
@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\OjalPresillaResource\Pages;
use App\Filament\Resources\OjalPresillaResource;
use Filament\Actions;
use Filament\Resources\Pages\ListRecords;
class ListOjalPresillas extends ListRecords
{
protected static string $resource = OjalPresillaResource::class;
protected function getHeaderActions(): array
{
return [
Actions\CreateAction::make(),
];
}
}
+6
View File
@@ -16,6 +16,12 @@ class OjalResource extends Resource
protected static ?string $model = Ojal::class;
protected static ?string $navigationIcon = 'heroicon-o-rectangle-stack';
protected static ?string $navigationGroup = 'Producción';
protected static bool $shouldRegisterNavigation = false; // Ocultar del menú
public static function canViewAny(): bool
{
return auth()->user()?->can('ver ojals') ?? false;
}
public static function form(Forms\Form $form): Forms\Form
{
@@ -16,6 +16,12 @@ class PrensillaResource extends Resource
protected static ?string $model = Prensilla::class;
protected static ?string $navigationIcon = 'heroicon-o-rectangle-stack';
protected static ?string $navigationGroup = 'Producción';
protected static bool $shouldRegisterNavigation = false; // Ocultar del menú
public static function canViewAny(): bool
{
return auth()->user()?->can('ver prensillas') ?? false;
}
public static function form(Forms\Form $form): Forms\Form
{