diff --git a/app/Controllers/Items.php b/app/Controllers/Items.php index 82c9e7429..6cb3a4d41 100644 --- a/app/Controllers/Items.php +++ b/app/Controllers/Items.php @@ -496,23 +496,24 @@ class Items extends Secure_Controller * @return void * @noinspection PhpUnused */ - public function getGenerateBarcodes(string $item_ids): void //TODO: Passing these through as a string instead of an array limits the contents of the item_ids + public function getGenerateBarcodes(string $item_ids): void //TODO: Passing these through as a string instead of an array limits the contents of the item_ids. Perhaps a better approach would to serialize as JSON in an array and pass through post variables? { $item_ids = explode(':', $item_ids); $result = $this->item->get_multiple_info($item_ids, $this->item_lib->get_item_location())->getResultArray(); - $config = $this->barcode_lib->get_barcode_config(); - - $data['barcode_config'] = $config; + $data['barcode_config'] = $this->barcode_lib->get_barcode_config(); foreach($result as &$item) { - if(empty($item['item_number']) && $this->config['barcode_generate_if_empty']) + if(isset($item['item_number']) && empty($item['item_number']) && $this->config['barcode_generate_if_empty']) { - $barcode_instance = Barcode_lib::barcode_instance($item, $config); + $barcode_instance = Barcode_lib::barcode_instance($item, $data['barcode_config']); $item['item_number'] = $barcode_instance->getData(); - $save_item = ['item_number' => $item['item_number']]; - $this->item->save_value($save_item, $item['item_id']); + if(isset($item['item_id'])) + { + $save_item = ['item_number' => $item['item_number']]; + $this->item->save_value($save_item, $item['item_id']); + } } } $data['items'] = $result; diff --git a/app/Libraries/Barcode_lib.php b/app/Libraries/Barcode_lib.php index 487bf57dd..c32b6151b 100644 --- a/app/Libraries/Barcode_lib.php +++ b/app/Libraries/Barcode_lib.php @@ -4,11 +4,14 @@ namespace App\Libraries; use Config\OSPOS; use Exception; +use Picqer\Barcode\BarcodeGenerator; +use Picqer\Barcode\BarcodeGeneratorHTML; use Picqer\Barcode\BarcodeGeneratorPNG; use App\Libraries\Barcodes\Code39; use App\Libraries\Barcodes\Code128; use App\Libraries\Barcodes\Ean8; use App\Libraries\Barcodes\Ean13; +use ReflectionClass; /** * Barcode library @@ -17,15 +20,46 @@ use App\Libraries\Barcodes\Ean13; */ class Barcode_lib { + /** + * @var array Values from Picqer\Barcode\BarcodeGenerator class. If that class changes, this array will need to be updated. + */ private array $supported_barcodes = [ - 'Code39' => 'Code 39', - 'Code128' => 'Code 128', - 'Ean8' => 'EAN 8', - 'Ean13' => 'EAN 13' + 'C32' => 'Code 32', + 'C39' => 'Code 39', + 'C39+' => 'Code 39 Checksum', + 'C39E' => 'Code 39E', + 'C39E+' => 'Code 39E Checksum', + 'C93' => 'Code 93', + 'S25' => 'Standard 2 5', + 'S25+' => 'Standard 2 5 Checksum', + 'I25' => 'Interleaved 2 5', + 'I25+' => 'Interleaved 2 5 Checksum', + 'C128' => 'Code 128', + 'C128A' => 'Code 128 A', + 'C128B' => 'Code 128 B', + 'C128C' => 'Code 128 C', + 'EAN2' => 'EAN 2', + 'EAN5' => 'EAN 5', + 'EAN8' => 'EAN 8', + 'EAN13' => 'EAN 13', + 'ITF14' => 'ITF14', + 'UPCA' => 'UPC A', + 'UPCE' => 'UPC E', + 'MSI' => 'Msi', + 'MSI+' => 'MSI Checksum', + 'POSTNET' => 'Postnet', + 'PLANET' => 'Planet', + 'RMS4CC' => 'RMS4CC', + 'KIX' => 'KIX', + 'IMB' => 'IMB', + 'CODABAR' => 'Codabar', + 'CODE11' => 'Code 11', + 'PHARMA' => 'Pharma Code', + 'PHARMA2T' => 'Pharma Code Two Tracks', ]; /** - * @return array|string[] + * @return array */ public function get_list_barcodes(): array { @@ -53,11 +87,25 @@ class Barcode_lib $data['barcode_page_width'] = $config['barcode_page_width']; $data['barcode_page_cellspacing'] = $config['barcode_page_cellspacing']; $data['barcode_generate_if_empty'] = $config['barcode_generate_if_empty']; - $data['barcode_formats'] = $config['barcode_formats']; + $data['barcode_formats'] = $config['barcode_formats'] !== 'null'? $config['barcode_formats'] : []; return $data; } + /** + * Returns the value to be used in the barcode. + * + * @param array $item Contains item data + * @param array $barcode_config Contains barcode configuration + * @return string Barcode value + */ + private function get_barcode_value(array $item, array $barcode_config) + { + return $barcode_config['barcode_content'] !== "id" && !empty($item['item_number']) + ? $item['item_number'] + : $item['item_id']; + } + /** * @param array $item * @param array $barcode_config @@ -109,7 +157,7 @@ class Barcode_lib * @param array $item * @param object $barcode_instance * @param array $barcode_config - * @return mixed + * @return */ private static function barcode_seed(array $item, object $barcode_instance, array $barcode_config) { @@ -145,17 +193,15 @@ class Barcode_lib { try { - $generator = new BarcodeGeneratorPNG(); - $barcode_instance = Barcode_lib::barcode_instance($item, $barcode_config); - $barcode_instance->setDimensions($barcode_config['barcode_width'], $barcode_config['barcode_height']); - - $barcode_instance->draw(); - - return $barcode_instance->base64(); + $generator = new BarcodeGeneratorHTML(); + $barcode_value = $this->get_barcode_value($item, $barcode_config); + return base64_encode($generator->getBarcode($barcode_value, $barcode_config['barcode_type'], 2, $barcode_config['barcode_height'])); } catch(Exception $e) { echo 'Caught exception: ', $e->getMessage(), "\n"; + echo 'Stack trace: ', $e->getTraceAsString(); + return ''; } } @@ -200,15 +246,20 @@ class Barcode_lib */ public function display_barcode(array $item, array $barcode_config): string { - $display_table = ''; - $display_table .= "'; - $barcode = $this->generate_barcode($item, $barcode_config); - $display_table .= ""; - $display_table .= "'; - $display_table .= "'; - $display_table .= '
" . $this->manage_display_layout($barcode_config['barcode_first_row'], $item, $barcode_config) . '
" . $this->manage_display_layout($barcode_config['barcode_second_row'], $item, $barcode_config) . '
" . $this->manage_display_layout($barcode_config['barcode_third_row'], $item, $barcode_config) . '
'; + if(isset($item['item_number']) && isset($item['item_id'])) + { + $display_table = ''; + $display_table .= "'; + $barcode = $this->generate_barcode($item, $barcode_config); + $display_table .= ""; + $display_table .= "'; + $display_table .= "'; + $display_table .= '
" . $this->manage_display_layout($barcode_config['barcode_first_row'], $item, $barcode_config) . '
" . base64_decode($barcode) . "
" . $this->manage_display_layout($barcode_config['barcode_second_row'], $item, $barcode_config) . '
" . $this->manage_display_layout($barcode_config['barcode_third_row'], $item, $barcode_config) . '
'; - return $display_table; + return $display_table; + } + + return "Item number or Item ID not found in the item array."; } /** diff --git a/app/Libraries/Barcodes/BarcodeBase.php b/app/Libraries/Barcodes/BarcodeBase.php index b8ad191cf..b73a757bd 100644 --- a/app/Libraries/Barcodes/BarcodeBase.php +++ b/app/Libraries/Barcodes/BarcodeBase.php @@ -57,11 +57,11 @@ abstract class BarcodeBase /** * (Abstract) Set the data * - * @param mixed $data - (int or string) Data to be encoded + * @param $data - (int or string) Data to be encoded * @return void * @throws OverflowException */ - abstract public function setData(mixed $data): void; + abstract public function setData($data): void; /** * Get the data diff --git a/app/Libraries/Barcodes/Code128.php b/app/Libraries/Barcodes/Code128.php index 22c147238..72de251e9 100644 --- a/app/Libraries/Barcodes/Code128.php +++ b/app/Libraries/Barcodes/Code128.php @@ -129,11 +129,11 @@ class Code128 extends BarcodeBase /** * Set the data * - * @param mixed $data - (int or string) Data to be encoded + * @param $data - (int or string) Data to be encoded * @return void * @throws OverflowException */ - public function setData(mixed $data): void + public function setData($data): void { $this->data = $data; } diff --git a/app/Libraries/Barcodes/Code39.php b/app/Libraries/Barcodes/Code39.php index 7e3ae392b..4fdf59874 100644 --- a/app/Libraries/Barcodes/Code39.php +++ b/app/Libraries/Barcodes/Code39.php @@ -85,11 +85,11 @@ class Code39 extends BarcodeBase /** * Set the data * - * @param mixed $data - (int or string) Data to be encoded + * @param $data - (int or string) Data to be encoded * @return void * @throws OverflowException */ - public function setData(mixed $data): void + public function setData($data): void { $this->data = $data; } diff --git a/app/Libraries/Barcodes/Ean13.php b/app/Libraries/Barcodes/Ean13.php index e2fa3619b..268d2e489 100644 --- a/app/Libraries/Barcodes/Ean13.php +++ b/app/Libraries/Barcodes/Ean13.php @@ -119,10 +119,10 @@ class Ean13 extends BarcodeBase /** * Set the data * - * @param mixed $data - (int or string) Data to be encoded + * @param $data - (int or string) Data to be encoded * @return void */ - public function setData(mixed $data): void + public function setData($data): void { $this->data = $data; } @@ -274,21 +274,27 @@ class Ean13 extends BarcodeBase { $value = substr($this->data, $idx, 1); - foreach ($this->_codingmap[$value][$set_array[$idx - 1]] as $bar) + if(isset($this->_codingmap[$value][$set_array[$idx - 1]])) { - if ($bar) + foreach($this->_codingmap[$value][$set_array[$idx - 1]] as $bar) { - imagefilledrectangle( - $this->img, - $xpos, - 0, - $xpos + $pxPerBar - 1, - $this->y, - $black - ); - } - - $xpos += $pxPerBar; + if($bar) + { + imagefilledrectangle( + $this->img, + $xpos, + 0, + $xpos + $pxPerBar - 1, + $this->y, + $black + ); + } + $xpos += $pxPerBar; + } + } + else + { + throw new \Exception("Invalid index in _codingmap array. Value: $value, Set: {$set_array[$idx - 1]}"); } } diff --git a/app/Libraries/Barcodes/Ean8.php b/app/Libraries/Barcodes/Ean8.php index 7179288c6..159e1f8c8 100644 --- a/app/Libraries/Barcodes/Ean8.php +++ b/app/Libraries/Barcodes/Ean8.php @@ -191,10 +191,10 @@ class Ean8 extends BarcodeBase /** * Set the data * - * @param mixed $data - (int or string) Data to be encoded + * @param $data - (int or string) Data to be encoded * @return void */ - public function setData(mixed $data): void + public function setData($data): void { $this->data = $data; } diff --git a/app/Views/configs/barcode_config.php b/app/Views/configs/barcode_config.php index 92eee2099..4c15a1fc2 100644 --- a/app/Views/configs/barcode_config.php +++ b/app/Views/configs/barcode_config.php @@ -126,17 +126,16 @@
- 'control-label col-xs-2']) ?> + 'control-label col-xs-2']) ?>
+ $barcode_formats = json_decode(config('OSPOS')->settings['barcode_formats']); + echo form_dropdown ([ + 'name' => 'barcode_formats[]', + 'id' => 'barcode_formats', + 'options' => !empty($barcode_formats) ? esc(array_combine($barcode_formats, $barcode_formats), 'attr') : [], + 'multiple' => 'multiple', + 'data-role' => 'tagsinput']) ?>