first commit
@@ -0,0 +1,7 @@
|
||||
# ignore cache content
|
||||
cache/*.js
|
||||
cache/*.css
|
||||
|
||||
# ignore app.php and mysql.php
|
||||
app.php
|
||||
mysql.php
|
||||
@@ -0,0 +1,22 @@
|
||||
# GLAMORE
|
||||
|
||||
Aplikasi Stok dan Penjualan POS
|
||||
|
||||
## Description
|
||||
|
||||
Copy of INVESA MAIN FRAME
|
||||
|
||||
## Authors
|
||||
|
||||
Developer dan programmer
|
||||
|
||||
[@siaupheng](mailto:[email protected])
|
||||
|
||||
## Version History
|
||||
|
||||
* 1.0
|
||||
* Initial Release
|
||||
|
||||
## License
|
||||
|
||||
This project is licensed.
|
||||
@@ -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";
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
@@ -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); }
|
||||
}
|
||||
}
|
||||
});
|
||||
})
|
||||
});
|
||||
}
|
||||
@@ -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"> </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();
|
||||
}
|
||||
|
||||
};
|
||||
@@ -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"> </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"> </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();
|
||||
}
|
||||
|
||||
};
|
||||
@@ -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"> </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();
|
||||
}
|
||||
|
||||
};
|
||||
@@ -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"> </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"> </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"> </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));
|
||||
}
|
||||
|
||||
};
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
};
|
||||
@@ -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"> </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();
|
||||
});
|
||||
}
|
||||
|
||||
};
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
};
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
};
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
};
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
};
|
||||
@@ -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"> </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"> </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();
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
};
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
@@ -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"> </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();
|
||||
}
|
||||
|
||||
};
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
};
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
@@ -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>';
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -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 ([email protected]).
|
||||
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," "]);//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," "]);
|
||||
$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"> </div>
|
||||
</div>
|
||||
</div>
|
||||
</div></div>
|
||||
</div>';
|
||||
}
|
||||
|
||||
send_json($ajson);
|
||||
?>
|
||||
@@ -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 ([email protected]).
|
||||
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," "]);//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," "]);
|
||||
$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"> </div>
|
||||
</div>
|
||||
</div>
|
||||
</div></div>
|
||||
</div>';
|
||||
}
|
||||
|
||||
send_json($ajson);
|
||||
?>
|
||||
@@ -0,0 +1,126 @@
|
||||
<?php
|
||||
|
||||
/*******************************************************************
|
||||
|
||||
Module : /apps/php/index.php
|
||||
Desc. : PHP - 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.
|
||||
|
||||
*******************************************************************/
|
||||
|
||||
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);
|
||||
?>
|
||||
@@ -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 ([email protected]).
|
||||
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);
|
||||
?>
|
||||
@@ -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 ([email protected]).
|
||||
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," "]);
|
||||
$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"> </div>
|
||||
<div id="divDetailTabel"> </div>
|
||||
</div>
|
||||
</div>
|
||||
</div></div>
|
||||
</div>';
|
||||
}
|
||||
|
||||
send_json($ajson);
|
||||
?>
|
||||
@@ -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);
|
||||
?>
|
||||
@@ -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," "]);
|
||||
$tsat = $form->option_db("_", "StokID", 0, true, false, "para_satuan", ["SatuanID","Nama_Satuan"], "Aktif=1 ORDER BY Nama_Satuan", [0," "]);
|
||||
$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">≈</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"> </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"> </div>
|
||||
</div>
|
||||
<div class="col-sm-12 col-md-3 col-lg-2 border-start">
|
||||
<div id="divPOS2"> </div>
|
||||
</div>
|
||||
</div>
|
||||
</div></div></div>';
|
||||
}
|
||||
|
||||
send_json($ajson);
|
||||
|
||||
?>
|
||||
@@ -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);
|
||||
?>
|
||||
@@ -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);
|
||||
?>
|
||||
@@ -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>';
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -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>';
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -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>';
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -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>';
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -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"> </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"> </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"> </p>' . $_head . $cont . "</tr></table>";
|
||||
}
|
||||
|
||||
send_json($ajson);
|
||||
?>
|
||||
@@ -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%"> </td><td width="35%" class=""> </td></tr>';
|
||||
$kop .= '<tr><td>Tanggal Opname</td><td class="ttkdua">'.$ainfo['Tgl_Opname2'].'</td><td> </td><td class=""> </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>.' : ' ';
|
||||
$body .= '</tbody></table><table class="notaFooter"><tr><td colspan="2">'.$t_catat.'</td></tr><tr><td width="50%" class="stamp"> </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") {}
|
||||
|
||||
?>
|
||||
@@ -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>';
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -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>';
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -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);
|
||||
?>
|
||||
@@ -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"> </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;">© '.$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);
|
||||
?>
|
||||
@@ -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);
|
||||
?>
|
||||
@@ -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"> </div>';
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -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"> </div><input type="hidden" id="REG_ID" value="'.$id_reg.'"></div></div>';
|
||||
|
||||
}
|
||||
|
||||
send_json($ajson);
|
||||
?>
|
||||
@@ -0,0 +1,18 @@
|
||||
/*******************************************************************
|
||||
|
||||
Module : /assets/css/print.css
|
||||
Desc. : CSS Custom Styles for Printing
|
||||
Created By : Siau Pheng (siaupheng@3fonia.com).
|
||||
Created Date : December 20th, 2007.
|
||||
Last Modified : October 15th, 2023.
|
||||
|
||||
(c) 2007 - 2023, 3FONIA Software; WWW.3FONIA.COM.
|
||||
|
||||
*******************************************************************/
|
||||
|
||||
@media print {
|
||||
#linebreak { display: none; }
|
||||
#autopage { display: none; page-break-after: auto; }
|
||||
#pagebreak { page-break-after: always; }
|
||||
table.notaTable td { white-space: unset !important; }
|
||||
}
|
||||
@@ -0,0 +1,160 @@
|
||||
/*******************************************************************
|
||||
|
||||
Module : /assets/css/fonts.css
|
||||
Desc. : CSS Fonts
|
||||
Created By : Siau Pheng (siaupheng@3fonia.com).
|
||||
Created Date : December 20th, 2007.
|
||||
Last Modified : September 26th, 2025.
|
||||
|
||||
(c) 2009 - 2025, 3FONIA Software; WWW.3FONIA.COM.
|
||||
|
||||
*******************************************************************/
|
||||
|
||||
:root {
|
||||
--bs-body-font-size: .95rem;
|
||||
--bs-body-line-height: 1.2;
|
||||
}
|
||||
|
||||
.form-control {
|
||||
font-size: unset;
|
||||
}
|
||||
|
||||
table.garis {
|
||||
width: 100%;
|
||||
border: 1px solid #000;
|
||||
border-spacing: 0;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
table.garis th, table.garis td {
|
||||
font-size: .9rem;
|
||||
text-align: left;
|
||||
border: 1px solid #000;
|
||||
padding: 2mm;
|
||||
}
|
||||
table.garis th {
|
||||
font-size: 1rem;
|
||||
text-align: center;
|
||||
vertical-align: middle;
|
||||
background-color: #ddd;
|
||||
white-space: nowrap;
|
||||
}
|
||||
table.garis td { padding-top: 1.2mm; padding-bottom: 1.2mm; vertical-align: top; }
|
||||
|
||||
/* ----------------- NOTA ----------------- */
|
||||
|
||||
@media print {
|
||||
div.printNota {
|
||||
height: unset;
|
||||
}
|
||||
}
|
||||
div.notaTitle {
|
||||
font-size: 13pt;
|
||||
text-align: center;
|
||||
}
|
||||
table.notaTable {
|
||||
width: 100%;
|
||||
border: 1px solid #000;
|
||||
table-layout: fixed;
|
||||
border-spacing: 0;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
table.notaTable th, table.notaTable td {
|
||||
text-align: left;
|
||||
border: 1px solid #000;
|
||||
padding: 3px;
|
||||
}
|
||||
table.notaTable th {
|
||||
text-align: center;
|
||||
vertical-align: middle;
|
||||
white-space: nowrap;
|
||||
}
|
||||
table.notaTable td { padding-top: 2px; padding-bottom: 2px; vertical-align: top; overflow: hidden; white-space: nowrap; }
|
||||
|
||||
table.notaHeader {
|
||||
width: 100%;
|
||||
margin-top: 5px;
|
||||
}
|
||||
table.notaHeader td {
|
||||
vertical-align: middle;
|
||||
padding: 1mm;
|
||||
}
|
||||
table.notaFooter {
|
||||
width: 100%;
|
||||
border: 1px solid #000;
|
||||
border-top: none;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
table.notaFooter td {
|
||||
vertical-align: top;
|
||||
padding: 1mm;
|
||||
width: 50%;
|
||||
}
|
||||
table.notaFooter td.stamp {
|
||||
font-size: 8pt;
|
||||
}
|
||||
|
||||
table.nostyle td {
|
||||
width: unset;
|
||||
}
|
||||
|
||||
table td.ttkdua:before {
|
||||
content: ': ';
|
||||
}
|
||||
|
||||
table>tbody tr.rgg td:not(:last-child) { background-color: #B8F1A8; }
|
||||
|
||||
@media screen, projection {
|
||||
#linebreak { color: #FF0000; text-align: center; font-size: 10pt; }
|
||||
#autopage, #pagebreak { display: none; }
|
||||
}
|
||||
|
||||
table.table th {
|
||||
background-color: #ddd;
|
||||
}
|
||||
|
||||
/** POS **/
|
||||
|
||||
table.tabel-pos tbody td.dataTables_empty {
|
||||
color: transparent;
|
||||
height: 300px;
|
||||
}
|
||||
table.tabel-pos tbody tr:has(td.dataTables_empty):hover {
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
/** LABEL HARGA **/
|
||||
|
||||
.vcanvas {
|
||||
width: 60mm;
|
||||
height: 20mm;
|
||||
padding: 5px;
|
||||
float: left;
|
||||
border: 1px dotted #333;
|
||||
box-sizing: unset !important;
|
||||
line-height: 1;
|
||||
page-break-inside: avoid;
|
||||
}
|
||||
.vcanvas .vrow {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
float: left;
|
||||
}
|
||||
.vcanvas .vrow .vkonten {
|
||||
width: 100%;
|
||||
float: left;
|
||||
font-family: verdana;
|
||||
}
|
||||
.vcanvas .vrow .vkonten .vnama {
|
||||
font-size: 16pt;
|
||||
text-align: center;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
-webkit-line-clamp: 2;
|
||||
display: -webkit-box;
|
||||
-webkit-box-orient: vertical;
|
||||
}
|
||||
.vcanvas .vrow .vkonten .vharga {
|
||||
font-size: 14pt;
|
||||
text-align: center;
|
||||
padding-top: 10px;
|
||||
}
|
||||
|
After Width: | Height: | Size: 277 KiB |
|
After Width: | Height: | Size: 182 KiB |
|
After Width: | Height: | Size: 247 KiB |
|
After Width: | Height: | Size: 274 KiB |
|
After Width: | Height: | Size: 72 KiB |
|
After Width: | Height: | Size: 49 KiB |
|
After Width: | Height: | Size: 84 KiB |
|
After Width: | Height: | Size: 37 KiB |
|
After Width: | Height: | Size: 41 KiB |
|
After Width: | Height: | Size: 76 KiB |
|
After Width: | Height: | Size: 81 KiB |
|
After Width: | Height: | Size: 213 KiB |
|
After Width: | Height: | Size: 3.3 KiB |
|
After Width: | Height: | Size: 38 KiB |
|
After Width: | Height: | Size: 7.9 KiB |
@@ -0,0 +1,32 @@
|
||||
/*******************************************************************
|
||||
|
||||
Module : /assets/locale/fonia.id.js
|
||||
Desc. : JS - Fonia Module Locale
|
||||
Created By : Siau Pheng (siaupheng@3fonia.com).
|
||||
Created Date : January 28th, 2013.
|
||||
Last Modofied : November 22nd, 2019
|
||||
|
||||
(c) 2013 - 2019, 3FONIA Software; WWW.3FONIA.COM.
|
||||
|
||||
*******************************************************************/
|
||||
|
||||
if (typeof FoniaJS !== "undefined") {
|
||||
|
||||
FoniaJS.locale('id', {
|
||||
Fonia: {
|
||||
sess_expire: 'Session Anda telah berakhir, silakan login kembali!',
|
||||
page404: 'Halaman aplikasi belum tersedia!',
|
||||
input_passwd: 'Silakan masukkan Password!',
|
||||
input_userid: 'Silakan masukkan User ID!',
|
||||
auth_super: 'Persetujuan Supervisor',
|
||||
auth_user: 'Validasi Operator',
|
||||
auth_wait_msg: 'Menunggu disetujui oleh<br>Supervisor Anda...',
|
||||
cancel: 'Batal',
|
||||
auth_fail: 'Proses gagal!<br>Menunggu terlalu lama ...',
|
||||
auth_success: 'Proses disetujui!',
|
||||
but_add: 'Tambah',
|
||||
but_edit: 'Ubah'
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
@@ -0,0 +1,85 @@
|
||||
/*******************************************************************
|
||||
|
||||
Module : /assets/locale/moment.id.js
|
||||
Desc. : JS - Moment Locale
|
||||
Created By : Siau Pheng (siaupheng@3fonia.com).
|
||||
Created Date : January 28th, 2013.
|
||||
Last Modofied : November 22nd, 2019
|
||||
|
||||
(c) 2013 - 2019, 3FONIA Software; WWW.3FONIA.COM.
|
||||
|
||||
*******************************************************************/
|
||||
|
||||
if (typeof moment !== "undefined") {
|
||||
|
||||
moment.locale('id', {
|
||||
months : 'Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember'.split('_'),
|
||||
monthsShort : 'Jan_Feb_Mar_Apr_Mei_Jun_Jul_Agt_Sep_Okt_Nov_Des'.split('_'),
|
||||
weekdays : 'Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu'.split('_'),
|
||||
weekdaysShort : 'Min_Sen_Sel_Rab_Kam_Jum_Sab'.split('_'),
|
||||
weekdaysMin : 'Mg_Sn_Sl_Rb_Km_Jm_Sb'.split('_'),
|
||||
longDateFormat : {
|
||||
LT : 'HH.mm',
|
||||
LTS : 'HH.mm.ss',
|
||||
L : 'DD-MM-YYYY',
|
||||
LL : 'D MMMM YYYY',
|
||||
LLL : 'D MMMM YYYY [pukul] HH.mm',
|
||||
LLLL : 'dddd, D MMMM YYYY [pukul] HH.mm'
|
||||
},
|
||||
meridiemParse: /pagi|siang|sore|malam/,
|
||||
meridiemHour : function (hour, meridiem) {
|
||||
if (hour === 12) {
|
||||
hour = 0;
|
||||
}
|
||||
if (meridiem === 'pagi') {
|
||||
return hour;
|
||||
} else if (meridiem === 'siang') {
|
||||
return hour >= 11 ? hour : hour + 12;
|
||||
} else if (meridiem === 'sore' || meridiem === 'malam') {
|
||||
return hour + 12;
|
||||
}
|
||||
},
|
||||
meridiem : function (hours, minutes, isLower) {
|
||||
if (hours < 11) {
|
||||
return 'pagi';
|
||||
} else if (hours < 15) {
|
||||
return 'siang';
|
||||
} else if (hours < 19) {
|
||||
return 'sore';
|
||||
} else {
|
||||
return 'malam';
|
||||
}
|
||||
},
|
||||
calendar : {
|
||||
sameDay : '[Hari ini pukul] LT',
|
||||
nextDay : '[Besok pukul] LT',
|
||||
nextWeek : 'dddd [pukul] LT',
|
||||
lastDay : '[Kemarin pukul] LT',
|
||||
lastWeek : 'dddd [lalu pukul] LT',
|
||||
sameElse : 'L'
|
||||
},
|
||||
relativeTime : {
|
||||
future : 'dalam %s',
|
||||
past : '%s yang lalu',
|
||||
s : 'beberapa detik',
|
||||
ss : '%d detik',
|
||||
m : 'semenit',
|
||||
mm : '%d menit',
|
||||
h : 'sejam',
|
||||
hh : '%d jam',
|
||||
d : 'sehari',
|
||||
dd : '%d hari',
|
||||
M : 'sebulan',
|
||||
MM : '%d bulan',
|
||||
y : 'setahun',
|
||||
yy : '%d tahun'
|
||||
},
|
||||
week : {
|
||||
dow : 1, // Monday is the first day of the week.
|
||||
doy : 7 // The week that contains Jan 7th is the first week of the year.
|
||||
}
|
||||
});
|
||||
|
||||
moment.locale('id');
|
||||
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIEQTCCAymgAwIBAgIURsO6MescVe8spD7xpJWisWkfaDcwDQYJKoZIhvcNAQEL
|
||||
BQAwga4xCzAJBgNVBAYTAklEMRkwFwYDVQQIDBBLYWxpbWFudGFuIEJhcmF0MREw
|
||||
DwYDVQQHDAhNZW1wYXdhaDEYMBYGA1UECgwPM0ZPTklBIFNvZnR3YXJlMRgwFgYD
|
||||
VQQLDA9EaXZpc2kgV2ViIEFwcHMxGDAWBgNVBAMMDzNGT05JQSBTb2Z0d2FyZTEj
|
||||
MCEGCSqGSIb3DQEJARYUc2lhdXBoZW5nQDNmb25pYS5jb20wIBcNMTkwMTA5MDQw
|
||||
MjAwWhgPMjA1MDA3MDQwNDAyMDBaMIGuMQswCQYDVQQGEwJJRDEZMBcGA1UECAwQ
|
||||
S2FsaW1hbnRhbiBCYXJhdDERMA8GA1UEBwwITWVtcGF3YWgxGDAWBgNVBAoMDzNG
|
||||
T05JQSBTb2Z0d2FyZTEYMBYGA1UECwwPRGl2aXNpIFdlYiBBcHBzMRgwFgYDVQQD
|
||||
DA8zRk9OSUEgU29mdHdhcmUxIzAhBgkqhkiG9w0BCQEWFHNpYXVwaGVuZ0AzZm9u
|
||||
aWEuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnFAwxFRRM1u0
|
||||
Ke7pSlSLiHJsqku7Nwyg5mJ6BF8KnjAvYR/avTDynKe+S0gWZmG8HwMHGtxnesS9
|
||||
Rys7GYD3gQ3BnTfLjt5LKaUbrOKsG9zYS/HY2ruHe6/tLAU05Ud+a0T3ux/6GFRf
|
||||
SRbaDYjO66nLHNzKWDQRhKTplGMljiZARrLOedQ01Gf7i751l7kI9sF2/8jOPRzB
|
||||
9kNNzoh2rhcP3DYfjsdsWuOXX8zButggpqQHHCazyndGnG9Ci+9kU3/1C6lrW0A2
|
||||
ym0aX1dlwx9wdH0DYjGtpPK4LhusU/fiVnHaXbm/yVgYa3b1RpKk7B88U+bbLWBE
|
||||
uKrC4Nv4DQIDAQABo1MwUTAdBgNVHQ4EFgQUY+OVghhhK4z+Z90a72pO6ILXkxYw
|
||||
HwYDVR0jBBgwFoAUY+OVghhhK4z+Z90a72pO6ILXkxYwDwYDVR0TAQH/BAUwAwEB
|
||||
/zANBgkqhkiG9w0BAQsFAAOCAQEADgYf59EjwJwAq87KR3a/H81gK17fY9ABYDJb
|
||||
vm3oB1XV5/S9rvj6WiXdyOF5BPyPfmQQQDh1QJ+1gUC52IxffwNIpwcbVUZFwNCU
|
||||
75RqcSnOszDH1gmIehoDeku6iY343HfT8uH76n4xsBP2kYpoyaTVOignlnAO8rME
|
||||
lI1LAAsgG/HY2m3GLTso2KeLP9p5ePXV/5sbuTfB7GIOmQDmtLT1A6BpAFQBJuDV
|
||||
s52PIgdWMRt2qGl8tj1TLgirnRaIHNEzhxh0ZtfZ9Yn3FD4lt9PgsR4STqP5FmnR
|
||||
1ubs+XQhv/mCINj3Pb0RTS7dF4EAUmsFA/ofemEWQXFo8Q8x5A==
|
||||
-----END CERTIFICATE-----
|
||||
@@ -0,0 +1,28 @@
|
||||
-----BEGIN PRIVATE KEY-----
|
||||
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCcUDDEVFEzW7Qp
|
||||
7ulKVIuIcmyqS7s3DKDmYnoEXwqeMC9hH9q9MPKcp75LSBZmYbwfAwca3Gd6xL1H
|
||||
KzsZgPeBDcGdN8uO3ksppRus4qwb3NhL8djau4d7r+0sBTTlR35rRPe7H/oYVF9J
|
||||
FtoNiM7rqcsc3MpYNBGEpOmUYyWOJkBGss551DTUZ/uLvnWXuQj2wXb/yM49HMH2
|
||||
Q03OiHauFw/cNh+Ox2xa45dfzMG62CCmpAccJrPKd0acb0KL72RTf/ULqWtbQDbK
|
||||
bRpfV2XDH3B0fQNiMa2k8rguG6xT9+JWcdpdub/JWBhrdvVGkqTsHzxT5tstYES4
|
||||
qsLg2/gNAgMBAAECggEANzXrw6y0cZt2a0lDhUmPb0ZbM1tEaRFA05780gZvzaff
|
||||
VELYE/Lx/nsRL63qm4bx11JOdCJdOnO7FyQh38Q5p4+gT1Ohxnilu7PhrpLxj3XV
|
||||
wB1QJxINrJZbAy1jnYg/EsxtY97Li0Rh04MKybUEwSBb6Xnizny1o1BMYGkUnrw+
|
||||
rfDAGFmmPkWW9EsxRZxD+wXer3I8q2Z2La2aNopQMWg5JGV0J8DgTr782GpT/qSX
|
||||
jr7JN+b/9mUBlwRerSnldZSYDjp8JoySPybvrys5zN5z1Rhg/cYY+Mtbxlzq+HAU
|
||||
RnVOKRi13bjG4le1XGMDt4l5uGsa8dfg7ySHoN0X0QKBgQDJ/72KWRKcEW25IGOX
|
||||
PkpIWUf4dq7NzMsysNj+CfWM/OcIVrPZohS2WMeUTl5PARI6Va5k3IRD+0RVL/1H
|
||||
aFE3Pq6UhvtQMmvrIEU9H0lIUEtxi1niHzlagp56dTxXHOzMXKThfrLFPH+0Sbqb
|
||||
x60snZM2cNL4gNe+ykmGx0DRswKBgQDGGdexeEg5yRWKSKY7MbDTM9w2aiAa6yyx
|
||||
VQiMgPlKnmHbO7yo9UTH+QEez7RLQWW/hxRsVowCkpVe6P7E1+Ct/nSYAS3syZ+D
|
||||
DXRzlrpGaTnSXnOeS8iEsR9qbUN4i6KXCBJfkCo/RIhcC89JTcn/YO+4L43xTlJB
|
||||
/mv0J7WvPwKBgEN5BFPpCtlMzQzQb9O+P8vI3sx0wFEH/jvRbLn2k6njdDyJ0Yt5
|
||||
o1eBcjDsuH3FStRneFhCfH/Et3+JBx5KDw7YBjKgn+Oa5AdnARm4kJ7yCzFDLePl
|
||||
MCA2jz8yV9R1WfetXnnf+1D8s1+CXS3Z1dOYUusVZrMRPn+BTGwTtGgXAoGAbSj2
|
||||
WxutqPHuRanst7eU+XydPvrRwCORGBKESHAVbpHB2H2dYvjsMsk6XdEUR1e9CoIT
|
||||
tfMm6Y/+cTMwmCVg8F/DvbMArHcZx6xVXBBVitEXBJ35VePqlXvIlOuqfzVqnZDc
|
||||
Fv6o2P4Zqab0TS9pPKkcz0CdFbgTybu5nut2yR8CgYEAm8zi9zzISz4lHUE6hbq+
|
||||
VQNpENiZdcCy6AAt2pkSKELNIXz4Qtu4ntvBCjnWf5pYSN2NO2027G2RG3ViBPjB
|
||||
lfiyDswCefMzBATDkqGztBmyv6hHDgwWyjm2xKPlkhwUFpKg2Vd3f5Z9sNKlppN3
|
||||
x74KMqdBQGSiq9X8F74uGzA=
|
||||
-----END PRIVATE KEY-----
|
||||
@@ -0,0 +1,25 @@
|
||||
<?php
|
||||
// #########################################################
|
||||
// # PHP Signing #
|
||||
// #########################################################
|
||||
// Sample key. Replace with one used for CSR generation
|
||||
|
||||
$KEY = 'key.pem';
|
||||
|
||||
$req = $_REQUEST['req'];
|
||||
|
||||
$privateKey = openssl_get_privatekey(file_get_contents($KEY));
|
||||
|
||||
$signature = null;
|
||||
openssl_sign($req, $signature, $privateKey);
|
||||
|
||||
if ($signature) {
|
||||
header("Content-type: text/plain");
|
||||
echo base64_encode($signature);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
echo '<h1>Error signing message</h1>';
|
||||
exit(1);
|
||||
|
||||
?>
|
||||
@@ -0,0 +1,54 @@
|
||||
<!------------------------------------------------------------------
|
||||
|
||||
Module : /assets/templates/404.php
|
||||
Desc. : HTML5 Page - Halaman Template Error 404
|
||||
Created By : Siau Pheng (siaupheng@3fonia.com).
|
||||
Created Date : February 17th, 2020.
|
||||
Last Modified : January 11th, 2023.
|
||||
|
||||
(c) 2020 - 2023, 3FONIA Software; WWW.3FONIA.COM.
|
||||
|
||||
------------------------------------------------------------------->
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>[_APP_NAME_VER_] - Error 404</title>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
<meta name="generator" content="PhpED + FW9 @ 3FONIA Software"/>
|
||||
<meta name="author" content="Siau Pheng <siaupheng[at]3fonia.com>"/>
|
||||
<meta name="description" content="[_APP_NAME_VER_], [_APP_NAMES_]" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
|
||||
<link rel="icon" href="[_WEB_PATH_]assets/images/logo200.png" type="image/png" />
|
||||
<link rel="shortcut icon" href="[_WEB_PATH_]assets/images/logo200.png" type="image/png" />
|
||||
</head>
|
||||
<body class="min-vh-100 d-flex flex-row align-items-center">
|
||||
<div class="container">
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-xl-4 col-md-8">
|
||||
<div class="card-group">
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<div class="mb-2">
|
||||
<img class="mx-auto d-block" src="[_WEB_PATH_]assets/images/logo300.webp" title="[_REG_NAME_UP_]">
|
||||
<div class="text-center pt-2 pb-2"><span class="reg_app1">[_APP_NAME_]</span><br><span class="reg_app2">Ver. [_APP_VER_]</span></div>
|
||||
</div>
|
||||
<div class="mb-2 mx-auto d-block text-center">
|
||||
<div class="fs-4 text-danger">4.0.4</div>
|
||||
<div class="fs-5 text-info">Modul atau bagian aplikasi yang diakses tidak ditemukan !</div>
|
||||
</div>
|
||||
<div class="text-center pt-2 pb-2 d-none" id="divLoginMsg"> </div>
|
||||
<div class="pt-4">
|
||||
<div class="text-center">® [_CREATOR_YEAR_]. [_REG_NAME_]</div>
|
||||
<div class="text-center">All Rights Reserved.</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,107 @@
|
||||
<!------------------------------------------------------------------
|
||||
|
||||
Module : /assets/templates/index.php
|
||||
Desc. : HTML Page - Halaman Template / Themes
|
||||
Created By : Siau Pheng (siaupheng@3fonia.com).
|
||||
Created Date : October 10th, 2008.
|
||||
Last Modified : April 29th, 2022.
|
||||
|
||||
(c) 2008 - 2022, 3FONIA Software; WWW.3FONIA.COM.
|
||||
|
||||
------------------------------------------------------------------->
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>[_APP_NAME_VER_]</title>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
<meta name="generator" content="PhpED + FW9 @ 3FONIA Software"/>
|
||||
<meta name="author" content="Siau Pheng <siaupheng[at]3fonia.com>"/>
|
||||
<meta name="description" content="[_APP_NAME_VER_], [_APP_NAMES_]" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
|
||||
<link rel="icon" href="[_WEB_PATH_]assets/images/logo200.png" type="image/png" />
|
||||
<link rel="shortcut icon" href="[_WEB_PATH_]assets/images/logo200.png" type="image/png" />
|
||||
</head>
|
||||
<body>
|
||||
<div class="modal fade" id="sidebarMain" tabindex="-1" aria-labelledby="sidebarLabel" aria-hidden="true">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<img src="[_WEB_PATH_]assets/images/logo-apps.png" title="[_APP_NAME_]">
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"><i class="fs-1 bi-x"></i></button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<nav class="sidebar card py-2 mb-4"><ul class="nav flex-column">[_NAVI_SIDEBAR_]</ul></nav>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="wrapper d-flex flex-column min-vh-100">
|
||||
<header class="fixed-top navbar-custom">
|
||||
<nav class="navbar navbar-expand-lg">
|
||||
<div class="container-fluid">
|
||||
<div class="navbar-toggler btn p-0 d-lg-none"><a href="#" data-bs-toggle="modal" data-bs-target="#sidebarMain"><i class="icon-md icon-3xl bi-list"></i></a></div>
|
||||
<div class="collapse navbar-collapse">
|
||||
<ul class="navbar-nav navbar-nav-scroll me-auto">[_NAVI_HEADER_]</ul>
|
||||
</div>
|
||||
<ul class="nav flex-nowrap align-items-center ms-sm-3 list-unstyled">
|
||||
<li class="nav-item ms-2 dropdown">
|
||||
<a class="nav-link btn p-0" id="profileDD" role="button" data-bs-display="static" data-bs-toggle="dropdown" aria-expanded="false"><span class="badge-profile"></span><img class="icon-md rounded-5" src="[_WEB_PATH_]assets/images/[_USER_IMG_]" title="[_USER_NAME_]"></a>
|
||||
<ul class="dropdown-menu dropdown-menu-end dropdown-profile pt-3 small me-md-n3" aria-labelledby="profileDD">
|
||||
<li class="dropdown-item-text">
|
||||
<div class="d-flex text-black">
|
||||
<div class="flex-shrink-0"><img src="[_WEB_PATH_]assets/images/[_USER_IMG_]" class="icon-lg"></div>
|
||||
<div class="flex-grow-1 ms-3">
|
||||
<div>[_USER_USER_]</div>
|
||||
<div class="fs-6">[_USER_NAME_]</div>
|
||||
<div class="small">[_USER_POSISI_]</div>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
[_MENU_MODUL_]
|
||||
<li class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item slink" id="HomeLink"><i class="bi-house me-2"></i>Beranda</a></li>
|
||||
<li><a class="dropdown-item"><i class="bi-person-circle me-2"></i>Profil</a></li>
|
||||
<!--<li><a class="dropdown-item"><i class="bi-gear me-2"></i>Settings</a></li>-->
|
||||
<li><a class="dropdown-item mlink" id="SYSCLink"><i class="bi-lock me-2"></i>Ubah Password</a></li>
|
||||
<li class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item text-danger slink" id="ExitLink"><i class="bi-arrow-right me-2"></i>Keluar</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</nav>
|
||||
</header>
|
||||
|
||||
<div class="body flex-grow-1">
|
||||
<div class="container-fluid mt-2 px-0 py-2">
|
||||
<div aria-live="polite" aria-atomic="true" class="position-relative">
|
||||
<div class="toast-container position-absolute top-0 end-0 p-3" id="div-toast"> </div>
|
||||
</div>
|
||||
<div id="pageToolbarTop" class="container-fluid"> </div>
|
||||
<div id="pageContent" class="container-fluid"> </div>
|
||||
<div id="pageToolbarBot" class="container-fluid"> </div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<footer class="footer">
|
||||
<div><a href="[_REG_WEBSITE_]">® [_REG_YEAR_]; [_REG_NAME_]</a> || <a href="[_CREATOR_WEBSITE_]">© [_CREATOR_YEAR_]; [_CREATOR_NAME_]</a></div>
|
||||
<div class="ms-auto d-none d-md-block">
|
||||
<div class="dropdown dropup">
|
||||
<a class="dropdown-toggle p-2" id="divQZStatus" role="button" data-bs-toggle="dropdown" aria-expanded="false"></a>
|
||||
<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="divQZStatus">
|
||||
<li><a class="dropdown-item" href="#" onclick="startConnection();"><i class="text-success bi-printer me-2"></i>Hubungkan</a></li>
|
||||
<li><a class="dropdown-item" href="#" onclick="endConnection();"><i class="text-danger bi-printer-fill me-2"></i>Putuskan</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
<div id="dataPrint" class="d-none d-print-block"> </div>
|
||||
<div id="preloader"><div id="loader"></div></div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,68 @@
|
||||
<!------------------------------------------------------------------
|
||||
|
||||
Module : /assets/templates/login.php
|
||||
Desc. : HTML5 Page - Halaman Template Login
|
||||
Created By : Siau Pheng (siaupheng@3fonia.com).
|
||||
Created Date : December 21th, 2009.
|
||||
Last Modified : January 11th, 2023.
|
||||
|
||||
(c) 2009 - 2023, 3FONIA Software; WWW.3FONIA.COM.
|
||||
|
||||
------------------------------------------------------------------->
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>[_APP_NAME_VER_]</title>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
<meta name="generator" content="PhpED + FW9 @ 3FONIA Software"/>
|
||||
<meta name="author" content="Siau Pheng <siaupheng[at]3fonia.com>"/>
|
||||
<meta name="description" content="[_APP_NAME_VER_], [_APP_NAMES_]" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
|
||||
<link rel="icon" href="[_WEB_PATH_]assets/images/logo200.png" type="image/png" />
|
||||
<link rel="shortcut icon" href="[_WEB_PATH_]assets/images/logo200.png" type="image/png" />
|
||||
</head>
|
||||
<body class="min-vh-100 d-flex flex-row align-items-center dark:bg-transparent">
|
||||
<div class="container">
|
||||
<div aria-live="polite" aria-atomic="true" class="position-relative">
|
||||
<div class="toast-container position-absolute top-0 start-50 translate-middle-x" id="div-toast"> </div>
|
||||
</div>
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-xl-4 col-lg-5 col-md-6 col-10">
|
||||
<div class="card-group d-block d-md-flex row">
|
||||
<div class="card col-md-6 p-3 mb-0">
|
||||
<div class="card-body">
|
||||
<div class="mb-2">
|
||||
<img class="mx-auto d-block" src="[_WEB_PATH_]assets/images/logo200.png" title="[_REG_NAME_UP_]">
|
||||
<div class="text-center pt-2 pb-2">[_APP_NAME_] Ver. [_APP_VER_]<br>Register ID : [_REG_ID_]</div>
|
||||
</div>
|
||||
<div class="input-group mb-2">
|
||||
<span class="input-group-text">
|
||||
<i class="bi-person-circle"></i>
|
||||
</span>
|
||||
<input class="form-control" id="Username" type="text" placeholder="ID Pengguna">
|
||||
</div>
|
||||
<div class="input-group mb-3">
|
||||
<span class="input-group-text">
|
||||
<i class="bi-unlock2"></i>
|
||||
</span>
|
||||
<input class="form-control" id="Password" type="password" placeholder="Kata Sandi">
|
||||
</div>
|
||||
<div class="input-group d-grid gap-2">
|
||||
<button id="butLogin" class="btn btn-primary" type="button">Login</button>
|
||||
</div>
|
||||
<div class="text-center d-none" id="divLoginMsg"> </div>
|
||||
<div class="pt-4">
|
||||
<div class="text-center">® [_REG_YEAR_]; [_REG_NAME_]</div>
|
||||
<div class="text-center">© [_CREATOR_YEAR_]; [_CREATOR_NAME_]</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,80 @@
|
||||
<?php
|
||||
|
||||
/*******************************************************************
|
||||
|
||||
Module : /auth.php
|
||||
Desc. : PHP Page - Halaman Identifikasi Akses
|
||||
Created By : Siau Pheng (siaupheng@3fonia.com).
|
||||
Created Date : November 20th, 2016.
|
||||
Last Modified : March 26th, 2023.
|
||||
|
||||
(c) 2016 - 2023, 3FONIA Software; WWW.3FONIA.COM.
|
||||
|
||||
*******************************************************************/
|
||||
|
||||
require_once(__DIR__."/../../vendor/autoload.php");
|
||||
|
||||
if (!isset($_SESSION['__WEB_APP'])) {
|
||||
require_once(__DIR__."/apps/cfg/app.php");
|
||||
}
|
||||
|
||||
use siaupheng\fonia3\DB\MySQL;
|
||||
use siaupheng\fonia3\Web\Auth;
|
||||
use siaupheng\fonia3\Web\Param;
|
||||
use siaupheng\fonia3\Web\Menu;
|
||||
|
||||
$db = $db ?? new MySQL();
|
||||
$auth = new Auth($db);
|
||||
$ajson = [];
|
||||
$mode = Param::Get("mode", "");
|
||||
|
||||
if ($mode == "auth") {
|
||||
$data = Param::Get("data", "");
|
||||
$ajson = ['status' => 0, 'pesan' => ""];
|
||||
|
||||
if ($data == "super-check") {
|
||||
$bsuper = (Param::Get("SUPER","true") == "true") ? true : false;
|
||||
$buover = (Param::Get("UOVER","false") == "true") ? true : false;
|
||||
if (!$auth->user_check_level(Param::Get("UID"), $_SESSION['__WEB_APP']['AUTH_LEVEL']) && $bsuper == true) {
|
||||
$ajson['status'] = 0;
|
||||
$ajson['pesan'] = "Silakan hubungi Supervisor / Administrator Anda!";
|
||||
} else {
|
||||
if (!$auth->user_check(Param::Get("UID"), Param::Get("PWD"))) {
|
||||
$ajson['status'] = 0;
|
||||
$ajson['pesan'] = "User ID atau Password Anda Salah!<br>Anda tidak diijinkan melanjutkan proses!";
|
||||
} else {
|
||||
$ajson['status'] = 1;
|
||||
if ($buover == true && $bsuper == false && Param::Get("UID") <> $_SESSION['__WEB_USER']['Username']) {
|
||||
$new_sess = $auth->user_data(Param::Get("UID"));
|
||||
foreach ($new_sess as $_key => $_val) {
|
||||
if ($_SESSION['__WEB_USER'][$_key]) $_SESSION['__WEB_USER'][$_key] = $_val;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} elseif ($data == "super-request") {
|
||||
$db->Query("DELETE FROM app_auth WHERE UserID='".user_id()."' AND Kode='".Param::Get("KODE")."' AND SID='".Param::Get("REQ_SID")."' AND REQ='".Param::Get("REQ")."' AND Auth=0");
|
||||
$db->Query("INSERT INTO app_auth SET UserID='".user_id()."',Kode='".Param::Get("KODE")."',SID='".Param::Get("REQ_SID")."',REQ='".Param::Get("REQ")."',Catatan='".Param::Get("MSG")."',Tanggal=NOW()");
|
||||
|
||||
} elseif ($data == "super-cancel") {
|
||||
$db->Query("DELETE FROM app_auth WHERE UserID='".user_id()."' AND Kode='".Param::Get("KODE")."' AND SID='".Param::Get("REQ_SID")."' AND REQ='".Param::Get("REQ")."'");
|
||||
|
||||
} elseif ($data == "request-check") {
|
||||
$db->Query("SELECT Auth FROM app_auth WHERE UserID='".user_id()."' AND Kode='".Param::Get("KODE")."' AND SID='".Param::Get("REQ_SID")."' AND REQ='".Param::Get("REQ")."'");
|
||||
if ($db->Next() && $db->Row("Auth",0) == 1) $ajson['status'] = 1;
|
||||
}
|
||||
|
||||
} else {
|
||||
$page = Param::Get("p", "");
|
||||
$query = Param::Get("q", "");
|
||||
$ajson['login'] = false;
|
||||
|
||||
if (user_logged() && $page<>"") {
|
||||
$ajson = Menu::MenuJSON($db, $page, $query);
|
||||
}
|
||||
$auth->token_update();
|
||||
}
|
||||
|
||||
send_json($ajson);
|
||||
?>
|
||||
@@ -0,0 +1,15 @@
|
||||
[css]
|
||||
login_stamp = "0"
|
||||
login_file =
|
||||
index_stamp = "22790960509"
|
||||
index_file = "91828de68cc2d8c549ba0a5cb72bb886.css"
|
||||
display_stamp = "0"
|
||||
display_file =
|
||||
|
||||
[js]
|
||||
login_stamp = "0"
|
||||
login_file =
|
||||
index_stamp = "48658709282"
|
||||
index_file = "6b29fb63d529966b303feb3b43b6bb81.js"
|
||||
display_stamp = "0"
|
||||
display_file =
|
||||
@@ -0,0 +1,73 @@
|
||||
<?php
|
||||
|
||||
/*******************************************************************
|
||||
|
||||
App. Name : INVENTORY AND SALES SYSTEMS
|
||||
Module : /apps/cfg/assets.php
|
||||
Desc. : Konfigurasi Assets Aplikasi [css / js]
|
||||
Created By : Siau Pheng (siaupheng@3fonia.com).
|
||||
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"
|
||||
];
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -0,0 +1,127 @@
|
||||
/*******************************************************************
|
||||
|
||||
Module : /assets/js/display.js
|
||||
Desc. : JS - Halaman Utama Display
|
||||
Created By : Siau Pheng (siaupheng@3fonia.com).
|
||||
Created Date : May 24th, 2010.
|
||||
Last Modified : January 2nd, 2026.
|
||||
|
||||
(c) 2010 - 2026, 3FONIA Software; WWW.3FONIA.COM.
|
||||
|
||||
*******************************************************************/
|
||||
|
||||
$(document).ready(function(){
|
||||
jQuery('#preloader').remove();
|
||||
DispJS.loading();
|
||||
});
|
||||
|
||||
var DispJS = {
|
||||
PHP: FoniaJS.WEB_PATH+'apps/php/display.php',
|
||||
DEF_PROMO_DUR: 10,
|
||||
DEF_THANK_TIME: 1,
|
||||
DEF_IDLE_TIME: 5,
|
||||
IDLE_TIME: 0,
|
||||
ISSHOW_POS: false,
|
||||
ISSHOW_THANK: false,
|
||||
|
||||
loading: function(){
|
||||
new Request.JSON({
|
||||
url: this.PHP,
|
||||
sendParam: ['data=default'],
|
||||
onSuccess: function(ares){
|
||||
$('#pageContent').html(ares.html);
|
||||
this.data_query('config');
|
||||
this.data_query('info-promo');
|
||||
this.data_query('info-iklan');
|
||||
this.hide_pos();
|
||||
this.hide_thank();
|
||||
setInterval(function(){
|
||||
if (DispJS.IDLE_TIME >= DispJS.DEF_THANK_TIME || DispJS.IDLE_TIME >= DispJS.DEF_IDLE_TIME) {
|
||||
if (DispJS.ISSHOW_POS) { DispJS.hide_pos(); DispJS.ISSHOW_POS = false }
|
||||
if (DispJS.IDLE_TIME < DispJS.DEF_IDLE_TIME) {
|
||||
if (DispJS.ISSHOW_THANK) { DispJS.show_thank(); }
|
||||
} else {
|
||||
if (DispJS.ISSHOW_THANK) { DispJS.data_query('close-thank'); }
|
||||
}
|
||||
DispJS.data_query('count-delay');
|
||||
} else {
|
||||
if (DispJS.ISSHOW_THANK) { DispJS.data_query('close-thank'); }
|
||||
if (!DispJS.ISSHOW_POS) { DispJS.show_pos(); DispJS.ISSHOW_POS = true }
|
||||
if ($('#divShop').length) DispJS.data_query('info-shop');
|
||||
}
|
||||
}, 1000);
|
||||
}.bind(this)
|
||||
}).send();
|
||||
},
|
||||
|
||||
hide_pos: function(){
|
||||
$('#divBanner').removeClass('d-none');
|
||||
$('#divShop').addClass('d-none');
|
||||
},
|
||||
|
||||
show_pos: function(){
|
||||
$('#divBanner').addClass('d-none');
|
||||
$('#divShop').removeClass('d-none');
|
||||
this.data_query('shop');
|
||||
},
|
||||
|
||||
hide_thank: function(){
|
||||
$('#divBlur').addClass('d-none');
|
||||
$('#divThank').addClass('d-none');
|
||||
},
|
||||
|
||||
show_thank: function(){
|
||||
$('#divBlur').removeClass('d-none');
|
||||
$('#divThank').removeClass('d-none');
|
||||
this.data_query('thank');
|
||||
},
|
||||
|
||||
data_query: function(tipe){
|
||||
if (tipe=='config'){
|
||||
$.post(this.PHP, {data:'config'}, function(ajson){
|
||||
if (ajson.PROMO_DURASI) DispJS.DEF_PROMO_DUR = ajson.PROMO_DURASI;
|
||||
if (ajson.PROMO_IDLE) DispJS.DEF_IDLE_TIME = ajson.PROMO_IDLE;
|
||||
if (ajson.BANNER_TEXT) $('#divBanner').html(ajson.BANNER_TEXT);
|
||||
}, 'json');
|
||||
} else if (tipe=='info-iklan'){
|
||||
$.post(this.PHP, {data:'info-iklan'}, function(data){
|
||||
$('#divIklan').html(data);
|
||||
const car_iklan = new bootstrap.Carousel('#divIklan', {
|
||||
interval: DispJS.DEF_PROMO_DUR
|
||||
});
|
||||
});
|
||||
} else if (tipe=='info-promo'){
|
||||
$.post(this.PHP, {data:'info-promo'}, function(data){
|
||||
$('#divPromo').html(data);
|
||||
const car_iklan = new bootstrap.Carousel('#divPromo', {
|
||||
interval: DispJS.DEF_PROMO_DUR
|
||||
});
|
||||
});
|
||||
} else if (tipe=='count-delay'){
|
||||
$.post(this.PHP, {data:'count-delay'}, function(ajson){
|
||||
if (parseInt(ajson.total)==0) this.IDLE_TIME++; else this.IDLE_TIME = 0;
|
||||
this.ISSHOW_THANK = (parseInt(ajson.thank)==1) ? true : false;
|
||||
}.bind(this), 'json');
|
||||
} else if (tipe=='shop'){
|
||||
$.post(this.PHP, {data:'shop'}, function(data){
|
||||
$('#divShop').html(data);
|
||||
});
|
||||
} else if (tipe=='thank'){
|
||||
$.post(this.PHP, {data:'thank'}, function(data){
|
||||
$('#divThank').html(data);
|
||||
});
|
||||
} else if (tipe=='close-thank'){
|
||||
$.post(this.PHP, {data:'close-thank'}, function(){
|
||||
this.ISSHOW_THANK = false;
|
||||
this.hide_thank();
|
||||
}.bind(this));
|
||||
} else if (tipe=='info-shop'){
|
||||
$.post(this.PHP, {data:'info-shop'}, function(ajson){
|
||||
$('#Total_Harga').html(ajson.Total_Harga);
|
||||
$('#Info_Qty').html(ajson.Info_Qty);
|
||||
$('#Info_Barang').html(ajson.Info_Barang);
|
||||
if (parseFloat($('#Total_Harga').html())==0) this.IDLE_TIME++; else this.IDLE_TIME = 0;
|
||||
}.bind(this), 'json');
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,156 @@
|
||||
<?php
|
||||
|
||||
/*******************************************************************
|
||||
|
||||
Module : /apps/php/display.php
|
||||
Desc. : PHP - Halaman Utama Display
|
||||
Created By : Siau Pheng (siaupheng@3fonia.com).
|
||||
Created Date : May 24th, 2010.
|
||||
Last Modified : January 2nd, 2026.
|
||||
|
||||
(c) 2010 - 2026, 3FONIA Software; WWW.3FONIA.COM.
|
||||
|
||||
*******************************************************************/
|
||||
|
||||
require_once(__DIR__."/../../../../../vendor/autoload.php");
|
||||
require_once(__DIR__."/../../../apps/cfg/mysql.php");
|
||||
|
||||
use siaupheng\fonia3\DB\MySQL;
|
||||
use siaupheng\fonia3\Web\Param;
|
||||
|
||||
$db = $db ?? new MySQL();
|
||||
$ajson = [];
|
||||
$data = Param::Get("data");
|
||||
$id_reg = $_SESSION['__WEB_APP']['APP_DISPLAY'];
|
||||
|
||||
if ( in_array($data, ["info-shop","count-delay","close-thank","thank"]) ) {
|
||||
$app_disp = [];
|
||||
$db->Query("SELECT * FROM disp_login WHERE IP='".$_SERVER['REMOTE_ADDR']."' AND CabID='".$_SESSION['__APP_INV']['CABANGID']."' ORDER BY Date DESC LIMIT 1");
|
||||
if ($db->Next()) $app_disp = $db->AllRow();
|
||||
}
|
||||
|
||||
if ( $data == "config" ) {
|
||||
$ainfo = [];
|
||||
$db->Query("SELECT * FROM disp_config WHERE REG_ID='".$id_reg."' LIMIT 1");
|
||||
if ($db->Next()) $ainfo = $db->AllRow();
|
||||
$ajson['BANNER_TEXT'] = '<div class="marquee-content" style="color:'.$ainfo['Warna'].';font-size:'.$ainfo['Font'].'pt;">'.$ainfo['Text_Run'].'</div>';
|
||||
$ajson['PROMO_IDLE'] = $ainfo['Promo_Idle'];
|
||||
$ajson['PROMO_DURASI'] = (int)$ainfo['Promo_Durasi'] * 1000;
|
||||
|
||||
} else if ( $data == "info-iklan" ) {
|
||||
$info_iklan = '<div class="carousel-inner">'; $iklan = 0;
|
||||
$db->Query("SELECT * FROM disp_promo WHERE Aktif=1 AND Tipe=2 AND CabID IN (0,".$_SESSION['__APP_INV']['CABANGID'].") AND Image IS NOT NULL ORDER BY Tanggal");
|
||||
while ($db->Next()){
|
||||
$info_iklan .= '<div class="carousel-item'.($iklan==0?' active':'').'"><img src="data:'.$db->Row("Mime").';base64,'.base64_encode($db->Row("Image")).'" class="m-auto d-block"></div>';
|
||||
$iklan++;
|
||||
}
|
||||
if ($iklan == 0) $info_iklan .= '<div class="carousel-item active"><img src="'.$_SESSION['__WEB_APP']['WEB_PATH'].'/assets/images/logo600.png" class="m-auto d-block"></div>';
|
||||
$info_iklan .= '</div>';
|
||||
echo $info_iklan;
|
||||
|
||||
} else if ( $data == "info-promo" ) {
|
||||
$info_promo = '<div class="carousel-inner">'; $promo = 0;
|
||||
$db->Query("SELECT * FROM disp_promo WHERE Aktif=1 AND Tipe=1 AND CabID IN (0,".$_SESSION['__APP_INV']['CABANGID'].") ORDER BY Tanggal, PromoID");
|
||||
while ($db->Next()){
|
||||
$_text = str_replace(["[br]","[i]","[/i]","[b]","[/b]"], ["<br/>","<i>","</i>","<b>","</b>"], $db->Row("Info"));
|
||||
$_text = '<span style="color:'.$db->Row("Warna").';font-size:'.$db->Row("Font").'pt;">' . $_text . '</span>';
|
||||
if ($db->Row("Image","")<>"") {
|
||||
$_text = '<div class="row h-100 align-items-center"><div class="col-2 text-center"><img src="data:'.$db->Row("Mime").';base64,'.base64_encode($db->Row("Image")).'" class="pt-2"></div><div class="col-10">' . $_text ."</div></div>";
|
||||
}
|
||||
$info_promo .= '<div class="carousel-item'.($promo==0?' active':'').'">'.$_text."</div>";
|
||||
$promo++;
|
||||
}
|
||||
echo $info_promo."</div>";
|
||||
|
||||
} else if ( $data == "count-delay" ) {
|
||||
$ajson = ['total' => 0, 'thank' => 0];
|
||||
$db->Query("SELECT SUM(-D.Qty*(D.Harga_Jual-D.Disk_Rupiah)) Total FROM tmp_inv_detail D WHERE D.No_Ref='".$app_disp['No_Pos']."' AND D.Unix='".$app_disp['Unix']."'");
|
||||
if ($db->Next()) $ajson['total'] = $db->RowFloat("Total", 0);
|
||||
$db->Query("SELECT IF(No_Cetak='',0,1) Ada FROM disp_login WHERE UserID='".$app_disp['UserID']."' AND Unix='".$app_disp['Unix']."'");
|
||||
if ($db->Next()) $ajson['thank'] = $db->RowFloat("Ada", 0);
|
||||
|
||||
} else if ( $data == "shop" ) {
|
||||
echo '
|
||||
<div class="row g-0 my-2">
|
||||
<div class="col-7 pe-3 text-end" id="Info_Barang">
|
||||
</div>
|
||||
<div class="col-5 pe-2">
|
||||
<div class="border border-success border-opacity-75 rounded rounded-4 bg-warning bg-gradient" style="--bs-bg-opacity:.75;">
|
||||
<div class="row pe-2">
|
||||
<div class="col-4 text-end fs-3" id="Info_Qty"></div>
|
||||
<div class="col-8 text-end display-1 fw-light border-light border-start" id="Total_Harga">0</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>';
|
||||
|
||||
} else if ( $data == "info-shop" ) {
|
||||
$ashop = ['Total'=>0, 'Item'=>0, 'Qty'=>0];
|
||||
$db->Query("SELECT SUM(-D.Qty*(D.Harga_Jual-D.Disk_Rupiah)) Total,COUNT(*) Item, SUM(-D.Qty) Qty FROM tmp_inv_detail D WHERE D.No_Ref='".$app_disp['No_Pos']."' AND D.Unix='".$app_disp['Unix']."'");
|
||||
if ($db->Next()) $ashop = $db->AllRow();
|
||||
|
||||
$info_barang = '<img src="'.$aapp['WEB_PATH'].'assets/images/logo60.png">';
|
||||
if ($ashop['Item'] > 0) {
|
||||
$db->Query("SELECT * FROM (SELECT -D.Qty Qty2,D.Harga_Jual,P.Nama_Lengkap FROM tmp_inv_detail D LEFT JOIN vi_inv_produk P ON (D.InvID=P.InvID AND D.SatuanID=P.SatuanID) WHERE D.No_Ref='".$app_disp['No_Pos']."' AND D.Unix='".$app_disp['Unix']."' AND D.Promo<2 ORDER BY D.ID DESC LIMIT 1) A");
|
||||
if ($db->Next()) {
|
||||
$info_barang = '<span class="display-4 fw-light">'.$db->Row("Nama_Lengkap").'</span><br><span class="fs-4">Qty : '.rupiah($db->Row("Qty2")).' / Rp. '.rupiah($db->Row("Harga_Jual")).'</span>';
|
||||
}
|
||||
}
|
||||
|
||||
$ajson['Info_Barang'] = $info_barang;
|
||||
$ajson['Total_Harga'] = rupiah($ashop['Total']);
|
||||
$ajson['Info_Qty'] = rupiah($ashop['Item'])." Items<br>".rupiah($ashop['Qty'])." Qty";
|
||||
|
||||
} else if ( $data == "close-thank" ) {
|
||||
$db->Query("UPDATE disp_login SET No_Cetak='' WHERE UserID='".$app_disp['UserID']."' AND Unix='".$app_disp['Unix']."'");
|
||||
|
||||
} else if ( $data == "thank" ) {
|
||||
$db->Query("SELECT J.*,(J.Total_Bayar-J.Total_Jual+J.Total_Diskon+J.Total_Potong) Total_Sisa,UCASE(LEFT(B.Nama_Kartu,23)) Kode_Kartu2,UCASE(J.Nama_Kartu) Nama_Kartu2,RIGHT(J.No_Kartu,4) No_Kartu2 FROM inv_jual J LEFT JOIN para_rek_pos B ON (J.KartuID=B.KartuID) WHERE J.No_Jual='".$app_disp['No_Cetak']."'");
|
||||
if ($db->Next()) $anota = $db->AllRow();
|
||||
|
||||
$nhemat = $anota['Total_Diskon'] + $anota['Total_Potong'];
|
||||
echo '
|
||||
<div class="row">
|
||||
<div class="col-6 text-center">
|
||||
<img class="img-fluid mt-5" src="'.$aapp['WEB_PATH'].'assets/images/logo300.png" alt="'.$aapp['REG_NAME'].'">
|
||||
</div>
|
||||
<div class="col-6 fs-2 text-center">
|
||||
';
|
||||
|
||||
echo 'Jumlah Belanja Anda Rp. '.rupiah($anota['Total_Jual']-$anota['Total_Diskon']).'<br>';
|
||||
if ($anota['Total_Diskon']>0) echo '<i>Anda Mendapatkan Diskon Rp. '.rupiah($anota['Total_Diskon']).'</i><br>';
|
||||
if ($anota['Total_Potong']>0) echo '<i>Anda Mendapatkan Potongan Promo Rp. '.rupiah($anota['Total_Potong']).'</i><br>';
|
||||
|
||||
echo 'Jumlah Pembayaran Anda Rp. '.rupiah($anota['Total_Bayar']).'<br><br>';
|
||||
|
||||
if ($anota['KartuID']==0) {
|
||||
echo '<span style="font-size:23pt;color:red;">Sisa Pembayaran Rp. '.rupiah($anota['Total_Sisa']).'</span><br>';
|
||||
} else {
|
||||
echo '<b>Anda Melakukan Pembayaran Dengan : <br>'.$anota['Kode_Kartu2']." - ".$anota['No_Kartu2'].'</b><br>';
|
||||
}
|
||||
|
||||
if ($nhemat>0) echo '<span style="font-size:18pt;color:orange;"><i>Anda Mendapatkan Penghematan Sebesar Rp. '.rupiah($nhemat).'</span></i><br>';
|
||||
|
||||
echo '<br>Terima Kasih Telah Berbelanja di Toko Kami<br>Selamat Berbelanja Kembali :)';
|
||||
echo '</div></div>';
|
||||
|
||||
} else if ( $data == "default" ) {
|
||||
$ajson['html'] = '
|
||||
<div class="disp-atas overflow-hidden fixed-top">
|
||||
<div class="marquee-container overflow-hidden bg-light shadow-sm" id="divBanner"></div>
|
||||
<div id="divShop"> </div>
|
||||
</div>
|
||||
|
||||
<div class="disp-tengah overflow-hidden">
|
||||
<div id="divBlur" class="bg-white bg-opacity-75 d-none"> </div>
|
||||
<div id="divIklan" class="carousel slide" data-bs-ride="carousel"> </div>
|
||||
<div id="divThank"> </div>
|
||||
</div>
|
||||
|
||||
<div class="disp-bawah overflow-hidden fixed-bottom border-top border-warning">
|
||||
<div id="divPromo" class="carousel slide carousel-fade" data-bs-ride="carousel"> </div>
|
||||
</div>';
|
||||
}
|
||||
|
||||
send_json($ajson);
|
||||
?>
|
||||
@@ -0,0 +1,78 @@
|
||||
/*******************************************************************
|
||||
|
||||
Module : /assets/css/styles.css
|
||||
Desc. : CSS Fonts for Display
|
||||
Created By : Siau Pheng (siaupheng@3fonia.com).
|
||||
Created Date : December 20th, 2007.
|
||||
Last Modified : January 2nd, 2026.
|
||||
|
||||
(c) 2007 - 2026, 3FONIA Software; WWW.3FONIA.COM.
|
||||
|
||||
*******************************************************************/
|
||||
|
||||
.disp-atas {
|
||||
height: 120px;
|
||||
}
|
||||
|
||||
.disp-tengah {
|
||||
padding-top: 120px;
|
||||
height: 100%;
|
||||
max-height: calc(100vh - 180px);
|
||||
}
|
||||
|
||||
.disp-bawah {
|
||||
height: 180px;
|
||||
}
|
||||
|
||||
/****** TOP BANNER ******/
|
||||
|
||||
.marquee-container {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.marquee-content {
|
||||
white-space: nowrap;
|
||||
animation: marquee 20s linear infinite;
|
||||
}
|
||||
|
||||
@keyframes marquee {
|
||||
0% { transform: translateX(100%); }
|
||||
100% { transform: translateX(-100%); }
|
||||
}
|
||||
|
||||
.marquee-container:hover .marquee-content {
|
||||
animation-play-state: paused;
|
||||
}
|
||||
|
||||
/****** MIDDLE IKLAN ******/
|
||||
|
||||
#divIklan {
|
||||
z-index: 20;
|
||||
}
|
||||
#divIklan img {
|
||||
max-height: calc(100vh - 300px);
|
||||
}
|
||||
|
||||
/****** MIDDLE THANK YOU ******/
|
||||
|
||||
#divThank {
|
||||
width: 100%;
|
||||
height: calc(100vh - 300px);
|
||||
position: absolute;
|
||||
top: 120px;
|
||||
z-index: 50;
|
||||
}
|
||||
#divBlur {
|
||||
width: 100%;
|
||||
height: calc(100vh - 300px);
|
||||
position: absolute;
|
||||
top: 120px;
|
||||
z-index: 30;
|
||||
}
|
||||
|
||||
/****** BOTTOM PROMO ******/
|
||||
|
||||
#divPromo img {
|
||||
max-height: 160px;
|
||||
}
|
||||
|
After Width: | Height: | Size: 41 KiB |
|
After Width: | Height: | Size: 76 KiB |
|
After Width: | Height: | Size: 81 KiB |
|
After Width: | Height: | Size: 213 KiB |
|
After Width: | Height: | Size: 3.3 KiB |
@@ -0,0 +1,32 @@
|
||||
/*******************************************************************
|
||||
|
||||
Module : /assets/locale/fonia.id.js
|
||||
Desc. : JS - Fonia Module Locale
|
||||
Created By : Siau Pheng (siaupheng@3fonia.com).
|
||||
Created Date : January 28th, 2013.
|
||||
Last Modofied : November 22nd, 2019
|
||||
|
||||
(c) 2013 - 2019, 3FONIA Software; WWW.3FONIA.COM.
|
||||
|
||||
*******************************************************************/
|
||||
|
||||
if (typeof FoniaJS !== "undefined") {
|
||||
|
||||
FoniaJS.locale('id', {
|
||||
Fonia: {
|
||||
sess_expire: 'Session Anda telah berakhir, silakan login kembali!',
|
||||
page404: 'Halaman aplikasi belum tersedia!',
|
||||
input_passwd: 'Silakan masukkan Password!',
|
||||
input_userid: 'Silakan masukkan User ID!',
|
||||
auth_super: 'Persetujuan Supervisor',
|
||||
auth_user: 'Validasi Operator',
|
||||
auth_wait_msg: 'Menunggu disetujui oleh<br>Supervisor Anda...',
|
||||
cancel: 'Batal',
|
||||
auth_fail: 'Proses gagal!<br>Menunggu terlalu lama ...',
|
||||
auth_success: 'Proses disetujui!',
|
||||
but_add: 'Tambah',
|
||||
but_edit: 'Ubah'
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
<!------------------------------------------------------------------
|
||||
|
||||
Module : /assets/templates/index.php
|
||||
Desc. : HTML Page - Halaman Template Display
|
||||
Created By : Siau Pheng (siaupheng@3fonia.com).
|
||||
Created Date : October 10th, 2008.
|
||||
Last Modified : January 1st, 2026.
|
||||
|
||||
(c) 2008 - 2026, 3FONIA Software; WWW.3FONIA.COM.
|
||||
|
||||
------------------------------------------------------------------->
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>[_APP_NAME_VER_]</title>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="pragma" content="no-cache" />
|
||||
<meta http-equiv="cache-control" content="no-cache,no-store" />
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge;chrome=1">
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
<meta name="generator" content="PhpED + FW9 @ 3FONIA Software"/>
|
||||
<meta name="author" content="Siau Pheng <siaupheng[at]3fonia.com>"/>
|
||||
<meta name="description" content="[_APP_NAME_VER_], [_APP_NAMES_]" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
|
||||
<link rel="icon" href="[_WEB_PATH_]assets/images/logo200.png" type="image/png" />
|
||||
<link rel="shortcut icon" href="[_WEB_PATH_]assets/images/logo200.png" type="image/png" />
|
||||
</head>
|
||||
<body>
|
||||
<div class="d-flex flex-column min-vh-100">
|
||||
<div class="body flex-grow-1" id="pageContent">
|
||||
</div>
|
||||
</div>
|
||||
<div id="preloader"><div id="loader"></div></div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,15 @@
|
||||
[css]
|
||||
login_stamp = "0"
|
||||
login_file =
|
||||
index_stamp = "22790960509"
|
||||
index_file = "91828de68cc2d8c549ba0a5cb72bb886.css"
|
||||
display_stamp = "0"
|
||||
display_file =
|
||||
|
||||
[js]
|
||||
login_stamp = "0"
|
||||
login_file =
|
||||
index_stamp = "48658709282"
|
||||
index_file = "6b29fb63d529966b303feb3b43b6bb81.js"
|
||||
display_stamp = "0"
|
||||
display_file =
|
||||
@@ -0,0 +1,28 @@
|
||||
<?php
|
||||
|
||||
/*******************************************************************
|
||||
|
||||
Module : /index.php
|
||||
Desc. : PHP Page - Halaman Utama Sub Aplikasi Display
|
||||
Created By : Siau Pheng (siaupheng@3fonia.com).
|
||||
Created Date : May 28th, 2011.
|
||||
Last Modified : January 1st, 2026.
|
||||
|
||||
(c) 2011 - 2026, 3FONIA Software; WWW.3FONIA.COM.
|
||||
|
||||
*******************************************************************/
|
||||
|
||||
require_once(__DIR__."/../../../vendor/autoload.php");
|
||||
require_once(__DIR__."/apps/cfg/app.php");
|
||||
|
||||
use siaupheng\fonia3\Display;
|
||||
use siaupheng\fonia3\DB\MySQL;
|
||||
|
||||
$db = $db ?? new MySQL();
|
||||
|
||||
require_once(__DIR__."/apps/cfg/assets.php");
|
||||
|
||||
$html = new Display($db);
|
||||
$html->TampilDisplay();
|
||||
|
||||
?>
|
||||
@@ -0,0 +1,76 @@
|
||||
<?php
|
||||
|
||||
/*******************************************************************
|
||||
|
||||
Module : /index.php
|
||||
Desc. : PHP Page - Halaman Utama Aplikasi Web
|
||||
Created By : Siau Pheng (siaupheng@3fonia.com).
|
||||
Created Date : May 28th, 2011.
|
||||
Last Modified : April 30th, 2022.
|
||||
|
||||
(c) 2011 - 2022, 3FONIA Software; WWW.3FONIA.COM.
|
||||
|
||||
*******************************************************************/
|
||||
|
||||
require_once(__DIR__."/../../vendor/autoload.php");
|
||||
require_once(__DIR__."/apps/cfg/app.php");
|
||||
|
||||
use siaupheng\fonia3\App;
|
||||
use siaupheng\fonia3\Web\Auth;
|
||||
use siaupheng\fonia3\Web\Param;
|
||||
use siaupheng\fonia3\DB\MySQL;
|
||||
|
||||
/*function requestData($url, $postdata = null){
|
||||
$ch = curl_init($url);
|
||||
$headers = array( 'Accept: application/json' );
|
||||
curl_setopt_array($ch, array(
|
||||
CURLOPT_POST => 1,
|
||||
CURLOPT_HTTPHEADER => $headers,
|
||||
CURLOPT_POSTFIELDS => $postdata,
|
||||
CURLOPT_RETURNTRANSFER =>true,
|
||||
CURLOPT_VERBOSE => 1
|
||||
));
|
||||
$output = curl_exec($ch);
|
||||
curl_close($ch);
|
||||
return $output;
|
||||
}
|
||||
|
||||
$token = $_GET['token'];
|
||||
if (!empty($token) && !$_SESSION['token']) $_SESSION['token'] = $token;
|
||||
$user = "";
|
||||
if ($_SESSION['token']) {
|
||||
$url = "http://127.0.0.1/TEST/sso/provider/cek_token.php?token=".$_SESSION['token'];
|
||||
$respon = json_decode(requestData($url));
|
||||
$user = $respon->data;
|
||||
if ($respon->code != 200) {
|
||||
unset($_SESSION['token']);
|
||||
}
|
||||
}*/
|
||||
|
||||
$db = $db ?? new MySQL();
|
||||
$auth = new Auth($db);
|
||||
$auth->set_id_reg($_SESSION['__WEB_APP']['PARENT_CODE']);
|
||||
|
||||
$token = Param::Get("auth", "");
|
||||
if (!empty($token) && !$_SESSION['APP_TOKEN']) $_SESSION['APP_TOKEN'] = $token;
|
||||
if ($_SESSION['APP_TOKEN']) {
|
||||
if ($auth->token_check()) {
|
||||
if (!isset($_SESSION['__WEB_USER'])) {
|
||||
$auser = $auth->user_data($auth->getUserByToken($_SESSION['APP_TOKEN']));
|
||||
//if (intval($auser['Grup_MenuID']) > 0) $auser['Menu_Grup'] = $auth->user_allmenu($auser['Grup_MenuID']);
|
||||
$_SESSION['__WEB_USER'] = $auser;
|
||||
}
|
||||
$auth->gen_module_menu();
|
||||
$auth->user_log();
|
||||
} else {
|
||||
unset($_SESSION['APP_TOKEN']);
|
||||
unset($_SESSION['__WEB_USER']);
|
||||
}
|
||||
}
|
||||
|
||||
require_once(__DIR__."/apps/cfg/assets.php");
|
||||
|
||||
$html = new App();
|
||||
$html->TampilApp();
|
||||
|
||||
?>
|
||||