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; + } +}