diff --git a/app/Filament/Imports/BlockImporter.php b/app/Filament/Imports/BlockImporter.php new file mode 100644 index 0000000..7236a5d --- /dev/null +++ b/app/Filament/Imports/BlockImporter.php @@ -0,0 +1,51 @@ +requiredMapping() + ->exampleHeader('Block Name') + ->label('Block Name') + ->rules(['required']), + ImportColumn::make('plant') + ->requiredMapping() + ->exampleHeader('Plant Name') + ->label('Plant Name') + ->relationship(resolveUsing:'name') + ->rules(['required']), + ]; + } + + public function resolveRecord(): ?Block + { + // return Block::firstOrNew([ + // // Update existing records, matching them by `$this->data['column_name']` + // 'email' => $this->data['email'], + // ]); + + return new Block(); + } + + public static function getCompletedNotificationBody(Import $import): string + { + $body = 'Your block import has completed and ' . number_format($import->successful_rows) . ' ' . str('row')->plural($import->successful_rows) . ' imported.'; + + if ($failedRowsCount = $import->getFailedRowsCount()) { + $body .= ' ' . number_format($failedRowsCount) . ' ' . str('row')->plural($failedRowsCount) . ' failed to import.'; + } + + return $body; + } +} diff --git a/app/Filament/Imports/CompanyImporter.php b/app/Filament/Imports/CompanyImporter.php new file mode 100644 index 0000000..b8cde4c --- /dev/null +++ b/app/Filament/Imports/CompanyImporter.php @@ -0,0 +1,45 @@ +requiredMapping() + ->exampleHeader('Company Name') + ->label('Company Name') + ->rules(['required']), + ]; + } + + public function resolveRecord(): ?Company + { + // return Company::firstOrNew([ + // // Update existing records, matching them by `$this->data['column_name']` + // 'email' => $this->data['email'], + // ]); + + return new Company(); + } + + public static function getCompletedNotificationBody(Import $import): string + { + $body = 'Your company import has completed and ' . number_format($import->successful_rows) . ' ' . str('row')->plural($import->successful_rows) . ' imported.'; + + if ($failedRowsCount = $import->getFailedRowsCount()) { + $body .= ' ' . number_format($failedRowsCount) . ' ' . str('row')->plural($failedRowsCount) . ' failed to import.'; + } + + return $body; + } +} diff --git a/app/Filament/Imports/ItemImporter.php b/app/Filament/Imports/ItemImporter.php index 849ee56..ebee437 100644 --- a/app/Filament/Imports/ItemImporter.php +++ b/app/Filament/Imports/ItemImporter.php @@ -30,6 +30,24 @@ class ItemImporter extends Importer ->label('Hourly Quantity') ->numeric() ->rules(['required', 'integer']), + ImportColumn::make('line') + ->requiredMapping() + ->exampleHeader('Line Name') + ->label('Line Name') + ->relationship(resolveUsing:'name') + ->rules(['required']), + ImportColumn::make('block') + ->requiredMapping() + ->exampleHeader('Block Name') + ->label('Block Name') + ->relationship(resolveUsing:'name') + ->rules(['required']), + ImportColumn::make('plant') + ->requiredMapping() + ->exampleHeader('Plant Name') + ->label('Plant Name') + ->relationship(resolveUsing:'name') + ->rules(['required']), ]; } diff --git a/app/Filament/Imports/LineImporter.php b/app/Filament/Imports/LineImporter.php new file mode 100644 index 0000000..8174485 --- /dev/null +++ b/app/Filament/Imports/LineImporter.php @@ -0,0 +1,68 @@ +requiredMapping() + ->exampleHeader('Line Name') + ->label('Line Name') + ->rules(['required']), + ImportColumn::make('type') + ->requiredMapping() + ->exampleHeader('Line Type') + ->label('Line Type') + ->rules(['required']), + ImportColumn::make('shift') + ->requiredMapping() + ->exampleHeader('Shift Name') + ->label('Shift Name') + ->relationship(resolveUsing:'name') + ->rules(['required']), + ImportColumn::make('block') + ->requiredMapping() + ->exampleHeader('Block Name') + ->label('Block Name') + ->relationship(resolveUsing:'name') + ->rules(['required']), + ImportColumn::make('plant') + ->requiredMapping() + ->exampleHeader('Plant Name') + ->label('Plant Name') + ->relationship(resolveUsing:'name') + ->rules(['required']), + ]; + } + + public function resolveRecord(): ?Line + { + // return Line::firstOrNew([ + // // Update existing records, matching them by `$this->data['column_name']` + // 'email' => $this->data['email'], + // ]); + + return new Line(); + } + + public static function getCompletedNotificationBody(Import $import): string + { + $body = 'Your line import has completed and ' . number_format($import->successful_rows) . ' ' . str('row')->plural($import->successful_rows) . ' imported.'; + + if ($failedRowsCount = $import->getFailedRowsCount()) { + $body .= ' ' . number_format($failedRowsCount) . ' ' . str('row')->plural($failedRowsCount) . ' failed to import.'; + } + + return $body; + } +} diff --git a/app/Filament/Imports/LineStopImporter.php b/app/Filament/Imports/LineStopImporter.php new file mode 100644 index 0000000..c531ff2 --- /dev/null +++ b/app/Filament/Imports/LineStopImporter.php @@ -0,0 +1,68 @@ +requiredMapping() + ->exampleHeader('Line Stop Code') + ->label('Line Stop Code') + ->rules(['required']), + ImportColumn::make('reason') + ->requiredMapping() + ->exampleHeader('Line Stop Reason') + ->label('Line Stop Reason') + ->rules(['required']), + ImportColumn::make('shift') + ->requiredMapping() + ->exampleHeader('Shift Name') + ->label('Shift Name') + ->relationship(resolveUsing:'name') + ->rules(['required']), + ImportColumn::make('block') + ->requiredMapping() + ->exampleHeader('Block Name') + ->label('Block Name') + ->relationship(resolveUsing:'name') + ->rules(['required']), + ImportColumn::make('plant') + ->requiredMapping() + ->exampleHeader('Plant Name') + ->label('Plant Name') + ->relationship(resolveUsing:'name') + ->rules(['required']), + ]; + } + + public function resolveRecord(): ?LineStop + { + // return LineStop::firstOrNew([ + // // Update existing records, matching them by `$this->data['column_name']` + // 'email' => $this->data['email'], + // ]); + + return new LineStop(); + } + + public static function getCompletedNotificationBody(Import $import): string + { + $body = 'Your line stop import has completed and ' . number_format($import->successful_rows) . ' ' . str('row')->plural($import->successful_rows) . ' imported.'; + + if ($failedRowsCount = $import->getFailedRowsCount()) { + $body .= ' ' . number_format($failedRowsCount) . ' ' . str('row')->plural($failedRowsCount) . ' failed to import.'; + } + + return $body; + } +} diff --git a/app/Filament/Imports/PlantImporter.php b/app/Filament/Imports/PlantImporter.php new file mode 100644 index 0000000..c5e6443 --- /dev/null +++ b/app/Filament/Imports/PlantImporter.php @@ -0,0 +1,62 @@ +requiredMapping() + ->numeric() + ->exampleHeader('Plant Code') + ->label('Plant Code') + ->rules(['required']), //, 'integer' + ImportColumn::make('company') + ->requiredMapping() + ->exampleHeader('Company Name') + ->label('Company Name') + ->relationship(resolveUsing:'name') + ->rules(['required']), + ImportColumn::make('name') + ->requiredMapping() + ->exampleHeader('Plant Name') + ->label('Plant Name') + ->rules(['required']), + ImportColumn::make('address') + ->requiredMapping() + ->exampleHeader('Plant Address') + ->label('Plant Address') + ->rules(['required']), + ]; + } + + public function resolveRecord(): ?Plant + { + // return Plant::firstOrNew([ + // // Update existing records, matching them by `$this->data['column_name']` + // 'email' => $this->data['email'], + // ]); + + return new Plant(); + } + + public static function getCompletedNotificationBody(Import $import): string + { + $body = 'Your plant import has completed and ' . number_format($import->successful_rows) . ' ' . str('row')->plural($import->successful_rows) . ' imported.'; + + if ($failedRowsCount = $import->getFailedRowsCount()) { + $body .= ' ' . number_format($failedRowsCount) . ' ' . str('row')->plural($failedRowsCount) . ' failed to import.'; + } + + return $body; + } +} diff --git a/app/Filament/Imports/ProductionLineStopImporter.php b/app/Filament/Imports/ProductionLineStopImporter.php new file mode 100644 index 0000000..18fb046 --- /dev/null +++ b/app/Filament/Imports/ProductionLineStopImporter.php @@ -0,0 +1,84 @@ +requiredMapping() + ->rules(['required', 'datetime']), + ImportColumn::make('to_datetime') + ->requiredMapping() + ->rules(['required', 'datetime']), + ImportColumn::make('stop_hour') + ->requiredMapping() + ->numeric() + ->rules(['required', 'integer']), + ImportColumn::make('stop_min') + ->requiredMapping() + ->numeric() + ->rules(['required', 'integer']), + ImportColumn::make('linestop') + ->requiredMapping() + ->exampleHeader('Line Stop Code') + ->label('Line Stop Code') + ->relationship(resolveUsing:'code') + ->rules(['required']), + ImportColumn::make('line') + ->requiredMapping() + ->exampleHeader('Line Name') + ->label('Line Name') + ->relationship(resolveUsing:'name') + ->rules(['required']), + ImportColumn::make('shift') + ->requiredMapping() + ->exampleHeader('Shift Name') + ->label('Shift Name') + ->relationship(resolveUsing:'name') + ->rules(['required']), + ImportColumn::make('block') + ->requiredMapping() + ->exampleHeader('Block Name') + ->label('Block Name') + ->relationship(resolveUsing:'name') + ->rules(['required']), + ImportColumn::make('plant') + ->requiredMapping() + ->exampleHeader('Plant Name') + ->label('Plant Name') + ->relationship(resolveUsing:'name') + ->rules(['required']), + ]; + } + + public function resolveRecord(): ?ProductionLineStop + { + // return ProductionLineStop::firstOrNew([ + // // Update existing records, matching them by `$this->data['column_name']` + // 'email' => $this->data['email'], + // ]); + + return new ProductionLineStop(); + } + + public static function getCompletedNotificationBody(Import $import): string + { + $body = 'Your production line stop import has completed and ' . number_format($import->successful_rows) . ' ' . str('row')->plural($import->successful_rows) . ' imported.'; + + if ($failedRowsCount = $import->getFailedRowsCount()) { + $body .= ' ' . number_format($failedRowsCount) . ' ' . str('row')->plural($failedRowsCount) . ' failed to import.'; + } + + return $body; + } +} diff --git a/app/Filament/Imports/ProductionPlanImporter.php b/app/Filament/Imports/ProductionPlanImporter.php new file mode 100644 index 0000000..ef2f36b --- /dev/null +++ b/app/Filament/Imports/ProductionPlanImporter.php @@ -0,0 +1,70 @@ +requiredMapping() + ->exampleHeader('Plan Quantity') + ->label('Plan Quantity') + ->numeric() + ->rules(['required', 'integer']), + ImportColumn::make('production_quantity') + ->requiredMapping() + ->exampleHeader('Production Quantity') + ->label('Production Quantity') + ->numeric() + ->rules(['required', 'integer']), + ImportColumn::make('line') + ->requiredMapping() + ->exampleHeader('Line Name') + ->label('Line Name') + ->relationship(resolveUsing:'name') + ->rules(['required']), + ImportColumn::make('shift') + ->requiredMapping() + ->exampleHeader('Shift Name') + ->label('Shift Name') + ->relationship(resolveUsing:'name') + ->rules(['required']), + ImportColumn::make('plant') + ->requiredMapping() + ->exampleHeader('Plant Name') + ->label('Plant Name') + ->relationship(resolveUsing:'name') + ->rules(['required']), + ]; + } + + public function resolveRecord(): ?ProductionPlan + { + // return ProductionPlan::firstOrNew([ + // // Update existing records, matching them by `$this->data['column_name']` + // 'email' => $this->data['email'], + // ]); + + return new ProductionPlan(); + } + + public static function getCompletedNotificationBody(Import $import): string + { + $body = 'Your production plan import has completed and ' . number_format($import->successful_rows) . ' ' . str('row')->plural($import->successful_rows) . ' imported.'; + + if ($failedRowsCount = $import->getFailedRowsCount()) { + $body .= ' ' . number_format($failedRowsCount) . ' ' . str('row')->plural($failedRowsCount) . ' failed to import.'; + } + + return $body; + } +} diff --git a/app/Filament/Imports/ProductionQuantityImporter.php b/app/Filament/Imports/ProductionQuantityImporter.php index c2828db..118fc02 100644 --- a/app/Filament/Imports/ProductionQuantityImporter.php +++ b/app/Filament/Imports/ProductionQuantityImporter.php @@ -19,29 +19,24 @@ class ProductionQuantityImporter extends Importer ->exampleHeader('Created DateTime') ->label('Created DateTime') ->rules(['required']), - ImportColumn::make('plan_quantity') - ->requiredMapping() - ->exampleHeader('Plan Quantity') - ->label('Plan Quantity') - ->numeric() - ->rules(['required', 'integer']), - ImportColumn::make('hourly_quantity') - ->requiredMapping() - ->exampleHeader('Hourly Quantity') - ->label('Hourly Quantity') - ->numeric() - ->rules(['required', 'integer']), - ImportColumn::make('item_code') + // ImportColumn::make('hourly_quantity') + // ->requiredMapping() + // ->exampleHeader('Hourly Quantity') + // ->label('Hourly Quantity') + // ->numeric() + // ->rules(['required', 'integer']), + ImportColumn::make('item') ->requiredMapping() ->exampleHeader('Item Code') ->label('Item Code') + ->relationship(resolveUsing:'code') ->rules(['required']), ImportColumn::make('serial_number') ->requiredMapping() ->exampleHeader('Serial Number') ->label('Serial Number') ->rules(['required']), - ImportColumn::make('line') + ImportColumn::make('line') ->requiredMapping() ->exampleHeader('Line Name') ->label('Line Name') diff --git a/app/Filament/Imports/ShiftImporter.php b/app/Filament/Imports/ShiftImporter.php new file mode 100644 index 0000000..47346bd --- /dev/null +++ b/app/Filament/Imports/ShiftImporter.php @@ -0,0 +1,78 @@ +requiredMapping() + ->exampleHeader('Shift Name') + ->label('Shift Name') + ->rules(['required']), + ImportColumn::make('block') + ->requiredMapping() + ->exampleHeader('Block Name') + ->label('Block Name') + ->relationship(resolveUsing:'name') + ->rules(['required']), + ImportColumn::make('plant') + ->requiredMapping() + ->exampleHeader('Plant Name') + ->label('Plant Name') + ->relationship(resolveUsing:'name') + ->rules(['required']), + ImportColumn::make('start_time') + ->requiredMapping() + ->exampleHeader('Start Time') + ->label('Start Time') + ->rules(['required']), + ImportColumn::make('duration') + ->requiredMapping() + ->numeric() + ->exampleHeader('Shift Duration') + ->label('Shift Duration') + ->rules(['required', 'integer']), + ImportColumn::make('end_time') + ->requiredMapping() + ->exampleHeader('End Time') + ->label('End Time') + ->rules(['required']), + ImportColumn::make('status') + ->requiredMapping() + ->exampleHeader('Active Status') + ->label('Active Status') + ->rules(['required']), + ]; + } + + public function resolveRecord(): ?Shift + { + // return Shift::firstOrNew([ + // // Update existing records, matching them by `$this->data['column_name']` + // 'email' => $this->data['email'], + // ]); + + return new Shift(); + } + + public static function getCompletedNotificationBody(Import $import): string + { + $body = 'Your shift import has completed and ' . number_format($import->successful_rows) . ' ' . str('row')->plural($import->successful_rows) . ' imported.'; + + if ($failedRowsCount = $import->getFailedRowsCount()) { + $body .= ' ' . number_format($failedRowsCount) . ' ' . str('row')->plural($failedRowsCount) . ' failed to import.'; + } + + return $body; + } +} diff --git a/app/Filament/Pages/Dashboard.php b/app/Filament/Pages/Dashboard.php index 20604ae..8f9e5e3 100644 --- a/app/Filament/Pages/Dashboard.php +++ b/app/Filament/Pages/Dashboard.php @@ -1,26 +1,33 @@ schema([ - Select::make('Plant') - ->options(\DB::table('plants')->pluck('name', 'name')) // Fetch plant names - ->label('Select Plant'), + public function filtersForm(Form $form): Form + { + return $form->schema([ + // Select::make('plant_id') + // ->relationship('plant', 'name') + // ->required() + // ->reactive(), - Select::make('Line') - ->options(\DB::table('lines')->pluck('name', 'name')) // Fetch line names - ->label('Select Line'), - ]); - } + // Select::make('line_id') + // ->relationship('line', 'name') + // ->required() + // ->options(fn (callable $get) => + // Line::where('plant_id', $get('plant_id'))->pluck('name', 'id') + // ) + // ->reactive() + // ->afterStateUpdated(fn ($set) => $set('line_id', null)), + ]); + } } diff --git a/app/Filament/Resources/BlockResource.php b/app/Filament/Resources/BlockResource.php index a56c997..7ec6e5f 100644 --- a/app/Filament/Resources/BlockResource.php +++ b/app/Filament/Resources/BlockResource.php @@ -2,12 +2,14 @@ namespace App\Filament\Resources; +use App\Filament\Imports\BlockImporter; use App\Filament\Resources\BlockResource\Pages; use App\Models\Block; use Filament\Forms; use Filament\Forms\Form; use Filament\Resources\Resource; use Filament\Tables; +use Filament\Tables\Actions\ImportAction; use Filament\Tables\Table; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\SoftDeletingScope; @@ -43,6 +45,7 @@ class BlockResource extends Resource ->numeric() ->sortable(), Tables\Columns\TextColumn::make('name') + //->unique(ignoreRecord: true) ->sortable(), Tables\Columns\TextColumn::make('plant.name') ->sortable(), @@ -72,6 +75,10 @@ class BlockResource extends Resource Tables\Actions\ForceDeleteBulkAction::make(), Tables\Actions\RestoreBulkAction::make(), ]), + ]) + ->headerActions([ + ImportAction::make() + ->importer(BlockImporter::class), ]); } diff --git a/app/Filament/Resources/CompanyResource.php b/app/Filament/Resources/CompanyResource.php index 4593d5c..d90577f 100644 --- a/app/Filament/Resources/CompanyResource.php +++ b/app/Filament/Resources/CompanyResource.php @@ -2,13 +2,16 @@ namespace App\Filament\Resources; +use App\Filament\Imports\CompanyImporter; use App\Filament\Resources\CompanyResource\Pages; use App\Filament\Resources\CompanyResource\RelationManagers\PlantsRelationManager; use App\Models\Company; +use Filament\Actions\Imports\Importer; use Filament\Forms; use Filament\Forms\Form; use Filament\Resources\Resource; use Filament\Tables; +use Filament\Tables\Actions\ImportAction; use Filament\Tables\Table; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\SoftDeletingScope; @@ -68,6 +71,10 @@ class CompanyResource extends Resource Tables\Actions\ForceDeleteBulkAction::make(), Tables\Actions\RestoreBulkAction::make(), ]), + ]) + ->headerActions([ + ImportAction::make() + ->importer(CompanyImporter::class) ]); } diff --git a/app/Filament/Resources/ItemResource.php b/app/Filament/Resources/ItemResource.php index 26d575b..48d3db2 100644 --- a/app/Filament/Resources/ItemResource.php +++ b/app/Filament/Resources/ItemResource.php @@ -40,12 +40,33 @@ class ItemResource extends Resource Forms\Components\Textarea::make('description') ->required() ->columnSpanFull(), - Forms\Components\Select::make('plant_id') + Forms\Components\Select::make('plant_id') ->relationship('plant', 'name') - ->required(), + ->required() + ->reactive() + ->afterStateUpdated(fn ($set) => $set('block_id', null)), // Reset block_id when plant changes + Forms\Components\Select::make('block_id') ->relationship('block', 'name') - ->required(), + ->required() + ->options(fn (callable $get) => + \App\Models\Block::where('plant_id', $get('plant_id')) + ->pluck('name', 'id') + ->toArray() // Convert collection to array + ) + ->reactive(), // Ensures the dropdown updates when plant_id changes + // Forms\Components\Select::make('plant_id') + // ->relationship('plant', 'name') + // ->required() + // ->reactive(), + // Forms\Components\Select::make('block_id') + // ->relationship('block', 'name') + // ->required() + // ->options(fn (callable $get) => + // \App\Models\Block::where('plant_id', $get('plant_id'))->pluck('name', 'id') + // ) + // ->reactive() // Updates dynamically when plant_id changes + // ->afterStateUpdated(fn ($set) => $set('block_id', null)), // Reset block_id when plant_id changes Forms\Components\Select::make('line_id') ->relationship('line', 'name') ->required(), diff --git a/app/Filament/Resources/LineResource.php b/app/Filament/Resources/LineResource.php index 64bcb4b..32180e2 100644 --- a/app/Filament/Resources/LineResource.php +++ b/app/Filament/Resources/LineResource.php @@ -2,6 +2,7 @@ namespace App\Filament\Resources; +use App\Filament\Imports\LineImporter; use App\Filament\Resources\LineResource\Pages; use App\Filament\Resources\LineResource\RelationManagers; use App\Models\Line; @@ -9,6 +10,7 @@ use Filament\Forms; use Filament\Forms\Form; use Filament\Resources\Resource; use Filament\Tables; +use Filament\Tables\Actions\ImportAction; use Filament\Tables\Table; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\SoftDeletingScope; @@ -87,6 +89,10 @@ class LineResource extends Resource Tables\Actions\ForceDeleteBulkAction::make(), Tables\Actions\RestoreBulkAction::make(), ]), + ]) + ->headerActions([ + ImportAction::make() + ->importer(LineImporter::class), ]); } diff --git a/app/Filament/Resources/PlantResource.php b/app/Filament/Resources/PlantResource.php index 5eb2a4e..cbd6cbc 100644 --- a/app/Filament/Resources/PlantResource.php +++ b/app/Filament/Resources/PlantResource.php @@ -2,6 +2,7 @@ namespace App\Filament\Resources; +use App\Filament\Imports\PlantImporter; use App\Filament\Resources\PlantResource\Pages; use App\Models\Plant; use Filament\Forms; @@ -9,6 +10,7 @@ use Filament\Forms\Components\Section; use Filament\Forms\Form; use Filament\Resources\Resource; use Filament\Tables; +use Filament\Tables\Actions\ImportAction; use Filament\Tables\Table; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\SoftDeletingScope; @@ -91,6 +93,10 @@ class PlantResource extends Resource Tables\Actions\ForceDeleteBulkAction::make(), Tables\Actions\RestoreBulkAction::make(), ]), + ]) + ->headerActions([ + ImportAction::make() + ->importer(PlantImporter::class), ]); } diff --git a/app/Filament/Resources/ProductionLineStopResource.php b/app/Filament/Resources/ProductionLineStopResource.php index 495cb4c..46f112a 100644 --- a/app/Filament/Resources/ProductionLineStopResource.php +++ b/app/Filament/Resources/ProductionLineStopResource.php @@ -2,6 +2,7 @@ namespace App\Filament\Resources; +use App\Filament\Imports\ProductionLineStopImporter; use App\Filament\Resources\ProductionLineStopResource\Pages; use App\Filament\Resources\ProductionLineStopResource\RelationManagers; use App\Models\ProductionLineStop; @@ -9,6 +10,7 @@ use Filament\Forms; use Filament\Forms\Form; use Filament\Resources\Resource; use Filament\Tables; +use Filament\Tables\Actions\ImportAction; use Filament\Tables\Table; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\SoftDeletingScope; @@ -114,6 +116,10 @@ class ProductionLineStopResource extends Resource Tables\Actions\ForceDeleteBulkAction::make(), Tables\Actions\RestoreBulkAction::make(), ]), + ]) + ->headerActions([ + ImportAction::make() + ->importer(ProductionLineStopImporter::class), ]); } diff --git a/app/Filament/Resources/ProductionPlanResource.php b/app/Filament/Resources/ProductionPlanResource.php index 8b6d8ae..e159728 100644 --- a/app/Filament/Resources/ProductionPlanResource.php +++ b/app/Filament/Resources/ProductionPlanResource.php @@ -2,6 +2,7 @@ namespace App\Filament\Resources; +use App\Filament\Imports\ProductionPlanImporter; use App\Filament\Resources\ProductionPlanResource\Pages; use App\Filament\Resources\ProductionPlanResource\RelationManagers; use App\Models\ProductionPlan; @@ -9,6 +10,7 @@ use Filament\Forms; use Filament\Forms\Form; use Filament\Resources\Resource; use Filament\Tables; +use Filament\Tables\Actions\ImportAction; use Filament\Tables\Table; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\SoftDeletingScope; @@ -92,6 +94,10 @@ class ProductionPlanResource extends Resource Tables\Actions\ForceDeleteBulkAction::make(), Tables\Actions\RestoreBulkAction::make(), ]), + ]) + ->headerActions([ + ImportAction::make() + ->importer(ProductionPlanImporter::class), ]); } diff --git a/app/Models/Plant.php b/app/Models/Plant.php index 8d42542..bbc2515 100644 --- a/app/Models/Plant.php +++ b/app/Models/Plant.php @@ -27,4 +27,9 @@ class Plant extends Model { return $this->hasMany(Block::class); } + + public function lines(): HasMany + { + return $this->hasMany(Line::class); + } } diff --git a/database/migrations/2025_03_20_125247_create_shifts_table.php b/database/migrations/2025_03_20_125247_create_shifts_table.php index 1ba0ade..5b6f943 100644 --- a/database/migrations/2025_03_20_125247_create_shifts_table.php +++ b/database/migrations/2025_03_20_125247_create_shifts_table.php @@ -14,9 +14,9 @@ return new class extends Migration CREATE TABLE shifts ( id BIGINT GENERATED always AS IDENTITY PRIMARY KEY, - name TEXT NOT NULL, block_id BIGINT NOT NULL, plant_id BIGINT NOT NULL, + name TEXT NOT NULL, start_time TIME NOT NULL, duration DECIMAL NOT NULL,