Added sticker template service for bulk sticker printing
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Gemini PR Review / Gemini PR Review (pull_request) Failing after 25s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 19s
Laravel Pint / pint (pull_request) Successful in 3m50s
Laravel Larastan / larastan (pull_request) Failing after 6m32s
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Gemini PR Review / Gemini PR Review (pull_request) Failing after 25s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 19s
Laravel Pint / pint (pull_request) Successful in 3m50s
Laravel Larastan / larastan (pull_request) Failing after 6m32s
This commit is contained in:
@@ -1042,6 +1042,327 @@ class StickerPdfService
|
||||
}
|
||||
}
|
||||
|
||||
public function generateTemplate(string $stickerId,Collection $dynamicElements,?ItemCharacteristic $itemCharacteristic,$itemCode,$plantId)
|
||||
{
|
||||
$dynamicValueMap = [];
|
||||
|
||||
$itemCode = $itemCharacteristic?->item?->code ?? $itemCode ?? '';
|
||||
|
||||
$plantName = $itemCharacteristic?->plant?->name ?? '';
|
||||
$plantAddress = $itemCharacteristic?->plant?->address ?? '';
|
||||
|
||||
|
||||
foreach ($dynamicElements as $element) {
|
||||
|
||||
$column = $element->characteristics_type;
|
||||
|
||||
$value = '';
|
||||
|
||||
if ($itemCharacteristic && $column && Schema::hasColumn('item_characteristics', $column))
|
||||
{
|
||||
$value = $itemCharacteristic->{$column};
|
||||
}
|
||||
|
||||
$dynamicValueMap[$element->id] = $value;
|
||||
}
|
||||
|
||||
$structure = StickerStructureDetail::where('sticker_id',$stickerId)->firstOrFail();
|
||||
|
||||
$elements = StickerDetail::where('sticker_structure_detail_id',$structure->id)->get();
|
||||
|
||||
$templateElements = [];
|
||||
|
||||
foreach ($elements as $row) {
|
||||
|
||||
if ($row->design_element_type == 'Text') {
|
||||
|
||||
$textValue = $row->string_value ?? '';
|
||||
|
||||
if ($row->element_type == 'Dynamic' && isset($dynamicValueMap[$row->id]) &&
|
||||
!in_array($row->characteristics_type, [
|
||||
'item_code',
|
||||
'serial_number',
|
||||
'plant_name',
|
||||
'plant_address',
|
||||
'current_date',
|
||||
])
|
||||
)
|
||||
{
|
||||
$textValue = $dynamicValueMap[$row->id];
|
||||
}
|
||||
|
||||
if ($row->characteristics_type == 'item_code') {
|
||||
$textValue = $itemCode;
|
||||
}
|
||||
if ($row->characteristics_type == 'serial_number') {
|
||||
$textValue = '__SERIAL_NUMBER__';
|
||||
}
|
||||
if ($row->characteristics_type === 'plant_name') {
|
||||
$textValue = $plantName;
|
||||
}
|
||||
if ($row->characteristics_type === 'plant_address') {
|
||||
$textValue = $plantAddress;
|
||||
}
|
||||
if ($row->characteristics_type === 'current_date') {
|
||||
$textValue = date('M-y');
|
||||
}
|
||||
$font = $row->string_font ?? 'helvetica';
|
||||
|
||||
if (str_contains($row->string_value ?? '', '₹')) {
|
||||
$font = 'dejavusans';
|
||||
}
|
||||
|
||||
$templateElements[] =
|
||||
[
|
||||
'type' => 'text',
|
||||
'value' => $textValue,
|
||||
'x' => (float) ($row->string_x_value ?? 0),
|
||||
'y' => (float) ($row->string_y_value ?? 0),
|
||||
'font' => $font,
|
||||
'size' => (int) ($row->string_size ?? 10),
|
||||
'color' => $row->element_colour ?? '#000000',
|
||||
];
|
||||
}
|
||||
elseif ($row->design_element_type == 'QR') {
|
||||
|
||||
if ($row->element_type == 'Dynamic') {
|
||||
$qrValue = '__DYNAMIC_QR__';
|
||||
} else {
|
||||
$qrValue = $row->qr_value ?? '';
|
||||
}
|
||||
|
||||
$templateElements[] = [
|
||||
'type' => 'qr',
|
||||
'value' => $qrValue,
|
||||
'x' => (float) ($row->qr_x_value ?? 0),
|
||||
'y' => (float) ($row->qr_y_value ?? 0),
|
||||
'size' => (float) ($row->qr_size ?? 10),
|
||||
];
|
||||
}
|
||||
elseif ($row->design_element_type == 'Image') {
|
||||
|
||||
$imagePath = null;
|
||||
|
||||
if ($row->element_type == 'Dynamic' && isset($dynamicValueMap[$row->id]) && !empty($dynamicValueMap[$row->id]))
|
||||
{
|
||||
$imageName = strtolower($dynamicValueMap[$row->id]) . '.png';
|
||||
|
||||
$imagePath = public_path('images/' . ltrim($imageName, '/'));
|
||||
}
|
||||
|
||||
$templateElements[] = [
|
||||
'type' => 'image',
|
||||
'path' => $imagePath,
|
||||
'x' => (float) ($row->image_x ?? 0),
|
||||
'y' => (float) ($row->image_y ?? 0),
|
||||
'width' => (float) ($row->image_width ?? 0),
|
||||
'height' => (float) ($row->image_height ?? 0),
|
||||
];
|
||||
}
|
||||
elseif ($row->design_element_type == 'Shape') {
|
||||
|
||||
$templateElements[] = [
|
||||
'type' => 'shape',
|
||||
'name' => $row->shape_name,
|
||||
'pen_size' => (float) ($row->shape_pen_size ?? ''),
|
||||
'color' => $row->element_colour ?? '#000000',
|
||||
'x1' => (float) ($row->shape_x1_value ?? 0),
|
||||
'y1' => (float) ($row->shape_y1_value ?? 0),
|
||||
'x2' => (float) ($row->shape_x2_value ?? 0),
|
||||
'y2' => (float) ($row->shape_y2_value ?? 0),
|
||||
'radius' => (float) ($row->curve_radius ?? ''),
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
// Return prepared template. No PDF generation here.
|
||||
return [
|
||||
'width' => (float) $structure->sticker_width,
|
||||
'height' => (float) $structure->sticker_height,
|
||||
'lmargin' => (float) $structure->sticker_lmargin,
|
||||
'tmargin' => (float) $structure->sticker_tmargin,
|
||||
'rmargin' => (float) $structure->sticker_rmargin,
|
||||
'bmargin' => (float) $structure->sticker_bmargin,
|
||||
'itemCode' => $itemCode,
|
||||
'elements' => $templateElements,
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
public function generateBulkFromTemplate(array $template,$fromSerial,$toSerial,string $itemCode)
|
||||
{
|
||||
$stickerWidth = (float) $template['width'];
|
||||
$stickerHeight = (float) $template['height'];
|
||||
|
||||
$gap = 5.0;
|
||||
|
||||
$count = ($toSerial - $fromSerial) + 1;
|
||||
|
||||
$totalHeight =
|
||||
($stickerHeight * $count)
|
||||
+
|
||||
($gap * ($count - 1));
|
||||
|
||||
$pdf = new TCPDF(
|
||||
'P',
|
||||
'mm',
|
||||
[
|
||||
$stickerWidth,
|
||||
$totalHeight
|
||||
],
|
||||
true,
|
||||
'UTF-8',
|
||||
false
|
||||
);
|
||||
|
||||
$pdf->setPrintHeader(false);
|
||||
$pdf->setPrintFooter(false);
|
||||
|
||||
$pdf->SetMargins(
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0
|
||||
);
|
||||
|
||||
$pdf->SetAutoPageBreak(false, 0);
|
||||
|
||||
$pdf->AddPage();
|
||||
|
||||
$currentY = 0;
|
||||
|
||||
// Generate every serial
|
||||
|
||||
for ($serial = $fromSerial; $serial <= $toSerial; $serial++)
|
||||
{
|
||||
$qrContent = $itemCode . '|' . $serial;
|
||||
|
||||
foreach ($template['elements'] as $element) {
|
||||
|
||||
if ($element['type'] == 'text') {
|
||||
|
||||
$textValue = $element['value'];
|
||||
|
||||
if ($textValue == '__SERIAL_NUMBER__') {
|
||||
$textValue = (string) $serial;
|
||||
}
|
||||
|
||||
$pdf->SetFont($element['font'],'',$element['size']);
|
||||
|
||||
$rgb = $this->hexToRgb($element['color']);
|
||||
|
||||
$pdf->SetTextColor(
|
||||
$rgb[0],
|
||||
$rgb[1],
|
||||
$rgb[2]
|
||||
);
|
||||
|
||||
$pdf->Text(
|
||||
$element['x'],
|
||||
$element['y'] + $currentY,
|
||||
(string) $textValue
|
||||
);
|
||||
}
|
||||
elseif ($element['type'] == 'qr') {
|
||||
|
||||
$qrValue = $element['value'];
|
||||
|
||||
if ($qrValue == '__DYNAMIC_QR__') {
|
||||
$qrValue = $qrContent;
|
||||
}
|
||||
|
||||
$pdf->write2DBarcode(
|
||||
$qrValue,
|
||||
'QRCODE,H',
|
||||
$element['x'],
|
||||
$element['y'] + $currentY,
|
||||
$element['size'],
|
||||
$element['size']
|
||||
);
|
||||
}
|
||||
elseif ($element['type'] == 'image') {
|
||||
|
||||
if (!empty($element['path']) && file_exists($element['path']))
|
||||
{
|
||||
|
||||
$pdf->Image(
|
||||
$element['path'],
|
||||
$element['x'],
|
||||
$element['y'] + $currentY,
|
||||
$element['width'],
|
||||
$element['height']
|
||||
);
|
||||
}
|
||||
}
|
||||
elseif ($element['type'] == 'shape') {
|
||||
|
||||
$rgb = $this->hexToRgb(
|
||||
$element['color']
|
||||
);
|
||||
|
||||
$pdf->SetDrawColor(
|
||||
$rgb[0],
|
||||
$rgb[1],
|
||||
$rgb[2]
|
||||
);
|
||||
|
||||
$pdf->SetLineWidth(
|
||||
$element['pen_size']
|
||||
);
|
||||
if ($element['name'] == 'Line') {
|
||||
|
||||
$pdf->Line(
|
||||
$element['x1'],
|
||||
$element['y1'] + $currentY,
|
||||
$element['x2'],
|
||||
$element['y2'] + $currentY
|
||||
);
|
||||
}
|
||||
elseif ($element['name'] == 'Rectangle') {
|
||||
|
||||
$x = min($element['x1'],$element['x2']);
|
||||
$y = min($element['y1'],$element['y2']);
|
||||
|
||||
$width = abs($element['x2'] - $element['x1']);
|
||||
|
||||
$height = abs($element['y2'] - $element['y1']);
|
||||
|
||||
$pdf->Rect(
|
||||
$x,
|
||||
$y + $currentY,
|
||||
$width,
|
||||
$height,
|
||||
'D'
|
||||
);
|
||||
}
|
||||
elseif ($element['name'] == 'CurvedRectangle')
|
||||
{
|
||||
$x = min($element['x1'],$element['x2']);
|
||||
$y = min($element['y1'],$element['y2']);
|
||||
|
||||
$width = abs($element['x2'] - $element['x1']);
|
||||
|
||||
$height = abs($element['y2'] - $element['y1']);
|
||||
|
||||
$pdf->RoundedRect(
|
||||
$x,
|
||||
$y + $currentY,
|
||||
$width,
|
||||
$height,
|
||||
$element['radius'],
|
||||
'1111',
|
||||
'D'
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$currentY += $stickerHeight + $gap;
|
||||
}
|
||||
|
||||
return $pdf->Output('', 'S');
|
||||
}
|
||||
|
||||
public function generatePdfBySerial($item, $serNo, $plantId, $refNumber)
|
||||
{
|
||||
$recFound = ProductionQuantity::where('plant_id', $plantId)
|
||||
@@ -1146,7 +1467,7 @@ class StickerPdfService
|
||||
|
||||
private function hexToRgb($hex)
|
||||
{
|
||||
if (! is_string($hex) || ($hex = trim($hex)) === '') {
|
||||
if (! is_string($hex) || ($hex = trim($hex)) == '') {
|
||||
return [0, 0, 0];
|
||||
}
|
||||
$hex = ltrim($hex, '#');
|
||||
|
||||
Reference in New Issue
Block a user