/*******************************************************************
PHP Class : /Controller/Inv/JualController
Description : Transaksi Penjualan
Created By : Siau Pheng (siaupheng@3fonia.com).
Created Date : May 22th, 2010.
Last Modified : September 27th, 2026.
(c) 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
var JualJS = {
PHP: '',
KODE: '',
index(q) {
$('#butTambah').click(() => this.tx_tambah());
$('#butUbah').click(() => this.tx_ubah());
$('#butHapus').click(() => this.tx_hapus());
$('#butPendingBrow').click(() => this.pending_brow());
$('#butPendingSimpan').click(() => this.tx_simpan('pending'));
$('#butSimpan').click(() => this.tx_simpan());
$('#butBatal').click(() => this.tx_batal());
$('#printNota').click(() => this.tx_print());
$('#printPOS').click(() => this.tx_print_pos());
this.data_query('master', 'view', ((typeof(q)!=='undefined') ? q : ''));
},
tx_brow() {
var _isi = new String('
');
this.winBTX = FoniaJS.showWindow('BTX', 'Daftar Transaksi', _isi, 'xl', '', () => {
$('#winBTX')
.find('#Cari_TX').keydown((e) => {
var key = e.keyCode || e.which || 0;
if (key==13 && e.target.value!='') this.data_query('brow-tx');
}).end()
.find('#butSearch').click(() => this.data_query('brow-tx')).end()
.find('#butAll').click(() => {
$('#winBTX').find('#Cari_TX').val('');
this.data_query('brow-tx');
});
this.data_query('brow-tx');
});
},
tx_select(acell) {
FoniaJS.closeWindow(this.winBTX);
$('#No_Jual').val(acell[0]);
this.data_query('master', 'view');
},
tx_tambah() {
this.data_query('master', 'add');
},
tx_ubah() {
if (!$('#No_Jual').val()){
FoniaJS.showError("Silakan masukkan Nomor Transaksi !");
return;
}
if (-1 !== $('#No_Jual').val().search(/JUAL/i)){
this.data_query('master', 'pending-edit')
return;
}
FoniaJS.showAuth(() => this.data_query('master', 'edit'), this, 'EDIT '+$('#No_Jual').val());
},
tx_hapus() {
if (!$('#No_Jual').val()){
FoniaJS.showError("Silakan masukkan Nomor Transaksi !");
return;
}
FoniaJS.showConfirm('Konfirmasi', 'Yakin akan hapus '+$('#No_Jual').val()+' ?', () => {
FoniaJS.showAuth(() => {
new Request({
url: this.PHP + '/proses_delete',
sendParam: ['No_Jual','MemberID'],
onSuccess: (ajson) => {
if (ajson.status === true){
$('#No_Jual').val('');
this.data_query('master', 'view');
FoniaJS.showInfo('Proses hapus data sukses!');
} else {
FoniaJS.showInfo('Ada masalah dalam proses hapus data!');
}
}
}).send();
}, this, 'DELETE '+$('#No_Jual').val());
}, 'danger');
},
tx_simpan(mode) {
if ($('#MemberID').val()==0){
FoniaJS.showError("Silakan masukkan Nama Member !");
return;
}
if (mode == 'pending'){
this.data_query('master', 'pending-save');
return;
}
this.data_query('master', 'save');
},
tx_batal() {
FoniaJS.showConfirm('Konfirmasi', 'Yakin akan membatalkan ?', () => {
this.data_query('master', 'cancel');
$('#No_Jual').val('');
}, 'danger');
},
tx_print(prt) {
if ($('#No_Jual').val()) {
let cetak = new Printer('report/nota/jual')
.addParam("Nomor_Cetak", $('#No_Jual').val());
if (prt) cetak.doPrint(); else cetak.doPreview();
return;
}
FoniaJS.showError("Silakan masukkan Nomor Transaksi !");
},
tx_print_pos() {
if ($('#No_Jual').val()) {
new PrinterPos('report/nota/pos')
.addParam("Nomor_Cetak", $('#No_Jual').val())
.exec();
return;
}
FoniaJS.showError("Silakan masukkan Nomor Transaksi !");
},
pending_brow() {
this.winBPending = FoniaJS.showWindow('BPending', 'Daftar Pending Penjualan', '
', 'xl', '', () => this.data_query('brow-pending'));
},
pending_select(acell) {
FoniaJS.closeWindow(this.winBPending);
$('#No_Jual').val(acell[0]);
this.data_query('master', 'pending-edit');
},
pending_delete(acell) {
FoniaJS.closeWindow(this.winBPending);
FoniaJS.showConfirm('Konfirmasi', 'Yakin akan hapus Transaksi Pending "'+acell[0]+'" ?', () => {
$('#No_Jual').val(acell[0]);
this.data_query('master', 'pending-delete');
}, 'danger');
},
member_brow() {
var _isi = new String('
');
this.winBMember = FoniaJS.showWindow('BMember', 'Daftar Member', _isi, 'xl', '', () => {
$('#winBMember')
.find('#Cari_Member').keydown((e) => {
var key = e.keyCode || e.which || 0;
if (key == 13 && e.target.value != '') this.data_query('brow-member');
}).end()
.find('#butSearch').click(() => this.data_query('brow-member')).end()
.find('#butAll').click(() => {
$('#winBMember').find('#Cari_Member').val('');
this.data_query('brow-member');
});
this.data_query('brow-member');
});
},
member_select(acell) {
FoniaJS.closeWindow(this.winBMember);
$('#MemberID').val(acell[0]);
$('#Grup_MemberID').val(acell[1]);
$('#Nama_Member').val(acell[3]);
this.update_Piutang();
},
produk_brow() {
if ($('#MemberID').val()==0){
FoniaJS.showError("Silakan masukkan Nama Member !");
return;
}
var _isi = new String('
');
this.winBProduk = FoniaJS.showWindow('BProduk', 'Daftar Barang', _isi, 'xl', '', () => {
$('#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(() => 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(acell) {
FoniaJS.closeWindow(this.winBProduk);
this.detail_produk('insert', 0, acell[0], acell[1], acell[2]);
},
detail_produk(mode, ID, InvID, SatuanID, VarianID) {
if ($('#MemberID').val()==0){
FoniaJS.showError("Silakan masukkan Nama Member !");
FoniaJS.setFocus('Nama_Member');
return;
}
new Request({
url: this.PHP + '/form_produk',
sendParam: ['mode','mode_detail='+mode,'No_Jual','ID='+ID,'InvID='+InvID,'SatuanID='+SatuanID,'VarianID='+VarianID,'Grup_MemberID'],
onSuccess: (ajson) => {
this.winDetail = FoniaJS.showWindow('Detail', 'Detail Barang', ajson.html, 'lg', [{},{i:'butBatal'},{i:'butWSimpan',v:'Simpan',c:'success'}], () => {
$('#winDetail')
.find('#butWSimpan').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])) && parseInt(e.target.value)>0) FoniaJS.setFocus('#Disk_Rupiah');
}).end()
.find('#Disk_Rupiah').keyup((e) => {
this.Hitung_Detail(1);
if (e.which==13 && FoniaJS.StrToFloat($('#Qty').val())>0) this.detail_simpan();
}).end()
.find('#Disk_Persen').keyup((e) => {
this.Hitung_Detail(2);
if (13==e.which && FoniaJS.StrToFloat($('#Qty').val())>0) this.detail_simpan();
});
this.Hitung_Detail(1);
FoniaJS.setFocus('#Qty');
});
}
}).send();
},
detail_ubah(acell) {
this.detail_produk('update', acell[0], acell[1], acell[2], acell[3]);
},
detail_hapus(acell) {
FoniaJS.showConfirm('Konfirmasi', 'Hapus item "'+acell[5]+'" ?', () => {
new Request_JSF({
url: this.PHP + '/table_detail',
sendParam: ['mode','mode_detail=delete','No_Jual','ID='+acell[0]],
onSuccess: () => $('#Nama_Produk').focus()
}).send();
}, 'danger');
},
detail_simpan() {
if (FoniaJS.StrToFloat($('#Disk_Persen').val()) >= 100) {
FoniaJS.showInfo('Nilai Diskon diluar batas !');
return false;
}
new Request_JSF({
url: this.PHP + '/table_detail',
sendParam: ['mode','mode_detail','No_Jual','ID','InvID','SatuanID','VarianID','Qty','Harga_Beli','Harga_Jual','Disk_Rupiah','Disk_Persen'],
onSuccess: () => {
FoniaJS.closeWindow(this.winDetail);
$('#Nama_Produk').val('').focus();
}
}).send();
},
data_query(tipe, mode, kd_tx) {
if (tipe=="master"){
mode = (mode) ? mode : '';
var sparam = ['mode='+mode,'No_Jual'+((typeof(kd_tx)!=='undefined')?'='+kd_tx:'')];
if (-1 !== mode.search(/save/i)) sparam = ['mode='+mode,'No_Jual','Tgl_Jual','CabID','MemberID'];
new Request({
url: this.PHP + '/form_master',
sendParam: sparam,
onSuccess: (ajson) => {
$('#divTXMaster').html(ajson.html);
FoniaJS.AutoComplete('#Nama_Member', this.PHP + '/auto_member', [], {'selectFunc':this.Member_Comp});
FoniaJS.AutoComplete('#Nama_Produk', this.PHP + '/auto_produk', ['No_Jual','CabID','Grup_MemberID'], {'selectFunc':this.Produk_Comp, 'breakFocus': true});
$('#Nama_Produk').click(() => $('#Nama_Produk').select());
$('#POS_Qty').on({
keyup: (e) => {
(13 == e.which) && $('#Nama_Produk').focus();
},
blur: (e) => {
if (parseInt(e.target.value) == 0) e.target.value = '1.00';
},
click: () => $('#POS_Qty').select()
});
$('#No_Jual').keyup((e) =>{
if ((e.which || e.keyCode) == 13) {
if (($("#No_Jual")) && ($("#No_Jual").val() !== '')) this.data_query('master');
}
});
$('#butBrow').click(() => this.tx_brow());
$('#butBrowMember').click(() => this.member_brow());
$('#Nama_Member').click(() => $('#Nama_Member').select());
this.data_query('tabel-detail');
if ($.inArray($("#mode").val(),['add','edit']) !== -1) {
$('#butBrow').prop('disabled', true).removeClass('btn-info').addClass('btn-secondary');
$('#butBrowMember').prop('disabled', false).removeClass('btn-secondary').addClass('btn-info');
$('#butTambah').addClass('d-none');
$('#butUbah').addClass('d-none');
$('#butHapus').addClass('d-none');
$('#butPrint').addClass('d-none');
$('#butSimpan').removeClass('d-none');
$('#butBatal').removeClass('d-none');
$('#butPendingBrow').addClass('d-none');
$('#butPendingSimpan').addClass('d-none');
if (-1 !== $('#No_Jual').val().search(/JUAL/i)) $('#butPendingSimpan').removeClass('d-none');
if ($('#Nama_Member').val() === '') { FoniaJS.setFocus('#Nama_Member'); }
else FoniaJS.setFocus('#Nama_Produk');
} else {
$('#butBrow').prop('disabled', false).removeClass('btn-secondary').addClass('btn-info');
$('#butBrowMember').prop('disabled', true).removeClass('btn-info').addClass('btn-secondary');
$('#butTambah').removeClass('d-none');
$('#butUbah').removeClass('d-none');
$('#butHapus').removeClass('d-none');
$('#butPrint').removeClass('d-none');
$('#butSimpan').addClass('d-none');
$('#butBatal').addClass('d-none');
$('#butPendingBrow').removeClass('d-none');
$('#butPendingSimpan').addClass('d-none');
FoniaJS.setFocus('#No_Jual');
}
$('#butUbah').prop('disabled', ($('#Lunas').val()==1 ? true : false));
$('#butHapus').prop('disabled', ($('#Lunas').val()==1 ? true : false));
if (ajson.error) FoniaJS.showError(ajson.error);
}
}).send();
} else if (tipe=="tabel-detail"){
new Request_JSF({
url: this.PHP + '/table_detail',
sendParam: ['mode','No_Jual']
}).send();
} else if (tipe=="brow-tx"){
new Request_JSF({
url: this.PHP + '/brow_tx',
sendParam: ['Cari_TX'],
onSuccess: () => FoniaJS.setFocus('#Cari_TX')
}).send();
} else if (tipe=="brow-pending"){
new Request_JSF({
url: this.PHP + '/brow_pending',
}).send();
} else if (tipe=="brow-member"){
new Request_JSF({
url: this.PHP + '/brow_member',
sendParam: ['Cari_Member'],
onSuccess: () => FoniaJS.setFocus('#Cari_Member')
}).send();
} else if (tipe=="brow-produk"){
new Request_JSF({
url: this.PHP + '/brow_produk',
sendParam: ['Cari_Produk','Grup_MemberID'],
onSuccess: () => FoniaJS.setFocus('#Cari_Produk')
}).send();
}
},
Member_Comp(item) {
$('#MemberID').val(item.value);
$('#Grup_MemberID').val(item.data);
JualJS.update_Piutang();
},
Produk_Comp(item) {
var _qty = FoniaJS.StrToFloat($('#POS_Qty').val());
var adata = item.data.split(':');
// M : Grup_Member
if (adata[0] === 'M') {
$('#MemberID').val(item.value);
$('#Nama_Member').val(item.text);
$('#Grup_MemberID').val(adata[1]);
} else {
// P : Satuan : Varian : Harga_Pokok : Harga_Jual : Stok
//todo: jika stok kosong tidak simpan !!
//if (parseInt(adata[5])>0 || _qty<0){
new Request_JSF({
url: JualJS.PHP + '/table_detail',
sendParam: ['mode','mode_detail=insert','No_Jual','InvID='+item.value,'SatuanID='+adata[1],'VarianID='+adata[2],'Qty='+_qty,'Harga_Beli='+adata[3],'Harga_Jual='+adata[4]],
onSuccess: () => $('#POS_Qty').val('1.00')
}).send();
/*} else {
this.winPesan = FoniaJS.showWindow('Pesan', 'Informasi Barang', 'Barang tidak tersedia atau habis !
', 300, [{},{i:'butTutup'}], () => {
$('#winPesan').find('#butTutup').click(() => $('#Nama_Produk').focus()).focus();
});
}*/
}
$('#Nama_Produk').val('').focus();
},
update_Piutang() {
new Request_JSF({
url: this.PHP + '/update_piutang',
sendParam: ['MemberID'],
onSuccess: () => FoniaJS.setFocus('#Nama_Produk')
}).send();
},
Hitung_Detail(tipe) {
if (tipe==1) $('#Disk_Persen').val(FoniaJS.FloatToStr((FoniaJS.StrToFloat($('#Disk_Rupiah').val())*100) / FoniaJS.StrToFloat($('#Harga_Jual').val()), 2));
if (tipe==2) $('#Disk_Rupiah').val(FoniaJS.FloatToStr(FoniaJS.StrToFloat($('#Harga_Jual').val()) * FoniaJS.StrToFloat($('#Disk_Persen').val()) * 0.01, 2));
$('#Jumlah').val(FoniaJS.FloatToStr(FoniaJS.StrToFloat($('#Qty').val()) * (FoniaJS.StrToFloat($('#Harga_Jual').val()) - FoniaJS.StrToFloat($('#Disk_Rupiah').val())), 2));
}
};