diff --git a/app/View/Label.php b/app/View/Label.php new file mode 100644 index 0000000000..c720f5a8dd --- /dev/null +++ b/app/View/Label.php @@ -0,0 +1,243 @@ +data = new Collection(); + } + + + /** + * Render the PDF label. + * + * @param callable|null $callback + */ + public function render(callable $callback = null) + { + $settings = $this->data->get('settings'); + $assets = $this->data->get('assets'); + $offset = $this->data->get('offset'); + + // If disabled, pass to legacy view + if (!$settings->label2_enable) { + return view('hardware/labels') + ->with('assets', $assets) + ->with('settings', $settings) + ->with('bulkedit', $this->data->get('bulkedit')) + ->with('count', $this->data->get('count')); + } + + + $template = LabelModel::find($settings->label2_template); + $template->validate(); + + $pdf = new TCPDF( + $template->getOrientation(), + $template->getUnit(), + [ $template->getWidth(), $template->getHeight() ] + ); + + // Reset parameters + $pdf->SetPrintHeader(false); + $pdf->SetPrintFooter(false); + $pdf->SetAutoPageBreak(false); + $pdf->SetMargins(0, 0, null, true); + $pdf->SetCellMargins(0, 0, 0, 0); + $pdf->SetCellPaddings(0, 0, 0, 0); + $pdf->setCreator('Snipe-IT'); + $pdf->SetSubject('Asset Labels'); + $template->preparePDF($pdf); + + // 'Label1=field1|Alt1=altfield1;Label2=field2;Alt1=altfield1|Label3=field3' + $fieldDefinitions = (new Collection()) + ->merge(explode(';', $settings->label2_fields)) + ->filter(function ($defString) { + return strpos($defString, '=') !== false; + }) + ->map(function ($defString) { + return (new Collection()) + ->merge(explode('|', $defString)) // ['Label1=field1', 'Alt1=altfield1'] + ->mapWithKeys(function ($altString) { + $parts = explode('=', $altString); + if (count($parts) != 2) throw new \Exception(var_export($parts, true)); + return [ $parts[0] => $parts[1] ]; + }); + }); + /* + $fieldDefinitions should now look like: + [ + [ + 'Label1'=>'field1', + 'Alt1'=>'altfield1' + ], + [ + 'Label2'=>'field2' + ], + [ + 'Alt1'=>'altfield1', + 'Label3'=>'field3' + ] + ] + */ + + // Prepare data + $data = $assets + ->map(function ($asset) use ($template, $settings, $fieldDefinitions) { + + $assetData = new Collection(); + + $assetData->put('id', $asset->id); + $assetData->put('tag', $asset->asset_tag); + + if ($template->getSupportTitle()) { + $assetData->put('title', !empty($settings->label2_title) ? + str_ireplace(':company', $asset->company->name, $settings->label2_title) : + $settings->qr_text + ); + } + + if ($template->getSupportLogo()) { + $assetData->put('logo', $settings->label2_asset_logo ? + ( + !empty($asset->company->image) ? + Storage::disk('public')->path('companies/'.e($asset->company->image)) : + null + ) : + ( + !empty($settings->label_logo) ? + Storage::disk('public')->path(''.e($settings->label_logo)) : + null + ) + ); + } + + if ($template->getSupport1DBarcode()) { + $barcode1DType = $settings->label2_1d_type; + $barcode1DType = ($barcode1DType == 'default') ? + (($settings->alt_barcode_enabled) ? $settings->alt_barcode : null) : + $barcode1DType; + if ($barcode1DType) { + $assetData->put('barcode1d', (object)[ + 'type' => $barcode1DType, + 'content' => $asset->asset_tag, + ]); + } + } + + if ($template->getSupport2DBarcode()) { + $barcode2DType = $settings->label2_2d_type; + $barcode2DType = ($barcode2DType == 'default') ? + (($settings->qr_code) ? $settings->barcode_type : null) : + $barcode2DType; + if ($barcode2DType) { + switch ($settings->label2_2d_target) { + case 'ht_tag': $barcode2DTarget = route('ht/assetTag', $asset->asset_tag); break; + case 'hardware_id': + default: $barcode2DTarget = route('hardware.show', $asset->id); break; + } + $assetData->put('barcode2d', (object)[ + 'type' => $barcode2DType, + 'content' => $barcode2DTarget, + ]); + } + } + + $fields = $fieldDefinitions + ->map(function ($group, $index) use ($asset) { + return $group->mapWithKeys(function ($definition, $label) use ($asset) { + $value = collect(explode('.', $definition)) + ->reduce(function ($carry, $chunk) { + return $carry ? $carry->{$chunk} : ${$carry}; + }, $asset); + return [ $label => $value ]; + }); + }) + ->reduce(function ($carry, $group, $index) { + $values = $group + ->filter(function ($value, $label) use ($carry) { + if (empty($value)) return false; + if ($carry->has($label)) return false; + return true; + }) + ->take(1); + return $carry->merge($values); + }, new Collection()); + $assetData->put('fields', $fields->take($template->getSupportFields())); + + return $assetData; + }); + + if ($template instanceof Sheet) { + $template->setLabelIndexOffset($offset ?? 0); + } + $template->writeAll($pdf, $data); + + $filename = $assets->count() > 1 ? 'assets.pdf' : $assets->first()->asset_tag.'.pdf'; + $pdf->Output($filename, 'I'); + } + + /** + * Add a piece of data. + * + * @param string|array $key + * @param mixed $value + * @return $this + */ + public function with($key, $value = null) + { + $this->data->put($key, $value); + return $this; + } + + /** + * Get the array of view data. + * + * @return array + */ + public function getData() + { + return $this->data; + } + + /** + * Get the name of the view. + * + * @return string + */ + public function name() + { + return $this->getName(); + } + + /** + * Get the name of the view. + * + * @return string + */ + public function getName() + { + return self::NAME; + } + +} \ No newline at end of file