diff --git a/app/Filament/Resources/StickerPrintingResource.php b/app/Filament/Resources/StickerPrintingResource.php new file mode 100644 index 0000000..c82edf6 --- /dev/null +++ b/app/Filament/Resources/StickerPrintingResource.php @@ -0,0 +1,199 @@ +schema([ + Section::make('') + ->schema([ + Forms\Components\Select::make('plant_id') + ->label('Plant') + ->reactive() + ->relationship('plant', 'name') + ->options(function (callable $get) { + $userHas = Filament::auth()->user()->plant_id; + + return ($userHas && strlen($userHas) > 0) ? Plant::where('id', $userHas)->pluck('name', 'id')->toArray() : Plant::pluck('name', 'id')->toArray(); + }) + ->required() + ->afterStateUpdated(function ($state, callable $set, callable $get) { + $plantId = $get('plant_id'); + + if (!$plantId) { + $set('reference_number', null); + $set('serial_number', null); + $set('ivPlantError', 'Please select a plant first.'); + } else { + $set('ivPlantError', null); + $set('reference_number', null); + $set('serial_number', null); + } + }) + ->extraAttributes(fn ($get) => [ + 'class' => $get('ivPlantError') ? 'border-red-500' : '', + ]) + ->hint(fn ($get) => $get('ivPlantError') ? $get('ivPlantError') : null) + ->hintColor('danger'), + Forms\Components\TextInput::make('reference_number') + ->label('Reference Number') + ->reactive() + ->readOnly(fn (callable $get) => !empty($get('serial_number'))) + ->extraAttributes([ + 'id' => 'invoice_number_input', + 'x-data' => '{ value: "" }', + 'x-model' => 'value', + 'wire:keydown.enter.prevent' => 'processRef(value)', + ]) + ->required(), + Forms\Components\TextInput::make('serial_number') + ->label('Serial Number') + ->reactive() + // ->required() + ->readOnly(fn (callable $get) => empty($get('reference_number'))) + ->extraAttributes([ + 'id' => 'serial_number_input', + 'x-data' => '{ value: "" }', + 'x-model' => 'value', + 'wire:keydown.enter.prevent' => 'processSno(value)', + //'x-on:keydown.enter.prevent' => '$wire.processInvoice(value)', + ]), + //->required(), + Forms\Components\View::make('forms.components.print-button'), + + Forms\Components\Hidden::make('created_by') + ->label('Created By') + ->default(Filament::auth()->user()?->name), + Forms\Components\Hidden::make('updated_by') + ->label('Updated By') + ->default(Filament::auth()->user()?->name), + + ]) + ->columns(4), + ]); + } + + 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') + ->searchable() + ->sortable(), + Tables\Columns\TextColumn::make('reference_number') + ->label('Reference Number') + ->searchable() + ->sortable(), + Tables\Columns\TextColumn::make('serial_number') + ->label('Serial Number') + ->searchable() + ->sortable(), + Tables\Columns\TextColumn::make('created_by') + ->label('Created By') + ->searchable() + ->sortable(), + Tables\Columns\TextColumn::make('created_at') + ->dateTime() + ->sortable() + ->toggleable(isToggledHiddenByDefault: true), + Tables\Columns\TextColumn::make('updated_at') + ->dateTime() + ->sortable() + ->toggleable(isToggledHiddenByDefault: true), + Tables\Columns\TextColumn::make('deleted_at') + ->dateTime() + ->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(StickerPrintingImporter::class) + ->label('Import Sticker Printing') + ->color('warning') + ->visible(function () { + return Filament::auth()->user()->can('view import sticker printing'); + }), + ExportAction::make() + ->exporter(StickerPrintingExporter::class) + ->label('Export Sticker Printing') + ->color('warning') + ->visible(function () { + return Filament::auth()->user()->can('view export sticker printing'); + }), + ]); + } + + public static function getRelations(): array + { + return [ + // + ]; + } + + public static function getPages(): array + { + return [ + 'index' => Pages\ListStickerPrintings::route('/'), + 'create' => Pages\CreateStickerPrinting::route('/create'), + 'view' => Pages\ViewStickerPrinting::route('/{record}'), + 'edit' => Pages\EditStickerPrinting::route('/{record}/edit'), + ]; + } + + public static function getEloquentQuery(): Builder + { + return parent::getEloquentQuery() + ->withoutGlobalScopes([ + SoftDeletingScope::class, + ]); + } +} diff --git a/app/Filament/Resources/StickerPrintingResource/Pages/CreateStickerPrinting.php b/app/Filament/Resources/StickerPrintingResource/Pages/CreateStickerPrinting.php new file mode 100644 index 0000000..efe73a3 --- /dev/null +++ b/app/Filament/Resources/StickerPrintingResource/Pages/CreateStickerPrinting.php @@ -0,0 +1,184 @@ +getCancelFormAction(), + ]; + } + + protected function getRedirectUrl(): string + { + return $this->getResource()::getUrl('create'); + } + + public function loadRecords() + { + $this->records = StickerPrinting::where('reference_number', $this->refNumber) + ->where('plant_id', $this->plantId) + ->latest() + ->get(); + + } + + public function processRef($value) + { + + //$this->ref_number = $value; + $ref = $this->form->getState()['reference_number'] ?? null; + + $user = Filament::auth()->user(); + + $operatorName = $user->name; + + $plantId = $this->form->getState()['plant_id']; + + $this->plantId = $plantId; + + $this->dispatch('refreshEmptySticker', $plantId, $ref); + + $this->dispatch('focus-serial-number'); + + } + + public function processSno($value) + { + + $this->serial_number = $value; + + $plant = $this->form->getState()['plant_id'] ?? null; + + $ref = $this->form->getState()['reference_number'] ?? null; + + $sNumber = $this->form->getState()['serial_number'] ?? null; + + if(empty($this->plantId) || empty($ref) || empty($this->serial_number)) { + Notification::make() + ->title('Unknown: Incomplete Data!') + ->body("Please ensure Plant, Reference Number, and Serial Number are provided.") + ->danger() + ->seconds(3) + ->send(); + return; + } + + $exists = StickerPrinting::where('plant_id', $plant) + ->where('serial_number', $sNumber) + ->first(); + + if ($exists) { + Notification::make() + ->title('Duplicate Serial Number!') + ->body("Serial Number {$sNumber} already exists for this plant.") + ->danger() + ->seconds(3) + ->send(); + + // Reset only serial number field + $this->form->fill([ + 'plant_id' => $plant, + 'reference_number' => $ref, + 'serial_number' => '', + ]); + + return; + } + + StickerPrinting::create([ + 'plant_id' => $this->plantId, + 'reference_number' => $ref, + 'serial_number' => $this->serial_number, + 'created_by' => Filament::auth()->user()->name, + ]); + + $this->dispatch('addStickerToList', $this->plantId, $ref, $this->serial_number); + + $this->form->fill([ + 'plant_id' => $this->plantId, + 'reference_number' => $ref, + 'serial_number' => '', + ]); + + } + + public function printSticker() { + + $plantId = $this->form->getState()['plant_id']; + + $plantId = trim($plantId) ?? null; + + $refNumber = trim($this->form->getState()['reference_number'])?? null; + + $refNumber = trim($refNumber) ?? null; + + $serialNumber = trim($this->form->getState()['serial_number'])?? null; + + $serialNumber = trim($serialNumber) ?? null; + + // dd($plantId, $refNumber, $serialNumber); + + $serialNumbers = StickerPrinting::where('plant_id', $plantId) + ->where('reference_number', $refNumber) + ->pluck('serial_number') + ->toArray(); + + if (empty($serialNumbers)) + { + Notification::make() + ->title('No Serial Numbers found!') + ->body('Please check the selected Plant & Reference Number.') + ->danger() + ->send(); + return; + } + + // Encode as JSON string in QR Code + // $qrData = json_encode([ + // 'serial_numbers' => $serialNumbers, + // ]); + //$qrData = implode(',', $serialNumbers); + $qrData = implode("\n", $serialNumbers); + + $qrCode = base64_encode( + QrCode::format('png') + ->size(1200) // smaller, still high res + ->margin(6) // white border + ->errorCorrection('Q')// medium-high correction + ->generate($qrData) + ); + + // Send data to Pdf view + $pdf = PDF::loadView('pdf.qrcode', [ + 'qrCode' => $qrCode, + ]); + + return response()->streamDownload(function () use ($pdf) { + echo $pdf->output(); + }, "qr-sticker.pdf"); + } +} diff --git a/app/Filament/Resources/StickerPrintingResource/Pages/EditStickerPrinting.php b/app/Filament/Resources/StickerPrintingResource/Pages/EditStickerPrinting.php new file mode 100644 index 0000000..423878c --- /dev/null +++ b/app/Filament/Resources/StickerPrintingResource/Pages/EditStickerPrinting.php @@ -0,0 +1,22 @@ +