diff --git a/app/Filament/Exports/MotorTestingMasterExporter.php b/app/Filament/Exports/MotorTestingMasterExporter.php new file mode 100644 index 0000000..c49da6a --- /dev/null +++ b/app/Filament/Exports/MotorTestingMasterExporter.php @@ -0,0 +1,67 @@ +label('ID'), + ExportColumn::make('plant.name'), + ExportColumn::make('item.id'), + ExportColumn::make('isi_model'), + ExportColumn::make('phase'), + ExportColumn::make('hp'), + ExportColumn::make('kw'), + ExportColumn::make('volt'), + ExportColumn::make('current'), + ExportColumn::make('rpm'), + ExportColumn::make('torque'), + ExportColumn::make('frequency'), + ExportColumn::make('connection'), + ExportColumn::make('ins_res_limit'), + ExportColumn::make('ins_res_type'), + ExportColumn::make('res_ry_ll'), + ExportColumn::make('res_ry_ul'), + ExportColumn::make('res_yb_ll'), + ExportColumn::make('res_yb_ul'), + ExportColumn::make('res_br_ll'), + ExportColumn::make('res_br_ul'), + ExportColumn::make('lock_volt_limit'), + ExportColumn::make('leak_cur_limit'), + ExportColumn::make('lock_cur_ll'), + ExportColumn::make('lock_cur_ul'), + ExportColumn::make('noload_cur_ll'), + ExportColumn::make('noload_cur_ul'), + ExportColumn::make('noload_pow_ll'), + ExportColumn::make('noload_pow_ul'), + ExportColumn::make('noload_spd_ll'), + ExportColumn::make('noload_spd_ul'), + ExportColumn::make('created_at'), + ExportColumn::make('updated_at'), + ExportColumn::make('deleted_at'), + ExportColumn::make('created_by'), + ExportColumn::make('updated_by'), + ]; + } + + public static function getCompletedNotificationBody(Export $export): string + { + $body = 'Your motor testing master export has completed and ' . number_format($export->successful_rows) . ' ' . str('row')->plural($export->successful_rows) . ' exported.'; + + if ($failedRowsCount = $export->getFailedRowsCount()) { + $body .= ' ' . number_format($failedRowsCount) . ' ' . str('row')->plural($failedRowsCount) . ' failed to export.'; + } + + return $body; + } +} diff --git a/app/Filament/Imports/MotorTestingMasterImporter.php b/app/Filament/Imports/MotorTestingMasterImporter.php new file mode 100644 index 0000000..2033395 --- /dev/null +++ b/app/Filament/Imports/MotorTestingMasterImporter.php @@ -0,0 +1,235 @@ +requiredMapping() + ->exampleHeader('Plant') + ->example(['Ransar Industries-I','Ransar Industries-I','Ransar Industries-I']) + ->label('Plant') + ->relationship(resolveUsing: 'name') + ->rules(['required']), + ImportColumn::make('item') + ->requiredMapping() + ->exampleHeader('Item Code') + ->example(['123456','123456','123456']) + ->label('Item Code') + ->relationship(resolveUsing: 'code') + ->rules(['required']), + ImportColumn::make('isi_model') + ->boolean() + ->exampleHeader('ISI Model') + ->example(['Y','N','Y']) + ->label('ISI Model') + ->rules(['boolean']), + ImportColumn::make('phase') + ->requiredMapping() + ->exampleHeader('Phase') + ->example(['Single','Three','Single']) + ->label('Phase') + ->rules(['required']), + ImportColumn::make('hp') + ->requiredMapping() + ->exampleHeader('HP') + ->example(['5','10','5']) + ->label('HP') + ->rules(['required']), + ImportColumn::make('kw') + ->requiredMapping() + ->exampleHeader('KW') + ->example(['5','7.5','5']) + ->label('KW') + ->rules(['required']), + ImportColumn::make('volt') + ->requiredMapping() + ->exampleHeader('Volt') + ->example(['230','380','230']) + ->label('Volt') + ->rules(['required']), + ImportColumn::make('current') + ->requiredMapping() + ->exampleHeader('Current') + ->example(['7','21.8','7']) + ->label('Current') + ->rules(['required']), + ImportColumn::make('rpm') + ->requiredMapping() + ->exampleHeader('RPM') + ->example(['2500','3420','2500']) + ->label('RPM') + ->rules(['required']), + ImportColumn::make('torque') + ->requiredMapping() + ->exampleHeader('Torque') + ->example(['0.5','1.25','0.5']) + ->label('Torque') + ->rules(['required']), + ImportColumn::make('frequency') + ->requiredMapping() + ->exampleHeader('Frequency') + ->label('Frequency') + ->example(['50','60','50']) + ->rules(['required']), + ImportColumn::make('connection') + ->requiredMapping() + ->exampleHeader('Connection') + ->label('Connection') + ->example(['Star','Star-Delta','Delta']) + ->rules(['required']), + ImportColumn::make('ins_res_limit') + ->requiredMapping() + ->exampleHeader('Insulation Resistance Limit') + ->label('Insulation Resistance Limit') + ->example(['1000','2','1000']) + ->rules(['required']), + ImportColumn::make('ins_res_type') + ->requiredMapping() + ->exampleHeader('Insulation Resistance Type') + ->label('Insulation Resistance Type') + ->example(['O','G','O']) + ->rules(['required']), + ImportColumn::make('res_ry_ll') + ->requiredMapping() + ->exampleHeader('Resistance RY LL') + ->label('Resistance RY LL') + ->example(['0.05','0.05','0.05']) + ->rules(['required']), + ImportColumn::make('res_ry_ul') + ->requiredMapping() + ->exampleHeader('Resistance RY UL') + ->label('Resistance RY UL') + ->example(['99','99','99']) + ->rules(['required']), + ImportColumn::make('res_yb_ll') + ->requiredMapping() + ->exampleHeader('Resistance YB LL') + ->label('Resistance YB LL') + ->example(['0.05','0.05','0.05']) + ->rules(['required']), + ImportColumn::make('res_yb_ul') + ->requiredMapping() + ->exampleHeader('Resistance YB UL') + ->label('Resistance YB UL') + ->example(['99','99','99']) + ->rules(['required']), + ImportColumn::make('res_br_ll') + ->requiredMapping() + ->exampleHeader('Resistance BR LL') + ->label('Resistance BR LL') + ->example(['0.05','0.05','0.05']) + ->rules(['required']), + ImportColumn::make('res_br_ul') + ->requiredMapping() + ->exampleHeader('Resistance BR UL') + ->label('Resistance BR UL') + ->example(['99','99','99']) + ->rules(['required']), + ImportColumn::make('lock_volt_limit') + ->requiredMapping() + ->exampleHeader('Lock Volt Limit') + ->label('Lock Volt Limit') + ->example(['80','100','80']) + ->rules(['required']), + ImportColumn::make('leak_cur_limit') + ->requiredMapping() + ->exampleHeader('Leakage Current Limit') + ->label('Leakage Current Limit') + ->example(['50','50','50']) + ->rules(['required']), + ImportColumn::make('lock_cur_ll') + ->requiredMapping() + ->exampleHeader('Lock Current LL') + ->label('Lock Current LL') + ->example(['10','12.5','10']) + ->rules(['required']), + ImportColumn::make('lock_cur_ul') + ->requiredMapping() + ->exampleHeader('Lock Current UL') + ->label('Lock Current UL') + ->example(['15','14.6','15']) + ->rules(['required']), + ImportColumn::make('noload_cur_ll') + ->requiredMapping() + ->exampleHeader('No Load Current LL') + ->label('No Load Current LL') + ->example(['3','5.9','3']) + ->rules(['required']), + ImportColumn::make('noload_cur_ul') + ->requiredMapping() + ->exampleHeader('No Load Current UL') + ->label('No Load Current UL') + ->example(['15','6.9','15']) + ->rules(['required']), + ImportColumn::make('noload_pow_ll') + ->requiredMapping() + ->exampleHeader('No Load Power LL') + ->label('No Load Power LL') + ->example(['250','850','250']) + ->rules(['required']), + ImportColumn::make('noload_pow_ul') + ->requiredMapping() + ->exampleHeader('No Load Power UL') + ->label('No Load Power UL') + ->example(['500','1200','500']) + ->rules(['required']), + ImportColumn::make('noload_spd_ll') + ->requiredMapping() + ->exampleHeader('No Load Speed LL') + ->label('No Load Speed LL') + ->example(['2000','2500','2000']) + ->rules(['required']), + ImportColumn::make('noload_spd_ul') + ->requiredMapping() + ->exampleHeader('No Load Speed UL') + ->label('No Load Speed UL') + ->example(['4000','3500','4000']) + ->rules(['required']), + ImportColumn::make('created_by') + ->requiredMapping() + ->exampleHeader('Created By') + ->example([Filament::auth()->user()->name, Filament::auth()->user()->name, Filament::auth()->user()->name]) + ->label('Created By') + ->rules(['required']), + ImportColumn::make('updated_by') + ->requiredMapping() + ->exampleHeader('Updated By') + ->example([Filament::auth()->user()->name, Filament::auth()->user()->name, Filament::auth()->user()->name]) + ->label('Updated By') + ->rules(['required']), + ]; + } + + public function resolveRecord(): ?MotorTestingMaster + { + // return MotorTestingMaster::firstOrNew([ + // // Update existing records, matching them by `$this->data['column_name']` + // 'email' => $this->data['email'], + // ]); + + return new MotorTestingMaster(); + } + + public static function getCompletedNotificationBody(Import $import): string + { + $body = 'Your motor testing master 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/Resources/MotorTestingMasterResource.php b/app/Filament/Resources/MotorTestingMasterResource.php new file mode 100644 index 0000000..a0f5bcb --- /dev/null +++ b/app/Filament/Resources/MotorTestingMasterResource.php @@ -0,0 +1,402 @@ +schema([ + Forms\Components\Select::make('plant_id') + ->relationship('plant', 'name') + ->required() + ->reactive() + ->default(function () { + return optional(Item::latest()->first())->plant_id; + }) + ->disabled(fn (Get $get) => !empty($get('id'))) + ->afterStateUpdated(function ($state, callable $set, callable $get) { + $plantId = $get('plant_id'); + if (!$plantId) { + $set('mTmError', 'Please select a plant first.'); + return; + } + else + { + $set('mTmError', null); + } + }) + ->extraAttributes(fn ($get) => [ + 'class' => $get('mTmError') ? 'border-red-500' : '', + ]) + ->hint(fn ($get) => $get('mTmError') ? $get('mTmError') : null) + ->hintColor('danger'), + Forms\Components\Select::make('item_id') + ->label('Item') + ->options(function (callable $get) { + $plantId = $get('plant_id'); + if (!$plantId) { + return []; + } + + return Item::where('plant_id', $plantId) + ->pluck('code', 'id') + ->toArray(); + }) + ->required() + ->searchable() + ->reactive(), + Forms\Components\Select::make('isi_model') + ->label('ISI Model') + ->options([ + 1 => 'Yes', + 0 => 'No', + ]) + ->selectablePlaceholder(false) + ->default(1) + ->required() + ->reactive(), + Forms\Components\Select::make('phase') + ->label('Phase') + ->options(function (callable $get) { + $plantId = $get('plant_id'); + + // if (!$plantId || !$lineId) + // { + // return []; + // } + if ($plantId) + { + return Configuration::where('plant_id', $plantId) + ->where('c_name', 'MOTOR_PHASE') + ->pluck('c_value', 'c_value') + ->toArray(); + } + else + { + return Configuration::where('c_name', 'MOTOR_PHASE') + ->pluck('c_value', 'c_value') + ->toArray(); + } + }) + ->selectablePlaceholder(false) + ->default('Single') + ->required() + ->reactive(), + Forms\Components\TextInput::make('hp') + ->label('HP') + ->required(), + Forms\Components\TextInput::make('kw') + ->label('KW') + ->required(), + Forms\Components\TextInput::make('volt') + ->label('Volt') + ->required(), + Forms\Components\TextInput::make('current') + ->label('Current') + ->required(), + Forms\Components\TextInput::make('rpm') + ->label('RPM') + ->required(), + Forms\Components\TextInput::make('torque') + ->label('Torque') + ->required(), + Forms\Components\TextInput::make('frequency') + ->label('Frequency') + ->required(), + Forms\Components\Select::make('connection') + ->label('Connection') + ->selectablePlaceholder(false) + ->options(function (callable $get) { + $plantId = $get('plant_id'); + if ($plantId) + { + return Configuration::where('plant_id', $plantId) + ->where('c_name', 'MOTOR_CONNECTION') + ->pluck('c_value', 'c_value') + ->toArray(); + } + else + { + return Configuration::where('c_name', 'MOTOR_CONNECTION') + ->pluck('c_value', 'c_value') + ->toArray(); + } + }) + ->required() + ->default('Star') + ->reactive(), + Forms\Components\TextInput::make('ins_res_limit') + ->label('Insulation Resistance Limit') + ->required(), + Forms\Components\TextInput::make('ins_res_type') + ->label('Insulation Resistance Type') + ->default('O') + ->required(), + Forms\Components\TextInput::make('res_ry_ll') + ->label('Resistance RY LL') + ->required(), + Forms\Components\TextInput::make('res_ry_ul') + ->label('Resistance RY UL') + ->required(), + Forms\Components\TextInput::make('res_yb_ll') + ->label('Resistance YB LL') + ->required(), + Forms\Components\TextInput::make('res_yb_ul') + ->label('Resistance YB UL') + ->required(), + Forms\Components\TextInput::make('res_br_ll') + ->label('Resistance BR LL') + ->required(), + Forms\Components\TextInput::make('res_br_ul') + ->label('Resistance BR UL') + ->required(), + Forms\Components\TextInput::make('lock_volt_limit') + ->label('Lock Volt Limit') + ->required(), + Forms\Components\TextInput::make('leak_cur_limit') + ->label('Leakage Current Limit') + ->required(), + Forms\Components\TextInput::make('lock_cur_ll') + ->label('Lock Current LL') + ->required(), + Forms\Components\TextInput::make('lock_cur_ul') + ->label('Lock Current UL') + ->required(), + Forms\Components\TextInput::make('noload_cur_ll') + ->label('No Load Current LL') + ->required(), + Forms\Components\TextInput::make('noload_cur_ul') + ->label('No Load Current UL') + ->required(), + Forms\Components\TextInput::make('noload_pow_ll') + ->label('No Load Power LL') + ->required(), + Forms\Components\TextInput::make('noload_pow_ul') + ->label('No Load Power UL') + ->required(), + Forms\Components\TextInput::make('noload_spd_ll') + ->label('No Load Speed LL') + ->required(), + Forms\Components\TextInput::make('noload_spd_ul') + ->label('No Load Speed UL') + ->required(), + Forms\Components\Hidden::make('created_by') + ->default(fn () => Filament::auth()->user()?->name) + ->required(), + Forms\Components\Hidden::make('updated_by') + ->default(fn () => Filament::auth()->user()?->name) + ->required(), + ]); + } + + public static function table(Table $table): Table + { + return $table + ->columns([ + Tables\Columns\TextColumn::make('No.') + ->label('No.') + ->getStateUsing(function ($record, $livewire, $column, $rowLoop) { + $paginator = $livewire->getTableRecords(); + $perPage = method_exists($paginator, 'perPage') ? $paginator->perPage() : 10; + $currentPage = method_exists($paginator, 'currentPage') ? $paginator->currentPage() : 1; + return ($currentPage - 1) * $perPage + $rowLoop->iteration; + }), + Tables\Columns\TextColumn::make('plant.name') + ->label('Plant') + ->alignCenter() + ->searchable() + ->sortable(), + Tables\Columns\TextColumn::make('item.code') + ->label('Item Code') + ->searchable() + ->alignCenter() + ->sortable(), + Tables\Columns\TextColumn::make('item.description') + ->label('Model') + ->alignCenter() + ->searchable() + ->sortable(), + Tables\Columns\IconColumn::make('isi_model') + ->label('ISI Model') + ->alignCenter() + ->boolean(), + Tables\Columns\TextColumn::make('phase') + ->label('Phase') + ->searchable() + ->alignCenter(), + Tables\Columns\TextColumn::make('kw') + ->label('KW') + ->alignCenter(), + Tables\Columns\TextColumn::make('hp') + ->label('HP') + ->alignCenter(), + Tables\Columns\TextColumn::make('volt') + ->label('Volt') + ->alignCenter(), + Tables\Columns\TextColumn::make('current') + ->label('Current') + ->alignCenter(), + Tables\Columns\TextColumn::make('rpm') + ->label('Rpm') + ->alignCenter(), + Tables\Columns\TextColumn::make('torque') + ->label('Torque') + ->alignCenter(), + Tables\Columns\TextColumn::make('frequency') + ->label('Frequency') + ->alignCenter(), + Tables\Columns\TextColumn::make('connection') + ->label('Connection') + ->alignCenter(), + Tables\Columns\TextColumn::make('ins_res_limit') + ->label('Insulation Resistance Limit') + ->alignCenter(), + Tables\Columns\TextColumn::make('ins_res_type') + ->label('Insulation Resistance Type') + ->alignCenter(), + Tables\Columns\TextColumn::make('res_ry_ll') + ->label('Resistance RY LL') + ->alignCenter(), + Tables\Columns\TextColumn::make('res_ry_ul') + ->label('Resistance RY UL') + ->alignCenter(), + Tables\Columns\TextColumn::make('res_yb_ll') + ->label('Resistance YB LL') + ->alignCenter(), + Tables\Columns\TextColumn::make('res_yb_ul') + ->label('Resistance YB UL') + ->alignCenter(), + Tables\Columns\TextColumn::make('res_br_ll') + ->label('Resistance BR LL') + ->alignCenter(), + Tables\Columns\TextColumn::make('res_br_ul') + ->label('Resistance BR UL') + ->alignCenter(), + Tables\Columns\TextColumn::make('lock_volt_limit') + ->label('Lock Volt Limit') + ->alignCenter(), + Tables\Columns\TextColumn::make('leak_cur_limit') + ->label('Leakage Current Limit') + ->alignCenter(), + Tables\Columns\TextColumn::make('lock_cur_ll') + ->label('Lock Current LL') + ->alignCenter(), + Tables\Columns\TextColumn::make('lock_cur_ul') + ->label('Lock Current UL') + ->alignCenter(), + Tables\Columns\TextColumn::make('noload_cur_ll') + ->label('No Load Current LL') + ->alignCenter(), + Tables\Columns\TextColumn::make('noload_cur_ul') + ->label('No Load Current UL') + ->alignCenter(), + Tables\Columns\TextColumn::make('noload_pow_ll') + ->label('No Load Power LL') + ->alignCenter(), + Tables\Columns\TextColumn::make('noload_pow_ul') + ->label('No Load Power UL') + ->alignCenter(), + Tables\Columns\TextColumn::make('noload_spd_ll') + ->label('No Load Speed LL') + ->alignCenter(), + Tables\Columns\TextColumn::make('noload_spd_ul') + ->label('No Load Speed UL') + ->alignCenter(), + Tables\Columns\TextColumn::make('created_at') + ->dateTime() + ->alignCenter() + ->sortable(), + Tables\Columns\TextColumn::make('created_by') + ->label('Created By') + ->alignCenter(), + Tables\Columns\TextColumn::make('updated_at') + ->dateTime() + ->alignCenter() + ->sortable(), + Tables\Columns\TextColumn::make('updated_by') + ->label('Updated By') + ->alignCenter(), + Tables\Columns\TextColumn::make('deleted_at') + ->dateTime() + ->alignCenter() + ->sortable() + ->toggleable(isToggledHiddenByDefault: true), + ]) + ->filters([ + Tables\Filters\TrashedFilter::make(), + ]) + ->actions([ + Tables\Actions\ViewAction::make(), + Tables\Actions\EditAction::make(), + ]) + ->bulkActions([ + Tables\Actions\BulkActionGroup::make([ + Tables\Actions\DeleteBulkAction::make(), + Tables\Actions\ForceDeleteBulkAction::make(), + Tables\Actions\RestoreBulkAction::make(), + ]), + ]) + ->headerActions([ + ImportAction::make() + ->importer(MotorTestingMasterImporter::class) + ->visible(function() { + return Filament::auth()->user()->can('view import motor testing master'); + }), + ExportAction::make() + ->exporter(MotorTestingMasterExporter::class) + ->visible(function() { + return Filament::auth()->user()->can('view export motor testing master'); + }), + ]); + } + + public static function getRelations(): array + { + return [ + // + ]; + } + + public static function getPages(): array + { + return [ + 'index' => Pages\ListMotorTestingMasters::route('/'), + 'create' => Pages\CreateMotorTestingMaster::route('/create'), + 'view' => Pages\ViewMotorTestingMaster::route('/{record}'), + 'edit' => Pages\EditMotorTestingMaster::route('/{record}/edit'), + ]; + } + + public static function getEloquentQuery(): Builder + { + return parent::getEloquentQuery() + ->withoutGlobalScopes([ + SoftDeletingScope::class, + ]); + } +} diff --git a/app/Filament/Resources/MotorTestingMasterResource/Pages/CreateMotorTestingMaster.php b/app/Filament/Resources/MotorTestingMasterResource/Pages/CreateMotorTestingMaster.php new file mode 100644 index 0000000..8649400 --- /dev/null +++ b/app/Filament/Resources/MotorTestingMasterResource/Pages/CreateMotorTestingMaster.php @@ -0,0 +1,12 @@ +belongsTo(Plant::class); + } + + public function item(): BelongsTo + { + return $this->belongsTo(Item::class); + } +} diff --git a/database/migrations/2025_05_28_130414_create_motor_testing_masters_table.php b/database/migrations/2025_05_28_130414_create_motor_testing_masters_table.php new file mode 100644 index 0000000..d27290a --- /dev/null +++ b/database/migrations/2025_05_28_130414_create_motor_testing_masters_table.php @@ -0,0 +1,81 @@ +