first commit

This commit is contained in:
2026-01-22 13:38:42 +07:00
commit ab311c5c95
91 changed files with 8064 additions and 0 deletions
+79
View File
@@ -0,0 +1,79 @@
<?php
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/cfg/assets.php
Desc. : Konfigurasi Assets Aplikasi [css / js]
Created By : Siau Pheng ([email protected]).
Created Date : November 23rd, 2019.
Last Modified : September 24th, 2025.
(c) 2019 - 2025, 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
$A_CSS = ["bootstrap/bootstrap.icon.css", "bootstrap/bootstrap.css"];
$A_JS = ["jquery/jquery.js", "jquery/jquery.base64.js", "bootstrap/bootstrap.bundle.js", "fonia3.js"];
if (!user_logged()) {
$A_JS[] = "jquery/jquery.backstretch.js";
} else {
//$A_CSS[] = "coreui/coreui.chartjs.css";
$A_CSS[] = "datatables/dataTables.bootstrap5.css";
$A_CSS[] = "datatables/responsive.bootstrap5.css";
$A_CSS[] = "datatables/scroller.bootstrap5.css";
$A_CSS[] = "datatables/stateRestore.bootstrap5.css";
$A_CSS[] = "select2/select2.css";
$A_CSS[] = "select2/select2-bootstrap-5-theme.css";
$A_CSS[] = "bootstrap/bootstrap.datepicker.css";
//$A_CSS[] = "simplebar.css";
//$A_CSS[] = "lightbox.css";
//$A_CSS[] = "codemirror.css";
//$A_CSS[] = "summernote-bs4.css";
$A_CSS[] = "default.css";
$A_CSS[] = "print.css";
$A_JS = [
"jquery/jquery.js",
"jquery/jquery.base64.js",
"jquery/jquery.autosize.js",
"jquery/jquery.maskedinput.js",
"jquery/jquery.validate.js",
"bootstrap/bootstrap.bundle.js",
"bootstrap/bootstrap.datepicker.js",
"bootstrap/bootstrap.autocomplete.js",
"datatables/jquery.dataTables.js",
"datatables/dataTables.bootstrap5.js",
"datatables/dataTables.responsive.js",
"datatables/responsive.bootstrap5.js",
"datatables/dataTables.scroller.js",
"datatables/dataTables.stateRestore.js",
"datatables/stateRestore.bootstrap5.js",
//"codemirror/codemirror.js",
//"codemirror/xml.js",
"moment.js",
"select2/select2.js",
"chart/chart.js",
//"chart/chartjs-plugin-datalabels.js",
//"simplebar.js",
//"lightbox.js",
//"summernote-bs4.js",
"html5-qrcode.js",
"fonia3.js",
"print.js",
"pdf.js",
"export.js",
//"simulator.js",
"pole-display.js"
];
// add qz support
if (($_SESSION['__WEB_APP']['USE_QZTRAY'] ?? false) == true) {
$A_JS[] = "qz/qz-tray.js";
$A_JS[] = "qz/qz-start.js";
}
}
?>
+82
View File
@@ -0,0 +1,82 @@
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/js/gel/keluar.js
Desc. : JS - Transaksi Pengeluaran Kas
Created By : Siau Pheng ([email protected]).
Created Date : April 23rd, 2013.
Last Modified : September 29th, 2025.
(c) 2013 - 2025, 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
var KasKeluarJS = {
PHP: '',
KODE: '',
loading: function(q){
$('#butTambah').click(function(){this.tx_tambah();}.bind(this));
//$('#butCari').click(function(){this.tx_brow();}.bind(this));
this.data_query('tabel-detail', 'view', ((typeof(q)!=='undefined') ? q : ''));
},
tx_detail: function(mode, No_Kas){
new Request.JSON({
url: this.PHP,
sendParam: ['data=detail-tx','mode_detail='+mode,'No_Kas='+No_Kas],
onSuccess: function(a){
this.winDetail = FoniaJS.showWindow('Detail', 'Detail Pengeluaran Kas', a.html, 600, [{},{i:'butTutup'},{i:'butWSimpan',v:'Simpan',c:'success'}], function(){
$('#winDetail')
.find('#butWSimpan').click(function(){this.tx_simpan();}.bind(this)).end()
.find('#Jumlah').keyup(function(e){
if (parseFloat(e.target.value) == 0) return false;
if (-1!==$.inArray(e.which, [13,9])) this.tx_simpan();
}.bind(this));
if (mode == 'insert') {
$('#TXID').focus();
} else {
FoniaJS.setFocus('#Ket');
}
}.bind(this), false);
}.bind(this)
}).send();
},
tx_tambah: function(){
this.tx_detail('insert', "");
},
tx_ubah: function(acell){
this.tx_detail('update', acell[0]);
},
tx_hapus: function(acell){
FoniaJS.showConfirm('Konfirmasi', 'Hapus item <strong>"'+acell[0]+'"</strong> ?', function(){
new Request.JSONF({
url: this.PHP,
sendParam: ['data=tabel-detail','mode','mode_detail=delete','No_Kas='+acell[0]]
}).send();
}.bind(this), 'danger');
},
tx_simpan: function(){
new Request.JSONF({
url: this.PHP,
sendParam: ['data=tabel-detail','mode','mode_detail','No_Kas','Tgl_Kas','CabID','TXID','Ket','Jumlah'],
onSuccess: function(){
FoniaJS.closeWindow(this.winDetail);
}.bind(this)
}).send();
},
data_query: function(tipe, mode, kd_tx){
if (tipe=="tabel-detail"){
new Request.JSONF({
url: this.PHP,
sendParam: ['data=tabel-detail','mode='+mode,'No_Kas'+((typeof(kd_tx)!=='undefined')?'='+kd_tx:'')]
}).send();
}
}
};
+82
View File
@@ -0,0 +1,82 @@
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/js/gel/terima.js
Desc. : JS - Transaksi Penerimaan Kas
Created By : Siau Pheng ([email protected]).
Created Date : April 23rd, 2013.
Last Modified : September 29th, 2025.
(c) 2013 - 2025, 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
var KasTerimaJS = {
PHP: '',
KODE: '',
loading: function(q){
$('#butTambah').click(function(){this.tx_tambah();}.bind(this));
//$('#butCari').click(function(){this.tx_brow();}.bind(this));
this.data_query('tabel-detail', 'view', ((typeof(q)!=='undefined') ? q : ''));
},
tx_detail: function(mode, No_Kas){
new Request.JSON({
url: this.PHP,
sendParam: ['data=detail-tx','mode_detail='+mode,'No_Kas='+No_Kas],
onSuccess: function(a){
this.winDetail = FoniaJS.showWindow('Detail', 'Detail Penerimaan Kas', a.html, 600, [{},{i:'butTutup'},{i:'butWSimpan',v:'Simpan',c:'success'}], function(){
$('#winDetail')
.find('#butWSimpan').click(function(){this.tx_simpan();}.bind(this)).end()
.find('#Jumlah').keyup(function(e){
if (parseFloat(e.target.value) == 0) return false;
if (-1!==$.inArray(e.which, [13,9])) this.tx_simpan();
}.bind(this));
if (mode == 'insert') {
$('#TXID').focus();
} else {
FoniaJS.setFocus('#Ket');
}
}.bind(this), false);
}.bind(this)
}).send();
},
tx_tambah: function(){
this.tx_detail('insert', "");
},
tx_ubah: function(acell){
this.tx_detail('update', acell[0]);
},
tx_hapus: function(acell){
FoniaJS.showConfirm('Konfirmasi', 'Hapus item <strong>"'+acell[0]+'"</strong> ?', function(){
new Request.JSONF({
url: this.PHP,
sendParam: ['data=tabel-detail','mode','mode_detail=delete','No_Kas='+acell[0]]
}).send();
}.bind(this), 'danger');
},
tx_simpan: function(){
new Request.JSONF({
url: this.PHP,
sendParam: ['data=tabel-detail','mode','mode_detail','No_Kas','Tgl_Kas','CabID','TXID','Ket','Jumlah'],
onSuccess: function(){
FoniaJS.closeWindow(this.winDetail);
}.bind(this)
}).send();
},
data_query: function(tipe, mode, kd_tx){
if (tipe=="tabel-detail"){
new Request.JSONF({
url: this.PHP,
sendParam: ['data=tabel-detail','mode='+mode,'No_Kas'+((typeof(kd_tx)!=='undefined')?'='+kd_tx:'')]
}).send();
}
}
};
+112
View File
@@ -0,0 +1,112 @@
/*******************************************************************
Module : /apps/js/index.js
Desc. : JS - Halaman Utama Desktop
Created By : Siau Pheng ([email protected]).
Created Date : May 24th, 2010.
Last Modified : December 14th, 2025.
(c) 2010 - 2025, 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
$(document).ready(function(){
jQuery("#preloader").remove();
loadSidebar();
IndexJS.loading();
setInterval(function(){
if ($('#ChartB').length) return false;
IndexJS.load_chart();
}, 600000);
if ('undefined' !== typeof qz) startConnection();
});
var IndexJS = {
loading: function(){
new Request.JSON({
url: FoniaJS.WEB_PATH+'apps/php/index.php',
sendParam: ['data=default'],
onSuccess: function(ares){
$('#pageContent').html(ares.content);
$('#pageToolbarTop').html('');
$('#pageToolbarBot').html('');
this.load_chart();
}.bind(this)
}).send();
},
load_chart: function(){
this.data_query('chart-sale');
this.data_query('chart-omzet');
this.data_query('tabel-stok');
},
data_query: function(tipe){
if (tipe=="chart-sale"){
new Request.JSON({
url: FoniaJS.WEB_PATH+'apps/php/index.php',
sendParam: ['data=chart-sale'],
onSuccess: function(ares){
if (ares.tipe=='chart') {
var ctx = Chart.getChart('ChartA');
if (typeof ctx !== 'undefined') ctx.destroy();
var myChart = new Chart($('#ChartA'), {
type: ares.chart.type,
data: ares.chart.data,
options: ares.chart.options
});
}
}
}).send();
} else if (tipe=="chart-omzet"){
new Request.JSON({
url: FoniaJS.WEB_PATH+'apps/php/index.php',
sendParam: ['data=chart-omzet'],
onSuccess: function(ares){
if (ares.tipe=='chart') {
var ctx = Chart.getChart('ChartB');
if (typeof ctx !== 'undefined') ctx.destroy();
var myChart = new Chart($('#ChartB'), {
type: ares.chart.type,
data: ares.chart.data,
options: ares.chart.options
});
}
}
}).send();
} else if (tipe=="tabel-stok"){
new Request.JSON({
url: FoniaJS.WEB_PATH+'apps/php/index.php',
sendParam: ['data=tabel-stok'],
onSuccess: function(ares){
if (ares.tipe=='tabel') {
$('#tabelStok').html(ares.html);
}
}
}).send();
}
}
};
function loadSidebar(){
const mySidebar = document.getElementById('sidebarMain');
mySidebar.addEventListener('shown.bs.modal', () => {
document.querySelectorAll('.sidebar .nav-link').forEach((element) => {
element.addEventListener('click', (e) => {
let nextEl = element.nextElementSibling, parentEl = element.parentElement;
if (nextEl){
e.preventDefault();
let mycollapse = new bootstrap.Collapse(nextEl);
if (nextEl.classList.contains('show')){
mycollapse.hide();
} else {
mycollapse.show();
var opened_submenu = parentEl.parentElement.querySelector('.submenu.show');
if (opened_submenu){ new bootstrap.Collapse(opened_submenu); }
}
}
});
})
});
}
+107
View File
@@ -0,0 +1,107 @@
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/js/iss/cekharga.js
Desc. : JS - Informasi Barang & Harga Jual
Created By : Siau Pheng ([email protected]).
Created Date : October 22nd, 2014.
Last Modified : January 4th, 2025.
(c) 2014 - 2025, 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
var CekHargaJS = {
PHP: '',
KODE: '',
html5QrcodeScanner: null,
loading: function(){
$('#butBrow').click(function(){this.produk_brow();}.bind(this));
if (FoniaJS.WEB_MOBILE){
html5QrcodeScanner = new Html5Qrcode('qr-reader');
html5QrcodeScanner.start({ facingMode: 'environment' }, { fps: 10, qrbox: 250 }, CekHargaJS.ScanSukses);
} else {
FoniaJS.AutoComplete('#Nama_Produk', this.PHP, ['data=auto-produk'], {'selectFunc': CekHargaJS.Produk_Comp});
FoniaJS.setFocus('#Nama_Produk');
}
},
ScanSukses: function(decodedText, decodedResult){
new Request.JSON({
url: CekHargaJS.PHP,
sendParam: ['data=scan-produk','Cari_Produk='+decodedText],
onSuccess: function(ajson){
$('#InvID').val(ajson.InvID);
$('#Kode_Barang').val(ajson.Kode_Barang);
$('#Nama_Barang').val(ajson.Nama_Barang);
$('#Nama_Satuan').val(ajson.Nama_Satuan);
$('#Harga_Jual').val(ajson.Harga_Jual);
$('#Nama_Supplier').val(ajson.Nama_Supplier);
}
}).send();
//this.html5QrcodeScanner.pause();
},
produk_brow: function(){
var _isi = new String('<div class="row mb-1"><div class="col"><div class="input-group"><input class="form-control" id="Cari_Produk" placeholder="Kunci Pencarian" type="text"><button class="btn btn-info shadow-none" type="button" id="butSearch">Cari</button><button class="btn btn-secondary shadow-none" type="button" id="butAll">Semua</button></div></div></div><div id="divBrowProduk">&nbsp;</div>');
this.winBProduk = FoniaJS.showWindow('BProduk', 'Daftar Barang', _isi, 900, '', function(){
$('#winBProduk')
.find('#Cari_Produk').keydown(function(e){
var key = e.keyCode || e.which || 0;
if (key==13 && e.target.value!='') this.data_query('brow-produk');
}.bind(this)).end()
.find('#butSearch').click(function(e){
this.data_query('brow-produk');
}.bind(this)).end()
.find('#butAll').click(function(){
$('#winBProduk').find('#Cari_Produk').val('');
this.data_query('brow-produk');
}.bind(this));
this.data_query('brow-produk');
}.bind(this));
},
produk_select: function(acell){
FoniaJS.closeWindow(this.winBProduk);
$('#InvID').val(acell[0]);
$('#Kode_Barang').val(acell[1]+' / '+acell[2]);
$('#Nama_Barang').val(acell[5]);
$('#Nama_Satuan').val(acell[6]);
$('#Harga_Jual').val(acell[4]);
this.update_Sup();
},
data_query: function(tipe){
if (tipe=="brow-produk"){
new Request.JSONF({
url: this.PHP,
sendParam: ['data=brow-produk','Cari_Produk'],
onSuccess: function(){
FoniaJS.setFocus('#Cari_Produk');
}
}).send();
}
},
Produk_Comp: function(item){
var adata = item.data.split(':');
$('#InvID').val(item.value);
$('#Kode_Barang').val(adata[0]);
$('#Nama_Barang').val(adata[1]);
$('#Nama_Satuan').val(adata[2]);
$('#Harga_Jual').val(adata[3]);
$('#Nama_Produk').val('');
$('#Nama_Produk').focus();
CekHargaJS.update_Sup();
},
update_Sup: function(){
if ($('#InvID').val()==0) return false;
new Request.JSONF({
url: this.PHP,
sendParam: ['data=cek_supplier','InvID']
}).send();
}
};
+286
View File
@@ -0,0 +1,286 @@
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/js/iss/opname.js
Desc. : JS - Transaksi Opname Stok Barang
Created By : Siau Pheng ([email protected]).
Created Date : May 24th, 2010.
Last Modified : September 29th, 2025.
(c) 2010 - 2025, 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
var OpnameJS = {
PHP: '',
KODE: '',
loading: function(q){
$('#butTambah').click(function(){this.tx_tambah();}.bind(this));
$('#butUbah').click(function(){this.tx_ubah();}.bind(this));
$('#butHapus').click(function(){this.tx_hapus();}.bind(this));
$('#butSimpan').click(function(){this.tx_simpan();}.bind(this));
$('#butBatal').click(function(){this.tx_batal();}.bind(this));
$('#butPrint').click(function(){this.tx_print();}.bind(this));
this.data_query('master', 'view', ((typeof(q)!=='undefined') ? q : ''));
},
tx_brow: function(){
var _isi = new String('<div class="row mb-1"><div class="col"><div class="input-group"><input class="form-control" id="Cari_TX" placeholder="Kunci Pencarian" type="text"><button class="btn btn-info shadow-none" type="button" id="butSearch">Cari</button><button class="btn btn-secondary shadow-none" type="button" id="butAll">Semua</button></div></div></div><div id="divBrowTX">&nbsp;</div>');
this.winBTX = FoniaJS.showWindow('BTX', 'Daftar Transaksi', _isi, 900, '', function(){
$('#winBTX')
.find('#Cari_TX').keydown(function(e){
var key = e.keyCode || e.which || 0;
if (key==13 && e.target.value!='') this.data_query('brow-tx');
}.bind(this)).end()
.find('#butSearch').click(function(e){
this.data_query('brow-tx');
}.bind(this)).end()
.find('#butAll').click(function(){
$('#winBTX').find('#Cari_TX').val('');
this.data_query('brow-tx');
}.bind(this));
this.data_query('brow-tx');
FoniaJS.setFocus('#Cari_TX');
}.bind(this));
},
tx_select: function(acell){
FoniaJS.closeWindow(this.winBTX);
$('#No_Opname').val(acell[0]);
this.data_query('master', 'view');
},
tx_tambah: function(){
this.data_query('master', 'add');
},
tx_ubah: function(){
if (!$('#No_Opname').val()){
FoniaJS.showError("Silakan masukkan Nomor Transaksi !");
return;
}
FoniaJS.showAuth(function(){this.data_query('master', 'edit')}.bind(this), this, 'EDIT '+$('#No_Opname').val());
},
tx_hapus: function(){
if (!$('#No_Opname').val()){
FoniaJS.showError("Silakan masukkan Nomor Transaksi !");
return;
}
FoniaJS.showConfirm('Konfirmasi', 'Yakin akan hapus <strong>'+$('#No_Opname').val()+'</strong> ?', function(){
FoniaJS.showAuth(function(){
new Request.JSON({
url: this.PHP,
sendParam: ['data=delete','No_Opname'],
onSuccess: function(adata){
if (adata.status==true){
$('#No_Opname').val('');
this.data_query('master', 'view');
FoniaJS.showInfo('Proses hapus data sukses!');
}else{
FoniaJS.showInfo('Ada masalah dalam proses hapus data!');
}
}.bind(this)
}).send();
}.bind(this), this, 'DELETE '+$('#No_Opname').val());
}.bind(this), 'danger');
},
tx_simpan: function(){
if ($('#CabID').val()==0){
FoniaJS.showError("Silakan pilih Nama Cabang !");
return;
}
this.data_query('master', 'save');
},
tx_batal: function(){
FoniaJS.showConfirm('Konfirmasi', 'Yakin akan membatalkan ?', function(){
this.data_query('master', 'cancel');
$('#No_Opname').val('');
}.bind(this), 'danger');
},
tx_print: function(prt){
if ($('#No_Opname').val()) {
var cetak = new cPRINTER(FoniaJS.WEB_PATH+'apps/php/repo/nota.php');
cetak.add_param("data", "nota-opname");
cetak.add_param("Nomor_Cetak", $('#No_Opname').val());
if (prt) cetak.doPrint(); else cetak.doPreview();
return;
}
FoniaJS.showError("Silakan masukkan Nomor Transaksi !");
},
produk_brow: function(){
if ($('#CabID').val()==0){
FoniaJS.showError("Silakan pilih Nama Cabang !");
return;
}
var _isi = new String('<div class="row mb-1"><div class="col"><div class="input-group"><input class="form-control" id="Cari_Produk" placeholder="Kunci Pencarian" type="text"><button class="btn btn-info shadow-none" type="button" id="butSearch">Cari</button><button class="btn btn-secondary shadow-none" type="button" id="butAll">Semua</button></div></div></div><div id="divBrowProduk">&nbsp;</div>');
this.winBProduk = FoniaJS.showWindow('BProduk', 'Daftar Barang', _isi, 900, '', function(){
$('#winBProduk')
.find('#Cari_Produk').keydown(function(e){
var key = e.keyCode || e.which || 0;
if (key==13 && e.target.value!='') this.data_query('brow-produk');
}.bind(this)).end()
.find('#butSearch').click(function(e){
this.data_query('brow-produk');
}.bind(this)).end()
.find('#butAll').click(function(){
$('#winBProduk').find('#Cari_Produk').val('');
this.data_query('brow-produk');
}.bind(this));
this.data_query('brow-produk');
FoniaJS.setFocus('#Cari_Produk');
}.bind(this));
},
produk_select: function(acell){
FoniaJS.closeWindow(this.winBProduk);
this.detail_produk('insert', 0, acell[0], acell[1], acell[2]);
},
detail_produk: function(mode, ID, InvID, SatuanID, HPP){
new Request.JSON({
url: this.PHP,
sendParam: ['data=detail-produk','mode','mode_detail='+mode,'No_Opname','ID='+ID,'InvID='+InvID,'SatuanID='+SatuanID,'HPP='+HPP],
onSuccess: function(a){
this.winDetail = FoniaJS.showWindow('Detail', 'Detail Barang', a.html, 600, [{},{i:'butTutup'},{i:'butWSimpan',v:'Simpan',c:'success'}], function(){
FoniaJS.AutoComplete('#Nama_Produk', this.PHP, ['data=auto-produk','No_Opname','Tgl_Opname','CabID'], {'selectFunc': OpnameJS.Produk_Comp});
$('#winDetail')
.find('#butWSimpan').click(function(){this.detail_simpan();}.bind(this)).end()
.find('#Qty').keyup(function(e){
if (parseFloat(e.target.value) == 0) return false;
if (-1!==$.inArray(e.which, [13,9])) this.detail_simpan();
}.bind(this));
if (mode == 'insert' && InvID == 0) {
FoniaJS.setFocus('#Nama_Produk');
} else {
FoniaJS.setFocus('#Qty');
}
this.update_stok();
}.bind(this), null, false);
}.bind(this)
}).send();
},
detail_tambah: function(){
if ($('#CabID').val()==0){
FoniaJS.showError("Silakan pilih Nama Cabang !");
return;
}
this.detail_produk('insert', 0, 0, 0, 0);
},
detail_ubah: function(acell){
this.detail_produk('update', acell[0], acell[1], acell[2], acell[3]);
},
detail_hapus: function(acell){
FoniaJS.showConfirm('Konfirmasi', 'Hapus item <strong>"'+acell[2]+'"</strong> ?', function(){
new Request.JSONF({
url: this.PHP,
sendParam: ['data=tabel-detail','mode','mode_detail=delete','No_Opname','ID='+acell[0]]
}).send();
}.bind(this), 'danger');
},
detail_simpan: function(){
if (parseInt($('#InvID').val())==0) {
FoniaJS.showError('Silakan masukkan Nama Barang !');
return;
}
var _mdetail = $('#mode_detail').val();
new Request.JSONF({
url: this.PHP,
sendParam: ['data=tabel-detail','mode','mode_detail','No_Opname','CabID','ID','InvID','SatuanID','Qty','Harga_Beli'],
onSuccess: function(){
if (_mdetail=='insert') { this.detail_tambah(); } else FoniaJS.closeWindow(this.winDetail);
}.bind(this)
}).send();
},
data_query: function(tipe, mode, kd_tx){
if (tipe=="master"){
var sparam = ['data=master','mode='+mode,'No_Opname'+((typeof(kd_tx)!=='undefined')?'='+kd_tx:'')];
if ((mode ?? '')=='save') sparam = ['data=master','mode=save','No_Opname','Tgl_Opname','CabID','Catatan'];
new Request.JSON({
url: this.PHP,
sendParam: sparam,
onSuccess: function(ajson){
$('#divTXMaster').html(ajson.html);
$('#No_Opname').keyup(function(e){
if ((e.which || e.keyCode) == 13) {
if (($("#No_Opname")) && ($("#No_Opname").val() !== '')) this.data_query('master');
}
}.bind(this));
this.data_query('tabel-detail');
if ($.inArray($("#mode").val(),['add','edit']) !== -1) {
$('#butBrow').prop('disabled', true).removeClass('btn-info').addClass('btn-secondary');
$('#butTambah').addClass('d-none');
$('#butUbah').addClass('d-none');
$('#butHapus').addClass('d-none');
$('#butPrint').addClass('d-none');
$('#butSimpan').removeClass('d-none');
$('#butBatal').removeClass('d-none');
} else {
$('#butBrow').prop('disabled', false).removeClass('btn-secondary').addClass('btn-info');
$('#butTambah').removeClass('d-none');
$('#butUbah').removeClass('d-none');
$('#butHapus').removeClass('d-none');
$('#butPrint').removeClass('d-none');
$('#butSimpan').addClass('d-none');
$('#butBatal').addClass('d-none');
}
if (ajson.error) {
FoniaJS.showError(ajson.error);
FoniaJS.setFocus('#No_Opname');
}
if ($('#mode').val()=='print') this.tx_print(true);
}.bind(this)
}).send();
} else if (tipe=="tabel-detail"){
new Request.JSONF({
url: this.PHP,
sendParam: ['data=tabel-detail','mode','No_Opname']
}).send();
} else if (tipe=="brow-tx"){
new Request.JSONF({
url: this.PHP,
sendParam: ['data=brow-tx','Cari_TX'],
onSuccess: function(){
FoniaJS.setFocus('#Cari_TX');
}
}).send();
} else if (tipe=="brow-produk"){
new Request.JSONF({
url: this.PHP,
sendParam: ['data=brow-produk','CabID','Cari_Produk'],
onSuccess: function(){
FoniaJS.setFocus('#Cari_Produk');
}
}).send();
}
},
Produk_Comp: function(item){
var adata = item.data.split(':');
$('#InvID').val(item.value);
$('#SatuanID').val(adata[3]);
$('#Kode_Barang').val(adata[0]);
$('#Nama_Satuan').val(adata[2]);
$('#Harga_Beli').val(adata[4]);
OpnameJS.update_stok();
FoniaJS.setFocus('#Qty');
},
update_stok: function(){
new Request.JSONF({
url: this.PHP,
sendParam: ['data=cek_stok','Tgl_Opname','CabID','InvID']
}).send();
}
};
+127
View File
@@ -0,0 +1,127 @@
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/js/iss/opname_barang.js
Desc. : JS - Transaksi Penyesuaian Stok Per Barang
Created By : Siau Pheng ([email protected]).
Created Date : October 22nd, 2014.
Last Modified : September 21st, 2025.
(c) 2014 - 2025, 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
var OpnameBarangJS = {
PHP: '',
KODE: '',
html5QrcodeScanner: null,
loading: function(){
$('#butSimpan').click(function(){this.proses_save();}.bind(this));
$('#butBrow').click(function(){this.produk_brow();}.bind(this));
if (FoniaJS.WEB_MOBILE){
html5QrcodeScanner = new Html5Qrcode('qr-reader');
html5QrcodeScanner.start({ facingMode: 'environment' }, { fps: 10, qrbox: 250 }, OpnameBarangJS.ScanSukses);
} else {
FoniaJS.AutoComplete('#Nama_Produk', this.PHP, ['data=auto-produk'], {'selectFunc': OpnameBarangJS.Produk_Comp});
FoniaJS.setFocus('#Nama_Produk');
}
},
proses_save: function(){
if ($('#InvID').val()==0) {
FoniaJS.showError('Silakan masukkan Nama Produk!');
return;
}
new Request.JSON({
url: this.PHP,
sendParam: ['data=simpan-opname','InvID','Stok_Fisik'],
onSuccess: function(ares){
if (ares.Status){
FoniaJS.showInfo('Sukses simpan penyesuaian Stok !');
$('#InvID').val(0);
$('.form-control').val('')
if (FoniaJS.WEB_MOBILE){
this.html5QrcodeScanner.resume();
} else FoniaJS.setFocus('Nama_Produk');
}
}.bind(this)
}).send();
},
ScanSukses: function(decodedText, decodedResult){
new Request.JSON({
url: OpnameBarangJS.PHP,
sendParam: ['data=scan-produk','Cari_Produk='+decodedText],
onSuccess: function(ajson){
$('#InvID').val(ajson.InvID);
$('#Kode_Barang').val(ajson.Kode_Barang);
$('#Nama_Barang').val(ajson.Nama_Barang);
$('#Nama_Satuan').val(ajson.Nama_Satuan);
$('#Stok_Sistem').val(ajson.Stok_Sistem);
FoniaJS.setFocus('#Stok_Fisik');
}
}).send();
this.html5QrcodeScanner.pause();
},
produk_brow: function(){
var _isi = new String('<div class="row mb-1"><div class="col"><div class="input-group"><input class="form-control" id="Cari_Produk" placeholder="Kunci Pencarian" type="text"><button class="btn btn-info shadow-none" type="button" id="butSearch">Cari</button><button class="btn btn-secondary shadow-none" type="button" id="butAll">Semua</button></div></div></div><div id="divBrowProduk">&nbsp;</div>');
this.winBProduk = FoniaJS.showWindow('BProduk', 'Daftar Barang', _isi, 900, '', function(){
$('#winBProduk')
.find('#Cari_Produk').keydown(function(e){
var key = e.keyCode || e.which || 0;
if (key==13 && e.target.value!='') this.data_query('brow-produk');
}.bind(this)).end()
.find('#butSearch').click(function(e){
this.data_query('brow-produk');
}.bind(this)).end()
.find('#butAll').click(function(){
$('#winBProduk').find('#Cari_Produk').val('');
this.data_query('brow-produk');
}.bind(this));
this.data_query('brow-produk');
}.bind(this));
},
produk_select: function(acell){
FoniaJS.closeWindow(this.winBProduk);
$('#InvID').val(acell[0]);
$('#Kode_Barang').val(acell[1]+' / '+acell[2]);
$('#Nama_Barang').val(acell[5]);
$('#Nama_Satuan').val(acell[6]);
OpnameBarangJS.update_Stok();
},
data_query: function(tipe){
if (tipe=="brow-produk"){
new Request.JSONF({
url: this.PHP,
sendParam: ['data=brow-produk','Cari_Produk'],
onSuccess: function(){
FoniaJS.setFocus('#Cari_Produk');
}
}).send();
}
},
Produk_Comp: function(item){
var adata = item.data.split(':');
$('#InvID').val(item.value);
$('#Kode_Barang').val(adata[0]);
$('#Nama_Barang').val(adata[1]);
$('#Nama_Satuan').val(adata[2]);
OpnameBarangJS.update_Stok();
},
update_Stok: function(){
new Request.JSONF({
url: this.PHP,
sendParam: ['data=cek_stok','InvID'],
onSuccess: function(){
FoniaJS.setFocus('#Stok_Fisik');
}
}).send();
}
};
+525
View File
@@ -0,0 +1,525 @@
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/js/iss/pos.js
Desc. : JS - Transaksi Penjualan / Kasir POS
Created By : Siau Pheng ([email protected]).
Created Date : August 5th, 2012.
Last Modified : January 21st, 2026.
(c) 2012 - 2026, 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
var POSJS = {
PHP: '',
KODE: '',
POLE_DISP: null,
POLE_CONF: {},
loading: function(){
FoniaJS.AutoComplete('#Nama_Produk', this.PHP, ['data=auto-produk','No_Jual'], {'selectFunc': POSJS.Produk_Comp, 'keyFunc': POSJS.Produk_Key, 'breakValue': ['*9']});
$('#Nama_Produk').click(() => $('#Nama_Produk').select());
$('#POS_Qty').on({
keyup: (e) => {
(13 == e.which) && $('#Nama_Produk').focus();
},
click: () => $('#POS_Qty').select()
});
this.data_query('master');
//POLE DISPLAY
this.data_query('pole-config');
},
proses_oc: function(){
var cetak = new cPRINTERPOS(FoniaJS.WEB_PATH+'apps/php/repo/nota.php');
cetak.add_param("data", "opencash");
cetak.exec();
$('#Nama_Produk').focus();
},
proses_print: function(oc){
var _no_jual = $('#No_Cetak').val();
var cetak = new cPRINTERPOS(FoniaJS.WEB_PATH+'apps/php/repo/nota.php');
cetak.add_param("data", "nota-pos");
cetak.add_param("Nomor_Cetak", _no_jual);
cetak.add_param("Open_Cash", oc);
cetak.exec();
},
proses_cancel: function(){
if ($('#Total_Item').val()==0) {
FoniaJS.showInfo('Tidak ada item barang !');
return;
}
FoniaJS.showConfirm('Konfirmasi', 'Apakah Anda yakin ingin membatalkan ?<br>Semua item transaksi nota ini akan dihapus !', () => this.data_query('master','cancel'), 'danger');
},
nota_brow: function(){
var _isi = new String('<div class="row mb-1"><div class="col"><div class="input-group"><input class="form-control" id="Cari_Nota" placeholder="Kunci Pencarian" type="text"><button class="btn btn-info shadow-none" type="button" id="butSearch">Cari</button><button class="btn btn-secondary shadow-none" type="button" id="butAll">Semua</button></div></div></div><div id="divBrowNota">&nbsp;</div>');
this.winBNota = FoniaJS.showWindow('BNota', 'Daftar Transaksi', _isi, 900, '', () => {
$('#winBNota')
.find('#Cari_Nota').keydown((e) => {
var key = e.keyCode || e.which || 0;
if (key==13 && e.target.value!='') this.data_query('brow-nota');
}).end()
.find('#butSearch').click((e) => {
this.data_query('brow-nota');
}).end()
.find('#butAll').click(() => {
$('#winBNota').find('#Cari_Nota').val('');
this.data_query('brow-nota');
});
this.data_query('brow-nota');
});
},
nota_print: function(acell){
FoniaJS.closeWindow(this.winBNota);
FoniaJS.showConfirm('Konfirmasi', 'Yakin ingin cetak ulang Nota "'+acell[0]+'" ?', () => {
$('#No_Cetak').val(acell[0]);
this.proses_print(0);
}, 'info');
},
nota_select: function(acell){
FoniaJS.closeWindow(this.winBNota);
FoniaJS.showAuth(() => {
$('#No_Jual').val(acell[0]);
this.data_query('master', 'edit');
}, this, 'EDIT POS : '+acell[0]);
},
nota_delete: function(acell){
FoniaJS.closeWindow(this.winBNota);
FoniaJS.showConfirm('Konfirmasi', 'Yakin akan hapus Nota "'+acell[0]+'" ?', () => {
FoniaJS.showAuth(() => {
$('#No_Jual').val(acell[0]);
this.data_query('master', 'delete');
}, this, 'DELETE '+acell[0]);
}, 'danger');
},
pending_brow: function(){
this.winBPend = FoniaJS.showWindow('BPend', 'Daftar Transaksi Pending', '<div id="divBrowPending">&nbsp;</div>', 900, '', () => this.data_query('brow-pending'));
},
pending_select: function(acell){
$('#No_Jual').val(acell[0]);
FoniaJS.closeWindow(this.winBPend);
this.data_query('master', 'pending-edit');
},
pending_delete: function(acell){
FoniaJS.closeWindow(this.winBPend);
FoniaJS.showConfirm('Konfirmasi', 'Yakin akan hapus Transaksi Pending "'+acell[0]+'" ?', () => {
$('#No_Jual').val(acell[0]);
this.data_query('master', 'pending-delete');
}, 'danger');
},
produk_add: function(){
new Request({
url: this.PHP,
sendParam: ['data=info_produk'],
onSuccess: (txt) => {
this.winBarang = FoniaJS.showWindow('Barang', 'Penambahan Item Barang', txt, 600, [{},{i:'butBatal'},{i:'butSimpan',v:'Simpan',c:'success'}], () => {
$('#winBarang')
.find('#butSimpan').click(() => this.produk_simpan()).end()
.find('#butBatal').click(() => $('#Nama_Produk').focus()).end()
.find('#Kode_Barcode').keyup((e) => {
if (-1!==$.inArray(e.which, [13,9])) FoniaJS.setFocus('#Nama_Barang');
}).end()
.find('#Nama_Barang').keyup((e) => {
if (-1!==$.inArray(e.which, [13,9])) FoniaJS.setFocus('#Grup_InvID');
}).end()
.find('#Grup_InvID').keyup((e) => {
if (-1!==$.inArray(e.which, [13,9])) FoniaJS.setFocus('#StokID');
}).end()
.find('#StokID').keyup((e) => {
if (-1!==$.inArray(e.which, [13,9])) FoniaJS.setFocus('#Harga_Jual');
});
FoniaJS.setFocus('#Kode_Barcode');
});
}
}).send();
},
produk_simpan: function(){
new Request.JSON({
url: this.PHP,
sendParam: ['data=simpan_produk','Kode_Barcode','Nama_Barang','Grup_InvID','StokID','Harga_Jual'],
onSuccess: (ajson) => {
if (ajson.msg) FoniaJS.showInfo(ajson.msg);
FoniaJS.closeWindow(this.winBarang);
$('#Nama_Produk').val('').focus();
}
}).send();
},
produk_brow: function(){
var _isi = new String('<div class="row mb-1"><div class="col"><div class="input-group"><input class="form-control" id="Cari_Produk" placeholder="Kunci Pencarian" type="text"><button class="btn btn-info shadow-none" type="button" id="butSearch">Cari</button><button class="btn btn-secondary shadow-none" type="button" id="butAll">Semua</button></div></div></div><div id="divBrowProduk">&nbsp;</div>');
this.winBProduk = FoniaJS.showWindow('BProduk', 'Daftar Barang', _isi, 900, '', () => {
$('#winBProduk')
.find('#Cari_Produk').keydown((e) => {
var key = e.keyCode || e.which || 0;
if (key==13 && e.target.value!='') this.data_query('brow-produk');
}).end()
.find('#butSearch').click((e) => {
this.data_query('brow-produk');
}).end()
.find('#butAll').click(() => {
$('#winBProduk').find('#Cari_Produk').val('');
this.data_query('brow-produk');
});
this.data_query('brow-produk');
});
},
produk_select: function(acell){
FoniaJS.closeWindow(this.winBProduk);
this.detail_produk('insert', 0, acell[0], acell[1]);
},
detail_produk: function(mode, ID, InvID, SatuanID){
new Request({
url: this.PHP,
sendParam: ['data=detail_produk','mode_detail='+mode,'No_Jual','ID='+ID,'InvID='+InvID,'SatuanID='+SatuanID],
onSuccess: (txt) => {
this.winDetail = FoniaJS.showWindow('Detail', 'Detail Barang', txt, 600, [{},{i:'butBatal'},{i:'butSimpan',v:'Simpan',c:'success'}], () => {
$('#winDetail')
.find('#butSimpan').click(() => this.detail_simpan()).end()
.find('#butBatal').click(() => $('#Nama_Produk').focus()).end()
.find('#Qty').keyup((e) => {
this.Hitung_Detail(1);
if (-1!==$.inArray(e.which, [13,9])) FoniaJS.setFocus('#Harga_Diskon');
}).end()
.find('#Harga_Diskon').keyup((e) => {
this.Hitung_Detail(1);
if (13==e.which) {
if (FoniaJS.StrToFloat($('#Qty').val())>0) this.detail_simpan();
}
}).end()
.find('#Persen_Diskon').keyup((e) => {
this.Hitung_Detail(2);
if (13==e.which) {
if (FoniaJS.StrToFloat($('#Qty').val())>0) this.detail_simpan();
}
});
this.Hitung_Detail(1);
FoniaJS.setFocus('#Qty');
});
}
}).send();
},
detail_ubah: function(acell){
if (parseInt(acell[3])==1){
this.detail_lain('update', acell[0]);
} else
this.detail_produk('update', acell[0], acell[1], acell[2]);
},
detail_hapus: function(acell){
new Request.JSONF({
url: this.PHP,
sendParam: ['data=detail','mode_detail=delete','No_Jual','ID='+acell[0]],
onSuccess: () => {
$('#Nama_Produk').focus();
//POLE DISPLAY
if (this.POLE_CONF.ENABLE){
this.POLE_DISP.Send([{'t':'..','a':'L'},{'t':'Total '+$('#Total_Disp').html(),'a':'R'}]);
}
}
}).send();
},
detail_simpan: function(){
if (FoniaJS.StrToFloat($('#Persen_Diskon').val())>=100) {
FoniaJS.showInfo('Nilai Diskon diluar batas !');
return false;
}
new Request.JSONF({
url: this.PHP,
sendParam: ['data=detail','mode_detail','No_Jual','InvID','SatuanID','Qty','Harga_Beli','Harga_Jual','Harga_Diskon','ID','Ket'],
onSuccess: () => {
//POLE DISPLAY
if (this.POLE_CONF.ENABLE){
this.POLE_DISP.Send([{'t':$('#Nama_Lengkap').val(),'a':'L'},{'t':'Total '+$('#Total_Disp').html(),'a':'R'}]);
}
FoniaJS.closeWindow(this.winDetail);
$('#Nama_Produk').val('');
$('#Nama_Produk').focus();
}
}).send();
},
detail_lain: function(mode, ID){
new Request({
url: this.PHP,
sendParam: ['data=detail_lain','mode_detail='+mode,'No_Jual','ID='+ID],
onSuccess: (txt) => {
this.winDetail = FoniaJS.showWindow('Detail', 'Detail Barang', txt, 600, [{},{i:'butBatal'},{i:'butSimpan',v:'Simpan',c:'success'}], () => {
$('#winDetail')
.find('#butSimpan').click(() => this.detail_simpan()).end()
.find('#butBatal').click(() => $('#Nama_Produk').focus()).end()
.find('#Ket').keyup((e) => {
if ('' === e.target.value) return false;
if (-1!==$.inArray(e.which, [13,9])) FoniaJS.setFocus('#Qty');
}).end()
.find('#Qty').keyup((e) => {
this.Hitung_Detail(0);
if (-1!==$.inArray(e.which, [13,9])) FoniaJS.setFocus('#Harga_Jual');
}).end()
.find('#Harga_Jual').keyup((e) => {
this.Hitung_Detail(0);
if (13==e.which) {
if (FoniaJS.StrToFloat($('#Qty').val())>0 && FoniaJS.StrToFloat($('#Harga_Jual').val())>0) this.detail_simpan();
}
});
this.Hitung_Detail(0);
FoniaJS.setFocus('#Ket');
});
}
}).send();
},
kasir_show: function(){
//POLE DISPLAY
if (this.POLE_CONF.ENABLE){
this.POLE_DISP.Send([{'t':'Total '+$('#Total_Disp').html(),'a':'C'},{'t':'Tunai / Non Tunai ?','a':'C'}]);
}
if ($('#Total_Item').val()==0) {
FoniaJS.showInfo('Belum ada transaksi !');
return;
}
new Request.JSON({
url: this.PHP,
sendParam: ['data=info_kasir','No_Jual','Total_Nota'],
onSuccess: (adata) => {
this.winKasir = FoniaJS.showWindow('Kasir', 'Informasi Pembayaran', adata.html, 500, '', () => {
$('#butKPend').click(() => this.kasir_pending());
$('#butKBayar').click(() => this.kasir_simpan());
$('#butKBatal').click(() => $('#Nama_Produk').focus());
$('#popTotal_Tunai').keyup((e) => {
if (13 == e.which && parseFloat(e.target.value) == 0){
e.target.value = FoniaJS.FloatToStr($('#Total_Nota').val());
}
if (27 == e.which) {
FoniaJS.closeWindow(this.winKasir);
$('#Nama_Produk').focus();
}
this.kasir_hitung();
if (parseFloat(e.target.value) == 0) return false;
if (13 == e.which) $('#butKBayar').focus();
});
$('#popTotal_Kartu').keyup((e) => {
if (13 == e.which && $('#popKartuID').val() > 0 && parseFloat(e.target.value) == 0){
e.target.value = FoniaJS.FloatToStr($('#Total_Nota').val()-FoniaJS.StrToFloat($('#popTotal_Tunai').val()));
}
if (27 == e.which) {
FoniaJS.closeWindow(this.winKasir);
$('#Nama_Produk').focus();
}
this.kasir_hitung();
if (parseFloat(e.target.value) == 0) return false;
if (13 == e.which) $('#butKBayar').focus();
});
$('#popKartuID').change(() => {
if ($('#popKartuID').val() > 0){
if (parseFloat($('#popTotal_Kartu').val()) == 0) $('#popTotal_Kartu').val(FoniaJS.FloatToStr($('#Total_Nota').val()-FoniaJS.StrToFloat($('#popTotal_Tunai').val())));
$('.ckartu').removeClass('d-none');
} else {
$('#popTotal_Kartu').val('0.00');
$('.ckartu').addClass('d-none');
}
this.kasir_hitung();
FoniaJS.setFocus('#popTotal_Kartu');
});
$('#popTotal_Tunai').val(FoniaJS.FloatToStr($('#Total_Tunai').val()));
$('#popTotal_Kartu').val(FoniaJS.FloatToStr($('#Total_Kartu').val()));
$('#popTotal_Bayar').val($('#Total_Bayar').val());
$('#popKartuID').val($('#KartuID').val()).trigger('change');
$('#popNo_Kartu').val($('#No_Kartu').val());
$('#popNama_Kartu').val($('#Nama_Kartu').val());
$('#Total_Disp').html(adata.Total_Disp);
FoniaJS.setFocus('#popTotal_Tunai');
});
this.Simpan = false;
}
}).send();
},
kasir_hitung: function(){
const totBayar = FoniaJS.StrToFloat($('#popTotal_Tunai').val()) + FoniaJS.StrToFloat($('#popTotal_Kartu').val());
const totSisa = totBayar - FoniaJS.StrToFloat($('#popTotal_Jual').val());
$('#popTotal_Bayar').val(totBayar);
$('#popTotal_Sisa').val(FoniaJS.FloatToStr(totSisa, 2)).removeClass('border-danger border-success').addClass((totSisa < 0) ? 'border-danger' : 'border-success');
},
kasir_simpan: function(){
const totTunai = FoniaJS.StrToFloat($('#popTotal_Tunai').val());
const totKartu = FoniaJS.StrToFloat($('#popTotal_Kartu').val());
const jenKartu = $('#popKartuID').val();
if (jenKartu == 0 && totKartu > 0) {
FoniaJS.showInfo('Silakan pilih Jenis Pembayaran Non Tunai!');
FoniaJS.setFocus('#popKartuID');
return false;
} else if (jenKartu > 0 && totKartu == 0) {
FoniaJS.showInfo('Silakan masukkan Jumlah Pembayaran Non Tunai!');
FoniaJS.setFocus('#popKartuID');
return false;
}
if (FoniaJS.StrToFloat($('#popTotal_Sisa').val())<0) {
FoniaJS.showInfo('Pembayaran Transaksi tidak mencukupi!');
FoniaJS.setFocus('#popTotal_Bayar');
return false;
}
if (this.Simpan==true) {
FoniaJS.showError('Proses pembayaran sedang dilakukan!');
return;
}
this.Simpan = true;
$('#Total_Tunai').val(totTunai);
$('#Total_Kartu').val(totKartu);
$('#Total_Bayar').val($('#popTotal_Bayar').val());
$('#KartuID').val($('#popKartuID').val());
$('#No_Kartu').val($('#popNo_Kartu').val());
$('#Nama_Kartu').val($('#popNama_Kartu').val());
FoniaJS.closeWindow(this.winKasir);
this.data_query('master', 'save');
},
kasir_pending: function(){
FoniaJS.closeWindow(this.winKasir);
this.data_query('master', 'pending-save');
},
data_query: function(tipe, mode){
if (tipe=='master'){
mode = (mode) ? mode : '';
var sparam = ['data=master','mode='+mode,'No_Jual','No_Cetak'];
if (-1 !== mode.search(/save/i)) sparam = ['data=master','mode='+mode,'No_Jual','Tgl_Jual','Total_Tunai','Total_Kartu','Total_Bayar','KartuID','No_Kartu','Nama_Kartu'];
new Request({
url: this.PHP,
sendParam: sparam,
onSuccess: (txt) => {
$('#divPOS2').html(txt);
$('#posPEND').click(() =>this.pending_brow());
$('#posTAMBAH').click(() => this.produk_add());
$('#posBARANG').click(() => this.produk_brow());
$('#posNOTA').click(() => this.nota_brow());
$('#posSIMPAN').click(() => this.kasir_show());
$('#posBATAL').click(() => this.proses_cancel());
FoniaJS.User.Level>1 && $('#posBATAL').hide();
this.data_query('detail');
$('#Nama_Produk').focus();
if (-1!==$.inArray($('#mode').val(), ['print','opencd','saveonly'])){
if ($('#mode').val()=='print') this.proses_print(1);
if ($('#mode').val()=='opencd') this.proses_oc();
//POLE DISPLAY
if (this.POLE_CONF.ENABLE){
this.POLE_DISP.Send([{'t':this.POLE_CONF.END1,'a':'C'},{'t':this.POLE_CONF.END2,'a':'C'}]);
}
} else {
//POLE DISPLAY
if (this.POLE_CONF.ENABLE){
this.POLE_DISP.Send([{'t':this.POLE_CONF.START1,'a':'C'},{'t':this.POLE_CONF.START2,'a':'C'}]);
}
}
}
}).send();
} else if (tipe=='detail'){
new Request.JSONF({
url: this.PHP,
sendParam: ['data=detail','No_Jual']
}).send();
} else if (tipe=='brow-produk'){
new Request.JSONF({
url: this.PHP,
sendParam: ['data=brow-produk','Cari_Produk'],
onSuccess: () => {
FoniaJS.setFocus('#Cari_Produk');
}
}).send();
} else if (tipe=='brow-nota'){
new Request.JSONF({
url: this.PHP,
sendParam: ['data=brow-nota','Cari_Nota'],
onSuccess: () => {
FoniaJS.setFocus('#Cari_Nota');
}
}).send();
} else if (tipe=='brow-pending'){
new Request.JSONF({
url: this.PHP,
sendParam: ['data=brow-pending']
}).send();
} else if (tipe=='pole-config'){
new Request.JSONF({
url: this.PHP,
sendParam: ['data=pole-config'],
onSuccess: (acfg) => {
if (typeof acfg.pole == 'object'){
this.POLE_CONF = acfg.pole;
if (this.POLE_CONF.ENABLE){
this.POLE_DISP = new cPOLEDISPLAY(this.POLE_CONF.PORT);
this.POLE_DISP.Open();
}
}
}
}).send();
}
},
Produk_Comp: function(item){
var _qty = $('#POS_Qty').val();
var adata = item.data.split(':');
//jika stok kosong tidak simpan hanya utk glamore
if (parseInt(adata[3])>0 || _qty<0){
new Request.JSONF({
url: POSJS.PHP,
sendParam: ['data=detail','mode_detail=insert','No_Jual','InvID='+item.value,'SatuanID='+adata[0],'Qty='+_qty,'Harga_Beli='+adata[1],'Harga_Jual='+adata[2]],
onSuccess: () => {
$('#POS_Qty').val('1.00');
//POLE DISPLAY
if (POSJS.POLE_CONF.ENABLE){
POSJS.POLE_DISP.Send([{'t':item.text,'a':'L'},{'t':'Total '+$('#Total_Disp').html(),'a':'R'}]);
}
}
}).send();
} else {
this.winPesan = FoniaJS.showWindow('Pesan', 'Informasi Barang', '<div class="fs-3 text-center text-danger">Barang tidak tersedia atau habis !</div>', 300, [{},{i:'butTutup'}], () => {
$('#winPesan').find('#butTutup').click(() => $('#Nama_Produk').focus()).focus();
});
}
$('#Nama_Produk').val('').focus();
},
Produk_Key: function(key, val){
if (val == '*9') {
if (key == 13) POSJS.detail_lain('insert', 0);
} else {
if (key == 13) {
POSJS.kasir_show();
} else if (key == 117) {//f6
POSJS.proses_oc();
} else if (key == 119) {//f8
POSJS.produk_add();
} else if (key == 120) {//f9
POSJS.produk_brow();
}
}
},
onblur_Qty: function(){
if ($('#POS_Qty').val()==0) $('#POS_Qty').val('1.00');
},
Hitung_Detail: function(tipe){
if (tipe==1) $('#Persen_Diskon').val(FoniaJS.FloatToStr((FoniaJS.StrToFloat($('#Harga_Diskon').val())*100) / FoniaJS.StrToFloat($('#Harga_Jual').val()), 2));
if (tipe==2) $('#Harga_Diskon').val(FoniaJS.FloatToStr(FoniaJS.StrToFloat($('#Harga_Jual').val()) * FoniaJS.StrToFloat($('#Persen_Diskon').val()) * 0.01, 2));
$('#Jumlah').val(FoniaJS.FloatToStr(FoniaJS.StrToFloat($('#Qty').val()) * (FoniaJS.StrToFloat($('#Harga_Jual').val()) - FoniaJS.StrToFloat($('#Harga_Diskon').val())), 2));
}
};
+84
View File
@@ -0,0 +1,84 @@
/*******************************************************************
Module : /apps/js/login.js
Desc. : JS - Halaman Proses Login
Created By : Siau Pheng ([email protected]).
Created Date : January 15th, 2008.
Last Modified : June 28th, 2020.
(c) 2008 - 2020, 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
$(document).ready(function(){
$('#butLogin').click(LoginJS.Proses_Login);
$('#Username').keydown(function(e){
if (e.which==13) $('#Password').focus();
});
$('#Password').keydown(function(e){
if (e.which==13) $('#butLogin').trigger('click');
});
LoginJS.Tampil_Login();
document.oncontextmenu = new Function ('return false');
$.backstretch([
[
{ width: 1280, url: FoniaJS.WEB_PATH+"assets/images/bs/toko_1280.jpg" },
{ width: 960, url: FoniaJS.WEB_PATH+"assets/images/bs/toko_960.jpg" }
],
[
{ width: 1280, url: FoniaJS.WEB_PATH+"assets/images/bs/rak_1280.jpg" },
{ width: 960, url: FoniaJS.WEB_PATH+"assets/images/bs/rak_960.jpg" }
],
[
{ width: 1280, url: FoniaJS.WEB_PATH+"assets/images/bs/shop_1280.jpg" },
{ width: 960, url: FoniaJS.WEB_PATH+"assets/images/bs/shop_960.jpg" }
]
], {
duration: 6000,
transition: 'push_left|push_right|cover_up|cover_down|fade',
transitionDuration: 600
});
});
var LoginJS = {
Tampil_Login: function(){
var Username = FoniaJS.getCookie('Username');
if (Username != '') {
$('#Username').val(Username);
FoniaJS.setFocus('#Password');
} else {
FoniaJS.setFocus('#Username');
}
},
Proses_Login: function(){
if (!$('#Username').val()){
$('#Username').focus();
FoniaJS.showError('Silahkan masukkan Username !');
return false;
}
if (!$('#Password').val()){
$('#Password').focus();
FoniaJS.showError('Silahkan masukkan Password !');
return false;
}
new Request.JSON({
url: FoniaJS.WEB_PATH+'apps/php/login.php',
sendParam: ['mode=login','Username','Password'],
onSuccess: function(respon){
if (respon.hasil == 'SUKSES'){
FoniaJS.setCookie('Username', $('#Username').val(), 365);
$('#divLoginMsg').html(respon.pesan).removeClass('d-none');
$('.input-group').addClass('d-none');
setTimeout(function(){self.location = FoniaJS.WEB_PATH+'?auth='+(respon.token??'');}, 1600);
}else{
FoniaJS.showInfo(respon.pesan, 3000);
if (respon.redir) setTimeout(function(){self.location = respon.redir;}, 600);
}
}
}).send();
}
};
+118
View File
@@ -0,0 +1,118 @@
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/js/repo/barcode.js
Desc. : JS - Cetak Barcode Label
Created By : Siau Pheng ([email protected]).
Created Date : October 28th, 2013.
Last Modified : October 2nd, 2025.
(c) 2013 - 2025, 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
var RepoBarcodeJS = {
PHP: '',
KODE: '',
loading: function(){
$('#butCetak').click(function(){this.proses_print();}.bind(this));
FoniaJS.AutoComplete('#Nama_Produk', this.PHP, ['data=auto-produk'], {'selectFunc': RepoBarcodeJS.Produk_Comp});
$('#butBrow').click(function(){this.produk_brow();}.bind(this));
$('#butPL').click(function(){this.load_printer();}.bind(this));
$('#Nama_Produk').focus();
},
proses_print: function(){
if ($('#InvID').val() == 0){
FoniaJS.showError('Silakan masukkan Nama Barang !');
FoniaJS.setFocus('Nama_Produk');
return;
}
if ($('#Printer').val() == ''){
FoniaJS.showError('Silakan pilih Nama Printer Barcode !');
return;
}
var cetak = new cPRINTERPOS(this.PHP);
cetak.setPrinter($('#Printer').val());
cetak.add_param("data", "print-barcode");
cetak.add_param("InvID");
cetak.add_param("SatuanID");
cetak.add_param("Qty");
cetak.add_param("Kode_Sup");
cetak.add_param("Printer");
cetak.exec();
},
produk_brow: function(){
var _isi = new String('<div class="row mb-1"><div class="col"><div class="input-group"><input class="form-control" id="Cari_Produk" placeholder="Kunci Pencarian" type="text"><button class="btn btn-info shadow-none" type="button" id="butSearch">Cari</button><button class="btn btn-secondary shadow-none" type="button" id="butAll">Semua</button></div></div></div><div id="divBrowProduk">&nbsp;</div>');
this.winBProduk = FoniaJS.showWindow('BProduk', 'Daftar Barang', _isi, 900, '', function(){
$('#winBProduk')
.find('#Cari_Produk').keydown(function(e){
var key = e.keyCode || e.which || 0;
if (key==13 && e.target.value!='') this.data_query('brow-produk');
}.bind(this)).end()
.find('#butSearch').click(function(e){
this.data_query('brow-produk');
}.bind(this)).end()
.find('#butAll').click(function(){
$('#winBProduk').find('#Cari_Produk').val('');
this.data_query('brow-produk');
}.bind(this));
this.data_query('brow-produk');
}.bind(this));
},
produk_select: function(acell){
FoniaJS.closeWindow(this.winBProduk);
$('#InvID').val(acell[0]);
$('#SatuanID').val(acell[1]);
$('#Kode_SKU').val(acell[2]);
$('#Nama_Produk').val(acell[4]);
this.update_Sup();
FoniaJS.setFocus('#Qty');
},
data_query: function(tipe){
if (tipe=="brow-produk"){
new Request.JSONF({
url: this.PHP,
sendParam: ['data=brow-produk','Cari_Produk'],
onSuccess: function(){
FoniaJS.setFocus('#Cari_Produk');
}
}).send();
}
},
Produk_Comp: function(item){
var adata = item.data.split(':');
$('#InvID').val(item.value);
$('#SatuanID').val(adata[1]);
$('#Kode_SKU').val(adata[0]);
RepoBarcodeJS.update_Sup();
FoniaJS.setFocus('#Qty');
},
update_Sup: function(){
new Request.JSONF({
url: this.PHP,
sendParam: ['data=opt-sup','InvID']
}).send();
},
load_printer: function(){
var parent = this;
qz.printers.find().then(function(data){
var _dafprt = '';
for(var i = 0; i < data.length; i++) {
_dafprt += data[i] + '|';
};
new Request.JSONF({
url: parent.PHP,
sendParam: ['data=load-printer','Printer='+_dafprt,'DefPrint='+$('#configPrinter').html()]
}).send();
});
}
};
+63
View File
@@ -0,0 +1,63 @@
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/js/repo/dana_pos.js
Desc. : JS - Laporan Penerimaan Kasir / POS
Created By : Siau Pheng ([email protected]).
Created Date : September 8th, 2012.
Last Modified : September 30th, 2025.
(c) 2012 - 2025, 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
var RepoDanaPOSJS = {
PHP: '',
KODE: '',
loading: function(){
$('#butPOS').click(function(){this.proses_pos();}.bind(this));
$('#butCetak').click(function(){this.proses_print(true);}.bind(this));
$('#butPreview').click(function(){this.proses_print();}.bind(this));
$('#butExcel').click(function(){this.proses_dload();}.bind(this));
},
proses_pos: function(){
if ($('#KasirID').val()==0){
FoniaJS.showError("Untuk Cetak POS silakan pilih salah satu Nama Pengguna!");
$('#KasirID').focus();
return;
}
var cetak = new cPRINTERPOS(this.PHP);
cetak.add_param("data", "print-pos");
cetak.add_param("Tipe", "R");
cetak.add_param("CabID");
cetak.add_param("KasirID");
cetak.add_param("Tgl_From");
cetak.add_param("Tgl_To");
cetak.exec();
},
proses_print: function(prt){
var cetak = new cPRINTER(this.PHP);
cetak.add_param("data", "print");
cetak.add_param("Tipe");
cetak.add_param("CabID");
cetak.add_param("KasirID");
cetak.add_param("Tgl_From");
cetak.add_param("Tgl_To");
if (prt) cetak.doPrint(); else cetak.doPreview();
},
proses_dload: function(){
var dload = new cEXPORT(this.PHP);
dload.add_param("data", "export");
dload.add_param("Tipe");
dload.add_param("CabID");
dload.add_param("KasirID");
dload.add_param("Tgl_From");
dload.add_param("Tgl_To");
dload.download();
}
};
+44
View File
@@ -0,0 +1,44 @@
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/js/repo/jual.js
Desc. : JS - Laporan Penjualan
Created By : Siau Pheng ([email protected]).
Created Date : April 12th, 2011.
Last Modified : September 30th, 2025.
(c) 2011 - 2025, 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
var RepoJualJS = {
PHP: '',
KODE: '',
loading: function(){
$('#butCetak').click(function(){this.proses_print(true);}.bind(this));
$('#butPreview').click(function(){this.proses_print();}.bind(this));
$('#butExcel').click(function(){this.proses_dload();}.bind(this));
},
proses_print: function(prt){
var cetak = new cPRINTER(this.PHP);
cetak.add_param("data", "print");
cetak.add_param("Tipe");
cetak.add_param("CabID");
cetak.add_param("Tgl_From");
cetak.add_param("Tgl_To");
if (prt) cetak.doPrint(); else cetak.doPreview();
},
proses_dload: function(){
var dload = new cEXPORT(this.PHP);
dload.add_param("data", "export");
dload.add_param("Tipe");
dload.add_param("CabID");
dload.add_param("Tgl_From");
dload.add_param("Tgl_To");
dload.download();
}
};
+50
View File
@@ -0,0 +1,50 @@
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/js/repo/jual_analisa.js
Desc. : JS - Laporan Analisa Penjualan
Created By : Siau Pheng ([email protected]).
Created Date : May 9th, 2013.
Last Modified : October 4th, 2025.
(c) 2013 - 2025, 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
var RepoJualAnaJS = {
PHP: '',
KODE: '',
loading: function(){
$('#butCetak').click(function(){this.proses_print(true);}.bind(this));
$('#butPreview').click(function(){this.proses_print();}.bind(this));
$('#butExcel').click(function(){this.proses_dload();}.bind(this));
},
proses_print: function(prt){
var cetak = new cPRINTER(this.PHP);
cetak.add_param("data", "print");
cetak.add_param("Tipe");
cetak.add_param("CabID");
cetak.add_param("Grup_InvID");
cetak.add_param("SupID");
cetak.add_param("Urut");
cetak.add_param("Tgl_From");
cetak.add_param("Tgl_To");
if (prt) cetak.doPrint(); else cetak.doPreview();
},
proses_dload: function(){
var dload = new cEXPORT(this.PHP);
dload.add_param("data", "export");
dload.add_param("Tipe");
dload.add_param("CabID");
dload.add_param("Grup_InvID");
dload.add_param("SupID");
dload.add_param("Urut");
dload.add_param("Tgl_From");
dload.add_param("Tgl_To");
dload.download();
}
};
+46
View File
@@ -0,0 +1,46 @@
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/js/repo/jual_rekap.js
Desc. : JS - Laporan Rekap Penjualan
Created By : Siau Pheng ([email protected]).
Created Date : May 9th, 2013.
Last Modified : October 4th, 2025.
(c) 2013 - 2025, 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
var RepoJualRekapJS = {
PHP: '',
KODE: '',
loading: function(){
$('#butCetak').click(function(){this.proses_print(true);}.bind(this));
$('#butPreview').click(function(){this.proses_print();}.bind(this));
$('#butExcel').click(function(){this.proses_dload();}.bind(this));
},
proses_print: function(prt){
var cetak = new cPRINTER(this.PHP);
cetak.add_param("data", "print");
cetak.add_param("CabID");
cetak.add_param("Grup_InvID");
cetak.add_param("SupID");
cetak.add_param("Tgl_From");
cetak.add_param("Tgl_To");
if (prt) cetak.doPrint(); else cetak.doPreview();
},
proses_dload: function(){
var dload = new cEXPORT(this.PHP);
dload.add_param("data", "export");
dload.add_param("CabID");
dload.add_param("Grup_InvID");
dload.add_param("SupID");
dload.add_param("Tgl_From");
dload.add_param("Tgl_To");
dload.download();
}
};
+160
View File
@@ -0,0 +1,160 @@
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/js/repo/label.js
Desc. : JS - Cetak Label Harga Barang
Created By : Siau Pheng ([email protected]).
Created Date : September 13th, 2014.
Last Modified : October 5th, 2025.
(c) 2014 - 2025, 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
var RepoLabelJS = {
PHP: '',
KODE: '',
loading: function(q){//oke
$('#butHapus').click(function(){this.proses_empty();}.bind(this));
$('#butPrint').click(function(){this.proses_print(true);}.bind(this));
$('#butPreview').click(function(){this.proses_print();}.bind(this));
this.data_query('tabel-detail', 'empty', ((typeof(q)!=='undefined') ? q : ''));
},
proses_empty: function(){//oke
new Request.JSONF({
url: this.PHP,
sendParam: ['data=tabel-detail','mode_detail=empty']
}).send();
},
proses_print: function(prt){//oke
var cetak = new cPRINTER(this.PHP);
cetak.add_param("data", "print");
if (prt) cetak.doPrint(); else cetak.doPreview();
},
produk_brow: function(){//oke
var _isi = new String('<div class="row mb-1"><div class="col"><div class="input-group"><input class="form-control" id="Cari_Produk" placeholder="Kunci Pencarian" type="text"><button class="btn btn-info shadow-none" type="button" id="butSearch">Cari</button><button class="btn btn-secondary shadow-none" type="button" id="butAll">Semua</button></div></div></div><div id="divBrowProduk">&nbsp;</div>');
this.winBProduk = FoniaJS.showWindow('BProduk', 'Daftar Barang', _isi, 900, [{},{i:'butTutup'},{i:'butWSimpan',v:'Simpan',c:'success'}], function(){
$('#winBProduk')
.find('#butWSimpan').click(function(){this.produk_simpan();}.bind(this)).end()
.find('#Cari_Produk').keydown(function(e){
var key = e.keyCode || e.which || 0;
if (key==13 && e.target.value!='') this.data_query('brow-produk');
}.bind(this)).end()
.find('#butSearch').click(function(e){
this.data_query('brow-produk');
}.bind(this)).end()
.find('#butAll').click(function(){
$('#winBProduk').find('#Cari_Produk').val('');
this.data_query('brow-produk');
}.bind(this));
this.data_query('brow-produk');
FoniaJS.setFocus('#Cari_Produk');
}.bind(this));
},
produk_simpan: function(){//oke
new Request.JSONF({
url: this.PHP,
sendParam: ['data=tabel-detail','mode_detail=simpan-produk'],
onSuccess: function(){
FoniaJS.closeWindow(this.winBProduk);
}.bind(this)
}).send();
},
grup_brow: function(){//oke
var _isi = new String('<div class="row mb-1"><div class="col"><div class="input-group"><input class="form-control" id="Cari_Grup" placeholder="Kunci Pencarian" type="text"><button class="btn btn-info shadow-none" type="button" id="butSearch">Cari</button><button class="btn btn-secondary shadow-none" type="button" id="butAll">Semua</button></div></div></div><div id="divBrowGrup">&nbsp;</div>');
this.winBGrup = FoniaJS.showWindow('BGrup', 'Daftar Grup Barang', _isi, 900, null, function(){
$('#winBGrup')
.find('#Cari_Grup').keydown(function(e){
var key = e.keyCode || e.which || 0;
if (key==13 && e.target.value!='') this.data_query('brow-grup');
}.bind(this)).end()
.find('#butSearch').click(function(e){
this.data_query('brow-grup');
}.bind(this)).end()
.find('#butAll').click(function(){
$('#winBGrup').find('#Cari_Grup').val('');
this.data_query('brow-grup');
}.bind(this));
this.data_query('brow-grup');
FoniaJS.setFocus('#Cari_Grup');
}.bind(this));
},
grup_select: function(acell){//oke
new Request.JSONF({
url: this.PHP,
sendParam: ['data=tabel-detail','mode_detail=simpan-grup','Grup_InvID='+acell[0]],
onSuccess: function(){
FoniaJS.closeWindow(this.winBGrup);
}.bind(this)
}).send();
},
detail_ubah: function(acell){//oke
new Request.JSON({
url: this.PHP,
sendParam: ['data=detail-tx','mode_detail=update','ID='+acell[0]],
onSuccess: function(a){
this.winDetail = FoniaJS.showWindow('Detail', 'Detail Barang', a.html, 600, [{},{i:'butTutup'},{i:'butWSimpan',v:'Simpan',c:'success'}], function(){
$('#winDetail')
.find('#butWSimpan').click(function(){this.detail_simpan();}.bind(this)).end()
.find('#Nama_Produk').keyup(function(e){
if (-1!==$.inArray(e.which, [13,9])) this.detail_simpan();
}.bind(this));
FoniaJS.setFocus('#Nama_Produk');
}.bind(this), false);
}.bind(this)
}).send();
},
detail_hapus: function(acell){//oke
FoniaJS.showConfirm('Konfirmasi', 'Hapus item <strong>"'+acell[1]+'"</strong> ?', function(){
new Request.JSONF({
url: this.PHP,
sendParam: ['data=tabel-detail','mode_detail=delete','ID='+acell[0]]
}).send();
}.bind(this), 'danger');
},
detail_simpan: function(){//oke
new Request.JSONF({
url: this.PHP,
sendParam: ['data=tabel-detail','mode_detail','ID','Nama_Produk='+encodeURIComponent($('#Nama_Produk').val())],
onSuccess: function(){
FoniaJS.closeWindow(this.winDetail);
}.bind(this)
}).send();
},
data_query: function(tipe, mode, kd_tx){//oke
if (tipe=="tabel-detail"){
new Request.JSONF({
url: this.PHP,
sendParam: ['data=tabel-detail','mode_detail='+mode,'No_Label'+((typeof(kd_tx)!=='undefined')?'='+kd_tx:'')]
}).send();
} else if (tipe=="brow-produk"){
new Request.JSONF({
url: this.PHP,
sendParam: ['data=brow-produk','Cari_Produk'],
onSuccess: function(){
FoniaJS.setFocus('#Cari_Produk');
}
}).send();
} else if (tipe=="brow-grup"){
new Request.JSONF({
url: this.PHP,
sendParam: ['data=brow-grup','Cari_Grup'],
onSuccess: function(){
FoniaJS.setFocus('#Cari_Grup');
}
}).send();
}
}
};
+44
View File
@@ -0,0 +1,44 @@
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/js/repo/opname.js
Desc. : JS - Laporan Opname Stok Barang
Created By : Siau Pheng ([email protected]).
Created Date : September 8th, 2012.
Last Modified : October 4th, 2025.
(c) 2012 - 2025, 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
var RepoOpnameJS = {
PHP: '',
KODE: '',
loading: function(){
$('#butCetak').click(function(){this.proses_print(true);}.bind(this));
$('#butPreview').click(function(){this.proses_print();}.bind(this));
$('#butExcel').click(function(){this.proses_dload();}.bind(this));
},
proses_print: function(prt){
var cetak = new cPRINTER(this.PHP);
cetak.add_param("data", "print");
cetak.add_param("CabID");
cetak.add_param("KasirID");
cetak.add_param("Tgl_From");
cetak.add_param("Tgl_To");
if (prt) cetak.doPrint(); else cetak.doPreview();
},
proses_dload: function(){
var dload = new cEXPORT(this.PHP);
dload.add_param("data", "export");
dload.add_param("CabID");
dload.add_param("KasirID");
dload.add_param("Tgl_From");
dload.add_param("Tgl_To");
dload.download();
}
};
+61
View File
@@ -0,0 +1,61 @@
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/js/repo/stok_akhir.js
Desc. : JS - Laporan Stok Akhir Barang
Created By : Siau Pheng ([email protected]).
Created Date : January 24th, 2011.
Last Modified : October 1st, 2025.
(c) 2011 - 2025, 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
var RepoStokAkhirJS = {
PHP: '',
KODE: '',
loading: function(){
$('#butCetak').click(function(){this.proses_print(true);}.bind(this));
$('#butPreview').click(function(){this.proses_print();}.bind(this));
$('#butExcel').click(function(){this.proses_dload();}.bind(this));
},
proses_print: function(prt){
var cetak = new cPRINTER(this.PHP);
cetak.add_param("data", "print");
cetak.add_param("CabID");
cetak.add_param("SupID");
cetak.add_param("Grup_InvID");
cetak.add_param("Tanggal");
cetak.add_param("Urut");
cetak.add_param("Harga");
cetak.add_param("Min_Stok");
cetak.add_param("Min_Qty");
if (prt) cetak.doPrint(); else cetak.doPreview();
},
proses_dload: function(){
var dload = new cEXPORT(this.PHP);
dload.add_param("data", "export");
dload.add_param("CabID");
dload.add_param("SupID");
dload.add_param("Grup_InvID");
dload.add_param("Tanggal");
dload.add_param("Urut");
dload.add_param("Harga");
dload.add_param("Min_Stok");
dload.add_param("Min_Qty");
dload.download();
},
oc_MinStok: function(){
if ($('#Min_Stok').val()=='Y') {
$('#Min_Qty').prop({disabled:false, readonly:false});
FoniaJS.setFocus('#Min_Qty')
} else {
$('#Min_Qty').prop({disabled:true, readonly:true}).val(0);
}
}
};
+100
View File
@@ -0,0 +1,100 @@
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/js/repo/stok_mutasi.js
Desc. : JS - Laporan Mutasi Stok Barang
Created By : Siau Pheng ([email protected]).
Created Date : July 16th, 2011.
Last Modified : October 2nd, 2025.
(c) 2011 - 2025, 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
var RepoStokMutasiJS = {
PHP: '',
KODE: '',
loading: function(){
$('#butCetak').click(function(){this.proses_print(true);}.bind(this));
$('#butPreview').click(function(){this.proses_print();}.bind(this));
$('#butExcel').click(function(){this.proses_dload();}.bind(this));
FoniaJS.AutoComplete('#Nama_Produk', this.PHP, ['data=auto-produk'], {'selectFunc': RepoStokMutasiJS.Produk_Comp});
$('#butBrow').click(function(){this.produk_brow();}.bind(this));
$('#Nama_Produk').focus();
},
proses_print: function(prt){
if ($('#InvID').val()==0) {
FoniaJS.showError('Silakan masukkan Nama Barang !');
$('#Nama_Produk').focus();
return;
}
var cetak = new cPRINTER(this.PHP);
cetak.add_param("data", "print");
cetak.add_param("CabID");
cetak.add_param("InvID");
cetak.add_param("Tgl_From");
cetak.add_param("Tgl_To");
if (prt) cetak.doPrint(); else cetak.doPreview();
},
proses_dload: function(){
if ($('#InvID').val()==0) {
FoniaJS.showError('Silakan masukkan Nama Barang !');
$('#Nama_Produk').focus();
return;
}
var dload = new cEXPORT(this.PHP);
dload.add_param("data", "export");
dload.add_param("CabID");
dload.add_param("InvID");
dload.add_param("Tgl_From");
dload.add_param("Tgl_To");
dload.download();
},
produk_brow: function(){
var _isi = new String('<div class="row mb-1"><div class="col"><div class="input-group"><input class="form-control" id="Cari_Produk" placeholder="Kunci Pencarian" type="text"><button class="btn btn-info shadow-none" type="button" id="butSearch">Cari</button><button class="btn btn-secondary shadow-none" type="button" id="butAll">Semua</button></div></div></div><div id="divBrowProduk">&nbsp;</div>');
this.winBProduk = FoniaJS.showWindow('BProduk', 'Daftar Barang', _isi, 900, '', function(){
$('#winBProduk')
.find('#Cari_Produk').keydown(function(e){
var key = e.keyCode || e.which || 0;
if (key==13 && e.target.value!='') this.data_query('brow-produk');
}.bind(this)).end()
.find('#butSearch').click(function(e){
this.data_query('brow-produk');
}.bind(this)).end()
.find('#butAll').click(function(){
$('#winBProduk').find('#Cari_Produk').val('');
this.data_query('brow-produk');
}.bind(this));
this.data_query('brow-produk');
}.bind(this));
},
produk_select: function(acell){
FoniaJS.closeWindow(this.winBProduk);
$('#InvID').val(acell[0]);
$('#Nama_Produk').val(acell[3]);
$('#Tgl_From').focus();
},
data_query: function(tipe){
if (tipe=="brow-produk"){
new Request.JSONF({
url: this.PHP,
sendParam: ['data=brow-produk','Cari_Produk'],
onSuccess: function(){
FoniaJS.setFocus('#Cari_Produk');
}
}).send();
}
},
Produk_Comp: function(item){
$('#InvID').val(item.value);
$('#Tgl_From').focus();
}
};
+80
View File
@@ -0,0 +1,80 @@
/*******************************************************************
Module : /apps/js/sys/about.js
Desc. : JS - Informasi Aplikasi
Created By : Siau Pheng ([email protected]).
Created Date : November 23th, 2011.
Last Modified : May 1st, 2022.
(c) 2011 - 2022, 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
var AboutJS = {
PHP: '',
KODE: '',
loading: function(){
$('#win'+this.KODE).find('#divBuildInfo').html('<p>Aplikasi dibuat dengan komponen :<br>- jQuery Version '+$().jquery+' <br>- Bootstrap Version '+$.fn.tooltip.Constructor.VERSION+' <br>- FoniaJS Version '+FoniaJS.version+' <br>- FoniaPHP Version '+FoniaJS.phpversion+'</p>');
},
proses_checkdb: function(){
new Request({
url: this.PHP,
sendParam: ['data=check_db'],
onSuccess: function(txt){
this.winCheck = FoniaJS.showWindow('CekDB', 'Cek, Perbaiki dan Optimalisasi Database', txt, 500, [{},{i:'butTutup'},{i:'butWProses',v:'Proses DB !',c:'success'}], function(){
$('#winCekDB').find('#butWProses').click(function(){this.checkdb_run();}.bind(this));
}.bind(this));
}.bind(this)
}).send();
},
proses_update: function(){
new Request({
url: this.PHP,
sendParam: ['data=check_update'],
onSuccess: function(txt){
this.winUpdate = FoniaJS.showWindow('CekApp', 'Cek dan Update Aplikasi', txt, 500, [{},{i:'butTutup'},{i:'butWUpdate',v:'Proses Update !',c:'success'}], function(){
$('#winCekApp').find('#butWUpdate').click(function(){this.update_run();}.bind(this));
var tomb = $('#winCekApp').find('#butWUpdate');
if ($('#file_online').val()==1){
tomb.prop('disabled', false);
} else {
tomb.html('Telah Update!').prop('disabled', true);
}
}.bind(this));
}.bind(this)
}).send();
},
checkdb_run: function(){
new Request({
url: this.PHP,
sendParam: ['data=proses_db','DB_Cek','DB_Repair','DB_Opti'],
onSuccess: function(txt){
if ($('#DB_Hasil')) $('#DB_Hasil').removeClass('d-none').html(txt);
FoniaJS.showInfo('Proses Database selesai', 2000);
}
}).send();
},
update_run: function(){
if ($('#file_online')){
if ($('#file_online').val()==1){
new Request.JSON({
url: this.PHP,
sendParam: ['data=proses_update','file_web','file_sql','file_build'],
onSuccess: function(adata){
if (adata.sukses==true) {
FoniaJS.showInfo('Aplikasi telah di Update.<br>Silakan Log Out dari Aplikasi<br>Lalu refresh browser Anda!');
} else {
FoniaJS.showInfo('Aplikasi gagal di Update.');
}
}
}).send();
}
return false;
}
}
};
+55
View File
@@ -0,0 +1,55 @@
/*******************************************************************
Module : /apps/js/sys/chpasswd.js
Desc. : JS - Perubahan Password Operator
Created By : Siau Pheng ([email protected]).
Created Date : December 7th, 2008.
Last Modified : April 25th, 2020.
(c) 2008 - 2020, 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
var SYSChpasswdJS = {
PHP: '',
KODE: '',
loading: function(){
$('#butSave').click(function(){this.proses_save();}.bind(this));
FoniaJS.setFocus('#LPass');
},
proses_save: function(){
if ($("#LPass").val()=="") {
FoniaJS.showInfo("Silakan masukkan password lama Anda!");
FoniaJS.setFocus("#LPass");
return false;
} else if ($("#BPass1").val()=="") {
FoniaJS.showInfo("Silakan masukkan password baru 1 Anda!");
FoniaJS.setFocus("#BPass1");
return false;
} else if ($("#BPass2").val()=="") {
FoniaJS.showInfo("Silakan masukkan password baru 2 Anda!");
FoniaJS.setFocus("#BPass2");
return false;
} else if ($("#BPass1").val()!=$("#BPass2").val()) {
FoniaJS.showInfo("Password baru 1 dan 2 Anda tidak sama!");
FoniaJS.setFocus("#BPass1");
return false;
}
new Request.JSON({
url: this.PHP,
sendParam: ['data=chpasswd','LPass','BPass1','BPass2'],
onSuccess: function(ajson){
if (ajson.status == true) {
FoniaJS.showInfo(ajson.msg);
FoniaJS.closeWindow('#win'+this.KODE);
} else {
FoniaJS.showError(ajson.msg);
}
}.bind(this)
}).send();
}
};
+59
View File
@@ -0,0 +1,59 @@
/*******************************************************************
Module : /apps/js/sys/config.js
Desc. : JS - Konfigurasi Aplikasi
Created By : Siau Pheng ([email protected]).
Created Date : May 25th, 2010.
Last Modified : September 30th, 2025.
(c) 2010 - 2025, 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
var ConfigJS = {
PHP: '',
KODE: '',
loading: function(){
$('#butUbah').click(function(){this.proses_edit();}.bind(this));
$('#butSimpan').click(function(){this.proses_save();}.bind(this));
this.data_query('view');
},
proses_edit: function(){
this.data_query('edit');
},
proses_save: function(){
new Request({
url: this.PHP,
sendParam: ['data=master','mode=save','REG_ID','REG_ADDRESS','REG_CITY','REG_POSTCODE','REG_PHONE','REG_FAX','REG_WEBSITE','REG_EMAIL','REG_OWNER','REG_NPWP'],
onSuccess: function(txt){
$('#divMaster').html(txt);
this.update_event();
}.bind(this)
}).send()
},
data_query: function(mode){
new Request({
url: this.PHP,
sendParam: ['data=master','mode='+mode,'REG_ID'],
onSuccess: function(txt){
$('#divMaster').html(txt);
this.update_event();
}.bind(this)
}).send()
},
update_event: function(){
if ($.inArray($('#mode').val(), ['edit']) >= 0) {
$("#butUbah").prop('disabled', true);
$("#butSimpan").prop('disabled', false);
} else {
$("#butUbah").prop('disabled', false);
$("#butSimpan").prop('disabled', true);
}
}
};
+55
View File
@@ -0,0 +1,55 @@
/*******************************************************************
Module : /apps/js/sys/printer.js
Desc. : JS - Konfigurasi Printer POS
Created By : Siau Pheng ([email protected]).
Created Date : August 4th, 2013.
Last Modified : November 7th, 2025.
(c) 2013 - 2025, 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
var PrinterJS = {
PHP: '',
KODE: '',
loading: function(){
$('#butUbah').click(function(){this.proses_edit();}.bind(this));
$('#butSimpan').click(function(){this.proses_save();}.bind(this));
this.data_query('form-printer');
},
proses_edit: function(){
this.data_query('form-printer', 'edit');
},
proses_save: function(){
this.data_query('form-printer', 'save');
},
data_query: function(tipe, mode){
if (tipe=='form-printer'){
new Request.JSON({
url: this.PHP,
sendParam: ['data=form-printer','mode='+mode,'REG_ID','PRINT_AUTO','PRINT_OPENCD','PRINT_AUTOCUT','PRINT_ROW','TITLE_END'],
onSuccess: function(a){
$('#divPrinter').html(a.html);
this.update_event();
if (a.sukses) FoniaJS.showInfo('Konfigurasi printer sukses disimpan!');
}.bind(this)
}).send();
}
},
update_event: function(){
if ($.inArray($('#mode').val(), ['edit']) >= 0) {
$('#butUbah').prop('disabled', true);
$('#butSimpan').prop('disabled', false);
} else {
$('#butUbah').prop('disabled', false);
$('#butSimpan').prop('disabled', true);
}
}
};
+509
View File
@@ -0,0 +1,509 @@
<?php
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/php/func.iss.php
Desc. : PHP - Fungsi - Fungsi ISS
Created By : Siau Pheng ([email protected]).
Created Date : February 10th, 2012.
Last Modified : January 16th, 2019.
(c) 2012 - 2019, 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
require_once(__DIR__."/../../../../vendor/autoload.php");
use siaupheng\fonia3\DB\MySQL;
use siaupheng\fonia3\DB\SQL;
$fdb = new MySQL();
/************************* BARANG / PRODUK *************************/
function genEAN8($pref = "00", $numb = 1) {
$code = $pref . str_pad($numb, 5, '0', STR_PAD_LEFT);
$bflag = true;
$sum = 0;
for ($i = strlen($code) - 1; $i >= 0; $i--) {
$sum += (int)$code[$i] * ($bflag?3:1);
$bflag = !$bflag;
}
$code .= (10 - ($sum % 10)) % 10;
return $code;
}
function SKU_Baru($id_grup = 0) {
global $fdb;
$tno = "00"; $ino = 0;
$fdb->Query("SELECT Kode_Grup FROM inv_produk_grup WHERE Grup_InvID='".$id_grup."' LIMIT 1");;
if ($fdb->Next()) $tno = isi_nol($fdb->Row("Kode_Grup", "00"), 2);
$fdb->Query("SELECT MAX(MID(Kode_SKU,3,5)) SKU FROM inv_produk_kemasan WHERE LEFT(Kode_SKU,2)='".$tno."'");
if ($fdb->Next()) $ino = intval($fdb->Row("SKU", 0));
return genEAN8($tno, ++$ino);
}
/************************* POS *************************/
function Nomor_POS_Baru($tgl = "", $save = false) {
global $fdb;
$tno = $_SESSION['__APP_INV']['KD_POS'] . date("y") . abjad(date("n"));
if ($tgl <> "") {
$tmp = explode("-", $tgl);
$tno = $_SESSION['__APP_INV']['KD_POS'] . substr($tmp[2],2,2) . abjad(intval($tmp[1]));
}
$tno .= $_SESSION['__WEB_APP']['SERVER_ID'];
$ino = 0;
$fdb->Query("SELECT MAX(RIGHT(No_Jual,5)) Nomor FROM inv_jual WHERE LEFT(No_Jual,".strlen($tno).")='".$tno."'");
if ($fdb->Next()) $ino = intval($fdb->Row("Nomor", 0));
$tno .= isi_nol(++$ino, 5);
if ($save == true) $fdb->Query("INSERT INTO inv_jual SET No_Jual='".$tno."'");
return $tno;
}
function Nomor_Baru($tipe = "B", $tgl = "", $save = false) {
global $fdb;
$atipe = ['O'=>["No_Opname","inv_opname"],'M'=>["No_Mutasi","inv_mutasi"],'B'=>["No_Beli","inv_beli"],'R'=>["No_Beli","inv_beli"],'P'=>["No_PO","inv_po"]];
$tno = $tipe . date("y") . abjad(date("n"));
if ($tgl <> "") {
$tmp = explode("-", $tgl);
$tno = $tipe . substr($tmp[2],2,2) . abjad(intval($tmp[1]));
}
$tno .= $_SESSION['__WEB_APP']['SERVER_ID'];
$ino = 0;
$fdb->Query("SELECT MAX(RIGHT(".$atipe[$tipe][0].",4)) Nomor FROM ".$atipe[$tipe][1]." WHERE LEFT(".$atipe[$tipe][0].",".strlen($tno).")='".$tno."'");
if ($fdb->Next()) $ino = intval($fdb->Row("Nomor", 0));
$tno .= isi_nol(++$ino, 4);
if ($save == true) $fdb->Query("INSERT INTO ".$atipe[$tipe][1]." SET ".$atipe[$tipe][0]."='".$tno."'");
return $tno;
}
function Detail_Copy($no_ref = "", $bunix = false, $ismutasi = false) {
global $fdb;
if ($no_ref == "") return;
Detail_Cancel($no_ref);
$tsql = ($ismutasi == false) ? "" : " AND Qty>0";
$fdb->Query("INSERT INTO tmp_inv_detail (No_Ref,ID,NotaID,CabID,Tgl_Ref,InvID,SatuanID,Qty,Stok,Harga_Beli,Harga_Jual,Disk_Rupiah,Disk_Persen1,Disk_Persen2,Disk_Persen3,Disk_Persen4,Disk_Persen5,Total_Diskon,Promo,UserID,Unix) SELECT No_Ref,ID,NotaID,CabID,Tgl_Ref,InvID,SatuanID,Qty,Stok,Harga_Beli,Harga_Jual,Disk_Rupiah,Disk_Persen1,Disk_Persen2,Disk_Persen3,Disk_Persen4,Disk_Persen5,Total_Diskon,Promo,UserID,'".(($bunix)?user_unix():0)."' FROM inv_detail WHERE No_Ref='".$no_ref."'".$tsql);
}
function Detail_Save($no_ref = "", $id_nota = 0, $id_cab = 0, $stgl = "", $is_baru = false, $no_lama = "", $ismutasi = false, $id_cab2 = 0) {
global $fdb;
if ($no_ref == "") return;
$fdb->Query("DELETE FROM inv_detail WHERE No_Ref='".$no_ref."'");
if ($is_baru) {
Detail_Cancel($no_ref);
$fdb->Query("UPDATE tmp_inv_detail SET No_Ref='".$no_ref."' WHERE No_Ref='".$no_lama."' AND Unix='".user_unix()."'");
}
$qtgl = ($stgl == "") ? "0000-00-00" : tgl_sql2str($stgl);
$fdb->Query("INSERT INTO inv_detail (No_Ref,ID,NotaID,CabID,Tgl_Ref,InvID,SatuanID,Qty,Stok,Harga_Beli,Harga_Jual,Disk_Rupiah,Disk_Persen1,Disk_Persen2,Disk_Persen3,Disk_Persen4,Disk_Persen5,Total_Diskon,Promo,UserID) SELECT No_Ref,ID,'".$id_nota."','".$id_cab."','".$qtgl."',InvID,SatuanID,Qty,Stok,Harga_Beli,Harga_Jual,Disk_Rupiah,Disk_Persen1,Disk_Persen2,Disk_Persen3,Disk_Persen4,Disk_Persen5,Total_Diskon,Promo,UserID FROM tmp_inv_detail WHERE No_Ref='".$no_ref."'");
if ($ismutasi == true) $fdb->Query("INSERT INTO inv_detail (No_Ref,NotaID,CabID,Tgl_Ref,InvID,SatuanID,Qty,Stok,Harga_Beli,Harga_Jual,Disk_Rupiah,Disk_Persen1,Disk_Persen2,Disk_Persen3,Disk_Persen4,Disk_Persen5,Total_Diskon,Promo,UserID) SELECT No_Ref,'".$id_nota."','".$id_cab2."','".$qtgl."',InvID,SatuanID,-Qty,-Stok,Harga_Beli,Harga_Jual,Disk_Rupiah,Disk_Persen1,Disk_Persen2,Disk_Persen3,Disk_Persen4,Disk_Persen5,Total_Diskon,Promo,UserID FROM tmp_inv_detail WHERE No_Ref='".$no_ref."'");
Detail_Cancel($no_ref);
}
function Detail_Cancel($no_ref = "") {
global $fdb;
if ($no_ref == "") return;
$fdb->Query("DELETE FROM tmp_inv_detail WHERE No_Ref='".$no_ref."'");
$fdb->Query("DELETE FROM tmp_inv_detail_lain WHERE No_Ref='".$no_ref."'");
}
/************************* TRANSAKSI PENDING *************************/
function Pending_Edit($nomor = "") {
global $fdb;
$fdb->Query("UPDATE tmp_inv_detail SET Unix='".user_unix()."' WHERE No_Ref='".$nomor."'");
}
function Pending_Save($no_lama = "", $no_baru = "") {
global $fdb;
$fdb->Query("UPDATE tmp_inv_detail SET No_Ref='".$no_baru."' WHERE No_Ref='".$no_lama."' AND Unix='".user_unix()."'");
}
function Pending_Delete($nomor = "") {
global $fdb;
$fdb->Query("DELETE FROM tmp_inv_detail WHERE No_Ref='".$nomor."'");
}
/************************* TRANSAKSI KAS *************************/
function Nomor_Kas_Baru($tipe = "K", $tgl = "", $save = false) {
global $fdb;
$atipe = array('K'=>array("No_Kas","gel_kas"),'G'=>array("No_Gaji","gel_gaji"));
$tno = $tipe . date("y") . abjad(date("n"));
if ($tgl <> "") {
$tmp = explode("-", $tgl);
$tno = $tipe . substr($tmp[2],2,2) . abjad(intval($tmp[1]));
}
$tno .= $_SESSION['__WEB_APP']['SERVER_ID'];
$ino = 0;
$fdb->Query("SELECT MAX(RIGHT(".$atipe[$tipe][0].",4)) Nomor FROM ".$atipe[$tipe][1]." WHERE LEFT(".$atipe[$tipe][0].",".strlen($tno).")='".$tno."'");
if ($fdb->Next()) $ino = $fdb->RowFloat("Nomor", 0);
$tno .= isi_nol($ino+1, 4);
if ($save == true) $fdb->Query("INSERT INTO ".$atipe[$tipe][1]." SET ".$atipe[$tipe][0]."='".$tno."'");
return $tno;
}
/************************* PROMO *************************/
function Promo_Baru() {
global $fdb;
$ino = 1;
$fdb->Query("SELECT MAX(PromoID)+1 Nomor FROM inv_promo");
if ($fdb->Next()) $ino = $fdb->RowFloat("Nomor", 1);
return $ino;
}
function Promo_Hapus($no_nota="", $tgl_nota="") {
global $fdb;
$tdb = new MySQL();
if ($no_nota=="") return false;
$tgl_nota = ($tgl_nota=="") ? tgl_ymd() : tgl_sql2str($tgl_nota);//YYYY-MM-DD
$fdb->Query("SELECT * FROM inv_detail WHERE No_Ref='".$no_nota."' AND Promo IN (1,2,3)");
while ($fdb->Next()) {
$tdb->Query("UPDATE inv_promo SET Jumlah_Proses=Jumlah_Proses-'".abs($fdb->Row("Qty"))."' WHERE Promo_InvID='".$fdb->Row("InvID")."' AND Promo_SatuanID='".$fdb->Row("SatuanID")."' AND CabID IN (0,'".$_SESSION['__APP_INV']['CABANGID']."') AND Tipe_Promo='".$fdb->Row("Promo")."' AND Tgl_Mulai<='".$tgl_nota."' AND Tgl_Akhir>='".$tgl_nota."'");
}
unset($tdb);
}
function Promo_Barang($no_nota="", $tgl_nota="") {
global $fdb;
$tdb = new MySQL();
if ($no_nota=="") return false;
$tgl_nota = ($tgl_nota=="") ? tgl_ymd() : tgl_sql2str($tgl_nota);//YYYY-MM-DD
$apromo = [];
$fdb->Query("SELECT * FROM tmp_inv_detail WHERE No_Ref='".$no_nota."' AND Unix='".user_unix()."' AND Promo IN (1,2)");
while ($fdb->Next()) {
$tdb->Query("UPDATE inv_promo SET Jumlah_Proses=Jumlah_Proses-'".abs($fdb->Row("Qty"))."' WHERE Promo_InvID='".$fdb->Row("InvID")."' AND Promo_SatuanID='".$fdb->Row("SatuanID")."' AND CabID IN (0,'".$_SESSION['__APP_INV']['CABANGID']."') AND Tipe_Promo='".$fdb->Row("Promo")."' AND Tgl_Mulai<='".$tgl_nota."' AND Tgl_Akhir>='".$tgl_nota."'");
if ($fdb->Row("Promo")==1) $tdb->Query("UPDATE tmp_inv_detail SET Disk_Rupiah=0,Total_Diskon=0,Promo=0 WHERE No_Ref='".$no_nota."' AND Unix='".user_unix()."' AND ID='".$fdb->Row("ID")."'");
if ($fdb->Row("Promo")==2) $tdb->Query("DELETE FROM tmp_inv_detail WHERE No_Ref='".$no_nota."' AND Unix='".user_unix()."' AND ID='".$fdb->Row("ID")."'");
}
$fdb->Query("SELECT *,(Jumlah_Promo-Jumlah_Proses) Jumlah_Sisa FROM inv_promo WHERE Aktif=1 AND CabID IN (0,'".$_SESSION['__APP_INV']['CABANGID']."') AND Tipe_Promo IN (1,2) AND (Jumlah_Promo-Jumlah_Proses)>0 AND Tgl_Mulai<='".$tgl_nota."' AND Tgl_Akhir>='".$tgl_nota."' AND CONCAT(InvID,':',SatuanID) IN (SELECT CONCAT(InvID,':',SatuanID) FROM tmp_inv_detail WHERE No_Ref='".$no_nota."' AND Unix='".user_unix()."')");
if ($fdb->RecordCount()==0) return false;
while ($fdb->Next()) $apromo[] = $fdb->AllRow();
foreach($apromo as $_key => $val) {
if ($val['Tipe_Promo']==1) {//1 potongan diskon
$adetail = []; $aitem = [];
$fdb->Query("SELECT COUNT(*) Item,SUM(-Qty) Qty,ID FROM tmp_inv_detail WHERE No_Ref='".$no_nota."' AND Unix='".user_unix()."' AND InvID='".$val['InvID']."' AND SatuanID='".$val['SatuanID']."' ORDER BY ID");
if ($fdb->Next()) $adetail = $fdb->AllRow();
$fdb->Query("SELECT * FROM tmp_inv_detail WHERE No_Ref='".$no_nota."' AND Unix='".user_unix()."' AND InvID='".$val['InvID']."' AND SatuanID='".$val['SatuanID']."' AND ID='".$adetail['ID']."'");
if ($fdb->Next()) $aitem = $fdb->AllRow();
$bpromo = false;
if ($val['Pilih_Qty']==1 && $val['Qty_Min']<=$adetail['Qty']) {//minimum & masuk limit
$bpromo = true;
$qty_promo = ($adetail['Qty']<=$val['Jumlah_Sisa']) ? $adetail['Qty'] : $val['Jumlah_Sisa'];
} else if ($val['Pilih_Qty']==2 && $val['Qty_Kali']<=$adetail['Qty']) {//kelipatan
$bpromo = true;
$qty_promo = floor($adetail['Qty']/$val['Qty_Kali']) * $val['Qty_Kali'];
$qty_promo = ($qty_promo<=$val['Jumlah_Sisa']) ? $qty_promo : $val['Jumlah_Sisa'];
}
if ($bpromo == true) {
if ($adetail['Item']>1) {//hapus duplikasi
$tdb->Query("DELETE FROM tmp_inv_detail WHERE No_Ref='".$no_nota."' AND Unix='".user_unix()."' AND InvID='".$val['InvID']."' AND SatuanID='".$val['SatuanID']."' AND ID<>'".$adetail['ID']."'");
}
$istok = $aitem['Stok'] / $aitem['Qty'];
if ($qty_promo==$adetail['Qty']) {
$aitem['Qty'] = $qty_promo * -1;
$aitem['Stok'] = $qty_promo * $istok * -1;
$aitem['Disk_Rupiah'] = $val['Promo_Disc'];
$aitem['Total_Diskon'] = $qty_promo * $val['Promo_Disc'];
$aitem['Promo'] = 1;
fastUpdate("tmp_inv_detail", $aitem, array("No_Ref","Unix","ID"));
} else {
$adisc = $aitem;
$aitem['Qty'] = ($adetail['Qty']-$qty_promo) * -1;
$aitem['Stok'] = ($adetail['Qty']-$qty_promo) * $istok * -1;
fastUpdate("tmp_inv_detail", $aitem, ["No_Ref","Unix","ID"]);
$adisc['Qty'] = $qty_promo * -1;
$adisc['Stok'] = $qty_promo * $istok * -1;
$adisc['Disk_Rupiah'] = $val['Promo_Disc'];
$adisc['Total_Diskon'] = $qty_promo * $val['Promo_Disc'];
$adisc['Promo'] = 1;
unset($adisc['ID']);
fastInsert("tmp_inv_detail", $adisc);
}
$tdb->Query("UPDATE inv_promo SET Jumlah_Proses=Jumlah_Proses+".$qty_promo." WHERE PromoID='".$val['PromoID']."'");
}
} else {//2 promo barang
$adetail = []; $adisc = [];
$fdb->Query("SELECT COUNT(*) Item,SUM(-Qty) Qty,ID FROM tmp_inv_detail WHERE No_Ref='".$no_nota."' AND Unix='".user_unix()."' AND InvID='".$val['InvID']."' AND SatuanID='".$val['SatuanID']."' ORDER BY ID");
if ($fdb->Next()) $adetail = $fdb->AllRow();
$fdb->Query("SELECT * FROM tmp_inv_detail WHERE No_Ref='".$no_nota."' AND Unix='".user_unix()."' AND InvID='".$val['InvID']."' AND SatuanID='".$val['SatuanID']."' AND ID='".$adetail['ID']."'");
if ($fdb->Next()) $adisc = $fdb->AllRow();
$bpromo = false;
if ($val['Pilih_Qty']==1 && $val['Qty_Min']<=$adetail['Qty']) {//minimum & masuk limit
$bpromo = true;
$qty_promo = ($val['Promo_Qty']<=$val['Jumlah_Sisa']) ? $val['Promo_Qty'] : $val['Jumlah_Sisa'];
} else if ($val['Pilih_Qty']==2 && $val['Qty_Kali']<=$adetail['Qty']) {//kelipatan
$bpromo = true;
$qty_promo = floor($adetail['Qty']/$val['Qty_Kali']) * $val['Promo_Qty'];
$qty_promo = ($qty_promo<=$val['Jumlah_Sisa']) ? $qty_promo : $val['Jumlah_Sisa'];
}
if ($bpromo == true && $qty_promo>0) {
$fdb->Query("SELECT P.InvID,P.SatuanID,P.Qty,P.Harga_Pokok,P.Harga_Jual FROM vi_inv_produk P WHERE P.InvID='".$val['Promo_InvID']."' AND P.SatuanID='".$val['Promo_SatuanID']."' LIMIT 1");
if ($fdb->Next()) {
$adisc['InvID'] = $val['Promo_InvID'];
$adisc['SatuanID'] = $val['Promo_SatuanID'];
$adisc['Qty'] = $qty_promo * -1;
$adisc['Stok'] = $qty_promo * $fdb->Row("Qty", 1) * -1;
$adisc['Harga_Beli'] = $fdb->Row("Harga_Pokok", 0);
$adisc['Harga_Jual'] = $fdb->Row("Harga_Jual", 0);
$adisc['Disk_Rupiah'] = $adisc['Harga_Jual'];
$adisc['Total_Diskon'] = $qty_promo * $adisc['Harga_Jual'];
$adisc['Promo'] = 2;
unset($adisc['ID']);
fastInsert("tmp_inv_detail", $adisc);
}
$tdb->Query("UPDATE inv_promo SET Jumlah_Proses=Jumlah_Proses+".$qty_promo." WHERE PromoID='".$val['PromoID']."'");
}
}
}
unset($tdb);
}
function Promo_Total($no_nota="", $tgl_nota="") {
global $fdb;
$tdb = new MySQL();
if ($no_nota=="") return false;
$tgl_nota = ($tgl_nota=="") ? tgl_ymd() : tgl_sql2str($tgl_nota);//YYYY-MM-DD
$apromo = [];
$fdb->Query("SELECT * FROM tmp_inv_detail WHERE No_Ref='".$no_nota."' AND Unix='".user_unix()."' AND Promo IN (3,4)");
while ($fdb->Next()) {
$tdb->Query("UPDATE inv_promo SET Jumlah_Proses=Jumlah_Proses-'".abs($fdb->Row("Qty"))."' WHERE Promo_InvID='".$fdb->Row("InvID")."' AND Promo_SatuanID='".$fdb->Row("SatuanID")."' AND CabID IN (0,'".$_SESSION['__APP_INV']['CABANGID']."') AND Tipe_Promo='".$fdb->Row("Promo")."' AND Tgl_Mulai<='".$tgl_nota."' AND Tgl_Akhir>='".$tgl_nota."'");
if ($fdb->Row("Promo")==3) $tdb->Query("DELETE FROM tmp_inv_detail WHERE No_Ref='".$no_nota."' AND Unix='".user_unix()."' AND ID='".$fdb->Row("ID")."'");
}
$fdb->Query("SELECT *,(Jumlah_Promo-Jumlah_Proses) Jumlah_Sisa FROM inv_promo WHERE Aktif=1 AND CabID IN (0,'".$_SESSION['__APP_INV']['CABANGID']."') AND Tipe_Promo IN (3,4) AND Tgl_Mulai<='".$tgl_nota."' AND Tgl_Akhir>='".$tgl_nota."' ORDER BY Jual_Min DESC");
if ($fdb->RecordCount()==0) return false;
while ($fdb->Next()) $apromo[] = $fdb->AllRow();
$tot_potong = 0;
foreach($apromo as $_key => $val) {
$tot_jual = 0;
$tdb->Query("SELECT SUM((-D.Qty*D.Harga_Jual)+D.Total_Diskon) Total FROM tmp_inv_detail D LEFT JOIN (SELECT P.InvID,P.Grup_InvID FROM inv_produk P WHERE P.Grup_InvID IN (".$val['Jual_Grup'].")) P ON (P.InvID=D.InvID) WHERE D.No_Ref='".$no_nota."' AND D.Unix='".user_unix()."' AND P.Grup_InvID IN (".$val['Jual_Grup'].")");
if ($tdb->Next()) $tot_jual = $tdb->RowFloat("Total", 0);
if ($tot_jual < $val['Jual_Min']) continue;
if ($val['Tipe_Promo']==4) {//4 potongan diskon
$tot_potong += $val['Promo_Jual'];
} else {//3 promo barang
$qty_promo = ($val['Promo_Qty']<=$val['Jumlah_Sisa']) ? $val['Promo_Qty'] : $val['Jumlah_Sisa'];
if ($qty_promo == 0) continue;
$adisc = [];
$fdb->Query("SELECT * FROM tmp_inv_detail WHERE No_Ref='".$no_nota."' AND Unix='".user_unix()."' LIMIT 1");
if ($fdb->Next()) $adisc = $fdb->AllRow();
$fdb->Query("SELECT P.InvID,P.SatuanID,P.Qty,P.Harga_Pokok,P.Harga_Jual FROM vi_inv_produk P WHERE P.InvID='".$val['Promo_InvID']."' AND P.SatuanID='".$val['Promo_SatuanID']."' LIMIT 1");
if ($fdb->Next()) {
$adisc['InvID'] = $val['Promo_InvID'];
$adisc['SatuanID'] = $val['Promo_SatuanID'];
$adisc['Qty'] = $qty_promo * -1;
$adisc['Stok'] = $qty_promo * $fdb->Row("Qty", 1) * -1;
$adisc['Harga_Beli'] = $fdb->Row("Harga_Pokok", 0);
$adisc['Harga_Jual'] = $fdb->Row("Harga_Jual", 0);
$adisc['Disk_Rupiah'] = $fdb->Row("Harga_Jual", 0);
$adisc['Total_Diskon'] = $qty_promo * $fdb->Row("Harga_Jual", 0);
$adisc['Promo'] = 3;
unset($adisc['ID']);
$tdb->Query("DELETE FROM tmp_inv_detail WHERE No_Ref='".$no_nota."' AND InvID='".$val['Promo_InvID']."' AND SatuanID='".$val['Promo_SatuanID']."' AND Qty='".($qty_promo * -1)."' AND Promo IN (0,3)");
fastInsert("tmp_inv_detail", $adisc);
}
$tdb->Query("UPDATE inv_promo SET Jumlah_Proses=Jumlah_Proses+".$qty_promo." WHERE PromoID='".$val['PromoID']."'");
}
//break;//todo: pastikan jika beda group barang di pisahkan!!
}
unset($tdb);
return $tot_potong;
}
function Promo_Hitung($no_nota="", $tgl_nota="") {
global $fdb;
$tdb = new MySQL();
if ($no_nota=="") return false;
$tgl_nota = ($tgl_nota=="") ? tgl_ymd() : tgl_sql2str($tgl_nota);//YYYY-MM-DD
$tot_promo = 0;
$apromo = [];
$fdb->Query("SELECT *,(Jumlah_Promo-Jumlah_Proses) Jumlah_Sisa FROM inv_promo WHERE Aktif=1 AND CabID IN (0,'".$_SESSION['__APP_INV']['CABANGID']."') AND Tipe_Promo=1 AND (Jumlah_Promo-Jumlah_Proses)>0 AND Tgl_Mulai<='".$tgl_nota."' AND Tgl_Akhir>='".$tgl_nota."' AND CONCAT(InvID,':',SatuanID) IN (SELECT CONCAT(InvID,':',SatuanID) FROM tmp_inv_detail WHERE No_Ref='".$no_nota."' AND Unix='".user_unix()."' AND Promo NOT IN (2,3))");
if ($fdb->RecordCount()>0) {
while ($fdb->Next()) $apromo[] = $fdb->AllRow();
foreach($apromo as $_key => $val) {
$adetail = $aitem = array();
$fdb->Query("SELECT COUNT(*) Item,SUM(-Qty) Qty,ID FROM tmp_inv_detail WHERE No_Ref='".$no_nota."' AND Unix='".user_unix()."' AND InvID='".$val['InvID']."' AND SatuanID='".$val['SatuanID']."' ORDER BY ID");
if ($fdb->Next()) $adetail = $fdb->AllRow();
$fdb->Query("SELECT * FROM tmp_inv_detail WHERE No_Ref='".$no_nota."' AND Unix='".user_unix()."' AND InvID='".$val['InvID']."' AND SatuanID='".$val['SatuanID']."' AND ID='".$adetail['ID']."'");
if ($fdb->Next()) $aitem = $fdb->AllRow();
$bpromo = false;
if ($val['Pilih_Qty']==1 && $val['Qty_Min']<=$adetail['Qty']) {//minimum & masuk limit
$bpromo = true;
$qty_promo = ($adetail['Qty']<=$val['Jumlah_Sisa']) ? $adetail['Qty'] : $val['Jumlah_Sisa'];
} else if ($val['Pilih_Qty']==2 && $val['Qty_Kali']<=$adetail['Qty']) {//kelipatan
$bpromo = true;
$qty_promo = floor($adetail['Qty']/$val['Qty_Kali']) * $val['Qty_Kali'];
$qty_promo = ($qty_promo<=$val['Jumlah_Sisa']) ? $qty_promo : $val['Jumlah_Sisa'];
}
$tot_promo += ($bpromo == true) ? ($qty_promo * $val['Promo_Disc']) : 0;
}
}
$apromo = [];
$fdb->Query("SELECT *,(Jumlah_Promo-Jumlah_Proses) Jumlah_Sisa FROM inv_promo WHERE Aktif=1 AND CabID IN (0,'".$_SESSION['__APP_INV']['CABANGID']."') AND Tipe_Promo=4 AND Tgl_Mulai<='".$tgl_nota."' AND Tgl_Akhir>='".$tgl_nota."' ORDER BY Jual_Min DESC");
if ($fdb->RecordCount()>0) {
while ($fdb->Next()) $apromo[] = $fdb->AllRow();
$tot_potong = 0;
foreach($apromo as $_key => $val) {
$tot_jual = 0;
$tdb->Query("SELECT SUM((-D.Qty*D.Harga_Jual)+D.Total_Diskon) Total FROM tmp_inv_detail D LEFT JOIN (SELECT P.InvID,P.Grup_InvID FROM inv_produk P WHERE P.Grup_InvID IN (".$val['Jual_Grup'].")) P ON (P.InvID=D.InvID) WHERE D.No_Ref='".$no_nota."' AND D.Unix='".user_unix()."' AND P.Grup_InvID IN (".$val['Jual_Grup'].")");
if ($tdb->Next()) $tot_jual = $tdb->RowFloat("Total", 0);
if ($tot_jual < $val['Jual_Min']) continue;
$tot_promo += $val['Promo_Jual'];
break;
}
}
unset($tdb);
return $tot_promo;
}
function Promo_Nota_Hapus($no_nota="") {
global $fdb;
if ($no_nota=="") return false;
$ajual = [];
$fdb->Query("SELECT * FROM inv_jual WHERE No_Jual='".$no_nota."' LIMIT 1");
if ($fdb->Next()) $ajual = $fdb->AllRow();
if (($ajual['PromoNotaID'] ?? 0) > 0) {
$fdb->Query("UPDATE inv_promo_nota SET Jumlah_Proses=Jumlah_Proses-1 WHERE PromoNotaID='".$ajual['PromoNotaID']."' LIMIT 1");
}
}
function Promo_Nota_Proses($no_nota="", $tgl_nota="") {
global $fdb;
if ($no_nota=="") return false;
$tgl_nota = ($tgl_nota=="") ? tgl_ymd() : tgl_sql2str($tgl_nota);//YYYY-MM-DD
$apromo = [];
$fdb->Query("SELECT *,(Jumlah_Promo-Jumlah_Proses) Jumlah_Sisa FROM inv_promo_nota WHERE Aktif=1 AND CabID IN (0,'".$_SESSION['__APP_INV']['CABANGID']."') AND Tipe_Promo=1 AND (Jumlah_Promo-Jumlah_Proses)>0 AND Tgl_Mulai<='".$tgl_nota."' AND Tgl_Akhir>='".$tgl_nota."' ORDER BY Jual_Min ASC LIMIT 1");
if ($fdb->Next()) $apromo = $fdb->AllRow();
if (count($apromo) > 0) {
$ajual = [];
$fdb->Query("SELECT * FROM inv_jual WHERE No_Jual='".$no_nota."' LIMIT 1");
if ($fdb->Next()) $ajual = $fdb->AllRow();
if ($apromo['Jual_Min'] <= $ajual['Total_Jual']) {
$bpromo = true;
if ($apromo['Jual_Grup'] <> "") {
$tot_jual = 0;
$fdb->Query("SELECT SUM((-Qty*Harga_Jual)+Total_Diskon) Total FROM inv_detail WHERE No_Ref='".$no_nota."' AND InvID IN (SELECT InvID FROM inv_produk WHERE Grup_InvID IN (".($apromo['Jual_Grup']??"0")."))");
if ($fdb->Next()) $tot_jual = $fdb->RowFloat("Total", 0);
if ($tot_jual < $val['Jual_Min']) $bpromo = false;
}
if ($bpromo == true) {
$fdb->Query("UPDATE inv_jual SET PromoNotaID='".$apromo['PromoNotaID']."' WHERE No_Jual='".$no_nota."' LIMIT 1");
$fdb->Query("UPDATE inv_promo_nota SET Jumlah_Proses=Jumlah_Proses+1 WHERE PromoNotaID='".$apromo['PromoNotaID']."' LIMIT 1");
}
}
}
}
/************************* FORMAT TAMPILAN DATA *************************/
function Report_Header($tlapor="", $tperiod="") {
$thasil = '<div style="text-align:center;font-size:12pt;"><b>'.strtoupper($_SESSION['__WEB_APP']['REG_NAME']);
$thasil .= (($tlapor=="") ? "" : '<br>'.$tlapor) . '</b>';
$thasil .= ($tperiod=="") ? "" : '<br><span style="font-size:11pt;">'.$tperiod.'</span>';
$thasil .= '</div><br>';
echo $thasil;
}
function Report_Stamp($ctk_ke=1, $bnama=false) {
return $_SESSION['__WEB_APP']['APP_NAME']."v".$_SESSION['__WEB_APP']['APP_VER'].date("\@ymd.His")."-".user_id(3).(($bnama==true)?"/".strtoupper(user_user()):"").(($ctk_ke>0)?"#".isi_nol($ctk_ke,2):"");
}
function Format_Stok($total=0, $kali=1, $sat_norm="", $sat_stok="") {
if ($kali > 0) {
$norm = floor($total / $kali);
$sisa = $total - ($norm * $kali);
} else {
$norm = 0;
$sisa = $total;
}
$stok = uang($norm,0)." ".$sat_norm;
if ($sat_norm<>$sat_stok) $stok .= ", ".uang($sisa,0)." ".$sat_stok;
return $stok;
}
/************************* DATA MANIPULATION FUNCTION *************************/
function fastQuery($qry = "", $defval = "") {
global $fdb;
if ($qry=="") return false;
$fdb->Query($qry);
if (!$fdb->Next()) {
if ($defval!=="") return $defval;
return true;
}
$tmp_value = array_values($fdb->AllRow());
$tmp_value = $tmp_value[0] ? $tmp_value[0] : "";
if (trim($tmp_value)=="" && $defval!=="") return $defval;
return $tmp_value;
}
function fastQueryArray($qry = "", $defval = "") {
global $fdb;
$ahasil = array();
if ($qry=="") return $ahasil;
$fdb->Query($qry);
if ($fdb->RecordCount()==0) {
if ($defval!=="") $ahasil[] = $defval;
return $ahasil;
}
while ($fdb->Next()) {
$tmp_value = array_values($fdb->AllRow());
$ahasil[] = (trim($tmp_value[0])=="" && $defval!=="") ? $defval : $tmp_value[0];
}
return $ahasil;
}
function fastInsert($nama_tabel = "", $adata = array()) {//up:2014-09-29
global $fdb;
if ($nama_tabel=="") return false;
$txt = "";
foreach ($adata as $_key => $_val) {
$txt .= "," . $_key . "='" . $_val . "'";
}
$fdb->Query("INSERT IGNORE INTO ".$nama_tabel." SET ".substr($txt,1));
return true;
}
function fastUpdate($nama_tabel = "", $adata = [], $awhere = []) {
global $fdb;
if ($nama_tabel=="") return false;
$txt = $whr = "";
foreach ($adata as $_key => $_val) {
if (in_array($_key, $awhere)) continue;
$txt .= "," . $_key . "='" . $_val . "'";
}
foreach ($awhere as $_key => $_val) {
$whr .= " AND " . $_val . "='" . $adata[$_val] . "'";
}
$fdb->Query("UPDATE ".$nama_tabel." SET ".substr($txt,1)." WHERE ".substr($whr,4));
return true;
}
function Form_Info($pesan="") {
return '<button class="btn btn-outline-secondary shadow-none text-info" title="'.$pesan.'"><i class="bi-lightbulb"></i></button>';
}
?>
+143
View File
@@ -0,0 +1,143 @@
<?php
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/php/gel/keluar.php
Desc. : PHP - Transaksi Pengeluaran Kas
Created By : Siau Pheng (siaupheng@3fonia.com).
Created Date : April 23rd, 2013.
Last Modified : September 29th, 2025.
(c) 2013 - 2025, 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
require_once(__DIR__."/../../../../../vendor/autoload.php");
require_once(__DIR__."/../func.iss.php");
use siaupheng\fonia3\DB\MySQL;
use siaupheng\fonia3\DB\SQL;
use siaupheng\fonia3\Web\Param;
use siaupheng\fonia3\Web\Table;
use siaupheng\fonia3\Web\Form;
$db = $db ?? new MySQL();
$ajson = [];
$data = Param::Get("data");
$mode = Param::Get("mode", "view");
$mode_detail = Param::Get("mode_detail");
$id_cab = Param::Get("CabID", $_SESSION['__APP_INV']['CABANGID']);
$nomor = Param::Get("No_Kas", "");
if ( $data == "master" ) {
} else if ( $data == "tabel-detail" ) {
if (in_array($mode_detail, ["insert","update","delete"])) {
$sql = new SQL($db);
$sql->set_table("gel_kas");
$sql->add_param_date("Tgl_Kas");
$sql->add_param("CabID");
$sql->add_param("TXID");
$sql->add_param("Jumlah");
$sql->add_param("Ket");
$sql->add_param_userid();
$sql->add_where("No_Kas");
if ( $mode_detail == "insert" ) {
$nomor = Nomor_Kas_Baru("K", Param::Get("Tgl_Kas"), false);
$sql->add_param("No_Kas", $nomor);
$sql->add_param("Tipe_Kas", "O");
$sql->InsertDB();
} else if ( $mode_detail == "update" ) {
$sql->UpdateDB();
} else if ( $mode_detail == "delete" ) {
$sql->DeleteDB();
}
}
$obj = new Table($db);
$obj->set_query("SELECT * FROM gel_kas WHERE Tipe_Kas='O' AND CabID='".$id_cab."'");//todo: glamore kunci cabang
$obj->add_field("No_Kas", "No. Trans", "c");
$obj->add_field("Tgl_Kas", "Tanggal", "c", "sqltgl");
$obj->add_field("Ket", "Keterangan", "awr");
$obj->add_field("Jumlah", "Jumlah", "r", "rupiah");
$obj->set_field_order("No_Kas", "A");
$obj->add_row_btn("clipboard", "Ubah", "KasKeluarJS.tx_ubah");
if (user_level(1)) $obj->add_row_btn("trash", "Hapus", "KasKeluarJS.tx_hapus");
$obj->set_func_navi("KasKeluarJS.data_query('tabel-detail')");
$ajson[] = $obj->json_table("divDetailTabel");
} else if ($data == "detail-tx") {
$ajson = ['error'=>"", 'html'=>""];
$atabel = ['No_Kas'=>$nomor, 'CabID'=>$id_cab, 'TXID'=>0, 'Jumlah'=>0];
if ($mode_detail == "insert") {
$atabel['No_Kas'] = "GO-BARU#".$_SESSION['__WEB_APP']['SERVER_ID'].user_id(3);
$atabel['Tgl_Kas'] = tgl_ymd();
} else {
//todo : pencarian hanya pada cabang terkait
//untuk robinson abaikan filter cabang
$db->Query("SELECT * FROM gel_kas WHERE Tipe_Kas='O' AND CabID='".$id_cab."' AND No_Kas='".$nomor."'");
if (!$db->Next()) {
$ajson['error'] = "Nomor Transaksi belum ada / tidak diketemukan !";
} else $atabel = array_merge($atabel, $db->AllRow());
}
$form = new Form($db);
$tnota = $form->textbox("_", "No_Kas", $atabel['No_Kas'], false, false, "text");
$ttgl = $form->datebox("_", "Tgl_Kas", $atabel['Tgl_Kas'], true, false);
$tcab = $form->option_db("_", "CabID", $atabel['CabID'], false, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID", [0,"&nbsp;"]);//todo: glamore kunci cabang
$ttx = $form->option_db("_", "TXID", $atabel['TXID'], true, false, "para_tx", ["TXID","Nama_TX"], "Grup_TX='O' AND Aktif=1 ORDER BY Nama_TX", [0,"&nbsp;"]);
$tjumlah = $form->textbox("_", "Jumlah", $atabel['Jumlah'], true, false, "double");
$tket = $form->textarea("_", "Ket", $atabel['Ket'], true, false, 2);
$ajson['html'] = '
<div class="row mb-1">
<label class="col-sm-5 col-lg-3 col-form-label" for="No_Kas">Nomor Transaksi</label>
<div class="col-sm-7 col-lg-5">'.$tnota.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-5 col-lg-3 col-form-label" for="Tgl_Kas">Tanggal Transaksi</label>
<div class="col-sm-7 col-lg-5">'.$ttgl.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-5 col-lg-3 col-form-label" for="CabID">Nama Cabang</label>
<div class="col">'.$tcab.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-5 col-lg-3 col-form-label" for="TXID">Jenis Transaksi</label>
<div class="col">'.$ttx.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-5 col-lg-3 col-form-label" for="Ket">Keterangan</label>
<div class="col">'.$tket.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-5 col-lg-3 col-form-label" for="Jumlah">Jumlah</label>
<div class="col-sm-7 col-lg-5">'.$tjumlah.'</div>
</div>
<input type="hidden" id="mode_detail" value="'.$mode_detail.'" >';
} else if ( $data == "default") {
echo '
<div class="fade-in">
<div class="card"><div class="card-body">
<ul class="nav nav-tabs" role="tablist">
<li class="nav-item" role="presentation">
<button class="nav-link active" id="tx-tab" data-bs-toggle="tab" data-bs-target="#tx" type="button" role="tab" aria-controls="tx" aria-selected="true"><i class="bi-database me-2"></i>Transaksi Pengeluaran Kas</button>
</li>
<li class="nav-item ms-auto">
<button class="btn btn-primary mb-1 ms-2" id="butTambah" type="button"><i class="bi-plus-lg me-2"></i>Tambah</button>
<button class="btn btn-secondary mb-1 ms-2 d-none" id="butCari" type="button"><i class="bi-search me-2"></i>Cari</button>
</li>
</ul>
<div class="tab-content border border-top-0 p-3">
<div class="tab-pane fade active show" id="tx" role="tabpanel" aria-labelledby="tx-tab">
<div id="divDetailTabel">&nbsp;</div>
</div>
</div>
</div></div>
</div>';
}
send_json($ajson);
?>
+143
View File
@@ -0,0 +1,143 @@
<?php
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/php/gel/terima.php
Desc. : PHP - Transaksi Penerimaan Kas
Created By : Siau Pheng (siaupheng@3fonia.com).
Created Date : April 23rd, 2013.
Last Modified : September 29th, 2025.
(c) 2013 - 2025, 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
require_once(__DIR__."/../../../../../vendor/autoload.php");
require_once(__DIR__."/../func.iss.php");
use siaupheng\fonia3\DB\MySQL;
use siaupheng\fonia3\DB\SQL;
use siaupheng\fonia3\Web\Param;
use siaupheng\fonia3\Web\Table;
use siaupheng\fonia3\Web\Form;
$db = $db ?? new MySQL();
$ajson = [];
$data = Param::Get("data");
$mode = Param::Get("mode", "view");
$mode_detail = Param::Get("mode_detail");
$id_cab = Param::Get("CabID", $_SESSION['__APP_INV']['CABANGID']);
$nomor = Param::Get("No_Kas", "");
if ( $data == "master" ) {
} else if ( $data == "tabel-detail" ) {
if (in_array($mode_detail, ["insert","update","delete"])) {
$sql = new SQL($db);
$sql->set_table("gel_kas");
$sql->add_param_date("Tgl_Kas");
$sql->add_param("CabID");
$sql->add_param("TXID");
$sql->add_param("Jumlah");
$sql->add_param("Ket");
$sql->add_param_userid();
$sql->add_where("No_Kas");
if ( $mode_detail == "insert" ) {
$nomor = Nomor_Kas_Baru("K", Param::Get("Tgl_Kas"), false);
$sql->add_param("No_Kas", $nomor);
$sql->add_param("Tipe_Kas", "I");
$sql->InsertDB();
} else if ( $mode_detail == "update" ) {
$sql->UpdateDB();
} else if ( $mode_detail == "delete" ) {
$sql->DeleteDB();
}
}
$obj = new Table($db);
$obj->set_query("SELECT * FROM gel_kas WHERE Tipe_Kas='I' AND CabID='".$id_cab."'");//todo: glamore kunci cabang
$obj->add_field("No_Kas", "No. Trans", "c");
$obj->add_field("Tgl_Kas", "Tanggal", "c", "sqltgl");
$obj->add_field("Ket", "Keterangan", "awr");
$obj->add_field("Jumlah", "Jumlah", "r", "rupiah");
$obj->set_field_order("No_Kas", "A");
$obj->add_row_btn("clipboard", "Ubah", "KasTerimaJS.tx_ubah");
if (user_level(1)) $obj->add_row_btn("trash", "Hapus", "KasTerimaJS.tx_hapus");
$obj->set_func_navi("KasTerimaJS.data_query('tabel-detail')");
$ajson[] = $obj->json_table("divDetailTabel");
} else if ($data == "detail-tx") {
$ajson = ['error'=>"", 'html'=>""];
$atabel = ['No_Kas'=>$nomor, 'CabID'=>$id_cab, 'TXID'=>0, 'Jumlah'=>0];
if ($mode_detail == "insert") {
$atabel['No_Kas'] = "GI-BARU#".$_SESSION['__WEB_APP']['SERVER_ID'].user_id(3);
$atabel['Tgl_Kas'] = tgl_ymd();
} else {
//todo : pencarian hanya pada cabang terkait
//untuk robinson abaikan filter cabang
$db->Query("SELECT * FROM gel_kas WHERE Tipe_Kas='I' AND CabID='".$id_cab."' AND No_Kas='".$nomor."'");
if (!$db->Next()) {
$ajson['error'] = "Nomor Transaksi belum ada / tidak diketemukan !";
} else $atabel = array_merge($atabel, $db->AllRow());
}
$form = new Form($db);
$tnota = $form->textbox("_", "No_Kas", $atabel['No_Kas'], false, false, "text");
$ttgl = $form->datebox("_", "Tgl_Kas", $atabel['Tgl_Kas'], true, false);
$tcab = $form->option_db("_", "CabID", $atabel['CabID'], false, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID", [0,"&nbsp;"]);//todo: glamore kunci cabang
$ttx = $form->option_db("_", "TXID", $atabel['TXID'], true, false, "para_tx", ["TXID","Nama_TX"], "Grup_TX='I' AND Aktif=1 ORDER BY Nama_TX", [0,"&nbsp;"]);
$tjumlah = $form->textbox("_", "Jumlah", $atabel['Jumlah'], true, false, "double");
$tket = $form->textarea("_", "Ket", $atabel['Ket'], true, false, 2);
$ajson['html'] = '
<div class="row mb-1">
<label class="col-sm-5 col-lg-3 col-form-label" for="No_Kas">Nomor Transaksi</label>
<div class="col-sm-7 col-lg-5">'.$tnota.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-5 col-lg-3 col-form-label" for="Tgl_Kas">Tanggal Transaksi</label>
<div class="col-sm-7 col-lg-5">'.$ttgl.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-5 col-lg-3 col-form-label" for="CabID">Nama Cabang</label>
<div class="col">'.$tcab.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-5 col-lg-3 col-form-label" for="TXID">Jenis Transaksi</label>
<div class="col">'.$ttx.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-5 col-lg-3 col-form-label" for="Ket">Keterangan</label>
<div class="col">'.$tket.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-5 col-lg-3 col-form-label" for="Jumlah">Jumlah</label>
<div class="col-sm-7 col-lg-5">'.$tjumlah.'</div>
</div>
<input type="hidden" id="mode_detail" value="'.$mode_detail.'" >';
} else if ( $data == "default") {
echo '
<div class="fade-in">
<div class="card"><div class="card-body">
<ul class="nav nav-tabs" role="tablist">
<li class="nav-item" role="presentation">
<button class="nav-link active" id="tx-tab" data-bs-toggle="tab" data-bs-target="#tx" type="button" role="tab" aria-controls="tx" aria-selected="true"><i class="bi-database me-2"></i>Transaksi Penerimaan Kas</button>
</li>
<li class="nav-item ms-auto">
<button class="btn btn-primary mb-1 ms-2" id="butTambah" type="button"><i class="bi-plus-lg me-2"></i>Tambah</button>
<button class="btn btn-secondary mb-1 ms-2 d-none" id="butCari" type="button"><i class="bi-search me-2"></i>Cari</button>
</li>
</ul>
<div class="tab-content border border-top-0 p-3">
<div class="tab-pane fade active show" id="tx" role="tabpanel" aria-labelledby="tx-tab">
<div id="divDetailTabel">&nbsp;</div>
</div>
</div>
</div></div>
</div>';
}
send_json($ajson);
?>
+126
View File
@@ -0,0 +1,126 @@
<?php
/*******************************************************************
Module : /apps/php/index.php
Desc. : PHP - Halaman Utama Desktop
Created By : Siau Pheng (siaupheng@3fonia.com).
Created Date : May 24th, 2010.
Last Modified : December 14th, 2025.
(c) 2010 - 2025, 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
require_once(__DIR__."/../../../../vendor/autoload.php");
use siaupheng\fonia3\DB\MySQL;
use siaupheng\fonia3\Web\Param;
use siaupheng\fonia3\Web\Register;
function random_color($trans = "0.6") {
$col_r = mt_rand( 0, 255 );
$col_g = mt_rand( 0, 255 );
$col_b = mt_rand( 0, 255 );
return "rgba(".$col_r.",".$col_g.",".$col_b.",".$trans.")";
}
$db = $db ?? new MySQL();
$ajson = [];
$data = Param::Get("data");
if ( $data == "chart-sale" ) {
$ajson['tipe'] = "chart";
$adata['datasets'] = [['data'=>[], 'label'=>"Penjualan", 'borderColor'=>[], 'backgroundColor'=>[]]];
$adata['labels'] = ["Belum Ada Penjualan"];
$db->Query("SELECT P.Nama_Produk,D.Qty FROM (SELECT InvID,SUM(-Qty) Qty FROM inv_detail WHERE CabID='".$_SESSION['__APP_INV']['CABANGID']."' AND NotaID=5 AND InvID>1 AND Tgl_Ref>='".tgl_sql2str(tgl_operasi(tgl_dmy(),-7))."' GROUP BY InvID ORDER BY SUM(-Qty) DESC LIMIT 10) D LEFT JOIN inv_produk P ON (D.InvID=P.InvID)");
if ($db->RecordCount()>0) {
$adata['labels'] = [];
}
while ($db->Next()) {
$adata['labels'][] = $db->Row("Nama_Produk");
$adata['datasets'][0]['data'][] = $db->RowFloat("Qty");
$adata['datasets'][0]['borderColor'][] = random_color();
$adata['datasets'][0]['backgroundColor'][] = random_color();
}
$ajson['chart'] = ['type' => "bar",
'data' => $adata,
'options' => [
'responsive' => true,
'maintainAspectRatio' => false,
'plugins' => [
'legend' => ['display' => false],
'title' => ['display' => true, 'font' => ['size' => 20, 'weight' => 'normal'], 'text' => '10 Barang Terlaris'],
'subtitle' => ['display' => true, 'position' => "top", 'text' => '(dalam sepekan terakhir)']
],
'scales' => ['y' => ['beginAtZero' => true, 'title' => ['display' => true, 'font' => ['size' => 14], 'text' => "Qty Penjualan"]], 'x' => ['display' => false]],
'layout' => ['padding' => ['top' => 10]]
]
];
} else if ( $data == "chart-omzet" ) {
$ajson['tipe'] = "chart";
$adata['datasets'] = [['data'=>[], 'label'=>"Jumlah (JT)", 'borderColor'=>random_color(), 'backgroundColor'=>random_color(), 'pointStyle'=>'circle', 'pointRadius'=>10, 'pointHoverRadius'=>15]];
$adata['labels'] = ["Belum Ada Penjualan"];
$db->Query("SELECT Tgl_Jual,DAY(Tgl_Jual) Tgl,SUM(Total_Jual) Total FROM inv_jual WHERE CabID='".$_SESSION['__APP_INV']['CABANGID']."' AND Tgl_Jual<='".tgl_ymd()."' GROUP BY Tgl_Jual ORDER BY Tgl_Jual DESC LIMIT 10");
if ($db->RecordCount()>0) {
$adata['labels'] = [];
}
while ($db->Next()) {
$adata['labels'][] = substr(tgl_hari(tgl_sql2str($db->Row("Tgl_Jual"))),0,3) ." (". $db->Row("Tgl") . ")";
$adata['datasets'][0]['data'][] = round($db->RowFloat("Total")/1000000,2);
}
$ajson['chart'] = ['type' => "line",
'data' => $adata,
'options' => [
'responsive' => true,
'maintainAspectRatio' => false,
'plugins' => [
'legend' => ['display' => false],
'title' => ['display' => true, 'font' => ['size' => 20, 'weight' => 'normal'], 'text' => 'Penjualan 10 Hari Terakhir'],
'subtitle' => ['display' => true, 'position' => "top", 'text' => '(dalam jutaan)']
],
'scales' => ['y' => ['min' => 0, 'ticks' => ['stepSize' => 0.1], 'title' => ['display' => true, 'font' => ['size' => 14], 'text' => "Jumlah Penjualan"]]],
'layout' => ['padding' => ['top' => 10]]
]
];
} else if ( $data == "tabel-stok" ) {
$ajson['tipe'] = "tabel";
$ajson['html'] = '<table class="table table-striped table-bordered table-hover dataTable no-footer dtr-inline"><thead><tr><th class="c">SKU</th><th class="l">Nama Barang</th><th class="r">Stok</th></tr></thead><tbody>';
$db->Query("SELECT S.*,P.Kode_SKU,P.Nama_Produk FROM (SELECT InvID,SUM(Stok) Stok FROM inv_detail WHERE CabID='".$_SESSION['__APP_INV']['CABANGID']."' GROUP BY InvID) S LEFT JOIN vi_inv_produk P ON (P.InvID=S.InvID AND P.Qty=1) WHERE P.Kode_SKU IS NOT NULL ORDER BY S.Stok LIMIT 20");
while ($db->Next()) {
$ajson['html'] .= sprintf('<tr><td class="c">%s</td><td class="l">%s</td><td class="r">%s</td></tr>', $db->Row("Kode_SKU"), $db->Row("Nama_Produk"), rupiah($db->Row("Stok",0)));
}
$ajson['html'] .= '</tbody></table>';
} else if ( $data == "default" ) {
$ajson['content'] = '
<div class="card">
<div class="card-body" style="height:500px;">
<div class="row h-100">
<div class="col">
<div class="h-50">
<canvas id="ChartA"></canvas>
</div>
<div class="h-50">
<canvas id="ChartB"></canvas>
</div>
</div>
<div class="col h-100 overflow-scroll">
<div id="tabelStok"></div>
</div>
</div>
</div>
</div>
';
}
send_json($ajson);
?>
+140
View File
@@ -0,0 +1,140 @@
<?php
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/php/iss/cekharga.php
Desc. : PHP - Informasi Barang & Harga Jual
Created By : Siau Pheng (siaupheng@3fonia.com).
Created Date : October 22nd, 2014.
Last Modified : January 4th, 2025.
(c) 2014 - 2025, 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
require_once(__DIR__."/../../../../../vendor/autoload.php");
require_once(__DIR__."/../func.iss.php");
use siaupheng\fonia3\DB\MySQL;
use siaupheng\fonia3\Web\Param;
use siaupheng\fonia3\Web\Table;
use siaupheng\fonia3\Web\Form;
$db = $db ?? new MySQL();
$ajson = [];
$data = Param::Get("data");
$id_cab = $_SESSION['__APP_INV']['CABANGID'];
if ($data == "auto-produk") {
$tcari = Param::Get("Auto_Query");
$ajson['autodata'] = [];
$bcode = 0; $arec = [];
// Cari by SKU
$db->Query("SELECT P.*,CONCAT(K.Kode_SKU,' / ',K.Kode_Barcode,':',P.Nama_Produk,':',S.Nama_Satuan,':',CONVERT(FORMAT(K.Harga_Jual,0) USING UTF8)) Data2 FROM (SELECT * FROM inv_produk_kemasan WHERE Harga_Jual>0 AND Kode_SKU='".$tcari."' LIMIT 1) K LEFT JOIN inv_produk P ON (P.InvID=K.InvID) LEFT JOIN para_satuan S ON (S.SatuanID=K.SatuanID) WHERE P.Aktif=1");
if ($db->Next()) {
$bcode = 1;
$arec = $db->AllRow();
}
// Cari by Barcode
if ($bcode == 0) {
$db->Query("SELECT P.*,CONCAT(K.Kode_SKU,' / ',K.Kode_Barcode,':',P.Nama_Produk,':',S.Nama_Satuan,':',CONVERT(FORMAT(K.Harga_Jual,0) USING UTF8)) Data2 FROM (SELECT * FROM inv_produk_kemasan WHERE Harga_Jual>0 AND Kode_Barcode='".$tcari."' LIMIT 1) K LEFT JOIN inv_produk P ON (P.InvID=K.InvID) LEFT JOIN para_satuan S ON (S.SatuanID=K.SatuanID) WHERE P.Aktif=1");
if ($db->Next()) {
$bcode = 1;
$arec = $db->AllRow();
}
}
if ($bcode == 1) {
$ajson['autodata'][] = ['value'=>$arec['InvID'], 'text'=>$arec['Nama_Produk'], 'data'=>$arec['Data2'], 'bc'=>1];
} else {
$db->Query("SELECT P.*,IF(IFNULL(X.Stok,0)=0,'KOSONG',ROUND(X.Stok/K.Qty,2)) Sisa_Stok,K.Kode_SKU,K.Harga_Jual,S.Nama_Satuan,CONCAT(K.Kode_SKU,' / ',K.Kode_Barcode,':',P.Nama_Produk,':',S.Nama_Satuan,':',CONVERT(FORMAT(K.Harga_Jual,0) USING UTF8)) Data2 FROM (SELECT * FROM inv_produk_kemasan WHERE Harga_Jual>0 AND InvID IN (SELECT InvID FROM inv_produk WHERE Aktif=1 AND Nama_Produk LIKE '%".$tcari."%' ORDER BY InvID) ORDER BY InvID) K LEFT JOIN (SELECT * FROM inv_produk WHERE Aktif=1 AND Nama_Produk LIKE '%".$tcari."%' ORDER BY InvID) P ON (K.InvID=P.InvID) LEFT JOIN vi_inv_stok X ON (X.CabID='".$id_cab."' AND K.InvID=X.InvID) LEFT JOIN para_satuan S ON (S.SatuanID=K.SatuanID) ORDER BY P.Nama_Produk,K.Qty DESC LIMIT 50");
while ($db->Next()) {
$ajson['autodata'][] = ['value'=>$db->Row("InvID"), 'text'=>$db->Row("Nama_Produk"), 'html'=>'<span class="text-primary">'.$db->Row("Kode_SKU").'</span> '.$db->Row("Nama_Produk")." ".$db->Row("Nama_Satuan").' - Rp. '.rupiah($db->Row("Harga_Jual")).' <span class="text-danger">('.$db->Row("Sisa_Stok").')</span>', 'data'=>$db->Row("Data2"), 'bc'=>0];
}
}
} else if ($data == "scan-produk") {
$tcari = Param::Get("Cari_Produk");
$ahasil = [];
$bcode = 0;
// Cari by SKU
$db->Query("SELECT P.InvID,K.Kode_SKU,K.Kode_Barcode,P.Nama_Produk,S.Nama_Satuan,CONVERT(FORMAT(K.Harga_Jual,0) USING UTF8) Harga_Jual FROM (SELECT * FROM inv_produk_kemasan WHERE Harga_Jual>0 AND Kode_SKU='".$tcari."' LIMIT 1) K LEFT JOIN inv_produk P ON (P.InvID=K.InvID) LEFT JOIN para_satuan S ON (S.SatuanID=K.SatuanID) WHERE P.Aktif=1");
if ($db->Next()) {
$bcode = 1;
$ahasil = $db->AllRow();
}
// Cari by Barcode
if ($bcode == 0) {
$db->Query("SELECT P.InvID,K.Kode_SKU,K.Kode_Barcode,P.Nama_Produk,S.Nama_Satuan,CONVERT(FORMAT(K.Harga_Jual,0) USING UTF8) Harga_Jual FROM (SELECT * FROM inv_produk_kemasan WHERE Harga_Jual>0 AND Kode_Barcode='".$tcari."' LIMIT 1) K LEFT JOIN inv_produk P ON (P.InvID=K.InvID) LEFT JOIN para_satuan S ON (S.SatuanID=K.SatuanID) WHERE P.Aktif=1");
if ($db->Next()) {
$ahasil = $db->AllRow();
}
}
$ahasil['Nama_Supplier'] = "BELUM ADA";
if (count($ahasil) > 0) {
$db->Query("SELECT S.Nama_Sup Nama FROM para_supplier S WHERE S.SupID=(SELECT SupID FROM inv_produk_sup WHERE InvID='".$ahasil['InvID']."' LIMIT 1)");
if ($db->Next()) $ahasil['Nama_Supplier'] = $db->Row("Nama");
}
$ajson['InvID'] = $ahasil['InvID'];
$ajson['Kode_Barang'] = $ahasil['Kode_SKU']." / ".$ahasil['Kode_Barcode'];
$ajson['Nama_Barang'] = $ahasil['Nama_Produk'];
$ajson['Nama_Satuan'] = $ahasil['Nama_Satuan'];
$ajson['Harga_Jual'] = $ahasil['Harga_Jual'];
$ajson['Nama_Supplier'] = $ahasil['Nama_Supplier'];
} else if ( $data == "brow-produk" ) {
$tcari = trim(Param::Get("Cari_Produk"));
$tsql = ($tcari=="") ? "" : " AND P.Barcode_Nama LIKE '%".$tcari."%'";
$obj = new Table($db);
$obj->set_table("vi_inv_produk P", "P.*", "P.Harga_Jual>0 AND P.Aktif=1".$tsql);
$obj->add_field("InvID", "ID", "hid");
$obj->add_field("Kode_SKU", "SKU", "c");
$obj->add_field("Kode_Barcode", "Kode Barcode", "c");
$obj->add_field("Nama_Lengkap", "Nama Barang", "awr");
$obj->add_field("Harga_Jual", "Harga @", "r", "rupiah");
$obj->add_field("Nama_Produk", "Produk", "hid");
$obj->add_field("Nama_Satuan", "Satuan", "hid");
$obj->set_field_order("Kode_SKU", "A");
$obj->add_row_btn("save", "Pilih", "CekHargaJS.produk_select");
$obj->set_func_navi("CekHargaJS.data_query('brow-produk')");
$ajson[] = $obj->db_table("divBrowProduk");
} else if ( $data == "cek_supplier") {
$n_sup = "BELUM ADA";
$db->Query("SELECT S.Nama_Sup Nama FROM para_supplier S WHERE S.SupID=(SELECT SupID FROM inv_produk_sup WHERE InvID='".Param::Get("InvID",0)."' LIMIT 1)");
if ($db->Next()) $n_sup = $db->Row("Nama");
$ajson[] = ['type'=>"form", 'id'=>"Nama_Supplier", 'value'=>$n_sup];
} else if ( $data == "default") {
$form = new Form($db);
$tbrg = $form->textauto("_", "Nama_Produk", null, true, true, "Scan Barcode / Ketik Nama Barang");
$tkode = $form->textbox("_", "Kode_Barang", "KODE_SKU / KODE_BARCODE", false, false, "text");
$tnama = $form->textbox("_", "Nama_Barang", "NAMA_BARANG", false, false, "text");
$tsat = $form->textbox("_", "Nama_Satuan", "SATUAN", false, false, "text");
$tharga = $form->textbox("_", "Harga_Jual", "", false, false, "text");
$tsup = $form->textbox("_", "Nama_Supplier", "", false, false, "text");
if (isMobile()) {
echo '
<div class="row mb-1"><div class="col"><div id="qr-reader"></div></div></div>
<hr class="my-2">
<div class="row mb-1"><div class="col-sm-3 col-lg-3 col-form-label">Kode SKU / Barcode</div><div class="col"><div class="input-group">'.$tkode.'<button class="btn btn-info shadow-none" type="button" id="butBrow"><i class="bi-search"></i></button></div></div></div>
';
} else {
echo '
<div class="row mb-1"><div class="col-sm-3 col-lg-3 col-form-label">Kunci Pencarian</div><div class="col"><div class="input-group">'.$tbrg.'<button class="btn btn-info shadow-none" type="button" id="butBrow"><i class="bi-search"></i></button></div></div></div>
<hr class="my-2">
<div class="row mb-1"><div class="col-sm-3 col-lg-3 col-form-label">Kode SKU / Barcode</div><div class="col">'.$tkode.'</div></div>
';
}
echo '
<div class="row mb-1"><div class="col-sm-3 col-lg-3 col-form-label">Nama Barang</div><div class="col">'.$tnama.'</div></div>
<div class="row mb-1"><div class="col-sm-3 col-lg-3 col-form-label">Satuan</div><div class="col">'.$tsat.'</div></div>
<div class="row mb-1"><div class="col-sm-3 col-lg-3 col-form-label">Harga Jual @</div><div class="col">'.$tharga.'</div></div>
<div class="row mb-1"><div class="col-sm-3 col-lg-3 col-form-label">Supplier</div><div class="col">'.$tsup.'</div></div>
<input type="hidden" id="InvID" value="0" />';
}
send_json($ajson);
?>
+303
View File
@@ -0,0 +1,303 @@
<?php
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/php/iss/opname.php
Desc. : PHP - Transaksi Opname Stok Barang
Created By : Siau Pheng (siaupheng@3fonia.com).
Created Date : May 24th, 2010.
Last Modified : September 29th, 2025.
(c) 2010 - 2025, 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
require_once(__DIR__."/../../../../../vendor/autoload.php");
require_once(__DIR__."/../func.iss.php");
use siaupheng\fonia3\DB\MySQL;
use siaupheng\fonia3\DB\SQL;
use siaupheng\fonia3\Web\Param;
use siaupheng\fonia3\Web\Table;
use siaupheng\fonia3\Web\Form;
$db = $db ?? new MySQL();
$ajson = [];
$data = Param::Get("data");
$mode = Param::Get("mode", "view");
$mode_detail = Param::Get("mode_detail");
$id_cab = Param::Get("CabID", $_SESSION['__APP_INV']['CABANGID']);
$nomor = Param::Get("No_Opname", "");
if ( $data == "master" ) {
$ajson = ['error'=>"", 'html'=>""];
$atabel = ['No_Opname'=>$nomor, 'CabID'=>$id_cab];
if ($mode == "add") {
$atabel['No_Opname'] = "TO-BARU#".$_SESSION['__WEB_APP']['SERVER_ID'].user_id(3);
$atabel['Tgl_Opname'] = tgl_ymd();
$nomor = "";
} else if ($mode == "edit") {
Detail_Copy($nomor);
} else if ($mode == "save") {
$no_lama = $nomor;
$b_baru = (strpos($no_lama,"BARU")===false) ? false : true;
if ($b_baru) $nomor = Nomor_Baru("O", Param::Get("Tgl_Opname"), true);
Detail_Save($nomor, 1, $id_cab, Param::Get("Tgl_Opname"), $b_baru, $no_lama);
$sql = new SQL($db);
$sql->set_table("inv_opname");
$sql->add_param_date("Tgl_Opname");
$sql->add_param("CabID");
$sql->add_param("Catatan");
$sql->add_param_userid();
$sql->add_where("No_Opname", $nomor);
$sql->UpdateDB();
$mode = "view";
} else if ($mode == "cancel") {
Detail_Cancel($nomor);
$mode = "view";
$nomor = ""; $atabel['No_Opname'] = "";
}
if ($nomor <> "" && $mode <> "cancel") {
$db->Query("SELECT * FROM inv_opname WHERE No_Opname='".$nomor."'");
if (!$db->Next()) {
$ajson['error'] = "Nomor Transaksi belum ada / tidak diketemukan !";
} else $atabel = array_merge($atabel, $db->AllRow());
}
$enable = in_array($mode, ["add","edit"]) ? true : false;
$form = new Form($db);
$tnota = $form->textbox("_", "No_Opname", $atabel['No_Opname'], !$enable, false, "text", "nomor transaksi");
$ttgl = $form->datebox("_", "Tgl_Opname", $atabel['Tgl_Opname'], $enable, false);
$tcab = $form->option_db("_", "CabID", $atabel['CabID'], false, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID", [0,"&nbsp;"]);
$tcatat = $form->textbox("_", "Catatan", $atabel['Catatan'], $enable, false, "text");
$ajson['html'] = '
<div class="row">
<div class="col-sm-12 col-lg-6">
<div class="row mb-1">
<label class="col-sm-5 col-lg-3 col-form-label" for="No_Opname">Nomor Transaksi</label>
<div class="col"><div class="input-group">'.$tnota.'<button id="butBrow" class="btn btn-info" type="button" onclick="OpnameJS.tx_brow();"><i class="bi-search"></i></button></div></div>
</div>
<div class="row mb-1">
<label class="col-sm-5 col-lg-3 col-form-label" for="Tgl_Opname">Tanggal Transaksi</label>
<div class="col-sm-7 col-lg-5">'.$ttgl.'</div>
</div>
</div>
<div class="col-sm-12 col-lg-6">
<div class="row mb-1">
<label class="col-sm-5 col-lg-3 col-form-label" for="CabID">Nama Cabang</label>
<div class="col">'.$tcab.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-5 col-lg-3 col-form-label" for="Catatan">Catatan</label>
<div class="col">'.$tcatat.'</div>
</div>
</div>
</div>
<hr class="my-1">
<input type="hidden" id="mode" value="'.$mode.'" >';
} else if ( $data == "delete" ) {
$db->Query("DELETE FROM inv_opname WHERE No_Opname='".$nomor."'");
$db->Query("DELETE FROM inv_detail WHERE No_Ref='".$nomor."'");
$ajson['status'] = true;
} else if ( $data == "tabel-detail" ) {
if (in_array($mode_detail, ["insert","update","delete"])) {
$iqty = doubleval(Param::Get("Qty", 0)); $istok = $iqty;
$db->Query("SELECT Qty FROM inv_produk_kemasan WHERE InvID='".Param::Get("InvID")."' AND SatuanID='".Param::Get("SatuanID")."'");
if ($db->Next()) $istok = $db->RowFloat("Qty", 1) * $iqty;
$sql = new SQL($db);
$sql->set_table("tmp_inv_detail");
$sql->add_param("InvID");
$sql->add_param("SatuanID");
$sql->add_param("Qty", $iqty);
$sql->add_param("Stok", $istok);
$sql->add_param("Harga_Beli");
$sql->add_param("Harga_Jual", Param::Get("Harga_Beli", 0));
$sql->add_param_unix();
$sql->add_param_userid();
$sql->add_where("ID");
$sql->add_where("No_Ref", $nomor);
if ( $mode_detail == "insert" ) {
$sql->add_param("No_Ref", $nomor);
$sql->InsertDB();
} else if ( $mode_detail == "update" ) {
$sql->UpdateDB();
} else if ( $mode_detail == "delete" ) {
$sql->DeleteDB();
}
}
$qview = ""; $qtabel = "inv_detail";
if (in_array($mode, ["add","edit"])) {
if ($mode=="add") $qview = " AND Unix=".user_unix();
$qtabel = "tmp_inv_detail";
}
$obj = new Table($db);
$obj->set_query("SELECT D.*,P.Kode_SKU,P.Nama_Produk,P.Nama_Satuan FROM (SELECT * FROM ".$qtabel." WHERE No_Ref='".$nomor."'".$qview.") D LEFT JOIN vi_inv_produk P ON (D.InvID=P.InvID AND D.SatuanID=P.SatuanID)");
$obj->add_field("ID", "ID", "hid");
$obj->add_field("Kode_SKU", "SKU", "c");
$obj->add_field("Nama_Produk", "Nama Barang", "awr");
$obj->add_field("Qty", "Qty", "r", "rupiah2");
$obj->add_field("Nama_Satuan", "Satuan", "l");
$obj->set_field_order("Kode_SKU", "A");
if (in_array($mode, ["add","edit"])) {
$obj->add_row_btn("clipboard", "Ubah", "OpnameJS.detail_ubah");
$obj->add_row_btn("trash", "Hapus", "OpnameJS.detail_hapus", "Unix", user_unix());
$obj->set_func_btn("OpnameJS.detail_tambah", '<i class="bi-plus-lg me-1"></i> Barang');
$obj->set_func_btn("OpnameJS.produk_brow", '<i class="bi-table me-1"></i> Browse');
}
$obj->set_func_navi("OpnameJS.data_query('tabel-detail')");
$ajson[] = $obj->json_table("divDetailTabel");
} else if ( $data == "brow-tx" ) {
$tcari = trim(Param::Get("Cari_TX"));
$tsql = ($tcari=="") ? "" : " AND CONCAT(No_Opname,DATE_FORMAT(Tgl_Opname,'%d-%m-%Y')) LIKE '%".$tcari."%'";
$obj = new Table($db);
$obj->set_table("(SELECT * FROM inv_opname WHERE CabID='".$id_cab."'".$tsql.") O LEFT JOIN para_cabang C ON (C.CabID=O.CabID)", "O.*,C.Kode_Cab", "");
$obj->add_field("No_Opname", "No. Transaksi", "c");
$obj->add_field("Tgl_Opname", "Tgl. Transaksi", "c", "sqltgl", null, "val-tgl");
$obj->add_field("Kode_Cab", "Cab", "c");
$obj->add_field("Catatan", "Catatan", "awr");
$obj->set_field_order("No_Opname", "D");
$obj->add_row_btn("save", "Pilih", "OpnameJS.tx_select");
$obj->set_func_navi("OpnameJS.data_query('brow-tx')");
$ajson[] = $obj->db_table("divBrowTX");
} else if ( $data == "brow-produk" ) {
$tcari = trim(Param::Get("Cari_Produk"));
$ttgl = Param::Get("Tgl_Opname");
$tsql = ($tcari=="") ? "" : " AND CONCAT(P.Kode_Barcode,P.Nama_Produk) LIKE '%".$tcari."%'";
$obj = new Table($db);
$obj->set_table("(SELECT InvID,SatuanID,SUM(Stok) Stok FROM inv_detail WHERE Tgl_Ref<='".$ttgl."' AND CabID='".$id_cab."' GROUP BY InvID) D LEFT JOIN vi_inv_produk P ON (D.InvID=P.InvID AND D.SatuanID=P.SatuanID)", "D.InvID,P.StokID,D.Stok,P.Kode_SKU,P.Nama_Produk,P.Harga_Pokok", "P.Aktif=1".$tsql);
$obj->add_field("InvID", "InvID", "hid");
$obj->add_field("StokID", "StokID", "hid");
$obj->add_field("Harga_Pokok", "HPP", "hid");
$obj->add_field("Kode_SKU", "SKU", "c");
$obj->add_field("Nama_Produk", "Nama Barang", "l");
$obj->add_field("Stok", "Stok", "r");
$obj->set_field_order("Kode_SKU", "A");
$obj->add_row_btn("save", "Pilih", "OpnameJS.produk_select");
$obj->set_func_navi("OpnameJS.data_query('brow-produk')");
$ajson[] = $obj->db_table("divBrowProduk");
} else if ( $data == "auto-produk" ) {
$tcari = Param::Get("Auto_Query");
$ttgl = Param::Get("Tgl_Opname");
$ajson['autodata'] = [];
$bcode = 0; $arec = [];
// Cari by SKU
$db->Query("SELECT P.*,CONCAT(K.Kode_SKU,' / ',K.Kode_Barcode,':',P.Nama_Produk,':',S.Nama_Satuan,':',K.SatuanID,':',CONVERT(FORMAT(P.Harga_Pokok/K.Qty,2) USING UTF8)) Data2 FROM (SELECT * FROM inv_produk_kemasan WHERE Kode_SKU='".$tcari."' LIMIT 1) K LEFT JOIN inv_produk P ON (P.InvID=K.InvID) LEFT JOIN para_satuan S ON (S.SatuanID=K.SatuanID) WHERE P.Aktif=1");
if ($db->Next()) {
$bcode = 1;
$arec = $db->AllRow();
}
// Cari by Barcode
if ($bcode == 0) {
$db->Query("SELECT P.*,CONCAT(K.Kode_SKU,' / ',K.Kode_Barcode,':',P.Nama_Produk,':',S.Nama_Satuan,':',K.SatuanID,':',CONVERT(FORMAT(P.Harga_Pokok/K.Qty,2) USING UTF8)) Data2 FROM (SELECT * FROM inv_produk_kemasan WHERE Kode_Barcode='".$tcari."' LIMIT 1) K LEFT JOIN inv_produk P ON (P.InvID=K.InvID) LEFT JOIN para_satuan S ON (S.SatuanID=K.SatuanID) WHERE P.Aktif=1");
if ($db->Next()) {
$bcode = 1;
$arec = $db->AllRow();
}
}
if ($bcode == 1) {
$ajson['autodata'][] = ['value'=>$arec['InvID'], 'text'=>$arec['Nama_Produk'], 'data'=>$arec['Data2'], 'bc'=>1];
} else {
$db->Query("SELECT P.*,IF(IFNULL(X.Stok,0)=0,'KOSONG',ROUND(X.Stok/K.Qty,2)) Sisa_Stok,K.Kode_SKU,S.Nama_Satuan,CONCAT(K.Kode_SKU,' / ',K.Kode_Barcode,':',P.Nama_Produk,':',S.Nama_Satuan,':',K.SatuanID,':',CONVERT(FORMAT(P.Harga_Pokok/K.Qty,2) USING UTF8)) Data2 FROM (SELECT * FROM inv_produk_kemasan WHERE InvID IN (SELECT InvID FROM inv_produk WHERE Aktif=1 AND Nama_Produk LIKE '%".$tcari."%' ORDER BY InvID) ORDER BY InvID) K LEFT JOIN (SELECT * FROM inv_produk WHERE Aktif=1 AND Nama_Produk LIKE '%".$tcari."%' ORDER BY InvID) P ON (K.InvID=P.InvID) LEFT JOIN (SELECT InvID,SUM(Stok) Stok FROM inv_detail WHERE Tgl_Ref<='".tgl_sql2str($ttgl)."' AND CabID='".$id_cab."' GROUP BY InvID) X ON (K.InvID=X.InvID) LEFT JOIN para_satuan S ON (S.SatuanID=K.SatuanID) ORDER BY P.Nama_Produk,K.Qty DESC LIMIT 50");
while ($db->Next()) {
$ajson['autodata'][] = ['value'=>$db->Row("InvID"), 'text'=>$db->Row("Nama_Produk"), 'html'=>'<span class="text-primary">'.$db->Row("Kode_SKU").'</span> '.$db->Row("Nama_Produk")." ".$db->Row("Nama_Satuan").' <span class="text-danger">('.$db->Row("Sisa_Stok").')</span>', 'data'=>$db->Row("Data2"), 'bc'=>0];
}
}
} else if ($data == "detail-produk") {
$id = Param::Get("ID", 0); $atabel = ['ID'=>$id, 'InvID'=>Param::Get("InvID"), 'SatuanID'=>Param::Get("SatuanID"), 'HPP'=>Param::Get("HPP")];
if ($id > 0) {
$db->Query("SELECT * FROM tmp_inv_detail WHERE No_Ref='".$nomor."' AND ID='".$id."' LIMIT 1");
if ($db->Next()) $atabel = array_merge($atabel, $db->AllRow());
}
if ($atabel['InvID']>0 && $atabel['SatuanID']>0) {
$db->Query("SELECT Kode_SKU,Kode_Barcode,Nama_Produk,Nama_Satuan FROM vi_inv_produk WHERE InvID='".$atabel['InvID']."' AND SatuanID='".$atabel['SatuanID']."' LIMIT 1");
if ($db->Next()) $atabel = array_merge($atabel, $db->AllRow());
}
$form = new Form($db);
$tnama = $form->textauto("_", "Nama_Produk", ['value'=>$atabel['InvID'],'text'=>$atabel['Nama_Produk']], true, true, "ketik sku / barcode / nama barang");
$tkode = $form->textbox("_", "Kode_Barang", $atabel['Kode_SKU']." / ".$atabel['Kode_Barcode'], false, false, "text");
$tqty = $form->textbox("_", "Qty", $atabel['Qty'], true, true, "double");
$tstok = $form->textbox("_", "Stok_Sistem", 0, false, false, "double");
$tsat = $form->textbox("_", "Nama_Satuan", $atabel['Nama_Satuan'], false, false, "text");
$ajson['html'] = '
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label">Kode SKU / Barcode</label>
<div class="col">'.$tkode.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Nama_Produk">Nama Barang</label>
<div class="col">'.$tnama.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label">Satuan</label>
<div class="col">'.$tsat.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label">Stok Sistem</label>
<div class="col-sm-8 col-lg-6">'.$tstok.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Qty">Qty Koreksi (+/-)</label>
<div class="col-sm-8 col-lg-6">'.$tqty.'</div>
</div>
<input type="hidden" id="ID" value="'.$atabel['ID'].'" >
<input type="hidden" id="InvID" value="'.$atabel['InvID'].'" >
<input type="hidden" id="SatuanID" value="'.$atabel['SatuanID'].'" >
<input type="hidden" id="Harga_Beli" value="'.$atabel['HPP'].'" >
<input type="hidden" id="mode_detail" value="'.$mode_detail.'" >';
} else if ( $data == "cek_stok") {
$id_inv = Param::Get("InvID", 0);
$stok = 0;
$db->Query("SELECT SUM(Stok) Stok FROM inv_detail WHERE Tgl_Ref<='".tgl_sql2str(Param::Get("Tgl_Opname"))."' AND CabID='".$id_cab."' AND InvID='".$id_inv."'");
if ($db->Next()) $stok = $db->RowFloat("Stok", 2);
$ajson[] = ['type'=>"form", 'id'=>"Stok_Sistem", 'value'=>rupiah2($stok)];
} else if ( $data == "default") {
echo '
<div class="fade-in">
<div class="card"><div class="card-body">
<ul class="nav nav-tabs" role="tablist">
<li class="nav-item" role="presentation">
<button class="nav-link active" id="tx-tab" data-bs-toggle="tab" data-bs-target="#tx" type="button" role="tab" aria-controls="tx" aria-selected="true"><i class="bi-database me-2"></i>Transaksi Penyesuaian Stok</button>
</li>
<li class="nav-item ms-auto">
<button class="btn btn-primary mb-1 ms-2" id="butTambah" type="button"><i class="bi-plus-lg me-2"></i>Tambah</button>
<button class="btn btn-info mb-1 ms-2" id="butUbah" type="button"><i class="bi-clipboard me-2"></i>Ubah</button>
<button class="btn btn-warning mb-1 ms-2" id="butHapus" type="button"><i class="bi-trash me-2"></i>Hapus</button>
<button class="btn btn-secondary mb-1 ms-2" id="butPrint" type="button"><i class="bi-printer me-2"></i>Cetak</button>
<button class="btn btn-danger mb-1 ms-2" id="butBatal" type="button"><i class="bi-x-lg me-2"></i>Batal</button>
<button class="btn btn-success mb-1 ms-2" id="butSimpan" type="button"><i class="bi-save me-2"></i>Simpan</button>
</li>
</ul>
<div class="tab-content border border-top-0 p-3">
<div class="tab-pane fade active show" id="tx" role="tabpanel" aria-labelledby="tx-tab">
<div id="divTXMaster">&nbsp;</div>
<div id="divDetailTabel">&nbsp;</div>
</div>
</div>
</div></div>
</div>';
}
send_json($ajson);
?>
+171
View File
@@ -0,0 +1,171 @@
<?php
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/php/iss/opname_barang.php
Desc. : PHP - Transaksi Penyesuaian Stok Per Barang
Created By : Siau Pheng (siaupheng@3fonia.com).
Created Date : October 22nd, 2014.
Last Modified : September 21st, 2025.
(c) 2014 - 2025, 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
require_once(__DIR__."/../../../../../vendor/autoload.php");
require_once(__DIR__."/../func.iss.php");
use siaupheng\fonia3\DB\MySQL;
use siaupheng\fonia3\DB\SQL;
use siaupheng\fonia3\Web\Param;
use siaupheng\fonia3\Web\Table;
use siaupheng\fonia3\Web\Form;
$db = $db ?? new MySQL();
$ajson = [];
$data = Param::Get("data");
$id_cab = $_SESSION['__APP_INV']['CABANGID'];
if ($data == "auto-produk") {
$tcari = Param::Get("Auto_Query");
$ajson['autodata'] = [];
$bcode = 0; $arec = [];
// Cari by SKU
$db->Query("SELECT P.*,CONCAT(K.Kode_SKU,' / ',K.Kode_Barcode,':',P.Nama_Produk,':',S.Nama_Satuan,':',CONVERT(FORMAT(K.Harga_Jual,0) USING UTF8)) Data2 FROM (SELECT * FROM inv_produk_kemasan WHERE Harga_Jual>0 AND Kode_SKU='".$tcari."' LIMIT 1) K LEFT JOIN inv_produk P ON (P.InvID=K.InvID) LEFT JOIN para_satuan S ON (S.SatuanID=K.SatuanID) WHERE P.Aktif=1");
if ($db->Next()) {
$bcode = 1;
$arec = $db->AllRow();
}
// Cari by Barcode
if ($bcode == 0) {
$db->Query("SELECT P.*,CONCAT(K.Kode_SKU,' / ',K.Kode_Barcode,':',P.Nama_Produk,':',S.Nama_Satuan,':',CONVERT(FORMAT(K.Harga_Jual,0) USING UTF8)) Data2 FROM (SELECT * FROM inv_produk_kemasan WHERE Harga_Jual>0 AND Kode_Barcode='".$tcari."' LIMIT 1) K LEFT JOIN inv_produk P ON (P.InvID=K.InvID) LEFT JOIN para_satuan S ON (S.SatuanID=K.SatuanID) WHERE P.Aktif=1");
if ($db->Next()) {
$bcode = 1;
$arec = $db->AllRow();
}
}
if ($bcode == 1) {
$ajson['autodata'][] = ['value'=>$arec['InvID'], 'text'=>$arec['Nama_Produk'], 'data'=>$arec['Data2'], 'bc'=>1];
} else {
$db->Query("SELECT P.*,IF(IFNULL(X.Stok,0)=0,'KOSONG',ROUND(X.Stok/K.Qty,2)) Sisa_Stok,K.Kode_SKU,K.Harga_Jual,S.Nama_Satuan,CONCAT(K.Kode_SKU,' / ',K.Kode_Barcode,':',P.Nama_Produk,':',S.Nama_Satuan,':',CONVERT(FORMAT(K.Harga_Jual,0) USING UTF8)) Data2 FROM (SELECT * FROM inv_produk_kemasan WHERE Harga_Jual>0 AND InvID IN (SELECT InvID FROM inv_produk WHERE Aktif=1 AND Nama_Produk LIKE '%".$tcari."%' ORDER BY InvID) ORDER BY InvID) K LEFT JOIN (SELECT * FROM inv_produk WHERE Aktif=1 AND Nama_Produk LIKE '%".$tcari."%' ORDER BY InvID) P ON (K.InvID=P.InvID) LEFT JOIN vi_inv_stok X ON (X.CabID='".$id_cab."' AND K.InvID=X.InvID) LEFT JOIN para_satuan S ON (S.SatuanID=K.SatuanID) ORDER BY P.Nama_Produk,K.Qty DESC LIMIT 50");
while ($db->Next()) {
$ajson['autodata'][] = ['value'=>$db->Row("InvID"), 'text'=>$db->Row("Nama_Produk"), 'html'=>'<span class="text-primary">'.$db->Row("Kode_SKU").'</span> '.$db->Row("Nama_Produk")." ".$db->Row("Nama_Satuan").' - Rp. '.rupiah($db->Row("Harga_Jual")).' <span class="text-danger">('.$db->Row("Sisa_Stok").')</span>', 'data'=>$db->Row("Data2"), 'bc'=>0];
}
}
} else if ($data == "scan-produk") {
$tcari = Param::Get("Cari_Produk");
$ahasil = [];
$bcode = 0;
// Cari by SKU
$db->Query("SELECT P.InvID,K.Kode_SKU,K.Kode_Barcode,P.Nama_Produk,S.Nama_Satuan FROM (SELECT * FROM inv_produk_kemasan WHERE Harga_Jual>0 AND Kode_SKU='".$tcari."' LIMIT 1) K LEFT JOIN inv_produk P ON (P.InvID=K.InvID) LEFT JOIN para_satuan S ON (S.SatuanID=K.SatuanID) WHERE P.Aktif=1");
if ($db->Next()) {
$bcode = 1;
$ahasil = $db->AllRow();
}
// Cari by Barcode
if ($bcode == 0) {
$db->Query("SELECT P.InvID,K.Kode_SKU,K.Kode_Barcode,P.Nama_Produk,S.Nama_Satuan FROM (SELECT * FROM inv_produk_kemasan WHERE Harga_Jual>0 AND Kode_Barcode='".$tcari."' LIMIT 1) K LEFT JOIN inv_produk P ON (P.InvID=K.InvID) LEFT JOIN para_satuan S ON (S.SatuanID=K.SatuanID) WHERE P.Aktif=1");
if ($db->Next()) {
$ahasil = $db->AllRow();
}
}
if (count($ahasil) > 0) {
$db->Query("SELECT SUM(Stok) Stok FROM inv_detail WHERE Tgl_Ref<='".tgl_ymd()."' AND CabID='".$id_cab."' AND InvID='".$ahasil['InvID']."'");
if ($db->Next()) $ahasil['Stok_Sistem'] = $db->RowFloat("Stok", 2);
}
$ajson['InvID'] = $ahasil['InvID'];
$ajson['Kode_Barang'] = $ahasil['Kode_SKU']." / ".$ahasil['Kode_Barcode'];
$ajson['Nama_Barang'] = $ahasil['Nama_Produk'];
$ajson['Nama_Satuan'] = $ahasil['Nama_Satuan'];
$ajson['Stok_Sistem'] = $ahasil['Stok_Sistem'];
} else if ( $data == "brow-produk" ) {
$tcari = trim(Param::Get("Cari_Produk"));
$tsql = ($tcari=="") ? "" : " AND P.Barcode_Nama LIKE '%".$tcari."%'";
$obj = new Table($db);
$obj->set_table("vi_inv_produk P", "P.*", "P.Harga_Jual>0 AND P.Aktif=1".$tsql);
$obj->add_field("InvID", "ID", "hid");
$obj->add_field("Kode_SKU", "SKU", "c");
$obj->add_field("Kode_Barcode", "Kode Barcode", "c");
$obj->add_field("Nama_Lengkap", "Nama Barang", "awr");
$obj->add_field("Harga_Jual", "Harga @", "r", "rupiah");
$obj->add_field("Nama_Produk", "Produk", "hid");
$obj->add_field("Nama_Satuan", "Satuan", "hid");
$obj->set_field_order("Kode_SKU", "A");
$obj->add_row_btn("save", "Pilih", "OpnameBarangJS.produk_select");
$obj->set_func_navi("OpnameBarangJS.data_query('brow-produk')");
$ajson[] = $obj->db_table("divBrowProduk");
} else if ( $data == "cek_stok") {
$id_inv = Param::Get("InvID", 0);
$stok = 0;
$db->Query("SELECT SUM(Stok) Stok FROM inv_detail WHERE Tgl_Ref<='".tgl_ymd()."' AND CabID='".$id_cab."' AND InvID='".$id_inv."'");
if ($db->Next()) $stok = $db->RowFloat("Stok", 2);
$ajson[] = ['type'=>"form", 'id'=>"Stok_Sistem", 'value'=>rupiah2($stok)];
} else if ( $data == "simpan-opname") {
$nomor = ""; $id_inv = Param::Get("InvID", 0); $stok = Param::Get("Stok_Fisik", 0) * 1;
$db->Query("SELECT * FROM inv_opname WHERE Tgl_Opname=CURDATE() AND CabID='".$id_cab."' AND UserID='".user_id()."' ORDER BY No_Opname DESC LIMIT 1");
if ($db->Next()) $nomor = $db->Row("No_Opname");
if ($nomor == "") {
$nomor = Nomor_Baru("O", tgl_dmy(), true);
$db->Query("UPDATE inv_opname SET Tgl_Opname=CURDATE(), CabID='".$id_cab."', Catatan='OPNAME USER : ".user_id()." - ".user_nama()."', UserID='".user_id()."' WHERE No_Opname='".$nomor."' LIMIT 1");
}
$aproduk = [];
$db->Query("SELECT * FROM inv_produk WHERE InvID='".$id_inv."' LIMIT 1");
if($db->Next()) $aproduk = $db->AllRow();
$db->Query("SELECT SUM(Stok) Stok FROM inv_detail WHERE Tgl_Ref<='".tgl_ymd()."' AND CabID='".$id_cab."' AND InvID='".$id_inv."'");
if ($db->Next()) $stok -= $db->RowFloat("Stok", 0);
$sql = new SQL($db);
$sql->set_table("inv_detail");
$sql->add_param("No_Ref", $nomor);
$sql->add_param("Tgl_Ref", "CURDATE()", true);
$sql->add_param("NotaID", 1);
$sql->add_param("CabID", $id_cab);
$sql->add_param("InvID", $aproduk['InvID']);
$sql->add_param("SatuanID", $aproduk['StokID']);
$sql->add_param("Qty", $stok);
$sql->add_param("Stok", $stok);
$sql->add_param("Harga_Beli", $aproduk['Harga_Pokok']);
$sql->add_param("Harga_Jual", $aproduk['Harga_Pokok']);
$sql->add_param_userid();
$sql->InsertDB();
$ajson['Status'] = true;
} else if ( $data == "default") {
$form = new Form($db);
$tbrg = $form->textauto("_", "Nama_Produk", null, true, true, "Scan Barcode / Ketik Nama Barang");
$tkode = $form->textbox("_", "Kode_Barang", "KODE_SKU / KODE_BARCODE", false, false, "text");
$tnama = $form->textbox("_", "Nama_Barang", "NAMA_BARANG", false, false, "text");
$tsat = $form->textbox("_", "Nama_Satuan", "SATUAN", false, false, "text");
$tssis = $form->textbox("_", "Stok_Sistem", "0", false, false, "double");
$tsfis = $form->textbox("_", "Stok_Fisik", "0", true, false, "double");
if (isMobile()) {
echo '
<div class="row mb-1"><div class="col"><div id="qr-reader"></div></div></div>
<hr class="my-2">
<div class="row mb-1"><div class="col-sm-3 col-lg-3 col-form-label">Kode SKU / Barcode</div><div class="col"><div class="input-group">'.$tkode.'<button class="btn btn-info shadow-none" type="button" id="butBrow"><i class="bi-search"></i></button></div></div></div>
';
} else {
echo '
<div class="row mb-1"><div class="col-sm-3 col-lg-3 col-form-label">Kunci Pencarian</div><div class="col"><div class="input-group">'.$tbrg.'<button class="btn btn-info shadow-none" type="button" id="butBrow"><i class="bi-search"></i></button></div></div></div>
<hr class="my-2">
<div class="row mb-1"><div class="col-sm-3 col-lg-3 col-form-label">Kode SKU / Barcode</div><div class="col">'.$tkode.'</div></div>
';
}
echo '
<div class="row mb-1"><div class="col-sm-3 col-lg-3 col-form-label">Nama Barang</div><div class="col">'.$tnama.'</div></div>
<div class="row mb-1"><div class="col-sm-3 col-lg-3 col-form-label">Satuan</div><div class="col">'.$tsat.'</div></div>
<div class="row mb-1"><div class="col-sm-3 col-lg-3 col-form-label">Stok Sistem</div><div class="col-sm-8 col-lg-6">'.$tssis.'</div></div>
<div class="row mb-1"><div class="col-sm-3 col-lg-3 col-form-label">Stok Fisik</div><div class="col-sm-8 col-lg-6">'.$tsfis.'</div></div>
<input type="hidden" id="InvID" value="0" />';
}
send_json($ajson);
?>
+552
View File
@@ -0,0 +1,552 @@
<?php
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/php/pos/pos.php
Desc. : PHP - Transaksi Penjualan / Kasir POS
Created By : Siau Pheng (siaupheng@3fonia.com).
Created Date : August 5th, 2012.
Last Modified : January 21st, 2026.
(c) 2012 - 2026, 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
require_once(__DIR__."/../../../../../vendor/autoload.php");
require_once(__DIR__."/../func.iss.php");
use siaupheng\fonia3\DB\MySQL;
use siaupheng\fonia3\DB\SQL;
use siaupheng\fonia3\Web\Param;
use siaupheng\fonia3\Web\Table;
use siaupheng\fonia3\Web\Form;
function master_show($tmode = "", $apara = []) {
global $db;
$form = new Form($db);
$tno_jual = $form->textbox("_", "No_Jual", $apara['No_Jual'], false);
$tinfo = '<div class="card bg-light"><img class="img-fluid p-1" src="'.$_SESSION['__WEB_APP']['WEB_PATH'].'assets/images/logo60.png" style="opacity:.75;"></div>';
echo '
<div class="row mb-3">
<div class="col"><div class="border border-success rounded pe-2 display-6 text-end" id="Total_Disp">'.$apara['Kembali'].'</div></div>
</div>
<div class="row mb-1"><div class="col">'.$tinfo.'</div></div>
<div class="row mb-1">
<div class="col">
<div class="input-group">'.$tno_jual.'
<button class="btn btn-info shadow-none" type="button" id="posPEND"><i class="bi-search"></i></button>
</div>
</div>
</div>
<div class="row mb-1 mt-4"><div class="col d-grid gap-2">
<button type="button" class="btn btn-success" id="posSIMPAN"><i class="bi-cart-plus me-1"></i>Bayar</button>
<button type="button" class="btn btn-danger" id="posBATAL"><i class="bi-x-lg me-1"></i>Batal</button>
</div></div>
<div class="row mb-1 mt-4"><div class="col d-grid gap-2">
<button type="button" class="btn btn-outline-info" id="posNOTA"><i class="bi-list me-1"></i>Daftar Transaksi</button>
<button type="button" class="btn btn-outline-info" id="posBARANG"><i class="bi-search me-1"></i>Cari Barang</button>
<button type="button" class="btn btn-outline-info" id="posTAMBAH"><i class="bi-save me-1"></i>Tambah Barang</button>
</div></div>
<input type="hidden" id="No_Cetak" value="'.$apara['No_Cetak'].'" />
<input type="hidden" id="Total_Tunai" value="'.$apara['Total_Tunai'].'" />
<input type="hidden" id="Total_Kartu" value="'.$apara['Total_Kartu'].'" />
<input type="hidden" id="Total_Bayar" value="'.$apara['Total_Bayar'].'" />
<input type="hidden" id="Total_Nota" value="'.$apara['Total_Nota'].'" />
<input type="hidden" id="Total_Item" value="'.$apara['Total_Item'].'" />
<input type="hidden" id="Tgl_Jual" value="'.tgl_sql2str($apara['Tgl_Jual']).'" />
<input type="hidden" id="KartuID" value="'.$apara['KartuID'].'" />
<input type="hidden" id="No_Kartu" value="'.$apara['No_Kartu'].'" />
<input type="hidden" id="Nama_Kartu" value="'.$apara['Nama_Kartu'].'" />
<input type="hidden" id="mode" value="'.$tmode.'" />';
}
function Data_Jual1($nomor="") {
global $db;
$aparam = [];
if (trim($nomor)=="") {
$aparam['No_Jual'] = "POS".$_SESSION['__WEB_APP']['SERVER_ID'].$_SESSION['__APP_INV']['CABANGID'].user_id(3)."#00";
$aparam['Tgl_Jual'] = tgl_ymd();
$aparam['Total_Nota'] = 0;
$aparam['Total_Item'] = 0;
$aparam['Total_Tunai'] = 0;
$aparam['Total_Kartu'] = 0;
$aparam['Total_Bayar'] = 0;
$aparam['KartuID'] = 0;
$aparam['No_Kartu'] = "";
$aparam['Nama_Kartu'] = "";
$aparam['Kembali'] = 0;
$aparam['No_Cetak'] = "";
} else {
$tabel_jual = (strpos($nomor,"POS")===false) ? "inv_jual" : "inv_jual_pend";
$db->Query("SELECT * FROM ".$tabel_jual." WHERE CabID='".$_SESSION['__APP_INV']['CABANGID']."' AND No_Jual='".$nomor."'");
if ($db->Next()) $aparam = $db->AllRow();
}
return $aparam;
}
function Nomor_Pending1() {
global $db;
$tno = "POS".$_SESSION['__WEB_APP']['SERVER_ID'].$_SESSION['__APP_INV']['CABANGID'].user_id(3)."#";
$ino = 0;
$db->Query("SELECT MAX(RIGHT(No_Jual,2)) Nomor FROM inv_jual_pend WHERE LEFT(No_Jual,".strlen($tno).")='".$tno."'");
if ($db->Next()) $ino = intval($db->Row("Nomor", 0));
$tno .= isi_nol(++$ino, 2);
return $tno;
}
$db = $db ?? new MySQL();
$ajson = [];
$data = Param::Get("data");
$mode = Param::Get("mode");
$mode_detail = Param::Get("mode_detail");
$id_cab = $_SESSION['__APP_INV']['CABANGID'];
$id_other = $_SESSION['__APP_INV']['OTHERINVID'];
$nomor = Param::Get("No_Jual");
$no_cetak = Param::Get("No_Cetak");
if ( $data == "master" ) {
$aparam = [];
if ($mode == "pending-edit") {
Pending_Edit($nomor);
$aparam = Data_Jual1($nomor);
} else if ($mode == "pending-save") {
$b_baru = false;
if (substr($nomor,-3)=="#00") {
$b_baru = true;
$no_lama = $nomor;
$nomor = Nomor_Pending1();
Pending_Save($no_lama, $nomor);
}
$apending = [];
$db->Query("SELECT SUM(-Qty*Harga_Jual) Jual,SUM(Total_Diskon) Diskon FROM tmp_inv_detail WHERE No_Ref='".$nomor."'");
if ($db->Next()) $apending = $db->AllRow();
$sql = new SQL($db);
$sql->set_table("inv_jual_pend");
$sql->add_param("No_Jual", $nomor);
$sql->add_param_date("Tgl_Jual");
$sql->add_param("CabID", $id_cab);
$sql->add_param("Total_Jual", $apending['Jual']);
$sql->add_param("Total_Diskon", $apending['Diskon']);
$sql->add_param_userid();
$sql->add_where("No_Jual", $nomor);
if ($b_baru) $sql->InsertDB();
else $sql->UpdateDB();
$aparam = Data_Jual1();
} else if ($mode == "pending-delete") {
Pending_Delete($nomor);
$db->Query("DELETE FROM inv_jual_pend WHERE No_Jual='".$nomor."'");
$aparam = Data_Jual1();
} else if ($mode == "edit") {
Detail_Copy($nomor, true);
$db->Query("INSERT INTO tmp_inv_detail_lain SELECT No_Ref,ID,Ket,UserID,'".user_unix()."' FROM inv_detail_lain WHERE No_Ref='".$nomor."'");
$aparam = Data_Jual1($nomor);
} else if ($mode == "save") {
$no_lama = $nomor;
$b_baru = (strpos($no_lama,"POS")===false) ? false : true;
if ($b_baru) {
$nomor = Nomor_POS_Baru("", true);
if (substr($no_lama,-3)!="#00") $db->Query("DELETE FROM inv_jual_pend WHERE No_Jual='".$no_lama."'");
}
Promo_Barang($no_lama, tgl_dmy());//PROMO BARANG
$tot_potong = Promo_Total($no_lama, tgl_dmy());//PROMO TOTAL
Detail_Save($nomor, 5, $id_cab, tgl_dmy(), $b_baru, $no_lama);
$db->Query("DELETE FROM inv_detail_lain WHERE No_Ref='".$nomor."'");
$db->Query("INSERT INTO inv_detail_lain SELECT '".$nomor."',ID,Ket,UserID FROM tmp_inv_detail_lain WHERE No_Ref='".$no_lama."'");
$db->Query("DELETE FROM tmp_inv_detail_lain WHERE No_Ref='".$no_lama."'");
$ajual = [];
$db->Query("SELECT SUM(-Qty*Harga_Jual) Jual,SUM(Total_Diskon) Diskon,SUM(-Qty*Harga_Beli) HPP FROM inv_detail WHERE No_Ref='".$nomor."'");
if ($db->Next()) $ajual = $db->AllRow();
$id_kartu = Param::Get("KartuID", 0);
$no_kartu = ""; $nama_kartu = "";
if ($id_kartu > 0) {
$no_kartu = Param::Get("No_Kartu", "");
$nama_kartu = Param::Get("Nama_Kartu", "");
}
$sql = new SQL($db);
$sql->set_table("inv_jual");
$sql->add_param("Tgl_Jual", tgl_ymd());
$sql->add_param("Tgl_Lunas", tgl_ymd());
$sql->add_param("Total_Jual", $ajual['Jual']);
$sql->add_param("Total_Diskon", $ajual['Diskon']);
$sql->add_param("Total_Potong", $tot_potong);
$sql->add_param("Total_HPP", $ajual['HPP']);
$sql->add_param("Total_Bayar");
$sql->add_param("Total_Kartu");
$sql->add_param("KartuID", $id_kartu);
$sql->add_param("No_Kartu", $no_kartu);
$sql->add_param("Nama_Kartu", $nama_kartu);
$sql->add_param("CabID", $id_cab);
$sql->add_param_stamp();
$sql->add_param_userid();
$sql->add_where("No_Jual", $nomor);
$sql->UpdateDB();
Promo_Nota_Proses($nomor, tgl_dmy());//PROMO NOTA
if ($_SESSION['__APP_INV']['PRINT_AUTO']==1) {
$mode = "print";
} else {
$mode = ($_SESSION['__APP_INV']['PRINT_OPENCD']==1) ? "opencd" : "saveonly";
}
$aparam = Data_Jual1();
$aparam['No_Cetak'] = $nomor;
$aparam['Kembali'] = "0";
$db->Query("SELECT (Total_Jual-Total_Diskon-Total_Potong-Total_Bayar) Sisa FROM inv_jual WHERE No_Jual='".$nomor."'");
if ($db->Next()) $aparam['Kembali'] = '<span style="color:red;">'.rupiah($db->RowFloat("Sisa", 0)).'</span>';
//MONITOR DISPLAY
if ($_SESSION['__APP_INV']['MON_ENABLE']) {
$db->Query("UPDATE disp_login SET No_Cetak='".$nomor."' WHERE CabID='".$_SESSION['__APP_INV']['CABANGID']."' AND UserID='".user_id()."' AND Unix='".user_unix()."'");
}
} else if ($mode == "delete") {
// PROSES UPDATE PROMO
$tgl_jual = tgl_ymd();
$db->Query("SELECT Tgl_Jual FROM inv_jual WHERE No_Jual='".$nomor."'");
if ($db->Next()) $tgl_jual = $db->Row("Tgl_Jual");
Promo_Hapus($nomor, tgl_sql2str($tgl_jual));
Promo_Nota_Hapus($nomor);
$db->Query("DELETE FROM inv_jual WHERE No_Jual='".$nomor."'");
$db->Query("DELETE FROM inv_detail WHERE No_Ref='".$nomor."'");
$db->Query("DELETE FROM inv_detail_lain WHERE No_Ref='".$nomor."'");
$aparam = Data_Jual1();
} else if ($mode == "cancel") {
if (substr($nomor,-3)=="#00" || substr($nomor,0,3)!="POS") Detail_Cancel($nomor);
$aparam = Data_Jual1();
} else {
$aparam = Data_Jual1();
}
//MONITOR DISPLAY
if ($_SESSION['__APP_INV']['MON_ENABLE']) {
$db->Query("UPDATE disp_login SET No_Pos='".$aparam['No_Jual']."' WHERE CabID='".$_SESSION['__APP_INV']['CABANGID']."' AND UserID='".user_id()."' AND Unix='".user_unix()."'");
}
master_show($mode, $aparam);
} else if ( $data == "detail" ) {
if (in_array($mode_detail, ["insert","update","delete"])) {
$id_inv = Param::Get("InvID", 0);
$id_sat = Param::Get("SatuanID", 0);
$iqty = Param::Get("Qty", 0) * -1;
$dhargaD = Param::Get("Harga_Diskon", 0);
$ddiskP = Param::Get("Persen_Diskon", 0);
$istok = 1;
$db->Query("SELECT Qty FROM inv_produk_kemasan WHERE InvID='".$id_inv."' AND SatuanID='".$id_sat."'");
if ($db->Next()) $istok = $db->Row("Qty", 1);
if ($ddiskP > 0) $dhargaD = Param::Get("Harga_Jual",0) * $ddiskP * 0.01;
$sql = new SQL($db);
$sql->set_table("tmp_inv_detail");
$sql->add_param("No_Ref", $nomor);
$sql->add_param("InvID");
$sql->add_param("SatuanID");
$sql->add_param("Qty", $iqty);
$sql->add_param("Stok", ($istok*$iqty));
$sql->add_param("Harga_Beli");
$sql->add_param("Harga_Jual");
$sql->add_param("Disk_Rupiah", $dhargaD);
$sql->add_param("Total_Diskon", "Disk_Rupiah*-Qty", true);
$sql->add_param_unix();
$sql->add_param_userid();
$sql->add_where("ID");
$sql->add_where("No_Ref", $nomor);
$_id = Param::Get("ID", 0);
$_ket = strtoupper(Param::Get("Ket"));
if ( $mode_detail == "insert" ) {
$sql->InsertDB();
if ($id_inv == $id_other) {
$_id = $sql->LastInsertID();
$db->Query("INSERT INTO tmp_inv_detail_lain (No_Ref,ID,Ket,UserID,Unix) VALUES ('".$nomor."','".$_id."','".$_ket."','".user_id()."','".user_unix()."')");
}
} else if ( $mode_detail == "update" ) {
$sql->UpdateDB();
if ($id_inv == $id_other) $db->Query("UPDATE tmp_inv_detail_lain SET Ket='".$_ket."' WHERE No_Ref='".$nomor."' AND ID='".$_id."' AND UserID='".user_id()."' AND Unix='".user_unix()."'");
} else if ( $mode_detail == "delete" ) {
$db->Query("UPDATE tmp_inv_detail SET Qty=0,Stok=0,Total_Diskon=0 WHERE No_Ref='".$nomor."' AND ID='".$_id."'");
}
}
$obj = new Table($db);
$obj->set_css("tabel-pos");
$obj->set_query("SELECT D.*,-D.Qty Qty2,IF(ISNULL(O.Ket),P.Nama_Lengkap,O.Ket) Nama_Lengkap,(-D.Qty*(D.Harga_Jual-D.Disk_Rupiah)) Total,P.Kode_SKU,IF(D.InvID='".$id_other."',1,0) ISO,IF(D.Qty=0,0,1) IDEL FROM (SELECT * FROM tmp_inv_detail WHERE No_Ref='".$nomor."' AND Unix='".user_unix()."' AND Promo<2) D LEFT JOIN (SELECT * FROM tmp_inv_detail_lain WHERE No_Ref='".$nomor."' AND Unix='".user_unix()."') O ON (D.No_Ref=O.No_Ref AND D.ID=O.ID) LEFT JOIN vi_inv_produk P ON (D.InvID=P.InvID AND D.SatuanID=P.SatuanID)");
$obj->set_query_footer("SELECT CONCAT('Qty: ',FORMAT(SUM(-D.Qty),2),' / Item: ',FORMAT(COUNT(DISTINCT InvID),0)) Nama_Lengkap,SUM(-D.Qty*D.Disk_Rupiah) Disk_Rupiah,SUM(-D.Qty*(D.Harga_Jual-D.Disk_Rupiah)) Total FROM tmp_inv_detail D WHERE D.No_Ref='".$nomor."' AND D.Unix='".user_unix()."' AND D.Promo<2");
$obj->add_field("ID", "ID", "hid");
$obj->add_field("InvID", "InvID", "hid");
$obj->add_field("SatuanID", "SatuanID", "hid");
$obj->add_field("ISO", "IS OTHER", "hid");
$obj->add_field("Kode_SKU", "SKU", "c");
$obj->add_field("Nama_Lengkap", "Nama Barang", "awr");
$obj->add_field("Qty2", "Qty", "r", "koma30");
$obj->add_field("Harga_Jual", "Harga @", "r", "rupiah");
$obj->add_field("Disk_Rupiah", "Diskon @", "r", "rupiah", "rupiah");
$obj->add_field("Total", "Jumlah", "r", "rupiah", "rupiah");
$obj->set_field_order("ID", "D");
$obj->add_row_btn("clipboard", "Ubah", "POSJS.detail_ubah");
$obj->add_row_btn("trash", "Hapus", "POSJS.detail_hapus", "IDEL", 1);
$obj->set_row_color("IDEL", 0, "rcoret");
$obj->set_func_navi("POSJS.data_query('detail')");
$ajson[] = $obj->json_table("divPOS1", 8);
$ainfo = ['Total'=>0, 'Item'=>0];
$db->Query("SELECT SUM(-Qty*(Harga_Jual-Disk_Rupiah)) Total,COUNT(*) Item FROM tmp_inv_detail WHERE No_Ref='".$nomor."' AND Unix='".user_unix()."'");
if ($db->Next()) $ainfo = $db->AllRow();
$ajson[] = array('type'=>"form", 'id'=>"Total_Nota", 'value'=>$ainfo['Total']);
$ajson[] = array('type'=>"form", 'id'=>"Total_Item", 'value'=>$ainfo['Item']);
if ($db->RowFloat("Item")>0) $ajson[] = array('type'=>"html", 'id'=>"Total_Disp", 'value'=>rupiah($ainfo['Total']));
} else if ( $data == "auto-produk" ) {
$nomor = urldecode($nomor);
$tcari = Param::Get("Auto_Query");
$ajson['autodata'] = [];
$bcode = 0; $arec = [];
// Cari by SKU
$db->Query("SELECT K.InvID,P.Nama_Produk,CONCAT(K.SatuanID,':',CONVERT(P.Harga_Pokok*K.Qty USING UTF8),':',CONVERT(K.Harga_Jual USING UTF8)) Data2 FROM (SELECT * FROM inv_produk_kemasan WHERE Harga_Jual>0 AND Kode_SKU='".$tcari."' LIMIT 1) K LEFT JOIN inv_produk P ON (P.InvID=K.InvID) WHERE P.Aktif=1");
if ($db->Next()) {
$bcode = 1;
$arec = $db->AllRow();
}
// Cari by Barcode
if ($bcode == 0) {
$db->Query("SELECT K.InvID,P.Nama_Produk,CONCAT(K.SatuanID,':',CONVERT(P.Harga_Pokok*K.Qty USING UTF8),':',CONVERT(K.Harga_Jual USING UTF8)) Data2 FROM (SELECT * FROM inv_produk_kemasan WHERE Harga_Jual>0 AND Kode_Barcode='".$tcari."' LIMIT 1) K LEFT JOIN inv_produk P ON (P.InvID=K.InvID) WHERE P.Aktif=1");
if ($db->Next()) {
$bcode = 1;
$arec = $db->AllRow();
}
}
if ($bcode == 1) {
$db->Query("SELECT * FROM vi_inv_stok WHERE CabID='".$id_cab."' AND InvID='".$arec['InvID']."' LIMIT 1");
$arec['Stok'] = ($db->Next()) ? $db->RowFloat("Stok",0) : 0;
$ajson['autodata'][] = ['value'=>$arec['InvID'], 'text'=>$arec['Nama_Produk'], 'data'=>$arec['Data2'].":".$arec['Stok'], 'bc'=>1];
} else {
$db->Query("SELECT P.*,IF(IFNULL(X.Stok,0)=0,'KOSONG',ROUND(X.Stok/K.Qty,2)) Sisa_Stok,K.Kode_SKU,K.Harga_Jual,S.Nama_Satuan,CONCAT(K.SatuanID,':',CONVERT(P.Harga_Pokok*K.Qty USING UTF8),':',CONVERT(K.Harga_Jual USING UTF8),':',CONVERT(IFNULL(X.Stok,0) USING UTF8)) Data2 FROM (SELECT * FROM inv_produk_kemasan WHERE Harga_Jual>0 AND InvID IN (SELECT InvID FROM inv_produk WHERE Aktif=1 AND Nama_Produk LIKE '%".$tcari."%' ORDER BY InvID) ORDER BY InvID) K LEFT JOIN (SELECT * FROM inv_produk WHERE Aktif=1 AND Nama_Produk LIKE '%".$tcari."%' ORDER BY InvID) P ON (K.InvID=P.InvID) LEFT JOIN vi_inv_stok X ON (X.CabID='".$id_cab."' AND K.InvID=X.InvID) LEFT JOIN para_satuan S ON (S.SatuanID=K.SatuanID) ORDER BY P.Nama_Produk,K.Qty DESC LIMIT 50");
while ($db->Next()) {
$ajson['autodata'][] = ['value'=>$db->Row("InvID"), 'text'=>$db->Row("Nama_Produk"), 'html'=>'<span class="text-primary">'.$db->Row("Kode_SKU").'</span> '.$db->Row("Nama_Produk")." ".$db->Row("Nama_Satuan").' - Rp. '.rupiah($db->Row("Harga_Jual")).' <span class="text-danger">('.$db->Row("Sisa_Stok").')</span>', 'data'=>$db->Row("Data2"), 'bc'=>0];
}
}
} else if ( $data == "brow-produk" ) {
$tcari = trim(Param::Get("Cari_Produk"));
$tsql = ($tcari=="") ? "" : " AND P.Barcode_Nama LIKE '%".$tcari."%'";
$obj = new Table($db);
$obj->set_table("vi_inv_produk P", "P.*", "P.Harga_Jual>0 AND P.Aktif=1".$tsql);
$obj->add_field("InvID", "ID", "hid");
$obj->add_field("SatuanID", "ID", "hid");
$obj->add_field("Kode_SKU", "SKU", "c");
$obj->add_field("Kode_Barcode", "Kode Barcode", "c");
$obj->add_field("Nama_Lengkap", "Nama Barang", "awr");
$obj->add_field("Harga_Jual", "Harga @", "r", "rupiah");
$obj->set_field_order("Kode_SKU", "A");
$obj->add_row_btn("save", "Pilih", "POSJS.produk_select");
$obj->set_func_navi("POSJS.data_query('brow-produk')");
$ajson[] = $obj->db_table("divBrowProduk");
} else if ($data == "info_produk") {
$form = new Form($db);
$tbcode = $form->textbox("_", "Kode_Barcode", "", true);
$tnama = $form->textbox("_", "Nama_Barang", "", true);
$tgrup = $form->option_db("_", "Grup_InvID", 0, true, false, "inv_produk_grup", ["Grup_InvID","Nama_Grup"], "Aktif=1 ORDER BY Nama_Grup", [0,"&nbsp;"]);
$tsat = $form->option_db("_", "StokID", 0, true, false, "para_satuan", ["SatuanID","Nama_Satuan"], "Aktif=1 ORDER BY Nama_Satuan", [0,"&nbsp;"]);
$thjual = $form->textbox("_", "Harga_Jual", 0, true, false, "double");
echo '
<div class="row mb-1"><div class="col-sm-4 col-lg-3 col-form-label">Kode Barcode</div><div class="col-sm-7 col-lg-6">'.$tbcode.'</div></div>
<div class="row mb-1"><div class="col-sm-4 col-lg-3 col-form-label">Nama Barang</div><div class="col-sm-8 col-lg-9">'.$tnama.'</div></div>
<div class="row mb-1"><div class="col-sm-4 col-lg-3 col-form-label">Grup Barang</div><div class="col-sm-8 col-lg-9">'.$tgrup.'</div></div>
<hr class="my-2">
<div class="row mb-1"><div class="col-sm-4 col-lg-3 col-form-label">Satuan Kemasan</div><div class="col-sm-7 col-lg-6">'.$tsat.'</div></div>
<div class="row mb-1"><div class="col-sm-4 col-lg-3 col-form-label">Harga Jual @</div><div class="col-sm-7 col-lg-6">'.$thjual.'</div></div>';
} else if ($data == "simpan_produk") {
$k_barcode = Param::Get("Kode_Barcode", "");
$n_produk = Param::Get("Nama_Barang", "");
$i_grup = Param::Get("Grup_InvID", 0);
$i_stok = Param::Get("StokID", 0);
$n_harga = Param::Get("Harga_Jual", 0);
$db->Query("INSERT INTO inv_produk (Grup_InvID,Nama_Produk,StokID,NormalID,UserID) VALUES ('".$i_grup."','".$n_produk."','".$i_stok."','".$i_stok."','".user_id()."')");
$id_inv = $db->LastInsertID();
$db->Query("INSERT INTO inv_produk_kemasan SET InvID='".$id_inv."',SatuanID='".$i_stok."',Kode_SKU='".SKU_Baru($i_grup)."',Kode_Barcode='".$k_barcode."',Qty=1,Harga_Jual='".$n_harga."',UserID='".user_id()."'");
$ajson['msg'] = "Pembuatan Item Barang baru telah selesai.";
} else if ($data == "detail_produk") {
$_id = Param::Get("ID", 0);
$_id_inv = Param::Get("InvID", 0);
$_id_sat = Param::Get("SatuanID", 0);
$adetail = ['ID'=>0,'Qty'=>1,'Harga_Diskon'=>0];
$db->Query("SELECT InvID,SatuanID,Kode_SKU,Kode_Barcode,Nama_Lengkap,Nama_Satuan,Harga_Jual,Harga_Pokok Harga_Beli FROM vi_inv_produk WHERE InvID='".$_id_inv."' AND SatuanID='".$_id_sat."' LIMIT 1");
if ($db->Next()) $adetail = array_merge($adetail, $db->AllRow());
if ($mode_detail == "insert") {
} else {
$db->Query("SELECT ID,-Qty Qty,Harga_Beli,Harga_Jual,Disk_Rupiah Harga_Diskon FROM tmp_inv_detail WHERE Unix='".user_unix()."' AND No_Ref='".$nomor."' AND ID='".$_id."' LIMIT 1");
if ($db->Next()) $adetail = array_merge($adetail, $db->AllRow());
}
$form = new Form($db);
$tsku = $form->textbox("_", "Kode_SKU", $adetail['Kode_SKU']. " / " .$adetail['Kode_Barcode'], false);
$tnama = $form->textbox("_", "Nama_Lengkap", $adetail['Nama_Lengkap'], false);
$tsat = $form->textbox("_", "Nama_Satuan", $adetail['Nama_Satuan'], false);
$tqty = $form->textbox("_", "Qty", abs($adetail['Qty']), true, true, "number");
$thjual = $form->textbox("_", "Harga_Jual", $adetail['Harga_Jual'], false, false, "double");
$thdisk = $form->textbox("_", "Harga_Diskon", $adetail['Harga_Diskon'], true, false, "double");
$tpdisk = $form->textbox("_", "Persen_Diskon", 0, true, false, "double");
$tjuml = $form->textbox("_", "Jumlah", 0, false, false, "double");
echo '
<div class="row mb-1"><div class="col-sm-4 col-lg-3 col-form-label">Kode SKU / Barcode</div><div class="col-sm-8 col-lg-9">'.$tsku.'</div></div>
<div class="row mb-1"><div class="col-sm-4 col-lg-3 col-form-label">Nama Barang</div><div class="col-sm-8 col-lg-9">'.$tnama.'</div></div>
<hr class="my-2">
<div class="row mb-1"><div class="col-sm-4 col-lg-3 col-form-label">Qty</div><div class="col-sm-5 col-lg-4">'.$tqty.'</div><div class="col-sm-3 col-lg-5">'.$tsat.'</div></div>
<div class="row mb-1"><div class="col-sm-4 col-lg-3 col-form-label">Harga @</div><div class="col-sm-7 col-lg-6">'.$thjual.'</div></div>
<div class="row mb-1"><div class="col-sm-4 col-lg-3 col-form-label">Diskon @</div><div class="col-sm-5 col-lg-6">'.$thdisk.'</div><div class="col-sm-3 col-lg-3"><div class="input-group"><div class="input-group-text">&thickapprox;</div>'.$tpdisk.'<div class="input-group-text">%</div></div></div></div>
<div class="row mb-1"><div class="col-sm-4 col-lg-3 col-form-label">Sub Total</div><div class="col-sm-7 col-lg-6">'.$tjuml.'</div></div>
<input type="hidden" id="ID" value="'.$adetail['ID'].'" />
<input type="hidden" id="InvID" value="'.$adetail['InvID'].'" />
<input type="hidden" id="SatuanID" value="'.$adetail['SatuanID'].'" />
<input type="hidden" id="Harga_Beli" value="'.$adetail['Harga_Beli'].'" />
<input type="hidden" id="mode_detail" value="'.$mode_detail.'" />';
} else if ($data == "detail_lain") {
$_id = Param::Get("ID", 0);
$alain = ['ID'=>0,'Qty'=>1,'Harga_Beli'=>0,'Harga_Jual'=>0,'Ket'=>""];
$db->Query("SELECT InvID,SatuanID,Kode_SKU,Nama_Satuan FROM vi_inv_produk WHERE InvID='".$_SESSION['__APP_INV']['OTHERINVID']."' LIMIT 1");
if ($db->Next()) $alain = array_merge($alain, $db->AllRow());
if ($mode_detail == "insert") {
} else {
$db->Query("SELECT ID,-Qty Qty,Harga_Beli,Harga_Jual FROM tmp_inv_detail WHERE Unix='".user_unix()."' AND No_Ref='".$nomor."' AND ID='".$_id."' LIMIT 1");
if ($db->Next()) $alain = array_merge($alain, $db->AllRow());
$db->Query("SELECT Ket FROM tmp_inv_detail_lain WHERE Unix='".user_unix()."' AND No_Ref='".$nomor."' AND ID='".$_id."' LIMIT 1");
if ($db->Next()) $alain = array_merge($alain, $db->AllRow());
}
$form = new Form($db);
$tsku = $form->textbox("_", "Kode_SKU", $alain['Kode_SKU'], false);
$tket = $form->textbox("_", "Ket", $alain['Ket'], true);
$tsat = $form->textbox("_", "Nama_Satuan", $alain['Nama_Satuan'], false);
$tqty = $form->textbox("_", "Qty", abs($alain['Qty']), true, true, "number");
$thjual = $form->textbox("_", "Harga_Jual", $alain['Harga_Jual'], true, true, "double");
$tjuml = $form->textbox("_", "Jumlah", 0, false, false, "double");
echo '
<div class="row mb-1"><div class="col-sm-4 col-lg-3 col-form-label">Kode SKU / Barcode</div><div class="col-sm-8 col-lg-9">'.$tsku.'</div></div>
<div class="row mb-1"><div class="col-sm-4 col-lg-3 col-form-label">Nama Barang</div><div class="col-sm-8 col-lg-9">'.$tket.'</div></div>
<hr class="my-2">
<div class="row mb-1"><div class="col-sm-4 col-lg-3 col-form-label">Qty</div><div class="col-sm-5 col-lg-4">'.$tqty.'</div><div class="col-sm-3 col-lg-5">'.$tsat.'</div></div>
<div class="row mb-1"><div class="col-sm-4 col-lg-3 col-form-label">Harga @</div><div class="col-sm-7 col-lg-6">'.$thjual.'</div></div>
<div class="row mb-1"><div class="col-sm-4 col-lg-3 col-form-label">Sub Total</div><div class="col-sm-7 col-lg-6">'.$tjuml.'</div></div>
<input type="hidden" id="ID" value="'.$alain['ID'].'" />
<input type="hidden" id="InvID" value="'.$alain['InvID'].'" />
<input type="hidden" id="SatuanID" value="'.$alain['SatuanID'].'" />
<input type="hidden" id="Harga_Diskon" value="0" />
<input type="hidden" id="Persen_Diskon" value="0" />
<input type="hidden" id="Harga_Beli" value="'.$alain['Harga_Beli'].'" />
<input type="hidden" id="mode_detail" value="'.$mode_detail.'" />';
} else if ($data == "info_kasir") {
$tot_jual = Param::Get("Total_Nota", 0);
$tot_jual -= Promo_Hitung($nomor, tgl_dmy());
$form = new Form($db);
$tjual = $form->textbox("_", "popTotal_Jual", uang($tot_jual), false, false, "double");
$ttunai = $form->textbox("_", "popTotal_Tunai", 0, true, false, "double");
$tkartu = $form->textbox("_", "popTotal_Kartu", 0, true, false, "double");
$tsisa = $form->textbox("_", "popTotal_Sisa", 0, false, false, "double");
$okartu = $form->option_db("_", "popKartuID", 0, true, false, "para_rek_pos", ["KartuID","Kode_Kartu"], "Aktif=1", [0,"Pilihan Non Tunai"]);
$tnokartu = $form->textbox("_", "popNo_Kartu", "", true, false, "text");
$tnamakartu = $form->textbox("_", "popNama_Kartu", "", true, false, "text");
$ajson['html'] = '
<div class="row mb-1"><div class="col-sm-6 col-lg-5 col-form-label">Total Nota Rp.</div><div class="col-sm-6 col-lg-7">'.$tjual.'</div></div>
<div class="row mb-1"><div class="col-sm-6 col-lg-5 col-form-label">Tunai Rp.</div><div class="col-sm-6 col-lg-7">'.$ttunai.'</div></div>
<div class="row mb-1"><div class="col-sm-6 col-lg-5">'.$okartu.'</div><div class="col-sm-6 col-lg-7">'.$tkartu.'</div></div>
<div class="row mb-1"><div class="col-sm-6 col-lg-5 col-form-label">Kembali Rp.</div><div class="col-sm-6 col-lg-7">'.$tsisa.'</div></div>
<hr class="my-2 ckartu d-none">
<div class="row mb-1 ckartu d-none"><div class="col-sm-6 col-lg-5 col-form-label">Nomor Kartu</div><div class="col-sm-6 col-lg-7">'.$tnokartu.'</div></div>
<div class="row mb-1 ckartu d-none"><div class="col-sm-6 col-lg-5 col-form-label">Nama Pemilik</div><div class="col-sm-6 col-lg-7">'.$tnamakartu.'</div></div>
<hr class="my-2">
<div class="row mt-1">
<div class="col-3 d-grid"><button type="button" class="btn btn-primary" id="butKPend">Pending</button></div>
<div class="col-3">&nbsp;</div>
<div class="col-3 d-grid"><button type="button" class="btn btn-danger" id="butKBatal" data-bs-dismiss="modal">Batal</button></div>
<div class="col-3 d-grid"><button type="button" class="btn btn-success" id="butKBayar">Bayar</button></div>
</div>
<input type="hidden" id="popTotal_Bayar" value="0" />';
$ajson['Total_Disp'] = rupiah($tot_jual);
} else if ( $data == "brow-nota" ) {
$tcari = trim(Param::Get("Cari_Nota"));
$tsql = ($tcari=="") ? " AND UserID='".user_id()."' AND Tgl_Jual='".tgl_ymd()."'" : " AND CONCAT(No_Jual,DATE_FORMAT(Tgl_Jual,'%d-%m-%Y')) LIKE '%".$tcari."%'";
$obj = new Table($db);
$obj->set_table("(SELECT * FROM inv_jual WHERE CabID='".$id_cab."'".$tsql.") J LEFT JOIN para_rek_pos P ON (J.KartuID=P.KartuID)", "J.*,DATE_FORMAT(J.DateStamp,'%H:%i:%s') Tgl_Jual2,J.Total_Jual-J.Total_Diskon Total,J.Total_Jual-J.Total_Diskon-J.Total_Bayar Kembali,J.UserID,IF(ISNULL(P.Kode_Kartu),'Tunai',P.Kode_Kartu) Kartu", "");
$obj->set_query_footer("SELECT SUM(Total_Jual-Total_Diskon) Total,SUM(Total_Jual-Total_Diskon-Total_Bayar) Kembali FROM inv_jual WHERE CabID='".$id_cab."'".$tsql);
$obj->add_field("No_Jual", "No. Nota", "c");
$obj->add_field("Tgl_Jual", "Tanggal", "c", "sqltgl");
$obj->add_field("Tgl_Jual2", "Jam", "c");
$obj->add_field("Total", "Jumlah", "r", "rupiah", "rupiah");
$obj->add_field("Total_Bayar", "Bayar", "r", "rupiah", "rupiah");
$obj->add_field("Kembali", "Kembali", "r", "rupiah", "rupiah");
$obj->add_field("Kartu", "C / D", "left");
if ($tcari<>"") {
$obj->set_field_order("Tgl_Jual", "D");
$obj->set_limit(100);
} else {
$obj->set_field_order("Tgl_Jual2", "D");
}
$obj->add_row_btn("printer", "Cetak", "POSJS.nota_print");
$obj->add_row_btn("clipboard", "Ubah", "POSJS.nota_select");
if (user_level(1)) $obj->add_row_btn("trash", "Hapus", "POSJS.nota_delete", "CabID", $id_cab);
else $obj->add_row_btn("trash", "Hapus", "POSJS.nota_delete", "UserID", user_id());
$obj->set_func_navi("POSJS.data_query('brow-nota')");
$ajson[] = $obj->db_table("divBrowNota");
} else if ( $data == "brow-pending" ) {
$obj = new Table($db);
$obj->set_query("SELECT J.*,J.Total_Jual-J.Total_Diskon Total,J.UserID FROM inv_jual_pend J WHERE J.CabID='".$id_cab."' AND J.UserID='".user_id()."'");
$obj->add_field("No_Jual", "No. Nota", "c");
$obj->add_field("Total_Jual", "Sub. Total", "r", "rupiah");
$obj->add_field("Total_Diskon", "Diskon", "r", "rupiah");
$obj->add_field("Total", "Total", "r", "rupiah");
$obj->set_field_order("No_Jual", "D");
$obj->add_row_btn("save", "Pilih", "POSJS.pending_select");
if (user_level(1)) $obj->add_row_btn("trash", "Hapus", "POSJS.pending_delete", "UserID", user_id());
$obj->set_func_navi("POSJS.data_query('brow-pending')");
$ajson[] = $obj->json_table("divBrowPending");
} else if ( $data == "pole-config") {
$ajson['pole'] = []; $apole = [];
$db->Query("SELECT * FROM disp_config WHERE REG_ID='".$_SESSION['__WEB_APP']['APP_CODE']."' LIMIT 1");
if ($db->Next()) $apole = $db->AllRow();
foreach ($apole as $_key => $_val) {
if (strpos($_key, "POLE") !== false) {
if (strpos($_key, "ENABLE") !== false) $_val = intval($_val);
$ajson['pole'][str_replace("POLE_","",$_key)] = $_val;
}
}
} else if ( $data == "default") {
echo '
<div class="fade-in">
<div class="card"><div class="card-body">
<div class="row flex-column-reverse flex-md-row">
<div class="col-sm-12 col-md-9 col-lg-10 mt-3 mt-md-0">
<div class="row mb-1">
<div class="col-sm-9 col-lg-10">
<input type="search" class="form-control fs-5" id="Nama_Produk" value="" placeholder="Scan SKU / Barcode / Ketik Nama Barang" autocomplete="off" />
</div>
<div class="col-sm-3 col-lg-2">
<input type="double" class="form-control double fs-5" id="POS_Qty" value="1.00" maxlength="10" onblur="POSJS.onblur_Qty();" />
</div>
</div>
<div id="divPOS1">&nbsp;</div>
</div>
<div class="col-sm-12 col-md-3 col-lg-2 border-start">
<div id="divPOS2">&nbsp;</div>
</div>
</div>
</div></div></div>';
}
send_json($ajson);
?>
+85
View File
@@ -0,0 +1,85 @@
<?php
/*******************************************************************
Module : /apps/php/login.php
Desc. : PHP - Halaman Proses Login
Created By : Siau Pheng (siaupheng@3fonia.com).
Created Date : January 5th, 2008.
Last Modified : April 29th, 2022.
(c) 2008 - 2019, 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
require_once(__DIR__."/../../../../vendor/autoload.php");
use siaupheng\fonia3\DB\MySQL;
use siaupheng\fonia3\Web\Auth;
use siaupheng\fonia3\Web\Param;
$db = $db ?? new MySQL();
$auth = new Auth($db);
$ajson = [];
$mode = Param::Get("mode");
$aapp = $_SESSION['__WEB_APP'];
if ($mode == "login") {
$auser = [];
$auth->set_id_reg($aapp['PARENT_CODE']);
if ($auth->user_check(Param::Get("Username"), Param::Get("Password"))) {
$auser = $auth->user_data(Param::Get("Username"));
//MONITOR DISPLAY
if ($_SESSION['__APP_INV']['MON_ENABLE']) {
$db->Query("DELETE FROM disp_login WHERE CabID='".$_SESSION['__APP_INV']['CABANGID']."' AND UserID='".$auser["UserID"]."'");
$db->Query("INSERT INTO disp_login SET IP='".$_SERVER['REMOTE_ADDR']."',CabID='".$_SESSION['__APP_INV']['CABANGID']."',UserID='".$auser["UserID"]."',Unix='".$auser['UNIX']."',Date=NOW()");
}
$_SESSION['__WEB_USER'] = $auser;
$_appurl = $_GET['redir'];
if (!empty($_appurl)) {
$_redir = $auth->redirect($_appurl);
//jika kosong, tampilkan pesan redirect tidak diijinkan
//jika berisi, js harus redirect ...
}
$ajson['token'] = $_SESSION['APP_TOKEN'];
$ajson['hasil'] = "SUKSES";
$ajson['pesan'] = '<div class="border border-success p-2 pt-3"><h5>Login berhasil,</h5><p><b>'.$auser["Username"].'</b> / '.$auser["Nama"].'<br>'.$auser["Posisi"].'<br><i>login terakhir :</i><br>'.tgl_sql2str($auser["Last_Date"],true).'<br>'.$auser["Last_IP"].'</p></div>';
} else {
$ajson['hasil'] = "ERROR";
$ajson['pesan'] = "Periksa kembali ID Pengguna atau Password Anda ...";
}
} else if ($mode == "logout") {
//MONITOR DISPLAY
if ($_SESSION['__APP_INV']['MON_ENABLE']) {
$db->Query("DELETE FROM disp_login WHERE CabID='".$_SESSION['__APP_INV']['CABANGID']."' AND UserID='".$_SESSION['__WEB_USER']["ID"]."' AND IP='".$_SERVER['REMOTE_ADDR']."' AND Unix='".$_SESSION['__WEB_USER']['UNIX']."'");
}
$auth->logout();
foreach ($_SESSION as $_key => $_val) {
if (substr($_key,0,5)=="__WEB") unset($_SESSION[$_key]);
if (substr($_key,0,5)=="__APP") unset($_SESSION[$_key]);
}
require(__DIR__."/../cfg/app.php");
if ($_SERVER['SERVER_ADDR'] == "127.0.0.1") {
$_host = $aapp['WEB_PATH']."../";
} else {
$_host = (isset($_SERVER['HTTP_ORIGIN']) ? $_SERVER['HTTP_ORIGIN'] : $aapp['PARENT_SITE']);
$_host = str_replace(['http://','https://'], "", $_host);
if ($aapp['PARENT_SUB'] == true) {
$_subs = explode('.', $_host);
if (count($_subs) > 2) array_shift($_subs);
$_host = implode('.', $_subs);
}
$_host = "//" . $_host;
}
$ajson['nexthost'] = $_host;
}
send_json($ajson);
?>
+159
View File
@@ -0,0 +1,159 @@
<?php
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/php/repo/barcode.php
Desc. : PHP - Cetak Barcode Label
Created By : Siau Pheng (siaupheng@3fonia.com).
Created Date : October 28th, 2013.
Last Modified : October 2nd, 2025.
(c) 2013 - 2025, 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
require_once(__DIR__."/../../../../../vendor/autoload.php");
require_once(__DIR__."/../func.iss.php");
use siaupheng\fonia3\DB\MySQL;
use siaupheng\fonia3\Web\Param;
use siaupheng\fonia3\Web\Table;
use siaupheng\fonia3\Web\Form;
function gen_bc_ppla($lbarc="", $lnama="", $lharga="", $lkdsup="") {
$lbc1 = substr($lbarc, 0, 4);
$lbc2 = substr($lbarc, 4, 4);
return [
chr(2).'K1503', // gap 3mm
chr(2).'e', // gap sensor edge
chr(2).'f326', // feed 1" = 320 & auto backfeed
chr(2).'L',
'D11',
'191100200020027'.$lharga,
'1d5202800130027'.$lbarc,
'121100100460027'.$lnama,
'291100200410100'.$lbc2,
'291100200410110'.$lbc1,
'291100100410127'.$lkdsup,
'421100100050022'.$_SESSION['__WEB_APP']['REG_NAME'],
'191100200020165'.$lharga,
'1d5202800130165'.$lbarc,
'121100100460165'.$lnama,
'291100200410238'.$lbc2,
'291100200410248'.$lbc1,
'291100100410265'.$lkdsup,
'421100100050160'.$_SESSION['__WEB_APP']['REG_NAME'],
'191100200020302'.$lharga,
'1d5202800130302'.$lbarc,
'121100100460302'.$lnama,
'291100200410375'.$lbc2,
'291100200410385'.$lbc1,
'291100100410402'.$lkdsup,
'421100100050297'.$_SESSION['__WEB_APP']['REG_NAME'],
'E'];
}
$db = $db ?? new MySQL();
$ajson = [];
$data = Param::Get("data");
$id_inv = Param::Get("InvID");
$id_sat = Param::Get("SatuanID");
if ( $data == "print-barcode" ) {
$qty = Param::Get("Qty", 3);
$ksup = Param::Get("Kode_Sup", "");
$nbaris = ceil($qty / 3);
$db->Query("SELECT P.*,LEFT(P.Nama_Lengkap,20) Nama2 FROM vi_inv_produk P WHERE P.InvID='".$id_inv."' AND P.SatuanID='".$id_sat."' ORDER BY P.Harga_Jual DESC LIMIT 1");
if ($db->Next()) {
$ajson = ['type' => "epl", 'config' => ['times' => $nbaris], 'content' => gen_bc_ppla($db->Row("Kode_SKU"), $db->Row("Nama2"), "Rp.".rupiah($db->Row("Harga_Jual")), $ksup)];
}
} else if ($data == "auto-produk") {
$tcari = Param::Get("Auto_Query");
$ajson['autodata'] = [];
$bcode = 0; $arec = [];
// Cari by SKU
$db->Query("SELECT P.*,CONCAT(K.Kode_SKU,':',K.SatuanID) Data2 FROM (SELECT * FROM inv_produk_kemasan WHERE Harga_Jual>0 AND Kode_SKU='".$tcari."' LIMIT 1) K LEFT JOIN inv_produk P ON (P.InvID=K.InvID) LEFT JOIN para_satuan S ON (S.SatuanID=K.SatuanID) WHERE P.Aktif=1");
if ($db->Next()) {
$bcode = 1;
$arec = $db->AllRow();
}
// Cari by Barcode
if ($bcode == 0) {
$db->Query("SELECT P.*,CONCAT(K.Kode_SKU,':',K.SatuanID) Data2 FROM (SELECT * FROM inv_produk_kemasan WHERE Harga_Jual>0 AND Kode_Barcode='".$tcari."' LIMIT 1) K LEFT JOIN inv_produk P ON (P.InvID=K.InvID) LEFT JOIN para_satuan S ON (S.SatuanID=K.SatuanID) WHERE P.Aktif=1");
if ($db->Next()) {
$bcode = 1;
$arec = $db->AllRow();
}
}
if ($bcode == 1) {
$ajson['autodata'][] = ['value'=>$arec['InvID'], 'text'=>$arec['Nama_Produk'], 'data'=>$arec['Data2'], 'bc'=>1];
} else {
$db->Query("SELECT P.*,K.Kode_SKU,K.Harga_Jual,S.Nama_Satuan,CONCAT(K.Kode_SKU,':',K.SatuanID) Data2 FROM (SELECT * FROM inv_produk_kemasan WHERE Harga_Jual>0 AND InvID IN (SELECT InvID FROM inv_produk WHERE Aktif=1 AND Nama_Produk LIKE '%".$tcari."%' ORDER BY InvID) ORDER BY InvID) K LEFT JOIN (SELECT * FROM inv_produk WHERE Aktif=1 AND Nama_Produk LIKE '%".$tcari."%' ORDER BY InvID) P ON (K.InvID=P.InvID) LEFT JOIN para_satuan S ON (S.SatuanID=K.SatuanID) ORDER BY P.Nama_Produk,K.Qty DESC LIMIT 50");
while ($db->Next()) {
$ajson['autodata'][] = ['value'=>$db->Row("InvID"), 'text'=>$db->Row("Nama_Produk"), 'html'=>'<span class="text-primary">'.$db->Row("Kode_SKU").'</span> '.$db->Row("Nama_Produk")." ".$db->Row("Nama_Satuan").' - Rp. '.rupiah($db->Row("Harga_Jual")), 'data'=>$db->Row("Data2"), 'bc'=>0];
}
}
} else if ( $data == "brow-produk" ) {
$tcari = trim(Param::Get("Cari_Produk"));
$tsql = ($tcari=="") ? "" : " AND P.Barcode_Nama LIKE '%".$tcari."%'";
$obj = new Table($db);
$obj->set_table("vi_inv_produk P", "P.*", "P.Harga_Jual>0 AND P.Aktif=1".$tsql);
$obj->add_field("InvID", "ID", "hid");
$obj->add_field("SatuanID", "Satuan", "hid");
$obj->add_field("Kode_SKU", "SKU", "c");
$obj->add_field("Kode_Barcode", "Kode Barcode", "c");
$obj->add_field("Nama_Lengkap", "Nama Barang", "awr");
$obj->set_field_order("Kode_SKU", "A");
$obj->add_row_btn("save", "Pilih", "RepoBarcodeJS.produk_select");
$obj->set_func_navi("RepoBarcodeJS.data_query('brow-produk')");
$ajson[] = $obj->db_table("divBrowProduk");
} else if ( $data == "opt-sup" ) {
$avalue = [['value'=>"", 'html'=>"Tanpa Kode"]];
$db->Query("SELECT Kode_Sup,Nama_Sup FROM para_supplier WHERE SupID IN (SELECT SupID FROM inv_produk_sup WHERE InvID='".$id_inv."') ORDER BY Aktif DESC,Nama_Sup");
while ($db->Next()) {
$avalue[] = ['value'=>$db->Row("Kode_Sup"), 'html'=>$db->Row("Nama_Sup")];
}
$ajson[] = ['type'=>"option", 'id'=>"Kode_Sup", 'avalue'=>$avalue];
} else if ( $data == "load-printer" ) {
$aprint = explode("|", Param::Get("Printer")); $avalue = [['value'=>"", 'html'=>"Pilih Printer"]];
$tdefp = Param::Get("DefPrint", "");
$db->Query("DELETE FROM app_printer WHERE IP='".$_SERVER['REMOTE_ADDR']."' AND CabID='".$_SESSION['__APP_INV']['CABANGID']."'");
foreach ($aprint as $_key => $_val) {
if ($_val<>"") {
$_def = ($tdefp==$_val) ? 1 : 0;
$db->Query("INSERT IGNORE INTO app_printer SET IP='".$_SERVER['REMOTE_ADDR']."',CabID='".$_SESSION['__APP_INV']['CABANGID']."',N_Printer='".$_val."',Defa=".$_def);
}
}
$db->Query("SELECT * FROM app_printer WHERE IP='".$_SERVER['REMOTE_ADDR']."' AND CabID='".$_SESSION['__APP_INV']['CABANGID']."'");
while ($db->Next()) {
$avalue[] = ['value'=>$db->Row("N_Printer"), 'html'=>$db->Row("N_Printer")];
}
$ajson[] = ['type'=>"option", 'id'=>"Printer", 'avalue'=>$avalue];
} else if ( $data == "default") {
$form = new Form($db);
$tsku = $form->textbox("_", "Kode_SKU", null, false, false);
$tbrg = $form->textauto("_", "Nama_Produk", null, true, true, "Nama Barang");
$tsup = $form->option("_", "Kode_Sup", "", true, false, [0=>"Tanpa Kode"]);
$tprt = $form->option_db("_", "Printer", "", true, false, "app_printer", ["N_Printer","N_Printer"], "IP='".$_SERVER['REMOTE_ADDR']."' AND CabID='".$_SESSION['__APP_INV']['CABANGID']."'", [0,"Pilih Printer"]);
$tqty = $form->textbox("_", "Qty", 3, true, false, "number");
echo '
<div class="row mb-1"><label class="col-sm-3 col-lg-3 col-form-label">Kode SKU</label><div class="col-sm-8 col-lg-5">'.$tsku.'</div></div>
<div class="row mb-1"><label class="col-sm-3 col-lg-3 col-form-label" for="Nama_Produk">Nama Barang</label><div class="col"><div class="input-group">'.$tbrg.'<button class="btn btn-info shadow-none" type="button" id="butBrow"><i class="bi-search"></i></button></div></div></div>
<div class="row mb-1"><label class="col-sm-3 col-lg-3 col-form-label" for="Kode_Sup">Kode Supplier</label><div class="col-sm-8 col-lg-5">'.$tsup.'</div></div>
<div class="row mb-1"><div class="col"><hr class="my-2"></div></div>
<div class="row mb-1"><label class="col-sm-3 col-lg-3 col-form-label" for="Printer">Nama Printer</label><div class="col"><div class="input-group">'.$tprt.'<button class="btn btn-secondary shadow-none" type="button" id="butPL"><i class="bi-arrow-repeat"></i></button></div></div></div>
<div class="row mb-1"><label class="col-sm-3 col-lg-3 col-form-label" for="Qty">Jumlah Stiker</label><div class="col-sm-5 col-lg-3"><div class="input-group">'.$tqty.Form_Info("Untuk menghemat stiker, bisa gunakan jumlah cetak dalam kelipatan 3.").'</div></div></div>
<input type="hidden" id="InvID" value="0" /><input type="hidden" id="SatuanID" value="0" />';
}
send_json($ajson);
?>
+228
View File
@@ -0,0 +1,228 @@
<?php
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/php/repo/dana_pos.php
Desc. : PHP - Laporan Penerimaan Kasir / POS
Created By : Siau Pheng (siaupheng@3fonia.com).
Created Date : March 2nd, 2014.
Last Modified : September 30th, 2025.
(c) 2012 - 2025, 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
require_once(__DIR__."/../../../../../vendor/autoload.php");
require_once(__DIR__."/../func.iss.php");
use siaupheng\fonia3\DB\MySQL;
use siaupheng\fonia3\Web\Param;
use siaupheng\fonia3\Web\Form;
use siaupheng\fonia3\Data\SimpleXLS;
$db = $db ?? new MySQL();
$ajson = [];
$data = Param::Get("data");
$id_cab = Param::Get("CabID", $_SESSION['__APP_INV']['CABANGID']);
if (in_array($data, ["print","print-pos","export"])) {
$tipe = Param::Get("Tipe", "R"); // R or D
$id_kasir = Param::Get("KasirID", 0);
$tglfrom = Param::Get("Tgl_From");
$tglto = Param::Get("Tgl_To");
// generate report header
$tglheader = $tglfrom;
if ($tglfrom!==$tglto) $tglheader .= " S/D ".$tglto;
$tglfrom = tgl_sql2str($tglfrom);
$tglto = tgl_sql2str($tglto);
$tsql = ($id_cab==0) ? "" : " AND CabID='".$id_cab."'";
$tsql .= ($id_kasir==0) ? "" : " AND UserID='".$id_kasir."'";
if ($data=="print-pos") {
$tsql = " AND UserID='".$id_kasir."'";
$tsql .= ($id_cab==0) ? "" : " AND CabID='".$id_cab."'";
$db->Query("SELECT O.Username,O.Nama Nama_User FROM app_operator O WHERE O.UserID='".$id_kasir."'");
if ($db->Next()) $ainfo = $db->AllRow();
$db->Query("SELECT J.KartuID,IF(J.KartuID=0,'Cash / Uang Tunai',K.Nama_Kartu) Kartu,SUM(IF(J.Kode='J',J.Total_Jual-J.Total_Diskon-J.Total_Potong,0)) Total_Jual,SUM(IF(J.Kode='P',J.Total_Jual,0)) Total_Pulsa,SUM(J.Total_Diskon) Total_Diskon,SUM(J.Total_Potong) Total_Potong,SUM(J.Total_Cash) Total_Cash,SUM(J.Total_Kartu) Total_Kartu FROM (SELECT 'J' Kode,KartuID,SUM(Total_Jual) Total_Jual,SUM(Total_Jual-Total_Kartu-Total_Diskon-Total_Potong) Total_Cash,SUM(Total_Kartu) Total_Kartu,SUM(Total_Diskon) Total_Diskon,SUM(Total_Potong) Total_Potong FROM inv_jual WHERE (Tgl_Jual BETWEEN '".$tglfrom."' AND '".$tglto."')".$tsql." GROUP BY KartuID ORDER BY KartuID) J LEFT JOIN para_rek_pos K ON (J.KartuID=K.KartuID) GROUP BY J.KartuID ORDER BY J.KartuID");
} else {
if ($tipe=="R") {
$db->Query("SELECT O.UserID,O.Nama Nama_User,SUM(IF(J.Kode='J',J.Total_Jual,0)) Total_Jual,SUM(IF(J.Kode='P',J.Total_Jual,0)) Total_Pulsa,SUM(J.Total_Jual-J.Total_Kartu-J.Total_Potong) Total_Cash,SUM(J.Total_Kartu) Total_Kartu,SUM(J.Total_Potong) Total_Potong FROM (SELECT 'J' Kode,UserID,KartuID,SUM(Total_Jual-Total_Diskon) Total_Jual,SUM(Total_Kartu) Total_Kartu,SUM(Total_Potong) Total_Potong FROM inv_jual WHERE (Tgl_Jual BETWEEN '".$tglfrom."' AND '".$tglto."')".$tsql." GROUP BY UserID,KartuID ORDER BY UserID,KartuID) J LEFT JOIN app_operator O ON (J.UserID=O.UserID) GROUP BY J.UserID");
} else {
$db->Query("SELECT J.*,O.Nama Nama_User FROM (SELECT *,DATE_FORMAT(Tgl_Jual,'%d-%m-%Y') Tgl_Jual2,Total_Jual-Total_Diskon Total_Jual2,Total_Jual-Total_Kartu-Total_Diskon-Total_Potong Total_Cash FROM inv_jual WHERE (Tgl_Jual BETWEEN '".$tglfrom."' AND '".$tglto."')".$tsql." ORDER BY No_Jual) J LEFT JOIN app_operator O ON (J.UserID=O.UserID) ORDER BY J.No_Jual");
}
}
}
if ( $data == "print-pos" ) {
$tot_jual = 0; $tot_pulsa = 0; $tot_potong = 0; $tot_diskon = 0; $tot_dana = 0;
$adana = [[0=>"Cash / Uang Tunai",1=>0]];
while ($db->Next()) {
$adana[0][1] += $db->Row("Total_Cash");
if ($db->Row("KartuID") > 0) {
$adana[$db->Row("KartuID")] = [$db->Row("Kartu"), $db->Row("Total_Kartu")];
}
$tot_jual += $db->Row("Total_Jual");
$tot_pulsa += $db->Row("Total_Pulsa");
$tot_potong += $db->Row("Total_Potong");
$tot_diskon += $db->Row("Total_Diskon");
}
$tot_dana = $tot_jual + $tot_pulsa - $tot_potong - $tot_diskon;
$pre = new \siaupheng\fonia3\Printer\PrintPOS();
$pre->set_fontsize(2);
$pre->set_header_logo("logo-nota.png");
if ($_SESSION['__APP_INV']['PRINT_OPENCD']==1) $pre->set_opendrawer();
if ($_SESSION['__APP_INV']['PRINT_AUTOCUT']==1) $pre->set_cutpaper();
$pre->add_empty();
$pre->addc("REKAP PENERIMAAN KASIR / POS");
$pre->addc("Periode : ".$tglheader);
$pre->add_empty();
$pre->add("Operator : ".$ainfo['Username']);
$pre->add("Nama : ".$ainfo['Nama_User']);
$pre->add_empty();
$pre->add(array("Jumlah Penjualan Rp.",24), array(rupiah($tot_jual-$tot_diskon),16,"R"));
//$pre->add(array("Jumlah Pulsa & PPOB Rp.",24), array(rupiah($tot_pulsa),16,"R"));
$pre->add(array("Jumlah Diskon Rp.",24), array(rupiah($tot_diskon),16,"R"));
if ($tot_potong>0) $pre->add(array("Jumlah Promo Rp.",24), array(rupiah($tot_potong),16,"R"));
$pre->add_line("-");
if (count($adana)>1) {
foreach($adana as $_key => $_val) {
$pre->add(array($_val[0],21,"L"), array("Rp.",3), array(rupiah($_val[1]),16,"R"));
}
$pre->add_line("-");
}
$pre->add(array("TOTAL PENERIMAAN Rp.",24), array(rupiah($tot_dana),16,"R"));
$pre->add_line("=");
$pre->add_stamp(1, true);
$pre->add_empty($_SESSION['__APP_INV']['PRINT_ROW']);
$pre->show();
} else if ( $data == "print" ) {
Report_Header(($tipe=="R"?"REKAP":"DETAIL")." PENERIMAAN KASIR / POS", "Periode : ".$tglheader);
$pre = new \siaupheng\fonia3\Printer\PrintHTML();
if ($tipe=="R") {
$pre->add_field("No.",10,"C");
$pre->add_field("Nama Operator",30,"L");
$pre->add_field("Penjualan",20,"R","rupiah");
//$pre->add_field("Pulsa & PPOB",20,"R","rupiah");
$pre->add_field("Tunai",20,"R","rupiah");
$pre->add_field("Non Tunai",20,"R","rupiah");
$tot_jual = 0; $tot_pulsa = 0; $tot_cash = 0; $tot_deb = 0; $nomor = 0;
while ($db->Next()) {
$tot_jual += $db->Row("Total_Jual");
$tot_pulsa += $db->Row("Total_Pulsa");
$tot_cash += $db->Row("Total_Cash");
$tot_deb += $db->Row("Total_Kartu");
$pre->add_value(++$nomor, $db->Row("Nama_User"), $db->Row("Total_Jual"), $db->Row("Total_Cash"), $db->Row("Total_Kartu"));
}
$pre->add_span(array("GRAND TOTAL",2,"R,B"),array($tot_jual,1,"R,B","rupiah"),array($tot_cash,1,"R,B","rupiah"),array($tot_deb,1,"R,B","rupiah"));
} else {
$pre->add_field("No. Nota",30,"C");
$pre->add_field("Tanggal",30,"C");
$pre->add_field("Penjualan",20,"R","rupiah");
$pre->add_field("Tunai",20,"R","rupiah");
$pre->add_field("Non Tunai",20,"R","rupiah");
$pre->add_field("Operator",30,"L");
$tot_jual = 0; $tot_cash = 0; $tot_deb = 0;
while ($db->Next()) {
$tot_jual += $db->Row("Total_Jual2");
$tot_cash += $db->Row("Total_Cash");
$tot_deb += $db->Row("Total_Kartu");
$pre->add_value($db->Row("No_Jual"), $db->Row("Tgl_Jual2"), $db->Row("Total_Jual2"), $db->Row("Total_Cash"), $db->Row("Total_Kartu"), $db->Row("Nama_User"));
}
$pre->add_span(array("GRAND TOTAL",2,"R,B"),array($tot_jual,1,"R,B","rupiah"),array($tot_cash,1,"R,B","rupiah"),array($tot_deb,1,"R,B","rupiah"),array());
}
$pre->add_stamp(1, true);
$pre->show();
} else if ( $data == "export" ) {
$xls = new SimpleXLS([
'title'=>"Data Penerimaan POS",
'desc'=>"Export Data Penerimaan POS"
]);
$xls->add_header("<b>".$_SESSION['__WEB_APP']['REG_NAME']."</b>");
$xls->add_header("<b>DATA ".($tipe=="R"?"REKAP":"DETAIL")." PENERIMAAN KASIR / POS</b>");
$xls->add_header("Periode : ".$tglheader);
if ($tipe=="R") {
$xls->add_field("No.", 5, "C");
$xls->add_field("Nama Operator", 50, "L");
$xls->add_field("Penjualan", 15, "R,N");
//$xls->add_field("Pulsa & PPOB", 15, "R,N");
$xls->add_field("Tunai", 15, "R,N");
$xls->add_field("Non Tunai", 15, "R,N");
$xls->add_sheet("".str_replace("S/D","-",$tglheader), true);
$tot_jual = 0; $tot_pulsa = 0; $tot_cash = 0; $tot_deb = 0; $nomor = 0;
while ($db->Next()) {
$tot_jual += $db->Row("Total_Jual");
$tot_pulsa += $db->Row("Total_Pulsa");
$tot_cash += $db->Row("Total_Cash");
$tot_deb += $db->Row("Total_Kartu");
$xls->add_value(++$nomor, $db->Row("Nama_User"), $db->Row("Total_Jual"), $db->Row("Total_Cash"), $db->Row("Total_Kartu"));
}
$xls->add_span(array("GRAND TOTAL",2,"R,B"),array($tot_jual,1,"R,N,B"),array($tot_cash,1,"R,N,B"),array($tot_deb,1,"R,N,B"));
} else {
$xls->add_field("No. Nota", 15, "C");
$xls->add_field("Tanggal", 12, "C", "tgl_sql2str");
$xls->add_field("Penjualan", 15, "R,N");
$xls->add_field("Tunai", 15, "R,N");
$xls->add_field("Non Tunai", 15, "R,N");
$xls->add_field("Operator", 30, "L");
$xls->add_sheet("".str_replace("S/D","-",$tglheader), true);
$tot_jual = 0; $tot_cash = 0; $tot_deb = 0;
while ($db->Next()) {
$tot_jual += $db->Row("Total_Jual2");
$tot_cash += $db->Row("Total_Cash");
$tot_deb += $db->Row("Total_Kartu");
$xls->add_value($db->Row("No_Jual"), $db->Row("Tgl_Jual2"), $db->Row("Total_Jual2"), $db->Row("Total_Cash"), $db->Row("Total_Kartu"), $db->Row("Nama_User"));
}
$xls->add_span(array("GRAND TOTAL",2,"R,B"),array($tot_jual,1,"R,N,B"),array($tot_cash,1,"R,N,B"),array($tot_deb,1,"R,N,B"),array("",1,"L,B"));
}
$xls->add_stamp(1, true);
$xls->send("Data Penerimaan POS ".str_replace("S/D","-",$tglheader).".xlsx");
unset($xls);
} else if ( $data == "default") {
$ikasir = ($_SESSION['__WEB_USER']['Level']<9) ? 0 : user_id();
$tsql = ($_SESSION['__WEB_USER']['Level']<9) ? " AND Level>=".$_SESSION['__WEB_USER']['Level'] : " AND UserID='".user_id()."'";
$form = new Form($db);
$ttipe = $form->radio("_", "Tipe", "R", true, false, ["R"=>"Rekap","D"=>"Detail"]);
$tcab = $form->option_db("_", "CabID", $id_cab, false, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID", [0,"SEMUA CABANG"]);
$tkasir = $form->option_db("_", "KasirID", $ikasir, true, false, "app_operator", ["UserID","Nama"], "Aktif=1 ".((user_id()==1)?"":"AND UserID>1").$tsql, (($ikasir==0)?[0,"SEMUA OPERATOR"]:null));
$tfrom = $form->datebox("_", "Tgl_From", tgl_ymd(), true, false);
$tto = $form->datebox("_", "Tgl_To", tgl_ymd(), true, false);
echo '
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Tipe">Tipe Laporan</label>
<div class="col col-form-label">'.$ttipe.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="CabID">Nama Cabang</label>
<div class="col">'.$tcab.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="KasirID">Nama Operator</label>
<div class="col">'.$tkasir.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Tgl_From">Dari Tanggal</label>
<div class="col-sm-8 col-lg-5">'.$tfrom.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Tgl_To">Sampai Tgl</label>
<div class="col-sm-8 col-lg-5">'.$tto.'</div>
</div>';
}
?>
+167
View File
@@ -0,0 +1,167 @@
<?php
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/php/repo/jual.php
Desc. : PHP - Laporan Penjualan
Created By : Siau Pheng (siaupheng@3fonia.com).
Created Date : April 12th, 2011.
Last Modified : September 30th, 2025.
(c) 2011 - 2025, 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
require_once(__DIR__."/../../../../../vendor/autoload.php");
require_once(__DIR__."/../func.iss.php");
use siaupheng\fonia3\DB\MySQL;
use siaupheng\fonia3\Web\Param;
use siaupheng\fonia3\Web\Form;
use siaupheng\fonia3\Data\SimpleXLS;
$db = $db ?? new MySQL();
$ajson = [];
$data = Param::Get("data");
$id_cab = Param::Get("CabID", $_SESSION['__APP_INV']['CABANGID']);
if (in_array($data, ["print","export"])) {
$tipe = Param::Get("Tipe", "R"); // R or D
$tglfrom = Param::Get("Tgl_From");
$tglto = Param::Get("Tgl_To");
// generate report header
$tglheader = $tglfrom;
if ($tglfrom!==$tglto) $tglheader .= " S/D ".$tglto;
$tglfrom = tgl_sql2str($tglfrom);
$tglto = tgl_sql2str($tglto);
$tsql = ($id_cab==0) ? "" : " AND CabID='".$id_cab."'";
if ($tipe=="R") {
$db->Query("SELECT J.Tgl_Jual,SUM(J.Total_Jual) Total_Jual,SUM(J.Total_Diskon) Total_Diskon,SUM(J.Total_Jual-J.Total_Diskon) Total FROM (SELECT * FROM inv_jual WHERE (Tgl_Jual BETWEEN '".$tglfrom."' AND '".$tglto."')".$tsql.") J GROUP BY Tgl_Jual ORDER BY J.Tgl_Jual");
} else {
$db->Query("SELECT D.*,DATE_FORMAT(D.Tgl_Ref,'%d-%m-%Y') Tgl_Jual,IF(ISNULL(O.Nama),'KASIR POS',O.Nama) Nama_User FROM (SELECT No_Ref No_Jual,Tgl_Ref,SUM(-Qty*Harga_Jual) Total_Jual,SUM(Total_Diskon) Total_Diskon,SUM((-Qty*Harga_Jual)-Total_Diskon) Total,UserID FROM inv_detail WHERE (Tgl_Ref BETWEEN '".$tglfrom."' AND '".$tglto."')".$tsql." AND NotaID=5 GROUP BY No_Ref) D LEFT JOIN app_operator O ON (D.UserID=O.UserID) ORDER BY D.No_Jual");
}
}
if ( $data == "print" ) {
Report_Header(($tipe=="R"?"REKAP":"DETAIL")." PENJUALAN", "Periode : ".$tglheader);
$pre = new \siaupheng\fonia3\Printer\PrintHTML();
if ($tipe=="R") {
$pre->add_field("No.",10,"C");
$pre->add_field("Tanggal",30,"C","sqltgl");
$pre->add_field("Sub. Total",20,"R","rupiah");
$pre->add_field("Diskon",20,"R","rupiah");
$pre->add_field("Total",20,"R","rupiah");
$tot_jual = 0; $tot_diskon = 0; $nomor = 0;
while ($db->Next()) {
if ($db->RowFloat("Total", 0) == 0) continue;
$tot_jual += $db->Row("Total_Jual");
$tot_diskon += $db->Row("Total_Diskon");
$pre->add_value(++$nomor, $db->Row("Tgl_Jual"), $db->Row("Total_Jual"), $db->Row("Total_Diskon"), $db->Row("Total"));
}
$pre->add_span(array("GRAND TOTAL",2,"R,B"),array($tot_jual,1,"R,B","rupiah"),array($tot_diskon,1,"R,B","rupiah"),array($tot_jual-$tot_diskon,1,"R,B","rupiah"));
} else {
$pre->add_field("No. Nota",30,"C");
$pre->add_field("Tgl. Nota",30,"C");
$pre->add_field("Nama Kasir",20,"L");
$pre->add_field("Sub. Total",20,"R","rupiah");
$pre->add_field("Diskon",20,"R","rupiah");
$pre->add_field("Total",30,"R","rupiah");
$tot_jual = 0; $tot_diskon = 0;
while ($db->Next()) {
if ($db->RowFloat("Total", 0) == 0) continue;
$tot_jual += $db->Row("Total_Jual");
$tot_diskon += $db->Row("Total_Diskon");
$pre->add_value($db->Row("No_Jual"), $db->Row("Tgl_Jual"), $db->Row("Nama_User"), $db->Row("Total_Jual"), $db->Row("Total_Diskon"), $db->Row("Total"));
}
$pre->add_span(array("GRAND TOTAL",3,"R,B"),array($tot_jual,1,"R,B","rupiah"),array($tot_diskon,1,"R,B","rupiah"),array($tot_jual-$tot_diskon,1,"R,B","rupiah"));
}
$pre->add_stamp(1, true);
$pre->show();
} else if ( $data == "export" ) {
$xls = new SimpleXLS([
'title'=>"Data Penjualan",
'desc'=>"Export Data Penjualan"
]);
if ($tipe=="R") {
$xls->add_header("<b>".$_SESSION['__WEB_APP']['REG_NAME']."</b>");
$xls->add_header("<b>DATA REKAP PENJUALAN</b>");
$xls->add_header("Periode : ".$tglheader);
$xls->add_field("No.", 5, "C");
$xls->add_field("Tanggal", 12, "C", "tgl_sql2str");
$xls->add_field("Sub. Total", 15, "R,N");
$xls->add_field("Diskon", 15, "R,N");
$xls->add_field("Total", 15, "R,N");
$xls->add_sheet("".str_replace("S/D","-",$tglheader), true);
$tot_jual = 0; $tot_diskon = 0; $nomor = 0;
while ($db->Next()) {
if ($db->RowFloat("Total", 0) == 0) continue;
$tot_jual += $db->Row("Total_Jual");
$tot_diskon += $db->Row("Total_Diskon");
$xls->add_value(++$nomor, $db->Row("Tgl_Jual"), $db->Row("Total_Jual"), $db->Row("Total_Diskon"), $db->Row("Total"));
}
$xls->add_span(array("GRAND TOTAL",2,"R,B"),array($tot_jual,1,"R,B,N"),array($tot_diskon,1,"R,B,N"),array($tot_jual-$tot_diskon,1,"R,B,N"));
} else {
$xls->add_header("<b>".$_SESSION['__WEB_APP']['REG_NAME']."</b>");
$xls->add_header("<b>DATA DETAIL PENJUALAN</b>");
$xls->add_header("Periode : ".$tglheader);
$xls->add_field("No. Nota", 15, "C");
$xls->add_field("Tgl. Nota", 12, "C", "tgl_sql2str");
$xls->add_field("Nama Kasir", 20, "L");
$xls->add_field("Sub. Total", 15, "R,N");
$xls->add_field("Diskon", 15, "R,N");
$xls->add_field("Total", 15, "R,N");
$xls->add_sheet("".str_replace("S/D","-",$tglheader), true);
$tot_jual = 0; $tot_diskon = 0;
while ($db->Next()) {
if ($db->RowFloat("Total", 0) == 0) continue;
$tot_jual += $db->Row("Total_Jual");
$tot_diskon += $db->Row("Total_Diskon");
$xls->add_value($db->Row("No_Jual"), $db->Row("Tgl_Jual"), $db->Row("Nama_User"), $db->Row("Total_Jual"), $db->Row("Total_Diskon"), $db->Row("Total"));
}
$xls->add_span(array("GRAND TOTAL",3,"R,B"),array($tot_jual,1,"R,B,N"),array($tot_diskon,1,"R,B,N"),array($tot_jual-$tot_diskon,1,"R,B,N"));
}
$xls->add_stamp(1, true);
$xls->send("Data Penjualan ".str_replace("S/D","-",$tglheader).".xlsx");
unset($xls);
} else if ( $data == "default") {
$form = new Form($db);
$ttipe = $form->radio("_", "Tipe", "R", true, false, ["R"=>"Rekap","D"=>"Detail"]);
$tcab = $form->option_db("_", "CabID", $id_cab, false, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID", [0,"SEMUA CABANG"]);
$tfrom = $form->datebox("_", "Tgl_From", tgl_ymd(), true, false);
$tto = $form->datebox("_", "Tgl_To", tgl_ymd(), true, false);
echo '
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Tipe">Tipe Laporan</label>
<div class="col col-form-label">'.$ttipe.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="CabID">Nama Cabang</label>
<div class="col">'.$tcab.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Tgl_From">Dari Tanggal</label>
<div class="col-sm-6 col-lg-5">'.$tfrom.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Tgl_To">Sampai Tanggal</label>
<div class="col-sm-6 col-lg-5">'.$tto.'</div>
</div>';
}
?>
+269
View File
@@ -0,0 +1,269 @@
<?php
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/php/repo/jual_analisa.php
Desc. : PHP - Laporan Analisa Penjualan
Created By : Siau Pheng (siaupheng@3fonia.com).
Created Date : May 9th, 2013.
Last Modified : October 4th, 2025.
(c) 2013 - 2025, 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
require_once(__DIR__."/../../../../../vendor/autoload.php");
require_once(__DIR__."/../func.iss.php");
use siaupheng\fonia3\DB\MySQL;
use siaupheng\fonia3\Web\Param;
use siaupheng\fonia3\Web\Form;
use siaupheng\fonia3\Data\SimpleXLS;
$db = $db ?? new MySQL();
$ajson = [];
$data = Param::Get("data");
$id_cab = Param::Get("CabID", $_SESSION['__APP_INV']['CABANGID']);
if (in_array($data, ["print","export"])) {
$tipe = Param::Get("Tipe", "V"); // V or R or M
$id_sup = Param::Get("SupID", 0);
$id_grup = Param::Get("Grup_InvID", 0);
$m_urut = Param::Get("Urut", "B");
$tglfrom = Param::Get("Tgl_From");
$tglto = Param::Get("Tgl_To");
$jum_hari = tgl_range_hari($tglfrom, $tglto, true);
$nama_sup = $nama_grup = "";
if ($id_sup>0) {
$db->Query("SELECT Nama_Sup Nama FROM para_supplier WHERE SupID='".$id_sup."' LIMIT 1");
if ($db->Next()) $nama_sup = $db->Row("Nama");
}
if ($id_grup>0 && $id_sup==0) {
$db->Query("SELECT Nama_Grup Nama FROM inv_produk_grup WHERE Grup_InvID='".$id_grup."' LIMIT 1");
if ($db->Next()) $nama_grup = $db->Row("Nama");
}
// generate report header
$tglheader = $tglfrom;
if ($tglfrom!==$tglto) $tglheader .= " S/D ".$tglto;
$tglfrom = tgl_sql2str($tglfrom);
$tglto = tgl_sql2str($tglto);
$tjoin = "";
$tsql = " D.Jumlah <> 0";
$tsql .= ($id_grup>0 && $id_sup==0) ? " AND P.Grup_InvID=".$id_grup : "";
if ($id_sup>0) {
$tsql .= " AND U.SupID='".$id_sup."'";
$tjoin .= " LEFT JOIN inv_produk_sup U ON (U.InvID=D.InvID AND U.SupID='".$id_sup."')";
}
$tsql2 = ($id_cab==0) ? "" : " AND CabID='".$id_cab."'";
$torder = ($m_urut=="B") ? " P.Nama_Produk" : " D.Jumlah";
if ($tipe=="V") {
$db->Query("SELECT P.Nama_Produk,P.Satuan_Normal,P.Satuan_Stok,D.Jumlah,S.Stok,P.Qty Kali FROM (SELECT InvID,SUM(-Stok) Jumlah FROM inv_detail WHERE (Tgl_Ref BETWEEN '".$tglfrom."' AND '".$tglto."') AND NotaID IN (5,6)".$tsql2." GROUP BY InvID) D LEFT JOIN (SELECT InvID,SUM(Stok) Stok FROM inv_detail WHERE Tgl_Ref<='".$tglto."'".$tsql2." GROUP BY InvID) S ON (D.InvID=S.InvID) LEFT JOIN vi_inv_produk2 P ON (D.InvID=P.InvID)".$tjoin." WHERE ".$tsql." ORDER BY".$torder);
} else if ($tipe=="R") {
$db->Query("SELECT P.Nama_Produk,P.Satuan_Normal,P.Satuan_Stok,D.Jumlah,S.Stok,P.Qty Kali FROM (SELECT InvID,SUM(-Qty*Harga_Jual) Jumlah FROM inv_detail WHERE (Tgl_Ref BETWEEN '".$tglfrom."' AND '".$tglto."') AND NotaID IN (5,6)".$tsql2." GROUP BY InvID) D LEFT JOIN (SELECT InvID,SUM(Stok) Stok FROM inv_detail WHERE Tgl_Ref<='".$tglto."'".$tsql2." GROUP BY InvID) S ON (D.InvID=S.InvID) LEFT JOIN vi_inv_produk2 P ON (D.InvID=P.InvID)".$tjoin." WHERE ".$tsql." ORDER BY".$torder);
} else if ($tipe=="M") {
$torder = ($m_urut=="M") ? " Margin" : $torder;
$db->Query("SELECT P.Nama_Produk,P.Satuan_Normal,P.Satuan_Stok,D.Margin,D.Jumlah,S.Stok,P.Qty Kali FROM (SELECT InvID,((SUM(-Qty*(Harga_Jual-Harga_Beli))*100)/SUM(-Qty*Harga_Jual)) Margin,SUM(-Qty*(Harga_Jual-Harga_Beli)) Jumlah FROM inv_detail WHERE (Tgl_Ref BETWEEN '".$tglfrom."' AND '".$tglto."') AND NotaID IN (5,6)".$tsql2." GROUP BY InvID) D LEFT JOIN (SELECT InvID,SUM(Stok) Stok FROM inv_detail WHERE Tgl_Ref<='".$tglto."'".$tsql2." GROUP BY InvID) S ON (D.InvID=S.InvID) LEFT JOIN vi_inv_produk2 P ON (D.InvID=P.InvID)".$tjoin." WHERE ".$tsql." ORDER BY".$torder);
}
}
if ( $data == "print" ) {
$pre = new \siaupheng\fonia3\Printer\PrintHTML();
if ($tipe=="V") {
Report_Header("REKAP VOLUME PENJUALAN", "Periode : ".$tglheader);
$pre->add_field("No.",5,"C");
$pre->add_field("Nama Barang",120);
$pre->add_field("Jumlah",80,"R");
$pre->add_field("Mingguan",80,"R");
$pre->add_field("Sisa Stok",80,"R");
if ($id_sup>0) $pre->add_span(array("Nama Supplier : ".$nama_sup,5,"L,NB"));
if ($id_grup>0 && $id_sup==0) $pre->add_span(array("Grup Barang : ".$nama_grup,5,"L,NB"));
$nomor = 0;
while ($db->Next()) {
$total = $db->Row("Jumlah",0);
$mg_total = $total / ($jum_hari/7);
$kali = $db->Row("Kali",0);
$stok = Format_Stok($total, $kali, $db->Row("Satuan_Normal"), $db->Row("Satuan_Stok"));
$mg_stok = Format_Stok($mg_total, $kali, $db->Row("Satuan_Normal"), $db->Row("Satuan_Stok"));
$ss_stok = Format_Stok($db->Row("Stok"), $kali, $db->Row("Satuan_Normal"), $db->Row("Satuan_Stok"));
$pre->add_value(++$nomor, $db->Row("Nama_Produk"), $stok, $mg_stok, $ss_stok);
}
} else if ($tipe=="R") {
Report_Header("REKAP RUPIAH PENJUALAN", "Periode : ".$tglheader);
$pre->add_field("No.",5,"C");
$pre->add_field("Nama Barang",80);
$pre->add_field("Jumlah",20,"R","rupiah");
$pre->add_field("Mingguan",20,"R","rupiah");
$pre->add_field("Sisa Stok",80,"R");
if ($id_sup>0) $pre->add_span(array("Nama Supplier : ".$nama_sup,5,"L,NB"));
if ($id_grup>0 && $id_sup==0) $pre->add_span(array("Grup Barang : ".$nama_grup,5,"L,NB"));
$nomor = 0; $tot_rup = 0; $tot_mg = 0;
while ($db->Next()) {
$mg_avg = ($db->Row("Jumlah",0)>0) ? $db->Row("Jumlah",0) / ($jum_hari/7) : 0;
$tot_rup += $db->Row("Jumlah");
$tot_mg += $mg_avg;
$ss_stok = Format_Stok($db->Row("Stok"), $db->Row("Kali",0), $db->Row("Satuan_Normal"), $db->Row("Satuan_Stok"));
$pre->add_value(++$nomor, $db->Row("Nama_Produk"), $db->Row("Jumlah"), $mg_avg. $ss_stok);
}
$pre->add_span(array("TOTAL",2,"R,B"),array(rupiah($tot_rup),1,"R,B"),array(rupiah($tot_mg),1,"R,B"),array("",1,"B"));
} else if ($tipe=="M") {
Report_Header("REKAP MARGIN PENJUALAN", "Periode : ".$tglheader);
$pre->add_field("No.",5,"C");
$pre->add_field("Nama Barang",80);
$pre->add_field("Jumlah",20,"R","rupiah");
$pre->add_field("Margin (%)",10,"R","rupiah2");
$pre->add_field("Mingguan",20,"R","rupiah");
$pre->add_field("Sisa Stok",80,"R");
if ($id_sup>0) $pre->add_span(array("Nama Supplier : ".$nama_sup,6,"L,NB"));
if ($id_grup>0 && $id_sup==0) $pre->add_span(array("Grup Barang : ".$nama_grup,6,"L,NB"));
$nomor = 0; $tot_rup = 0; $tot_mar = 0; $tot_mg = 0;
while ($db->Next()) {
$mg_avg = ($db->Row("Jumlah",0)>0) ? $db->Row("Jumlah",0) / ($jum_hari/7) : 0;
$tot_rup += $db->Row("Jumlah");
$tot_mar += $db->Row("Margin");
$tot_mg += $mg_avg;
$ss_stok = Format_Stok($db->Row("Stok"), $db->Row("Kali",0), $db->Row("Satuan_Normal"), $db->Row("Satuan_Stok"));
$pre->add_value(++$nomor, $db->Row("Nama_Produk"), $db->Row("Jumlah"), $db->Row("Margin"), $mg_avg, $ss_stok);
}
$pre->add_span(array("TOTAL",2,"R,B"),array(rupiah($tot_rup),1,"R,B"),array(rupiah2($tot_mar),1,"R,B"),array(rupiah($tot_mg),1,"R,B"),array("",1,"B"));
}
$pre->add_stamp(1, true);
$pre->show();
} else if ( $data == "export" ) {
$xls = new SimpleXLS([
'title'=>"Data Analisa Penjualan",
'desc'=>"Export Data Analisa Penjualan"
]);
$xls->add_header("<b>".$_SESSION['__WEB_APP']['REG_NAME']."</b>");
if ($tipe=="V") {
$xls->add_header("<b>DATA REKAP VOLUME PENJUALAN</b>");
$xls->add_header("Periode : ".$tglheader);
$xls->add_field("No.", 5, "C");
$xls->add_field("Nama Barang", 80, "L");
$xls->add_field("Jumlah", 20, "R,N");
$xls->add_field("Mingguan", 20, "R,N");
$xls->add_field("Sisa Stok", 20, "R,N");
$xls->add_sheet("".str_replace("S/D","-",$tglheader), true);
if ($id_sup>0) $xls->add_span(array("Nama Supplier : ".$nama_sup,5,"L,B"));
if ($id_grup>0 && $id_sup==0) $xls->add_span(array("Grup Barang : ".$nama_grup,5,"L,B"));
$nomor = 0;
while ($db->Next()) {
$total = $db->Row("Jumlah",0);
$mg_total = $total / ($jum_hari/7);
$kali = $db->Row("Kali",0);
$stok = Format_Stok($total, $kali, $db->Row("Satuan_Normal"), $db->Row("Satuan_Stok"));
$mg_stok = Format_Stok($mg_total, $kali, $db->Row("Satuan_Normal"), $db->Row("Satuan_Stok"));
$ss_stok = Format_Stok($db->Row("Stok"), $kali, $db->Row("Satuan_Normal"), $db->Row("Satuan_Stok"));
$xls->add_value(++$nomor, $db->Row("Nama_Produk"), $stok, $mg_stok, $ss_stok);
}
} else if ($tipe=="R") {
$xls->add_header("<b>DATA REKAP RUPIAH PENJUALAN</b>");
$xls->add_header("Periode : ".$tglheader);
$xls->add_field("No.", 5, "C");
$xls->add_field("Nama Barang", 80, "L");
$xls->add_field("Jumlah", 20, "R,N");
$xls->add_field("Mingguan", 20, "R,N");
$xls->add_field("Sisa Stok", 20, "R,N");
$xls->add_sheet("".str_replace("S/D","-",$tglheader), true);
if ($id_sup>0) $xls->add_span(array("Nama Supplier : ".$nama_sup,5,"L,B"));
if ($id_grup>0 && $id_sup==0) $xls->add_span(array("Grup Barang : ".$nama_grup,5,"L,B"));
$nomor = 0; $tot_rup = 0; $tot_mg = 0;
while ($db->Next()) {
$mg_avg = ($db->Row("Jumlah",0)>0) ? $db->Row("Jumlah",0) / ($jum_hari/7) : 0;
$tot_rup += $db->Row("Jumlah");
$tot_mg += $mg_avg;
$ss_stok = Format_Stok($db->Row("Stok"), $db->Row("Kali",0), $db->Row("Satuan_Normal"), $db->Row("Satuan_Stok"));
$xls->add_value(++$nomor, $db->Row("Nama_Produk"), $db->Row("Jumlah"), $mg_avg, $ss_stok);
}
$xls->add_span(array("TOTAL",2,"R,B"),array($tot_rup,1,"R,N,B"),array($tot_mg,1,"R,N,B"),array("",1,"B"));
} else if ($tipe=="M") {
$xls->add_header("<b>DATA REKAP MARGIN PENJUALAN</b>");
$xls->add_header("Periode : ".$tglheader);
$xls->add_field("No.", 5, "C");
$xls->add_field("Nama Barang", 80, "L");
$xls->add_field("Jumlah", 20, "R,N");
$xls->add_field("Margin (%)", 10, "R,N");
$xls->add_field("Mingguan", 20, "R,N");
$xls->add_field("Sisa Stok", 20, "R,N");
$xls->add_sheet("".str_replace("S/D","-",$tglheader), true);
if ($id_sup>0) $xls->add_span(array("Nama Supplier : ".$nama_sup,6,"L,B"));
if ($id_grup>0 && $id_sup==0) $xls->add_span(array("Grup Barang : ".$nama_grup,6,"L,B"));
$nomor = 0; $tot_rup = 0; $tot_mar = 0; $tot_mg = 0;
while ($db->Next()) {
$mg_avg = ($db->Row("Jumlah",0)>0) ? $db->Row("Jumlah",0) / ($jum_hari/7) : 0;
$tot_rup += $db->Row("Jumlah");
$tot_mar += $db->Row("Margin");
$tot_mg += $mg_avg;
$ss_stok = Format_Stok($db->Row("Stok"), $db->Row("Kali",0), $db->Row("Satuan_Normal"), $db->Row("Satuan_Stok"));
$xls->add_value(++$nomor, $db->Row("Nama_Produk"), $db->Row("Jumlah"), $db->Row("Margin"), $mg_avg, $ss_stok);
}
$xls->add_span(array("TOTAL",2,"R,B"),array($tot_rup,1,"R,N,B"),array($tot_mar,1,"R,N,B"),array($tot_mg,1,"R,N,B"),array("",1,"B"));
}
$xls->add_stamp(1, true);
$xls->send("Data Analisa Penjualan ".str_replace("S/D","-",$tglheader).".xlsx");
unset($xls);
} else if ( $data == "default") {
$form = new Form($db);
$ttipe = $form->radio("_", "Tipe", "V", true, false, ["V"=>"Volume","R"=>"Rupiah","M"=>"Margin"]);
$tcab = $form->option_db("_", "CabID", $id_cab, false, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID", [0,"SEMUA CABANG"]);
$tsup = $form->option_db("_", "SupID", 0, true, false, "para_supplier", ["SupID","Nama_Sup"], "Aktif=1 ORDER BY Nama_Sup", [0,"SEMUA SUPPLIER"]);
$tgrup = $form->option_db("_", "Grup_InvID", 0, true, false, "inv_produk_grup", ["Grup_InvID","Nama_Grup"], "Aktif=1 ORDER BY Nama_Grup", [0,"SEMUA GRUP"]);
$turut = $form->radio("_", "Urut", "B", true, false, ['B'=>"Nama Barang",'J'=>"Jumlah / Nilai",'M'=>"Margin"]);
$tfrom = $form->datebox("_", "Tgl_From", tgl_ymd(), true, false);
$tto = $form->datebox("_", "Tgl_To", tgl_ymd(), true, false);
echo '
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Tipe">Tipe Laporan</label>
<div class="col col-form-label">'.$ttipe.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="CabID">Nama Cabang</label>
<div class="col">'.$tcab.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="SupID">Nama Supplier</label>
<div class="col"><div class="input-group">'.$tsup.Form_Info("Jika Nama Supplier dipilih, Filter Grup Barang akan diabaikan.").'</div></div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Grup_InvID">Grup Barang</label>
<div class="col">'.$tgrup.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Urut">Urut Berdasarkan</label>
<div class="col col-form-label">'.$turut.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Tgl_From">Dari Tanggal</label>
<div class="col-sm-6 col-lg-5">'.$tfrom.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Tgl_To">Sampai Tanggal</label>
<div class="col-sm-6 col-lg-5">'.$tto.'</div>
</div>';
}
?>
+143
View File
@@ -0,0 +1,143 @@
<?php
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/php/repo/jual_rekap.php
Desc. : PHP - Laporan Rekap Penjualan
Created By : Siau Pheng (siaupheng@3fonia.com).
Created Date : May 9th, 2013.
Last Modified : October 4th, 2025.
(c) 2013 - 2025, 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
require_once(__DIR__."/../../../../../vendor/autoload.php");
require_once(__DIR__."/../func.iss.php");
use siaupheng\fonia3\DB\MySQL;
use siaupheng\fonia3\Web\Param;
use siaupheng\fonia3\Web\Form;
use siaupheng\fonia3\Data\SimpleXLS;
$db = $db ?? new MySQL();
$ajson = [];
$data = Param::Get("data");
$id_cab = Param::Get("CabID", $_SESSION['__APP_INV']['CABANGID']);
if (in_array($data, ["print","export"])) {
$id_sup = Param::Get("SupID", 0);
$id_grup = Param::Get("Grup_InvID", 0);
$tglfrom = Param::Get("Tgl_From");
$tglto = Param::Get("Tgl_To");
$nama_sup = $nama_grup = "";
if ($id_sup>0) {
$db->Query("SELECT Nama_Sup Nama FROM para_supplier WHERE SupID='".$id_sup."' LIMIT 1");
if ($db->Next()) $nama_sup = $db->Row("Nama");
}
if ($id_grup>0 && $id_sup==0) {
$db->Query("SELECT Nama_Grup Nama FROM inv_produk_grup WHERE Grup_InvID='".$id_grup."' LIMIT 1");
if ($db->Next()) $nama_grup = $db->Row("Nama");
}
// generate report header
$tglheader = $tglfrom;
if ($tglfrom!==$tglto) $tglheader .= " S/D ".$tglto;
$tglfrom = tgl_sql2str($tglfrom);
$tglto = tgl_sql2str($tglto);
$tjoin = "";
$tsql = " D.Jumlah<>0";
$tsql .= ($id_grup>0 && $id_sup==0) ? " AND P.Grup_InvID=".$id_grup : "";
if ($id_sup>0) {
$tsql .= " AND U.SupID='".$id_sup."'";
$tjoin .= " LEFT JOIN inv_produk_sup U ON (U.InvID=D.InvID AND U.SupID='".$id_sup."')";
}
$tsql2 = ($id_cab==0) ? "" : " AND CabID='".$id_cab."'";
// query data laporan
$db->Query("SELECT P.Kode_SKU,P.Nama_Produk,P.Nama_Satuan,D.Qty,D.Jumlah FROM (SELECT InvID,SatuanID,SUM(-Qty) Qty,SUM(-Qty*Harga_Jual) Jumlah FROM inv_detail WHERE (Tgl_Ref BETWEEN '".$tglfrom."' AND '".$tglto."') AND NotaID IN (5,6)".$tsql2." GROUP BY InvID, SatuanID) D LEFT JOIN vi_inv_produk P ON (D.InvID=P.InvID AND D.SatuanID=P.SatuanID)".$tjoin." WHERE ".$tsql." ORDER BY P.Kode_SKU");
}
if ( $data == "print" ) {
Report_Header("REKAP PENJUALAN", "Periode : ".$tglheader);
$pre = new \siaupheng\fonia3\Printer\PrintHTML();
$pre->add_field("No.",10,"C");
$pre->add_field("Kode SKU",20,"C");
$pre->add_field("Nama Barang",120,"L");
$pre->add_field("Qty",80,"R","rupiah2");
$pre->add_field("Jumlah",50,"R","rupiah2");
if ($id_sup>0) $pre->add_span(array("Nama Supplier : ".$nama_sup,5,"L,B"));
if ($id_grup>0 && $id_sup==0) $pre->add_span(array("Grup Barang : ".$nama_grup,5,"L,B"));
$nomor = 0;
while ($db->Next()) {
$pre->add_value(++$nomor, $db->Row("Kode_SKU"), $db->Row("Nama_Produk"), $db->Row("Qty"), $db->Row("Jumlah"));
}
$pre->add_stamp(1, true);
$pre->show();
} else if ( $data == "export" ) {
$xls = new SimpleXLS([
'title'=>"Data Rekap Penjualan",
'desc'=>"Export Data Rekap Penjualan"
]);
$xls->add_header($_SESSION['__WEB_APP']['REG_NAME']);
$xls->add_header("DATA REKAP PENJUALAN");
$xls->add_header("Periode : ".$tglheader);
$xls->add_field("No.", 10, "C");
$xls->add_field("Kode SKU", 12, "L");
$xls->add_field("Nama Barang", 80, "L");
$xls->add_field("Qty", 20, "R,N");
$xls->add_field("Jumlah", 20, "R,N");
$xls->add_sheet("".str_replace("S/D","-",$tglheader), true);
if ($id_sup>0) $xls->add_span(["Nama Supplier : ".$nama_sup,5,"L"]);
if ($id_grup>0 && $id_sup==0) $xls->add_span(["Grup Barang : ".$nama_grup,5,"L"]);
$nomor = 0;
while ($db->Next()) {
$xls->add_value(++$nomor, $db->Row("Kode_SKU"), $db->Row("Nama_Produk"), $db->Row("Qty"), $db->Row("Jumlah"));
}
$xls->add_stamp(1, true);
$xls->send("Data Rekap Penjualan ".str_replace("S/D","-",$tglheader).".xlsx");
unset($xls);
} else if ( $data == "default") {
$form = new Form($db);
$tcab = $form->option_db("_", "CabID", $id_cab, false, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID", [0,"SEMUA CABANG"]);
$tsup = $form->option_db("_", "SupID", 0, true, false, "para_supplier", ["SupID","Nama_Sup"], "Aktif=1 ORDER BY Nama_Sup", [0,"SEMUA SUPPLIER"]);
$tgrup = $form->option_db("_", "Grup_InvID", 0, true, false, "inv_produk_grup", ["Grup_InvID","Nama_Grup"], "Aktif=1 ORDER BY Nama_Grup", [0,"SEMUA GRUP"]);
$tfrom = $form->datebox("_", "Tgl_From", tgl_ymd(), true, false);
$tto = $form->datebox("_", "Tgl_To", tgl_ymd(), true, false);
echo '
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="CabID">Nama Cabang</label>
<div class="col">'.$tcab.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="SupID">Nama Supplier</label>
<div class="col"><div class="input-group">'.$tsup.Form_Info("Jika Nama Supplier dipilih, Filter Grup Barang akan diabaikan.").'</div></div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Grup_InvID">Grup Barang</label>
<div class="col">'.$tgrup.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Tgl_From">Dari Tanggal</label>
<div class="col-sm-6 col-lg-5">'.$tfrom.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Tgl_To">Sampai Tanggal</label>
<div class="col-sm-6 col-lg-5">'.$tto.'</div>
</div>';
}
?>
+170
View File
@@ -0,0 +1,170 @@
<?php
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/php/repo/label.php
Desc. : PHP - Cetak Label Harga Barang
Created By : Siau Pheng (siaupheng@3fonia.com).
Created Date : September 13th, 2014.
Last Modified : October 5th, 2025.
(c) 2014 - 2025, 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
require_once(__DIR__."/../../../../../vendor/autoload.php");
require_once(__DIR__."/../func.iss.php");
use siaupheng\fonia3\DB\MySQL;
use siaupheng\fonia3\Web\Param;
use siaupheng\fonia3\Web\Table;
use siaupheng\fonia3\Web\Form;
$db = $db ?? new MySQL();
$ajson = [];
$data = Param::Get("data");
$mode_detail = Param::Get("mode_detail");
$id_cab = Param::Get("CabID", $_SESSION['__APP_INV']['CABANGID']);
$id_grup = Param::Get("Grup_InvID", 0);
if ( $data == "master" ) {
} else if ( $data == "tabel-detail" ) {
if ($mode_detail == "empty") {
$db->Query("TRUNCATE rep_label");
} else if ($mode_detail == "update") {
$db->Query("UPDATE rep_label SET Nama_Produk='".$db->SafeSQL(Param::Get("Nama_Produk"))."' WHERE ID='".Param::Get("ID",0)."'");
} else if ($mode_detail == "delete") {
$db->Query("DELETE FROM rep_label WHERE ID='".Param::Get("ID",0)."'");
} else if ($mode_detail == "simpan-produk") {
$alist = Param::Get_ArrayCBOX();
foreach ($alist as $_key => $_val) {
if ($_val=="Y") {
$_adata = explode(":", $_key); $arec = [];
$db->Query("SELECT LEFT(P.Nama_Produk,25) Nama_Produk,P.Harga_Jual FROM vi_inv_produk P WHERE P.InvID='".$_adata[0]."' AND P.SatuanID='".$_adata[1]."'");
if ($db->Next()) $arec = $db->AllRow();
if (count($arec) > 0) {
$db->Query("INSERT INTO rep_label SET Nama_Produk='".$db->SafeSQL($arec['Nama_Produk'])."',Harga_Jual='".$arec['Harga_Jual']."',UserID='".user_id()."'");
}
}
}
} else if ($mode_detail == "simpan-grup") {
if ($id_grup > 0) {
$db->Query("INSERT INTO rep_label SELECT NULL,LEFT(P.Nama_Produk,25),P.Harga_Jual,'".user_id()."' FROM vi_inv_produk P WHERE P.Aktif=1 AND P.Grup_InvID='".$id_grup."' AND P.Harga_Jual>0");
}
}
$obj = new Table($db);
$obj->set_query("SELECT * FROM rep_label");
$obj->add_field("ID", "ID", "hid");
$obj->add_field("Nama_Produk", "Nama Barang", "awr");
$obj->add_field("Harga_Jual", "Harga @", "r", "rupiah");
$obj->set_field_order("ID", "A");
$obj->add_row_btn("clipboard", "Ubah", "RepoLabelJS.detail_ubah");
$obj->add_row_btn("trash", "Hapus", "RepoLabelJS.detail_hapus", "UserID", user_id());
$obj->set_func_btn("RepoLabelJS.produk_brow", '<i class="bi-plus-lg me-1"></i> Item');
$obj->set_func_btn("RepoLabelJS.grup_brow", '<i class="bi-table me-1"></i> Grup');
$obj->set_func_navi("RepoLabelJS.data_query('tabel-detail')");
$ajson[] = $obj->json_table("divDetailTabel");
} else if ( $data == "brow-produk" ) {
$tcari = trim(Param::Get("Cari_Produk"));
$tsql = ($tcari=="") ? "" : " AND CONCAT(P.Kode_Barcode,P.Nama_Produk) LIKE '%".$tcari."%'";
$obj = new Table($db);
$obj->set_table("vi_inv_produk P", "P.*,CONCAT(P.InvID,':',P.SatuanID) ID2", "P.Harga_Jual>0 AND P.Aktif=1".$tsql);
$obj->add_field("ID2", "ID", "hid");
$obj->add_field("Kode_SKU", "SKU", "c");
$obj->add_field("Nama_Produk", "Nama Barang", "awr");
$obj->add_field("Nama_Satuan", "Satuan", "l");
$obj->add_field("Harga_Jual", "Harga @", "r", "rupiah");
$obj->set_field_order("Kode_SKU", "A");
$obj->add_row_checkbox("ID2", "Pilih", ["Y","N"]);
$obj->set_func_navi("RepoLabelJS.data_query('brow-produk')");
$ajson[] = $obj->db_table("divBrowProduk", 8);
} else if ( $data == "brow-grup" ) {
$tcari = trim(Param::Get("Cari_Grup"));
$tsql = ($tcari=="") ? "" : " AND CONCAT(P.Kode_Grup,P.Nama_Grup) LIKE '%".$tcari."%'";
$obj = new Table($db);
$obj->set_table("inv_produk_grup P", "P.*", "P.Aktif=1".$tsql);
$obj->add_field("Grup_InvID", "ID", "hid");
$obj->add_field("Kode_Grup", "Kode", "c");
$obj->add_field("Nama_Grup", "Nama Grup Barang", "awr");
$obj->set_field_order("Kode_Grup", "A");
$obj->add_row_btn("save", "Pilih", "RepoLabelJS.grup_select");
$obj->set_func_navi("RepoLabelJS.data_query('brow-grup')");
$ajson[] = $obj->db_table("divBrowGrup");
} else if ($data == "detail-tx") {
$ajson = ['error'=>"", 'html'=>""];
$atabel = ['ID'=>Param::Get("ID",0), 'Nama_Produk'=>""];
$db->Query("SELECT * FROM rep_label WHERE ID='".$atabel['ID']."' LIMIT 1");
if ($db->Next()) $atabel = array_merge($atabel, $db->AllRow());
$form = new Form($db);
$tproduk = $form->textbox("_", "Nama_Produk", $atabel['Nama_Produk'], true, false, "text");
$ajson['html'] = '
<div class="row mb-1">
<label class="col-sm-5 col-lg-3 col-form-label" for="Nama_Produk">Nama Barang</label>
<div class="col">'.$tproduk.'</div>
</div>
<input type="hidden" id="mode_detail" value="'.$mode_detail.'" >
<input type="hidden" id="ID" value="'.$atabel['ID'].'" >';
} else if ( $data == "default") {
echo '
<div class="fade-in">
<div class="card"><div class="card-body">
<ul class="nav nav-tabs" role="tablist">
<li class="nav-item" role="presentation">
<button class="nav-link active" id="tx-tab" data-bs-toggle="tab" data-bs-target="#tx" type="button" role="tab" aria-controls="tx" aria-selected="true"><i class="bi-printer me-2"></i>Cetak Label Harga</button>
</li>
<li class="nav-item ms-auto">
<button class="btn btn-warning mb-1 ms-2" id="butHapus" type="button"><i class="bi-trash me-2"></i>Hapus</button>
<button class="btn btn-secondary mb-1 ms-2" id="butPrint" type="button"><i class="bi-printer me-2"></i>Cetak</button>
<button class="btn btn-secondary mb-1 ms-2" id="butPreview" type="button"><i class="bi-display me-2"></i>Pratinjau</button>
</li>
</ul>
<div class="tab-content border border-top-0 p-3">
<div class="tab-pane fade active show" id="tx" role="tabpanel" aria-labelledby="tx-tab">
<div id="divDetailTabel">&nbsp;</div>
</div>
</div>
</div></div>
</div>';
}
if ( $data == "print" ) {
$db->Query("SELECT * FROM rep_label ORDER BY ID");
if ($db->RecordCount()==0) return false;
$_head = '<table width="100%"><tr>';
$_line = '<td class="center" style="font-size:16pt;height:100px;width:65mm;padding:10px;border: dashed 1px #000;font-family:verdana;"><div style="font-size:18pt;height:50px;padding-bottom:10px;">%s</div>%s</td>';
$ni = $nb = 1; $cont = "";
while ($db->Next()) {
if ($ni == 4) {
if ($nb == 8) {
$cont .= '</tr></table><p id="linebreak">................ page break ................</p><p id="pagebreak">&nbsp;</p>' . $_head;
$nb = 0;
} else {
$cont .= '</tr><tr>';
}
$ni = 1;
$nb++;
}
$cont .= sprintf($_line, $db->Row("Nama_Produk"), "Rp. ".rupiah($db->Row("Harga_Jual")));
$ni++;
}
if ($ni < 4) {
while ($ni < 4) {
$cont .= sprintf($_line, "", "");
$ni++;
}
}
echo '<p id="autopage">&nbsp;</p>' . $_head . $cont . "</tr></table>";
}
send_json($ajson);
?>
+164
View File
@@ -0,0 +1,164 @@
<?php
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/php/repo/nota.php
Desc. : PHP - Cetak Struk / Nota POS
Created By : Siau Pheng (siaupheng@3fonia.com).
Created Date : April 12th, 2011.
Last Modified : September 26th, 2025.
(c) 2011 - 2025, 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
require_once(__DIR__."/../../../../../vendor/autoload.php");
require_once(__DIR__."/../func.iss.php");
use siaupheng\fonia3\DB\MySQL;
use siaupheng\fonia3\Web\Param;
use siaupheng\fonia3\Printer\PrintPOS;
function nota_pos($db, $nota="", $op_cash=1) {
if (trim($nota)=="") return;
$ncetak = 1; $is_orig = ($op_cash > 0) ? true : false;
$ainfo = []; $apromo = []; $anotapromo = [];
$db->Query("SELECT J.*,UCASE(O.Nama) Nama_User,UCASE(LEFT(B.Nama_Kartu,23)) Kode_Kartu2,UCASE(J.Nama_Kartu) Nama_Kartu2,RIGHT(J.No_Kartu,4) No_Kartu2 FROM (SELECT *,DATE_FORMAT(Tgl_Jual,'%d-%m-%Y') Tgl_Jual2,DATE_FORMAT(DateStamp,'%H:%i:%s') Jam_Jual,(Total_Bayar-Total_Kartu) Total_Tunai,(Total_Bayar-Total_Jual+Total_Diskon+Total_Potong) Total_Sisa FROM inv_jual WHERE No_Jual='".$nota."') J LEFT JOIN app_operator O ON (J.UserID=O.UserID) LEFT JOIN para_rek_pos B ON (J.KartuID=B.KartuID)");
if ($db->Next()) $ainfo = $db->AllRow();
if ($ainfo['KartuID'] > 0) $ncetak++;
if ($ainfo['PromoNotaID'] > 0) {
$db->Query("SELECT * FROM inv_promo_nota WHERE PromoNotaID='".$ainfo['PromoNotaID']."' LIMIT 1");
if ($db->Next()) {
$anotapromo = explode("\n", wordwrap("".$db->Row("Promo_Iklan"), 38, "\n"));
}
}
$db->Query("SELECT D.*,P.Kode_SKU,IF(ISNULL(O.Ket),P.Nama_Produk,O.Ket) Nama_Produk,P.Nama_Satuan FROM (SELECT No_Ref,ID,InvID,SatuanID,Harga_Jual,Disk_Rupiah Harga_Diskon,SUM(-Qty) Qty,SUM(-Qty*Harga_Jual) Jumlah,SUM(-Qty*Disk_Rupiah) JumlahD,Promo,Total_Diskon FROM inv_detail WHERE No_Ref='".$nota."' AND Qty<>0 GROUP BY InvID,SatuanID,Harga_Jual,Promo) D LEFT JOIN (SELECT * FROM inv_detail_lain WHERE No_Ref='".$nota."') O ON (D.No_Ref=O.No_Ref AND D.ID=O.ID) LEFT JOIN vi_inv_produk P ON (D.InvID=P.InvID AND D.SatuanID=P.SatuanID) ORDER BY P.Nama_Produk");
if ($db->RecordCount()==0) return;
$pre = new PrintPOS();
$pre->set_fontsize(2);
$pre->set_header_logo("logo-nota.png");
if ($_SESSION['__APP_INV']['PRINT_OPENCD']==1 && $op_cash==1) $pre->set_opendrawer();
if ($_SESSION['__APP_INV']['PRINT_AUTOCUT']==1) $pre->set_cutpaper();
$pre->add(array($ainfo['No_Jual'],20), array($ainfo['Tgl_Jual2'],20,"R"));
$pre->add(array($ainfo['Nama_User'],20), array($ainfo['Jam_Jual'],20,"R"));
$pre->add_line();
$items = 0; $qty = 0;
while ($db->Next()) {
if ($db->Row("Promo",0)>1) {
$apromo[] = rupiah($db->Row("Qty"))." ".$db->Row("Nama_Satuan")." ".$db->Row("Nama_Produk");
continue;
}
$pre->add($db->Row("Nama_Produk"));
$pre->add(array($db->Row("Kode_SKU"),8), array(rupiah2($db->Row("Qty")),8,"R"), array(" @",2), array(rupiah($db->Row("Harga_Jual")),9,"R"), array(rupiah($db->Row("Jumlah")),13,"R"));
if ($db->Row("Harga_Diskon") > 0) {
if ($db->Row("Promo") == 1) {
$pre->add(array(" DISKON PROMO",27), array(rupiah($db->Row("Total_Diskon")*-1),13,"R"));
} else {
$pre->add(array(" DISC",8), array(rupiah2($db->Row("Qty")),8,"R"), array(" @",2), array(rupiah($db->Row("Harga_Diskon")*-1),9,"R"), array(rupiah($db->Row("JumlahD")*-1),13,"R"));
}
}
$qty += $db->RowFloat("Qty");
$items++;
}
$pre->add_line();
$pre->add(array($items."I/".$qty."Q",14), array("JUMLAH Rp.",13,"R"), array(rupiah($ainfo['Total_Jual']-$ainfo['Total_Diskon']),13,"R"));
if ($ainfo['Total_Tunai']>0) $pre->add(array("TUNAI Rp.",27,"R"), array(rupiah($ainfo['Total_Tunai']),13,"R"));
if ($ainfo['Total_Kartu']>0) $pre->add(array("NON TUNAI Rp.",27,"R"), array(rupiah($ainfo['Total_Kartu']),13,"R"));
if ($ainfo['Total_Potong']>0) {
$pre->add(array(" ",14), array("PROMO Rp.",13,"R"), array(rupiah($ainfo['Total_Potong']),13,"R"));
$apromo[] = "Potongan Promo Rp. ".rupiah($ainfo['Total_Potong']);
}
if ($ainfo['KartuID']==0) {
$pre->add(array("KEMBALI Rp.",27,"R"), array(rupiah($ainfo['Total_Sisa']),13,"R"));
} else {
$pre->add_empty();
$pre->add("* ".$ainfo['Kode_Kartu2']." - ".($ainfo['No_Kartu2'] ?: "XXXX"));
if ($ainfo['Nama_Kartu2']<>"") $pre->add(" ".$ainfo['Nama_Kartu2']);
}
if (count($apromo)>0) {
$pre->add_line();
$pre->add("HADIAH PROMO :");
for ($i=0; $i<count($apromo); $i++) {
$pre->add($apromo[$i]);
}
}
$pre->add_empty();
$_afoo = explode("[br]", stripslashes($_SESSION['__APP_INV']['TITLE_END']));
foreach($_afoo as $_key => $val) {
$pre->addc($val);
}
if ($is_orig==false) $pre->addc("-- SALINAN / COPY --");
// promo nota
if (count($anotapromo)>0) {
$pre->add_line();
foreach($anotapromo as $_key => $val) {
$pre->add($val);
}
}
$pre->add_empty($_SESSION['__APP_INV']['PRINT_ROW']);
$pre->show($ncetak);
}
function nota_opname($db, $nota="") {
if (trim($nota)=="") return;
$ainfo = [];
$db->Query("SELECT *,DATE_FORMAT(Tgl_Opname,'%d-%m-%Y') Tgl_Opname2 FROM inv_opname WHERE No_Opname='".$nota."' LIMIT 1");
if ($db->Next()) $ainfo = $db->AllRow();
$ainfo['Catatan'] = str_replace("\n", "<br>", $ainfo['Catatan']);
$db->Query("SELECT D.*,P.Nama_Produk,P.Nama_Satuan FROM (SELECT InvID,SatuanID,SUM(Qty) Qty FROM inv_detail WHERE No_Ref='".$nota."' GROUP BY InvID,SatuanID,Harga_Beli) D LEFT JOIN vi_inv_produk P ON (P.InvID=D.InvID AND P.SatuanID=D.SatuanID) ORDER BY P.Nama_Produk");
// menampilkan judul dibagian atas laporan
$kop = '<div class="text-center"><span class="fs-6 fw-bold">'.$_SESSION['__WEB_APP']['REG_NAME'].'</span><br>STOK OPNAME</div>';
$kop .= '<table class="notaHeader"><tbody>';
$kop .= '<tr><td width="15%">No. Opname</td><td width="35%" class="ttkdua">'.$ainfo['No_Opname'].'</td><td width="15%">&nbsp;</td><td width="35%" class="">&nbsp;</td></tr>';
$kop .= '<tr><td>Tanggal Opname</td><td class="ttkdua">'.$ainfo['Tgl_Opname2'].'</td><td>&nbsp;</td><td class="">&nbsp;</td></tr>';
$kop .= '</tbody></table>';
$header = '<table class="garis"><thead><tr><th style="width:1cm">No.</th><th>Nama Barang</th><th style="width:2.2cm">Qty</th><th>Satuan</th></tr></thead><tbody>';
$_line = '<tr><td class="c">%s</td><td>%s</td><td class="r">%s</td><td>%s</td></tr>';
$body = $kop.$header; $no_urut = 1;
while ($db->Next()) {
$body .= sprintf($_line, $no_urut++, $db->Row("Nama_Produk"), rupiah2($db->Row("Qty")), $db->Row("Nama_Satuan"));
}
$t_catat = ($ainfo['Catatan']<>"") ? 'Catatan : <i>'.$ainfo['Catatan'].'</i>.' : '&nbsp;';
$body .= '</tbody></table><table class="notaFooter"><tr><td colspan="2">'.$t_catat.'</td></tr><tr><td width="50%" class="stamp">&nbsp;</td><td class="r stamp">'.Report_Stamp(1,true).'</td></tr></table>';
echo '<div>' . $body . '</div>';
}
function open_cash() {
$pre = new PrintPOS();
if ($_SESSION['__APP_INV']['PRINT_OPENCD']==1) $pre->set_opendrawer();
$pre->show();
}
$db = (is_resource($db)) ? $db : new MySQL();
$data = Param::Get("data");
$nomor = Param::Get("Nomor_Cetak");
if ( $data == "opencash" ) {
open_cash();
} else if ( $data == "nota-pos" ) {
$op_cash = Param::Get("Open_Cash", 0);
nota_pos($db, $nomor, $op_cash);
} else if ( $data == "nota-opname" ) {
nota_opname($db, $nomor);
} else if ( $data == "default") {}
?>
+120
View File
@@ -0,0 +1,120 @@
<?php
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/php/repo/opname.php
Desc. : PHP - Laporan Opname Stok Barang
Created By : Siau Pheng (siaupheng@3fonia.com).
Created Date : March 2nd, 2014.
Last Modified : October 4th, 2025.
(c) 2012 - 2025, 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
require_once(__DIR__."/../../../../../vendor/autoload.php");
require_once(__DIR__."/../func.iss.php");
use siaupheng\fonia3\DB\MySQL;
use siaupheng\fonia3\Web\Param;
use siaupheng\fonia3\Web\Form;
use siaupheng\fonia3\Data\SimpleXLS;
$db = $db ?? new MySQL();
$ajson = [];
$data = Param::Get("data");
$id_cab = Param::Get("CabID", $_SESSION['__APP_INV']['CABANGID']);
if (in_array($data, ["print","export"])) {
$id_kasir = Param::Get("KasirID", 0);
$tglfrom = Param::Get("Tgl_From");
$tglto = Param::Get("Tgl_To");
// generate report header
$tglheader = $tglfrom;
if ($tglfrom!==$tglto) $tglheader .= " S/D ".$tglto;
$tglfrom = tgl_sql2str($tglfrom);
$tglto = tgl_sql2str($tglto);
$tsql = ($id_cab==0) ? "" : " AND CabID='".$id_cab."'";
$tsql .= ($id_kasir==0) ? "" : " AND UserID='".$id_kasir."'";
$db->Query("SELECT D.*,P.Nama_Produk,P.Nama_Satuan,O.Nama Nama_Kasir FROM (SELECT InvID,SatuanID,-Qty Qty,UserID FROM inv_detail WHERE NotaID=1 AND (Tgl_Ref BETWEEN '".$tglfrom."' AND '".$tglto."')".$tsql.") D LEFT JOIN vi_inv_produk P ON (P.InvID=D.InvID AND P.SatuanID=D.SatuanID) LEFT JOIN app_operator O ON (D.UserID=O.UserID) ORDER BY P.Nama_Produk");
}
if ( $data == "print" ) {
Report_Header("OPNAME STOK BARANG", "Periode : ".$tglheader);
$pre = new \siaupheng\fonia3\Printer\PrintHTML();
$pre->add_field("No.",10,"C");
$pre->add_field("Nama Barang",80,"L");
$pre->add_field("Qty",20,"R");
$pre->add_field("Satuan",30,"L");
$pre->add_field("Operator",30,"L");
$nomor = 0;
while ($db->Next()) {
$pre->add_value(++$nomor, $db->Row("Nama_Produk"), ($db->Row("Qty")>0?"+":"").rupiah2($db->Row("Qty")), $db->Row("Nama_Satuan"), $db->Row("Nama_Kasir"));
}
$pre->add_stamp(1, true);
$pre->show();
} else if ( $data == "export" ) {
$xls = new SimpleXLS([
'title'=>"Data Opname Stok Barang",
'desc'=>"Export Data Opname Stok Barang"
]);
$xls->add_header("<b>".$_SESSION['__WEB_APP']['REG_NAME']."</b>");
$xls->add_header("<b>DATA OPNAME STOK BARANG</b>");
$xls->add_header("Periode : ".$tglheader);
$xls->add_field("No.", 5, "C");
$xls->add_field("Nama Barang", 50, "L");
$xls->add_field("Qty", 15, "R,N");
$xls->add_field("Satuan", 10, "L");
$xls->add_field("Nama Operator", 20, "L");
$xls->add_sheet("".str_replace("S/D","-",$tglheader), true);
$nomor = 0;
while ($db->Next()) {
$pre->add_value(++$nomor, $db->Row("Nama_Produk"), $db->Row("Qty"), $db->Row("Nama_Satuan"), $db->Row("Nama_Kasir"));
}
$xls->add_stamp(1, true);
$xls->send("Data Opname Stok Barang ".str_replace("S/D","-",$tglheader).".xlsx");
unset($xls);
} else if ( $data == "default") {
$ikasir = ($_SESSION['__WEB_USER']['Level']<9) ? 0 : user_id();
$tsql = ($_SESSION['__WEB_USER']['Level']<9) ? " AND Level>=".$_SESSION['__WEB_USER']['Level'] : " AND UserID='".user_id()."'";
$form = new Form($db);
$ttipe = $form->radio("_", "Tipe", "R", true, false, ["R"=>"Rekap","D"=>"Detail"]);
$tcab = $form->option_db("_", "CabID", $id_cab, false, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID", [0,"SEMUA CABANG"]);
$tkasir = $form->option_db("_", "KasirID", $ikasir, true, false, "app_operator", ["UserID","Nama"], "Aktif=1 ".((user_id()==1)?"":"AND UserID>1").$tsql, (($ikasir==0)?[0,"SEMUA OPERATOR"]:null));
$tfrom = $form->datebox("_", "Tgl_From", tgl_ymd(), true, false);
$tto = $form->datebox("_", "Tgl_To", tgl_ymd(), true, false);
echo '
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Tipe">Tipe Laporan</label>
<div class="col col-form-label">'.$ttipe.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="CabID">Nama Cabang</label>
<div class="col">'.$tcab.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="KasirID">Nama Operator</label>
<div class="col">'.$tkasir.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Tgl_From">Dari Tanggal</label>
<div class="col-sm-8 col-lg-5">'.$tfrom.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Tgl_To">Sampai Tgl</label>
<div class="col-sm-8 col-lg-5">'.$tto.'</div>
</div>';
}
?>
+170
View File
@@ -0,0 +1,170 @@
<?php
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/php/repo/stok_akhir.php
Desc. : PHP - Laporan Stok Akhir Barang
Created By : Siau Pheng (siaupheng@3fonia.com).
Created Date : January 24th, 2011.
Last Modified : October 1st, 2025.
(c) 2011 - 2025, 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
require_once(__DIR__."/../../../../../vendor/autoload.php");
require_once(__DIR__."/../func.iss.php");
use siaupheng\fonia3\DB\MySQL;
use siaupheng\fonia3\Web\Param;
use siaupheng\fonia3\Web\Form;
use siaupheng\fonia3\Data\SimpleXLS;
$db = $db ?? new MySQL();
$ajson = [];
$data = Param::Get("data");
$id_cab = Param::Get("CabID", $_SESSION['__APP_INV']['CABANGID']);
if (in_array($data, ["print","export"])) {
$id_sup = Param::Get("SupID", 0);
$id_grup = Param::Get("Grup_InvID", 0);
$tgl = Param::Get("Tanggal");
$m_urut = Param::Get("Urut", "B");
$is_harga = Param::Get("Harga", "Y");
$is_min = Param::Get("Min_Stok", "N");
$min_qty = Param::Get("Min_Qty", 0);
$nama_sup = ""; $nama_grup = "";
if ($id_sup > 0) {
$db->Query("SELECT CONCAT(Nama_Sup,' (',Kode_Sup,')') Nama FROM para_supplier WHERE SupID='".$id_sup."' LIMIT 1");
if ($db->Next()) $nama_sup = $db->Row("Nama");
}
if ($id_grup > 0) {
$db->Query("SELECT Nama_Grup Nama FROM inv_produk_grup WHERE Grup_InvID='".$id_grup."' LIMIT 1");
if ($db->Next()) $nama_grup = $db->Row("Nama");
}
// generate report header
$tglheader = $tgl;
$tgl = tgl_sql2str($tgl);
$tsql1 = ($id_sup==0) ? "" : " LEFT JOIN inv_produk_sup S ON (D.InvID=S.InvID)";
$tsql2 = ($id_sup==0) ? "" : " AND S.SupID='".$id_sup."'";
$tsql2 .= ($id_grup==0) ? "" : " AND P.Grup_InvID='".$id_grup."'";
$tsql2 .= ($is_min=="N") ? "" : " AND D.Stok<='".$min_qty."'";
$tsql3 = ($id_cab==0) ? "" : " AND CabID='".$id_cab."'";
$torder = ($m_urut=="B") ? " P.Nama_Produk" : " Total";
// query data laporan
$db->Query("SELECT P.Nama_Produk,P.Satuan_Normal,P.Satuan_Stok,D.Stok Jumlah,P.Harga_Pokok,D.Stok*P.Harga_Pokok Total,P.Qty Kali FROM (SELECT InvID,SUM(Stok) Stok FROM inv_detail WHERE Tgl_Ref<='".$tgl."'".$tsql3." GROUP BY InvID) D LEFT JOIN vi_inv_produk2 P ON (P.InvID=D.InvID) ".$tsql1." WHERE (NOT (D.Stok=0 AND P.Aktif=0)) AND (P.InvID IS NOT NULL)".$tsql2." ORDER BY".$torder);
}
if ( $data == "print" ) {
Report_Header("STOK AKHIR BARANG", "Periode : ".$tglheader);
$pre = new \siaupheng\fonia3\Printer\PrintHTML();
$pre->add_field("No.",10,"C");
$pre->add_field("Nama Barang",150,"L");
$pre->add_field("Stok",80,"R","rupiah");
$nkol = 3;
if ($is_harga=="Y") {
$pre->add_field("Harga",50,"R","rupiah");
$pre->add_field("Total",50,"R","rupiah");
$nkol = 5;
}
if ($id_sup>0) $pre->add_span(array("Nama Supplier : ".$nama_sup,$nkol,"L,B"));
if ($id_grup>0) $pre->add_span(array("Grup Barang : ".$nama_grup,$nkol,"L,B"));
$tot_stok = 0; $nomor = 0;
while ($db->Next()) {
$tot_stok += $db->Row("Total");
$_row = array(++$nomor, $db->Row("Nama_Produk"), Format_Stok($db->Row("Jumlah",0),$db->Row("Kali",0),$db->Row("Satuan_Normal"),$db->Row("Satuan_Stok")));
if ($is_harga=="Y") $_row[] = $db->Row("Harga_Pokok"); $_row[] = $db->Row("Total");
$pre->add_value($_row);
}
if ($is_harga=="Y") $pre->add_span(array("TOTAL",4,"R,B"),array($tot_stok,1,"R,B","rupiah"));
$pre->add_stamp(1, true);
$pre->show();
} else if ( $data == "export" ) {
$xls = new SimpleXLS([
'title'=>"Data Stok Akhir Barang",
'desc'=>"Export Data Stok Akhir Barang"
]);
$xls->add_header($_SESSION['__WEB_APP']['REG_NAME']);
$xls->add_header("DATA STOK AKHIR BARANG");
$xls->add_header("Periode : ".$tglheader);
$xls->add_field("No.", 10, "C");
$xls->add_field("Nama Barang", 60, "L");
$xls->add_field("Stok", 20, "R,N");
$nkol = 3;
if ($is_harga=="Y") {
$xls->add_field("Harga", 20, "R,N");
$xls->add_field("Total", 20, "R,N");
$nkol = 5;
}
$xls->add_sheet("".str_replace("S/D","-",$tglheader), true);
if ($id_sup>0) $xls->add_span(["Nama Supplier : ".$nama_sup,$nkol,"L"]);
if ($id_grup>0) $xls->add_span(["Grup Barang : ".$nama_grup,$nkol,"L"]);
$tot_stok = 0; $nomor = 0;
while ($db->Next()) {
$tot_stok += $db->Row("Total");
$_row = array(++$nomor, $db->Row("Nama_Produk"), Format_Stok($db->Row("Jumlah",0),$db->Row("Kali",0),$db->Row("Satuan_Normal"),$db->Row("Satuan_Stok")));
if ($is_harga=="Y") $_row[] = $db->Row("Harga_Pokok"); $_row[] = $db->Row("Total");
$xls->add_value($_row);
}
if ($is_harga=="Y") $xls->add_span(array("TOTAL",4,"R,B"),array($tot_stok,1,"R,N,B"));
$xls->add_stamp(1, true);
$xls->send("Data Stok Akhir Barang ".str_replace("S/D","-",$tglheader).".xlsx");
unset($xls);
} else if ( $data == "default") {
$form = new Form($db);
$tcab = $form->option_db("_", "CabID", $id_cab, false, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID", [0,"SEMUA CABANG"]);
$tsup = $form->option_db("_", "SupID", 0, true, false, "para_supplier", ["SupID","Nama_Sup"], "Aktif=1 ORDER BY Nama_Sup", [0,"SEMUA SUPPLIER"]);
$tgrup = $form->option_db("_", "Grup_InvID", 0, true, false, "inv_produk_grup", ["Grup_InvID","Nama_Grup"], "Aktif=1 ORDER BY Nama_Grup", [0,"SEMUA GRUP"]);
$ttgl = $form->datebox("_", "Tanggal", tgl_ymd(), true, false);
$turut = $form->radio("_", "Urut", "B", true, false, ["B"=>"Nama Barang","J"=>"Jumlah / Nilai"]);
$tharga = $form->radio("_", "Harga", "Y", true, false, ["Y"=>"Ya","N"=>"Tidak"]);
$tstok = $form->radio("_", "Min_Stok", "N", true, false, ["Y"=>"Ya","N"=>"Tidak"], null, "RepoStokAkhirJS.oc_MinStok();");
$tqty = $form->textbox("_", "Min_Qty", 0, false, false, "double");
echo '
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="CabID">Nama Cabang</label>
<div class="col">'.$tcab.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="SupID">Nama Supplier</label>
<div class="col">'.$tsup.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Grup_InvID">Grup Barang</label>
<div class="col">'.$tgrup.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Tanggal">Tanggal Stok</label>
<div class="col-sm-6 col-lg-5">'.$ttgl.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Urut">Urut Berdasarkan</label>
<div class="col col-form-label">'.$turut.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Harga">Cetak Harga ?</label>
<div class="col col-form-label">'.$tharga.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Min_Stok">Batas Maximum ?</label>
<div class="col-sm-4 col-lg-3 col-form-label">'.$tstok.'</div>
<div class="col-sm-4 col-lg-3">'.$tqty.'</div>
</div>';
}
?>
+189
View File
@@ -0,0 +1,189 @@
<?php
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/php/repo/stok_mutasi.php
Desc. : PHP - Laporan Mutasi Stok Barang
Created By : Siau Pheng (siaupheng@3fonia.com).
Created Date : July 16th, 2011.
Last Modified : October 2nd, 2025.
(c) 2011 - 2025, 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
require_once(__DIR__."/../../../../../vendor/autoload.php");
require_once(__DIR__."/../func.iss.php");
use siaupheng\fonia3\DB\MySQL;
use siaupheng\fonia3\Web\Param;
use siaupheng\fonia3\Web\Table;
use siaupheng\fonia3\Web\Form;
use siaupheng\fonia3\Data\SimpleXLS;
$db = $db ?? new MySQL();
$ajson = [];
$data = Param::Get("data");
$id_cab = Param::Get("CabID", $_SESSION['__APP_INV']['CABANGID']);
if (in_array($data, ["print","export"])) {
$id_inv = Param::Get("InvID", 0);
$tgl_from = Param::Get("Tgl_From");
$tgl_to = Param::Get("Tgl_To");
$nama_produk = "";
if ($id_inv > 0) {
$db->Query("SELECT Nama_Produk Nama FROM inv_produk WHERE InvID='".$id_inv."' LIMIT 1");
if ($db->Next()) $nama_produk = $db->Row("Nama");
}
// generate report header
$tglheader = $tgl_from;
if ($tgl_from!==$tgl_to) $tglheader .= " S/D ".$tgl_to;
$tgl_from = tgl_sql2str($tgl_from);
$tgl_to = tgl_sql2str($tgl_to);
// query ukuran normal produk & stok awal
$kali = 0; $sat_stok = ""; $sat_norm = "";
$db->Query("SELECT * FROM vi_inv_produk2 WHERE InvID='".$id_inv."' LIMIT 1");
if ($db->Next()) {
$kali = $db->Row("Qty", 0);
$sat_stok = $db->Row("Satuan_Stok");
$sat_norm = $db->Row("Satuan_Normal");
}
$stok = 0;
$tsql = ($id_cab==0) ? "" : " AND CabID='".$id_cab."'";
$db->Query("SELECT SUM(Stok) Stok FROM inv_detail WHERE Tgl_Ref<'".$tgl_from."' AND InvID='".$id_inv."'".$tsql);
if ($db->Next()) $stok = $db->RowFloat("Stok", 0);
// query data laporan
$db->Query("SELECT DATE_FORMAT(D.Tgl_Ref,'%d-%m-%Y') Tgl_Ref2,D.No_Ref,SUM(IF((D.Stok<0 OR D.NotaID=5 OR D.NotaID=6) AND D.NotaID<>3,-D.Stok,0)) Keluar,SUM(IF((D.Stok>0 OR D.NotaID=3) AND (D.NotaID<>5 AND D.NotaID<>6),D.Stok,0)) Masuk, IF(ISNULL(S.Nama_Sup),IF(D.NotaID=6,Q.Nama,''),CONCAT(S.Nama_Sup,IF(B.Data_Beli=1,'',' <i>(Retur)</i>'))) Nama FROM (SELECT No_Ref,Tgl_Ref,NotaID,SUM(Stok) Stok FROM inv_detail WHERE (Tgl_Ref BETWEEN '".$tgl_from."' AND '".$tgl_to."') AND InvID=".$id_inv." AND Stok<>0".$tsql." GROUP BY No_Ref) D LEFT JOIN inv_beli B ON (B.No_Beli=D.No_Ref) LEFT JOIN inv_jual J ON (J.No_Jual=D.No_Ref) LEFT JOIN inv_opname O ON (O.No_Opname=D.No_Ref) LEFT JOIN para_supplier S ON (S.SupID=B.SupID) LEFT JOIN app_operator Q ON (Q.UserID=J.UserID) LEFT JOIN inv_nota N ON (D.NotaID=N.NotaID) ORDER BY D.Tgl_Ref,N.Urut,D.No_Ref");
}
if ( $data == "print" ) {
Report_Header("MUTASI STOK BARANG", "Periode : ".$tglheader);
$pre = new \siaupheng\fonia3\Printer\PrintHTML();
$pre->add_field("Tanggal",20,"C");
$pre->add_field("No. Nota",20,"L");
$pre->add_field("Nama Supplier / Kasir",150,"L");
$pre->add_field("Masuk",80,"R","rupiah");
$pre->add_field("Keluar",50,"R","rupiah");
$pre->add_field("Stok",50,"R","rupiah");
$pre->add_span(array("Nama Barang : ".$nama_produk,6,"L,B"));
$tot_m = 0; $tot_k = 0;
$pre->add_span(array("Stok Awal",3,"R"),array("",1,"R"),array("",1,"R"),array(format_stok($stok,$kali,$sat_norm,$sat_stok),1,"R"));
while ($db->Next()) {
//if ($db->RowFloat("Stok", 0) == 0) continue;
$msk = $db->Row("Masuk");
$klr = $db->Row("Keluar");
$stok += $msk - $klr;
$tot_m += $msk;
$tot_k += $klr;
$pre->add_value($db->Row("Tgl_Ref2"), $db->Row("No_Ref"), $db->Row("Nama"), (($msk<>0)?format_stok($msk,$kali,$sat_norm,$sat_stok):""), (($klr<>0)?format_stok($klr,$kali,$sat_norm,$sat_stok):""), format_stok($stok,$kali,$sat_norm,$sat_stok));
}
$pre->add_span(array("Stok Akhir",3,"R"),array(format_stok($tot_m,$kali,$sat_norm,$sat_stok),1,"R"),array(format_stok($tot_k,$kali,$sat_norm,$sat_stok),1,"R"),array(format_stok($stok,$kali,$sat_norm,$sat_stok),1,"R"));
$pre->add_stamp(1, true);
$pre->show();
} else if ( $data == "export" ) {
$xls = new SimpleXLS([
'title'=>"Data Mutasi Stok Barang",
'desc'=>"Export Data Mutasi Stok Barang"
]);
$xls->add_header($_SESSION['__WEB_APP']['REG_NAME']);
$xls->add_header("DATA MUTASI STOK BARANG");
$xls->add_header("Periode : ".$tglheader);
$xls->add_field("Tanggal",15,"C");
$xls->add_field("No. Nota",20,"L");
$xls->add_field("Nama Supplier / Kasir",50,"L");
$xls->add_field("Masuk",20,"R");
$xls->add_field("Keluar",20,"R");
$xls->add_field("Stok",20,"R");
$xls->add_sheet("".str_replace("S/D","-",$tglheader), true);
$xls->add_span(array("Nama Barang : ".$nama_produk,6,"L,B"));
$tot_m = 0; $tot_k = 0;
$xls->add_span(array("Stok Awal",3,"R"),array("",1,"R"),array("",1,"R"),array(format_stok($stok,$kali,$sat_norm,$sat_stok),1,"R"));
while ($db->Next()) {
//if ($db->RowFloat("Stok", 0) == 0) continue;
$msk = $db->Row("Masuk");
$klr = $db->Row("Keluar");
$stok += $msk - $klr;
$tot_m += $msk;
$tot_k += $klr;
$xls->add_value($db->Row("Tgl_Ref2"), $db->Row("No_Ref"), $db->Row("Nama"), (($msk<>0)?format_stok($msk,$kali,$sat_norm,$sat_stok):""), (($klr<>0)?format_stok($klr,$kali,$sat_norm,$sat_stok):""), format_stok($stok,$kali,$sat_norm,$sat_stok));
}
$xls->add_span(array("Stok Akhir",3,"R"),array(format_stok($tot_m,$kali,$sat_norm,$sat_stok),1,"R"),array(format_stok($tot_k,$kali,$sat_norm,$sat_stok),1,"R"),array(format_stok($stok,$kali,$sat_norm,$sat_stok),1,"R"));
$xls->add_stamp(1, true);
$xls->send("Data Stok Akhir Barang ".str_replace("S/D","-",$tglheader).".xlsx");
unset($xls);
} else if ($data == "auto-produk") {
$tcari = Param::Get("Auto_Query");
$ajson['autodata'] = [];
$bcode = 0; $arec = [];
// Cari by SKU
$db->Query("SELECT P.*,CONCAT(K.Kode_SKU,' / ',K.Kode_Barcode,':',P.Nama_Produk,':',S.Nama_Satuan,':',CONVERT(FORMAT(K.Harga_Jual,0) USING UTF8)) Data2 FROM (SELECT * FROM inv_produk_kemasan WHERE Harga_Jual>0 AND Kode_SKU='".$tcari."' LIMIT 1) K LEFT JOIN inv_produk P ON (P.InvID=K.InvID) LEFT JOIN para_satuan S ON (S.SatuanID=K.SatuanID) WHERE P.Aktif=1");
if ($db->Next()) {
$bcode = 1;
$arec = $db->AllRow();
}
// Cari by Barcode
if ($bcode == 0) {
$db->Query("SELECT P.*,CONCAT(K.Kode_SKU,' / ',K.Kode_Barcode,':',P.Nama_Produk,':',S.Nama_Satuan,':',CONVERT(FORMAT(K.Harga_Jual,0) USING UTF8)) Data2 FROM (SELECT * FROM inv_produk_kemasan WHERE Harga_Jual>0 AND Kode_Barcode='".$tcari."' LIMIT 1) K LEFT JOIN inv_produk P ON (P.InvID=K.InvID) LEFT JOIN para_satuan S ON (S.SatuanID=K.SatuanID) WHERE P.Aktif=1");
if ($db->Next()) {
$bcode = 1;
$arec = $db->AllRow();
}
}
if ($bcode == 1) {
$ajson['autodata'][] = ['value'=>$arec['InvID'], 'text'=>$arec['Nama_Produk'], 'data'=>$arec['Data2'], 'bc'=>1];
} else {
$db->Query("SELECT P.*,IF(IFNULL(X.Stok,0)=0,'KOSONG',ROUND(X.Stok/K.Qty,2)) Sisa_Stok,K.Kode_SKU,K.Harga_Jual,S.Nama_Satuan,CONCAT(K.Kode_SKU,' / ',K.Kode_Barcode,':',P.Nama_Produk,':',S.Nama_Satuan,':',CONVERT(FORMAT(K.Harga_Jual,0) USING UTF8)) Data2 FROM (SELECT * FROM inv_produk_kemasan WHERE Harga_Jual>0 AND InvID IN (SELECT InvID FROM inv_produk WHERE Aktif=1 AND Nama_Produk LIKE '%".$tcari."%' ORDER BY InvID) ORDER BY InvID) K LEFT JOIN (SELECT * FROM inv_produk WHERE Aktif=1 AND Nama_Produk LIKE '%".$tcari."%' ORDER BY InvID) P ON (K.InvID=P.InvID) LEFT JOIN vi_inv_stok X ON (X.CabID='".$id_cab."' AND K.InvID=X.InvID) LEFT JOIN para_satuan S ON (S.SatuanID=K.SatuanID) ORDER BY P.Nama_Produk,K.Qty DESC LIMIT 50");
while ($db->Next()) {
$ajson['autodata'][] = ['value'=>$db->Row("InvID"), 'text'=>$db->Row("Nama_Produk"), 'html'=>'<span class="text-primary">'.$db->Row("Kode_SKU").'</span> '.$db->Row("Nama_Produk")." ".$db->Row("Nama_Satuan").' - Rp. '.rupiah($db->Row("Harga_Jual")).' <span class="text-danger">('.$db->Row("Sisa_Stok").')</span>', 'data'=>$db->Row("Data2"), 'bc'=>0];
}
}
} else if ( $data == "brow-produk" ) {
$tcari = trim(Param::Get("Cari_Produk"));
$tsql = ($tcari=="") ? "" : " AND P.Barcode_Nama LIKE '%".$tcari."%'";
$obj = new Table($db);
$obj->set_table("vi_inv_produk P", "P.*", "P.Harga_Jual>0 AND P.Aktif=1".$tsql);
$obj->add_field("InvID", "ID", "hid");
$obj->add_field("Kode_SKU", "SKU", "c");
$obj->add_field("Kode_Barcode", "Kode Barcode", "c");
$obj->add_field("Nama_Lengkap", "Nama Barang", "awr");
$obj->add_field("Harga_Jual", "Harga @", "r", "rupiah");
$obj->add_field("Nama_Produk", "Produk", "hid");
$obj->add_field("Nama_Satuan", "Satuan", "hid");
$obj->set_field_order("Kode_SKU", "A");
$obj->add_row_btn("save", "Pilih", "RepoStokMutasiJS.produk_select");
$obj->set_func_navi("RepoStokMutasiJS.data_query('brow-produk')");
$ajson[] = $obj->db_table("divBrowProduk");
} else if ( $data == "default") {
$form = new Form($db);
$tbrg = $form->textauto("_", "Nama_Produk", null, true, true, "Nama Barang");
$tcab = $form->option_db("_", "CabID", $id_cab, false, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID", [0,"SEMUA CABANG"]);
$ttgl1 = $form->datebox("_", "Tgl_From", tgl_ymd(), true, false);
$ttgl2 = $form->datebox("_", "Tgl_To", tgl_ymd(), true, false);
echo '
<div class="row mb-1"><label class="col-sm-3 col-lg-3 col-form-label" for="Nama_Produk">Nama Barang</label><div class="col"><div class="input-group">'.$tbrg.'<button class="btn btn-info shadow-none" type="button" id="butBrow"><i class="bi-search"></i></button></div></div></div>
<div class="row mb-1"><label class="col-sm-3 col-lg-3 col-form-label" for="CabID">Nama Cabang</label><div class="col">'.$tcab.'</div></div>
<div class="row mb-1"><label class="col-sm-3 col-lg-3 col-form-label" for="Tgl_From">Mulai Tanggal</label><div class="col-sm-8 col-lg-5">'.$ttgl1.'</div></div>
<div class="row mb-1"><label class="col-sm-3 col-lg-3 col-form-label" for="Tgl_To">Sampai Tanggal</label><div class="col-sm-8 col-lg-5">'.$ttgl2.'</div></div>
<input type="hidden" id="InvID" value="0" />';
}
send_json($ajson);
?>
+125
View File
@@ -0,0 +1,125 @@
<?php
/*******************************************************************
Module : /apps/php/sys/about.php
Desc. : PHP - Informasi Aplikasi
Created By : Siau Pheng (siaupheng@3fonia.com).
Created Date : November 23th, 2011.
Last Modified : September 30th, 2025.
(c) 2011 - 2025, 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
require_once(__DIR__."/../../../../../vendor/autoload.php");
use siaupheng\fonia3\DB\MySQL;
use siaupheng\fonia3\DB\SQL;
use siaupheng\fonia3\DB\CheckSQL;
use siaupheng\fonia3\Web\Param;
use siaupheng\fonia3\Web\Form;
use siaupheng\fonia3\Web\Register;
use siaupheng\fonia3\Web\Update;
$db = $db ?? new MySQL();
$ajson = array();
$data = Param::Get("data");
$mode = Param::Get("mode");
$cpd = new Update($db);
if ( $data == "check_update") {
$ainfo = $cpd->check_update();
echo '<table width="100%">
<tr><td>Versi Sekarang</td><td>:</td><td>'.$ainfo['build_cur'].'</td></tr>
<tr><td>Versi Update</td><td>:</td><td>'.$ainfo['build_new'].'</td></tr>
<tr><td>Status Update</td><td>:</td><td>'.$ainfo['svr_status'].'</td></tr>
<input type="hidden" id="file_build" value="'.$ainfo['build_new'].'">
<input type="hidden" id="file_online" value="'.(($ainfo['build_new']>$ainfo['build_cur'])?1:0).'">
<input type="hidden" id="file_web" value="'.$ainfo['file_web'].'">
<input type="hidden" id="file_sql" value="'.$ainfo['file_sql'].'">
</table>';
} else if ( $data == "proses_update") {
$ajson['sukses'] = $cpd->go_update(Param::Get("file_web"), Param::Get("file_build"));
if ($ajson['sukses']==true && Param::Get("file_sql","")!=="") $cpd->update_mysql(Param::Get("file_sql"));
} else if ( $data == "check_db") {
$form = new Form($db);
$t_cek = $form->checkbox("_", "DB_Cek", 1, true, false, [1,0]);
$t_repa = $form->checkbox("_", "DB_Repair", 0, true, false, [1,0]);
$t_opti = $form->checkbox("_", "DB_Opti", 0, true, false, [1,0]);
$form->show('
<div class="row mb-4">
<div class="col-12"><div class="input-group">'.$t_cek.'<label for="DB_Cek">Cek Database</label></div><label class="small" for="DB_Cek">Proses Cek ini otomatis memperbaiki tabel yang bermasalah, jika ditemukan.</label></div>
</div>
<div class="row mb-4">
<div class="col-12"><div class="input-group">'.$t_repa.'<label for="DB_Repair">Perbaiki Database</label></div><label class="small" for="DB_Repair">Proses Perbaiki akan memperbaiki semua tabel yang bermasalah.</label></div>
</div>
<div class="row mb-1">
<div class="col-12"><div class="input-group">'.$t_opti.'<label for="DB_Opti">Optimalisasi Database</label></div><label class="small" for="DB_Opti">Proses Optimalisasi ini otomatis merapikan database, merampingkan database dari record data yang telah dihapus.</label></div>
</div>
<div class="d-none" id="DB_Hasil">&nbsp;</div>');
} else if ( $data == "proses_db") {
$chk = new CheckSQL($db);
$chk->ignore_table("app_auth","app_backup","app_config","app_menu","app_operator");
if (Param::Get("DB_Cek",0)==1) {
echo "<br>";
echo $chk->check_db();
}
if (Param::Get("DB_Repair",0)==1) {
echo "<br>";
echo $chk->repair_db();
}
if (Param::Get("DB_Opti",0)==1) {
echo "<br>";
echo $chk->optimize_db();
}
} else if ( $data == "default") {
$apps = $_SESSION['__WEB_APP'];
$apps['CREATOR_YEAR'] = ($apps['CREATOR_YEAR']!=date('Y')) ? $apps['CREATOR_YEAR']." - ".date('Y') : $apps['CREATOR_YEAR'];
$hasil = '<div>
<ul class="nav nav-tabs" role="tablist">
<li class="nav-item" role="presentation">
<button class="nav-link active" id="about-tab" data-bs-toggle="tab" data-bs-target="#about" type="button" role="tab" aria-controls="about" aria-selected="true">Tentang Aplikasi</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link" id="other-tab" data-bs-toggle="tab" data-bs-target="#other" type="button" role="tab" aria-controls="other" aria-selected="false">Informasi Pendukung</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link" id="tool-tab" data-bs-toggle="tab" data-bs-target="#tool" type="button" role="tab" aria-controls="tool" aria-selected="false">Tools</button>
</li>
</ul>
<div class="tab-content border border-top-0 p-3">
<div class="tab-pane fade active show" id="about" role="tabpanel" aria-labelledby="about-tab">
<div class="text-center text-secondary">
<span class="fs-5">'.$apps['REG_NAME'].'</span><br>'.$apps['REG_ADDRESS'].'<br>'.strtoupper($apps['REG_CITY']).' '.$apps['REG_POSTCODE'].'</div><br>
<table>
<tr><td>Register ID</td><td class="c pe-1">:</td><td nowrap>'.Register::reg_id().'</td></tr>
<tr><td>Register Code</td><td class="c">:</td><td>'.Register::reg_code().'</td></tr>
</table>
<hr class="my-2">
<div class="text-center text-secondary">'.$apps['APP_NAMES'].' Ver. '.$apps['APP_VER'].'<br>Updated : '.$apps['APP_UPDATED'].'<br><br><span style="font-size:.9em;">&copy; '.$apps['CREATOR_YEAR'].', '.$apps['CREATOR_NAME'].'<br>'.$apps['CREATOR_WEBSITE'].'.</span></div>
</div>
<div class="tab-pane fade" id="other" role="tabpanel" aria-labelledby="other-tab">
<div class="row"><div class="col" id="divBuildInfo"></div></div>
</div>
<div class="tab-pane fade" id="tool" role="tabpanel" aria-labelledby="tool-tab">
<div class="row mb-2">
<div class="col-md-8">Silahkan jalankan proses Cek Database, jika terjadi masalah dengan database aplikasi.</div>
<div class="col-md-4 d-grid gap-2 my-auto"><button type="button" class="btn btn-info col-12" onclick="AboutJS.proses_checkdb();">Cek Database</button></div>
</div>
<div class="row">
<div class="col-md-8">Cek update aplikasi secara online.</div>
<div class="col-md-4 d-grip gap-2 my-auto"><button type="button" class="btn btn-info col-12" onclick="AboutJS.proses_update();">Cek Update</button></div>
</div>
</div>
</div>
</div>';
echo $hasil;
}
send_json($ajson);
?>
+52
View File
@@ -0,0 +1,52 @@
<?php
/*******************************************************************
Module : /apps/php/sys/chpasswd.php
Desc. : PHP - Perubahan Password Operator
Created By : Siau Pheng (siaupheng@3fonia.com).
Created Date : December 7th, 2008.
Last Modified : April 25th, 2020.
(c) 2008 - 2020, 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
require_once(__DIR__."/../../../../../vendor/autoload.php");
use siaupheng\fonia3\DB\MySQL;
use siaupheng\fonia3\DB\SQL;
use siaupheng\fonia3\Web\Auth;
use siaupheng\fonia3\Web\Param;
use siaupheng\fonia3\Web\Form;
$db = $db ?? new MySQL();
$auth = new Auth($db);
$ajson = [];
$data = Param::Get("data");
if ( $data == "default") {
$form = new Form($db);
$form->password("Password Lama", "LPass", $l_pass, true, true, "masukkan password lama", 20);
$form->password("Password Baru 1", "BPass1", $b_pass1, true, true, "masukkan password baru 1", 20);
$form->password("Password Baru 2", "BPass2", $b_pass2, true, true, "masukkan password baru 2", 20);
$form->show(' _LPass_ _BPass1_ _BPass2_ ');
} else if ( $data == "chpasswd") {
$l_pass = Param::Get("LPass");
$b_pass1 = Param::Get("BPass1");
$b_pass2 = Param::Get("BPass2");
$ajson['status'] = false;
if ($auth->user_check(user_user(), $l_pass)) {
$db->Query("UPDATE app_operator SET Password=MD5('".$b_pass1."') WHERE UserID='".user_id()."'");
$ajson['status'] = true;
$ajson['msg'] = "Sukses merubah password Anda!";
} else {
$ajson['msg'] = "Password lama Anda salah!";
}
}
send_json($ajson);
?>
+83
View File
@@ -0,0 +1,83 @@
<?php
/*******************************************************************
Module : /apps/php/sys/config.php
Desc. : PHP - Konfigurasi Aplikasi
Created By : Siau Pheng (siaupheng@3fonia.com).
Created Date : May 25th, 2010.
Last Modified : September 30th, 2025.
(c) 2010 - 2025, 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
require_once(__DIR__."/../../../../../vendor/autoload.php");
use siaupheng\fonia3\DB\MySQL;
use siaupheng\fonia3\DB\SQL;
use siaupheng\fonia3\Web\Param;
use siaupheng\fonia3\Web\Form;
$db = $db ?? new MySQL();
$data = Param::Get("data");
$mode = Param::Get("mode");
if ( $data == "master" ) {
if ( $mode == "save" ) {
$sql = new SQL($db);
$sql->set_table("app_config");
$sql->add_param("REG_ADDRESS");
$sql->add_param("REG_CITY");
$sql->add_param("REG_POSTCODE");
$sql->add_param("REG_PHONE");
$sql->add_param("REG_FAX");
$sql->add_param("REG_OWNER");
$sql->add_param("REG_NPWP");
$sql->add_param("REG_WEBSITE");
$sql->add_param("REG_EMAIL");
$sql->add_param_userid();
$sql->add_where("REG_ID");
$sql->UpdateDB();
$mode = "view";
}
$para = [];
$id = Param::Get("REG_ID", $_SESSION['__WEB_APP']['REG_ID']);
$tsql = ($id=="") ? " ORDER BY REG_ID ASC LIMIT 1" : " WHERE REG_ID='".$id."'";
$db->Query("SELECT * FROM app_config".$tsql);
if ($db->Next()) $para = $db->AllRow();
$benable = ($mode=="edit") ? true : false;
$form = new Form($db);
$form->textbox("Nama Perusahaan", "REG_NAME", $para['REG_NAME'], false, false, "text", "masukkan nama instansi");
$form->textarea("Alamat Perusahaan", "REG_ADDRESS", $para['REG_ADDRESS'], $benable, false, 1, "masukkan alamat instansi");
$form->textbox("Kabupaten / Kota", "REG_CITY", $para['REG_CITY'], $benable, false, "text", "masukkan nama kota");
$form->textbox("Kode Pos", "REG_POSTCODE", $para['REG_POSTCODE'], $benable, false, "integer", "masukkan nomor kodepos");
$form->textbox("No. Telpon", "REG_PHONE", $para['REG_PHONE'], $benable, false, "phone", "masukkan nomor telphone");
$form->textbox("No. Fax", "REG_FAX", $para['REG_FAX'], $benable, false, "phone", "masukkan nomor faximile");
$form->textbox("Website", "REG_WEBSITE", $para['REG_WEBSITE'], $benable, false, "text", "masukkan alamat website");
$form->textbox("Email", "REG_EMAIL", $para['REG_EMAIL'], $benable, false, "email", "masukkan alamat email");
$form->textbox("Nama Pemilik", "REG_OWNER", $para['REG_OWNER'], $benable, false, "text", "masukkan nama owner");
$form->textbox("NPWP Pemilik", "REG_NPWP", $para['REG_NPWP'], $benable, false, "text", "masukkan npwp owner");
$form->hidden("REG_ID", $para['REG_ID']);
$form->hidden("mode", $mode);
$form->show('
_REG_NAME_
_REG_ADDRESS_
_REG_CITY_
_REG_POSTCODE_
_REG_PHONE_
_REG_FAX_
_REG_WEBSITE_
_REG_EMAIL_
<hr class="my-2">
_REG_OWNER_
_REG_NPWP_
_mode_ _REG_ID_ ');
} else if ( $data == "default") {
echo '<div id="divMaster">&nbsp;</div>';
}
?>
+87
View File
@@ -0,0 +1,87 @@
<?php
/*******************************************************************
Module : /apps/php/sys/printer.php
Desc. : PHP - Konfigurasi Printer POS
Created By : Siau Pheng (siaupheng@3fonia.com).
Created Date : August 4th, 2013.
Last Modified : November 7th, 2025.
(c) 2013 - 2025, 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
require_once(__DIR__."/../../../../../vendor/autoload.php");
require_once(__DIR__."/../func.iss.php");
use siaupheng\fonia3\DB\MySQL;
use siaupheng\fonia3\DB\SQL;
use siaupheng\fonia3\Web\Param;
use siaupheng\fonia3\Web\Form;
$db = $db ?? new MySQL();
$ajson = [];
$data = Param::Get("data");
$mode = Param::Get("mode");
$id_reg = Param::Get("REG_ID", $_SESSION['__WEB_APP']['REG_ID']);
if ( $data == "form-printer" ) {
if ( $mode == "save" ) {
$sql = new SQL($db);
$sql->set_table("inv_config");
$sql->add_param("PRINT_AUTO");
$sql->add_param("PRINT_OPENCD");
$sql->add_param("PRINT_AUTOCUT");
$sql->add_param("PRINT_ROW");
$sql->add_param("TITLE_END");
$sql->add_where("REG_ID");
$sql->UpdateDB();
$_SESSION['__APP_INV']['PRINT_AUTO'] = Param::Get("PRINT_AUTO", 1);
$_SESSION['__APP_INV']['PRINT_OPENCD'] = Param::Get("PRINT_OPENCD", 1);
$_SESSION['__APP_INV']['PRINT_AUTOCUT'] = Param::Get("PRINT_AUTOCUT", 1);
$_SESSION['__APP_INV']['PRINT_ROW'] = Param::Get("PRINT_ROW", 0);
$_SESSION['__APP_INV']['TITLE_END'] = Param::Get("TITLE_END", "");
$ajson['sukses'] = true;
$mode = "view";
}
$para = [];
if ($id_reg > 0) {
$db->Query("SELECT * FROM inv_config WHERE REG_ID='".$id_reg."' LIMIT 1");
if ($db->Next()) $para = $db->AllRow();
}
$benable = ($mode=="edit") ? true : false;
$form = new Form($db);
$fautoprint = $form->checkbox("_", "PRINT_AUTO", $para['PRINT_AUTO'], $benable, false, [1,0]);
$fopencd = $form->checkbox("_", "PRINT_OPENCD", $para['PRINT_OPENCD'], $benable, false, [1,0]);
$fautocut = $form->checkbox("_", "PRINT_AUTOCUT", $para['PRINT_AUTOCUT'], $benable, false, [1,0]);
$ftitleend = $form->textbox("_", "TITLE_END", $para['TITLE_END'], $benable, false, "text", "catatan bawah struk");
$fprintrow = $form->textbox("_", "PRINT_ROW", $para['PRINT_ROW'], $benable, false, "number");
$ajson['html'] = '
<div class="row mb-1">
<div class="col">
<div class="input-group mb-1"><div class="input-group-text">'.$fautoprint.'</div><span class="input-group-text col">Otomatis Cetak Struk ?</span></div>
<div class="input-group mb-1"><div class="input-group-text">'.$fopencd.'</div><span class="input-group-text col">Otomatis Buka Laci Kasir ?</span></div>
<div class="input-group mb-1"><div class="input-group-text">'.$fautocut.'</div><span class="input-group-text col">Otomatis Potong Struk ?</span></div>
</div>
</div>
<div class="row mb-1"><hr class="my-1"></div>
<div class="row mb-1">
<div class="col"><div class="input-group"><span class="input-group-text" style="width:180px;">Footer Struk</span>'.$ftitleend.Form_Info("Gunakan [br] untuk footer yang terdiri dari beberapa baris.").'</div></div>
</div>
<div class="row mb-1">
<div class="col-6"><div class="input-group"><span class="input-group-text" style="width:180px;">Baris Cetak Kosong</span>'.$fprintrow.Form_Info("Jumlah baris kosong dibawah struk/nota sebelum potong.").'</div></div>
</div>
<input type="hidden" id="mode" value="'.$mode.'" >';
} else if ( $data == "default") {
echo '<div class="card"><div class="card-body"><div id="divPrinter">&nbsp;</div><input type="hidden" id="REG_ID" value="'.$id_reg.'"></div></div>';
}
send_json($ajson);
?>