From a3b96cbded88b5d07de86d6fb06f23d726f0d3f8 Mon Sep 17 00:00:00 2001 From: dhanabalan Date: Tue, 4 Aug 2026 15:30:11 +0530 Subject: [PATCH 1/5] Added sticker details migration file --- ...31_124110_create_sticker_details_table.php | 67 +++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 database/migrations/2026_07_31_124110_create_sticker_details_table.php diff --git a/database/migrations/2026_07_31_124110_create_sticker_details_table.php b/database/migrations/2026_07_31_124110_create_sticker_details_table.php new file mode 100644 index 0000000..7b43e40 --- /dev/null +++ b/database/migrations/2026_07_31_124110_create_sticker_details_table.php @@ -0,0 +1,67 @@ + Date: Tue, 4 Aug 2026 15:30:47 +0530 Subject: [PATCH 2/5] Added sticker detail model file --- app/Models/StickerDetail.php | 54 ++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 app/Models/StickerDetail.php diff --git a/app/Models/StickerDetail.php b/app/Models/StickerDetail.php new file mode 100644 index 0000000..fca673c --- /dev/null +++ b/app/Models/StickerDetail.php @@ -0,0 +1,54 @@ +belongsTo(StickerStructureDetail::class); + } +} -- 2.49.1 From e5c805f7ee1230567749e6f6e61b7baec4442c7e Mon Sep 17 00:00:00 2001 From: dhanabalan Date: Tue, 4 Aug 2026 15:33:01 +0530 Subject: [PATCH 3/5] Added sticker detail resource pages --- .../Resources/StickerDetailResource.php | 440 ++++++++++++++++++ .../Pages/CreateStickerDetail.php | 12 + .../Pages/EditStickerDetail.php | 22 + .../Pages/ListStickerDetails.php | 19 + .../Pages/ViewStickerDetail.php | 19 + 5 files changed, 512 insertions(+) create mode 100644 app/Filament/Resources/StickerDetailResource.php create mode 100644 app/Filament/Resources/StickerDetailResource/Pages/CreateStickerDetail.php create mode 100644 app/Filament/Resources/StickerDetailResource/Pages/EditStickerDetail.php create mode 100644 app/Filament/Resources/StickerDetailResource/Pages/ListStickerDetails.php create mode 100644 app/Filament/Resources/StickerDetailResource/Pages/ViewStickerDetail.php diff --git a/app/Filament/Resources/StickerDetailResource.php b/app/Filament/Resources/StickerDetailResource.php new file mode 100644 index 0000000..a846ae2 --- /dev/null +++ b/app/Filament/Resources/StickerDetailResource.php @@ -0,0 +1,440 @@ +schema([ + Forms\Components\Select::make('sticker_structure_detail_id') + ->label('Sticker ID') + ->reactive() + ->relationship('stickerStructureDetail', 'sticker_id') + ->options(function (callable $get) { + return StickerStructureDetail::pluck('sticker_id', 'id'); + }) + ->required() + ->afterStateUpdated(function (callable $get, callable $set) { + // if ($get('element_id')) { + // return; + // } + + $structureId = $get('sticker_structure_detail_id'); + $set('design_element_type', null); + $set('element_id', null); + + if (!$structureId) { + $set('element_id', null); + return; + } + + $maxId = StickerDetail::where('sticker_structure_detail_id', $structureId) + ->max('element_id'); + + $nextId = $maxId ? ((int) $maxId + 1) : 1; + + $formattedId = str_pad($nextId, 3, '0', STR_PAD_LEFT); + + $set('element_id', $formattedId); + }), + Forms\Components\Select::make('design_element_type') + ->label('Design Element Type') + ->reactive() + ->options([ + 'Text' => 'Text', + 'Shape' => 'Shape', + 'Image' => 'Image', + 'QR' => 'QR', + ]), + Forms\Components\TextInput::make('element_id') + ->label('Element ID') + ->readOnly() + ->reactive(), + Forms\Components\Select::make('element_type') + ->label('Element Type') + ->options([ + 'Static' => 'Static', + 'Dynamic' => 'Dynamic', + ]), + Forms\Components\Select::make('characteristics_type') + ->label('Characteristics') + ->reactive() + ->options( + collect(Schema::getColumnListing('item_characteristics')) + ->reject(fn ($column) => in_array($column, [ + 'id', + 'plant_id', + 'item_id', + 'class', + 'zz1_cn_bill_ord', + 'created_at', + 'updated_at', + 'deleted_at', + 'created_by', + 'updated_by', + ])) + ->mapWithKeys(fn ($column) => [ + $column => ucfirst(str_replace('_', ' ', $column)) + ]) + ->toArray() + ), + Forms\Components\TextInput::make('string_value') + ->label('String Value') + ->reactive() + ->visible(fn ($get) => $get('design_element_type') == 'Text'), + Forms\Components\Select::make('string_font') + ->label('String Font') + ->reactive() + ->options(function () { + $files = File::files(storage_path('app/fonts')); + + return collect($files) + ->mapWithKeys(function ($file) { + $name = pathinfo($file->getFilename(), PATHINFO_FILENAME); + + return [$name => $name]; + }) + ->toArray(); + }) + ->visible(fn ($get) => $get('design_element_type') == 'Text'), + Forms\Components\TextInput::make('string_size') + ->label('String Size') + ->reactive() + ->visible(fn ($get) => $get('design_element_type') == 'Text'), + Forms\Components\Select::make('element_colour') + ->label('Element Colour') + ->options([ + '' => 'Default (Black)', + '#000000' => 'Black', + '#FFFFFF' => 'White', + '#FF0000' => 'Red', + '#00FF00' => 'Lime', + '#0000FF' => 'Blue', + '#FFFF00' => 'Yellow', + '#00FFFF' => 'Cyan', + '#FF00FF' => 'Magenta', + '#800000' => 'Maroon', + '#808000' => 'Olive', + '#008000' => 'Green', + '#800080' => 'Purple', + '#008080' => 'Teal', + '#808080' => 'Gray', + '#C0C0C0' => 'Silver', + '#FFA500' => 'Orange', + '#FFC0CB' => 'Pink', + '#A52A2A' => 'Brown', + '#87CEEB' => 'Sky Blue', + ]) + ->nullable() + ->reactive(), + Forms\Components\Select::make('string_align') + ->label('String Align') + ->options([ + 'Left' => 'Left', + 'Right' => 'Right', + 'Center' => 'Center', + ]) + ->reactive() + ->visible(fn ($get) => $get('design_element_type') == 'Text'), + Forms\Components\TextInput::make('string_x_value') + ->label('String X Value') + ->reactive() + ->visible(fn ($get) => $get('design_element_type') == 'Text'), + Forms\Components\TextInput::make('string_y_value') + ->label('String Y Value') + ->reactive() + ->visible(fn ($get) => $get('design_element_type') == 'Text'), + Forms\Components\Select::make('shape_name') + ->label('Shape Name') + ->reactive() + ->options([ + 'Line' => 'Line', + 'Rectangle' => 'Rectangle', + 'CurvedRectangle' => 'CurvedRectangle', + ]) + ->visible(fn ($get) => $get('design_element_type') == 'Shape'), + Forms\Components\TextInput::make('shape_pen_size') + ->label('Shape Pen Size') + ->reactive() + ->visible(fn ($get) => $get('design_element_type') == 'Shape'), + Forms\Components\TextInput::make('curve_radius') + ->label('Curve Radius') + ->reactive() + ->visible(fn ($get) => $get('shape_name') == 'CurvedRectangle'), + Forms\Components\TextInput::make('shape_x1_value') + ->label('Shape X1 Value') + ->reactive() + ->visible(fn ($get) => $get('design_element_type') == 'Shape'), + Forms\Components\TextInput::make('shape_y1_value') + ->label('Shape Y1 Value') + ->reactive() + ->visible(fn ($get) => $get('design_element_type') == 'Shape'), + Forms\Components\TextInput::make('shape_x2_value') + ->label('Shape X2 Value') + ->reactive() + ->visible(fn ($get) => $get('design_element_type') == 'Shape'), + Forms\Components\TextInput::make('shape_y2_value') + ->label('Shape Y2 Value') + ->reactive() + ->visible(fn ($get) => $get('design_element_type') == 'Shape'), + // Forms\Components\FileUpload::make('image_path') + // ->label('Image') + // ->image() + // ->directory('sticker-images') + // ->visibility('public') + // ->preserveFilenames(false) + // ->required(false) + // ->reactive() + // ->visible(fn ($get) => $get('design_element_type') == 'Image'), + // Forms\Components\TextInput::make('image_type') + // ->label('Image Type') + // ->reactive() + // ->visible(fn ($get) => $get('design_element_type') == 'Image'), + Forms\Components\TextInput::make('image_x') + ->label('Image X') + ->reactive() + ->visible(fn ($get) => $get('design_element_type') == 'Image'), + Forms\Components\TextInput::make('image_y') + ->label('Image Y') + ->reactive() + ->visible(fn ($get) => $get('design_element_type') == 'Image'), + Forms\Components\TextInput::make('image_width') + ->label('Image Width') + ->reactive() + ->visible(fn ($get) => $get('design_element_type') == 'Image'), + Forms\Components\TextInput::make('image_height') + ->label('Image Height') + ->reactive() + ->visible(fn ($get) => $get('design_element_type') == 'Image'), + Forms\Components\TextInput::make('qr_value') + ->label('QR Value') + ->reactive() + ->visible(fn ($get) => $get('design_element_type') == 'QR'), + Forms\Components\TextInput::make('qr_align') + ->label('QR Align') + ->reactive() + ->visible(fn ($get) => $get('design_element_type') == 'QR'), + Forms\Components\TextInput::make('qr_size') + ->label('QR Size') + ->reactive() + ->visible(fn ($get) => $get('design_element_type') == 'QR'), + Forms\Components\TextInput::make('qr_x_value') + ->label('QR X Value') + ->reactive() + ->visible(fn ($get) => $get('design_element_type') == 'QR'), + Forms\Components\TextInput::make('qr_y_value') + ->label('QR Y Value') + ->reactive() + ->visible(fn ($get) => $get('design_element_type') == 'QR'), + 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), + ]); + } + + 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('stickerStructureDetail.sticker_id') + ->label('Sticker ID') + ->sortable() + ->alignCenter(), + Tables\Columns\TextColumn::make('design_element_type') + ->label('Design Element Type') + ->alignCenter(), + Tables\Columns\TextColumn::make('element_id') + ->label('Element ID') + ->alignCenter(), + Tables\Columns\TextColumn::make('element_type') + ->label('Element Type') + ->alignCenter(), + Tables\Columns\TextColumn::make('characteristics_type') + ->label('Characteristics Type') + ->alignCenter(), + Tables\Columns\TextColumn::make('string_value') + ->label('String Value') + ->alignCenter(), + Tables\Columns\TextColumn::make('string_font') + ->label('String Font') + ->alignCenter(), + Tables\Columns\TextColumn::make('string_size') + ->label('String Size') + ->alignCenter(), + // Tables\Columns\TextColumn::make('element_colour') + // ->label('Element Colour') + // ->alignCenter(), + Tables\Columns\TextColumn::make('string_align') + ->label('String Align') + ->alignCenter(), + Tables\Columns\TextColumn::make('string_x_value') + ->label('String X Value') + ->alignCenter(), + Tables\Columns\TextColumn::make('string_y_value') + ->label('String Y Value') + ->alignCenter(), + Tables\Columns\TextColumn::make('shape_name') + ->label('Shape Name') + ->alignCenter(), + Tables\Columns\TextColumn::make('shape_pen_size') + ->label('Shape Pen Size') + ->alignCenter(), + Tables\Columns\TextColumn::make('curve_radius') + ->label('Curve Radius'), + Tables\Columns\TextColumn::make('shape_x1_value') + ->label('Shape X1 Value') + ->alignCenter(), + Tables\Columns\TextColumn::make('shape_y1_value') + ->label('Shape Y1 Value') + ->alignCenter(), + Tables\Columns\TextColumn::make('shape_x2_value') + ->label('Shape X2 Value') + ->alignCenter(), + Tables\Columns\TextColumn::make('shape_y2_value') + ->label('Shape Y2 Value') + ->alignCenter(), + Tables\Columns\TextColumn::make('image_x') + ->label('Image X') + ->alignCenter(), + Tables\Columns\TextColumn::make('image_y') + ->label('Image Y') + ->alignCenter(), + Tables\Columns\TextColumn::make('image_width') + ->label('Image Width') + ->alignCenter(), + Tables\Columns\TextColumn::make('image_height') + ->label('Image Height') + ->alignCenter(), + Tables\Columns\TextColumn::make('qr_value') + ->label('QR Value') + ->alignCenter(), + Tables\Columns\TextColumn::make('qr_align') + ->label('QR Align') + ->alignCenter(), + Tables\Columns\TextColumn::make('qr_size') + ->label('QR Size') + ->alignCenter(), + Tables\Columns\TextColumn::make('qr_x_value') + ->label('QR X Value') + ->alignCenter(), + Tables\Columns\TextColumn::make('qr_y_value') + ->label('QR Y Value') + ->alignCenter(), + Tables\Columns\TextColumn::make('created_at') + ->label('Created At') + ->alignCenter() + ->dateTime() + ->sortable() + ->toggleable(isToggledHiddenByDefault: true), + Tables\Columns\TextColumn::make('created_by') + ->label('Created By') + ->alignCenter(), + Tables\Columns\TextColumn::make('updated_at') + ->label('Updated At') + ->alignCenter() + ->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() + ->label('Import Sticker Details') + ->color('warning') + ->importer(StickerDetailImporter::class) + ->visible(function() { + return Filament::auth()->user()->can('view import sticker details'); + }), + ExportAction::make() + ->label('Export Sticker Details') + ->color('warning') + ->exporter(StickerDetailExporter::class) + ->visible(function() { + return Filament::auth()->user()->can('view export sticker details'); + }), + ]); + } + + public static function getRelations(): array + { + return [ + // + ]; + } + + public static function getPages(): array + { + return [ + 'index' => Pages\ListStickerDetails::route('/'), + 'create' => Pages\CreateStickerDetail::route('/create'), + 'view' => Pages\ViewStickerDetail::route('/{record}'), + 'edit' => Pages\EditStickerDetail::route('/{record}/edit'), + ]; + } + + public static function getEloquentQuery(): Builder + { + return parent::getEloquentQuery() + ->withoutGlobalScopes([ + SoftDeletingScope::class, + ]); + } +} diff --git a/app/Filament/Resources/StickerDetailResource/Pages/CreateStickerDetail.php b/app/Filament/Resources/StickerDetailResource/Pages/CreateStickerDetail.php new file mode 100644 index 0000000..745e3c4 --- /dev/null +++ b/app/Filament/Resources/StickerDetailResource/Pages/CreateStickerDetail.php @@ -0,0 +1,12 @@ + Date: Tue, 4 Aug 2026 15:33:54 +0530 Subject: [PATCH 4/5] Added sticker detail importer and exporter --- .../Exports/StickerDetailExporter.php | 102 ++++++ .../Imports/StickerDetailImporter.php | 326 ++++++++++++++++++ 2 files changed, 428 insertions(+) create mode 100644 app/Filament/Exports/StickerDetailExporter.php create mode 100644 app/Filament/Imports/StickerDetailImporter.php diff --git a/app/Filament/Exports/StickerDetailExporter.php b/app/Filament/Exports/StickerDetailExporter.php new file mode 100644 index 0000000..d392880 --- /dev/null +++ b/app/Filament/Exports/StickerDetailExporter.php @@ -0,0 +1,102 @@ +label('NO') + ->state(function ($record) use (&$rowNumber) { + // Increment and return the row number + return ++$rowNumber; + }), + ExportColumn::make('stickerStructureDetail.sticker_id') + ->label('STICKER ID'), + ExportColumn::make('design_element_type') + ->label('DESIGN ELEMENT TYPE'), + ExportColumn::make('element_id') + ->label('ELEMENT ID'), + ExportColumn::make('element_type') + ->label('ELEMENT TYPE'), + ExportColumn::make('characteristics_type') + ->label('CHARACTERISTICS TYPE'), + ExportColumn::make('string_value') + ->label('STRING VALUE'), + ExportColumn::make('string_font') + ->label('STRING FONT'), + ExportColumn::make('string_size') + ->label('STRING SIZE'), + ExportColumn::make('element_colour') + ->label('ELEMENT COLOUR'), + ExportColumn::make('string_align') + ->label('STRING ALIGN'), + ExportColumn::make('string_x_value') + ->label('STRING X VALUE'), + ExportColumn::make('string_y_value') + ->label('STRING Y VALUE'), + ExportColumn::make('shape_name') + ->label('SHAPE NAME'), + ExportColumn::make('shape_pen_size') + ->label('SHAPE PEN SIZE'), + ExportColumn::make('curve_radius') + ->label('CURVE RADIUS'), + ExportColumn::make('shape_x1_value') + ->label('SHAPE X1 VALUE'), + ExportColumn::make('shape_y1_value') + ->label('SHAPE Y1 VALUE'), + ExportColumn::make('shape_x2_value') + ->label('SHAPE X2 VALUE'), + ExportColumn::make('shape_y2_value') + ->label('SHAPE Y2 VALUE'), + ExportColumn::make('image_x') + ->label('IMAGE X'), + ExportColumn::make('image_y') + ->label('IMAGE Y'), + ExportColumn::make('image_width') + ->label('IMAGE WIDTH'), + ExportColumn::make('image_height') + ->label('IMAGE HEIGHT'), + ExportColumn::make('qr_value') + ->label('QR VALUE'), + ExportColumn::make('qr_align') + ->label('QR ALIGN'), + ExportColumn::make('qr_size') + ->label('QR SIZE'), + ExportColumn::make('qr_x_value') + ->label('QR X VALUE'), + ExportColumn::make('qr_y_value') + ->label('QR Y VALUE'), + ExportColumn::make('created_at') + ->label('CREATED AT'), + ExportColumn::make('updated_at') + ->label('UPDATED AT'), + ExportColumn::make('created_by') + ->label('CREATED BY'), + ExportColumn::make('deleted_at') + ->label('DELETED AT') + ->enabledByDefault(false), + ]; + } + + public static function getCompletedNotificationBody(Export $export): string + { + $body = 'Your sticker detail 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/StickerDetailImporter.php b/app/Filament/Imports/StickerDetailImporter.php new file mode 100644 index 0000000..a0d5abf --- /dev/null +++ b/app/Filament/Imports/StickerDetailImporter.php @@ -0,0 +1,326 @@ +requiredMapping() + ->exampleHeader('Sticker ID') + ->example('123456') + ->label('STICKER ID') + ->rules(['required']), + ImportColumn::make('design_element_type') + ->requiredMapping() + ->exampleHeader('Design Element Type') + ->label('DESIGN ELEMENT TYPE') + ->example('Text/Shape/Image/QR'), + ImportColumn::make('element_id') + ->requiredMapping() + ->exampleHeader('Element ID') + ->label('ELEMENT ID') + ->example('001'), + ImportColumn::make('element_type') + ->requiredMapping() + ->exampleHeader('Element Type') + ->label('ELEMENT TYPE') + ->example('Static/Dynamic'), + // ImportColumn::make('characteristics_type') + // ->requiredMapping() + // ->exampleHeader('Characteristics Type') + // ->label('CHARACTERISTICS TYPE') + // ->example('ZMM values'), + ImportColumn::make('string_value') + ->requiredMapping() + ->exampleHeader('String Value') + ->label('STRING VALUE') + ->example('1'), + ImportColumn::make('string_font') + ->requiredMapping() + ->exampleHeader('String Font') + ->label('STRING FONT') + ->example('Arial'), + ImportColumn::make('string_size') + ->requiredMapping() + ->exampleHeader('String Size') + ->label('STRING SIZE') + ->example('12'), + ImportColumn::make('element_colour') + ->requiredMapping() + ->exampleHeader('Element Colour') + ->label('ELEMENT COLOUR') + ->example('Black'), + ImportColumn::make('string_align') + ->requiredMapping() + ->exampleHeader('String Align') + ->label('STRING ALIGN') + ->example('Left/Center/Right'), + ImportColumn::make('string_x_value') + ->requiredMapping() + ->exampleHeader('String X Value') + ->label('STRING X VALUE') + ->example('10'), + ImportColumn::make('string_y_value') + ->requiredMapping() + ->exampleHeader('String Y Value') + ->label('STRING Y VALUE') + ->example('20'), + ImportColumn::make('shape_name') + ->requiredMapping() + ->exampleHeader('Shape Name') + ->label('SHAPE NAME') + ->example('Line/Rectangle/CurvedRectangle'), + ImportColumn::make('shape_pen_size') + ->requiredMapping() + ->exampleHeader('Shape Pen Size') + ->label('SHAPE PEN SIZE') + ->example('0.3'), + // ImportColumn::make('curve_radius') + // ->requiredMapping() + // ->exampleHeader('Curve Radius') + // ->label('CURVE RADIUS') + // ->example('3'), + ImportColumn::make('shape_x1_value') + ->requiredMapping() + ->exampleHeader('Shape X1 Value') + ->label('SHAPE X1 VALUE') + ->example('10'), + ImportColumn::make('shape_y1_value') + ->requiredMapping() + ->exampleHeader('Shape Y1 Value') + ->label('SHAPE Y1 VALUE') + ->example('20'), + ImportColumn::make('shape_x2_value') + ->requiredMapping() + ->exampleHeader('Shape X2 Value') + ->label('SHAPE X2 VALUE') + ->example('30'), + ImportColumn::make('shape_y2_value') + ->requiredMapping() + ->exampleHeader('Shape Y2 Value') + ->label('SHAPE Y2 VALUE') + ->example('40'), + ImportColumn::make('image_x') + ->requiredMapping() + ->exampleHeader('Image X') + ->label('IMAGE X') + ->example('15'), + ImportColumn::make('image_y') + ->requiredMapping() + ->exampleHeader('Image Y') + ->label('IMAGE Y') + ->example('25'), + ImportColumn::make('image_width') + ->requiredMapping() + ->exampleHeader('Image Width') + ->label('IMAGE WIDTH') + ->example('100'), + ImportColumn::make('image_height') + ->requiredMapping() + ->exampleHeader('Image Height') + ->label('IMAGE HEIGHT') + ->example('100'), + ImportColumn::make('qr_value') + ->requiredMapping() + ->exampleHeader('QR Value') + ->label('QR VALUE') + ->example('246118|53246735267'), + ImportColumn::make('qr_align') + ->requiredMapping() + ->exampleHeader('QR Align') + ->label('QR ALIGN') + ->example('Left/Center/Right'), + ImportColumn::make('qr_size') + ->requiredMapping() + ->exampleHeader('QR Size') + ->label('QR SIZE') + ->example('10'), + ImportColumn::make('qr_x_value') + ->requiredMapping() + ->exampleHeader('QR X Value') + ->label('QR X VALUE') + ->example('30'), + ImportColumn::make('qr_y_value') + ->requiredMapping() + ->exampleHeader('QR Y Value') + ->label('QR Y VALUE') + ->example('40'), + ImportColumn::make('created_by') + ->requiredMapping() + ->exampleHeader('Created By') + ->label('CREATED BY') + ->example('RAW001234'), + ]; + } + + public function resolveRecord(): ?StickerDetail + { + + $warnMsg = []; + + $sticker = $this->data['sticker_structure_detail_id'] ?? null; + + $stickerCode = StickerStructureDetail::where('sticker_id', $sticker)->first(); + if (!$stickerCode) { + $warnMsg[] = "Sticker Id not found in Sticker Structure Detail"; + } + + $stickerId = $stickerCode->id; + + if (!$stickerId || $stickerId == null || $stickerId == '') { + $warnMsg[] = "Sticker Id not found in Sticker Structure Detail"; + } + + $user = User::where('name', $this->data['created_by'])->first(); + if (!$user) { + $warnMsg[] = "User not found"; + } + + $designType = strtolower($this->data['design_element_type'] ?? ''); + + $rules = [ + 'text' => [ + 'required' => ['string_x_value', 'string_y_value'], + 'allowed' => [ + 'string_value', + 'string_font', + 'string_size', + 'string_align', + 'string_colour', + 'string_x_value', + 'string_y_value', + ], + ], + + 'image' => [ + 'required' => ['image_x', 'image_y', 'image_width', 'image_height'], + 'allowed' => [ + 'image_x', + 'image_y', + 'image_width', + 'image_height', + ], + ], + + 'shape' => [ + 'required' => ['shape_name', 'shape_pen_size', 'shape_x1_value', 'shape_y1_value', 'shape_x2_value', 'shape_y2_value'], + 'allowed' => [ + 'shape_name', + 'shape_pen_size', + 'curve_radius', + 'shape_x1_value', + 'shape_y1_value', + 'shape_x2_value', + 'shape_y2_value', + ], + ], + + 'qr' => [ + 'required' => ['qr_value', 'qr_x_value', 'qr_y_value', 'qr_size'], + 'allowed' => [ + 'qr_value', + 'qr_align', + 'qr_size', + 'qr_x_value', + 'qr_y_value', + ], + ], + ]; + + if (!isset($rules[$designType])) { + $warnMsg[] = "Invalid Design Element Type: {$designType}"; + } + + if (isset($rules[$designType])) { + foreach ($rules[$designType]['required'] as $field) { + if (empty($this->data[$field])) { + $warnMsg[] = ucfirst($designType) . " requires {$field}"; + } + } + } + + $allElementFields = [ + 'string_value','string_font','string_size','string_align','string_colour', + 'string_x_value','string_y_value', + 'image_x','image_y','image_width','image_height', + 'shape_name','shape_pen_size','curve_radius', + 'shape_x1_value','shape_y1_value','shape_x2_value','shape_y2_value', + 'qr_value','qr_align','qr_size','qr_x_value','qr_y_value', + ]; + + if (isset($rules[$designType])) { + $allowed = $rules[$designType]['allowed']; + + foreach ($allElementFields as $field) { + if (!in_array($field, $allowed, true) && !empty($this->data[$field])) { + $warnMsg[] = "Field {$field} is not allowed for {$designType} element"; + } + } + } + + if (!empty($warnMsg)) { + throw new RowImportFailedException(implode(' | ', $warnMsg)); + } + + StickerDetail::Create([ + 'sticker_structure_detail_id' => $stickerId, + 'design_element_type' => $this->data['design_element_type'], + 'element_id' => $this->data['element_id'], + 'element_type' => $this->data['element_type'], + // 'characteristics_type' => $this->data['characteristics_type'], + 'string_value' => $this->data['string_value'], + 'string_font' => $this->data['string_font'], + 'string_size' => $this->data['string_size'], + 'element_colour' => $this->data['element_colour'], + 'string_align' => $this->data['string_align'], + 'string_x_value' => $this->data['string_x_value'], + 'string_y_value' => $this->data['string_y_value'], + 'shape_name' => $this->data['shape_name'], + 'shape_pen_size' => $this->data['shape_pen_size'], + // 'curve_radius' => $this->data['curve_radius'], + 'shape_x1_value' => $this->data['shape_x1_value'], + 'shape_y1_value' => $this->data['shape_y1_value'], + 'shape_x2_value' => $this->data['shape_x2_value'], + 'shape_y2_value' => $this->data['shape_y2_value'], + 'image_x' => $this->data['image_x'], + 'image_y' => $this->data['image_y'], + 'image_width' => $this->data['image_width'], + 'image_height' => $this->data['image_height'], + 'qr_value' => $this->data['qr_value'], + 'qr_align' => $this->data['qr_align'], + 'qr_size' => $this->data['qr_size'], + 'qr_x_value' => $this->data['qr_x_value'], + 'qr_y_value' => $this->data['qr_y_value'], + 'created_by' => $this->data['created_by'], + ]); + + return null; + + //return new StickerDetail(); + } + + public static function getCompletedNotificationBody(Import $import): string + { + $body = 'Your sticker detail 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; + } +} -- 2.49.1 From 6b59c6ac47b1b3bb2dce36e0ae1eddd29fa8ab48 Mon Sep 17 00:00:00 2001 From: dhanabalan Date: Tue, 4 Aug 2026 15:35:02 +0530 Subject: [PATCH 5/5] Added sticker deatil policy file --- app/Policies/StickerDetailPolicy.php | 106 +++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 app/Policies/StickerDetailPolicy.php diff --git a/app/Policies/StickerDetailPolicy.php b/app/Policies/StickerDetailPolicy.php new file mode 100644 index 0000000..d191fa5 --- /dev/null +++ b/app/Policies/StickerDetailPolicy.php @@ -0,0 +1,106 @@ +checkPermissionTo('view-any StickerDetail'); + } + + /** + * Determine whether the user can view the model. + */ + public function view(User $user, StickerDetail $stickerdetail): bool + { + return $user->checkPermissionTo('view StickerDetail'); + } + + /** + * Determine whether the user can create models. + */ + public function create(User $user): bool + { + return $user->checkPermissionTo('create StickerDetail'); + } + + /** + * Determine whether the user can update the model. + */ + public function update(User $user, StickerDetail $stickerdetail): bool + { + return $user->checkPermissionTo('update StickerDetail'); + } + + /** + * Determine whether the user can delete the model. + */ + public function delete(User $user, StickerDetail $stickerdetail): bool + { + return $user->checkPermissionTo('delete StickerDetail'); + } + + /** + * Determine whether the user can delete any models. + */ + public function deleteAny(User $user): bool + { + return $user->checkPermissionTo('delete-any StickerDetail'); + } + + /** + * Determine whether the user can restore the model. + */ + public function restore(User $user, StickerDetail $stickerdetail): bool + { + return $user->checkPermissionTo('restore StickerDetail'); + } + + /** + * Determine whether the user can restore any models. + */ + public function restoreAny(User $user): bool + { + return $user->checkPermissionTo('restore-any StickerDetail'); + } + + /** + * Determine whether the user can replicate the model. + */ + public function replicate(User $user, StickerDetail $stickerdetail): bool + { + return $user->checkPermissionTo('replicate StickerDetail'); + } + + /** + * Determine whether the user can reorder the models. + */ + public function reorder(User $user): bool + { + return $user->checkPermissionTo('reorder StickerDetail'); + } + + /** + * Determine whether the user can permanently delete the model. + */ + public function forceDelete(User $user, StickerDetail $stickerdetail): bool + { + return $user->checkPermissionTo('force-delete StickerDetail'); + } + + /** + * Determine whether the user can permanently delete any models. + */ + public function forceDeleteAny(User $user): bool + { + return $user->checkPermissionTo('force-delete-any StickerDetail'); + } +} -- 2.49.1