Files
cmasa/app/Controller/IndexController.php
T
2026-10-29 13:34:31 +07:00

170 lines
8.0 KiB
PHP

<?php
/*******************************************************************
PHP Class : /Controller/IndexController
Description : Halaman Utama Aplikasi / Index
Created By : Siau Pheng ([email protected]).
Created Date : May 24th, 2010.
Last Modified : August 9th, 2026.
(c) 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
declare(strict_types=1);
namespace App\Controller;
use flight\Engine;
use flight\Session;
use flight\database\SimplePdo;
class IndexController {
private array $web_app;
private int $id_cab;
private int $level_user;
protected Engine $app;
protected SimplePdo $db;
public function __construct(Engine $app, Session $session, SimplePdo $db) {
$this->app = $app;
$this->db = $db;
$this->web_app = $session->get('WEB_APP');
$this->id_cab = (int) $session->get('APP_INV')['CABANGID'];
$this->level_user = (int) $session->get('WEB_USER')['Level'];
}
public function chart_sale() {
$ajson['tipe'] = "chart";
$adata['datasets'] = [['data'=>[], 'label'=>"Penjualan", 'borderColor'=>[], 'backgroundColor'=>[]]];
$adata['labels'] = ["Belum Ada Penjualan"];
$asale = $this->db->fetchAll("SELECT P.Nama_Produk,D.Qty FROM (SELECT InvID,SUM(-Qty) Qty FROM inv_detail WHERE CabID=? AND NotaID IN (5) AND Tgl_Ref>=? GROUP BY InvID ORDER BY SUM(-Qty) DESC LIMIT 10) D LEFT JOIN inv_produk P ON (D.InvID=P.InvID)", [$this->id_cab, tgl_sql2str(tgl_operasi(tgl_dmy(),-7))]);
if (count($asale) === 0) $adata['labels'] = [];
foreach ($asale as $sale) {
$adata['labels'][] = $sale['Nama_Produk'];
$adata['datasets'][0]['data'][] = $sale['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]]
]
];
$this->app->json($ajson);
}
public function chart_omzet() {
$ajson['tipe'] = "chart";
$adata['labels'] = [];
$adata['datasets'] = [];
if ($this->level_user <= 1) {
$acab = $this->db->fetchColumn("SELECT Kode_Cab FROM para_cabang WHERE Aktif=1 ORDER BY CabID");
foreach ($acab as $cab) {
$adata['datasets'][] = ['data'=>[], 'label'=>$cab." (jt)", 'borderColor'=>random_color(), 'backgroundColor'=>random_color(), 'pointStyle'=>'circle', 'pointRadius'=>10, 'pointHoverRadius'=>15];
}
$aomzet = $this->db->fetchAll("SELECT Tgl_Jual,DAY(Tgl_Jual) Tgl,SUM(IF(CabID=2,Total_Jual,0)) Total_2,SUM(IF(CabID=3,Total_Jual,0)) Total_3,SUM(IF(CabID=4,Total_Jual,0)) Total_4 FROM inv_jual WHERE Tgl_Jual<=? GROUP BY Tgl_Jual ORDER BY Tgl_Jual DESC LIMIT 10", [tgl_ymd()]);
if (count($aomzet) === 0) $adata['labels'] = [];
foreach ($aomzet as $omzet) {
$adata['labels'][] = substr(tgl_hari(tgl_sql2str($omzet['Tgl_Jual'])),0,3) ." (". $omzet['Tgl'] . ")";
$adata['datasets'][0]['data'][] = round($omzet['Total_2']/1000000,2);
$adata['datasets'][1]['data'][] = round($omzet['Total_3']/1000000,2);
$adata['datasets'][2]['data'][] = round($omzet['Total_4']/1000000,2);
}
} else {
$acab = $this->db->fetchRow("SELECT Kode_Cab FROM para_cabang WHERE CabID=?", [ $this->id_cab ]) ?? ['Kode_Cab' => "Toko"];
$adata['datasets'] = [['data'=>[], 'label'=>$acab['Kode_Cab']." (jt)", 'borderColor'=>random_color(), 'backgroundColor'=>random_color(), 'pointStyle'=>'circle', 'pointRadius'=>10, 'pointHoverRadius'=>15]];
$aomzet = $this->db->fetchAll("SELECT Tgl_Jual,DAY(Tgl_Jual) Tgl,SUM(Total_Jual) Total FROM inv_jual WHERE CabID=? AND Tgl_Jual<=? GROUP BY Tgl_Jual ORDER BY Tgl_Jual DESC LIMIT 10", [ $this->id_cab, tgl_ymd() ]);
if (count($aomzet) === 0) $adata['labels'] = [];
foreach ($aomzet as $omzet) {
$adata['labels'][] = substr(tgl_hari(tgl_sql2str($omzet['Tgl_Jual'])),0,3) ." (". $omzet['Tgl'] . ")";
$adata['datasets'][0]['data'][] = round($omzet['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' => 1], 'title' => ['display' => true, 'font' => ['size' => 14], 'text' => "Jumlah Penjualan"]]],
'layout' => ['padding' => ['top' => 10]]
]
];
$this->app->json($ajson);
}
public function table_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>';
$atabel = $this->db->fetchAll("SELECT DISTINCT S.Stok,P.Kode_SKU,P.Nama_Produk FROM (SELECT InvID,Stok FROM inv_stok WHERE CabID=?) 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", [ $this->id_cab ]);
foreach ($atabel as $tabel) {
$ajson['html'] .= sprintf('<tr><td class="c">%s</td><td class="l">%s</td><td class="r">%s</td></tr>', $tabel['Kode_SKU'], $tabel['Nama_Produk'], rupiah((float)$tabel['Stok']));
}
$ajson['html'] .= '</tbody></table>';
$this->app->json($ajson);
}
public function index() {
$ajson['CabID'] = $this->id_cab ?? 0;
$ajson['html'] = '
<div class="card">
<div class="card-body my-bashboard">
<div class="row h-100">
<div class="col-12 col-md-6">
<div class="h-50">
<canvas id="ChartA"></canvas>
</div>
<div class="h-50">
<canvas id="ChartB"></canvas>
</div>
</div>
<div class="col-12 col-md-6 h-100 overflow-scroll">
<div id="tabelStok"></div>
</div>
</div>
</div>
</div>';
$this->app->json($ajson);
}
public function get401() {
$this->app->render('401', $this->web_app);
}
public function get404() {
$this->app->render('404', $this->web_app);
}
public function post404() {
$ajson = [
'status' => false,
'html' => '<div class="text-center my-3"><h1 class="display-2 text-primary">4.0.4</h1><p class="display-6">Modul / Menu Tidak Ditemukan</p><p class="fs-6 text-secondary">Maaf, modul atau menu yang Anda cari tidak ada atau mungkin telah dipindahkan.</div>'
];
$this->app->json($ajson);
}
}