From 17188f6134982d876bd2bac15741f33feb2aff86 Mon Sep 17 00:00:00 2001 From: Siau Pheng Date: Tue, 6 Oct 2026 14:05:52 +0700 Subject: [PATCH] reorganize class name --- assets/js/download.js | 85 +++++++++++++++++++ assets/js/export.js | 63 -------------- assets/js/pdf.js | 11 +-- assets/js/pole-display.js | 2 +- assets/js/print.js | 22 ++--- assets/js/share.js | 73 ---------------- assets/js/simulator.js | 11 +-- composer.json | 1 + src/Data/CSV.php | 8 +- src/Data/PDF.php | 52 ++++++------ src/Data/Xlsx.php | 155 ++++++++++++++++++++++++++++++++++ src/Printer/PrintHTML.php | 171 +++++++++++++++++++++----------------- src/Printer/PrintPOS.php | 72 ++++++---------- 13 files changed, 417 insertions(+), 309 deletions(-) create mode 100644 assets/js/download.js delete mode 100644 assets/js/export.js delete mode 100644 assets/js/share.js create mode 100644 src/Data/Xlsx.php diff --git a/assets/js/download.js b/assets/js/download.js new file mode 100644 index 0000000..7e91e65 --- /dev/null +++ b/assets/js/download.js @@ -0,0 +1,85 @@ +/******************************************************************* + + Module : /assets/js/download.js + Desc. : Fungsi-fungsi download data & laporan + Created By : Siau Pheng (siaupheng@3fonia.com). + Created Date : April 1st, 2011. + Last Modified : October 2nd, 2026. + + (c) 3FONIA Software; WWW.3FONIA.COM. + +*******************************************************************/ + +var Download = function(options) { + var _options = { + 'url': '', + 'filename': 'file.bin', + 'title': '', + 'text': 'share dari aplikasi' + }; + var _params = []; + + this.construct = function(options){ + if (typeof options == 'object') { + $.extend(_options, options); + } else _options.url = options; + }; + this.set_url = function (url){ + _options.url = url; + }; + this.add_param = function(par_id, par_val) { + var _getvalue = (par_val) ? par_id + '=' + encodeURIComponent(par_val) : par_id; + _params.push(_getvalue); + }; + this._exec = async function(is_share) { + if (!_options.url) { + console.warn('cek url !'); + return false; + } + try { + const blob = await $.ajax({ + type: 'POST', + url: _options.url, + data: FoniaJS.RequestParam(_params), + xhrFields: { + responseType: 'blob' + }, + success: async function (data, status, xhr) { + const disposition = xhr.getResponseHeader('Content-Disposition'); + if (disposition && disposition.indexOf('attachment') !== -1) { + const filenameRegex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/; + const matches = filenameRegex.exec(disposition); + if (matches != null && matches[1]) { + _options.filename = matches[1].replace(/['"]/g, ''); + } + } + } + }); + const file = new File([blob], _options.filename, { type: blob.type }); + + if (is_share === true && navigator.canShare && navigator.canShare({ files: [file] })) { + await navigator.share({ + files: [file], + title: _options.title ?? _options.filename, + text: _options.text + }); + } else { + const link = document.createElement('a'); + link.href = URL.createObjectURL(blob); + link.download = _options.filename; + link.click(); + } + + } catch (error) { + console.error('Download / sharing gagal :', error); + }; + return this; + }; + this.share = async function() { + await this._exec(true); + }; + this.download = async function() { + await this._exec(false); + }; + this.construct(options); +}; diff --git a/assets/js/export.js b/assets/js/export.js deleted file mode 100644 index 7a5ed35..0000000 --- a/assets/js/export.js +++ /dev/null @@ -1,63 +0,0 @@ -/******************************************************************* - - Module : /assets/js/export.js - Desc. : Fungsi-fungsi export data & laporan - Created By : Siau Pheng (siaupheng@3fonia.com). - Created Date : April 1st, 2011. - Last Modified : January 19th, 2026. - - (c) 3FONIA Software; WWW.3FONIA.COM. - -*******************************************************************/ - -var cEXPORT = function(url, options){ - var _options = { - 'url': '', - 'filename': '' - }; - var _params = []; - - this.construct = function(url, options){ - if (typeof url == 'object') { - $.extend(_options, url); - } else { - $.extend(_options, options); - _options.url = url; - } - }; - this.set_url = function (url){ - _options.url = url; - }; - this.add_param = function (par_id, par_val){ - var _getvalue = (par_val) ? par_id + "=" + escape(par_val) : par_id; - _params.push(_getvalue); - }, - this.download = async function(){ - if (!_options.url) { - console.warn('cek url !'); - return false; - } - var _pro = (window.location.protocol=='https:') ? 'https://' : 'http://'; - var _src = _pro+FoniaJS.WEB_HOST + _options.url + '?' + $.param(FoniaJS.RequestParam(_params)); - - try { - const response = await fetch(_src) - .then(response => { - const cDispo = response.headers.get('Content-Disposition'); - if (cDispo && cDispo.indexOf('filename=') !== -1) { - _options.filename = cDispo.split('filename=')[1].split(';')[0].replace(/"/g, ''); - } - return response; - }) - const blob = await response.blob(); - const link = document.createElement('a'); - link.href = URL.createObjectURL(blob); - link.download = _options.filename; - link.click(); - } catch (error) { - console.error('Download gagal:', error); - } - return this; - }; - this.construct(url, options); -}; diff --git a/assets/js/pdf.js b/assets/js/pdf.js index e52c2b4..45e594f 100644 --- a/assets/js/pdf.js +++ b/assets/js/pdf.js @@ -10,15 +10,16 @@ *******************************************************************/ -var cPDF = function(url, options){ +var Pdf = function(options){ var vars = { 'url': '', 'zoom': 80, 'param': [] }; - this.construct = function(url, options){ - $.extend(vars, options); - vars.url = url; + this.construct = function(options){ + if (typeof options == 'object') { + $.extend(vars, options); + } else vars.url = options; }; this.set_url = function (url){ vars.url = url; @@ -61,5 +62,5 @@ var cPDF = function(url, options){ $(this).remove(); }).modal('show'); }; - this.construct(url, options); + this.construct(options); }; diff --git a/assets/js/pole-display.js b/assets/js/pole-display.js index 872648f..aa7f372 100644 --- a/assets/js/pole-display.js +++ b/assets/js/pole-display.js @@ -9,7 +9,7 @@ *******************************************************************/ -var cPOLEDISPLAY = function(port, options){ +var PoleDisplay = function(port, options){ var _cd_port = ''; var _cd_pole = ''; var _options = { diff --git a/assets/js/print.js b/assets/js/print.js index f4f40af..ad69609 100644 --- a/assets/js/print.js +++ b/assets/js/print.js @@ -10,15 +10,16 @@ *******************************************************************/ -var cPRINTER = function(url, options){ +var Printer = function(options){ var vars = { 'url': '', 'zoom': 90, 'param': [] }; - this.construct = function(url, options){ - $.extend(vars, options); - vars.url = url; + this.construct = function(options){ + if (typeof options == 'object') { + $.extend(vars, options); + } else vars.url = options; }; this.set_url = function (url){ vars.url = url; @@ -87,10 +88,10 @@ var cPRINTER = function(url, options){ error: (typeof vars.onFailure === "function") ? vars.onFailure : null, }); }; - this.construct(url, options); + this.construct(options); }; -var cPRINTERPOS = function(url, options) { +var PrinterPos = function(options) { var b_default = false; var _options = { 'url': '', @@ -103,9 +104,10 @@ var cPRINTERPOS = function(url, options) { 'chr_sbold': "\x1B\x21\x31", 'chr_uline': "\x1B\x21\x80" }; - this.construct = function(url, options) { - $.extend(_options, options); - _options.url = url; + this.construct = function(options) { + if (typeof options == 'object') { + $.extend(_options, options); + } else _options.url = options; if (FoniaJS._def_printer) _options.printer = FoniaJS._def_printer; }; this.detectPrinter = function() { @@ -230,5 +232,5 @@ var cPRINTERPOS = function(url, options) { } return notaout; }; - this.construct(url, options); + this.construct(options); }; diff --git a/assets/js/share.js b/assets/js/share.js deleted file mode 100644 index 3d0bf57..0000000 --- a/assets/js/share.js +++ /dev/null @@ -1,73 +0,0 @@ -/******************************************************************* - - Module : /assets/js/share.js - Desc. : JS Class Share File Cross Browser - Created By : Siau Pheng (siaupheng@3fonia.com). - Created Date : May 27th, 2007. - Last Modified : January 19th, 2026. - - (c) 3FONIA Software; WWW.3FONIA.COM. - -*******************************************************************/ - -var cSHARE = function(url, options) { - var _options = { - 'url': '', - 'filename': '', - 'title': '', - 'text': 'share dari aplikasi' - }; - var _params = []; - this.construct = function(url, options){ - if (typeof url == 'object') { - $.extend(_options, url); - } else { - $.extend(_options, options); - _options.url = url; - } - }; - this.set_url = function (url){ - _options.url = url; - }; - this.add_param = function(par_id, par_val) { - var _getvalue = (par_val) ? par_id + '=' + escape(par_val) : par_id; - _params.push(_getvalue); - }; - this.share = async function() { - if (!_options.url) { - console.warn('cek url !'); - return false; - } - var _pro = (window.location.protocol=='https:') ? 'https://' : 'http://'; - var _src = _pro+FoniaJS.WEB_HOST + _options.url + '?' + $.param(FoniaJS.RequestParam(_params)); - - try { - const response = await fetch(_src) - .then(response => { - const cDispo = response.headers.get('Content-Disposition'); - if (cDispo && cDispo.indexOf('filename=') !== -1) { - _options.filename = cDispo.split('filename=')[1].split(';')[0].replace(/"/g, ''); - } - return response; - }); - const blob = await response.blob(); - const file = new File([blob], _options.filename, { type: blob.type }); - - if (navigator.canShare && navigator.canShare({ files: [file] })) { - await navigator.share({ - files: [file], - title: _options.title ?? _options.filename, - text: _options.text - }); - } else { - const link = document.createElement('a'); - link.href = URL.createObjectURL(blob); - link.download = _options.filename; - link.click(); - } - } catch (error) { - console.error('Sharing gagal:', error); - } - }; - this.construct(url, options); -}; diff --git a/assets/js/simulator.js b/assets/js/simulator.js index b00a7c5..2da8e25 100644 --- a/assets/js/simulator.js +++ b/assets/js/simulator.js @@ -10,14 +10,15 @@ *******************************************************************/ -var cSIMULATOR = function(url, options){ +var Simulator = function(options){ var vars = { 'url': '', 'param': [] }; - this.construct = function(url, options){ - $.extend(vars, options); - vars.url = url; + this.construct = function(options){ + if (typeof options == 'object') { + $.extend(vars, options); + } else vars.url = options; }; this.set_url = function (url){ vars.url = url; @@ -79,5 +80,5 @@ var cSIMULATOR = function(url, options){ dataType: 'json' }); }; - this.construct(url, options); + this.construct(options); }; diff --git a/composer.json b/composer.json index 4961f62..02b9334 100644 --- a/composer.json +++ b/composer.json @@ -21,6 +21,7 @@ "flightphp/core": "^3.18", "flightphp/session": "^0.3", "mpdf/mpdf": ">=8.0", + "avadim/fast-excel-writer": "^6.17", "matthiasmullie/minify": ">=1.3", "endroid/qr-code": ">=4.4" }, diff --git a/src/Data/CSV.php b/src/Data/CSV.php index 7e9d7f2..4647611 100644 --- a/src/Data/CSV.php +++ b/src/Data/CSV.php @@ -2,7 +2,7 @@ /******************************************************************* - Module : /Data/CSV.php + Module : /Data/Csv.php Created By : Siau Pheng (siaupheng@3fonia.com). Created Date : April 2rd, 2011. Last Modified : August 21st, 2026. @@ -19,9 +19,9 @@ define( DELI_CSV, ";" ); define( CRLF_CSV, "\r\n" ); /** - * Class CSV + * Class Csv * - * Membuat file CSV. + * Membuat file Csv. * * @license MIT, https://www.3fonia.com * @copyright Copyright (c) 2008-2026, Siau Pheng @@ -29,7 +29,7 @@ define( CRLF_CSV, "\r\n" ); * @package Webapp\Data */ -final class CSV { +final class Csv { private $__avalue = []; private $__atabel = []; diff --git a/src/Data/PDF.php b/src/Data/PDF.php index 2c64181..abf0a32 100644 --- a/src/Data/PDF.php +++ b/src/Data/PDF.php @@ -2,7 +2,7 @@ /******************************************************************* - Module : /Data/PDF.php + Module : /Data/Pdf.php Created By : Siau Pheng (siaupheng@3fonia.com). Created Date : April 18th, 2015. Last Modified : August 21st, 2026. @@ -19,9 +19,9 @@ use \flight\Engine; use \Mpdf; /** - * Class PDF + * Class Pdf * - * Membuat file PDF. + * Membuat file Pdf. * * @license MIT, https://www.3fonia.com * @copyright Copyright (c) 2008-2026, Siau Pheng @@ -29,11 +29,11 @@ use \Mpdf; * @package Webapp\Data */ -final class PDF { - private $__avalue = []; - private $__atabel = []; - private $__theader = ""; - private $__tcolname = ""; +final class Pdf { + private array $avalue = []; + private array $atabel = []; + private string $__theader = ""; + private string $__tcolname = ""; protected array $webapp; protected array $webuser; @@ -47,21 +47,21 @@ final class PDF { } public function add_field(string $nama, string|int $lebar=0, string $align="L", string $func="", int $kol=1): void { - $this->__atabel[] = [ $nama, (string)$lebar.'%', $func, $align, $kol ]; + $this->atabel[] = [ $nama, (string)$lebar.'%', $func, $align, $kol ]; } public function show_fields(): void { $tmp_out = ""; - for ($i=0; $i__atabel); $i++) { - if ($this->__atabel[$i][4]==0) continue; - $tmp_out .= $this->set_align($this->__atabel[$i][0], $this->__atabel[$i][1], "C", false, true, $this->__atabel[$i][4]); + for ($i=0; $iatabel); $i++) { + if ($this->atabel[$i][4]==0) continue; + $tmp_out .= $this->set_align($this->atabel[$i][0], $this->atabel[$i][1], "C", false, true, $this->atabel[$i][4]); } $tmp_out .= ""; $this->__tcolname = $tmp_out; } public function clear(): void { - $this->__avalue = []; + $this->avalue = []; $this->__theader = ""; $this->__tcolname = ""; } @@ -78,18 +78,18 @@ final class PDF { $tmp_arr = func_get_args(); if (is_array($tmp_arr[0])) $tmp_arr = $tmp_arr[0]; $tmp_out = ""; - for ($i=0; $i__atabel); $i++) { + for ($i=0; $iatabel); $i++) { $tmp_val = $tmp_arr[$i]; - if (is_array($this->__atabel[$i][2]) && trim($tmp_val)<>"") { - $tmp_val = $this->__atabel[$i][2][$tmp_val]; - } else if (function_exists($this->__atabel[$i][2]) && trim($tmp_val)<>"") { - $tmp_val = call_user_func($this->__atabel[$i][2], $tmp_val); + if (is_array($this->atabel[$i][2]) && trim($tmp_val)<>"") { + $tmp_val = $this->atabel[$i][2][$tmp_val]; + } else if (function_exists($this->atabel[$i][2]) && trim($tmp_val)<>"") { + $tmp_val = call_user_func($this->atabel[$i][2], $tmp_val); } - $tmp_val = $this->set_align($tmp_val, $this->__atabel[$i][1], $this->__atabel[$i][3]); + $tmp_val = $this->set_align($tmp_val, $this->atabel[$i][1], $this->atabel[$i][3]); $tmp_out .= $tmp_val; } $tmp_out .= ""; - $this->__avalue[] = $tmp_out; + $this->avalue[] = $tmp_out; } public function add_span(): void { @@ -104,15 +104,15 @@ final class PDF { $tmp_out .= $tmp_val; } $tmp_out .= ""; - $this->__avalue[] = $tmp_out; + $this->avalue[] = $tmp_out; } public function add_empty(): void { - $this->__avalue[] = $this->set_align(" ", 0, "L,NB", true); + $this->avalue[] = $this->set_align(" ", 0, "L,NB", true); } public function add_stamp(int $ctk_ke=1, bool $tampil_nama=false): void { - $this->__avalue[] = $this->set_align($this->get_stamp($ctk_ke, $tampil_nama), 0, "L,NB", true); + $this->avalue[] = $this->set_align($this->get_stamp($ctk_ke, $tampil_nama), 0, "L,NB", true); } public function get_stamp(int $ctk_ke=1, bool $tampil_nama=false): string { @@ -163,8 +163,8 @@ final class PDF { $html .= ''; // content out - for ($i=0; $i__avalue); $i++) { - $html .= $this->__avalue[$i]; + for ($i=0; $iavalue); $i++) { + $html .= $this->avalue[$i]; } $html .= ''; $mpdf = new mPDF('c', 'A4'.($orien==="L"?"-L":""), $fontz, '', 5, 5, 5, 10, 5, 5); @@ -177,7 +177,7 @@ final class PDF { $tstyle = $this->create_style($dir); if (strpos(strtolower($text), "")===false) { if ($line===true) { - return ''.$text.""; + return ''.$text.""; } else { return (($head===true)?"1)?' colspan="'.(string)$col.'"':"").' class="'.$tstyle.'" '.(($head===true)?'width="'.(string)$width.'"':"").">".$text.(($head===true)?"":""); } diff --git a/src/Data/Xlsx.php b/src/Data/Xlsx.php new file mode 100644 index 0000000..b19dbb8 --- /dev/null +++ b/src/Data/Xlsx.php @@ -0,0 +1,155 @@ + + * + * @package Webapp\Data + */ + +final class Xlsx { + + private Options $options; + private Excel $excel; + private Sheet $sheet; + private array $webapp; + private array $webuser; + private array $meta = []; + private array $titles = []; + private array $subtitles = []; + private array $atabel = []; + private int $baris = 1; + + /** + * @param Engine $app + */ + + public function __construct(Engine $app) { + $this->webapp = (array) $app->session()->get('WEB_APP', ['REG_NAME'=>'', 'APP_NAME'=>'', 'APP_VER'=>'']); + $this->webuser = (array) $app->session()->get('WEB_USER', ['UserID'=>0, 'Username'=>'']); + $this->meta = [ + 'company' => $this->webapp['REG_NAME'], + 'subject' => $this->webapp['REG_NAME'], + 'author' => $this->webapp['APP_NAME'].' v'.$this->webapp['APP_VER'], + ]; + $this->options = Options::create() + ->DefaultFont([ Style::FONT_NAME => "Calibri", Style::FONT_SIZE => 11 ]) + ->defaultDateFormat('DD-MM-YYYY') + ->defaultTimeFormat('HH:MM') + ->defaultDateTimeFormat('DD-MM-YYYY HH:MM'); + } + + public function set_meta(array $meta): void { + if (!empty($meta)) $this->meta = array_merge($this->meta, $meta); + } + + public function add_title(string|array $judul): void { + if (empty($judul)) return; + if (is_array($judul)) { + $this->titles = $judul; + } else array_push($this->titles, $judul); + } + + public function add_sub_title(string|array $judul): void { + if (empty($judul)) return; + if (is_array($judul)) { + $this->subtitles = $judul; + } else array_push($this->subtitles, $judul); + } + + public function add_field(string $nama="", int $lebar=0, string $style="@text", ?callable $func=null): void { + $this->atabel[] = ['n' => $nama, 'l' => $lebar, 's' => $style, 'f' => $func]; + } + + public function add_sheet(string $nama_sheet="BARU", bool $show_header=false): void { + if (empty($this->excel)) { + $this->excel = Excel::create([$nama_sheet], $this->options) + ->setCompany($this->meta['company'] ?? "") + ->setAuthor($this->meta['author'] ?? "") + ->setTitle($this->meta['title'] ?? "") + ->setDescription($this->meta['desc'] ?? "") + ->setSubject($this->meta['subject'] ?? ""); + $this->sheet = $this->excel->sheet(); //getSheet(); + } else { + $this->sheet = $this->excel->makeSheet($nama_sheet); + } + if ($show_header === true) { + $this->show_titles(); + $this->show_headers(); + } + } + + public function add_row(array $row): void { + if (is_array($row) && !empty($row)) $this->sheet->writeRow($row); + } + + public function add_row_bold(array $row): void { + if (is_array($row) && !empty($row)) $this->sheet->writeRow($row)->applyFontStyleBold(); + } + + public function show_titles(): void { + $this->baris = $this->sheet->getCurrentRow(); + $jum_kolom = count($this->atabel); + foreach ($this->titles as $title) { + $this->sheet->writeTo('A'.(string) $this->baris.':'.$this->excel->colLetter($jum_kolom).(string) $this->baris, $title) + ->applyFontStyleBold() + ->applyTextCenter(); + $this->baris++; + } + if (count($this->subtitles) > 0) { + $this->baris++; + foreach ($this->subtitles as $title) { + $this->sheet->writeTo('A'.(string) $this->baris++, $title); + } + } else + $this->sheet->writeTo('A'.(string) $this->baris, ''); + } + + public function show_headers(): void { + $this->sheet->writeHeader(array_column($this->atabel, 'n')) + ->applyFontStyleBold() + ->applyTextCenter() + ->applyBorder(Style::BORDER_STYLE_THIN); + $this->sheet->setColFormats(array_column($this->atabel, 's')) + ->setColWidths(array_column($this->atabel, 'l')); + } + + public function add_stamp(int $ctk_ke=1, bool $tampil_nama=false): void { + $this->sheet->nextRow(); + $this->sheet->writeCell($this->get_stamp($ctk_ke, $tampil_nama), ['font-size' => 8, 'font-style' => 'italic']); + } + + public function get_stamp(int $ctk_ke=1, bool $tampil_nama=false): string { + return $this->webapp['APP_NAME']."v".$this->webapp['APP_VER'].date("\@ymd.His")."-".isi_nol($this->webuser['UserID'], 3).(($tampil_nama)?"/".strtoupper($this->webuser['Username']):"").(($ctk_ke>0)?"#".isi_nol($ctk_ke,2):""); + } + + public function download(string $nama_file="File_Excel.xlsx"): void { + $this->excel->download($nama_file); + } + +} diff --git a/src/Printer/PrintHTML.php b/src/Printer/PrintHTML.php index c993481..57e535e 100644 --- a/src/Printer/PrintHTML.php +++ b/src/Printer/PrintHTML.php @@ -5,7 +5,7 @@ Module : /Printer/PrintHTML.php Created By : Siau Pheng (siaupheng@3fonia.com). Created Date : June 15th, 2008. - Last Modified : August 26th, 2026. + Last Modified : October 2nd, 2026. (c) 3FONIA Software; WWW.3FONIA.COM. @@ -29,10 +29,12 @@ use \flight\Engine; */ final class PrintHTML { - private $__avalue = []; - private $__atabel = []; - private $__css = "table"; - private $__tstamp = ""; + private array $avalue = []; + private array $atabel = []; + private string $css = "table"; + private string $stamp = ""; + private array $titles = []; + private array $subtitles = []; protected array $webapp; protected array $webuser; @@ -40,96 +42,114 @@ final class PrintHTML { * @param Engine $app */ public function __construct(Engine $app) { - $this->webapp = $app->session()->get('WEB_APP', ['APP_NAME'=>'', 'APP_VER'=>'']); - $this->webuser = $app->session()->get('WEB_USER', ['UserID'=>0, 'Username'=>'']); + $this->webapp = (array) $app->session()->get('WEB_APP', ['APP_NAME'=>'', 'APP_VER'=>'']); + $this->webuser = (array) $app->session()->get('WEB_USER', ['UserID'=>0, 'Username'=>'']); } public function set_css(string $style): void { - if (!empty($style)) $this->__css = $style; + if (!empty($style)) $this->css = $style; } - public function add_field(string $nama, int $lebar=0, string $align="L", string $func="", int $kol=1): void { - $this->__atabel[] = [ $nama, $lebar, $func, $align, $kol ]; + public function add_title(string|array $judul): void { + if (empty($judul)) return; + if (is_array($judul)) { + $this->titles = $judul; + } else array_push($this->titles, $judul); } - public function clear(): void { - $this->__avalue = []; + public function add_sub_title(string|array $judul): void { + if (empty($judul)) return; + if (is_array($judul)) { + $this->subtitles = $judul; + } else array_push($this->subtitles, $judul); } - public function add_value(): void { - $tmp_arr = func_get_args(); - if (is_array($tmp_arr[0])) $tmp_arr = $tmp_arr[0]; - $tmp_out = ""; - for ($i=0; $i__atabel); $i++) { - $tmp_val = $tmp_arr[$i]; - if (is_array($this->__atabel[$i][2]) && trim("".$tmp_val)<>"") { - $tmp_val = $this->__atabel[$i][2][$tmp_val]; - } else if (function_exists($this->__atabel[$i][2]) && trim("".$tmp_val)<>"") { - $tmp_val = call_user_func($this->__atabel[$i][2], $tmp_val); - } - $tmp_val = $this->set_align((string) $tmp_val, $this->__atabel[$i][1], $this->__atabel[$i][3]); - $tmp_out .= $tmp_val; - } - $tmp_out .= ""; - $this->__avalue[] = $tmp_out; + public function add_field(string $nama, int $lebar=0, string $align="L", callable|array|null $func=null, int $kol=1): void { + $this->atabel[] = [ 'n' => $nama, 'l' => $lebar, 'f' => $func, 'a' => $align, 'k' => $kol ]; } - public function add_span(): void { - $tmp_arr = func_get_args(); - $tmp_out = ""; - for ($i=0; $i"") { - $tmp_val[0] = call_user_func($tmp_val[3], $tmp_val[0]); + public function add_row(array $row): void { + if (!is_array($row) || empty($row)) return; + $row_out = ""; + foreach ($this->atabel as $i => $tabel) { + $col_val = $row[$i] ?? ''; + if (!empty($col_val)) { + if (is_array($tabel['f'])) { + $col_val = $tabel['f'][$col_val]; + } else if (is_callable($tabel['f'])) { + $col_val = call_user_func($tabel['f'], $col_val); } } - $tmp_val = $this->set_align($tmp_val[0], 0, $tmp_val[2], false, false, $tmp_val[1], $tmp_val[4]); - $tmp_out .= $tmp_val; + $row_out .= $this->set_align((string) $col_val, $tabel['l'], $tabel['a']); } - $tmp_out .= ""; - $this->__avalue[] = $tmp_out; + $row_out .= ""; + echo $row_out; } - public function add_stamp(int $ctk_ke=1, bool $cetak_nama=false): void { - $this->__tstamp = $this->get_stamp($ctk_ke, $cetak_nama); - } - - public function get_stamp(int $ctk_ke=1, bool $cetak_nama=false): string { - return $this->webapp['APP_NAME']."v".$this->webapp['APP_VER'].date("\@ymd.His")."-".isi_nol($this->webuser['UserID'], 3).(($cetak_nama)?"/".strtoupper($this->webuser['Username']):"").(($ctk_ke>0)?"#".isi_nol($ctk_ke,2):""); - } - - public function show(int $jumlah_ctk=1) { - $out = "__css."\">"; - - // header out - $tmp_out = ""; - for ($i=0; $i__atabel); $i++) { - if ($this->__atabel[$i][4]==0) continue; - $tmp_out .= $this->set_align($this->__atabel[$i][0], $this->__atabel[$i][1], "C", false, true, $this->__atabel[$i][4]); + public function add_span(array $span): void { + if (!is_array($span) || empty($span)) return; + $row_out = ""; + foreach ($span as $col) { + // CONTENT, COLSPAN=1, L, FUNC, EXTRA + if (!isset($col[1])) $col[1] = 1; + if (!isset($col[2])) $col[2] = "L"; + if (!isset($col[4])) $col[4] = ""; + if (isset($col[3]) && is_callable($col[3])) { + if (function_exists($col[3]) && !empty($col[0])) { + $col[0] = call_user_func($col[3], $col[0]); + } + } + $row_out .= $this->set_align($col[0], 0, $col[2], false, false, $col[1], $col[4]); } - $tmp_out .= ""; - $out .= "".$tmp_out.""; - - // content out - for ($i=0; $i__avalue); $i++) { - $tmp_str = $this->__avalue[$i]; - if (strpos($tmp_str, "_LINE")>0) $tmp_str = "
"; - $out .= $tmp_str; - } - $out .= "
"; - $out .= $this->__tstamp; - - for ($i=1; $i<=$jumlah_ctk; $i++) echo $out; + $row_out .= ""; + echo $row_out; } - public function set_align(string $text, int $width=0, string $dir="L", bool $line=false, bool $head=false, int $col=1, string $extra=""): string { + public function show_titles(): void { + $_afs = [0=>"4", 1=>"5", 2=>"6"]; + foreach ($this->titles as $i => $title) { + vprintf('
%s
', [($_afs[$i] ?? '6'), $title]); + + } + if (count($this->subtitles) > 0) { + foreach ($this->subtitles as $title) { + vprintf('
%s
', [$title]); + } + } else + echo '
'; + } + + public function show_headers(): void { + vprintf('', [$this->css]); + // 0-n, 1=l, 2-f, 3-a, 4-k + $head_out = ""; + foreach ($this->atabel as $tabel) { + if ($tabel['k'] === 0) continue; + $head_out .= $this->set_align($tabel['n'], $tabel['l'], "C", false, true, $tabel['k']); + } + $head_out .= ""; + echo "".$head_out.""; + // start content row + } + + public function add_stamp(int $ctk_ke=1, bool $tampil_nama=false): void { + $this->stamp = $this->get_stamp($ctk_ke, $tampil_nama); + } + + public function get_stamp(int $ctk_ke=1, bool $tampil_nama=false): string { + return $this->webapp['APP_NAME']."v".$this->webapp['APP_VER'].date("\@ymd.His")."-".isi_nol($this->webuser['UserID'], 3).(($tampil_nama)?"/".strtoupper($this->webuser['Username']):"").(($ctk_ke>0)?"#".isi_nol($ctk_ke,2):""); + } + + public function show() { + // end content row + echo "
"; + if (!empty($this->stamp)) vprintf('%s', [$this->stamp]); + } + + public function set_align(mixed $text, int $width=0, string $dir="L", bool $line=false, bool $head=false, int $col=1, string $extra=""): string { $tstyle = $this->create_style($dir); if ($line===true) { - return "__atabel)."\" class=\"".$tstyle." ".$extra."\">".$text.""; + return "atabel)."\" class=\"".$tstyle." ".$extra."\">".$text.""; } else { return (($head===true)?"1)?" colspan=\"".(string)$col."\"":"")." class=\"".$tstyle." ".$extra."\" ".(($head===true)?"width=\"".(string)$width."\"":"").">".$text.(($head===true)?"":""); } @@ -146,9 +166,6 @@ final class PrintHTML { return implode(' ', $ahasil); } - //todo: deprecated - public function show_fields() {} - public function add_pagebreak() {} } ?> diff --git a/src/Printer/PrintPOS.php b/src/Printer/PrintPOS.php index ec118ce..2a377f8 100644 --- a/src/Printer/PrintPOS.php +++ b/src/Printer/PrintPOS.php @@ -5,7 +5,7 @@ Module : /Printer/PrintPOS.php Created By : Siau Pheng (siaupheng@3fonia.com). Created Date : June 15th, 2008. - Last Modified : September 21st, 2026. + Last Modified : October 3rd, 2026. (c) 3FONIA Software; WWW.3FONIA.COM. @@ -29,12 +29,11 @@ use \flight\Engine; */ class PrintPOS { - private $_header = []; - private $_avalue = []; - private $_astyle = []; - private $_ncont = 0; - private $_maxchr = 40; - private $_config = [ + private int $sheet = 0; + private int $maxchr = 40; + private array $header = []; + private array $acontent = []; + private array $config = [ 'fontsize' => 1, 'opendraw' => false, 'cutpaper' => false, @@ -54,53 +53,52 @@ class PrintPOS { } public function set_opendrawer(): void { - $this->_config['opendraw'] = true; + $this->config['opendraw'] = true; } public function set_cutpaper(): void { - $this->_config['cutpaper'] = true; + $this->config['cutpaper'] = true; } public function set_maxchr(int $max = 0): void { - if ($max > 0) $this->_maxchr = $max; + if ($max > 0) $this->maxchr = $max; } public function set_fontsize(int $size = 1): void { - if ($size > 0) $this->_config['fontsize'] = $size; + if ($size > 0) $this->config['fontsize'] = $size; } public function set_header_logo(string $logo_file = ""): void { if (!empty($logo_file) && file_exists(PROJECT_ROOT."public/assets/images/".$logo_file)) { - //$this->_config['logo'] = PROJECT_BASE."assets/images/".$logo_file; - $this->_config['logo'] = base64_encode(file_get_contents(PROJECT_ROOT."public/assets/images/".$logo_file)); + //$this->config['logo'] = PROJECT_BASE."assets/images/".$logo_file; + $this->config['logo'] = base64_encode(file_get_contents(PROJECT_ROOT."public/assets/images/".$logo_file)); } } public function add_header(): void { $extra = func_get_args(); - if (count($extra) > 0) { - foreach ($extra as $_val) { - $this->_header[] = $_val; - } - } + if (count($extra) > 0) $this->header = $extra; } public function add_sheet(): void { - $this->_ncont++; + $this->sheet++; } public function add(): void { $val_arr = func_get_args(); $ttext = ""; $tstyle = "L"; if (is_array($val_arr[0])) { - foreach($val_arr as $aval) { - $ttext .= $this->set_align((isset($aval[0])?$aval[0]:""), (isset($aval[1])?$aval[1]:0), (isset($aval[2])?$aval[2]:$tstyle)); + foreach ($val_arr as $aval) { + $ttext .= $this->set_align(($aval[0] ?? ""), ($aval[1] ?? 0), ($aval[2] ?? $tstyle)); } } else { - $ttext = (isset($val_arr[0])) ? $val_arr[0] : ""; - $tstyle = (isset($val_arr[1])) ? $val_arr[1] : $tstyle; + $ttext = $val_arr[0] ?? ""; + $tstyle = $val_arr[1] ?? $tstyle; } - $this->_avalue[$this->_ncont][] = $ttext; - $this->_astyle[$this->_ncont][] = $tstyle; + if (str_contains($ttext, "_LINE")) { + $tmp_arr = explode(" ", $ttext); + $ttext = str_pad($tmp_arr[1], $this->maxchr, $tmp_arr[1]); + } + $this->acontent[$this->sheet][] = ($tstyle === "X") ? $ttext : $this->set_align($ttext, $this->maxchr, $tstyle); } public function addl(string $text = ""): void { @@ -128,25 +126,11 @@ class PrintPOS { } public function show(int $jumlah_ctk=1): void { - $acontent = []; - $nmax = $this->_maxchr; - - for ($s=0; $s_avalue); $s++) { - for ($i=0; $i_avalue[$s]); $i++) { - $tmp_str = $this->_avalue[$s][$i]; - if (strpos($tmp_str, "_LINE")>0) { - $tmp_arr = explode(" ", $tmp_str); - $tmp_str = str_pad($tmp_arr[1], $nmax, $tmp_arr[1]); - } - $acontent[$s][] = ($this->_astyle[$s][$i]=="X") ? $tmp_str : $this->set_align($tmp_str, $nmax, $this->_astyle[$s][$i]); - } - } - - $this->_config['times'] = $jumlah_ctk; + $this->config['times'] = $jumlah_ctk; $aout = ['type' => "escp"]; - $aout['config'] = $this->_config; - $aout['header'] = $this->_header; - $aout['content'] = $acontent; + $aout['config'] = $this->config; + $aout['header'] = $this->header; + $aout['content'] = $this->acontent; $this->app->json($aout); } @@ -157,8 +141,6 @@ class PrintPOS { return str_pad($text, $len, " ", $apad[$dir]); } - //todo: deprecated - public function set_printnv_logo() {}//delete } ?>