Files
webapp/assets/js/print.js
T
2026-09-30 14:33:11 +07:00

235 lines
9.3 KiB
JavaScript

/*******************************************************************
Module : /assets/js/print.js
Desc. : JS Class Printer & Printer POS
Created By : Siau Pheng ([email protected]).
Created Date : May 27th, 2007.
Last Modified : September 21st, 2026.
(c) 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
var cPRINTER = function(url, options){
var vars = {
'url': '',
'zoom': 90,
'param': []
};
this.construct = function(url, options){
$.extend(vars, options);
vars.url = url;
};
this.set_url = function (url){
vars.url = url;
};
this.set_zoom = function (zoom){
if (zoom) vars.zoom = zoom;
},
this.add_param = function (par_id, par_val){
var _getvalue = (par_val) ? par_id + "=" + escape(par_val) : par_id;
vars.param.push(_getvalue);
},
this.doPrint = function(){
if (!vars.url) {
console.warn(vars.param + ", cek url php!");
return false;
}
$.ajax({
type: 'POST',
url: vars.url,
data: FoniaJS.RequestParam(vars.param),
success: (txt) => {
var $printData = $('#dataPrint');
if (!$printData.length) {
$printData = $('<div/>', {id:'dataPrint','class':'d-none d-print-block print-body'}).appendTo('body');
}
$printData.html(txt);
window.print();
},
error: (typeof vars.onFailure === "function") ? vars.onFailure : null,
});
return this;
};
this.doPreview = function(){
if (!vars.url) console.warn(vars.param + ", cek url php!");
$.ajax({
type: 'POST',
url: vars.url,
data: FoniaJS.RequestParam(vars.param),
success: (txt) => {
if ('' == txt) {
FoniaJS.showInfo('Tidak ada data untuk pembuatan laporan !');
return false;
}
var _wtxt =
'<div class="modal fade" id="winAPPPrint" tabindex="-1" role="dialog" data-bs-keyboard="false" data-bs-show="false" data-bs-backdrop="static" aria-labelledby="winAPPPrintLabel" aria-hidden="true">'+
'<div class="modal-dialog modal-dialog-centered modal-dialog-scrollable modal-fs" role="document">'+
'<div class="modal-content">'+
'<div class="modal-header"><h5 class="modal-title" id="winAPPPrintLabel">Preview Laporan</h5><div class="ms-auto"><button class="btn me-2" id="tombCetak" type="button" aria-label="Cetak"><i class="bi-printer me-2"></i><span aria-hidden="true">Cetak</span></button><button class="btn" type="button" data-bs-dismiss="modal" aria-label="Tutup"><i class="bi-x-lg me-2"></i><span aria-hidden="true">Tutup</span></button></div></div>'+
'<div class="modal-body print-body" id="divPrintP">'+txt+'</div>'+
'</div></div></div>';
if ($('#winAPPPrint')) $('#winAPPPrint').modal('dispose').remove();
$(_wtxt).on('shown.bs.modal', (e) => {
$('#winAPPPrint').find('#tombCetak').click(() => {
var $printData = $('#dataPrint');
if (!$printData.length) {
$printData = $('<div/>', {id:'dataPrint','class':'d-none d-print-block print-body'}).appendTo('body');
}
$printData.html($('#divPrintP').html());
FoniaJS.closeWindow($('#winAPPPrint'));
window.print();
});
}).on('hidden.bs.modal', (e) => {
$(this).remove();
}).modal('show');
},
error: (typeof vars.onFailure === "function") ? vars.onFailure : null,
});
};
this.construct(url, options);
};
var cPRINTERPOS = function(url, options) {
var b_default = false;
var _options = {
'url': '',
'param': [],
'printer': null,
'cut_paper': "\x1D\x56\x41",
'open_draw': "\x1B\x70\x30\x19\x19",
'chr_norm': "\x1B\x21\x01",
'chr_bold': "\x1B\x21\x10",
'chr_sbold': "\x1B\x21\x31",
'chr_uline': "\x1B\x21\x80"
};
this.construct = function(url, options) {
$.extend(_options, options);
_options.url = url;
if (FoniaJS._def_printer) _options.printer = FoniaJS._def_printer;
};
this.detectPrinter = function() {
if (!qz.websocket.isActive()) {
FoniaJS.showInfo('Status Printer belum Active !');
return false;
}
return true;
};
this.getPrinters = function() {
return [];
};
this.setPrinter = function(nprint) {
(nprint != null) && (_options.printer = nprint);
};
this.useDefaultPrinter = function() {
b_default = true;
};
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;
_options.param.push(_getvalue);
};
this.exec = function() {
if (!this.detectPrinter()) return;
if (this.b_default) {
var parent = this;
qz.printers.getDefault().then(function(data) {
var nama_p = data;
if (data.name != undefined) {
nama_p = data.name;
}
parent._options.param.push('Printer='+nama_p);
return parent.do_print(nama_p, parent._options.url, parent._options.param);
}, function(data) {
FoniaJS.showInfo(data);
});
} else {
var _nprinter = _options.printer;
if (typeof _nprinter === 'object' && _nprinter.name == undefined) {
if (_nprinter.file != undefined) _nprinter = _nprinter.file;
if (_nprinter.host != undefined) _nprinter = _nprinter.host + ":" + _nprinter.port;
} else {
if (_nprinter.name != undefined) _nprinter = _nprinter.name;
if (_nprinter== undefined) _nprinter = 'None';
}
_options.param.push('Printer='+_nprinter);
this.do_print(_options.printer, _options.url, _options.param);
}
};
this.do_print = function(nama_p, url, params) {
var qzcfg = qz.configs.create(nama_p);
new Request({
url: url,
sendParam: params,
onSuccess: (ajson) => {
if (typeof ajson === "object") {
var hasil_cetak = (ajson.type == "escp") ? this.gen_escp(ajson) : this.gen_epl(ajson);
qz.print(qzcfg, hasil_cetak);
} else {
FoniaJS.showInfo('Error dalam proses Cetak.');
}
}
}).send();
};
this.gen_escp = function(adata) {
var ohead = [];
var osheet = [], ocetak = [];
ohead.push("\x1B\x40");
ohead.push("\x1B\x61\x01");
if (adata.config.logo != null) {
//ohead.push({type:'raw',format:'image',data:adata.config.logo,options:{language:'ESCPOS',dotDensity:'double'}});
//ohead.push("\x1B\x32");
ohead.push({type:'raw',format:'image',flavor:'base64',data:adata.config.logo,options:{language:'ESCPOS',dotDensity:'double'}});
ohead.push("\x1B\x32");
}
if (parseInt(adata.config.fontsize) == 2) {
_options.chr_norm = "\x1B\x21\x02";
}
if (adata.header.length > 0) {
for (i = 0; i < adata.header.length; i++) {
if (i==0 && adata.config.logo==null) ohead.push(_options.chr_bold);
ohead.push(adata.header[i] + "\x0A");
if (i==0 && adata.config.logo==null) ohead.push(_options.chr_norm);
}
}
for (s = 0; s < adata.content.length; s++) {
if (adata.content[s].length == 0) continue;
osheet = ohead.slice(0);
for (i = 0; i < adata.content[s].length; i++) {
var tmp_cont = adata.content[s][i];
tmp_cont = tmp_cont.replace('_SBOLD_', _options.chr_sbold)
.replace('_BOLD_', _options.chr_bold)
.replace('_NORM_', _options.chr_norm)
.replace('_ULINE_', _options.chr_uline);
osheet.push(tmp_cont + "\x0A");
}
if (adata.config.cutpaper) {
osheet.push(_options.cut_paper + "\x0A");
}
ocetak = ocetak.concat(osheet);
}
var notaout = [];
if (adata.config.opendraw) {
notaout.push(_options.open_draw);
}
for (i = 0; i < adata.config.times; i++) {
notaout = notaout.concat(ocetak);
}
return notaout;
};
this.gen_epl = function(adata) {
var cetak = [];
for (i = 0; i < adata.content.length; i++) {
cetak.push(adata.content[i] + "\r\n");
}
var notaout = [];
for (i = 0; i < adata.config.times; i++) {
notaout = notaout.concat(cetak);
}
return notaout;
};
this.construct(url, options);
};