first commit

This commit is contained in:
2026-01-22 11:06:19 +07:00
commit c877faf5a0
168 changed files with 19843 additions and 0 deletions
+160
View File
@@ -0,0 +1,160 @@
<?php
/*******************************************************************
Module : /apps/php/disp/config.php
Desc. : PHP - Konfigurasi Display POS
Created By : Siau Pheng ([email protected]).
Created Date : August 4th, 2013.
Last Modified : December 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\Table;
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-display" ) {
if ( $mode == "save" ) {
$sql = new SQL($db);
$sql->set_table("disp_config");
$sql->add_param("MON_ENABLE");
$sql->add_param("Text_Run");
$sql->add_param("Warna");
$sql->add_param("Font");
$sql->add_param("Promo_Idle");
$sql->add_param("Promo_Durasi");
$sql->add_param("POLE_ENABLE");
$sql->add_param("POLE_PORT");
$sql->add_param("POLE_START1");
$sql->add_param("POLE_START2");
$sql->add_param("POLE_END1");
$sql->add_param("POLE_END2");
$sql->add_where("REG_ID");
$sql->UpdateDB();
$ajson['sukses'] = true;
$mode = "view";
}
$para = [];
if ($id_reg > 0) {
$db->Query("SELECT * FROM disp_config WHERE REG_ID='".$id_reg."' LIMIT 1");
if ($db->Next()) $para = $db->AllRow();
$db->Query("SELECT CABANGID FROM inv_config WHERE REG_ID='".$para['REG_ID']."' LIMIT 1");
if ($db->Next()) $para = array_merge($para, $db->AllRow());
$db->Query("SELECT Nama_Cab FROM para_cabang WHERE CabID='".$para['CABANGID']."' LIMIT 1");
if ($db->Next()) $para = array_merge($para, $db->AllRow());
}
$benable = ($mode=="edit") ? true : false;
$form = new Form($db);
$tmon_ena = $form->switch("_", "MON_ENABLE", $para['MON_ENABLE'], $benable, false, [1,0]);
$ttext_run = $form->textarea("_", "Text_Run", $para['Text_Run'], $benable, false, 2, "tulisan banner");
$twarna = $form->color("_", "Warna", $para['Warna'], $benable, false);
$tfont = $form->textbox("_", "Font", $para['Font'], $benable, false, "number");
$tpro_idle = $form->textbox("_", "Promo_Idle", $para['Promo_Idle'], $benable, false, "number");
$tpro_dur = $form->textbox("_", "Promo_Durasi", $para['Promo_Durasi'], $benable, false, "number");
$tpole_ena = $form->switch("_", "POLE_ENABLE", $para['POLE_ENABLE'], $benable, false, [1,0]);
$tpole_port = $form->option("_", "POLE_PORT", $para['POLE_PORT'], $benable, false, [$para['POLE_PORT']=>$para['POLE_PORT']]);
$tpole_end1 = $form->textbox("_", "POLE_END1", $para['POLE_END1'], $benable, false, "text", "baris 1 farewell", 20);
$tpole_end2 = $form->textbox("_", "POLE_END2", $para['POLE_END2'], $benable, false, "text", "baris 2 farewell", 20);
$tpole_start1 = $form->textbox("_", "POLE_START1", $para['POLE_START1'], $benable, false, "text", "baris 1 welcome", 20);
$tpole_start2 = $form->textbox("_", "POLE_START2", $para['POLE_START2'], $benable, false, "text", "baris 2 welcome", 20);
$ajson['html'] = '
<ul class="nav nav-tabs" role="tablist">
<li class="nav-item" role="presentation">
<button class="nav-link active" id="monitor-tab" data-bs-toggle="tab" data-bs-target="#monitor" type="button" role="tab" aria-controls="monitor" aria-selected="true">Monitor Display</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link" id="pole-tab" data-bs-toggle="tab" data-bs-target="#pole" type="button" role="tab" aria-controls="pole" aria-selected="false">Pole Display</button>
</li>
</ul>
<div class="tab-content border border-top-0 p-3">
<div class="tab-pane fade active show" id="monitor" role="tabpanel" aria-labelledby="monitor-tab">
<div class="row mb-1">
<label class="col-sm-5 col-lg-3 col-form-label" for="MON_ENABLE">Status Display Monitor</label>
<div class="col col-form-label">'.$tmon_ena.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-5 col-lg-3 col-form-label" for="Text_Run">Tulisan Banner</label>
<div class="col">'.$ttext_run.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-5 col-lg-3 col-form-label" for="Warna">Warna Tulisan</label>
<div class="col-sm-4 col-lg-5"><div class="input-group">'.$twarna.Form_Info("Warna tulisan banner.").'</div></div>
</div>
<div class="row mb-1">
<label class="col-sm-5 col-lg-3 col-form-label" for="Font">Ukuran Font</label>
<div class="col-sm-4 col-lg-5"><div class="input-group">'.$tfont.Form_Info("Ukuran font tampilan banner.").'</div></div>
</div>
<div class="row mb-1">
<label class="col-sm-5 col-lg-3 col-form-label" for="Promo_Idle">Waktu Jedah Promo</label>
<div class="col-sm-4 col-lg-5"><div class="input-group">'.$tpro_idle.Form_Info("Waktu tunggu tampil promo setelah transaksi POS terakhir.").'</div></div>
</div>
<div class="row mb-1">
<label class="col-sm-5 col-lg-3 col-form-label" for="Promo_Durasi">Waktu Durasi Promo</label>
<div class="col-sm-4 col-lg-5"><div class="input-group">'.$tpro_dur.Form_Info("Waktu durasi penggantian tulisan promo (bagian bawah)").'</div></div>
</div>
</div>
<div class="tab-pane fade" id="pole" role="tabpanel" aria-labelledby="pole-tab">
<div class="row mb-1">
<label class="col-sm-5 col-lg-3 col-form-label" for="POLE_ENABLE">Status Pole Display</label>
<div class="col col-form-label">'.$tpole_ena.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-5 col-lg-3 col-form-label" for="POLE_PORT">Port Pole Display</label>
<div class="col-sm-4 col-lg-5">'.$tpole_port.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-5 col-lg-3 col-form-label" for="POLE_START1">Baris 1 Welcome</label>
<div class="col"><div class="input-group">'.$tpole_start1.Form_Info("Maximum 20 huruf.").'</div></div>
</div>
<div class="row mb-1">
<label class="col-sm-5 col-lg-3 col-form-label" for="POLE_START2">Baris 2 Welcome</label>
<div class="col"><div class="input-group">'.$tpole_start2.Form_Info("Maximum 20 huruf.").'</div></div>
</div>
<div class="row mb-1">
<label class="col-sm-5 col-lg-3 col-form-label" for="POLE_END1">Baris 1 Farewell</label>
<div class="col"><div class="input-group">'.$tpole_end1.Form_Info("Maximum 20 huruf.").'</div></div>
</div>
<div class="row mb-1">
<label class="col-sm-5 col-lg-3 col-form-label" for="POLE_END2">Baris 2 Farewell</label>
<div class="col"><div class="input-group">'.$tpole_end2.Form_Info("Maximum 20 huruf.").'</div></div>
</div>
</div>
</div>
<input type="hidden" id="mode" value="'.$mode.'" >';
$ajson['Nama_Cabang'] = $para['Nama_Cab'];
} else if ( $data == "brow-cabang" ) {
$obj = new Table($db);
$obj->set_query("SELECT C.*,G.REG_ID FROM (SELECT * FROM para_cabang WHERE Aktif=1) C LEFT JOIN inv_config G ON (G.CABANGID=C.CabID)");
$obj->add_field("REG_ID", "ID", "hid");
$obj->add_field("Kode_Cab", "Kode", "c");
$obj->add_field("Nama_Cab", "Nama Cabang", "awr");
$obj->set_field_order("Kode_Cab", "A");
$obj->add_row_btn("save", "Pilih", "DISPConfigJS.cab_select");
$obj->set_func_navi("DISPConfigJS.data_query('brow-cabang')");
$ajson[] = $obj->json_table("divBrowCab");
} else if ( $data == "default") {
echo '<div class="row mb-1"><div class="col"><div class="input-group"><input class="form-control" id="Nama_Cabang" type="text" disabled readonly><button id="butBrow" class="btn btn-info" type="button" onclick="DISPConfigJS.cabang_brow();"><i class="bi-search"></i></button></div></div></div><div class="card"><div class="card-body"><div id="divDisplay">&nbsp;</div><input type="hidden" id="REG_ID" value="'.$id_reg.'"></div></div>';
}
send_json($ajson);
?>
+167
View File
@@ -0,0 +1,167 @@
<?php
/*******************************************************************
Module : /apps/php/disp/iklan.php
Desc. : PHP - Konfigurasi Display Iklan POS
Created By : Siau Pheng ([email protected]).
Created Date : January 15th, 2015.
Last Modified : December 8th, 2025.
(c) 2015 - 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_detail = Param::Get("mode_detail");
$id_promo = Param::Get("PromoID", 0);
if ( $data == "promo-detail" ) {
$atabel = ['PromoID'=>0,'CabID'=>0,'Tanggal'=>tgl_ymd(),'Aktif'=>1];
if ($id_promo > 0) {
$db->Query("SELECT * FROM disp_promo WHERE PromoID='".$id_promo."' LIMIT 1");
if ($db->Next()) $atabel = $db->AllRow();
}
$form = new Form($db);
$tcab = $form->option_db("_", "CabID", $atabel['CabID'], true, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID", [0,"SEMUA CABANG"]);
$ttanggal = $form->datebox("_", "Tanggal", $atabel['Tanggal'], true, false);
$tinfo = $form->textarea("_", "Info", $atabel['Info'], true, false, 3, "keterangan iklan");
$taktif = $form->radio("_", "Aktif", $atabel['Aktif'], true, false, [1=>"Aktif",0=>"Tidak"]);
$ajson['html'] = '
<div class="row">
<div class="col-sm-12 col-lg-8">
<div class="row mb-1">
<label class="col-sm-5 col-lg-3 col-form-label" for="Tanggal">Tanggal</label>
<div class="col-sm-6 col-lg-5">'.$ttanggal.'</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-sm-6 col-lg-5">'.$tcab.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-5 col-lg-3 col-form-label" for="Info">Keterangan</label>
<div class="col">'.$tinfo.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-5 col-lg-3 col-form-label" for="Aktif">Status Aktif ?</label>
<div class="col col-form-label">'.$taktif.'</div>
</div>
</div>
<div class="col-sm-12 col-lg-4 text-center">
<img class="img-fluid img-thumbnail mx-auto mb-2 d-block" id="imgPhoto" src="">
<label class="input-group-btn"><span class="btn rounded-pill btn-info me-2"><i class="bi-cloud-upload me-1"></i>Gambar<input type="file" name="FileGambar" id="FileGambar" style="display:none;"></span></label><br><small class="text-muted">Ukuran file max <strong>20MB</strong> ( <i>png / jpg / gif</i> )</small>
</div>
<input type="hidden" id="PromoID" value="'.$atabel['PromoID'].'" >
<input type="hidden" id="mode_detail" value="'.$mode_detail.'" >';
} else if ( $data == "detail" ) {
if (in_array($mode_detail, ["insert","update","delete"])) {
$sql = new SQL($db);
$sql->set_table("disp_promo");
$sql->add_param("CabID");
$sql->add_param_date("Tanggal");
$sql->add_param("Info");
$sql->add_param("Aktif");
$sql->add_param_userid();
$sql->add_where("PromoID");
if ($mode_detail=="insert") {
$sql->add_param("PromoID");
$sql->add_param("Tipe", 2);
$sql->InsertDB();
} else if ($mode_detail=="update") {
$sql->UpdateDB();
} else if ($mode_detail=="delete") {
$sql->DeleteDB();
}
}
$tcari = trim(Param::Get("Cari_Iklan"));
$tsql = ($tcari=="") ? "" : " AND CONCAT(DATE_FORMAT(Tanggal,'%d-%m-%Y'),Info) LIKE '%".$tcari."%'";
$obj = new Table($db);
$obj->set_query("SELECT I.*,IF(ISNULL(C.Nama_Cab),'SEMUA CABANG',C.Nama_Cab) Nama_Cab FROM (SELECT * FROM disp_promo WHERE Tipe=2".$tsql.") I LEFT JOIN para_cabang C ON (C.CabID=I.CabID)");
$obj->add_field("PromoID", "ID", "hid");
$obj->add_field("Tanggal", "Tanggal", "c", "sqltgl", null, "val-tgl");
$obj->add_field("Nama_Cab", "Cabang", "l");
$obj->add_field("Info", "Keterangan", "awr");
$obj->add_field("Aktif", "Aktif", "c", "checkbox");
$obj->set_field_order("Tanggal", "A");
$obj->add_row_btn("clipboard", "Ubah", "DISPIklanJS.detail_ubah");
$obj->add_row_btn("trash", "Hapus", "DISPIklanJS.detail_hapus");
$obj->set_func_navi("DISPIklanJS.data_query('detail')");
$obj->set_func_btn("DISPIklanJS.detail_tambah", "+ Iklan");
$ajson[] = $obj->json_table("divDetail");
} else if ( $data == "upload-gambar" ) {
$ajson['result'] = 0;
if (isset($_FILES['Gambar1'])) {
$file_ok = false;
$file_name = $_FILES['Gambar1']['name'];
$file_size = $_FILES['Gambar1']['size'];
if ($file_size < 20480000) {
$file_ext = strtolower(pathinfo("gambar/".$file_name, PATHINFO_EXTENSION));
if (in_array($file_ext, ["png","jpg","jpeg","gif"])) {
$file_ok = true;
} else {
$ajson['message'] = "File tidak dapat diterima !";
}
} else {
$ajson['message'] = "Ukuran file diatas 20MB !";
}
if ($file_ok) {
$file_name = $_FILES['Gambar1']['tmp_name'];
$finfo = new finfo(FILEINFO_MIME);
$type = $finfo->file($file_name);
$mime = substr($type, 0, strpos($type, ';'));
if ($id_promo > 0) {
$db->Query("UPDATE disp_promo SET Image=\"".addslashes(file_get_contents($file_name))."\",Mime='".$mime."' WHERE PromoID='".$id_promo."'");
} else {
$db->Query("INSERT INTO disp_promo (Image,Mime) VALUES(\"".addslashes(file_get_contents($file_name))."\",'".$mime."')");
$id_promo = $db->LastInsertID();
}
$ajson['result'] = 1;
$ajson['PromoID'] = $id_promo;
}
} else {
$ajson = ['result' => 0, 'message' => 'File tidak ditemukan atau masalah internal !'];
}
} else if ( $data == "image") {
$gambar = base64_decode("/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcGBwcICQsJCAgKCAcHCg0KCgsMDAwMBwkODw0MDgsMDAz/2wBDAQICAgMDAwYDAwYMCAcIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCAABAAEDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9/KKKKAP/2Q==");
$mime = "image/jpg";
$db->Query("SELECT Image,Mime FROM disp_promo WHERE PromoID='".$id_promo."' AND Image IS NOT NULL");
if ($db->Next()) {
$gambar = $db->Row("Image");
$mime = $db->Row("Mime");
}
header("Content-type: ".$mime);
echo $gambar;
die();
} else if ( $data == "default") {
echo '
<div class="fade-in">
<div class="card"><div class="card-header custom-style">Konfigurasi Display Iklan POS</div><div class="card-body"><div class="row mb-1"><div class="col"><div class="input-group"><input class="form-control" id="Cari_Iklan" 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="divDetail">&nbsp;</div></div></div>
</div>';
}
send_json($ajson);
?>
+174
View File
@@ -0,0 +1,174 @@
<?php
/*******************************************************************
Module : /apps/php/disp/promo.php
Desc. : PHP - Konfigurasi Display Promo POS
Created By : Siau Pheng ([email protected]).
Created Date : January 15th, 2015.
Last Modified : December 8th, 2025.
(c) 2015 - 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_detail = Param::Get("mode_detail");
$id_promo = Param::Get("PromoID", 0);
if ( $data == "promo-detail" ) {
$atabel = ['PromoID'=>0,'Tanggal'=>tgl_ymd(),'Warna'=>"#FFFFFF",'Font'=>40,'Aktif'=>1];
if ($id_promo > 0) {
$db->Query("SELECT * FROM disp_promo WHERE PromoID='".$id_promo."' LIMIT 1");
if ($db->Next()) $atabel = $db->AllRow();
}
$form = new Form($db);
$ttanggal = $form->datebox("_", "Tanggal", $atabel['Tanggal'], true, false);
$tinfo = $form->textarea("_", "Info", $atabel['Info'], true, false, 2, "info promo");
$twarna = $form->color("_", "Warna", $atabel['Warna'], true, false);
$tfont = $form->textbox("_", "Font", $atabel['Font'], true, false, "number");
$taktif = $form->radio("_", "Aktif", $atabel['Aktif'], true, false, [1=>"Aktif",0=>"Tidak"]);
$ajson['html'] = '
<div class="row">
<div class="col-sm-12 col-lg-8">
<div class="row mb-1">
<label class="col-sm-5 col-lg-3 col-form-label" for="Tanggal">Tanggal</label>
<div class="col-sm-6 col-lg-5">'.$ttanggal.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-5 col-lg-3 col-form-label" for="Info">Isi Informasi</label>
<div class="col">'.$tinfo.'<small class="text-muted">[br] = Ganti Baris, [i]..[/i] = Italic, [b]..[/b] = Bold</small></div>
</div>
<div class="row mb-1">
<label class="col-sm-5 col-lg-3 col-form-label" for="Warna">Warna Tulisan</label>
<div class="col-sm-6 col-lg-5"><div class="input-group">'.$twarna.Form_Info("Warna tulisan promo.").'</div></div>
</div>
<div class="row mb-1">
<label class="col-sm-5 col-lg-3 col-form-label" for="Font">Ukuran Font</label>
<div class="col-sm-6 col-lg-5"><div class="input-group">'.$tfont.Form_Info("Ukuran font promo.").'</div></div>
</div>
<div class="row mb-1">
<label class="col-sm-5 col-lg-3 col-form-label" for="Aktif">Status Aktif ?</label>
<div class="col col-form-label">'.$taktif.'</div>
</div>
</div>
<div class="col-sm-12 col-lg-4 text-center">
<img class="img-fluid img-thumbnail mx-auto mb-2 d-block" id="imgPhoto" src="">
<label class="input-group-btn"><span class="btn rounded-pill btn-info me-2"><i class="bi-cloud-upload me-1"></i>Gambar<input type="file" name="FileGambar" id="FileGambar" style="display:none;"></span></label><br><small class="text-muted">Ukuran file max <strong>20MB</strong> ( <i>png / jpg / gif</i> )</small>
</div>
<input type="hidden" id="PromoID" value="'.$atabel['PromoID'].'" >
<input type="hidden" id="mode_detail" value="'.$mode_detail.'" >';
} else if ( $data == "detail" ) {
if (in_array($mode_detail, ["insert","update","delete"])) {
$sql = new SQL($db);
$sql->set_table("disp_promo");
$sql->add_param_date("Tanggal");
$sql->add_param("Info");
$sql->add_param("Warna");
$sql->add_param("Font");
$sql->add_param("Aktif");
$sql->add_param_userid();
$sql->add_where("PromoID");
if ($mode_detail=="insert") {
$sql->add_param("PromoID");
$sql->add_param("Tipe", 1);
$sql->InsertDB();
} else if ($mode_detail=="update") {
$sql->UpdateDB();
} else if ($mode_detail=="delete") {
$sql->DeleteDB();
}
}
$tcari = trim(Param::Get("Cari_Promo"));
$tsql = ($tcari=="") ? "" : " AND CONCAT(DATE_FORMAT(Tanggal,'%d-%m-%Y'),Info) LIKE '%".$tcari."%'";
$obj = new Table($db);
$obj->set_query("SELECT * FROM disp_promo WHERE Tipe=1".$tsql);
$obj->add_field("PromoID", "ID", "hid");
$obj->add_field("Tanggal", "Tanggal", "c", "sqltgl", null, "val-tgl");
$obj->add_field("Info", "Isi Informasi / Promo", "awr");
$obj->add_field("Warna", "Warna", "c");
$obj->add_field("Font", "Font", "c");
$obj->add_field("Aktif", "Aktif", "c", "checkbox");
$obj->set_field_order("Tanggal", "A");
$obj->add_row_btn("clipboard", "Ubah", "DISPPromoJS.detail_ubah");
$obj->add_row_btn("trash", "Hapus", "DISPPromoJS.detail_hapus");
$obj->set_func_navi("DISPPromoJS.data_query('detail')");
$obj->set_func_btn("DISPPromoJS.detail_tambah", "+ Promo");
$ajson[] = $obj->json_table("divDetail");
} else if ( $data == "upload-gambar" ) {
$ajson['result'] = 0;
if (isset($_FILES['Gambar1'])) {
$file_ok = false;
$file_name = $_FILES['Gambar1']['name'];
$file_size = $_FILES['Gambar1']['size'];
if ($file_size < 20480000) {
$file_ext = strtolower(pathinfo("gambar/".$file_name, PATHINFO_EXTENSION));
if (in_array($file_ext, ["png","jpg","jpeg","gif"])) {
$file_ok = true;
} else {
$ajson['message'] = "File tidak dapat diterima !";
}
} else {
$ajson['message'] = "Ukuran file diatas 20MB !";
}
if ($file_ok) {
$file_name = $_FILES['Gambar1']['tmp_name'];
$finfo = new finfo(FILEINFO_MIME);
$type = $finfo->file($file_name);
$mime = substr($type, 0, strpos($type, ';'));
if ($id_promo > 0) {
$db->Query("UPDATE disp_promo SET Image=\"".addslashes(file_get_contents($file_name))."\",Mime='".$mime."' WHERE PromoID='".$id_promo."'");
} else {
$db->Query("INSERT INTO disp_promo (Image,Mime) VALUES(\"".addslashes(file_get_contents($file_name))."\",'".$mime."')");
$id_promo = $db->LastInsertID();
}
$ajson['result'] = 1;
$ajson['PromoID'] = $id_promo;
}
} else {
$ajson = ['result' => 0, 'message' => 'File tidak ditemukan atau masalah internal !'];
}
} else if ( $data == "image") {
$gambar = base64_decode("/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcGBwcICQsJCAgKCAcHCg0KCgsMDAwMBwkODw0MDgsMDAz/2wBDAQICAgMDAwYDAwYMCAcIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCAABAAEDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9/KKKKAP/2Q==");
$mime = "image/jpg";
$db->Query("SELECT Image,Mime FROM disp_promo WHERE PromoID='".$id_promo."' AND Image IS NOT NULL");
if ($db->Next()) {
$gambar = $db->Row("Image");
$mime = $db->Row("Mime");
}
header("Content-type: ".$mime);
echo $gambar;
die();
} else if ( $data == "default") {
echo '
<div class="fade-in">
<div class="card"><div class="card-header custom-style">Konfigurasi Display Promo POS</div><div class="card-body"><div class="row mb-1"><div class="col"><div class="input-group"><input class="form-control" id="Cari_Promo" 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="divDetail">&nbsp;</div></div></div>
</div>';
}
send_json($ajson);
?>
+601
View File
@@ -0,0 +1,601 @@
<?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();
/************************* PELUNASAN BELI & JUAL *************************/
function Update_Lunas_Sup($id_sup = 0) {
global $fdb;
if ($id_sup == 0) return false;
$fdb->Query("UPDATE para_supplier S,(SELECT SupID,COUNT(*) Item FROM inv_beli WHERE Lunas=0 AND SupID='".$id_sup."') B SET S.Lunas=B.Item WHERE S.SupID=B.SupID AND S.SupID='".$id_sup."'");
}
/************************* 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."'");
}
function Produk_Update($no_ref = "", $supid = 0) {
global $fdb;
$tdb = new MySQL();
if ($no_ref == "" && $supid == 0) return;
$fdb->Query("SELECT *,CEIL((Harga_Beli-(Total_Diskon/Qty))/(Stok/Qty)) HPP FROM inv_detail WHERE No_Ref='".$no_ref."'");
while ($fdb->Next()) {
if ($fdb->RowFloat("Harga_Beli",0)>0) $tdb->Query("UPDATE inv_produk SET Harga_Beli='".$fdb->Row("HPP")."',Harga_Pokok=Harga_Beli+Harga_Tambah WHERE InvID='".$fdb->Row("InvID")."'");
$tdb->Query("INSERT IGNORE INTO inv_produk_sup SET InvID='".$fdb->Row("InvID")."',SupID='".$supid."',Aktif=1");
$tdb->Query("UPDATE inv_produk_sup SET Aktif=0 WHERE InvID='".$fdb->Row("InvID")."' AND SupID<>'".$supid."'");
}
unset($tdb);
}
/************************* TRANSAKSI PO *************************/
function PO_Detail_Copy($no_po = "", $bunix = false) {
global $fdb;
if ($no_po == "") return;
PO_Detail_Cancel($no_po);
$fdb->Query("INSERT INTO tmp_inv_po_detail (No_PO,ID,InvID,SatuanID,Qty,Harga_Beli,Harga_HPP,Invoice,DateStamp,UserID,Unix) SELECT No_PO,ID,InvID,SatuanID,Qty,Harga_Beli,Harga_HPP,Invoice,DateStamp,UserID,'".(($bunix)?user_unix():0)."' FROM inv_po_detail WHERE No_PO='".$no_po."'");
}
function PO_Detail_Save($no_po = "", $is_baru = false, $no_lama = "") {
global $fdb;
if ($no_po == "") return;
$fdb->Query("DELETE FROM inv_po_detail WHERE No_PO='".$no_po."'");
if ($is_baru) {
PO_Detail_Cancel($no_po);
$fdb->Query("UPDATE tmp_inv_po_detail SET No_PO='".$no_po."' WHERE No_PO='".$no_lama."' AND Unix='".user_unix()."'");
}
$fdb->Query("INSERT INTO inv_po_detail (No_PO,ID,InvID,SatuanID,Qty,Harga_Beli,Harga_HPP,Invoice,DateStamp,UserID) SELECT No_PO,ID,InvID,SatuanID,Qty,Harga_Beli,Harga_HPP,Invoice,DateStamp,UserID FROM tmp_inv_po_detail WHERE No_PO='".$no_po."' AND Qty>0");
PO_Detail_Cancel($no_po);
}
function PO_Detail_Cancel($no_po = "") {
global $fdb;
if ($no_po == "") return;
$fdb->Query("DELETE FROM tmp_inv_po_detail WHERE No_PO='".$no_po."'");
}
/************************* 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, ["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 = [];
$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");
}
}
}
}
/************************* LAPORAN PRODUK PER AREA *************************/
function RepoProduk_Baru($tipe = "A", $tgl = "") {
global $fdb;
$atipe = array('A'=>array("No_Area","rep_produk"));
if ($tgl == "") {
$tno = $tipe . date("y") . abjad(date("n"));
} else {
$tmp = explode("-", $tgl);
$tno = $tipe . substr($tmp[2],2,2) . abjad(intval($tmp[1]));
}
$tno .= user_id(2);
$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->Row("Nomor", 0);
$tno .= isi_nol($ino+1, 4);
return $tno;
}
function RepoProduk_Detail_Copy($no_ref = "") {
global $fdb;
if ($no_ref == "") return;
RepoProduk_Detail_Cancel($no_ref);
$fdb->Query("INSERT INTO tmp_rep_produk_detail SELECT No_Area,ID,InvID,SatuanID,UserID,'".user_unix()."' FROM rep_produk_detail WHERE No_Area='".$no_ref."'");
}
function RepoProduk_Detail_Save($no_ref = "", $is_baru = false, $no_lama = "") {
global $fdb;
if ($no_ref == "") return;
$fdb->Query("DELETE FROM rep_produk_detail WHERE No_Area='".$no_ref."'");
if ($is_baru) {
RepoProduk_Detail_Cancel($no_ref);
$fdb->Query("UPDATE tmp_rep_produk_detail SET No_Area='".$no_ref."' WHERE No_Area='".$no_lama."' AND Unix='".user_unix()."'");
}
$fdb->Query("INSERT INTO rep_produk_detail SELECT No_Area,ID,InvID,SatuanID,UserID FROM tmp_rep_produk_detail WHERE No_Area='".$no_ref."'");
RepoProduk_Detail_Cancel($no_ref);
}
function RepoProduk_Detail_Cancel($no_ref = "") {
global $fdb;
if ($no_ref == "") return;
$fdb->Query("DELETE FROM tmp_rep_produk_detail WHERE No_Area='".$no_ref."'");
}
/************************* 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 = []) {//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>';
}
?>
+142
View File
@@ -0,0 +1,142 @@
<?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 A.*,C.Kode_Cab FROM (SELECT * FROM gel_kas WHERE Tipe_Kas='O') A LEFT JOIN para_cabang C ON (C.CabID=A.CabID)");
$obj->add_field("No_Kas", "No. Trans", "c");
$obj->add_field("Tgl_Kas", "Tanggal", "c", "sqltgl");
$obj->add_field("Kode_Cab", "Cab", "c");
$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 {
$db->Query("SELECT * FROM gel_kas WHERE Tipe_Kas='O' 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'], true, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID", [0,"&nbsp;"]);
$ttx = $form->option_db("_", "TXID", $atabel['TXID'], true, false, "para_tx_kas", ["TXID","Nama_TX"], "Grup_TX='O' AND Aktif=1 ORDER BY Nama_TX", [0,"&nbsp;"]);
$tjumlah = $form->textbox("_", "Jumlah", $atabel['Jumlah'], true, false, "double");
$tket = $form->textarea("_", "Ket", $atabel['Ket'], true, false, 2);
$ajson['html'] = '
<div class="row mb-1">
<label class="col-sm-5 col-lg-3 col-form-label" for="No_Kas">Nomor Transaksi</label>
<div class="col-sm-7 col-lg-5">'.$tnota.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-5 col-lg-3 col-form-label" for="Tgl_Kas">Tanggal Transaksi</label>
<div class="col-sm-7 col-lg-5">'.$ttgl.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-5 col-lg-3 col-form-label" for="CabID">Nama Cabang</label>
<div class="col">'.$tcab.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-5 col-lg-3 col-form-label" for="TXID">Jenis Transaksi</label>
<div class="col">'.$ttx.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-5 col-lg-3 col-form-label" for="Ket">Keterangan</label>
<div class="col">'.$tket.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-5 col-lg-3 col-form-label" for="Jumlah">Jumlah</label>
<div class="col-sm-7 col-lg-5">'.$tjumlah.'</div>
</div>
<input type="hidden" id="mode_detail" value="'.$mode_detail.'" >';
} else if ( $data == "default") {
echo '
<div class="fade-in">
<div class="card"><div class="card-body">
<ul class="nav nav-tabs" role="tablist">
<li class="nav-item" role="presentation">
<button class="nav-link active" id="tx-tab" data-bs-toggle="tab" data-bs-target="#tx" type="button" role="tab" aria-controls="tx" aria-selected="true"><i class="bi-database me-2"></i>Transaksi Pengeluaran Kas</button>
</li>
<li class="nav-item ms-auto">
<button class="btn btn-primary mb-1 ms-2" id="butTambah" type="button"><i class="bi-plus-lg me-2"></i>Tambah</button>
<button class="btn btn-secondary mb-1 ms-2 d-none" id="butCari" type="button"><i class="bi-search me-2"></i>Cari</button>
</li>
</ul>
<div class="tab-content border border-top-0 p-3">
<div class="tab-pane fade active show" id="tx" role="tabpanel" aria-labelledby="tx-tab">
<div id="divDetailTabel">&nbsp;</div>
</div>
</div>
</div></div>
</div>';
}
send_json($ajson);
?>
+142
View File
@@ -0,0 +1,142 @@
<?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 A.*,C.Kode_Cab FROM (SELECT * FROM gel_kas WHERE Tipe_Kas='I') A LEFT JOIN para_cabang C ON (C.CabID=A.CabID)");
$obj->add_field("No_Kas", "No. Trans", "c");
$obj->add_field("Tgl_Kas", "Tanggal", "c", "sqltgl");
$obj->add_field("Kode_Cab", "Cab", "c");
$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 {
$db->Query("SELECT * FROM gel_kas WHERE Tipe_Kas='I' 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'], true, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID", [0,"&nbsp;"]);
$ttx = $form->option_db("_", "TXID", $atabel['TXID'], true, false, "para_tx_kas", ["TXID","Nama_TX"], "Grup_TX='I' AND Aktif=1 ORDER BY Nama_TX", [0,"&nbsp;"]);
$tjumlah = $form->textbox("_", "Jumlah", $atabel['Jumlah'], true, false, "double");
$tket = $form->textarea("_", "Ket", $atabel['Ket'], true, false, 2);
$ajson['html'] = '
<div class="row mb-1">
<label class="col-sm-5 col-lg-3 col-form-label" for="No_Kas">Nomor Transaksi</label>
<div class="col-sm-7 col-lg-5">'.$tnota.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-5 col-lg-3 col-form-label" for="Tgl_Kas">Tanggal Transaksi</label>
<div class="col-sm-7 col-lg-5">'.$ttgl.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-5 col-lg-3 col-form-label" for="CabID">Nama Cabang</label>
<div class="col">'.$tcab.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-5 col-lg-3 col-form-label" for="TXID">Jenis Transaksi</label>
<div class="col">'.$ttx.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-5 col-lg-3 col-form-label" for="Ket">Keterangan</label>
<div class="col">'.$tket.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-5 col-lg-3 col-form-label" for="Jumlah">Jumlah</label>
<div class="col-sm-7 col-lg-5">'.$tjumlah.'</div>
</div>
<input type="hidden" id="mode_detail" value="'.$mode_detail.'" >';
} else if ( $data == "default") {
echo '
<div class="fade-in">
<div class="card"><div class="card-body">
<ul class="nav nav-tabs" role="tablist">
<li class="nav-item" role="presentation">
<button class="nav-link active" id="tx-tab" data-bs-toggle="tab" data-bs-target="#tx" type="button" role="tab" aria-controls="tx" aria-selected="true"><i class="bi-database me-2"></i>Transaksi Penerimaan Kas</button>
</li>
<li class="nav-item ms-auto">
<button class="btn btn-primary mb-1 ms-2" id="butTambah" type="button"><i class="bi-plus-lg me-2"></i>Tambah</button>
<button class="btn btn-secondary mb-1 ms-2 d-none" id="butCari" type="button"><i class="bi-search me-2"></i>Cari</button>
</li>
</ul>
<div class="tab-content border border-top-0 p-3">
<div class="tab-pane fade active show" id="tx" role="tabpanel" aria-labelledby="tx-tab">
<div id="divDetailTabel">&nbsp;</div>
</div>
</div>
</div></div>
</div>';
}
send_json($ajson);
?>
+126
View File
@@ -0,0 +1,126 @@
<?php
/*******************************************************************
Module : /apps/php/index.php
Desc. : PHP - Halaman Utama Desktop
Created By : Siau Pheng ([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);
?>
+499
View File
@@ -0,0 +1,499 @@
<?php
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/php/iss/beli.php
Desc. : PHP - Transaksi Pembelian
Created By : Siau Pheng ([email protected]).
Created Date : May 22th, 2010.
Last Modified : October 19th, 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;
function Beli_Data1($nomor="", $baru=false) {
global $db;
$aparam = ['No_Beli'=>$nomor];
if (trim($nomor)=="") {
if ($baru) $aparam['No_Beli'] = "BELI".$_SESSION['__WEB_APP']['SERVER_ID'].$_SESSION['__APP_INV']['CABANGID'].user_id(3)."#00";
$aparam['Tgl_Beli'] = tgl_ymd();
$aparam['Tgl_Faktur'] = tgl_ymd();
$aparam['SupID'] = 0;
$aparam['CabID'] = $_SESSION['__APP_INV']['CABANGID'];
$aparam['Total_Beli'] = 0;
$aparam['Total_Hutang']= 0;
$aparam['Total_Bulat'] = 0;
} else {
$tabel_beli = (strpos($nomor,"BELI")===false) ? "inv_beli" : "inv_beli_pend";
$db->Query("SELECT * FROM ".$tabel_beli." WHERE No_Beli='".$nomor."'");
if ($db->Next()) $aparam = $db->AllRow();
}
return $aparam;
}
function Beli_Pending_Nomor1() {
global $db;
$tno = "BELI".$_SESSION['__WEB_APP']['SERVER_ID'].$_SESSION['__APP_INV']['CABANGID'].user_id(3)."#";
$ino = 0;
$db->Query("SELECT MAX(RIGHT(No_Beli,2)) Nomor FROM inv_beli_pend WHERE LEFT(No_Beli,".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", "view");
$mode_detail = Param::Get("mode_detail");
$id_cab = Param::Get("CabID", $_SESSION['__APP_INV']['CABANGID']);
$nomor = Param::Get("No_Beli", "");
$is_pend = (strpos($nomor,"BELI")===false) ? false : true;
if ( $data == "master" ) {
$ajson = ['error'=>"", 'html'=>""];
$atabel = ['No_Beli'=>$nomor];
if ($mode == "pending-edit") {
Pending_Edit($nomor);
$atabel = Beli_Data1($nomor);
$mode = "edit";
} else if ($mode == "pending-save") {
$b_baru = false;
if (substr($nomor,-3)=="#00") {
$b_baru = true;
$no_lama = $nomor;
$nomor = Beli_Pending_Nomor1();
Pending_Save($no_lama, $nomor);
}
$apending = [];
$db->Query("SELECT SUM(Qty*Harga_Beli) Beli,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_beli_pend");
$sql->add_param("No_Beli", $nomor);
$sql->add_param_date("Tgl_Beli");
$sql->add_param_date("Tgl_Faktur");
$sql->add_param("No_Faktur");
$sql->add_param("CabID");
$sql->add_param("SupID");
$sql->add_param("Total_Beli", $apending['Beli']);
$sql->add_param("Total_Diskon", $apending['Diskon']);
$sql->add_param("Total_Bulat");
$sql->add_param("Total_Hutang");
$sql->add_param_userid();
$sql->add_where("No_Beli", $nomor);
if ($b_baru) $sql->InsertDB();
else $sql->UpdateDB();
$atabel = Beli_Data1();
} else if ($mode == "pending-delete") {
Pending_Delete($nomor);
$db->Query("DELETE FROM inv_beli_pend WHERE No_Beli='".$nomor."'");
$atabel = Beli_Data1();
} else if ($mode == "add") {
$atabel = Beli_Data1("", true);
} else if ($mode == "edit") {
Detail_Copy($nomor, true);
$atabel = Beli_Data1($nomor);
} else if ($mode == "save") {
$no_lama = $nomor;
if ($is_pend) {
$nomor = Nomor_Baru("B", Param::Get("Tgl_Beli"), true);
if (substr($no_lama,-3)!="#00") $db->Query("DELETE FROM inv_beli_pend WHERE No_Beli='".$no_lama."'");
}
Detail_Save($nomor, 3, $id_cab, Param::Get("Tgl_Beli"), $is_pend, $no_lama);
$abeli = [];
$db->Query("SELECT SUM(Qty*Harga_Beli) Beli, SUM(Total_Diskon) Diskon FROM inv_detail WHERE No_Ref='".$nomor."'");
if ($db->Next()) $abeli = $db->AllRow();
$sql = new SQL($db);
$sql->set_table("inv_beli");
$sql->add_param_date("Tgl_Beli");
$sql->add_param_date("Tgl_Faktur");
$sql->add_param("No_Faktur");
$sql->add_param("CabID");
$sql->add_param("SupID");
$sql->add_param("Total_Beli", $abeli['Beli']);
$sql->add_param("Total_Diskon", $abeli['Diskon']);
$sql->add_param("Total_Bulat");
$sql->add_param("Total_Hutang");
$sql->add_param("Data_Beli", 1);
$sql->add_param_stamp();
$sql->add_param_userid();
$sql->add_where("No_Beli", $nomor);
$sql->UpdateDB();
Produk_Update($nomor, Param::Get("SupID"));
Update_Lunas_Sup(Param::Get("SupID"));
$atabel = Beli_Data1($nomor);
$mode = "view";
} else if ($mode == "cancel") {
if (substr($nomor,-3)=="#00" || substr($nomor,0,4)!="BELI") Detail_Cancel($nomor);
$atabel = Beli_Data1();
} else {
$atabel = Beli_Data1($nomor);
}
$enable = in_array($mode, ["add","edit"]) ? true : false;
$form = new Form($db);
$tnota = $form->textbox("_", "No_Beli", $atabel['No_Beli'], !$enable, true, "text", "nomor transaksi");
$tfaktur = $form->textbox("_", "No_Faktur", $atabel['No_Faktur'], $enable, true, "text", "nomor faktur");
$ttglnota = $form->datebox("_", "Tgl_Beli", $atabel['Tgl_Beli'], $enable, true);
$ttglfaktur = $form->datebox("_", "Tgl_Faktur", $atabel['Tgl_Faktur'], $enable, true);
$tcab = $form->option_db("_", "CabID", $atabel['CabID'], $enable, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY Nama_Cab", [0,"&nbsp;"]);
$tsup = $form->option_db("_", "SupID", $atabel['SupID'], $enable, false, "para_supplier", ["SupID","Nama_Sup"], "Aktif=1 ORDER BY Nama_Sup", [0,"&nbsp;"]);
$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_Beli">Nomor Transaksi</label>
<div class="col"><div class="input-group">'.$tnota.'<button id="butBrow" class="btn btn-info" type="button" onclick="BeliJS.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_Beli">Tanggal Transaksi</label>
<div class="col-sm-7 col-lg-5">'.$ttglnota.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-5 col-lg-3 col-form-label" for="Tgl_Faktur">Tanggal Faktur</label>
<div class="col-sm-7 col-lg-5">'.$ttglfaktur.'</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="SupID">Nama Supplier</label>
<div class="col">'.$tsup.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-5 col-lg-3 col-form-label" for="No_Faktur">Nomor Faktur</label>
<div class="col">'.$tfaktur.'</div>
</div>
</div>
</div>
<div class="row mb-1"><div class="col"><hr class="my-1"></div></div>
<input type="hidden" id="Total_Beli" value="'.$atabel['Total_Beli'].'" >
<input type="hidden" id="Total_Hutang" value="'.$atabel['Total_Hutang'].'" >
<input type="hidden" id="Total_Bulat" value="'.$atabel['Total_Bulat'].'" >
<input type="hidden" id="Lunas" value="'.$atabel['Lunas'].'" >
<input type="hidden" id="mode" value="'.$mode.'" >
';
} else if ( $data == "delete" ) {
if ($is_pend == false) {
$db->Query("DELETE FROM inv_beli WHERE No_Beli='".$nomor."'");
$db->Query("DELETE FROM inv_detail WHERE No_Ref='".$nomor."'");
} else {
$db->Query("DELETE FROM inv_beli_pend WHERE No_Beli='".$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->Row("Qty", 1) * $iqty;
$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);
$sql->add_param("Harga_Beli");
$sql->add_param("Disk_Rupiah");
$sql->add_param("Disk_Persen1");
$sql->add_param("Disk_Persen2");
$sql->add_param("Disk_Persen3");
$sql->add_param("Disk_Persen4");
$sql->add_param("Disk_Persen5");
$sql->add_param("Total_Diskon", "(Harga_Beli-((Harga_Beli-Disk_Rupiah)*((100.0-Disk_Persen1)/100)*((100.0-Disk_Persen2)/100)*((100.0-Disk_Persen3)/100)*((100.0-Disk_Persen4)/100)*((100.0-Disk_Persen5)/100)))*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);
if ( $mode_detail == "insert" ) {
$sql->InsertDB();
$_id = $sql->LastInsertID();
} else if ( $mode_detail == "update" ) {
$sql->UpdateDB();
} else if ( $mode_detail == "delete" ) {
$sql->DeleteDB();
}
}
$qview = ""; $qtabel = "inv_detail";
if ($is_pend) $qtabel = "tmp_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_Lengkap,P.Nama_Satuan,P.Harga_Jual,(D.Qty*D.Harga_Beli)-D.Total_Diskon Total 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->set_query_footer("SELECT SUM((D.Qty*D.Harga_Beli)-D.Total_Diskon) Total,SUM(D.Total_Diskon) Total_Diskon FROM (SELECT * FROM ".$qtabel." WHERE No_Ref='".$nomor."' ".$qview.") D");
$obj->add_field("ID", "No", "c");
$obj->add_field("InvID", "InvID", "hid");
$obj->add_field("SatuanID", "SatuanID", "hid");
$obj->add_field("Kode_SKU", "SKU", "c");
$obj->add_field("Nama_Lengkap", "Nama Barang", "awr");
$obj->add_field("Qty", "Qty", "r", "rupiah2");
$obj->add_field("Harga_Beli", "Harga @", "r", "rupiah");
$obj->add_field("Total_Diskon", "Diskon", "r", "rupiah", "rupiah");
$obj->add_field("Total", "Jumlah", "r", "rupiah", "rupiah");
$obj->set_field_order("ID", "A");
if (in_array($mode, ["add","edit"])) {
$obj->add_row_btn("clipboard", "Ubah", "BeliJS.detail_ubah");
$obj->add_row_btn("trash", "Hapus", "BeliJS.detail_hapus", "Unix", user_unix());
$obj->set_func_btn("BeliJS.detail_tambah", '<i class="bi-plus-lg me-1"></i> Produk');
$obj->set_func_btn("BeliJS.produk_brow", '<i class="bi-table me-1"></i> Browse');
}
$obj->set_func_btn("BeliJS.total_show", "Total");
$obj->set_func_navi("BeliJS.data_query('tabel-detail')");
$ajson[] = $obj->json_table("divDetailTabel");
$ntotal = 0;
$db->Query("SELECT SUM((D.Qty*D.Harga_Beli)-D.Total_Diskon) Jumlah FROM ".$qtabel." D WHERE D.No_Ref='".$nomor."' ".$qview);
if ($db->Next()) $ntotal = floatval($db->Row("Jumlah", 0));
$ajson[] = ['type'=>"form", 'id'=>"Total_Beli", 'value'=>$ntotal];
if (in_array($mode_detail, ["insert","update"])) {//WARNING: harga jual dibawah limit margin!!
$hbeli = 0;
$db->Query("SELECT CEIL((Harga_Beli-(Total_Diskon/Qty))/(Stok/Qty)) Pokok FROM tmp_inv_detail WHERE No_Ref='".$nomor."' AND ID='".$_id."'");
if ($db->Next()) $hbeli = $db->Row("Pokok", 0);
$db->Query("SELECT P.*,G.Margin FROM (SELECT Grup_InvID,Nama_Produk,CEIL(Harga_Jual/Qty) Harga_Jual FROM vi_inv_produk WHERE InvID='".Param::Get("InvID")."' AND Harga_Jual>0 ORDER BY Harga_Jual ASC LIMIT 1) P LEFT JOIN inv_produk_grup G ON (P.Grup_InvID=G.Grup_InvID)");
if ($db->Next()) {
if ($db->Row("Margin",0)>0) $hbeli += ($hbeli*($db->Row("Margin")/100));
if ($hbeli > $db->Row("Harga_Jual",0)) $ajson[] = ['type'=>"msg", 'mode'=>"error", 'wait'=>3000, 'value'=>"Produk \"".$db->Row("Nama_Produk")."\" Harga Beli telah melewati Margin / Harga Jual!"];
}
}
} else if ( $data == "brow-tx" ) {
$tcari = trim(Param::Get("Cari_TX"));
$tsql = ($tcari=="") ? "" : " CONCAT(B.No_Beli,B.No_Faktur,S.Nama_Sup,DATE_FORMAT(B.Tgl_Faktur,'%d-%m-%Y')) LIKE '%".$tcari."%'";
$obj = new Table($db);
$obj->set_table("(SELECT *,Total_Diskon+Total_Bulat Diskon FROM inv_beli WHERE Data_Beli=1) B LEFT JOIN para_supplier S ON (B.SupID=S.SupID)", "B.*,S.Nama_Sup", $tsql);
$obj->add_field("No_Beli", "No. Trans", "c");
$obj->add_field("Tgl_Faktur", "Tgl. Faktur", "c", "sqltgl", null, "val-tgl");
$obj->add_field("Nama_Sup", "Nama Supplier", "awr");
$obj->add_field("Total_Beli", "Sub. Total", "r", "rupiah");
$obj->add_field("Diskon", "Diskon", "r", "rupiah");
$obj->add_field("Total_Hutang", "Jumlah", "r", "rupiah");
$obj->set_field_order("No_Beli", "D");
$obj->add_row_btn("save", "Detail", "BeliJS.tx_select");
$obj->set_func_navi("BeliJS.data_query('brow-tx')");
$ajson[] = $obj->db_table("divBrowTX");
} else if ( $data == "brow-pending" ) {
$obj = new Table($db);
$obj->set_query("SELECT B.*,S.Nama_Sup FROM (SELECT *,Total_Diskon+Total_Bulat Diskon FROM inv_beli_pend WHERE UserID='".user_id()."') B LEFT JOIN para_supplier S ON (B.SupID=S.SupID)");
$obj->add_field("No_Beli", "No. Trans", "c");
$obj->add_field("Tgl_Beli", "Tgl. Pending", "c", "sqltgl", null, "val-tgl");
$obj->add_field("Nama_Sup", "Nama Supplier", "awr");
$obj->add_field("Total_Beli", "Sub. Total", "r", "rupiah");
$obj->add_field("Diskon", "Diskon", "r", "rupiah");
$obj->add_field("Total_Hutang", "Jumlah", "r", "rupiah");
$obj->set_field_order("No_Beli", "D");
$obj->add_row_btn("save", "Pilih", "BeliJS.pending_select");
if (user_level(1)) $obj->add_row_btn("trash", "Hapus", "BeliJS.pending_delete", "UserID", user_id());
$obj->set_func_navi("BeliJS.data_query('brow-pending')");
$ajson[] = $obj->json_table("divBrowPending");
} else if ( $data == "brow-produk" ) {
$tcari = trim(Param::Get("Cari_Produk"));
$tsql = ($tcari <> "") ? " AND P.Barcode_Nama LIKE '%".$tcari."%'": "";
$tsql .= (Param::Get("Filter_Browse")=="all") ? "" : " AND S.SupID='".Param::Get("SupID")."'";
$obj = new Table($db);
$obj->set_table("vi_inv_produk P LEFT JOIN inv_produk_sup S ON (P.InvID=S.InvID)", "P.*", "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("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", "BeliJS.produk_select");
$obj->set_func_navi("BeliJS.data_query('brow-produk')");
$ajson[] = $obj->db_table("divBrowProduk");
} else if ( $data == "auto-produk" ) {
$tcari = Param::Get("Auto_Query");
$ajson['autodata'] = [];
$bcode = 0; $arec = [];
// Cari by SKU
$db->Query("SELECT K.InvID,P.Nama_Produk,CONCAT(K.SatuanID,':',S.Nama_Satuan,':',P.Nama_Produk,' ',S.Nama_Satuan,':',CONVERT(K.Harga_Jual 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 K.InvID,P.Nama_Produk,CONCAT(K.SatuanID,':',S.Nama_Satuan,':',P.Nama_Produk,' ',S.Nama_Satuan,':',CONVERT(K.Harga_Jual 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.*,K.Kode_SKU,K.Harga_Jual,S.Nama_Satuan,CONCAT(K.SatuanID,':',S.Nama_Satuan,':',P.Nama_Produk,' ',S.Nama_Satuan,':',K.Harga_Jual) 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 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")), 'data'=>$db->Row("Data2"), 'bc'=>0];
}
}
} else if ($data == "detail-produk") {
$id = Param::Get("ID", 0); $atabel = ['ID'=>$id, 'InvID'=>Param::Get("InvID",0), 'SatuanID'=>Param::Get("SatuanID",0)];
if ($id > 0) {
$db->Query("SELECT * FROM tmp_inv_detail WHERE No_Ref='".$nomor."' AND ID='".$id."' LIMIT 1");
if ($db->Next()) $atabel = $db->AllRow();
}
if ($atabel['InvID']>0 && $atabel['SatuanID']>0) {
$db->Query("SELECT 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 nama produk");
$tqty = $form->textbox("_", "Qty", $atabel['Qty'], true, true, "double");
$tbeli = $form->textbox("_", "Harga_Beli", $atabel['Harga_Beli'], true, true, "double");
$tdisrp = $form->textbox("_", "Disk_Rupiah", $atabel['Disk_Rupiah'], true, true, "double");
$tdis1 = $form->textbox("_", "Disk_Persen1", $atabel['Disk_Persen1'], true, true, "double");
$tdis2 = $form->textbox("_", "Disk_Persen2", $atabel['Disk_Persen2'], true, true, "double");
$tdis3 = $form->textbox("_", "Disk_Persen3", $atabel['Disk_Persen3'], true, true, "double");
$tdis4 = $form->textbox("_", "Disk_Persen4", $atabel['Disk_Persen4'], true, true, "double");
$tdis5 = $form->textbox("_", "Disk_Persen5", $atabel['Disk_Persen5'], true, true, "double");
$ttot_dis = $form->textbox("_", "Total_Diskon", 0, false, false, "double");
$tjual = $form->textbox("_", "Harga_Jual", 0, false, false, "double");
$ttot = $form->textbox("_", "Jumlah", 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-2 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-2 col-form-label" for="Qty">Qty</label>
<div class="col-sm-4 col-lg-5"><div class="input-group">'.$tqty.$tsat.'</div></div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label" for="Harga_Beli">Harga (@)</label>
<div class="col-sm-4 col-lg-5">'.$tbeli.'</div>
<div class="col-sm-4 col-lg-5"><div class="input-group"><span class="input-group-text">Harga Jual @</span>'.$tjual.'</div></div>
</div>
<hr class="my-1">
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label" for="Disk_Rupiah">Diskon Rupiah</label>
<div class="col-sm-4 col-lg-5">'.$tdisrp.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label">Diskon Persen</label>
<div class="col-sm-4 col-lg-3"><div class="input-group"><span class="input-group-text">1</span>'.$tdis1.'<span class="input-group-text">%</span></div></div>
<div class="col-sm-4 col-lg-3"><div class="input-group"><span class="input-group-text">4</span>'.$tdis4.'<span class="input-group-text">%</span></div></div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label">&nbsp;</label>
<div class="col-sm-4 col-lg-3"><div class="input-group"><span class="input-group-text">2</span>'.$tdis2.'<span class="input-group-text">%</span></div></div>
<div class="col-sm-4 col-lg-3"><div class="input-group"><span class="input-group-text">5</span>'.$tdis5.'<span class="input-group-text">%</span></div></div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label">&nbsp;</label>
<div class="col-sm-4 col-lg-3"><div class="input-group"><span class="input-group-text">3</span>'.$tdis3.'<span class="input-group-text">%</span></div></div>
<div class="col-sm-4 col-lg-3">'.Form_Info("Silakan masukkan -10 pada Diskon 5, jika ada PPN.").'</div>
</div>
<hr class="my-1">
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label">Diskon</label>
<div class="col-sm-4 col-lg-5">'.$ttot_dis.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label">Total</label>
<div class="col-sm-4 col-lg-5">'.$ttot.'</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="mode_detail" value="'.$mode_detail.'" >
';
} else if ( $data == "detail-item" ) {
$ajson['data'] = "kosong";
$db->Query("SELECT D.* FROM inv_detail D LEFT JOIN inv_beli B ON (D.No_Ref=B.No_Beli) WHERE B.Data_Beli=1 AND D.InvID='".Param::Get("InvID")."' ORDER BY D.Tgl_Ref DESC LIMIT 1");
if ($db->Next()) $ajson = $db->AllRow();
if (Param::Get("SatuanID",0) <> $ajson['SatuanID']) {
$_bagi = 1;
$db->Query("SELECT A.Qty/B.Qty Bagi FROM (SELECT InvID,Qty FROM inv_produk_kemasan WHERE InvID=".Param::Get("InvID")." AND SatuanID=".$ajson['SatuanID']."' LIMIT 1) A LEFT JOIN (SELECT InvID,Qty FROM inv_produk_kemasan WHERE InvID=".Param::Get("InvID")." AND SatuanID='".Param::Get("SatuanID",0)."' LIMIT 1) B ON (A.InvID=B.InvID)");
if ($db->Next()) $_bagi = $db->Row("Bagi", 1);
$ajson['Harga_Beli'] /= $_bagi;
$ajson['Disk_Rupiah'] /= $_bagi;
}
} else if ($data == "detail-total") {
$form = new Form($db);
$tbulat = $form->textbox("_", "popTotal_Bulat", 0, true, false, "double");
$thutang = $form->textbox("_", "popTotal_Hutang", 0, true, false, "double");
$ajson['html'] = '
<div class="row mb-1">
<label class="col-sm-6 col-lg-4 col-form-label" for="popTotal_Bulat">Diskon Akhir<br>Pembulatan (+/-)</label>
<div class="col">'.$tbulat.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-6 col-lg-4 col-form-label" for="popTotal_Hutang">Total Hutang</label>
<div class="col">'.$thutang.'</div>
</div>
';
} 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 Pembelian</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-info mb-1 ms-2" id="butPendingBrow" type="button"><i class="bi-cloud me-2"></i>Pending</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-warning mb-1 ms-2" id="butPendingSimpan" type="button"><i class="bi-cloud-upload me-2"></i>Simpan Pending</button>
<button class="btn btn-success mb-1 ms-2" id="butSimpan" type="button"><i class="bi-save me-2"></i>Simpan</button>
</li>
</ul>
<div class="tab-content border border-top-0 p-3">
<div class="tab-pane fade active show" id="tx" role="tabpanel" aria-labelledby="tx-tab">
<div id="divTXMaster">&nbsp;</div>
<div id="divDetailTabel">&nbsp;</div>
</div>
</div>
</div></div>
</div>';
}
send_json($ajson);
?>
+253
View File
@@ -0,0 +1,253 @@
<?php
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/php/iss/beli_lunas.php
Desc. : PHP - Transaksi Pembayaran Pembelian
Created By : Siau Pheng ([email protected]).
Created Date : March 7th, 2011.
Last Modified : October 8th, 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\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_sup = Param::Get("SupID", 0);
$nomor = Param::Get("No_Beli", "");
if ( $data == "master" ) {
$ajson = ['error'=>"", 'html'=>""];
$atabel = ['SupID'=>0, 'Nama_Sup'=>"", 'Alamat_Sup'=>""];
$form = new Form($db);
$tsup = $form->textauto("_", "Nama_Sup", ['value'=>$atabel['SupID'],'text'=>$atabel['Nama_Sup']], true, false, "ketik nama supplier");
$tsupal = $form->textbox("_", "Alamat_Sup", $atabel['Alamat_Sup'], false, false, "text");
$ajson['html'] = '
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label" for="Nama_Sup">Nama Supplier</label>
<div class="col"><div class="input-group">'.$tsup.'<button id="butBrow" class="btn btn-info" type="button" onclick="BeliLunasJS.sup_brow();"><i class="bi-search"></i></button></div></div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label">Alamat Supplier</label>
<div class="col">'.$tsupal.'</div>
</div>
<div class="row"><div class="col"><hr class="my-1"></div></div>
<input type="hidden" id="SupID" value="0" >
<input type="hidden" id="Mode_Tampil" value="0" >
';
} else if ( $data == "tabel-nota" ) {
$tsql = (Param::Get("Mode_Tampil", 0)==1) ? "" : " AND Lunas=0";
$obj = new Table($db);
$obj->set_query("SELECT *,Total_Hutang-Total_Bayar-Total_Potong Sisa_Bayar,IF(Data_Beli=1,'B','R') Tipe FROM inv_beli WHERE SupID='".$id_sup."'".$tsql);
$obj->set_query_footer("SELECT SUM(Total_Hutang) Total_Hutang FROM inv_beli WHERE SupID='".$id_sup."'".$tsql);
$obj->add_field("Tipe", "Tipe", "hid");
$obj->add_field("No_Beli", "No. Trans", "c");
$obj->add_field("No_Faktur", "No. Faktur", "l");
$obj->add_field("Tgl_Faktur", "Tgl. Faktur", "c", "sqltgl", null, "val-tgl");
$obj->add_field("Total_Hutang", "Jumlah Faktur", "r", "rupiah", "rupiah");
$obj->add_field("Total_Bayar", "Bayar", "r", "rupiah");
$obj->add_field("Sisa_Bayar", "Sisa", "r", "rupiah", "rupiah");
if (Param::Get("Mode_Tampil", 0)==1) $obj->add_field("Lunas", "Lunas", "c", "checkbox");
$obj->set_field_order("No_Beli", "A");
$obj->add_row_btn("save", "Pilih", "BeliLunasJS.nota_select");
$obj->set_func_navi("BeliLunasJS.data_query('tabel-nota')");
$ajson[] = $obj->json_table("divTXNota");
} else if ( $data == "tabel-bayar" ) {
$lunas = Param::Get("Lunas", 0);
if (in_array($mode_detail, ["insert","delete"])) {
$sql = new SQL($db);
$sql->set_table("inv_beli_lunas");
$sql->add_param("No_Beli");
$sql->add_param_date("Tgl_Bayar");
$sql->add_param("Total_Bayar");
$sql->add_param("Total_Potong");
$sql->add_param_userid();
$sql->add_where("ID");
$sql->add_where("No_Beli", $nomor);
if ($mode_detail == "insert") {
$abeli = ['CabID'=>0, 'SupID'=>0];
$db->Query("SELECT CabID,SupID FROM inv_beli WHERE No_Beli='".$nomor."' LIMIT 1");
if ($db->Next()) $abeli = $db->AllRow();
$sql->add_param("CabID", $abeli['CabID']);
$sql->add_param("SupID", $abeli['SupID']);
$sql->InsertDB();
} else if ($mode_detail == "delete") {
$sql->DeleteDB();
}
$anota = ['Bayar'=>0, 'Potong'=>0, 'Total_Sisa'=>0, 'Lunas'=>0];
$db->Query("SELECT SUM(Total_Bayar) Bayar,SUM(Total_Potong) Potong FROM inv_beli_lunas WHERE No_Beli='".$nomor."'");
if ($db->Next()) $anota = $db->AllRow();
$db->Query("UPDATE inv_beli SET Total_Bayar='".$anota['Bayar']."',Total_Potong='".$anota['Potong']."',Lunas=IF(Total_Hutang-Total_Bayar-Total_Potong=0,1,0),Tgl_Lunas=IF(Lunas=1,'".tgl_sql2str(Param::Get("Tgl_Bayar"))."','0000-00-00') WHERE No_Beli='".$nomor."'");
$db->Query("SELECT Lunas,Total_Hutang-Total_Bayar-Total_Potong Total_Sisa FROM inv_beli WHERE No_Beli='".$nomor."'");
if ($db->Next()) $anota = $db->AllRow();
$lunas = $anota['Lunas'];
$ajson[] = array('type'=>"form", 'id'=>"Total_Sisa", 'value'=>$anota['Total_Sisa']);
$ajson[] = array('type'=>"form", 'id'=>"Lunas", 'value'=>$anota['Lunas']);
}
$obj = new Table($db);
$obj->set_query("SELECT * FROM inv_beli_lunas WHERE No_Beli='".$nomor."' ORDER BY ID");
$obj->add_field("ID", "ID", "hid");
$obj->add_field("Tgl_Bayar", "Tgl. Bayar", "c", "sqltgl", null, "val-tgl");
$obj->add_field("Total_Bayar", "Jumlah Bayar", "r", "rupiah");
$obj->add_field("Total_Potong", "Pemotongan", "r", "rupiah");
$obj->set_field_order("Tgl_Bayar", "A");
if ($_SESSION['__WEB_USER']['Level']==0 && ($lunas==0 || ($lunas==1 && Param::Get('Mode_Tampil',0)==1))) {
$obj->add_row_btn("trash", "Hapus", "BeliLunasJS.bayar_hapus", "No_Beli", $nomor);
}
if ($lunas == 0) {
$obj->set_func_btn("BeliLunasJS.bayar_show", '<i class="bi-wallet me-1"></i> Pembayaran');
}
$obj->set_func_navi("BeliLunasJS.data_query('tabel-bayar')");
$ajson[] = $obj->json_table("divDetailBayar");
} else if ( $data == "brow-sup" ) {
$tcari = trim(Param::Get("Cari_Sup"));
$tsql = ($tcari=="") ? " LIMIT 100" : " AND CONCAT(Kode_Sup,Nama_Sup,Telp_Sup) LIKE '%".$tcari."%'";
$obj = new Table($db);
$obj->set_query("SELECT * FROM para_supplier WHERE Aktif=1".$tsql);
$obj->add_field("SupID", "ID", "hid");
$obj->add_field("Kode_Sup", "Kode", "l");
$obj->add_field("Nama_Sup", "Nama Supplier", "awr");
$obj->add_field("Telp_Sup", "Telp", "l");
$obj->add_field("Alamat_Sup", "Alamat", "hid");
$obj->set_field_order("Kode_Sup", "A");
$obj->add_row_btn("save", "Pilih", "BeliLunasJS.sup_select");
$obj->set_func_navi("BeliLunasJS.data_query('brow-sup')");
$ajson[] = $obj->json_table("divBrowSup");
} else if ( $data == "auto-sup" ) {
$tcari = Param::Get("Auto_Query");
$ajson['autodata'] = [];
if (is_string($tcari) && strlen($tcari) < 64) {
$db->Query("SELECT * FROM para_supplier WHERE Aktif=1 AND CONCAT(Kode_Sup,Nama_Sup,Telp_Sup) LIKE '%".$tcari."%' ORDER BY Kode_Sup LIMIT 50");
while ($db->Next()) {
$ajson['autodata'][] = ['value'=>$db->Row("SupID"), 'text'=>$db->Row("Nama_Sup"), 'data'=>$db->Row("Alamat_Sup")];
}
}
} else if ($data == "detail-nota") {
$atabel = ['No_Beli'=>$nomor]; $tipe = Param::Get("Tipe_Nota", "B");
$db->Query("SELECT *,Total_Hutang-Total_Bayar-Total_Potong Sisa_Bayar FROM inv_beli WHERE No_Beli='".$nomor."'");
if ($db->Next()) $atabel = $db->AllRow();
$form = new Form($db);
$tnota = $form->textbox("_", "No_Beli", $atabel['No_Beli'], false, false, "text");
$tfaktur = $form->textbox("_", "No_Faktur", $atabel['No_Faktur'], false, false, "text");
$ttglnota = $form->datebox("_", "Tgl_Beli", $atabel['Tgl_Beli'], false, false);
$ttglfaktur = $form->datebox("_", "Tgl_Faktur", $atabel['Tgl_Faktur'], false, false);
$tjumlah = $form->textbox("_", "Total_Hutang", $atabel['Total_Hutang'], false, false, "double");
$tbayar = $form->textbox("_", "Total_Bayar2", $atabel['Total_Bayar'], false, false, "double");
$tsisa = $form->textbox("_", "Total_Sisa", $atabel['Sisa_Bayar'], false, false, "double");
$ajson['html'] = '
<div class="row mb-1">
<div class="col text-center fs-5 pb-1">Informasi Faktur / Retur</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label">No. '.(($tipe=="B")?"Transaksi":"Retur").'</label>
<div class="col-sm-8 col-lg-4">'.$tnota.'</div>
<label class="col-sm-4 col-lg-2 col-form-label">Jumlah '.(($tipe=="B")?"Faktur":"Retur").'</label>
<div class="col-sm-8 col-lg-4">'.$tjumlah.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label">'.(($tipe=="B")?"No. Faktur":"Catatan").'</label>
<div class="col-sm-8 col-lg-4">'.$tfaktur.'</div>
<label class="col-sm-4 col-lg-2 col-form-label">Jumlah Bayar</label>
<div class="col-sm-8 col-lg-4">'.$tbayar.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label">Tgl. '.(($tipe=="B")?"Transaksi":"Retur").'</label>
<div class="col-sm-8 col-lg-4">'.$ttglnota.'</div>
<label class="col-sm-4 col-lg-2 col-form-label">Sisa Hutang</label>
<div class="col-sm-8 col-lg-4">'.$tsisa.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label">Tgl. Faktur</label>
<div class="col-sm-8 col-lg-4">'.$ttglfaktur.'</div>
</div>
<div class="row"><div class="col"><hr class="my-1"></div></div>
<input type="hidden" id="Total_Sisa" value="'.$atabel['Sisa_Bayar'].'" >
<input type="hidden" id="Lunas" value="'.$atabel['Lunas'].'" >
<input type="hidden" id="Tipe_Nota" value="'.$tipe.'" >
';
} else if ($data == "detail-bayar") {
$form = new Form($db);
$ttglbyr = $form->datebox("_", "Tgl_Bayar", tgl_ymd(), true, false);
$ttotal = $form->textbox("_", "Temp_Total", Param::Get("Total_Sisa",0), false, false, "double");
$tsisa = $form->textbox("_", "Temp_Sisa", 0, false, false, "double");
$tbayar = $form->textbox("_", "Total_Bayar", Param::Get("Total_Sisa",0), true, false, "double", null, null, null, "BeliLunasJS.Hitung_Detail();");
$tpotong = $form->textbox("_", "Total_Potong", 0, true, false, "double", null, null, null, "BeliLunasJS.Hitung_Detail();");
$ajson['html'] = '
<div class="row mb-1">
<label class="col-sm-6 col-lg-4 col-form-label" for="Tgl_Bayar">Tanggal Bayar</label>
<div class="col-sm-8 col-lg-6">'.$ttglbyr.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-6 col-lg-4 col-form-label">Total Faktur</label>
<div class="col">'.$ttotal.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-6 col-lg-4 col-form-label" for="Total_Bayar">Jumlah Bayar</label>
<div class="col">'.$tbayar.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-6 col-lg-4 col-form-label" for="Total_Potong">Potongan</label>
<div class="col">'.$tpotong.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-6 col-lg-4 col-form-label">Sisa Tagihan</label>
<div class="col">'.$tsisa.'</div>
</div>
';
} 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 Pembayaran Hutang</button>
</li>
<li class="nav-item ms-auto">
<button class="btn btn-secondary mb-1 ms-2" id="butMode" type="button"><i class="bi-list me-2"></i>Normal</button>
<button class="btn btn-danger mb-1 ms-2" id="butBatal" type="button"><i class="bi-x-lg me-2"></i>Batal</button>
</li>
</ul>
<div class="tab-content border border-top-0 p-3">
<div class="tab-pane fade active show" id="tx" role="tabpanel" aria-labelledby="tx-tab">
<div id="divTXMaster">&nbsp;</div>
<div id="divTXNota">&nbsp;</div>
<div id="divDetailNota" class="d-none">&nbsp;</div>
<div id="divDetailBayar" class="d-none">&nbsp;</div>
</div>
</div>
</div></div>
</div>';
}
send_json($ajson);
?>
+208
View File
@@ -0,0 +1,208 @@
<?php
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/php/iss/beli_lunas_sup.php
Desc. : PHP - Transaksi Pelunasan Pembelian / Supplier
Created By : Siau Pheng ([email protected]).
Created Date : March 7th, 2011.
Last Modified : December 11th, 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\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_sup = Param::Get("SupID", 0);
if ( $data == "master" ) {
if ($mode == "cancel") {
$db->Query("DELETE FROM tmp_inv_beli_lunas WHERE UserID='".user_id()."'");
}
$ajson = ['error'=>"", 'html'=>""];
$form = new Form($db);
$tsup = $form->textauto("_", "Nama_Sup", ['value'=>0,'text'=>""], true, false, "ketik nama supplier");
$tsupal = $form->textbox("_", "Alamat_Sup", "", false, false, "text");
$ttglbyr = $form->datebox("_", "Tgl_Bayar", tgl_ymd(), true, false);
$tdisp = $form->textbox("_", "Disp_Bayar", 0, false, false, "double");
$ajson['html'] = '
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label" for="Nama_Sup">Nama Supplier</label>
<div class="col-sm-8 col-lg-4"><div class="input-group">'.$tsup.'<button id="butBrow" class="btn btn-info" type="button" onclick="BeliLunasSupJS.sup_brow();"><i class="bi-search"></i></button></div></div>
<label class="col-sm-4 col-lg-2 col-form-label" for="Tgl_Bayar">Tanggal Bayar</label>
<div class="col-sm-4 col-lg-2">'.$ttglbyr.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label">Alamat Supplier</label>
<div class="col">'.$tsupal.'</div>
<label class="col-sm-4 col-lg-2 col-form-label">Total Pembayaran</label>
<div class="col">'.$tdisp.'</div>
</div>
<div class="row"><div class="col"><hr class="my-1"></div></div>
<input type="hidden" id="SupID" value="0" >';
} else if ( $data == "tabel-nota" ) {
if ($mode_detail == "update") {
$no_beli = Param::Get("No_Beli");
$bayar = Param::Get("Jumlah_Bayar", 0);
$potong = Param::Get("Jumlah_Potong", 0);
$abeli = ['CabID'=>0, 'SupID'=>$id_sup];
$db->Query("SELECT * FROM inv_beli WHERE No_Beli='".$no_beli."' LIMIT 1");
if ($db->Next()) $abeli = $db->AllRow();
$db->Query("REPLACE INTO tmp_inv_beli_lunas (No_Beli,CabID,SupID,Jumlah_Bayar,Jumlah_Potong,UserID,Unix) VALUES ('".$no_beli."','".$abeli['CabID']."','".$abeli['SupID']."','".$bayar."','".$potong."','".user_id()."','".user_unix()."')");
}
$obj = new Table($db);
$obj->set_query("SELECT B.*,L.Bayar,L.Potong,B.Sisa_Faktur-IF(ISNULL(L.Bayar2),0,L.Bayar2) Jumlah_Sisa FROM (SELECT *,Total_Bayar+Total_Potong Total_Bayar2,Total_Hutang-Total_Bayar-Total_Potong Sisa_Faktur FROM inv_beli WHERE SupID='".$id_sup."' AND Lunas=0) B LEFT JOIN (SELECT No_Beli,Jumlah_Potong Potong,Jumlah_Bayar Bayar,(Jumlah_Bayar+Jumlah_Potong) Bayar2 FROM tmp_inv_beli_lunas WHERE UserID='".user_id()."' AND Unix='".user_unix()."') L ON (B.No_Beli=L.No_Beli)");
$obj->set_query_footer("SELECT SUM(B.Sisa_Faktur) Sisa_Faktur,SUM(L.Bayar) Bayar,SUM(L.Potong) Potong,SUM(B.Sisa_Faktur-IF(ISNULL(L.Bayar2),0,L.Bayar2)) Jumlah_Sisa FROM (SELECT No_Beli,Total_Hutang-Total_Bayar-Total_Potong Sisa_Faktur FROM inv_beli WHERE SupID='".$id_sup."' AND Lunas=0) B LEFT JOIN (SELECT No_Beli,Jumlah_Bayar Bayar,Jumlah_Potong Potong,(Jumlah_Bayar+Jumlah_Potong) Bayar2 FROM tmp_inv_beli_lunas WHERE UserID='".user_id()."' AND Unix='".user_unix()."') L ON (B.No_Beli=L.No_Beli)");
$obj->add_field("No_Beli", "No. Trans", "c");
$obj->add_field("No_Faktur", "No. Faktur", "l");
$obj->add_field("Tgl_Faktur", "Tgl. Faktur", "c", "sqltgl", null, "val-tgl");
$obj->add_field("Total_Hutang", "Hutang", "hid", "rupiah");
$obj->add_field("Total_Bayar2", "Bayar", "hid", "rupiah");
$obj->add_field("Sisa_Faktur", "Sub. Total", "r", "rupiah", "rupiah");
$obj->add_field("Bayar", "Pembayaran", "r", "rupiah", "rupiah");
$obj->add_field("Potong", "Pemotongan", "r", "rupiah", "rupiah");
$obj->add_field("Jumlah_Sisa", "Sisa Hutang", "r", "rupiah", "rupiah");
$obj->set_field_order("No_Beli", "A");
$obj->add_row_btn("wallet", "Bayar", "BeliLunasSupJS.bayar_tampil");
$obj->set_func_navi("BeliLunasSupJS.data_query('tabel-nota')");
$ajson[] = $obj->json_table("divTXNota");
$tot_bayar = 0;
$db->Query("SELECT SUM(Jumlah_Bayar) Bayar FROM tmp_inv_beli_lunas WHERE UserID='".user_id()."' AND Unix='".user_unix()."' AND No_Beli IN (SELECT No_Beli FROM inv_beli WHERE SupID='".$id_sup."' AND Lunas=0)");
if ($db->Next()) $tot_bayar = $db->Row("Bayar", 0);
$ajson[] = ['type'=>"form", 'id'=>"Disp_Bayar", 'value'=>rupiah($tot_bayar)];
} else if ( $data == "brow-sup" ) {
$tcari = trim(Param::Get("Cari_Sup"));
$tsql = ($tcari=="") ? " LIMIT 100" : " AND CONCAT(Kode_Sup,Nama_Sup,Telp_Sup) LIKE '%".$tcari."%'";
$obj = new Table($db);
$obj->set_query("SELECT * FROM para_supplier WHERE Lunas>0".$tsql);
$obj->add_field("SupID", "ID", "hid");
$obj->add_field("Kode_Sup", "Kode", "l");
$obj->add_field("Nama_Sup", "Nama Supplier", "awr");
$obj->add_field("Telp_Sup", "Telp", "l");
$obj->add_field("Alamat_Sup", "Alamat", "hid");
$obj->set_field_order("Kode_Sup", "A");
$obj->add_row_btn("save", "Pilih", "BeliLunasSupJS.sup_select");
$obj->set_func_navi("BeliLunasSupJS.data_query('brow-sup')");
$ajson[] = $obj->json_table("divBrowSup");
} else if ( $data == "auto-sup" ) {
$tcari = Param::Get("Auto_Query");
$ajson['autodata'] = [];
if (is_string($tcari) && strlen($tcari) < 64) {
$db->Query("SELECT * FROM para_supplier WHERE Lunas>0 AND CONCAT(Kode_Sup,Nama_Sup,Telp_Sup) LIKE '%".$tcari."%' ORDER BY Kode_Sup LIMIT 50");
while ($db->Next()) {
$ajson['autodata'][] = ['value'=>$db->Row("SupID"), 'text'=>$db->Row("Nama_Sup"), 'data'=>$db->Row("Alamat_Sup")];
}
}
} else if ($data == "detail-bayar") {
$form = new Form($db);
$tnota = $form->textbox("_", "No_Beli", "", false, false, "text");
$tfaktur = $form->textbox("_", "No_Faktur", "", false, false, "text");
$ttglfaktur = $form->datebox("_", "Tgl_Faktur", "", false, false);
$tsbayar = $form->textbox("_", "SBayar", 0, false, false, "double");
$tjfaktur = $form->textbox("_", "Jumlah_Faktur", 0, false, false, "double");
$tjbayar = $form->textbox("_", "Jumlah_Bayar", 0, true, false, "double");
$tjpotong = $form->textbox("_", "Jumlah_Potong", 0, true, false, "double");
$tsisa = $form->textbox("_", "Sisa_Bayar", 0, false, false, "double");
$tsfaktur = $form->textbox("_", "Faktur", 0, false, false, "double");
$ajson['html'] = '
<div class="row mb-1">
<label class="col-sm-6 col-lg-4 col-form-label">No. Transaksi</label>
<div class="col">'.$tnota.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-6 col-lg-4 col-form-label">No. Faktur</label>
<div class="col">'.$tfaktur.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-6 col-lg-4 col-form-label">Tanggal Faktur</label>
<div class="col-sm-8 col-lg-6">'.$ttglfaktur.'</div>
</div>
<div class="row"><div class="col"><hr class="my-1"></div></div>
<div class="row mb-1">
<label class="col-sm-6 col-lg-4 col-form-label">Nilai Faktur</label>
<div class="col">'.$tsfaktur.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-6 col-lg-4 col-form-label">Pembayaran Sebelumnya</label>
<div class="col">'.$tsbayar.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-6 col-lg-4 col-form-label">Sub. Total</label>
<div class="col">'.$tjfaktur.'</div>
</div>
<div class="row"><div class="col"><hr class="my-1"></div></div>
<div class="row mb-1">
<label class="col-sm-6 col-lg-4 col-form-label" for="Jumlah_Bayar">Pembayaran Sekarang</label>
<div class="col">'.$tjbayar.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-6 col-lg-4 col-form-label" for="Jumlah_Potong">Pemotongan Sekarang</label>
<div class="col">'.$tjpotong.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-6 col-lg-4 col-form-label">Sisa Faktur</label>
<div class="col">'.$tsisa.'</div>
</div>
<input type="hidden" id="mode_detail" value="update" >';
} else if ( $data == "proses-bayar" ) {
$tgl_bayar = tgl_sql2str(Param::Get("Tgl_Bayar"));
$alist = [];
$db->Query("SELECT No_Beli,CabID,SupID,Jumlah_Bayar,Jumlah_Potong FROM tmp_inv_beli_lunas WHERE UserID='".user_id()."' AND Unix='".user_unix()."' AND No_Beli IN (SELECT No_Beli FROM inv_beli WHERE SupID='".$id_sup."' AND Lunas=0)");
while ($db->Next()) $alist[] = $db->AllRow();
foreach ($alist as $_key => $_val) {
$db->Query("INSERT INTO inv_beli_lunas SET No_Beli='".$_val['No_Beli']."',CabID='".$_val['CabID']."',SupID='".$_val['SupID']."',Tgl_Bayar='".$tgl_bayar."',Total_Bayar='".$_val['Jumlah_Bayar']."',Total_Potong='".$_val['Jumlah_Potong']."',UserID='".user_id()."'");
$db->Query("UPDATE inv_beli B,(SELECT No_Beli,MAX(Tgl_Bayar) Tgl_Lunas,SUM(Total_Bayar) Total_Bayar,SUM(Total_Potong) Total_Potong FROM inv_beli_lunas WHERE No_Beli='".$_val['No_Beli']."') L SET B.Total_Bayar=L.Total_Bayar,B.Total_Potong=L.Total_Potong,B.Lunas=IF(B.Total_Hutang-B.Total_Bayar-B.Total_Potong=0,1,0),B.Tgl_Lunas=IF(B.Lunas=1,L.Tgl_Lunas,'0000-00-00') WHERE B.No_Beli=L.No_Beli AND B.No_Beli='".$_val['No_Beli']."'");
$db->Query("DELETE FROM tmp_inv_beli_lunas WHERE No_Beli='".$_val['No_Beli']."'");
}
Update_Lunas_Sup($id_sup);
} 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 Pembayaran Hutang / Supplier</button>
</li>
<li class="nav-item ms-auto">
<button class="btn btn-danger mb-1 ms-2" id="butBatal" type="button"><i class="bi-x-lg me-2"></i>Batal</button>
<button class="btn btn-success mb-1 ms-2" id="butSimpan" type="button"><i class="bi-save me-2"></i>Simpan</button>
</li>
</ul>
<div class="tab-content border border-top-0 p-3">
<div class="tab-pane fade active show" id="tx" role="tabpanel" aria-labelledby="tx-tab">
<div id="divTXMaster">&nbsp;</div>
<div id="divTXNota">&nbsp;</div>
</div>
</div>
</div></div>
</div>';
}
send_json($ajson);
?>
+316
View File
@@ -0,0 +1,316 @@
<?php
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/php/iss/beli_retur.php
Desc. : PHP - Transaksi Retur Pembelian
Created By : Siau Pheng ([email protected]).
Created Date : May 22th, 2010.
Last Modified : October 10th, 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_Beli", "");
if ( $data == "master" ) {
$ajson = ['error'=>"", 'html'=>""];
$atabel = ['No_Beli'=>$nomor, 'CabID'=>$id_cab];
if ($mode == "add") {
$atabel['No_Beli'] = "TR-BARU#".$_SESSION['__WEB_APP']['SERVER_ID'].user_id(3);
$atabel['Tgl_Beli'] = 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("R", Param::Get("Tgl_Beli"), true);
Detail_Save($nomor, 4, $id_cab, Param::Get("Tgl_Beli"), $b_baru, $no_lama);
$tot_retur = 0;
$db->Query("SELECT SUM(Qty*Harga_Beli) Retur_Beli FROM inv_detail WHERE No_Ref='".$nomor."'");
if ($db->Next()) $tot_retur = $db->RowFloat("Retur_Beli", 0);
$sql = new SQL($db);
$sql->set_table("inv_beli");
$sql->add_param_date("Tgl_Beli");
$sql->add_param("CabID");
$sql->add_param("SupID");
$sql->add_param("Total_Beli", $tot_retur);
$sql->add_param("Total_Hutang", $tot_retur);
$sql->add_param("No_Faktur");
$sql->add_param("Tgl_Faktur", "Tgl_Beli", true);
$sql->add_param("Data_Beli", 0);
$sql->add_param_stamp();
$sql->add_param_userid();
$sql->add_where("No_Beli", $nomor);
$sql->UpdateDB();
Update_Lunas_Sup(Param::Get("SupID"));
$mode = "view";
} else if ($mode == "cancel") {
Detail_Cancel($nomor);
$mode = "view";
$nomor = ""; $atabel['No_Beli'] = "";
}
if ($nomor <> "" && $mode <> "cancel") {
$db->Query("SELECT * FROM inv_beli WHERE Data_Beli=0 AND No_Beli='".$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_Beli", $atabel['No_Beli'], !$enable, false, "text", "nomor transaksi");
$ttgl = $form->datebox("_", "Tgl_Beli", $atabel['Tgl_Beli'], $enable, false);
$tcab = $form->option_db("_", "CabID", $atabel['CabID'], $enable, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID", [0,"&nbsp;"]);
$tsup = $form->option_db("_", "SupID", $atabel['SupID'], $enable, false, "para_supplier", ["SupID","Nama_Sup"], "Aktif=1 ORDER BY Nama_Sup", [0,"&nbsp;"]);
$tcatat = $form->textbox("_", "No_Faktur", $atabel['No_Faktur'], $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_Beli">Nomor Transaksi</label>
<div class="col"><div class="input-group">'.$tnota.'<button id="butBrow" class="btn btn-info" type="button" onclick="BeliReturJS.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_Beli">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="SupID">Nama Supplier</label>
<div class="col">'.$tsup.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-5 col-lg-3 col-form-label" for="No_Faktur">Catatan</label>
<div class="col">'.$tcatat.'</div>
</div>
</div>
</div>
<hr class="my-1">
<input type="hidden" id="Lunas" value="'.$atabel['Lunas'].'" >
<input type="hidden" id="mode" value="'.$mode.'" >';
} else if ( $data == "delete" ) {
$db->Query("DELETE FROM inv_beli WHERE No_Beli='".$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)) * -1; $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 *,-Qty Qty2,(-Qty*Harga_Beli) Total 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->set_query_footer("SELECT SUM(D.Total) Total FROM (SELECT (-Qty*Harga_Beli) Total FROM ".$qtabel." WHERE No_Ref='".$nomor."'".$qview.") D");
$obj->add_field("ID", "ID", "hid");
$obj->add_field("InvID", "InvID", "hid");
$obj->add_field("SatuanID", "SatuanID", "hid");
$obj->add_field("Kode_SKU", "SKU", "c");
$obj->add_field("Nama_Produk", "Nama Barang", "awr");
$obj->add_field("Qty2", "Qty", "r", "rupiah2");
$obj->add_field("Harga_Beli", "Harga @", "r", "rupiah2");
$obj->add_field("Total", "Jumlah", "r", "rupiah2", "rupiah2");
$obj->set_field_order("Kode_SKU", "A");
if (in_array($mode, ["add","edit"])) {
$obj->add_row_btn("clipboard", "Ubah", "BeliReturJS.detail_ubah");
$obj->add_row_btn("trash", "Hapus", "BeliReturJS.detail_hapus", "Unix", user_unix());
$obj->set_func_btn("BeliReturJS.detail_tambah", '<i class="bi-plus-lg me-1"></i> Barang');
$obj->set_func_btn("BeliReturJS.produk_brow", '<i class="bi-table me-1"></i> Browse');
}
$obj->set_func_navi("BeliReturJS.data_query('tabel-detail')");
$ajson[] = $obj->json_table("divDetailTabel");
} else if ( $data == "brow-tx" ) {
$tcari = trim(Param::Get("Cari_TX"));
$tsql = ($tcari=="") ? " LIMIT 100" : " WHERE CONCAT(B.No_Beli,S.Nama_Sup,DATE_FORMAT(B.Tgl_Beli,'%d-%m-%Y')) LIKE '%".$tcari."%'";
$obj = new Table($db);
$obj->set_query("SELECT B.*,S.Nama_Sup FROM (SELECT * FROM inv_beli WHERE Data_Beli=0) B LEFT JOIN para_supplier S ON (B.SupID=S.SupID)".$tsql);
$obj->add_field("No_Beli", "No. Transaksi", "c");
$obj->add_field("Tgl_Beli", "Tgl. Transaksi", "c", "sqltgl", null, "val-tgl");
$obj->add_field("Nama_Sup", "Nama Supplier", "awr");
$obj->add_field("Total_Hutang", "Total", "r", "rupiah2");
$obj->set_field_order("No_Beli", "D");
$obj->add_row_btn("save", "Pilih", "BeliReturJS.tx_select");
$obj->set_func_navi("BeliReturJS.data_query('brow-tx')");
$ajson[] = $obj->json_table("divBrowTX");
} else if ( $data == "brow-produk" ) {
$tcari = trim(Param::Get("Cari_Produk"));
$tsql = ($tcari <> "") ? " AND P.Barcode_Nama LIKE '%".$tcari."%'": "";
$tsql .= (Param::Get("Filter_Browse")=="all") ? "" : " AND S.SupID='".Param::Get("SupID")."'";
$obj = new Table($db);
$obj->set_table("vi_inv_produk P LEFT JOIN inv_produk_sup S ON (P.InvID=S.InvID)", "P.*", "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("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", "BeliReturJS.produk_select");
$obj->set_func_navi("BeliReturJS.data_query('brow-produk')");
$ajson[] = $obj->db_table("divBrowProduk");
} else if ( $data == "auto-produk" ) {
$tcari = Param::Get("Auto_Query");
$ajson['autodata'] = [];
$bcode = 0; $arec = [];
// Cari by SKU
$db->Query("SELECT K.InvID,P.Nama_Produk,CONCAT(K.SatuanID,':',S.Nama_Satuan,':',P.Nama_Produk,' ',S.Nama_Satuan,':',CONVERT(K.Harga_Jual 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 K.InvID,P.Nama_Produk,CONCAT(K.SatuanID,':',S.Nama_Satuan,':',P.Nama_Produk,' ',S.Nama_Satuan,':',CONVERT(K.Harga_Jual 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.*,K.Kode_SKU,K.Harga_Jual,S.Nama_Satuan,CONCAT(K.SatuanID,':',S.Nama_Satuan,':',P.Nama_Produk,' ',S.Nama_Satuan,':',K.Harga_Jual) 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 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")), '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")];
if ($id > 0) {
$db->Query("SELECT * FROM tmp_inv_detail WHERE No_Ref='".$nomor."' AND ID='".$id."' LIMIT 1");
if ($db->Next()) $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");
$tbeli = $form->textbox("_", "Harga_Beli", $atabel['Harga_Beli'], true, true, "double");
$tsat = $form->textbox("_", "Nama_Satuan", $atabel['Nama_Satuan'], false, false, "text");
$ttot = $form->textbox("_", "Jumlah", 0, false, false, "double");
$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" for="Qty">Qty</label>
<div class="col-sm-4 col-lg-5"><div class="input-group">'.$tqty.$tsat.'</div></div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Harga_Beli">Harga (@)</label>
<div class="col-sm-4 col-lg-5">'.$tbeli.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label">Total</label>
<div class="col-sm-4 col-lg-5">'.$ttot.'</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="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 Retur Pembelian</button>
</li>
<li class="nav-item ms-auto">
<button class="btn btn-primary mb-1 ms-2" id="butTambah" type="button"><i class="bi-plus-lg me-2"></i>Tambah</button>
<button class="btn btn-info mb-1 ms-2" id="butUbah" type="button"><i class="bi-clipboard me-2"></i>Ubah</button>
<button class="btn btn-warning mb-1 ms-2" id="butHapus" type="button"><i class="bi-trash me-2"></i>Hapus</button>
<button class="btn btn-secondary mb-1 ms-2" id="butPrint" type="button"><i class="bi-printer me-2"></i>Cetak</button>
<button class="btn btn-danger mb-1 ms-2" id="butBatal" type="button"><i class="bi-x-lg me-2"></i>Batal</button>
<button class="btn btn-success mb-1 ms-2" id="butSimpan" type="button"><i class="bi-save me-2"></i>Simpan</button>
</li>
</ul>
<div class="tab-content border border-top-0 p-3">
<div class="tab-pane fade active show" id="tx" role="tabpanel" aria-labelledby="tx-tab">
<div id="divTXMaster">&nbsp;</div>
<div id="divDetailTabel">&nbsp;</div>
</div>
</div>
</div></div>
</div>';
}
send_json($ajson);
?>
+140
View File
@@ -0,0 +1,140 @@
<?php
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/php/iss/cekharga.php
Desc. : PHP - Informasi Barang & Harga Jual
Created By : Siau Pheng ([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);
?>
+307
View File
@@ -0,0 +1,307 @@
<?php
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/php/iss/mutasi.php
Desc. : PHP - Transaksi Mutasi Stok Cabang
Created By : Siau Pheng ([email protected]).
Created Date : February 28th, 2011.
Last Modified : December 10th, 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\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_dari = Param::Get("Dari_CabID", 0);
$id_cab_ke = Param::Get("Ke_CabID", 0);
$nomor = Param::Get("No_Mutasi", "");
if ( $data == "master" ) {
$ajson = ['error'=>"", 'html'=>""];
$atabel = ['No_Mutasi'=>$nomor];
if ($mode == "add") {
$atabel['No_Mutasi'] = "MU-BARU#".$_SESSION['__WEB_APP']['SERVER_ID'].user_id(3);
$atabel['Tgl_Mutasi'] = tgl_ymd();
$atabel['Dari_CabID'] = $_SESSION['__APP_INV']['CABANGID'];
$atabel['Ke_CabID'] = 0;
$nomor = "";
} else if ($mode == "edit") {
Detail_Copy($nomor, false, true);
} else if ($mode == "save") {
$no_lama = $nomor;
$b_baru = (strpos($no_lama,"BARU")===false) ? false : true;
if ($b_baru) $nomor = Nomor_Baru("M", Param::Get("Tgl_Mutasi"), true);
Detail_Save($nomor, 2, $id_cab_ke, Param::Get("Tgl_Mutasi"), $b_baru, $no_lama, true, $id_cab_dari);
$tot_mutasi = 0;
$db->Query("SELECT SUM(Qty*Harga_Beli) Beli FROM inv_detail WHERE No_Ref='".$nomor."' AND Qty>0");
if ($db->Next()) $tot_mutasi = $db->RowFloat("Beli", 0);
$sql = new SQL($db);
$sql->set_table("inv_mutasi");
$sql->add_param_date("Tgl_Mutasi");
$sql->add_param("Dari_CabID");
$sql->add_param("Ke_CabID");
$sql->add_param("Total_Mutasi", $tot_mutasi);
$sql->add_param("Catatan");
$sql->add_param_userid();
$sql->add_where("No_Mutasi", $nomor);
$sql->UpdateDB();
$mode = "view";
} else if ($mode == "cancel") {
Detail_Cancel($nomor);
$mode = "view";
$nomor = ""; $atabel['No_Mutasi'] = "";
}
if ($nomor <> "" && $mode <> "cancel") {
$db->Query("SELECT * FROM inv_mutasi WHERE No_Mutasi='".$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_Mutasi", $atabel['No_Mutasi'], !$enable, false, "text", "nomor transaksi");
$ttgl = $form->datebox("_", "Tgl_Mutasi", $atabel['Tgl_Mutasi'], $enable, false);
$tcab1 = $form->option_db("_", "Dari_CabID", $atabel['Dari_CabID'], $enable, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID", [0,"&nbsp;"]);
$tcab2 = $form->option_db("_", "Ke_CabID", $atabel['Ke_CabID'], $enable, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID", [0,"&nbsp;"]);
$tcatat = $form->textbox("_", "Catatan", $atabel['Catatan'], $enable, false, "text");
$ajson['html'] = '
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label" for="No_Mutasi">Nomor Transaksi</label>
<div class="col-sm-8 col-lg-4"><div class="input-group">'.$tnota.'<button id="butBrow" class="btn btn-info" type="button" onclick="MutasiJS.tx_brow();"><i class="bi-search"></i></button></div></div>
<label class="col-sm-4 col-lg-2 col-form-label" for="Dari_CabID">Dari Cabang</label>
<div class="col-sm-8 col-lg-4">'.$tcab1.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label" for="Tgl_Mutasi">Tanggal Transaksi</label>
<div class="col-sm-8 col-lg-4">'.$ttgl.'</div>
<label class="col-sm-4 col-lg-2 col-form-label" for="Ke_CabID">Ke Cabang</label>
<div class="col-sm-8 col-lg-4">'.$tcab2.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label" for="Catatan">Catatan</label>
<div class="col">'.$tcatat.'</div>
</div>
<hr class="my-1">
<input type="hidden" id="mode" value="'.$mode.'" >';
} else if ( $data == "delete" ) {
$db->Query("DELETE FROM inv_mutasi WHERE No_Mutasi='".$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;
$harga_beli = Param::Get("Harga_Beli", 0);
$sql = new SQL($db); // cabang tujuan + qty positip
$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", $harga_beli);
$sql->add_param("Harga_Jual", $harga_beli);
$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 = "AND Qty>0"; $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,P.StokID,(D.Qty*D.Harga_Beli) Total 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->set_query_footer("SELECT COUNT(*) Harga_Beli,SUM(Qty*Harga_Beli) Total FROM ".$qtabel." WHERE No_Ref='".$nomor."' ".$qview);
$obj->add_field("ID", "ID", "hid");
$obj->add_field("InvID", "InvID", "hid");
$obj->add_field("StokID", "StokID", "hid");
$obj->add_field("Harga_Beli", "HPP", "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("Qty", "Qty", "r", "rupiah2");
$obj->add_field("Harga_Beli", "Harga @", "r", "rupiah", "items");
$obj->add_field("Total", "Jumlah", "r", "rupiah", "rupiah");
$obj->set_field_order("Kode_SKU", "A");
if (in_array($mode, ["add","edit"])) {
$obj->add_row_btn("clipboard", "Ubah", "MutasiJS.detail_ubah");
$obj->add_row_btn("trash", "Hapus", "MutasiJS.detail_hapus", "Unix", user_unix());
$obj->set_func_btn("MutasiJS.detail_tambah", '<i class="bi-plus-lg me-1"></i> Barang');
$obj->set_func_btn("MutasiJS.produk_brow", '<i class="bi-table me-1"></i> Browse');
}
$obj->set_func_navi("MutasiJS.data_query('tabel-detail')");
$ajson[] = $obj->json_table("divDetailTabel");
} else if ( $data == "brow-tx" ) {
$tcari = trim(Param::Get("Cari_TX"));
$tsql = ($tcari=="") ? "" : " WHERE CONCAT(No_Mutasi,DATE_FORMAT(Tgl_Mutasi,'%d-%m-%Y')) LIKE '%".$tcari."%'";
$obj = new Table($db);
$obj->set_table("(SELECT * FROM inv_mutasi".$tsql.") M LEFT JOIN para_cabang C1 ON (C1.CabID=M.Dari_CabID) LEFT JOIN para_cabang C2 ON (C2.CabID=M.Ke_CabID)", "M.*,C1.Nama_Cab Cab1,C2.Nama_Cab Cab2", "");
$obj->add_field("No_Mutasi", "No. Transaksi", "c");
$obj->add_field("Tgl_Mutasi", "Tgl. Transaksi", "c", "sqltgl", null, "val-tgl");
$obj->add_field("Cab1", "Dari Cab", "c");
$obj->add_field("Cab2", "Ke Cab", "c");
$obj->add_field("Total_Mutasi", "Total", "r", "rupiah");
$obj->set_field_order("No_Mutasi", "D");
$obj->add_row_btn("save", "Pilih", "MutasiJS.tx_select");
$obj->set_func_navi("MutasiJS.data_query('brow-tx')");
$ajson[] = $obj->db_table("divBrowTX");
} 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("(SELECT InvID,SatuanID,SUM(Stok) Stok FROM inv_detail WHERE CabID='".$id_cab_dari."' 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", "MutasiJS.produk_select");
$obj->set_func_navi("MutasiJS.data_query('brow-produk')");
$ajson[] = $obj->db_table("divBrowProduk");
} 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,':',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 CabID='".$id_cab_dari."' 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, false, "double");
$tharga = $form->textbox("_", "Harga_Beli", $atabel['HPP'], false, false, "double");
$tjumlah = $form->textbox("_", "Jumlah", 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" for="Qty">Qty</label>
<div class="col-sm-5 col-lg-4">'.$tqty.'</div>
<div class="col">'.$tsat.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label">Harga @</label>
<div class="col-sm-8 col-lg-6">'.$tharga.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label">Total</label>
<div class="col-sm-8 col-lg-6">'.$tjumlah.'</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="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 Mutasi Stok Cabang</button>
</li>
<li class="nav-item ms-auto">
<button class="btn btn-primary mb-1 ms-2" id="butTambah" type="button"><i class="bi-plus-lg me-2"></i>Tambah</button>
<button class="btn btn-info mb-1 ms-2" id="butUbah" type="button"><i class="bi-clipboard me-2"></i>Ubah</button>
<button class="btn btn-warning mb-1 ms-2" id="butHapus" type="button"><i class="bi-trash me-2"></i>Hapus</button>
<button class="btn btn-secondary mb-1 ms-2" id="butPrint" type="button"><i class="bi-printer me-2"></i>Cetak</button>
<button class="btn btn-danger mb-1 ms-2" id="butBatal" type="button"><i class="bi-x-lg me-2"></i>Batal</button>
<button class="btn btn-success mb-1 ms-2" id="butSimpan" type="button"><i class="bi-save me-2"></i>Simpan</button>
</li>
</ul>
<div class="tab-content border border-top-0 p-3">
<div class="tab-pane fade active show" id="tx" role="tabpanel" aria-labelledby="tx-tab">
<div id="divTXMaster">&nbsp;</div>
<div id="divDetailTabel">&nbsp;</div>
</div>
</div>
</div></div>
</div>';
}
send_json($ajson);
?>
+304
View File
@@ -0,0 +1,304 @@
<?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'=>0];
if ($mode == "add") {
$atabel['No_Opname'] = "TO-BARU#".$_SESSION['__WEB_APP']['SERVER_ID'].user_id(3);
$atabel['Tgl_Opname'] = tgl_ymd();
$atabel['CabID'] = $id_cab;
$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'], $enable, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID", [0,"&nbsp;"]);
$tcatat = $form->textbox("_", "Catatan", $atabel['Catatan'], $enable, false, "text");
$ajson['html'] = '
<div class="row">
<div class="col-sm-12 col-lg-6">
<div class="row mb-1">
<label class="col-sm-5 col-lg-3 col-form-label" for="No_Opname">Nomor Transaksi</label>
<div class="col"><div class="input-group">'.$tnota.'<button id="butBrow" class="btn btn-info" type="button" onclick="OpnameJS.tx_brow();"><i class="bi-search"></i></button></div></div>
</div>
<div class="row mb-1">
<label class="col-sm-5 col-lg-3 col-form-label" for="Tgl_Opname">Tanggal Transaksi</label>
<div class="col-sm-7 col-lg-5">'.$ttgl.'</div>
</div>
</div>
<div class="col-sm-12 col-lg-6">
<div class="row mb-1">
<label class="col-sm-5 col-lg-3 col-form-label" for="CabID">Nama Cabang</label>
<div class="col">'.$tcab.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-5 col-lg-3 col-form-label" for="Catatan">Catatan</label>
<div class="col">'.$tcatat.'</div>
</div>
</div>
</div>
<hr class="my-1">
<input type="hidden" id="mode" value="'.$mode.'" >';
} else if ( $data == "delete" ) {
$db->Query("DELETE FROM inv_opname WHERE No_Opname='".$nomor."'");
$db->Query("DELETE FROM inv_detail WHERE No_Ref='".$nomor."'");
$ajson['status'] = true;
} else if ( $data == "tabel-detail" ) {
if (in_array($mode_detail, ["insert","update","delete"])) {
$iqty = doubleval(Param::Get("Qty", 0)); $istok = $iqty;
$db->Query("SELECT Qty FROM inv_produk_kemasan WHERE InvID='".Param::Get("InvID")."' AND SatuanID='".Param::Get("SatuanID")."'");
if ($db->Next()) $istok = $db->RowFloat("Qty", 1) * $iqty;
$sql = new SQL($db);
$sql->set_table("tmp_inv_detail");
$sql->add_param("InvID");
$sql->add_param("SatuanID");
$sql->add_param("Qty", $iqty);
$sql->add_param("Stok", $istok);
$sql->add_param("Harga_Beli");
$sql->add_param("Harga_Jual", Param::Get("Harga_Beli", 0));
$sql->add_param_unix();
$sql->add_param_userid();
$sql->add_where("ID");
$sql->add_where("No_Ref", $nomor);
if ( $mode_detail == "insert" ) {
$sql->add_param("No_Ref", $nomor);
$sql->InsertDB();
} else if ( $mode_detail == "update" ) {
$sql->UpdateDB();
} else if ( $mode_detail == "delete" ) {
$sql->DeleteDB();
}
}
$qview = ""; $qtabel = "inv_detail";
if (in_array($mode, ["add","edit"])) {
if ($mode=="add") $qview = " AND Unix=".user_unix();
$qtabel = "tmp_inv_detail";
}
$obj = new Table($db);
$obj->set_query("SELECT D.*,P.Kode_SKU,P.Nama_Produk,P.Nama_Satuan FROM (SELECT * FROM ".$qtabel." WHERE No_Ref='".$nomor."'".$qview.") D LEFT JOIN vi_inv_produk P ON (D.InvID=P.InvID AND D.SatuanID=P.SatuanID)");
$obj->add_field("ID", "ID", "hid");
$obj->add_field("Kode_SKU", "SKU", "c");
$obj->add_field("Nama_Produk", "Nama Barang", "awr");
$obj->add_field("Qty", "Qty", "r", "rupiah2");
$obj->add_field("Nama_Satuan", "Satuan", "l");
$obj->set_field_order("Kode_SKU", "A");
if (in_array($mode, ["add","edit"])) {
$obj->add_row_btn("clipboard", "Ubah", "OpnameJS.detail_ubah");
$obj->add_row_btn("trash", "Hapus", "OpnameJS.detail_hapus", "Unix", user_unix());
$obj->set_func_btn("OpnameJS.detail_tambah", '<i class="bi-plus-lg me-1"></i> Barang');
$obj->set_func_btn("OpnameJS.produk_brow", '<i class="bi-table me-1"></i> Browse');
}
$obj->set_func_navi("OpnameJS.data_query('tabel-detail')");
$ajson[] = $obj->json_table("divDetailTabel");
} else if ( $data == "brow-tx" ) {
$tcari = trim(Param::Get("Cari_TX"));
$tsql = ($tcari=="") ? "" : " WHERE CONCAT(No_Opname,DATE_FORMAT(Tgl_Opname,'%d-%m-%Y')) LIKE '%".$tcari."%'";
$obj = new Table($db);
$obj->set_table("(SELECT * FROM inv_opname".$tsql.") O LEFT JOIN para_cabang C ON (C.CabID=O.CabID)", "O.*,C.Kode_Cab", "");
$obj->add_field("No_Opname", "No. Transaksi", "c");
$obj->add_field("Tgl_Opname", "Tgl. Transaksi", "c", "sqltgl", null, "val-tgl");
$obj->add_field("Kode_Cab", "Cab", "c");
$obj->add_field("Catatan", "Catatan", "awr");
$obj->set_field_order("No_Opname", "D");
$obj->add_row_btn("save", "Pilih", "OpnameJS.tx_select");
$obj->set_func_navi("OpnameJS.data_query('brow-tx')");
$ajson[] = $obj->db_table("divBrowTX");
} else if ( $data == "brow-produk" ) {
$tcari = trim(Param::Get("Cari_Produk"));
$ttgl = Param::Get("Tgl_Opname");
$tsql = ($tcari=="") ? "" : " AND CONCAT(P.Kode_Barcode,P.Nama_Produk) LIKE '%".$tcari."%'";
$obj = new Table($db);
$obj->set_table("(SELECT InvID,SatuanID,SUM(Stok) Stok FROM inv_detail WHERE Tgl_Ref<='".$ttgl."' AND CabID='".$id_cab."' GROUP BY InvID) D LEFT JOIN vi_inv_produk P ON (D.InvID=P.InvID AND D.SatuanID=P.SatuanID)", "D.InvID,P.StokID,D.Stok,P.Kode_SKU,P.Nama_Produk,P.Harga_Pokok", "P.Aktif=1".$tsql);
$obj->add_field("InvID", "InvID", "hid");
$obj->add_field("StokID", "StokID", "hid");
$obj->add_field("Harga_Pokok", "HPP", "hid");
$obj->add_field("Kode_SKU", "SKU", "c");
$obj->add_field("Nama_Produk", "Nama Barang", "l");
$obj->add_field("Stok", "Stok", "r");
$obj->set_field_order("Kode_SKU", "A");
$obj->add_row_btn("save", "Pilih", "OpnameJS.produk_select");
$obj->set_func_navi("OpnameJS.data_query('brow-produk')");
$ajson[] = $obj->db_table("divBrowProduk");
} else if ( $data == "auto-produk" ) {
$tcari = Param::Get("Auto_Query");
$ttgl = Param::Get("Tgl_Opname");
$ajson['autodata'] = [];
$bcode = 0; $arec = [];
// Cari by SKU
$db->Query("SELECT P.*,CONCAT(K.Kode_SKU,' / ',K.Kode_Barcode,':',P.Nama_Produk,':',S.Nama_Satuan,':',K.SatuanID,':',CONVERT(FORMAT(P.Harga_Pokok/K.Qty,2) USING UTF8)) Data2 FROM (SELECT * FROM inv_produk_kemasan WHERE Kode_SKU='".$tcari."' LIMIT 1) K LEFT JOIN inv_produk P ON (P.InvID=K.InvID) LEFT JOIN para_satuan S ON (S.SatuanID=K.SatuanID) WHERE P.Aktif=1");
if ($db->Next()) {
$bcode = 1;
$arec = $db->AllRow();
}
// Cari by Barcode
if ($bcode == 0) {
$db->Query("SELECT P.*,CONCAT(K.Kode_SKU,' / ',K.Kode_Barcode,':',P.Nama_Produk,':',S.Nama_Satuan,':',K.SatuanID,':',CONVERT(FORMAT(P.Harga_Pokok/K.Qty,2) USING UTF8)) Data2 FROM (SELECT * FROM inv_produk_kemasan WHERE Kode_Barcode='".$tcari."' LIMIT 1) K LEFT JOIN inv_produk P ON (P.InvID=K.InvID) LEFT JOIN para_satuan S ON (S.SatuanID=K.SatuanID) WHERE P.Aktif=1");
if ($db->Next()) {
$bcode = 1;
$arec = $db->AllRow();
}
}
if ($bcode == 1) {
$ajson['autodata'][] = ['value'=>$arec['InvID'], 'text'=>$arec['Nama_Produk'], 'data'=>$arec['Data2'], 'bc'=>1];
} else {
$db->Query("SELECT P.*,IF(IFNULL(X.Stok,0)=0,'KOSONG',ROUND(X.Stok/K.Qty,2)) Sisa_Stok,K.Kode_SKU,S.Nama_Satuan,CONCAT(K.Kode_SKU,' / ',K.Kode_Barcode,':',P.Nama_Produk,':',S.Nama_Satuan,':',K.SatuanID,':',CONVERT(FORMAT(P.Harga_Pokok/K.Qty,2) USING UTF8)) Data2 FROM (SELECT * FROM inv_produk_kemasan WHERE InvID IN (SELECT InvID FROM inv_produk WHERE Aktif=1 AND Nama_Produk LIKE '%".$tcari."%' ORDER BY InvID) ORDER BY InvID) K LEFT JOIN (SELECT * FROM inv_produk WHERE Aktif=1 AND Nama_Produk LIKE '%".$tcari."%' ORDER BY InvID) P ON (K.InvID=P.InvID) LEFT JOIN (SELECT InvID,SUM(Stok) Stok FROM inv_detail WHERE Tgl_Ref<='".tgl_sql2str($ttgl)."' AND CabID='".$id_cab."' GROUP BY InvID) X ON (K.InvID=X.InvID) LEFT JOIN para_satuan S ON (S.SatuanID=K.SatuanID) ORDER BY P.Nama_Produk,K.Qty DESC LIMIT 50");
while ($db->Next()) {
$ajson['autodata'][] = ['value'=>$db->Row("InvID"), 'text'=>$db->Row("Nama_Produk"), 'html'=>'<span class="text-primary">'.$db->Row("Kode_SKU").'</span> '.$db->Row("Nama_Produk")." ".$db->Row("Nama_Satuan").' <span class="text-danger">('.$db->Row("Sisa_Stok").')</span>', 'data'=>$db->Row("Data2"), 'bc'=>0];
}
}
} else if ($data == "detail-produk") {
$id = Param::Get("ID", 0); $atabel = ['ID'=>$id, 'InvID'=>Param::Get("InvID"), 'SatuanID'=>Param::Get("SatuanID"), 'HPP'=>Param::Get("HPP")];
if ($id > 0) {
$db->Query("SELECT * FROM tmp_inv_detail WHERE No_Ref='".$nomor."' AND ID='".$id."' LIMIT 1");
if ($db->Next()) $atabel = array_merge($atabel, $db->AllRow());
}
if ($atabel['InvID']>0 && $atabel['SatuanID']>0) {
$db->Query("SELECT Kode_SKU,Kode_Barcode,Nama_Produk,Nama_Satuan FROM vi_inv_produk WHERE InvID='".$atabel['InvID']."' AND SatuanID='".$atabel['SatuanID']."' LIMIT 1");
if ($db->Next()) $atabel = array_merge($atabel, $db->AllRow());
}
$form = new Form($db);
$tnama = $form->textauto("_", "Nama_Produk", ['value'=>$atabel['InvID'],'text'=>$atabel['Nama_Produk']], true, true, "ketik sku / barcode / nama barang");
$tkode = $form->textbox("_", "Kode_Barang", $atabel['Kode_SKU']." / ".$atabel['Kode_Barcode'], false, false, "text");
$tqty = $form->textbox("_", "Qty", $atabel['Qty'], true, true, "double");
$tstok = $form->textbox("_", "Stok_Sistem", 0, false, false, "double");
$tsat = $form->textbox("_", "Nama_Satuan", $atabel['Nama_Satuan'], false, false, "text");
$ajson['html'] = '
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label">Kode SKU / Barcode</label>
<div class="col">'.$tkode.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Nama_Produk">Nama Barang</label>
<div class="col">'.$tnama.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label">Satuan</label>
<div class="col">'.$tsat.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label">Stok Sistem</label>
<div class="col-sm-8 col-lg-6">'.$tstok.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Qty">Qty Koreksi (+/-)</label>
<div class="col-sm-8 col-lg-6">'.$tqty.'</div>
</div>
<input type="hidden" id="ID" value="'.$atabel['ID'].'" >
<input type="hidden" id="InvID" value="'.$atabel['InvID'].'" >
<input type="hidden" id="SatuanID" value="'.$atabel['SatuanID'].'" >
<input type="hidden" id="Harga_Beli" value="'.$atabel['HPP'].'" >
<input type="hidden" id="mode_detail" value="'.$mode_detail.'" >';
} else if ( $data == "cek_stok") {
$id_inv = Param::Get("InvID", 0);
$stok = 0;
$db->Query("SELECT SUM(Stok) Stok FROM inv_detail WHERE Tgl_Ref<='".tgl_sql2str(Param::Get("Tgl_Opname"))."' AND CabID='".$id_cab."' AND InvID='".$id_inv."'");
if ($db->Next()) $stok = $db->RowFloat("Stok", 2);
$ajson[] = ['type'=>"form", 'id'=>"Stok_Sistem", 'value'=>rupiah2($stok)];
} else if ( $data == "default") {
echo '
<div class="fade-in">
<div class="card"><div class="card-body">
<ul class="nav nav-tabs" role="tablist">
<li class="nav-item" role="presentation">
<button class="nav-link active" id="tx-tab" data-bs-toggle="tab" data-bs-target="#tx" type="button" role="tab" aria-controls="tx" aria-selected="true"><i class="bi-database me-2"></i>Transaksi Penyesuaian Stok</button>
</li>
<li class="nav-item ms-auto">
<button class="btn btn-primary mb-1 ms-2" id="butTambah" type="button"><i class="bi-plus-lg me-2"></i>Tambah</button>
<button class="btn btn-info mb-1 ms-2" id="butUbah" type="button"><i class="bi-clipboard me-2"></i>Ubah</button>
<button class="btn btn-warning mb-1 ms-2" id="butHapus" type="button"><i class="bi-trash me-2"></i>Hapus</button>
<button class="btn btn-secondary mb-1 ms-2" id="butPrint" type="button"><i class="bi-printer me-2"></i>Cetak</button>
<button class="btn btn-danger mb-1 ms-2" id="butBatal" type="button"><i class="bi-x-lg me-2"></i>Batal</button>
<button class="btn btn-success mb-1 ms-2" id="butSimpan" type="button"><i class="bi-save me-2"></i>Simpan</button>
</li>
</ul>
<div class="tab-content border border-top-0 p-3">
<div class="tab-pane fade active show" id="tx" role="tabpanel" aria-labelledby="tx-tab">
<div id="divTXMaster">&nbsp;</div>
<div id="divDetailTabel">&nbsp;</div>
</div>
</div>
</div></div>
</div>';
}
send_json($ajson);
?>
+171
View File
@@ -0,0 +1,171 @@
<?php
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/php/iss/opname_barang.php
Desc. : PHP - Transaksi Penyesuaian Stok Per Barang
Created By : Siau Pheng ([email protected]).
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);
?>
+339
View File
@@ -0,0 +1,339 @@
<?php
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/php/iss/po.php
Desc. : PHP - Transaksi Pembuatan Purchase Order
Created By : Siau Pheng ([email protected]).
Created Date : May 22th, 2010.
Last Modified : October 19th, 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;
function PO_Data1($nomor="", $baru=false) {
global $db;
$aparam = ['No_PO'=>$nomor];
if (trim($nomor)=="") {
if ($baru) $aparam['No_PO'] = "PO".$_SESSION['__WEB_APP']['SERVER_ID'].$_SESSION['__APP_INV']['CABANGID'].user_id(3)."#00";
$aparam['Tgl_PO'] = tgl_ymd();
$aparam['SupID'] = 0;
$aparam['CabID'] = $_SESSION['__APP_INV']['CABANGID'];
$aparam['Total_Beli'] = 0;
} else {
$db->Query("SELECT * FROM inv_po WHERE No_PO='".$nomor."'");
if ($db->Next()) $aparam = $db->AllRow();
}
return $aparam;
}
$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']);
$id_sup = Param::Get("SupID", 0);
$nomor = Param::Get("No_PO", "");
if ( $data == "master" ) {
$ajson = ['error'=>"", 'html'=>""];
$atabel = ['No_PO'=>$nomor];
if ($mode == "add") {
$atabel = PO_Data1("", true);
} else if ($mode == "edit") {
PO_Detail_Copy($nomor, true);
$atabel = PO_Data1($nomor);
} else if ($mode == "save") {
$no_lama = $nomor;
$b_baru = (strpos($no_lama,"PO")===false) ? false : true;
if ($b_baru) {
$nomor = Nomor_Baru("P", Param::Get("Tgl_PO"), true);
}
PO_Detail_Save($nomor, $b_baru, $no_lama);
$apo = [];
$db->Query("SELECT SUM(Qty*Harga_Beli) Beli FROM inv_po_detail WHERE No_PO='".$nomor."'");
if ($db->Next()) $apo = $db->AllRow();
$sql = new SQL($db);
$sql->set_table("inv_po");
$sql->add_param_date("Tgl_PO");
$sql->add_param("CabID");
$sql->add_param("SupID");
$sql->add_param("Total_Beli", $apo['Beli']);
$sql->add_param("Total_Tagihan", $apo['Diskon']);
$sql->add_param_stamp();
$sql->add_param_userid();
$sql->add_where("No_PO", $nomor);
$sql->UpdateDB();
//PO_Update($nomor);
$atabel = PO_Data1($nomor);
$mode = "view";//todo: print jika langsung cetak
} else if ($mode == "cancel") {
PO_Detail_Cancel($nomor);
$atabel = PO_Data1();
} else {
$atabel = PO_Data1($nomor);
}
$enable = in_array($mode, ["add","edit"]) ? true : false;
$form = new Form($db);
$tnota = $form->textbox("_", "No_PO", $atabel['No_PO'], !$enable, true, "text", "nomor transaksi");
$ttglnota = $form->datebox("_", "Tgl_PO", $atabel['Tgl_PO'], $enable, true);
$tcab = $form->option_db("_", "CabID", $atabel['CabID'], $enable, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY Nama_Cab", [0,"&nbsp;"]);
$tsup = $form->option_db("_", "SupID", $atabel['SupID'], $enable, false, "para_supplier", ["SupID","Nama_Sup"], "Aktif=1 ORDER BY Nama_Sup", [0,"&nbsp;"], null, "POJS.oc_SupID(this);");
$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_PO">Nomor Transaksi</label>
<div class="col"><div class="input-group">'.$tnota.'<button id="butBrow" class="btn btn-info" type="button" onclick="POJS.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_PO">Tanggal Transaksi</label>
<div class="col-sm-7 col-lg-5">'.$ttglnota.'</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="SupID">Nama Supplier</label>
<div class="col">'.$tsup.'</div>
</div>
</div>
</div>
<div class="row mb-1"><div class="col"><hr class="my-1"></div></div>
<input type="hidden" id="Total_Beli" value="'.$atabel['Total_Beli'].'" >
<input type="hidden" id="mode" value="'.$mode.'" >
';
} else if ( $data == "delete" ) {
$db->Query("DELETE FROM inv_po WHERE No_PO='".$nomor."'");
$db->Query("DELETE FROM inv_po_detail WHERE No_PO='".$nomor."'");
$ajson['status'] = true;
} else if ( $data == "tabel-detail" ) {
if (in_array($mode_detail, ["insert","update","delete"])) {
$sql = new SQL($db);
$sql->set_table("tmp_inv_po_detail");
$sql->add_param("No_PO", $nomor);
$sql->add_param("InvID");
$sql->add_param("SatuanID");
$sql->add_param("Qty");
$sql->add_param("Harga_Beli");
$sql->add_param("Harga_HPP");
$sql->add_param_unix();
$sql->add_param_stamp();
$sql->add_param_userid();
$sql->add_where("ID");
$sql->add_where("No_PO", $nomor);
if ( $mode_detail == "insert" ) {
$sql->InsertDB();
} else if ( $mode_detail == "update" ) {
$sql->UpdateDB();
} else if ( $mode_detail == "delete" ) {
$sql->DeleteDB();
}
} else if ($mode_detail == "sup-baru") {
$tot_qty = 0;
$db->Query("SELECT SUM(Qty) Qty FROM tmp_inv_po_detail WHERE No_PO='".$nomor."'");
if ($db->Next()) $tot_qty = $db->Row("Qty", 0);
if ($tot_qty > 0) {
$ajson[] = array('type'=>"msg", 'wait'=>1500, 'mode'=>"error", 'value'=>"Sudah ada Qty Barang yang telah memiliki Nilai !");
} else {
$db->Query("DELETE FROM tmp_inv_po_detail WHERE No_PO='".$nomor."'");
$db->Query("INSERT INTO tmp_inv_po_detail (No_PO,InvID,SatuanID,Qty,Harga_Beli,Harga_HPP,Invoice,DateStamp,UserID,Unix) SELECT '".$nomor."',P.InvID,K.SatuanID,0,P.Harga_Pokok*K.Qty,P.Harga_Pokok*K.Qty,0,NOW(),'".user_id()."','".user_unix()."' FROM (SELECT * FROM inv_produk_kemasan WHERE InvID IN (SELECT InvID FROM inv_produk_sup WHERE Aktif=1 AND SupID='".$id_sup."')) K LEFT JOIN inv_produk P ON (P.InvID=K.InvID) WHERE P.Aktif=1");
}
}
$qview = ""; $qtabel = "inv_po_detail";
if (in_array($mode, ["add","edit"])) {
if ($mode=="add") $qview = " AND Unix=".user_unix();
$qtabel = "tmp_inv_po_detail";
}
$obj = new Table($db);
$obj->set_table("(SELECT * FROM ".$qtabel." WHERE No_PO='".$nomor."' ".$qview.") D LEFT JOIN vi_inv_produk P ON (D.InvID=P.InvID AND D.SatuanID=P.SatuanID) LEFT JOIN (SELECT InvID,SUM(Stok) Stok FROM inv_detail WHERE InvID IN (SELECT InvID FROM ".$qtabel." WHERE No_PO='".$nomor."') GROUP BY InvID) S ON (S.InvID=D.InvID)", "D.*,P.Kode_SKU,P.Nama_Lengkap,P.Nama_Satuan,P.Harga_Pokok,(D.Qty*D.Harga_Beli) Total,S.Stok,IF(IFNULL(S.Stok,0)>0,1,0) KOSONG", "");
$obj->set_query_footer("SELECT SUM(D.Qty*D.Harga_Beli) Total FROM (SELECT * FROM ".$qtabel." WHERE No_PO='".$nomor."' ".$qview.") D");
$obj->add_field("ID", "No", "c");
$obj->add_field("InvID", "InvID", "hid");
$obj->add_field("SatuanID", "SatuanID", "hid");
$obj->add_field("Kode_SKU", "SKU", "c");
$obj->add_field("Nama_Lengkap", "Nama Barang", "awr");
$obj->add_field("Stok", "Stok", "r", "rupiah2");
$obj->add_field("Qty", "PO", "r", "rupiah2");
$obj->add_field("Harga_Beli", "Harga @", "r", "rupiah");
$obj->add_field("Total", "Jumlah", "r", "rupiah", "rupiah");
$obj->set_row_color("KOSONG", "0", "ryellow");
$obj->set_field_order("Kode_SKU", "A");
if (in_array($mode, ["add","edit"])) {
$obj->add_row_btn("clipboard", "Ubah", "POJS.detail_ubah");
$obj->add_row_btn("trash", "Hapus", "POJS.detail_hapus", "Unix", user_unix());
$obj->set_func_btn("POJS.detail_tambah", '<i class="bi-plus-lg me-1"></i> Produk');
$obj->set_func_btn("POJS.produk_brow", '<i class="bi-table me-1"></i> Browse');
}
$obj->set_func_navi("POJS.data_query('tabel-detail')");
$ajson[] = $obj->db_table("divDetailTabel");
$ntotal = 0;
$db->Query("SELECT SUM(D.Qty*D.Harga_Beli) Jumlah FROM ".$qtabel." D WHERE D.No_PO='".$nomor."' ".$qview);
if ($db->Next()) $ntotal = floatval($db->Row("Jumlah", 0));
$ajson[] = ['type'=>"form", 'id'=>"Total_Beli", 'value'=>$ntotal];
} else if ( $data == "brow-tx" ) {
$tcari = trim(Param::Get("Cari_TX"));
$tsql = ($tcari=="") ? "" : "CONCAT(P.No_PO,S.Nama_Sup,DATE_FORMAT(P.Tgl_PO,'%d-%m-%Y')) LIKE '%".$tcari."%'";
$obj = new Table($db);
$obj->set_table("(SELECT * FROM inv_po) P LEFT JOIN para_supplier S ON (P.SupID=S.SupID)", "P.*,S.Nama_Sup", $tsql);
$obj->add_field("No_PO", "No. Trans", "c");
$obj->add_field("Tgl_PO", "Tgl. Trans", "c", "sqltgl", null, "val-tgl");
$obj->add_field("Nama_Sup", "Nama Supplier", "awr");
$obj->add_field("Total_Beli", "Jumlah PO", "r", "rupiah");
$obj->set_field_order("No_PO", "D");
$obj->add_row_btn("save", "Pilih", "POJS.tx_select");
$obj->set_func_navi("POJS.data_query('brow-tx')");
$ajson[] = $obj->db_table("divBrowTX");
} else if ( $data == "brow-produk" ) {
$tcari = trim(Param::Get("Cari_Produk"));
$tsql = ($tcari <> "") ? " AND P.Barcode_Nama LIKE '%".$tcari."%'": "";
$tsql .= (Param::Get("Filter_Browse")=="all") ? "" : " AND P.InvID IN (SELECT InvID FROM inv_produk_sup WHERE SupID='".Param::Get("SupID")."')";
$obj = new Table($db);
$obj->set_table("vi_inv_produk P", "P.*", "P.Aktif=1 AND InvID NOT IN (SELECT InvID FROM tmp_inv_po_detail WHERE No_PO='".$nomor."')".$tsql);
$obj->add_field("InvID", "ID", "hid");
$obj->add_field("SatuanID", "ID", "hid");
$obj->add_field("Kode_SKU", "SKU", "c");
$obj->add_field("Nama_Lengkap", "Nama Barang", "awr");
$obj->add_field("Harga_Pokok", "Harga Pokok", "r", "rupiah");
$obj->set_field_order("Kode_SKU", "A");
$obj->add_row_btn("save", "Pilih", "POJS.produk_select");
$obj->set_func_navi("POJS.data_query('brow-produk')");
$ajson[] = $obj->db_table("divBrowProduk");
} else if ( $data == "auto-produk" ) {
$tcari = Param::Get("Auto_Query");
$ajson['autodata'] = [];
$bcode = 0; $arec = [];
// Cari by SKU
$db->Query("SELECT K.InvID,P.Nama_Produk,CONCAT(K.SatuanID,':',S.Nama_Satuan,':',P.Nama_Produk,' ',S.Nama_Satuan,':',CONVERT(P.Harga_Pokok*K.Qty 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 K.InvID,P.Nama_Produk,CONCAT(K.SatuanID,':',S.Nama_Satuan,':',P.Nama_Produk,' ',S.Nama_Satuan,':',CONVERT(P.Harga_Pokok*K.Qty 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.*,K.Kode_SKU,K.Harga_Jual,S.Nama_Satuan,CONCAT(K.SatuanID,':',S.Nama_Satuan,':',P.Nama_Produk,' ',S.Nama_Satuan,':',P.Harga_Pokok*K.Qty) 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 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")), 'data'=>$db->Row("Data2"), 'bc'=>0];
}
}
} else if ($data == "detail-produk") {
$id = Param::Get("ID", 0); $atabel = ['ID'=>$id, 'InvID'=>Param::Get("InvID",0), 'SatuanID'=>Param::Get("SatuanID",0)];
if ($id > 0) {
$db->Query("SELECT * FROM tmp_inv_po_detail WHERE No_PO='".$nomor."' AND ID='".$id."' LIMIT 1");
if ($db->Next()) $atabel = $db->AllRow();
}
if ($atabel['InvID']>0 && $atabel['SatuanID']>0) {
$db->Query("SELECT 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 nama produk");
$tqty = $form->textbox("_", "Qty", $atabel['Qty'], true, true, "double");
$tstok = $form->textbox("_", "Stok", $atabel['Stok'], false, false, "double");
$tbeli = $form->textbox("_", "Harga_Beli", $atabel['Harga_Beli'], true, true, "double");
$ttot = $form->textbox("_", "Jumlah", 0, false, false, "double");
$tsat1 = $form->textbox("_", "Nama_Satuan1", $atabel['Nama_Satuan'], false, false, "text");
$tsat2 = $form->textbox("_", "Nama_Satuan2", $atabel['Nama_Satuan'], false, false, "text");
$ajson['html'] = '
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 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-2 col-form-label" for="Qty">Qty</label>
<div class="col-sm-4 col-lg-5"><div class="input-group">'.$tqty.$tsat1.'</div></div>
<div class="col-sm-4 col-lg-5"><div class="input-group float-end"><span class="input-group-text">Stok</span>'.$tstok.$tsat2.'</div></div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label" for="Harga_Beli">Harga (@)</label>
<div class="col-sm-4 col-lg-5">'.$tbeli.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label">Total</label>
<div class="col-sm-4 col-lg-5">'.$ttot.'</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_HPP" value="'.$atabel['Harga_HPP'].'" >
<input type="hidden" id="mode_detail" value="'.$mode_detail.'" >
';
} else if ( $data == "detail-item" ) {
$ajson['data'] = "kosong";
$db->Query("SELECT InvID,SUM(Stok) Stok FROM inv_detail WHERE InvID='".Param::Get("InvID")."'");
if ($db->Next()) $ajson = $db->AllRow();
} 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 Pembuatan Purchase Order</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-light border mb-1 ms-2" id="butShare" type="button"><i class="bi-share me-2"></i>Share</button>
<button class="btn btn-danger mb-1 ms-2" id="butBatal" type="button"><i class="bi-x-lg me-2"></i>Batal</button>
<button class="btn btn-success mb-1 ms-2" id="butSimpan" type="button"><i class="bi-save me-2"></i>Simpan</button>
</li>
</ul>
<div class="tab-content border border-top-0 p-3">
<div class="tab-pane fade active show" id="tx" role="tabpanel" aria-labelledby="tx-tab">
<div id="divTXMaster">&nbsp;</div>
<div id="divDetailTabel">&nbsp;</div>
</div>
</div>
</div></div>
</div>';
}
send_json($ajson);
?>
+552
View File
@@ -0,0 +1,552 @@
<?php
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/php/pos/pos.php
Desc. : PHP - Transaksi Penjualan / Kasir POS
Created By : Siau Pheng ([email protected]).
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 px-2 display-6 text-end" id="Total_Disp">'.$apara['Kembali'].'</div></div>
</div>
<div class="row mb-1"><div class="col">'.$tinfo.'</div></div>
<div class="row mb-1">
<div class="col">
<div class="input-group">'.$tno_jual.'
<button class="btn btn-info shadow-none" type="button" id="posPEND"><i class="bi-search"></i></button>
</div>
</div>
</div>
<div class="row mb-1 mt-4"><div class="col d-grid gap-2">
<button type="button" class="btn btn-success" id="posSIMPAN"><i class="bi-cart-plus me-1"></i>Bayar</button>
<button type="button" class="btn btn-danger" id="posBATAL"><i class="bi-x-lg me-1"></i>Batal</button>
</div></div>
<div class="row mb-1 mt-4"><div class="col d-grid gap-2">
<button type="button" class="btn btn-outline-info" id="posNOTA"><i class="bi-list me-1"></i>Daftar Transaksi</button>
<button type="button" class="btn btn-outline-info" id="posBARANG"><i class="bi-search me-1"></i>Cari Barang</button>
<button type="button" class="btn btn-outline-info" id="posTAMBAH"><i class="bi-save me-1"></i>Tambah Barang</button>
</div></div>
<input type="hidden" id="No_Cetak" value="'.$apara['No_Cetak'].'" />
<input type="hidden" id="Total_Tunai" value="'.$apara['Total_Tunai'].'" />
<input type="hidden" id="Total_Kartu" value="'.$apara['Total_Kartu'].'" />
<input type="hidden" id="Total_Bayar" value="'.$apara['Total_Bayar'].'" />
<input type="hidden" id="Total_Nota" value="'.$apara['Total_Nota'].'" />
<input type="hidden" id="Total_Item" value="'.$apara['Total_Item'].'" />
<input type="hidden" id="Tgl_Jual" value="'.tgl_sql2str($apara['Tgl_Jual']).'" />
<input type="hidden" id="KartuID" value="'.$apara['KartuID'].'" />
<input type="hidden" id="No_Kartu" value="'.$apara['No_Kartu'].'" />
<input type="hidden" id="Nama_Kartu" value="'.$apara['Nama_Kartu'].'" />
<input type="hidden" id="mode" value="'.$tmode.'" />';
}
function Data_Jual1($nomor="") {
global $db;
$aparam = [];
if (trim($nomor)=="") {
$aparam['No_Jual'] = "POS".$_SESSION['__WEB_APP']['SERVER_ID'].$_SESSION['__APP_INV']['CABANGID'].user_id(3)."#00";
$aparam['Tgl_Jual'] = tgl_ymd();
$aparam['Total_Nota'] = 0;
$aparam['Total_Item'] = 0;
$aparam['Total_Tunai'] = 0;
$aparam['Total_Kartu'] = 0;
$aparam['Total_Bayar'] = 0;
$aparam['KartuID'] = 0;
$aparam['No_Kartu'] = "";
$aparam['Nama_Kartu'] = "";
$aparam['Kembali'] = 0;
$aparam['No_Cetak'] = "";
} else {
$tabel_jual = (strpos($nomor,"POS")===false) ? "inv_jual" : "inv_jual_pend";
$db->Query("SELECT * FROM ".$tabel_jual." WHERE CabID='".$_SESSION['__APP_INV']['CABANGID']."' AND No_Jual='".$nomor."'");
if ($db->Next()) $aparam = $db->AllRow();
}
return $aparam;
}
function Nomor_Pending1() {
global $db;
$tno = "POS".$_SESSION['__WEB_APP']['SERVER_ID'].$_SESSION['__APP_INV']['CABANGID'].user_id(3)."#";
$ino = 0;
$db->Query("SELECT MAX(RIGHT(No_Jual,2)) Nomor FROM inv_jual_pend WHERE LEFT(No_Jual,".strlen($tno).")='".$tno."'");
if ($db->Next()) $ino = intval($db->Row("Nomor", 0));
$tno .= isi_nol(++$ino, 2);
return $tno;
}
$db = $db ?? new MySQL();
$ajson = [];
$data = Param::Get("data");
$mode = Param::Get("mode");
$mode_detail = Param::Get("mode_detail");
$id_cab = $_SESSION['__APP_INV']['CABANGID'];
$id_other = $_SESSION['__APP_INV']['OTHERINVID'];
$nomor = Param::Get("No_Jual");
$no_cetak = Param::Get("No_Cetak");
if ( $data == "master" ) {
$aparam = [];
if ($mode == "pending-edit") {
Pending_Edit($nomor);
$aparam = Data_Jual1($nomor);
} else if ($mode == "pending-save") {
$b_baru = false;
if (substr($nomor,-3)=="#00") {
$b_baru = true;
$no_lama = $nomor;
$nomor = Nomor_Pending1();
Pending_Save($no_lama, $nomor);
}
$apending = [];
$db->Query("SELECT SUM(-Qty*Harga_Jual) Jual,SUM(Total_Diskon) Diskon FROM tmp_inv_detail WHERE No_Ref='".$nomor."'");
if ($db->Next()) $apending = $db->AllRow();
$sql = new SQL($db);
$sql->set_table("inv_jual_pend");
$sql->add_param("No_Jual", $nomor);
$sql->add_param_date("Tgl_Jual");
$sql->add_param("CabID", $id_cab);
$sql->add_param("Total_Jual", $apending['Jual']);
$sql->add_param("Total_Diskon", $apending['Diskon']);
$sql->add_param_userid();
$sql->add_where("No_Jual", $nomor);
if ($b_baru) $sql->InsertDB();
else $sql->UpdateDB();
$aparam = Data_Jual1();
} else if ($mode == "pending-delete") {
Pending_Delete($nomor);
$db->Query("DELETE FROM inv_jual_pend WHERE No_Jual='".$nomor."'");
$aparam = Data_Jual1();
} else if ($mode == "edit") {
Detail_Copy($nomor, true);
$db->Query("INSERT INTO tmp_inv_detail_lain SELECT No_Ref,ID,Ket,UserID,'".user_unix()."' FROM inv_detail_lain WHERE No_Ref='".$nomor."'");
$aparam = Data_Jual1($nomor);
} else if ($mode == "save") {
$no_lama = $nomor;
$b_baru = (strpos($no_lama,"POS")===false) ? false : true;
if ($b_baru) {
$nomor = Nomor_POS_Baru("", true);
if (substr($no_lama,-3)!="#00") $db->Query("DELETE FROM inv_jual_pend WHERE No_Jual='".$no_lama."'");
}
Promo_Barang($no_lama, tgl_dmy());//PROMO BARANG
$tot_potong = Promo_Total($no_lama, tgl_dmy());//PROMO TOTAL
Detail_Save($nomor, 5, $id_cab, tgl_dmy(), $b_baru, $no_lama);
$db->Query("DELETE FROM inv_detail_lain WHERE No_Ref='".$nomor."'");
$db->Query("INSERT INTO inv_detail_lain SELECT '".$nomor."',ID,Ket,UserID FROM tmp_inv_detail_lain WHERE No_Ref='".$no_lama."'");
$db->Query("DELETE FROM tmp_inv_detail_lain WHERE No_Ref='".$no_lama."'");
$ajual = [];
$db->Query("SELECT SUM(-Qty*Harga_Jual) Jual,SUM(Total_Diskon) Diskon,SUM(-Qty*Harga_Beli) HPP FROM inv_detail WHERE No_Ref='".$nomor."'");
if ($db->Next()) $ajual = $db->AllRow();
$id_kartu = Param::Get("KartuID", 0);
$no_kartu = ""; $nama_kartu = "";
if ($id_kartu > 0) {
$no_kartu = Param::Get("No_Kartu", "");
$nama_kartu = Param::Get("Nama_Kartu", "");
}
$sql = new SQL($db);
$sql->set_table("inv_jual");
$sql->add_param("Tgl_Jual", tgl_ymd());
$sql->add_param("Tgl_Lunas", tgl_ymd());
$sql->add_param("Total_Jual", $ajual['Jual']);
$sql->add_param("Total_Diskon", $ajual['Diskon']);
$sql->add_param("Total_Potong", $tot_potong);
$sql->add_param("Total_HPP", $ajual['HPP']);
$sql->add_param("Total_Bayar");
$sql->add_param("Total_Kartu");
$sql->add_param("KartuID", $id_kartu);
$sql->add_param("No_Kartu", $no_kartu);
$sql->add_param("Nama_Kartu", $nama_kartu);
$sql->add_param("CabID", $id_cab);
$sql->add_param_stamp();
$sql->add_param_userid();
$sql->add_where("No_Jual", $nomor);
$sql->UpdateDB();
Promo_Nota_Proses($nomor, tgl_dmy());//PROMO NOTA
if ($_SESSION['__APP_INV']['PRINT_AUTO']==1) {
$mode = "print";
} else {
$mode = ($_SESSION['__APP_INV']['PRINT_OPENCD']==1) ? "opencd" : "saveonly";
}
$aparam = Data_Jual1();
$aparam['No_Cetak'] = $nomor;
$aparam['Kembali'] = "0";
$db->Query("SELECT (Total_Jual-Total_Diskon-Total_Potong-Total_Bayar) Sisa FROM inv_jual WHERE No_Jual='".$nomor."'");
if ($db->Next()) $aparam['Kembali'] = '<span style="color:red;">'.rupiah($db->RowFloat("Sisa", 0)).'</span>';
//MONITOR DISPLAY
if ($_SESSION['__APP_INV']['MON_ENABLE']) {
$db->Query("UPDATE disp_login SET No_Cetak='".$nomor."' WHERE CabID='".$_SESSION['__APP_INV']['CABANGID']."' AND UserID='".user_id()."' AND Unix='".user_unix()."'");
}
} else if ($mode == "delete") {
// PROSES UPDATE PROMO
$tgl_jual = tgl_ymd();
$db->Query("SELECT Tgl_Jual FROM inv_jual WHERE No_Jual='".$nomor."'");
if ($db->Next()) $tgl_jual = $db->Row("Tgl_Jual");
Promo_Hapus($nomor, tgl_sql2str($tgl_jual));
Promo_Nota_Hapus($nomor);
$db->Query("DELETE FROM inv_jual WHERE No_Jual='".$nomor."'");
$db->Query("DELETE FROM inv_detail WHERE No_Ref='".$nomor."'");
$db->Query("DELETE FROM inv_detail_lain WHERE No_Ref='".$nomor."'");
$aparam = Data_Jual1();
} else if ($mode == "cancel") {
if (substr($nomor,-3)=="#00" || substr($nomor,0,3)!="POS") Detail_Cancel($nomor);
$aparam = Data_Jual1();
} else {
$aparam = Data_Jual1();
}
//MONITOR DISPLAY
if ($_SESSION['__APP_INV']['MON_ENABLE']) {
$db->Query("UPDATE disp_login SET No_Pos='".$aparam['No_Jual']."' WHERE CabID='".$_SESSION['__APP_INV']['CABANGID']."' AND UserID='".user_id()."' AND Unix='".user_unix()."'");
}
master_show($mode, $aparam);
} else if ( $data == "detail" ) {
if (in_array($mode_detail, ["insert","update","delete"])) {
$id_inv = Param::Get("InvID", 0);
$id_sat = Param::Get("SatuanID", 0);
$iqty = Param::Get("Qty", 0) * -1;
$dhargaD = Param::Get("Harga_Diskon", 0);
$ddiskP = Param::Get("Persen_Diskon", 0);
$istok = 1;
$db->Query("SELECT Qty FROM inv_produk_kemasan WHERE InvID='".$id_inv."' AND SatuanID='".$id_sat."'");
if ($db->Next()) $istok = $db->Row("Qty", 1);
if ($ddiskP > 0) $dhargaD = Param::Get("Harga_Jual",0) * $ddiskP * 0.01;
$sql = new SQL($db);
$sql->set_table("tmp_inv_detail");
$sql->add_param("No_Ref", $nomor);
$sql->add_param("InvID");
$sql->add_param("SatuanID");
$sql->add_param("Qty", $iqty);
$sql->add_param("Stok", ($istok*$iqty));
$sql->add_param("Harga_Beli");
$sql->add_param("Harga_Jual");
$sql->add_param("Disk_Rupiah", $dhargaD);
$sql->add_param("Total_Diskon", "Disk_Rupiah*-Qty", true);
$sql->add_param_unix();
$sql->add_param_userid();
$sql->add_where("ID");
$sql->add_where("No_Ref", $nomor);
$_id = Param::Get("ID", 0);
$_ket = strtoupper(Param::Get("Ket"));
if ( $mode_detail == "insert" ) {
$sql->InsertDB();
if ($id_inv == $id_other) {
$_id = $sql->LastInsertID();
$db->Query("INSERT INTO tmp_inv_detail_lain (No_Ref,ID,Ket,UserID,Unix) VALUES ('".$nomor."','".$_id."','".$_ket."','".user_id()."','".user_unix()."')");
}
} else if ( $mode_detail == "update" ) {
$sql->UpdateDB();
if ($id_inv == $id_other) $db->Query("UPDATE tmp_inv_detail_lain SET Ket='".$_ket."' WHERE No_Ref='".$nomor."' AND ID='".$_id."' AND UserID='".user_id()."' AND Unix='".user_unix()."'");
} else if ( $mode_detail == "delete" ) {
$db->Query("UPDATE tmp_inv_detail SET Qty=0,Stok=0,Total_Diskon=0 WHERE No_Ref='".$nomor."' AND ID='".$_id."'");
}
}
$obj = new Table($db);
$obj->set_css("tabel-pos");
$obj->set_query("SELECT D.*,-D.Qty Qty2,IF(ISNULL(O.Ket),P.Nama_Lengkap,O.Ket) Nama_Lengkap,(-D.Qty*(D.Harga_Jual-D.Disk_Rupiah)) Total,P.Kode_SKU,IF(D.InvID='".$id_other."',1,0) ISO,IF(D.Qty=0,0,1) IDEL FROM (SELECT * FROM tmp_inv_detail WHERE No_Ref='".$nomor."' AND Unix='".user_unix()."' AND Promo<2) D LEFT JOIN (SELECT * FROM tmp_inv_detail_lain WHERE No_Ref='".$nomor."' AND Unix='".user_unix()."') O ON (D.No_Ref=O.No_Ref AND D.ID=O.ID) LEFT JOIN vi_inv_produk P ON (D.InvID=P.InvID AND D.SatuanID=P.SatuanID)");
$obj->set_query_footer("SELECT CONCAT('Qty: ',FORMAT(SUM(-D.Qty),2),' / Item: ',FORMAT(COUNT(DISTINCT InvID),0)) Nama_Lengkap,SUM(-D.Qty*D.Disk_Rupiah) Disk_Rupiah,SUM(-D.Qty*(D.Harga_Jual-D.Disk_Rupiah)) Total FROM tmp_inv_detail D WHERE D.No_Ref='".$nomor."' AND D.Unix='".user_unix()."' AND D.Promo<2");
$obj->add_field("ID", "ID", "hid");
$obj->add_field("InvID", "InvID", "hid");
$obj->add_field("SatuanID", "SatuanID", "hid");
$obj->add_field("ISO", "IS OTHER", "hid");
$obj->add_field("Kode_SKU", "SKU", "c");
$obj->add_field("Nama_Lengkap", "Nama Barang", "awr");
$obj->add_field("Qty2", "Qty", "r", "koma30");
$obj->add_field("Harga_Jual", "Harga @", "r", "rupiah");
$obj->add_field("Disk_Rupiah", "Diskon @", "r", "rupiah", "rupiah");
$obj->add_field("Total", "Jumlah", "r", "rupiah", "rupiah");
$obj->set_field_order("ID", "D");
$obj->add_row_btn("clipboard", "Ubah", "POSJS.detail_ubah");
$obj->add_row_btn("trash", "Hapus", "POSJS.detail_hapus", "IDEL", 1);
$obj->set_row_color("IDEL", 0, "rcoret");
$obj->set_func_navi("POSJS.data_query('detail')");
$ajson[] = $obj->json_table("divPOS1", 8);
$ainfo = ['Total'=>0, 'Item'=>0];
$db->Query("SELECT SUM(-Qty*(Harga_Jual-Disk_Rupiah)) Total,COUNT(*) Item FROM tmp_inv_detail WHERE No_Ref='".$nomor."' AND Unix='".user_unix()."'");
if ($db->Next()) $ainfo = $db->AllRow();
$ajson[] = array('type'=>"form", 'id'=>"Total_Nota", 'value'=>$ainfo['Total']);
$ajson[] = array('type'=>"form", 'id'=>"Total_Item", 'value'=>$ainfo['Item']);
if ($db->RowFloat("Item")>0) $ajson[] = array('type'=>"html", 'id'=>"Total_Disp", 'value'=>rupiah($ainfo['Total']));
} else if ( $data == "auto-produk" ) {
$nomor = urldecode($nomor);
$tcari = Param::Get("Auto_Query");
$ajson['autodata'] = [];
$bcode = 0; $arec = [];
// Cari by SKU
$db->Query("SELECT K.InvID,P.Nama_Produk,CONCAT(K.SatuanID,':',CONVERT(P.Harga_Pokok*K.Qty USING UTF8),':',CONVERT(K.Harga_Jual USING UTF8)) Data2 FROM (SELECT * FROM inv_produk_kemasan WHERE Harga_Jual>0 AND Kode_SKU='".$tcari."' LIMIT 1) K LEFT JOIN inv_produk P ON (P.InvID=K.InvID) WHERE P.Aktif=1");
if ($db->Next()) {
$bcode = 1;
$arec = $db->AllRow();
}
// Cari by Barcode
if ($bcode == 0) {
$db->Query("SELECT K.InvID,P.Nama_Produk,CONCAT(K.SatuanID,':',CONVERT(P.Harga_Pokok*K.Qty USING UTF8),':',CONVERT(K.Harga_Jual USING UTF8)) Data2 FROM (SELECT * FROM inv_produk_kemasan WHERE Harga_Jual>0 AND Kode_Barcode='".$tcari."' LIMIT 1) K LEFT JOIN inv_produk P ON (P.InvID=K.InvID) WHERE P.Aktif=1");
if ($db->Next()) {
$bcode = 1;
$arec = $db->AllRow();
}
}
if ($bcode == 1) {
$db->Query("SELECT * FROM vi_inv_stok WHERE CabID='".$id_cab."' AND InvID='".$arec['InvID']."' LIMIT 1");
$arec['Stok'] = ($db->Next()) ? $db->RowFloat("Stok",0) : 0;
$ajson['autodata'][] = ['value'=>$arec['InvID'], 'text'=>$arec['Nama_Produk'], 'data'=>$arec['Data2'].":".$arec['Stok'], 'bc'=>1];
} else {
$db->Query("SELECT P.*,IF(IFNULL(X.Stok,0)=0,'KOSONG',ROUND(X.Stok/K.Qty,2)) Sisa_Stok,K.Kode_SKU,K.Harga_Jual,S.Nama_Satuan,CONCAT(K.SatuanID,':',CONVERT(P.Harga_Pokok*K.Qty USING UTF8),':',CONVERT(K.Harga_Jual USING UTF8),':',CONVERT(IFNULL(X.Stok,0) USING UTF8)) Data2 FROM (SELECT * FROM inv_produk_kemasan WHERE Harga_Jual>0 AND InvID IN (SELECT InvID FROM inv_produk WHERE Aktif=1 AND Nama_Produk LIKE '%".$tcari."%' ORDER BY InvID) ORDER BY InvID) K LEFT JOIN (SELECT * FROM inv_produk WHERE Aktif=1 AND Nama_Produk LIKE '%".$tcari."%' ORDER BY InvID) P ON (K.InvID=P.InvID) LEFT JOIN vi_inv_stok X ON (X.CabID='".$id_cab."' AND K.InvID=X.InvID) LEFT JOIN para_satuan S ON (S.SatuanID=K.SatuanID) ORDER BY P.Nama_Produk,K.Qty DESC LIMIT 50");
while ($db->Next()) {
$ajson['autodata'][] = ['value'=>$db->Row("InvID"), 'text'=>$db->Row("Nama_Produk"), 'html'=>'<span class="text-primary">'.$db->Row("Kode_SKU").'</span> '.$db->Row("Nama_Produk")." ".$db->Row("Nama_Satuan").' - Rp. '.rupiah($db->Row("Harga_Jual")).' <span class="text-danger">('.$db->Row("Sisa_Stok").')</span>', 'data'=>$db->Row("Data2"), 'bc'=>0];
}
}
} else if ( $data == "brow-produk" ) {
$tcari = trim(Param::Get("Cari_Produk"));
$tsql = ($tcari=="") ? "" : " AND P.Barcode_Nama LIKE '%".$tcari."%'";
$obj = new Table($db);
$obj->set_table("vi_inv_produk P", "P.*", "P.Harga_Jual>0 AND P.Aktif=1".$tsql);
$obj->add_field("InvID", "ID", "hid");
$obj->add_field("SatuanID", "ID", "hid");
$obj->add_field("Kode_SKU", "SKU", "c");
$obj->add_field("Kode_Barcode", "Kode Barcode", "c");
$obj->add_field("Nama_Lengkap", "Nama Barang", "awr");
$obj->add_field("Harga_Jual", "Harga @", "r", "rupiah");
$obj->set_field_order("Kode_SKU", "A");
$obj->add_row_btn("save", "Pilih", "POSJS.produk_select");
$obj->set_func_navi("POSJS.data_query('brow-produk')");
$ajson[] = $obj->db_table("divBrowProduk");
} else if ($data == "info_produk") {
$form = new Form($db);
$tbcode = $form->textbox("_", "Kode_Barcode", "", true);
$tnama = $form->textbox("_", "Nama_Barang", "", true);
$tgrup = $form->option_db("_", "Grup_InvID", 0, true, false, "inv_produk_grup", ["Grup_InvID","Nama_Grup"], "Aktif=1 ORDER BY Nama_Grup", [0,"&nbsp;"]);
$tsat = $form->option_db("_", "StokID", 0, true, false, "para_satuan", ["SatuanID","Nama_Satuan"], "Aktif=1 ORDER BY Nama_Satuan", [0,"&nbsp;"]);
$thjual = $form->textbox("_", "Harga_Jual", 0, true, false, "double");
echo '
<div class="row mb-1"><div class="col-sm-4 col-lg-3 col-form-label">Kode Barcode</div><div class="col-sm-7 col-lg-6">'.$tbcode.'</div></div>
<div class="row mb-1"><div class="col-sm-4 col-lg-3 col-form-label">Nama Barang</div><div class="col-sm-8 col-lg-9">'.$tnama.'</div></div>
<div class="row mb-1"><div class="col-sm-4 col-lg-3 col-form-label">Grup Barang</div><div class="col-sm-8 col-lg-9">'.$tgrup.'</div></div>
<hr class="my-2">
<div class="row mb-1"><div class="col-sm-4 col-lg-3 col-form-label">Satuan Kemasan</div><div class="col-sm-7 col-lg-6">'.$tsat.'</div></div>
<div class="row mb-1"><div class="col-sm-4 col-lg-3 col-form-label">Harga Jual @</div><div class="col-sm-7 col-lg-6">'.$thjual.'</div></div>';
} else if ($data == "simpan_produk") {
$k_barcode = Param::Get("Kode_Barcode", "");
$n_produk = Param::Get("Nama_Barang", "");
$i_grup = Param::Get("Grup_InvID", 0);
$i_stok = Param::Get("StokID", 0);
$n_harga = Param::Get("Harga_Jual", 0);
$db->Query("INSERT INTO inv_produk (Grup_InvID,Nama_Produk,StokID,NormalID,UserID) VALUES ('".$i_grup."','".$n_produk."','".$i_stok."','".$i_stok."','".user_id()."')");
$id_inv = $db->LastInsertID();
$db->Query("INSERT INTO inv_produk_kemasan SET InvID='".$id_inv."',SatuanID='".$i_stok."',Kode_SKU='".SKU_Baru($i_grup)."',Kode_Barcode='".$k_barcode."',Qty=1,Harga_Jual='".$n_harga."',UserID='".user_id()."'");
$ajson['msg'] = "Pembuatan Item Barang baru telah selesai.";
} else if ($data == "detail_produk") {
$_id = Param::Get("ID", 0);
$_id_inv = Param::Get("InvID", 0);
$_id_sat = Param::Get("SatuanID", 0);
$adetail = ['ID'=>0,'Qty'=>1,'Harga_Diskon'=>0];
$db->Query("SELECT InvID,SatuanID,Kode_SKU,Kode_Barcode,Nama_Lengkap,Nama_Satuan,Harga_Jual,Harga_Pokok Harga_Beli FROM vi_inv_produk WHERE InvID='".$_id_inv."' AND SatuanID='".$_id_sat."' LIMIT 1");
if ($db->Next()) $adetail = array_merge($adetail, $db->AllRow());
if ($mode_detail == "insert") {
} else {
$db->Query("SELECT ID,-Qty Qty,Harga_Beli,Harga_Jual,Disk_Rupiah Harga_Diskon FROM tmp_inv_detail WHERE Unix='".user_unix()."' AND No_Ref='".$nomor."' AND ID='".$_id."' LIMIT 1");
if ($db->Next()) $adetail = array_merge($adetail, $db->AllRow());
}
$form = new Form($db);
$tsku = $form->textbox("_", "Kode_SKU", $adetail['Kode_SKU']. " / " .$adetail['Kode_Barcode'], false);
$tnama = $form->textbox("_", "Nama_Lengkap", $adetail['Nama_Lengkap'], false);
$tsat = $form->textbox("_", "Nama_Satuan", $adetail['Nama_Satuan'], false);
$tqty = $form->textbox("_", "Qty", abs($adetail['Qty']), true, true, "number");
$thjual = $form->textbox("_", "Harga_Jual", $adetail['Harga_Jual'], false, false, "double");
$thdisk = $form->textbox("_", "Harga_Diskon", $adetail['Harga_Diskon'], true, false, "double");
$tpdisk = $form->textbox("_", "Persen_Diskon", 0, true, false, "double");
$tjuml = $form->textbox("_", "Jumlah", 0, false, false, "double");
echo '
<div class="row mb-1"><div class="col-sm-4 col-lg-3 col-form-label">Kode SKU / Barcode</div><div class="col-sm-8 col-lg-9">'.$tsku.'</div></div>
<div class="row mb-1"><div class="col-sm-4 col-lg-3 col-form-label">Nama Barang</div><div class="col-sm-8 col-lg-9">'.$tnama.'</div></div>
<hr class="my-2">
<div class="row mb-1"><div class="col-sm-4 col-lg-3 col-form-label">Qty</div><div class="col-sm-5 col-lg-4">'.$tqty.'</div><div class="col-sm-3 col-lg-5">'.$tsat.'</div></div>
<div class="row mb-1"><div class="col-sm-4 col-lg-3 col-form-label">Harga @</div><div class="col-sm-7 col-lg-6">'.$thjual.'</div></div>
<div class="row mb-1"><div class="col-sm-4 col-lg-3 col-form-label">Diskon @</div><div class="col-sm-5 col-lg-6">'.$thdisk.'</div><div class="col-sm-3 col-lg-3"><div class="input-group"><div class="input-group-text">&thickapprox;</div>'.$tpdisk.'<div class="input-group-text">%</div></div></div></div>
<div class="row mb-1"><div class="col-sm-4 col-lg-3 col-form-label">Sub Total</div><div class="col-sm-7 col-lg-6">'.$tjuml.'</div></div>
<input type="hidden" id="ID" value="'.$adetail['ID'].'" />
<input type="hidden" id="InvID" value="'.$adetail['InvID'].'" />
<input type="hidden" id="SatuanID" value="'.$adetail['SatuanID'].'" />
<input type="hidden" id="Harga_Beli" value="'.$adetail['Harga_Beli'].'" />
<input type="hidden" id="mode_detail" value="'.$mode_detail.'" />';
} else if ($data == "detail_lain") {
$_id = Param::Get("ID", 0);
$alain = ['ID'=>0,'Qty'=>1,'Harga_Beli'=>0,'Harga_Jual'=>0,'Ket'=>""];
$db->Query("SELECT InvID,SatuanID,Kode_SKU,Nama_Satuan FROM vi_inv_produk WHERE InvID='".$_SESSION['__APP_INV']['OTHERINVID']."' LIMIT 1");
if ($db->Next()) $alain = array_merge($alain, $db->AllRow());
if ($mode_detail == "insert") {
} else {
$db->Query("SELECT ID,-Qty Qty,Harga_Beli,Harga_Jual FROM tmp_inv_detail WHERE Unix='".user_unix()."' AND No_Ref='".$nomor."' AND ID='".$_id."' LIMIT 1");
if ($db->Next()) $alain = array_merge($alain, $db->AllRow());
$db->Query("SELECT Ket FROM tmp_inv_detail_lain WHERE Unix='".user_unix()."' AND No_Ref='".$nomor."' AND ID='".$_id."' LIMIT 1");
if ($db->Next()) $alain = array_merge($alain, $db->AllRow());
}
$form = new Form($db);
$tsku = $form->textbox("_", "Kode_SKU", $alain['Kode_SKU'], false);
$tket = $form->textbox("_", "Ket", $alain['Ket'], true);
$tsat = $form->textbox("_", "Nama_Satuan", $alain['Nama_Satuan'], false);
$tqty = $form->textbox("_", "Qty", abs($alain['Qty']), true, true, "number");
$thjual = $form->textbox("_", "Harga_Jual", $alain['Harga_Jual'], true, true, "double");
$tjuml = $form->textbox("_", "Jumlah", 0, false, false, "double");
echo '
<div class="row mb-1"><div class="col-sm-4 col-lg-3 col-form-label">Kode SKU / Barcode</div><div class="col-sm-8 col-lg-9">'.$tsku.'</div></div>
<div class="row mb-1"><div class="col-sm-4 col-lg-3 col-form-label">Nama Barang</div><div class="col-sm-8 col-lg-9">'.$tket.'</div></div>
<hr class="my-2">
<div class="row mb-1"><div class="col-sm-4 col-lg-3 col-form-label">Qty</div><div class="col-sm-5 col-lg-4">'.$tqty.'</div><div class="col-sm-3 col-lg-5">'.$tsat.'</div></div>
<div class="row mb-1"><div class="col-sm-4 col-lg-3 col-form-label">Harga @</div><div class="col-sm-7 col-lg-6">'.$thjual.'</div></div>
<div class="row mb-1"><div class="col-sm-4 col-lg-3 col-form-label">Sub Total</div><div class="col-sm-7 col-lg-6">'.$tjuml.'</div></div>
<input type="hidden" id="ID" value="'.$alain['ID'].'" />
<input type="hidden" id="InvID" value="'.$alain['InvID'].'" />
<input type="hidden" id="SatuanID" value="'.$alain['SatuanID'].'" />
<input type="hidden" id="Harga_Diskon" value="0" />
<input type="hidden" id="Persen_Diskon" value="0" />
<input type="hidden" id="Harga_Beli" value="'.$alain['Harga_Beli'].'" />
<input type="hidden" id="mode_detail" value="'.$mode_detail.'" />';
} else if ($data == "info_kasir") {
$tot_jual = Param::Get("Total_Nota", 0);
$tot_jual -= Promo_Hitung($nomor, tgl_dmy());
$form = new Form($db);
$tjual = $form->textbox("_", "popTotal_Jual", uang($tot_jual), false, false, "double");
$ttunai = $form->textbox("_", "popTotal_Tunai", 0, true, false, "double");
$tkartu = $form->textbox("_", "popTotal_Kartu", 0, true, false, "double");
$tsisa = $form->textbox("_", "popTotal_Sisa", 0, false, false, "double");
$okartu = $form->option_db("_", "popKartuID", 0, true, false, "para_rek_pos", ["KartuID","Kode_Kartu"], "Aktif=1", [0,"Pilihan Non Tunai"]);
$tnokartu = $form->textbox("_", "popNo_Kartu", "", true, false, "text");
$tnamakartu = $form->textbox("_", "popNama_Kartu", "", true, false, "text");
$ajson['html'] = '
<div class="row mb-1"><div class="col-sm-6 col-lg-5 col-form-label">Total Nota Rp.</div><div class="col-sm-6 col-lg-7">'.$tjual.'</div></div>
<div class="row mb-1"><div class="col-sm-6 col-lg-5 col-form-label">Tunai Rp.</div><div class="col-sm-6 col-lg-7">'.$ttunai.'</div></div>
<div class="row mb-1"><div class="col-sm-6 col-lg-5">'.$okartu.'</div><div class="col-sm-6 col-lg-7">'.$tkartu.'</div></div>
<div class="row mb-1"><div class="col-sm-6 col-lg-5 col-form-label">Kembali Rp.</div><div class="col-sm-6 col-lg-7">'.$tsisa.'</div></div>
<hr class="my-2 ckartu d-none">
<div class="row mb-1 ckartu d-none"><div class="col-sm-6 col-lg-5 col-form-label">Nomor Kartu</div><div class="col-sm-6 col-lg-7">'.$tnokartu.'</div></div>
<div class="row mb-1 ckartu d-none"><div class="col-sm-6 col-lg-5 col-form-label">Nama Pemilik</div><div class="col-sm-6 col-lg-7">'.$tnamakartu.'</div></div>
<hr class="my-2">
<div class="row mt-1">
<div class="col-3 d-grid"><button type="button" class="btn btn-primary" id="butKPend">Pending</button></div>
<div class="col-3">&nbsp;</div>
<div class="col-3 d-grid"><button type="button" class="btn btn-danger" id="butKBatal" data-bs-dismiss="modal">Batal</button></div>
<div class="col-3 d-grid"><button type="button" class="btn btn-success" id="butKBayar">Bayar</button></div>
</div>
<input type="hidden" id="popTotal_Bayar" value="0" />';
$ajson['Total_Disp'] = rupiah($tot_jual);
} else if ( $data == "brow-nota" ) {
$tcari = trim(Param::Get("Cari_Nota"));
$tsql = ($tcari=="") ? " AND UserID='".user_id()."' AND Tgl_Jual='".tgl_ymd()."'" : " AND CONCAT(No_Jual,DATE_FORMAT(Tgl_Jual,'%d-%m-%Y')) LIKE '%".$tcari."%'";
$obj = new Table($db);
$obj->set_table("(SELECT * FROM inv_jual WHERE CabID='".$id_cab."'".$tsql.") J LEFT JOIN para_rek_pos P ON (J.KartuID=P.KartuID)", "J.*,DATE_FORMAT(J.DateStamp,'%H:%i:%s') Tgl_Jual2,J.Total_Jual-J.Total_Diskon Total,J.Total_Jual-J.Total_Diskon-J.Total_Bayar Kembali,J.UserID,IF(ISNULL(P.Kode_Kartu),'Tunai',P.Kode_Kartu) Kartu", "");
$obj->set_query_footer("SELECT SUM(Total_Jual-Total_Diskon) Total,SUM(Total_Jual-Total_Diskon-Total_Bayar) Kembali FROM inv_jual WHERE CabID='".$id_cab."'".$tsql);
$obj->add_field("No_Jual", "No. Nota", "c");
$obj->add_field("Tgl_Jual", "Tanggal", "c", "sqltgl");
$obj->add_field("Tgl_Jual2", "Jam", "c");
$obj->add_field("Total", "Jumlah", "r", "rupiah", "rupiah");
$obj->add_field("Total_Bayar", "Bayar", "r", "rupiah", "rupiah");
$obj->add_field("Kembali", "Kembali", "r", "rupiah", "rupiah");
$obj->add_field("Kartu", "C / D", "left");
if ($tcari<>"") {
$obj->set_field_order("Tgl_Jual", "D");
$obj->set_limit(100);
} else {
$obj->set_field_order("Tgl_Jual2", "D");
}
$obj->add_row_btn("printer", "Cetak", "POSJS.nota_print");
$obj->add_row_btn("clipboard", "Ubah", "POSJS.nota_select");
if (user_level(1)) $obj->add_row_btn("trash", "Hapus", "POSJS.nota_delete", "CabID", $id_cab);
else $obj->add_row_btn("trash", "Hapus", "POSJS.nota_delete", "UserID", user_id());
$obj->set_func_navi("POSJS.data_query('brow-nota')");
$ajson[] = $obj->db_table("divBrowNota");
} else if ( $data == "brow-pending" ) {
$obj = new Table($db);
$obj->set_query("SELECT J.*,J.Total_Jual-J.Total_Diskon Total,J.UserID FROM inv_jual_pend J WHERE J.CabID='".$id_cab."' AND J.UserID='".user_id()."'");
$obj->add_field("No_Jual", "No. Nota", "c");
$obj->add_field("Total_Jual", "Sub. Total", "r", "rupiah");
$obj->add_field("Total_Diskon", "Diskon", "r", "rupiah");
$obj->add_field("Total", "Total", "r", "rupiah");
$obj->set_field_order("No_Jual", "D");
$obj->add_row_btn("save", "Pilih", "POSJS.pending_select");
if (user_level(1)) $obj->add_row_btn("trash", "Hapus", "POSJS.pending_delete", "UserID", user_id());
$obj->set_func_navi("POSJS.data_query('brow-pending')");
$ajson[] = $obj->json_table("divBrowPending");
} else if ( $data == "pole-config") {
$ajson['pole'] = []; $apole = [];
$db->Query("SELECT * FROM disp_config WHERE REG_ID='".$_SESSION['__WEB_APP']['APP_CODE']."' LIMIT 1");
if ($db->Next()) $apole = $db->AllRow();
foreach ($apole as $_key => $_val) {
if (strpos($_key, "POLE") !== false) {
if (strpos($_key, "ENABLE") !== false) $_val = intval($_val);
$ajson['pole'][str_replace("POLE_","",$_key)] = $_val;
}
}
} else if ( $data == "default") {
echo '
<div class="fade-in">
<div class="card"><div class="card-body">
<div class="row flex-column-reverse flex-md-row">
<div class="col-sm-12 col-md-9 col-lg-10 mt-3 mt-md-0">
<div class="row mb-1">
<div class="col-sm-9 col-lg-10">
<input type="search" class="form-control fs-5" id="Nama_Produk" value="" placeholder="Scan SKU / Barcode / Ketik Nama Barang" autocomplete="off" />
</div>
<div class="col-sm-3 col-lg-2">
<input type="double" class="form-control double fs-5" id="POS_Qty" value="1.00" maxlength="10" onblur="POSJS.onblur_Qty();" />
</div>
</div>
<div id="divPOS1">&nbsp;</div>
</div>
<div class="col-sm-12 col-md-3 col-lg-2 border-start">
<div id="divPOS2">&nbsp;</div>
</div>
</div>
</div></div></div>';
}
send_json($ajson);
?>
+85
View File
@@ -0,0 +1,85 @@
<?php
/*******************************************************************
Module : /apps/php/login.php
Desc. : PHP - Halaman Proses Login
Created By : Siau Pheng ([email protected]).
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);
?>
+85
View File
@@ -0,0 +1,85 @@
<?php
/*******************************************************************
App. Name : Inventory Advanced Systems
Module : /apps/php/pdf/po.php
Desc. : PHP - Cetak PDF Purchase Order
Created By : Siau Pheng ([email protected]).
Created Date : April 12th, 2011.
Last Modified : January 19th, 2026.
(c) 2011 - 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\Web\Param;
function pdf_po($db, $nota="", $mode="view") {
if (trim($nota)=="") return;
$baris_faktur = 8;
$db->Query("SELECT B.*,DATE_FORMAT(B.Tgl_PO,'%d-%m-%Y') Tgl_PO2,S.Kode_Sup,S.Nama_Sup,S.Alamat_Sup FROM (SELECT * FROM inv_po WHERE No_PO='".$nota."') B LEFT JOIN para_supplier S ON (S.SupID=B.SupID)");
if ($db->Next()) $ainfo = $db->AllRow();
$ainfo['Alamat_Sup'] = str_replace("\n", "<br>", $ainfo['Alamat_Sup']);
$db->Query("SELECT D.*,P.Nama_Produk,P.Nama_Satuan FROM (SELECT InvID,SatuanID,Harga_Beli,SUM(Qty) Qty,SUM(Qty*Harga_Beli) Jumlah FROM inv_po_detail WHERE No_PO='".$nota."' AND Qty>0 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");
$html = '<table class="judul"><tbody><tr><td>PURCHASE ORDER</td><td class="r">'.$_SESSION['__WEB_APP']['REG_NAME'].'</td></tr></tbody></table><table><tbody><tr><td width="15%">Nomor PO</td><td>'.$ainfo['No_PO'].'</td></tr><tr><td>Tanggal PO</td><td>'.$ainfo['Tgl_PO2'].'</td></tr><tr><td>Supplier</td><td>'.$ainfo['Nama_Sup'].(($ainfo['Kode_Sup'])?" [".$ainfo['Kode_Sup']."]":"").'</td></tr><tr><td>Alamat</td><td>'.$ainfo['Alamat_Sup'].'</td></tr></tbody></table>';
$footer = '<htmlpagefooter name="RepFoot%s"><table class="footer"><tr><td width="33%%">INVESA - Robinson</td><td width="34%%" class="c">%s</td><td width="33%%" class="r i">{DATE d-m-Y H:i} / Halaman : {PAGENO} dari {nbpg}</td></tr></table></htmlpagefooter>';
$_setfoot = '<sethtmlpagefooter name="RepFoot%s" show-this-page="1" value="on" />';
$t_head = '<div><table autosize="1" class="garis"><thead><tr><th>No.</th><th>Nama Barang</th><th>Qty</th><th>Satuan</th></tr></thead><tbody>';
$t_foot = '</tbody></table></div>';
$_line = '<tr><td class="c">%s</td><td class="l">%s</td><td class="r">%s</td><td class="l">%s</td></tr>';
$html .= sprintf($footer, 10, "Purchase Order ".$ainfo['No_PO']);
$html .= sprintf($_setfoot, 10);
$body .= $t_head; $nomor = 1;
while ($db->Next()) {
$body .= sprintf($_line, $nomor++, $db->Row("Nama_Produk"), rupiah30($db->Row("Qty")), $db->Row("Nama_Satuan"));
}
if ($nomor <= $baris_faktur) {
$nomor--;
for ($x=$baris_faktur; $x>fmod($nomor, $baris_faktur); $x--) {
$body .= sprintf($_line, "&nbsp;", "&nbsp;", "&nbsp;", "&nbsp;");
}
}
$body .= sprintf($t_foot);
$body .= '<table class="akhir"><tr><td>Penerima,</td><td>Hormat Kami,</td></tr><tr><td><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p>Tanda Tangan & Cap Perusahaan</td><td class="r">&nbsp;</td></tr></table>';
$mpdf = new \Mpdf\Mpdf([
'mode' => 'c',
'format' => 'A4',
'margin_left' => 8,
'margin_right' => 8,
'margin_top' => 8,
'margin_header' => 5,
'margin_footer' => 5
]);
$mpdf->SetDisplayMode('fullpage');
$css = file_get_contents($_SESSION['__WEB_APP']['REAL_PATH'].'assets/css/pdf/po.css');
$mpdf->WriteHTML($css, \Mpdf\HTMLParserMode::HEADER_CSS);
$mpdf->WriteHTML($html . $body, \Mpdf\HTMLParserMode::HTML_BODY);
$mpdf->SetAuthor($_SESSION['__WEB_APP']['REG_NAME']);
$mpdf->SetCreator($_SESSION['__WEB_APP']['APP_NAME']." v".$_SESSION['__WEB_APP']['APP_VER']);
$mpdf->setTitle("Purchase Order ".$ainfo['No_PO']);
$mpdf->Output("Purchase Order ".$ainfo['No_PO'].".pdf", ($mode=="view" ? "I" : "D"));
unset($mpdf);
}
$db = $db ?? new MySQL();
$data = Param::Get("data");
$mode = Param::Get("mode", "view");
$nomor = Param::Get("Nomor_Cetak");
if ( $data == "pdf-po" ) {
pdf_po($db, $nomor, $mode);
} else if ( $data == "default") {}
?>
+203
View File
@@ -0,0 +1,203 @@
<?php
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/php/promo/barang.php
Desc. : PHP - Pengaturan Promo Penjualan Barang
Created By : Siau Pheng ([email protected]).
Created Date : September 28th, 2014.
Last Modified : December 9th, 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");
$mode_detail = Param::Get("mode_detail");
$id_promo = Param::Get("PromoID", 0);
if ( $data == "promo-detail" ) {
$atabel = ['PromoID'=>0,'InvID'=>0,'SatuanID'=>0,'CabID'=>0,'Pilih_Qty'=>1,'Tipe_Promo'=>1,'Promo_InvID'=>0,'Promo_SatuanID'=>0,'Jumlah_Promo'=>0,'Tgl_Mulai'=>tgl_ymd(),'Tgl_Akhir'=>tgl_sql2str(tgl_operasi(tgl_dmy(),0,1,0)),'Aktif'=>1];
if ($id_promo > 0) {
$db->Query("SELECT P.*,B.Nama_Produk FROM (SELECT * FROM inv_promo WHERE PromoID='".$id_promo."' LIMIT 1) P LEFT JOIN inv_produk B ON (B.InvID=P.InvID)");
if ($db->Next()) $atabel = array_merge($atabel, $db->AllRow());
if ($atabel['Promo_InvID'] > 0) {
$db->Query("SELECT Nama_Produk Promo_Produk FROM inv_produk WHERE InvID='".$atabel['Promo_InvID']."' LIMIT 1");
if ($db->Next()) $atabel = array_merge($atabel, $db->AllRow());
}
}
$form = new Form($db);
$tpromo = $form->textbox("_", "Nama_Promo", $atabel['Nama_Promo'], true, false, "text");
$tcab = $form->option_db("_", "CabID", $atabel['CabID'], true, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY Nama_Cab", [0,"SEMUA CABANG"]);
$ttipe = $form->radio("_", "Tipe_Promo", $atabel['Tipe_Promo'], true, false, ['1'=>"Promo Diskon",'2'=>"Promo Barang"], null, "PromoBarangJS.oc_PilihP();");
$tsatpro = $form->option("_", "Promo_SatuanID", $atabel['Promo_SatuanID'], true, false, [$atabel['Promo_SatuanID']=>$atabel['Promo_SatuanID']]);
$tqty = $form->textbox("_", "Promo_Qty", $atabel['Promo_Qty'], true, false, "double");
$tproduk = $form->textbox("_", "Nama_Produk", $atabel['Nama_Produk'], false, false, "text");
$tprodukpro = $form->textbox("_", "Promo_Produk", $atabel['Promo_Produk'], true, false, "text");
$tsatuan = $form->option("_", "SatuanID", $atabel['SatuanID'], true, false, [$atabel['SatuanID']=>$atabel['SatuanID']]);
$tpilqty = $form->radio("_", "Pilih_Qty", $atabel['Pilih_Qty'], true, false, ['1'=>"Minimum Qty",'2'=>"Kelipatan Qty"], null, "PromoBarangJS.oc_PilihQ();");
$tqty_min = $form->textbox("_", "Qty_Min", $atabel['Qty_Min'], true, false, "double");
$tqty_kali = $form->textbox("_", "Qty_Kali", $atabel['Qty_Kali'], true, false, "double");
$tpdisk = $form->textbox("_", "Promo_Disc", $atabel['Promo_Disc'], true, false, "double");
$tjpromo = $form->textbox("_", "Jumlah_Promo", $atabel['Jumlah_Promo'], true, false, "double");
$ttglmulai = $form->datebox("_", "Tgl_Mulai", $atabel['Tgl_Mulai'], true, false);
$ttglakhir = $form->datebox("_", "Tgl_Akhir", $atabel['Tgl_Akhir'], true, false);
$taktif = $form->radio("_", "Aktif", $atabel['Aktif'], true, false, ['1'=>"Ya",'0'=>"Tidak"]);
echo '
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label" for="Nama_Promo">Nama Promo</label>
<div class="col">'.$tpromo.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label" for="CabID">Nama Cabang</label>
<div class="col-sm-8 col-lg-4">'.$tcab.'</div>
</div>
<div class="row mb-1"><div class="col"><hr class="my-1"></div></div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label">Nama Barang</label>
<div class="col"><div class="input-group">'.$tproduk.'<button id="butBrow1" class="btn btn-info" type="button" onclick="PromoBarangJS.produk_brow(1);"><i class="bi-search"></i></button></div></div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label" for="SatuanID">Satuan Barang</label>
<div class="col-sm-8 col-lg-4">'.$tsatuan.'</div>
<label class="col-sm-4 col-lg-2 col-form-label" for="Pilih_Qty">Berdasarkan Qty</label>
<div class="col-sm-8 col-lg-4 col-form-label">'.$tpilqty.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label" for="Qty_Min">Jumlah Minimum</label>
<div class="col-sm-8 col-lg-4"><div class="input-group">'.$tqty_min.Form_Info("Jumlah Penjualan Minimum untuk mendapatkan promo. Contoh : 1 PCS").'</div></div>
<label class="col-sm-4 col-lg-2 col-form-label" for="Qty_Kali">Jumlah Kelipatan</label>
<div class="col-sm-8 col-lg-4"><div class="input-group">'.$tqty_kali.Form_Info("Jumlah Kelipatan Penjualan untuk mendapatkan promo. Contoh : 5 PCS").'</div></div>
</div>
<div class="row mb-1"><div class="col"><hr class="my-1"></div></div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label" for="Tipe_Promo">Pilihan Promo</label>
<div class="col col-form-label">'.$ttipe.'</div>
</div>
<div class="row mb-1 promo1">
<label class="col-sm-4 col-lg-2 col-form-label" for="Promo_Disc">Nilai Diskon / Qty</label>
<div class="col-sm-8 col-lg-4"><div class="input-group">'.$tpdisk.Form_Info("Nilai Diskon Satuan Barang berdasarkan kriteria. Contoh : Rp 500 / PCS").'</div></div>
</div>
<div class="row mb-1 promo2">
<label class="col-sm-4 col-lg-2 col-form-label" for="Promo_Produk">Barang Promo</label>
<div class="col"><div class="input-group">'.$tprodukpro.'<button id="butBrow2" class="btn btn-info" type="button" onclick="PromoBarangJS.produk_brow(2);"><i class="bi-search"></i></button></div></div>
</div>
<div class="row mb-1 promo2">
<label class="col-sm-4 col-lg-2 col-form-label" for="Promo_SatuanID">Satuan Promo</label>
<div class="col-sm-8 col-lg-4">'.$tsatpro.'</div>
<label class="col-sm-4 col-lg-2 col-form-label" for="Promo_Qty">Qty Promo</label>
<div class="col-sm-8 col-lg-4"><div class="input-group">'.$tqty.Form_Info("Jumlah Barang Promo yang diberikan sesuai kriteria. Contoh : 1 PCS").'</div></div>
</div>
<div class="row mb-1"><div class="col"><hr class="my-1"></div></div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label" for="Jumlah_Promo">Jumlah Promo</label>
<div class="col-sm-8 col-lg-4"><div class="input-group">'.$tjpromo.Form_Info("Jumlah Item Barang Promo Diskon / Promo Barang yang diberikan, jika Promo Diskon dan berdasarkan Kelipatan Qty maka Jumlah Item adalah sesuai Kelipatan Qty yang diberikan. Contoh : 500 PCS").'</div></div>
<label class="col-sm-4 col-lg-2 col-form-label" for="Tgl_Mulai">Tanggal Mulai</label>
<div class="col-sm-8 col-lg-4">'.$ttglmulai.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label" for="Aktif">Status Aktif ?</label>
<div class="col-sm-8 col-lg-4 col-form-label">'.$taktif.'</div>
<label class="col-sm-4 col-lg-2 col-form-label" for="Tgl_Akhir">Tanggal Akhir</label>
<div class="col-sm-8 col-lg-4">'.$ttglakhir.'</div>
</div>
<input type="hidden" id="PromoID" value="'.$atabel['PromoID'].'" >
<input type="hidden" id="Promo_InvID" value="'.$atabel['Promo_InvID'].'" >
<input type="hidden" id="InvID" value="'.$atabel['InvID'].'" >
<input type="hidden" id="mode_detail" value="'.$mode_detail.'" >';
} else if ( $data == "detail" ) {
if (in_array($mode_detail, ["insert","update","delete"])) {
$sql = new SQL($db);
$sql->set_table("inv_promo");
$sql->add_param("Nama_Promo");
$sql->add_param("InvID");
$sql->add_param("SatuanID");
$sql->add_param("CabID");
$sql->add_param("Pilih_Qty");
$sql->add_param("Qty_Min");
$sql->add_param("Qty_Kali");
$sql->add_param("Tipe_Promo");
$sql->add_param("Promo_Disc");
$sql->add_param("Promo_InvID");
$sql->add_param("Promo_SatuanID");
$sql->add_param("Promo_Qty");
$sql->add_param("Jumlah_Promo");
$sql->add_param_date("Tgl_Mulai");
$sql->add_param_date("Tgl_Akhir");
$sql->add_param("Aktif");
$sql->add_param_userid();
$sql->add_where("PromoID");
if ($mode_detail=="insert") {
$sql->InsertDB();
} else if ($mode_detail=="update") {
$sql->UpdateDB();
} else if ($mode_detail=="delete") {
$sql->DeleteDB();
}
}
$tcari = trim(Param::Get("Cari_Promo"));
$tsql = ($tcari=="") ? "" : " WHERE CONCAT(B.Nama_Produk,P.Nama_Promo) LIKE '%".$tcari."%'";
$obj = new Table($db);
$obj->set_query("SELECT P.*,B.Nama_Produk,S.Nama_Satuan,IF(P.CabID=0,'SEMUA CAB',C.Nama_Cab) Nama_Cab,(P.Jumlah_Promo-P.Jumlah_Proses) Jumlah_Sisa FROM (SELECT * FROM inv_promo WHERE Tipe_Promo IN (1,2)) P LEFT JOIN inv_produk B ON (B.InvID=P.InvID) LEFT JOIN para_satuan S ON (S.SatuanID=P.SatuanID) LEFT JOIN para_cabang C ON (P.CabID=C.CabID)".$tsql);
$obj->add_field("PromoID", "ID", "hid");
$obj->add_field("Nama_Cab", "Cabang", "l");
$obj->add_field("Nama_Produk", "Nama Barang", "awr");
$obj->add_field("Nama_Satuan", "Satuan", "c");
$obj->add_field("Jumlah_Promo", "Qty Promo", "r", "rupiah");
$obj->add_field("Jumlah_Sisa", "Qty Sisa", "r", "rupiah");
$obj->add_field("Tgl_Akhir", "Tgl. Akhir", "c", "sqltgl", null, "val-tgl");
$obj->add_field("Aktif", "Aktif", "c", "checkbox");
$obj->set_field_order("Nama_Cab", "A");
$obj->add_row_btn("clipboard", "Ubah", "PromoBarangJS.detail_ubah");
$obj->add_row_btn("trash", "Hapus", "PromoBarangJS.detail_hapus");
$obj->set_func_navi("PromoBarangJS.data_query('detail')");
$obj->set_func_btn("PromoBarangJS.detail_tambah", "+ Promo Barang");
$ajson[] = $obj->json_table("divDetail");
} 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.Aktif=1".$tsql);
$obj->add_field("InvID", "ID", "hid");
$obj->add_field("Kode_SKU", "SKU", "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", "PromoBarangJS.produk_select");
$obj->set_func_navi("PromoBarangJS.data_query('brow-produk')");
$ajson[] = $obj->db_table("divBrowProduk");
} else if ( $data == "detail_item" ) {
$db->Query("SELECT P.SatuanID,S.Nama_Satuan FROM inv_produk_kemasan P LEFT JOIN para_satuan S ON (S.SatuanID=P.SatuanID) WHERE P.InvID='".Param::Get("InvID",0)."'");
while ($db->Next()) {
$ajson[] = ['value' => $db->Row("SatuanID"), 'label' => $db->Row("Nama_Satuan")];
}
} else if ( $data == "default") {
echo '
<div class="fade-in">
<div class="card"><div class="card-header custom-style">Daftar Promo Barang</div><div class="card-body"><div class="row mb-1"><div class="col"><div class="input-group"><input class="form-control" id="Cari_Promo" 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="divDetail">&nbsp;</div></div></div>
</div>';
}
send_json($ajson);
?>
+152
View File
@@ -0,0 +1,152 @@
<?php
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/php/promo/iklan.php
Desc. : PHP - Pengaturan Promo Iklan
Created By : Siau Pheng ([email protected]).
Created Date : September 28th, 2014.
Last Modified : December 10th, 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");
$mode_detail = Param::Get("mode_detail");
$id_promo = Param::Get("PromoNotaID", 0);
if ( $data == "promo-detail" ) {
$atabel = ['PromoNotaID'=>0,'Jual_Grup'=>"",'Jual_Min'=>0,'CabID'=>0,'Promo_Iklan'=>"",'Jumlah_Promo'=>0,'Tgl_Mulai'=>tgl_ymd(),'Tgl_Akhir'=>tgl_sql2str(tgl_operasi(tgl_dmy(),0,1,0)),'Aktif'=>1];
if ($id_promo > 0) {
$db->Query("SELECT * FROM inv_promo_nota WHERE PromoNotaID='".$id_promo."' LIMIT 1");
if ($db->Next()) $atabel = array_merge($atabel, $db->AllRow());
}
$form = new Form($db);
$tpromo = $form->textbox("_", "Nama_Promo", $atabel['Nama_Promo'], true, false, "text");
$tcab = $form->option_db("_", "CabID", $atabel['CabID'], true, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY Nama_Cab", [0,"SEMUA CABANG"]);
$tj_grup = $form->textbox("_", "Jual_Grup", $atabel['Jual_Grup'], false, false, "text");
$tj_min = $form->textbox("_", "Jual_Min", $atabel['Jual_Min'], true, false, "double");
$tp_iklan = $form->textarea("_", "Promo_Iklan", $atabel['Promo_Iklan'], true, false, 2);
$tjpromo = $form->textbox("_", "Jumlah_Promo", $atabel['Jumlah_Promo'], true, false, "double");
$ttglmulai = $form->datebox("_", "Tgl_Mulai", $atabel['Tgl_Mulai'], true, false);
$ttglakhir = $form->datebox("_", "Tgl_Akhir", $atabel['Tgl_Akhir'], true, false);
$taktif = $form->radio("_", "Aktif", $atabel['Aktif'], true, false, ['1'=>"Ya",'0'=>"Tidak"]);
echo '
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label" for="Nama_Promo">Nama Promo</label>
<div class="col">'.$tpromo.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label" for="CabID">Nama Cabang</label>
<div class="col-sm-8 col-lg-4">'.$tcab.'</div>
</div>
<div class="row mb-1"><div class="col"><hr class="my-1"></div></div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label">Grup Barang</label>
<div class="col"><div class="input-group">'.$tj_grup.'<button id="butBrow1" class="btn btn-info" type="button" onclick="PromoIklanJS.grup_list();"><i class="bi-search"></i></button></div></div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label" for="Jual_Min">Minimal Penjualan</label>
<div class="col-sm-8 col-lg-4"><div class="input-group">'.$tj_min.Form_Info("Jumlah Minimal Penjualan untuk mendapatkan promo. Contoh : Rp 100.000").'</div></div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label" for="Promo_Iklan">Pesan Iklan</label>
<div class="col col-form-label">'.$tp_iklan.'</div>
</div>
<div class="row mb-1"><div class="col"><hr class="my-1"></div></div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label" for="Jumlah_Promo">Jumlah Promo</label>
<div class="col-sm-8 col-lg-4"><div class="input-group">'.$tjpromo.Form_Info("Jumlah Promo Iklan (per struk) yang diberikan. Contoh : 500 STRUK").'</div></div>
<label class="col-sm-4 col-lg-2 col-form-label" for="Tgl_Mulai">Tanggal Mulai</label>
<div class="col-sm-8 col-lg-4">'.$ttglmulai.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label" for="Aktif">Status Aktif ?</label>
<div class="col-sm-8 col-lg-4 col-form-label">'.$taktif.'</div>
<label class="col-sm-4 col-lg-2 col-form-label" for="Tgl_Akhir">Tanggal Akhir</label>
<div class="col-sm-8 col-lg-4">'.$ttglakhir.'</div>
</div>
<input type="hidden" id="PromoNotaID" value="'.$atabel['PromoNotaID'].'" >
<input type="hidden" id="mode_detail" value="'.$mode_detail.'" >';
} else if ( $data == "detail" ) {
if (in_array($mode_detail, ["insert","update","delete"])) {
$sql = new SQL($db);
$sql->set_table("inv_promo_nota");
$sql->add_param("Nama_Promo");
$sql->add_param("Jual_Min");
$sql->add_param("Jual_Grup");
$sql->add_param("CabID");
$sql->add_param("Promo_Iklan");
$sql->add_param("Jumlah_Promo");
$sql->add_param_date("Tgl_Mulai");
$sql->add_param_date("Tgl_Akhir");
$sql->add_param("Aktif");
$sql->add_param_userid();
$sql->add_where("PromoNotaID");
if ($mode_detail=="insert") {
$sql->add_param("Tipe_Promo", 1);
$sql->InsertDB();
} else if ($mode_detail=="update") {
$sql->UpdateDB();
} else if ($mode_detail=="delete") {
$sql->DeleteDB();
}
}
$tcari = trim(Param::Get("Cari_Promo"));
$tsql = ($tcari=="") ? "" : " WHERE CONCAT(P.Nama_Promo) LIKE '%".$tcari."%'";
$obj = new Table($db);
$obj->set_query("SELECT P.*,IF(P.CabID=0,'SEMUA CAB',C.Nama_Cab) Nama_Cab,(P.Jumlah_Promo-P.Jumlah_Proses) Jumlah_Sisa FROM (SELECT * FROM inv_promo_nota WHERE Tipe_Promo IN (1)) P LEFT JOIN para_cabang C ON (P.CabID=C.CabID)".$tsql);
$obj->add_field("PromoNotaID", "ID", "hid");
$obj->add_field("Nama_Cab", "Cabang", "l");
$obj->add_field("Nama_Promo", "Nama Promo", "awr");
$obj->add_field("Jual_Min", "Minimum", "r", "rupiah");
$obj->add_field("Jumlah_Promo", "Qty Promo", "r", "rupiah");
$obj->add_field("Jumlah_Sisa", "Qty Sisa", "r", "rupiah");
$obj->add_field("Tgl_Akhir", "Tgl. Akhir", "c", "sqltgl", null, "val-tgl");
$obj->add_field("Aktif", "Aktif", "c", "checkbox");
$obj->set_field_order("Nama_Cab", "A");
$obj->add_row_btn("clipboard", "Ubah", "PromoIklanJS.detail_ubah");
$obj->add_row_btn("trash", "Hapus", "PromoIklanJS.detail_hapus");
$obj->set_func_navi("PromoIklanJS.data_query('detail')");
$obj->set_func_btn("PromoIklanJS.detail_tambah", "+ Promo Iklan");
$ajson[] = $obj->json_table("divDetail");
} else if ( $data == "grup-list" ) {
$agrup = explode(",", Param::Get("Jual_Grup","0"));
$ajson['html'] = '<table class="table table-striped table-bordered table-hover dataTable no-footer dtr-inline" id="tabGrupList"><thead><tr><th class="l">Nama Grup Barang</th><th class="c">Aksi</th></tr></thead><tbody>';
$db->Query("SELECT * FROM inv_produk_grup ORDER BY Nama_Grup");
while ($db->Next()) {
$kode = "xGRUP_".$db->Row("Grup_InvID");
$checked = (in_array($db->Row("Grup_InvID"), $agrup)) ? "checked" : "";
$ajson['html'] .= sprintf('<tr><td class="l">%s</td><td class="c"><input class="form-check-input" type="checkbox" id="%s" value="%s" %s/></td></tr>', $db->Row("Nama_Grup"), $kode, $db->Row("Grup_InvID"), $checked);
}
$ajson['html'] .= '</tbody></table>';
} else if ( $data == "default") {
echo '
<div class="fade-in">
<div class="card"><div class="card-header custom-style">Daftar Promo Iklan</div><div class="card-body"><div class="row mb-1"><div class="col"><div class="input-group"><input class="form-control" id="Cari_Promo" 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="divDetail">&nbsp;</div></div></div>
</div>';
}
send_json($ajson);
?>
+200
View File
@@ -0,0 +1,200 @@
<?php
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/php/promo/total.php
Desc. : PHP - Pengaturan Promo Total Penjualan
Created By : Siau Pheng ([email protected]).
Created Date : September 28th, 2014.
Last Modified : December 10th, 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");
$mode_detail = Param::Get("mode_detail");
$id_promo = Param::Get("PromoID", 0);
if ( $data == "promo-detail" ) {
$atabel = ['PromoID'=>0,'Jual_Grup'=>"",'Jual_Min'=>0,'CabID'=>0,'Tipe_Promo'=>4,'Promo_InvID'=>0,'Promo_SatuanID'=>0,'Jumlah_Promo'=>0,'Tgl_Mulai'=>tgl_ymd(),'Tgl_Akhir'=>tgl_sql2str(tgl_operasi(tgl_dmy(),0,1,0)),'Aktif'=>1];
if ($id_promo > 0) {
$db->Query("SELECT * FROM inv_promo WHERE PromoID='".$id_promo."' LIMIT 1");
if ($db->Next()) $atabel = array_merge($atabel, $db->AllRow());
if ($atabel['Promo_InvID'] > 0) {
$db->Query("SELECT Nama_Produk Promo_Produk FROM inv_produk WHERE InvID='".$atabel['Promo_InvID']."' LIMIT 1");
if ($db->Next()) $atabel = array_merge($atabel, $db->AllRow());
}
}
$form = new Form($db);
$tpromo = $form->textbox("_", "Nama_Promo", $atabel['Nama_Promo'], true, false, "text");
$tcab = $form->option_db("_", "CabID", $atabel['CabID'], true, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY Nama_Cab", [0,"SEMUA CABANG"]);
$ttipe = $form->radio("_", "Tipe_Promo", $atabel['Tipe_Promo'], true, false, ['4'=>"Promo Potongan",'3'=>"Promo Barang"], null, "PromoTotalJS.oc_PilihP();");
$tsatpro = $form->option("_", "Promo_SatuanID", $atabel['Promo_SatuanID'], true, false, [$atabel['Promo_SatuanID']=>$atabel['Promo_SatuanID']]);
$tqty = $form->textbox("_", "Promo_Qty", $atabel['Promo_Qty'], true, false, "double");
$tprodukpro = $form->textbox("_", "Promo_Produk", $atabel['Promo_Produk'], true, false, "text");
$tj_grup = $form->textbox("_", "Jual_Grup", $atabel['Jual_Grup'], false, false, "text");
$tj_min = $form->textbox("_", "Jual_Min", $atabel['Jual_Min'], true, false, "double");
$tpjual = $form->textbox("_", "Promo_Jual", $atabel['Promo_Jual'], true, false, "double");
$tjpromo = $form->textbox("_", "Jumlah_Promo", $atabel['Jumlah_Promo'], true, false, "double");
$ttglmulai = $form->datebox("_", "Tgl_Mulai", $atabel['Tgl_Mulai'], true, false);
$ttglakhir = $form->datebox("_", "Tgl_Akhir", $atabel['Tgl_Akhir'], true, false);
$taktif = $form->radio("_", "Aktif", $atabel['Aktif'], true, false, ['1'=>"Ya",'0'=>"Tidak"]);
echo '
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label" for="Nama_Promo">Nama Promo</label>
<div class="col">'.$tpromo.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label" for="CabID">Nama Cabang</label>
<div class="col-sm-8 col-lg-4">'.$tcab.'</div>
</div>
<div class="row mb-1"><div class="col"><hr class="my-1"></div></div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label">Grup Barang</label>
<div class="col"><div class="input-group">'.$tj_grup.'<button id="butBrow1" class="btn btn-info" type="button" onclick="PromoTotalJS.grup_list();"><i class="bi-search"></i></button></div></div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label" for="Jual_Min">Minimal Penjualan</label>
<div class="col-sm-8 col-lg-4"><div class="input-group">'.$tj_min.Form_Info("Jumlah Minimal Penjualan untuk mendapatkan promo. Contoh : Rp 100.000").'</div></div>
</div>
<div class="row mb-1"><div class="col"><hr class="my-1"></div></div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label" for="Tipe_Promo">Pilihan Promo</label>
<div class="col col-form-label">'.$ttipe.'</div>
</div>
<div class="row mb-1 promo1">
<label class="col-sm-4 col-lg-2 col-form-label" for="Promo_Jual">Nilai Potongan</label>
<div class="col-sm-8 col-lg-4"><div class="input-group">'.$tpjual.Form_Info("Nilai Potongan Promo yang diberikan, jika Minimal Penjualan tercapai. Contoh : Rp 10.000").'</div></div>
</div>
<div class="row mb-1 promo2">
<label class="col-sm-4 col-lg-2 col-form-label" for="Promo_Produk">Barang Promo</label>
<div class="col"><div class="input-group">'.$tprodukpro.'<button id="butBrow2" class="btn btn-info" type="button" onclick="PromoTotalJS.produk_brow();"><i class="bi-search"></i></button></div></div>
</div>
<div class="row mb-1 promo2">
<label class="col-sm-4 col-lg-2 col-form-label" for="Promo_SatuanID">Satuan Promo</label>
<div class="col-sm-8 col-lg-4">'.$tsatpro.'</div>
<label class="col-sm-4 col-lg-2 col-form-label" for="Promo_Qty">Qty Promo</label>
<div class="col-sm-8 col-lg-4"><div class="input-group">'.$tqty.Form_Info("Jumlah Barang Promo yang diberikan sesuai kriteria. Contoh : 1 PCS").'</div></div>
</div>
<div class="row mb-1"><div class="col"><hr class="my-1"></div></div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label" for="Jumlah_Promo">Jumlah Promo</label>
<div class="col-sm-8 col-lg-4"><div class="input-group">'.$tjpromo.Form_Info("Jumlah Item Promo Barang yang diberikan. Contoh : 500 PCS").'</div></div>
<label class="col-sm-4 col-lg-2 col-form-label" for="Tgl_Mulai">Tanggal Mulai</label>
<div class="col-sm-8 col-lg-4">'.$ttglmulai.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label" for="Aktif">Status Aktif ?</label>
<div class="col-sm-8 col-lg-4 col-form-label">'.$taktif.'</div>
<label class="col-sm-4 col-lg-2 col-form-label" for="Tgl_Akhir">Tanggal Akhir</label>
<div class="col-sm-8 col-lg-4">'.$ttglakhir.'</div>
</div>
<input type="hidden" id="PromoID" value="'.$atabel['PromoID'].'" >
<input type="hidden" id="Promo_InvID" value="'.$atabel['Promo_InvID'].'" >
<input type="hidden" id="mode_detail" value="'.$mode_detail.'" >';
} else if ( $data == "detail" ) {
if (in_array($mode_detail, ["insert","update","delete"])) {
$sql = new SQL($db);
$sql->set_table("inv_promo");
$sql->add_param("Nama_Promo");
$sql->add_param("Jual_Min");
$sql->add_param("Jual_Grup");
$sql->add_param("CabID");
$sql->add_param("Tipe_Promo");
$sql->add_param("Promo_Jual");
$sql->add_param("Promo_InvID");
$sql->add_param("Promo_SatuanID");
$sql->add_param("Promo_Qty");
$sql->add_param("Jumlah_Promo");
$sql->add_param_date("Tgl_Mulai");
$sql->add_param_date("Tgl_Akhir");
$sql->add_param("Aktif");
$sql->add_param_userid();
$sql->add_where("PromoID");
if ($mode_detail=="insert") {
$sql->InsertDB();
} else if ($mode_detail=="update") {
$sql->UpdateDB();
} else if ($mode_detail=="delete") {
$sql->DeleteDB();
}
}
$tcari = trim(Param::Get("Cari_Promo"));
$tsql = ($tcari=="") ? "" : " WHERE CONCAT(P.Nama_Promo) LIKE '%".$tcari."%'";
$obj = new Table($db);
$obj->set_query("SELECT P.*,IF(P.CabID=0,'SEMUA CAB',C.Nama_Cab) Nama_Cab,(P.Jumlah_Promo-P.Jumlah_Proses) Jumlah_Sisa FROM (SELECT * FROM inv_promo WHERE Tipe_Promo IN (3,4)) P LEFT JOIN para_cabang C ON (P.CabID=C.CabID)".$tsql);
$obj->add_field("PromoID", "ID", "hid");
$obj->add_field("Nama_Cab", "Cabang", "l");
$obj->add_field("Nama_Promo", "Nama Promo", "awr");
$obj->add_field("Jual_Min", "Minimum", "r", "rupiah");
$obj->add_field("Jumlah_Promo", "Qty Promo", "r", "rupiah");
$obj->add_field("Jumlah_Sisa", "Qty Sisa", "r", "rupiah");
$obj->add_field("Tgl_Akhir", "Tgl. Akhir", "c", "sqltgl", null, "val-tgl");
$obj->add_field("Aktif", "Aktif", "c", "checkbox");
$obj->set_field_order("Nama_Cab", "A");
$obj->add_row_btn("clipboard", "Ubah", "PromoTotalJS.detail_ubah");
$obj->add_row_btn("trash", "Hapus", "PromoTotalJS.detail_hapus");
$obj->set_func_navi("PromoTotalJS.data_query('detail')");
$obj->set_func_btn("PromoTotalJS.detail_tambah", "+ Promo Total");
$ajson[] = $obj->json_table("divDetail");
} 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.Aktif=1".$tsql);
$obj->add_field("InvID", "ID", "hid");
$obj->add_field("Kode_SKU", "SKU", "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", "PromoTotalJS.produk_select");
$obj->set_func_navi("PromoTotalJS.data_query('brow-produk')");
$ajson[] = $obj->db_table("divBrowProduk");
} else if ( $data == "detail_item" ) {
$db->Query("SELECT P.SatuanID,S.Nama_Satuan FROM inv_produk_kemasan P LEFT JOIN para_satuan S ON (S.SatuanID=P.SatuanID) WHERE P.InvID='".Param::Get("InvID",0)."'");
while ($db->Next()) {
$ajson[] = ['value' => $db->Row("SatuanID"), 'label' => $db->Row("Nama_Satuan")];
}
} else if ( $data == "grup-list" ) {
$agrup = explode(",", Param::Get("Jual_Grup","0"));
$ajson['html'] = '<table class="table table-striped table-bordered table-hover dataTable no-footer dtr-inline" id="tabGrupList"><thead><tr><th class="l">Nama Grup Barang</th><th class="c">Aksi</th></tr></thead><tbody>';
$db->Query("SELECT * FROM inv_produk_grup ORDER BY Nama_Grup");
while ($db->Next()) {
$kode = "xGRUP_".$db->Row("Grup_InvID");
$checked = (in_array($db->Row("Grup_InvID"), $agrup)) ? "checked" : "";
$ajson['html'] .= sprintf('<tr><td class="l">%s</td><td class="c"><input class="form-check-input" type="checkbox" id="%s" value="%s" %s/></td></tr>', $db->Row("Nama_Grup"), $kode, $db->Row("Grup_InvID"), $checked);
}
$ajson['html'] .= '</tbody></table>';
} else if ( $data == "default") {
echo '
<div class="fade-in">
<div class="card"><div class="card-header custom-style">Daftar Promo Total Penjualan</div><div class="card-body"><div class="row mb-1"><div class="col"><div class="input-group"><input class="form-control" id="Cari_Promo" 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="divDetail">&nbsp;</div></div></div>
</div>';
}
send_json($ajson);
?>
+159
View File
@@ -0,0 +1,159 @@
<?php
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/php/repo/barcode.php
Desc. : PHP - Cetak Barcode Label
Created By : Siau Pheng ([email protected]).
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);
?>
+205
View File
@@ -0,0 +1,205 @@
<?php
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/php/repo/beli.php
Desc. : PHP - Laporan Pembelian
Created By : Siau Pheng ([email protected]).
Created Date : April 12th, 2011.
Last Modified : October 10th, 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", 0);
if (in_array($data, ["print","export"])) {
$tipe = Param::Get("Tipe", "R"); // R or D
$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 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 = $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_sup==0) ? "" : " AND SupID='".$id_sup."'";
//id_grup ?
if ($tipe=="R") {
$db->Query("SELECT S.Nama_Sup,SUM(B.Total_Hutang+B.Total_Diskon+B.Total_Bulat) Total_Beli,SUM(B.Total_Diskon+B.Total_Bulat) Total_Diskon,SUM(B.Total_Hutang) Total FROM (SELECT * FROM inv_beli WHERE Data_Beli=1 AND (Tgl_Beli BETWEEN '".$tglfrom."' AND '".$tglto."')".$tsql.") B LEFT JOIN para_supplier S ON (B.SupID=S.SupID) GROUP BY B.SupID ORDER BY S.Nama_Sup");
} else {
$db->Query("SELECT B.*,DATE_FORMAT(B.Tgl_Beli,'%d-%m-%Y') Tgl_Beli2,S.Nama_Sup,B.Total_Beli-B.Total_Diskon Total FROM (SELECT * FROM inv_beli WHERE Data_Beli=1 AND (Tgl_Beli BETWEEN '".$tglfrom."' AND '".$tglto."')".$tsql.") B LEFT JOIN para_supplier S ON (B.SupID=S.SupID) ORDER BY B.No_Beli");
}
}
if ( $data == "print" ) {
Report_Header(($tipe=="R"?"REKAP":"DETAIL")." PEMBELIAN", "Periode : ".$tglheader);
$pre = new \siaupheng\fonia3\Printer\PrintHTML();
if ($tipe=="R") {
$pre->add_field("No.",10,"C");
$pre->add_field("Nama Supplier",50,"L");
$pre->add_field("Sub. Total",20,"R","rupiah");
$pre->add_field("Diskon",20,"R","rupiah");
$pre->add_field("Total",20,"R","rupiah");
if ($id_sup>0) $pre->add_span(array("Nama Supplier : ".$nama_sup,5,"L,B"));
if ($id_grup>0) $pre->add_span(array("Grup Barang : ".$nama_grup,5,"L,B"));
$tot_beli = 0; $tot_diskon = 0; $nomor = 0;
while ($db->Next()) {
//if ($db->RowFloat("Total", 0) == 0) continue;
$tot_beli += $db->Row("Total_Beli");
$tot_diskon += $db->Row("Total_Diskon");
$pre->add_value(++$nomor, $db->Row("Nama_Sup"), $db->Row("Total_Beli"), $db->Row("Total_Diskon"), $db->Row("Total"));
}
$pre->add_span(array("GRAND TOTAL",2,"R,B"),array($tot_beli,1,"R,B","rupiah"),array($tot_diskon,1,"R,B","rupiah"),array($tot_beli-$tot_diskon,1,"R,B","rupiah"));
} else {
$pre->add_field("No. Nota",30,"C");
$pre->add_field("Tgl. Nota",30,"C", "tgl_sql2str");
$pre->add_field("No. Faktur",30,"L");
$pre->add_field("Nama Supplier",50,"L");
$pre->add_field("Sub. Total",20,"R","rupiah");
$pre->add_field("Diskon",20,"R","rupiah");
$pre->add_field("Total",30,"R","rupiah");
if ($id_sup>0) $pre->add_span(array("Nama Supplier : ".$nama_sup,7,"L,B"));
if ($id_grup>0) $pre->add_span(array("Grup Barang : ".$nama_grup,7,"L,B"));
$tot_beli = 0; $tot_diskon = 0;
while ($db->Next()) {
//if ($db->RowFloat("Total", 0) == 0) continue;
$tot_beli += $db->Row("Total_Beli");
$tot_diskon += $db->Row("Total_Diskon");
$pre->add_value($db->Row("No_Beli"), $db->Row("Tgl_Beli"), $db->Row("No_Faktur"), $db->Row("Nama_Sup"), $db->Row("Total_Beli"), $db->Row("Total_Diskon"), $db->Row("Total"));
}
$pre->add_span(array("GRAND TOTAL",4,"R,B"),array($tot_beli,1,"R,B","rupiah"),array($tot_diskon,1,"R,B","rupiah"),array($tot_beli-$tot_diskon,1,"R,B","rupiah"));
}
$pre->add_stamp(1, true);
$pre->show();
} else if ( $data == "export" ) {
$xls = new SimpleXLS([
'title'=>"Data Pembelian",
'desc'=>"Export Data Pembelian"
]);
if ($tipe=="R") {
$xls->add_header("<b>".$_SESSION['__WEB_APP']['REG_NAME']."</b>");
$xls->add_header("<b>DATA REKAP PEMBELIAN</b>");
$xls->add_header("Periode : ".$tglheader);
$xls->add_field("No.", 5, "C");
$xls->add_field("Nama Supplier", 25, "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);
if ($id_sup>0) $xls->add_span(array("Nama Supplier : ".$nama_sup,5,"L,B"));
if ($id_grup>0) $xls->add_span(array("Grup Barang : ".$nama_grup,5,"L,B"));
$tot_beli = 0; $tot_diskon = 0; $nomor = 0;
while ($db->Next()) {
if ($db->RowFloat("Total", 0) == 0) continue;
$tot_beli += $db->Row("Total_Beli");
$tot_diskon += $db->Row("Total_Diskon");
$xls->add_value(++$nomor, $db->Row("Nama_Sup"), $db->Row("Total_Beli"), $db->Row("Total_Diskon"), $db->Row("Total"));
}
$xls->add_span(array("GRAND TOTAL",2,"R,B"),array($tot_beli,1,"R,B,N"),array($tot_diskon,1,"R,B,N"),array($tot_beli-$tot_diskon,1,"R,B,N"));
} else {
$xls->add_header("<b>".$_SESSION['__WEB_APP']['REG_NAME']."</b>");
$xls->add_header("<b>DATA DETAIL PEMBELIAN</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("No. Faktur", 15, "L");
$xls->add_field("Nama Supplier", 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);
if ($id_sup>0) $xls->add_span(array("Nama Supplier : ".$nama_sup,7,"L,B"));
if ($id_grup>0) $xls->add_span(array("Grup Barang : ".$nama_grup,7,"L,B"));
$tot_beli = 0; $tot_diskon = 0;
while ($db->Next()) {
if ($db->RowFloat("Total", 0) == 0) continue;
$tot_beli += $db->Row("Total_Beli");
$tot_diskon += $db->Row("Total_Diskon");
$xls->add_value($db->Row("No_Beli"), $db->Row("Tgl_Beli"), $db->Row("No_Faktur"), $db->Row("Nama_Sup"), $db->Row("Total_Beli"), $db->Row("Total_Diskon"), $db->Row("Total"));
}
$xls->add_span(array("GRAND TOTAL",4,"R,B"),array($tot_beli,1,"R,B,N"),array($tot_diskon,1,"R,B,N"),array($tot_beli-$tot_diskon,1,"R,B,N"));
}
$xls->add_stamp(1, true);
$xls->send("Data Pembelian ".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, true, 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="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">'.$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="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>';
}
?>
+231
View File
@@ -0,0 +1,231 @@
<?php
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/php/repo/beli_analisa.php
Desc. : PHP - Laporan Analisa Pembelian
Created By : Siau Pheng ([email protected]).
Created Date : August 4th, 2013.
Last Modified : December 12th, 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", 0);
if (in_array($data, ["print","export"])) {
$tipe = Param::Get("Tipe", "V"); // V or R
$id_sup = Param::Get("SupID", 0);
$id_grup = Param::Get("Grup_InvID", 0);
$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 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 = $tglfrom;
if ($tglfrom!==$tglto) $tglheader .= " S/D ".$tglto;
$tglfrom = tgl_sql2str($tglfrom);
$tglto = tgl_sql2str($tglto);
$tsql1 = ($id_cab==0) ? "" : " AND CabID='".$id_cab."'";
$tsql1 .= ($id_sup==0) ? "" : " AND No_Ref IN (SELECT No_Beli FROM inv_beli WHERE SupID='".$id_cab."' AND (Tgl_Beli BETWEEN '".$tglfrom."' AND '".$tglto."'))";
$tsql2 = ($id_grup==0) ? "" : " WHERE P.Grup_InvID='".$id_grup."'";
if ($tipe=="V") {
$db->Query("SELECT P.*,D.Volume FROM (SELECT InvID,SUM(Stok) Volume FROM inv_detail WHERE Stok>0 AND NotaID IN (3,4) AND (Tgl_Ref BETWEEN '".$tglfrom."' AND '".$tglto."')".$tsql1." GROUP BY InvID) D LEFT JOIN vi_inv_produk2 P ON (D.InvID=P.InvID)".$tsql2." ORDER BY P.Nama_Produk");
} else if ($tipe=="R") {
$db->Query("SELECT P.*,D.Rupiah FROM (SELECT InvID,SUM(Qty*Harga_Beli) Rupiah FROM inv_detail WHERE Stok>0 AND NotaID IN (3,4) AND (Tgl_Ref BETWEEN '".$tglfrom."' AND '".$tglto."')".$tsql1." GROUP BY InvID) D LEFT JOIN inv_produk P ON (D.InvID=P.InvID)".$tsql2." ORDER BY P.Nama_Produk");
}
}
if ( $data == "print" ) {
Report_Header("REKAP ".($tipe=="V"?"VOLUME":"RUPIAH")." PEMBELIAN", "Periode : ".$tglheader);
$pre = new \siaupheng\fonia3\Printer\PrintHTML();
if ($tipe=="V") {
$pre->add_field("No.",10,"C");
$pre->add_field("Nama Barang",50,"L");
$pre->add_field("Jumlah",20,"R");
$pre->add_field("Mingguan",20,"R");
if ($id_sup>0) $pre->add_span(array("Nama Supplier : ".$nama_sup,4,"L,B"));
if ($id_grup>0) $pre->add_span(array("Grup Barang : ".$nama_grup,4,"L,B"));
$nomor = 0;
while ($db->Next()) {
$total = $db->Row("Volume",0);
$mg_total = $total / ($jum_hari/7);
$kali = $db->Row("Qty",0);
if ($kali > 0) {
$norm = floor($total / $kali);
$sisa = $total - ($norm * $kali);
$mg_norm = floor($mg_total / $kali);
$mg_sisa = $mg_total - ($mg_norm * $kali);
} else {
$norm = 0;
$sisa = $total;
$mg_norm = 0;
$mg_sisa = $mg_total;
}
$stok = rupiah($norm,0)." ".$db->Row("Satuan_Normal");
$mg_stok = rupiah($mg_norm,0)." ".$db->Row("Satuan_Normal");
if ($db->Row("Satuan_Normal")<>$db->Row("Satuan_Stok")) {
$stok .= ", ".rupiah($sisa,0)." ".$db->Row("Satuan_Stok");
$mg_stok .= ", ".rupiah($mg_sisa,0)." ".$db->Row("Satuan_Stok");
}
$pre->add_value(++$nomor, $db->Row("Nama_Produk"), $stok, $mg_stok);
}
} else {
$pre->add_field("No.",10,"C");
$pre->add_field("Nama Barang",50,"L");
$pre->add_field("Jumlah",20,"R","rupiah");
$pre->add_field("Mingguan",20,"R","rupiah");
if ($id_sup>0) $pre->add_span(array("Nama Supplier : ".$nama_sup,4,"L,B"));
if ($id_grup>0) $pre->add_span(array("Grup Barang : ".$nama_grup,4,"L,B"));
$nomor = 0; $tot_rup = 0; $tot_mg = 0;
while ($db->Next()) {
$mg_avg = ($db->Row("Rupiah",0)>0) ? $db->Row("Rupiah",0) / ($jum_hari/7) : 0;
$tot_rup += $db->Row("Rupiah");
$tot_mg += $mg_avg;
$pre->add_value(++$nomor, $db->Row("Nama_Produk"), $db->Row("Rupiah"), $mg_avg);
}
$pre->add_span(array("TOTAL",2,"R,B"),array(rupiah($tot_rup),1,"R,B"),array(rupiah($tot_mg),1,"R,B"));
}
$pre->add_stamp(1, true);
$pre->show();
} else if ( $data == "export" ) {
$xls = new SimpleXLS([
'title'=>"Data Analisa Pembelian",
'desc'=>"Export Data Analisa Pembelian"
]);
if ($tipe=="V") {
$xls->add_header("<b>".$_SESSION['__WEB_APP']['REG_NAME']."</b>");
$xls->add_header("<b>DATA REKAP VOLUME PEMBELIAN</b>");
$xls->add_header("Periode : ".$tglheader);
$xls->add_field("No.", 5, "C");
$xls->add_field("Nama Barang", 25, "L");
$xls->add_field("Jumlah", 15, "R");
$xls->add_field("Mingguan", 15, "R");
$xls->add_sheet("".str_replace("S/D","-",$tglheader), true);
if ($id_sup>0) $xls->add_span(array("Nama Supplier : ".$nama_sup,4,"L,B"));
if ($id_grup>0) $xls->add_span(array("Grup Barang : ".$nama_grup,4,"L,B"));
$nomor = 0;
while ($db->Next()) {
$total = $db->Row("Volume",0);
$mg_total = $total / ($jum_hari/7);
$kali = $db->Row("Qty",0);
if ($kali > 0) {
$norm = floor($total / $kali);
$sisa = $total - ($norm * $kali);
$mg_norm = floor($mg_total / $kali);
$mg_sisa = $mg_total - ($mg_norm * $kali);
} else {
$norm = 0;
$sisa = $total;
$mg_norm = 0;
$mg_sisa = $mg_total;
}
$stok = rupiah($norm,0)." ".$db->Row("Satuan_Normal");
$mg_stok = rupiah($mg_norm,0)." ".$db->Row("Satuan_Normal");
if ($db->Row("Satuan_Normal")<>$db->Row("Satuan_Stok")) {
$stok .= ", ".rupiah($sisa,0)." ".$db->Row("Satuan_Stok");
$mg_stok .= ", ".rupiah($mg_sisa,0)." ".$db->Row("Satuan_Stok");
}
$xls->add_value(++$nomor, $db->Row("Nama_Produk"), $stok, $mg_stok);
}
} else {
$xls->add_header("<b>".$_SESSION['__WEB_APP']['REG_NAME']."</b>");
$xls->add_header("<b>DATA REKAP RUPIAH PEMBELIAN</b>");
$xls->add_header("Periode : ".$tglheader);
$xls->add_field("No.", 5, "C");
$xls->add_field("Nama Barang", 25, "L");
$xls->add_field("Jumlah", 15, "R,N");
$xls->add_field("Mingguan", 15, "R,N");
$xls->add_sheet("".str_replace("S/D","-",$tglheader), true);
if ($id_sup>0) $xls->add_span(array("Nama Supplier : ".$nama_sup,4,"L,B"));
if ($id_grup>0) $xls->add_span(array("Grup Barang : ".$nama_grup,4,"L,B"));
$nomor = 0; $tot_rup = 0; $tot_mg = 0;
while ($db->Next()) {
$mg_avg = ($db->Row("Rupiah",0)>0) ? $db->Row("Rupiah",0) / ($jum_hari/7) : 0;
$tot_rup += $db->Row("Rupiah");
$tot_mg += $mg_avg;
$xls->add_value(++$nomor, $db->Row("Nama_Produk"), $db->Row("Rupiah"), $mg_avg);
}
$xls->add_span(array("TOTAL",2,"R,B"),array($tot_rup,1,"R,B,N"),array($tot_mg,1,"R,B,N"));
}
$xls->add_stamp(1, true);
$xls->send("Data Analisa Pembelian ".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"]);
$tcab = $form->option_db("_", "CabID", $id_cab, true, 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="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">'.$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="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>';
}
?>
+137
View File
@@ -0,0 +1,137 @@
<?php
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/php/repo/beli_mutasi.php
Desc. : PHP - Laporan Mutasi Pembelian
Created By : Siau Pheng ([email protected]).
Created Date : April 3rd, 2013.
Last Modified : December 12th, 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", 0);
if (in_array($data, ["print","export"])) {
$id_sup = Param::Get("SupID", 0);
$tglfrom = Param::Get("Tgl_From");
$tglto = Param::Get("Tgl_To");
$nama_sup = "";
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");
}
// 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_sup==0) ? "" : " AND SupID='".$id_cab."'";
$n_saldo = 0;
$db->Query("SELECT SUM(Total_Hutang) Total FROM inv_beli WHERE Data_Beli=1 AND Tgl_Beli<'".$tglfrom."'".$tsql);
if ($db->Next()) $n_saldo = $db->RowFloat("Total", 0);
$db->Query("SELECT SUM(Total_Bayar+Total_Potong) Bayar FROM inv_beli_lunas WHERE No_Beli IN (SELECT No_Beli FROM inv_beli WHERE Data_Beli=1".$tsql.") AND Tgl_Bayar<'".$tglfrom."'");
if ($db->Next()) $b_saldo -= $db->RowFloat("Bayar", 0);
$db->Query("(SELECT Tgl_Beli,SUM(Total_Hutang) Total,0 Bayar FROM inv_beli WHERE Data_Beli=1 AND (Tgl_Beli BETWEEN '".$tglfrom."' AND '".$tglto."')".$tsql." GROUP BY Tgl_Beli) UNION ALL (SELECT Tgl_Bayar Tgl_Beli,0 Total,SUM(Total_Bayar+Total_Potong) Bayar FROM inv_beli_lunas WHERE No_Beli IN (SELECT No_Beli FROM inv_beli WHERE Data_Beli=1".$tsql.") AND (Tgl_Bayar BETWEEN '".$tglfrom."' AND '".$tglto."') GROUP BY Tgl_Bayar) ORDER BY Tgl_Beli,Total DESC");
}
if ( $data == "print" ) {
Report_Header("MUTASI PEMBELIAN", "Periode : ".$tglheader);
$pre = new \siaupheng\fonia3\Printer\PrintHTML();
$pre->add_field("Tanggal",10,"C","tgl_sql2str");
$pre->add_field("Nota / Bon",20,"R","rupiah");
$pre->add_field("Bayar",20,"R","rupiah");
$pre->add_field("Sisa",20,"R","rupiah");
if ($id_sup>0) $pre->add_span(array("Nama Supplier : ".$nama_sup,4,"L,B"));
$tot_sub = 0; $tot_bayar = 0;
$pre->add_span(["SALDO AWAL",1,"R,B"],["",1,"L"],["",1,"L"],[$n_saldo,1,"R,B","rupiah"]);
while ($db->Next()) {
$tot_sub += $db->Row("Total");
$tot_bayar += $db->Row("Bayar");
$n_saldo += $db->Row("Total") - $db->Row("Bayar");
$pre->add_value($db->Row("Tgl_Beli"), $db->Row("Total"), $db->Row("Bayar"), $n_saldo);
}
$pre->add_span(["SALDO AKHIR",1,"R,B"],[$tot_sub,1,"R,B","rupiah"],[$tot_bayar,1,"R,B","rupiah"],[$n_saldo,1,"R,B","rupiah"]);
$pre->add_stamp(1, true);
$pre->show();
} else if ( $data == "export" ) {
$xls = new SimpleXLS([
'title'=>"Data Mutasi Pembelian",
'desc'=>"Export Data Mutasi Pembelian"
]);
$xls->add_header("<b>".$_SESSION['__WEB_APP']['REG_NAME']."</b>");
$xls->add_header("<b>DATA MUTASI PEMBELIAN</b>");
$xls->add_header("Periode : ".$tglheader);
$xls->add_field("Tanggal", 10, "C");
$xls->add_field("Nota / Bon", 15, "R,N");
$xls->add_field("Bayar", 15, "R,N");
$xls->add_field("Sisa", 15, "R,N");
$xls->add_sheet("".str_replace("S/D","-",$tglheader), true);
if ($id_sup>0) $xls->add_span(array("Nama Supplier : ".$nama_sup,4,"L,B"));
$tot_sub = 0; $tot_bayar = 0;
$xls->add_span(["SALDO AWAL",1,"R,B"],["",1,"L"],["",1,"L"],[$n_saldo,1,"R,B","rupiah"]);
while ($db->Next()) {
$tot_sub += $db->Row("Total");
$tot_bayar += $db->Row("Bayar");
$n_saldo += $db->Row("Total") - $db->Row("Bayar");
$xls->add_value($db->Row("Tgl_Beli"), $db->Row("Total"), $db->Row("Bayar"), $n_saldo);
}
$xls->add_span(["SALDO AKHIR",1,"R,B"],[$tot_sub,1,"R,B","rupiah"],[$tot_bayar,1,"R,B","rupiah"],[$n_saldo,1,"R,B","rupiah"]);
$xls->add_stamp(1, true);
$xls->send("Data Mutasi Pembelian ".str_replace("S/D","-",$tglheader).".xlsx");
unset($xls);
} else if ( $data == "default") {
$form = new Form($db);
$tcab = $form->option_db("_", "CabID", $id_cab, true, 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"]);
$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">'.$tsup.'</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>';
}
?>
+174
View File
@@ -0,0 +1,174 @@
<?php
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/php/repo/beli_retur.php
Desc. : PHP - Laporan Retur Pembelian
Created By : Siau Pheng ([email protected]).
Created Date : April 12th, 2011.
Last Modified : December 12th, 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", 0);
if (in_array($data, ["print","export"])) {
$tipe = Param::Get("Tipe", "R"); // R or D
$id_sup = Param::Get("SupID", 0);
$tglfrom = Param::Get("Tgl_From");
$tglto = Param::Get("Tgl_To");
$nama_sup = "";
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");
}
// 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_sup==0) ? "" : " AND SupID='".$id_cab."'";
if ($tipe=="R") {
$db->Query("SELECT B.*,S.Nama_Sup FROM (SELECT SupID,SUM(-Total_Hutang) Total_Retur FROM inv_beli WHERE Data_Beli=0 AND (Tgl_Beli BETWEEN '".$tglfrom."' AND '".$tglto."')".$tsql." GROUP BY SupID) B LEFT JOIN para_supplier S ON (B.SupID=S.SupID) ORDER BY S.Nama_Sup");
} else {
$db->Query("SELECT B.*,S.Nama_Sup,-B.Total_Hutang Retur FROM (SELECT * FROM inv_beli WHERE Data_Beli=0 AND (Tgl_Beli BETWEEN '".$tglfrom."' AND '".$tglto."')".$tsql.") B LEFT JOIN para_supplier S ON (B.SupID=S.SupID) ORDER BY B.No_Beli");
}
}
if ( $data == "print" ) {
Report_Header(($tipe=="R"?"REKAP":"DETAIL")." RETUR PEMBELIAN", "Periode : ".$tglheader);
$pre = new \siaupheng\fonia3\Printer\PrintHTML();
if ($tipe=="R") {
$pre->add_field("No.",10,"C");
$pre->add_field("Nama Supplier",50,"L");
$pre->add_field("Total",20,"R","rupiah");
if ($id_sup>0) $pre->add_span(array("Nama Supplier : ".$nama_sup,3,"L,B"));
$tot_retur = 0; $nomor = 0;
while ($db->Next()) {
$tot_retur += $db->Row("Total_Retur");
$pre->add_value(++$nomor, $db->Row("Nama_Sup"), $db->Row("Total_Retur"));
}
$pre->add_span(array("GRAND TOTAL",2,"R,B"),array($tot_retur,1,"R,B","rupiah"));
} else {
$pre->add_field("No. Nota",30,"C");
$pre->add_field("Tgl. Nota",30,"C", "tgl_sql2str");
$pre->add_field("Nama Supplier",50,"L");
$pre->add_field("Total",30,"R","rupiah");
$pre->add_field("Catatan",50,"L");
if ($id_sup>0) $pre->add_span(array("Nama Supplier : ".$nama_sup,5,"L,B"));
$tot_retur = 0;
while ($db->Next()) {
$tot_retur += $db->Row("Retur");
$pre->add_value($db->Row("No_Beli"), $db->Row("Tgl_Beli"), $db->Row("Nama_Sup"), $db->Row("Retur"), $db->Row("No_Faktur"));
}
$pre->add_span(array("GRAND TOTAL",3,"R,B"),array($tot_retur,1,"R,B","rupiah"),["&nbsp;",1,"L"]);
}
$pre->add_stamp(1, true);
$pre->show();
} else if ( $data == "export" ) {
$xls = new SimpleXLS([
'title'=>"Data Retur Pembelian",
'desc'=>"Export Data Retur Pembelian"
]);
if ($tipe=="R") {
$xls->add_header("<b>".$_SESSION['__WEB_APP']['REG_NAME']."</b>");
$xls->add_header("<b>DATA REKAP RETUR PEMBELIAN</b>");
$xls->add_header("Periode : ".$tglheader);
$xls->add_field("No.", 5, "C");
$xls->add_field("Nama Supplier", 25, "L");
$xls->add_field("Total", 15, "R,N");
$xls->add_sheet("".str_replace("S/D","-",$tglheader), true);
if ($id_sup>0) $xls->add_span(array("Nama Supplier : ".$nama_sup,3,"L,B"));
$tot_retur = 0; $nomor = 0;
while ($db->Next()) {
$tot_retur += $db->Row("Total_Retur");
$xls->add_value(++$nomor, $db->Row("Nama_Sup"), $db->Row("Total_Retur"));
}
$xls->add_span(array("GRAND TOTAL",2,"R,B"),array($tot_retur,1,"R,B,N"));
} else {
$xls->add_header("<b>".$_SESSION['__WEB_APP']['REG_NAME']."</b>");
$xls->add_header("<b>DATA DETAIL RETUR PEMBELIAN</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 Supplier", 20, "L");
$xls->add_field("Total", 15, "R,N");
$xls->add_field("Catatan", 25, "L");
$xls->add_sheet("".str_replace("S/D","-",$tglheader), true);
if ($id_sup>0) $xls->add_span(array("Nama Supplier : ".$nama_sup,5,"L,B"));
$tot_retur = 0;
while ($db->Next()) {
$tot_retur += $db->Row("Retur");
$xls->add_value($db->Row("No_Beli"), $db->Row("Tgl_Beli"), $db->Row("Nama_Sup"), $db->Row("Retur"), $db->Row("No_Faktur"));
}
$xls->add_span(array("GRAND TOTAL",3,"R,B"),array($tot_retur,1,"R,B,N"),["&nbsp;",1,"L"]);
}
$xls->add_stamp(1, true);
$xls->send("Data Retur Pembelian ".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, true, 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"]);
$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">'.$tsup.'</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>';
}
?>
+229
View File
@@ -0,0 +1,229 @@
<?php
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/php/repo/dana_pos.php
Desc. : PHP - Laporan Penerimaan Kasir / POS
Created By : Siau Pheng ([email protected]).
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", 0);
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");
//$pre->add_header($_SESSION['__WEB_APP']['REG_ADDRESS'], $_SESSION['__WEB_APP']['REG_CITY']);
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, true, 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>';
}
?>
+183
View File
@@ -0,0 +1,183 @@
<?php
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/php/repo/hutang.php
Desc. : PHP - Laporan Hutang Supplier
Created By : Siau Pheng ([email protected]).
Created Date : July 17th, 2011.
Last Modified : October 16th, 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", 0);
if (in_array($data, ["print","export"])) {
$tipe = Param::Get("Tipe", "R"); // R or D
$id_sup = Param::Get("SupID", 0);
$tglfrom = Param::Get("Tgl_From");
$tglto = Param::Get("Tgl_To");
$nama_sup = "";
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");
}
// generate report header
$tglheader = $tglfrom;
if ($tglfrom!==$tglto) $tglheader .= " S/D ".$tglto;
$tglfrom = tgl_sql2str($tglfrom);
$tglto = tgl_sql2str($tglto);
$tsql = ($id_sup>0) ? " AND SupID='".$id_sup."'" : "";
// query data laporan
if ($tipe=="R") {
$db->Query("SELECT B.*,S.Nama_Sup FROM (SELECT SupID,SUM(Total_Hutang) Total_Hutang,SUM(Total_Bayar+Total_Potong) Total_Bayar FROM inv_beli WHERE Lunas=0 AND (Tgl_Beli BETWEEN '".$tglfrom."' AND '".$tglto."')".$tsql." GROUP BY SupID) B LEFT JOIN para_supplier S ON (B.SupID=S.SupID) ORDER BY S.Nama_Sup");
} else {
$db->Query("SELECT B.*,CONCAT(S.Nama_Sup,IF(B.Data_Beli=1,'',' <i>(Retur)</i>')) Nama_Sup,B.Total_Hutang Total_Hutang,B.Total_Bayar+B.Total_Potong Total_Bayar FROM (SELECT * FROM inv_beli WHERE Lunas=0 AND (Tgl_Beli BETWEEN '".$tglfrom."' AND '".$tglto."')".$tsql.") B LEFT JOIN para_supplier S ON (B.SupID=S.SupID) ORDER BY B.No_Beli");
}
}
if ( $data == "print" ) {
Report_Header(($tipe=="R"?"REKAP":"DETAIL")." HUTANG SUPPLIER", "Periode : ".$tglheader);
$pre = new \siaupheng\fonia3\Printer\PrintHTML();
if ($tipe=="R") {
$pre->add_field("No.",10,"C");
$pre->add_field("Nama Supplier",120,"L");
$pre->add_field("Jumlah Faktur",50,"R","rupiah2");
$pre->add_field("Jumlah Bayar",50,"R","rupiah2");
$pre->add_field("Sisa Hutang",50,"R","rupiah2");
if ($id_sup>0) $pre->add_span(array("Nama Supplier : ".$nama_sup,5,"L,B"));
$tot_hut = 0; $tot_bayar = 0; $nomor = 0;
while ($db->Next()) {
$tot_hut += $db->Row("Total_Hutang");
$tot_bayar += $db->Row("Total_Bayar");
$pre->add_value(++$nomor, $db->Row("Nama_Sup"), $db->Row("Total_Hutang"), $db->Row("Total_Bayar"), $db->Row("Total_Hutang")-$db->Row("Total_Bayar"));
}
$pre->add_span(array("GRAND TOTAL",2,"R,B"),array($tot_hut,1,"R,B","rupiah2"),array($tot_bayar,1,"R,B","rupiah2"),array($tot_hut-$tot_bayar,1,"R,B","rupiah2"));
} else {
$pre->add_field("No. Nota",10,"C");
$pre->add_field("Tgl. Nota",10,"C","sqltgl");
$pre->add_field("Nama Supplier",120,"L");
$pre->add_field("Jumlah",50,"R","rupiah2");
$pre->add_field("Bayar",50,"R","rupiah2");
$pre->add_field("Sisa Hutang",50,"R","rupiah2");
if ($id_sup>0) $pre->add_span(array("Nama Supplier : ".$nama_sup,6,"L,B"));
$tot_hut = 0; $tot_bayar = 0;
while ($db->Next()) {
$tot_hut += $db->Row("Total_Hutang");
$tot_bayar += $db->Row("Total_Bayar");
$pre->add_value($db->Row("No_Beli"), $db->Row("Tgl_Beli"), $db->Row("Nama_Sup"), $db->Row("Total_Hutang"), $db->Row("Total_Bayar"), $db->Row("Total_Hutang")-$db->Row("Total_Bayar"));
}
$pre->add_span(array("GRAND TOTAL",3,"R,B"),array($tot_hut,1,"R,B","rupiah2"),array($tot_bayar,1,"R,B","rupiah2"),array($tot_hut-$tot_bayar,1,"R,B","rupiah2"));
}
$pre->add_stamp(1, true);
$pre->show();
} else if ( $data == "export" ) {
$xls = new SimpleXLS([
'title'=>"Data Hutang Supplier",
'desc'=>"Export Data Hutang Supplier"
]);
if ($tipe=="R") {
$xls->add_header($_SESSION['__WEB_APP']['REG_NAME']);
$xls->add_header("DATA REKAP HUTANG SUPPLIER");
$xls->add_header("Periode : ".$tglheader);
$xls->add_field("No.", 10, "C");
$xls->add_field("Nama Supplier", 80, "L");
$xls->add_field("Jumlah Faktur", 20, "R,N");
$xls->add_field("Jumlah Bayar", 20, "R,N");
$xls->add_field("Sisa Hutang", 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"]);
$tot_hut = 0; $tot_bayar = 0; $nomor = 0;
while ($db->Next()) {
$tot_hut += $db->Row("Total_Hutang");
$tot_bayar += $db->Row("Total_Bayar");
$xls->add_value(++$nomor, $db->Row("Nama_Sup"), $db->Row("Total_Hutang"), $db->Row("Total_Bayar"), $db->Row("Total_Hutang")-$db->Row("Total_Bayar"));
}
$xls->add_span(array("GRAND TOTAL",2,"R,B"),array($tot_hut,1,"R,B,N"),array($tot_bayar,1,"R,B,N"),array($tot_hut-$tot_bayar,1,"R,B,N"));
} else {
$xls->add_header($_SESSION['__WEB_APP']['REG_NAME']);
$xls->add_header("DATA DETAIL HUTANG SUPPLIER");
$xls->add_header("Periode : ".$tglheader);
$xls->add_field("No. Nota", 10, "C");
$xls->add_field("Tgl. Nota", 10, "C", "sqltgl");
$xls->add_field("Nama Supplier", 80, "L");
$xls->add_field("Jumlah", 20, "R,N");
$xls->add_field("Bayar", 20, "R,N");
$xls->add_field("Sisa Hutang", 20, "R,N");
$xls->add_sheet("".str_replace("S/D","-",$tglheader), true);
if ($id_sup>0) $xls->add_span(["Nama Supplier : ".$nama_sup,6,"L"]);
$tot_hut = 0; $tot_bayar = 0;
while ($db->Next()) {
$tot_hut += $db->Row("Total_Hutang");
$tot_bayar += $db->Row("Total_Bayar");
$xls->add_value($db->Row("No_Beli"), $db->Row("Tgl_Beli"), $db->Row("Nama_Sup"), $db->Row("Total_Hutang"), $db->Row("Total_Bayar"), $db->Row("Total_Hutang")-$db->Row("Total_Bayar"));
}
$xls->add_span(array("GRAND TOTAL",3,"R,B"),array($tot_hut,1,"R,B,N"),array($tot_bayar,1,"R,B,N"),array($tot_hut-$tot_bayar,1,"R,B,N"));
}
$xls->add_stamp(1, true);
$xls->send("Data Hutang Supplier ".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, true, 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"]);
$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">'.$tsup.'</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>';
}
?>
+156
View File
@@ -0,0 +1,156 @@
<?php
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/php/repo/hutang_bayar.php
Desc. : PHP - Laporan Pembayaran Hutang
Created By : Siau Pheng ([email protected]).
Created Date : May 18th, 2012.
Last Modified : October 19th, 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", 0);
if (in_array($data, ["print","export"])) {
$tipe = Param::Get("Tipe", "R"); // R or D
$id_sup = Param::Get("SupID", 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_sup==0) ? "" : " AND SupID='".$id_sup."'";
if ($tipe=="R") {
$db->Query("SELECT Tgl_Bayar,SUM(Total_Bayar) Total_Bayar FROM inv_beli_lunas WHERE (Tgl_Bayar BETWEEN '".$tglfrom."' AND '".$tglto."')".$tsql." GROUP BY Tgl_Bayar ORDER BY Tgl_Bayar");
} else {
$db->Query("SELECT L.*,S.Nama_Sup FROM (SELECT * FROM inv_beli_lunas WHERE (Tgl_Bayar BETWEEN '".$tglfrom."' AND '".$tglto."')".$tsql.") L LEFT JOIN para_supplier S ON (S.SupID=L.SupID) ORDER BY L.Tgl_Bayar");
}
}
if ( $data == "print" ) {
Report_Header(($tipe=="R"?"REKAP":"DETAIL")." PEMBAYARAN SUPPLIER", "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("Keterangan",80,"L");
$pre->add_field("Jumlah",20,"R","rupiah");
$sub_tot = 0; $nomor = 0;
while ($db->Next()) {
$sub_tot += $db->Row("Total_Bayar");
$pre->add_value(++$nomor, $db->Row("Tgl_Bayar"), "Pembayaran Hutang Supplier", $db->Row("Total_Bayar"));
}
$pre->add_span(array("GRAND TOTAL",3,"R,B"),array($sub_tot,1,"R,B","rupiah"));
} else {
$pre->add_field("Tanggal",30,"C","sqltgl");
$pre->add_field("No. Transaksi",20,"L");
$pre->add_field("Nama Supplier",150,"L");
$pre->add_field("Jumlah",30,"R","rupiah");
$sub_tot = 0;
while ($db->Next()) {
$sub_tot += $db->Row("Total_Bayar");
$pre->add_value($db->Row("Tgl_Bayar"), $db->Row("No_Beli"), $db->Row("Nama_Sup"), $db->Row("Total_Bayar"));
}
$pre->add_span(array("GRAND TOTAL",3,"R,B"),array($sub_tot,1,"R,B","rupiah"));
}
$pre->add_stamp(1, true);
$pre->show();
} else if ( $data == "export" ) {
$xls = new SimpleXLS([
'title'=>"Data Pembayaran Supplier",
'desc'=>"Export Data Pembayaran Supplier"
]);
$xls->add_header("<b>".$_SESSION['__WEB_APP']['REG_NAME']."</b>");
$xls->add_header("<b>DATA ".($tipe=="R"?"REKAP":"DETAIL")." PEMBAYARAN SUPPLIER</b>");
$xls->add_header("Periode : ".$tglheader);
if ($tipe=="R") {
$xls->add_field("No.", 5, "C");
$xls->add_field("Tanggal", 12, "C", "tgl_sql2str");
$xls->add_field("Keterangan", 50, "L");
$xls->add_field("Jumlah", 15, "R,N");
$xls->add_sheet("".str_replace("S/D","-",$tglheader), true);
$sub_tot = 0; $nomor = 0;
while ($db->Next()) {
$sub_tot += $db->Row("Total_Bayar");
$xls->add_value(++$nomor, $db->Row("Tgl_Bayar"), "Pembayaran Hutang Supplier", $db->Row("Total_Bayar"));
}
$xls->add_span(array("GRAND TOTAL",3,"R,B"),array($sub_tot,1,"R,B,N"));
} else {
$xls->add_field("Tanggal", 12, "C", "tgl_sql2str");
$xls->add_field("No. Transaksi", 15, "L");
$xls->add_field("Nama Supplier", 50, "L");
$xls->add_field("Jumlah", 15, "R,N");
$xls->add_sheet("".str_replace("S/D","-",$tglheader), true);
$sub_tot = 0;
while ($db->Next()) {
$sub_tot += $db->Row("Total_Bayar");
$xls->add_value($db->Row("Tgl_Bayar"), $db->Row("No_Beli"), $db->Row("Nama_Sup"), $db->Row("Total_Bayar"));
}
$xls->add_span(array("GRAND TOTAL",3,"R,B"),array($sub_tot,1,"R,B,N"));
}
$xls->add_stamp(1, true);
$xls->send("Data Pembayaran Supplier ".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, true, 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"]);
$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">'.$tsup.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Tgl_From">Dari Tanggal</label>
<div class="col-sm-8 col-lg-5">'.$tfrom.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Tgl_To">Sampai Tgl</label>
<div class="col-sm-8 col-lg-5">'.$tto.'</div>
</div>';
}
?>
+167
View File
@@ -0,0 +1,167 @@
<?php
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/php/repo/jual.php
Desc. : PHP - Laporan Penjualan
Created By : Siau Pheng ([email protected]).
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", 0);
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,IFNULL(O.Nama,'KASIR POS') 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", "sqltgl");
$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, true, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID", [0,"SEMUA CABANG"]);
$tfrom = $form->datebox("_", "Tgl_From", tgl_ymd(), true, false);
$tto = $form->datebox("_", "Tgl_To", tgl_ymd(), true, false);
echo '
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Tipe">Tipe Laporan</label>
<div class="col col-form-label">'.$ttipe.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="CabID">Nama Cabang</label>
<div class="col">'.$tcab.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Tgl_From">Dari Tanggal</label>
<div class="col-sm-6 col-lg-5">'.$tfrom.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Tgl_To">Sampai Tanggal</label>
<div class="col-sm-6 col-lg-5">'.$tto.'</div>
</div>';
}
?>
+269
View File
@@ -0,0 +1,269 @@
<?php
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/php/repo/jual_analisa.php
Desc. : PHP - Laporan Analisa Penjualan
Created By : Siau Pheng ([email protected]).
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", 0);
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, true, 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>';
}
?>
+215
View File
@@ -0,0 +1,215 @@
<?php
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/php/repo/jual_margin.php
Desc. : PHP - Laporan Margin Penjualan
Created By : Siau Pheng ([email protected]).
Created Date : October 12nd, 2012.
Last Modified : December 12th, 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", 0);
if (in_array($data, ["print","export"])) {
$tipe = Param::Get("Tipe", "R"); // R or D or I
$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 D.*,IFNULL(O.Nama,'KASIR POS') Nama_User FROM (SELECT UserID,SUM(-Qty*Harga_Beli) Total_Modal,SUM((-Qty*Harga_Jual)-Total_Diskon) Total_Jual FROM inv_detail WHERE (Tgl_Ref BETWEEN '".$tglfrom."' AND '".$tglto."') AND NotaID IN (5,6)".$tsql." GROUP BY UserID) D LEFT JOIN app_operator O ON (D.UserID=O.UserID) ORDER BY O.Nama");
} else if ($tipe=="D") {
$db->Query("SELECT D.*,IFNULL(O.Nama,'KASIR POS') Nama_User FROM (SELECT UserID,No_Ref,Tgl_Ref,SUM(-Qty*Harga_Beli) Total_Modal,SUM((-Qty*Harga_Jual)-Total_Diskon) Total_Jual FROM inv_detail WHERE (Tgl_Ref BETWEEN '".$tglfrom."' AND '".$tglto."') AND NotaID IN (5,6)".$tsql." GROUP BY UserID,No_Ref) D LEFT JOIN app_operator O ON (D.UserID=O.UserID) ORDER BY D.Tgl_Ref,O.Nama");
} else {
$db->Query("SELECT D.*,IFNULL(O.Nama,'KASIR POS') Nama_User,P.Nama_Lengkap FROM (SELECT UserID,InvID,SatuanID,No_Ref,Tgl_Ref,(-Qty*Harga_Beli) Total_Modal,((-Qty*Harga_Jual)-Total_Diskon) Total_Jual FROM inv_detail WHERE (Tgl_Ref BETWEEN '".$tglfrom."' AND '".$tglto."') AND NotaID IN (5,6)".$tsql.") D LEFT JOIN vi_inv_produk P ON (D.InvID=P.InvID AND D.SatuanID=P.SatuanID) LEFT JOIN app_operator O ON (D.UserID=O.UserID) ORDER BY D.Tgl_Ref,O.Nama,D.No_Ref");
}
$ahead = array('R'=>"REKAP",'D'=>"DETAIL",'I'=>"RINCIAN");
}
if ( $data == "print" ) {
Report_Header($ahead[$tipe]." MARGIN PENJUALAN", "Periode : ".$tglheader);
$pre = new \siaupheng\fonia3\Printer\PrintHTML();
if ($tipe=="R") {
$pre->add_field("No.",10,"C");
$pre->add_field("Nama Kasir",30,"L");
$pre->add_field("Harga Modal",20,"R","rupiah");
$pre->add_field("Harga Jual",20,"R","rupiah");
$pre->add_field("Margin",20,"R","rupiah");
$pre->add_field("%",10,"R","rupiah2");
$tot_modal = 0; $tot_jual = 0; $nomor = 0;
while ($db->Next()) {
$tot_modal += $db->Row("Total_Modal");
$tot_jual += $db->Row("Total_Jual");
$pre->add_value(++$nomor, $db->Row("Nama_User"), $db->Row("Total_Modal"), $db->Row("Total_Jual"), ($db->Row("Total_Jual")-$db->Row("Total_Modal")), (($db->Row("Total_Jual")-$db->Row("Total_Modal"))*100)/$db->Row("Total_Jual"));
}
$pre->add_span(array("GRAND TOTAL",2,"R,B"),array($tot_modal,1,"R,B","rupiah"),array($tot_jual,1,"R,B","rupiah"),array($tot_jual-$tot_modal,1,"R,B","rupiah"),array((($tot_jual-$tot_modal)*100)/$tot_jual,1,"R,B","rupiah2"));
} else if ($tipe=="D") {
$pre->add_field("No. Nota",20,"C");
$pre->add_field("Tgl. Nota",20,"C","sqltgl");
$pre->add_field("Nama Kasir",30,"L");
$pre->add_field("Harga Modal",20,"R","rupiah");
$pre->add_field("Harga Jual",20,"R","rupiah");
$pre->add_field("Margin",20,"R","rupiah");
$pre->add_field("%",10,"R","rupiah2");
$tot_modal = 0; $tot_jual = 0;
while ($db->Next()) {
$tot_modal += $db->Row("Total_Modal");
$tot_jual += $db->Row("Total_Jual");
$pre->add_value($db->Row("No_Ref"), $db->Row("Tgl_Ref"), $db->Row("Nama_User"), $db->Row("Total_Modal"), $db->Row("Total_Jual"), ($db->Row("Total_Jual")-$db->Row("Total_Modal")), (($db->Row("Total_Jual")-$db->Row("Total_Modal"))*100)/$db->Row("Total_Jual"));
}
$pre->add_span(array("GRAND TOTAL",3,"R,B"),array($tot_modal,1,"R,B","rupiah"),array($tot_jual,1,"R,B","rupiah"),array($tot_jual-$tot_modal,1,"R,B","rupiah"),array((($tot_jual-$tot_modal)*100)/$tot_jual,1,"R,B","rupiah2"));
} else {
$pre->add_field("No. Nota",20,"C");
$pre->add_field("Tgl. Nota",20,"C","sqltgl");
$pre->add_field("Nama Kasir",20,"L");
$pre->add_field("Nama Barang",20,"L");
$pre->add_field("Harga Modal",20,"R","rupiah");
$pre->add_field("Harga Jual",20,"R","rupiah");
$pre->add_field("Margin",20,"R","rupiah");
$pre->add_field("%",10,"R","rupiah2");
$tot_modal = 0; $tot_jual = 0; $psn_margin = 0;
while ($db->Next()) {
if ($db->RowFloat("Total_Jual", 0) == 0) continue;
$tot_modal += $db->Row("Total_Modal");
$tot_jual += $db->Row("Total_Jual");
$psn_margin = ($db->Row("Total_Jual")==0) ? 0 : (($db->Row("Total_Jual")-$db->Row("Total_Modal"))*100)/$db->Row("Total_Jual");
$pre->add_value($db->Row("No_Ref"), $db->Row("Tgl_Ref"), $db->Row("Nama_User"), $db->Row("Nama_Lengkap"), $db->Row("Total_Modal"), $db->Row("Total_Jual"), ($db->Row("Total_Jual")-$db->Row("Total_Modal")), $psn_margin);
}
$pre->add_span(array("GRAND TOTAL",4,"R,B"),array($tot_modal,1,"R,B","rupiah"),array($tot_jual,1,"R,B","rupiah"),array($tot_jual-$tot_modal,1,"R,B","rupiah"),array((($tot_jual-$tot_modal)*100)/$tot_jual,1,"R,B","rupiah2"));
}
$pre->add_stamp(1, true);
$pre->show();
} else if ( $data == "export" ) {
$xls = new SimpleXLS([
'title'=>"Data Margin Penjualan",
'desc'=>"Export Data Margin Penjualan"
]);
if ($tipe=="R") {
$xls->add_header("<b>".$_SESSION['__WEB_APP']['REG_NAME']."</b>");
$xls->add_header("<b>DATA REKAP MARGIN PENJUALAN</b>");
$xls->add_header("Periode : ".$tglheader);
$xls->add_field("No.", 5, "C");
$xls->add_field("Nama Kasir", 20, "L");
$xls->add_field("Harga Modal", 15, "R,N");
$xls->add_field("Harga Jual", 15, "R,N");
$xls->add_field("Margin", 15, "R,N");
$xls->add_field("%", 8, "R,N");
$xls->add_sheet("".str_replace("S/D","-",$tglheader), true);
$tot_modal = 0; $tot_jual = 0; $nomor = 0;
while ($db->Next()) {
$tot_modal += $db->Row("Total_Modal");
$tot_jual += $db->Row("Total_Jual");
$xls->add_value(++$nomor, $db->Row("Nama_User"), $db->Row("Total_Modal"), $db->Row("Total_Jual"), ($db->Row("Total_Jual")-$db->Row("Total_Modal")), (($db->Row("Total_Jual")-$db->Row("Total_Modal"))*100)/$db->Row("Total_Jual"));
}
$xls->add_span(array("GRAND TOTAL",2,"R,B"),array($tot_modal,1,"R,B,N"),array($tot_jual,1,"R,B,N"),array($tot_jual-$tot_modal,1,"R,B,N"),array((($tot_jual-$tot_modal)*100)/$tot_jual,1,"R,B,N"));
} else if ($tipe=="D") {
$xls->add_header("<b>".$_SESSION['__WEB_APP']['REG_NAME']."</b>");
$xls->add_header("<b>DATA DETAIL MARGIN 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("Harga Modal", 15, "R,N");
$xls->add_field("Harga Jual", 15, "R,N");
$xls->add_field("Margin", 15, "R,N");
$xls->add_field("%", 8, "R,N");
$xls->add_sheet("".str_replace("S/D","-",$tglheader), true);
$tot_modal = 0; $tot_jual = 0;
while ($db->Next()) {
$tot_modal += $db->Row("Total_Modal");
$tot_jual += $db->Row("Total_Jual");
$xls->add_value($db->Row("No_Ref"), $db->Row("Tgl_Ref"), $db->Row("Nama_User"), $db->Row("Total_Modal"), $db->Row("Total_Jual"), ($db->Row("Total_Jual")-$db->Row("Total_Modal")), (($db->Row("Total_Jual")-$db->Row("Total_Modal"))*100)/$db->Row("Total_Jual"));
}
$xls->add_span(array("GRAND TOTAL",3,"R,B"),array($tot_modal,1,"R,B,N"),array($tot_jual,1,"R,B,N"),array($tot_jual-$tot_modal,1,"R,B,N"),array((($tot_jual-$tot_modal)*100)/$tot_jual,1,"R,B,N"));
} else {
$xls->add_header("<b>".$_SESSION['__WEB_APP']['REG_NAME']."</b>");
$xls->add_header("<b>DATA RINCIAN MARGIN 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("Nama Barang", 20, "L");
$xls->add_field("Harga Modal", 15, "R,N");
$xls->add_field("Harga Jual", 15, "R,N");
$xls->add_field("Margin", 15, "R,N");
$xls->add_field("%", 8, "R,N");
$xls->add_sheet("".str_replace("S/D","-",$tglheader), true);
$tot_modal = 0; $tot_jual = 0; $psn_margin = 0;
while ($db->Next()) {
if ($db->RowFloat("Total_Jual", 0) == 0) continue;
$tot_modal += $db->Row("Total_Modal");
$tot_jual += $db->Row("Total_Jual");
$psn_margin = ($db->Row("Total_Jual")==0) ? 0 : (($db->Row("Total_Jual")-$db->Row("Total_Modal"))*100)/$db->Row("Total_Jual");
$xls->add_value($db->Row("No_Ref"), $db->Row("Tgl_Ref"), $db->Row("Nama_User"), $db->Row("Nama_Lengkap"), $db->Row("Total_Modal"), $db->Row("Total_Jual"), ($db->Row("Total_Jual")-$db->Row("Total_Modal")), $psn_margin);
}
$xls->add_span(array("GRAND TOTAL",4,"R,B"),array($tot_modal,1,"R,B,N"),array($tot_jual,1,"R,B,N"),array($tot_jual-$tot_modal,1,"R,B,N"),array((($tot_jual-$tot_modal)*100)/$tot_jual,1,"R,B,N"));
}
$xls->add_stamp(1, true);
$xls->send("Data Margin 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",'I'=>"Rincian"]);
$tcab = $form->option_db("_", "CabID", $id_cab, true, 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>';
}
?>
+143
View File
@@ -0,0 +1,143 @@
<?php
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/php/repo/jual_rekap.php
Desc. : PHP - Laporan Rekap Penjualan
Created By : Siau Pheng ([email protected]).
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", 0);
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, true, 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>';
}
?>
+149
View File
@@ -0,0 +1,149 @@
<?php
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/php/repo/kas_keluar.php
Desc. : PHP - Laporan Pengeluaran Kas
Created By : Siau Pheng ([email protected]).
Created Date : May 18th, 2012.
Last Modified : October 18th, 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", 0);
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 * FROM ((SELECT Tgl_Kas,'Pengeluaran Kas' Ket,SUM(Jumlah) Jumlah FROM gel_kas WHERE Tipe_Kas='O' AND (Tgl_Kas BETWEEN '".$tglfrom."' AND '".$tglto."')".$tsql." GROUP BY Tgl_Kas) UNION ALL (SELECT Tgl_Bayar Tgl_Kas,'Pembayaran Supplier' Ket,SUM(Total_Bayar) Jumlah FROM inv_beli_lunas WHERE (Tgl_Bayar BETWEEN '".$tglfrom."' AND '".$tglto."')".$tsql." GROUP BY Tgl_Bayar)) A ORDER BY A.Tgl_Kas");
} else {
$db->Query("SELECT * FROM ((SELECT No_Kas,Tgl_Kas,Ket,Jumlah FROM gel_kas WHERE Tipe_Kas='O' AND (Tgl_Kas BETWEEN '".$tglfrom."' AND '".$tglto."')".$tsql.") UNION ALL (SELECT L.No_Beli No_Kas,L.Tgl_bayar Tgl_Kas,S.Nama_Sup Ket,L.Total_Bayar Jumlah FROM (SELECT * FROM inv_beli_lunas WHERE (Tgl_Bayar BETWEEN '".$tglfrom."' AND '".$tglto."')".$tsql.") L LEFT JOIN para_supplier S ON (S.SupID=L.SupID))) A ORDER BY A.No_Kas");
}
}
if ( $data == "print" ) {
Report_Header(($tipe=="R"?"REKAP":"DETAIL")." PENGELUARAN KAS", "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("Keterangan",80,"L");
$pre->add_field("Jumlah",20,"R","rupiah");
$sub_tot = 0; $nomor = 0;
while ($db->Next()) {
$sub_tot += $db->Row("Jumlah");
$pre->add_value(++$nomor, $db->Row("Tgl_Kas"), $db->Row("Ket"), $db->Row("Jumlah"));
}
$pre->add_span(array("GRAND TOTAL",3,"R,B"),array($sub_tot,1,"R,B","rupiah"));
} else {
$pre->add_field("No. TX",30,"C");
$pre->add_field("Tanggal",30,"C","sqltgl");
$pre->add_field("Keterangan",150,"L");
$pre->add_field("Jumlah",30,"R","rupiah");
$sub_tot = 0;
while ($db->Next()) {
$sub_tot += $db->Row("Jumlah");
$pre->add_value($db->Row("No_Kas"), $db->Row("Tgl_Kas"), $db->Row("Ket"), $db->Row("Jumlah"));
}
$pre->add_span(array("GRAND TOTAL",3,"R,B"),array($sub_tot,1,"R,B","rupiah"));
}
$pre->add_stamp(1, true);
$pre->show();
} else if ( $data == "export" ) {
$xls = new SimpleXLS([
'title'=>"Data Pengeluaran Kas",
'desc'=>"Export Data Pengeluaran Kas"
]);
$xls->add_header("<b>".$_SESSION['__WEB_APP']['REG_NAME']."</b>");
$xls->add_header("<b>DATA ".($tipe=="R"?"REKAP":"DETAIL")." PENGELUARAN KAS</b>");
$xls->add_header("Periode : ".$tglheader);
if ($tipe=="R") {
$xls->add_field("No.", 5, "C");
$xls->add_field("Tanggal", 12, "C", "tgl_sql2str");
$xls->add_field("Keterangan", 50, "L");
$xls->add_field("Jumlah", 15, "R,N");
$xls->add_sheet("".str_replace("S/D","-",$tglheader), true);
$sub_tot = 0; $nomor = 0;
while ($db->Next()) {
$sub_tot += $db->Row("Jumlah");
$xls->add_value(++$nomor, $db->Row("Tgl_Kas"), $db->Row("Ket"), $db->Row("Jumlah"));
}
$xls->add_span(array("GRAND TOTAL",3,"R,B"),array($sub_tot,1,"R,B,N"));
} else {
$xls->add_field("No. TX", 15, "C");
$xls->add_field("Tanggal", 12, "C", "tgl_sql2str");
$xls->add_field("Keterangan", 50, "L");
$xls->add_field("Jumlah", 15, "R,N");
$xls->add_sheet("".str_replace("S/D","-",$tglheader), true);
$sub_tot = 0;
while ($db->Next()) {
$sub_tot += $db->Row("Jumlah");
$xls->add_value($db->Row("No_Kas"), $db->Row("Tgl_Kas"), $db->Row("Ket"), $db->Row("Jumlah"));
}
$xls->add_span(array("GRAND TOTAL",3,"R,B"),array($sub_tot,1,"R,B,N"));
}
$xls->add_stamp(1, true);
$xls->send("Data Pengeluaran Kas ".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, true, 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-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>';
}
?>
+149
View File
@@ -0,0 +1,149 @@
<?php
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/php/repo/kas_terima.php
Desc. : PHP - Laporan Penerimaan Kas
Created By : Siau Pheng ([email protected]).
Created Date : May 18th, 2012.
Last Modified : October 19th, 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", 0);
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 Tgl_Kas,'Penerimaan Kas' Ket,SUM(Jumlah) Jumlah FROM gel_kas WHERE Tipe_Kas='I' AND (Tgl_Kas BETWEEN '".$tglfrom."' AND '".$tglto."')".$tsql." GROUP BY Tgl_Kas ORDER BY Tgl_Kas");
} else {
$db->Query("SELECT * FROM gel_kas WHERE Tipe_Kas='I' AND (Tgl_Kas BETWEEN '".$tglfrom."' AND '".$tglto."')".$tsql." ORDER BY No_Kas");
}
}
if ( $data == "print" ) {
Report_Header(($tipe=="R"?"REKAP":"DETAIL")." PENERIMAAN KAS", "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("Keterangan",80,"L");
$pre->add_field("Jumlah",20,"R","rupiah");
$sub_tot = 0; $nomor = 0;
while ($db->Next()) {
$sub_tot += $db->Row("Jumlah");
$pre->add_value(++$nomor, $db->Row("Tgl_Kas"), $db->Row("Ket"), $db->Row("Jumlah"));
}
$pre->add_span(array("GRAND TOTAL",3,"R,B"),array($sub_tot,1,"R,B","rupiah"));
} else {
$pre->add_field("No. TX",30,"C");
$pre->add_field("Tanggal",30,"C","sqltgl");
$pre->add_field("Keterangan",150,"L");
$pre->add_field("Jumlah",30,"R","rupiah");
$sub_tot = 0;
while ($db->Next()) {
$sub_tot += $db->Row("Jumlah");
$pre->add_value($db->Row("No_Kas"), $db->Row("Tgl_Kas"), $db->Row("Ket"), $db->Row("Jumlah"));
}
$pre->add_span(array("GRAND TOTAL",3,"R,B"),array($sub_tot,1,"R,B","rupiah"));
}
$pre->add_stamp(1, true);
$pre->show();
} else if ( $data == "export" ) {
$xls = new SimpleXLS([
'title'=>"Data Penerimaan Kas",
'desc'=>"Export Data Penerimaan Kas"
]);
$xls->add_header("<b>".$_SESSION['__WEB_APP']['REG_NAME']."</b>");
$xls->add_header("<b>DATA ".($tipe=="R"?"REKAP":"DETAIL")." PENERIMAAN KAS</b>");
$xls->add_header("Periode : ".$tglheader);
if ($tipe=="R") {
$xls->add_field("No.", 5, "C");
$xls->add_field("Tanggal", 12, "C", "tgl_sql2str");
$xls->add_field("Keterangan", 50, "L");
$xls->add_field("Jumlah", 15, "R,N");
$xls->add_sheet("".str_replace("S/D","-",$tglheader), true);
$sub_tot = 0; $nomor = 0;
while ($db->Next()) {
$sub_tot += $db->Row("Jumlah");
$xls->add_value(++$nomor, $db->Row("Tgl_Kas"), $db->Row("Ket"), $db->Row("Jumlah"));
}
$xls->add_span(array("GRAND TOTAL",3,"R,B"),array($sub_tot,1,"R,B,N"));
} else {
$xls->add_field("No. TX", 15, "C");
$xls->add_field("Tanggal", 12, "C", "tgl_sql2str");
$xls->add_field("Keterangan", 50, "L");
$xls->add_field("Jumlah", 15, "R,N");
$xls->add_sheet("".str_replace("S/D","-",$tglheader), true);
$sub_tot = 0;
while ($db->Next()) {
$sub_tot += $db->Row("Jumlah");
$xls->add_value($db->Row("No_Kas"), $db->Row("Tgl_Kas"), $db->Row("Ket"), $db->Row("Jumlah"));
}
$xls->add_span(array("GRAND TOTAL",3,"R,B"),array($sub_tot,1,"R,B,N"));
}
$xls->add_stamp(1, true);
$xls->send("Data Penerimaan Kas ".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, true, 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-8 col-lg-5">'.$tfrom.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Tgl_To">Sampai Tgl</label>
<div class="col-sm-8 col-lg-5">'.$tto.'</div>
</div>';
}
?>
+170
View File
@@ -0,0 +1,170 @@
<?php
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/php/repo/label.php
Desc. : PHP - 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.
*******************************************************************/
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", 0);
$id_grup = Param::Get("Grup_InvID", 0);
if ( $data == "master" ) {
} else if ( $data == "tabel-detail" ) {
if ($mode_detail == "empty") {
$db->Query("TRUNCATE rep_label");
} else if ($mode_detail == "update") {
$db->Query("UPDATE rep_label SET Nama_Produk='".$db->SafeSQL(Param::Get("Nama_Produk"))."' WHERE ID='".Param::Get("ID",0)."'");
} else if ($mode_detail == "delete") {
$db->Query("DELETE FROM rep_label WHERE ID='".Param::Get("ID",0)."'");
} else if ($mode_detail == "simpan-produk") {
$alist = Param::Get_ArrayCBOX();
foreach ($alist as $_key => $_val) {
if ($_val=="Y") {
$_adata = explode(":", $_key); $arec = [];
$db->Query("SELECT LEFT(P.Nama_Produk,25) Nama_Produk,P.Harga_Jual FROM vi_inv_produk P WHERE P.InvID='".$_adata[0]."' AND P.SatuanID='".$_adata[1]."'");
if ($db->Next()) $arec = $db->AllRow();
if (count($arec) > 0) {
$db->Query("INSERT INTO rep_label SET Nama_Produk='".$db->SafeSQL($arec['Nama_Produk'])."',Harga_Jual='".$arec['Harga_Jual']."',UserID='".user_id()."'");
}
}
}
} else if ($mode_detail == "simpan-grup") {
if ($id_grup > 0) {
$db->Query("INSERT INTO rep_label SELECT NULL,LEFT(P.Nama_Produk,25),P.Harga_Jual,'".user_id()."' FROM vi_inv_produk P WHERE P.Aktif=1 AND P.Grup_InvID='".$id_grup."' AND P.Harga_Jual>0");
}
}
$obj = new Table($db);
$obj->set_query("SELECT * FROM rep_label");
$obj->add_field("ID", "ID", "hid");
$obj->add_field("Nama_Produk", "Nama Barang", "awr");
$obj->add_field("Harga_Jual", "Harga @", "r", "rupiah");
$obj->set_field_order("ID", "A");
$obj->add_row_btn("clipboard", "Ubah", "RepoLabelJS.detail_ubah");
$obj->add_row_btn("trash", "Hapus", "RepoLabelJS.detail_hapus", "UserID", user_id());
$obj->set_func_btn("RepoLabelJS.produk_brow", '<i class="bi-plus-lg me-1"></i> Item');
$obj->set_func_btn("RepoLabelJS.grup_brow", '<i class="bi-table me-1"></i> Grup');
$obj->set_func_navi("RepoLabelJS.data_query('tabel-detail')");
$ajson[] = $obj->json_table("divDetailTabel");
} else if ( $data == "brow-produk" ) {
$tcari = trim(Param::Get("Cari_Produk"));
$tsql = ($tcari=="") ? "" : " AND CONCAT(P.Kode_Barcode,P.Nama_Produk) LIKE '%".$tcari."%'";
$obj = new Table($db);
$obj->set_table("vi_inv_produk P", "P.*,CONCAT(P.InvID,':',P.SatuanID) ID2", "P.Harga_Jual>0 AND P.Aktif=1".$tsql);
$obj->add_field("ID2", "ID", "hid");
$obj->add_field("Kode_SKU", "SKU", "c");
$obj->add_field("Nama_Produk", "Nama Barang", "awr");
$obj->add_field("Nama_Satuan", "Satuan", "l");
$obj->add_field("Harga_Jual", "Harga @", "r", "rupiah");
$obj->set_field_order("Kode_SKU", "A");
$obj->add_row_checkbox("ID2", "Pilih", ["Y","N"]);
$obj->set_func_navi("RepoLabelJS.data_query('brow-produk')");
$ajson[] = $obj->db_table("divBrowProduk", 8);
} else if ( $data == "brow-grup" ) {
$tcari = trim(Param::Get("Cari_Grup"));
$tsql = ($tcari=="") ? "" : " AND CONCAT(P.Kode_Grup,P.Nama_Grup) LIKE '%".$tcari."%'";
$obj = new Table($db);
$obj->set_table("inv_produk_grup P", "P.*", "P.Aktif=1".$tsql);
$obj->add_field("Grup_InvID", "ID", "hid");
$obj->add_field("Kode_Grup", "Kode", "c");
$obj->add_field("Nama_Grup", "Nama Grup Barang", "awr");
$obj->set_field_order("Kode_Grup", "A");
$obj->add_row_btn("save", "Pilih", "RepoLabelJS.grup_select");
$obj->set_func_navi("RepoLabelJS.data_query('brow-grup')");
$ajson[] = $obj->db_table("divBrowGrup");
} else if ($data == "detail-tx") {
$ajson = ['error'=>"", 'html'=>""];
$atabel = ['ID'=>Param::Get("ID",0), 'Nama_Produk'=>""];
$db->Query("SELECT * FROM rep_label WHERE ID='".$atabel['ID']."' LIMIT 1");
if ($db->Next()) $atabel = array_merge($atabel, $db->AllRow());
$form = new Form($db);
$tproduk = $form->textbox("_", "Nama_Produk", $atabel['Nama_Produk'], true, false, "text");
$ajson['html'] = '
<div class="row mb-1">
<label class="col-sm-5 col-lg-3 col-form-label" for="Nama_Produk">Nama Barang</label>
<div class="col">'.$tproduk.'</div>
</div>
<input type="hidden" id="mode_detail" value="'.$mode_detail.'" >
<input type="hidden" id="ID" value="'.$atabel['ID'].'" >';
} else if ( $data == "default") {
echo '
<div class="fade-in">
<div class="card"><div class="card-body">
<ul class="nav nav-tabs" role="tablist">
<li class="nav-item" role="presentation">
<button class="nav-link active" id="tx-tab" data-bs-toggle="tab" data-bs-target="#tx" type="button" role="tab" aria-controls="tx" aria-selected="true"><i class="bi-printer me-2"></i>Cetak Label Harga</button>
</li>
<li class="nav-item ms-auto">
<button class="btn btn-warning mb-1 ms-2" id="butHapus" type="button"><i class="bi-trash me-2"></i>Hapus</button>
<button class="btn btn-secondary mb-1 ms-2" id="butPrint" type="button"><i class="bi-printer me-2"></i>Cetak</button>
<button class="btn btn-secondary mb-1 ms-2" id="butPreview" type="button"><i class="bi-display me-2"></i>Pratinjau</button>
</li>
</ul>
<div class="tab-content border border-top-0 p-3">
<div class="tab-pane fade active show" id="tx" role="tabpanel" aria-labelledby="tx-tab">
<div id="divDetailTabel">&nbsp;</div>
</div>
</div>
</div></div>
</div>';
}
if ( $data == "print" ) {
$db->Query("SELECT * FROM rep_label ORDER BY ID");
if ($db->RecordCount()==0) return false;
$_head = '<table width="100%"><tr>';
$_line = '<td class="center" style="font-size:16pt;height:100px;width:65mm;padding:10px;border: dashed 1px #000;font-family:verdana;"><div style="font-size:18pt;height:50px;padding-bottom:10px;">%s</div>%s</td>';
$ni = $nb = 1; $cont = "";
while ($db->Next()) {
if ($ni == 4) {
if ($nb == 8) {
$cont .= '</tr></table><p id="linebreak">................ page break ................</p><p id="pagebreak">&nbsp;</p>' . $_head;
$nb = 0;
} else {
$cont .= '</tr><tr>';
}
$ni = 1;
$nb++;
}
$cont .= sprintf($_line, $db->Row("Nama_Produk"), "Rp. ".rupiah($db->Row("Harga_Jual")));
$ni++;
}
if ($ni < 4) {
while ($ni < 4) {
$cont .= sprintf($_line, "", "");
$ni++;
}
}
echo '<p id="autopage">&nbsp;</p>' . $_head . $cont . "</tr></table>";
}
send_json($ajson);
?>
+147
View File
@@ -0,0 +1,147 @@
<?php
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/php/repo/mutasi_cabang.php
Desc. : PHP - Laporan Mutasi Stok Cabang
Created By : Siau Pheng ([email protected]).
Created Date : July 16th, 2011.
Last Modified : December 13th, 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_cab1 = Param::Get("Cab1ID", $_SESSION['__APP_INV']['CABANGID']);
$id_cab2 = Param::Get("Cab2ID", $_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");
$nama_cab1 = "Semua Cabang"; $nama_cab2 = "Semua Cabang";
if ($id_cab1>0) {
$db->Query("SELECT Nama_Cab FROM para_cabang WHERE CabID='".$id_cab1."' LIMIT 1");
if ($db->Next()) $nama_cab1 = $db->Row("Nama_Cab");
}
if ($id_cab2>0) {
$db->Query("SELECT Nama_Cab FROM para_cabang WHERE CabID='".$id_cab2."' LIMIT 1");
if ($db->Next()) $nama_cab2 = $db->Row("Nama_Cab");
}
// generate report header
$tglheader = $tglfrom;
if ($tglfrom!==$tglto) $tglheader .= " S/D ".$tglto;
$tglfrom = tgl_sql2str($tglfrom);
$tglto = tgl_sql2str($tglto);
$tsql = ($id_cab1==0) ? "" : " AND Dari_CabID='".$id_cab1."'";
$tsql .= ($id_cab2==0) ? "" : " AND Ke_CabID='".$id_cab2."'";
if ($tipe=="R") {
$db->Query("SELECT M.*,C1.Nama_Cab Nama1,C2.Nama_Cab Nama2 FROM (SELECT * FROM inv_mutasi WHERE (Tgl_Mutasi BETWEEN '".$tglfrom."' AND '".$tglto."')".$tsql.") M LEFT JOIN para_cabang C1 ON (M.Dari_CabID=C1.CabID) LEFT JOIN para_cabang C2 ON (M.Ke_CabID=C2.CabID) ORDER BY M.Tgl_Mutasi,M.No_Mutasi");
} else {
}
}
if ( $data == "print" ) {
Report_Header(($tipe=="R"?"REKAP":"DETAIL")." MUTASI STOK CABANG", "Periode : ".$tglheader);
$pre = new \siaupheng\fonia3\Printer\PrintHTML();
if ($tipe=="R") {
$pre->add_field("Tgl. Mutasi",30,"C","sqltgl");
$pre->add_field("No. Mutasi",30,"C");
$pre->add_field("Dari Cabang",20,"L");
$pre->add_field("Ke Cabang",20,"L");
$pre->add_field("Total",20,"R","rupiah");
$pre->add_field("Catatan",50,"L");
if ($id_cab1>0) $pre->add_span(array("Dari Cabang : ".$nama_cab1,6,"L,B"));
if ($id_cab2>0) $pre->add_span(array("Ke Cabang : ".$nama_cab2,6,"L,B"));
$tot_mutasi = 0;
while ($db->Next()) {
$tot_mutasi += $db->Row("Total_Mutasi");
$pre->add_value($db->Row("Tgl_Mutasi"), $db->Row("No_Mutasi"), $db->Row("Nama1"), $db->Row("Nama2"), $db->Row("Total_Mutasi"), $db->Row("Catatan"));
}
$pre->add_span(array("GRAND TOTAL",4,"R,B"),array($tot_mutasi,1,"R,B","rupiah"),["",1,"L,B"]);
} else {
}
$pre->add_stamp(1, true);
$pre->show();
} else if ( $data == "export" ) {
$xls = new SimpleXLS([
'title'=>"Data Mutasi Stok Cabang",
'desc'=>"Export Data Mutasi Stok Cabang"
]);
if ($tipe=="R") {
$xls->add_header("<b>".$_SESSION['__WEB_APP']['REG_NAME']."</b>");
$xls->add_header("<b>DATA REKAP MUTASI STOK CABANG</b>");
$xls->add_header("Periode : ".$tglheader);
$xls->add_field("Tgl. Mutasi", 12, "C", "sqltgl");
$xls->add_field("No. Mutasi", 15, "C");
$xls->add_field("Dari Cabang", 20, "L");
$xls->add_field("Ke Cabang", 20, "L");
$xls->add_field("Total", 15, "R,N");
$xls->add_field("Catatan", 25, "L");
$xls->add_sheet("".str_replace("S/D","-",$tglheader), true);
$tot_mutasi = 0;
while ($db->Next()) {
$tot_mutasi += $db->Row("Total_Mutasi");
$xls->add_value($db->Row("Tgl_Mutasi"), $db->Row("No_Mutasi"), $db->Row("Nama1"), $db->Row("Nama2"), $db->Row("Total_Mutasi"), $db->Row("Catatan"));
}
$xls->add_span(array("GRAND TOTAL",4,"R,B"),array($tot_mutasi,1,"R,B,N"),["",1,"L,B"]);
} else {
}
$xls->add_stamp(1, true);
$xls->send("Data Mutasi Stok Cabang ".str_replace("S/D","-",$tglheader).".xlsx");
unset($xls);
} else if ( $data == "default") {
$form = new Form($db);
$tcab1 = $form->option_db("_", "Cab1ID", $id_cab, true, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID", [0,"SEMUA CABANG"]);
$tcab2 = $form->option_db("_", "Cab2ID", $id_cab, true, 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="Cab1ID">Dari Cabang</label>
<div class="col">'.$tcab1.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Cab2ID">Ke Cabang</label>
<div class="col">'.$tcab2.'</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>';
}
?>
+277
View File
@@ -0,0 +1,277 @@
<?php
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/php/repo/nota.php
Desc. : PHP - Cetak Struk / Nota POS
Created By : Siau Pheng ([email protected]).
Created Date : April 12th, 2011.
Last Modified : December 11th, 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_beli($db, $nota="") {
if (trim($nota)=="") return;
$ainfo = [];
$db->Query("SELECT B.*,DATE_FORMAT(B.Tgl_Beli,'%d-%m-%Y') Tgl_Beli2,DATE_FORMAT(B.Tgl_Faktur,'%d-%m-%Y') Tgl_Faktur2,S.Kode_Sup,S.Nama_Sup,S.Alamat_Sup,B.Total_Diskon+B.Total_Bulat Diskon FROM (SELECT * FROM inv_beli WHERE No_Beli='".$nota."') B LEFT JOIN para_supplier S ON (S.SupID=B.SupID)");
if ($db->Next()) $ainfo = $db->AllRow();
$ainfo['Alamat_Sup'] = str_replace("\n", "<br>", $ainfo['Alamat_Sup']);
$db->Query("SELECT D.*,P.Nama_Produk,P.Nama_Satuan FROM (SELECT InvID,SatuanID,Harga_Beli,SUM(Total_Diskon) Total_Diskon,SUM(Qty) Qty,SUM(Qty*Harga_Beli) Jumlah FROM inv_detail WHERE No_Ref='".$nota."' GROUP BY InvID, 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>FAKTUR PEMBELIAN</div>';
$kop .= '<table class="notaHeader"><tbody>';
$kop .= '<tr><td width="15%">Nomor Transaksi</td><td width="35%" class="ttkdua">'.$ainfo['No_Beli'].'</td><td width="15%">Tanggal Transaksi</td><td width="35%" class="ttkdua">'.$ainfo['Tgl_Beli2'].'</td></tr>';
$kop .= '<tr><td>Nomor Faktur</td><td class="ttkdua">'.$ainfo['No_Faktur'].'</td><td>Tanggal Faktur</td><td class="ttkdua">'.$ainfo['Tgl_Faktur2'].'</td></tr>';
$kop .= '<tr><td>Nama Supplier</td><td class="ttkdua" colspan="3">'.$ainfo['Nama_Sup'].(($ainfo['Kode_Sup'])?" [".$ainfo['Kode_Sup']."]":"").'</td></tr>';
$kop .= '<tr><td>Alamat Supplier</td><td class="ttkdua" colspan="3">'.$ainfo['Alamat_Sup'].'</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><th>Harga @</th><th>Jumlah</th></tr></thead><tbody>';
$_line = '<tr><td class="c">%s</td><td>%s</td><td class="r">%s</td><td>%s</td><td class="r">%s</td><td class="r">%s</td></tr>';
$_sline = '<tr><td class="r b" colspan="4">%s</td><td class="r b" colspan="2">%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"), rupiah2($db->Row("Harga_Beli")), rupiah2($db->Row("Jumlah")));
}
$body .= sprintf($_sline, "Sub. Total Rp.", rupiah2($ainfo['Total_Beli']));
$body .= sprintf($_sline, "Diskon Rp.", rupiah2($ainfo['Diskon']));
$body .= sprintf($_sline, "Total Rp.", rupiah2($ainfo['Total_Hutang']));
$t_catat = ($ainfo['Catatan']<>"") ? 'Catatan : <i>'.$ainfo['Catatan'].'</i>.' : '&nbsp;';
$body .= '</tbody></table><table class="notaFooter"><tr><td colspan="2">'.$t_catat.'</td></tr><tr><td width="50%" class="stamp">&nbsp;</td><td class="r stamp">'.Report_Stamp(1,true).'</td></tr></table>';
echo '<div>' . $body . '</div>';
}
function nota_beli_retur($db, $nota="") {
if (trim($nota)=="") return;
$ainfo = [];
$db->Query("SELECT B.*,DATE_FORMAT(B.Tgl_Beli,'%d-%m-%Y') Tgl_Beli2,S.Kode_Sup,S.Nama_Sup,S.Alamat_Sup,-B.Total_Hutang Jumlah FROM (SELECT * FROM inv_beli WHERE No_Beli='".$nota."') B LEFT JOIN para_supplier S ON (S.SupID=B.SupID)");
if ($db->Next()) $ainfo = $db->AllRow();
$ainfo['Alamat_Sup'] = str_replace("\n", "<br>", $ainfo['Alamat_Sup']);
$db->Query("SELECT D.*,P.Nama_Produk,P.Nama_Satuan FROM (SELECT InvID,SatuanID,Harga_Beli,SUM(-Qty) Qty,SUM(-Qty*Harga_Beli) Jumlah FROM inv_detail WHERE No_Ref='".$nota."' GROUP BY InvID, 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>RETUR PEMBELIAN</div>';
$kop .= '<table class="notaHeader"><tbody>';
$kop .= '<tr><td width="15%">Nomor Transaksi</td><td width="35%" class="ttkdua">'.$ainfo['No_Beli'].'</td><td width="15%">Tanggal Transaksi</td><td width="35%" class="ttkdua">'.$ainfo['Tgl_Beli2'].'</td></tr>';
$kop .= '<tr><td>Nama Supplier</td><td class="ttkdua" colspan="3">'.$ainfo['Nama_Sup'].(($ainfo['Kode_Sup'])?" [".$ainfo['Kode_Sup']."]":"").'</td></tr>';
$kop .= '<tr><td>Alamat Supplier</td><td class="ttkdua" colspan="3">'.$ainfo['Alamat_Sup'].'</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><th>Harga @</th><th>Jumlah</th></tr></thead><tbody>';
$_line = '<tr><td class="c">%s</td><td>%s</td><td class="r">%s</td><td>%s</td><td class="r">%s</td><td class="r">%s</td></tr>';
$_sline = '<tr><td class="r b" colspan="4">%s</td><td class="r b" colspan="2">%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"), rupiah2($db->Row("Harga_Beli")), rupiah2($db->Row("Jumlah")));
}
$body .= sprintf($_sline, "Total (Rp.)", rupiah2($ainfo['Jumlah']));
$t_catat = ($ainfo['No_Faktur']<>"") ? 'Catatan : <i>'.$ainfo['No_Faktur'].'</i>.' : '&nbsp;';
$body .= '</tbody></table><table class="notaFooter"><tr><td colspan="2">'.$t_catat.'</td></tr><tr><td width="50%" class="stamp">&nbsp;</td><td class="r stamp">'.Report_Stamp(1,true).'</td></tr></table>';
echo '<div>' . $body . '</div>';
}
function nota_opname($db, $nota="") {
if (trim($nota)=="") return;
$ainfo = [];
$db->Query("SELECT *,DATE_FORMAT(Tgl_Opname,'%d-%m-%Y') Tgl_Opname2 FROM inv_opname WHERE No_Opname='".$nota."' LIMIT 1");
if ($db->Next()) $ainfo = $db->AllRow();
$ainfo['Catatan'] = str_replace("\n", "<br>", $ainfo['Catatan']);
$db->Query("SELECT D.*,P.Nama_Produk,P.Nama_Satuan FROM (SELECT InvID,SatuanID,SUM(Qty) Qty FROM inv_detail WHERE No_Ref='".$nota."' GROUP BY InvID,SatuanID,Harga_Beli) D LEFT JOIN vi_inv_produk P ON (P.InvID=D.InvID AND P.SatuanID=D.SatuanID) ORDER BY P.Nama_Produk");
// menampilkan judul dibagian atas laporan
$kop = '<div class="text-center"><span class="fs-6 fw-bold">'.$_SESSION['__WEB_APP']['REG_NAME'].'</span><br>STOK OPNAME</div>';
$kop .= '<table class="notaHeader"><tbody>';
$kop .= '<tr><td width="15%">No. Opname</td><td width="35%" class="ttkdua">'.$ainfo['No_Opname'].'</td><td width="15%">&nbsp;</td><td width="35%" class="">&nbsp;</td></tr>';
$kop .= '<tr><td>Tanggal Opname</td><td class="ttkdua">'.$ainfo['Tgl_Opname2'].'</td><td>&nbsp;</td><td class="">&nbsp;</td></tr>';
$kop .= '</tbody></table>';
$header = '<table class="garis"><thead><tr><th style="width:1cm">No.</th><th>Nama Barang</th><th style="width:2.2cm">Qty</th><th>Satuan</th></tr></thead><tbody>';
$_line = '<tr><td class="c">%s</td><td>%s</td><td class="r">%s</td><td>%s</td></tr>';
$body = $kop.$header; $no_urut = 1;
while ($db->Next()) {
$body .= sprintf($_line, $no_urut++, $db->Row("Nama_Produk"), rupiah2($db->Row("Qty")), $db->Row("Nama_Satuan"));
}
$t_catat = ($ainfo['Catatan']<>"") ? 'Catatan : <i>'.$ainfo['Catatan'].'</i>.' : '&nbsp;';
$body .= '</tbody></table><table class="notaFooter"><tr><td colspan="2">'.$t_catat.'</td></tr><tr><td width="50%" class="stamp">&nbsp;</td><td class="r stamp">'.Report_Stamp(1,true).'</td></tr></table>';
echo '<div>' . $body . '</div>';
}
function nota_mutasi($db, $nota="") {
if (trim($nota)=="") return;
$ainfo = [];
$db->Query("SELECT M.*,C1.Nama_Cab Cabang1,C2.Nama_Cab Cabang2 FROM (SELECT * FROM inv_mutasi WHERE No_Mutasi='".$nota."' LIMIT 1) M LEFT JOIN para_cabang C1 ON (C1.CabID=M.Dari_CabID) LEFT JOIN para_cabang C2 ON (C2.CabID=M.Ke_CabID)");
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,Harga_Beli,SUM(Qty) Qty,SUM(Qty*Harga_Beli) Jumlah FROM inv_detail WHERE No_Ref='".$nota."' AND Qty>0 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>MUTASI STOK</div>';
$kop .= '<table class="notaHeader"><tbody>';
$kop .= '<tr><td width="15%">No. Mutasi</td><td width="35%" class="ttkdua">'.$ainfo['No_Mutasi'].'</td><td width="15%">Dari Cabang</td><td width="35%" class="ttkdua">'.$ainfo['Cabang1'].'</td></tr>';
$kop .= '<tr><td>Tanggal Mutasi</td><td class="ttkdua">'.tgl_sql2str($ainfo['Tgl_Mutasi']).'</td><td>Ke Cabang</td><td class="ttkdua">'.$ainfo['Cabang2'].'</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><th>Harga @</th><th>Jumlah</th></tr></thead><tbody>';
$_line = '<tr><td class="c">%s</td><td>%s</td><td class="r">%s</td><td>%s</td><td class="r">%s</td><td class="r">%s</td></tr>';
$_sline = '<tr><td class="r b" colspan="4">%s</td><td class="r b" colspan="2">%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"), rupiah2($db->Row("Harga_Beli")), rupiah2($db->Row("Jumlah")));
}
$body .= sprintf($_sline, "Total (Rp.)", rupiah2($ainfo['Total_Mutasi']));
$t_catat = ($ainfo['Catatan']<>"") ? 'Catatan : <i>'.$ainfo['Catatan'].'</i>.' : '&nbsp;';
$body .= '</tbody></table><table class="notaFooter"><tr><td colspan="2">'.$t_catat.'</td></tr><tr><td width="50%" class="stamp">&nbsp;</td><td class="r stamp">'.Report_Stamp(1,true).'</td></tr></table>';
echo '<div>' . $body . '</div>';
}
function open_cash() {
$pre = new PrintPOS();
if ($_SESSION['__APP_INV']['PRINT_OPENCD']==1) $pre->set_opendrawer();
$pre->show();
}
$db = (is_resource($db)) ? $db : new MySQL();
$data = Param::Get("data");
$nomor = Param::Get("Nomor_Cetak");
if ( $data == "opencash" ) {
open_cash();
} else if ( $data == "nota-pos" ) {
$op_cash = Param::Get("Open_Cash", 0);
nota_pos($db, $nomor, $op_cash);
} else if ( $data == "nota-beli" ) {
nota_beli($db, $nomor);
} else if ( $data == "nota-beli-retur" ) {
nota_beli_retur($db, $nomor);
} else if ( $data == "nota-opname" ) {
nota_opname($db, $nomor);
} else if ( $data == "nota-mutasi" ) {
nota_mutasi($db, $nomor);
} else if ( $data == "default") {}
?>
+113
View File
@@ -0,0 +1,113 @@
<?php
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/php/repo/opname.php
Desc. : PHP - Laporan Opname Stok Barang
Created By : Siau Pheng ([email protected]).
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", 0);
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") {
$form = new Form($db);
$tcab = $form->option_db("_", "CabID", $id_cab, true, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID", [0,"SEMUA CABANG"]);
$tkasir = $form->option_db("_", "KasirID", $id_kasir, true, false, "app_operator", ["UserID","Nama"], "Aktif=1 ".((user_id()==1)?"":"AND UserID>1"), [0,"SEMUA OPERATOR"]);
$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="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>';
}
?>
+163
View File
@@ -0,0 +1,163 @@
<?php
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/php/repo/rekap_harian.php
Desc. : PHP - Laporan Rekap Total Harian
Created By : Siau Pheng ([email protected]).
Created Date : December 25th, 2013.
Last Modified : December 14th, 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", 0);
if (in_array($data, ["print","export"])) {
$tglfrom = Param::Get("Tgl_From");
$tglto = Param::Get("Tgl_To");
if ($tglfrom > tgl_dmy()) return false;
// 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."'";
$db->Query("DELETE FROM rep_rekap_harian WHERE UserID=".user_id());
// insert jual dan masuk pos
$db->Query("INSERT INTO rep_rekap_harian (Tanggal,Jual,Masuk,UserID) SELECT Tgl_Jual,SUM(Total_Jual-Total_Diskon) Jual, SUM(Total_Jual-Total_Diskon) Masuk,".user_id()." FROM inv_jual WHERE (Tgl_Jual BETWEEN '".$tglfrom."' AND '".$tglto."')".$tsql." GROUP BY Tgl_Jual");
// insert tgl sesuai range
$dtgl = tgl_sql2str($tglfrom);
while ($dtgl<=tgl_sql2str($tglto)) {
fastInsert("rep_rekap_harian", ['Tanggal'=>tgl_sql2str($dtgl), 'UserID'=>user_id()]);
$stok = fastQuery("SELECT SUM(D.Stok*P.Harga_Pokok) Stok FROM (SELECT * FROM inv_detail WHERE Tgl_Ref<='".tgl_sql2str($dtgl)."'".$tsql.") D LEFT JOIN inv_produk P ON (P.InvID=D.InvID)", 0);
fastUpdate("rep_rekap_harian", ['Stok'=>$stok,'Tanggal'=>tgl_sql2str($dtgl),'UserID'=>user_id()], ["Tanggal","UserID"]);
$dtgl = tgl_operasi($dtgl, 1);
}
// insert beli
$db->Query("SELECT Tgl_Beli, SUM(Total_Hutang) Beli FROM inv_beli WHERE (Tgl_Beli BETWEEN '".$tglfrom."' AND '".$tglto."')".$tsql." GROUP BY Tgl_Beli");
while ($db->Next()) {
fastUpdate("rep_rekap_harian", ['Beli'=>$db->Row("Beli"),'Tanggal'=>$db->Row("Tgl_Beli"),'UserID'=>user_id()], ["Tanggal","UserID"]);
}
// insert keluar / lunas beli
$db->Query("SELECT Tgl_Bayar, SUM(Total_Bayar-Total_Potong) Keluar FROM inv_beli_lunas WHERE (Tgl_Bayar BETWEEN '".$tglfrom."' AND '".$tglto."')".$tsql." GROUP BY Tgl_Bayar");
while ($db->Next()) {
fastUpdate("rep_rekap_harian", ['Keluar'=>$db->Row("Keluar"),'Tanggal'=>$db->Row("Tgl_Bayar"),'UserID'=>user_id()], ["Tanggal","UserID"]);
}
// insert modal
$db->Query("SELECT Tgl_Ref, SUM(-Qty*Harga_Beli) Modal FROM inv_detail WHERE (Tgl_Ref BETWEEN '".$tglfrom."' AND '".$tglto."') AND NotaID IN (5,6)".$tsql." GROUP BY Tgl_Ref");
while ($db->Next()) {
fastUpdate("rep_rekap_harian", ['Modal'=>$db->Row("Modal"),'Tanggal'=>$db->Row("Tgl_Ref"),'UserID'=>user_id()], ["Tanggal","UserID"]);
}
// update margin dan laba
$db->Query("UPDATE rep_rekap_harian SET Margin=Jual-Modal,Laba=Margin-Biaya WHERE UserID=".user_id());
$db->Query("SELECT * FROM rep_rekap_harian WHERE UserID=".user_id()." ORDER BY Tanggal ASC");
}
if ( $data == "print" ) {
Report_Header("REKAP TOTAL HARIAN", "Periode : ".$tglheader);
$pre = new \siaupheng\fonia3\Printer\PrintHTML();
$pre->add_field("Tanggal",30,"C","sqltgl");
$pre->add_field("Stok Barang",20,"R","rupiah");
$pre->add_field("Penerimaan",20,"R","rupiah");
$pre->add_field("Penjualan",20,"R","rupiah");
$pre->add_field("Modal Penjualan",20,"R","rupiah");
$pre->add_field("Pembelian",20,"R","rupiah");
$pre->add_field("Pembayaran",20,"R","rupiah");
$pre->add_field("Margin",20,"R","rupiah");
$pre->add_field("Pengeluaran Biaya",20,"R","rupiah");
$pre->add_field("Laba Bersih",20,"R","rupiah");
$t_masuk = 0; $t_jual = 0; $t_modal = 0; $t_beli = 0; $t_keluar = 0; $t_margin = 0; $t_biaya = 0; $t_laba = 0;
while ($db->Next()) {
$t_masuk += $db->Row("Masuk");
$t_jual += $db->Row("Jual");
$t_modal += $db->Row("Modal");
$t_beli += $db->Row("Beli");
$t_keluar += $db->Row("Keluar");
$t_margin += $db->Row("Margin");
$t_biaya += $db->Row("Biaya");
$t_laba += $db->Row("Laba");
$pre->add_value($db->Row("Tanggal"), $db->Row("Stok"), $db->Row("Masuk"), $db->Row("Jual"), $db->Row("Modal"), $db->Row("Beli"), $db->Row("Keluar"), $db->Row("Margin"), $db->Row("Biaya"), $db->Row("Laba"));
}
$pre->add_span(array("TOTAL",2,"R,B"),array($t_masuk,1,"R,B","rupiah"),array($t_jual,1,"R,B","rupiah"),array($t_modal,1,"R,B","rupiah"),array($t_beli,1,"R,B","rupiah"),array($t_keluar,1,"R,B","rupiah"),array($t_margin,1,"R,B","rupiah"),array($t_biaya,1,"R,B","rupiah"),array($t_laba,1,"R,B","rupiah"));
$pre->add_stamp(1, true);
$pre->show();
} else if ( $data == "export" ) {
$xls = new SimpleXLS([
'title'=>"Data Rekap Total Harian",
'desc'=>"Export Data Rekap Total Harian"
]);
$xls->add_header("<b>".$_SESSION['__WEB_APP']['REG_NAME']."</b>");
$xls->add_header("<b>DATA REKAP TOTAL HARIAN</b>");
$xls->add_header("Periode : ".$tglheader);
$xls->add_field("Tanggal", 12, "C", "sqltgl");
$xls->add_field("Stok Barang", 15, "R,N");
$xls->add_field("Penerimaan", 15, "R,N");
$xls->add_field("Penjualan", 15, "R,N");
$xls->add_field("Modal Penjualan", 15, "R,N");
$xls->add_field("Pembelian", 15, "R,N");
$xls->add_field("Pembayaran", 15, "R,N");
$xls->add_field("Margin", 15, "R,N");
$xls->add_field("Pengeluaran Biaya", 15, "R,N");
$xls->add_field("Laba Bersih", 15, "R,N");
$xls->add_sheet("".str_replace("S/D","-",$tglheader), true);
$t_masuk = 0; $t_jual = 0; $t_modal = 0; $t_beli = 0; $t_keluar = 0; $t_margin = 0; $t_biaya = 0; $t_laba = 0;
while ($db->Next()) {
$t_masuk += $db->Row("Masuk");
$t_jual += $db->Row("Jual");
$t_modal += $db->Row("Modal");
$t_beli += $db->Row("Beli");
$t_keluar += $db->Row("Keluar");
$t_margin += $db->Row("Margin");
$t_biaya += $db->Row("Biaya");
$t_laba += $db->Row("Laba");
$xls->add_value($db->Row("Tanggal"), $db->Row("Stok"), $db->Row("Masuk"), $db->Row("Jual"), $db->Row("Modal"), $db->Row("Beli"), $db->Row("Keluar"), $db->Row("Margin"), $db->Row("Biaya"), $db->Row("Laba"));
}
$xls->add_span(array("TOTAL",2,"R,B"),array($t_masuk,1,"R,B,N"),array($t_jual,1,"R,B,N"),array($t_modal,1,"R,B,N"),array($t_beli,1,"R,B,N"),array($t_keluar,1,"R,B,N"),array($t_margin,1,"R,B,N"),array($t_biaya,1,"R,B,N"),array($t_laba,1,"R,B,N"));
$xls->add_stamp(1, true);
$xls->send("Data Rekap Total Harian ".str_replace("S/D","-",$tglheader).".xlsx");
unset($xls);
} else if ( $data == "default") {
$form = new Form($db);
$tcab = $form->option_db("_", "CabID", $id_cab, true, 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="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-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>';
}
?>
+159
View File
@@ -0,0 +1,159 @@
<?php
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/php/repo/rekap_margin.php
Desc. : PHP - Laporan Rekap Margin
Created By : Siau Pheng ([email protected]).
Created Date : January 5th, 2013.
Last Modified : December 14th, 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", 0);
if (in_array($data, ["print","export"])) {
$tglfrom = Param::Get("Tgl_From");
$tglto = Param::Get("Tgl_To");
if ($tglfrom > tgl_dmy()) return false;
// 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."'";
$db->Query("DELETE FROM rep_rekap_margin WHERE UserID=".user_id());
// insert jual dan terima pos
$db->Query("INSERT INTO rep_rekap_margin (Tanggal,Jual,Masuk,UserID) SELECT Tgl_Jual,SUM(Total_Jual-Total_Diskon) Jual, SUM(Total_Jual-Total_Diskon) Masuk,".user_id()." FROM inv_jual WHERE (Tgl_Jual BETWEEN '".$tglfrom."' AND '".$tglto."')".$tsql." GROUP BY Tgl_Jual");
// insert tgl sesuai range
$dtgl = tgl_sql2str($tglfrom);
while ($dtgl<>tgl_sql2str($tglto)) {
$db->Query("INSERT IGNORE INTO rep_rekap_margin SET Tanggal='".tgl_sql2str($dtgl)."',UserID=".user_id());
$dtgl = tgl_operasi($dtgl, 1);
}
// insert beli
$db->Query("SELECT Tgl_Beli, SUM(Total_Hutang) Beli FROM inv_beli WHERE (Tgl_Beli BETWEEN '".$tglfrom."' AND '".$tglto."')".$tsql." GROUP BY Tgl_Beli");
while ($db->Next()) {
fastUpdate("rep_rekap_margin", ['Beli'=>$db->Row("Beli"),'Tanggal'=>$db->Row("Tgl_Beli"),'UserID'=>user_id()], ["Tanggal",'UserID']);
}
// insert keluar / lunas beli
$db->Query("SELECT Tgl_Bayar, SUM(Total_Bayar-Total_Potong) Keluar FROM inv_beli_lunas WHERE (Tgl_Bayar BETWEEN '".$tglfrom."' AND '".$tglto."')".$tsql." GROUP BY Tgl_Bayar");
while ($db->Next()) {
fastUpdate("rep_rekap_margin", ['Keluar'=>$db->Row("Keluar"),'Tanggal'=>$db->Row("Tgl_Bayar"),'UserID'=>user_id()], ["Tanggal","UserID"]);
}
// insert modal
$db->Query("SELECT Tgl_Ref, SUM(-Qty*Harga_Beli) Modal FROM inv_detail WHERE (Tgl_Ref BETWEEN '".$tglfrom."' AND '".$tglto."') AND NotaID IN (5,6)".$tsql." GROUP BY Tgl_Ref");
while ($db->Next()) {
fastUpdate("rep_rekap_margin", ['Modal'=>$db->Row("Modal"),'Tanggal'=>$db->Row("Tgl_Ref"),'UserID'=>user_id()], ["Tanggal","UserID"]);
}
// update margin dan persen
$db->Query("UPDATE rep_rekap_margin SET Margin=Jual-Modal,Persen=(Margin/Jual)*100 WHERE UserID=".user_id());
$db->Query("SELECT * FROM rep_rekap_margin WHERE UserID=".user_id()." ORDER BY Tanggal ASC");
}
if ( $data == "print" ) {
Report_Header("REKAP MARGIN HARIAN", "Periode : ".$tglheader);
$pre = new \siaupheng\fonia3\Printer\PrintHTML();
$pre->add_field("Hari",10,"L");
$pre->add_field("Tanggal",30,"C","sqltgl");
$pre->add_field("Penjualan",20,"R","rupiah");
$pre->add_field("Pembelian",20,"R","rupiah");
$pre->add_field("Modal",20,"R","rupiah");
$pre->add_field("Penerimaan",20,"R","rupiah");
$pre->add_field("Pengeluaran",20,"R","rupiah");
$pre->add_field("Margin",20,"R","rupiah");
$pre->add_field("%",10,"R","rupiah2");
$item = 0; $tot_j = 0; $tot_b = 0; $tot_p = 0; $tot_t = 0; $tot_k = 0; $tot_mar = 0; $tot_psn = 0;
while ($db->Next()) {
$item++;
$tot_j += $db->Row("Jual");
$tot_b += $db->Row("Beli");
$tot_m += $db->Row("Masuk");
$tot_k += $db->Row("Keluar");
$tot_p += $db->Row("Modal");
$tot_mar += $db->Row("Margin");
$pre->add_value(tgl_hari(tgl_sql2str($db->Row("Tanggal"))), $db->Row("Tanggal"), $db->Row("Jual"), $db->Row("Beli"), $db->Row("Modal"), $db->Row("Masuk"), $db->Row("Keluar"), $db->Row("Margin"), $db->Row("Persen"));
}
$pre->add_span(array("JUMLAH",2,"R,B"),array($tot_j,1,"R,B","rupiah"),array($tot_b,1,"R,B","rupiah"),array($tot_p,1,"R,B","rupiah"),array($tot_m,1,"R,B","rupiah"),array($tot_k,1,"R,B","rupiah"),array($tot_mar,1,"R,B","rupiah"),array(($tot_mar/$tot_j)*100,1,"R,B","rupiah2"));
$pre->add_span(array("RATA-RATA",2,"R,B"),array($tot_j/$item,1,"R,B","rupiah"),array($tot_b/$item,1,"R,B","rupiah"),array($tot_p/$item,1,"R,B","rupiah"),array($tot_m/$item,1,"R,B","rupiah"),array($tot_k/$item,1,"R,B","rupiah"),array($tot_mar/$item,1,"R,B","rupiah"),array(($tot_mar/$tot_j)*100/$item,1,"R,B","rupiah2"));
$pre->add_stamp(1, true);
$pre->show();
} else if ( $data == "export" ) {
$xls = new SimpleXLS([
'title'=>"Data Rekap Margin Harian",
'desc'=>"Export Data Rekap Margin Harian"
]);
$xls->add_header("<b>".$_SESSION['__WEB_APP']['REG_NAME']."</b>");
$xls->add_header("<b>DATA REKAP MARGIN HARIAN</b>");
$xls->add_header("Periode : ".$tglheader);
$xls->add_field("Hari", 10, "L");
$xls->add_field("Tanggal", 12, "C", "sqltgl");
$xls->add_field("Penjualan", 15, "R,N");
$xls->add_field("Pembelian", 15, "R,N");
$xls->add_field("Modal", 15, "R,N");
$xls->add_field("Penerimaan", 15, "R,N");
$xls->add_field("Pengeluaran", 15, "R,N");
$xls->add_field("Margin", 15, "R,N");
$xls->add_field("%", 8, "R,N");
$xls->add_sheet("".str_replace("S/D","-",$tglheader), true);
$item = 0; $tot_j = 0; $tot_b = 0; $tot_p = 0; $tot_t = 0; $tot_k = 0; $tot_mar = 0; $tot_psn = 0;
while ($db->Next()) {
$item++;
$tot_j += $db->Row("Jual");
$tot_b += $db->Row("Beli");
$tot_m += $db->Row("Masuk");
$tot_k += $db->Row("Keluar");
$tot_p += $db->Row("Modal");
$tot_mar += $db->Row("Margin");
$xls->add_value(tgl_hari(tgl_sql2str($db->Row("Tanggal"))), $db->Row("Tanggal"), $db->Row("Jual"), $db->Row("Beli"), $db->Row("Modal"), $db->Row("Masuk"), $db->Row("Keluar"), $db->Row("Margin"), $db->Row("Persen"));
}
$xls->add_span(array("JUMLAH",2,"R,B"),array($tot_j,1,"R,B,N"),array($tot_b,1,"R,B,N"),array($tot_p,1,"R,B,N"),array($tot_m,1,"R,B,N"),array($tot_k,1,"R,B,N"),array($tot_mar,1,"R,B,N"),array(($tot_mar/$tot_j)*100,1,"R,B,N"));
$xls->add_span(array("RATA-RATA",2,"R,B"),array($tot_j/$item,1,"R,B,N"),array($tot_b/$item,1,"R,B,N"),array($tot_p/$item,1,"R,B,N"),array($tot_m/$item,1,"R,B,N"),array($tot_k/$item,1,"R,B,N"),array($tot_mar/$item,1,"R,B,N"),array(($tot_mar/$tot_j)*100/$item,1,"R,B,N"));
$xls->add_stamp(1, true);
$xls->send("Data Rekap Margin Harian ".str_replace("S/D","-",$tglheader).".xlsx");
unset($xls);
} else if ( $data == "default") {
$form = new Form($db);
$tcab = $form->option_db("_", "CabID", $id_cab, true, 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="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-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>';
}
?>
+124
View File
@@ -0,0 +1,124 @@
<?php
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/php/repo/rekap_modal.php
Desc. : PHP - Laporan Rekap Modal
Created By : Siau Pheng ([email protected]).
Created Date : January 19th, 2013.
Last Modified : December 13th, 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", 0);
if (in_array($data, ["print","export"])) {
$tglfrom = Param::Get("Tgl_From");
$tglto = Param::Get("Tgl_To");
if ($tglfrom > tgl_dmy()) return false;
// 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."'";
$db->Query("DELETE FROM rep_rekap_modal WHERE UserID='".user_id()."'");
$saldo = 0;
// insert tgl sesuai range
$dtgl = tgl_sql2str($tglfrom);
while ($dtgl<=tgl_sql2str($tglto)) {
$stok = 0; $piut = 0; $huta = 0;
$db->Query("SELECT SUM(D.Stok*P.Harga_Pokok) Stok FROM (SELECT * FROM inv_detail WHERE Tgl_Ref<='".tgl_sql2str($dtgl)."'".$tsql.") D LEFT JOIN inv_produk P ON (P.InvID=D.InvID)");
if ($db->Next()) $stok = $db->RowFloat("Stok", 0);
$db->Query("SELECT SUM(Total_Jual-Total_Diskon-Total_Bayar-Total_Potong) Piutang FROM inv_jual WHERE Tgl_Jual<='".tgl_sql2str($dtgl)."' AND Tgl_Lunas>'".tgl_sql2str($dtgl)."'".$tsql);
if ($db->Next()) $piut = $db->RowFloat("Piutang", 0);
$db->Query("SELECT SUM(Total_Hutang) Hutang FROM inv_beli WHERE Tgl_Beli<='".tgl_sql2str($dtgl)."' AND (Lunas=0 OR (Lunas=1 AND Tgl_Lunas>'".tgl_sql2str($dtgl)."'))".$tsql);
if ($db->Next()) $huta = $db->RowFloat("Hutang", 0);
$db->Query("INSERT IGNORE INTO rep_rekap_modal SET Tanggal='".tgl_sql2str($dtgl)."',Stok='".$stok."',Piutang=".$piut.",Hutang=".$huta.",Jumlah=Stok+Piutang-Hutang,UserID=".user_id());
$dtgl = tgl_operasi($dtgl, 1);
}
$db->Query("SELECT * FROM rep_rekap_modal WHERE UserID=".user_id()." ORDER BY Tanggal ASC");
}
if ( $data == "print" ) {
Report_Header("REKAP MODAL HARIAN", "Periode : ".$tglheader);
$pre = new \siaupheng\fonia3\Printer\PrintHTML();
$pre->add_field("Hari",10,"L");
$pre->add_field("Tanggal",30,"C","sqltgl");
$pre->add_field("Stok Barang",20,"R","rupiah");
$pre->add_field("Piutang",20,"R","rupiah");
$pre->add_field("Hutang",20,"R","rupiah");
$pre->add_field("Jumlah",20,"R","rupiah");
while ($db->Next()) {
$pre->add_value(tgl_hari(tgl_sql2str($db->Row("Tanggal"))), $db->Row("Tanggal"), $db->Row("Stok"), $db->Row("Piutang"), $db->Row("Hutang"), $db->Row("Jumlah"));
}
$pre->add_stamp(1, true);
$pre->show();
} else if ( $data == "export" ) {
$xls = new SimpleXLS([
'title'=>"Data Rekap Modal Harian",
'desc'=>"Export Data Rekap Modal Harian"
]);
$xls->add_header("<b>".$_SESSION['__WEB_APP']['REG_NAME']."</b>");
$xls->add_header("<b>DATA REKAP MODAL HARIAN</b>");
$xls->add_header("Periode : ".$tglheader);
$xls->add_field("Hari", 10, "L");
$xls->add_field("Tanggal", 12, "C", "sqltgl");
$xls->add_field("Stok Barang", 15, "R,N");
$xls->add_field("Piutang", 15, "R,N");
$xls->add_field("Hutang", 15, "R,N");
$xls->add_field("Jumlah", 15, "R,N");
$xls->add_sheet("".str_replace("S/D","-",$tglheader), true);
while ($db->Next()) {
$xls->add_value(tgl_hari(tgl_sql2str($db->Row("Tanggal"))), $db->Row("Tanggal"), $db->Row("Stok"), $db->Row("Piutang"), $db->Row("Hutang"), $db->Row("Jumlah"));
}
$xls->add_stamp(1, true);
$xls->send("Data Rekap Modal Harian ".str_replace("S/D","-",$tglheader).".xlsx");
unset($xls);
} else if ( $data == "default") {
$form = new Form($db);
$tcab = $form->option_db("_", "CabID", $id_cab, true, 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="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-8 col-lg-5">'.$tfrom.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Tgl_To">Sampai Tgl</label>
<div class="col-sm-8 col-lg-5">'.$tto.'</div>
</div>';
}
?>
+170
View File
@@ -0,0 +1,170 @@
<?php
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/php/repo/stok_akhir.php
Desc. : PHP - Laporan Stok Akhir Barang
Created By : Siau Pheng ([email protected]).
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", 0);
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, true, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID", [0,"SEMUA CABANG"]);
$tsup = $form->option_db("_", "SupID", 0, true, false, "para_supplier", ["SupID","Nama_Sup"], "Aktif=1 ORDER BY Nama_Sup", [0,"SEMUA SUPPLIER"]);
$tgrup = $form->option_db("_", "Grup_InvID", 0, true, false, "inv_produk_grup", ["Grup_InvID","Nama_Grup"], "Aktif=1 ORDER BY Nama_Grup", [0,"SEMUA GRUP"]);
$ttgl = $form->datebox("_", "Tanggal", tgl_ymd(), true, false);
$turut = $form->radio("_", "Urut", "B", true, false, ["B"=>"Nama Barang","J"=>"Jumlah / Nilai"]);
$tharga = $form->radio("_", "Harga", "Y", true, false, ["Y"=>"Ya","N"=>"Tidak"]);
$tstok = $form->radio("_", "Min_Stok", "N", true, false, ["Y"=>"Ya","N"=>"Tidak"], null, "RepoStokAkhirJS.oc_MinStok();");
$tqty = $form->textbox("_", "Min_Qty", 0, false, false, "double");
echo '
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="CabID">Nama Cabang</label>
<div class="col">'.$tcab.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="SupID">Nama Supplier</label>
<div class="col">'.$tsup.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Grup_InvID">Grup Barang</label>
<div class="col">'.$tgrup.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Tanggal">Tanggal Stok</label>
<div class="col-sm-6 col-lg-5">'.$ttgl.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Urut">Urut Berdasarkan</label>
<div class="col col-form-label">'.$turut.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Harga">Cetak Harga ?</label>
<div class="col col-form-label">'.$tharga.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Min_Stok">Batas Maximum ?</label>
<div class="col-sm-4 col-lg-3 col-form-label">'.$tstok.'</div>
<div class="col-sm-4 col-lg-3">'.$tqty.'</div>
</div>';
}
?>
+189
View File
@@ -0,0 +1,189 @@
<?php
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/php/repo/stok_mutasi.php
Desc. : PHP - Laporan Mutasi Stok Barang
Created By : Siau Pheng ([email protected]).
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", 0);
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) GROUP BY D.No_Ref 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, true, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID", [0,"SEMUA CABANG"]);
$ttgl1 = $form->datebox("_", "Tgl_From", tgl_ymd(), true, false);
$ttgl2 = $form->datebox("_", "Tgl_To", tgl_ymd(), true, false);
echo '
<div class="row mb-1"><label class="col-sm-3 col-lg-3 col-form-label" for="Nama_Produk">Nama Barang</label><div class="col"><div class="input-group">'.$tbrg.'<button class="btn btn-info shadow-none" type="button" id="butBrow"><i class="bi-search"></i></button></div></div></div>
<div class="row mb-1"><label class="col-sm-3 col-lg-3 col-form-label" for="CabID">Nama Cabang</label><div class="col">'.$tcab.'</div></div>
<div class="row mb-1"><label class="col-sm-3 col-lg-3 col-form-label" for="Tgl_From">Mulai Tanggal</label><div class="col-sm-8 col-lg-5">'.$ttgl1.'</div></div>
<div class="row mb-1"><label class="col-sm-3 col-lg-3 col-form-label" for="Tgl_To">Sampai Tanggal</label><div class="col-sm-8 col-lg-5">'.$ttgl2.'</div></div>
<input type="hidden" id="InvID" value="0" />';
}
send_json($ajson);
?>
+125
View File
@@ -0,0 +1,125 @@
<?php
/*******************************************************************
Module : /apps/php/sys/about.php
Desc. : PHP - Informasi Aplikasi
Created By : Siau Pheng ([email protected]).
Created Date : November 23th, 2011.
Last Modified : September 30th, 2025.
(c) 2011 - 2025, 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
require_once(__DIR__."/../../../../../vendor/autoload.php");
use siaupheng\fonia3\DB\MySQL;
use siaupheng\fonia3\DB\SQL;
use siaupheng\fonia3\DB\CheckSQL;
use siaupheng\fonia3\Web\Param;
use siaupheng\fonia3\Web\Form;
use siaupheng\fonia3\Web\Register;
use siaupheng\fonia3\Web\Update;
$db = $db ?? new MySQL();
$ajson = array();
$data = Param::Get("data");
$mode = Param::Get("mode");
$cpd = new Update($db);
if ( $data == "check_update") {
$ainfo = $cpd->check_update();
echo '<table width="100%">
<tr><td>Versi Sekarang</td><td>:</td><td>'.$ainfo['build_cur'].'</td></tr>
<tr><td>Versi Update</td><td>:</td><td>'.$ainfo['build_new'].'</td></tr>
<tr><td>Status Update</td><td>:</td><td>'.$ainfo['svr_status'].'</td></tr>
<input type="hidden" id="file_build" value="'.$ainfo['build_new'].'">
<input type="hidden" id="file_online" value="'.(($ainfo['build_new']>$ainfo['build_cur'])?1:0).'">
<input type="hidden" id="file_web" value="'.$ainfo['file_web'].'">
<input type="hidden" id="file_sql" value="'.$ainfo['file_sql'].'">
</table>';
} else if ( $data == "proses_update") {
$ajson['sukses'] = $cpd->go_update(Param::Get("file_web"), Param::Get("file_build"));
if ($ajson['sukses']==true && Param::Get("file_sql","")!=="") $cpd->update_mysql(Param::Get("file_sql"));
} else if ( $data == "check_db") {
$form = new Form($db);
$t_cek = $form->checkbox("_", "DB_Cek", 1, true, false, [1,0]);
$t_repa = $form->checkbox("_", "DB_Repair", 0, true, false, [1,0]);
$t_opti = $form->checkbox("_", "DB_Opti", 0, true, false, [1,0]);
$form->show('
<div class="row mb-4">
<div class="col-12"><div class="input-group">'.$t_cek.'<label for="DB_Cek">Cek Database</label></div><label class="small" for="DB_Cek">Proses Cek ini otomatis memperbaiki tabel yang bermasalah, jika ditemukan.</label></div>
</div>
<div class="row mb-4">
<div class="col-12"><div class="input-group">'.$t_repa.'<label for="DB_Repair">Perbaiki Database</label></div><label class="small" for="DB_Repair">Proses Perbaiki akan memperbaiki semua tabel yang bermasalah.</label></div>
</div>
<div class="row mb-1">
<div class="col-12"><div class="input-group">'.$t_opti.'<label for="DB_Opti">Optimalisasi Database</label></div><label class="small" for="DB_Opti">Proses Optimalisasi ini otomatis merapikan database, merampingkan database dari record data yang telah dihapus.</label></div>
</div>
<div class="d-none" id="DB_Hasil">&nbsp;</div>');
} else if ( $data == "proses_db") {
$chk = new CheckSQL($db);
$chk->ignore_table("app_auth","app_backup","app_config","app_menu","app_operator");
if (Param::Get("DB_Cek",0)==1) {
echo "<br>";
echo $chk->check_db();
}
if (Param::Get("DB_Repair",0)==1) {
echo "<br>";
echo $chk->repair_db();
}
if (Param::Get("DB_Opti",0)==1) {
echo "<br>";
echo $chk->optimize_db();
}
} else if ( $data == "default") {
$apps = $_SESSION['__WEB_APP'];
$apps['CREATOR_YEAR'] = ($apps['CREATOR_YEAR']!=date('Y')) ? $apps['CREATOR_YEAR']." - ".date('Y') : $apps['CREATOR_YEAR'];
$hasil = '<div>
<ul class="nav nav-tabs" role="tablist">
<li class="nav-item" role="presentation">
<button class="nav-link active" id="about-tab" data-bs-toggle="tab" data-bs-target="#about" type="button" role="tab" aria-controls="about" aria-selected="true">Tentang Aplikasi</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link" id="other-tab" data-bs-toggle="tab" data-bs-target="#other" type="button" role="tab" aria-controls="other" aria-selected="false">Informasi Pendukung</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link" id="tool-tab" data-bs-toggle="tab" data-bs-target="#tool" type="button" role="tab" aria-controls="tool" aria-selected="false">Tools</button>
</li>
</ul>
<div class="tab-content border border-top-0 p-3">
<div class="tab-pane fade active show" id="about" role="tabpanel" aria-labelledby="about-tab">
<div class="text-center text-secondary">
<span class="fs-5">'.$apps['REG_NAME'].'</span><br>'.$apps['REG_ADDRESS'].'<br>'.strtoupper($apps['REG_CITY']).' '.$apps['REG_POSTCODE'].'</div><br>
<table>
<tr><td>Register ID</td><td class="c pe-1">:</td><td nowrap>'.Register::reg_id().'</td></tr>
<tr><td>Register Code</td><td class="c">:</td><td>'.Register::reg_code().'</td></tr>
</table>
<hr class="my-2">
<div class="text-center text-secondary">'.$apps['APP_NAMES'].' Ver. '.$apps['APP_VER'].'<br>Updated : '.$apps['APP_UPDATED'].'<br><br><span style="font-size:.9em;">&copy; '.$apps['CREATOR_YEAR'].', '.$apps['CREATOR_NAME'].'<br>'.$apps['CREATOR_WEBSITE'].'.</span></div>
</div>
<div class="tab-pane fade" id="other" role="tabpanel" aria-labelledby="other-tab">
<div class="row"><div class="col" id="divBuildInfo"></div></div>
</div>
<div class="tab-pane fade" id="tool" role="tabpanel" aria-labelledby="tool-tab">
<div class="row mb-2">
<div class="col-md-8">Silahkan jalankan proses Cek Database, jika terjadi masalah dengan database aplikasi.</div>
<div class="col-md-4 d-grid gap-2 my-auto"><button type="button" class="btn btn-info col-12" onclick="AboutJS.proses_checkdb();">Cek Database</button></div>
</div>
<div class="row">
<div class="col-md-8">Cek update aplikasi secara online.</div>
<div class="col-md-4 d-grip gap-2 my-auto"><button type="button" class="btn btn-info col-12" onclick="AboutJS.proses_update();">Cek Update</button></div>
</div>
</div>
</div>
</div>';
echo $hasil;
}
send_json($ajson);
?>
+52
View File
@@ -0,0 +1,52 @@
<?php
/*******************************************************************
Module : /apps/php/sys/chpasswd.php
Desc. : PHP - Perubahan Password Operator
Created By : Siau Pheng ([email protected]).
Created Date : December 7th, 2008.
Last Modified : April 25th, 2020.
(c) 2008 - 2020, 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
require_once(__DIR__."/../../../../../vendor/autoload.php");
use siaupheng\fonia3\DB\MySQL;
use siaupheng\fonia3\DB\SQL;
use siaupheng\fonia3\Web\Auth;
use siaupheng\fonia3\Web\Param;
use siaupheng\fonia3\Web\Form;
$db = $db ?? new MySQL();
$auth = new Auth($db);
$ajson = [];
$data = Param::Get("data");
if ( $data == "default") {
$form = new Form($db);
$form->password("Password Lama", "LPass", $l_pass, true, true, "masukkan password lama", 20);
$form->password("Password Baru 1", "BPass1", $b_pass1, true, true, "masukkan password baru 1", 20);
$form->password("Password Baru 2", "BPass2", $b_pass2, true, true, "masukkan password baru 2", 20);
$form->show(' _LPass_ _BPass1_ _BPass2_ ');
} else if ( $data == "chpasswd") {
$l_pass = Param::Get("LPass");
$b_pass1 = Param::Get("BPass1");
$b_pass2 = Param::Get("BPass2");
$ajson['status'] = false;
if ($auth->user_check(user_user(), $l_pass)) {
$db->Query("UPDATE app_operator SET Password=MD5('".$b_pass1."') WHERE UserID='".user_id()."'");
$ajson['status'] = true;
$ajson['msg'] = "Sukses merubah password Anda!";
} else {
$ajson['msg'] = "Password lama Anda salah!";
}
}
send_json($ajson);
?>
+83
View File
@@ -0,0 +1,83 @@
<?php
/*******************************************************************
Module : /apps/php/sys/config.php
Desc. : PHP - Konfigurasi Aplikasi
Created By : Siau Pheng ([email protected]).
Created Date : May 25th, 2010.
Last Modified : September 30th, 2025.
(c) 2010 - 2025, 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
require_once(__DIR__."/../../../../../vendor/autoload.php");
use siaupheng\fonia3\DB\MySQL;
use siaupheng\fonia3\DB\SQL;
use siaupheng\fonia3\Web\Param;
use siaupheng\fonia3\Web\Form;
$db = $db ?? new MySQL();
$data = Param::Get("data");
$mode = Param::Get("mode");
if ( $data == "master" ) {
if ( $mode == "save" ) {
$sql = new SQL($db);
$sql->set_table("app_config");
$sql->add_param("REG_ADDRESS");
$sql->add_param("REG_CITY");
$sql->add_param("REG_POSTCODE");
$sql->add_param("REG_PHONE");
$sql->add_param("REG_FAX");
$sql->add_param("REG_OWNER");
$sql->add_param("REG_NPWP");
$sql->add_param("REG_WEBSITE");
$sql->add_param("REG_EMAIL");
$sql->add_param_userid();
$sql->add_where("REG_ID");
$sql->UpdateDB();
$mode = "view";
}
$para = [];
$id = Param::Get("REG_ID", $_SESSION['__WEB_APP']['REG_ID']);
$tsql = ($id=="") ? " ORDER BY REG_ID ASC LIMIT 1" : " WHERE REG_ID='".$id."'";
$db->Query("SELECT * FROM app_config".$tsql);
if ($db->Next()) $para = $db->AllRow();
$benable = ($mode=="edit") ? true : false;
$form = new Form($db);
$form->textbox("Nama Perusahaan", "REG_NAME", $para['REG_NAME'], false, false, "text", "masukkan nama instansi");
$form->textarea("Alamat Perusahaan", "REG_ADDRESS", $para['REG_ADDRESS'], $benable, false, 1, "masukkan alamat instansi");
$form->textbox("Kabupaten / Kota", "REG_CITY", $para['REG_CITY'], $benable, false, "text", "masukkan nama kota");
$form->textbox("Kode Pos", "REG_POSTCODE", $para['REG_POSTCODE'], $benable, false, "integer", "masukkan nomor kodepos");
$form->textbox("No. Telpon", "REG_PHONE", $para['REG_PHONE'], $benable, false, "phone", "masukkan nomor telphone");
$form->textbox("No. Fax", "REG_FAX", $para['REG_FAX'], $benable, false, "phone", "masukkan nomor faximile");
$form->textbox("Website", "REG_WEBSITE", $para['REG_WEBSITE'], $benable, false, "text", "masukkan alamat website");
$form->textbox("Email", "REG_EMAIL", $para['REG_EMAIL'], $benable, false, "email", "masukkan alamat email");
$form->textbox("Nama Pemilik", "REG_OWNER", $para['REG_OWNER'], $benable, false, "text", "masukkan nama owner");
$form->textbox("NPWP Pemilik", "REG_NPWP", $para['REG_NPWP'], $benable, false, "text", "masukkan npwp owner");
$form->hidden("REG_ID", $para['REG_ID']);
$form->hidden("mode", $mode);
$form->show('
_REG_NAME_
_REG_ADDRESS_
_REG_CITY_
_REG_POSTCODE_
_REG_PHONE_
_REG_FAX_
_REG_WEBSITE_
_REG_EMAIL_
<hr class="my-2">
_REG_OWNER_
_REG_NPWP_
_mode_ _REG_ID_ ');
} else if ( $data == "default") {
echo '<div id="divMaster">&nbsp;</div>';
}
?>
+183
View File
@@ -0,0 +1,183 @@
<?php
/*******************************************************************
Module : /apps/php/sys/menu_grup.php
Desc. : PHP - Manajemen Data Grup Login Menu
Created By : Siau Pheng ([email protected]).
Created Date : August 8th, 2013.
Last Modified : January 1st, 2026.
(c) 2013 - 2026, 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\Table;
use siaupheng\fonia3\Web\Form;
function modul_gen($alist = [], $amenu = []) {
$hasil = '<table class="table table-striped table-bordered table-hover">';
$hasil .= '<thead><tr><th>Nama Menu</th><th>Keterangan</th><th width="30"><input onchange="MenuGrupJS.menu_cek(this);" type="checkbox" class="form-check-input mx-2" value="'.$alist[0]['Modul'].'" /></th></tr></thead><tbody>';
for ($i=0; $i<count($alist); $i++) {
$checked = (in_array($alist[$i]['Kode'], $amenu)) ? "checked" : "";
$hasil .= sprintf('<tr><td class="l">%s</td><td class="l">%s</td><td class="c" width="30"><input type="checkbox" class="form-check-input %s" value="%s" %s/></td></tr>', str_repeat("--", $alist[$i]['Level']-1)."> ".$alist[$i]['Menu'], $alist[$i]['Judul'], $alist[$i]['Modul'], $alist[$i]['Kode'], $checked);
}
$hasil .= '</tbody></table>';
return $hasil;
}
$db = $db ?? new MySQL();
$ajson = [];
$data = Param::Get("data");
$mode = Param::Get("mode");
$id_grup = Param::Get("Grup_MenuID");
if ( $data == "grup-detail" ) {
$agrup = array('Aktif'=>1);
if ($mode == "edit") {
$db->Query("SELECT * FROM app_menu_grup WHERE Grup_MenuID='".$id_grup."'");
if ($db->Next()) $agrup = $db->AllRow();
}
$form = new Form($db);
$t_nama = $form->textbox("_", "Nama_Grup", $agrup['Nama_Grup'], true, false, "text", "nama grup menu");
$t_ket = $form->textarea("_", "Ket", $agrup['Ket'], true, false, 1, "keterangan grup menu");
$t_status = $form->switch("_", "Aktif", $agrup['Aktif'], true, false, ["1","0"]);
echo '
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Nama_Grup">Nama Grup Menu</label>
<div class="col">'.$t_nama.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Ket">Keterangan Grup</label>
<div class="col">'.$t_ket.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Aktif">Status Aktif ?</label>
<div class="col col-form-label">'.$t_status.'</div>
</div>
<input type="hidden" id="Grup_MenuID" value="'.$agrup['Grup_MenuID'].'" >
<input type="hidden" id="mode" value="'.$mode.'" >
';
} else if ( $data == "save" ) {
$sql = new SQL($db);
$sql->set_table("app_menu_grup");
$sql->add_param("Nama_Grup");
$sql->add_param("Ket");
$sql->add_param("Aktif");
$sql->add_param_stamp();
$sql->add_param_userid();
$sql->add_where("Grup_MenuID");
if ($mode=="add") {
$sql->InsertDB();
} else if ($mode=="edit") {
$sql->UpdateDB();
} else if ($mode=="del") {
$sql->DeleteDB();
}
$ajson['status'] = true;
} else if ( $data == "menu" ) {
$agrup = array('Grup_MenuID'=>0,'Nama_Grup'=>"",'Menu'=>"");
$db->Query("SELECT Grup_MenuID,Nama_Grup,DECODE(Menu,'".$_SESSION['__WEB_APP']['REG_ID']."') Menu FROM app_menu_grup WHERE Grup_MenuID='".$id_grup."' LIMIT 1");
if ($db->Next()) $agrup = $db->AllRow();
$amenu = explode(",", $agrup['Menu']);
$amodul = [];
$db->Query("SELECT * FROM app_menu WHERE Level=0 AND Modul<>'IND' AND Aktif=1 ORDER BY Urut ASC");
while ($db->Next()) {
$amodul[] = $db->AllRow();
}
$hasil = '<div id="tabMenuList">';
if (count($amodul)>1) {
$hasil .= '<ul class="nav nav-tabs" role="tablist">';
for ($i=0; $i<count($amodul); $i++) {
$hasil .= '<li class="nav-item" role="presentation"><button class="nav-link'.($i==0?' active':'').'" id="i'.$amodul[$i]['Modul'].'-tab" data-bs-toggle="tab" data-bs-target="#i'.$amodul[$i]['Modul'].'" type="button" role="tab" aria-controls="i'.$amodul[$i]['Modul'].'" aria-selected="'.($i==0?'true':'false').'">'.$amodul[$i]['Menu'].'</button></li>';
}
$hasil .= '<li class="nav-item ms-auto"><a class="nav-link disabled text-uppercase">'.$agrup['Nama_Grup'].'</a></li></ul>';
$hasil .= '<div class="tab-content">';
for ($i=0; $i<count($amodul); $i++) {
$alist = array();
$db->Query("SELECT * FROM app_menu WHERE Modul='".$amodul[$i]['Modul']."' AND Level>0 AND Aktif=1 ORDER BY Kode");
while ($db->Next()) {
$akode[] = $db->Row("Kode");
$alist[] = $db->AllRow();
}
$hasil .= '<div class="tab-pane fade'.($i==0?' show active':'').'" role="tabpanel" id="i'.$amodul[$i]['Modul'].'" aria-labelledby="i'.$amodul[$i]['Modul'].'-tab">';
$hasil .= modul_gen($alist, $amenu);
$hasil .= '</div>';
}
$hasil .= '</div>';
} else {
$alist = [];
$db->Query("SELECT * FROM app_menu WHERE Modul='".$amodul[0]['Modul']."' AND Level>0 AND Aktif=1 ORDER BY Kode");
while ($db->Next()) {
$akode[] = $db->Row("Kode");
$alist[] = $db->AllRow();
}
$hasil .= modul_gen($alist, $amenu);
}
echo $hasil.'</div>';
$armenu = array();
for ($i=0; $i<count($amenu); $i++) {
if (!in_array($amenu[$i], $akode)) $armenu[] = $amenu[$i];
}
echo '<input type="hidden" id="Grup_MenuID" value="'. $agrup['Grup_MenuID'] .'" />';
echo '<input type="hidden" id="R_MENU" value="'.implode(",", $armenu).'" />';
} else if ( $data == "save-menu" ) {
$amenu = explode(",", Param::Get("Menu")); $ahasil = array();
$amodul = array();
$db->Query("SELECT * FROM app_menu WHERE Level=0 AND Modul<>'IND' AND Aktif=1 ORDER BY Urut ASC");
while ($db->Next()) {
$amodul[] = $db->AllRow();
}
for ($i=0; $i<count($amodul); $i++) {
$asub = array();
$db->Query("SELECT * FROM app_menu WHERE Modul='".$amodul[$i]['Modul']."' AND Level>0 AND Aktif=1 ORDER BY Kode");
while ($db->Next()) {
if (in_array($db->Row("Kode"), $amenu)) $asub[] = $db->Row("Kode");
}
if (count($asub)>0) $ahasil = array_merge($ahasil, array($amodul[$i]['Kode']), $asub);
}
$db->Query("UPDATE app_menu_grup SET Menu=ENCODE('".implode(",",$ahasil)."','".$_SESSION['__WEB_APP']['REG_ID']."'),DateStamp=NOW(),UserID='".user_id()."' WHERE Grup_MenuID='".$id_grup."'");
$ajson['status'] = true;
} else if ( $data == "detail" ) {
$tcari = trim(Param::Get("Cari_Grup"));
$tsql .= ($tcari=="") ? "" : " WHERE Nama_Grup LIKE '%".$tcari."%'";
$obj = new Table($db);
$obj->set_query("SELECT *,DATE_FORMAT(DateStamp,'%d-%m-%Y %H:%i:%s') DateStamp2,IF(Grup_MenuID=1,0,1) IDel FROM app_menu_grup".$tsql);
$obj->add_field("Grup_MenuID", "ID", "hid");
$obj->add_field("Nama_Grup", "Nama Grup");
$obj->add_field("Ket", "Keterangan");
$obj->add_field("DateStamp2", "Update Terakhir", "c");
$obj->add_field("Aktif", "Aktif", "c", "checkbox");
$obj->set_field_order("Nama_Grup", "A");
$obj->add_row_btn("menu-button", "Menu", "MenuGrupJS.menu_show");
$obj->add_row_btn("clipboard", "Ubah", "MenuGrupJS.detail_ubah");
$obj->add_row_btn("trash", "Hapus", "MenuGrupJS.detail_hapus", "IDel", 1);
$obj->set_func_navi("MenuGrupJS.data_query('detail')");
$obj->set_func_btn("MenuGrupJS.detail_tambah", "+ Grup");
$ajson[] = $obj->json_table("divDetail");
} else if ( $data == "default") {
echo '
<div class="fade-in">
<div class="card"><div class="card-header custom-style">Daftar Grup Menu</div><div class="card-body"><div class="row mb-1"><div class="col"><div class="input-group"><input class="form-control" id="Cari_Grup" name="Cari_User" 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="divDetail">&nbsp;</div></div></div>
</div>';
}
send_json($ajson);
?>
+236
View File
@@ -0,0 +1,236 @@
<?php
/*******************************************************************
Module : /apps/php/sys/operator.php
Desc. : PHP - Manajemen Data Pengguna
Created By : Siau Pheng ([email protected]).
Created Date : August 1st, 2008.
Last Modified : January 1st, 2026.
(c) 2008 - 2026, 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\Table;
use siaupheng\fonia3\Web\Form;
function modul_gen($alist=array(), $amenu=array(), $aglist=array()) {
$hasil = '<table class="table table-striped table-bordered table-hover">';
$hasil .= '<thead><tr><th>Nama Menu</th><th>Keterangan</th><th width="30"><input onchange="OperatorJS.menu_cek(this);" type="checkbox" class="form-check-input mx-2" value="'.$alist[0]['Modul'].'" /></th><th width="30"><input type="checkbox" class="form-check-input mx-2" disabled /></th></tr></thead><tbody>';
for ($i=0; $i<count($alist); $i++) {
$checked = (in_array($alist[$i]['Kode'], $amenu)) ? "checked" : "";
$gchecked = (in_array($alist[$i]['Kode'], $aglist)) ? "checked" : "";
$hasil .= sprintf('<tr><td class="l">%s</td><td class="l">%s</td><td class="c" width="30"><input type="checkbox" class="form-check-input %s" value="%s" %s/></td><td class="c" width="30"><input type="checkbox" class="form-check-input" disabled %s/></td></tr>', str_repeat("--", $alist[$i]['Level']-1)."> ".$alist[$i]['Menu'], $alist[$i]['Judul'], $alist[$i]['Modul'], $alist[$i]['Kode'], $checked, $gchecked);
}
$hasil .= '</tbody></table>';
return $hasil;
}
$db = $db ?? new MySQL();
$ajson = [];
$data = Param::Get("data");
$mode = Param::Get("mode");
$i_filt = Param::Get("Filter_Level", 0);
$id_user = Param::Get("UserID", 0);
if ( $data == "user-detail" ) {
$auser = array('Level'=>1, 'Aktif'=>1);
if ($mode == "edit") {
$db->Query("SELECT * FROM app_operator WHERE UserID='".$id_user."'");
if ($db->Next()) $auser = $db->AllRow();
}
$form = new Form($db);
$t_user = $form->textbox("_", "Username", $auser['Username'], true, true, "text", "username");
$t_nama = $form->textbox("_", "Nama", $auser['Nama'], true, false, "text", "nama pengguna");
$t_posi = $form->textbox("_", "Posisi", $auser['Posisi'], true, false, "text", "posisi pengguna");
$t_level = $form->option_ulevel("_", "Level", $auser['Level'], true, false, "", "OperatorJS.oc_Level();");
$t_pass = $form->password("_", "Password", "", true, true, "", 50, "biarkan kosong jika tidak ingin mengubah password.");
$t_status = $form->switch("_", "Aktif", $auser['Aktif'], true, false, ["1","0"]);
$t_grup = $form->option_db("_", "Grup_MenuID", $auser['Grup_MenuID'], true, false, "app_menu_grup", ["Grup_MenuID","Nama_Grup"], "Aktif=1", [0,"TANPA GRUP"]);
echo '
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Username">Username</label>
<div class="col">'.$t_user.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Nama">Nama Pengguna</label>
<div class="col">'.$t_nama.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Posisi">Posisi Pengguna</label>
<div class="col">'.$t_posi.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Level">Level Pengguna</label>
<div class="col">'.$t_level.'</div>
</div>
<div class="row mb-1"><div class="col"><hr class="my-1"></div></div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Grup_MenuID">Grup Menu</label>
<div class="col">'.$t_grup.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Password">Password</label>
<div class="col">'.$t_pass.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Aktif">Status Aktif ?</label>
<div class="col col-form-label">'.$t_status.'</div>
</div>
<input type="hidden" id="UserID" value="'.$auser['UserID'].'" >
<input type="hidden" id="UserLama" value="'.$auser['Username'].'" >
<input type="hidden" id="mode" value="'.$mode.'" >
';
} else if ( $data == "user-check") {
$ajson['ada'] = false;
$db->Query("SELECT COUNT(*) Jumlah FROM app_operator WHERE Username='".Param::Get("Username")."'");
if ($db->Next()) {
if ($db->Row("Jumlah", 0) > 0) $ajson['ada'] = true;
}
} else if ( $data == "save" ) {
$sql = new SQL($db);
$sql->set_table("app_operator");
$sql->add_param("Grup_MenuID");
$sql->add_param("Username");
$sql->add_param("Nama");
$sql->add_param("Posisi");
$sql->add_param("Level");
$sql->add_param("Aktif");
$sql->add_param("SuperID", user_id());
$sql->add_where("UserID");
if ($mode=="add") {
$sql->InsertDB();
} else if ($mode=="edit") {
$sql->UpdateDB();
} else if ($mode=="del") {
$sql->DeleteDB();
}
// SIMPAN PASSWORD
$pass = Param::Get("Password");
if (($mode <> "del") and ($pass <> "")) {
$db->Query("UPDATE app_operator SET Password=MD5('".$pass."') WHERE Username='".Param::Get("Username")."'");
}
$ajson['status'] = true;
} else if ( $data == "menu" ) {
$auser = array('UserID'=>0,'Nama'=>"",'Grup_MenuID'=>0,'Menu'=>"");
$db->Query("SELECT UserID,Nama,Grup_MenuID,DECODE(Menu,'".$_SESSION['__WEB_APP']['PARENT_CODE']."') Menu FROM app_operator WHERE UserID='".$id_user."' LIMIT 1");
if ($db->Next()) $auser = $db->AllRow();
$amenu = explode(",", $auser['Menu']);
$akode = []; $aglist = [];
$db->Query("SELECT DECODE(Menu,'".$_SESSION['__WEB_APP']['PARENT_CODE']."') Menu FROM app_menu_grup WHERE Grup_MenuID='".$auser['Grup_MenuID']."' LIMIT 1");
if ($db->Next()) $aglist = explode(",", $db->Row("Menu"));
$amodul = [];
$db->Query("SELECT * FROM app_menu WHERE Level=0 AND Modul<>'IND' AND Aktif=1 ORDER BY Urut ASC");
while ($db->Next()) {
$amodul[] = $db->AllRow();
}
$hasil = '<div id="tabMenuList">';
if (count($amodul)>1) {
$hasil .= '<ul class="nav nav-tabs" role="tablist">';
for ($i=0; $i<count($amodul); $i++) {
$hasil .= '<li class="nav-item" role="presentation"><button class="nav-link'.($i==0?' active':'').'" id="i'.$amodul[$i]['Modul'].'-tab" data-bs-toggle="tab" data-bs-target="#i'.$amodul[$i]['Modul'].'" type="button" role="tab" aria-controls="i'.$amodul[$i]['Modul'].'" aria-selected="'.($i==0?'true':'false').'">'.$amodul[$i]['Menu'].'</button></li>';
}
$hasil .= '<li class="nav-item ms-auto"><a class="nav-link disabled text-uppercase">'.$auser['Nama'].'</a></li></ul>';
$hasil .= '<div class="tab-content">';
for ($i=0; $i<count($amodul); $i++) {
$alist = array();
$db->Query("SELECT * FROM app_menu WHERE Modul='".$amodul[$i]['Modul']."' AND Level>0 AND Aktif=1 ORDER BY Kode");
while ($db->Next()) {
$akode[] = $db->Row("Kode");
$alist[] = $db->AllRow();
}
$hasil .= '<div class="tab-pane fade'.($i==0?' show active':'').'" role="tabpanel" id="i'.$amodul[$i]['Modul'].'" aria-labelledby="i'.$amodul[$i]['Modul'].'-tab">';
$hasil .= modul_gen($alist, $amenu, $aglist);
$hasil .= '</div>';
}
$hasil .= '</div>';
} else {
$alist = array();
$db->Query("SELECT * FROM app_menu WHERE Modul='".$amodul[0]['Modul']."' AND Level>0 AND Aktif=1 ORDER BY Kode");
while ($db->Next()) {
$akode[] = $db->Row("Kode");
$alist[] = $db->AllRow();
}
$hasil .= modul_gen($alist, $amenu, $aglist);
//$hasil .= '</div>';
}
echo $hasil.'</div>';
$armenu = array();
for ($i=0; $i<count($amenu); $i++) {
if (!in_array($amenu[$i], $akode)) $armenu[] = $amenu[$i];
}
echo '<input type="hidden" id="UserID" value="'. $auser['UserID'] .'" />';
echo '<input type="hidden" id="R_MENU" value="'.implode(",", $armenu).'" />';
} else if ( $data == "save-menu" ) {
$amenu = explode(",", Param::Get("Menu")); $ahasil = [];
$amodul = array();
$db->Query("SELECT * FROM app_menu WHERE Level=0 AND Modul<>'IND' AND Aktif=1 ORDER BY Urut ASC");
while ($db->Next()) {
$amodul[] = $db->AllRow();
}
for ($i=0; $i<count($amodul); $i++) {
$asub = [];
$db->Query("SELECT * FROM app_menu WHERE Modul='".$amodul[$i]['Modul']."' AND Level>0 AND Aktif=1 ORDER BY Kode");
while ($db->Next()) {
if (in_array($db->Row("Kode"), $amenu)) $asub[] = $db->Row("Kode");
}
if (count($asub)>0) $ahasil = array_merge($ahasil, array($amodul[$i]['Kode']), $asub);
}
$db->Query("UPDATE app_operator SET Menu=ENCODE('".implode(",",$ahasil)."','".$_SESSION['__WEB_APP']['PARENT_CODE']."'),SuperID='".user_id()."' WHERE UserID='".$id_user."'");
$ajson['status'] = true;
} else if ( $data == "detail" ) {
$tcari = Param::Get("Cari_User");
$tsql = (user_id()==1) ? "" : " AND UserID>2";
$tsql = (user_id()==2) ? " AND UserID>1" : $tsql;
$tsql .= ($i_filt==0) ? "" : " AND Level='".$i_filt."'";
$tsql .= ($tcari=="") ? "" : " AND CONCAT(Username,Nama) LIKE '%".$tcari."%'";
$obj = new Table($db);
$obj->set_query("SELECT * FROM app_operator WHERE Level>=".$_SESSION['__WEB_USER']['Level'].$tsql);
$obj->add_field("UserID", "ID", "hid");
$obj->add_field("Username", "Username");
$obj->add_field("Nama", "Nama Pengguna", "awr");
$obj->add_field("Posisi", "Posisi");
$obj->add_field("Level", "Level", "l", $_SESSION['__WEB_APP']['USER_LEVEL']);
$obj->add_field("Aktif", "Aktif", "c", "checkbox");
$obj->set_field_order("Username", "A");
$obj->add_row_btn("menu-button", "Menu", "OperatorJS.menu_show");
$obj->add_row_btn("clipboard", "Ubah", "OperatorJS.detail_ubah");
$obj->add_row_btn("trash", "Hapus", "OperatorJS.detail_hapus");
$obj->set_func_navi("OperatorJS.data_query('detail')");
$obj->set_func_btn("OperatorJS.detail_tambah", "+ Pengguna");
$ajson[] = $obj->json_table("divDetail");
} else if ($data == "detail_filter") {
$form = new Form($db);
$_form = $form->option_ulevel("Level Pengguna", "Fi_Level", $i_filt);
echo '
<div class="row mb-3"><div class="col text-center">Tampilan Berdasarkan :</div></div>
<div class="row"><div class="col text-center">'.$_form.'</div></div>';
} else if ( $data == "default") {
echo '
<div class="fade-in">
<div class="card"><div class="card-header custom-style">Daftar Pengguna</div><div class="card-body"><div class="row mb-1"><div class="col"><div class="input-group"><input class="form-control" id="Cari_User" name="Cari_User" 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 class="col-auto"><button class="btn btn-info shadow-none" type="button" id="butFilter">Filter</button><input type="hidden" id="Filter_Level"></div></div><div id="divDetail">&nbsp;</div></div></div>
</div>';
}
send_json($ajson);
?>
+102
View File
@@ -0,0 +1,102 @@
<?php
/*******************************************************************
Module : /apps/php/sys/printer.php
Desc. : PHP - Konfigurasi Printer POS
Created By : Siau Pheng ([email protected]).
Created Date : August 4th, 2013.
Last Modified : December 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\Table;
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();
$db->Query("SELECT Nama_Cab FROM para_cabang WHERE CabID='".$para['CABANGID']."' LIMIT 1");
if ($db->Next()) $para = array_merge($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.'" >';
$ajson['Nama_Cabang'] = $para['Nama_Cab'];
} else if ( $data == "brow-cabang" ) {
$obj = new Table($db);
$obj->set_query("SELECT C.*,G.REG_ID FROM (SELECT * FROM para_cabang WHERE Aktif=1) C LEFT JOIN inv_config G ON (G.CABANGID=C.CabID)");
$obj->add_field("REG_ID", "ID", "hid");
$obj->add_field("Kode_Cab", "Kode", "c");
$obj->add_field("Nama_Cab", "Nama Cabang", "awr");
$obj->set_field_order("Kode_Cab", "A");
$obj->add_row_btn("save", "Pilih", "PrinterJS.cab_select");
$obj->set_func_navi("PrinterJS.data_query('brow-cabang')");
$ajson[] = $obj->json_table("divBrowCab");
} else if ( $data == "default") {
echo '<div class="row mb-1"><div class="col"><div class="input-group"><input class="form-control" id="Nama_Cabang" type="text" disabled readonly><button id="butBrow" class="btn btn-info" type="button" onclick="PrinterJS.cabang_brow();"><i class="bi-search"></i></button></div></div></div><div class="card"><div class="card-body"><div id="divPrinter">&nbsp;</div><input type="hidden" id="REG_ID" value="'.$id_reg.'"></div></div>';
}
send_json($ajson);
?>
+53
View File
@@ -0,0 +1,53 @@
<?php
/*******************************************************************
Module : /apps/php/sys/super.php
Desc. : PHP - Informasi Supervisi Operator
Created By : Siau Pheng ([email protected]).
Created Date : September 11st, 2012.
Last Modified : March 19th, 2023.
(c) 2012 - 2023, 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\Table;
use siaupheng\fonia3\Web\Form;
$db = $db ?? new MySQL();
$ajson = [];
$data = Param::Get("data");
if ( $data == "save" ) {
$db->Query("UPDATE app_auth SET Auth=1,SuperID='".user_id()."' WHERE UserID='".Param::Get("USERID")."' AND Kode='".Param::Get("KODE")."' AND SID='".Param::Get("REQ_SID")."' AND REQ='".Param::Get("REQ")."'");
} else if ( $data == "detail" ) {
$obj = new Table($db);
$obj->set_query("SELECT A.*,DATE_FORMAT(A.Tanggal,'%d-%m-%Y %H:%i:%s') Tanggal2,O.Nama Nama_User,M.Judul FROM app_auth A LEFT JOIN app_operator O ON (A.UserID=O.UserID) LEFT JOIN app_menu M ON (A.Kode=M.Kode) WHERE A.Auth=0");
$obj->add_field("UserID", "UserID", "hid");
$obj->add_field("Kode", "Kode", "hid");
$obj->add_field("SID", "SID", "hid");
$obj->add_field("Nama_User", "User ID", "l");
$obj->add_field("Tanggal", "Tanggal", "c");
$obj->add_field("Judul", "Menu Aplikasi", "l");
$obj->add_field("Catatan", "Informasi Transaksi", "awr");
$obj->add_field("REQ", "Kode Request", "l");
$obj->add_row_btn("unlock2", "Proses", "SuperJS.detail_select");
$obj->set_func_navi("SuperJS.data_query('detail')");
$ajson[] = $obj->json_table("divSuper");
} else if ( $data == "default") {
echo '
<div class="fade-in">
<div class="card"><div class="card-header custom-style">Supervisi Hak Akses</div><div class="card-body"><div class="row mb-1"><div class="col"><div class="input-group"><input class="form-control" id="Cari_Super" 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="divSuper">&nbsp;</div></div></div>
</div>';
}
send_json($ajson);
?>
+107
View File
@@ -0,0 +1,107 @@
<?php
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/php/tab/karyawan.php
Desc. : PHP - Tabel Master Karyawan
Created By : Siau Pheng ([email protected]).
Created Date : July 7th, 2015.
Last Modified : October 8th, 2025.
(c) 2015 - 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\Table;
use siaupheng\fonia3\Web\Form;
$db = $db ?? new MySQL();
$ajson = [];
$data = Param::Get("data");
$mode_detail = Param::Get("mode_detail");
$id_tm = Param::Get("KaryaID", 0);
if ( $data == "karya-detail" ) {
$atabel = ['KaryaID'=>0,'Aktif'=>1];
if ($id_tm > 0) {
$db->Query("SELECT * FROM para_karyawan WHERE KaryaID='".$id_tm."' LIMIT 1");
if ($db->Next()) $atabel = $db->AllRow();
}
$form = new Form($db);
$tnama = $form->textbox("_", "Nama_Karya", $atabel['Nama_Karya'], true, true, "text", "nama karyawan");
$tmasuk = $form->datebox("_", "Tgl_Masuk", $atabel['Tgl_Masuk'], true, false);
$tkeluar = $form->datebox("_", "Tgl_Keluar", $atabel['Tgl_Keluar'], true, false);
$taktif = $form->switch("_", "Aktif", $atabel['Aktif'], true, false, ["1","0"]);
echo '
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Nama_Karya">Nama Karyawan</label>
<div class="col">'.$tnama.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Tgl_Masuk">Tanggal Masuk</label>
<div class="col-sm-6 col-lg-5">'.$tmasuk.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Tgl_Keluar">Tanggal Keluar</label>
<div class="col-sm-6 col-lg-5">'.$tkeluar.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Aktif">Status Aktif ?</label>
<div class="col-sm-6 col-lg-5 col-form-label">'.$taktif.'</div>
</div>
<input type="hidden" id="KaryaID" value="'.$atabel['KaryaID'].'" >
<input type="hidden" id="mode_detail" value="'.$mode_detail.'" >';
} else if ( $data == "detail" ) {
if (in_array($mode_detail, ["insert","update","delete"])) {
$sql = new SQL($db);
$sql->set_table("para_karyawan");
$sql->add_param("Nama_Karya");
$sql->add_param_date("Tgl_Masuk");
$sql->add_param_date("Tgl_Keluar");
$sql->add_param("Aktif");
$sql->add_param_userid();
$sql->add_where("KaryaID");
if ($mode_detail=="insert") {
$sql->InsertDB();
} else if ($mode_detail=="update") {
$sql->UpdateDB();
} else if ($mode_detail=="delete") {
$sql->DeleteDB();
}
}
$tcari = trim(Param::Get("Cari_TX"));
$tsql = ($tcari=="") ? "" : " WHERE Nama_Karya LIKE '%".$tcari."%'";
$obj = new Table($db);
$obj->set_query("SELECT * FROM para_karyawan".$tsql);
$obj->add_field("KaryaID", "ID", "hid");
$obj->add_field("Nama_Karya", "Nama Karyawan", "awr");
$obj->add_field("Tgl_Masuk", "Tgl. Masuk", "c", "sqltgl");
$obj->add_field("Tgl_Keluar", "Tgl. Keluar", "c", "sqltgl");
$obj->add_field("Aktif", "Aktif", "c", "checkbox");
$obj->set_field_order("Nama_Karya", "A");
$obj->add_row_btn("clipboard", "Ubah", "KaryawanJS.detail_ubah");
$obj->add_row_btn("trash", "Hapus", "KaryawanJS.detail_hapus");
$obj->set_func_navi("KaryawanJS.data_query('detail')");
$obj->set_func_btn("KaryawanJS.detail_tambah", "+ Karyawan");
$ajson[] = $obj->json_table("divDetail");
} else if ( $data == "default") {
echo '
<div class="fade-in">
<div class="card"><div class="card-header custom-style">Daftar Karyawan</div><div class="card-body"><div class="row mb-1"><div class="col"><div class="input-group"><input class="form-control" id="Cari_Karya" 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="divDetail">&nbsp;</div></div></div>
</div>';
}
send_json($ajson);
?>
+100
View File
@@ -0,0 +1,100 @@
<?php
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/php/tab/merek.php
Desc. : PHP - Tabel Master Merek Barang
Created By : Siau Pheng ([email protected]).
Created Date : May 19th, 2010.
Last Modified : October 18th, 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\Table;
use siaupheng\fonia3\Web\Form;
$db = $db ?? new MySQL();
$ajson = [];
$data = Param::Get("data");
$mode_detail = Param::Get("mode_detail");
$id_tm = Param::Get("MerekID", 0);
if ( $data == "merek-detail" ) {
$atabel = ['MerekID'=>0,'Aktif'=>1];
if ($id_tm > 0) {
$db->Query("SELECT * FROM para_merek WHERE MerekID='".$id_tm."' LIMIT 1");
if ($db->Next()) $atabel = $db->AllRow();
}
$form = new Form($db);
$tkode = $form->textbox("_", "Kode_Merek", $atabel['Kode_Merek'], true, true, "text", "kode merek barang");
$tnama = $form->textbox("_", "Nama_Merek", $atabel['Nama_Merek'], true, true, "text", "nama merek barang");
$taktif = $form->switch("_", "Aktif", $atabel['Aktif'], true, false, ["1","0"]);
echo '
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Kode_Merek">Kode Merek</label>
<div class="col-sm-6 col-lg-5">'.$tkode.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Nama_Merek">Nama Merek</label>
<div class="col">'.$tnama.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Aktif">Status Aktif ?</label>
<div class="col-sm-6 col-lg-5 col-form-label">'.$taktif.'</div>
</div>
<input type="hidden" id="MerekID" value="'.$atabel['MerekID'].'" >
<input type="hidden" id="mode_detail" value="'.$mode_detail.'" >';
} else if ( $data == "detail" ) {
if (in_array($mode_detail, ["insert","update","delete"])) {
$sql = new SQL($db);
$sql->set_table("para_merek");
$sql->add_param("Kode_Merek");
$sql->add_param("Nama_Merek");
$sql->add_param("Aktif");
$sql->add_param_userid();
$sql->add_where("MerekID");
if ($mode_detail=="insert") {
$sql->InsertDB();
} else if ($mode_detail=="update") {
$sql->UpdateDB();
} else if ($mode_detail=="delete") {
$sql->DeleteDB();
}
}
$tcari = trim(Param::Get("Cari_Merek"));
$tsql = ($tcari=="") ? "" : " WHERE CONCAT(Kode_Merek,Nama_Merek) LIKE '%".$tcari."%'";
$obj = new Table($db);
$obj->set_query("SELECT * FROM para_merek".$tsql);
$obj->add_field("MerekID", "ID", "hid");
$obj->add_field("Kode_Merek", "Kode", "l");
$obj->add_field("Nama_Merek", "Nama Merek", "awr");
$obj->add_field("Aktif", "Aktif", "c", "checkbox");
$obj->set_field_order("Kode_Merek", "A");
$obj->add_row_btn("clipboard", "Ubah", "MerekJS.detail_ubah");
$obj->add_row_btn("trash", "Hapus", "MerekJS.detail_hapus");
$obj->set_func_navi("MerekJS.data_query('detail')");
$obj->set_func_btn("MerekJS.detail_tambah", "+ Merek");
$ajson[] = $obj->json_table("divDetail");
} else if ( $data == "default") {
echo '
<div class="fade-in">
<div class="card"><div class="card-header custom-style">Daftar Merek Barang</div><div class="card-body"><div class="row mb-1"><div class="col"><div class="input-group"><input class="form-control" id="Cari_Merek" 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="divDetail">&nbsp;</div></div></div>
</div>';
}
send_json($ajson);
?>
+474
View File
@@ -0,0 +1,474 @@
<?php
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/php/tab/produk.php
Desc. : PHP - Tabel Master Barang
Created By : Siau Pheng ([email protected]).
Created Date : May 19th, 2010.
Last Modified : January 10th, 2026.
(c) 2010 - 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 Produk_Baru($autosave = false) {
global $db;
$ino = 1;
$db->Query("SELECT MAX(InvID)+1 Nomor FROM inv_produk");
if ($db->Next()) $ino = (int)$db->Row("Nomor", 1);
if ($autosave) $db->Query("INSERT INTO inv_produk (InvID) VALUES ('".$ino."')");
return $ino;
}
function Produk_Save($id_inv = 0, $id_grup = 0) {
global $db;
if ($id_inv == 0) return;
$akemas = [];
$db->Query("SELECT InvKemasanID FROM inv_produk_kemasan WHERE InvID='".$id_inv."' AND Kode_SKU=''");
while ($db->Next()) {
$akemas[] = $db->Row("InvKemasanID");
}
if (count($akemas) > 0) {
foreach($akemas as $_key => $val) {
$sku_baru = SKU_Baru($id_grup);
$db->Query("UPDATE inv_produk_kemasan SET Kode_SKU='".$sku_baru."' WHERE InvKemasanID='".$val."' LIMIT 1");
}
}
}
function Produk_Backup($id_inv = 0) {
global $db;
if ($id_inv == 0) return;
$db->Query("INSERT IGNORE INTO inv_produk_backup (InvID,UserID,Produk,Kemasan,MD5Key) SELECT A.InvID,A.UserID,A.Produk,IFNULL(B.Kemasan,'[]'),UPPER(MD5(CONCAT(A.Produk,IFNULL(B.Kemasan,'[]')))) FROM (SELECT InvID,UserID,JSON_ARRAYAGG(JSON_OBJECT('InvID',InvID,'Grup_InvID',Grup_InvID,'MerekID',MerekID,'Nama_Produk',Nama_Produk,'StokID',StokID,'NormalID',NormalID,'Harga_Beli',Harga_Beli,'Harga_Tambah',Harga_Tambah,'Harga_Pokok',Harga_Pokok,'Stok_Min',Stok_Min,'Stok_Max',Stok_Max,'Aktif',Aktif,'UserID',UserID)) Produk FROM inv_produk WHERE InvID='".$id_inv."') A LEFT JOIN (SELECT InvID,JSON_ARRAYAGG(JSON_OBJECT('InvKemasanID', InvKemasanID, 'InvID', InvID, 'SatuanID', SatuanID, 'Kode_SKU', Kode_SKU, 'Kode_Barcode', Kode_Barcode, 'Qty', Qty, 'Harga_Jual', Harga_Jual)) Kemasan FROM inv_produk_kemasan WHERE InvID='".$id_inv."') B ON (A.InvID=B.InvID)");
}
function Produk_Restore($id_inv = 0, $md5_key = "") {
global $db;
if ($id_inv == 0) return;
$_json_produk = []; $_json_kemasan = []; $_userid = 0;
$tsql = ($md5_key == "") ? "ORDER BY Tanggal DESC" : "AND MD5Key='".$md5_key."'";
$db->Query("SELECT * FROM inv_produk_backup WHERE InvID='".$id_inv."' ".$tsql." LIMIT 1");
if ($db->Next()) {
$_json_produk = json_decode($db->Row("Produk", "[]"), true);
$_json_kemasan = json_decode($db->Row("Kemasan", "[]"), true);
$_userid = $db->Row("UserID", 0);
}
if (isset($_json_produk[0]['InvID'])) {
$db->Query("DELETE FROM inv_produk_kemasan WHERE InvID='".$id_inv."'");
foreach($_json_produk as $_key => $val) {
$db->Query("REPLACE INTO inv_produk (InvID,Grup_InvID,MerekID,Nama_Produk,StokID,NormalID,Harga_Beli,Harga_Tambah,Harga_Pokok,Stok_Min,Stok_Max,Aktif,UserID) VALUES ('".$val['InvID']."','".$val['Grup_InvID']."','".$val['MerekID']."','".$val['Nama_Produk']."','".$val['StokID']."','".$val['NormalID']."','".$val['Harga_Beli']."','".$val['Harga_Tambah']."','".$val['Harga_Pokok']."','".$val['Stok_Min']."','".$val['Stok_Max']."','".$val['Aktif']."','".$_userid."') LIMIT 1");
}
foreach($_json_kemasan as $_key => $val) {
$db->Query("REPLACE INTO inv_produk_kemasan (InvKemasanID,InvID,SatuanID,Kode_SKU,Kode_Barcode,Qty,Harga_Jual,UserID) VALUES ('".$val['InvKemasanID']."','".$val['InvID']."','".$val['SatuanID']."','".$val['Kode_SKU']."','".$val['Kode_Barcode']."','".$val['Qty']."','".$val['Harga_Jual']."','".$_userid."') LIMIT 1");
}
}
}
$db = $db ?? new MySQL();
$ajson = [];
$data = Param::Get("data");
$mode = Param::Get("mode");
$mode_detail = Param::Get("mode_detail");
$id_inv = Param::Get("InvID", 0);
$id_kemasan = Param::Get("InvKemasanID", 0);
$md5_key = Param::Get("MD5Key", "");
$i_filt = Param::Get("Filter_Produk", 0);
if ( $data == "detail-produk" ) {
$atabel = ['InvID'=>0,'Grup_InvID'=>0,'StokID'=>$_SESSION['__APP_INV']['DEF_SATUANID'],'NormalID'=>$_SESSION['__APP_INV']['DEF_SATUANID'],'Aktif'=>1];
if ($id_inv > 0) {
$db->Query("SELECT * FROM inv_produk WHERE InvID='".$id_inv."' LIMIT 1");
if ($db->Next()) $atabel = $db->AllRow();
Produk_Backup($id_inv);
} else {
$atabel['InvID'] = Produk_Baru(true);
}
$form = new Form($db);
$tnama = $form->textbox("_", "Nama_Produk", $atabel['Nama_Produk'], true, true, "text", "nama barang");
$tgrup = $form->option_db("_", "Grup_InvID", $atabel['Grup_InvID'], true, false, "inv_produk_grup", ["Grup_InvID","Nama_Grup"], "Aktif=1 ORDER BY Nama_Grup", [0,"&nbsp;"]);
$tmerek = $form->option_db("_", "MerekID", $atabel['MerekID'], true, false, "para_merek", ["MerekID","Nama_Merek"], "Aktif=1 ORDER BY Nama_Merek", [0,"&nbsp;"]);
$tstok = $form->option_db("_", "StokID", $atabel['StokID'], true, false, "para_satuan", ["SatuanID","Nama_Satuan"], "Aktif=1 ORDER BY Nama_Satuan", [0,"&nbsp;"]);
$tnormal = $form->option_db("_", "NormalID", $atabel['NormalID'], true, false, "para_satuan", ["SatuanID","Nama_Satuan"], "Aktif=1 ORDER BY Nama_Satuan", [0,"&nbsp;"]);
$tbeli = $form->textbox("_", "Harga_Beli", $atabel['Harga_Beli'], true, true, "double", "harga beli", null, null, "ProdukJS.hitung_HPP();");
$ttambah = $form->textbox("_", "Harga_Tambah", $atabel['Harga_Tambah'], true, true, "double", "tambahan biaya", null, null, "ProdukJS.hitung_HPP();");
$thpp = $form->textbox("_", "Harga_Pokok", $atabel['Harga_Pokok'], true, true, "double", "harga pokok");
$tsmin = $form->textbox("_", "Stok_Min", $atabel['Stok_Min'], true, true, "double", "stok minimal");
$tsmax = $form->textbox("_", "Stok_Max", $atabel['Stok_Max'], true, true, "double", "stok maximal");
$taktif = $form->radio("_", "Aktif", $atabel['Aktif'], true, true, ['1'=>"Ya",'0'=>"Tidak"]);
$ajson['html'] = '
<ul class="nav nav-tabs" role="tablist">
<li class="nav-item" role="presentation">
<button class="nav-link active" id="produk-tab" data-bs-toggle="tab" data-bs-target="#produk" type="button" role="tab" aria-controls="produk" aria-selected="true">Informasi Barang</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link" id="kemasan-tab" data-bs-toggle="tab" data-bs-target="#kemasan" type="button" role="tab" aria-controls="kemasan" aria-selected="false">Kemasan / SKU / Harga Jual</button>
</li>
<li class="nav-item ms-auto">
<a class="nav-link disabled" href="#" tabindex="-1" aria-disabled="true">'.$atabel['Nama_Produk'].'</a>
</li>
</ul>
<div class="tab-content border border-top-0 p-3">
<div class="tab-pane fade active show" id="produk" role="tabpanel" aria-labelledby="produk-tab">
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label" for="Grup_InvID">Grup Barang</label>
<div class="col-sm-4 col-lg-5">'.$tgrup.'</div>
<div class="col-sm-4 col-lg-5 text-end"><label class="form-label me-3">Barang Aktif ?</label>'.$taktif.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label" for="MerekID">Merek Barang</label>
<div class="col-sm-4 col-lg-5">'.$tmerek.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 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-2 col-form-label" for="StokID">Satuan Stok / Normal</label>
<div class="col-sm-4 col-lg-5"><div class="input-group">'.$tstok.Form_Info("Ukuran satuan terkecil produk.").'</div></div>
<div class="col-sm-4 col-lg-5"><div class="input-group">'.$tnormal.Form_Info("Ukuran satuan yang dipergunakan dalam transaksi normal dan laporan.").'</div></div>
</div>
<div class="row mb-1"><div class="col"><hr class="my-1"></div></div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label" for="Harga_Beli">Harga Beli</label>
<div class="col-sm-4 col-lg-5">'.$tbeli.'</div>
<div class="col-sm-4 col-lg-5"><div class="input-group"><span class="input-group-text" style="min-width:30%;">Stok Minimum</span>'.$tsmin.'</div></div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label" for="Harga_Tambah">+ Biaya</label>
<div class="col-sm-4 col-lg-5">'.$ttambah.'</div>
<div class="col-sm-4 col-lg-5"><div class="input-group"><span class="input-group-text" style="min-width:30%;">Stok Maximum</span>'.$tsmax.'</div></div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label" for="Harga_Pokok">Harga Pokok</label>
<div class="col-sm-4 col-lg-5">'.$thpp.'</div>
</div>
</div>
<div class="tab-pane fade" id="kemasan" role="tabpanel" aria-labelledby="kemasan-tab">
<div class="row"><div class="col" id="divKemasan"></div></div>
</div>
</div>
<input type="hidden" id="InvID" value="'.$atabel['InvID'].'" />
<input type="hidden" id="mode" value="'.$mode.'" />
';
} else if ( $data == "save" ) {
if ($mode == "cancel") {
if (Param::Get("mode_before")=="add") {
$db->Query("DELETE FROM inv_produk_kemasan WHERE InvID='".$id_inv."'");
$db->Query("DELETE FROM inv_produk WHERE InvID='".$id_inv."'");
} else {
Produk_Restore($id_inv);
}
} else {
$sql = new SQL($db);
$sql->set_table("inv_produk");
$sql->add_param("Grup_InvID");
$sql->add_param("MerekID");
$sql->add_param("Nama_Produk");
$sql->add_param("StokID");
$sql->add_param("NormalID");
$sql->add_param("Harga_Beli");
$sql->add_param("Harga_Tambah");
$sql->add_param("Harga_Pokok", "Harga_Beli+Harga_Tambah", true);
$sql->add_param("Stok_Min");
$sql->add_param("Stok_Max");
$sql->add_param("Aktif");
$sql->add_param_userid();
$sql->add_where("InvID");
if (in_array($mode, ["add","edit"])) {
$sql->UpdateDB();
} else if ($mode=="del") {
$sql->DeleteDB();
$db->Query("DELETE FROM inv_produk_kemasan WHERE InvID='".$id_inv."'");
}
if ($mode <> "del") {
Produk_Save($id_inv, Param::Get("Grup_InvID"));
Produk_Backup($id_inv);
}
}
$ajson['status'] = true;
} else if ( $data == "tabel-produk" ) {
$tcari = trim(Param::Get("Cari_Produk"));
$tsql = "";
if ($tcari <> "") {
$tsql = " AND Nama_Produk LIKE '%".$tcari."%'";
if (is_numeric($tcari)) {
$tsql .= " OR InvID IN (SELECT InvID FROM inv_produk_kemasan WHERE CONCAT(Kode_SKU,Kode_Barcode) LIKE '%".$tcari."%')";
}
} else {
$tsql .= ($i_filt==0) ? "" : " AND Grup_InvID='".$i_filt."'";
}
if (strlen($tsql)>0) $tsql = " WHERE".substr($tsql, 4);
$obj = new Table($db);
$obj->set_table("(SELECT * FROM inv_produk".$tsql.") P LEFT JOIN inv_produk_kemasan K ON (K.InvID=P.InvID) LEFT JOIN para_satuan S ON (S.SatuanID=P.StokID)", "P.InvID,P.Nama_Produk,S.Nama_Satuan,Round(P.Harga_Pokok*K.Qty,2) Harga_Pokok,(((K.Harga_Jual-(P.Harga_Pokok*K.Qty))*100)/K.Harga_Jual) Margin,K.Harga_Jual,P.Stok_Min", "");
$obj->add_field("InvID", "ID", "hid");
$obj->add_field("Nama_Produk", "Nama Barang", "awr");
$obj->add_field("Nama_Satuan", "Satuan Stok");
if (user_level(2)) {
$obj->add_field("Harga_Pokok", "Harga Pokok", "r", "rupiah");
$obj->add_field("Harga_Jual", "Harga Jual", "r", "rupiah");
$obj->add_field("Margin", "%", "r", "rupiah2");
} else {
$obj->add_field("Harga_Jual", "Harga Jual", "r", "rupiah");
}
$obj->add_field("Stok_Min", "Stok Min", "r", "rupiah");
$obj->add_field("Aktif", "Aktif", "c", "checkbox");
$obj->set_field_order("InvID", "D");
$obj->add_row_btn("clipboard", "Ubah", "ProdukJS.produk_ubah");
if (user_level(2)) $obj->add_row_btn("arrow-counterclockwise", "Restore", "ProdukJS.produk_restore");
$obj->add_row_btn("trash", "Hapus", "ProdukJS.produk_hapus");
$obj->set_func_navi("ProdukJS.data_query('tabel-produk')");
$obj->set_func_btn("ProdukJS.produk_tambah", "+ Produk");
$ajson[] = $obj->db_table("divDetail");
} else if ( $data == "tabel-kemasan" ) {
if (in_array($mode_detail, ["update","delete"])) {
$sql = new SQL($db);
$sql->set_table("inv_produk_kemasan");
$sql->add_param("SatuanID");
$sql->add_param("Kode_Barcode");
$sql->add_param("Qty");
$sql->add_param("Harga_Jual");
$sql->add_param_userid();
$sql->add_where("InvKemasanID", $id_kemasan);
if ($mode_detail=="update") {
if ($id_kemasan == 0) {
$sql->add_param("InvID");
$sql->InsertDB();
} else {
$sql->UpdateDB();
}
} else if ($mode_detail=="delete") {
$sql->DeleteDB();
}
}
$obj = new Table($db);
$obj->set_query("SELECT K.*,S.Nama_Satuan,(K.Qty*P.Harga_Pokok) Harga_Modal,IF(K.Harga_Jual=0,0,K.Harga_Jual-(K.Qty*P.Harga_Pokok)) Margin_Rup, IF(K.Harga_Jual=0,0,((K.Harga_Jual-(K.Qty*P.Harga_Pokok))*100)/K.Harga_Jual) Margin_Per FROM (SELECT * FROM inv_produk_kemasan WHERE InvID='".$id_inv."') K LEFT JOIN (SELECT * FROM inv_produk WHERE InvID='".$id_inv."') P ON (K.InvID=P.InvID) LEFT JOIN para_satuan S ON (K.SatuanID=S.SatuanID)");
$obj->add_field("InvKemasanID", "ID", "hid");
$obj->add_field("Nama_Satuan", "Nama Kemasan", "l");
$obj->add_field("Kode_SKU", "SKU", "c");
$obj->add_field("Kode_Barcode", "Barcode", "l");
$obj->add_field("Qty", "Qty", "r", "rupiah");
$obj->add_field("Harga_Jual", "Harga Jual", "r", "rupiah");
if (user_level(2)) {
$obj->add_field("Harga_Modal", "Harga Modal", "r", "rupiah");
$obj->add_field("Margin_Rup", "Margin (Rp.)", "r", "rupiah");
$obj->add_field("Margin_Per", "Margin (%)", "r", "rupiah2");
}
$obj->set_row_color("Harga_Jual", 0, "rred");
$obj->set_field_order("Qty", "D");
$obj->add_row_form("pencil-square", "Detail", "ProdukJS.kemasan_form");
$obj->add_row_btn("trash", "Hapus", "ProdukJS.kemasan_del");
$obj->set_func_btn("ProdukJS.kemasan_add", "+ Kemasan");
$ajson[] = $obj->json_table("divKemasan");
} else if ( $data == "detail-kemasan" ) {
$arec = ['InvKemasanID'=>0,'SatuanID'=>0,'Qty'=>0,'Kode_SKU'=>"SKU_BARU"];
if ($id_kemasan > 0) {
$db->Query("SELECT * FROM inv_produk_kemasan WHERE InvKemasanID='".$id_kemasan."' LIMIT 1");
if ($db->Next()) $arec = $db->AllRow();
}
$form = new Form($db);
$tsatuan = $form->option_db("_", "SatuanID", $arec['SatuanID'], true, false, "para_satuan", ["SatuanID","Nama_Satuan"], "Aktif=1 ORDER BY Nama_Satuan");
$tqty = $form->textbox("_", "Qty", $arec['Qty'], true, true, "number", "qty", null, null, "ProdukJS.calc_Modal();");
$tsku = $form->textbox("_", "Kode_SKU", $arec['Kode_SKU'], false, false, "text");
$tbcode = $form->textbox("_", "Kode_Barcode", $arec['Kode_Barcode'], true, false, "text");
$tmodal = $form->textbox("_", "Harga_Modal", $arec['Harga_Modal'], false, false, "double");
$tharga = $form->textbox("_", "Harga_Jual", $arec['Harga_Jual'], true, false, "double", "harga jual", null, null, "ProdukJS.calc_Harga(1);");
$tpersen = $form->textbox("_", "Persen_Jual", $arec['Persen_Jual'], true, false, "double", "persen jual", null, null, "ProdukJS.calc_Harga(2);");
$ajson['html'] = '
<div class="card"><div class="card-body">
<div class="row mb-1">
<label class="col-sm-6 col-lg-2 col-form-label" for="SatuanID">Nama Kemasan</label>
<div class="col-sm-6 col-lg-4">'.$tsatuan.'</div>
<div class="col-sm-12 col-lg-6"><div class="input-group"><span class="input-group-text" style="min-width:30%;">Kode SKU</span>'.$tsku.'</div></div>
</div>
<div class="row mb-1">
<label class="col-sm-6 col-lg-2 col-form-label" for="Qty">Qty / Kemasan</label>
<div class="col-sm-6 col-lg-4"><div class="input-group">'.$tqty.'<span class="input-group-text">'.Param::Get("Nama_Satuan","Satuan").'</span></div></div>
<div class="col-sm-12 col-lg-6"><div class="input-group"><span class="input-group-text" style="min-width:30%;">Kode Barcode</span>'.$tbcode.'</div></div>
</div>
<div class="row mb-1"><hr class="my-1"></div>
<div class="row mb-1">
<label class="col-sm-6 col-lg-2 col-form-label" for="Harga_Jual">Harga Jual</label>
<div class="col-sm-6 col-lg-4">'.$tharga.'</div>
<div class="col-sm-6 col-lg-2"><div class="input-group"><div class="input-group-text">&thickapprox;</div>'.$tpersen.'<div class="input-group-text">%</div></div></div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-2 col-form-label">Harga Modal</label>
<div class="col-sm-6 col-lg-4">'.$tmodal.'</div>
<div class="col-sm-12 col-lg-6 text-end">
<button type="button" class="btn btn-warning shadow-none me-2" id="butBatalKemasan">Batal</button><button type="button" class="btn btn-success shadow-none" id="butSimpanKemasan">Simpan</button>
</div>
</div>
<input type="hidden" id="InvKemasanID" value="'.$arec['InvKemasanID'].'">
<input type="hidden" id="SatuanLamaID" value="'.$arec['SatuanID'].'">
</div></div>
';
} else if ( $data == "check-kemasan") {
$ajson['ada'] = false;
$db->Query("SELECT COUNT(*) Jumlah FROM inv_produk_kemasan WHERE InvID='".$id_inv."' AND SatuanID='".Param::Get("SatuanID")."'");
if ($db->Next() && $db->Row("Jumlah",0)>0) $ajson['ada'] = true;
} else if ($data == "detail-filter") {
$form = new Form($db);
$tfilter = $form->option_db("_", "Fi_Produk", Param::Get("Filter_Produk",0), true, true, "inv_produk_grup", ["Grup_InvID","Nama_Grup"], "Aktif=1 ORDER BY Nama_Grup", [0,"SEMUA GRUP BARANG"]);
echo '
<div class="row mb-1"><div class="col text-center">Tampilan Berdasarkan :</div></div>
<div class="row mb-1"><div class="col">'.$tfilter.'</div></div>
';
} else if ( $data == "restore-detail" ) {
$atabel = ['InvID'=>$id_inv];
if ($id_inv > 0) {
$db->Query("SELECT * FROM inv_produk WHERE InvID='".$id_inv."' LIMIT 1");
if ($db->Next()) $atabel = $db->AllRow();
}
$form = new Form($db);
$tnama = $form->textbox("_", "Nama_Produk", $atabel['Nama_Produk'], false, false, "text");
$ajson['html'] = '
<div class="row mb-1"><div class="col">'.$tnama.'</div></div>
<div id="divBrowBackup">&nbsp;</div>
<input type="hidden" id="InvID" value="'.$atabel['InvID'].'">
</div></div>';
} else if ( $data == "restore-tabel" ) {
$obj = new Table($db);
$obj->set_table("inv_produk_backup", "Tanggal,MD5Key,UserID", "InvID='".$id_inv."'");
$obj->add_field("Tanggal", "Waktu Backup", "c nwr", "sqljam", "", "val-tgljam");
$obj->add_field("MD5Key", "Kode Backup", "l");
$obj->set_field_order("Tanggal", "A");
$obj->add_row_form("list", "Detail", "ProdukJS.produk_restore_form");
$obj->add_row_btn("arrow-counterclockwise", "Restore", "ProdukJS.produk_restore_select");
$obj->set_func_navi("ProdukJS.data_query('restore-tabel')");
$ajson[] = $obj->db_table("divBrowBackup");
} else if ($data == "restore-proses") {
Produk_Restore($id_inv, $md5_key);
$ajson['status'] = true;
} else if ( $data == "restore-form" ) {
$atabel = ['InvID'=>$id_inv, 'Nama_Grup'=>"", 'Nama_Merek'=>"", 'Nama_Stok'=>"", 'Nama_Normal'=>""];
$akemasan = [];
if ($md5_key <> "") {
$db->Query("SELECT * FROM inv_produk_backup WHERE MD5Key='".$md5_key."' LIMIT 1");
if ($db->Next()) {
$atabel = array_merge($atabel, json_decode($db->Row("Produk", "[]"), true)[0]);
$akemasan = json_decode($db->Row("Kemasan", "[]"), true);
}
$db->Query("SELECT Nama_Grup FROM inv_produk_grup WHERE Grup_InvID='".$atabel['Grup_InvID']."' LIMIT 1");
if ($db->Next()) $atabel = array_merge($atabel, $db->AllRow());
$db->Query("SELECT Nama_Merek FROM para_merek WHERE MerekID='".$atabel['MerekID']."' LIMIT 1");
if ($db->Next()) $atabel = array_merge($atabel, $db->AllRow());
$db->Query("SELECT Nama_Satuan Nama_Stok FROM para_satuan WHERE SatuanID='".$atabel['StokID']."' LIMIT 1");
if ($db->Next()) $atabel = array_merge($atabel, $db->AllRow());
$db->Query("SELECT Nama_Satuan Nama_Normal FROM para_satuan WHERE SatuanID='".$atabel['NormalID']."' LIMIT 1");
if ($db->Next()) $atabel = array_merge($atabel, $db->AllRow());
$atabel['Status_Aktif'] = ($atabel['Aktif']==1) ? "Aktif" : "Tidak Aktif";
}
$tnama = '<input type="text" class="form-control" value="'.$atabel['Nama_Produk'].'" readonly="">';
$tgrup = '<input type="text" class="form-control" value="'.$atabel['Nama_Grup'].'" readonly="">';
$tmerek = '<input type="text" class="form-control" value="'.$atabel['Nama_Merek'].'" readonly="">';
$tstok = '<input type="text" class="form-control" value="'.$atabel['Nama_Stok'].'" readonly="">';
$tnormal = '<input type="text" class="form-control" value="'.$atabel['Nama_Normal'].'" readonly="">';
$tbeli = '<input type="text" class="form-control text-end" value="'.rupiah($atabel['Harga_Beli']).'" readonly="">';
$ttambah = '<input type="text" class="form-control text-end" value="'.rupiah($atabel['Harga_Tambah']).'" readonly="">';
$thpp = '<input type="text" class="form-control text-end" value="'.rupiah($atabel['Harga_Pokok']).'" readonly="">';
$tsmin = '<input type="text" class="form-control text-end" value="'.rupiah($atabel['Stok_Min']).'" readonly="">';
$tsmax = '<input type="text" class="form-control text-end" value="'.rupiah($atabel['Stok_Max']).'" readonly="">';
$taktif = '<input type="text" class="form-control" value="'.$atabel['Status_Aktif'].'" readonly="">';
$ajson['html'] = '
<div class="card"><div class="card-body">
<div class="accordion" id="accorProduk">
<!-- start produk -->
<div class="accordion-item">
<h2 class="accordion-header" id="flush-one"><button class="accordion-button bg-info bg-gradient" style="--bs-bg-opacity: .5;" type="button" data-bs-toggle="collapse" data-bs-target="#flush-coll-one" aria-controls="flush-coll-one" aria-expanded="true">Informasi Barang</button></h2>
<div id="flush-coll-one" class="accordion-collapse collapse show" aria-labelledby="flush-head-one" data-bs-parent="#accorProduk">
<div class="accordion-body">
<div class="row mb-1">
<div class="col-sm-12 col-lg-12"><div class="input-group"><span class="input-group-text" style="width:160px;">Nama Barang</span>'.$tnama.'</div></div>
</div>
<div class="row mb-1">
<div class="col-sm-12 col-lg-6"><div class="input-group"><span class="input-group-text" style="width:160px;">Grup Barang</span>'.$tgrup.'</div></div>
<div class="col-sm-12 col-lg-6"><div class="input-group"><span class="input-group-text" style="width:160px;">Merek Barang</span>'.$tmerek.'</div></div>
</div>
<div class="row mb-1">
<div class="col-sm-12 col-lg-6"><div class="input-group"><span class="input-group-text" style="width:160px;">Satuan Stok</span>'.$tstok.'</div></div>
<div class="col-sm-12 col-lg-6"><div class="input-group"><span class="input-group-text" style="width:160px;">Satuan Normal</span>'.$tnormal.'</div></div>
</div>
<div class="row mb-1">
<div class="col-sm-12 col-lg-6"><div class="input-group"><span class="input-group-text" style="width:160px;">Harga Beli</span>'.$tbeli.'</div></div>
<div class="col-sm-12 col-lg-6"><div class="input-group"><span class="input-group-text" style="width:160px;">Status Barang</span>'.$taktif.'</div></div>
</div>
<div class="row mb-1">
<div class="col-sm-12 col-lg-6"><div class="input-group"><span class="input-group-text" style="width:160px;">+ Biaya</span>'.$ttambah.'</div></div>
<div class="col-sm-12 col-lg-6"><div class="input-group"><span class="input-group-text" style="width:160px;">Stok Minimum</span>'.$tsmin.'</div></div>
</div>
<div class="row mb-1">
<div class="col-sm-12 col-lg-6"><div class="input-group"><span class="input-group-text" style="width:160px;">Harga Pokok</span>'.$thpp.'</div></div>
<div class="col-sm-12 col-lg-6"><div class="input-group"><span class="input-group-text" style="width:160px;">Stok Maximum</span>'.$tsmax.'</div></div>
</div>
</div></div></div>
<!-- end produk -->
<!-- start kemasan -->
<div class="accordion-item">
<h2 class="accordion-header" id="flush-two"><button class="accordion-button bg-warning bg-gradient collapsed" style="--bs-bg-opacity: .5;" type="button" data-bs-toggle="collapse" data-bs-target="#flush-coll-two" aria-controls="flush-coll-two" aria-expanded="false">Kemasan / SKU / Harga Jual</button></h2>
<div id="flush-coll-two" class="accordion-collapse collapse" aria-labelledby="flush-head-two" data-bs-parent="#accorProduk">
<div class="accordion-body">
<div class="row mb-1">
<div class="col">
<table class="table table-striped table-bordered table-hover dataTable no-footer dtr-inline">
<thead><tr><th class="l">Nama Kemasan</th><th class="c">SKU</th><th class="l">Barcode</th><th class="r">Qty</th><th class="r">Harga Jual</th></tr></thead>
<tbody>';
if (count($akemasan) == 0) {
$ajson['html'] .= '<tr><td class="c" colspan="5">belum ada data</td></tr>';
}
foreach($akemasan as $_key => $val) {
$db->Query("SELECT * FROM para_satuan WHERE SatuanID='".$val['SatuanID']."' LIMIT 1");
if ($db->Next()) $val = array_merge($val, $db->AllRow());
$ajson['html'] .= sprintf('<tr><td class="l">%s</td><td class="c">%s</td><td class="l">%s</td><td class="r">%s</td><td class="r">%s</td></tr>', $val['Nama_Satuan'], $val['Kode_SKU'], $val['Kode_Barcode'], rupiah($val['Qty']), rupiah($val['Harga_Jual']));
}
$ajson['html'] .= '
</tbody>
</table>
</div>
</div>
</div></div></div>
<!-- end kemasan -->
</div>
</div></div>';
} else if ( $data == "default") {
echo '
<div class="fade-in">
<div class="card"><div class="card-header custom-style">Daftar Barang</div><div class="card-body"><div class="row mb-1"><div class="col d-flex justify-content-between"><div class="input-group me-3"><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><button class="btn btn-secondary shadow-none" type="button" id="butFilter">Filter</button><input type="hidden" id="Filter_Produk" value="0" /></div></div><div id="divDetail">&nbsp;</div></div></div>
</div>';
}
send_json($ajson);
?>
+116
View File
@@ -0,0 +1,116 @@
<?php
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/php/tab/produk_grup.php
Desc. : PHP - Tabel Master Grup Barang
Created By : Siau Pheng (siaupheng@3fonia.com).
Created Date : February 8th, 2011.
Last Modified : October 5th, 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\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_detail = Param::Get("mode_detail");
$id_tm = Param::Get("Grup_InvID", 0);
if ( $data == "grup-detail" ) {
$atabel = ['Grup_InvID'=>0,'Margin'=>0,'Aktif'=>1];
if ($id_tm > 0) {
$db->Query("SELECT * FROM inv_produk_grup WHERE Grup_InvID='".$id_tm."' LIMIT 1");
if ($db->Next()) $atabel = $db->AllRow();
}
$form = new Form($db);
$tkode = $form->textbox("_", "Kode_Grup", $atabel['Kode_Grup'], true, true, "text", "kode grup produk");
$tnama = $form->textbox("_", "Nama_Grup", $atabel['Nama_Grup'], true, true, "text", "nama grup produk");
$tmargin = $form->textbox("_", "Margin", $atabel['Margin'], true, true, "double", "margin minimum");
$taktif = $form->switch("_", "Aktif", $atabel['Aktif'], true, false, ["1","0"]);
echo '
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Kode_Grup">Kode Grup Barang</label>
<div class="col-sm-6 col-lg-5"><div class="input-group">'.$tkode.Form_Info("Merupakan 2 (dua) digit kode awal SKU. Contoh : 00.").'</div></div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Nama_Grup">Nama Grup Barang</label>
<div class="col">'.$tnama.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Margin">Margin Minimal (%)</label>
<div class="col-sm-6 col-lg-5">'.$tmargin.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Aktif">Status Aktif ?</label>
<div class="col-sm-6 col-lg-5 col-form-label">'.$taktif.'</div>
</div>
<input type="hidden" id="Grup_InvID" value="'.$atabel['Grup_InvID'].'" >
<input type="hidden" id="mode_detail" value="'.$mode_detail.'" >';
} else if ( $data == "detail" ) {
if (in_array($mode_detail, ["insert","update","delete"])) {
$sql = new SQL($db);
$sql->set_table("inv_produk_grup");
$sql->add_param("Kode_Grup", isi_nol(Param::Get("Kode_Grup"),2));
$sql->add_param("Nama_Grup");
$sql->add_param("Margin");
$sql->add_param("Aktif");
$sql->add_param_userid();
$sql->add_where("Grup_InvID");
if ($mode_detail=="insert") {
$sql->InsertDB();
} else if ($mode_detail=="update") {
$sql->UpdateDB();
} else if ($mode_detail=="delete") {
$sql->DeleteDB();
}
}
$tcari = trim(Param::Get("Cari_Grup"));
$tsql = ($tcari=="") ? "" : " WHERE CONCAT(Kode_Grup,Nama_Grup) LIKE '%".$tcari."%'";
$obj = new Table($db);
$obj->set_query("SELECT * FROM inv_produk_grup".$tsql);
$obj->add_field("Grup_InvID", "ID", "hid");
$obj->add_field("Kode_Grup", "Kode Grup", "c");
$obj->add_field("Nama_Grup", "Nama Grup Barang", "awr");
$obj->add_field("Margin", "Margin (%)", "r");
$obj->add_field("Aktif", "Aktif", "c", "checkbox");
$obj->set_field_order("Kode_Grup", "A");
$obj->add_row_btn("clipboard", "Ubah", "ProdukGrupJS.detail_ubah");
$obj->add_row_btn("trash", "Hapus", "ProdukGrupJS.detail_hapus");
$obj->set_func_navi("ProdukGrupJS.data_query('detail')");
$obj->set_func_btn("ProdukGrupJS.detail_tambah", "+ Grup Produk");
$ajson[] = $obj->json_table("divDetail");
} else if ( $data == "kode-check") {
$ajson['ada'] = false;
$db->Query("SELECT COUNT(*) Item FROM inv_produk_grup WHERE Grup_InvID<>'".$id_tm."' AND Kode_Grup='".Param::Get("Kode_Grup")."'");
if ($db->Next()) {
if ($db->Row("Item", 0) > 0) $ajson['ada'] = true;
}
} else if ( $data == "default") {
echo '
<div class="fade-in">
<div class="card"><div class="card-header custom-style">Daftar Grup Barang</div><div class="card-body"><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="divDetail">&nbsp;</div></div></div>
</div>';
}
send_json($ajson);
?>
+100
View File
@@ -0,0 +1,100 @@
<?php
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/php/tab/rek_pos.php
Desc. : PHP - Tabel Master Jenis Pembayaran POS
Created By : Siau Pheng (siaupheng@3fonia.com).
Created Date : September 9th, 2014.
Last Modified : October 8th, 2025.
(c) 2014 - 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\Table;
use siaupheng\fonia3\Web\Form;
$db = $db ?? new MySQL();
$ajson = [];
$data = Param::Get("data");
$mode_detail = Param::Get("mode_detail");
$id_tm = Param::Get("KartuID", 0);
if ( $data == "kartu-detail" ) {
$atabel = ['KartuID'=>0,'Aktif'=>1];
if ($id_tm > 0) {
$db->Query("SELECT * FROM para_rek_pos WHERE KartuID='".$id_tm."' LIMIT 1");
if ($db->Next()) $atabel = $db->AllRow();
}
$form = new Form($db);
$tkode = $form->textbox("_", "Kode_Kartu", $atabel['Kode_Kartu'], true, true, "text", "kode jenis pembayaran");
$tnama = $form->textbox("_", "Nama_Kartu", $atabel['Nama_Kartu'], true, true, "text", "nama jenis pembayaran");
$taktif = $form->switch("_", "Aktif", $atabel['Aktif'], true, false, ["1","0"]);
echo '
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Kode_Kartu">Kode Jenis Pembayaran</label>
<div class="col-sm-6 col-lg-5">'.$tkode.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Nama_Kartu">Nama Jenis Pembayaran</label>
<div class="col">'.$tnama.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Aktif">Status Aktif ?</label>
<div class="col-sm-6 col-lg-5 col-form-label">'.$taktif.'</div>
</div>
<input type="hidden" id="KartuID" value="'.$atabel['KartuID'].'" >
<input type="hidden" id="mode_detail" value="'.$mode_detail.'" >';
} else if ( $data == "detail" ) {
if (in_array($mode_detail, ["insert","update","delete"])) {
$sql = new SQL($db);
$sql->set_table("para_rek_pos");
$sql->add_param("Kode_Kartu");
$sql->add_param("Nama_Kartu");
$sql->add_param("Aktif");
$sql->add_param_userid();
$sql->add_where("KartuID");
if ($mode_detail=="insert") {
$sql->InsertDB();
} else if ($mode_detail=="update") {
$sql->UpdateDB();
} else if ($mode_detail=="delete") {
$sql->DeleteDB();
}
}
$tcari = trim(Param::Get("Cari_Kartu"));
$tsql = ($tcari=="") ? "" : " WHERE CONCAT(Kode_Kartu,Nama_Kartu) LIKE '%".$tcari."%'";
$obj = new Table($db);
$obj->set_query("SELECT * FROM para_rek_pos".$tsql);
$obj->add_field("KartuID", "ID", "hid");
$obj->add_field("Kode_Kartu", "Kode");
$obj->add_field("Nama_Kartu", "Nama Jenis Pembayaran", "awr");
$obj->add_field("Aktif", "Aktif", "c", "checkbox");
$obj->set_field_order("Kode_Kartu", "A");
$obj->add_row_btn("clipboard", "Ubah", "RekPOSJS.detail_ubah");
$obj->add_row_btn("trash", "Hapus", "RekPOSJS.detail_hapus");
$obj->set_func_navi("RekPOSJS.data_query('detail')");
$obj->set_func_btn("RekPOSJS.detail_tambah", "+ Jenis Pembayaran");
$ajson[] = $obj->json_table("divDetail");
} else if ( $data == "default") {
echo '
<div class="fade-in">
<div class="card"><div class="card-header custom-style">Daftar Jenis Pembayaran POS</div><div class="card-body"><div class="row mb-1"><div class="col"><div class="input-group"><input class="form-control" id="Cari_Kartu" 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="divDetail">&nbsp;</div></div></div>
</div>';
}
send_json($ajson);
?>
+100
View File
@@ -0,0 +1,100 @@
<?php
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/php/tab/satuan.php
Desc. : PHP - Tabel Master Satuan Barang
Created By : Siau Pheng (siaupheng@3fonia.com).
Created Date : May 19th, 2010.
Last Modified : October 5th, 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\Table;
use siaupheng\fonia3\Web\Form;
$db = $db ?? new MySQL();
$ajson = [];
$data = Param::Get("data");
$mode_detail = Param::Get("mode_detail");
$id_tm = Param::Get("SatuanID", 0);
if ( $data == "satuan-detail" ) {
$atabel = ['SatuanID'=>0,'Aktif'=>1];
if ($id_tm > 0) {
$db->Query("SELECT * FROM para_satuan WHERE SatuanID='".$id_tm."' LIMIT 1");
if ($db->Next()) $atabel = $db->AllRow();
}
$form = new Form($db);
$tkode = $form->textbox("_", "Kode_Satuan", $atabel['Kode_Satuan'], true, true, "text", "kode satuan barang");
$tnama = $form->textbox("_", "Nama_Satuan", $atabel['Nama_Satuan'], true, true, "text", "nama satuan barang");
$taktif = $form->switch("_", "Aktif", $atabel['Aktif'], true, false, ["1","0"]);
echo '
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Kode_Satuan">Kode Satuan</label>
<div class="col-sm-6 col-lg-5">'.$tkode.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Nama_Satuan">Nama Satuan</label>
<div class="col">'.$tnama.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Aktif">Status Aktif ?</label>
<div class="col-sm-6 col-lg-5 col-form-label">'.$taktif.'</div>
</div>
<input type="hidden" id="SatuanID" value="'.$atabel['SatuanID'].'" >
<input type="hidden" id="mode_detail" value="'.$mode_detail.'" >';
} else if ( $data == "detail" ) {
if (in_array($mode_detail, ["insert","update","delete"])) {
$sql = new SQL($db);
$sql->set_table("para_satuan");
$sql->add_param("Kode_Satuan");
$sql->add_param("Nama_Satuan");
$sql->add_param("Aktif");
$sql->add_param_userid();
$sql->add_where("SatuanID");
if ($mode_detail=="insert") {
$sql->InsertDB();
} else if ($mode_detail=="update") {
$sql->UpdateDB();
} else if ($mode_detail=="delete") {
$sql->DeleteDB();
}
}
$tcari = trim(Param::Get("Cari_Satuan"));
$tsql = ($tcari=="") ? "" : " WHERE CONCAT(Kode_Satuan,Nama_Satuan) LIKE '%".$tcari."%'";
$obj = new Table($db);
$obj->set_query("SELECT * FROM para_satuan".$tsql);
$obj->add_field("SatuanID", "ID", "hid");
$obj->add_field("Kode_Satuan", "Kode");
$obj->add_field("Nama_Satuan", "Nama Satuan", "awr");
$obj->add_field("Aktif", "Aktif", "c", "checkbox");
$obj->set_field_order("Kode_Satuan", "A");
$obj->add_row_btn("clipboard", "Ubah", "SatuanJS.detail_ubah");
$obj->add_row_btn("trash", "Hapus", "SatuanJS.detail_hapus");
$obj->set_func_navi("SatuanJS.data_query('detail')");
$obj->set_func_btn("SatuanJS.detail_tambah", "+ Satuan");
$ajson[] = $obj->json_table("divDetail");
} else if ( $data == "default") {
echo '
<div class="fade-in">
<div class="card"><div class="card-header custom-style">Daftar Satuan Barang</div><div class="card-body"><div class="row mb-1"><div class="col"><div class="input-group"><input class="form-control" id="Cari_Satuan" 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="divDetail">&nbsp;</div></div></div>
</div>';
}
send_json($ajson);
?>
+103
View File
@@ -0,0 +1,103 @@
<?php
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/php/tab/supplier.php
Desc. : PHP - Tabel Master Supplier
Created By : Siau Pheng (siaupheng@3fonia.com).
Created Date : December 7th, 2010.
Last Modified : October 7th, 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\Table;
use siaupheng\fonia3\Web\Form;
$db = $db ?? new MySQL();
$ajson = [];
$data = Param::Get("data");
$mode = Param::Get("mode");
$id_tm = Param::Get("SupID", 0);
if ( $data == "sup-detail" ) {
$atabel = ['SupID'=>0,'Aktif'=>1];
if ($id_tm > 0) {
$db->Query("SELECT * FROM para_supplier WHERE SupID='".$id_tm."' LIMIT 1");
if ($db->Next()) $atabel = $db->AllRow();
}
$form = new Form($db);
$form->textbox("Kode Supplier", "Kode_Sup", $atabel['Kode_Sup'], true, true, "text", "kode supplier");
$form->textbox("Nama Supplier", "Nama_Sup", $atabel['Nama_Sup'], true, true, "text", "nama supplier");
$form->textarea("Alamat Supplier", "Alamat_Sup", $atabel['Alamat_Sup'], true, true, 3, "alamat supplier");
$form->textbox("Kota Supplier", "Kota_Sup", $atabel['Kota_Sup'], true, true, "text", "kota supplier");
$form->textbox("Telp Supplier", "Telp_Sup", $atabel['Telp_Sup'], true, true, "text", "telp supplier");
$form->textbox("Email Supplier", "Email_Sup", $atabel['Email_Sup'], true, true, "text", "email supplier");
$form->textbox("Kontak Supplier", "Kontak_Sup", $atabel['Kontak_Sup'], true, true, "text", "kontak supplier");
$form->textbox("NPWP Supplier", "No_NPWP", $atabel['No_NPWP'], true, true, "text", "0000000000000000", 16);
$form->textbox("NITKU Supplier", "No_NITKU", $atabel['No_NITKU'], true, true, "text", "000000", 6);
$form->switch("Status Aktif", "Aktif", $atabel['Aktif'], true, false, ["1","0"]);
$form->hidden("SupID", $atabel['SupID']);
$form->hidden("mode", $mode);
$form->show(' _Kode_Sup_ _Nama_Sup_ _Alamat_Sup_ _Kota_Sup_ _Telp_Sup_ _Email_Sup_ _Kontak_Sup_ _No_NPWP_ _No_NITKU_ _Aktif_ _mode_ _SupID_ ');
} else if ( $data == "save" ) {
$sql = new SQL($db);
$sql->set_table("para_supplier");
$sql->add_param("Kode_Sup");
$sql->add_param("Nama_Sup");
$sql->add_param("Alamat_Sup");
$sql->add_param("Kota_Sup");
$sql->add_param("Telp_Sup");
$sql->add_param("Email_Sup");
$sql->add_param("Kontak_Sup");
$sql->add_param("No_NPWP");
$sql->add_param("No_NITKU");
$sql->add_param("Aktif");
$sql->add_param_userid();
$sql->add_where("SupID");
if ($mode=="add") {
$sql->InsertDB();
} else if ($mode=="edit") {
$sql->UpdateDB();
} else if ($mode=="del") {
$sql->DeleteDB();
}
$ajson['status'] = true;
} else if ( $data == "detail" ) {
$tcari = trim(Param::Get("Cari_Sup"));
$tsql = ($tcari=="") ? "" : " WHERE CONCAT(Kode_Sup,Nama_Sup,Telp_Sup) LIKE '%".$tcari."%'";
$obj = new Table($db);
$obj->set_query("SELECT * FROM para_supplier".$tsql);
$obj->add_field("SupID", "ID", "hid");
$obj->add_field("Kode_Sup", "Kode Supplier");
$obj->add_field("Nama_Sup", "Nama Supplier", "awr");
$obj->add_field("Telp_Sup", "No. Telp", "l");
$obj->add_field("Aktif", "Aktif", "c", "checkbox");
$obj->set_field_order("Kode_Sup", "A");
$obj->add_row_btn("clipboard", "Ubah", "SupplierJS.detail_ubah");
$obj->add_row_btn("trash", "Hapus", "SupplierJS.detail_hapus");
$obj->set_func_navi("SupplierJS.data_query('detail')");
$obj->set_func_btn("SupplierJS.detail_tambah", "+ Supplier");
$ajson[] = $obj->json_table("divDetail");
} else if ( $data == "default") {
echo '
<div class="fade-in">
<div class="card"><div class="card-header custom-style">Daftar Supplier</div><div class="card-body"><div class="row mb-1"><div class="col"><div class="input-group"><input class="form-control" id="Cari_Sup" 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="divDetail">&nbsp;</div></div></div>
</div>';
}
send_json($ajson);
?>
+109
View File
@@ -0,0 +1,109 @@
<?php
/*******************************************************************
App. Name : INVENTORY AND SALES SYSTEMS
Module : /apps/php/tab/tx_kas.php
Desc. : PHP - Tabel Master Jenis Transaksi Kas
Created By : Siau Pheng (siaupheng@3fonia.com).
Created Date : July 7th, 2015.
Last Modified : October 8th, 2025.
(c) 2015 - 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\Table;
use siaupheng\fonia3\Web\Form;
$db = $db ?? new MySQL();
$ajson = [];
$data = Param::Get("data");
$mode_detail = Param::Get("mode_detail");
$id_tm = Param::Get("TXID", 0);
if ( $data == "tx-detail" ) {
$atabel = ['TXID'=>0,'Aktif'=>1];
if ($id_tm > 0) {
$db->Query("SELECT * FROM para_tx_kas WHERE TXID='".$id_tm."' LIMIT 1");
if ($db->Next()) $atabel = $db->AllRow();
}
$form = new Form($db);
$tgrup = $form->option("_", "Grup_TX", $atabel['Grup_TX'], true, false, ['I'=>"Kas Masuk",'O'=>"Kas Keluar"]);
$tkode = $form->textbox("_", "Kode_TX", $atabel['Kode_TX'], true, false, "text", "kode jenis kas");
$tnama = $form->textbox("_", "Nama_TX", $atabel['Nama_TX'], true, false, "text", "nama jenis transaksi kas");
$taktif = $form->switch("_", "Aktif", $atabel['Aktif'], true, false, ["1","0"]);
echo '
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Grup_TX">Grup Transaksi</label>
<div class="col">'.$tgrup.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Kode_TX">Kode Jenis Kas</label>
<div class="col-sm-6 col-lg-5">'.$tkode.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Nama_TX">Nama Jenis Transaksi Kas</label>
<div class="col">'.$tnama.'</div>
</div>
<div class="row mb-1">
<label class="col-sm-4 col-lg-3 col-form-label" for="Aktif">Status Aktif ?</label>
<div class="col-sm-6 col-lg-5 col-form-label">'.$taktif.'</div>
</div>
<input type="hidden" id="TXID" value="'.$atabel['TXID'].'" >
<input type="hidden" id="mode_detail" value="'.$mode_detail.'" >';
} else if ( $data == "detail" ) {
if (in_array($mode_detail, ["insert","update","delete"])) {
$sql = new SQL($db);
$sql->set_table("para_tx_kas");
$sql->add_param("Grup_TX");
$sql->add_param("Kode_TX");
$sql->add_param("Nama_TX");
$sql->add_param("Aktif");
$sql->add_param_userid();
$sql->add_where("TXID");
if ($mode_detail=="insert") {
$sql->InsertDB();
} else if ($mode_detail=="update") {
$sql->UpdateDB();
} else if ($mode_detail=="delete") {
$sql->DeleteDB();
}
}
$tcari = trim(Param::Get("Cari_TX"));
$tsql = ($tcari=="") ? "" : " WHERE CONCAT(Kode_TX,Nama_TX) LIKE '%".$tcari."%'";
$obj = new Table($db);
$obj->set_query("SELECT * FROM para_tx_kas".$tsql);
$obj->add_field("TXID", "ID", "hid");
$obj->add_field("Grup_TX", "Grup Transaksi", "l", ['I'=>"Kas Masuk",'O'=>"Kas Keluar"]);
$obj->add_field("Kode_TX", "Kode", "l");
$obj->add_field("Nama_TX", "Nama Jenis Transaksi Kas", "awr");
$obj->add_field("Aktif", "Aktif", "c", "checkbox");
$obj->set_row_color("Grup_TX", "I", "rgreen");
$obj->set_row_color("Grup_TX", "O", "ryellow");
$obj->set_field_order("Kode_TX", "A");
$obj->add_row_btn("clipboard", "Ubah", "TXKasJS.detail_ubah");
$obj->add_row_btn("trash", "Hapus", "TXKasJS.detail_hapus");
$obj->set_func_navi("TXKasJS.data_query('detail')");
$obj->set_func_btn("TXKasJS.detail_tambah", "+ Jenis Transaksi Kas");
$ajson[] = $obj->json_table("divDetail");
} else if ( $data == "default") {
echo '
<div class="fade-in">
<div class="card"><div class="card-header custom-style">Daftar Jenis Transaksi Kas</div><div class="card-body"><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="divDetail">&nbsp;</div></div></div>
</div>';
}
send_json($ajson);
?>