From df69d1083bb4414549fe79e57fcd63ee1b088cbd Mon Sep 17 00:00:00 2001 From: dhanabalan Date: Tue, 25 Mar 2025 21:05:43 +0530 Subject: [PATCH] after production line stop reason column remove --- app/Filament/Imports/BlockImporter.php | 51 +++++++++++ app/Filament/Imports/CompanyImporter.php | 45 ++++++++++ app/Filament/Imports/ItemImporter.php | 18 ++++ app/Filament/Imports/LineImporter.php | 68 +++++++++++++++ app/Filament/Imports/LineStopImporter.php | 68 +++++++++++++++ app/Filament/Imports/PlantImporter.php | 62 ++++++++++++++ .../Imports/ProductionLineStopImporter.php | 84 +++++++++++++++++++ .../Imports/ProductionPlanImporter.php | 70 ++++++++++++++++ .../Imports/ProductionQuantityImporter.php | 23 ++--- app/Filament/Imports/ShiftImporter.php | 78 +++++++++++++++++ app/Filament/Pages/Dashboard.php | 39 +++++---- app/Filament/Resources/BlockResource.php | 7 ++ app/Filament/Resources/CompanyResource.php | 7 ++ app/Filament/Resources/ItemResource.php | 27 +++++- app/Filament/Resources/LineResource.php | 6 ++ app/Filament/Resources/PlantResource.php | 6 ++ .../Resources/ProductionLineStopResource.php | 6 ++ .../Resources/ProductionPlanResource.php | 6 ++ app/Models/Plant.php | 5 ++ .../2025_03_20_125247_create_shifts_table.php | 2 +- 20 files changed, 644 insertions(+), 34 deletions(-) create mode 100644 app/Filament/Imports/BlockImporter.php create mode 100644 app/Filament/Imports/CompanyImporter.php create mode 100644 app/Filament/Imports/LineImporter.php create mode 100644 app/Filament/Imports/LineStopImporter.php create mode 100644 app/Filament/Imports/PlantImporter.php create mode 100644 app/Filament/Imports/ProductionLineStopImporter.php create mode 100644 app/Filament/Imports/ProductionPlanImporter.php create mode 100644 app/Filament/Imports/ShiftImporter.php diff --git a/app/Filament/Imports/BlockImporter.php b/app/Filament/Imports/BlockImporter.php new file mode 100644 index 000000000..7236a5d4c --- /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 000000000..b8cde4ccd --- /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 849ee5676..ebee437cd 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 000000000..8174485d5 --- /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 000000000..c531ff233 --- /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 000000000..c5e64433b --- /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 000000000..18fb04601 --- /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 000000000..ef2f36b5c --- /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 c2828db88..118fc021e 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 000000000..47346bd38 --- /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 20604aee9..8f9e5e382 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 a56c99780..7ec6e5f2c 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 4593d5c5b..d90577fb6 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 26d575bc3..48d3db2ab 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 64bcb4bde..32180e23b 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 5eb2a4e09..cbd6cbc9a 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 495cb4cfd..46f112a61 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 8b6d8aeff..e15972868 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 8d4254286..bbc2515dd 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 1ba0adef4..5b6f9430b 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,