first commit
This commit is contained in:
@@ -0,0 +1,14 @@
|
|||||||
|
# Application
|
||||||
|
APP_ENV=development
|
||||||
|
APP_DEBUG=true
|
||||||
|
FLIGHT_BASE_URL=/
|
||||||
|
APP_TIMEZONE=UTC
|
||||||
|
|
||||||
|
# Database : sqlite | mysql | (empty to disable)
|
||||||
|
DB_DRIVER=sqlite
|
||||||
|
DB_HOST=localhost
|
||||||
|
DB_DATABASE=
|
||||||
|
DB_USERNAME=
|
||||||
|
DB_PASSWORD=
|
||||||
|
# Absolute or project-relative path for SQLite
|
||||||
|
DB_SQLITE_PATH=
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
/.vscode/
|
||||||
|
/.env
|
||||||
|
/vendor/
|
||||||
|
/temp/
|
||||||
|
/composer.lock
|
||||||
|
/app/config/app.php
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"index_root": "public/index.php",
|
||||||
|
"app_root": "app/"
|
||||||
|
}
|
||||||
@@ -0,0 +1,110 @@
|
|||||||
|
# Flight PHP Skeleton App
|
||||||
|
|
||||||
|
Use this skeleton application to quickly setup and start working on a new Flight PHP application. This application uses the latest version of Flight PHP v3.
|
||||||
|
|
||||||
|
This skeleton is designed to be AI-friendly out of the box, with predefined instructions files for popular AI coding assistants such as GitHub Copilot, Cursor, and Windsurf. This helps streamline development and ensures your project is ready for modern, AI-assisted workflows.
|
||||||
|
|
||||||
|
This skeleton application was built for Composer. You also could download a zip of this repo, downloading a zip of the [flightphp/core](https://github.com/flightphp/core) repo, and manually autoload the files by running `require('flight/autoload.php')` in your `app/config/# FlightPHP Skeleton Project Instructions
|
||||||
|
|
||||||
|
This document provides guidelines and best practices for structuring and developing a project using the FlightPHP framework.
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
Run this command from the directory in which you want to install your new Flight PHP application. (this will require PHP 7.4 or newer)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
composer create-project flightphp/skeleton cool-project-name
|
||||||
|
```
|
||||||
|
|
||||||
|
Replace `cool-project-name` with the desired directory name for your new application.
|
||||||
|
|
||||||
|
After you create the project, make sure you go to the `app/config/config.php` and `app/config/services.php` and uncomment the lines related to the database you want to use before you get started.
|
||||||
|
|
||||||
|
> _Tip: This skeleton includes configuration files for AI coding assistants (Copilot, Cursor, Windsurf) to help you get the most out of AI-driven development tools from the start._
|
||||||
|
|
||||||
|
### Robust Setup of the Application
|
||||||
|
|
||||||
|
This skeleton will come with 2 versions of a starter application. The robust version is a fully structured application meant for projects that you anticipate will be a bigger size. This is setup with object oriented programming in mind so that it is easier to unit test and scale your project with multiple developers (or make it easier on yourself).
|
||||||
|
|
||||||
|
The robust version adds an `app/` directory where everything has a basic structure. This is how this skeleton is configured by default.meant
|
||||||
|
|
||||||
|
### Simple Setup of the Application
|
||||||
|
|
||||||
|
This is basically a single file application. The only exception to this is the config file which is still in the `app/config/` directory. This is a good starting point for smaller projects or projects that you don't anticipate will grow much.
|
||||||
|
|
||||||
|
To use the simple version, you'll need to move the `index-simple.php` file to the `public/` directory and rename it to `index.php`. You can delete any other controllers, views, or config files (except the `config.php` file of course).
|
||||||
|
|
||||||
|
With the simple setup, there is two very import security steps to be aware of.
|
||||||
|
- **DO NOT SAVE SENSITIVE CREDENTIALS TO THE `index.php` FILE**.
|
||||||
|
- **DO NOT COMMIT ANY TYPE OF SENSITIVE CREDENTIALS TO YOUR REPOSITORY**.
|
||||||
|
|
||||||
|
This is what the config file is for. If you need to save sensitive credentials, save them to the config file and then reference them in the `index.php` file.
|
||||||
|
|
||||||
|
## Running the Application
|
||||||
|
|
||||||
|
### No Dependency Setup
|
||||||
|
|
||||||
|
To run the application in development, you can run these commands
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd cool-project-name
|
||||||
|
composer start
|
||||||
|
```
|
||||||
|
|
||||||
|
After that, open `http://localhost:8000` in your browser.
|
||||||
|
|
||||||
|
__Note: If you run into an error similar to this `Failed to listen on localhost:8000 (reason: Address already in use)` then you'll need to change the port that the application is running on. You can do this by editing the `composer.json` file and changing the port in the `scripts.start` key.__
|
||||||
|
|
||||||
|
### Docker Setup
|
||||||
|
|
||||||
|
You can [install Docker](https://docs.docker.com/engine/install/) and use `docker-compose` to run the app with `docker`, so you can run these commands:
|
||||||
|
```bash
|
||||||
|
cd cool-project-name
|
||||||
|
docker-compose up -d
|
||||||
|
# or if a newer version of docker
|
||||||
|
docker compose up -d
|
||||||
|
```
|
||||||
|
After that, open `http://localhost:8000` in your browser.
|
||||||
|
|
||||||
|
### Vagrant Setup
|
||||||
|
You can [install Vagrant](https://vagrantup.com/download) and a provider like [VirtualBox](https://www.virtualbox.org/wiki/Downloads) and use simple run the following command to bring up an environment with PHP/MariaDB already setup based on [n0nag0n/firefly](https://github.com/n0nag0n/firefly)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd cool-project-name
|
||||||
|
vagrant up
|
||||||
|
```
|
||||||
|
|
||||||
|
After that, open `http://localhost:8000` in your browser.
|
||||||
|
|
||||||
|
## Project Structure
|
||||||
|
|
||||||
|
This skeleton is organized for clarity and maintainability, and is also structured to be easily navigable by AI coding assistants. The following layout is recommended:
|
||||||
|
|
||||||
|
```
|
||||||
|
project-root/
|
||||||
|
│
|
||||||
|
├── app/ # Application-specific code
|
||||||
|
│ ├── controllers/ # Route controllers (e.g., HomeController.php)
|
||||||
|
│ ├── middlewares/ # Custom middleware classes/functions
|
||||||
|
│ ├── models/ # Data models (if needed)
|
||||||
|
│ ├── utils/ # Utility/helper functions
|
||||||
|
│ ├── views/ # View templates (if using)
|
||||||
|
│ └── commands/ # Custom CLI commands for Runway
|
||||||
|
│
|
||||||
|
├── public/ # Web root (index.php, assets, etc.)
|
||||||
|
│
|
||||||
|
├── config/ # Configuration files (database, app settings, routes)
|
||||||
|
│
|
||||||
|
├── vendor/ # Composer dependencies
|
||||||
|
│
|
||||||
|
├── tests/ # Unit and integration tests
|
||||||
|
│
|
||||||
|
├── composer.json # Composer config
|
||||||
|
│
|
||||||
|
└── README.md # Project overview
|
||||||
|
```
|
||||||
|
|
||||||
|
> _Predefined instructions for AI tools are included in this skeleton, making it easier for AI assistants to understand and help you with this structure._
|
||||||
|
|
||||||
|
## Do it!
|
||||||
|
That's it! Go build something flipping sweet!
|
||||||
@@ -0,0 +1,147 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/AuthController
|
||||||
|
Description : Kontrol Login Session & Auth Supervisi
|
||||||
|
Created By : Siau Pheng ([email protected]).
|
||||||
|
Created Date : January 15th, 2008.
|
||||||
|
Last Modified : October 21st, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller;
|
||||||
|
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\Session;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use Webapp\App\Auth;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
use Webapp\Web\Menu;
|
||||||
|
|
||||||
|
class AuthController {
|
||||||
|
|
||||||
|
private array $aapp;
|
||||||
|
private array $auser;
|
||||||
|
private array $ainv;
|
||||||
|
protected Engine $app;
|
||||||
|
protected Session $session;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
protected Auth $auth;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, Session $session, SimplePdo $db) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->session = $session;
|
||||||
|
$this->auth = new Auth($app);
|
||||||
|
$this->aapp = $this->session->get('WEB_APP') ?? [];
|
||||||
|
$this->auser = $this->session->get('WEB_USER') ?? [];
|
||||||
|
$this->ainv = $this->session->get('APP_INV') ?? [];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function login() {
|
||||||
|
$ajson['status'] = false;
|
||||||
|
$auser = [];
|
||||||
|
if ($this->auth->user_check(Param::Get("Username"), Param::Get("Password"))) {
|
||||||
|
$auser = $this->auth->user_data(Param::Get("Username"));
|
||||||
|
|
||||||
|
//MONITOR DISPLAY
|
||||||
|
if (($this->ainv['MON_ENABLE'] ?? false) && ($auser['UserID'] ?? false)) {
|
||||||
|
$this->auth->pos_login($this->ainv['CABANGID'], $auser['UserID'], $auser['UNIX'], $this->app->request()->ip);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->session->set('WEB_USER', $auser);
|
||||||
|
|
||||||
|
if (Param::Get("redir", "") !== "") {
|
||||||
|
$_redir = $this->auth->redirect(Param::Get("redir"));
|
||||||
|
//jika kosong, tampilkan pesan redirect tidak diijinkan
|
||||||
|
//jika berisi, js harus redirect ...
|
||||||
|
}
|
||||||
|
|
||||||
|
$ajson['status'] = true;
|
||||||
|
$ajson['token'] = $this->session->get('APP_TOKEN');
|
||||||
|
$ajson['message'] = '<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['message'] = "Periksa kembali ID Pengguna atau Password Anda ...";
|
||||||
|
}
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function logout() {
|
||||||
|
$ajson['status'] = false;
|
||||||
|
//MONITOR DISPLAY
|
||||||
|
if (($this->ainv['MON_ENABLE'] ?? false) && ($this->auser['UserID'] ?? false)) {
|
||||||
|
$this->auth->pos_logout($this->ainv['CABANGID'], $this->auser['UserID'], $this->auser['UNIX'], $this->app->request()->ip);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->auth->logout();
|
||||||
|
$this->session->clear();
|
||||||
|
|
||||||
|
$_host = $this->app->request()->getVar('HTTP_ORIGIN') ?? $this->aapp['PARENT_SITE'];
|
||||||
|
$_host = str_replace(['http://','https://'], "", $_host);
|
||||||
|
if ($this->aapp['PARENT_SUB'] === true) {
|
||||||
|
$_subs = explode('.', $_host);
|
||||||
|
if (count($_subs) > 2) array_shift($_subs);
|
||||||
|
$_host = implode('.', $_subs);
|
||||||
|
}
|
||||||
|
$ajson['nexthost'] = "//" . $_host;
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function menu() {
|
||||||
|
$page = Param::Get("p", "");
|
||||||
|
$query = Param::Get("q", "");
|
||||||
|
$ajson['login'] = false;
|
||||||
|
|
||||||
|
if (count($this->auser) > 0 && !empty($page)) {
|
||||||
|
$ajson = Menu::MenuJSON($this->db, $page, $query);
|
||||||
|
}
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function supervisi() {
|
||||||
|
$data = Param::Get("data", "");
|
||||||
|
$ajson = ['status' => 0, 'pesan' => ""];
|
||||||
|
|
||||||
|
if ($data == "super-check") {
|
||||||
|
$bsuper = (Param::Get("SUPER","true") == "true") ? true : false;
|
||||||
|
$buover = (Param::Get("UOVER","false") == "true") ? true : false;
|
||||||
|
if (!$this->auth->user_check_level(Param::Get("UID"), $this->aapp['AUTH_LEVEL']) && $bsuper == true) {
|
||||||
|
$ajson['status'] = 0;
|
||||||
|
$ajson['pesan'] = "Silakan hubungi Supervisor / Administrator Anda!";
|
||||||
|
} else {
|
||||||
|
if (!$this->auth->user_check(Param::Get("UID"), Param::Get("PWD"))) {
|
||||||
|
$ajson['status'] = 0;
|
||||||
|
$ajson['pesan'] = "User ID atau Password Anda Salah!<br>Anda tidak diijinkan melanjutkan proses!";
|
||||||
|
} else {
|
||||||
|
$ajson['status'] = 1;
|
||||||
|
if ($buover == true && $bsuper == false && Param::Get("UID") <> $this->auser['Username']) {
|
||||||
|
$new_sess = $this->auth->user_data(Param::Get("UID"));
|
||||||
|
$tmp_sess = $this->session->get('WEB_USER');
|
||||||
|
foreach ($new_sess as $_key => $_val) {
|
||||||
|
if ($tmp_sess[$_key]) $tmp_sess[$_key] = $_val;
|
||||||
|
}
|
||||||
|
$this->session->set('WEB_USER', $tmp_sess);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} elseif ($data == "super-request") {
|
||||||
|
$this->db->delete('app_auth', 'UserID=? AND Kode=? AND SID=? AND REQ=? AND Auth=0', [$this->auser['UserID'], Param::Get("KODE"), Param::Get("REQ_SID"), Param::Get("REQ")]);
|
||||||
|
$this->db->runQuery('INSERT INTO app_auth (UserID, Kode, SID, REQ, Catatan, Tanggal) VALUES (?, ?, ?, ?, ?, NOW())', [ $this->auser['UserID'], Param::Get("KODE"), Param::Get("REQ_SID"), Param::Get("REQ"), Param::Get("MSG") ]);
|
||||||
|
|
||||||
|
} elseif ($data == "super-cancel") {
|
||||||
|
$this->db->delete('app_auth', 'UserID=? AND Kode=? AND SID=? AND REQ=?', [$this->auser['UserID'], Param::Get("KODE"), Param::Get("REQ_SID"), Param::Get("REQ")]);
|
||||||
|
|
||||||
|
} elseif ($data == "request-check") {
|
||||||
|
$_auth = (int) $this->db->fetchField('SELECT Auth FROM app_auth WHERE UserID=? AND Kode=? AND SID=? AND REQ=?', [$this->auser['UserID'], Param::Get("KODE"), Param::Get("REQ_SID"), Param::Get("REQ")]) ?? 0;
|
||||||
|
if ($_auth == 1) $ajson['status'] = 1;
|
||||||
|
}
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,171 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Display/ConfigController
|
||||||
|
Description : Konfigurasi Display POS
|
||||||
|
Created By : Siau Pheng ([email protected]).
|
||||||
|
Created Date : August 4th, 2013.
|
||||||
|
Last Modified : August 31st, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Display;
|
||||||
|
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\Session;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use Webapp\DB\SQL;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
use Webapp\Web\Table;
|
||||||
|
use App\Utils\Invesa;
|
||||||
|
|
||||||
|
class ConfigController {
|
||||||
|
|
||||||
|
private string $mode;
|
||||||
|
private string $id_reg;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->mode = (string) Param::Get("mode");
|
||||||
|
$this->id_reg = (string) Param::Get("REG_ID", $session->get('WEB_APP')['REG_ID']);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_display() {
|
||||||
|
if ( $this->mode === "save" ) {
|
||||||
|
$sql = new SQL($this->app);
|
||||||
|
$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;
|
||||||
|
$this->mode = "view";
|
||||||
|
}
|
||||||
|
|
||||||
|
$para = [];
|
||||||
|
if ($this->id_reg > 0) {
|
||||||
|
$para = $this->db->fetchRow("SELECT * FROM disp_config WHERE REG_ID=?", [$this->id_reg]);
|
||||||
|
$para['CabID'] = $this->db->fetchField("SELECT CABANGID FROM inv_config WHERE REG_ID=?", [$this->id_reg]) ?? 0;
|
||||||
|
$para['Nama_Cab'] = $this->db->fetchField("SELECT Nama_Cab FROM para_cabang WHERE CabID=?", [$para['CabID']]) ?? '';
|
||||||
|
}
|
||||||
|
|
||||||
|
$benable = ($this->mode === "edit") ? true : false;
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$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.Invesa::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.Invesa::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.Invesa::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.Invesa::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.Invesa::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.Invesa::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.Invesa::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.Invesa::Form_Info("Maximum 20 huruf.").'</div></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<input type="hidden" id="mode" value="'.$this->mode.'" >';
|
||||||
|
$ajson['Nama_Cab'] = $para['Nama_Cab'];
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function brow_cabang() {
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("(SELECT * FROM para_cabang WHERE Aktif=1) C LEFT JOIN inv_config G ON (G.CABANGID=C.CabID)", "C.*,G.REG_ID");
|
||||||
|
$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->set_func_select("DISPConfigJS.cab_select");
|
||||||
|
$this->app->json([ $obj->json_table("divBrowCab") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$this->app->json(['html' =>
|
||||||
|
'<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"><i class="bi-search"></i></button></div></div></div><div class="card"><div class="card-body"><div id="divDisplay"> </div><input type="hidden" id="REG_ID" value="'.$this->id_reg.'"></div></div>'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,175 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Display/IklanController
|
||||||
|
Description : Konfigurasi Display Iklan POS
|
||||||
|
Created By : Siau Pheng ([email protected]).
|
||||||
|
Created Date : January 15th, 2015.
|
||||||
|
Last Modified : August 31st, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Display;
|
||||||
|
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use Webapp\DB\SQL;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
use Webapp\Web\Table;
|
||||||
|
use App\Utils\Invesa;
|
||||||
|
|
||||||
|
class IklanController {
|
||||||
|
|
||||||
|
private string $mode_detail;
|
||||||
|
private int $id_promo;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->mode_detail = (string) Param::Get("mode_detail");
|
||||||
|
$this->id_promo = (int) Param::Get("PromoID");
|
||||||
|
}
|
||||||
|
|
||||||
|
public function table_detail() {
|
||||||
|
if (in_array($this->mode_detail, ["insert","update","delete"])) {
|
||||||
|
$sql = new SQL($this->app);
|
||||||
|
$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 ($this->mode_detail === "insert") {
|
||||||
|
$sql->add_param("PromoID");
|
||||||
|
$sql->add_param("Tipe", 2);
|
||||||
|
if ($this->id_promo > 0) { $sql->UpdateDB(); }
|
||||||
|
else $sql->InsertDB();
|
||||||
|
} else if ($this->mode_detail === "update") {
|
||||||
|
$sql->UpdateDB();
|
||||||
|
} else if ($this->mode_detail === "delete") {
|
||||||
|
$sql->DeleteDB();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$tcari = Param::Get("Cari_Iklan");
|
||||||
|
$tsql = ""; $asql = [];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql = " AND CONCAT(DATE_FORMAT(I.Tanggal,'%d-%m-%Y'),I.Info) LIKE ?";
|
||||||
|
$asql[] = '%'.$tcari.'%';
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("(SELECT * FROM disp_promo WHERE Tipe=2) I LEFT JOIN para_cabang C ON (C.CabID=I.CabID)", "I.*,IF(ISNULL(C.Nama_Cab),'SEMUA CABANG',C.Nama_Cab) Nama_Cab", $tsql, $asql);
|
||||||
|
$obj->add_field("PromoID", "ID", "hid");
|
||||||
|
$obj->add_field("Tanggal", "Tanggal", "c", "sqltgl", "", "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_btn("DISPIklanJS.detail_tambah", "+ Iklan");
|
||||||
|
$this->app->json([ $obj->json_table("divDetail") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_iklan() {
|
||||||
|
$atabel = Invesa::A_Iklan();
|
||||||
|
if ($this->id_promo > 0) {
|
||||||
|
$atabel = $this->db->fetchRow("SELECT * FROM disp_promo WHERE PromoID=?", [$this->id_promo]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$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 d-flex gap-2">'.$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" class="d-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="'.$this->mode_detail.'" >';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function upload_picture() {
|
||||||
|
$ajson['result'] = 0;
|
||||||
|
$upload = $this->app->request()->getUploadedFiles();
|
||||||
|
$file = $upload['Gambar1'];
|
||||||
|
|
||||||
|
if ($file->getError() === UPLOAD_ERR_OK) {
|
||||||
|
$file_name = $file->getClientFilename();
|
||||||
|
$file_size = $file->getSize();
|
||||||
|
if ($file_size < 20480000) {
|
||||||
|
$file_ext = pathinfo($file_name, PATHINFO_EXTENSION);
|
||||||
|
if (in_array($file_ext, ["png","jpg","jpeg","gif"])) {
|
||||||
|
$file_name = $file->getTempName();
|
||||||
|
$mime = $file->getClientMediaType();
|
||||||
|
if ($this->id_promo > 0) {
|
||||||
|
$this->db->runQuery("UPDATE disp_promo SET Image=\"".addslashes(file_get_contents($file_name))."\",Mime='".$mime."' WHERE PromoID=?", [$this->id_promo]);
|
||||||
|
} else {
|
||||||
|
$this->db->runQuery("INSERT INTO disp_promo (Image,Mime) VALUES(\"".addslashes(file_get_contents($file_name))."\",'".$mime."')");
|
||||||
|
$this->id_promo = (int) $this->db->lastInsertId();
|
||||||
|
}
|
||||||
|
$ajson['result'] = 1;
|
||||||
|
$ajson['PromoID'] = $this->id_promo;
|
||||||
|
} else {
|
||||||
|
$ajson['message'] = "File tidak dapat diterima !";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$ajson['message'] = "Ukuran file diatas 20MB !";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$ajson = ['result' => 0, 'message' => $file->getError()];
|
||||||
|
}
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function get_picture() {
|
||||||
|
$gambar = "/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcGBwcICQsJCAgKCAcHCg0KCgsMDAwMBwkODw0MDgsMDAz/2wBDAQICAgMDAwYDAwYMCAcIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCAABAAEDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9/KKKKAP/2Q==";
|
||||||
|
$mime = "image/jpg";
|
||||||
|
|
||||||
|
$prof = $this->db->fetchRow("SELECT Image,Mime FROM disp_promo WHERE PromoID=? AND Image IS NOT NULL", [$this->id_promo]);
|
||||||
|
if ($prof) {
|
||||||
|
$gambar = base64_encode($prof['Image']);
|
||||||
|
$mime = $prof['Mime'];
|
||||||
|
}
|
||||||
|
$this->app->json([ 'src' => 'data:'.$mime.';base64,'.$gambar ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$this->app->json(['html' =>
|
||||||
|
'<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_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"> </div></div></div></div>'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,182 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Display/PromoController
|
||||||
|
Description : Konfigurasi Display Promo POS
|
||||||
|
Created By : Siau Pheng ([email protected]).
|
||||||
|
Created Date : January 15th, 2015.
|
||||||
|
Last Modified : August 31st, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Display;
|
||||||
|
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use Webapp\DB\SQL;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
use Webapp\Web\Table;
|
||||||
|
use App\Utils\Invesa;
|
||||||
|
|
||||||
|
class PromoController {
|
||||||
|
|
||||||
|
private string $mode_detail;
|
||||||
|
private int $id_promo;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->mode_detail = (string) Param::Get("mode_detail");
|
||||||
|
$this->id_promo = (int) Param::Get("PromoID");
|
||||||
|
}
|
||||||
|
|
||||||
|
public function table_detail() {
|
||||||
|
if (in_array($this->mode_detail, ["insert","update","delete"])) {
|
||||||
|
$sql = new SQL($this->app);
|
||||||
|
$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 ($this->mode_detail === "insert") {
|
||||||
|
$sql->add_param("PromoID");
|
||||||
|
$sql->add_param("Tipe", 1);
|
||||||
|
if ($this->id_promo > 0) { $sql->UpdateDB(); }
|
||||||
|
else $sql->InsertDB();
|
||||||
|
} else if ($this->mode_detail === "update") {
|
||||||
|
$sql->UpdateDB();
|
||||||
|
} else if ($this->mode_detail === "delete") {
|
||||||
|
$sql->DeleteDB();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$tcari = Param::Get("Cari_Promo");
|
||||||
|
$tsql = "Tipe=1"; $asql = [];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql = " AND CONCAT(DATE_FORMAT(Tanggal,'%d-%m-%Y'),Info) LIKE ?";
|
||||||
|
$asql[] = '%'.$tcari.'%';
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("disp_promo", "*", $tsql, $asql);
|
||||||
|
$obj->add_field("PromoID", "ID", "hid");
|
||||||
|
$obj->add_field("Tanggal", "Tanggal", "c", "sqltgl", "", "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_btn("DISPPromoJS.detail_tambah", "+ Promo");
|
||||||
|
$this->app->json([ $obj->json_table("divDetail") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_promo() {
|
||||||
|
$atabel = Invesa::A_Iklan();
|
||||||
|
if ($this->id_promo > 0) {
|
||||||
|
$atabel = $this->db->fetchRow("SELECT * FROM disp_promo WHERE PromoID=?", [$this->id_promo]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$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.Invesa::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.Invesa::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 d-flex gap-2">'.$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" class="d-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="'.$this->mode_detail.'" >';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function upload_picture() {
|
||||||
|
$ajson['result'] = 0;
|
||||||
|
$upload = $this->app->request()->getUploadedFiles();
|
||||||
|
$file = $upload['Gambar1'];
|
||||||
|
|
||||||
|
if ($file->getError() === UPLOAD_ERR_OK) {
|
||||||
|
$file_name = $file->getClientFilename();
|
||||||
|
$file_size = $file->getSize();
|
||||||
|
if ($file_size < 20480000) {
|
||||||
|
$file_ext = pathinfo($file_name, PATHINFO_EXTENSION);
|
||||||
|
if (in_array($file_ext, ["png","jpg","jpeg","gif"])) {
|
||||||
|
$file_name = $file->getTempName();
|
||||||
|
$mime = $file->getClientMediaType();
|
||||||
|
if ($this->id_promo > 0) {
|
||||||
|
$this->db->runQuery("UPDATE disp_promo SET Image=\"".addslashes(file_get_contents($file_name))."\",Mime='".$mime."' WHERE PromoID=?", [$this->id_promo]);
|
||||||
|
} else {
|
||||||
|
$this->db->runQuery("INSERT INTO disp_promo (Image,Mime) VALUES(\"".addslashes(file_get_contents($file_name))."\",'".$mime."')");
|
||||||
|
$this->id_promo = (int) $this->db->lastInsertId();
|
||||||
|
}
|
||||||
|
$ajson['result'] = 1;
|
||||||
|
$ajson['PromoID'] = $this->id_promo;
|
||||||
|
} else {
|
||||||
|
$ajson['message'] = "File tidak dapat diterima !";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$ajson['message'] = "Ukuran file diatas 20MB !";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$ajson = ['result' => 0, 'message' => $file->getError()];
|
||||||
|
}
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function get_picture() {
|
||||||
|
$gambar = "/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcGBwcICQsJCAgKCAcHCg0KCgsMDAwMBwkODw0MDgsMDAz/2wBDAQICAgMDAwYDAwYMCAcIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCAABAAEDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9/KKKKAP/2Q==";
|
||||||
|
$mime = "image/jpg";
|
||||||
|
|
||||||
|
$prof = $this->db->fetchRow("SELECT Image,Mime FROM disp_promo WHERE PromoID=? AND Image IS NOT NULL", [$this->id_promo]);
|
||||||
|
if ($prof) {
|
||||||
|
$gambar = base64_encode($prof['Image']);
|
||||||
|
$mime = $prof['Mime'];
|
||||||
|
}
|
||||||
|
$this->app->json([ 'src' => 'data:'.$mime.';base64,'.$gambar ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$this->app->json(['html' =>
|
||||||
|
'<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"> </div></div></div></div>'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,492 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Gel/GajiController
|
||||||
|
Description : Transaksi Perhitungan Gaji
|
||||||
|
Created By : Siau Pheng ([email protected]).
|
||||||
|
Created Date : September 17th, 2014.
|
||||||
|
Last Modified : September 13th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Gel;
|
||||||
|
|
||||||
|
use App\Utils\Gel;
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use flight\Session;
|
||||||
|
use Webapp\DB\SQL;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
use Webapp\Web\Table;
|
||||||
|
|
||||||
|
class GajiController {
|
||||||
|
|
||||||
|
private array $web_app;
|
||||||
|
private array $app_gel;
|
||||||
|
private int $id_cab;
|
||||||
|
private string $mode;
|
||||||
|
private string $mode_detail;
|
||||||
|
private string $no_gaji;
|
||||||
|
private Gel $gel;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->web_app = (array) $session->get('WEB_APP');
|
||||||
|
$this->app_gel = (array) $session->get('APP_GEL');
|
||||||
|
$this->id_cab = Param::Int("CabID", $session->get('APP_INV')['CABANGID']);
|
||||||
|
$this->mode = Param::Get("mode", "");
|
||||||
|
$this->mode_detail = Param::Get("mode_detail", "");
|
||||||
|
$this->no_gaji = Param::Get("No_Gaji", "");
|
||||||
|
$this->gel = new Gel($app);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function table_detail() {
|
||||||
|
if (in_array($this->mode_detail, ["insert","update","delete"])) {
|
||||||
|
$sql = new SQL($this->app);
|
||||||
|
$sql->set_table("tmp_gaji_detail");
|
||||||
|
$sql->add_param("KaryaID");
|
||||||
|
$sql->add_param("Qty_Harian");
|
||||||
|
$sql->add_param("Gaji_Harian");
|
||||||
|
$sql->add_param("Total_Gaji", "Qty_Harian*Gaji_Harian", true);
|
||||||
|
$sql->add_param("Qty_Lembur");
|
||||||
|
$sql->add_param("Lembur_Harian");
|
||||||
|
$sql->add_param("Total_Lembur", "Qty_Lembur*Lembur_Harian", true);
|
||||||
|
$sql->add_param("Qty_BonusM");
|
||||||
|
$sql->add_param("Qty_BonusB");
|
||||||
|
$sql->add_param("Bonus_Minggu");
|
||||||
|
$sql->add_param("Bonus_Bulan");
|
||||||
|
$sql->add_param("Total_BonusM", "Qty_BonusM*Bonus_Minggu", true);
|
||||||
|
$sql->add_param("Total_BonusB", "Qty_BonusB*Bonus_Bulan", true);
|
||||||
|
$sql->add_param("Total_Potong");
|
||||||
|
$sql->add_param("Total_Semua", "Total_Gaji+Total_Lembur+Total_BonusM+Total_BonusB-Total_Potong", true);
|
||||||
|
$sql->add_param("Catatan", Param::Get("CatatKar"));
|
||||||
|
$sql->add_param_unix();
|
||||||
|
$sql->add_param_userid();
|
||||||
|
$sql->add_where("ID");
|
||||||
|
$sql->add_where("No_Gaji", $this->no_gaji);
|
||||||
|
|
||||||
|
if ($this->mode_detail === "insert") {
|
||||||
|
$sql->add_param("No_Gaji");
|
||||||
|
$sql->InsertDB();
|
||||||
|
} else if ($this->mode_detail === "update") {
|
||||||
|
$sql->UpdateDB();
|
||||||
|
} else if ($this->mode_detail === "delete") {
|
||||||
|
$sql->DeleteDB();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$tsql = ''; $asql = [$this->no_gaji]; $qtabel = "gel_gaji_detail";
|
||||||
|
if (in_array($this->mode, ["add","edit"])) {
|
||||||
|
if ($this->mode === "add") { $tsql = " AND Unix=?"; $asql[] = $this->app->user()->unix(); }
|
||||||
|
$qtabel = "tmp_gaji_detail";
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("(SELECT * FROM ".$qtabel.' WHERE No_Gaji=?'.$tsql.") D LEFT JOIN para_karyawan P ON (D.KaryaID=P.KaryaID)", "D.*,P.Nama_Karya,(P.Total_Pinjam-D.Total_Potong) Sisa_Pinjam", "", $asql);
|
||||||
|
$obj->set_footer("SUM(Total_Semua) Total_Semua");
|
||||||
|
$obj->add_field("ID", "ID", "hid");
|
||||||
|
$obj->add_field("KaryaID", "KaryaID", "hid");
|
||||||
|
$obj->add_field("Nama_Karya", "Nama Karyawan", "awr");
|
||||||
|
$obj->add_field("Qty_Harian", "Hari", "r", "rupiah");
|
||||||
|
$obj->add_field("Total_BonusM", "Bonus MG", "r", "rupiah");
|
||||||
|
$obj->add_field("Total_BonusB", "Bonus BLN", "r", "rupiah");
|
||||||
|
$obj->add_field("Total_Potong", "Potongan", "r", "rupiah");
|
||||||
|
$obj->add_field("Total_Semua", "Gaji Bersih", "r", "rupiah", "rupiah");
|
||||||
|
$obj->add_field("Catatan", "Catatan", "awr");
|
||||||
|
$obj->set_field_order("Nama_Karya", "A");
|
||||||
|
if (in_array($this->mode, ["add","edit"])) {
|
||||||
|
$obj->add_row_btn("clipboard", "Ubah", "GELGajiJS.detail_ubah");
|
||||||
|
$obj->add_row_btn("trash", "Hapus", "GELGajiJS.detail_hapus", "Unix", $this->app->user()->unix());
|
||||||
|
$obj->set_func_btn("GELGajiJS.detail_tambah", '<i class="bi-plus-lg me-1"></i> Karyawan');
|
||||||
|
$obj->set_func_btn("GELGajiJS.karya_brow", '<i class="bi-table me-1"></i> Browse');
|
||||||
|
}
|
||||||
|
$this->app->json([ $obj->json_table("divDetailTabel") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function brow_tx() {
|
||||||
|
$tcari = Param::Get("Cari_TX");
|
||||||
|
$tsql = ''; $asql = [];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql .= "CONCAT(No_Gaji,DATE_FORMAT(Tgl_Gaji,'%d-%m-%Y'),Catatan) LIKE ?";
|
||||||
|
$asql[] = '%' . $tcari . '%';
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("gel_gaji", "*,CONCAT(LPAD(Bulan,2,'0'),'-',Tahun) BLTH,(Total_Gaji+Total_Bonus-Total_Potong) Jumlah", $tsql);
|
||||||
|
$obj->add_field("No_Gaji", "No. Trans", "c");
|
||||||
|
$obj->add_field("Tgl_Gaji", "Tgl. Trans", "c", "sqltgl", "", "val-tgl");
|
||||||
|
$obj->add_field("Minggu", "MG", "c");
|
||||||
|
$obj->add_field("BLTH", "Bulan", "c");
|
||||||
|
$obj->add_field("Total_Gaji", "Total Gaji", "r", "rupiah");
|
||||||
|
$obj->add_field("Total_Bonus", "Total Bonus", "r", "rupiah");
|
||||||
|
$obj->add_field("Total_Potong", "Potongan", "r", "rupiah");
|
||||||
|
$obj->add_field("Jumlah", "TOTAL", "r", "rupiah");
|
||||||
|
$obj->set_field_order("No_Gaji", "D");
|
||||||
|
$obj->set_func_select("GELGajiJS.tx_select");
|
||||||
|
$this->app->json([ $obj->db_table("divBrowTX") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function brow_cetak() {
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("(SELECT * FROM gel_gaji_detail WHERE No_Gaji=?) D LEFT JOIN para_karyawan P ON (D.KaryaID=P.KaryaID)", "D.*,P.Nama_Karya, 'N' Cek", "", [$this->no_gaji]);
|
||||||
|
$obj->add_field("ID", "ID", "hid");
|
||||||
|
$obj->add_field("Nama_Karya", "Nama Karyawan", "awr");
|
||||||
|
$obj->add_field("Total_Gaji", "Total Gaji", "r", "rupiah");
|
||||||
|
$obj->add_field("Total_Semua", "Gaji Bersih", "r", "rupiah");
|
||||||
|
$obj->add_field("Catatan", "Catatan", "awr");
|
||||||
|
$obj->add_row_checkbox("ID", "Cek");
|
||||||
|
$obj->set_field_order("Nama_Karya", "A");
|
||||||
|
$this->app->json([ $obj->db_table("divBrowCetak") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function brow_karya() {
|
||||||
|
$tcari = Param::Get("Cari_Karya");
|
||||||
|
$tsql = ''; $asql = [$this->no_gaji];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql .= " AND Nama_Karya LIKE ?";
|
||||||
|
$asql[] = '%' . $tcari . '%';
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("para_karyawan", "*", "Aktif=1 AND KaryaID NOT IN (SELECT KaryaID FROM tmp_gaji_detail WHERE No_Gaji=?)".$tsql, $asql);
|
||||||
|
$obj->add_field("KaryaID", "ID", "hid");
|
||||||
|
$obj->add_field("Nama_Karya", "Nama Karyawan", "awr");
|
||||||
|
$obj->add_field("Gaji_Harian", "Gaji Harian", "r", "rupiah");
|
||||||
|
$obj->add_field("Total_Pinjam", "Total Pinjaman", "r", "rupiah");
|
||||||
|
$obj->set_field_order("Nama_Karya", "A");
|
||||||
|
$obj->set_func_select("GELGajiJS.karya_select");
|
||||||
|
$this->app->json([ $obj->db_table("divBrowKarya") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function auto_karya() {
|
||||||
|
$tcari = Param::Get("Auto_Query");
|
||||||
|
$ajson['autodata'] = [];
|
||||||
|
$stat = $this->db->runQuery("SELECT KaryaID,Nama_Karya,CONCAT(Gaji_Harian,':',Total_Pinjam) Data2 FROM para_karyawan WHERE Aktif=1 AND KaryaID NOT IN (SELECT KaryaID FROM tmp_gaji_detail WHERE No_Gaji=?) AND Nama_Karya LIKE ? ORDER BY Nama_Karya LIMIT 50", [$this->no_gaji, '%'.$tcari.'%']);
|
||||||
|
while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$ajson['autodata'][] = ['value'=>$row['KaryaID'], 'text'=>$row['Nama_Karya'], 'data'=>$row['Data2'], 'bc'=>0];
|
||||||
|
}
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_master() {
|
||||||
|
$ajson = [ 'error'=>"", 'html'=>"" ];
|
||||||
|
$atabel = [ 'No_Gaji'=>"", 'CabID'=>$this->id_cab, 'Tgl_Gaji'=>"", 'Minggu'=>date('W'), 'Bulan'=>date('n'), 'Tahun'=>date('Y'), 'Catatan'=>"" ];
|
||||||
|
|
||||||
|
if ($this->mode === "add") {
|
||||||
|
$atabel['No_Gaji'] = "GJ-BARU#".(string) $this->web_app['SERVER_ID']. $this->app->user()->id(3);
|
||||||
|
$atabel['Tgl_Gaji'] = tgl_ymd();
|
||||||
|
$this->no_gaji = "";
|
||||||
|
|
||||||
|
} else if ($this->mode === "edit") {
|
||||||
|
$this->Gaji_Copy($this->no_gaji);
|
||||||
|
|
||||||
|
} else if ($this->mode === "save") {
|
||||||
|
$no_lama = $this->no_gaji;
|
||||||
|
$tgl_gaji = Param::Get("Tgl_Gaji");
|
||||||
|
$b_baru = str_contains($no_lama, "BARU");
|
||||||
|
if ($b_baru) $this->no_gaji = $this->Gaji_Baru($this->id_cab, $tgl_gaji, true);
|
||||||
|
$this->Gaji_Save($this->no_gaji, $b_baru, $no_lama);
|
||||||
|
|
||||||
|
$agaji = $this->db->fetchRow("SELECT SUM(Total_Gaji+Total_Lembur) Gaji, SUM(Total_BonusM+Total_BonusB) Bonus, SUM(Total_Potong) Potong FROM gel_gaji_detail WHERE No_Gaji=?", [$this->no_gaji]) ?? ['Gaji'=>0, 'Bonus'=>0, 'Potong'=>0];
|
||||||
|
|
||||||
|
$sql = new SQL($this->app);
|
||||||
|
$sql->set_table("gel_gaji");
|
||||||
|
$sql->add_param_date("Tgl_Gaji");
|
||||||
|
$sql->add_param("Total_Gaji", $agaji['Gaji']);
|
||||||
|
$sql->add_param("Total_Bonus", $agaji['Bonus']);
|
||||||
|
$sql->add_param("Total_Potong", $agaji['Potong']);
|
||||||
|
$sql->add_param("Minggu");
|
||||||
|
$sql->add_param("Bulan");
|
||||||
|
$sql->add_param("Tahun");
|
||||||
|
$sql->add_param("CabID");
|
||||||
|
$sql->add_param("Catatan");
|
||||||
|
$sql->add_param_stamp();
|
||||||
|
$sql->add_param_userid();
|
||||||
|
$sql->add_where("No_Gaji", $this->no_gaji);
|
||||||
|
$sql->UpdateDB();
|
||||||
|
|
||||||
|
// PROSES POSTING GL
|
||||||
|
$ainfo = $this->db->fetchRow("SELECT *,Total_Gaji+Total_Bonus Gaji FROM gel_gaji WHERE No_Gaji=?", [$this->no_gaji]);
|
||||||
|
$ajurnal = [
|
||||||
|
'Kode_Jurnal' => $this->no_gaji,
|
||||||
|
'TipeID' => 14,
|
||||||
|
'CabID' => $this->id_cab,
|
||||||
|
'Tanggal' => $tgl_gaji,
|
||||||
|
'Kode_Ref' => $this->no_gaji,
|
||||||
|
'Catatan' => "Pembayaran Gaji : ".$ainfo['No_Gaji']." / Minggu ".$ainfo['Minggu'].", Bulan ".bulan_array()[$ainfo['Bulan']]." ".$ainfo['Tahun']
|
||||||
|
];
|
||||||
|
$adetail = [
|
||||||
|
[
|
||||||
|
'Kode_Rek' => $this->app_gel['BIAYA_GAJI'],
|
||||||
|
'DK' => "D",
|
||||||
|
'Jumlah' => $ainfo['Gaji']
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'Kode_Rek' => $this->app_gel['KAS_TUNAI'],
|
||||||
|
'DK' => "K",
|
||||||
|
'Jumlah' => (float) $ainfo['Gaji'] - (float) $ainfo['Total_Potong']
|
||||||
|
]
|
||||||
|
];
|
||||||
|
|
||||||
|
$this->db->delete("gel_karyawan", "Kode_Jurnal=?", [$this->no_gaji]);
|
||||||
|
if ((float) $ainfo['Total_Potong'] > 0) {
|
||||||
|
$apotong = $this->db->fetchAll("SELECT KaryaID,Total_Potong FROM gel_gaji_detail WHERE No_Gaji=? AND Total_Potong>0", [$this->no_gaji]);
|
||||||
|
foreach($apotong as $_key => $val) {
|
||||||
|
$this->db->insert("gel_karyawan", [ 'No_Trans'=>$this->gel->Karya_Baru($tgl_gaji), 'Tgl_Trans'=>$ainfo['Tgl_Gaji'], 'KaryaID'=>$val['KaryaID'], 'Kode_Jurnal'=>$this->no_gaji, 'Total_Bayar'=>$val['Total_Potong'], 'Catatan'=>'Potong Gaji : '.$this->no_gaji, 'Kunci'=>1, 'UserID'=>$this->app->user()->id() ]);
|
||||||
|
$adetail[] = [
|
||||||
|
'Kode_Rek' => $this->app_gel['PIU_KARYA'],
|
||||||
|
'DK' => "K",
|
||||||
|
'Jumlah' => $val['Total_Potong']
|
||||||
|
];
|
||||||
|
// UPDATE KE KARYAWAN
|
||||||
|
$ipinjam = $this->db->fetchField("SELECT SUM(Total_Pinjam-Total_Bayar) FROM gel_karyawan WHERE KaryaID=?", [$val['KaryaID']]) ?? 0;
|
||||||
|
$this->db->runQuery("UPDATE para_karyawan SET Total_Pinjam=? WHERE KaryaID=?", [$ipinjam, $val['KaryaID']]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->gel->Jurnal_Post($ajurnal, $adetail);
|
||||||
|
$this->mode = "view";
|
||||||
|
|
||||||
|
} else if ($this->mode === "cancel") {
|
||||||
|
$this->Gaji_Cancel($this->no_gaji);
|
||||||
|
$this->mode = "view";
|
||||||
|
$this->no_gaji = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!empty($this->no_gaji) && $this->mode !== "cancel") {
|
||||||
|
$row = $this->db->fetchRow("SELECT * FROM gel_gaji WHERE No_Gaji='".$this->no_gaji."'");
|
||||||
|
if ($row) {
|
||||||
|
$atabel = $row;
|
||||||
|
} else {
|
||||||
|
$ajson['error'] = "Nomor Transaksi belum ada / tidak diketemukan !";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$enable = in_array($this->mode, ["add","edit"]) ? true : false;
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tno = $form->textbox("_", "No_Gaji", $atabel['No_Gaji'], !$enable, false, "text", "nomor transaksi");
|
||||||
|
$ttgl = $form->datebox("_", "Tgl_Gaji", $atabel['Tgl_Gaji'], $enable, false);
|
||||||
|
$tcab = $form->option_db("_", "CabID", $atabel['CabID'], $enable, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID");
|
||||||
|
$tmg = $form->option("_", "Minggu", $atabel['Minggu'], $enable, false, $this->range_minggu((int) $atabel['Bulan'], (int) $atabel['Tahun']));
|
||||||
|
$tbln = $form->option("_", "Bulan", $atabel['Bulan'], $enable, false, bulan_array(), null, "GELGajiJS.oc_Minggu()");
|
||||||
|
$tthn = $form->option("_", "Tahun", $atabel['Tahun'], $enable, false, $this->gel->Tahun_Array(), null, "GELGajiJS.oc_Minggu()");
|
||||||
|
$tcatat = $form->textbox("_", "Catatan", stripslashes($atabel['Catatan']), $enable, false, "text", "catatan gaji");
|
||||||
|
$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_Gaji">Nomor Transaksi</label>
|
||||||
|
<div class="col-sm-7 col-lg-7"><div class="input-group">'.$tno.'<button id="butBrow" class="btn btn-info" type="button"><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_Gaji">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="Bulan">Periode / Minggu</label>
|
||||||
|
<div class="col"><div class="input-group">'.$tbln.$tthn.'<span class="input-group-text px-2">/</span>'.$tmg.'</div></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-3 col-lg-2 col-form-label" for="Catatan" style="width:12.5%;">Deskripsi</label>
|
||||||
|
<div class="col">'.$tcatat.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1"><div class="col"><hr class="my-1"></div></div>
|
||||||
|
<input type="hidden" id="Lembur" value="'.$this->app_gel['LEMBUR'].'" >
|
||||||
|
<input type="hidden" id="Bonus1" value="'.$this->app_gel['BONUS1'].'" >
|
||||||
|
<input type="hidden" id="Bonus2" value="'.$this->app_gel['BONUS2'].'" >
|
||||||
|
<input type="hidden" id="mode" value="'.$this->mode.'" >';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_gaji() {
|
||||||
|
$id = (int) Param::Get("ID", 0);
|
||||||
|
$atabel = [ 'ID'=>$id, 'KaryaID'=>Param::Get("KaryaID"), 'Nama_Karya'=>"", 'Qty_Harian'=>0, 'Gaji_Harian'=>0, 'Qty_Lembur'=>0, 'Lembur_Harian'=>$this->app_gel['LEMBUR'], 'Qty_BonusM'=>0, 'Qty_BonusB'=>0, 'Bonus_Minggu'=>$this->app_gel['BONUS1'], 'Bonus_Bulan'=>$this->app_gel['BONUS2'], 'Total_Potong'=>0, 'Total_Pinjam'=>0, 'Tot_Gaji'=>0, 'Tot_Lembur'=>0, 'Tot_Bonus1'=>0, 'Tot_Bonus2'=>0, 'Jumlah'=>0, 'Catatan'=>"" ];
|
||||||
|
if ($id > 0) {
|
||||||
|
$_agaji = $this->db->fetchRow("SELECT * FROM tmp_gaji_detail WHERE No_Gaji=? AND ID=?", [$this->no_gaji, $id]);
|
||||||
|
if ($_agaji) $atabel = array_merge($atabel, $_agaji->getData());
|
||||||
|
}
|
||||||
|
if (!empty($atabel['KaryaID'])) {
|
||||||
|
$_akary = $this->db->fetchRow("SELECT Nama_Karya,Gaji_Harian,Total_Pinjam FROM para_karyawan WHERE KaryaID=?", [$atabel['KaryaID']]);
|
||||||
|
if ($_akary) $atabel = array_merge($atabel, $_akary->getData());
|
||||||
|
}
|
||||||
|
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tnama = $form->textauto("_", "Nama_Karya", ['value'=>$atabel['KaryaID'],'text'=>$atabel['Nama_Karya']], true, true, "ketik nama karyawan");
|
||||||
|
$tqty_har = $form->textbox("_", "Qty_Harian", $atabel['Qty_Harian'], true, true, "double");
|
||||||
|
$tqty_lem = $form->textbox("_", "Qty_Lembur", $atabel['Qty_Lembur'], true, true, "double");
|
||||||
|
$tqty_bm = $form->textbox("_", "Qty_BonusM", $atabel['Qty_BonusM'], true, true, "double");
|
||||||
|
$tqty_bb = $form->textbox("_", "Qty_BonusB", $atabel['Qty_BonusB'], true, true, "double");
|
||||||
|
$tpotong = $form->textbox("_", "Total_Potong", $atabel['Total_Potong'], true, true, "double");
|
||||||
|
$tgj_hari = $form->textbox("_", "Gaji_Harian", $atabel['Gaji_Harian'], false, false, "double");
|
||||||
|
$tlb_hari = $form->textbox("_", "Lembur_Harian", $atabel['Lembur_Harian'], false, false, "double");
|
||||||
|
$tbon_m = $form->textbox("_", "Bonus_Minggu", $atabel['Bonus_Minggu'], false, false, "double");
|
||||||
|
$tbon_b = $form->textbox("_", "Bonus_Bulan", $atabel['Bonus_Bulan'], false, false, "double");
|
||||||
|
$ttot_gaji = $form->textbox("_", "Tot_Gaji", $atabel['Tot_Gaji'], false, false, "double");
|
||||||
|
$ttot_lemb = $form->textbox("_", "Tot_Lembur", $atabel['Tot_Lembur'], false, false, "double");
|
||||||
|
$ttot_bon1 = $form->textbox("_", "Tot_Bonus1", $atabel['Tot_Bonus1'], false, false, "double");
|
||||||
|
$ttot_bon2 = $form->textbox("_", "Tot_Bonus2", $atabel['Tot_Bonus2'], false, false, "double");
|
||||||
|
$tjumlah = $form->textbox("_", "Jumlah", $atabel['Jumlah'], false, false, "double");
|
||||||
|
$tcatat = $form->textbox("_", "CatatKar", $atabel['Catatan'], true, true, "text");
|
||||||
|
$ajson['html'] = '
|
||||||
|
<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="Qty_Harian">Hari Kerja</label>
|
||||||
|
<div class="col-sm-4 col-lg-5"><div class="input-group">'.$tqty_har.$tgj_hari.'</div></div>
|
||||||
|
<div class="col-sm-4 col-lg-4">'.$ttot_gaji.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="Qty_Lembur">Hari Lembur</label>
|
||||||
|
<div class="col-sm-4 col-lg-5"><div class="input-group">'.$tqty_lem.$tlb_hari.'</div></div>
|
||||||
|
<div class="col-sm-4 col-lg-4">'.$ttot_lemb.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="Qty_BonusM">Bonus Mingguan</label>
|
||||||
|
<div class="col-sm-4 col-lg-5"><div class="input-group">'.$tqty_bm.$tbon_m.'</div></div>
|
||||||
|
<div class="col-sm-4 col-lg-4">'.$ttot_bon1.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="Qty_BonusB">Bonus Bulanan</label>
|
||||||
|
<div class="col-sm-4 col-lg-5"><div class="input-group">'.$tqty_bb.$tbon_b.'</div></div>
|
||||||
|
<div class="col-sm-4 col-lg-4">'.$ttot_bon2.'</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-8 col-lg-8 col-form-label" for="Total_Potong">Potongan Pinjaman</label>
|
||||||
|
<div class="col-sm-4 col-lg-4">'.$tpotong.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-8 col-lg-8 col-form-label">Gaji Bersih (setelah potongan)</label>
|
||||||
|
<div class="col-sm-4 col-lg-4">'.$tjumlah.'</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-8 col-lg-8 col-form-label">Jumlah Sisa Pinjaman</label>
|
||||||
|
<div class="col-sm-4 col-lg-4"><input type="double" class="form-control text-danger double" id="Total_Pinjam" name="Total_Pinjam" value="'.uang($atabel['Total_Pinjam']).'" readonly=""></div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="CatatKar">Catatan / Informasi</label>
|
||||||
|
<div class="col">'.$tcatat.'</div>
|
||||||
|
</div>
|
||||||
|
<input type="hidden" id="ID" value="'.$atabel['ID'].'" >
|
||||||
|
<input type="hidden" id="KaryaID" value="'.$atabel['KaryaID'].'" >
|
||||||
|
<input type="hidden" id="mode_detail" value="'.$this->mode_detail.'" >';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function proses_hapus() {
|
||||||
|
$this->db->runQuery("DELETE FROM gel_gaji WHERE No_Gaji=?", [$this->no_gaji]);
|
||||||
|
$this->db->runQuery("DELETE FROM gel_gaji_detail WHERE No_Gaji=?", [$this->no_gaji]);
|
||||||
|
// PROSES POSTING GL
|
||||||
|
$this->db->runQuery("DELETE FROM gel_jurnal WHERE Kode_Jurnal=?", [$this->no_gaji]);
|
||||||
|
$this->db->runQuery("DELETE FROM gel_jurnal_detail WHERE Kode_Jurnal=?", [$this->no_gaji]);
|
||||||
|
$this->db->runQuery("DELETE FROM gel_karyawan WHERE Kode_Jurnal=?", [$this->no_gaji]);
|
||||||
|
$this->app->json([ 'status' => true ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function option_minggu() {
|
||||||
|
$amg = $this->range_minggu((int) Param::Get("Bulan"), (int) Param::Get("Tahun"));
|
||||||
|
$ajson['option'] = [];
|
||||||
|
foreach($amg as $_key => $_val) {
|
||||||
|
$ajson['option'][] = ['value' => $_key, 'label' => $_val];
|
||||||
|
}
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$this->app->json(['html' => '
|
||||||
|
<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-journal-bookmark me-2"></i>Transaksi Gaji Karyawan</button>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item ms-auto">
|
||||||
|
<button class="btn btn-primary mb-1 ms-2" id="butTambah" type="button"><i class="bi-plus-lg me-2"></i>Tambah</button>
|
||||||
|
<button class="btn btn-info mb-1 ms-2" id="butUbah" type="button"><i class="bi-clipboard me-2"></i>Ubah</button>
|
||||||
|
<button class="btn btn-warning mb-1 ms-2" id="butHapus" type="button"><i class="bi-trash me-2"></i>Hapus</button>
|
||||||
|
<button class="btn btn-secondary mb-1 ms-2" id="butPrint" type="button"><i class="bi-printer me-2"></i>Cetak</button>
|
||||||
|
<button class="btn btn-danger mb-1 ms-2" id="butBatal" type="button"><i class="bi-x-lg me-2"></i>Batal</button>
|
||||||
|
<button class="btn btn-success mb-1 ms-2" id="butSimpan" type="button"><i class="bi-save me-2"></i>Simpan</button>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<div class="tab-content border border-top-0 p-3">
|
||||||
|
<div class="tab-pane fade active show" id="tx" role="tabpanel" aria-labelledby="tx-tab">
|
||||||
|
<div id="divTXMaster"> </div>
|
||||||
|
<div id="divDetailTabel"> </div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div></div>
|
||||||
|
</div>'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function Gaji_Baru(int $id_cab = 0, string $tgl = "", bool $save = false) {
|
||||||
|
if (empty($tgl)) {
|
||||||
|
$tno = "J" . date("y") . abjad(date("n"));
|
||||||
|
} else {
|
||||||
|
$tmp = explode("-", $tgl);
|
||||||
|
$tno = "J" . substr($tmp[2],2,2) . abjad((int) $tmp[1]);
|
||||||
|
}
|
||||||
|
$tno .= $this->web_app['SERVER_ID'] . $id_cab;
|
||||||
|
$ino = (int) $this->db->fetchField("SELECT MAX(RIGHT(No_Gaji,5)) FROM gel_gaji WHERE No_Gaji LIKE ?", [$tno.'%']) ?? 0;
|
||||||
|
$tno .= isi_nol(++$ino, 5);
|
||||||
|
if ($save===true) $this->db->insert("gel_gaji", [ 'No_Gaji'=>$tno ]);
|
||||||
|
return $tno;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function Gaji_Copy(string $no_gaji, bool $unix = false): void {
|
||||||
|
if (empty($no_gaji)) return;
|
||||||
|
$this->Gaji_Cancel($no_gaji);
|
||||||
|
$this->db->runQuery("INSERT INTO tmp_gaji_detail (No_Gaji,KaryaID,Qty_Harian,Gaji_Harian,Total_Gaji,Qty_Lembur,Lembur_Harian,Total_Lembur,Qty_BonusM,Qty_BonusB,Bonus_Minggu,Bonus_Bulan,Total_BonusM,Total_BonusB,Total_Potong,Total_Semua,Catatan,UserID,Unix) SELECT No_Gaji,KaryaID,Qty_Harian,Gaji_Harian,Total_Gaji,Qty_Lembur,Lembur_Harian,Total_Lembur,Qty_BonusM,Qty_BonusB,Bonus_Minggu,Bonus_Bulan,Total_BonusM,Total_BonusB,Total_Potong,Total_Semua,Catatan,UserID,'".(($unix)?$this->app->user()->unix():0)."' FROM gel_gaji_detail WHERE No_Gaji=?", [$no_gaji]);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function Gaji_Save(string $no_gaji, bool $is_baru = false, ?string $no_lama = ""): void {
|
||||||
|
if (empty($no_gaji)) return;
|
||||||
|
$this->db->delete("gel_gaji_detail", "No_Gaji=?", [$no_gaji]);
|
||||||
|
if ($is_baru) {
|
||||||
|
$this->Gaji_Cancel($no_gaji);
|
||||||
|
$this->db->runQuery("UPDATE tmp_gaji_detail SET No_Gaji=? WHERE No_Gaji=? AND Unix=?", [$no_gaji, $no_lama, $this->app->user()->unix()]);
|
||||||
|
}
|
||||||
|
$this->db->runQuery("INSERT INTO gel_gaji_detail (No_Gaji,KaryaID,Qty_Harian,Gaji_Harian,Total_Gaji,Qty_Lembur,Lembur_Harian,Total_Lembur,Qty_BonusM,Qty_BonusB,Bonus_Minggu,Bonus_Bulan,Total_BonusM,Total_BonusB,Total_Potong,Total_Semua,Catatan,UserID) SELECT No_Gaji,KaryaID,Qty_Harian,Gaji_Harian,Total_Gaji,Qty_Lembur,Lembur_Harian,Total_Lembur,Qty_BonusM,Qty_BonusB,Bonus_Minggu,Bonus_Bulan,Total_BonusM,Total_BonusB,Total_Potong,Total_Semua,Catatan,UserID FROM tmp_gaji_detail WHERE No_Gaji=?", [$no_gaji]);
|
||||||
|
$this->Gaji_Cancel($no_gaji);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function Gaji_Cancel(string $no_gaji = ""): void {
|
||||||
|
if (empty($no_gaji)) return;
|
||||||
|
$this->db->delete("tmp_gaji_detail", "No_Gaji=?", [$no_gaji]);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function range_minggu(int $bln=1, int $tahun=2010): array {
|
||||||
|
$nawal = date('W', mktime(0,0,0,$bln,1,$tahun)) - 1;
|
||||||
|
$nakhir = date('W', mktime(0,0,0,$bln+1,1,$tahun)) * 1;
|
||||||
|
$amg = [];
|
||||||
|
if ($nawal > $nakhir) {
|
||||||
|
$amg[$nawal] = "Minggu ".$nawal;
|
||||||
|
$nawal = 1;
|
||||||
|
}
|
||||||
|
for ($x = $nawal; $x <= $nakhir; $x++) {
|
||||||
|
$amg[$x] = "Minggu ".$x;
|
||||||
|
}
|
||||||
|
return $amg;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,315 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Gel/HutangController
|
||||||
|
Description : Transaksi Pembayaran Hutang Supplier
|
||||||
|
Created By : Siau Pheng ([email protected]).
|
||||||
|
Created Date : March 7th, 2011.
|
||||||
|
Last Modified : September 10th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Gel;
|
||||||
|
|
||||||
|
use App\Utils\Gel;
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use flight\Session;
|
||||||
|
use Webapp\DB\SQL;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
use Webapp\Web\Table;
|
||||||
|
|
||||||
|
class HutangController {
|
||||||
|
|
||||||
|
private array $app_gel;
|
||||||
|
private string $mode;
|
||||||
|
private string $mode_detail;
|
||||||
|
private int $id_sup;
|
||||||
|
private string $no_beli;
|
||||||
|
private int $mode_tampil;
|
||||||
|
private Gel $gel;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->app_gel = (array) $session->get('APP_GEL');
|
||||||
|
$this->mode = Param::Get("mode", "");
|
||||||
|
$this->mode_detail = Param::Get("mode_detail", "");
|
||||||
|
$this->id_sup = Param::Int("SupID", 0);
|
||||||
|
$this->no_beli = Param::Get("No_Beli", "");
|
||||||
|
$this->mode_tampil = Param::Int("Mode_Tampil", 0);
|
||||||
|
$this->gel = new Gel($app);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function table_nota() {
|
||||||
|
$tsql = 'SupID=?'; $asql = [$this->id_sup];
|
||||||
|
if ($this->mode_tampil === 0) {
|
||||||
|
$tsql .= " AND Lunas=0";
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("(SELECT No_Beli,Tgl_Beli,Real_Diskon,Real_Beli,Real_Beli+Real_Diskon Sub_Total,IF(Data_Beli=1,'B','R') Tipe,CabID,Lunas FROM inv_beli WHERE ".$tsql.") B LEFT JOIN para_cabang C ON (C.CabID=B.CabID)", "B.*,C.Nama_Cab", "", $asql);
|
||||||
|
$obj->set_footer("SUM(B.Real_Beli) Real_Beli");
|
||||||
|
$obj->add_field("Tipe", "Tipe", "hid");
|
||||||
|
$obj->add_field("No_Beli", "No. Trans", "c");
|
||||||
|
$obj->add_field("Tgl_Beli", "Tgl. Trans", "c", "sqltgl", "", "val-tgl");
|
||||||
|
$obj->add_field("Nama_Cab", "Cabang", "l");
|
||||||
|
$obj->add_field("Sub_Total", "Sub. Total", "r", "rupiah", "rupiah");
|
||||||
|
$obj->add_field("Real_Diskon", "Diskon", "r", "rupiah");
|
||||||
|
$obj->add_field("Real_Beli", "TOTAL", "r", "rupiah", "rupiah");
|
||||||
|
if ($this->mode_tampil === 1) $obj->add_field("Lunas", "Lunas", "c", "checkbox");
|
||||||
|
$obj->set_field_order("No_Beli", "A");
|
||||||
|
$obj->add_row_btn("save", "Pilih", "GELHutangJS.nota_select");
|
||||||
|
$this->app->json([ $obj->json_table("divTXNota") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function table_bayar() {
|
||||||
|
$ajson = [];
|
||||||
|
$lunas = (int) Param::Get("Lunas", 0);
|
||||||
|
if (in_array($this->mode_detail, ["insert","update","delete"])) {
|
||||||
|
$sql = new SQL($this->app);
|
||||||
|
$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", $this->no_beli);
|
||||||
|
|
||||||
|
$tgl_bayar = Param::Get("Tgl_Bayar", "00-00-0000");
|
||||||
|
|
||||||
|
if ($this->mode_detail === "insert") {
|
||||||
|
$abeli = $this->db->fetchRow("SELECT CabID,SupID FROM inv_beli WHERE No_Beli=?", [$this->no_beli]) ?? ['CabID'=>0, 'SupID'=>0];
|
||||||
|
$sql->add_param("CabID", $abeli['CabID']);
|
||||||
|
$sql->add_param("SupID", $abeli['SupID']);
|
||||||
|
$sql->InsertDB();
|
||||||
|
$id_bayar = $sql->LastInsertID();
|
||||||
|
|
||||||
|
// PROSES POSTING GL
|
||||||
|
if (Param::Get("Tipe_Nota","B")==="B") {
|
||||||
|
$tcat = "Pembayaran Faktur : "; $ddk = "D"; $kdk = "K";
|
||||||
|
} else {
|
||||||
|
$tcat ="Retur Nota : "; $ddk = "K"; $kdk = "D";
|
||||||
|
}
|
||||||
|
$tot_bayar = (float) Param::Get("Total_Bayar", 0);
|
||||||
|
$tot_potong = (float) Param::Get("Total_Potong", 0);
|
||||||
|
$ajurnal = [
|
||||||
|
'Kode_Jurnal' => "",
|
||||||
|
'TipeID' => 10,
|
||||||
|
'CabID' => $abeli['CabID'],
|
||||||
|
'Tanggal' => $tgl_bayar,
|
||||||
|
'Kode_Ref' => $this->no_beli,
|
||||||
|
'Catatan' => $tcat . Param::Get("Nama_Sup", "")
|
||||||
|
];
|
||||||
|
$adetail = [
|
||||||
|
[ 'Kode_Rek' => $this->app_gel['HUT_USAHA'], 'DK' => $ddk, 'Jumlah' => $tot_bayar+$tot_potong, 'SupID' => $this->id_sup ],
|
||||||
|
[ 'Kode_Rek' => Param::Get("Kode_Rek", ""), 'DK' => $kdk, 'Jumlah' => $tot_bayar ]
|
||||||
|
];
|
||||||
|
if ($tot_potong > 0) array_push($adetail, [ 'Kode_Rek' => $this->app_gel['POT_BELI'], 'DK' => $kdk, 'Jumlah' => $tot_potong ]);
|
||||||
|
$gel_jur = $this->gel->Jurnal_Post($ajurnal, $adetail);
|
||||||
|
$this->db->update("inv_beli_lunas", ['Kode_Jurnal'=>$gel_jur], "No_Beli=? AND ID=?", [$this->no_beli, $id_bayar]);
|
||||||
|
|
||||||
|
} else if ($this->mode_detail === "delete") {
|
||||||
|
// PROSES POSTING GL
|
||||||
|
$gel_jur = $this->db->fetchField("SELECT Kode_Jurnal FROM inv_beli_lunas WHERE No_Beli=? AND ID=?", [$this->no_beli, Param::Get("ID", 0)]) ?? '';
|
||||||
|
if (!empty($gel_jur)) {
|
||||||
|
$this->db->delete("gel_jurnal", "Kode_Jurnal=?", [$gel_jur]);
|
||||||
|
$this->db->delete("gel_jurnal_detail", "Kode_Jurnal=?", [$gel_jur]);
|
||||||
|
}
|
||||||
|
$sql->DeleteDB();
|
||||||
|
}
|
||||||
|
|
||||||
|
$anota = $this->db->fetchRow("SELECT SUM(Total_Bayar) Bayar,SUM(Total_Potong) Potong FROM inv_beli_lunas WHERE No_Beli=?", [$this->no_beli]) ?? ['Bayar'=>0, 'Potong'=>0];
|
||||||
|
$this->db->runQuery("UPDATE inv_beli SET Total_Bayar=?,Total_Potong=?,Lunas=IF(Real_Beli-Total_Bayar-Total_Potong=0,1,0),Tgl_Lunas=IF(Lunas=1,'".tgl_sql2str($tgl_bayar)."','0000-00-00') WHERE No_Beli=?", [$anota['Bayar'], $anota['Potong'], $this->no_beli]);
|
||||||
|
$this->gel->Update_Lunas_Sup($this->id_sup);
|
||||||
|
$anota = $this->db->fetchRow("SELECT Lunas,Real_Beli-Total_Bayar-Total_Potong Total_Sisa FROM inv_beli WHERE No_Beli=?", [$this->no_beli]) ?? ['Lunas'=>0, 'Total_Sisa'=>0];
|
||||||
|
$lunas = $anota['Lunas'];
|
||||||
|
$ajson[] = ['type'=>"form", 'id'=>"Total_Sisa", 'value'=>$anota['Total_Sisa']];
|
||||||
|
$ajson[] = ['type'=>"form", 'id'=>"Lunas", 'value'=>$anota['Lunas']];
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("inv_beli_lunas", "*", "No_Beli=?", [$this->no_beli]);
|
||||||
|
$obj->add_field("ID", "ID", "hid");
|
||||||
|
$obj->add_field("Tgl_Bayar", "Tgl. Bayar", "c", "sqltgl", "", "val-tgl");
|
||||||
|
$obj->add_field("Kode_Jurnal", "Kode Jurnal", "c");
|
||||||
|
$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 ($this->app->user()->is_level(0) && ($lunas===0 || ($lunas===1 && $this->mode_tampil===1))) {
|
||||||
|
$obj->add_row_btn("trash", "Hapus", "GELHutangJS.bayar_hapus", "No_Beli", $this->no_beli);
|
||||||
|
}
|
||||||
|
if ($lunas === 0) {
|
||||||
|
$obj->set_func_btn("GELHutangJS.bayar_show", '<i class="bi-wallet me-1"></i> Pembayaran');
|
||||||
|
}
|
||||||
|
$ajson[] = $obj->json_table("divDetailBayar");
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function brow_sup() {
|
||||||
|
$tcari = Param::Get("Cari_Sup");
|
||||||
|
$tsql = 'Lunas>0'; $asql = [];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql .= " AND CONCAT(Kode_Sup,Nama_Sup,Telp_Sup) LIKE ?";
|
||||||
|
$asql[] = '%' . $tcari . '%';
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("para_supplier", "*", $tsql, $asql);
|
||||||
|
$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->set_func_select("GELHutangJS.sup_select");
|
||||||
|
$this->app->json([ $obj->db_table("divBrowSup") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function auto_sup() {
|
||||||
|
$tcari = Param::Get("Auto_Query");
|
||||||
|
$ajson['autodata'] = [];
|
||||||
|
$stat = $this->db->runQuery("SELECT * FROM para_supplier WHERE Lunas>0 AND CONCAT(Kode_Sup,Nama_Sup,Telp_Sup) LIKE ? ORDER BY Kode_Sup LIMIT 50", ['%'.$tcari.'%']);
|
||||||
|
while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$ajson['autodata'][] = ['value'=>$row['SupID'], 'text'=>$row['Nama_Sup'], 'html'=>'<span class="text-primary">'.$row['Kode_Sup'].'</span> '.$row['Nama_Sup'], 'data'=>$row['Alamat_Sup'], 'bc'=>0];
|
||||||
|
}
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_master() {
|
||||||
|
$ajson = [ 'error'=>"", 'html'=>"" ];
|
||||||
|
$atabel = [ 'SupID'=>0, 'Nama_Sup'=>"", 'Alamat_Sup'=>"" ];
|
||||||
|
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$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"><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" >';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_nota() {
|
||||||
|
$tipe = Param::Get("Tipe_Nota", "B");
|
||||||
|
$atabel = [ 'No_Beli'=>$this->no_beli ];
|
||||||
|
if (!empty($this->no_beli)) {
|
||||||
|
$atabel = $this->db->fetchRow("SELECT *,Real_Beli+Real_Diskon Sub_Total,Real_Beli-Total_Bayar-Total_Potong Sisa_Bayar FROM inv_beli WHERE No_Beli=?", [$this->no_beli]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$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);
|
||||||
|
$tsubtot = $form->textbox("_", "Real_Beli", $atabel['Sub_Total'], false, false, "double");
|
||||||
|
$tdiskon = $form->textbox("_", "Ral_Diskon", $atabel['Real_Diskon'], false, false, "double");
|
||||||
|
$tjumlah = $form->textbox("_", "Jumlah", $atabel['Real_Beli'], 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")?"Transaksi":"Retur").'</label>
|
||||||
|
<div class="col-sm-8 col-lg-4">'.$tsubtot.'</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 Diskon</label>
|
||||||
|
<div class="col-sm-8 col-lg-4">'.$tdiskon.'</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">Total Faktur</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">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.'" >';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_bayar() {
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$ttglbyr = $form->datebox("_", "Tgl_Bayar", tgl_ymd(), true, false);
|
||||||
|
$trek = $form->option_db("_", "Kode_Rek", $this->app_gel['KAS_TUNAI'], true, false, "vi_gel_acc", ["Kode_Rek","Nama_Lengkap"], "Kas_Rek=1 AND Aktif=1 AND Mode='D' ORDER BY Kode_Rek");
|
||||||
|
$ttotal = $form->textbox("_", "Temp_Total", Param::Get("Total_Sisa",0), false, false, "double");
|
||||||
|
$tbayar = $form->textbox("_", "Total_Bayar", Param::Get("Total_Sisa",0), true, false, "double");
|
||||||
|
$tpotong = $form->textbox("_", "Total_Potong", 0, true, false, "double");
|
||||||
|
$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" for="Kode_Rek">Rekening Kredit</label>
|
||||||
|
<div class="col">'.$trek.'</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">Jumlah Sisa</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>';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$this->app->json(['html' => '
|
||||||
|
<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-journal-bookmark me-2"></i>Transaksi Pembayaran Hutang Supplier</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"> </div>
|
||||||
|
<div id="divTXNota"> </div>
|
||||||
|
<div id="divDetailNota" class="d-none"> </div>
|
||||||
|
<div id="divDetailBayar" class="d-none"> </div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div></div>
|
||||||
|
</div>'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,252 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Gel/KaryaController
|
||||||
|
Description : Transaksi Pinjaman Karyawan
|
||||||
|
Created By : Siau Pheng ([email protected]).
|
||||||
|
Created Date : September 9th, 2014.
|
||||||
|
Last Modified : September 14th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Gel;
|
||||||
|
|
||||||
|
use App\Utils\Gel;
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use flight\Session;
|
||||||
|
use Webapp\DB\SQL;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
use Webapp\Web\Table;
|
||||||
|
|
||||||
|
class KaryaController {
|
||||||
|
|
||||||
|
private array $app_gel;
|
||||||
|
private string $mode;
|
||||||
|
private string $mode_detail;
|
||||||
|
private int $id_karya;
|
||||||
|
private int $is_pinjam;
|
||||||
|
private string $no_trans;
|
||||||
|
private Gel $gel;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->app_gel = (array) $session->get('APP_GEL');
|
||||||
|
$this->mode = Param::Get("mode", "");
|
||||||
|
$this->mode_detail = Param::Get("mode_detail", "");
|
||||||
|
$this->id_karya = Param::Int("KaryaID", 0);
|
||||||
|
$this->is_pinjam = Param::Int("is_pinjam", 0);
|
||||||
|
$this->no_trans = Param::Get("No_Trans", "");
|
||||||
|
$this->gel = new Gel($app);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function table_karya() {
|
||||||
|
if (in_array($this->mode_detail, ["insert","update","delete"])) {
|
||||||
|
$sql = new SQL($this->app);
|
||||||
|
$sql->set_table("gel_karyawan");
|
||||||
|
$sql->add_param_date("Tgl_Trans");
|
||||||
|
$sql->add_param("Catatan");
|
||||||
|
$sql->add_param_userid();
|
||||||
|
$sql->add_where("No_Trans", $this->no_trans);
|
||||||
|
|
||||||
|
$tgl_trans = Param::Get("Tgl_Trans");
|
||||||
|
if ($this->mode_detail === "insert") {
|
||||||
|
$this->no_trans = $this->gel->Karya_Baru($tgl_trans);
|
||||||
|
$sql->add_param("No_Trans", $this->no_trans);
|
||||||
|
$sql->add_param("KaryaID");
|
||||||
|
|
||||||
|
// PROSES POSTING GL
|
||||||
|
if ($this->is_pinjam === 1) {
|
||||||
|
$sql->add_param("Total_Pinjam");
|
||||||
|
$tcat = "Pinjaman Karyawan : "; $ddk = "D"; $kdk = "K";
|
||||||
|
} else {
|
||||||
|
$sql->add_param("Total_Bayar");
|
||||||
|
$tcat = "Pembayaran Karyawan : "; $ddk = "K"; $kdk = "D";
|
||||||
|
}
|
||||||
|
$sql->InsertDB();
|
||||||
|
|
||||||
|
$tot_jumlah = (float) Param::Get("Total_Bayar", 0) + (float) Param::Get("Total_Pinjam", 0);
|
||||||
|
$ajurnal = [
|
||||||
|
'TipeID' => 13,
|
||||||
|
'Tanggal' => $tgl_trans,
|
||||||
|
'Kode_Ref' => $this->no_trans,
|
||||||
|
'Catatan' => $tcat.(string) Param::Get("Nama_Karya").", Untuk : ".(string) Param::Get("Catatan")
|
||||||
|
];
|
||||||
|
$adetail = [];
|
||||||
|
$adetail[] = [
|
||||||
|
'Kode_Rek' => $this->app_gel['PIU_KARYA'],
|
||||||
|
'DK' => $ddk,
|
||||||
|
'Jumlah' => $tot_jumlah
|
||||||
|
];
|
||||||
|
$adetail[] = [
|
||||||
|
'Kode_Rek' => (string) Param::Get("Kode_Rek"),
|
||||||
|
'DK' => $kdk,
|
||||||
|
'Jumlah' => $tot_jumlah
|
||||||
|
];
|
||||||
|
$kode_jurnal = $this->gel->Jurnal_Post($ajurnal, $adetail);
|
||||||
|
$this->db->update("gel_karyawan", [ 'Kode_Jurnal'=>$kode_jurnal ], "No_Trans=?", [ $this->no_trans ]);
|
||||||
|
|
||||||
|
} else if ($this->mode_detail === "delete") {
|
||||||
|
$sql->DeleteDB();
|
||||||
|
// PROSES POSTING GL
|
||||||
|
$kode_jurnal = $this->db->fetchField("SELECT Kode_Jurnal FROM gel_karyawan WHERE No_Trans=?", [ $this->no_trans ]) ?? '';
|
||||||
|
if (!empty($kode_jurnal)) {
|
||||||
|
$this->db->delete("gel_jurnal", "Kode_Jurnal=?", [ $kode_jurnal ]);
|
||||||
|
$this->db->delete("gel_jurnal_detail", "Kode_Jurnal=?", [ $kode_jurnal ]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$ipinjam = (float) $this->db->fetchField("SELECT SUM(Total_Pinjam-Total_Bayar) FROM gel_karyawan WHERE KaryaID=?", [ $this->id_karya ]) ?? 0;
|
||||||
|
$this->db->update("para_karyawan", ['Total_Pinjam'=>$ipinjam], "KaryaID=?", [ $this->id_karya ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("gel_karyawan", "*", "KaryaID=?", [ $this->id_karya ]);
|
||||||
|
$obj->set_footer("SUM(Total_Pinjam) Total_Pinjam,SUM(Total_Bayar) Total_Bayar");
|
||||||
|
$obj->add_field("No_Trans", "No. Trans", "c");
|
||||||
|
$obj->add_field("Tgl_Trans", "Tgl. Trans", "c", "sqltgl", "", "val-tgl");
|
||||||
|
$obj->add_field("Kode_Jurnal", "Kode Jurnal", "c");
|
||||||
|
$obj->add_field("Total_Pinjam", "Pinjaman", "r", "rupiah", "rupiah");
|
||||||
|
$obj->add_field("Total_Bayar", "Setoran", "r", "rupiah", "rupiah");
|
||||||
|
$obj->add_field("Catatan", "Catatan", "awr");
|
||||||
|
$obj->set_field_order("Tgl_Trans", "A");
|
||||||
|
$obj->add_row_btn("trash", "Hapus", "GELKaryaJS.karya_hapus", "Kunci", 0);
|
||||||
|
$this->app->json([ $obj->json_table("divTXKarya") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_master() {
|
||||||
|
$ajson = [ 'error'=>"", 'html'=>"" ];
|
||||||
|
$atabel = ['KaryaID'=>0, 'Total_Pinjam'=>0, 'Tot_Pinjam'=>0, 'Tot_Bayar'=>0];
|
||||||
|
|
||||||
|
if ($this->id_karya > 0) {
|
||||||
|
$row = $this->db->fetchRow("SELECT * FROM para_karyawan WHERE KaryaID=?", [ $this->id_karya ]);
|
||||||
|
if ($row) {
|
||||||
|
$atabel = $row->getData();
|
||||||
|
if ((int) $atabel['KaryaID'] > 0) {
|
||||||
|
$_tot = $this->db->fetchRow("SELECT SUM(Total_Pinjam) Tot_Pinjam,SUM(Total_Bayar) Tot_Bayar FROM gel_karyawan WHERE KaryaID=?", [ $atabel['KaryaID'] ]);
|
||||||
|
if ($_tot) $atabel = array_merge($atabel, $_tot->getData());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$ajson['error'] = "Nomor Transaksi belum ada / tidak diketemukan !";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$ket_saldo = ((float) $atabel['Total_Pinjam'] > 0) ? "Saldo Pinjaman" : "Saldo Simpanan";
|
||||||
|
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tkary = $form->option_db("_", "KaryaID", $atabel['KaryaID'], true, false, "para_karyawan", ["KaryaID","Nama_Karya"], "Aktif=1 ORDER BY Nama_Karya", null, null, "GELKaryaJS.ocKarya");
|
||||||
|
$ttot_pin = '<input type="double" class="form-control text-end" id="Tot_Pinjam" value="'.rupiah($atabel['Tot_Pinjam']).'" readonly="">';
|
||||||
|
$ttot_bay = '<input type="double" class="form-control text-end" id="Tot_Bayar" value="'.rupiah($atabel['Tot_Bayar']).'" readonly="">';
|
||||||
|
$tpinjam = '<input type="double" class="form-control text-end '.((float) $atabel['Total_Pinjam'] > 0?'text-danger':'text-primary').'" id="Jumlah_Pinjam" value="'.rupiah($atabel['Total_Pinjam']).'" readonly="">';
|
||||||
|
$ajson['html'] = '
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-12 col-lg-7">
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-5 col-lg-3 col-form-label" for="KaryaID">Nama Karyawan</label>
|
||||||
|
<div class="col-sm-7 col-lg-7">'.$tkary.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-5 col-lg-3 col-form-label">'.$ket_saldo.'</label>
|
||||||
|
<div class="col-sm-7 col-lg-6">'.$tpinjam.'</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-sm-12 col-lg-5">
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-5 col-lg-4 col-form-label">Jumlah Pinjaman</label>
|
||||||
|
<div class="col">'.$ttot_pin.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-5 col-lg-4 col-form-label">Jumlah Setoran</label>
|
||||||
|
<div class="col">'.$ttot_bay.'</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row"><div class="col"><hr class="my-1"></div></div>';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_pinjam() {
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$ttgltran = $form->datebox("_", "Tgl_Trans", tgl_ymd(), true, false);
|
||||||
|
$trek = $form->option_db("_", "Kode_Rek", $this->app_gel['KAS_TUNAI'], true, false, "vi_gel_acc", ["Kode_Rek","Nama_Lengkap"], "Kas_Rek=1 AND Aktif=1 AND Mode='D' ORDER BY Kode_Rek");
|
||||||
|
$tpinjam = $form->textbox("_", "Total_Pinjam", 0, true, false, "double");
|
||||||
|
$tcatat = $form->textarea("_", "Catatan", "", true, false, 2);
|
||||||
|
$ajson['html'] = '
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-6 col-lg-4 col-form-label" for="Tgl_Trans">Tanggal Transaksi</label>
|
||||||
|
<div class="col-sm-8 col-lg-6">'.$ttgltran.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-6 col-lg-4 col-form-label" for="Kode_Rek">Rekening Kredit</label>
|
||||||
|
<div class="col">'.$trek.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-6 col-lg-4 col-form-label" for="Total_Pinjam">Jumlah Pinjaman</label>
|
||||||
|
<div class="col-sm-8 col-lg-6">'.$tpinjam.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-6 col-lg-4 col-form-label" for="Catatan">Keterangan</label>
|
||||||
|
<div class="col">'.$tcatat.'</div>
|
||||||
|
</div>';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_bayar() {
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$ttgltran = $form->datebox("_", "Tgl_Trans", tgl_ymd(), true, false);
|
||||||
|
$trek = $form->option_db("_", "Kode_Rek", $this->app_gel['KAS_TUNAI'], true, false, "vi_gel_acc", ["Kode_Rek","Nama_Lengkap"], "Kas_Rek=1 AND Aktif=1 AND Mode='D' ORDER BY Kode_Rek");
|
||||||
|
$tbayar = $form->textbox("_", "Total_Bayar", 0, true, false, "double");
|
||||||
|
$tcatat = $form->textarea("_", "Catatan", "", true, false, 2);
|
||||||
|
$ajson['html'] = '
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-6 col-lg-4 col-form-label" for="Tgl_Trans">Tanggal Transaksi</label>
|
||||||
|
<div class="col-sm-8 col-lg-6">'.$ttgltran.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-6 col-lg-4 col-form-label" for="Kode_Rek">Rekening Debit</label>
|
||||||
|
<div class="col">'.$trek.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-6 col-lg-4 col-form-label" for="Total_Bayar">Jumlah Pembayaran</label>
|
||||||
|
<div class="col-sm-8 col-lg-6">'.$tbayar.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-6 col-lg-4 col-form-label" for="Catatan">Keterangan</label>
|
||||||
|
<div class="col">'.$tcatat.'</div>
|
||||||
|
</div>';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$this->app->json(['html' => '
|
||||||
|
<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-journal-bookmark me-2"></i>Transaksi Simpan / Pinjam Karyawan</button>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item ms-auto">
|
||||||
|
<button class="btn btn-warning mb-1 ms-2" id="butPinjam" type="button"><i class="bi-box-arrow-in-right me-2"></i>Pinjam</button>
|
||||||
|
<button class="btn btn-success mb-1 ms-2" id="butBayar" type="button"><i class="bi-box-arrow-in-left me-2"></i>Bayar</button>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<div class="tab-content border border-top-0 p-3">
|
||||||
|
<div class="tab-pane fade active show" id="tx" role="tabpanel" aria-labelledby="tx-tab">
|
||||||
|
<div id="divTXMaster"> </div>
|
||||||
|
<div id="divTXKarya"> </div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div></div>
|
||||||
|
</div>'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,302 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Gel/KeluarController
|
||||||
|
Description : Jurnal Pengeluaran Kas / Bank
|
||||||
|
Created By : Siau Pheng ([email protected]).
|
||||||
|
Created Date : May 22th, 2010.
|
||||||
|
Last Modified : September 10th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Gel;
|
||||||
|
|
||||||
|
use App\Utils\Gel;
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use flight\Session;
|
||||||
|
use Webapp\DB\SQL;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
use Webapp\Web\Table;
|
||||||
|
|
||||||
|
class KeluarController {
|
||||||
|
|
||||||
|
private array $web_app;
|
||||||
|
private array $app_gel;
|
||||||
|
private int $id_cab;
|
||||||
|
private string $mode;
|
||||||
|
private string $mode_detail;
|
||||||
|
private string $kode_jurnal;
|
||||||
|
private string $kode_rek;
|
||||||
|
private Gel $gel;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->web_app = (array) $session->get('WEB_APP');
|
||||||
|
$this->app_gel = (array) $session->get('APP_GEL');
|
||||||
|
$this->id_cab = Param::Int("CabID", $session->get('APP_INV')['CABANGID']);
|
||||||
|
$this->mode = Param::Get("mode", "");
|
||||||
|
$this->mode_detail = Param::Get("mode_detail", "");
|
||||||
|
$this->kode_jurnal = Param::Get("Kode_Jurnal", "");
|
||||||
|
$this->kode_rek = Param::Get("Kode_Rek", "");
|
||||||
|
$this->gel = new Gel($app);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function table_detail() {
|
||||||
|
if (in_array($this->mode_detail, ["insert","update","delete"])) {
|
||||||
|
$sql = new SQL($this->app);
|
||||||
|
$sql->set_table("tmp_gel_jurnal_detail");
|
||||||
|
$sql->add_param("Kode_Rek");
|
||||||
|
$sql->add_param("DK", "K");
|
||||||
|
$sql->add_param("Jumlah");
|
||||||
|
$sql->add_param_unix();
|
||||||
|
$sql->add_param_userid();
|
||||||
|
$sql->add_where("Kode_Jurnal");
|
||||||
|
$sql->add_where("ID");
|
||||||
|
|
||||||
|
if ($this->mode_detail === "insert") {
|
||||||
|
$sql->add_param("Kode_Jurnal");
|
||||||
|
$sql->InsertDB();
|
||||||
|
} else if ($this->mode_detail === "update") {
|
||||||
|
$sql->UpdateDB();
|
||||||
|
} else if ($this->mode_detail === "delete") {
|
||||||
|
$sql->DeleteDB();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$tsql = ''; $asql = [$this->kode_jurnal, "D"]; $qtabel = "gel_jurnal_detail";
|
||||||
|
if (in_array($this->mode, ["add","edit"])) {
|
||||||
|
if ($this->mode === "add") { $tsql = " AND Unix=?"; $asql[] = $this->app->user()->unix(); }
|
||||||
|
$qtabel = "tmp_gel_jurnal_detail";
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("(SELECT * FROM ".$qtabel." WHERE Kode_Jurnal=? AND DK=?".$tsql.") D LEFT JOIN gel_acc A ON (D.Kode_Rek=A.Kode_Rek)", "D.*,D.Jumlah Jumlah2,A.Nama_Rek", "", $asql);
|
||||||
|
$obj->set_footer("SUM(Jumlah) Jumlah2, COUNT(*) Kode_Rek");
|
||||||
|
$obj->add_field("ID", "ID", "hid");
|
||||||
|
$obj->add_field("Kode_Rek", "Kode", "c", "", "records");
|
||||||
|
$obj->add_field("Nama_Rek", "Rekening Debit", "awr");
|
||||||
|
$obj->add_field("Jumlah2", "Jumlah", "r", "kurung", "kurung");
|
||||||
|
$obj->set_field_order("Kode_Rek", "A");
|
||||||
|
if (in_array($this->mode, ["add","edit"])) {
|
||||||
|
$obj->add_row_btn("clipboard", "Ubah", "GELKeluarJS.detail_ubah");
|
||||||
|
$obj->add_row_btn("trash", "Hapus", "GELKeluarJS.detail_hapus", "Unix", $this->app->user()->unix());
|
||||||
|
$obj->set_func_btn("GELKeluarJS.detail_tambah", '<i class="bi-plus-lg me-1"></i> Rekening');
|
||||||
|
$obj->set_func_btn("GELKeluarJS.rek_brow", '<i class="bi-table me-1"></i> Browse');
|
||||||
|
}
|
||||||
|
|
||||||
|
$nitems = (int) $this->db->fetchField("SELECT COUNT(*) FROM ".$qtabel." WHERE Kode_Jurnal=? AND DK=?".$tsql, $asql) ?? 0;
|
||||||
|
$this->app->json([ $obj->json_table("divDetailTabel"), ['type'=>"form", 'id'=>"Total_Item", 'value'=>$nitems] ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function brow_tx() {
|
||||||
|
$tcari = Param::Get("Cari_TX");
|
||||||
|
$tsql = 'TipeID=3'; $asql = [];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql .= " AND CONCAT(Kode_Jurnal,DATE_FORMAT(Tanggal,'%d-%m-%Y'),Kode_Ref,Catatan) LIKE ?";
|
||||||
|
$asql[] = '%' . $tcari . '%';
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("gel_jurnal", "*", $tsql, $asql);
|
||||||
|
$obj->add_field("Kode_Jurnal", "Kode Jurnal", "c");
|
||||||
|
$obj->add_field("Tanggal", "Tanggal", "c", "sqltgl", "", "val-tgl");
|
||||||
|
$obj->add_field("Kode_Ref", "Kode Ref.", "l");
|
||||||
|
$obj->add_field("Catatan", "Deskripsi", "awr");
|
||||||
|
$obj->set_field_order("Kode_Jurnal", "D");
|
||||||
|
$obj->set_func_select("GELKeluarJS.tx_select");
|
||||||
|
$this->app->json([ $obj->db_table("divBrowTX") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function brow_rek() {
|
||||||
|
$tcari = Param::Get("Cari_Rek");
|
||||||
|
$tsql = 'Aktif=1 AND Mode="D"'; $asql = [];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql .= " AND CONCAT(Kode_Rek,Nama_Rek) LIKE ?";
|
||||||
|
$asql[] = '%' . $tcari . '%';
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("gel_acc", "*", $tsql, $asql);
|
||||||
|
$obj->add_field("Kode_Rek", "Kode", "c");
|
||||||
|
$obj->add_field("Nama_Rek", "Nama Rekening", "awr");
|
||||||
|
$obj->add_field("Level", "Level", "c");
|
||||||
|
$obj->set_field_order("Kode_Rek", "A");
|
||||||
|
$obj->set_func_select("GELKeluarJS.rek_select");
|
||||||
|
$this->app->json([ $obj->db_table("divBrowRek") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function auto_rek() {
|
||||||
|
$tcari = Param::Get("Auto_Query");
|
||||||
|
$ajson['autodata'] = [];
|
||||||
|
$stat = $this->db->runQuery("SELECT Kode_Rek,Nama_Rek,CONCAT(Kode_Rek,' - ',Nama_Rek) Nama_Lengkap FROM gel_acc WHERE Aktif=1 AND Mode='D' AND CONCAT(Kode_Rek,Nama_Rek) LIKE ? ORDER BY Kode_Rek LIMIT 50", ['%'.$tcari.'%']);
|
||||||
|
while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$ajson['autodata'][] = ['value'=>$row['Kode_Rek'], 'text'=>$row['Nama_Rek'], 'html'=>'<span class="text-primary">'.$row['Kode_Rek'].'</span> '.$row['Nama_Rek'], 'data'=>"", 'bc'=>0];
|
||||||
|
}
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_master() {
|
||||||
|
$ajson = [ 'error'=>"", 'html'=>"" ];
|
||||||
|
$atabel = [ 'Kode_Jurnal'=>"", 'CabID'=>$this->id_cab, 'Kode_Ref'=>"", 'Tanggal'=>tgl_ymd(), 'Kode_Kas'=>"", 'Catatan'=>"" ];
|
||||||
|
|
||||||
|
if ($this->mode === "add") {
|
||||||
|
$atabel['Kode_Jurnal'] = "GK-BARU#".(string) $this->web_app['SERVER_ID']. $this->app->user()->id(3);
|
||||||
|
$atabel['Tanggal'] = tgl_ymd();
|
||||||
|
$atabel['Kode_Kas'] = $this->app_gel['KAS_TUNAI'];
|
||||||
|
$this->kode_jurnal = "";
|
||||||
|
|
||||||
|
} else if ($this->mode === "edit") {
|
||||||
|
$this->gel->Detail_Copy($this->kode_jurnal);
|
||||||
|
|
||||||
|
} else if ($this->mode === "save") {
|
||||||
|
$no_lama = $this->kode_jurnal;
|
||||||
|
$tgl_jurn = Param::Get("Tanggal");
|
||||||
|
$b_baru = str_contains($no_lama, "BARU");
|
||||||
|
if ($b_baru) $this->kode_jurnal = $this->gel->Jurnal_Baru($this->id_cab, $tgl_jurn, true);
|
||||||
|
|
||||||
|
$kode_kas = Param::Get("Kode_Kas");
|
||||||
|
$this->db->runQuery("DELETE FROM tmp_gel_jurnal_detail WHERE Kode_Jurnal='".$no_lama."' AND LEFT(Kode_Rek,1)='1' AND DK='K'");
|
||||||
|
$ntot_kas = $this->db->fetchField("SELECT SUM(-Jumlah) FROM tmp_gel_jurnal_detail WHERE Kode_Jurnal=? AND Unix=?", [$no_lama, $this->app->user()->unix()]) ?? 0;
|
||||||
|
$this->db->insert("tmp_gel_jurnal_detail", [ 'Kode_Jurnal'=>$no_lama, 'Kode_Rek'=>$kode_kas, 'DK'=>'K', 'Jumlah'=>$ntot_kas,'Unix'=>$this->app->user()->unix(), 'UserID'=>$this->app->user()->id() ]);
|
||||||
|
$this->gel->Detail_Save($this->kode_jurnal, 3, $this->id_cab, $tgl_jurn, $b_baru, $no_lama);
|
||||||
|
$this->gel->Jurnal_Save($this->kode_jurnal, 3, $this->id_cab, $tgl_jurn, Param::Get("Kode_Ref"), Param::Get("Catatan"));
|
||||||
|
$atabel['Tanggal'] = $tgl_jurn;
|
||||||
|
$this->mode = "view";
|
||||||
|
|
||||||
|
} else if ($this->mode === "cancel") {
|
||||||
|
$this->gel->Detail_Cancel($this->kode_jurnal);
|
||||||
|
$this->mode = "view";
|
||||||
|
$this->kode_jurnal = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!empty($this->kode_jurnal) && $this->mode !== "cancel") {
|
||||||
|
$row = $this->db->fetchRow("SELECT * FROM gel_jurnal WHERE Kode_Jurnal='".$this->kode_jurnal."' AND TipeID=3");
|
||||||
|
if ($row) {
|
||||||
|
$atabel = $row;
|
||||||
|
$atabel['Kode_Kas'] = $this->db->fetchField("SELECT Kode_Rek FROM gel_jurnal_detail WHERE Kode_Jurnal='".$atabel['Kode_Jurnal']."' AND DK='K' LIMIT 1") ?? '';
|
||||||
|
} else {
|
||||||
|
$ajson['error'] = "Nomor Transaksi belum ada / tidak diketemukan !";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$enable = in_array($this->mode, ["add","edit"]) ? true : false;
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tkode = $form->textbox("_", "Kode_Jurnal", $atabel['Kode_Jurnal'], !$enable, false, "text", "kode jurnal");
|
||||||
|
$tref = $form->textbox("_", "Kode_Ref", $atabel['Kode_Ref'], $enable, false, "text", "kode referensi");
|
||||||
|
$ttgl = $form->datebox("_", "Tanggal", $atabel['Tanggal'], $enable, false);
|
||||||
|
$tcab = $form->option_db("_", "CabID", $atabel['CabID'], $enable, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID");
|
||||||
|
$tkas = $form->option_db("_", "Kode_Kas", $atabel['Kode_Kas'], $enable, false, "vi_gel_acc", ["Kode_Rek","Nama_Lengkap"], "Kas_Rek=1 AND Aktif=1 AND Mode='D' ORDER BY Kode_Rek");
|
||||||
|
$tcatat = $form->textbox("_", "Catatan", stripslashes($atabel['Catatan']), $enable, false, "text", "catatan jurnal");
|
||||||
|
$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="Kode_Jurnal">Kode Jurnal</label>
|
||||||
|
<div class="col-sm-7 col-lg-7"><div class="input-group">'.$tkode.'<button id="butBrow" class="btn btn-info" type="button"><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="Tanggal">Tanggal Jurnal</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="Kode_Ref">Kode Ref.</label>
|
||||||
|
<div class="col">'.$tref.'</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-3 col-lg-2 col-form-label" for="Catatan" style="width:12.5%;">Deskripsi</label>
|
||||||
|
<div class="col">'.$tcatat.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-3 col-lg-2 col-form-label" for="Kode_Kas" style="width:12.5%;">Rekening Kredit</label>
|
||||||
|
<div class="col-sm-7 col-lg-6">'.$tkas.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1"><div class="col"><hr class="my-1"></div></div>
|
||||||
|
<input type="hidden" id="Total_Item" value="0" >
|
||||||
|
<input type="hidden" id="mode" value="'.$this->mode.'" >';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_rek() {
|
||||||
|
$id = (int) Param::Get("ID", 0);
|
||||||
|
$atabel = [ 'ID'=>$id, 'Kode_Rek'=>$this->kode_rek, 'Nama_Rek'=>"", 'Jumlah'=>0 ];
|
||||||
|
if ($id > 0) {
|
||||||
|
$atabel = $this->db->fetchRow("SELECT * FROM tmp_gel_jurnal_detail WHERE Kode_Jurnal=? AND ID=?", [$this->kode_jurnal, $id]);
|
||||||
|
}
|
||||||
|
if (!empty($atabel['Kode_Rek'])) {
|
||||||
|
$atabel['Nama_Rek'] = $this->db->fetchField("SELECT Nama_Rek FROM gel_acc WHERE Kode_Rek=?", [$atabel['Kode_Rek']]) ?? '';
|
||||||
|
}
|
||||||
|
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tkode = $form->textbox("_", "Kode_Rek", $atabel['Kode_Rek'], false, false, "text");
|
||||||
|
$tnama = $form->textauto("_", "Nama_Rek", ['value'=>$atabel['Kode_Rek'],'text'=>$atabel['Nama_Rek']], true, true, "ketik kode / nama rekening");
|
||||||
|
$tjumlah = $form->textbox("_", "Jumlah", abs($atabel['Jumlah']), true, true, "double");
|
||||||
|
|
||||||
|
$ajson['html'] = '
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label">Kode Rekening</label>
|
||||||
|
<div class="col-sm-4 col-lg-3">'.$tkode.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="Nama_Rek">Nama Rekening</label>
|
||||||
|
<div class="col">'.$tnama.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="Jumlah">Jumlah (Rp.)</label>
|
||||||
|
<div class="col-sm-4 col-lg-5">'.$tjumlah.'</div>
|
||||||
|
</div>
|
||||||
|
<input type="hidden" id="ID" value="'.$atabel['ID'].'" >
|
||||||
|
<input type="hidden" id="mode_detail" value="'.$this->mode_detail.'" >';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function proses_hapus() {
|
||||||
|
$this->db->runQuery("DELETE FROM gel_jurnal WHERE Kode_Jurnal='".$this->kode_jurnal."'");
|
||||||
|
$this->db->runQuery("DELETE FROM gel_jurnal_detail WHERE Kode_Jurnal='".$this->kode_jurnal."'");
|
||||||
|
$this->app->json([ 'status' => true ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$this->app->json(['html' => '
|
||||||
|
<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-journal-bookmark me-2"></i>Jurnal Pengeluaran Kas / Bank</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-danger mb-1 ms-2" id="butBatal" type="button"><i class="bi-x-lg me-2"></i>Batal</button>
|
||||||
|
<button class="btn btn-success mb-1 ms-2" id="butSimpan" type="button"><i class="bi-save me-2"></i>Simpan</button>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<div class="tab-content border border-top-0 p-3">
|
||||||
|
<div class="tab-pane fade active show" id="tx" role="tabpanel" aria-labelledby="tx-tab">
|
||||||
|
<div id="divTXMaster"> </div>
|
||||||
|
<div id="divDetailTabel"> </div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div></div>
|
||||||
|
</div>'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,329 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Gel/PiutangController
|
||||||
|
Description : Transaksi Penerimaan Piutang Buyer / Member
|
||||||
|
Created By : Siau Pheng ([email protected]).
|
||||||
|
Created Date : March 7th, 2011.
|
||||||
|
Last Modified : September 13th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Gel;
|
||||||
|
|
||||||
|
use App\Utils\Gel;
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use flight\Session;
|
||||||
|
use Webapp\DB\SQL;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
use Webapp\Web\Table;
|
||||||
|
|
||||||
|
class PiutangController {
|
||||||
|
|
||||||
|
private array $app_gel;
|
||||||
|
private string $mode;
|
||||||
|
private string $mode_detail;
|
||||||
|
private int $id_buyer;
|
||||||
|
private string $no_jual;
|
||||||
|
private int $mode_tampil;
|
||||||
|
private Gel $gel;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->app_gel = (array) $session->get('APP_GEL');
|
||||||
|
$this->mode = Param::Get("mode", "");
|
||||||
|
$this->mode_detail = Param::Get("mode_detail", "");
|
||||||
|
$this->id_buyer = Param::Int("MemberID", 0);
|
||||||
|
$this->no_jual = Param::Get("No_Jual", "");
|
||||||
|
$this->mode_tampil = Param::Int("Mode_Tampil", 0);
|
||||||
|
$this->gel = new Gel($app);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function table_nota() {
|
||||||
|
$tsql = 'FALSE'; $asql = [];
|
||||||
|
if ($this->id_buyer > 0) {
|
||||||
|
$tsql = 'MemberID=?';
|
||||||
|
$asql[] = $this->id_buyer;
|
||||||
|
if ($this->mode_tampil === 0) {
|
||||||
|
$tsql .= " AND Lunas=0";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("(SELECT No_Jual,Tgl_Jual,Total_Jual,Total_Diskon,Total_Jual-Total_Diskon Total,Total_Bayar+Total_Potong Bayar,Total_Jual-Total_Diskon-Total_Bayar-Total_Potong Sisa,IF(Data_Jual=1,'J','R') Tipe,CabID,Lunas FROM inv_jual WHERE ".$tsql.") J LEFT JOIN para_cabang C ON (C.CabID=J.CabID)", "J.*,C.Nama_Cab", "", $asql);
|
||||||
|
$obj->set_footer("SUM(J.Total) Total,SUM(J.Bayar) Bayar,SUM(J.Sisa) Sisa");
|
||||||
|
$obj->add_field("Tipe", "Tipe", "hid");
|
||||||
|
$obj->add_field("No_Jual", "No. Trans", "c");
|
||||||
|
$obj->add_field("Tgl_Jual", "Tgl. Trans", "c", "sqltgl", "", "val-tgl");
|
||||||
|
$obj->add_field("Nama_Cab", "Cabang", "l");
|
||||||
|
$obj->add_field("Total_Jual", "Sub. Total", "r", "rupiah", "rupiah");
|
||||||
|
$obj->add_field("Total_Diskon", "Diskon", "r", "rupiah");
|
||||||
|
$obj->add_field("Total", "TOTAL", "r", "rupiah", "rupiah");
|
||||||
|
$obj->add_field("Bayar", "BAYAR", "r", "rupiah", "rupiah");
|
||||||
|
$obj->add_field("Sisa", "SISA", "r", "rupiah", "rupiah");
|
||||||
|
if ($this->mode_tampil === 1) $obj->add_field("Lunas", "Lunas", "c", "checkbox");
|
||||||
|
$obj->set_field_order("No_Jual", "A");
|
||||||
|
$obj->add_row_btn("save", "Pilih", "GELPiutangJS.nota_select");
|
||||||
|
$this->app->json([ $obj->json_table("divTXNota") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function table_bayar() {
|
||||||
|
$ajson = [];
|
||||||
|
$lunas = (int) Param::Get("Lunas", 0);
|
||||||
|
if (in_array($this->mode_detail, ["insert","update","delete"])) {
|
||||||
|
$sql = new SQL($this->app);
|
||||||
|
$sql->set_table("inv_jual_lunas");
|
||||||
|
$sql->add_param("No_Jual");
|
||||||
|
$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_Jual", $this->no_jual);
|
||||||
|
|
||||||
|
$tgl_bayar = Param::Get("Tgl_Bayar", "00-00-0000");
|
||||||
|
|
||||||
|
if ($this->mode_detail === "insert") {
|
||||||
|
$ajual = $this->db->fetchRow("SELECT CabID,MemberID FROM inv_jual WHERE No_Jual=?", [$this->no_jual]) ?? ['CabID'=>0, 'MemberID'=>0];
|
||||||
|
$sql->add_param("CabID", $ajual['CabID']);
|
||||||
|
$sql->add_param("MemberID", $ajual['MemberID']);
|
||||||
|
$sql->InsertDB();
|
||||||
|
$id_bayar = $sql->LastInsertID();
|
||||||
|
|
||||||
|
// PROSES POSTING GL
|
||||||
|
if (Param::Get("Tipe_Nota","J")==="J") {
|
||||||
|
$tcat = "Penerimaan Nota : "; $ddk = "D"; $kdk = "K";
|
||||||
|
} else {
|
||||||
|
$tcat ="Retur Nota : "; $ddk = "K"; $kdk = "D";
|
||||||
|
}
|
||||||
|
$tot_bayar = (float) Param::Get("Total_Bayar", 0);
|
||||||
|
$tot_potong = (float) Param::Get("Total_Potong", 0);
|
||||||
|
$ajurnal = [
|
||||||
|
'Kode_Jurnal' => "",
|
||||||
|
'TipeID' => 11,
|
||||||
|
'CabID' => $ajual['CabID'],
|
||||||
|
'Tanggal' => $tgl_bayar,
|
||||||
|
'Kode_Ref' => $this->no_jual,
|
||||||
|
'Catatan' => $tcat . Param::Get("Nama_Member", "")
|
||||||
|
];
|
||||||
|
$adetail = [
|
||||||
|
[ 'Kode_Rek' => Param::Get("Kode_Rek", ""), 'DK' => $ddk, 'Jumlah' => $tot_bayar ],
|
||||||
|
[ 'Kode_Rek' => $this->app_gel['PIU_USAHA'], 'DK' => $kdk, 'Jumlah' => $tot_bayar+$tot_potong, 'MemberID' => $this->id_buyer ]
|
||||||
|
];
|
||||||
|
if ($tot_potong > 0) array_push($adetail, [ 'Kode_Rek' => $this->app_gel['POT_JUAL'], 'DK' => $ddk, 'Jumlah' => $tot_potong ]);
|
||||||
|
$gel_jur = $this->gel->Jurnal_Post($ajurnal, $adetail);
|
||||||
|
$this->db->update("inv_jual_lunas", ['Kode_Jurnal'=>$gel_jur], "No_Jual=? AND ID=?", [$this->no_jual, $id_bayar]);
|
||||||
|
|
||||||
|
} else if ($this->mode_detail === "delete") {
|
||||||
|
// PROSES POSTING GL
|
||||||
|
$gel_jur = $this->db->fetchField("SELECT Kode_Jurnal FROM inv_jual_lunas WHERE No_Jual=? AND ID=?", [$this->no_jual, Param::Get("ID", 0)]) ?? '';
|
||||||
|
if (!empty($gel_jur)) {
|
||||||
|
$this->db->delete("gel_jurnal", "Kode_Jurnal=?", [$gel_jur]);
|
||||||
|
$this->db->delete("gel_jurnal_detail", "Kode_Jurnal=?", [$gel_jur]);
|
||||||
|
}
|
||||||
|
$sql->DeleteDB();
|
||||||
|
}
|
||||||
|
|
||||||
|
$anota = $this->db->fetchRow("SELECT SUM(Total_Bayar) Bayar,SUM(Total_Potong) Potong FROM inv_jual_lunas WHERE No_Jual=?", [$this->no_jual]) ?? ['Bayar'=>0, 'Potong'=>0];
|
||||||
|
$this->db->runQuery("UPDATE inv_jual SET Total_Bayar=?,Total_Potong=?,Lunas=IF(Total_Jual-Total_Diskon-Total_Bayar-Total_Potong=0,1,0),Tgl_Lunas=IF(Lunas=1,'".tgl_sql2str($tgl_bayar)."','0000-00-00') WHERE No_Jual=?", [$anota['Bayar'], $anota['Potong'], $this->no_jual]);
|
||||||
|
//UPDATE POINT UNTUK LUNAS +10 HARI
|
||||||
|
$this->db->runQuery("UPDATE inv_jual SET Point=IF(Tgl_Lunas<=(Tgl_Jual+INTERVAL 10 DAY),Point,0) WHERE No_Jual=?", [$this->no_jual]);
|
||||||
|
$this->gel->Update_Lunas_Buy($this->id_buyer);
|
||||||
|
$anota = $this->db->fetchRow("SELECT Lunas,Total_Jual-Total_Diskon-Total_Bayar-Total_Potong Total_Sisa FROM inv_jual WHERE No_Jual=?", [$this->no_jual]) ?? ['Lunas'=>0, 'Total_Sisa'=>0];
|
||||||
|
$lunas = $anota['Lunas'];
|
||||||
|
$ajson[] = ['type'=>"form", 'id'=>"Total_Sisa", 'value'=>$anota['Total_Sisa']];
|
||||||
|
$ajson[] = ['type'=>"form", 'id'=>"Lunas", 'value'=>$anota['Lunas']];
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("inv_jual_lunas", "*", "No_Jual=?", [$this->no_jual]);
|
||||||
|
$obj->add_field("ID", "ID", "hid");
|
||||||
|
$obj->add_field("Tgl_Bayar", "Tgl. Bayar", "c", "sqltgl", "", "val-tgl");
|
||||||
|
$obj->add_field("Kode_Jurnal", "Kode Jurnal", "c");
|
||||||
|
$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 ($this->app->user()->is_level(0) && ($lunas===0 || ($lunas===1 && $this->mode_tampil===1))) {
|
||||||
|
$obj->add_row_btn("trash", "Hapus", "GELPiutangJS.bayar_hapus", "No_Jual", $this->no_jual);
|
||||||
|
}
|
||||||
|
if ($lunas === 0) {
|
||||||
|
$obj->set_func_btn("GELPiutangJS.bayar_show", '<i class="bi-wallet me-1"></i> Pembayaran');
|
||||||
|
}
|
||||||
|
$ajson[] = $obj->json_table("divDetailBayar");
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function brow_buyer() {
|
||||||
|
$tcari = Param::Get("Cari_Buyer");
|
||||||
|
$tsql = 'Lunas>0'; $asql = [];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql .= " AND CONCAT(Kode_Member,Nama_Member,Alamat_Member) LIKE ?";
|
||||||
|
$asql[] = '%' . $tcari . '%';
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("para_member", "*", $tsql, $asql);
|
||||||
|
$obj->add_field("MemberID", "ID", "hid");
|
||||||
|
$obj->add_field("Kode_Member", "Kode", "l");
|
||||||
|
$obj->add_field("Nama_Member", "Nama Member", "awr");
|
||||||
|
$obj->add_field("Alamat_Member", "Alamat", "awr");
|
||||||
|
$obj->add_field("Kota_Member", "Kota", "awr");
|
||||||
|
$obj->set_field_order("Nama_Member", "A");
|
||||||
|
$obj->set_func_select("GELPiutangJS.buyer_select");
|
||||||
|
$this->app->json([ $obj->db_table("divBrowBuyer") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function auto_buyer() {
|
||||||
|
$tcari = Param::Get("Auto_Query");
|
||||||
|
$ajson['autodata'] = [];
|
||||||
|
$stat = $this->db->runQuery("SELECT MemberID,Kode_Member,Nama_Member,CONCAT(Alamat_Member,_latin1', ',Kota_Member) Alamat_Kota FROM para_member WHERE Lunas>0 AND CONCAT(Kode_Member,Nama_Member,Alamat_Member) LIKE ? ORDER BY Nama_Member LIMIT 50", ['%'.$tcari.'%']);
|
||||||
|
while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$ajson['autodata'][] = ['value'=>$row['MemberID'], 'text'=>$row['Nama_Member'], 'html'=>'<span class="text-primary">'.$row['Kode_Member'].'</span> '.$row['Nama_Member'], 'data'=>$row['Alamat_Kota'], 'bc'=>0];
|
||||||
|
}
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_master() {
|
||||||
|
$ajson = [ 'error'=>"", 'html'=>"" ];
|
||||||
|
$atabel = [ 'MemberID'=>0, 'Nama_Member'=>"", 'Alamat_Member'=>"" ];
|
||||||
|
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tmemb = $form->textauto("_", "Nama_Member", ['value'=>$atabel['MemberID'],'text'=>$atabel['Nama_Member']], true, false, "ketik nama member");
|
||||||
|
$tmembal = $form->textbox("_", "Alamat_Member", $atabel['Alamat_Member'], false, false, "text");
|
||||||
|
$ajson['html'] = '
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-2 col-form-label" for="Nama_Member">Nama Member</label>
|
||||||
|
<div class="col"><div class="input-group">'.$tmemb.'<button id="butBrow" class="btn btn-info" type="button"><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 Member</label>
|
||||||
|
<div class="col">'.$tmembal.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row"><div class="col"><hr class="my-1"></div></div>
|
||||||
|
<input type="hidden" id="MemberID" value="0" >
|
||||||
|
<input type="hidden" id="Mode_Tampil" value="0" >';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_nota() {
|
||||||
|
$tipe = Param::Get("Tipe_Nota", "J");
|
||||||
|
$atabel = [ 'No_Jual'=>$this->no_jual, 'Nama_Operator'=>"" ];
|
||||||
|
if (!empty($this->no_jual)) {
|
||||||
|
$atabel = $this->db->fetchRow("SELECT *,Total_Jual-Total_Diskon Jumlah,Total_Jual-Total_Diskon-Total_Bayar-Total_Potong Sisa_Bayar FROM inv_jual WHERE No_Jual=?", [$this->no_jual]);
|
||||||
|
if ((int) $atabel['UserID'] > 0) {
|
||||||
|
$atabel['Nama_Operator'] = $this->db->fetchField("SELECT Nama FROM app_operator WHERE UserID=?", [$atabel['UserID']]) ?? '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tnota = $form->textbox("_", "No_Jual", $atabel['No_Jual'], false, false, "text");
|
||||||
|
$ttglnota = $form->datebox("_", "Tgl_Jual", $atabel['Tgl_Jual'], false, false);
|
||||||
|
$tsubtot = $form->textbox("_", "Total_Jual", $atabel['Total_Jual'], false, false, "double");
|
||||||
|
$tdiskon = $form->textbox("_", "Total_Diskon", $atabel['Total_Diskon'], false, false, "double");
|
||||||
|
$tjumlah = $form->textbox("_", "Jumlah", $atabel['Jumlah'], false, false, "double");
|
||||||
|
$tbayar = $form->textbox("_", "V_Bayar", $atabel['Total_Bayar']+$atabel['Total_Potong'], false, false, "double");
|
||||||
|
$tsisa = $form->textbox("_", "V_Sisa", $atabel['Sisa_Bayar'], false, false, "double");
|
||||||
|
$toper = $form->textbox("_", "V_Ope", $atabel['Nama_Operator'], false, false, "text");
|
||||||
|
$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=="J")?"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=="J")?"Transaksi":"Retur").'</label>
|
||||||
|
<div class="col-sm-8 col-lg-4">'.$tsubtot.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-2 col-form-label">Tgl. '.(($tipe=="J")?"Transaksi":"Retur").'</label>
|
||||||
|
<div class="col-sm-8 col-lg-4">'.$ttglnota.'</div>
|
||||||
|
<label class="col-sm-4 col-lg-2 col-form-label">Jumlah Diskon</label>
|
||||||
|
<div class="col-sm-8 col-lg-4">'.$tdiskon.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-2 col-form-label">Nama Operator</label>
|
||||||
|
<div class="col-sm-8 col-lg-4">'.$toper.'</div>
|
||||||
|
<label class="col-sm-4 col-lg-2 col-form-label">Total '.(($tipe=="J")?"Nota":"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">Total Bayar / Potong</label>
|
||||||
|
<div class="col-sm-8 col-lg-4">'.$tbayar.'</div>
|
||||||
|
<label class="col-sm-4 col-lg-2 col-form-label">Sisa Piutang</label>
|
||||||
|
<div class="col-sm-8 col-lg-4">'.$tsisa.'</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.'" >';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_bayar() {
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$ttglbyr = $form->datebox("_", "Tgl_Bayar", tgl_ymd(), true, false);
|
||||||
|
$trek = $form->option_db("_", "Kode_Rek", $this->app_gel['KAS_TUNAI'], true, false, "vi_gel_acc", ["Kode_Rek","Nama_Lengkap"], "Kas_Rek=1 AND Aktif=1 AND Mode='D' ORDER BY Kode_Rek");
|
||||||
|
$ttotal = $form->textbox("_", "Temp_Total", Param::Get("Total_Sisa",0), false, false, "double");
|
||||||
|
$tbayar = $form->textbox("_", "Total_Bayar", Param::Get("Total_Sisa",0), true, false, "double");
|
||||||
|
$tpotong = $form->textbox("_", "Total_Potong", 0, true, false, "double");
|
||||||
|
$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" for="Kode_Rek">Rekening Debit</label>
|
||||||
|
<div class="col">'.$trek.'</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">Jumlah Sisa</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>';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$this->app->json(['html' => '
|
||||||
|
<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-journal-bookmark me-2"></i>Transaksi Penerimaan Piutang Member</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"> </div>
|
||||||
|
<div id="divTXNota"> </div>
|
||||||
|
<div id="divDetailNota" class="d-none"> </div>
|
||||||
|
<div id="divDetailBayar" class="d-none"> </div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div></div>
|
||||||
|
</div>'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,304 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Gel/TerimaController
|
||||||
|
Description : Jurnal Penerimaan Kas / Bank
|
||||||
|
Created By : Siau Pheng ([email protected]).
|
||||||
|
Created Date : May 22th, 2010.
|
||||||
|
Last Modified : September 9th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Gel;
|
||||||
|
|
||||||
|
use App\Utils\Gel;
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use flight\Session;
|
||||||
|
use Webapp\DB\SQL;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
use Webapp\Web\Table;
|
||||||
|
|
||||||
|
class TerimaController {
|
||||||
|
|
||||||
|
private array $web_app;
|
||||||
|
private array $app_gel;
|
||||||
|
private int $id_cab;
|
||||||
|
private string $mode;
|
||||||
|
private string $mode_detail;
|
||||||
|
private string $kode_jurnal;
|
||||||
|
private string $kode_rek;
|
||||||
|
private Gel $gel;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->web_app = (array) $session->get('WEB_APP');
|
||||||
|
$this->app_gel = (array) $session->get('APP_GEL');
|
||||||
|
$this->id_cab = Param::Int("CabID", $session->get('APP_INV')['CABANGID']);
|
||||||
|
$this->mode = Param::Get("mode", "");
|
||||||
|
$this->mode_detail = Param::Get("mode_detail", "");
|
||||||
|
$this->kode_jurnal = Param::Get("Kode_Jurnal", "");
|
||||||
|
$this->kode_rek = Param::Get("Kode_Rek", "");
|
||||||
|
$this->gel = new Gel($app);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function table_detail() {
|
||||||
|
if (in_array($this->mode_detail, ["insert","update","delete"])) {
|
||||||
|
$jumlah = (float) Param::Get("Jumlah", 0) * -1;
|
||||||
|
|
||||||
|
$sql = new SQL($this->app);
|
||||||
|
$sql->set_table("tmp_gel_jurnal_detail");
|
||||||
|
$sql->add_param("Kode_Rek");
|
||||||
|
$sql->add_param("DK", "K");
|
||||||
|
$sql->add_param("Jumlah", $jumlah);
|
||||||
|
$sql->add_param_unix();
|
||||||
|
$sql->add_param_userid();
|
||||||
|
$sql->add_where("Kode_Jurnal");
|
||||||
|
$sql->add_where("ID");
|
||||||
|
|
||||||
|
if ($this->mode_detail === "insert") {
|
||||||
|
$sql->add_param("Kode_Jurnal");
|
||||||
|
$sql->InsertDB();
|
||||||
|
} else if ($this->mode_detail === "update") {
|
||||||
|
$sql->UpdateDB();
|
||||||
|
} else if ($this->mode_detail === "delete") {
|
||||||
|
$sql->DeleteDB();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$tsql = ''; $asql = [$this->kode_jurnal, "K"]; $qtabel = "gel_jurnal_detail";
|
||||||
|
if (in_array($this->mode, ["add","edit"])) {
|
||||||
|
if ($this->mode === "add") { $tsql = " AND Unix=?"; $asql[] = $this->app->user()->unix(); }
|
||||||
|
$qtabel = "tmp_gel_jurnal_detail";
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("(SELECT * FROM ".$qtabel." WHERE Kode_Jurnal=? AND DK=?".$tsql.") D LEFT JOIN gel_acc A ON (D.Kode_Rek=A.Kode_Rek)", "D.*,-D.Jumlah Jumlah2,A.Nama_Rek", "", $asql);
|
||||||
|
$obj->set_footer("SUM(-Jumlah) Jumlah2, COUNT(*) Kode_Rek");
|
||||||
|
$obj->add_field("ID", "ID", "hid");
|
||||||
|
$obj->add_field("Kode_Rek", "Kode", "c", "", "records");
|
||||||
|
$obj->add_field("Nama_Rek", "Rekening Kredit", "awr");
|
||||||
|
$obj->add_field("Jumlah2", "Jumlah", "r", "kurung", "kurung");
|
||||||
|
$obj->set_field_order("Kode_Rek", "A");
|
||||||
|
if (in_array($this->mode, ["add","edit"])) {
|
||||||
|
$obj->add_row_btn("clipboard", "Ubah", "GELTerimaJS.detail_ubah");
|
||||||
|
$obj->add_row_btn("trash", "Hapus", "GELTerimaJS.detail_hapus", "Unix", $this->app->user()->unix());
|
||||||
|
$obj->set_func_btn("GELTerimaJS.detail_tambah", '<i class="bi-plus-lg me-1"></i> Rekening');
|
||||||
|
$obj->set_func_btn("GELTerimaJS.rek_brow", '<i class="bi-table me-1"></i> Browse');
|
||||||
|
}
|
||||||
|
|
||||||
|
$nitems = (int) $this->db->fetchField("SELECT COUNT(*) FROM ".$qtabel." WHERE Kode_Jurnal=? AND DK=?".$tsql, $asql) ?? 0;
|
||||||
|
$this->app->json([ $obj->json_table("divDetailTabel"), ['type'=>"form", 'id'=>"Total_Item", 'value'=>$nitems] ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function brow_tx() {
|
||||||
|
$tcari = Param::Get("Cari_TX");
|
||||||
|
$tsql = 'TipeID=2'; $asql = [];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql .= " AND CONCAT(Kode_Jurnal,DATE_FORMAT(Tanggal,'%d-%m-%Y'),Kode_Ref,Catatan) LIKE ?";
|
||||||
|
$asql[] = '%' . $tcari . '%';
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("gel_jurnal", "*", $tsql, $asql);
|
||||||
|
$obj->add_field("Kode_Jurnal", "Kode Jurnal", "c");
|
||||||
|
$obj->add_field("Tanggal", "Tanggal", "c", "sqltgl", "", "val-tgl");
|
||||||
|
$obj->add_field("Kode_Ref", "Kode Ref.", "l");
|
||||||
|
$obj->add_field("Catatan", "Deskripsi", "awr");
|
||||||
|
$obj->set_field_order("Kode_Jurnal", "D");
|
||||||
|
$obj->set_func_select("GELTerimaJS.tx_select");
|
||||||
|
$this->app->json([ $obj->db_table("divBrowTX") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function brow_rek() {
|
||||||
|
$tcari = Param::Get("Cari_Rek");
|
||||||
|
$tsql = 'Aktif=1 AND Mode="D"'; $asql = [];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql .= " AND CONCAT(Kode_Rek,Nama_Rek) LIKE ?";
|
||||||
|
$asql[] = '%' . $tcari . '%';
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("gel_acc", "*", $tsql, $asql);
|
||||||
|
$obj->add_field("Kode_Rek", "Kode", "c");
|
||||||
|
$obj->add_field("Nama_Rek", "Nama Rekening", "awr");
|
||||||
|
$obj->add_field("Level", "Level", "c");
|
||||||
|
$obj->set_field_order("Kode_Rek", "A");
|
||||||
|
$obj->set_func_select("GELTerimaJS.rek_select");
|
||||||
|
$this->app->json([ $obj->db_table("divBrowRek") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function auto_rek() {
|
||||||
|
$tcari = Param::Get("Auto_Query");
|
||||||
|
$ajson['autodata'] = [];
|
||||||
|
$stat = $this->db->runQuery("SELECT Kode_Rek,Nama_Rek,CONCAT(Kode_Rek,' - ',Nama_Rek) Nama_Lengkap FROM gel_acc WHERE Aktif=1 AND Mode='D' AND CONCAT(Kode_Rek,Nama_Rek) LIKE ? ORDER BY Kode_Rek LIMIT 50", ['%'.$tcari.'%']);
|
||||||
|
while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$ajson['autodata'][] = ['value'=>$row['Kode_Rek'], 'text'=>$row['Nama_Rek'], 'html'=>'<span class="text-primary">'.$row['Kode_Rek'].'</span> '.$row['Nama_Rek'], 'data'=>"", 'bc'=>0];
|
||||||
|
}
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_master() {
|
||||||
|
$ajson = [ 'error'=>"", 'html'=>"" ];
|
||||||
|
$atabel = [ 'Kode_Jurnal'=>"", 'CabID'=>$this->id_cab, 'Kode_Ref'=>"", 'Tanggal'=>tgl_ymd(), 'Kode_Kas'=>"", 'Catatan'=>"" ];
|
||||||
|
|
||||||
|
if ($this->mode === "add") {
|
||||||
|
$atabel['Kode_Jurnal'] = "GT-BARU#".(string) $this->web_app['SERVER_ID']. $this->app->user()->id(3);
|
||||||
|
$atabel['Tanggal'] = tgl_ymd();
|
||||||
|
$atabel['Kode_Kas'] = $this->app_gel['KAS_TUNAI'];
|
||||||
|
$this->kode_jurnal = "";
|
||||||
|
|
||||||
|
} else if ($this->mode === "edit") {
|
||||||
|
$this->gel->Detail_Copy($this->kode_jurnal);
|
||||||
|
|
||||||
|
} else if ($this->mode === "save") {
|
||||||
|
$no_lama = $this->kode_jurnal;
|
||||||
|
$tgl_jurn = Param::Get("Tanggal");
|
||||||
|
$b_baru = str_contains($no_lama, "BARU");
|
||||||
|
if ($b_baru) $this->kode_jurnal = $this->gel->Jurnal_Baru($this->id_cab, $tgl_jurn, true);
|
||||||
|
|
||||||
|
$kode_kas = Param::Get("Kode_Kas");
|
||||||
|
$this->db->runQuery("DELETE FROM tmp_gel_jurnal_detail WHERE Kode_Jurnal='".$no_lama."' AND LEFT(Kode_Rek,1)='1' AND DK='D'");
|
||||||
|
$ntot_kas = $this->db->fetchField("SELECT SUM(-Jumlah) FROM tmp_gel_jurnal_detail WHERE Kode_Jurnal='".$no_lama."' AND Unix='".$this->app->user()->unix()."'") ?? 0;
|
||||||
|
$this->db->insert("tmp_gel_jurnal_detail", [ 'Kode_Jurnal'=>$no_lama, 'Kode_Rek'=>$kode_kas, 'DK'=>'D', 'Jumlah'=>$ntot_kas,'Unix'=>$this->app->user()->unix(), 'UserID'=>$this->app->user()->id() ]);
|
||||||
|
$this->gel->Detail_Save($this->kode_jurnal, 2, $this->id_cab, $tgl_jurn, $b_baru, $no_lama);
|
||||||
|
$this->gel->Jurnal_Save($this->kode_jurnal, 2, $this->id_cab, $tgl_jurn, Param::Get("Kode_Ref"), Param::Get("Catatan"));
|
||||||
|
$atabel['Tanggal'] = $tgl_jurn;
|
||||||
|
$this->mode = "view";
|
||||||
|
|
||||||
|
} else if ($this->mode === "cancel") {
|
||||||
|
$this->gel->Detail_Cancel($this->kode_jurnal);
|
||||||
|
$this->mode = "view";
|
||||||
|
$this->kode_jurnal = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!empty($this->kode_jurnal) && $this->mode !== "cancel") {
|
||||||
|
$row = $this->db->fetchRow("SELECT * FROM gel_jurnal WHERE Kode_Jurnal='".$this->kode_jurnal."' AND TipeID=2");
|
||||||
|
if ($row) {
|
||||||
|
$atabel = $row;
|
||||||
|
$atabel['Kode_Kas'] = $this->db->fetchField("SELECT Kode_Rek FROM gel_jurnal_detail WHERE Kode_Jurnal='".$atabel['Kode_Jurnal']."' AND DK='D' LIMIT 1") ?? '';
|
||||||
|
} else {
|
||||||
|
$ajson['error'] = "Nomor Transaksi belum ada / tidak diketemukan !";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$enable = in_array($this->mode, ["add","edit"]) ? true : false;
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tkode = $form->textbox("_", "Kode_Jurnal", $atabel['Kode_Jurnal'], !$enable, false, "text", "kode jurnal");
|
||||||
|
$tref = $form->textbox("_", "Kode_Ref", $atabel['Kode_Ref'], $enable, false, "text", "kode referensi");
|
||||||
|
$ttgl = $form->datebox("_", "Tanggal", $atabel['Tanggal'], $enable, false);
|
||||||
|
$tcab = $form->option_db("_", "CabID", $atabel['CabID'], $enable, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID");
|
||||||
|
$tkas = $form->option_db("_", "Kode_Kas", $atabel['Kode_Kas'], $enable, false, "vi_gel_acc", ["Kode_Rek","Nama_Lengkap"], "Kas_Rek=1 AND Aktif=1 AND Mode='D' ORDER BY Kode_Rek");
|
||||||
|
$tcatat = $form->textbox("_", "Catatan", stripslashes($atabel['Catatan']), $enable, false, "text", "catatan jurnal");
|
||||||
|
$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="Kode_Jurnal">Kode Jurnal</label>
|
||||||
|
<div class="col-sm-7 col-lg-7"><div class="input-group">'.$tkode.'<button id="butBrow" class="btn btn-info" type="button"><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="Tanggal">Tanggal Jurnal</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="Kode_Ref">Kode Ref.</label>
|
||||||
|
<div class="col">'.$tref.'</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-3 col-lg-2 col-form-label" for="Catatan" style="width:12.5%;">Deskripsi</label>
|
||||||
|
<div class="col">'.$tcatat.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-3 col-lg-2 col-form-label" for="Kode_Kas" style="width:12.5%;">Rekening Debit</label>
|
||||||
|
<div class="col-sm-7 col-lg-6">'.$tkas.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1"><div class="col"><hr class="my-1"></div></div>
|
||||||
|
<input type="hidden" id="Total_Item" value="0" >
|
||||||
|
<input type="hidden" id="mode" value="'.$this->mode.'" >';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_rek() {
|
||||||
|
$id = (int) Param::Get("ID", 0);
|
||||||
|
$atabel = [ 'ID'=>$id, 'Kode_Rek'=>$this->kode_rek, 'Nama_Rek'=>"", 'Jumlah'=>0 ];
|
||||||
|
if ($id > 0) {
|
||||||
|
$atabel = $this->db->fetchRow("SELECT * FROM tmp_gel_jurnal_detail WHERE Kode_Jurnal=? AND ID=?", [$this->kode_jurnal, $id]);
|
||||||
|
}
|
||||||
|
if (!empty($atabel['Kode_Rek'])) {
|
||||||
|
$atabel['Nama_Rek'] = $this->db->fetchField("SELECT Nama_Rek FROM gel_acc WHERE Kode_Rek=?", [$atabel['Kode_Rek']]) ?? '';
|
||||||
|
}
|
||||||
|
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tkode = $form->textbox("_", "Kode_Rek", $atabel['Kode_Rek'], false, false, "text");
|
||||||
|
$tnama = $form->textauto("_", "Nama_Rek", ['value'=>$atabel['Kode_Rek'],'text'=>$atabel['Nama_Rek']], true, true, "ketik kode / nama rekening");
|
||||||
|
$tjumlah = $form->textbox("_", "Jumlah", abs($atabel['Jumlah']), true, true, "double");
|
||||||
|
|
||||||
|
$ajson['html'] = '
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label">Kode Rekening</label>
|
||||||
|
<div class="col-sm-4 col-lg-3">'.$tkode.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="Nama_Rek">Nama Rekening</label>
|
||||||
|
<div class="col">'.$tnama.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="Jumlah">Jumlah (Rp.)</label>
|
||||||
|
<div class="col-sm-4 col-lg-5">'.$tjumlah.'</div>
|
||||||
|
</div>
|
||||||
|
<input type="hidden" id="ID" value="'.$atabel['ID'].'" >
|
||||||
|
<input type="hidden" id="mode_detail" value="'.$this->mode_detail.'" >';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function proses_hapus() {
|
||||||
|
$this->db->runQuery("DELETE FROM gel_jurnal WHERE Kode_Jurnal='".$this->kode_jurnal."'");
|
||||||
|
$this->db->runQuery("DELETE FROM gel_jurnal_detail WHERE Kode_Jurnal='".$this->kode_jurnal."'");
|
||||||
|
$this->app->json([ 'status' => true ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$this->app->json(['html' => '
|
||||||
|
<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-journal-bookmark me-2"></i>Jurnal Penerimaan Kas / Bank</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-danger mb-1 ms-2" id="butBatal" type="button"><i class="bi-x-lg me-2"></i>Batal</button>
|
||||||
|
<button class="btn btn-success mb-1 ms-2" id="butSimpan" type="button"><i class="bi-save me-2"></i>Simpan</button>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<div class="tab-content border border-top-0 p-3">
|
||||||
|
<div class="tab-pane fade active show" id="tx" role="tabpanel" aria-labelledby="tx-tab">
|
||||||
|
<div id="divTXMaster"> </div>
|
||||||
|
<div id="divDetailTabel"> </div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div></div>
|
||||||
|
</div>'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,306 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Gel/UmumController
|
||||||
|
Description : Jurnal Umum
|
||||||
|
Created By : Siau Pheng ([email protected]).
|
||||||
|
Created Date : May 22th, 2010.
|
||||||
|
Last Modified : September 10th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Gel;
|
||||||
|
|
||||||
|
use App\Utils\Gel;
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use flight\Session;
|
||||||
|
use Webapp\DB\SQL;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
use Webapp\Web\Table;
|
||||||
|
|
||||||
|
class UmumController {
|
||||||
|
|
||||||
|
private array $web_app;
|
||||||
|
private array $app_gel;
|
||||||
|
private int $id_cab;
|
||||||
|
private string $mode;
|
||||||
|
private string $mode_detail;
|
||||||
|
private string $kode_jurnal;
|
||||||
|
private string $kode_rek;
|
||||||
|
private Gel $gel;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->web_app = (array) $session->get('WEB_APP');
|
||||||
|
$this->app_gel = (array) $session->get('APP_GEL');
|
||||||
|
$this->id_cab = Param::Int("CabID", $session->get('APP_INV')['CABANGID']);
|
||||||
|
$this->mode = Param::Get("mode", "");
|
||||||
|
$this->mode_detail = Param::Get("mode_detail", "");
|
||||||
|
$this->kode_jurnal = Param::Get("Kode_Jurnal", "");
|
||||||
|
$this->kode_rek = Param::Get("Kode_Rek", "");
|
||||||
|
$this->gel = new Gel($app);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function table_detail() {
|
||||||
|
if (in_array($this->mode_detail, ["insert","update","delete"])) {
|
||||||
|
$jumlah = (float) Param::Get("Jumlah", 0) * ((string) Param::Get("DK","D")==="D" ? 1 : -1);
|
||||||
|
|
||||||
|
$sql = new SQL($this->app);
|
||||||
|
$sql->set_table("tmp_gel_jurnal_detail");
|
||||||
|
$sql->add_param("Kode_Rek");
|
||||||
|
$sql->add_param("DK");
|
||||||
|
$sql->add_param("Jumlah", $jumlah);
|
||||||
|
$sql->add_param_unix();
|
||||||
|
$sql->add_param_userid();
|
||||||
|
$sql->add_where("Kode_Jurnal");
|
||||||
|
$sql->add_where("ID");
|
||||||
|
|
||||||
|
if ($this->mode_detail === "insert") {
|
||||||
|
$sql->add_param("Kode_Jurnal");
|
||||||
|
$sql->InsertDB();
|
||||||
|
} else if ($this->mode_detail === "update") {
|
||||||
|
$sql->UpdateDB();
|
||||||
|
} else if ($this->mode_detail === "delete") {
|
||||||
|
$sql->DeleteDB();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$tsql = ''; $asql = [$this->kode_jurnal]; $qtabel = "gel_jurnal_detail";
|
||||||
|
if (in_array($this->mode, ["add","edit"])) {
|
||||||
|
if ($this->mode === "add") { $tsql = " AND Unix=?"; $asql[] = $this->app->user()->unix(); }
|
||||||
|
$qtabel = "tmp_gel_jurnal_detail";
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("(SELECT *,IF(DK='D',Jumlah,0) Debit,IF(DK='K',-Jumlah,0) Kredit FROM ".$qtabel." WHERE Kode_Jurnal=?".$tsql.") D LEFT JOIN gel_acc A ON (D.Kode_Rek=A.Kode_Rek)", "D.*,A.Nama_Rek", "", $asql);
|
||||||
|
$obj->set_footer("SUM(D.Debit) Debit,SUM(D.Kredit) Kredit,COUNT(*) Kode_Rek");
|
||||||
|
$obj->add_field("ID", "ID", "hid");
|
||||||
|
$obj->add_field("Kode_Rek", "Kode", "c", "", "records");
|
||||||
|
$obj->add_field("Nama_Rek", "Nama Rekening", "awr");
|
||||||
|
$obj->add_field("DK", "D / K", "hid");
|
||||||
|
$obj->add_field("Debit", "Debit", "r", "kurung", "kurung");
|
||||||
|
$obj->add_field("Kredit", "Kredit", "r", "kurung", "kurung");
|
||||||
|
$obj->set_field_order("Kode_Rek", "A");
|
||||||
|
if (in_array($this->mode, ["add","edit"])) {
|
||||||
|
$obj->add_row_btn("clipboard", "Ubah", "GELUmumJS.detail_ubah");
|
||||||
|
$obj->add_row_btn("trash", "Hapus", "GELUmumJS.detail_hapus", "Unix", $this->app->user()->unix());
|
||||||
|
$obj->set_func_btn("GELUmumJS.detail_tambah", '<i class="bi-plus-lg me-1"></i> Rekening');
|
||||||
|
$obj->set_func_btn("GELUmumJS.rek_brow", '<i class="bi-table me-1"></i> Browse');
|
||||||
|
}
|
||||||
|
|
||||||
|
$nitems = 0; $ntotal = 0;
|
||||||
|
$row = $this->db->fetchRow("SELECT COUNT(*) Baris,SUM(Jumlah) Jumlah FROM ".$qtabel." WHERE Kode_Jurnal=?".$tsql, $asql);
|
||||||
|
if ($row) {
|
||||||
|
$nitems = (int) $row['Baris'];
|
||||||
|
$ntotal = (float) $row['Jumlah'];
|
||||||
|
}
|
||||||
|
$this->app->json([ $obj->json_table("divDetailTabel"), ['type'=>"form", 'id'=>"Total_Item", 'value'=>$nitems], ['type'=>"form", 'id'=>"Total_Jumlah", 'value'=>$ntotal] ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function brow_tx() {
|
||||||
|
$tcari = Param::Get("Cari_TX");
|
||||||
|
$tsql = 'TipeID=4'; $asql = [];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql .= " AND CONCAT(Kode_Jurnal,DATE_FORMAT(Tanggal,'%d-%m-%Y'),Kode_Ref,Catatan) LIKE ?";
|
||||||
|
$asql[] = '%' . $tcari . '%';
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("gel_jurnal", "*", $tsql, $asql);
|
||||||
|
$obj->add_field("Kode_Jurnal", "Kode Jurnal", "c");
|
||||||
|
$obj->add_field("Tanggal", "Tanggal", "c", "sqltgl", "", "val-tgl");
|
||||||
|
$obj->add_field("Kode_Ref", "Kode Ref.", "l");
|
||||||
|
$obj->add_field("Catatan", "Deskripsi", "awr");
|
||||||
|
$obj->set_field_order("Kode_Jurnal", "D");
|
||||||
|
$obj->set_func_select("GELUmumJS.tx_select");
|
||||||
|
$this->app->json([ $obj->db_table("divBrowTX") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function brow_rek() {
|
||||||
|
$tcari = Param::Get("Cari_Rek");
|
||||||
|
$tsql = 'Aktif=1 AND Mode="D"'; $asql = [];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql .= " AND CONCAT(Kode_Rek,Nama_Rek) LIKE ?";
|
||||||
|
$asql[] = '%' . $tcari . '%';
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("gel_acc", "*", $tsql, $asql);
|
||||||
|
$obj->add_field("Kode_Rek", "Kode", "c");
|
||||||
|
$obj->add_field("Nama_Rek", "Nama Rekening", "awr");
|
||||||
|
$obj->add_field("Level", "Level", "c");
|
||||||
|
$obj->set_field_order("Kode_Rek", "A");
|
||||||
|
$obj->set_func_select("GELUmumJS.rek_select");
|
||||||
|
$this->app->json([ $obj->db_table("divBrowRek") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function auto_rek() {
|
||||||
|
$tcari = Param::Get("Auto_Query");
|
||||||
|
$ajson['autodata'] = [];
|
||||||
|
$stat = $this->db->runQuery("SELECT Kode_Rek,Nama_Rek,CONCAT(Kode_Rek,' - ',Nama_Rek) Nama_Lengkap FROM gel_acc WHERE Aktif=1 AND Mode='D' AND CONCAT(Kode_Rek,Nama_Rek) LIKE ? ORDER BY Kode_Rek LIMIT 50", ['%'.$tcari.'%']);
|
||||||
|
while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$ajson['autodata'][] = ['value'=>$row['Kode_Rek'], 'text'=>$row['Nama_Rek'], 'html'=>'<span class="text-primary">'.$row['Kode_Rek'].'</span> '.$row['Nama_Rek'], 'data'=>"", 'bc'=>0];
|
||||||
|
}
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_master() {
|
||||||
|
$ajson = [ 'error'=>"", 'html'=>"" ];
|
||||||
|
$atabel = [ 'Kode_Jurnal'=>"", 'CabID'=>$this->id_cab, 'Kode_Ref'=>"", 'Tanggal'=>tgl_ymd(), 'Catatan'=>"" ];
|
||||||
|
|
||||||
|
if ($this->mode === "add") {
|
||||||
|
$atabel['Kode_Jurnal'] = "GU-BARU#".(string) $this->web_app['SERVER_ID']. $this->app->user()->id(3);
|
||||||
|
$atabel['Tanggal'] = tgl_ymd();
|
||||||
|
$this->kode_jurnal = "";
|
||||||
|
|
||||||
|
} else if ($this->mode === "edit") {
|
||||||
|
$this->gel->Detail_Copy($this->kode_jurnal);
|
||||||
|
|
||||||
|
} else if ($this->mode === "save") {
|
||||||
|
$no_lama = $this->kode_jurnal;
|
||||||
|
$tgl_jurn = Param::Get("Tanggal");
|
||||||
|
$b_baru = str_contains($no_lama, "BARU");
|
||||||
|
if ($b_baru) $this->kode_jurnal = $this->gel->Jurnal_Baru($this->id_cab, $tgl_jurn, true);
|
||||||
|
|
||||||
|
$this->gel->Detail_Save($this->kode_jurnal, 4, $this->id_cab, $tgl_jurn, $b_baru, $no_lama);
|
||||||
|
$this->gel->Jurnal_Save($this->kode_jurnal, 4, $this->id_cab, $tgl_jurn, Param::Get("Kode_Ref"), Param::Get("Catatan"));
|
||||||
|
$atabel['Tanggal'] = $tgl_jurn;
|
||||||
|
$this->mode = "view";
|
||||||
|
|
||||||
|
} else if ($this->mode === "cancel") {
|
||||||
|
$this->gel->Detail_Cancel($this->kode_jurnal);
|
||||||
|
$this->mode = "view";
|
||||||
|
$this->kode_jurnal = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!empty($this->kode_jurnal) && $this->mode !== "cancel") {
|
||||||
|
$row = $this->db->fetchRow("SELECT * FROM gel_jurnal WHERE Kode_Jurnal='".$this->kode_jurnal."' AND TipeID=4");
|
||||||
|
if ($row) {
|
||||||
|
$atabel = $row;
|
||||||
|
} else {
|
||||||
|
$ajson['error'] = "Nomor Transaksi belum ada / tidak diketemukan !";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$enable = in_array($this->mode, ["add","edit"]) ? true : false;
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tkode = $form->textbox("_", "Kode_Jurnal", $atabel['Kode_Jurnal'], !$enable, false, "text", "kode jurnal");
|
||||||
|
$tref = $form->textbox("_", "Kode_Ref", $atabel['Kode_Ref'], $enable, false, "text", "kode referensi");
|
||||||
|
$ttgl = $form->datebox("_", "Tanggal", $atabel['Tanggal'], $enable, false);
|
||||||
|
$tcab = $form->option_db("_", "CabID", $atabel['CabID'], $enable, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID");
|
||||||
|
$tcatat = $form->textbox("_", "Catatan", stripslashes($atabel['Catatan']), $enable, false, "text", "catatan jurnal");
|
||||||
|
$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="Kode_Jurnal">Kode Jurnal</label>
|
||||||
|
<div class="col-sm-7 col-lg-7"><div class="input-group">'.$tkode.'<button id="butBrow" class="btn btn-info" type="button"><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="Tanggal">Tanggal Jurnal</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="Kode_Ref">Kode Ref.</label>
|
||||||
|
<div class="col">'.$tref.'</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-3 col-lg-2 col-form-label" for="Catatan" style="width:12.5%;">Deskripsi</label>
|
||||||
|
<div class="col">'.$tcatat.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1"><div class="col"><hr class="my-1"></div></div>
|
||||||
|
<input type="hidden" id="Total_Item" value="0" >
|
||||||
|
<input type="hidden" id="Total_Jumlah" value="0" >
|
||||||
|
<input type="hidden" id="mode" value="'.$this->mode.'" >';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_rek() {
|
||||||
|
$id = (int) Param::Get("ID", 0);
|
||||||
|
$atabel = [ 'ID'=>$id, 'Kode_Rek'=>$this->kode_rek, 'DK'=>Param::Get("DK", "D"), 'Nama_Rek'=>"", 'Jumlah'=>0 ];
|
||||||
|
if ($id > 0) {
|
||||||
|
$atabel = $this->db->fetchRow("SELECT * FROM tmp_gel_jurnal_detail WHERE Kode_Jurnal=? AND ID=?", [$this->kode_jurnal, $id]);
|
||||||
|
}
|
||||||
|
if (!empty($atabel['Kode_Rek'])) {
|
||||||
|
$atabel['Nama_Rek'] = $this->db->fetchField("SELECT Nama_Rek FROM gel_acc WHERE Kode_Rek=?", [$atabel['Kode_Rek']]) ?? '';
|
||||||
|
}
|
||||||
|
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tkode = $form->textbox("_", "Kode_Rek", $atabel['Kode_Rek'], false, false, "text");
|
||||||
|
$tnama = $form->textauto("_", "Nama_Rek", ['value'=>$atabel['Kode_Rek'],'text'=>$atabel['Nama_Rek']], true, true, "ketik kode / nama rekening");
|
||||||
|
$tdk = $form->radio("_", "DK", $atabel['DK'], true, false, ['D'=>"Debit",'K'=>"Kredit"]);
|
||||||
|
$tjumlah = $form->textbox("_", "Jumlah", abs($atabel['Jumlah']), true, true, "double");
|
||||||
|
|
||||||
|
$ajson['html'] = '
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label">Kode Rekening</label>
|
||||||
|
<div class="col-sm-4 col-lg-3">'.$tkode.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="Nama_Rek">Nama Rekening</label>
|
||||||
|
<div class="col">'.$tnama.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="DK">Debit / Kredit</label>
|
||||||
|
<div class="col d-flex gap-2">'.$tdk.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="Jumlah">Jumlah (Rp.)</label>
|
||||||
|
<div class="col-sm-4 col-lg-5">'.$tjumlah.'</div>
|
||||||
|
</div>
|
||||||
|
<input type="hidden" id="ID" value="'.$atabel['ID'].'" >
|
||||||
|
<input type="hidden" id="mode_detail" value="'.$this->mode_detail.'" >';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function proses_hapus() {
|
||||||
|
$this->db->runQuery("DELETE FROM gel_jurnal WHERE Kode_Jurnal='".$this->kode_jurnal."'");
|
||||||
|
$this->db->runQuery("DELETE FROM gel_jurnal_detail WHERE Kode_Jurnal='".$this->kode_jurnal."'");
|
||||||
|
$this->app->json([ 'status' => true ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$this->app->json(['html' => '
|
||||||
|
<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-journal-bookmark me-2"></i>Jurnal Umum</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-danger mb-1 ms-2" id="butBatal" type="button"><i class="bi-x-lg me-2"></i>Batal</button>
|
||||||
|
<button class="btn btn-success mb-1 ms-2" id="butSimpan" type="button"><i class="bi-save me-2"></i>Simpan</button>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<div class="tab-content border border-top-0 p-3">
|
||||||
|
<div class="tab-pane fade active show" id="tx" role="tabpanel" aria-labelledby="tx-tab">
|
||||||
|
<div id="divTXMaster"> </div>
|
||||||
|
<div id="divDetailTabel"> </div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div></div>
|
||||||
|
</div>'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,169 @@
|
|||||||
|
<?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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,581 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Inv/BeliController
|
||||||
|
Description : Transaksi Pembelian
|
||||||
|
Created By : Siau Pheng ([email protected]).
|
||||||
|
Created Date : May 22th, 2010.
|
||||||
|
Last Modified : September 20th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Inv;
|
||||||
|
|
||||||
|
use App\Utils\Inv;
|
||||||
|
use App\Utils\Gel;
|
||||||
|
use App\Utils\Invesa;
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use flight\Session;
|
||||||
|
use Webapp\DB\SQL;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
use Webapp\Web\Table;
|
||||||
|
|
||||||
|
class BeliController {
|
||||||
|
|
||||||
|
private array $web_app;
|
||||||
|
private array $app_gel;
|
||||||
|
private int $id_cab;
|
||||||
|
private string $mode;
|
||||||
|
private string $mode_detail;
|
||||||
|
private string $no_beli;
|
||||||
|
private bool $is_pend;
|
||||||
|
private int $id_inv;
|
||||||
|
private int $id_satuan;
|
||||||
|
private int $id_varian;
|
||||||
|
private Inv $inv;
|
||||||
|
private Gel $gel;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->web_app = (array) $session->get('WEB_APP');
|
||||||
|
$this->app_gel = (array) $session->get('APP_GEL');
|
||||||
|
$this->id_cab = Param::Int("CabID", $session->get('APP_INV')['CABANGID']);
|
||||||
|
$this->mode = Param::Get("mode", "");
|
||||||
|
$this->mode_detail = Param::Get("mode_detail", "");
|
||||||
|
$this->no_beli = Param::Get("No_Beli", "");
|
||||||
|
$this->is_pend = str_contains($this->no_beli, "BELI") === true;
|
||||||
|
$this->id_inv = Param::Int("InvID", 0);
|
||||||
|
$this->id_satuan = Param::Int("SatuanID", 0);
|
||||||
|
$this->id_varian = Param::Int("VarianID", 0);
|
||||||
|
$this->inv = new Inv($app);
|
||||||
|
$this->gel = new Gel($app);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function table_detail() {
|
||||||
|
if (in_array($this->mode_detail, ["insert","update","delete"])) {
|
||||||
|
$iqty = Param::Float("Qty", 0);
|
||||||
|
|
||||||
|
$sql = new SQL($this->app);
|
||||||
|
$sql->set_table("tmp_inv_detail");
|
||||||
|
$sql->add_param("No_Ref", $this->no_beli);
|
||||||
|
$sql->add_param("InvID");
|
||||||
|
$sql->add_param("SatuanID");
|
||||||
|
$sql->add_param("VarianID");
|
||||||
|
$sql->add_param("Qty", $iqty);
|
||||||
|
$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", $this->no_beli);
|
||||||
|
|
||||||
|
$_id = Param::Get("ID", 0);
|
||||||
|
if ( $this->mode_detail === "insert" ) {
|
||||||
|
$sql->InsertDB();
|
||||||
|
$_id = $sql->LastInsertID("ID");
|
||||||
|
} else if ( $this->mode_detail === "update" ) {
|
||||||
|
$sql->UpdateDB();
|
||||||
|
} else if ( $this->mode_detail === "delete" ) {
|
||||||
|
$sql->DeleteDB();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$tsql = ''; $asql = [$this->no_beli]; $qtabel = "inv_detail";
|
||||||
|
if ($this->is_pend) $qtabel = "tmp_inv_detail";
|
||||||
|
if (in_array($this->mode, ["add","edit"])) {
|
||||||
|
if ($this->mode === "add") { $tsql = " AND Unix=?"; $asql[] = $this->app->user()->unix(); }
|
||||||
|
$qtabel = "tmp_inv_detail";
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("(SELECT * FROM ".$qtabel." WHERE No_Ref=?".$tsql.") D LEFT JOIN vi_inv_produk P ON (D.InvID=P.InvID AND D.SatuanID=P.SatuanID AND D.VarianID=P.VarianID)", "D.*,P.Kode_SKU,P.Nama_Lengkap,(D.Qty*D.Harga_Beli)-D.Total_Diskon Total", "", $asql);
|
||||||
|
$obj->set_footer("SUM((D.Qty*D.Harga_Beli)-D.Total_Diskon) Total,SUM(D.Total_Diskon) Total_Diskon");
|
||||||
|
$obj->add_field("ID", "No", "c");
|
||||||
|
$obj->add_field("InvID", "InvID", "hid");
|
||||||
|
$obj->add_field("SatuanID", "SatuanID", "hid");
|
||||||
|
$obj->add_field("VarianID", "VarianID", "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", "D");
|
||||||
|
if (in_array($this->mode, ["add","edit"])) {
|
||||||
|
$obj->add_row_btn("clipboard", "Ubah", "BeliJS.detail_ubah");
|
||||||
|
$obj->add_row_btn("trash", "Hapus", "BeliJS.detail_hapus", "Unix", $this->app->user()->unix());
|
||||||
|
$obj->set_func_btn("BeliJS.detail_tambah", '<i class="bi-plus-lg me-1"></i> Barang');
|
||||||
|
$obj->set_func_btn("BeliJS.produk_brow", '<i class="bi-table me-1"></i> Browse');
|
||||||
|
}
|
||||||
|
$obj->set_func_btn("BeliJS.total_show", "Total");
|
||||||
|
$ajson[] = $obj->json_table("divDetailTabel");
|
||||||
|
|
||||||
|
if (in_array($this->mode, ["add","pending-edit"])) {
|
||||||
|
$ajual = $this->db->fetchRow("SELECT SUM((Qty*Harga_Beli)-Total_Diskon) Jumlah,SUM(Total_Diskon) Diskon FROM ".$qtabel." WHERE No_Ref=?".$tsql, $asql) ?? ['Jumlah'=>0, 'Diskon'=>0];
|
||||||
|
$ajson[] = ['type'=>"form", 'id'=>"Real_Beli", 'value'=>$ajual['Jumlah']];
|
||||||
|
$ajson[] = ['type'=>"form", 'id'=>"Real_Diskon", 'value'=>$ajual['Diskon']];
|
||||||
|
}
|
||||||
|
if (in_array($this->mode_detail, ["insert","update"])) {//WARNING: harga jual dibawah limit margin!!
|
||||||
|
$hbeli = (float) $this->db->fetchField("SELECT CEIL(Harga_Beli-(Total_Diskon/Qty)) Pokok FROM tmp_inv_detail WHERE No_Ref=? AND ID=?", [$this->no_beli, $_id]) ?? 0;
|
||||||
|
$_row = $this->db->fetchRow("SELECT P.Nama_Produk,H.*,G.Margin FROM (SELECT * FROM inv_produk_harga WHERE InvID=? AND SatuanID=? AND Harga_Jual>0 ORDER BY Harga_Jual ASC LIMIT 1) H LEFT JOIN (SELECT * FROM inv_produk WHERE InvID=?) P ON (H.InvID=P.InvID) LEFT JOIN inv_produk_grup G ON (P.Grup_InvID=G.Grup_InvID)", [$this->id_inv, $this->id_satuan, $this->id_inv]);
|
||||||
|
if ($_row) {
|
||||||
|
if ((float) $_row['Margin'] > 0) $hbeli += ($hbeli*((float) $_row['Margin']/100));
|
||||||
|
if ($hbeli > (float) $_row['Harga_Jual']) $ajson[] = ['type'=>"msg", 'mode'=>"error", 'wait'=>3000, 'value'=>"Produk \"".$_row['Nama_Produk']."\" Harga Beli telah melewati Margin Harga Jual!"];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function brow_tx() {
|
||||||
|
$tcari = Param::Get("Cari_TX");
|
||||||
|
$tsql = ''; $asql = [];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql .= "CONCAT(B.No_Beli,B.No_Faktur,S.Nama_Sup,DATE_FORMAT(B.Tgl_Faktur,'%d-%m-%Y')) LIKE ?";
|
||||||
|
$asql[] = '%' . $tcari . '%';
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("(SELECT *,Total_Beli-Total_Diskon Jumlah FROM inv_beli WHERE Data_Beli=1) B LEFT JOIN para_supplier S ON (B.SupID=S.SupID) LEFT JOIN para_cabang C ON (C.CabID=B.CabID)", "B.*,S.Nama_Sup,C.Kode_Cab", $tsql, $asql);
|
||||||
|
$obj->add_field("No_Beli", "No. Trans", "c");
|
||||||
|
$obj->add_field("Tgl_Beli", "Tgl. Trans", "c", "sqltgl", "", "val-tgl");
|
||||||
|
$obj->add_field("Kode_Cab", "Cabang", "c");
|
||||||
|
$obj->add_field("Nama_Sup", "Nama Supplier", "awr");
|
||||||
|
$obj->add_field("Total_Beli", "Sub. Total", "r", "rupiah2");
|
||||||
|
$obj->add_field("Total_Diskon", "Diskon", "r", "rupiah2");
|
||||||
|
$obj->add_field("Jumlah", "Jumlah", "r", "rupiah2");
|
||||||
|
$obj->set_field_order("Tgl_Beli", "D");
|
||||||
|
$obj->set_func_select("BeliJS.tx_select");
|
||||||
|
$this->app->json([ $obj->db_table("divBrowTX") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function brow_pending() {
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("(SELECT *,Total_Beli-Total_Diskon Jumlah FROM inv_beli_pend WHERE UserID=?) B LEFT JOIN para_supplier S ON (B.SupID=S.SupID) LEFT JOIN para_cabang C ON (C.CabID=B.CabID)", "B.*,S.Nama_Sup,C.Kode_Cab", "", [$this->app->user()->id()]);
|
||||||
|
$obj->add_field("No_Beli", "No. Trans", "c");
|
||||||
|
$obj->add_field("Tgl_Beli", "Tgl. Pending", "c", "sqltgl", "", "val-tgl");
|
||||||
|
$obj->add_field("Kode_Cab", "Cabang", "c");
|
||||||
|
$obj->add_field("Nama_Sup", "Nama Supplier", "awr");
|
||||||
|
$obj->add_field("Total_Beli", "Sub. Total", "r", "rupiah2");
|
||||||
|
$obj->add_field("Total_Diskon", "Diskon", "r", "rupiah2");
|
||||||
|
$obj->add_field("Jumlah", "Jumlah", "r", "rupiah2");
|
||||||
|
$obj->set_field_order("No_Beli", "D");
|
||||||
|
$obj->add_row_btn("save", "Pilih", "BeliJS.pending_select");
|
||||||
|
if ($this->app->user()->is_level(1)) $obj->add_row_btn("trash", "Hapus", "BeliJS.pending_delete", "UserID", $this->app->user()->id());
|
||||||
|
$this->app->json([ $obj->db_table("divBrowPending") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function brow_produk() {
|
||||||
|
$tcari = Param::Get("Cari_Produk");
|
||||||
|
$tsql = ''; $asql = [1];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql .= " AND P.Barcode_Nama LIKE ?";
|
||||||
|
$asql[] = '%' . $tcari . '%';
|
||||||
|
}
|
||||||
|
if ((string) Param::Get("Filter_Browse", "") !== "all") {
|
||||||
|
$tsql .= " AND S.SupID=?";
|
||||||
|
array_push($asql, Param::Get("SupID"));
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("vi_inv_produk P LEFT JOIN inv_produk_sup S ON (P.InvID=S.InvID)", "P.*", "P.Aktif=?".$tsql, $asql);
|
||||||
|
$obj->add_field("InvID", "ID", "hid");
|
||||||
|
$obj->add_field("SatuanID", "ID", "hid");
|
||||||
|
$obj->add_field("VarianID", "ID", "hid");
|
||||||
|
$obj->add_field("Kode_SKU", "SKU", "c");
|
||||||
|
$obj->add_field("Kode_Barcode", "Barcode", "c");
|
||||||
|
$obj->add_field("Nama_Lengkap", "Nama Barang", "awr");
|
||||||
|
$obj->set_field_order("Kode_SKU", "A");
|
||||||
|
$obj->set_func_select("BeliJS.produk_select");
|
||||||
|
$this->app->json([ $obj->db_table("divBrowProduk") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function auto_produk() {
|
||||||
|
$tcari = Param::Get("Auto_Query", "");
|
||||||
|
$ajson['autodata'] = [];
|
||||||
|
$bcode = 0; $arec = [];
|
||||||
|
|
||||||
|
// Cari by SKU + Barcode
|
||||||
|
$_row = $this->db->fetchRow("SELECT V.InvID,P.Nama_Produk,CONCAT(V.SatuanID,':',V.VarianID,':',S.Nama_Satuan) Data2 FROM (SELECT * FROM inv_produk_varian WHERE Kode_SKU=? OR Kode_Barcode=? LIMIT 1) V LEFT JOIN inv_produk P ON (P.InvID=V.InvID) LEFT JOIN para_satuan S ON (S.SatuanID=V.SatuanID) WHERE P.Aktif=1", [$tcari, $tcari]);
|
||||||
|
if ($_row) {
|
||||||
|
$bcode = 1;
|
||||||
|
$arec = $_row->getData();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($bcode === 1) {
|
||||||
|
$ajson['autodata'][] = ['value'=>$arec['InvID'], 'text'=>$arec['Nama_Produk'], 'data'=>$arec['Data2'], 'bc'=>1];
|
||||||
|
} else {
|
||||||
|
$stat = $this->db->runQuery("SELECT P.InvID,P.Nama_Produk,V.Kode_SKU,IFNULL(MV.Nama_Varian,'') Nama_Varian,MS.Nama_Satuan,CONCAT(V.SatuanID,':',V.VarianID,':',MS.Nama_Satuan) Data2 FROM (SELECT * FROM inv_produk WHERE Nama_Produk LIKE ? AND Aktif=1) P INNER JOIN inv_produk_varian V ON (V.InvID=P.InvID) LEFT JOIN para_satuan MS ON (MS.SatuanID=V.SatuanID) LEFT JOIN para_varian MV ON (MV.VarianID=V.VarianID) ORDER BY P.Nama_Produk,MS.Nama_Satuan LIMIT 50", ['%'.$tcari.'%']);
|
||||||
|
while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$ajson['autodata'][] = ['value'=>$row['InvID'], 'text'=>$row['Nama_Produk'], 'html'=>'<span class="text-primary">'.$row['Kode_SKU'].'</span> '.$row['Nama_Produk']." ".$row['Nama_Varian']." ".$row['Nama_Satuan'], 'data'=>$row['Data2'], 'bc'=>0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_master() {
|
||||||
|
$ajson = [ 'error'=>"", 'html'=>"" ];
|
||||||
|
$atabel = [];
|
||||||
|
|
||||||
|
if ($this->mode === "pending-edit") {
|
||||||
|
$this->inv->Pending_Edit($this->no_beli);
|
||||||
|
$atabel = $this->Data_Beli($this->no_beli);
|
||||||
|
$this->mode = "edit";
|
||||||
|
} else if ($this->mode === "pending-save") {
|
||||||
|
$b_baru = false;
|
||||||
|
if (str_ends_with($this->no_beli, "#00")) {
|
||||||
|
$b_baru = true;
|
||||||
|
$no_lama = $this->no_beli;
|
||||||
|
$this->no_beli = $this->Pending_Nomor();
|
||||||
|
$this->inv->Pending_Save($no_lama, $this->no_beli);
|
||||||
|
}
|
||||||
|
$apending = $this->db->fetchRow("SELECT SUM(Qty*Harga_Beli) Beli,SUM(Total_Diskon) Diskon FROM tmp_inv_detail WHERE No_Ref=?", [$this->no_beli]) ?? ['Beli'=>0, 'Diskon'=>0];
|
||||||
|
|
||||||
|
$sql = new SQL($this->app);
|
||||||
|
$sql->set_table("inv_beli_pend");
|
||||||
|
$sql->add_param("No_Beli", $this->no_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", $apending['Beli']);
|
||||||
|
$sql->add_param("Total_Diskon", $apending['Diskon']);
|
||||||
|
$sql->add_param("Real_Beli");
|
||||||
|
$sql->add_param("Real_Diskon");
|
||||||
|
$sql->add_param("PPN");
|
||||||
|
$sql->add_param_userid();
|
||||||
|
$sql->add_where("No_Beli", $this->no_beli);
|
||||||
|
if ($b_baru) $sql->InsertDB();
|
||||||
|
else $sql->UpdateDB();
|
||||||
|
$atabel = $this->Data_Beli();
|
||||||
|
} else if ($this->mode === "pending-delete") {
|
||||||
|
$this->inv->Pending_Delete($this->no_beli);
|
||||||
|
$this->db->delete("inv_beli_pend", "No_Beli=?", [$this->no_beli]);
|
||||||
|
$atabel = $this->Data_Beli();
|
||||||
|
} else if ($this->mode === "add") {
|
||||||
|
$atabel = $this->Data_Beli("", true);
|
||||||
|
} else if ($this->mode === "edit") {
|
||||||
|
$this->inv->Detail_Copy($this->no_beli, true);
|
||||||
|
$atabel = $this->Data_Beli($this->no_beli);
|
||||||
|
} else if ($this->mode === "save") {
|
||||||
|
$no_lama = $this->no_beli;
|
||||||
|
if ($this->is_pend) {
|
||||||
|
$this->no_beli = $this->inv->Nomor_Baru("B", Param::Get("Tgl_Beli"), true);
|
||||||
|
if (!str_ends_with($no_lama, "#00")) $this->db->delete("inv_beli_pend", "No_Beli=?", [$no_lama]);
|
||||||
|
}
|
||||||
|
$this->inv->Detail_Save($this->no_beli, 3, $this->id_cab, Param::Get("Tgl_Beli"), $this->is_pend, $no_lama, Param::Int("PPN", 0));
|
||||||
|
|
||||||
|
$abeli = $this->db->fetchRow("SELECT SUM(Qty*Harga_Beli) Beli, SUM(Total_Diskon) Diskon FROM inv_detail WHERE No_Ref=?", [$this->no_beli]) ?? ['Beli'=>0, 'Diskon'=>0];
|
||||||
|
|
||||||
|
$sql = new SQL($this->app);
|
||||||
|
$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("Real_Beli");
|
||||||
|
$sql->add_param("Real_Diskon");
|
||||||
|
$sql->add_param("PPN");
|
||||||
|
$sql->add_param("Data_Beli", 1);
|
||||||
|
$sql->add_param_stamp();
|
||||||
|
$sql->add_param_userid();
|
||||||
|
$sql->add_where("No_Beli", $this->no_beli);
|
||||||
|
$sql->UpdateDB();
|
||||||
|
|
||||||
|
$this->inv->Produk_Update($this->no_beli, Param::Int("SupID", 0));
|
||||||
|
$this->gel->Update_Lunas_Sup(Param::Int("SupID", 0));
|
||||||
|
|
||||||
|
// PROSES POSTING GL
|
||||||
|
$ainfo = $this->db->fetchRow("SELECT B.*,S.Nama_Sup,B.Real_Beli Tagihan FROM (SELECT * FROM inv_beli WHERE No_Beli=?) B LEFT JOIN para_supplier S ON (S.SupID=B.SupID)", [$this->no_beli]);
|
||||||
|
if (count($ainfo) > 0) {
|
||||||
|
$ajurnal = [
|
||||||
|
'Kode_Jurnal' => $ainfo['No_Beli'],
|
||||||
|
'TipeID' => 5,
|
||||||
|
'CabID' => $ainfo['CabID'],
|
||||||
|
'Tanggal' => tgl_sql2str($ainfo['Tgl_Beli']),
|
||||||
|
'Kode_Ref' => $ainfo['No_Beli'],
|
||||||
|
'Catatan' => "Pembelian : ".$ainfo['No_Beli'].(($ainfo['No_Faktur']=="")?"":" (Faktur : ".$ainfo['No_Faktur'].") ")." / ".$ainfo['Nama_Sup']
|
||||||
|
];
|
||||||
|
$adetail = [
|
||||||
|
[
|
||||||
|
'Kode_Rek' => $this->app_gel['STOK'],
|
||||||
|
'DK' => "D",
|
||||||
|
'Jumlah' => $ainfo['Tagihan']
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'Kode_Rek' => $this->app_gel['HUT_USAHA'],
|
||||||
|
'DK' => "K",
|
||||||
|
'Jumlah' => $ainfo['Tagihan'],
|
||||||
|
'SupID' => $ainfo['SupID']
|
||||||
|
]
|
||||||
|
];
|
||||||
|
$this->gel->Jurnal_Post($ajurnal, $adetail);
|
||||||
|
}
|
||||||
|
$atabel = $this->Data_Beli($this->no_beli);
|
||||||
|
$this->mode = "view";
|
||||||
|
|
||||||
|
} else if ($this->mode === "cancel") {
|
||||||
|
if (str_ends_with($this->no_beli, "#00") || !$this->is_pend) $this->inv->Detail_Cancel($this->no_beli);
|
||||||
|
$atabel = $this->Data_Beli();
|
||||||
|
} else {
|
||||||
|
$atabel = $this->Data_Beli($this->no_beli);
|
||||||
|
}
|
||||||
|
|
||||||
|
$enable = in_array($this->mode, ["add","edit"]) ? true : false;
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$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," "]);
|
||||||
|
$tsup = $form->option_db("_", "SupID", $atabel['SupID'], $enable, false, "para_supplier", ["SupID","Nama_Sup"], "Aktif=1 ORDER BY Nama_Sup", [0," "]);
|
||||||
|
$tppn = '<button class="btn btn-secondary" type="button" disabled="">'.Invesa::PPN_Array()[$atabel['PPN']].'</button>';
|
||||||
|
if ($enable) {
|
||||||
|
$tppn = $form->option("_", "PPN", $atabel['PPN'], true, false, Invesa::PPN_Array());
|
||||||
|
$tppn = str_replace("option-tags", "", $tppn);
|
||||||
|
}
|
||||||
|
$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"><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"><div class="input-group">'.$tfaktur.$tppn.'</div></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="Real_Beli" value="'.$atabel['Real_Beli'].'" >
|
||||||
|
<input type="hidden" id="Real_Diskon" value="'.$atabel['Real_Diskon'].'" >
|
||||||
|
<input type="hidden" id="Lunas" value="'.$atabel['Lunas'].'" >
|
||||||
|
<input type="hidden" id="mode" value="'.$this->mode.'" >';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_produk() {
|
||||||
|
$id = (int) Param::Get("ID", 0);
|
||||||
|
$atabel = [ 'ID'=>$id, 'InvID'=>$this->id_inv, 'SatuanID'=>$this->id_satuan, 'VarianID'=>$this->id_varian, 'Nama_Produk'=>"", 'Nama_Satuan'=>"", 'Qty'=>0, 'Harga_Beli'=>0, 'Disk_Rupiah'=>0, 'Disk_Persen1'=>0, 'Disk_Persen2'=>0, 'Disk_Persen3'=>0, 'Disk_Persen4'=>0, 'Disk_Persen5'=>0 ];
|
||||||
|
if ($id > 0) {
|
||||||
|
$_row = $this->db->fetchRow("SELECT * FROM tmp_inv_detail WHERE No_Ref=? AND ID=?", [$this->no_beli, $id]);
|
||||||
|
if ($_row) $atabel = array_merge($atabel, $_row->getData());
|
||||||
|
}
|
||||||
|
if ((int) $atabel['InvID'] > 0 && (int) $atabel['SatuanID'] > 0) {
|
||||||
|
$_row = $this->db->fetchRow("SELECT Nama_Produk,Nama_Satuan FROM vi_inv_produk WHERE InvID=? AND SatuanID=? AND VarianID=?", [$atabel['InvID'], $atabel['SatuanID'], $atabel['VarianID']]);
|
||||||
|
if ($_row) $atabel = array_merge($atabel, $_row->getData());
|
||||||
|
}
|
||||||
|
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tnama = $form->textauto("_", "Nama_Produk", ['value'=>$atabel['InvID'],'text'=>$atabel['Nama_Produk']], true, true, "ketik nama produk");
|
||||||
|
$tvar = $form->option("_", "VarianID", $atabel['VarianID'], true, false, [$atabel['VarianID']=>"Tanpa Varian"]);
|
||||||
|
$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");
|
||||||
|
$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="VarianID">Nama Varian</label>
|
||||||
|
<div class="col">'.$tvar.'</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>
|
||||||
|
<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">3</span>'.$tdis3.'<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"> </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">4</span>'.$tdis4.'<span class="input-group-text">%</span></div></div>
|
||||||
|
<div class="col-sm-4 col-lg-3">'.Invesa::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="'.$this->mode_detail.'" >';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_total() {
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tdisk = $form->textbox("_", "popTotal_Diskon", 0, true, false, "double");
|
||||||
|
$tbeli = $form->textbox("_", "popTotal_Beli", 0, true, false, "double");
|
||||||
|
$ajson['html'] = '
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-6 col-lg-5 col-form-label" for="popTotal_Diskon">Total Diskon (Koreksi +/-)</label>
|
||||||
|
<div class="col">'.$tdisk.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-6 col-lg-5 col-form-label" for="popTotal_Beli">Total Faktur / Hutang</label>
|
||||||
|
<div class="col">'.$tbeli.'</div>
|
||||||
|
</div>
|
||||||
|
';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function proses_delete() {
|
||||||
|
if ($this->is_pend === false) {
|
||||||
|
$this->db->runQuery("DELETE FROM inv_beli WHERE No_Beli=?", [$this->no_beli]);
|
||||||
|
$this->db->runQuery("DELETE FROM inv_detail WHERE No_Ref=?", [$this->no_beli]);
|
||||||
|
// PROSES POSTING GL
|
||||||
|
$this->db->runQuery("DELETE FROM gel_jurnal WHERE Kode_Jurnal=?", [$this->no_beli]);
|
||||||
|
$this->db->runQuery("DELETE FROM gel_jurnal_detail WHERE Kode_Jurnal=?", [$this->no_beli]);
|
||||||
|
} else {
|
||||||
|
$this->db->runQuery("DELETE FROM inv_beli_pend WHERE No_Beli=?", [$this->no_beli]);
|
||||||
|
$this->db->runQuery("DELETE FROM tmp_inv_detail WHERE No_Ref=?", [$this->no_beli]);
|
||||||
|
}
|
||||||
|
$this->app->json([ 'status' => true ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function option_varian() {
|
||||||
|
$aoption = ['type' => "option", 'id' => "VarianID", 'value' => $this->id_varian, 'avalue' => [['value'=>0, 'html'=>"Tanpa Varian"]]];
|
||||||
|
$avarian = $this->db->fetchAll("SELECT * FROM para_varian WHERE VarianID IN (SELECT VarianID FROM inv_produk_varian WHERE InvID=? AND SatuanID=?) ORDER BY Nama_Varian", [$this->id_inv, $this->id_satuan]);
|
||||||
|
foreach ($avarian as $varian) {
|
||||||
|
$aoption['avalue'][] = ['value'=>$varian['VarianID'], 'html'=>$varian['Nama_Varian']];
|
||||||
|
}
|
||||||
|
$this->app->json([ $aoption ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function item_detail() {
|
||||||
|
$ajson['data'] = [];
|
||||||
|
$_row = $this->db->fetchRow("SELECT * FROM inv_detail D WHERE Qty>0 AND InvID=? ORDER BY Tgl_Ref DESC", [$this->id_inv]);
|
||||||
|
if ($_row) $ajson['data'] = $_row->getData();
|
||||||
|
|
||||||
|
if ($this->id_satuan !== (int) $ajson['data']['SatuanID']) {
|
||||||
|
$_bagi = (float) $this->db->fetchField("SELECT A.Qty/B.Qty Bagi FROM (SELECT InvID,Qty FROM inv_produk_kemasan WHERE InvID=? AND SatuanID=? LIMIT 1) A LEFT JOIN (SELECT InvID,Qty FROM inv_produk_kemasan WHERE InvID=? AND SatuanID=? LIMIT 1) B ON (A.InvID=B.InvID)", [$this->id_inv, $this->id_satuan, $this->id_inv, $this->id_satuan]) ?? 1;
|
||||||
|
(float) $ajson['data']['Harga_Beli'] /= $_bagi;
|
||||||
|
(float) $ajson['data']['Disk_Rupiah'] /= $_bagi;
|
||||||
|
}
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$this->app->json(['html' => '
|
||||||
|
<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"> </div>
|
||||||
|
<div id="divDetailTabel"> </div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div></div>
|
||||||
|
</div>'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function Data_Beli(string $nomor="", bool $baru=false): array {
|
||||||
|
$aparam = [ 'No_Beli'=>$nomor, 'PPN'=>0, 'Lunas'=>0 ];
|
||||||
|
if (empty($nomor)) {
|
||||||
|
if ($baru) $aparam['No_Beli'] = "BELI".$this->web_app['SERVER_ID'].(string) $this->id_cab.$this->app->user()->id(3)."#00";
|
||||||
|
$aparam['Tgl_Beli'] = tgl_ymd();
|
||||||
|
$aparam['Tgl_Faktur'] = tgl_ymd();
|
||||||
|
$aparam['No_Faktur'] = "";
|
||||||
|
$aparam['SupID'] = 0;
|
||||||
|
$aparam['CabID'] = $this->id_cab;
|
||||||
|
$aparam['Total_Beli'] = 0;
|
||||||
|
$aparam['Real_Beli'] = 0;
|
||||||
|
$aparam['Real_Diskon'] = 0;
|
||||||
|
} else {
|
||||||
|
$tabel_beli = (str_contains($nomor, "BELI") === false) ? "inv_beli" : "inv_beli_pend";
|
||||||
|
$row = $this->db->fetchRow("SELECT * FROM ".$tabel_beli." WHERE No_Beli=?", [$nomor]);
|
||||||
|
if ($row) $aparam = array_merge($aparam, $row->getData());
|
||||||
|
}
|
||||||
|
return $aparam;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function Pending_Nomor(): string {
|
||||||
|
$tno = "BELI".$this->web_app['SERVER_ID'].(string) $this->id_cab.$this->app->user()->id(3)."#";
|
||||||
|
$ino = (int) $this->db->fetchField("SELECT MAX(RIGHT(No_Beli,2)) FROM inv_beli_pend WHERE No_Beli LIKE ?", [$tno.'%']) ?? 0;
|
||||||
|
$tno .= isi_nol(++$ino, 2);
|
||||||
|
return $tno;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,392 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Inv/BelireturController
|
||||||
|
Description : Transaksi Retur Pembelian
|
||||||
|
Created By : Siau Pheng ([email protected]).
|
||||||
|
Created Date : May 22th, 2010.
|
||||||
|
Last Modified : September 21st, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Inv;
|
||||||
|
|
||||||
|
use App\Utils\Inv;
|
||||||
|
use App\Utils\Gel;
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use flight\Session;
|
||||||
|
use Webapp\DB\SQL;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
use Webapp\Web\Table;
|
||||||
|
|
||||||
|
class BelireturController {
|
||||||
|
|
||||||
|
private array $web_app;
|
||||||
|
private array $app_gel;
|
||||||
|
private int $id_cab;
|
||||||
|
private string $mode;
|
||||||
|
private string $mode_detail;
|
||||||
|
private string $no_beli;
|
||||||
|
private bool $is_baru;
|
||||||
|
private int $id_inv;
|
||||||
|
private int $id_satuan;
|
||||||
|
private int $id_varian;
|
||||||
|
private Inv $inv;
|
||||||
|
private Gel $gel;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->web_app = (array) $session->get('WEB_APP');
|
||||||
|
$this->app_gel = (array) $session->get('APP_GEL');
|
||||||
|
$this->id_cab = Param::Int("CabID", $session->get('APP_INV')['CABANGID']);
|
||||||
|
$this->mode = Param::Get("mode", "");
|
||||||
|
$this->mode_detail = Param::Get("mode_detail", "");
|
||||||
|
$this->no_beli = Param::Get("No_Beli", "");
|
||||||
|
$this->is_baru = str_contains($this->no_beli, "BERE") === true;
|
||||||
|
$this->id_inv = Param::Int("InvID", 0);
|
||||||
|
$this->id_satuan = Param::Int("SatuanID", 0);
|
||||||
|
$this->id_varian = Param::Int("VarianID", 0);
|
||||||
|
$this->inv = new Inv($app);
|
||||||
|
$this->gel = new Gel($app);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function table_detail() {
|
||||||
|
if (in_array($this->mode_detail, ["insert","update","delete"])) {
|
||||||
|
$iqty = Param::Float("Qty", 0) * -1;
|
||||||
|
|
||||||
|
$sql = new SQL($this->app);
|
||||||
|
$sql->set_table("tmp_inv_detail");
|
||||||
|
$sql->add_param("No_Ref", $this->no_beli);
|
||||||
|
$sql->add_param("InvID");
|
||||||
|
$sql->add_param("SatuanID");
|
||||||
|
$sql->add_param("VarianID");
|
||||||
|
$sql->add_param("Qty", $iqty);
|
||||||
|
$sql->add_param("Harga_Beli");
|
||||||
|
$sql->add_param("Harga_Jual", "Harga_Beli", true);
|
||||||
|
$sql->add_param_unix();
|
||||||
|
$sql->add_param_userid();
|
||||||
|
$sql->add_where("ID");
|
||||||
|
$sql->add_where("No_Ref", $this->no_beli);
|
||||||
|
|
||||||
|
if ( $this->mode_detail === "insert" ) {
|
||||||
|
$sql->InsertDB();
|
||||||
|
} else if ( $this->mode_detail === "update" ) {
|
||||||
|
$sql->UpdateDB();
|
||||||
|
} else if ( $this->mode_detail === "delete" ) {
|
||||||
|
$sql->DeleteDB();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$tsql = ''; $asql = [$this->no_beli]; $qtabel = "inv_detail";
|
||||||
|
if (in_array($this->mode, ["add","edit"])) {
|
||||||
|
if ($this->mode === "add") { $tsql = " AND Unix=?"; $asql[] = $this->app->user()->unix(); }
|
||||||
|
$qtabel = "tmp_inv_detail";
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("(SELECT *,-Qty Qty2,(-Qty*Harga_Beli) Total FROM ".$qtabel." WHERE No_Ref=?".$tsql.") D LEFT JOIN vi_inv_produk P ON (D.InvID=P.InvID AND D.SatuanID=P.SatuanID AND D.VarianID=P.VarianID)", "D.*,P.Kode_SKU,P.Nama_Lengkap", "", $asql);
|
||||||
|
$obj->set_footer("SUM(D.Total) Total");
|
||||||
|
$obj->add_field("ID", "No", "c");
|
||||||
|
$obj->add_field("InvID", "InvID", "hid");
|
||||||
|
$obj->add_field("SatuanID", "SatuanID", "hid");
|
||||||
|
$obj->add_field("VarianID", "VarianID", "hid");
|
||||||
|
$obj->add_field("Kode_SKU", "SKU", "c");
|
||||||
|
$obj->add_field("Nama_Lengkap", "Nama Barang", "awr");
|
||||||
|
$obj->add_field("Qty2", "Qty", "r", "rupiah2");
|
||||||
|
$obj->add_field("Harga_Beli", "Harga @", "r", "rupiah");
|
||||||
|
$obj->add_field("Total", "Jumlah", "r", "rupiah", "rupiah");
|
||||||
|
$obj->set_field_order("ID", "D");
|
||||||
|
if (in_array($this->mode, ["add","edit"])) {
|
||||||
|
$obj->add_row_btn("clipboard", "Ubah", "BeliReturJS.detail_ubah");
|
||||||
|
$obj->add_row_btn("trash", "Hapus", "BeliReturJS.detail_hapus", "Unix", $this->app->user()->unix());
|
||||||
|
$obj->set_func_btn("BeliReturJS.detail_tambah", '<i class="bi-plus-lg me-1"></i> Produk');
|
||||||
|
$obj->set_func_btn("BeliReturJS.produk_brow", '<i class="bi-table me-1"></i> Browse');
|
||||||
|
}
|
||||||
|
$ajson[] = $obj->json_table("divDetailTabel");
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function brow_tx() {
|
||||||
|
$tcari = Param::Get("Cari_TX");
|
||||||
|
$tsql = ''; $asql = [];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql .= "CONCAT(B.No_Beli,B.No_Faktur,S.Nama_Sup,DATE_FORMAT(B.Tgl_Faktur,'%d-%m-%Y')) LIKE ?";
|
||||||
|
$asql[] = '%' . $tcari . '%';
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("(SELECT * FROM inv_beli WHERE Data_Beli=0) B LEFT JOIN para_supplier S ON (B.SupID=S.SupID) LEFT JOIN para_cabang C ON (C.CabID=B.CabID)", "B.*,S.Nama_Sup,C.Kode_Cab", $tsql, $asql);
|
||||||
|
$obj->add_field("No_Beli", "No. Trans", "c");
|
||||||
|
$obj->add_field("Tgl_Beli", "Tgl. Trans", "c", "sqltgl", "", "val-tgl");
|
||||||
|
$obj->add_field("Kode_Cab", "Cabang", "c");
|
||||||
|
$obj->add_field("Nama_Sup", "Nama Supplier", "awr");
|
||||||
|
$obj->add_field("Total_Beli", "Total", "r", "rupiah2");
|
||||||
|
$obj->set_field_order("Tgl_Beli", "D");
|
||||||
|
$obj->set_func_select("BeliReturJS.tx_select");
|
||||||
|
$this->app->json([ $obj->db_table("divBrowTX") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function brow_produk() {
|
||||||
|
$tcari = Param::Get("Cari_Produk");
|
||||||
|
$tsql = ''; $asql = [1];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql .= " AND P.Barcode_Nama LIKE ?";
|
||||||
|
$asql[] = '%' . $tcari . '%';
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("vi_inv_produk P", "P.*", "P.Aktif=?".$tsql, $asql);
|
||||||
|
$obj->add_field("InvID", "ID", "hid");
|
||||||
|
$obj->add_field("SatuanID", "ID", "hid");
|
||||||
|
$obj->add_field("VarianID", "ID", "hid");
|
||||||
|
$obj->add_field("Kode_SKU", "SKU", "c");
|
||||||
|
$obj->add_field("Kode_Barcode", "Barcode", "c");
|
||||||
|
$obj->add_field("Nama_Lengkap", "Nama Barang", "awr");
|
||||||
|
$obj->set_field_order("Kode_SKU", "A");
|
||||||
|
$obj->set_func_select("BeliReturJS.produk_select");
|
||||||
|
$this->app->json([ $obj->db_table("divBrowProduk") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function auto_produk() {
|
||||||
|
$tcari = Param::Get("Auto_Query", "");
|
||||||
|
$ajson['autodata'] = [];
|
||||||
|
$bcode = 0; $arec = [];
|
||||||
|
|
||||||
|
// Cari by SKU + Barcode
|
||||||
|
$_row = $this->db->fetchRow("SELECT V.InvID,P.Nama_Produk,CONCAT(V.SatuanID,':',V.VarianID,':',S.Nama_Satuan) Data2 FROM (SELECT * FROM inv_produk_varian WHERE Kode_SKU=? OR Kode_Barcode=? LIMIT 1) V LEFT JOIN inv_produk P ON (P.InvID=V.InvID) LEFT JOIN para_satuan S ON (S.SatuanID=V.SatuanID) WHERE P.Aktif=1", [$tcari, $tcari]);
|
||||||
|
if ($_row) {
|
||||||
|
$bcode = 1;
|
||||||
|
$arec = $_row->getData();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($bcode === 1) {
|
||||||
|
$ajson['autodata'][] = ['value'=>$arec['InvID'], 'text'=>$arec['Nama_Produk'], 'data'=>$arec['Data2'], 'bc'=>1];
|
||||||
|
} else {
|
||||||
|
$stat = $this->db->runQuery("SELECT P.InvID,P.Nama_Produk,V.Kode_SKU,IFNULL(MV.Nama_Varian,'') Nama_Varian,MS.Nama_Satuan,CONCAT(V.SatuanID,':',V.VarianID,':',MS.Nama_Satuan) Data2 FROM (SELECT * FROM inv_produk WHERE Nama_Produk LIKE ? AND Aktif=1) P INNER JOIN inv_produk_varian V ON (V.InvID=P.InvID) LEFT JOIN para_satuan MS ON (MS.SatuanID=V.SatuanID) LEFT JOIN para_varian MV ON (MV.VarianID=V.VarianID) ORDER BY P.Nama_Produk,MS.Nama_Satuan LIMIT 50", ['%'.$tcari.'%']);
|
||||||
|
while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$ajson['autodata'][] = ['value'=>$row['InvID'], 'text'=>$row['Nama_Produk'], 'html'=>'<span class="text-primary">'.$row['Kode_SKU'].'</span> '.$row['Nama_Produk']." ".$row['Nama_Varian']." ".$row['Nama_Satuan'], 'data'=>$row['Data2'], 'bc'=>0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_master() {
|
||||||
|
$ajson = [ 'error'=>"", 'html'=>"" ];
|
||||||
|
$atabel = [];
|
||||||
|
|
||||||
|
if ($this->mode === "add") {
|
||||||
|
$atabel = $this->Data_Beli("", true);
|
||||||
|
} else if ($this->mode === "edit") {
|
||||||
|
$this->inv->Detail_Copy($this->no_beli, true);
|
||||||
|
$atabel = $this->Data_Beli($this->no_beli);
|
||||||
|
} else if ($this->mode === "save") {
|
||||||
|
$no_lama = $this->no_beli;
|
||||||
|
if ($this->is_baru) {
|
||||||
|
$this->no_beli = $this->inv->Nomor_Baru("R", Param::Get("Tgl_Beli"), true);
|
||||||
|
}
|
||||||
|
$this->inv->Detail_Save($this->no_beli, 4, $this->id_cab, Param::Get("Tgl_Beli"), $this->is_baru, $no_lama);
|
||||||
|
|
||||||
|
$tot_retur = $this->db->fetchField("SELECT SUM(Qty*Harga_Beli) Retur_Beli FROM inv_detail WHERE No_Ref=?", [$this->no_beli]) ?? 0;
|
||||||
|
|
||||||
|
$sql = new SQL($this->app);
|
||||||
|
$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("Real_Beli", $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", $this->no_beli);
|
||||||
|
$sql->UpdateDB();
|
||||||
|
|
||||||
|
$this->gel->Update_Lunas_Sup(Param::Int("SupID", 0));
|
||||||
|
|
||||||
|
// PROSES POSTING GL
|
||||||
|
$ainfo = $this->db->fetchRow("SELECT B.*,S.Nama_Sup,-B.Real_Beli Tagihan FROM (SELECT * FROM inv_beli WHERE No_Beli=?) B LEFT JOIN para_supplier S ON (S.SupID=B.SupID)", [$this->no_beli]);
|
||||||
|
if (count($ainfo) > 0) {
|
||||||
|
$ajurnal = [
|
||||||
|
'Kode_Jurnal' => $ainfo['No_Beli'],
|
||||||
|
'TipeID' => 6,
|
||||||
|
'CabID' => $ainfo['CabID'],
|
||||||
|
'Tanggal' => tgl_sql2str($ainfo['Tgl_Beli']),
|
||||||
|
'Kode_Ref' => $ainfo['No_Beli'],
|
||||||
|
'Catatan' => "Retur Pembelian : ".$ainfo['No_Beli']." / ".$ainfo['Nama_Sup']
|
||||||
|
];
|
||||||
|
$adetail = [
|
||||||
|
[ 'Kode_Rek' => $this->app_gel['STOK'], 'DK' => "K", 'Jumlah' => $ainfo['Tagihan'] ],
|
||||||
|
[ 'Kode_Rek' => $this->app_gel['HUT_USAHA'], 'DK' => "D", 'Jumlah' => $ainfo['Tagihan'], 'SupID' => $ainfo['SupID'] ]
|
||||||
|
];
|
||||||
|
$this->gel->Jurnal_Post($ajurnal, $adetail);
|
||||||
|
}
|
||||||
|
$atabel = $this->Data_Beli($this->no_beli);
|
||||||
|
$this->mode = "view";
|
||||||
|
|
||||||
|
} else if ($this->mode === "cancel") {
|
||||||
|
$this->inv->Detail_Cancel($this->no_beli);
|
||||||
|
$atabel = $this->Data_Beli();
|
||||||
|
} else {
|
||||||
|
$atabel = $this->Data_Beli($this->no_beli);
|
||||||
|
}
|
||||||
|
|
||||||
|
$enable = in_array($this->mode, ["add","edit"]) ? true : false;
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tnota = $form->textbox("_", "No_Beli", $atabel['No_Beli'], !$enable, true, "text", "nomor transaksi");
|
||||||
|
$ttglnota = $form->datebox("_", "Tgl_Beli", $atabel['Tgl_Beli'], $enable, true);
|
||||||
|
$tcab = $form->option_db("_", "CabID", $atabel['CabID'], $enable, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY Nama_Cab", [0," "]);
|
||||||
|
$tsup = $form->option_db("_", "SupID", $atabel['SupID'], $enable, false, "para_supplier", ["SupID","Nama_Sup"], "Aktif=1 ORDER BY Nama_Sup", [0," "]);
|
||||||
|
$tcatat = $form->textbox("_", "No_Faktur", $atabel['No_Faktur'], $enable, true, "text", "catatan");
|
||||||
|
$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"><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>
|
||||||
|
<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">
|
||||||
|
<label class="col-sm-3 col-lg-2 col-form-label" for="No_Faktur" style="width:12.5%;">Catatan</label>
|
||||||
|
<div class="col">'.$tcatat.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1"><div class="col"><hr class="my-1"></div></div>
|
||||||
|
<input type="hidden" id="Lunas" value="'.$atabel['Lunas'].'" >
|
||||||
|
<input type="hidden" id="mode" value="'.$this->mode.'" >';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_produk() {
|
||||||
|
$id = (int) Param::Get("ID", 0);
|
||||||
|
$atabel = [ 'ID'=>$id, 'InvID'=>$this->id_inv, 'SatuanID'=>$this->id_satuan, 'VarianID'=>$this->id_varian, 'Nama_Produk'=>"", 'Nama_Satuan'=>"", 'Qty2'=>0, 'Harga_Beli'=>0 ];
|
||||||
|
if ($id > 0) {
|
||||||
|
$_row = $this->db->fetchRow("SELECT *,-Qty Qty2 FROM tmp_inv_detail WHERE No_Ref=? AND ID=?", [$this->no_beli, $id]);
|
||||||
|
if ($_row) $atabel = array_merge($atabel, $_row->getData());
|
||||||
|
}
|
||||||
|
if ((int) $atabel['InvID'] > 0 && (int) $atabel['SatuanID'] > 0) {
|
||||||
|
$_row = $this->db->fetchRow("SELECT Nama_Produk,Nama_Satuan FROM vi_inv_produk WHERE InvID=? AND SatuanID=? AND VarianID=?", [$atabel['InvID'], $atabel['SatuanID'], $atabel['VarianID']]);
|
||||||
|
if ($_row) $atabel = array_merge($atabel, $_row->getData());
|
||||||
|
}
|
||||||
|
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tnama = $form->textauto("_", "Nama_Produk", ['value'=>$atabel['InvID'],'text'=>$atabel['Nama_Produk']], true, true, "ketik nama produk");
|
||||||
|
$tvar = $form->option("_", "VarianID", $atabel['VarianID'], true, false, [$atabel['VarianID']=>"Tanpa Varian"]);
|
||||||
|
$tqty = $form->textbox("_", "Qty", $atabel['Qty2'], true, true, "double");
|
||||||
|
$tbeli = $form->textbox("_", "Harga_Beli", $atabel['Harga_Beli'], true, true, "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-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="VarianID">Nama Varian</label>
|
||||||
|
<div class="col">'.$tvar.'</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-8 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-8 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-8 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="'.$this->mode_detail.'" >';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function proses_delete() {
|
||||||
|
$this->db->runQuery("DELETE FROM inv_beli WHERE No_Beli=?", [$this->no_beli]);
|
||||||
|
$this->db->runQuery("DELETE FROM inv_detail WHERE No_Ref=?", [$this->no_beli]);
|
||||||
|
// PROSES POSTING GL
|
||||||
|
$this->db->runQuery("DELETE FROM gel_jurnal WHERE Kode_Jurnal=?", [$this->no_beli]);
|
||||||
|
$this->db->runQuery("DELETE FROM gel_jurnal_detail WHERE Kode_Jurnal=?", [$this->no_beli]);
|
||||||
|
$this->app->json([ 'status' => true ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function option_varian() {
|
||||||
|
$aoption = ['type' => "option", 'id' => "VarianID", 'value' => $this->id_varian, 'avalue' => [['value'=>0, 'html'=>"Tanpa Varian"]]];
|
||||||
|
$avarian = $this->db->fetchAll("SELECT * FROM para_varian WHERE VarianID IN (SELECT VarianID FROM inv_produk_varian WHERE InvID=? AND SatuanID=?) ORDER BY Nama_Varian", [$this->id_inv, $this->id_satuan]);
|
||||||
|
foreach ($avarian as $varian) {
|
||||||
|
$aoption['avalue'][] = ['value'=>$varian['VarianID'], 'html'=>$varian['Nama_Varian']];
|
||||||
|
}
|
||||||
|
$this->app->json([ $aoption ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$this->app->json(['html' => '
|
||||||
|
<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"> </div>
|
||||||
|
<div id="divDetailTabel"> </div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div></div>
|
||||||
|
</div>'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function Data_Beli(string $nomor="", bool $baru=false): array {
|
||||||
|
$aparam = [ 'No_Beli'=>$nomor, 'Lunas'=>0 ];
|
||||||
|
if (empty($nomor)) {
|
||||||
|
if ($baru) $aparam['No_Beli'] = "BERE".$this->web_app['SERVER_ID'].(string) $this->id_cab.$this->app->user()->id(3)."#00";
|
||||||
|
$aparam['Tgl_Beli'] = tgl_ymd();
|
||||||
|
$aparam['No_Faktur'] = "";
|
||||||
|
$aparam['SupID'] = 0;
|
||||||
|
$aparam['CabID'] = $this->id_cab;
|
||||||
|
} else {
|
||||||
|
$row = $this->db->fetchRow("SELECT * FROM inv_beli WHERE Data_Beli=0 AND No_Beli=?", [$nomor]);
|
||||||
|
if ($row) $aparam = array_merge($aparam, $row->getData());
|
||||||
|
}
|
||||||
|
return $aparam;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,137 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Inv/CekhargaController
|
||||||
|
Description : Informasi Barang & Harga Jual
|
||||||
|
Created By : Siau Pheng ([email protected]).
|
||||||
|
Created Date : October 22nd, 2014.
|
||||||
|
Last Modified : September 27th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Inv;
|
||||||
|
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use flight\Session;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
use Webapp\Web\Table;
|
||||||
|
|
||||||
|
class CekhargaController {
|
||||||
|
|
||||||
|
private int $id_grup_member;
|
||||||
|
private int $id_inv;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->id_grup_member = $session->get('APP_INV')['ECERANID'];
|
||||||
|
$this->id_inv = Param::Int("InvID", 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function brow_produk() {
|
||||||
|
$tcari = Param::Get("Cari_Produk");
|
||||||
|
$tsql = ''; $asql = [1, $this->id_grup_member];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql .= " AND Barcode_Nama LIKE ?";
|
||||||
|
$asql[] = '%' . $tcari . '%';
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("inv_produk_join", "*", "Aktif=? AND Grup_MemberID=? AND Harga_Jual>0".$tsql, $asql);
|
||||||
|
$obj->add_field("InvID", "ID", "hid");
|
||||||
|
$obj->add_field("Kode_SKU", "SKU", "c");
|
||||||
|
$obj->add_field("Kode_Barcode", "Barcode", "c");
|
||||||
|
$obj->add_field("Nama_Lengkap", "Nama Barang", "awr");
|
||||||
|
$obj->add_field("Harga_Jual", "Harga Jual", "r", "rupiah");
|
||||||
|
$obj->add_field("Satuan_Kemasan", "Satuan", "hid");
|
||||||
|
$obj->set_field_order("Kode_SKU", "A");
|
||||||
|
$obj->set_func_select("CekHargaJS.produk_select");
|
||||||
|
$this->app->json([ $obj->db_table("divBrowProduk") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function auto_produk() {
|
||||||
|
$tcari = Param::Get("Auto_Query", "");
|
||||||
|
$ajson['autodata'] = [];
|
||||||
|
$bcode = 0; $arec = [];
|
||||||
|
|
||||||
|
// Cari by SKU + Barcode
|
||||||
|
// Kode_SKU + Kode_Barcode : Satuan_Kemasan : Harga_Jual
|
||||||
|
$_row = $this->db->fetchRow("SELECT P.InvID,P.Nama_Produk_Varian,CONCAT(P.Kode_SKU,' / ',P.Kode_Barcode,':',P.Satuan_Kemasan,':',CONVERT(FORMAT(P.Harga_Jual,2) USING UTF8)) Data2 FROM (SELECT * FROM inv_produk_join WHERE Aktif=1 AND Harga_Jual>0 AND Grup_MemberID=? AND (Kode_SKU=? OR Kode_Barcode=?)) P", [$this->id_grup_member, $tcari, $tcari]);
|
||||||
|
if ($_row) {
|
||||||
|
$bcode = 1;
|
||||||
|
$arec = $_row->getData();
|
||||||
|
}
|
||||||
|
if ($bcode === 1) {
|
||||||
|
$ajson['autodata'][] = ['value'=>$arec['InvID'], 'text'=>$arec['Nama_Produk_Varian'], 'data'=>$arec['Data2'], 'bc'=>1];
|
||||||
|
} else {
|
||||||
|
$stat = $this->db->runQuery("SELECT P.InvID,P.Nama_Lengkap,P.Nama_Produk_Varian,P.Kode_SKU,P.Harga_Jual,CONCAT(P.Kode_SKU,' / ',P.Kode_Barcode,':',P.Satuan_Kemasan,':',CONVERT(FORMAT(P.Harga_Jual,2) USING UTF8)) Data2 FROM (SELECT * FROM inv_produk_join WHERE Barcode_Nama LIKE ? AND Aktif=1 AND Harga_Jual>0 AND Grup_MemberID=?) P ORDER BY P.Nama_Produk,P.Qty LIMIT 50", ['%'.$tcari.'%', $this->id_grup_member]);
|
||||||
|
while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$ajson['autodata'][] = ['value'=>$row['InvID'], 'text'=>$row['Nama_Produk_Varian'], 'html'=>'<span class="text-primary">'.$row['Kode_SKU'].'</span> '.$row['Nama_Lengkap'].' - <strong>Rp'.rupiah($row['Harga_Jual']).'</strong>', 'data'=>$row['Data2'], 'bc'=>0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function scan_produk() {
|
||||||
|
$tcari = Param::Get("Cari_Produk", "");
|
||||||
|
$scandata = ['Nama_Supplier'=>"BELUM ADA"];
|
||||||
|
|
||||||
|
// Cari by SKU + Barcode
|
||||||
|
// InvID : Kode_SKU + Kode_Barcode : Nama_Lengkap : Satuan_Kemasan : Harga_Jual
|
||||||
|
$_row = $this->db->fetchRow("SELECT P.InvID,CONCAT(K.Kode_SKU,' / ',K.Kode_Barcode) Kode_Barang,P.Nama_Produk_Varian Nama_Barang,P.Satuan_Kemasan Nama_Satuan,CONVERT(FORMAT(P.Harga_Jual,2) USING UTF8) Harga_Jual FROM (SELECT * FROM inv_produk_join WHERE Aktif=1 AND Harga_Jual>0 AND Grup_MemberID=? AND (Kode_SKU=? OR Kode_Barcode=?)) P", [$this->id_grup_member, $tcari, $tcari]);
|
||||||
|
if ($_row) $scandata = array_merge($scandata, $_row->getData());
|
||||||
|
|
||||||
|
if (isset($scandata['InvID']) && $scandata['InvID'] > 0) {
|
||||||
|
$_row = $this->db->fetchRow("SELECT Nama_Sup Nama_Supplier FROM para_supplier WHERE SupID=(SELECT SupID FROM inv_produk_sup WHERE InvID=? ORDER BY Aktif DESC LIMIT 1)", [$scandata['InvID']]);
|
||||||
|
if ($_row) $scandata = array_merge($scandata, $_row->getData());
|
||||||
|
}
|
||||||
|
$this->app->json([ $scandata ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function update_sup() {
|
||||||
|
$n_sup = $this->db->fetchField("SELECT Nama_Sup FROM para_supplier WHERE SupID=(SELECT SupID FROM inv_produk_sup WHERE InvID=? ORDER BY Aktif DESC LIMIT 1)", [$this->id_inv]) ?? "BELUM ADA";
|
||||||
|
$this->app->json([ ['type'=>"form", 'id'=>"Nama_Supplier", 'value'=>$n_sup] ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tbrg = $form->textauto("_", "Nama_Produk", ['value'=>0, 'text'=>""], true, true, "Scan SKU / Barcode / Ketik Nama Barang");
|
||||||
|
$tkode = $form->textbox("_", "Kode_Barang", "KODE_SKU / KODE_BARCODE", false);
|
||||||
|
$tnama = $form->textbox("_", "Nama_Barang", "NAMA_BARANG", false);
|
||||||
|
$tsat = $form->textbox("_", "Nama_Satuan", "SATUAN", false);
|
||||||
|
$tharga = $form->textbox("_", "Harga_Jual", "", false);
|
||||||
|
$tsup = $form->textbox("_", "Nama_Supplier", "", false);
|
||||||
|
$ajson['html'] = '';
|
||||||
|
if (isMobile()) {
|
||||||
|
$ajson['html'] .= '
|
||||||
|
<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 {
|
||||||
|
$ajson['html'] .= '
|
||||||
|
<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>
|
||||||
|
';
|
||||||
|
}
|
||||||
|
|
||||||
|
$ajson['html'] .= '
|
||||||
|
<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" />';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,567 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Inv/JualController
|
||||||
|
Description : Transaksi Penjualan
|
||||||
|
Created By : Siau Pheng ([email protected]).
|
||||||
|
Created Date : May 22th, 2010.
|
||||||
|
Last Modified : September 27th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Inv;
|
||||||
|
|
||||||
|
use App\Utils\Inv;
|
||||||
|
use App\Utils\Gel;
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use flight\Session;
|
||||||
|
use Webapp\DB\SQL;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
use Webapp\Web\Table;
|
||||||
|
|
||||||
|
class JualController {
|
||||||
|
|
||||||
|
private array $web_app;
|
||||||
|
private array $app_gel;
|
||||||
|
private int $id_cab;
|
||||||
|
private int $id_member;
|
||||||
|
private int $id_grup_member;
|
||||||
|
private string $mode;
|
||||||
|
private string $mode_detail;
|
||||||
|
private string $no_jual;
|
||||||
|
private bool $is_pend;
|
||||||
|
private int $id_inv;
|
||||||
|
private int $id_satuan;
|
||||||
|
private int $id_varian;
|
||||||
|
private Inv $inv;
|
||||||
|
private Gel $gel;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->web_app = (array) $session->get('WEB_APP');
|
||||||
|
$this->app_gel = (array) $session->get('APP_GEL');
|
||||||
|
$this->id_cab = Param::Int("CabID", $session->get('APP_INV')['CABANGID']);
|
||||||
|
$this->id_member = Param::Int("MemberID", 0);
|
||||||
|
$this->id_grup_member = Param::Int("Grup_MemberID", $session->get('APP_INV')['ECERANID']);
|
||||||
|
$this->mode = Param::Get("mode", "");
|
||||||
|
$this->mode_detail = Param::Get("mode_detail", "");
|
||||||
|
$this->no_jual = Param::Get("No_Jual", "");
|
||||||
|
$this->is_pend = str_contains($this->no_jual, "JUAL") === true;
|
||||||
|
$this->id_inv = Param::Int("InvID", 0);
|
||||||
|
$this->id_satuan = Param::Int("SatuanID", 0);
|
||||||
|
$this->id_varian = Param::Int("VarianID", 0);
|
||||||
|
$this->inv = new Inv($app);
|
||||||
|
$this->gel = new Gel($app);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function table_detail() {
|
||||||
|
if (in_array($this->mode_detail, ["insert","update","delete"])) {
|
||||||
|
$iqty = Param::Float("Qty", 0) * -1;
|
||||||
|
$disk_rp = Param::Float("Disk_Rupiah", 0);
|
||||||
|
$disk_psn = Param::Float("Disk_Persen", 0);
|
||||||
|
if ($disk_psn > 0) $disk_rp = Param::Float("Harga_Jual", 0) * $disk_psn * 0.01;
|
||||||
|
if ($iqty === 0) $disk_rp = 0;
|
||||||
|
|
||||||
|
$sql = new SQL($this->app);
|
||||||
|
$sql->set_table("tmp_inv_detail");
|
||||||
|
$sql->add_param("No_Ref", $this->no_jual);
|
||||||
|
$sql->add_param("InvID");
|
||||||
|
$sql->add_param("SatuanID");
|
||||||
|
$sql->add_param("VarianID");
|
||||||
|
$sql->add_param("Qty", $iqty);
|
||||||
|
$sql->add_param("Harga_Beli");
|
||||||
|
$sql->add_param("Harga_Jual");
|
||||||
|
$sql->add_param("Disk_Rupiah", $disk_rp);
|
||||||
|
$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", $this->no_jual);
|
||||||
|
|
||||||
|
if ( $this->mode_detail === "insert" ) {
|
||||||
|
$sql->InsertDB();
|
||||||
|
} else if ( $this->mode_detail === "update" ) {
|
||||||
|
$sql->UpdateDB();
|
||||||
|
} else if ( $this->mode_detail === "delete" ) {
|
||||||
|
$sql->DeleteDB();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$tsql = ''; $asql = [$this->no_jual]; $qtabel = "inv_detail";
|
||||||
|
if ($this->is_pend) $qtabel = "tmp_inv_detail";
|
||||||
|
if (in_array($this->mode, ["add","edit"])) {
|
||||||
|
if ($this->mode === "add") { $tsql = " AND Unix=?"; $asql[] = $this->app->user()->unix(); }
|
||||||
|
$qtabel = "tmp_inv_detail";
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("(SELECT * FROM ".$qtabel." WHERE No_Ref=?".$tsql.") D LEFT JOIN vi_inv_produk P ON (D.InvID=P.InvID AND D.SatuanID=P.SatuanID AND D.VarianID=P.VarianID)", "D.*,-D.Qty Qty2,P.Kode_SKU,P.Nama_Lengkap,(-D.Qty*D.Harga_Jual)-D.Total_Diskon Total", "", $asql);
|
||||||
|
$obj->set_footer("COUNT(*) Harga_Jual,SUM(D.Total_Diskon) Disk_Rupiah,SUM((-D.Qty*D.Harga_Jual)-D.Total_Diskon) Total");
|
||||||
|
$obj->add_field("ID", "No", "c");
|
||||||
|
$obj->add_field("InvID", "InvID", "hid");
|
||||||
|
$obj->add_field("SatuanID", "SatuanID", "hid");
|
||||||
|
$obj->add_field("VarianID", "VarianID", "hid");
|
||||||
|
$obj->add_field("Kode_SKU", "SKU", "c");
|
||||||
|
$obj->add_field("Nama_Lengkap", "Nama Barang", "awr");
|
||||||
|
$obj->add_field("Qty2", "Qty", "r", "rupiah2");
|
||||||
|
$obj->add_field("Harga_Jual", "Harga @", "r", "rupiah", "items");
|
||||||
|
$obj->add_field("Disk_Rupiah", "Diskon @", "r", "rupiah", "rupiah");
|
||||||
|
$obj->add_field("Total", "Jumlah", "r", "rupiah", "rupiah");
|
||||||
|
$obj->add_field("Promo", "S", "c", [0=>"N",1=>"T",2=>"D",3=>"P",4=>"H"]);
|
||||||
|
$obj->set_field_order("ID", "D");
|
||||||
|
if (in_array($this->mode, ["add","edit"])) {
|
||||||
|
$obj->add_row_btn("clipboard", "Ubah", "JualJS.detail_ubah");
|
||||||
|
$obj->add_row_btn("trash", "Hapus", "JualJS.detail_hapus", "Unix", $this->app->user()->unix());
|
||||||
|
$obj->set_func_btn("JualJS.produk_brow", '<i class="bi-table me-1"></i> Browse');
|
||||||
|
}
|
||||||
|
$ajson[] = $obj->json_table("divDetailTabel");
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function brow_tx() {
|
||||||
|
$tcari = Param::Get("Cari_TX");
|
||||||
|
$tsql1 = ''; $tsql2 = ''; $asql = [$this->id_cab];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql2 .= "CONCAT(J.No_Jual,DATE_FORMAT(J.Tgl_Jual,'%d-%m-%Y'),B.Nama_Member) LIKE ?";
|
||||||
|
array_push($asql, '%' . $tcari . '%');
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("(SELECT *,Total_Jual-Total_Diskon Jumlah FROM inv_jual WHERE POS=0 AND CabID=?".$tsql1.") J LEFT JOIN para_member B ON (J.MemberID=B.MemberID)", "J.*,B.Nama_Member", $tsql2, $asql);
|
||||||
|
$obj->add_field("No_Jual", "No. Trans", "c");
|
||||||
|
$obj->add_field("Tgl_Jual", "Tgl. Trans", "c", "sqltgl", "", "val-tgl");
|
||||||
|
$obj->add_field("Nama_Member", "Nama Member", "awr");
|
||||||
|
$obj->add_field("Total_Jual", "Sub. Total", "r", "rupiah2");
|
||||||
|
$obj->add_field("Total_Diskon", "Diskon", "r", "rupiah2");
|
||||||
|
$obj->add_field("Jumlah", "Jumlah", "r", "rupiah2");
|
||||||
|
$obj->set_field_order("No_Jual", "D");
|
||||||
|
$obj->set_func_select("JualJS.tx_select");
|
||||||
|
$this->app->json([ $obj->db_table("divBrowTX") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function brow_pending() {
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("(SELECT *,Total_Jual-Total_Diskon Jumlah FROM inv_jual_pend WHERE POS=0 AND CabID=? AND UserID=?) J LEFT JOIN para_member B ON (J.MemberID=B.MemberID)", "J.*,B.Nama_Member", "", [$this->id_cab, $this->app->user()->id()]);
|
||||||
|
$obj->add_field("No_Jual", "No. Trans", "c");
|
||||||
|
$obj->add_field("Tgl_Jual", "Tgl. Pending", "c", "sqltgl", "", "val-tgl");
|
||||||
|
$obj->add_field("Nama_Member", "Nama Member", "awr");
|
||||||
|
$obj->add_field("Total_Jual", "Sub. Total", "r", "rupiah2");
|
||||||
|
$obj->add_field("Total_Diskon", "Diskon", "r", "rupiah2");
|
||||||
|
$obj->add_field("Jumlah", "Jumlah", "r", "rupiah2");
|
||||||
|
$obj->set_field_order("No_Jual", "D");
|
||||||
|
$obj->add_row_btn("save", "Pilih", "JualJS.pending_select");
|
||||||
|
if ($this->app->user()->is_level(1)) $obj->add_row_btn("trash", "Hapus", "JualJS.pending_delete", "UserID", $this->app->user()->id());
|
||||||
|
$this->app->json([ $obj->db_table("divBrowPending") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function brow_member() {
|
||||||
|
$tcari = Param::Get("Cari_Member");
|
||||||
|
$tsql = ''; $asql = [1];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql .= " AND CONCAT_WS(Kode_Member,Nama_Member,Alamat_Member,Telp_Member) LIKE ?";
|
||||||
|
$asql[] = '%' . $tcari . '%';
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("para_member", "*", "Aktif=?".$tsql, $asql);
|
||||||
|
$obj->add_field("MemberID", "ID", "hid");
|
||||||
|
$obj->add_field("Grup_MemberID", "Grup ID", "hid");
|
||||||
|
$obj->add_field("Kode_Member", "Kode", "c");
|
||||||
|
$obj->add_field("Nama_Member", "Nama Member", "awr");
|
||||||
|
$obj->add_field("Alamat_Member", "Alamat", "awr");
|
||||||
|
$obj->add_field("Telp_Member", "Telp.", "awr");
|
||||||
|
$obj->set_field_order("Nama_Member", "A");
|
||||||
|
$obj->set_func_select("JualJS.member_select");
|
||||||
|
$this->app->json([ $obj->db_table("divBrowMember") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function brow_produk() {
|
||||||
|
$tcari = Param::Get("Cari_Produk");
|
||||||
|
$tsql = ''; $asql = [1, $this->id_grup_member];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql .= " AND Barcode_Nama LIKE ?";
|
||||||
|
$asql[] = '%' . $tcari . '%';
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("inv_produk_join", "*", "Aktif=? AND Grup_MemberID=? AND Harga_Jual>0".$tsql, $asql);
|
||||||
|
$obj->add_field("InvID", "ID", "hid");
|
||||||
|
$obj->add_field("SatuanID", "ID", "hid");
|
||||||
|
$obj->add_field("VarianID", "ID", "hid");
|
||||||
|
$obj->add_field("Kode_SKU", "SKU", "c");
|
||||||
|
$obj->add_field("Kode_Barcode", "Barcode", "c");
|
||||||
|
$obj->add_field("Nama_Lengkap", "Nama Barang", "awr");
|
||||||
|
$obj->add_field("Harga_Jual", "Harga Jual", "r", "rupiah");
|
||||||
|
$obj->set_field_order("Kode_SKU", "A");
|
||||||
|
$obj->set_func_select("JualJS.produk_select");
|
||||||
|
$this->app->json([ $obj->db_table("divBrowProduk") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function auto_member() {
|
||||||
|
$tcari = Param::Get("Auto_Query", "");
|
||||||
|
$ajson['autodata'] = [];
|
||||||
|
|
||||||
|
$stat = $this->db->runQuery("SELECT MemberID,Grup_MemberID,Kode_Member,Nama_Member,CONCAT(IF(Kode_Member='','',CONCAT(Kode_Member,' - ')),Nama_Member) Kode_Nama FROM para_member WHERE Aktif=1 AND CONCAT(Kode_Member,Nama_Member,Alamat_Member,Telp_Member) LIKE ? ORDER BY Nama_Member LIMIT 50", ['%'.$tcari.'%']);
|
||||||
|
while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$ajson['autodata'][] = ['value'=>$row['MemberID'], 'text'=>$row['Kode_Nama'], 'html'=>'<span class="text-primary">'.$row['Kode_Member'].'</span> '.$row['Nama_Member'], 'data'=>$row['Grup_MemberID'], 'bc'=>0];
|
||||||
|
}
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function auto_produk() {
|
||||||
|
$tcari = Param::Get("Auto_Query", "");
|
||||||
|
$ajson['autodata'] = [];
|
||||||
|
$bcode = 0; $arec = [];
|
||||||
|
|
||||||
|
if (is_numeric($tcari) && strlen($tcari) === 8) {
|
||||||
|
// Cari by Member
|
||||||
|
// M : Grup_Member
|
||||||
|
$_row = $this->db->fetchRow("SELECT MemberID InvID,Nama_Member Nama_Lengkap,CONCAT('M:',Grup_MemberID) Data2 FROM para_member WHERE Aktif=1 AND Kode_Member=?", [$tcari]);
|
||||||
|
if ($_row) {
|
||||||
|
$bcode = 1;
|
||||||
|
$arec = $_row->getData();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cari by SKU + Barcode
|
||||||
|
// P : Satuan : Varian : Harga_Pokok : Harga_Jual : Stok
|
||||||
|
if ($bcode === 0) {
|
||||||
|
$_row = $this->db->fetchRow("SELECT P.InvID,P.Nama_Lengkap,CONCAT('P:',P.SatuanID,':',P.VarianID,':',CONVERT(P.Harga_Pokok USING UTF8),':',CONVERT(P.Harga_Jual USING UTF8),':',CONVERT(IFNULL(X.Stok,0) USING UTF8)) Data2 FROM (SELECT * FROM inv_produk_join WHERE Aktif=1 AND Harga_Jual>0 AND Grup_MemberID=? AND (Kode_SKU=? OR Kode_Barcode=?)) P LEFT JOIN inv_stok X ON (X.CabID=? AND X.InvID=P.InvID)", [$this->id_grup_member, $tcari, $tcari, $this->id_cab]);
|
||||||
|
if ($_row) {
|
||||||
|
$bcode = 1;
|
||||||
|
$arec = $_row->getData();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($bcode === 1) {
|
||||||
|
$ajson['autodata'][] = ['value'=>$arec['InvID'], 'text'=>$arec['Nama_Lengkap'], 'data'=>$arec['Data2'], 'bc'=>1];
|
||||||
|
} else {
|
||||||
|
$stat = $this->db->runQuery("SELECT P.InvID,P.Nama_Lengkap,P.Kode_SKU,IF(IFNULL(X.Stok,0)=0,'KOSONG',ROUND(X.Stok/P.Qty,2)) Sisa_Stok,P.Harga_Jual,CONCAT('P:',P.SatuanID,':',P.VarianID,':',CONVERT(P.Harga_Pokok USING UTF8),':',CONVERT(P.Harga_Jual USING UTF8),':',CONVERT(IFNULL(X.Stok,0) USING UTF8)) Data2 FROM (SELECT * FROM inv_produk_join WHERE Barcode_Nama LIKE ? AND Aktif=1 AND Harga_Jual>0 AND Grup_MemberID=?) P LEFT JOIN inv_stok X ON (X.CabID=? AND X.InvID=P.InvID) ORDER BY P.Nama_Produk,P.Qty LIMIT 50", ['%'.$tcari.'%', $this->id_grup_member, $this->id_cab]);
|
||||||
|
while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$ajson['autodata'][] = ['value'=>$row['InvID'], 'text'=>$row['Nama_Lengkap'], 'html'=>'<span class="text-primary">'.$row['Kode_SKU'].'</span> '.$row['Nama_Lengkap'].' - <strong>Rp'.rupiah($row['Harga_Jual']).'</strong> <span class="text-danger">('.(string) $row['Sisa_Stok'].')</span>', 'data'=>$row['Data2'], 'bc'=>0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_master() {
|
||||||
|
$ajson = [ 'error'=>"", 'html'=>"" ];
|
||||||
|
$atabel = [];
|
||||||
|
|
||||||
|
if ($this->mode === "pending-edit") {
|
||||||
|
$this->inv->Pending_Edit($this->no_jual);
|
||||||
|
$atabel = $this->Data_Jual($this->no_jual);
|
||||||
|
$this->mode = "edit";
|
||||||
|
} else if ($this->mode === "pending-save") {
|
||||||
|
$b_baru = false;
|
||||||
|
if (str_ends_with($this->no_jual, "#00")) {
|
||||||
|
$b_baru = true;
|
||||||
|
$no_lama = $this->no_jual;
|
||||||
|
$this->no_jual = $this->Pending_Nomor();
|
||||||
|
$this->inv->Pending_Save($no_lama, $this->no_jual);
|
||||||
|
}
|
||||||
|
$apending = $this->db->fetchRow("SELECT SUM(-Qty*Harga_Jual) Jual,SUM(Total_Diskon) Diskon FROM tmp_inv_detail WHERE No_Ref=?", [$this->no_jual]) ?? ['Jual'=>0, 'Diskon'=>0];
|
||||||
|
|
||||||
|
$sql = new SQL($this->app);
|
||||||
|
$sql->set_table("inv_jual_pend");
|
||||||
|
$sql->add_param("No_Jual", $this->no_jual);
|
||||||
|
$sql->add_param_date("Tgl_Jual");
|
||||||
|
$sql->add_param("CabID");
|
||||||
|
$sql->add_param("MemberID");
|
||||||
|
$sql->add_param("Total_Jual", $apending['Jual']);
|
||||||
|
$sql->add_param("Total_Diskon", $apending['Diskon']);
|
||||||
|
$sql->add_param("POS", 0);
|
||||||
|
$sql->add_param_userid();
|
||||||
|
$sql->add_where("No_Jual", $this->no_jual);
|
||||||
|
if ($b_baru) $sql->InsertDB();
|
||||||
|
else $sql->UpdateDB();
|
||||||
|
$atabel = $this->Data_Jual();
|
||||||
|
} else if ($this->mode === "pending-delete") {
|
||||||
|
$this->inv->Pending_Delete($this->no_jual);
|
||||||
|
$this->db->delete("inv_jual_pend", "No_Jual=?", [$this->no_jual]);
|
||||||
|
$atabel = $this->Data_Jual();
|
||||||
|
} else if ($this->mode === "add") {
|
||||||
|
$atabel = $this->Data_Jual("", true);
|
||||||
|
} else if ($this->mode === "edit") {
|
||||||
|
$this->inv->Detail_Copy($this->no_jual, true);
|
||||||
|
$atabel = $this->Data_Jual($this->no_jual);
|
||||||
|
} else if ($this->mode === "save") {
|
||||||
|
$tgl_jual = Param::Get("Tgl_Jual", "");
|
||||||
|
$no_lama = $this->no_jual;
|
||||||
|
if ($this->is_pend) {
|
||||||
|
$this->no_jual = $this->inv->Nomor_POS("FJ", $tgl_jual, true);
|
||||||
|
if (!str_ends_with($no_lama, "#00")) $this->db->delete("inv_jual_pend", "No_Jual=?", [$no_lama]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->inv->Detail_Save($this->no_jual, 5, $this->id_cab, $tgl_jual, $this->is_pend, $no_lama);
|
||||||
|
|
||||||
|
$ajual = $this->db->fetchRow("SELECT SUM(-Qty*Harga_Jual) Jual, SUM(Total_Diskon) Diskon, SUM(-Qty*Harga_Beli) HPP FROM inv_detail WHERE No_Ref=?", [$this->no_jual]) ?? ['Jual'=>0, 'Diskon'=>0, 'HPP'=>0];
|
||||||
|
|
||||||
|
$sql = new SQL($this->app);
|
||||||
|
$sql->set_table("inv_jual");
|
||||||
|
$sql->add_param_date("Tgl_Jual");
|
||||||
|
$sql->add_param("CabID", $this->id_cab);
|
||||||
|
$sql->add_param("MemberID");
|
||||||
|
$sql->add_param("Total_Jual", $ajual['Jual']);
|
||||||
|
$sql->add_param("Total_Diskon", $ajual['Diskon']);
|
||||||
|
$sql->add_param("Total_HPP", $ajual['HPP']);
|
||||||
|
$sql->add_param("POS", 0);
|
||||||
|
$sql->add_param_stamp();
|
||||||
|
$sql->add_param_userid();
|
||||||
|
$sql->add_where("No_Jual", $this->no_jual);
|
||||||
|
$sql->UpdateDB();
|
||||||
|
|
||||||
|
$this->gel->Update_Lunas_Buy($this->id_member);
|
||||||
|
|
||||||
|
// PROSES MEMBER POINT
|
||||||
|
if ($this->id_member > 0) {
|
||||||
|
$apoint = $this->db->fetchColumn("SELECT Point_TipeID FROM inv_point_tipe WHERE Aktif=1 ORDER BY Point_TipeID") ?? [];
|
||||||
|
if (count($apoint) > 0) {
|
||||||
|
$amember = $this->db->fetchRow("SELECT Grup_MemberID,IM,Kode_Member FROM para_member WHERE MemberID=?", [$this->id_member]);
|
||||||
|
if ($amember && ($amember['IM'] === 1 || ($amember['IM'] === 0 && !empty($amember['Kode_Member'])))) {
|
||||||
|
$this->db->runQuery("DELETE FROM inv_point_tx WHERE No_TX=?", [$this->no_jual]);
|
||||||
|
foreach ($apoint as $id_tipe) {
|
||||||
|
if ($amember['IM'] === 0 && $id_tipe === 1) continue;
|
||||||
|
$tot_point = $this->inv->Point_Hitung($this->no_jual, $tgl_jual, $amember['Grup_MemberID'], 0, $id_tipe);
|
||||||
|
if ($tot_point > 0) $this->db->runQuery("INSERT INTO inv_point_tx (No_TX,Tgl_TX,Point_TipeID,CabID,MemberID,Point,Nilai_Point,DateStamp,UserID) VALUES (?, ?, ?, ?, ?, ?, ?, NOW(), ?)", [$this->no_jual, tgl_sql2str($tgl_jual), $id_tipe, $this->id_cab, $this->id_member, $tot_point, $tot_point, $this->app->user()->id()]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// PROSES POSTING GL
|
||||||
|
$ainfo = $this->db->fetchRow("SELECT J.*,B.Nama_Member,(J.Total_Jual-J.Total_Diskon) Tagihan FROM (SELECT * FROM inv_jual WHERE No_Jual=?) J LEFT JOIN para_member B ON (B.MemberID=J.MemberID)", [$this->no_jual]);
|
||||||
|
if (count($ainfo) > 0) {
|
||||||
|
$ajurnal = [
|
||||||
|
'Kode_Jurnal' => $ainfo['No_Jual'],
|
||||||
|
'TipeID' => 8,
|
||||||
|
'CabID' => $ainfo['CabID'],
|
||||||
|
'Tanggal' => tgl_sql2str($ainfo['Tgl_Jual']),
|
||||||
|
'Kode_Ref' => $ainfo['No_Jual'],
|
||||||
|
'Catatan' => "Penjualan : ".$ainfo['No_Jual']." | ".$ainfo['Nama_Member']." | ".$this->app->user()->username()
|
||||||
|
];
|
||||||
|
$adetail = [
|
||||||
|
[ 'Kode_Rek' => $this->app_gel['HPP'], 'DK' => "D", 'Jumlah' => $ainfo['Total_HPP'] ],
|
||||||
|
[ 'Kode_Rek' => $this->app_gel['STOK'], 'DK' => "K", 'Jumlah' => $ainfo['Total_HPP'] ],
|
||||||
|
[ 'Kode_Rek' => $this->app_gel['PIU_USAHA'], 'DK' => "D", 'Jumlah' => $ainfo['Tagihan'], 'MemberID' => $ainfo['MemberID'] ],
|
||||||
|
[ 'Kode_Rek' => $this->app_gel['JUAL'], 'DK' => "K", 'Jumlah' => $ainfo['Tagihan'] ]
|
||||||
|
];
|
||||||
|
$this->gel->Jurnal_Post($ajurnal, $adetail);
|
||||||
|
}
|
||||||
|
$atabel = $this->Data_Jual($this->no_jual);
|
||||||
|
$this->mode = "view";
|
||||||
|
|
||||||
|
} else if ($this->mode === "cancel") {
|
||||||
|
if (str_ends_with($this->no_jual, "#00") || !$this->is_pend) $this->inv->Detail_Cancel($this->no_jual);
|
||||||
|
$atabel = $this->Data_Jual();
|
||||||
|
} else {
|
||||||
|
$atabel = $this->Data_Jual($this->no_jual);
|
||||||
|
}
|
||||||
|
|
||||||
|
$enable = in_array($this->mode, ["add","edit"]) ? true : false;
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tnota = $form->textbox("_", "No_Jual", $atabel['No_Jual'], !$enable, true, "text", "nomor transaksi");
|
||||||
|
$ttglnota = $form->datebox("_", "Tgl_Jual", $atabel['Tgl_Jual'], $enable, true);
|
||||||
|
$ttgllunas = $form->datebox("_", "Tgl_Lunas", $atabel['Tgl_Lunas'], false, false);
|
||||||
|
$tcab = $form->option_db("_", "CabID", $atabel['CabID'], $enable, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY Nama_Cab", [0," "]);
|
||||||
|
$tmember = $form->textauto("_", "Nama_Member", ['value'=>$atabel['MemberID'],'text'=>$atabel['Nama_Member']], true, true, "nama member");
|
||||||
|
$tpiutang = $form->textbox("_", "Total_Piutang", 0, false, false, "double");
|
||||||
|
$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_Jual">Nomor Transaksi</label>
|
||||||
|
<div class="col"><div class="input-group">'.$tnota.'<button id="butBrow" class="btn btn-info" type="button"><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_Jual">Tanggal Transaksi</label>
|
||||||
|
<div class="col-sm-7 col-lg-5">'.$ttglnota.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1 collapse iextra" id="iex1">
|
||||||
|
<label class="col-sm-5 col-lg-3 col-form-label">Tanggal Lunas</label>
|
||||||
|
<div class="col-sm-7 col-lg-5">'.$ttgllunas.'</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="MemberID">Nama Member<span class="float-end"><a class="text-decoration-none text-active" type="button" data-bs-toggle="collapse" data-bs-target=".iextra" aria-expanded="false" aria-controls="iex1 iex2"><i class="fw-bolder bi-arrows-expand"></i></a></span></label>
|
||||||
|
<div class="col"><div class="input-group">'.$tmember.'<button id="butBrowMember" class="btn btn-info" type="button"><i class="bi-people-fill"></i></button></div></div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1 collapse iextra" id="iex2">
|
||||||
|
<label class="col-sm-5 col-lg-3 col-form-label">Jumlah Piutang</label>
|
||||||
|
<div class="col">'.$tpiutang.'</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1"><div class="col"><hr class="my-1"></div></div>
|
||||||
|
<div class="row mb-1'.(in_array($this->mode, ['add','edit']) ? '' : ' d-none').'">
|
||||||
|
<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" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<input type="hidden" id="MemberID" value="'.$atabel['MemberID'].'" >
|
||||||
|
<input type="hidden" id="Grup_MemberID" value="'.$atabel['Grup_MemberID'].'" >
|
||||||
|
<input type="hidden" id="Lunas" value="'.$atabel['Lunas'].'" >
|
||||||
|
<input type="hidden" id="mode" value="'.$this->mode.'" >';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_produk() {
|
||||||
|
$id = (int) Param::Get("ID", 0);
|
||||||
|
$atabel = [ 'ID'=>$id, 'InvID'=>$this->id_inv, 'SatuanID'=>$this->id_satuan, 'VarianID'=>$this->id_varian, 'Kode_SKU'=>"", 'Kode_Barcode'=>"", 'Nama_Lengkap'=>"", 'Satuan_Kemasan'=>"", 'Qty'=>0, 'Harga_Beli'=>0, 'Harga_Jual'=>0, 'Disk_Rupiah'=>0 ];
|
||||||
|
if ($id > 0) {
|
||||||
|
$_row = $this->db->fetchRow("SELECT ID,-Qty Qty,Harga_Beli,Harga_Jual,Disk_Rupiah FROM tmp_inv_detail WHERE No_Ref=? AND ID=?", [$this->no_jual, $id]);
|
||||||
|
if ($_row) $atabel = array_merge($atabel, $_row->getData());
|
||||||
|
}
|
||||||
|
if ($this->id_inv > 0 && $this->id_satuan > 0) {
|
||||||
|
$_row = $this->db->fetchRow("SELECT Kode_SKU,Kode_Barcode,Nama_Lengkap,Satuan_Kemasan,Harga_Pokok Harga_Beli,Harga_Jual FROM inv_produk_join WHERE InvID=? AND SatuanID=? AND VarianID=? AND Grup_MemberID=?", [$this->id_inv, $this->id_satuan, $this->id_varian, $this->id_grup_member]);
|
||||||
|
if ($_row) $atabel = array_merge($atabel, $_row->getData());
|
||||||
|
}
|
||||||
|
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tsku = $form->textbox("_", "Kode_SKU", $atabel['Kode_SKU']. " / " .$atabel['Kode_Barcode'], false);
|
||||||
|
$tnama = $form->textbox("_", "Nama_Lengkap", $atabel['Nama_Lengkap'], false);
|
||||||
|
$tqty = $form->textbox("_", "Qty", $atabel['Qty'], true, true, "double");
|
||||||
|
$tjual = $form->textbox("_", "Harga_Jual", $atabel['Harga_Jual'], false, false, "double");
|
||||||
|
$tdisrp = $form->textbox("_", "Disk_Rupiah", $atabel['Disk_Rupiah'], true, true, "double");
|
||||||
|
$tdispn = $form->textbox("_", "Disk_Persen", 0, true, false, "double");
|
||||||
|
$ttot = $form->textbox("_", "Jumlah", 0, false, false, "double");
|
||||||
|
$tsat = $form->textbox("_", "Nama_Satuan", $atabel['Satuan_Kemasan'], false);
|
||||||
|
$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">'.$tsku.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label">Nama Barang</label>
|
||||||
|
<div class="col">'.$tnama.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1"><hr class="my-1"></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">Harga (@)</label>
|
||||||
|
<div class="col-sm-8 col-lg-5">'.$tjual.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="Disk_Rupiah">Diskon (@)</label>
|
||||||
|
<div class="col-sm-8 col-lg-5">'.$tdisrp.'</div>
|
||||||
|
<div class="col-sm-3 col-lg-3"><div class="input-group"><div class="input-group-text">≈</div>'.$tdispn.'<div class="input-group-text">%</div></div></div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label">Sub Total</label>
|
||||||
|
<div class="col-sm-8 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="VarianID" value="'.$atabel['VarianID'].'" >
|
||||||
|
<input type="hidden" id="Harga_Beli" value="'.$atabel['Harga_Beli'].'" >
|
||||||
|
<input type="hidden" id="mode_detail" value="'.$this->mode_detail.'" >';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function proses_delete() {
|
||||||
|
if ($this->is_pend === false) {
|
||||||
|
$this->db->runQuery("DELETE FROM inv_jual WHERE No_Jual=?", [$this->no_jual]);
|
||||||
|
$this->db->runQuery("DELETE FROM inv_detail WHERE No_Ref=?", [$this->no_jual]);
|
||||||
|
// PROSES POSTING GL
|
||||||
|
$this->db->runQuery("DELETE FROM gel_jurnal WHERE Kode_Jurnal=?", [$this->no_jual]);
|
||||||
|
$this->db->runQuery("DELETE FROM gel_jurnal_detail WHERE Kode_Jurnal=?", [$this->no_jual]);
|
||||||
|
// PROSES MEMBER POINT
|
||||||
|
if ($this->id_member > 0) $this->db->runQuery("DELETE FROM inv_point_tx WHERE No_TX=?", [$this->no_jual]);
|
||||||
|
} else {
|
||||||
|
$this->db->runQuery("DELETE FROM inv_jual_pend WHERE No_Jual=?", [$this->no_jual]);
|
||||||
|
$this->db->runQuery("DELETE FROM tmp_inv_detail WHERE No_Ref=?", [$this->no_jual]);
|
||||||
|
}
|
||||||
|
$this->app->json([ 'status' => true ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function update_piutang() {
|
||||||
|
$_piut = $this->db->fetchField("SELECT SUM(Total_Jual-Total_Diskon-Total_Bayar-Total_Potong) Jumlah FROM inv_jual WHERE MemberID=? AND Lunas=0", [$this->id_member]) ?? 0;
|
||||||
|
$this->app->json([ ['type'=>"form", 'id'=>"Total_Piutang", 'value'=>rupiah2($_piut)] ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$this->app->json(['html' => '
|
||||||
|
<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 Penjualan</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 dropdown-toggle" id="butPrint" type="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><i class="bi-printer me-2"></i>Cetak</button>
|
||||||
|
<div class="dropdown-menu" aria-labelledby="butPrint">
|
||||||
|
<a class="dropdown-item" href="#" id="printNota">Cetak Nota</a>
|
||||||
|
<a class="dropdown-item" href="#" id="printPOS">Cetak POS</a>
|
||||||
|
</div>
|
||||||
|
<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"> </div>
|
||||||
|
<div id="divDetailTabel"> </div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div></div>
|
||||||
|
</div>'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function Data_Jual(string $nomor="", bool $baru=false): array {
|
||||||
|
$aparam = [
|
||||||
|
'No_Jual' => $nomor,
|
||||||
|
'Tgl_Jual' => tgl_ymd(),
|
||||||
|
'Tgl_Lunas' => "0000-00-00",
|
||||||
|
'CabID' => $this->id_cab,
|
||||||
|
'MemberID' => $this->id_member,
|
||||||
|
'Grup_MemberID' => $this->id_grup_member,
|
||||||
|
'Nama_Member' => "",
|
||||||
|
'Lunas' => 0
|
||||||
|
];
|
||||||
|
if ($baru) $aparam['No_Jual'] = "JUAL".$this->web_app['SERVER_ID'].(string) $this->id_cab.$this->app->user()->id(3)."#00";
|
||||||
|
if (!empty($nomor)) {
|
||||||
|
$tabel_jual = (str_contains($nomor, "JUAL") === false) ? "inv_jual" : "inv_jual_pend";
|
||||||
|
$row = $this->db->fetchRow("SELECT * FROM ".$tabel_jual." WHERE CabID=? AND No_Jual=?", [$this->id_cab, $nomor]);
|
||||||
|
if ($row) $aparam = array_merge($aparam, $row->getData());
|
||||||
|
if ($aparam['MemberID'] > 0) {
|
||||||
|
$row = $this->db->fetchRow("SELECT Grup_MemberID,Nama_Member FROM para_member WHERE MemberID=?", [$aparam['MemberID']]);
|
||||||
|
if ($row) $aparam = array_merge($aparam, $row->getData());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $aparam;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function Pending_Nomor(): string {
|
||||||
|
$tno = "JUAL".$this->web_app['SERVER_ID'].(string) $this->id_cab.$this->app->user()->id(3)."#";
|
||||||
|
$ino = (int) $this->db->fetchField("SELECT MAX(RIGHT(No_Jual,2)) FROM inv_jual_pend WHERE No_Jual LIKE ?", [$tno.'%']) ?? 0;
|
||||||
|
$tno .= isi_nol(++$ino, 2);
|
||||||
|
return $tno;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,373 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Inv/MutasiController
|
||||||
|
Description : Transaksi Mutasi Stok Antar Cabang
|
||||||
|
Created By : Siau Pheng ([email protected]).
|
||||||
|
Created Date : February 28th, 2011.
|
||||||
|
Last Modified : September 27th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Inv;
|
||||||
|
|
||||||
|
use App\Utils\Inv;
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use flight\Session;
|
||||||
|
use Webapp\DB\SQL;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
use Webapp\Web\Table;
|
||||||
|
|
||||||
|
class MutasiController {
|
||||||
|
|
||||||
|
private array $web_app;
|
||||||
|
private int $id_cab_dari;
|
||||||
|
private int $id_cab_ke;
|
||||||
|
private string $mode;
|
||||||
|
private string $mode_detail;
|
||||||
|
private string $no_mutasi;
|
||||||
|
private bool $is_baru;
|
||||||
|
private int $id_inv;
|
||||||
|
private int $id_satuan;
|
||||||
|
private int $id_varian;
|
||||||
|
private Inv $inv;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->web_app = (array) $session->get('WEB_APP');
|
||||||
|
$this->id_cab_dari = Param::Int("Dari_CabID", $session->get('APP_INV')['CABANGID']);
|
||||||
|
$this->id_cab_ke = Param::Int("Ke_CabID", 0);
|
||||||
|
$this->mode = Param::Get("mode", "");
|
||||||
|
$this->mode_detail = Param::Get("mode_detail", "");
|
||||||
|
$this->no_mutasi = Param::Get("No_Mutasi", "");
|
||||||
|
$this->is_baru = str_contains($this->no_mutasi, "MUTA") === true;
|
||||||
|
$this->id_inv = Param::Int("InvID", 0);
|
||||||
|
$this->id_satuan = Param::Int("SatuanID", 0);
|
||||||
|
$this->id_varian = Param::Int("VarianID", 0);
|
||||||
|
$this->inv = new Inv($app);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function table_detail() {
|
||||||
|
if (in_array($this->mode_detail, ["insert","update","delete"])) {
|
||||||
|
$iqty = Param::Float("Qty", 0);
|
||||||
|
|
||||||
|
$sql = new SQL($this->app);
|
||||||
|
$sql->set_table("tmp_inv_detail");
|
||||||
|
$sql->add_param("No_Ref", $this->no_mutasi);
|
||||||
|
$sql->add_param("InvID");
|
||||||
|
$sql->add_param("SatuanID");
|
||||||
|
$sql->add_param("VarianID");
|
||||||
|
$sql->add_param("Qty", $iqty);
|
||||||
|
$sql->add_param("Harga_Beli");
|
||||||
|
$sql->add_param("Harga_Jual", "Harga_Beli", true);
|
||||||
|
$sql->add_param_unix();
|
||||||
|
$sql->add_param_userid();
|
||||||
|
$sql->add_where("ID");
|
||||||
|
$sql->add_where("No_Ref", $this->no_mutasi);
|
||||||
|
|
||||||
|
if ( $this->mode_detail === "insert" ) {
|
||||||
|
$sql->InsertDB();
|
||||||
|
} else if ( $this->mode_detail === "update" ) {
|
||||||
|
$sql->UpdateDB();
|
||||||
|
} else if ( $this->mode_detail === "delete" ) {
|
||||||
|
$sql->DeleteDB();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$tsql = ' AND Qty>0'; $asql = [$this->no_mutasi]; $qtabel = "inv_detail";
|
||||||
|
if (in_array($this->mode, ["add","edit"])) {
|
||||||
|
if ($this->mode === "add") { $tsql = " AND Unix=?"; array_push($asql, $this->app->user()->unix()); }
|
||||||
|
$qtabel = "tmp_inv_detail";
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("(SELECT * FROM ".$qtabel." WHERE No_Ref=?".$tsql.") D LEFT JOIN vi_inv_produk P ON (D.InvID=P.InvID AND D.SatuanID=P.SatuanID AND D.VarianID=P.VarianID)", "D.*,P.Kode_SKU,P.Nama_Lengkap,(D.Qty*D.Harga_Beli) Total", "", $asql);
|
||||||
|
$obj->set_footer("COUNT(*) Harga_Beli,SUM(D.Qty*D.Harga_Beli) Total");
|
||||||
|
$obj->add_field("ID", "No", "c");
|
||||||
|
$obj->add_field("InvID", "InvID", "hid");
|
||||||
|
$obj->add_field("SatuanID", "SatuanID", "hid");
|
||||||
|
$obj->add_field("VarianID", "VarianID", "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", "items");
|
||||||
|
$obj->add_field("Total", "Jumlah", "r", "rupiah", "rupiah");
|
||||||
|
$obj->set_field_order("ID", "D");
|
||||||
|
if (in_array($this->mode, ["add","edit"])) {
|
||||||
|
$obj->add_row_btn("clipboard", "Ubah", "MutasiJS.detail_ubah");
|
||||||
|
$obj->add_row_btn("trash", "Hapus", "MutasiJS.detail_hapus", "Unix", $this->app->user()->unix());
|
||||||
|
$obj->set_func_btn("MutasiJS.produk_brow", '<i class="bi-table me-1"></i> Browse');
|
||||||
|
}
|
||||||
|
$ajson[] = $obj->json_table("divDetailTabel");
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function brow_tx() {
|
||||||
|
$tcari = Param::Get("Cari_TX");
|
||||||
|
$tsql = ''; $asql = [];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql .= " WHERE CONCAT(No_Mutasi,DATE_FORMAT(Tgl_Mutasi,'%d-%m-%Y')) LIKE ?";
|
||||||
|
array_push($asql, '%' . $tcari . '%');
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$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", "", $asql);
|
||||||
|
$obj->add_field("No_Mutasi", "No. Trans", "c");
|
||||||
|
$obj->add_field("Tgl_Mutasi", "Tgl. Trans", "c", "sqltgl", "", "val-tgl");
|
||||||
|
$obj->add_field("Cab1", "Dari Cab", "c");
|
||||||
|
$obj->add_field("Cab2", "Ke Cab", "c");
|
||||||
|
$obj->add_field("Total_Mutasi", "Total", "r", "rupiah2");
|
||||||
|
$obj->set_field_order("No_Mutasi", "D");
|
||||||
|
$obj->set_func_select("MutasiJS.tx_select");
|
||||||
|
$this->app->json([ $obj->db_table("divBrowTX") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function brow_produk() {
|
||||||
|
$tcari = Param::Get("Cari_Produk");
|
||||||
|
$tsql = ''; $asql = [];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql .= " AND Barcode_Nama LIKE ?";
|
||||||
|
array_push($asql, '%' . $tcari . '%');
|
||||||
|
}
|
||||||
|
array_push($asql, $this->id_cab_dari);
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("(SELECT * FROM inv_produk_join WHERE Aktif=1".$tsql." GROUP BY InvID,SatuanID,VarianID) P LEFT JOIN inv_stok X ON (X.CabID=? AND X.InvID=P.InvID)", "P.InvID,P.SatuanID,P.VarianID,P.Kode_SKU,P.Kode_Barcode,P.Nama_Lengkap,IF(IFNULL(X.Stok,0)=0,0,ROUND(X.Stok/P.Qty,2)) Sisa_Stok", "", $asql);
|
||||||
|
$obj->add_field("InvID", "ID", "hid");
|
||||||
|
$obj->add_field("SatuanID", "ID", "hid");
|
||||||
|
$obj->add_field("VarianID", "ID", "hid");
|
||||||
|
$obj->add_field("Kode_SKU", "SKU", "c");
|
||||||
|
$obj->add_field("Kode_Barcode", "Barcode", "c");
|
||||||
|
$obj->add_field("Nama_Lengkap", "Nama Barang", "awr");
|
||||||
|
$obj->add_field("Sisa_Stok", "Stok", "r", "rupiah2");
|
||||||
|
$obj->set_field_order("Kode_SKU", "A");
|
||||||
|
$obj->set_func_select("MutasiJS.produk_select");
|
||||||
|
$this->app->json([ $obj->db_table("divBrowProduk") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function auto_produk() {
|
||||||
|
$tcari = Param::Get("Auto_Query", "");
|
||||||
|
$ajson['autodata'] = [];
|
||||||
|
$bcode = 0; $arec = [];
|
||||||
|
|
||||||
|
// Cari by SKU + Barcode
|
||||||
|
// Satuan : Varian : Harga_Pokok
|
||||||
|
$_row = $this->db->fetchRow("SELECT P.InvID,P.Nama_Lengkap,CONCAT(P.SatuanID,':',P.VarianID,':',CONVERT(P.Harga_Pokok USING UTF8)) Data2 FROM (SELECT * FROM inv_produk_join WHERE Aktif=1 AND (Kode_SKU=? OR Kode_Barcode=?) GROUP BY InvID,SatuanID,VarianID) P LEFT JOIN inv_stok X ON (X.CabID=? AND X.InvID=P.InvID)", [$tcari, $tcari, $this->id_cab_dari]);
|
||||||
|
if ($_row) {
|
||||||
|
$bcode = 1;
|
||||||
|
$arec = $_row->getData();
|
||||||
|
}
|
||||||
|
if ($bcode === 1) {
|
||||||
|
$ajson['autodata'][] = ['value'=>$arec['InvID'], 'text'=>$arec['Nama_Lengkap'], 'data'=>$arec['Data2'], 'bc'=>1];
|
||||||
|
} else {
|
||||||
|
$stat = $this->db->runQuery("SELECT P.InvID,P.Nama_Lengkap,P.Kode_SKU,IF(IFNULL(X.Stok,0)=0,'KOSONG',ROUND(X.Stok/P.Qty,2)) Sisa_Stok,CONCAT(P.SatuanID,':',P.VarianID,':',CONVERT(P.Harga_Pokok USING UTF8)) Data2 FROM (SELECT * FROM inv_produk_join WHERE Barcode_Nama LIKE ? AND Aktif=1 GROUP BY InvID,SatuanID,VarianID) P LEFT JOIN inv_stok X ON (X.CabID=? AND X.InvID=P.InvID) ORDER BY P.Nama_Produk,P.Qty LIMIT 50", ['%'.$tcari.'%', $this->id_cab_dari]);
|
||||||
|
while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$ajson['autodata'][] = ['value'=>$row['InvID'], 'text'=>$row['Nama_Lengkap'], 'html'=>'<span class="text-primary">'.$row['Kode_SKU'].'</span> '.$row['Nama_Lengkap'].' <span class="text-danger">('.(string) $row['Sisa_Stok'].')</span>', 'data'=>$row['Data2'], 'bc'=>0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_master() {
|
||||||
|
$ajson = [ 'error'=>"", 'html'=>"" ];
|
||||||
|
$atabel = [];
|
||||||
|
|
||||||
|
if ($this->mode === "add") {
|
||||||
|
$atabel = $this->Data_Mutasi("", true);
|
||||||
|
} else if ($this->mode === "edit") {
|
||||||
|
$this->inv->Detail_Copy($this->no_mutasi, true);
|
||||||
|
$atabel = $this->Data_Mutasi($this->no_mutasi);
|
||||||
|
} else if ($this->mode === "save") {
|
||||||
|
$no_lama = $this->no_mutasi;
|
||||||
|
$tgl_mutasi = Param::Get("Tgl_Mutasi");
|
||||||
|
if ($this->is_baru) {
|
||||||
|
$this->no_mutasi = $this->inv->Nomor_Baru("M", $tgl_mutasi, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->inv->Detail_Save($this->no_mutasi, 2, $this->id_cab_ke, $tgl_mutasi, $this->is_baru, $no_lama, 0, true, $this->id_cab_dari);
|
||||||
|
|
||||||
|
$tot_mutasi = $this->db->fetchField("SELECT SUM(Qty*Harga_Beli) Beli FROM inv_detail WHERE No_Ref=? AND Qty>0", [$this->no_mutasi]) ?? 0;
|
||||||
|
|
||||||
|
$sql = new SQL($this->app);
|
||||||
|
$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_stamp();
|
||||||
|
$sql->add_param_userid();
|
||||||
|
$sql->add_where("No_Mutasi", $this->no_mutasi);
|
||||||
|
$sql->UpdateDB();
|
||||||
|
|
||||||
|
$atabel = $this->Data_Mutasi($this->no_mutasi);
|
||||||
|
$this->mode = "view";
|
||||||
|
|
||||||
|
} else if ($this->mode === "cancel") {
|
||||||
|
$this->inv->Detail_Cancel($this->no_mutasi);
|
||||||
|
$atabel = $this->Data_Mutasi();
|
||||||
|
} else {
|
||||||
|
$atabel = $this->Data_Mutasi($this->no_mutasi);
|
||||||
|
}
|
||||||
|
|
||||||
|
$enable = in_array($this->mode, ["add","edit"]) ? true : false;
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tnota = $form->textbox("_", "No_Mutasi", $atabel['No_Mutasi'], !$enable, true, "text", "nomor transaksi");
|
||||||
|
$ttglnota = $form->datebox("_", "Tgl_Mutasi", $atabel['Tgl_Mutasi'], $enable, true);
|
||||||
|
$tcab_dari = $form->option_db("_", "Dari_CabID", $atabel['Dari_CabID'], $enable, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY Nama_Cab", [0," "]);
|
||||||
|
$tcab_ke = $form->option_db("_", "Ke_CabID", $atabel['Ke_CabID'], $enable, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY Nama_Cab", [0," "]);
|
||||||
|
$tcatat = $form->textbox("_", "Catatan", $atabel['Catatan'], $enable, false, "text");
|
||||||
|
$ajson['html'] = '
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-12 col-lg-6">
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-5 col-lg-3 col-form-label" for="No_Mutasi">Nomor Transaksi</label>
|
||||||
|
<div class="col"><div class="input-group">'.$tnota.'<button id="butBrow" class="btn btn-info" type="button"><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_Mutasi">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="Dari_CabID">Dari Cabang</label>
|
||||||
|
<div class="col">'.$tcab_dari.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-5 col-lg-3 col-form-label" for="Ke_CabID">Ke Cabang</label>
|
||||||
|
<div class="col">'.$tcab_ke.'</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-3 col-lg-2 col-form-label" for="Catatan" style="width:12.5%;">Catatan</label>
|
||||||
|
<div class="col">'.$tcatat.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1"><div class="col"><hr class="my-1"></div></div>
|
||||||
|
<div class="row mb-1'.(in_array($this->mode, ['add','edit']) ? '' : ' d-none').'">
|
||||||
|
<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" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<input type="hidden" id="mode" value="'.$this->mode.'" >';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_produk() {
|
||||||
|
$id = (int) Param::Get("ID", 0);
|
||||||
|
$atabel = [ 'ID'=>$id, 'InvID'=>$this->id_inv, 'SatuanID'=>$this->id_satuan, 'VarianID'=>$this->id_varian, 'Kode_SKU'=>"", 'Kode_Barcode'=>"", 'Nama_Lengkap'=>"", 'Satuan_Kemasan'=>"", 'Qty'=>0, 'Harga_Beli'=>0 ];
|
||||||
|
if ($id > 0) {
|
||||||
|
$_row = $this->db->fetchRow("SELECT ID,Qty,Harga_Beli FROM tmp_inv_detail WHERE No_Ref=? AND ID=?", [$this->no_mutasi, $id]);
|
||||||
|
if ($_row) $atabel = array_merge($atabel, $_row->getData());
|
||||||
|
}
|
||||||
|
if ($this->id_inv > 0 && $this->id_satuan > 0) {
|
||||||
|
$_row = $this->db->fetchRow("SELECT Kode_SKU,Kode_Barcode,Nama_Lengkap,Satuan_Kemasan,Harga_Pokok Harga_Beli FROM inv_produk_join WHERE InvID=? AND SatuanID=? AND VarianID=?", [$this->id_inv, $this->id_satuan, $this->id_varian]);
|
||||||
|
if ($_row) $atabel = array_merge($atabel, $_row->getData());
|
||||||
|
}
|
||||||
|
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tsku = $form->textbox("_", "Kode_SKU", $atabel['Kode_SKU']. " / " .$atabel['Kode_Barcode'], false);
|
||||||
|
$tnama = $form->textbox("_", "Nama_Lengkap", $atabel['Nama_Lengkap'], false);
|
||||||
|
$tqty = $form->textbox("_", "Qty", $atabel['Qty'], true, true, "double");
|
||||||
|
$tbeli = $form->textbox("_", "Harga_Beli", $atabel['Harga_Beli'], false, false, "double");
|
||||||
|
$ttot = $form->textbox("_", "Jumlah", 0, false, false, "double");
|
||||||
|
$tsat = $form->textbox("_", "Nama_Satuan", $atabel['Satuan_Kemasan'], false);
|
||||||
|
$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">'.$tsku.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label">Nama Barang</label>
|
||||||
|
<div class="col">'.$tnama.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1"><hr class="my-1"></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">Harga (@)</label>
|
||||||
|
<div class="col-sm-8 col-lg-5">'.$tbeli.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label">Sub Total</label>
|
||||||
|
<div class="col-sm-8 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="VarianID" value="'.$atabel['VarianID'].'" >
|
||||||
|
<input type="hidden" id="mode_detail" value="'.$this->mode_detail.'" >';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function proses_delete() {
|
||||||
|
$this->db->runQuery("DELETE FROM inv_mutasi WHERE No_Mutasi=?", [$this->no_mutasi]);
|
||||||
|
$this->db->runQuery("DELETE FROM inv_detail WHERE No_Ref=?", [$this->no_mutasi]);
|
||||||
|
$this->app->json([ 'status' => true ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$this->app->json(['html' => '
|
||||||
|
<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 dropdown-toggle" id="butPrint" type="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><i class="bi-printer me-2"></i>Cetak</button>
|
||||||
|
<div class="dropdown-menu" aria-labelledby="butPrint">
|
||||||
|
<a class="dropdown-item" href="#" id="printNota">Cetak Nota</a>
|
||||||
|
<a class="dropdown-item" href="#" id="printPOS">Cetak POS</a>
|
||||||
|
</div>
|
||||||
|
<button class="btn btn-danger mb-1 ms-2" id="butBatal" type="button"><i class="bi-x-lg me-2"></i>Batal</button>
|
||||||
|
<button class="btn btn-success mb-1 ms-2" id="butSimpan" type="button"><i class="bi-save me-2"></i>Simpan</button>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<div class="tab-content border border-top-0 p-3">
|
||||||
|
<div class="tab-pane fade active show" id="tx" role="tabpanel" aria-labelledby="tx-tab">
|
||||||
|
<div id="divTXMaster"> </div>
|
||||||
|
<div id="divDetailTabel"> </div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div></div>
|
||||||
|
</div>'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function Data_Mutasi(string $nomor="", bool $baru=false): array {
|
||||||
|
$aparam = [
|
||||||
|
'No_Mutasi' => $nomor,
|
||||||
|
'Tgl_Mutasi' => tgl_ymd(),
|
||||||
|
'Dari_CabID' => $this->id_cab_dari,
|
||||||
|
'Ke_CabID' => $this->id_cab_ke,
|
||||||
|
'Catatan' => ""
|
||||||
|
];
|
||||||
|
if ($baru) $aparam['No_Mutasi'] = "MUTA".$this->web_app['SERVER_ID'].(string) $this->id_cab_dari.$this->app->user()->id(3)."#00";
|
||||||
|
if (!empty($nomor)) {
|
||||||
|
$row = $this->db->fetchRow("SELECT * FROM inv_mutasi WHERE No_Mutasi=?", [$nomor]);
|
||||||
|
if ($row) $aparam = array_merge($aparam, $row->getData());
|
||||||
|
}
|
||||||
|
return $aparam;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,376 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Inv/OpnameController
|
||||||
|
Description : Transaksi Opname Stok
|
||||||
|
Created By : Siau Pheng ([email protected]).
|
||||||
|
Created Date : May 24th, 2010.
|
||||||
|
Last Modified : September 28th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Inv;
|
||||||
|
|
||||||
|
use App\Utils\Inv;
|
||||||
|
use App\Utils\Gel;
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use flight\Session;
|
||||||
|
use Webapp\DB\SQL;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
use Webapp\Web\Table;
|
||||||
|
|
||||||
|
class OpnameController {
|
||||||
|
|
||||||
|
private array $web_app;
|
||||||
|
private array $app_gel;
|
||||||
|
private int $id_cab;
|
||||||
|
private string $mode;
|
||||||
|
private string $mode_detail;
|
||||||
|
private string $no_opname;
|
||||||
|
private bool $is_baru;
|
||||||
|
private int $id_inv;
|
||||||
|
private int $id_satuan;
|
||||||
|
private int $id_varian;
|
||||||
|
private Inv $inv;
|
||||||
|
private Gel $gel;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->web_app = (array) $session->get('WEB_APP');
|
||||||
|
$this->app_gel = (array) $session->get('APP_GEL');
|
||||||
|
$this->id_cab = Param::Int("CabID", $session->get('APP_INV')['CABANGID']);
|
||||||
|
$this->mode = Param::Get("mode", "");
|
||||||
|
$this->mode_detail = Param::Get("mode_detail", "");
|
||||||
|
$this->no_opname = Param::Get("No_Opname", "");
|
||||||
|
$this->is_baru = str_contains($this->no_opname, "OPNA") === true;
|
||||||
|
$this->id_inv = Param::Int("InvID", 0);
|
||||||
|
$this->id_satuan = Param::Int("SatuanID", 0);
|
||||||
|
$this->id_varian = Param::Int("VarianID", 0);
|
||||||
|
$this->inv = new Inv($app);
|
||||||
|
$this->gel = new Gel($app);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function table_detail() {
|
||||||
|
if (in_array($this->mode_detail, ["insert","update","delete"])) {
|
||||||
|
$iqty = Param::Float("Qty", 0);
|
||||||
|
|
||||||
|
$sql = new SQL($this->app);
|
||||||
|
$sql->set_table("tmp_inv_detail");
|
||||||
|
$sql->add_param("No_Ref", $this->no_opname);
|
||||||
|
$sql->add_param("InvID");
|
||||||
|
$sql->add_param("SatuanID");
|
||||||
|
$sql->add_param("VarianID");
|
||||||
|
$sql->add_param("Qty", $iqty);
|
||||||
|
$sql->add_param("Harga_Beli");
|
||||||
|
$sql->add_param("Harga_Jual", "Harga_Beli", true);
|
||||||
|
$sql->add_param_unix();
|
||||||
|
$sql->add_param_userid();
|
||||||
|
$sql->add_where("ID");
|
||||||
|
$sql->add_where("No_Ref", $this->no_opname);
|
||||||
|
|
||||||
|
if ( $this->mode_detail === "insert" ) {
|
||||||
|
$sql->InsertDB();
|
||||||
|
} else if ( $this->mode_detail === "update" ) {
|
||||||
|
$sql->UpdateDB();
|
||||||
|
} else if ( $this->mode_detail === "delete" ) {
|
||||||
|
$sql->DeleteDB();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$tsql = ''; $asql = [$this->no_opname]; $qtabel = "inv_detail";
|
||||||
|
if (in_array($this->mode, ["add","edit"])) {
|
||||||
|
if ($this->mode === "add") { $tsql = " AND Unix=?"; array_push($asql, $this->app->user()->unix()); }
|
||||||
|
$qtabel = "tmp_inv_detail";
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("(SELECT *,(Qty*Harga_Beli) Total FROM ".$qtabel." WHERE No_Ref=?".$tsql.") D LEFT JOIN vi_inv_produk P ON (D.InvID=P.InvID AND D.SatuanID=P.SatuanID AND D.VarianID=P.VarianID)", "D.*,P.Kode_SKU,P.Nama_Lengkap", "", $asql);
|
||||||
|
$obj->set_footer("SUM(D.Total) Total");
|
||||||
|
$obj->add_field("ID", "No", "c");
|
||||||
|
$obj->add_field("InvID", "InvID", "hid");
|
||||||
|
$obj->add_field("SatuanID", "SatuanID", "hid");
|
||||||
|
$obj->add_field("VarianID", "VarianID", "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", "Jumlah", "r", "rupiah", "rupiah");
|
||||||
|
$obj->set_field_order("ID", "D");
|
||||||
|
if (in_array($this->mode, ["add","edit"])) {
|
||||||
|
$obj->add_row_btn("clipboard", "Ubah", "OpnameJS.detail_ubah");
|
||||||
|
$obj->add_row_btn("trash", "Hapus", "OpnameJS.detail_hapus", "Unix", $this->app->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');
|
||||||
|
}
|
||||||
|
$ajson[] = $obj->json_table("divDetailTabel");
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function brow_tx() {
|
||||||
|
$tcari = Param::Get("Cari_TX");
|
||||||
|
$tsql = ''; $asql = [];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql .= " WHERE CONCAT(No_Opname,DATE_FORMAT(Tgl_Opname,'%d-%m-%Y')) LIKE ?";
|
||||||
|
array_push($asql, '%' . $tcari . '%');
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("(SELECT * FROM inv_opname".$tsql.") O LEFT JOIN para_cabang C ON (C.CabID=O.CabID)", "O.*,C.Kode_Cab", "", $asql);
|
||||||
|
$obj->add_field("No_Opname", "No. Trans", "c");
|
||||||
|
$obj->add_field("Tgl_Opname", "Tgl. Trans", "c", "sqltgl", "", "val-tgl");
|
||||||
|
$obj->add_field("Kode_Cab", "Cabang", "c");
|
||||||
|
$obj->add_field("Total_Opname", "Total", "r", "rupiah2");
|
||||||
|
$obj->add_field("Catatan", "Catatan", "awr");
|
||||||
|
$obj->set_field_order("No_Opname", "D");
|
||||||
|
$obj->set_func_select("OpnameJS.tx_select");
|
||||||
|
$this->app->json([ $obj->db_table("divBrowTX") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function brow_produk() {
|
||||||
|
$tcari = Param::Get("Cari_Produk");
|
||||||
|
$tsql = ''; $asql = [];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql .= " AND Barcode_Nama LIKE ?";
|
||||||
|
array_push($asql, '%' . $tcari . '%');
|
||||||
|
}
|
||||||
|
array_push($asql, $this->id_cab);
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("(SELECT * FROM inv_produk_join WHERE Aktif=1".$tsql." GROUP BY InvID,SatuanID,VarianID) P LEFT JOIN inv_stok X ON (X.CabID=? AND X.InvID=P.InvID)", "P.*,IF(IFNULL(X.Stok,0)=0,0,ROUND(X.Stok/P.Qty,2)) Sisa_Stok", "", $asql);
|
||||||
|
$obj->add_field("InvID", "ID", "hid");
|
||||||
|
$obj->add_field("SatuanID", "ID", "hid");
|
||||||
|
$obj->add_field("VarianID", "ID", "hid");
|
||||||
|
$obj->add_field("Kode_SKU", "SKU", "c");
|
||||||
|
$obj->add_field("Kode_Barcode", "Barcode", "c");
|
||||||
|
$obj->add_field("Nama_Lengkap", "Nama Barang", "awr");
|
||||||
|
$obj->add_field("Sisa_Stok", "Stok", "r", "rupiah2");
|
||||||
|
$obj->set_field_order("Kode_SKU", "A");
|
||||||
|
$obj->set_func_select("OpnameJS.produk_select");
|
||||||
|
$this->app->json([ $obj->db_table("divBrowProduk") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function auto_produk() {
|
||||||
|
$tcari = Param::Get("Auto_Query", "");
|
||||||
|
$ajson['autodata'] = [];
|
||||||
|
$bcode = 0; $arec = [];
|
||||||
|
|
||||||
|
// Cari by SKU + Barcode
|
||||||
|
// Satuan : Varian : Harga_Pokok : Satuan : Stok
|
||||||
|
if ($bcode === 0) {
|
||||||
|
$_row = $this->db->fetchRow("SELECT P.InvID,P.Nama_Lengkap,CONCAT(P.SatuanID,':',P.VarianID,':',CONVERT(FORMAT(P.Harga_Pokok,2) USING UTF8),':',P.Satuan_Kemasan,':',CONVERT(FORMAT(IF(IFNULL(X.Stok,0)=0,0,ROUND(X.Stok/P.Qty,2)),2) USING UTF8)) Data2 FROM (SELECT * FROM inv_produk_join WHERE Aktif=1 AND (Kode_SKU=? OR Kode_Barcode=?) GROUP BY InvID,SatuanID,VarianID) P LEFT JOIN inv_stok X ON (X.CabID=? AND X.InvID=P.InvID)", [$tcari, $tcari, $this->id_cab]);
|
||||||
|
if ($_row) {
|
||||||
|
$bcode = 1;
|
||||||
|
$arec = $_row->getData();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($bcode === 1) {
|
||||||
|
$ajson['autodata'][] = ['value'=>$arec['InvID'], 'text'=>$arec['Nama_Lengkap'], 'data'=>$arec['Data2'], 'bc'=>1];
|
||||||
|
} else {
|
||||||
|
$stat = $this->db->runQuery("SELECT P.InvID,P.Nama_Lengkap,P.Kode_SKU,IF(IFNULL(X.Stok,0)=0,'KOSONG',ROUND(X.Stok/P.Qty,2)) Sisa_Stok,CONCAT(P.SatuanID,':',P.VarianID,':',CONVERT(FORMAT(P.Harga_Pokok,2) USING UTF8),':',P.Satuan_Kemasan,':',CONVERT(FORMAT(IF(IFNULL(X.Stok,0)=0,0,ROUND(X.Stok/P.Qty,2)),2) USING UTF8)) Data2 FROM (SELECT * FROM inv_produk_join WHERE Barcode_Nama LIKE ? AND Aktif=1 GROUP BY InvID,SatuanID,VarianID) P LEFT JOIN inv_stok X ON (X.CabID=? AND X.InvID=P.InvID) ORDER BY P.Nama_Produk,P.Qty LIMIT 50", ['%'.$tcari.'%', $this->id_cab]);
|
||||||
|
while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$ajson['autodata'][] = ['value'=>$row['InvID'], 'text'=>$row['Nama_Lengkap'], 'html'=>'<span class="text-primary">'.$row['Kode_SKU'].'</span> '.$row['Nama_Lengkap'].' <span class="text-danger">('.(string) $row['Sisa_Stok'].')</span>', 'data'=>$row['Data2'], 'bc'=>0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_master() {
|
||||||
|
$ajson = [ 'error'=>"", 'html'=>"" ];
|
||||||
|
$atabel = [];
|
||||||
|
|
||||||
|
if ($this->mode === "add") {
|
||||||
|
$atabel = $this->Data_Opname("", true);
|
||||||
|
} else if ($this->mode === "edit") {
|
||||||
|
$this->inv->Detail_Copy($this->no_opname, true);
|
||||||
|
$atabel = $this->Data_Opname($this->no_opname);
|
||||||
|
} else if ($this->mode === "save") {
|
||||||
|
$no_lama = $this->no_opname;
|
||||||
|
if ($this->is_baru) {
|
||||||
|
$this->no_opname = $this->inv->Nomor_Baru("O", Param::Get("Tgl_Opname"), true);
|
||||||
|
}
|
||||||
|
$this->inv->Detail_Save($this->no_opname, 1, $this->id_cab, Param::Get("Tgl_Opname"), $this->is_baru, $no_lama);
|
||||||
|
|
||||||
|
$tot_opname = $this->db->fetchField("SELECT SUM(Qty*Harga_Beli) Opname FROM inv_detail WHERE No_Ref=?", [$this->no_opname]) ?? 0;
|
||||||
|
|
||||||
|
$sql = new SQL($this->app);
|
||||||
|
$sql->set_table("inv_opname");
|
||||||
|
$sql->add_param_date("Tgl_Opname");
|
||||||
|
$sql->add_param("CabID");
|
||||||
|
$sql->add_param("Total_Opname", $tot_opname);
|
||||||
|
$sql->add_param("Catatan");
|
||||||
|
$sql->add_param_stamp();
|
||||||
|
$sql->add_param_userid();
|
||||||
|
$sql->add_where("No_Opname", $this->no_opname);
|
||||||
|
$sql->UpdateDB();
|
||||||
|
|
||||||
|
// PROSES POSTING GL
|
||||||
|
$ainfo = $this->db->fetchRow("SELECT * FROM inv_opname WHERE No_Opname=?", [$this->no_opname]);
|
||||||
|
if (count($ainfo) > 0) {
|
||||||
|
$ajurnal = [
|
||||||
|
'Kode_Jurnal' => $ainfo['No_Opname'],
|
||||||
|
'TipeID' => 12,
|
||||||
|
'CabID' => $ainfo['CabID'],
|
||||||
|
'Tanggal' => tgl_sql2str($ainfo['Tgl_Opname']),
|
||||||
|
'Kode_Ref' => $ainfo['No_Opname'],
|
||||||
|
'Catatan' => "Opname Stok / Penyesuaian : ".$ainfo['No_Opname']." - ".tgl_sql2str($ainfo['Tgl_Opname'])
|
||||||
|
];
|
||||||
|
$_dkD = ($ainfo['Total_Opname'] > 0) ? "K" : "D";
|
||||||
|
$_dkK = ($ainfo['Total_Opname'] < 0) ? "K" : "D";
|
||||||
|
$adetail = [
|
||||||
|
[ 'Kode_Rek' => $this->app_gel['HPP'], 'DK' => $_dkD, 'Jumlah' => $ainfo['Total_Opname'] ],
|
||||||
|
[ 'Kode_Rek' => $this->app_gel['STOK'], 'DK' => $_dkK, 'Jumlah' => $ainfo['Total_Opname'] ]
|
||||||
|
];
|
||||||
|
$this->gel->Jurnal_Post($ajurnal, $adetail);
|
||||||
|
}
|
||||||
|
$atabel = $this->Data_Opname($this->no_opname);
|
||||||
|
$this->mode = "view";
|
||||||
|
|
||||||
|
} else if ($this->mode === "cancel") {
|
||||||
|
$this->inv->Detail_Cancel($this->no_opname);
|
||||||
|
$atabel = $this->Data_Opname();
|
||||||
|
} else {
|
||||||
|
$atabel = $this->Data_Opname($this->no_opname);
|
||||||
|
}
|
||||||
|
|
||||||
|
$enable = in_array($this->mode, ["add","edit"]) ? true : false;
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tnota = $form->textbox("_", "No_Opname", $atabel['No_Opname'], !$enable, true, "text", "nomor transaksi");
|
||||||
|
$ttglnota = $form->datebox("_", "Tgl_Opname", $atabel['Tgl_Opname'], $enable, true);
|
||||||
|
$tcab = $form->option_db("_", "CabID", $atabel['CabID'], $enable, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY Nama_Cab", [0," "]);
|
||||||
|
$tcatat = $form->textbox("_", "Catatan", $atabel['Catatan'], $enable, true, "text", "catatan");
|
||||||
|
$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"><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">'.$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="Catatan">Catatan</label>
|
||||||
|
<div class="col">'.$tcatat.'</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1"><div class="col"><hr class="my-1"></div></div>
|
||||||
|
<input type="hidden" id="mode" value="'.$this->mode.'" >';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_produk() {
|
||||||
|
$id = (int) Param::Get("ID", 0);
|
||||||
|
$atabel = [ 'ID'=>$id, 'InvID'=>$this->id_inv, 'SatuanID'=>$this->id_satuan, 'VarianID'=>$this->id_varian, 'Nama_Lengkap'=>"", 'Nama_Satuan'=>"", 'Qty'=>0, 'Stok'=>0, 'Harga_Beli'=>0, 'Kali'=>1 ];
|
||||||
|
if ($id > 0) {
|
||||||
|
$_row = $this->db->fetchRow("SELECT ID,Qty,Harga_Beli FROM tmp_inv_detail WHERE No_Ref=? AND ID=?", [$this->no_opname, $id]);
|
||||||
|
if ($_row) $atabel = array_merge($atabel, $_row->getData());
|
||||||
|
}
|
||||||
|
if ((int) $atabel['InvID'] > 0 && (int) $atabel['SatuanID'] > 0) {
|
||||||
|
$_row = $this->db->fetchRow("SELECT Nama_Lengkap,Nama_Satuan,Harga_Pokok Harga_Beli,Qty Kali FROM vi_inv_produk WHERE InvID=? AND SatuanID=? AND VarianID=?", [$atabel['InvID'], $atabel['SatuanID'], $atabel['VarianID']]);
|
||||||
|
if ($_row) $atabel = array_merge($atabel, $_row->getData());
|
||||||
|
$_stok = $this->db->fetchField("SELECT Stok FROM inv_stok WHERE CabID=? AND InvID=?", [$this->id_cab, $atabel['InvID']]) ?? 1;
|
||||||
|
$atabel['Stok'] = $_stok / ($atabel['Kali'] ?? 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tnama = $form->textauto("_", "Nama_Produk", ['value'=>$atabel['InvID'],'text'=>$atabel['Nama_Lengkap']], 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'], false, false, "double");
|
||||||
|
$tsat1 = $form->textbox("_", "Nama_Satuan1", $atabel['Nama_Satuan'], false);
|
||||||
|
$tsat2 = $form->textbox("_", "Nama_Satuan2", $atabel['Nama_Satuan'], false);
|
||||||
|
$ajson['html'] = '
|
||||||
|
<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">HPP (@)</label>
|
||||||
|
<div class="col-sm-8 col-lg-5">'.$tbeli.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1"><hr class="my-1"></div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="Qty">Penyesuaian</label>
|
||||||
|
<div class="col-sm-8 col-lg-5"><div class="input-group">'.$tqty.$tsat1.'</div></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-5"><div class="input-group">'.$tstok.$tsat2.'</div></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="VarianID" value="'.$atabel['VarianID'].'" >
|
||||||
|
<input type="hidden" id="mode_detail" value="'.$this->mode_detail.'" >';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function proses_delete() {
|
||||||
|
$this->db->runQuery("DELETE FROM inv_opname WHERE No_Opname=?", [$this->no_opname]);
|
||||||
|
$this->db->runQuery("DELETE FROM inv_detail WHERE No_Ref=?", [$this->no_opname]);
|
||||||
|
// PROSES POSTING GL
|
||||||
|
$this->db->runQuery("DELETE FROM gel_jurnal WHERE Kode_Jurnal=?", [$this->no_opname]);
|
||||||
|
$this->db->runQuery("DELETE FROM gel_jurnal_detail WHERE Kode_Jurnal=?", [$this->no_opname]);
|
||||||
|
$this->app->json([ 'status' => true ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$this->app->json(['html' => '
|
||||||
|
<div class="fade-in">
|
||||||
|
<div class="card"><div class="card-body">
|
||||||
|
<ul class="nav nav-tabs" role="tablist">
|
||||||
|
<li class="nav-item" role="presentation">
|
||||||
|
<button class="nav-link active" id="tx-tab" data-bs-toggle="tab" data-bs-target="#tx" type="button" role="tab" aria-controls="tx" aria-selected="true"><i class="bi-database me-2"></i>Transaksi Penyesuaian Stok</button>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item ms-auto">
|
||||||
|
<button class="btn btn-primary mb-1 ms-2" id="butTambah" type="button"><i class="bi-plus-lg me-2"></i>Tambah</button>
|
||||||
|
<button class="btn btn-info mb-1 ms-2" id="butUbah" type="button"><i class="bi-clipboard me-2"></i>Ubah</button>
|
||||||
|
<button class="btn btn-warning mb-1 ms-2" id="butHapus" type="button"><i class="bi-trash me-2"></i>Hapus</button>
|
||||||
|
<button class="btn btn-secondary mb-1 ms-2" id="butPrint" type="button"><i class="bi-printer me-2"></i>Cetak</button>
|
||||||
|
<button class="btn btn-danger mb-1 ms-2" id="butBatal" type="button"><i class="bi-x-lg me-2"></i>Batal</button>
|
||||||
|
<button class="btn btn-success mb-1 ms-2" id="butSimpan" type="button"><i class="bi-save me-2"></i>Simpan</button>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<div class="tab-content border border-top-0 p-3">
|
||||||
|
<div class="tab-pane fade active show" id="tx" role="tabpanel" aria-labelledby="tx-tab">
|
||||||
|
<div id="divTXMaster"> </div>
|
||||||
|
<div id="divDetailTabel"> </div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div></div>
|
||||||
|
</div>'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function Data_Opname(string $nomor="", bool $baru=false): array {
|
||||||
|
$aparam = [ 'No_Opname'=>$nomor, 'Catatan'=>"" ];
|
||||||
|
if (empty($nomor)) {
|
||||||
|
if ($baru) $aparam['No_Opname'] = "OPNA".$this->web_app['SERVER_ID'].(string) $this->id_cab.$this->app->user()->id(3)."#00";
|
||||||
|
$aparam['Tgl_Opname'] = tgl_ymd();
|
||||||
|
$aparam['CabID'] = $this->id_cab;
|
||||||
|
} else {
|
||||||
|
$row = $this->db->fetchRow("SELECT * FROM inv_opname WHERE No_Opname=?", [$nomor]);
|
||||||
|
if ($row) $aparam = array_merge($aparam, $row->getData());
|
||||||
|
}
|
||||||
|
return $aparam;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,206 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Inv/OpnamebarangController
|
||||||
|
Description : Transaksi Penyesuaian Stok Per Barang
|
||||||
|
Created By : Siau Pheng ([email protected]).
|
||||||
|
Created Date : October 22nd, 2014.
|
||||||
|
Last Modified : October 11th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Inv;
|
||||||
|
|
||||||
|
use App\Utils\Inv;
|
||||||
|
use App\Utils\Gel;
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use flight\Session;
|
||||||
|
use Webapp\DB\SQL;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
use Webapp\Web\Table;
|
||||||
|
|
||||||
|
class OpnamebarangController {
|
||||||
|
|
||||||
|
private array $app_gel;
|
||||||
|
private int $id_cab;
|
||||||
|
private Inv $inv;
|
||||||
|
private Gel $gel;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->app_gel = (array) $session->get('APP_GEL');
|
||||||
|
$this->id_cab = $session->get('APP_INV')['CABANGID'];
|
||||||
|
$this->inv = new Inv($app);
|
||||||
|
$this->gel = new Gel($app);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function brow_produk() {
|
||||||
|
$tcari = Param::Get("Cari_Produk");
|
||||||
|
$tsql = ''; $asql = [];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql .= " AND Barcode_Nama LIKE ?";
|
||||||
|
array_push($asql, '%' . $tcari . '%');
|
||||||
|
}
|
||||||
|
array_push($asql, $this->id_cab);
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("(SELECT * FROM inv_produk_join WHERE Aktif=1".$tsql." GROUP BY InvID,SatuanID,VarianID) P LEFT JOIN inv_stok X ON (X.CabID=? AND X.InvID=P.InvID)", "P.*,IF(IFNULL(X.Stok,0)=0,0,ROUND(X.Stok/P.Qty,2)) Sisa_Stok", "", $asql);
|
||||||
|
$obj->add_field("InvID", "ID", "hid");
|
||||||
|
$obj->add_field("SatuanID", "ID", "hid");
|
||||||
|
$obj->add_field("VarianID", "ID", "hid");
|
||||||
|
$obj->add_field("Kode_SKU", "SKU", "c");
|
||||||
|
$obj->add_field("Kode_Barcode", "Barcode", "c");
|
||||||
|
$obj->add_field("Nama_Lengkap", "Nama Barang", "awr");
|
||||||
|
$obj->add_field("Satuan_Kemasan", "Satuan", "hid");
|
||||||
|
$obj->add_field("Harga_Pokok", "HPP", "hid");
|
||||||
|
$obj->add_field("Sisa_Stok", "Stok", "r", "rupiah2");
|
||||||
|
$obj->add_field("PPN", "PPN", "hid");
|
||||||
|
$obj->set_field_order("Kode_SKU", "A");
|
||||||
|
$obj->set_func_select("OpnameBarangJS.produk_select");
|
||||||
|
$this->app->json([ $obj->db_table("divBrowProduk") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function auto_produk() {
|
||||||
|
$tcari = Param::Get("Auto_Query", "");
|
||||||
|
$ajson['autodata'] = [];
|
||||||
|
$bcode = 0; $arec = [];
|
||||||
|
|
||||||
|
// Cari by SKU + Barcode
|
||||||
|
// Satuan : Varian : SKU + Barcode : Harga_Pokok : Satuan : PPN : Stok
|
||||||
|
if ($bcode === 0) {
|
||||||
|
$_row = $this->db->fetchRow("SELECT P.InvID,P.Nama_Lengkap,CONCAT(P.SatuanID,':',P.VarianID,':',P.Kode_SKU,' / ',P.Kode_Barcode,':',CONVERT(P.Harga_Pokok USING UTF8),':',P.Satuan_Kemasan,':',P.PPN,':',CONVERT(FORMAT(IF(IFNULL(X.Stok,0)=0,0,ROUND(X.Stok/P.Qty,2)),2) USING UTF8)) Data2 FROM (SELECT * FROM inv_produk_join WHERE Aktif=1 AND (Kode_SKU=? OR Kode_Barcode=?) GROUP BY InvID,SatuanID,VarianID) P LEFT JOIN inv_stok X ON (X.CabID=? AND X.InvID=P.InvID)", [$tcari, $tcari, $this->id_cab]);
|
||||||
|
if ($_row) {
|
||||||
|
$bcode = 1;
|
||||||
|
$arec = $_row->getData();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($bcode === 1) {
|
||||||
|
$ajson['autodata'][] = ['value'=>$arec['InvID'], 'text'=>$arec['Nama_Lengkap'], 'data'=>$arec['Data2'], 'bc'=>1];
|
||||||
|
} else {
|
||||||
|
$stat = $this->db->runQuery("SELECT P.InvID,P.Nama_Lengkap,P.Kode_SKU,IF(IFNULL(X.Stok,0)=0,'KOSONG',ROUND(X.Stok/P.Qty,2)) Sisa_Stok,CONCAT(P.SatuanID,':',P.VarianID,':',P.Kode_SKU,' / ',P.Kode_Barcode,':',CONVERT(P.Harga_Pokok USING UTF8),':',P.Satuan_Kemasan,':',P.PPN,':',CONVERT(FORMAT(IF(IFNULL(X.Stok,0)=0,0,ROUND(X.Stok/P.Qty,2)),2) USING UTF8)) Data2 FROM (SELECT * FROM inv_produk_join WHERE Barcode_Nama LIKE ? AND Aktif=1 GROUP BY InvID,SatuanID,VarianID) P LEFT JOIN inv_stok X ON (X.CabID=? AND X.InvID=P.InvID) ORDER BY P.Nama_Produk,P.Qty LIMIT 50", ['%'.$tcari.'%', $this->id_cab]);
|
||||||
|
while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$ajson['autodata'][] = ['value'=>$row['InvID'], 'text'=>$row['Nama_Lengkap'], 'html'=>'<span class="text-primary">'.$row['Kode_SKU'].'</span> '.$row['Nama_Lengkap'].' <span class="text-danger">('.(string) $row['Sisa_Stok'].')</span>', 'data'=>$row['Data2'], 'bc'=>0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function scan_produk() {
|
||||||
|
$tcari = Param::Get("Cari_Produk", "");
|
||||||
|
$scandata = ['Nama_Supplier'=>"BELUM ADA"];
|
||||||
|
|
||||||
|
// Cari by SKU + Barcode
|
||||||
|
// Satuan : Varian : SKU + Barcode : Harga_Pokok : Satuan : PPN : Stok
|
||||||
|
$_row = $this->db->fetchRow("SELECT P.InvID,P.SatuanID,P.VarianID,P.Nama_Lengkap Nama_Barang,CONCAT(P.Kode_SKU,' / ',P.Kode_Barcode) Kode_Barang,P.Harga_Pokok Harga_Beli,P.Satuan_Kemasan Nama_Satuan,P.PPN,FORMAT(IFNULL(X.Stok,0),2) Stok_Sistem FROM (SELECT * FROM inv_produk_join WHERE Aktif=1 AND (Kode_SKU=? OR Kode_Barcode=?) GROUP BY InvID,SatuanID,VarianID) P LEFT JOIN inv_stok X ON (X.CabID=? AND X.InvID=P.InvID)", [$tcari, $tcari, $this->id_cab]);
|
||||||
|
if ($_row) $scandata = array_merge($scandata, $_row->getData());
|
||||||
|
$this->app->json([ $scandata ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function proses_simpan() {
|
||||||
|
$no_opname = "";
|
||||||
|
$id_inv = Param::Int("InvID", 0);
|
||||||
|
$id_satuan = Param::Int("SatuanID", 0);
|
||||||
|
$qty = Param::Float("Stok_Fisik", 0);
|
||||||
|
$hpp = Param::Float("Harga_Beli", 0);
|
||||||
|
|
||||||
|
$no_opname = $this->db->fetchField("SELECT No_Opname FROM inv_opname WHERE Tgl_Opname=CURDATE() AND CabID=? AND UserID=? ORDER BY No_Opname DESC", [$this->id_cab, $this->app->user()->id()]) ?? '';
|
||||||
|
if (empty($no_opname)) {
|
||||||
|
$no_opname = $this->inv->Nomor_Baru("O", tgl_dmy(), true);
|
||||||
|
$this->db->runQuery("UPDATE inv_opname SET Tgl_Opname=CURDATE(), CabID=?, Catatan=?, UserID=? WHERE No_Opname=?", [$this->id_cab, 'OPNAME USER : '.$this->app->user()->username().' - '.$this->app->user()->nama(), $this->app->user()->id(), $no_opname]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$_qty = $this->db->fetchField("SELECT SUM(Stok) Stok FROM inv_detail WHERE Tgl_Ref<=? AND CabID=? AND InvID=?", [tgl_ymd(), $this->id_cab, $id_inv]) ?? 0;
|
||||||
|
$qty -= $_qty;
|
||||||
|
|
||||||
|
$_stok = (float) $this->db->fetchField("SELECT Qty FROM inv_produk_kemasan WHERE InvID=? AND SatuanID=?", [$id_inv, $id_satuan]) ?? 1;
|
||||||
|
$stok = $_stok * $qty;
|
||||||
|
|
||||||
|
$sql = new SQL($this->app);
|
||||||
|
$sql->set_table("inv_detail");
|
||||||
|
$sql->add_param("No_Ref", $no_opname);
|
||||||
|
$sql->add_param("Tgl_Ref", "CURDATE()", true);
|
||||||
|
$sql->add_param("NotaID", 1);
|
||||||
|
$sql->add_param("CabID", $this->id_cab);
|
||||||
|
$sql->add_param("InvID");
|
||||||
|
$sql->add_param("SatuanID");
|
||||||
|
$sql->add_param("VarianID");
|
||||||
|
$sql->add_param("Qty", $qty);
|
||||||
|
$sql->add_param("Stok", $stok);
|
||||||
|
$sql->add_param("Harga_Beli", $hpp);
|
||||||
|
$sql->add_param("Harga_Jual", "Harga_Beli", true);
|
||||||
|
$sql->add_param("PPN");
|
||||||
|
$sql->add_param_userid();
|
||||||
|
$sql->InsertDB();
|
||||||
|
|
||||||
|
$tot_opname = $this->db->fetchField("SELECT SUM(Qty*Harga_Beli) Opname FROM inv_detail WHERE No_Ref=?", [$no_opname]) ?? 0;
|
||||||
|
if ($tot_opname > 0) {
|
||||||
|
$this->db->runQuery("UPDATE inv_opname SET Total_Opname=? WHERE No_Opname=?", [$tot_opname, $no_opname]);
|
||||||
|
|
||||||
|
// PROSES POSTING GL
|
||||||
|
$ajurnal = [
|
||||||
|
'Kode_Jurnal' => $no_opname,
|
||||||
|
'TipeID' => 12,
|
||||||
|
'CabID' => $this->id_cab,
|
||||||
|
'Tanggal' => tgl_dmy(),
|
||||||
|
'Kode_Ref' => $no_opname,
|
||||||
|
'Catatan' => "Opname Stok / Penyesuaian : ".$no_opname." - ".tgl_dmy()
|
||||||
|
];
|
||||||
|
$_dkD = ($tot_opname > 0) ? "K" : "D";
|
||||||
|
$_dkK = ($tot_opname < 0) ? "K" : "D";
|
||||||
|
$adetail = [
|
||||||
|
[ 'Kode_Rek' => $this->app_gel['HPP'], 'DK' => $_dkD, 'Jumlah' => $tot_opname ],
|
||||||
|
[ 'Kode_Rek' => $this->app_gel['STOK'], 'DK' => $_dkK, 'Jumlah' => $tot_opname ]
|
||||||
|
];
|
||||||
|
$this->gel->Jurnal_Post($ajurnal, $adetail);
|
||||||
|
}
|
||||||
|
$this->app->json([ 'status' => true ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tbrg = $form->textauto("_", "Nama_Produk", ['value'=>0, 'text'=>""], true, true, "Scan SKU / Barcode / Ketik Nama Barang");
|
||||||
|
$tkode = $form->textbox("_", "Kode_Barang", "KODE_SKU / KODE_BARCODE", false);
|
||||||
|
$tnama = $form->textbox("_", "Nama_Barang", "NAMA_BARANG", false);
|
||||||
|
$tsat = $form->textbox("_", "Nama_Satuan", "SATUAN", false);
|
||||||
|
$tssis = $form->textbox("_", "Stok_Sistem", "0", false, false, "double");
|
||||||
|
$tsfis = $form->textbox("_", "Stok_Fisik", "0", true, false, "double");
|
||||||
|
$ajson['html'] = '';
|
||||||
|
if (isMobile()) {
|
||||||
|
$ajson['html'] .= '
|
||||||
|
<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 {
|
||||||
|
$ajson['html'] .= '
|
||||||
|
<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>
|
||||||
|
';
|
||||||
|
}
|
||||||
|
|
||||||
|
$ajson['html'] .= '
|
||||||
|
<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-9 col-lg-5">'.$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-9 col-lg-5">'.$tsfis.'</div></div>
|
||||||
|
<input type="hidden" id="InvID" value="0" />
|
||||||
|
<input type="hidden" id="SatuanID" value="0" />
|
||||||
|
<input type="hidden" id="VarianID" value="0" />
|
||||||
|
<input type="hidden" id="Harga_Beli" value="0" />
|
||||||
|
<input type="hidden" id="PPN" value="0" />';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,645 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Inv/PosController
|
||||||
|
Description : Transaksi Penjualan POS
|
||||||
|
Created By : Siau Pheng ([email protected]).
|
||||||
|
Created Date : August 5th, 2012.
|
||||||
|
Last Modified : September 27th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Inv;
|
||||||
|
|
||||||
|
use App\Utils\Inv;
|
||||||
|
use App\Utils\Gel;
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use flight\Session;
|
||||||
|
use Webapp\DB\SQL;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
use Webapp\Web\Table;
|
||||||
|
|
||||||
|
class PosController {
|
||||||
|
|
||||||
|
private array $web_app;
|
||||||
|
private array $app_gel;
|
||||||
|
private array $app_inv;
|
||||||
|
private int $id_cab;
|
||||||
|
private int $id_member_def;
|
||||||
|
private int $id_member;
|
||||||
|
private int $id_grup_member;
|
||||||
|
private string $mode;
|
||||||
|
private string $mode_detail;
|
||||||
|
private string $no_jual;
|
||||||
|
private bool $is_pend;
|
||||||
|
private int $id_inv;
|
||||||
|
private int $id_satuan;
|
||||||
|
private int $id_varian;
|
||||||
|
private Inv $inv;
|
||||||
|
private Gel $gel;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->web_app = (array) $session->get('WEB_APP');
|
||||||
|
$this->app_gel = (array) $session->get('APP_GEL');
|
||||||
|
$this->app_inv = (array) $session->get('APP_INV');
|
||||||
|
$this->id_cab = $session->get('APP_INV')['CABANGID'];
|
||||||
|
$this->id_member_def = $session->get('APP_INV')['MEMBERID'];
|
||||||
|
$this->id_member = Param::Int("MemberID", $this->id_member_def);
|
||||||
|
$this->id_grup_member = Param::Int("Grup_MemberID", $session->get('APP_INV')['ECERANID']);
|
||||||
|
$this->mode = Param::Get("mode", "");
|
||||||
|
$this->mode_detail = Param::Get("mode_detail", "");
|
||||||
|
$this->no_jual = Param::Get("No_Jual", "");
|
||||||
|
$this->is_pend = str_contains($this->no_jual, "POS") === true;
|
||||||
|
$this->id_inv = Param::Int("InvID", 0);
|
||||||
|
$this->id_satuan = Param::Int("SatuanID", 0);
|
||||||
|
$this->id_varian = Param::Int("VarianID", 0);
|
||||||
|
$this->inv = new Inv($app);
|
||||||
|
$this->gel = new Gel($app);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function table_detail() {
|
||||||
|
if ( in_array($this->mode_detail, ["insert","update"]) ) {
|
||||||
|
$iqty = Param::Float("Qty", 0) * -1;
|
||||||
|
$disk_rp = Param::Float("Disk_Rupiah", 0);
|
||||||
|
$disk_psn = Param::Float("Disk_Persen", 0);
|
||||||
|
if ($disk_psn > 0) $disk_rp = Param::Float("Harga_Jual", 0) * $disk_psn * 0.01;
|
||||||
|
|
||||||
|
$sql = new SQL($this->app);
|
||||||
|
$sql->set_table("tmp_inv_detail");
|
||||||
|
$sql->add_param("No_Ref", $this->no_jual);
|
||||||
|
$sql->add_param("InvID");
|
||||||
|
$sql->add_param("SatuanID");
|
||||||
|
$sql->add_param("VarianID");
|
||||||
|
$sql->add_param("Qty", $iqty);
|
||||||
|
$sql->add_param("Harga_Beli");
|
||||||
|
$sql->add_param("Harga_Jual");
|
||||||
|
$sql->add_param("Disk_Rupiah", $disk_rp);
|
||||||
|
$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", $this->no_jual);
|
||||||
|
|
||||||
|
if ( $this->mode_detail === "insert" ) {
|
||||||
|
$sql->InsertDB();
|
||||||
|
} else if ( $this->mode_detail === "update" ) {
|
||||||
|
$sql->UpdateDB();
|
||||||
|
}
|
||||||
|
} else if ( $this->mode_detail === "delete" ) {
|
||||||
|
$this->db->runQuery("UPDATE tmp_inv_detail SET Qty=0,Stok=0,Disk_Rupiah=0,Total_Diskon=0 WHERE No_Ref=? AND ID=?", [$this->no_jual, Param::Int("ID", 0)]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$asql = [$this->no_jual, $this->app->user()->unix()];
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_css("tabel-pos");
|
||||||
|
$obj->set_table("(SELECT * FROM tmp_inv_detail WHERE No_Ref=? AND Unix=? AND Promo<2) D LEFT JOIN vi_inv_produk P ON (D.InvID=P.InvID AND D.SatuanID=P.SatuanID AND D.VarianID=P.VarianID)", "D.*,-D.Qty Qty2,P.Kode_SKU,P.Nama_Lengkap,-D.Qty*(D.Harga_Jual-D.Disk_Rupiah) Total,IF(D.Qty=0,0,1) IDEL", "", $asql);
|
||||||
|
$obj->set_footer("CONCAT('Q: ',FORMAT(SUM(-D.Qty),2),' / I: ',FORMAT(COUNT(DISTINCT D.InvID),0)) Harga_Jual,SUM(-D.Qty*D.Disk_Rupiah) Disk_Rupiah,SUM(-D.Qty*(D.Harga_Jual-D.Disk_Rupiah)) Total");
|
||||||
|
$obj->add_field("ID", "No", "c");
|
||||||
|
$obj->add_field("InvID", "InvID", "hid");
|
||||||
|
$obj->add_field("SatuanID", "SatuanID", "hid");
|
||||||
|
$obj->add_field("VarianID", "VarianID", "hid");
|
||||||
|
$obj->add_field("Kode_SKU", "SKU", "c");
|
||||||
|
$obj->add_field("Nama_Lengkap", "Nama Barang", "awr");
|
||||||
|
$obj->add_field("Qty2", "Qty", "r", "rupiah2");
|
||||||
|
$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->add_field("Promo", "S", "c", [0=>"N",1=>"T",2=>"D",3=>"P",4=>"H"]);
|
||||||
|
$obj->set_field_order("ID", "D");
|
||||||
|
$obj->set_row_color("IDEL", "0", "rcoret");
|
||||||
|
$obj->add_row_btn("clipboard", "Ubah", "POSJS.detail_ubah");
|
||||||
|
$obj->add_row_btn("trash", "Hapus", "POSJS.detail_hapus", "IDEL", "1");
|
||||||
|
$ajson[] = $obj->json_table("divPOS1", 8);
|
||||||
|
|
||||||
|
$ainfo = ['Total'=>0, 'Item'=>0];
|
||||||
|
$_info = $this->db->fetchRow("SELECT SUM(-Qty*(Harga_Jual-Disk_Rupiah)) Total,COUNT(*) Item FROM tmp_inv_detail WHERE No_Ref=? AND Unix=? AND Promo<2", $asql);
|
||||||
|
if ($_info) $ainfo = $_info->getData();
|
||||||
|
$ajson[] = ['type'=>"form", 'id'=>"Total_Nota", 'value'=>$ainfo['Total']];
|
||||||
|
$ajson[] = ['type'=>"form", 'id'=>"Total_Item", 'value'=>$ainfo['Item']];
|
||||||
|
if ($ainfo['Item'] > 0) $ajson[] = ['type'=>"html", 'id'=>"Total_Disp", 'value'=>rupiah($ainfo['Total'])];
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function brow_nota() {
|
||||||
|
$tcari = Param::Get("Cari_Nota");
|
||||||
|
$tsql = ''; $asql = [$this->id_cab];
|
||||||
|
if (empty($tcari)) {
|
||||||
|
$tsql .= " AND UserID=? AND Tgl_Jual=?";
|
||||||
|
array_push($asql, $this->app->user()->id(), tgl_ymd());
|
||||||
|
} else {
|
||||||
|
$tsql .= " AND CONCAT(No_Jual,DATE_FORMAT(Tgl_Jual,'%d-%m-%Y')) LIKE ?";
|
||||||
|
array_push($asql, '%' . $tcari . '%');
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("(SELECT * FROM inv_jual WHERE POS=1 AND CabID=?".$tsql.") J LEFT JOIN para_rek_pos P ON (J.KartuID=P.KartuID) LEFT JOIN para_member M ON (J.MemberID=M.MemberID)", "J.*,DATE_FORMAT(J.DateStamp,'%H:%i:%s') Tgl_Jual2,J.Total_Jual-J.Total_Diskon Total,IFNULL(M.Nama_Member,'') Nama_Member,IF(ISNULL(P.Kode_Kartu),'Tunai',P.Kode_Kartu) Kartu", "", $asql);
|
||||||
|
$obj->set_footer("SUM(Total_Jual) Total_Jual,SUM(Total_Diskon) Total_Diskon,SUM(Total_Jual-Total_Diskon) Total");
|
||||||
|
$obj->add_field("No_Jual", "No. Nota", "c");
|
||||||
|
$obj->add_field("Tgl_Jual", "Tanggal", "c", "sqltgl", "", "val-tgl");
|
||||||
|
$obj->add_field("Tgl_Jual2", "Jam", "c");
|
||||||
|
$obj->add_field("Nama_Member", "Member", "awr");
|
||||||
|
$obj->add_field("Total_Jual", "Sub. Total", "r", "rupiah2", "rupiah2");
|
||||||
|
$obj->add_field("Total_Diskon", "Diskon", "r", "rupiah2", "rupiah2");
|
||||||
|
$obj->add_field("Total", "Jumlah", "r", "rupiah2", "rupiah2");
|
||||||
|
$obj->add_field("Kartu", "C / D", "l");
|
||||||
|
if (empty($tcari)) {
|
||||||
|
$obj->set_field_order("Tgl_Jual2", "D");
|
||||||
|
} else {
|
||||||
|
$obj->set_field_order("Tgl_Jual", "D");
|
||||||
|
}
|
||||||
|
$obj->add_row_btn("printer", "Cetak", "POSJS.nota_print");
|
||||||
|
$obj->add_row_btn("clipboard", "Ubah", "POSJS.nota_select");
|
||||||
|
if ($this->app->user()->is_level(1)) $obj->add_row_btn("trash", "Hapus", "POSJS.nota_delete", "CabID", $this->id_cab);
|
||||||
|
else $obj->add_row_btn("trash", "Hapus", "POSJS.nota_delete", "UserID", $this->app->user()->id());
|
||||||
|
$this->app->json([ $obj->db_table("divBrowNota") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function brow_pending() {
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("(SELECT *,Total_Jual-Total_Diskon Jumlah FROM inv_jual_pend WHERE POS=1 AND CabID=? AND UserID=?) J LEFT JOIN para_member B ON (J.MemberID=B.MemberID)", "J.*,B.Nama_Member", "", [$this->id_cab, $this->app->user()->id()]);
|
||||||
|
$obj->add_field("No_Jual", "No. Nota", "c");
|
||||||
|
$obj->add_field("Tgl_Jual", "Tgl. Pending", "c", "sqltgl", "", "val-tgl");
|
||||||
|
$obj->add_field("Nama_Member", "Nama Member", "awr");
|
||||||
|
$obj->add_field("Total_Jual", "Sub. Total", "r", "rupiah2");
|
||||||
|
$obj->add_field("Total_Diskon", "Diskon", "r", "rupiah2");
|
||||||
|
$obj->add_field("Jumlah", "Jumlah", "r", "rupiah2");
|
||||||
|
$obj->set_field_order("No_Jual", "D");
|
||||||
|
$obj->add_row_btn("save", "Pilih", "POSJS.pending_select");
|
||||||
|
if ($this->app->user()->is_level(1)) $obj->add_row_btn("trash", "Hapus", "POSJS.pending_delete", "UserID", $this->app->user()->id());
|
||||||
|
$this->app->json([ $obj->db_table("divBrowPending") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function brow_member() {
|
||||||
|
$tcari = Param::Get("Cari_Member");
|
||||||
|
$tsql = ''; $asql = [1];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql .= " AND CONCAT_WS(Kode_Member,Nama_Member,Alamat_Member,Telp_Member) LIKE ?";
|
||||||
|
$asql[] = '%' . $tcari . '%';
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("para_member", "*,TRIM(CONCAT(Kode_Member,'\n',Kota_Member)) Info_Member", "Aktif=?".$tsql, $asql);
|
||||||
|
$obj->add_field("MemberID", "ID", "hid");
|
||||||
|
$obj->add_field("Grup_MemberID", "Grup ID", "hid");
|
||||||
|
$obj->add_field("Kode_Member", "Kode", "c");
|
||||||
|
$obj->add_field("Nama_Member", "Nama Member", "awr");
|
||||||
|
$obj->add_field("Alamat_Member", "Alamat", "awr");
|
||||||
|
$obj->add_field("Telp_Member", "Telp.", "awr");
|
||||||
|
$obj->add_field("Info_Member", "Info", "hid");
|
||||||
|
$obj->set_field_order("Nama_Member", "A");
|
||||||
|
$obj->set_func_select("POSJS.member_select");
|
||||||
|
$this->app->json([ $obj->db_table("divBrowMember") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function brow_produk() {
|
||||||
|
$tcari = Param::Get("Cari_Produk");
|
||||||
|
$tsql = ''; $asql = [1, $this->id_grup_member];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql .= " AND Barcode_Nama LIKE ?";
|
||||||
|
$asql[] = '%' . $tcari . '%';
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("inv_produk_join", "*", "Aktif=? AND Grup_MemberID=? AND Harga_Jual>0".$tsql, $asql);
|
||||||
|
$obj->add_field("InvID", "ID", "hid");
|
||||||
|
$obj->add_field("SatuanID", "ID", "hid");
|
||||||
|
$obj->add_field("VarianID", "ID", "hid");
|
||||||
|
$obj->add_field("Kode_SKU", "SKU", "c");
|
||||||
|
$obj->add_field("Kode_Barcode", "Barcode", "c");
|
||||||
|
$obj->add_field("Nama_Lengkap", "Nama Barang", "awr");
|
||||||
|
$obj->add_field("Harga_Jual", "Harga Jual", "r", "rupiah");
|
||||||
|
$obj->set_field_order("Kode_SKU", "A");
|
||||||
|
$obj->set_func_select("POSJS.produk_select");
|
||||||
|
$this->app->json([ $obj->db_table("divBrowProduk") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function auto_member() {
|
||||||
|
$tcari = Param::Get("Auto_Query", "");
|
||||||
|
$ajson['autodata'] = [];
|
||||||
|
|
||||||
|
$stat = $this->db->runQuery("SELECT MemberID,Grup_MemberID,Kode_Member,Nama_Member,TRIM(CONCAT(Kode_Member,'\n',Kota_Member)) Info_Member FROM para_member WHERE Aktif=1 AND CONCAT(Kode_Member,Nama_Member,Alamat_Member,Telp_Member) LIKE ? ORDER BY Nama_Member LIMIT 50", ['%'.$tcari.'%']);
|
||||||
|
while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$ajson['autodata'][] = ['value'=>$row['MemberID'], 'text'=>$row['Nama_Member'], 'html'=>'<span class="text-primary">'.$row['Kode_Member'].'</span> '.$row['Nama_Member'], 'data'=>$row['Grup_MemberID'].':'.$row['Info_Member'], 'bc'=>0];
|
||||||
|
}
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function auto_produk() {
|
||||||
|
$tcari = Param::Get("Auto_Query", "");
|
||||||
|
$ajson['autodata'] = [];
|
||||||
|
$bcode = 0; $arec = [];
|
||||||
|
|
||||||
|
if (is_numeric($tcari) && strlen($tcari) === 8) {
|
||||||
|
// Cari by Member
|
||||||
|
// M : Grup_Member : Info_Member
|
||||||
|
$_row = $this->db->fetchRow("SELECT MemberID InvID,Nama_Member Nama_Lengkap,CONCAT('M:',Grup_MemberID,':',TRIM(CONCAT(Kode_Member,'\n',Kota_Member))) Data2 FROM para_member WHERE Aktif=1 AND Kode_Member=?", [$tcari]);
|
||||||
|
if ($_row) {
|
||||||
|
$bcode = 1;
|
||||||
|
$arec = $_row->getData();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cari by SKU + Barcode
|
||||||
|
// P : Satuan : Varian : Harga_Pokok : Harga_Jual : Stok
|
||||||
|
if ($bcode === 0) {
|
||||||
|
$_row = $this->db->fetchRow("SELECT P.InvID,P.Nama_Lengkap,CONCAT('P:',P.SatuanID,':',P.VarianID,':',CONVERT(P.Harga_Pokok USING UTF8),':',CONVERT(P.Harga_Jual USING UTF8),':',CONVERT(IFNULL(X.Stok,0) USING UTF8)) Data2 FROM (SELECT * FROM inv_produk_join WHERE Aktif=1 AND Harga_Jual>0 AND Grup_MemberID=? AND (Kode_SKU=? OR Kode_Barcode=?)) P LEFT JOIN inv_stok X ON (X.CabID=? AND X.InvID=P.InvID)", [$this->id_grup_member, $tcari, $tcari, $this->id_cab]);
|
||||||
|
if ($_row) {
|
||||||
|
$bcode = 1;
|
||||||
|
$arec = $_row->getData();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($bcode === 1) {
|
||||||
|
$ajson['autodata'][] = ['value'=>$arec['InvID'], 'text'=>$arec['Nama_Lengkap'], 'data'=>$arec['Data2'], 'bc'=>1];
|
||||||
|
} else {
|
||||||
|
$stat = $this->db->runQuery("SELECT P.InvID,P.Nama_Lengkap,P.Kode_SKU,IF(IFNULL(X.Stok,0)=0,'KOSONG',ROUND(X.Stok/P.Qty,2)) Sisa_Stok,P.Harga_Jual,CONCAT('P:',P.SatuanID,':',P.VarianID,':',CONVERT(P.Harga_Pokok USING UTF8),':',CONVERT(P.Harga_Jual USING UTF8),':',CONVERT(IFNULL(X.Stok,0) USING UTF8)) Data2 FROM (SELECT * FROM inv_produk_join WHERE Barcode_Nama LIKE ? AND Aktif=1 AND Harga_Jual>0 AND Grup_MemberID=?) P LEFT JOIN inv_stok X ON (X.CabID=? AND X.InvID=P.InvID) ORDER BY P.Nama_Produk,P.Qty LIMIT 50", ['%'.$tcari.'%', $this->id_grup_member, $this->id_cab]);
|
||||||
|
while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$ajson['autodata'][] = ['value'=>$row['InvID'], 'text'=>$row['Nama_Lengkap'], 'html'=>'<span class="text-primary">'.$row['Kode_SKU'].'</span> '.$row['Nama_Lengkap'].' - <strong>Rp'.rupiah($row['Harga_Jual']).'</strong> <span class="text-danger">('.(string) $row['Sisa_Stok'].')</span>', 'data'=>$row['Data2'], 'bc'=>0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_master() {
|
||||||
|
$ajson = [ 'error'=>"", 'html'=>"" ];
|
||||||
|
$atabel = [];
|
||||||
|
|
||||||
|
if ($this->mode === "pending-edit") {
|
||||||
|
$this->inv->Pending_Edit($this->no_jual);
|
||||||
|
$atabel = $this->Data_Jual($this->no_jual);
|
||||||
|
$this->mode = "edit";
|
||||||
|
} else if ($this->mode === "pending-save") {
|
||||||
|
$b_baru = false;
|
||||||
|
if (str_ends_with($this->no_jual, "#00")) {
|
||||||
|
$b_baru = true;
|
||||||
|
$no_lama = $this->no_jual;
|
||||||
|
$this->no_jual = $this->Pending_Nomor();
|
||||||
|
$this->inv->Pending_Save($no_lama, $this->no_jual);
|
||||||
|
}
|
||||||
|
$apending = $this->db->fetchRow("SELECT SUM(-Qty*Harga_Jual) Jual,SUM(-Qty*Disk_Rupiah) Diskon FROM tmp_inv_detail WHERE No_Ref=?", [$this->no_jual]) ?? ['Jual'=>0, 'Diskon'=>0];
|
||||||
|
|
||||||
|
$sql = new SQL($this->app);
|
||||||
|
$sql->set_table("inv_jual_pend");
|
||||||
|
$sql->add_param("No_Jual", $this->no_jual);
|
||||||
|
$sql->add_param_date("Tgl_Jual");
|
||||||
|
$sql->add_param("CabID", $this->id_cab);
|
||||||
|
$sql->add_param("MemberID");
|
||||||
|
$sql->add_param("Total_Jual", $apending['Jual']);
|
||||||
|
$sql->add_param("Total_Diskon", $apending['Diskon']);
|
||||||
|
$sql->add_param_userid();
|
||||||
|
$sql->add_where("No_Jual", $this->no_jual);
|
||||||
|
if ($b_baru) $sql->InsertDB();
|
||||||
|
else $sql->UpdateDB();
|
||||||
|
$atabel = $this->Data_Jual();
|
||||||
|
} else if ($this->mode === "pending-delete") {
|
||||||
|
$this->inv->Pending_Delete($this->no_jual);
|
||||||
|
$this->db->delete("inv_jual_pend", "No_Jual=?", [$this->no_jual]);
|
||||||
|
$atabel = $this->Data_Jual();
|
||||||
|
} else if ($this->mode === "edit") {
|
||||||
|
$this->inv->Detail_Copy($this->no_jual, true);
|
||||||
|
$atabel = $this->Data_Jual($this->no_jual);
|
||||||
|
} else if ($this->mode === "save") {
|
||||||
|
$no_lama = $this->no_jual;
|
||||||
|
if ($this->is_pend) {
|
||||||
|
$this->no_jual = $this->inv->Nomor_POS("", tgl_dmy(), true);
|
||||||
|
if (!str_ends_with($no_lama, "#00")) $this->db->delete("inv_jual_pend", "No_Jual=?", [$no_lama]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// PROSES PROMO
|
||||||
|
$this->inv->Promo_Barang($no_lama, tgl_dmy(), $this->id_grup_member);
|
||||||
|
$tot_potong = $this->inv->Promo_Total($no_lama, tgl_dmy(), $this->id_grup_member);
|
||||||
|
|
||||||
|
$this->inv->Detail_Save($this->no_jual, 6, $this->id_cab, tgl_dmy(), $this->is_pend, $no_lama);
|
||||||
|
|
||||||
|
$ajual = $this->db->fetchRow("SELECT SUM(-Qty*Harga_Jual) Jual, SUM(-Qty*Disk_Rupiah) Diskon, SUM(-Qty*Harga_Beli) HPP FROM inv_detail WHERE No_Ref=?", [$this->no_jual]) ?? ['Jual'=>0, 'Diskon'=>0, 'HPP'=>0];
|
||||||
|
|
||||||
|
$id_kartu = Param::Int("KartuID", 0);
|
||||||
|
$no_kartu = ""; $nama_kartu = ""; $rek_debit = $this->app_gel['KAS_TUNAI'];
|
||||||
|
if ($id_kartu > 0) {
|
||||||
|
$no_kartu = Param::Get("No_Kartu", "");
|
||||||
|
$nama_kartu = Param::Get("Nama_Kartu", "");
|
||||||
|
$rek_debit = $this->db->fetchField("SELECT Kode_Rek FROM para_rek_pos WHERE KartuID=?", [$id_kartu]) ?? $rek_debit;
|
||||||
|
}
|
||||||
|
|
||||||
|
$sql = new SQL($this->app);
|
||||||
|
$sql->set_table("inv_jual");
|
||||||
|
$sql->add_param("Tgl_Jual", tgl_ymd());
|
||||||
|
$sql->add_param("Tgl_Lunas", tgl_ymd());
|
||||||
|
$sql->add_param("CabID", $this->id_cab);
|
||||||
|
$sql->add_param("MemberID");
|
||||||
|
$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("Lunas", 1);
|
||||||
|
$sql->add_param_stamp();
|
||||||
|
$sql->add_param_userid();
|
||||||
|
$sql->add_where("No_Jual", $this->no_jual);
|
||||||
|
$sql->UpdateDB();
|
||||||
|
|
||||||
|
// PROSES MEMBER POINT
|
||||||
|
if ($this->id_member > 0) {
|
||||||
|
$apoint = $this->db->fetchColumn("SELECT Point_TipeID FROM inv_point_tipe WHERE Aktif=1 ORDER BY Point_TipeID") ?? [];
|
||||||
|
if (count($apoint) > 0) {
|
||||||
|
$amember = $this->db->fetchRow("SELECT Grup_MemberID,IM,Kode_Member FROM para_member WHERE MemberID=?", [$this->id_member]);
|
||||||
|
if ($amember && ($amember['IM'] === 1 || ($amember['IM'] === 0 && !empty($amember['Kode_Member'])))) {
|
||||||
|
$this->db->runQuery("DELETE FROM inv_point_tx WHERE No_TX=?", [$this->no_jual]);
|
||||||
|
foreach ($apoint as $id_tipe) {
|
||||||
|
if ($amember['IM'] === 0 && $id_tipe === 1) continue;
|
||||||
|
$tot_point = $this->inv->Point_Hitung($this->no_jual, tgl_dmy(), $amember['Grup_MemberID'], $id_kartu, $id_tipe);
|
||||||
|
if ($tot_point > 0) $this->db->runQuery("INSERT INTO inv_point_tx (No_TX,Tgl_TX,Point_TipeID,CabID,MemberID,Point,Nilai_Point,DateStamp,UserID) VALUES (?, ?, ?, ?, ?, ?, ?, NOW(), ?)", [$this->no_jual, tgl_ymd(), $id_tipe, $this->id_cab, $this->id_member, $tot_point, $tot_point, $this->app->user()->id()]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// PROSES POSTING GL
|
||||||
|
$ainfo = $this->db->fetchRow("SELECT J.*,B.Nama_Member,(J.Total_Jual-J.Total_Diskon) Tagihan FROM (SELECT * FROM inv_jual WHERE No_Jual=?) J LEFT JOIN para_member B ON (B.MemberID=J.MemberID)", [$this->no_jual]);
|
||||||
|
if (count($ainfo) > 0) {
|
||||||
|
$ajurnal = [
|
||||||
|
'Kode_Jurnal' => $ainfo['No_Jual'],
|
||||||
|
'TipeID' => 7,
|
||||||
|
'CabID' => $ainfo['CabID'],
|
||||||
|
'Tanggal' => tgl_sql2str($ainfo['Tgl_Jual']),
|
||||||
|
'Kode_Ref' => $ainfo['No_Jual'],
|
||||||
|
'Catatan' => "Penjualan POS : ".$ainfo['No_Jual']." | ".$ainfo['Nama_Member']." | ".$this->app->user()->username()
|
||||||
|
];
|
||||||
|
$_rek_d = "D"; $_rek_k = "K";
|
||||||
|
if ($ainfo['Tagihan'] < 0) { $_rek_d = "K"; $_rek_k = "D"; }
|
||||||
|
$adetail = [
|
||||||
|
[ 'Kode_Rek' => $this->app_gel['HPP'], 'DK' => $_rek_d, 'Jumlah' => $ainfo['Total_HPP'] ],
|
||||||
|
[ 'Kode_Rek' => $this->app_gel['STOK'], 'DK' => $_rek_k, 'Jumlah' => $ainfo['Total_HPP'] ],
|
||||||
|
[ 'Kode_Rek' => $rek_debit, 'DK' => $_rek_d, 'Jumlah' => $ainfo['Tagihan'] ],
|
||||||
|
[ 'Kode_Rek' => $this->app_gel['JUAL'], 'DK' => $_rek_k, 'Jumlah' => $ainfo['Tagihan']+$ainfo['Total_Potong'] ]
|
||||||
|
];
|
||||||
|
if ($ainfo['Total_Potong'] > 0) array_push($adetail, [ 'Kode_Rek' => $this->app_gel['POT_JUAL'], 'DK' => "D", 'Jumlah' => $ainfo['Total_Potong'] ]);
|
||||||
|
$this->gel->Jurnal_Post($ajurnal, $adetail);
|
||||||
|
}
|
||||||
|
|
||||||
|
$atabel = $this->Data_Jual();
|
||||||
|
$atabel['No_Cetak'] = $this->no_jual;
|
||||||
|
$_kembali = (float) $this->db->fetchField("SELECT (Total_Jual-Total_Diskon-Total_Potong-Total_Bayar) Sisa FROM inv_jual WHERE No_Jual=?", [$this->no_jual]) ?? 0;
|
||||||
|
if ($_kembali !== 0) $atabel['Kembali'] = '<span style="text-danger">'.rupiah($_kembali).'</span>';
|
||||||
|
|
||||||
|
//MONITOR DISPLAY
|
||||||
|
if ($this->app_inv['MON_ENABLE']) {
|
||||||
|
$this->db->runQuery("UPDATE disp_login SET No_Cetak=? WHERE CabID=? AND UserID=? AND Unix=?", [$this->no_jual, $this->id_cab, $this->app->user()->id(), $this->app->user()->unix()]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($this->app_inv['PRINT_AUTO'] === 1) {
|
||||||
|
$this->mode = "print";
|
||||||
|
} else {
|
||||||
|
$this->mode = ($this->app_inv['PRINT_OPENCD'] === 1) ? "opencd" : "saveonly";
|
||||||
|
}
|
||||||
|
|
||||||
|
} else if ($this->mode === "delete") {
|
||||||
|
// PROSES UPDATE PROMO
|
||||||
|
$ajual = $this->db->fetchRow("SELECT J.*,M.Grup_MemberID FROM (SELECT MemberID,Tgl_Jual FROM inv_jual WHERE No_Jual=?) J LEFT JOIN para_member M ON (M.MemberID=J.MemberID)", [$this->no_jual]);
|
||||||
|
if ($ajual) $this->inv->Promo_Hapus($this->no_jual, tgl_sql2str($ajual['Tgl_Jual']), $ajual['Grup_MemberID']);
|
||||||
|
|
||||||
|
// PROSES MEMBER POINT
|
||||||
|
if ($ajual['MemberID'] > 0) $this->db->runQuery("DELETE FROM inv_point_tx WHERE No_TX=?", [$this->no_jual]);
|
||||||
|
// PROSES POSTING GL
|
||||||
|
$this->db->runQuery("DELETE FROM gel_jurnal WHERE Kode_Jurnal=?", [$this->no_jual]);
|
||||||
|
$this->db->runQuery("DELETE FROM gel_jurnal_detail WHERE Kode_Jurnal=?", [$this->no_jual]);
|
||||||
|
|
||||||
|
$this->db->runQuery("DELETE FROM inv_jual WHERE No_Jual=?", [$this->no_jual]);
|
||||||
|
$this->db->runQuery("DELETE FROM inv_detail WHERE No_Ref=?", [$this->no_jual]);
|
||||||
|
$atabel = $this->Data_Jual();
|
||||||
|
|
||||||
|
} else if ($this->mode === "cancel") {
|
||||||
|
if (str_ends_with($this->no_jual, "#00") || !$this->is_pend) $this->inv->Detail_Cancel($this->no_jual);
|
||||||
|
$atabel = $this->Data_Jual();
|
||||||
|
} else {
|
||||||
|
$atabel = $this->Data_Jual();
|
||||||
|
}
|
||||||
|
|
||||||
|
//MONITOR DISPLAY
|
||||||
|
if ($this->app_inv['MON_ENABLE']) {
|
||||||
|
$this->db->runQuery("UPDATE disp_login SET No_Pos=? WHERE CabID=? AND UserID=? AND Unix=?", [$atabel['No_Jual'], $this->id_cab, $this->app->user()->id(), $this->app->user()->unix()]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tno_jual = $form->textbox("_", "No_Jual", $atabel['No_Jual'], false);
|
||||||
|
$tn_member = $form->textauto("_", "Nama_Member", ['value'=>$atabel['MemberID'],'text'=>$atabel['Nama_Member']], true, true, "cari member");
|
||||||
|
$ti_member = $form->textarea("_", "Info_Member", $atabel['Info_Member'], false);
|
||||||
|
$tinfo = '<div class="card bg-light"><img class="img-fluid p-1" src="'.PROJECT_BASE.'assets/images/logo60.png" style="opacity:.75;"></div>';
|
||||||
|
$ajson['html'] = '
|
||||||
|
<div class="row mb-3">
|
||||||
|
<div class="col"><div class="border border-success rounded px-2 display-6 text-end" id="Total_Disp">'.$atabel['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">
|
||||||
|
<div class="col"><div class="input-group">'.$tn_member.'<button class="btn btn-warning shadow-none" type="button" id="posMEMBER"><i class="bi-people-fill"></i></button></div></div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1"><div class="col">'.$ti_member.'</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>
|
||||||
|
</div></div>
|
||||||
|
<input type="hidden" id="No_Cetak" value="'.$atabel['No_Cetak'].'" />
|
||||||
|
<input type="hidden" id="Total_Tunai" value="'.$atabel['Total_Tunai'].'" />
|
||||||
|
<input type="hidden" id="Total_Kartu" value="'.$atabel['Total_Kartu'].'" />
|
||||||
|
<input type="hidden" id="Total_Bayar" value="'.$atabel['Total_Bayar'].'" />
|
||||||
|
<input type="hidden" id="Total_Nota" value="'.$atabel['Total_Nota'].'" />
|
||||||
|
<input type="hidden" id="Total_Item" value="'.$atabel['Total_Item'].'" />
|
||||||
|
<input type="hidden" id="Tgl_Jual" value="'.tgl_sql2str($atabel['Tgl_Jual']).'" />
|
||||||
|
<input type="hidden" id="MemberID" value="'.$atabel['MemberID'].'" />
|
||||||
|
<input type="hidden" id="Grup_MemberID" value="'.$atabel['Grup_MemberID'].'" />
|
||||||
|
<input type="hidden" id="KartuID" value="'.$atabel['KartuID'].'" />
|
||||||
|
<input type="hidden" id="No_Kartu" value="'.$atabel['No_Kartu'].'" />
|
||||||
|
<input type="hidden" id="Nama_Kartu" value="'.$atabel['Nama_Kartu'].'" />
|
||||||
|
<input type="hidden" id="mode" value="'.$this->mode.'" />';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_produk() {
|
||||||
|
$id = (int) Param::Get("ID", 0);
|
||||||
|
$atabel = [ 'ID'=>$id, 'InvID'=>$this->id_inv, 'SatuanID'=>$this->id_satuan, 'VarianID'=>$this->id_varian, 'Kode_SKU'=>"", 'Kode_Barcode'=>"", 'Nama_Lengkap'=>"", 'Satuan_Kemasan'=>"", 'Qty'=>0, 'Harga_Beli'=>0, 'Harga_Jual'=>0, 'Disk_Rupiah'=>0 ];
|
||||||
|
if ($id > 0) {
|
||||||
|
$_row = $this->db->fetchRow("SELECT ID,-Qty Qty,Harga_Beli,Harga_Jual,Disk_Rupiah FROM tmp_inv_detail WHERE No_Ref=? AND ID=?", [$this->no_jual, $id]);
|
||||||
|
if ($_row) $atabel = array_merge($atabel, $_row->getData());
|
||||||
|
}
|
||||||
|
if ($this->id_inv > 0 && $this->id_satuan > 0) {
|
||||||
|
$_row = $this->db->fetchRow("SELECT Kode_SKU,Kode_Barcode,Nama_Lengkap,Satuan_Kemasan,Harga_Pokok Harga_Beli,Harga_Jual FROM inv_produk_join WHERE InvID=? AND SatuanID=? AND VarianID=? AND Grup_MemberID=?", [$this->id_inv, $this->id_satuan, $this->id_varian, $this->id_grup_member]);
|
||||||
|
if ($_row) $atabel = array_merge($atabel, $_row->getData());
|
||||||
|
}
|
||||||
|
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tsku = $form->textbox("_", "Kode_SKU", $atabel['Kode_SKU']. " / " .$atabel['Kode_Barcode'], false);
|
||||||
|
$tnama = $form->textbox("_", "Nama_Lengkap", $atabel['Nama_Lengkap'], false);
|
||||||
|
$tqty = $form->textbox("_", "Qty", $atabel['Qty'], true, true, "double");
|
||||||
|
$tjual = $form->textbox("_", "Harga_Jual", $atabel['Harga_Jual'], false, false, "double");
|
||||||
|
$tdisrp = $form->textbox("_", "Disk_Rupiah", $atabel['Disk_Rupiah'], true, false, "double");
|
||||||
|
$tdispn = $form->textbox("_", "Disk_Persen", 0, true, false, "double");
|
||||||
|
$ttot = $form->textbox("_", "Jumlah", 0, false, false, "double");
|
||||||
|
$tsat = $form->textbox("_", "Nama_Satuan", $atabel['Satuan_Kemasan'], false);
|
||||||
|
$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">'.$tsku.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label">Nama Barang</label>
|
||||||
|
<div class="col">'.$tnama.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1"><hr class="my-1"></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">Harga (@)</label>
|
||||||
|
<div class="col-sm-8 col-lg-5">'.$tjual.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="Disk_Rupiah">Diskon (@)</label>
|
||||||
|
<div class="col-sm-8 col-lg-5">'.$tdisrp.'</div>
|
||||||
|
<div class="col-sm-3 col-lg-3"><div class="input-group"><div class="input-group-text">≈</div>'.$tdispn.'<div class="input-group-text">%</div></div></div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label">Sub Total</label>
|
||||||
|
<div class="col-sm-8 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="VarianID" value="'.$atabel['VarianID'].'" >
|
||||||
|
<input type="hidden" id="Harga_Beli" value="'.$atabel['Harga_Beli'].'" >
|
||||||
|
<input type="hidden" id="mode_detail" value="'.$this->mode_detail.'" >';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_kasir() {
|
||||||
|
$tot_jual = Param::Float("Total_Nota", 0);
|
||||||
|
$tot_jual -= $this->inv->Promo_Hitung($this->no_jual, tgl_dmy(), $this->id_grup_member);
|
||||||
|
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tjual = $form->textbox("_", "popTotal_Jual", uang($tot_jual), false, false, "double");
|
||||||
|
$ttunai = $form->textbox("_", "popTotal_Tunai", 0, true, false, "double");
|
||||||
|
$tkartu = $form->textbox("_", "popTotal_Kartu", 0, true, false, "double");
|
||||||
|
$tsisa = $form->textbox("_", "popTotal_Sisa", 0, false, false, "double");
|
||||||
|
$okartu = $form->option_db("_", "popKartuID", 0, true, false, "para_rek_pos", ["KartuID","Kode_Kartu"], "Aktif=1", [0,"Pilihan Non Tunai"]);
|
||||||
|
$tnokartu = $form->textbox("_", "popNo_Kartu", "", true, false, "text");
|
||||||
|
$tnamakartu = $form->textbox("_", "popNama_Kartu", "", true, false, "text");
|
||||||
|
$ajson['html'] = '
|
||||||
|
<div class="row mb-1"><div class="col-sm-6 col-lg-5 col-form-label">Total Nota Rp.</div><div class="col-sm-6 col-lg-7">'.$tjual.'</div></div>
|
||||||
|
<div class="row mb-1"><div class="col-sm-6 col-lg-5 col-form-label">Tunai Rp.</div><div class="col-sm-6 col-lg-7">'.$ttunai.'</div></div>
|
||||||
|
<div class="row mb-1"><div class="col-sm-6 col-lg-5">'.$okartu.'</div><div class="col-sm-6 col-lg-7">'.$tkartu.'</div></div>
|
||||||
|
<div class="row mb-1"><div class="col-sm-6 col-lg-5 col-form-label">Kembali Rp.</div><div class="col-sm-6 col-lg-7">'.$tsisa.'</div></div>
|
||||||
|
<hr class="my-2 ckartu d-none">
|
||||||
|
<div class="row mb-1 ckartu d-none"><div class="col-sm-6 col-lg-5 col-form-label">Nomor Kartu</div><div class="col-sm-6 col-lg-7">'.$tnokartu.'</div></div>
|
||||||
|
<div class="row mb-1 ckartu d-none"><div class="col-sm-6 col-lg-5 col-form-label">Nama Pemilik</div><div class="col-sm-6 col-lg-7">'.$tnamakartu.'</div></div>
|
||||||
|
<hr class="my-2">
|
||||||
|
<div class="row mt-1">
|
||||||
|
<div class="col-3 d-grid"><button type="button" class="btn btn-primary" id="butKPend">Pending</button></div>
|
||||||
|
<div class="col-3"> </div>
|
||||||
|
<div class="col-3 d-grid"><button type="button" class="btn btn-danger" id="butKBatal" data-bs-dismiss="modal">Batal</button></div>
|
||||||
|
<div class="col-3 d-grid"><button type="button" class="btn btn-success" id="butKBayar">Bayar</button></div>
|
||||||
|
</div>
|
||||||
|
<input type="hidden" id="popTotal_Bayar" value="0" />';
|
||||||
|
$ajson['Total_Disp'] = rupiah($tot_jual);
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function config_pole() {
|
||||||
|
$apole = [];
|
||||||
|
$_pole = $this->db->fetchRow("SELECT * FROM disp_config WHERE REG_ID=?", [$this->web_app['APP_CODE']]);
|
||||||
|
if ($_pole) {
|
||||||
|
foreach ($_pole->getData() as $_key => $_val) {
|
||||||
|
if (str_contains($_key, "POLE")) {
|
||||||
|
if (str_contains($_key, "ENABLE")) $_val = (int) $_val;
|
||||||
|
$apole[str_replace("POLE_","",$_key)] = $_val;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->app->json([ 'pole'=> $apole ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$this->app->json(['html' => '
|
||||||
|
<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" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="divPOS1"> </div>
|
||||||
|
</div>
|
||||||
|
<div class="col-sm-12 col-md-3 col-lg-2 border-start">
|
||||||
|
<div id="divPOS2"> </div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div></div></div>'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function Data_Jual(string $nomor=""): array {
|
||||||
|
$aparam = [
|
||||||
|
'No_Jual' => "POS".$this->web_app['SERVER_ID'].(string) $this->id_cab.$this->app->user()->id(3)."#00",
|
||||||
|
'No_Cetak' => "",
|
||||||
|
'Tgl_Jual' => tgl_ymd(),
|
||||||
|
'MemberID' => $this->id_member,
|
||||||
|
'Grup_MemberID' => $this->id_grup_member,
|
||||||
|
'Nama_Member' => "",
|
||||||
|
'Info_Member' => "",
|
||||||
|
'Total_Nota' => 0,
|
||||||
|
'Total_Item' => 0,
|
||||||
|
'Total_Tunai' => 0,
|
||||||
|
'Total_Kartu' => 0,
|
||||||
|
'Total_Bayar' => 0,
|
||||||
|
'KartuID' => 0,
|
||||||
|
'No_Kartu' => "",
|
||||||
|
'Nama_Kartu' => "",
|
||||||
|
'Kembali' => "0"
|
||||||
|
];
|
||||||
|
if (empty($nomor)) {
|
||||||
|
$aparam['MemberID'] = $this->id_member_def;
|
||||||
|
} else {
|
||||||
|
$tabel_jual = (str_contains($nomor, "POS") === false) ? "inv_jual" : "inv_jual_pend";
|
||||||
|
$row = $this->db->fetchRow("SELECT * FROM ".$tabel_jual." WHERE CabID=? AND No_Jual=?", [$this->id_cab, $nomor]);
|
||||||
|
if ($row) $aparam = array_merge($aparam, $row->getData());
|
||||||
|
}
|
||||||
|
if ($aparam['MemberID'] > 0) {
|
||||||
|
$row = $this->db->fetchRow("SELECT Grup_MemberID,Nama_Member,TRIM(CONCAT(Kode_Member,'\n',Kota_Member)) Info_Member FROM para_member WHERE MemberID=?", [$aparam['MemberID']]);
|
||||||
|
if ($row) $aparam = array_merge($aparam, $row->getData());
|
||||||
|
}
|
||||||
|
return $aparam;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function Pending_Nomor(): string {
|
||||||
|
$tno = "POS".$this->web_app['SERVER_ID'].(string) $this->id_cab.$this->app->user()->id(3)."#";
|
||||||
|
$ino = (int) $this->db->fetchField("SELECT MAX(RIGHT(No_Jual,2)) FROM inv_jual_pend WHERE No_Jual LIKE ?", [$tno.'%']) ?? 0;
|
||||||
|
$tno .= isi_nol(++$ino, 2);
|
||||||
|
return $tno;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,112 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Member/BaruController
|
||||||
|
Description : Pembuatan Member Baru
|
||||||
|
Created By : Siau Pheng ([email protected]).
|
||||||
|
Created Date : February 8th, 2012.
|
||||||
|
Last Modified : September 27th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Member;
|
||||||
|
|
||||||
|
use App\Utils\Invesa;
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\Session;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use Webapp\DB\SQL;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
|
||||||
|
class BaruController {
|
||||||
|
|
||||||
|
private int $id_grup_member;
|
||||||
|
private string $mode;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->id_grup_member = $session->get('APP_INV')['ECERANID'];
|
||||||
|
$this->mode = Param::Get("mode", "");
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_master() {
|
||||||
|
$atabel = [ 'Kode_Member'=>"", 'Nama_Member'=>"", 'Alamat_Member'=>"", 'Kota_Member'=>"", 'Telp_Member'=>"", 'KTP_Member'=>"", 'Tgl_Lahir'=>"00-00-0000", 'Tgl_Daftar'=>tgl_ymd(), 'Grup_MemberID'=>$this->id_grup_member ];
|
||||||
|
|
||||||
|
$benable = ($this->mode === 'add') ? true : false;
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tkode = $form->textbox("_", "Kode_Member", $atabel['Kode_Member'], $benable, true, "text", "kode / id member");
|
||||||
|
$tnama = $form->textbox("_", "Nama_Member", $atabel['Nama_Member'], $benable, true, "text", "nama member");
|
||||||
|
$talamat = $form->textarea("_", "Alamat_Member", $atabel['Alamat_Member'], $benable, true, 2, "alamat member");
|
||||||
|
$tkota = $form->textbox("_", "Kota_Member", $atabel['Kota_Member'], $benable, true, "text", "kota member");
|
||||||
|
$ttelp = $form->textbox("_", "Telp_Member", $atabel['Telp_Member'], $benable, true, "text", "hp member");
|
||||||
|
$tktp = $form->textbox("_", "KTP_Member", $atabel['KTP_Member'], $benable, true, "text", "ktp member");
|
||||||
|
$ttgld = $form->datebox("_", "Tgl_Daftar", $atabel['Tgl_Daftar'], $benable, true);
|
||||||
|
$ttgll = $form->datebox("_", "Tgl_Lahir", $atabel['Tgl_Lahir'], $benable, true);
|
||||||
|
$tgrup = $form->option_db("_", "Grup_MemberID", $atabel['Grup_MemberID'], $benable, false, "para_member_grup", ["Grup_MemberID","Nama_Grup"], "Aktif=1 ORDER BY Nama_Grup");
|
||||||
|
|
||||||
|
$ajson['html'] = '
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-2 col-form-label" for="Kode_Member">Kode Member</label>
|
||||||
|
<div class="col-sm-8 col-lg-4"><div class="input-group">'.$tkode.Invesa::Form_Info("Kode / ID Barcode Member (Scan dari Kartu Member). Contoh : 17000017").'</div></div>
|
||||||
|
<label class="col-sm-4 col-lg-2 col-form-label" for="Tgl_Daftar">Tanggal Daftar</label>
|
||||||
|
<div class="col-sm-8 col-lg-4">'.$ttgld.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-2 col-form-label" for="KTP_Member">No. KTP / SIM</label>
|
||||||
|
<div class="col-sm-8 col-lg-4">'.$tktp.'</div>
|
||||||
|
<label class="col-sm-4 col-lg-2 col-form-label" for="Tgl_Lahir">Tanggal Lahir</label>
|
||||||
|
<div class="col-sm-8 col-lg-4">'.$ttgll.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-2 col-form-label" for="Nama_Member">Nama Lengkap</label>
|
||||||
|
<div class="col">'.$tnama.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-2 col-form-label" for="Alamat_Member">Alamat Lengkap</label>
|
||||||
|
<div class="col">'.$talamat.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-2 col-form-label" for="Kota_Member">Kota</label>
|
||||||
|
<div class="col-sm-8 col-lg-4">'.$tkota.'</div>
|
||||||
|
<label class="col-sm-4 col-lg-2 col-form-label" for="Telp_Member">Telp / HP</label>
|
||||||
|
<div class="col-sm-8 col-lg-4">'.$ttelp.'</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="Grup_MemberID">Grup Member</label>
|
||||||
|
<div class="col-sm-8 col-lg-4">'.$tgrup.'</div>
|
||||||
|
</div>
|
||||||
|
<input type="hidden" id="mode" value="'.$this->mode.'" >';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function proses_simpan() {
|
||||||
|
$sql = new SQL($this->app);
|
||||||
|
$sql->set_table("para_member");
|
||||||
|
$sql->add_param("Grup_MemberID");
|
||||||
|
$sql->add_param("Kode_Member");
|
||||||
|
$sql->add_param("Nama_Member");
|
||||||
|
$sql->add_param("Alamat_Member");
|
||||||
|
$sql->add_param("Kota_Member");
|
||||||
|
$sql->add_param("Telp_Member");
|
||||||
|
$sql->add_param("KTP_Member");
|
||||||
|
$sql->add_param_date("Tgl_Lahir");
|
||||||
|
$sql->add_param_date("Tgl_Daftar");
|
||||||
|
$sql->add_param_userid();
|
||||||
|
$sql->InsertDB();
|
||||||
|
$this->app->json([ 'status' => true ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$this->app->json(['html' => '<div id="divMaster"></div>']);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,136 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Member/PointController
|
||||||
|
Description : Informasi Point Member
|
||||||
|
Created By : Siau Pheng ([email protected]).
|
||||||
|
Created Date : October 22nd, 2014.
|
||||||
|
Last Modified : September 29th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Member;
|
||||||
|
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use flight\Session;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
use Webapp\Web\Table;
|
||||||
|
|
||||||
|
class PointController {
|
||||||
|
|
||||||
|
private int $id_member;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->id_member = Param::Int("MemberID", 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function table_point() {
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("(SELECT * FROM inv_point_tipe WHERE Aktif=1) P LEFT JOIN (SELECT Point_TipeID,SUM(IF(Nilai_Point>0,Nilai_Point,0)) Tambah_Point,SUM(IF(Nilai_Point<0,-Nilai_Point,0)) Kurang_Point,SUM(Nilai_Point) Sisa_Point FROM inv_point_tx WHERE MemberID=? GROUP BY Point_TipeID ORDER BY Point_TipeID) S ON (S.Point_TipeID=P.Point_TipeID)", "S.*,P.Nama_Tipe", "", [$this->id_member]);
|
||||||
|
$obj->add_field("Nama_Tipe", "Tipe Point", "l");
|
||||||
|
$obj->add_field("Tambah_Point", "Pengumpulan", "r", "rupiah");
|
||||||
|
$obj->add_field("Kurang_Point", "Penukaran", "r", "rupiah");
|
||||||
|
$obj->add_field("Sisa_Point", "Sisa Point", "r", "rupiah");
|
||||||
|
$obj->set_field_order("Point_TipeID", "A");
|
||||||
|
$this->app->json([ $obj->json_table("divPOINT", 5) ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function brow_member() {
|
||||||
|
$tcari = Param::Get("Cari_Member");
|
||||||
|
$tsql = ''; $asql = [];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql .= " AND CONCAT(Kode_Member,Nama_Member,Alamat_Member,Telp_Member) LIKE ?";
|
||||||
|
array_push($asql, '%' . $tcari . '%');
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("(SELECT * FROM para_member WHERE Aktif=1 AND IM=1".$tsql.") M LEFT JOIN para_member_grup G ON (M.Grup_MemberID=G.Grup_MemberID)", "M.*,G.Nama_Grup", "", $asql);
|
||||||
|
$obj->add_field("MemberID", "ID", "hid");
|
||||||
|
$obj->add_field("Kode_Member", "Kode", "c");
|
||||||
|
$obj->add_field("Nama_Member", "Nama Member", "awr");
|
||||||
|
$obj->add_field("Alamat_Member", "Alamat", "awr");
|
||||||
|
$obj->add_field("Telp_Member", "Telp.", "awr");
|
||||||
|
$obj->add_field("Nama_Grup", "Grup", "hid");
|
||||||
|
$obj->set_field_order("Kode_Member", "A");
|
||||||
|
$obj->set_func_select("MemberPointJS.member_select");
|
||||||
|
$this->app->json([ $obj->db_table("divBrowMember") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function auto_member() {
|
||||||
|
$tcari = Param::Get("Auto_Query", "");
|
||||||
|
$ajson['autodata'] = [];
|
||||||
|
$bcode = 0; $arec = [];
|
||||||
|
|
||||||
|
if (is_numeric($tcari) && strlen($tcari) === 8) {
|
||||||
|
// Cari by Barcode
|
||||||
|
// Kode_Member : Grup_Member
|
||||||
|
$_row = $this->db->fetchRow("SELECT M.MemberID,M.Nama_Member,CONCAT(M.Kode_Member,':',G.Nama_Grup) Data2 FROM (SELECT * FROM para_member WHERE Aktif=1 AND IM=1 AND Kode_Member=?) M LEFT JOIN para_member_grup G ON (M.Grup_MemberID=G.Grup_MemberID)", [$tcari]);
|
||||||
|
if ($_row) {
|
||||||
|
$bcode = 1;
|
||||||
|
$arec = $_row->getData();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($bcode === 1) {
|
||||||
|
$ajson['autodata'][] = ['value'=>$arec['MemberID'], 'text'=>$arec['Nama_Member'], 'data'=>$arec['Data2'], 'bc'=>1];
|
||||||
|
} else {
|
||||||
|
$stat = $this->db->runQuery("SELECT M.MemberID,M.Kode_Member,M.Nama_Member,CONCAT(M.Kode_Member,':',G.Nama_Grup) Data2 FROM (SELECT * FROM para_member WHERE Aktif=1 AND IM=1 AND CONCAT(Kode_Member,Nama_Member,Alamat_Member,Telp_Member) LIKE ?) M LEFT JOIN para_member_grup G ON (M.Grup_MemberID=G.Grup_MemberID) ORDER BY M.Kode_Member LIMIT 50", ['%'.$tcari.'%']);
|
||||||
|
while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$ajson['autodata'][] = ['value'=>$row['MemberID'], 'text'=>$row['Nama_Member'], 'html'=>'<span class="text-primary">'.$row['Kode_Member'].'</span> '.$row['Nama_Member'], 'data'=>$row['Data2'], 'bc'=>0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function scan_member() {
|
||||||
|
$tcari = Param::Get("Cari_Member", "");
|
||||||
|
$scandata = [];
|
||||||
|
|
||||||
|
// Cari by Barcode
|
||||||
|
// Kode_Member : Grup_Member
|
||||||
|
$_row = $this->db->fetchRow("SELECT M.MemberID,M.Kode_Member,M.Nama_Member Nama_Lengkap,G.Nama_Grup FROM (SELECT * FROM para_member WHERE Aktif=1 AND IM=1 AND Kode_Member=?) M LEFT JOIN para_member_grup G ON (M.Grup_MemberID=G.Grup_MemberID)", [$tcari]);
|
||||||
|
if ($_row) $scandata = array_merge($scandata, $_row->getData());
|
||||||
|
$this->app->json([ $scandata ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tmem = $form->textauto("_", "Nama_Member", ['value'=>0, 'text'=>""], true, true, "Scan Barcode / Ketik Nama Member");
|
||||||
|
$tkode = $form->textbox("_", "Kode_Member", "KODE_MEMBER", false);
|
||||||
|
$tnama = $form->textbox("_", "Nama_Lengkap", "NAMA_MEMBER", false);
|
||||||
|
$tgrup = $form->textbox("_", "Nama_Grup", "GRUP_MEMBER", false);
|
||||||
|
$ajson['html'] = '';
|
||||||
|
if (isMobile()) {
|
||||||
|
$ajson['html'] .= '
|
||||||
|
<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 Member</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 {
|
||||||
|
$ajson['html'] .= '
|
||||||
|
<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">'.$tmem.'<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 Member</div><div class="col">'.$tkode.'</div></div>
|
||||||
|
';
|
||||||
|
}
|
||||||
|
|
||||||
|
$ajson['html'] .= '
|
||||||
|
<div class="row mb-1"><div class="col-sm-3 col-lg-3 col-form-label">Nama Member</div><div class="col">'.$tnama.'</div></div>
|
||||||
|
<div class="row mb-1"><div class="col-sm-3 col-lg-3 col-form-label">Grup Member</div><div class="col">'.$tgrup.'</div></div>
|
||||||
|
<input type="hidden" id="MemberID" value="0" />
|
||||||
|
<hr class="my-2">
|
||||||
|
<div id="divPOINT"></div>';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,281 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Member/TukarController
|
||||||
|
Description : Transaksi Penukaran Point Member
|
||||||
|
Created By : Siau Pheng ([email protected]).
|
||||||
|
Created Date : December 10th, 2017.
|
||||||
|
Last Modified : September 29th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Member;
|
||||||
|
|
||||||
|
use App\Utils\Inv;
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use flight\Session;
|
||||||
|
use Webapp\DB\SQL;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
use Webapp\Web\Table;
|
||||||
|
|
||||||
|
class TukarController {
|
||||||
|
|
||||||
|
private array $web_app;
|
||||||
|
private int $id_cab;
|
||||||
|
private string $mode;
|
||||||
|
private string $mode_detail;
|
||||||
|
private string $no_tx;
|
||||||
|
private bool $is_baru;
|
||||||
|
private int $id_tipe_point;
|
||||||
|
private Inv $inv;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->web_app = (array) $session->get('WEB_APP');
|
||||||
|
$this->id_cab = Param::Int("CabID", $session->get('APP_INV')['CABANGID']);
|
||||||
|
$this->mode = Param::Get("mode", "");
|
||||||
|
$this->mode_detail = Param::Get("mode_detail", "");
|
||||||
|
$this->no_tx = Param::Get("No_TX", "");
|
||||||
|
$this->is_baru = str_contains($this->no_tx, "POIN") === true;
|
||||||
|
$this->id_tipe_point = Param::Int("Point_TipeID", 0);
|
||||||
|
$this->inv = new Inv($app);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function brow_tx() {
|
||||||
|
$tcari = Param::Get("Cari_TX");
|
||||||
|
$tsql = ''; $asql = [];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql .= "CONCAT(J.No_TX,B.Nama_Member,DATE_FORMAT(J.Tgl_TX,'%d-%m-%Y')) LIKE ?";
|
||||||
|
array_push($asql, '%' . $tcari . '%');
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("(SELECT * FROM inv_point_tx WHERE InvPID>0) J LEFT JOIN para_member B ON (J.MemberID=B.MemberID)", "J.*,B.Nama_Member", $tsql, $asql);
|
||||||
|
$obj->add_field("No_TX", "No. Trans", "c");
|
||||||
|
$obj->add_field("Tgl_TX", "Tgl. Trans", "c", "sqltgl", "", "val-tgl");
|
||||||
|
$obj->add_field("Nama_Member", "Nama Member", "awr");
|
||||||
|
$obj->set_field_order("No_TX", "D");
|
||||||
|
$obj->set_func_select("MemberTukarJS.tx_select");
|
||||||
|
$this->app->json([ $obj->db_table("divBrowTX") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function brow_member() {
|
||||||
|
$tcari = Param::Get("Cari_Member");
|
||||||
|
$tsql = ''; $asql = [1];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql .= " AND CONCAT_WS(Kode_Member,Nama_Member,Alamat_Member,Telp_Member) LIKE ?";
|
||||||
|
array_push($asql, '%' . $tcari . '%');
|
||||||
|
}
|
||||||
|
array_push($asql, $this->id_tipe_point);
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("(SELECT * FROM para_member WHERE Aktif=?".$tsql.") M LEFT JOIN (SELECT MemberID,SUM(Nilai_Point) Sisa_Point FROM inv_point_tx WHERE Point_TipeID=? GROUP BY MemberID) P ON (M.MemberID=P.MemberID)", "M.*,IFNULL(P.Sisa_Point,0) Sisa_Point", "", $asql);
|
||||||
|
$obj->add_field("MemberID", "ID", "hid");
|
||||||
|
$obj->add_field("Grup_MemberID", "Grup ID", "hid");
|
||||||
|
$obj->add_field("Kode_Member", "Kode", "c");
|
||||||
|
$obj->add_field("Nama_Member", "Nama Member", "awr");
|
||||||
|
$obj->add_field("Alamat_Member", "Alamat", "awr");
|
||||||
|
$obj->add_field("Telp_Member", "Telp.", "awr");
|
||||||
|
$obj->add_field("Sisa_Point", "Point.", "hid");
|
||||||
|
$obj->set_field_order("Nama_Member", "A");
|
||||||
|
$obj->set_func_select("MemberTukarJS.member_select");
|
||||||
|
$this->app->json([ $obj->db_table("divBrowMember") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function brow_barang() {
|
||||||
|
$tcari = Param::Get("Cari_Barang");
|
||||||
|
$tsql = ''; $asql = [1, $this->id_tipe_point];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql .= " AND Nama_Barang LIKE ?";
|
||||||
|
array_push($asql, '%' . $tcari . '%');
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("inv_point_barang", "*", "Aktif=? AND Point_TipeID=?".$tsql, $asql);
|
||||||
|
$obj->add_field("InvPID", "ID", "hid");
|
||||||
|
$obj->add_field("SatuanID", "ID", "hid");
|
||||||
|
$obj->add_field("Nama_Barang", "Nama Barang", "awr");
|
||||||
|
$obj->add_field("Nilai_Barang", "Nilai Barang", "hid");
|
||||||
|
$obj->add_field("Nilai_Point", "Nilai Point", "r", "uang");
|
||||||
|
$obj->set_field_order("Nama_Barang", "A");
|
||||||
|
$obj->set_func_select("MemberTukarJS.barang_select");
|
||||||
|
$this->app->json([ $obj->db_table("divBrowBarang") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function auto_member() {
|
||||||
|
$tcari = Param::Get("Auto_Query", "");
|
||||||
|
$ajson['autodata'] = [];
|
||||||
|
|
||||||
|
$stat = $this->db->runQuery("SELECT M.MemberID,M.Kode_Member,M.Nama_Member,M.Kode_Nama,IFNULL(P.Sisa_Point,0) Sisa_Point FROM (SELECT *,CONCAT(IF(Kode_Member='','',CONCAT(Kode_Member,' - ')),Nama_Member) Kode_Nama FROM para_member WHERE Aktif=1 AND CONCAT(Kode_Member,Nama_Member,Alamat_Member,Telp_Member) LIKE ?) M LEFT JOIN (SELECT MemberID,SUM(Nilai_Point) Sisa_Point FROM inv_point_tx WHERE Point_TipeID=? GROUP BY MemberID) P ON (M.MemberID=P.MemberID) ORDER BY M.Nama_Member LIMIT 50", ['%'.$tcari.'%', $this->id_tipe_point]);
|
||||||
|
while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$ajson['autodata'][] = ['value'=>$row['MemberID'], 'text'=>$row['Kode_Nama'], 'html'=>'<span class="text-primary">'.$row['Kode_Member'].'</span> '.$row['Nama_Member'], 'data'=>$row['Sisa_Point'], 'bc'=>0];
|
||||||
|
}
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function auto_barang() {
|
||||||
|
$tcari = Param::Get("Auto_Query", "");
|
||||||
|
$ajson['autodata'] = [];
|
||||||
|
|
||||||
|
$stat = $this->db->runQuery("SELECT P.InvPID,P.Nama_Barang,CONCAT(P.SatuanID,':',P.Nilai_Barang,':',P.Nilai_Point) Data2 FROM inv_point_barang P WHERE P.Aktif=1 AND P.Point_TipeID=? AND P.Nama_Barang LIKE ? ORDER BY P.Nama_Barang LIMIT 50", [$this->id_tipe_point, '%'.$tcari.'%']);
|
||||||
|
while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$ajson['autodata'][] = ['value'=>$row['InvPID'], 'text'=>$row['Nama_Barang'], 'data'=>$row['Data2'], 'bc'=>0];
|
||||||
|
}
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_master() {
|
||||||
|
$ajson = [ 'error'=>"", 'html'=>"" ];
|
||||||
|
$atabel = [];
|
||||||
|
|
||||||
|
if ($this->mode === "add") {
|
||||||
|
$atabel = $this->Data_Point("", true);
|
||||||
|
} else if ($this->mode === "edit") {
|
||||||
|
$atabel = $this->Data_Point($this->no_tx);
|
||||||
|
} else if ($this->mode === "save") {
|
||||||
|
if ($this->is_baru) {
|
||||||
|
$this->no_tx = $this->inv->Point_Baru("B", Param::Get("Tgl_TX"));
|
||||||
|
}
|
||||||
|
|
||||||
|
$sql = new SQL($this->app);
|
||||||
|
$sql->set_table("inv_point_tx");
|
||||||
|
$sql->add_param_date("Tgl_TX");
|
||||||
|
$sql->add_param("CabID", $this->id_cab);
|
||||||
|
$sql->add_param("Point_TipeID");
|
||||||
|
$sql->add_param("MemberID");
|
||||||
|
$sql->add_param("InvPID");
|
||||||
|
$sql->add_param("Point", Param::Float("Point")*-1);
|
||||||
|
$sql->add_param("Qty");
|
||||||
|
$sql->add_param("Nilai_Point", "Qty*Point", true);
|
||||||
|
$sql->add_param("Nilai_Barang");
|
||||||
|
$sql->add_param_stamp();
|
||||||
|
$sql->add_param_userid();
|
||||||
|
$sql->add_where("No_TX", $this->no_tx);
|
||||||
|
$sql->UpdateDB();
|
||||||
|
|
||||||
|
$atabel = $this->Data_Point($this->no_tx);
|
||||||
|
$this->mode = "view";
|
||||||
|
|
||||||
|
} else if ($this->mode === "cancel") {
|
||||||
|
$atabel = $this->Data_Point();
|
||||||
|
} else {
|
||||||
|
$atabel = $this->Data_Point($this->no_tx);
|
||||||
|
}
|
||||||
|
|
||||||
|
$enable = in_array($this->mode, ["add","edit"]) ? true : false;
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tnota = $form->textbox("_", "No_TX", $atabel['No_TX'], !$enable, true, "text", "nomor transaksi");
|
||||||
|
$ttgl = $form->datebox("_", "Tgl_TX", $atabel['Tgl_TX'], $enable, true);
|
||||||
|
$ttipe = $form->option_db("_", "Point_TipeID", $atabel['Point_TipeID'], $enable, false, "inv_point_tipe", ["Point_TipeID","Nama_Tipe"], "Aktif=1 ORDER BY Point_TipeID", [0," "], null, "MemberTukarJS.oc_Tipe");
|
||||||
|
$tmemb = $form->textauto("_", "Nama_Member", ['value'=>$atabel['MemberID'],'text'=>$atabel['Nama_Member']], $enable, true, "ketik nama member");
|
||||||
|
$tbarg = $form->textauto("_", "Nama_Barang", ['value'=>$atabel['InvPID'],'text'=>$atabel['Nama_Barang']], $enable, true, "ketik nama barang");
|
||||||
|
$tqty = $form->textbox("_", "Qty", $atabel['Qty'], $enable, true, "double");
|
||||||
|
$tsisa = $form->textbox("_", "Sisa_Point", $atabel['Sisa_Point'], false, false, "double");
|
||||||
|
$tnilai = $form->textbox("_", "Nilai_Point", $atabel['Nilai_Point'], false, false, "double");
|
||||||
|
$tpoint = $form->textbox("_", "Point", $atabel['Point'], false, false, "double");
|
||||||
|
$ajson['html'] = '
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-5 col-lg-3 col-form-label" for="No_TX">Nomor Transaksi</label>
|
||||||
|
<div class="col-sm-7 col-lg-6"><div class="input-group">'.$tnota.'<button id="butBrow" class="btn btn-info" type="button"><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_TX">Tanggal Transaksi</label>
|
||||||
|
<div class="col-sm-6 col-lg-3">'.$ttgl.'</div>
|
||||||
|
<div class="col-sm-6 col-lg-6"><div class="input-group"><div class="input-group-text">Tipe Point</div>'.$ttipe.'</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-5 col-lg-3 col-form-label" for="Nama_Member">Nama Member</label>
|
||||||
|
<div class="col"><div class="input-group">'.$tmemb.'<button id="butBrowMember" class="btn btn-info" type="button"><i class="bi-people-fill"></i></button></div></div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-5 col-lg-3 col-form-label">Sisa Point</label>
|
||||||
|
<div class="col-sm-7 col-lg-5">'.$tsisa.'</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-5 col-lg-3 col-form-label" for="Nama_Barang">Nama Barang</label>
|
||||||
|
<div class="col"><div class="input-group">'.$tbarg.'<button id="butBrowBarang" class="btn btn-info" type="button"><i class="bi-bag"></i></button></div></div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-5 col-lg-3 col-form-label" for="Qty">Qty</label>
|
||||||
|
<div class="col"><div class="input-group">'.$tqty.'<div class="input-group-text">@</div>'.$tpoint.'</div></div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-5 col-lg-3 col-form-label">Nilai Tukar</label>
|
||||||
|
<div class="col-sm-7 col-lg-5">'.$tnilai.'</div>
|
||||||
|
</div>
|
||||||
|
<input type="hidden" id="MemberID" value="'.$atabel['MemberID'].'" >
|
||||||
|
<input type="hidden" id="InvPID" value="'.$atabel['InvPID'].'" >
|
||||||
|
<input type="hidden" id="Nilai_Barang" value="'.$atabel['Nilai_Barang'].'" >
|
||||||
|
<input type="hidden" id="mode" value="'.$this->mode.'" >';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function proses_delete() {
|
||||||
|
$this->db->runQuery("DELETE FROM inv_point_tx WHERE No_TX=?", [$this->no_tx]);
|
||||||
|
$this->app->json([ 'status' => true ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$this->app->json(['html' => '
|
||||||
|
<div id="divTXMaster"> </div>
|
||||||
|
<div class="row mb-1"><div class="col"><hr class="my-1"></div></div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-12 col-md-auto px-0 text-center text-sm-start">
|
||||||
|
<button class="btn btn-primary mb-2 mb-sm-0 ms-sm-2 col-10 col-sm-auto" id="butTambah" type="button"><i class="bi-plus-lg me-2"></i>Tambah</button>
|
||||||
|
<button class="btn btn-info mb-2 mb-sm-0 ms-sm-2 col-10 col-sm-auto" id="butUbah" type="button"><i class="bi-clipboard me-2"></i>Ubah</button>
|
||||||
|
<button class="btn btn-warning mb-2 mb-sm-0 ms-sm-2 col-10 col-sm-auto" id="butHapus" type="button"><i class="bi-trash me-2"></i>Hapus</button>
|
||||||
|
<button class="btn btn-secondary mb-2 mb-sm-0 ms-sm-2 col-10 col-sm-auto" id="butPrint" type="button"><i class="bi-printer me-2"></i>Cetak</button>
|
||||||
|
</div>
|
||||||
|
<div class="col-12 col-md-auto px-0 text-center text-sm-end ms-auto">
|
||||||
|
<button class="btn btn-danger mb-2 mb-sm-0 me-sm-2 col-10 col-sm-auto" id="butBatal" type="button"><i class="bi-x-lg me-2"></i>Batal</button>
|
||||||
|
<button class="btn btn-success mb-2 mb-sm-0 me-sm-2 col-10 col-sm-auto" id="butSimpan" type="button"><i class="bi-save me-2"></i>Simpan</button>
|
||||||
|
</div>
|
||||||
|
</div>'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function Data_Point(string $nomor="", bool $baru=false): array {
|
||||||
|
$aparam = [
|
||||||
|
'No_TX' => $nomor,
|
||||||
|
'Tgl_TX' => tgl_ymd(),
|
||||||
|
'Point_TipeID' => 0,
|
||||||
|
'MemberID' => 0,
|
||||||
|
'Nama_Member' => "",
|
||||||
|
'InvPID' => 0,
|
||||||
|
'Nama_Barang' => "",
|
||||||
|
'Qty' => 0,
|
||||||
|
'Sisa_Point' => 0,
|
||||||
|
'Nilai_Point' => 0,
|
||||||
|
'Point' => 0,
|
||||||
|
'Nilai_Barang' => 0,
|
||||||
|
];
|
||||||
|
if ($baru) $aparam['No_TX'] = "POIN".$this->web_app['SERVER_ID'].(string) $this->id_cab.$this->app->user()->id(3)."#00";
|
||||||
|
if (!empty($nomor)) {
|
||||||
|
$row = $this->db->fetchRow("SELECT * FROM inv_point_tx WHERE InvPID>0 AND No_TX=?", [$nomor]);
|
||||||
|
if ($row) $aparam = array_merge($aparam, $row->getData());
|
||||||
|
if ($aparam['MemberID'] > 0) {
|
||||||
|
$aparam['Nama_Member'] = $this->db->fetchField("SELECT Nama_Member FROM para_member WHERE MemberID=?", [$aparam['MemberID']]) ?? '';
|
||||||
|
$aparam['Sisa_Point'] = (float) $this->db->fetchField("SELECT SUM(Nilai_Point) Sisa_Point FROM inv_point_tx WHERE Point_TipeID=? AND MemberID=?", [$aparam['Point_TipeID'], $aparam['MemberID']]) ?? 0;
|
||||||
|
$aparam['Sisa_Point'] -= $aparam['Nilai_Point'];
|
||||||
|
}
|
||||||
|
if ($aparam['InvPID'] > 0) {
|
||||||
|
$aparam['Nama_Barang'] = $this->db->fetchField("SELECT Nama_Barang FROM inv_point_barang WHERE InvPID=?", [$aparam['InvPID']]) ?? '';
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return $aparam;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,184 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/MonitorController
|
||||||
|
Description : Halaman Utama Display Monitor
|
||||||
|
Created By : Siau Pheng ([email protected]).
|
||||||
|
Created Date : May 24th, 2010.
|
||||||
|
Last Modified : October 20th, 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 MonitorController {
|
||||||
|
|
||||||
|
private array $web_app;
|
||||||
|
private int $id_cab;
|
||||||
|
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'];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function info_iklan() {
|
||||||
|
$info_iklan = '<div class="carousel-inner">'; $iklan = 0;
|
||||||
|
$query = $this->db->runQuery("SELECT * FROM disp_promo WHERE Aktif=1 AND Tipe=2 AND CabID IN (?) AND Image IS NOT NULL ORDER BY Tanggal", [[0,$this->id_cab]]);
|
||||||
|
while ($row = $query->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$info_iklan .= '<div class="carousel-item'.($iklan==0?' active':'').'"><img src="data:'.$row['Mime'].';base64,'.base64_encode($row['Image']).'" class="m-auto d-block"></div>';
|
||||||
|
$iklan++;
|
||||||
|
}
|
||||||
|
if ($iklan == 0) $info_iklan .= '<div class="carousel-item active"><img src="'.PROJECT_BASE.'/assets/images/logo600.png" class="m-auto d-block"></div>';
|
||||||
|
$info_iklan .= '</div>';
|
||||||
|
$this->app->json([ 'html' => $info_iklan ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function info_promo() {
|
||||||
|
$info_promo = '<div class="carousel-inner">'; $promo = 0;
|
||||||
|
$query = $this->db->runQuery("SELECT * FROM disp_promo WHERE Aktif=1 AND Tipe=1 AND CabID IN (?) ORDER BY Tanggal, PromoID", [[0, $this->id_cab]]);
|
||||||
|
while ($row = $query->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$_text = str_replace(["[br]","[i]","[/i]","[b]","[/b]"], ["<br/>","<i>","</i>","<b>","</b>"], $row['Info']);
|
||||||
|
$_text = '<span style="color:'.$row['Warna'].';font-size:'.$row['Font'].'pt;">' . $_text . '</span>';
|
||||||
|
if (!empty($row['Image'])) {
|
||||||
|
$_text = '<div class="row h-100 align-items-center"><div class="col-2 text-center"><img src="data:'.$row['Mime'].';base64,'.base64_encode($row['Image']).'" class="pt-2"></div><div class="col-10">' . $_text ."</div></div>";
|
||||||
|
}
|
||||||
|
$info_promo .= '<div class="carousel-item'.($promo==0?' active':'').'">'.$_text."</div>";
|
||||||
|
$promo++;
|
||||||
|
}
|
||||||
|
$info_promo .= "</div>";
|
||||||
|
$this->app->json([ 'html' => $info_promo ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function count_delay() { //todo: ganti ke socket-io
|
||||||
|
$apos = $this->get_pos();
|
||||||
|
$ajson = [];
|
||||||
|
$ajson['total'] = $this->db->fetchField("SELECT SUM(-Qty*(Harga_Jual-Disk_Rupiah)) Total FROM tmp_inv_detail WHERE No_Ref=? AND Unix=?", [$apos['No_Pos'], $apos['Unix']]) ?? 0;
|
||||||
|
$ajson['thank'] = $this->db->fetchField("SELECT IF(No_Cetak='',0,1) Ada FROM disp_login WHERE UserID=? AND Unix=?", [$apos['UserID'], $apos['Unix']]) ?? 0;
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function shop() {
|
||||||
|
$this->app->json(['html' => '
|
||||||
|
<div class="row g-0 my-2">
|
||||||
|
<div class="col-7 pe-3 text-end" id="Info_Barang">
|
||||||
|
</div>
|
||||||
|
<div class="col-5 pe-2">
|
||||||
|
<div class="border border-success border-opacity-75 rounded rounded-4 bg-warning bg-gradient" style="--bs-bg-opacity:.75;">
|
||||||
|
<div class="row pe-2">
|
||||||
|
<div class="col-4 fs-3 d-flex align-items-center justify-content-end" id="Info_Qty"></div>
|
||||||
|
<div class="col-8 display-1 fw-light d-flex align-items-center justify-content-end border-light border-start" id="Total_Harga">0</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function info_shop() {
|
||||||
|
$apos = $this->get_pos();
|
||||||
|
$ashop = ['Total'=>0, 'Item'=>0, 'Qty'=>0];
|
||||||
|
$row = $this->db->fetchRow("SELECT SUM(-Qty*(Harga_Jual-Disk_Rupiah)) Total,COUNT(*) Item, SUM(-Qty) Qty FROM tmp_inv_detail WHERE No_Ref=? AND Unix=?", [$apos['No_Pos'], $apos['Unix']]);
|
||||||
|
if ($row) $ashop = $row->getData();
|
||||||
|
|
||||||
|
$info_barang = '<img src="'.PROJECT_BASE.'assets/images/logo60.png">';
|
||||||
|
if ($ashop['Item'] > 0) {
|
||||||
|
$row = $this->db->fetchRow("SELECT * FROM (SELECT -D.Qty Qty2,D.Harga_Jual,P.Nama_Lengkap FROM tmp_inv_detail D LEFT JOIN vi_inv_produk P ON (D.InvID=P.InvID AND D.SatuanID=P.SatuanID) WHERE D.No_Ref=? AND D.Unix=? AND D.Promo<2 ORDER BY D.ID DESC LIMIT 1) A", [$apos['No_Pos'], $apos['Unix']]);
|
||||||
|
if ($row) {
|
||||||
|
$info_barang = '<div class="display-4 fw-light">'.substr($row['Nama_Lengkap'], 0, 26).'</div><div class="fs-4">Qty : '.rupiah($row['Qty2']).' / Rp. '.rupiah($row['Harga_Jual']).'</div>';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$ajson['Info_Barang'] = $info_barang;
|
||||||
|
$ajson['Total_Harga'] = rupiah($ashop['Total']);
|
||||||
|
$ajson['Info_Qty'] = rupiah($ashop['Item'])." Items<br>".rupiah($ashop['Qty'])." Qty";
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function thank() {
|
||||||
|
$apos = $this->get_pos();
|
||||||
|
$anota = $this->db->fetchRow("SELECT J.*,(J.Total_Bayar-J.Total_Jual+J.Total_Diskon+J.Total_Potong) Total_Sisa,UCASE(LEFT(B.Nama_Kartu,23)) Kode_Kartu2,UCASE(J.Nama_Kartu) Nama_Kartu2,RIGHT(J.No_Kartu,4) No_Kartu2 FROM inv_jual J LEFT JOIN para_rek_pos B ON (J.KartuID=B.KartuID) WHERE J.No_Jual=?", [$apos['No_Cetak']]);
|
||||||
|
$html = '
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-6 text-center">
|
||||||
|
<img class="img-fluid mt-5" src="'.PROJECT_BASE.'assets/images/logo300.png" alt="'.$this->web_app['REG_NAME'].'">
|
||||||
|
</div>
|
||||||
|
<div class="col-6 fs-2 text-center">
|
||||||
|
';
|
||||||
|
if ($anota) {
|
||||||
|
$nhemat = $anota['Total_Diskon'] + $anota['Total_Potong'];
|
||||||
|
|
||||||
|
$html .= 'Jumlah Belanja Anda Rp. '.rupiah($anota['Total_Jual']-$anota['Total_Diskon']).'<br>';
|
||||||
|
if ($anota['Total_Diskon'] > 0) $html .= '<i>Anda Mendapatkan Diskon Rp. '.rupiah($anota['Total_Diskon']).'</i><br>';
|
||||||
|
if ($anota['Total_Potong'] > 0) $html .= '<i>Anda Mendapatkan Potongan Promo Rp. '.rupiah($anota['Total_Potong']).'</i><br>';
|
||||||
|
|
||||||
|
$html .= 'Jumlah Pembayaran Anda Rp. '.rupiah($anota['Total_Bayar']).'<br><br>';
|
||||||
|
|
||||||
|
if ($anota['KartuID'] === 0) {
|
||||||
|
$html .= '<span style="font-size:23pt;color:red;">Sisa Pembayaran Rp. '.rupiah($anota['Total_Sisa']).'</span><br>';
|
||||||
|
} else {
|
||||||
|
$html .= '<b>Anda Melakukan Pembayaran Dengan : <br>'.$anota['Kode_Kartu2']." - ".$anota['No_Kartu2'].'</b><br>';
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($nhemat > 0) $html .= '<span style="font-size:18pt;color:orange;"><i>Anda Mendapatkan Penghematan Sebesar Rp. '.rupiah($nhemat).'</span></i><br>';
|
||||||
|
}
|
||||||
|
$html .= '<br>Terima Kasih Telah Berbelanja di Toko Kami<br>Selamat Berbelanja Kembali :)</div></div>';
|
||||||
|
$this->app->json([ 'html' => $html ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function close_thank() {
|
||||||
|
$apos = $this->get_pos();
|
||||||
|
$this->db->runQuery("UPDATE disp_login SET No_Cetak='' WHERE UserID=? AND Unix=?", [$apos['UserID'], $apos['Unix']]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function config() {
|
||||||
|
$ajson = ['BANNER_TEXT' => "", 'PROMO_IDLE' => 0, 'PROMO_DURASI' => 1000];
|
||||||
|
$ainfo = $this->db->fetchRow("SELECT * FROM disp_config WHERE REG_ID=?", [$this->web_app['REG_ID']]);
|
||||||
|
if ($ainfo) {
|
||||||
|
$ajson['BANNER_TEXT'] = '<div class="marquee-content" style="color:'.$ainfo['Warna'].';font-size:'.$ainfo['Font'].'pt;">'.$ainfo['Text_Run'].'</div>';
|
||||||
|
$ajson['PROMO_IDLE'] = $ainfo['Promo_Idle'];
|
||||||
|
$ajson['PROMO_DURASI'] = (int) $ainfo['Promo_Durasi'] * 1000;
|
||||||
|
$ajson['ID_CABANG'] = $this->id_cab;
|
||||||
|
}
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$this->app->json(['html' => '
|
||||||
|
<div class="disp-atas overflow-hidden fixed-top">
|
||||||
|
<div class="marquee-container overflow-hidden bg-light shadow-sm d-flex align-items-center" id="divBanner"></div>
|
||||||
|
<div id="divShop"> </div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="disp-tengah overflow-hidden">
|
||||||
|
<div id="divBlur" class="bg-white bg-opacity-75 d-none"> </div>
|
||||||
|
<div id="divIklan" class="carousel slide" data-bs-ride="carousel"> </div>
|
||||||
|
<div id="divThank"> </div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="disp-bawah overflow-hidden fixed-bottom border-top border-warning">
|
||||||
|
<div id="divPromo" class="carousel slide carousel-fade" data-bs-ride="carousel"> </div>
|
||||||
|
</div>'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function get_pos(): array {
|
||||||
|
$pos = ['No_Pos' => "", 'UserID' => 0, 'Unix' => ""];
|
||||||
|
$row = $this->db->fetchRow("SELECT * FROM disp_login WHERE IP=? AND CabID=? ORDER BY Date DESC", [$this->app->request()->ip, $this->id_cab]);
|
||||||
|
if ($row) $pos = $row->getData();
|
||||||
|
return $pos;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,208 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Ppob/PpobtxController
|
||||||
|
Description : Transaksi PPOB
|
||||||
|
Created By : Siau Pheng ([email protected]).
|
||||||
|
Created Date : October 6th, 2017.
|
||||||
|
Last Modified : September 16th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Ppob;
|
||||||
|
|
||||||
|
use App\Utils\PPOBClient;
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\Session;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
use Webapp\Web\Table;
|
||||||
|
|
||||||
|
class PpobtxController {
|
||||||
|
|
||||||
|
private int $id_cab;
|
||||||
|
private int $id_agen;
|
||||||
|
private string $mode_detail;
|
||||||
|
private string $tgl_from;
|
||||||
|
private string $tgl_to;
|
||||||
|
private string $no_tx;
|
||||||
|
private PPOBClient $ppob;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->id_cab = Param::Int("CabID", (int) $session->get('APP_INV')['CABANGID']);
|
||||||
|
$this->id_agen = (int) $session->get('APP_PPOB')['API_AGENID'];
|
||||||
|
$this->mode_detail = Param::Get("mode_detail", "");
|
||||||
|
$this->tgl_from = Param::Get("Tgl_From", tgl_dmy());
|
||||||
|
$this->tgl_to = Param::Get("Tgl_To", tgl_dmy());
|
||||||
|
$this->no_tx = Param::Get("No_TX", "");
|
||||||
|
$this->ppob = new PPOBClient($app);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function table_tx() {
|
||||||
|
$ajson = [];
|
||||||
|
if (in_array($this->mode_detail, ["reproc","delete"])) {
|
||||||
|
$adetail = $this->db->fetchRow("SELECT * FROM ppob_tx WHERE No_TX=?", [$this->no_tx]) ?? [];
|
||||||
|
if ($this->mode_detail === "delete") {
|
||||||
|
if (count($adetail) > 0 && (int) $adetail['Status'] === 0) {
|
||||||
|
$this->db->runQuery("DELETE FROM ppob_tx WHERE No_TX=? AND Status=0 LIMIT 1", [$this->no_tx]);
|
||||||
|
$ajson[] = ['type'=>"msg", 'mode'=>"info", 'wait'=>2000, 'value'=>"Proses Hapus sukses !"];
|
||||||
|
} else {
|
||||||
|
$ajson[] = ['type'=>"msg", 'mode'=>"error", 'wait'=>2000, 'value'=>"Ada masalah dalam Proses Hapus !"];
|
||||||
|
}
|
||||||
|
} else if ($this->mode_detail === "reproc") {
|
||||||
|
if (count($adetail) > 0 && (int) $adetail['Proses'] === 0) {
|
||||||
|
// PROSES API TRIFONIA PULSA
|
||||||
|
$appob = $this->ppob->TopUp($adetail['Kode'], $adetail['Tujuan'], $adetail['No_TX'], $adetail['No_HP']);
|
||||||
|
if (count($appob) > 0) {
|
||||||
|
$ajson[] = ['type'=>"msg", 'mode'=>"info", 'wait'=>2000, 'value'=>$appob['Message']];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$ajson[] = ['type'=>"msg", 'mode'=>"error", 'wait'=>2000, 'value'=>"Ada masalah dalam Proses !"];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$saldo_ppob = (float) $this->db->fetchField("SELECT API_SALDO FROM ppob_config WHERE API_AGENID=?", [$this->id_agen]) ?? 0;
|
||||||
|
|
||||||
|
$cari = Param::Get("Cari_TX", "");
|
||||||
|
$tsql = 'CabID=?'; $asql = [$this->id_cab];
|
||||||
|
if (empty($cari)) {
|
||||||
|
$tgl_from = tgl_sql2str($this->tgl_from);
|
||||||
|
$tgl_to = tgl_sql2str($this->tgl_to);
|
||||||
|
$tsql .= " AND (Tgl_TX BETWEEN ? AND ?)";
|
||||||
|
array_push($asql, $tgl_from, $tgl_to);
|
||||||
|
} else {
|
||||||
|
$tsql .= " AND CONCAT(No_TX,DATE_FORMAT(Tgl_TX,'%d-%m-%Y'),Tujuan,No_HP) LIKE ?";
|
||||||
|
$asql[] = '%' . $cari . '%';
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("(SELECT *,CONCAT(DATE_FORMAT(DateStamp,'%d-%m-%Y %H:%i:%s'),' - ',Kode,'<br><b>',Tujuan,'</b>',IF(No_HP='','',CONCAT('<br><i>HP : ',No_HP,'</i>'))) Info_TX FROM ppob_tx WHERE ".$tsql.") T LEFT JOIN (SELECT ProdukID, KateID FROM ppob_produk) P ON (P.ProdukID=T.ProdukID)", "T.*,IFNULL(P.KateID,0) KateID", "", $asql);
|
||||||
|
$obj->set_footer("SUM(Harga_Jual) Harga_Jual");
|
||||||
|
$obj->add_field("No_TX", "No. TX", "c");
|
||||||
|
$obj->add_field("KateID", "Kate", "c", "App\Utils\PPOBClient::Icon_Kate");
|
||||||
|
$obj->add_field("Info_TX", "Informasi Transaksi", "l");
|
||||||
|
$obj->add_field("Harga_Jual", "Harga", "r", "rupiah", "rupiah");
|
||||||
|
$obj->add_field("Proses", "P", "c", "checkbox");
|
||||||
|
$obj->add_field("Status", "Status", "c", "App\Utils\PPOBClient::Badge_Status");
|
||||||
|
$obj->set_field_order("No_TX", "D");
|
||||||
|
$obj->add_row_btn("printer", "Cetak Nota", "PPOBTXJS.nota_print", "Proses", 1);
|
||||||
|
$obj->add_row_btn("arrow-left-right", "Proses Ulang", "PPOBTXJS.nota_reproc", "Proses", 0);
|
||||||
|
$obj->add_row_btn("clipboard", "Detail", "PPOBTXJS.nota_detail", "Proses", 1);
|
||||||
|
if ($this->app->user()->is_level(1)) $obj->add_row_btn("trash", "Hapus", "PPOBTXJS.nota_delete", "Status", 0);
|
||||||
|
$obj->set_func_btn("PPOBTXJS.saldo_ppob", '<i class="bi-coin me-2"></i>Saldo Rp. '.rupiah($saldo_ppob));
|
||||||
|
$ajson[] = $obj->db_table("divDetailTabel");
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_tx() {
|
||||||
|
$ainfo = $this->db->fetchRow("SELECT T.*,DATE_FORMAT(T.DateStamp,'%d-%m-%Y %H:%i:%s') Tgl_TX1,IFNULL(P.KateID,0) KateID,P.Nama_Produk FROM (SELECT * FROM ppob_tx WHERE No_TX=? LIMIT 1) T LEFT JOIN ppob_produk P ON (P.ProdukID=T.ProdukID)", [$this->no_tx]) ?? [];
|
||||||
|
$atoken = $this->ppob->SN_PLN($ainfo['SN']);
|
||||||
|
|
||||||
|
$ajson['html'] = '
|
||||||
|
<div class="row text-start">
|
||||||
|
<label class="col-sm-12 col-lg-5 col-form-label">Nomor TX</label>
|
||||||
|
<label class="col-sm-12 col-lg-7 col-form-label"><strong>'.$ainfo['No_TX'].'</strong></label>
|
||||||
|
</div>
|
||||||
|
<div class="row text-start">
|
||||||
|
<label class="col-sm-12 col-lg-5 col-form-label">Tanggal TX</label>
|
||||||
|
<label class="col-sm-12 col-lg-7 col-form-label"><strong>'.$ainfo['Tgl_TX1'].'</strong></label>
|
||||||
|
</div>
|
||||||
|
<div class="row text-start">
|
||||||
|
<label class="col-sm-12 col-lg-5 col-form-label">Nomor Tujuan</label>
|
||||||
|
<label class="col-sm-12 col-lg-7 col-form-label"><strong>'.$ainfo['Tujuan'].'</strong></label>
|
||||||
|
</div>
|
||||||
|
<div class="row text-start'.((int) $ainfo['KateID'] === 5?'':' d-none').'">
|
||||||
|
<label class="col-sm-12 col-lg-5 col-form-label">Nomor HP</label>
|
||||||
|
<label class="col-sm-12 col-lg-7 col-form-label">'.($ainfo['No_HP']==""?"<i>tidak tersedia</i>":$ainfo['No_HP']).'</label>
|
||||||
|
</div>
|
||||||
|
<div class="row text-start">
|
||||||
|
<label class="col-sm-12 col-lg-5 col-form-label">Nama Produk</label>
|
||||||
|
<label class="col-sm-12 col-lg-7 col-form-label">'.$ainfo['Nama_Produk'].'</label>
|
||||||
|
</div>
|
||||||
|
<div class="row text-start">
|
||||||
|
<label class="col-sm-12 col-lg-5 col-form-label">Harga Jual</label>
|
||||||
|
<label class="col-sm-12 col-lg-7 col-form-label"><strong>Rp. '.rupiah($ainfo['Harga_Jual']).'</strong></label>
|
||||||
|
</div>
|
||||||
|
<div class="row text-start">
|
||||||
|
<label class="col-sm-12 col-lg-5 col-form-label">Status TX</label>
|
||||||
|
<label class="col-sm-12 col-lg-7 col-form-label">'.$this->ppob->Badge_Status($ainfo['Status']).'</label>
|
||||||
|
</div>';
|
||||||
|
if ((int) $ainfo['Status'] === 4) {
|
||||||
|
$ajson['html'] .= '<div class="row mt-1"><div class="col"><hr class="my-2"></div></div>';
|
||||||
|
if ((int) $ainfo['KateID'] === 5) {
|
||||||
|
$ajson['html'] .= '
|
||||||
|
<div class="row text-start">
|
||||||
|
<label class="col-sm-12 col-lg-5 col-form-label">Nama Pelanggan</label>
|
||||||
|
<label class="col-sm-12 col-lg-7 col-form-label">'.$atoken['Nama'].'</label>
|
||||||
|
</div>
|
||||||
|
<div class="row text-start">
|
||||||
|
<label class="col-sm-12 col-lg-5 col-form-label">Tarif / Daya</label>
|
||||||
|
<label class="col-sm-12 col-lg-7 col-form-label">'.$atoken['Daya'].'</label>
|
||||||
|
</div>
|
||||||
|
<div class="row text-start">
|
||||||
|
<label class="col-sm-12 col-lg-5 col-form-label">Nilai Token</label>
|
||||||
|
<label class="col-sm-12 col-lg-7 col-form-label">'.$atoken['Kwh'].'</label>
|
||||||
|
</div>
|
||||||
|
<div class="row text-start">
|
||||||
|
<label class="col-sm-12 col-lg-5 col-form-label">Kode Token</label>
|
||||||
|
<label class="col-sm-12 col-lg-7 col-form-label"><strong>'.$atoken['Token'].'</strong></label>
|
||||||
|
</div>';
|
||||||
|
} else {
|
||||||
|
$ajson['html'] .= '
|
||||||
|
<div class="row text-start">
|
||||||
|
<label class="col-sm-12 col-lg-5 col-form-label">SN / Informasi</label>
|
||||||
|
<label class="col-sm-12 col-lg-7 col-form-label">'.$ainfo['SN'].'</label>
|
||||||
|
</div>';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_saldo() {
|
||||||
|
$asaldo = $this->ppob->Balance();
|
||||||
|
$ajson['Saldo'] = (count($asaldo) > 0 && (int) $asaldo['Status'] === 4) ? rupiah($asaldo['Saldo']) : 0;
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$hari_ini = tgl_dmy();
|
||||||
|
$this->app->json(['html' => '
|
||||||
|
<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>Daftar Transaksi PPOB</button>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item ms-auto">
|
||||||
|
<div class="d-flex">
|
||||||
|
<div class="d-flex">
|
||||||
|
<div class="input-group date"><input type="text" class="form-control pickdate" id="Tgl_From" name="Tgl_From" value="'.$hari_ini.'" placeholder="dd-mm-yyyy" size="22"><span class="input-group-text input-group-addon"><i class="bi-calendar4"></i></span></div>
|
||||||
|
<span class="input-group-text">~</span>
|
||||||
|
<div class="input-group date"><input type="text" class="form-control pickdate" id="Tgl_To" name="Tgl_To" value="'.$hari_ini.'" placeholder="dd-mm-yyyy" size="22"><span class="input-group-text input-group-addon"><i class="bi-calendar4"></i></span></div>
|
||||||
|
</div>
|
||||||
|
<div class="input-group ms-2"><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>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<div class="tab-content border border-top-0 p-3">
|
||||||
|
<div class="tab-pane fade active show" id="tx" role="tabpanel" aria-labelledby="tx-tab">
|
||||||
|
<div id="divDetailTabel"> </div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div></div>
|
||||||
|
</div>'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,381 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Ppob/PrabayarController
|
||||||
|
Description : Transaksi Prabayar PPOB
|
||||||
|
Created By : Siau Pheng ([email protected]).
|
||||||
|
Created Date : March 15th, 2017.
|
||||||
|
Last Modified : September 16th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Ppob;
|
||||||
|
|
||||||
|
use App\Utils\PPOBClient;
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use flight\Session;
|
||||||
|
use Webapp\DB\SQL;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
use Webapp\Web\Table;
|
||||||
|
|
||||||
|
class PrabayarController {
|
||||||
|
|
||||||
|
private array $web_app;
|
||||||
|
private int $id_cab;
|
||||||
|
private string $mode;
|
||||||
|
private string $mode_detail;
|
||||||
|
private string $no_tx;
|
||||||
|
private int $id_kate;
|
||||||
|
private int $id_ope;
|
||||||
|
private int $id_produk;
|
||||||
|
private string $tujuan;
|
||||||
|
private string $no_hp;
|
||||||
|
private PPOBClient $ppob;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->web_app = (array) $session->get('WEB_APP');
|
||||||
|
$this->id_cab = Param::Int("CabID", (int) $session->get('APP_INV')['CABANGID']);
|
||||||
|
$this->mode = Param::Get("mode", "");
|
||||||
|
$this->mode_detail = Param::Get("mode_detail", "");
|
||||||
|
$this->no_tx = Param::Get("No_TX", "");
|
||||||
|
$this->id_kate = Param::Int("KateID", 0);
|
||||||
|
$this->id_ope = Param::Int("OpeID", 0);
|
||||||
|
$this->id_produk = Param::Int("ProdukID", 0);
|
||||||
|
$this->tujuan = Param::Get("Tujuan", "");
|
||||||
|
$this->no_hp = Param::Get("No_HP", "");
|
||||||
|
$this->ppob = new PPOBClient($app);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function table_tx() {
|
||||||
|
if (in_array($this->mode_detail, ["reproc","delete"])) {
|
||||||
|
$adetail = $this->db->fetchRow("SELECT * FROM ppob_tx WHERE No_TX=?", [$this->no_tx]);
|
||||||
|
$proses = (int) $adetail['Proses'] ?? 0;
|
||||||
|
|
||||||
|
if ($this->mode_detail === "delete") {
|
||||||
|
if ($proses === 0) {
|
||||||
|
$this->db->delete("ppob_tx", "No_TX=?", [$this->no_tx]);
|
||||||
|
$ajson[] = ['type'=>"msg", 'mode'=>"info", 'wait'=>2000, 'value'=>"Transaksi sukses dihapus !"];
|
||||||
|
} else {
|
||||||
|
$ajson[] = ['type'=>"msg", 'mode'=>"error", 'wait'=>2000, 'value'=>"Ada masalah dalam proses transaksi !"];
|
||||||
|
}
|
||||||
|
} else if ($this->mode_detail === "reproc") {
|
||||||
|
if ($proses === 0) {
|
||||||
|
// PROSES API TRIFONIA PULSA
|
||||||
|
$appob = $this->ppob->TopUp($adetail['Kode'], $adetail['Tujuan'], $adetail['No_TX'], $adetail['No_HP']);
|
||||||
|
if (count($appob) > 0) {
|
||||||
|
$ajson[] = ['type'=>"msg", 'mode'=>"info", 'wait'=>2000, 'value'=>$appob['Message']];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$ajson[] = ['type'=>"msg", 'mode'=>"error", 'wait'=>2000, 'value'=>"Ada masalah dalam Proses !"];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$tcari = Param::Get("Cari_PPOB", "");
|
||||||
|
$tsql = 'CabID=?'; $asql = [$this->id_cab];
|
||||||
|
if (empty($tcari)) {
|
||||||
|
$tsql .= " AND UserID=? AND Tgl_TX=?";
|
||||||
|
array_push($asql, $this->app->user()->id(), tgl_ymd());
|
||||||
|
} else {
|
||||||
|
$tsql .= " AND CONCAT(No_TX,Tujuan,No_HP,DATE_FORMAT(Tgl_TX,'%d-%m-%Y')) LIKE ?";
|
||||||
|
$asql[] = '%' . $tcari . '%';
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("(SELECT *,CONCAT(DATE_FORMAT(DateStamp,'%d-%m-%Y %H:%i:%s'),' - ',Kode,'<br><b>',Tujuan,'</b>',IF(No_HP='','',CONCAT('<br><i>HP : ',No_HP,'</i>'))) Info_TX FROM ppob_tx WHERE ".$tsql.") T LEFT JOIN (SELECT ProdukID,KateID FROM ppob_produk) P ON (P.ProdukID=T.ProdukID)", "T.*,IFNULL(P.KateID,0) KateID", "", $asql);
|
||||||
|
$obj->set_footer("SUM(Harga_Jual) Harga_Jual");
|
||||||
|
$obj->add_field("No_TX", "No. TX", "c");
|
||||||
|
$obj->add_field("KateID", "Kate", "c", "App\Utils\PPOBClient::Icon_Kate");
|
||||||
|
$obj->add_field("Info_TX", "Informasi Transaksi", "l");
|
||||||
|
$obj->add_field("Harga_Jual", "Harga", "r", "rupiah", "rupiah");
|
||||||
|
$obj->add_field("Proses", "P", "c", "checkbox");
|
||||||
|
$obj->add_field("Status", "Status", "c", "App\Utils\PPOBClient::Badge_Status");
|
||||||
|
$obj->set_field_order("No_TX", "D");
|
||||||
|
$obj->add_row_btn("printer", "Cetak Nota", "PrabayarJS.nota_print", "Status", 4);
|
||||||
|
$obj->add_row_btn("arrow-left-right", "Proses Ulang", "PrabayarJS.nota_reproc", "Proses", 0);
|
||||||
|
$obj->add_row_btn("clipboard", "Detail", "PrabayarJS.nota_detail", "Proses", 1);
|
||||||
|
if ($this->app->user()->is_level(1)) $obj->add_row_btn("trash", "Hapus", "PrabayarJS.nota_delete", "Status", 0);
|
||||||
|
$this->app->json([ $obj->json_table("divPOS1", 5) ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_master() {
|
||||||
|
$tkembali = "0";
|
||||||
|
if ($this->mode === "save") {
|
||||||
|
$this->no_tx = $this->ppob->Nomor_Baru("P", tgl_dmy());
|
||||||
|
$no_seq = $this->db->fetchField("SELECT COALESCE(MAX(Counter),0)+1 Seq_TX FROM ppob_tx WHERE Tgl_TX=? AND ProdukID=? AND Tujuan=?", [tgl_ymd(), $this->id_produk, $this->tujuan]) ?? 1;
|
||||||
|
|
||||||
|
$id_kartu = Param::Int("KartuID", 0);
|
||||||
|
$no_kartu = ""; $nama_kartu = "";
|
||||||
|
if ($id_kartu > 0) {
|
||||||
|
$no_kartu = Param::Get("No_Kartu", "");
|
||||||
|
$nama_kartu = Param::Get("Nama_Kartu", "");
|
||||||
|
}
|
||||||
|
|
||||||
|
$apul = $this->db->fetchRow("SELECT * FROM ppob_produk WHERE ProdukID=?", [$this->id_produk]);
|
||||||
|
|
||||||
|
$sql = new SQL($this->app);
|
||||||
|
$sql->set_table("ppob_tx");
|
||||||
|
$sql->add_param("No_TX", $this->no_tx);
|
||||||
|
$sql->add_param_date("Tgl_TX", tgl_dmy());
|
||||||
|
$sql->add_param("CabID", $this->id_cab);
|
||||||
|
$sql->add_param("ProdukID");
|
||||||
|
$sql->add_param("Kode", $apul['Kode']);
|
||||||
|
$sql->add_param("Tujuan");
|
||||||
|
$sql->add_param("No_HP");
|
||||||
|
$sql->add_param("Counter", $no_seq);
|
||||||
|
$sql->add_param("Harga_Beli", $apul['Harga_Pokok']);
|
||||||
|
$sql->add_param("Harga_Jual", $apul['Harga_Jual']);
|
||||||
|
$sql->add_param("Total_Bayar");
|
||||||
|
$sql->add_param("KartuID", $id_kartu);
|
||||||
|
$sql->add_param("No_Kartu", $no_kartu);
|
||||||
|
$sql->add_param("Nama_Kartu", $nama_kartu);
|
||||||
|
$sql->add_param_userid();
|
||||||
|
$sql->InsertDB();
|
||||||
|
$this->mode = "reproc";
|
||||||
|
$tkembali = '<span style="color:red;">'.rupiah($apul['Harga_Jual']-Param::Get("Total_Bayar",0)).'</span>';
|
||||||
|
|
||||||
|
//jika token pln
|
||||||
|
if (($apul['KateID'] ?? 0) === 5) {
|
||||||
|
$this->db->runQuery("INSERT IGNORE INTO ppob_pend (No_TX,CabID,UserID) VALUES (?, ?, ?)", [$this->no_tx, $this->id_cab, $this->app->user()->id()]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tkate = $form->option_que("_", "KateID", $this->id_kate, true, false, "SELECT * FROM ppob_kategori WHERE KateID IN (SELECT KateID FROM ppob_produk WHERE Status=1 AND Harga_Jual>0)", ["KateID","N_Kate"], null, null, "PrabayarJS.oc_KateID");
|
||||||
|
$tope = $form->option("_", "OpeID", 0, true, false, [0=>""], null, "PrabayarJS.oc_OpeID");
|
||||||
|
$tproduk = $form->option("_", "ProdukID", 0, true, false, [0=>""], null, "PrabayarJS.oc_ProdukID");
|
||||||
|
$ttujuan = $form->textbox("_", "Tujuan", "", true, true, "phone", "Ketik Nomor Tujuan");
|
||||||
|
$tno_hp = $form->textbox("_", "No_HP", "", true, true, "phone", "no hp untuk pengiriman kode token");
|
||||||
|
$ajson['html'] = '
|
||||||
|
<div class="row mb-3">
|
||||||
|
<div class="col-6">
|
||||||
|
<div class="card bg-light"><img class="img-fluid p-1" src="'.PROJECT_BASE.'assets/images/logo60.png" style="opacity:.75;"></div>
|
||||||
|
</div>
|
||||||
|
<div class="col-6">
|
||||||
|
<div class="border border-success rounded pe-2 display-6 text-end" id="Total_Disp">'.$tkembali.'</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-2">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="KateID">Kategori PPOB</label>
|
||||||
|
<div class="col">'.$tkate.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-2">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="Tujuan">Nomor Tujuan</label>
|
||||||
|
<div class="col">'.$ttujuan.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-2 rowToken">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="No_HP">Nomor HP</label>
|
||||||
|
<div class="col">'.$tno_hp.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-2 rowPulsa">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="OpeID">Operator</label>
|
||||||
|
<div class="col">'.$tope.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-2">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="ProdukID">Produk</label>
|
||||||
|
<div class="col">'.$tproduk.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mt-3">
|
||||||
|
<div class="col-sm-6 col-lg-4">
|
||||||
|
</div>
|
||||||
|
<div class="col-sm-6 col-lg-4 d-grid">
|
||||||
|
<button type="button" class="btn btn-danger" id="ppobBATAL"><i class="bi-x-lg me-1"></i>Batal</button>
|
||||||
|
</div>
|
||||||
|
<div class="col-sm-6 col-lg-4 d-grid">
|
||||||
|
<button type="button" class="btn btn-success" id="ppobSIMPAN"><i class="bi-cart-plus me-1"></i>Bayar</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<input type="hidden" id="No_TX" value="'.$this->no_tx.'" />
|
||||||
|
<input type="hidden" id="Harga_Jual" value="0" />
|
||||||
|
<input type="hidden" id="Total_Tunai" value="0" />
|
||||||
|
<input type="hidden" id="Total_Kartu" value="0" />
|
||||||
|
<input type="hidden" id="Total_Bayar" value="0" />
|
||||||
|
<input type="hidden" id="KartuID" value="0" />
|
||||||
|
<input type="hidden" id="No_Kartu" value="" />
|
||||||
|
<input type="hidden" id="Nama_Kartu" value="" />
|
||||||
|
<input type="hidden" id="mode" value="'.$this->mode.'" />';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_tx() {
|
||||||
|
$ainfo = $this->db->fetchRow("SELECT T.*,DATE_FORMAT(T.DateStamp,'%d-%m-%Y %H:%i:%s') Tgl_TX1,IFNULL(P.KateID,0) KateID,P.Nama_Produk FROM (SELECT * FROM ppob_tx WHERE No_TX=? LIMIT 1) T LEFT JOIN ppob_produk P ON (P.ProdukID=T.ProdukID)", [$this->no_tx]) ?? ['No_TX'=>$this->no_tx, 'Tgl_TX1'=>tgl_dmy(true), 'Tujuan'=>"", 'No_HP'=>"", 'Nama_Produk'=>"", 'Harga_Jual'=>0, 'Status'=>0, 'KateID'=>0];
|
||||||
|
$atoken = $this->ppob->SN_PLN($ainfo['SN']);
|
||||||
|
|
||||||
|
$ajson['html'] = '
|
||||||
|
<div class="row text-start">
|
||||||
|
<label class="col-sm-12 col-lg-5 col-form-label">Nomor TX</label>
|
||||||
|
<label class="col-sm-12 col-lg-7 col-form-label"><strong>'.$ainfo['No_TX'].'</strong></label>
|
||||||
|
</div>
|
||||||
|
<div class="row text-start">
|
||||||
|
<label class="col-sm-12 col-lg-5 col-form-label">Tanggal TX</label>
|
||||||
|
<label class="col-sm-12 col-lg-7 col-form-label"><strong>'.$ainfo['Tgl_TX1'].'</strong></label>
|
||||||
|
</div>
|
||||||
|
<div class="row text-start">
|
||||||
|
<label class="col-sm-12 col-lg-5 col-form-label">Nomor Tujuan</label>
|
||||||
|
<label class="col-sm-12 col-lg-7 col-form-label"><strong>'.$ainfo['Tujuan'].'</strong></label>
|
||||||
|
</div>
|
||||||
|
<div class="row text-start'.($ainfo['KateID']==5?'':' d-none').'">
|
||||||
|
<label class="col-sm-12 col-lg-5 col-form-label">Nomor HP</label>
|
||||||
|
<label class="col-sm-12 col-lg-7 col-form-label">'.($ainfo['No_HP']==""?"<i>tidak tersedia</i>":$ainfo['No_HP']).'</label>
|
||||||
|
</div>
|
||||||
|
<div class="row text-start">
|
||||||
|
<label class="col-sm-12 col-lg-5 col-form-label">Nama Produk</label>
|
||||||
|
<label class="col-sm-12 col-lg-7 col-form-label">'.$ainfo['Nama_Produk'].'</label>
|
||||||
|
</div>
|
||||||
|
<div class="row text-start">
|
||||||
|
<label class="col-sm-12 col-lg-5 col-form-label">Harga Jual</label>
|
||||||
|
<label class="col-sm-12 col-lg-7 col-form-label"><strong>Rp. '.rupiah($ainfo['Harga_Jual']).'</strong></label>
|
||||||
|
</div>
|
||||||
|
<div class="row text-start">
|
||||||
|
<label class="col-sm-12 col-lg-5 col-form-label">Status TX</label>
|
||||||
|
<label class="col-sm-12 col-lg-7 col-form-label">'.$this->ppob->Badge_Status($ainfo['Status']).'</label>
|
||||||
|
</div>';
|
||||||
|
if ((int) $ainfo['KateID'] === 5 && (int) $ainfo['Status'] === 4) {
|
||||||
|
$ajson['html'] .= '
|
||||||
|
<div class="row mt-1"><div class="col"><hr class="my-2"></div></div>
|
||||||
|
<div class="row text-start">
|
||||||
|
<label class="col-sm-12 col-lg-5 col-form-label">Nama Pelanggan</label>
|
||||||
|
<label class="col-sm-12 col-lg-7 col-form-label">'.$atoken['Nama'].'</label>
|
||||||
|
</div>
|
||||||
|
<div class="row text-start">
|
||||||
|
<label class="col-sm-12 col-lg-5 col-form-label">Tarif / Daya</label>
|
||||||
|
<label class="col-sm-12 col-lg-7 col-form-label">'.$atoken['Daya'].'</label>
|
||||||
|
</div>
|
||||||
|
<div class="row text-start">
|
||||||
|
<label class="col-sm-12 col-lg-5 col-form-label">Nilai Token</label>
|
||||||
|
<label class="col-sm-12 col-lg-7 col-form-label">'.$atoken['Kwh'].'</label>
|
||||||
|
</div>
|
||||||
|
<div class="row text-start">
|
||||||
|
<label class="col-sm-12 col-lg-5 col-form-label">Kode Token</label>
|
||||||
|
<label class="col-sm-12 col-lg-7 col-form-label"><strong>'.$atoken['Token'].'</strong></label>
|
||||||
|
</div>';
|
||||||
|
}
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_kasir() {
|
||||||
|
$tot_jual = Param::Float("Harga_Jual", 0);
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$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 PPOB 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-6"> </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);
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function option_operator() {
|
||||||
|
$aoption = ['type' => "option", 'id' => "OpeID", 'value' => 0, 'avalue' => []];
|
||||||
|
if ($this->id_kate === 5) {//token
|
||||||
|
$aoption['avalue'][] = ['value'=>10, 'html'=>"PLN Prabayar"];
|
||||||
|
} else if ($this->id_kate === 6) {//emoney & ojek
|
||||||
|
//todo: di update database, sesuaikan dg pola baru !
|
||||||
|
$aoption['avalue'][] = ['value'=>11, 'html'=>"OVO"];
|
||||||
|
$aoption['avalue'][] = ['value'=>12, 'html'=>"GoPay"];
|
||||||
|
$aoption['avalue'][] = ['value'=>13, 'html'=>"Gojek Driver"];
|
||||||
|
$aoption['avalue'][] = ['value'=>14, 'html'=>"Grab"];
|
||||||
|
$aoption['avalue'][] = ['value'=>15, 'html'=>"Dana"];
|
||||||
|
} else if ($this->id_kate === 8) {//voucher
|
||||||
|
$aoption['avalue'][] = ['value'=>0, 'html'=>""];
|
||||||
|
} else {//pulsa, data, sms, transfer
|
||||||
|
$tsql = (strlen($this->tujuan) >= 4) ? " AND Prefix_Ope LIKE '%".substr($this->tujuan,0,4)."%'" : "";
|
||||||
|
$aope = $this->db->fetchAll("SELECT * FROM ppob_operator WHERE OpeID IN (SELECT OpeID FROM ppob_produk WHERE Status=1 AND Harga_Jual>0 AND KateID<5)".$tsql);
|
||||||
|
if (count($aope) > 1) $aoption['avalue'][] = ['value'=>0, 'html'=>""];
|
||||||
|
foreach ($aope as $ope) {
|
||||||
|
if (count($aope) === 1) $aoption['value'] = $ope['OpeID'];
|
||||||
|
$aoption['avalue'][] = ['value'=>$ope['OpeID'], 'html'=>$ope['N_Ope']];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->app->json([ $aoption ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function option_produk() {
|
||||||
|
$aoption = ['type' => "option", 'id' => "ProdukID", 'value' => 0, 'avalue' => [['value'=>0, 'label'=>0, 'html'=>""]]];
|
||||||
|
$aproduk = $this->db->fetchAll("SELECT * FROM ppob_produk WHERE Status=1 AND KateID=? AND OpeID=? AND Harga_Jual>0 ORDER BY Harga_Jual", [$this->id_kate, $this->id_ope]);
|
||||||
|
foreach ($aproduk as $produk) {
|
||||||
|
$aoption['avalue'][] = ['value'=>$produk['ProdukID'], 'label'=>$produk['Harga_Jual'], 'html'=>$produk['Nama_Produk'].' - Rp. '.rupiah($produk['Harga_Jual'])];
|
||||||
|
}
|
||||||
|
$this->app->json([ $aoption ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function config_pole() {
|
||||||
|
$ajson['pole'] = [];
|
||||||
|
$apole = $this->db->fetchRow("SELECT * FROM disp_config WHERE REG_ID=?", [$this->web_app['APP_CODE']]);
|
||||||
|
foreach ($apole as $_key => $_val) {
|
||||||
|
if (str_contains($_key, "POLE")) {
|
||||||
|
if (str_contains($_key, "ENABLE")) $_val = (int) $_val;
|
||||||
|
$ajson['pole'][str_replace("POLE_","",$_key)] = $_val;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$this->app->json(['html' => '
|
||||||
|
<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 Prabayar PPOB</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 class="row flex-column-reverse flex-md-row">
|
||||||
|
<div class="col-sm-12 col-lg-7 mt-3 mt-md-0">
|
||||||
|
<div class="card"><div class="card-body">
|
||||||
|
<div class="row mb-1">
|
||||||
|
<div class="col">
|
||||||
|
<div class="input-group">
|
||||||
|
<input class="form-control" id="Cari_PPOB" 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="divPOS1"> </div>
|
||||||
|
</div></div>
|
||||||
|
</div>
|
||||||
|
<div class="col-sm-12 col-lg-5">
|
||||||
|
<div class="card"><div class="card-body">
|
||||||
|
<div id="divPOS2"> </div>
|
||||||
|
</div></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div></div>
|
||||||
|
</div>'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,125 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Ppob/TopupController
|
||||||
|
Description : Transaksi Topup Saldo PPOB
|
||||||
|
Created By : Siau Pheng ([email protected]).
|
||||||
|
Created Date : October 6th, 2017.
|
||||||
|
Last Modified : September 16th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Ppob;
|
||||||
|
|
||||||
|
use App\Utils\PPOBClient;
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
use Webapp\Web\Table;
|
||||||
|
|
||||||
|
class TopupController {
|
||||||
|
|
||||||
|
private string $mode_detail;
|
||||||
|
private PPOBClient $ppob;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->mode_detail = Param::Get("mode_detail", "");
|
||||||
|
$this->ppob = new PPOBClient($app);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function table_detail() {
|
||||||
|
$ajson = [];
|
||||||
|
if ($this->mode_detail === "insert") {
|
||||||
|
// PROSES API TRIFONIA PULSA
|
||||||
|
$appob = $this->ppob->Depo(Param::Get("Bank", ""), Param::Float("Jumlah", 0));
|
||||||
|
if (count($appob)>0 && (int) $appob['Status'] === 4) {
|
||||||
|
$ajson[] = ['type'=>"msg", 'mode'=>"info", 'wait'=>2000, 'value'=>$appob['Message']];
|
||||||
|
} else {
|
||||||
|
$ajson[] = ['type'=>"msg", 'mode'=>"error", 'wait'=>2000, 'value'=>$appob['Message']];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$cari = Param::Get("Cari_Topup", "");
|
||||||
|
$tsql = ''; $asql = [];
|
||||||
|
if (!empty($cari)) {
|
||||||
|
$tsql = "CONCAT(No_Depo,DATE_FORMAT(Tgl_Depo,'%d-%m-%Y')) LIKE ?";
|
||||||
|
$asql[] = '%' . $cari . '%';
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("ppob_depo", "*,IF(Proses=1,2,IF(DATEDIFF(Tgl_Exp,NOW())<0,1,0)) IX", $tsql, $asql);
|
||||||
|
$obj->add_field("No_Depo", "Nomor", "c");
|
||||||
|
$obj->add_field("Tgl_Depo", "Tanggal", "c", "sqltgl", "", "val-tgl");
|
||||||
|
$obj->add_field("Tgl_Exp", "Expire", "c", "sqltgl", "", "val-tgl");
|
||||||
|
$obj->add_field("Jumlah", "Jumlah", "r", "rupiah");
|
||||||
|
$obj->add_field("Bank", "Bank", "l");
|
||||||
|
$obj->add_field("Proses", "P", "c", "checkbox");
|
||||||
|
$obj->add_field("Catatan", "Catatan", "hid", "App\Utils\PPOBClient::makeWAText");
|
||||||
|
$obj->set_field_order("No_Depo", "D");
|
||||||
|
$obj->set_row_color("IX", "1", "rdanger");
|
||||||
|
$obj->set_row_color("IX", "2", "rsuccess");
|
||||||
|
$obj->add_row_btn("clipboard", "Informasi", "TopupJS.tx_info");
|
||||||
|
$ajson[] = $obj->db_table("divDetailTabel");
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_topup() {
|
||||||
|
$atabel = [ 'Tgl_Depo'=>tgl_ymd(), 'Bank'=>"BCA", 'Jumlah'=>0 ];
|
||||||
|
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$ttgl = $form->datebox("_", "Tgl_Depo", $atabel['Tgl_Depo'], true, false);
|
||||||
|
$tbank = $form->radio("_", "Bank", $atabel['Bank'], true, false, ['BCA'=>"BCA",'BNI'=>"BNI",'Mandiri'=>"Mandiri",'BRI'=>"BRI"]);
|
||||||
|
$tjumlah = $form->textbox("_", "Jumlah", $atabel['Jumlah'], true, true, "double");
|
||||||
|
|
||||||
|
$ajson['html'] = '
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="Tgl_Depo">Tanggal</label>
|
||||||
|
<div class="col-sm-4 col-lg-6">'.$ttgl.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="Bank">Nama Bank</label>
|
||||||
|
<div class="col col-form-label">'.$tbank.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="Jumlah">Jumlah Topup</label>
|
||||||
|
<div class="col-sm-4 col-lg-6">'.$tjumlah.'</div>
|
||||||
|
</div>';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$this->app->json(['html' => '
|
||||||
|
<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>Topup Saldo PPOB</button>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item ms-auto w-50">
|
||||||
|
<div class="input-group"><input class="form-control" id="Cari_Topup" 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>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<button class="btn btn-primary mb-1 ms-2" id="butTambah" type="button"><i class="bi-plus-lg me-2"></i>Tambah</button>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<div class="tab-content border border-top-0 p-3">
|
||||||
|
<div class="tab-pane fade active show" id="tx" role="tabpanel" aria-labelledby="tx-tab">
|
||||||
|
<div id="divDetailTabel"> </div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div></div>
|
||||||
|
</div>'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,222 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Promo/BarangController
|
||||||
|
Description : Promo Penjualan Barang
|
||||||
|
Created By : Siau Pheng ([email protected]).
|
||||||
|
Created Date : September 28th, 2014.
|
||||||
|
Last Modified : September 2nd, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Promo;
|
||||||
|
|
||||||
|
use App\Utils\Invesa;
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use Webapp\DB\SQL;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
use Webapp\Web\Table;
|
||||||
|
|
||||||
|
class BarangController {
|
||||||
|
|
||||||
|
private string $mode_detail;
|
||||||
|
private int $id_promo;
|
||||||
|
private int $id_inv;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->mode_detail = Param::Get("mode_detail", "");
|
||||||
|
$this->id_promo = (int) Param::Get("PromoID", 0);
|
||||||
|
$this->id_inv = (int) Param::Get("InvID", 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function table_promo() {
|
||||||
|
if (in_array($this->mode_detail, ["insert","update","delete"])) {
|
||||||
|
$sql = new SQL($this->app);
|
||||||
|
$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("Grup_MemberID");
|
||||||
|
$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 ($this->mode_detail === "insert") {
|
||||||
|
$sql->InsertDB();
|
||||||
|
} else if ($this->mode_detail === "update") {
|
||||||
|
$sql->UpdateDB();
|
||||||
|
} else if ($this->mode_detail === "delete") {
|
||||||
|
$sql->DeleteDB();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$tcari = Param::Get("Cari_Promo");
|
||||||
|
$tsql = ''; $asql = [];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql = 'CONCAT(B.Nama_Produk,P.Nama_Promo) LIKE ?';
|
||||||
|
$asql[] = '%'. $tcari .'%';
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("(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) LEFT JOIN para_member_grup G ON (G.Grup_MemberID=P.Grup_MemberID)", "P.*,B.Nama_Produk,S.Nama_Satuan,IF(P.CabID=0,'SEMUA CAB',C.Nama_Cab) Nama_Cab,IF(P.Grup_MemberID=0,'SEMUA GRUP',G.Nama_Grup) Nama_Grup,(P.Jumlah_Promo-P.Jumlah_Proses) Jumlah_Sisa", $tsql, $asql);
|
||||||
|
$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", "l");
|
||||||
|
$obj->add_field("Nama_Grup", "Grup Member", "l");
|
||||||
|
$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", "", "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_btn("PromoBarangJS.detail_tambah", "+ Promo Barang");
|
||||||
|
$this->app->json([ $obj->json_table("divDetail") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function brow_produk() {
|
||||||
|
$tcari = Param::Get("Cari_Produk");
|
||||||
|
$tsql = ''; $asql = [];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql = ' AND Nama_Produk LIKE ?';
|
||||||
|
$asql[] = '%'. $tcari .'%';
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("inv_produk", "*", "Aktif=1".$tsql, $asql);
|
||||||
|
$obj->add_field("InvID", "ID", "hid");
|
||||||
|
$obj->add_field("Nama_Produk", "Nama Barang", "awr");
|
||||||
|
$obj->set_field_order("Nama_Produk", "A");
|
||||||
|
$obj->set_func_select("PromoBarangJS.produk_select");
|
||||||
|
$this->app->json([ $obj->db_table("divBrowProduk") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_promo() {
|
||||||
|
$atabel = Invesa::A_Promo(1);
|
||||||
|
if ($this->id_promo > 0) {
|
||||||
|
$atabel = $this->db->fetchRow("SELECT P.*,B.Nama_Produk FROM (SELECT * FROM inv_promo WHERE PromoID=?) P LEFT JOIN inv_produk B ON (B.InvID=P.InvID)", [$this->id_promo]);
|
||||||
|
if ((int) $atabel['Promo_InvID'] > 0) {
|
||||||
|
$atabel['Promo_Produk'] = $this->db->fetchField("SELECT Nama_Produk FROM inv_produk WHERE InvID=?", [$atabel['Promo_InvID']]) ?? '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$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'], false, false, "text");
|
||||||
|
$tsatuan = $form->option("_", "SatuanID", $atabel['SatuanID'], true, false, [$atabel['SatuanID']=>$atabel['SatuanID']]);
|
||||||
|
$tgrup = $form->option_db("_", "Grup_MemberID", $atabel['Grup_MemberID'], true, false, "para_member_grup", ["Grup_MemberID","Nama_Grup"], "Aktif=1 ORDER BY Nama_Grup", [0,"SEMUA GRUP"]);
|
||||||
|
$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"]);
|
||||||
|
$ajson['html'] = '
|
||||||
|
<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>
|
||||||
|
<label class="col-sm-4 col-lg-2 col-form-label" for="Grup_MemberID">Grup Member</label>
|
||||||
|
<div class="col-sm-8 col-lg-4">'.$tgrup.'</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"><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">'.$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.Invesa::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.Invesa::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 d-flex gap-2">'.$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.Invesa::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"><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.Invesa::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.Invesa::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 d-flex gap-2">'.$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="'.$this->mode_detail.'" >';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function item_detail () {
|
||||||
|
$ajson = $this->db->fetchAll("SELECT P.SatuanID value,S.Nama_Satuan label FROM (SELECT * FROM inv_produk_kemasan WHERE InvID=?) P LEFT JOIN para_satuan S ON (S.SatuanID=P.SatuanID)", [$this->id_inv]);
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$this->app->json(['html' => '
|
||||||
|
<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"> </div></div></div></div>'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,331 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Promo/BelidiscController
|
||||||
|
Description : Promo Beli & Diskon
|
||||||
|
Created By : Siau Pheng ([email protected]).
|
||||||
|
Created Date : September 28th, 2014.
|
||||||
|
Last Modified : October 29th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Promo;
|
||||||
|
|
||||||
|
use App\Utils\Invesa;
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use Webapp\DB\SQL;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
use Webapp\Web\Table;
|
||||||
|
|
||||||
|
class BelidiscController {
|
||||||
|
|
||||||
|
private int $id_cab;
|
||||||
|
private string $mode;
|
||||||
|
private string $mode_detail;
|
||||||
|
private int $id_grup;
|
||||||
|
private int $id_inv;
|
||||||
|
private int $id_satuan;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->id_cab = Param::Int("CabID", 0);
|
||||||
|
$this->mode = Param::Get("mode", "");
|
||||||
|
$this->mode_detail = Param::Get("mode_detail", "");
|
||||||
|
$this->id_grup = Param::Int("Grup_PromoID", 0);
|
||||||
|
$this->id_inv = Param::Int("InvID", 0);
|
||||||
|
$this->id_satuan = Param::Int("SatuanID", 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function table_detail() {
|
||||||
|
if (in_array($this->mode_detail, ["insert","update","delete"])) {
|
||||||
|
$sql = new SQL($this->app);
|
||||||
|
$sql->set_table("inv_promo");
|
||||||
|
$sql->add_param("Grup_PromoID");
|
||||||
|
$sql->add_param("InvID");
|
||||||
|
$sql->add_param("SatuanID");
|
||||||
|
$sql->add_param("Jual_Grup", Param::Get("List_CB_VarianID", "0"));
|
||||||
|
$sql->add_param_userid();
|
||||||
|
$sql->add_where("PromoID");
|
||||||
|
|
||||||
|
if ( $this->mode_detail === "insert" ) {
|
||||||
|
$sql->add_param("Tipe_Promo", 5);
|
||||||
|
$sql->InsertDB();
|
||||||
|
} else if ( $this->mode_detail === "update" ) {
|
||||||
|
$sql->UpdateDB();
|
||||||
|
} else if ( $this->mode_detail === "delete" ) {
|
||||||
|
$sql->DeleteDB();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$tsql = 'Tipe_Promo=? AND Grup_PromoID=?'; $asql = [5, $this->id_grup];
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("(SELECT * FROM inv_promo WHERE ".$tsql.") D LEFT JOIN inv_produk P ON (D.InvID=P.InvID) LEFT JOIN para_satuan S ON (S.SatuanID=D.SatuanID)", "D.*,P.Nama_Produk,Nama_Varian(IF(ISNULL(D.Jual_Grup) OR D.Jual_Grup='','0',D.Jual_Grup)) Nama_Varian,S.Nama_Satuan", "", $asql);
|
||||||
|
$obj->add_field("PromoID", "ID", "hid");
|
||||||
|
$obj->add_field("InvID", "InvID", "hid");
|
||||||
|
$obj->add_field("SatuanID", "SatuanID", "hid");
|
||||||
|
$obj->add_field("Jual_Grup", "Varian", "hid");
|
||||||
|
$obj->add_field("Nama_Produk", "Nama Barang", "awr");
|
||||||
|
$obj->add_field("Nama_Satuan", "Satuan", "l");
|
||||||
|
$obj->add_field("Nama_Varian", "Varian", "awr");
|
||||||
|
if (in_array($this->mode, ["add","edit"])) {
|
||||||
|
$obj->add_row_btn("clipboard", "Ubah", "PromoBeliDiscJS.detail_ubah");
|
||||||
|
$obj->add_row_btn("trash", "Hapus", "PromoBeliDiscJS.detail_hapus", "Grup_PromoID", $this->id_grup);
|
||||||
|
$obj->set_func_btn("PromoBeliDiscJS.detail_tambah", '<i class="bi-plus me-1"></i> Barang');
|
||||||
|
$obj->set_func_btn("PromoBeliDiscJS.produk_brow", '<i class="bi-table me-1"></i> Browse');
|
||||||
|
}
|
||||||
|
$ajson[] = $obj->json_table("divDetailTabel");
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function brow_promo() {
|
||||||
|
$tcari = Param::Get("Cari_Promo");
|
||||||
|
$tsql = ''; $asql = [];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql .= "Promo_Nama LIKE ?";
|
||||||
|
array_push($asql, '%' . $tcari . '%');
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("inv_promo_grup", "*", $tsql, $asql);
|
||||||
|
$obj->add_field("Grup_PromoID", "ID", "hid");
|
||||||
|
$obj->add_field("Promo_Nama", "Nama Promo", "awr");
|
||||||
|
$obj->add_field("Tgl_Mulai", "Tgl. Mulai", "c", "sqltgl", "", "val-tgl");
|
||||||
|
$obj->add_field("Tgl_Akhir", "Tgl. Akhir", "c", "sqltgl", "", "val-tgl");
|
||||||
|
$obj->add_field("Aktif", "Aktif", "c", "checkbox");
|
||||||
|
$obj->set_func_select("PromoBeliDiscJS.promo_select");
|
||||||
|
$this->app->json([ $obj->db_table("divBrowPromo") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function brow_produk() {
|
||||||
|
$tcari = Param::Get("Cari_Produk");
|
||||||
|
$tsql = ''; $asql = [];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql .= " AND Nama_Produk LIKE ?";
|
||||||
|
$asql[] = '%' . $tcari . '%';
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("inv_produk", "*", $tsql, $asql);
|
||||||
|
$obj->add_field("InvID", "ID", "hid");
|
||||||
|
$obj->add_field("NormalID", "ID", "hid");
|
||||||
|
$obj->add_field("Nama_Produk", "Nama Barang", "awr");
|
||||||
|
$obj->set_func_select("PromoBeliDiscJS.produk_select");
|
||||||
|
$this->app->json([ $obj->db_table("divBrowProduk") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function auto_produk() {
|
||||||
|
$tcari = Param::Get("Auto_Query", "");
|
||||||
|
$ajson['autodata'] = [];
|
||||||
|
|
||||||
|
// Cari by Nama_Produk
|
||||||
|
$stat = $this->db->runQuery("SELECT P.InvID,P.Nama_Produk,P.NormalID Data2 FROM inv_produk P WHERE P.Nama_Produk LIKE ? ORDER BY P.Nama_Produk LIMIT 50", ['%'.$tcari.'%']);
|
||||||
|
while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$ajson['autodata'][] = ['value'=>$row['InvID'], 'text'=>$row['Nama_Produk'], 'html'=>$row['Nama_Produk'], 'data'=>$row['Data2'], 'bc'=>0];
|
||||||
|
}
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_master() {
|
||||||
|
$ajson = [ 'error'=>"", 'html'=>"" ];
|
||||||
|
$atabel = [];
|
||||||
|
|
||||||
|
if ($this->mode === "add") {
|
||||||
|
$atabel = $this->Data_Promo(true);
|
||||||
|
} else if ($this->mode === "save") {
|
||||||
|
$sql = new SQL($this->app);
|
||||||
|
$sql->set_table("inv_promo_grup");
|
||||||
|
$sql->add_param("CabID", $this->id_cab);
|
||||||
|
$sql->add_param("Grup_MemberID");
|
||||||
|
$sql->add_param("Qty_Kali");
|
||||||
|
$sql->add_param("Tipe_Promo");
|
||||||
|
$sql->add_param("Promo_Nama");
|
||||||
|
$sql->add_param("Promo_Minggu");
|
||||||
|
$sql->add_param("Promo_Disc");
|
||||||
|
$sql->add_param_date("Tgl_Mulai");
|
||||||
|
$sql->add_param_date("Tgl_Akhir");
|
||||||
|
$sql->add_param("Aktif");
|
||||||
|
$sql->add_param_userid();
|
||||||
|
$sql->add_where("Grup_PromoID");
|
||||||
|
|
||||||
|
if ($this->id_grup === 0) {
|
||||||
|
$sql->add_param("Pilih_Qty", 3);
|
||||||
|
$sql->InsertDB();
|
||||||
|
} else {
|
||||||
|
$sql->UpdateDB();
|
||||||
|
$this->db->runQuery("UPDATE inv_promo_grup a, inv_promo b SET b.CabID=a.CabID,b.Grup_MemberID=a.Grup_MemberID,b.Pilih_Qty=a.Pilih_Qty,b.Qty_Kali=a.Qty_Kali,b.Tipe_Promo=a.Tipe_Promo,b.Promo_Disc=a.Promo_Disc,b.Tgl_Mulai=a.Tgl_Mulai,b.Tgl_Akhir=a.Tgl_Akhir,b.Aktif=a.Aktif WHERE a.Grup_PromoID=a.Grup_PromoID");
|
||||||
|
}
|
||||||
|
$this->mode = "view";
|
||||||
|
} else if ($this->mode === "cancel") {
|
||||||
|
$this->db->runQuery("DELETE FROM inv_promo WHERE Tipe_Promo=5 AND Grup_PromoID=0");
|
||||||
|
$atabel = $this->Data_Promo();
|
||||||
|
} else {
|
||||||
|
$atabel = $this->Data_Promo();
|
||||||
|
}
|
||||||
|
|
||||||
|
$enable = in_array($this->mode, ["add","edit"]) ? true : false;
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tcab = $form->option_db("_", "CabID", $atabel['CabID'], $enable, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY Nama_Cab", [0,"SEMUA CABANG"]);
|
||||||
|
$tgrup_mem = $form->option_db("_", "Grup_MemberID", $atabel['Grup_MemberID'], $enable, false, "para_member_grup", ["Grup_MemberID","Nama_Grup"], "Aktif=1 ORDER BY Nama_Grup", [0,"SEMUA GRUP"]);
|
||||||
|
$tqty = $form->textbox("_", "Qty_Kali", $atabel['Qty_Kali'], $enable, true, "double");
|
||||||
|
$tnama = $form->textbox("_", "Promo_Nama", $atabel['Promo_Nama'], $enable, true, "text", "nama promo");
|
||||||
|
$tminggu = $form->textbox("_", "Promo_Minggu", $atabel['Promo_Minggu'], $enable, true, "text", "hari promo");
|
||||||
|
$tdisc = $form->textbox("_", "Promo_Disc", $atabel['Promo_Disc'], $enable, true, "double");
|
||||||
|
$ttglmulai = $form->datebox("_", "Tgl_Mulai", $atabel['Tgl_Mulai'], $enable, true);
|
||||||
|
$ttglakhir = $form->datebox("_", "Tgl_Akhir", $atabel['Tgl_Akhir'], $enable, true);
|
||||||
|
$taktif = $form->radio("_", "Aktif", $atabel['Aktif'], true, false, ['1'=>"Ya",'0'=>"Tidak"]);
|
||||||
|
$ajson['html'] = '
|
||||||
|
<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"><div class="input-group">'.$tnama.'<button id="butBrow" class="btn btn-info" type="button"><i class="bi-shop-window"></i></button></div></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>
|
||||||
|
<label class="col-sm-4 col-lg-2 col-form-label" for="Promo_Minggu">Hari Promo</label>
|
||||||
|
<div class="col-sm-8 col-lg-4"><div class="input-group">'.$tminggu.Invesa::Form_Info("Kode Hari dalam Angka. Contoh : 1 = Senin, 2 = Selasa, ... 0 = Minggu.").'</div></div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-2 col-form-label" for="Grup_MemberID">Grup Member</label>
|
||||||
|
<div class="col-sm-8 col-lg-4">'.$tgrup_mem.'</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-3">'.$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">'.$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-3">'.$ttglakhir.'</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="Qty_Kali">Jumlah Kelipatan</label>
|
||||||
|
<div class="col-sm-8 col-lg-4"><div class="input-group">'.$tqty.Invesa::Form_Info("Jumlah Kelipatan Penjualan untuk mendapatkan promo. Contoh : Beli 2 PCS, item Ke-2 Disc 50%, Berarti = 2 PCS.").'</div></div>
|
||||||
|
<label class="col-sm-4 col-lg-2 col-form-label" for="Promo_Disc">Persen Diskon</label>
|
||||||
|
<div class="col-sm-8 col-lg-4"><div class="input-group">'.$tdisc.Invesa::Form_Info("Nilai Diskon Satuan Barang berdasarkan kriteria. Contoh : 50%, Berarti = 0.50.").'</div></div>
|
||||||
|
</div>
|
||||||
|
<input type="hidden" id="Tipe_Promo" value="'.$atabel['Tipe_Promo'].'" >
|
||||||
|
<input type="hidden" id="Grup_PromoID" value="'.$atabel['Grup_PromoID'].'" >
|
||||||
|
<input type="hidden" id="mode" value="'.$this->mode.'" >';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_produk() {
|
||||||
|
$id = (int) Param::Get("PromoID", 0);
|
||||||
|
$atabel = [ 'PromoID'=>$id, 'InvID'=>$this->id_inv, 'SatuanID'=>$this->id_satuan, 'Kode_Varian'=>Param::Get("Kode_Varian", "0"), 'Nama_Produk'=>"" ];
|
||||||
|
if ($this->id_inv > 0) {
|
||||||
|
$_row = $this->db->fetchRow("SELECT Nama_Produk FROM inv_produk WHERE InvID=?", [$this->id_inv]);
|
||||||
|
if ($_row) $atabel = array_merge($atabel, $_row->getData());
|
||||||
|
}
|
||||||
|
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tnama = $form->textauto("_", "Nama_Produk", ['value'=>$this->id_inv,'text'=>$atabel['Nama_Produk']], true, true, "nama barang");
|
||||||
|
$tsat = $form->option("_", "SatuanID", $atabel['SatuanID'], true, false, [0=>""]);
|
||||||
|
$ajson['html'] = '
|
||||||
|
<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="SatuanID">Satuan Barang</label>
|
||||||
|
<div class="col">'.$tsat.'</div>
|
||||||
|
</div>
|
||||||
|
<div id="divBrowVarian"></div>
|
||||||
|
<input type="hidden" id="PromoID" value="'.$atabel['PromoID'].'" >
|
||||||
|
<input type="hidden" id="InvID" value="'.$atabel['InvID'].'" >
|
||||||
|
<input type="hidden" id="Kode_Varian" value="'.$atabel['Kode_Varian'].'" >
|
||||||
|
<input type="hidden" id="mode_detail" value="'.$this->mode_detail.'" >';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_varian() {
|
||||||
|
$kode_varian = Param::Get("Kode_Varian", "0"); $avarian = explode(",", $kode_varian);
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("(SELECT VarianID FROM inv_produk_varian WHERE InvID=? AND SatuanID=?) K LEFT JOIN para_varian V ON (K.VarianID=V.VarianID)", "K.VarianID,IFNULL(V.Nama_Varian,'Tanpa Varian') Nama_Varian,IF(K.VarianID IN (?),'Y','N') Cek", "", [$avarian, $this->id_inv, $this->id_satuan]);
|
||||||
|
$obj->add_field("VarianID", "ID", "hid");
|
||||||
|
$obj->add_field("Nama_Varian", "Nama Varian", "awr");
|
||||||
|
$obj->add_row_checkbox("VarianID", "Cek");
|
||||||
|
$obj->set_field_order("Nama_Varian", "A");
|
||||||
|
$this->app->json([ $obj->json_table("divBrowVarian") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function proses_delete() {
|
||||||
|
$this->db->runQuery("DELETE FROM inv_promo_grup WHERE Grup_PromoID=?", [$this->id_grup]);
|
||||||
|
$this->db->runQuery("DELETE FROM inv_promo WHERE Grup_PromoID=?", [$this->id_grup]);
|
||||||
|
$this->app->json([ 'status' => true ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function option_satuan() {
|
||||||
|
$aoption = ['type' => "option", 'id' => "SatuanID", 'value' => $this->id_satuan, 'avalue' => []];
|
||||||
|
$asatuan = $this->db->fetchAll("SELECT P.SatuanID,S.Nama_Satuan FROM (SELECT SatuanID,Qty FROM inv_produk_kemasan WHERE InvID=?) P LEFT JOIN para_satuan S ON (S.SatuanID=P.SatuanID) ORDER BY P.Qty DESC", [$this->id_inv]);
|
||||||
|
foreach ($asatuan as $satuan) {
|
||||||
|
$aoption['avalue'][] = ['value'=>$satuan['SatuanID'], 'html'=>$satuan['Nama_Satuan']];
|
||||||
|
}
|
||||||
|
$this->app->json([ $aoption ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$this->app->json(['html' => '
|
||||||
|
<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-table me-2"></i>Promo Penjualan Beli & Diskon</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-danger mb-1 ms-2" id="butBatal" type="button"><i class="bi-x-lg me-2"></i>Batal</button>
|
||||||
|
<button class="btn btn-success mb-1 ms-2" id="butSimpan" type="button"><i class="bi-save me-2"></i>Simpan</button>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<div class="tab-content border border-top-0 p-3">
|
||||||
|
<div class="tab-pane fade active show" id="tx" role="tabpanel" aria-labelledby="tx-tab">
|
||||||
|
<div id="divTXMaster"> </div>
|
||||||
|
<div id="divDetailTabel"> </div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div></div>
|
||||||
|
</div>'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function Data_Promo(bool $is_new=false): array {
|
||||||
|
$aparam = [
|
||||||
|
'Grup_PromoID' => $this->id_grup,
|
||||||
|
'CabID' => $this->id_cab,
|
||||||
|
'Grup_MemberID' => 0,
|
||||||
|
'Tipe_Promo' => 5,
|
||||||
|
'Qty_Kali' => 0,
|
||||||
|
'Promo_Nama' => "",
|
||||||
|
'Promo_Minggu' => "",
|
||||||
|
'Promo_Disc' => 0,
|
||||||
|
'Tgl_Mulai' => tgl_ymd(),
|
||||||
|
'Tgl_Akhir' => tgl_sql2str(tgl_operasi(tgl_dmy(), 0, 1, 0)),
|
||||||
|
'Aktif' => 1,
|
||||||
|
];
|
||||||
|
if ($is_new) {
|
||||||
|
$aparam['Grup_PromoID'] = 0;
|
||||||
|
} else {
|
||||||
|
if ($this->id_grup > 0) {
|
||||||
|
$row = $this->db->fetchRow("SELECT * FROM inv_promo_grup WHERE Tipe_Promo IN (5) AND Grup_PromoID=?", [$this->id_grup]);
|
||||||
|
if ($row) $aparam = array_merge($aparam, $row->getData());
|
||||||
|
} else {
|
||||||
|
$row = $this->db->fetchRow("SELECT * FROM inv_promo_grup WHERE Tipe_Promo IN (5) ORDER BY Grup_PromoID DESC", []);
|
||||||
|
if ($row) $aparam = array_merge($aparam, $row->getData());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $aparam;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,220 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Promo/TotalController
|
||||||
|
Description : Promo Penjualan Total Penjualan
|
||||||
|
Created By : Siau Pheng ([email protected]).
|
||||||
|
Created Date : September 28th, 2014.
|
||||||
|
Last Modified : September 2nd, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Promo;
|
||||||
|
|
||||||
|
use App\Utils\Invesa;
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use Webapp\DB\SQL;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
use Webapp\Web\Table;
|
||||||
|
|
||||||
|
class TotalController {
|
||||||
|
|
||||||
|
private string $mode_detail;
|
||||||
|
private int $id_promo;
|
||||||
|
private int $id_inv;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->mode_detail = Param::Get("mode_detail", "");
|
||||||
|
$this->id_promo = (int) Param::Get("PromoID", 0);
|
||||||
|
$this->id_inv = (int) Param::Get("InvID", 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function table_promo() {
|
||||||
|
if (in_array($this->mode_detail, ["insert","update","delete"])) {
|
||||||
|
$sql = new SQL($this->app);
|
||||||
|
$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("Grup_MemberID");
|
||||||
|
$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 ($this->mode_detail === "insert") {
|
||||||
|
$sql->InsertDB();
|
||||||
|
} else if ($this->mode_detail === "update") {
|
||||||
|
$sql->UpdateDB();
|
||||||
|
} else if ($this->mode_detail === "delete") {
|
||||||
|
$sql->DeleteDB();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$tcari = Param::Get("Cari_Promo");
|
||||||
|
$tsql = ''; $asql = [];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql = 'P.Nama_Promo LIKE ?';
|
||||||
|
$asql[] = '%'. $tcari .'%';
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("(SELECT * FROM inv_promo WHERE Tipe_Promo IN (3,4)) P LEFT JOIN para_cabang C ON (P.CabID=C.CabID) LEFT JOIN para_member_grup G ON (G.Grup_MemberID=P.Grup_MemberID)", "P.*,IF(P.CabID=0,'SEMUA CAB',C.Nama_Cab) Nama_Cab,IF(P.Grup_MemberID=0,'SEMUA GRUP',G.Nama_Grup) Nama_Grup,(P.Jumlah_Promo-P.Jumlah_Proses) Jumlah_Sisa", $tsql, $asql);
|
||||||
|
$obj->add_field("PromoID", "ID", "hid");
|
||||||
|
$obj->add_field("Nama_Cab", "Cabang", "l");
|
||||||
|
$obj->add_field("Nama_Grup", "Grup Member", "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", "", "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_btn("PromoTotalJS.detail_tambah", "+ Promo Total");
|
||||||
|
$this->app->json([ $obj->json_table("divDetail") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function brow_produk() {
|
||||||
|
$tcari = Param::Get("Cari_Produk");
|
||||||
|
$tsql = ''; $asql = [];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql = ' AND Nama_Produk LIKE ?';
|
||||||
|
$asql[] = '%'. $tcari .'%';
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("inv_produk", "*", "Aktif=1".$tsql, $asql);
|
||||||
|
$obj->add_field("InvID", "ID", "hid");
|
||||||
|
$obj->add_field("Nama_Produk", "Nama Barang", "awr");
|
||||||
|
$obj->set_field_order("Nama_Produk", "A");
|
||||||
|
$obj->set_func_select("PromoTotalJS.produk_select");
|
||||||
|
$this->app->json([ $obj->db_table("divBrowProduk") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_promo() {
|
||||||
|
$atabel = Invesa::A_Promo(4);
|
||||||
|
if ($this->id_promo > 0) {
|
||||||
|
$atabel = $this->db->fetchRow("SELECT * FROM inv_promo WHERE PromoID=?", [$this->id_promo]);
|
||||||
|
if ((int) $atabel['Promo_InvID'] > 0) {
|
||||||
|
$atabel['Promo_Produk'] = $this->db->fetchField("SELECT Nama_Produk FROM inv_produk WHERE InvID=?", [$atabel['Promo_InvID']]) ?? '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$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'], false, false, "text");
|
||||||
|
$tgrup = $form->option_db("_", "Grup_MemberID", $atabel['Grup_MemberID'], true, false, "para_member_grup", ["Grup_MemberID","Nama_Grup"], "Aktif=1 ORDER BY Nama_Grup", [0,"SEMUA GRUP"]);
|
||||||
|
$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"]);
|
||||||
|
$ajson['html'] = '
|
||||||
|
<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>
|
||||||
|
<label class="col-sm-4 col-lg-2 col-form-label" for="Grup_MemberID">Grup Member</label>
|
||||||
|
<div class="col-sm-8 col-lg-4">'.$tgrup.'</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"><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.Invesa::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 d-flex gap-2">'.$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.Invesa::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"><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.Invesa::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.Invesa::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 d-flex gap-2">'.$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="'.$this->mode_detail.'" >';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_grup() {
|
||||||
|
$agrup = explode(",", Param::Get("Jual_Grup","0"));
|
||||||
|
$ajson['html'] = '<table class="table table-striped table-bordered table-hover" id="tabGrupList"><thead><tr><th>Grup Barang</th><th>Aksi</th></tr></thead><tbody>';
|
||||||
|
|
||||||
|
$stat = $this->db->runQuery("SELECT * FROM inv_produk_grup ORDER BY Nama_Grup");
|
||||||
|
while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$checked = (in_array($row['Grup_InvID'], $agrup)) ? "checked" : "";
|
||||||
|
$ajson['html'] .= sprintf('<tr><td class="l">%s</td><td class="c"><input type="checkbox" class="form-check-input" value="%s" %s/></td></tr>', $row['Nama_Grup'], $row['Grup_InvID'], $checked);
|
||||||
|
}
|
||||||
|
$ajson['html'] .= '</tbody></table>';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function item_detail () {
|
||||||
|
$ajson = $this->db->fetchAll("SELECT P.SatuanID value,S.Nama_Satuan label FROM (SELECT * FROM inv_produk_kemasan WHERE InvID=?) P LEFT JOIN para_satuan S ON (S.SatuanID=P.SatuanID)", [$this->id_inv]);
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$this->app->json(['html' => '
|
||||||
|
<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"> </div></div></div></div>'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/QZController
|
||||||
|
Description : Koneksi QZ Printer
|
||||||
|
Created By : Siau Pheng ([email protected]).
|
||||||
|
Created Date : December 7th, 2008.
|
||||||
|
Last Modified : August 9th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller;
|
||||||
|
|
||||||
|
use flight\Engine;
|
||||||
|
|
||||||
|
class QZController {
|
||||||
|
|
||||||
|
protected Engine $app;
|
||||||
|
|
||||||
|
public function __construct(Engine $app) {
|
||||||
|
$this->app = $app;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getCert() {
|
||||||
|
$this->app->response()->header('Content-Type', 'text/plain');
|
||||||
|
readfile(__DIR__ . '/../config/qz/cert.pem');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getSign(string $req) {
|
||||||
|
$privateKey = openssl_get_privatekey(file_get_contents(__DIR__ . '/../config/qz/key.pem'));
|
||||||
|
$signature = null;
|
||||||
|
openssl_sign($req, $signature, $privateKey);
|
||||||
|
|
||||||
|
$this->app->response()->header('Content-Type', 'text/plain');
|
||||||
|
if ($signature) {
|
||||||
|
echo base64_encode($signature);
|
||||||
|
} else echo '<h1>Error signing message</h1>';
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,257 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Report/Beli/AnalisaController
|
||||||
|
Description : Laporan Analisa Pembelian
|
||||||
|
Created By : Siau Pheng ([email protected]).
|
||||||
|
Created Date : August 4th, 2013.
|
||||||
|
Last Modified : October 3rd, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Report\Beli;
|
||||||
|
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use flight\Session;
|
||||||
|
use Webapp\Data\Xlsx;
|
||||||
|
use Webapp\Printer\PrintHTML;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
|
||||||
|
class AnalisaController {
|
||||||
|
|
||||||
|
private int $id_cab;
|
||||||
|
private string $reg_name;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->id_cab = Param::Int("CabID", 0);
|
||||||
|
$this->reg_name = $session->get('WEB_APP')['REG_NAME'];
|
||||||
|
}
|
||||||
|
|
||||||
|
private function prepare() {
|
||||||
|
$apre = [
|
||||||
|
'tipe' => Param::Get("Tipe", "V"), // V or R
|
||||||
|
'id_sup' => Param::Int("SupID", 0),
|
||||||
|
'id_grup' => Param::Int("Grup_InvID", 0),
|
||||||
|
'tgl_from' => Param::Get("Tgl_From"),
|
||||||
|
'tgl_to' => Param::Get("Tgl_To"),
|
||||||
|
];
|
||||||
|
$apre['Hari'] = tgl_range_hari($apre['tgl_from'], $apre['tgl_to'], true);
|
||||||
|
|
||||||
|
$apre['nama_sup'] = ($apre['id_sup'] > 0) ? ($this->db->fetchField("SELECT CONCAT(Nama_Sup,' (',Kode_Sup,')') Nama FROM para_supplier WHERE SupID=?", [$apre['id_sup']]) ?? '') : '';
|
||||||
|
$apre['nama_grup'] = ($apre['id_grup'] > 0) ? ($this->db->fetchField("SELECT Nama_Grup FROM inv_produk_grup WHERE Grup_InvID=?", [$apre['id_grup']]) ?? '') : '';
|
||||||
|
|
||||||
|
// generate report header
|
||||||
|
$apre['periode'] = $apre['tgl_from'] . ($apre['tgl_from'] !== $apre['tgl_to'] ? ' s/d '.$apre['tgl_to'] : '');
|
||||||
|
|
||||||
|
$tsql1 = ''; $tsql2 = ''; $asql = [tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to'])];
|
||||||
|
if ($this->id_cab > 0) {
|
||||||
|
$tsql1 .= " AND CabID=?";
|
||||||
|
array_push($asql, $this->id_cab);
|
||||||
|
}
|
||||||
|
if ($apre['id_sup'] > 0) {
|
||||||
|
$tsql1 .= " AND No_Ref IN (SELECT No_Beli FROM inv_beli WHERE SupID=? AND (Tgl_Beli BETWEEN ? AND ?))";
|
||||||
|
array_push($asql, $apre['id_sup'], tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to']));
|
||||||
|
}
|
||||||
|
if ($apre['id_grup'] > 0) {
|
||||||
|
$tsql2 .= " WHERE P.Grup_InvID=?";
|
||||||
|
array_push($asql, $apre['id_grup']);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($apre['tipe'] === "V") {
|
||||||
|
$apre['query'] = $this->db->runQuery("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 ? AND ?)".$tsql1." GROUP BY InvID) D LEFT JOIN vi_inv_produk2 P ON (D.InvID=P.InvID)".$tsql2." ORDER BY P.Nama_Produk", $asql);
|
||||||
|
} else {
|
||||||
|
$apre['query'] = $this->db->runQuery("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 ? AND ?)".$tsql1." GROUP BY InvID) D LEFT JOIN inv_produk P ON (D.InvID=P.InvID)".$tsql2." ORDER BY P.Nama_Produk", $asql);
|
||||||
|
}
|
||||||
|
return $apre;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function print() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
|
||||||
|
$pre = new PrintHTML($this->app);
|
||||||
|
$pre->add_title([strtoupper($this->reg_name), "REKAP ".($apre['tipe']==="V"?"VOLUME":"RUPIAH")." PEMBELIAN", "Periode : ".$apre['periode']]);
|
||||||
|
|
||||||
|
if ($apre['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 ($apre['id_sup'] > 0) $pre->add_sub_title("Nama Supplier : ".$apre['nama_sup']);
|
||||||
|
if ($apre['id_grup'] > 0) $pre->add_sub_title("Grup Barang : ".$apre['nama_grup']);
|
||||||
|
|
||||||
|
$pre->show_titles();
|
||||||
|
$pre->show_headers();
|
||||||
|
|
||||||
|
$nomor = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$total = $row['Volume'] ?? 0;
|
||||||
|
$mg_total = $total / ($apre['Hari']/7);
|
||||||
|
$kali = $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)." ".$row['Satuan_Normal'];
|
||||||
|
$mg_stok = rupiah($mg_norm,0)." ".$row['Satuan_Normal'];
|
||||||
|
if ($row['Satuan_Normal'] !== $row['Satuan_Stok']) {
|
||||||
|
$stok .= ", ".rupiah($sisa,0)." ".$row['Satuan_Stok'];
|
||||||
|
$mg_stok .= ", ".rupiah($mg_sisa,0)." ".$row['Satuan_Stok'];
|
||||||
|
}
|
||||||
|
$pre->add_row([ ++$nomor, $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 ($apre['id_sup'] > 0) $pre->add_sub_title("Nama Supplier : ".$apre['nama_sup']);
|
||||||
|
if ($apre['id_grup'] > 0) $pre->add_sub_title("Grup Barang : ".$apre['nama_grup']);
|
||||||
|
|
||||||
|
$pre->show_titles();
|
||||||
|
$pre->show_headers();
|
||||||
|
|
||||||
|
$nomor = 0; $tot_rup = 0; $tot_mg = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$mg_avg = ($row['Rupiah'] > 0) ? $row['Rupiah'] / ($apre['Hari'] / 7) : 0;
|
||||||
|
$tot_rup += $row['Rupiah'];
|
||||||
|
$tot_mg += $mg_avg;
|
||||||
|
$pre->add_row([ ++$nomor, $row['Nama_Produk'], $row['Rupiah'], $mg_avg ]);
|
||||||
|
}
|
||||||
|
$pre->add_span([ ["GRAND TOTAL",2,"R,B"],[$tot_rup,1,"R,B","rupiah"],[$tot_mg,1,"R,B","rupiah"] ]);
|
||||||
|
}
|
||||||
|
$pre->add_stamp(1, true);
|
||||||
|
$pre->show();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function excel() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
$xls = new Xlsx($this->app);
|
||||||
|
$xls->set_meta([
|
||||||
|
'title' => "Data Analisa Pembelian",
|
||||||
|
'desc' => "Export Data Analisa Pembelian"
|
||||||
|
]);
|
||||||
|
$xls->add_title([ $this->reg_name, "DATA REKAP ".($apre['tipe']==="V"?"VOLUME":"RUPIAH")." PEMBELIAN", "Periode : ".$apre['periode'] ]);
|
||||||
|
|
||||||
|
if ($apre['tipe'] === "V") {
|
||||||
|
$xls->add_field("No.", 5, "@integer");
|
||||||
|
$xls->add_field("Nama Barang", 25, "@text");
|
||||||
|
$xls->add_field("Jumlah", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Mingguan", 15, "#,##0.00");
|
||||||
|
$xls->add_sheet("".str_replace("s/d","-",$apre['periode']));
|
||||||
|
|
||||||
|
if ($apre['id_sup'] > 0) $xls->add_sub_title("Nama Supplier : ".$apre['nama_sup']);
|
||||||
|
if ($apre['id_grup'] > 0) $xls->add_sub_title("Grup Barang : ".$apre['nama_grup']);
|
||||||
|
|
||||||
|
$xls->show_titles();
|
||||||
|
$xls->show_headers();
|
||||||
|
|
||||||
|
$nomor = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$total = $row['Volume'] ?? 0;
|
||||||
|
$mg_total = $total / ($apre['Hari']/7);
|
||||||
|
$kali = $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)." ".$row['Satuan_Normal'];
|
||||||
|
$mg_stok = rupiah($mg_norm,0)." ".$row['Satuan_Normal'];
|
||||||
|
if ($row['Satuan_Normal'] !== $row['Satuan_Stok']) {
|
||||||
|
$stok .= ", ".rupiah($sisa,0)." ".$row['Satuan_Stok'];
|
||||||
|
$mg_stok .= ", ".rupiah($mg_sisa,0)." ".$row['Satuan_Stok'];
|
||||||
|
}
|
||||||
|
$xls->add_row([ ++$nomor, $row['Nama_Produk'], $stok, $mg_stok ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
$xls->add_field("No.", 5, "@integer");
|
||||||
|
$xls->add_field("Nama Barang", 20, "@text");
|
||||||
|
$xls->add_field("Jumlah", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Mingguan", 15, "#,##0.00");
|
||||||
|
$xls->add_sheet("".str_replace("s/d","-",$apre['periode']));
|
||||||
|
|
||||||
|
if ($apre['id_sup'] > 0) $xls->add_sub_title("Nama Supplier : ".$apre['nama_sup']);
|
||||||
|
if ($apre['id_grup'] > 0) $xls->add_sub_title("Grup Barang : ".$apre['nama_grup']);
|
||||||
|
|
||||||
|
$xls->show_titles();
|
||||||
|
$xls->show_headers();
|
||||||
|
|
||||||
|
$nomor = 0; $tot_rup = 0; $tot_mg = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$mg_avg = ($row['Rupiah'] > 0) ? $row['Rupiah'] / ($apre['Hari'] / 7) : 0;
|
||||||
|
$tot_rup += $row['Rupiah'];
|
||||||
|
$tot_mg += $mg_avg;
|
||||||
|
$xls->add_row([ ++$nomor, $row['Nama_Produk'], $row['Rupiah'], $mg_avg ]);
|
||||||
|
}
|
||||||
|
$xls->add_row_bold([ "", "GRAND TOTAL", $tot_rup, $tot_mg ]);
|
||||||
|
}
|
||||||
|
$xls->add_stamp(1, true);
|
||||||
|
$xls->download("Data Pembelian ".str_replace("s/d","-",$apre['periode']).".xlsx");
|
||||||
|
unset($xls);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$ttipe = $form->radio("_", "Tipe", "V", true, false, ["V"=>"Volume","R"=>"Rupiah"]);
|
||||||
|
$tcab = $form->option_db("_", "CabID", $this->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);
|
||||||
|
$ajson['html'] = '
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="Tipe">Tipe Laporan</label>
|
||||||
|
<div class="col">'.$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>';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,226 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Report/Beli/BeliController
|
||||||
|
Description : Laporan Pembelian
|
||||||
|
Created By : Siau Pheng ([email protected]).
|
||||||
|
Created Date : April 12th, 2011.
|
||||||
|
Last Modified : September 30th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Report\Beli;
|
||||||
|
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use flight\Session;
|
||||||
|
use Webapp\Data\Xlsx;
|
||||||
|
use Webapp\Printer\PrintHTML;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
|
||||||
|
class BeliController {
|
||||||
|
|
||||||
|
private int $id_cab;
|
||||||
|
private string $reg_name;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->id_cab = Param::Int("CabID", 0);
|
||||||
|
$this->reg_name = $session->get('WEB_APP')['REG_NAME'];
|
||||||
|
}
|
||||||
|
|
||||||
|
private function prepare() {
|
||||||
|
$apre = [
|
||||||
|
'tipe' => Param::Get("Tipe", "R"), // R or D
|
||||||
|
'id_sup' => Param::Int("SupID", 0),
|
||||||
|
'id_grup' => Param::Int("Grup_InvID", 0),
|
||||||
|
'tgl_from' => Param::Get("Tgl_From"),
|
||||||
|
'tgl_to' => Param::Get("Tgl_To"),
|
||||||
|
];
|
||||||
|
|
||||||
|
$apre['nama_sup'] = ($apre['id_sup'] > 0) ? ($this->db->fetchField("SELECT CONCAT(Nama_Sup,' (',Kode_Sup,')') Nama FROM para_supplier WHERE SupID=?", [$apre['id_sup']]) ?? '') : '';
|
||||||
|
$apre['nama_grup'] = ($apre['id_grup'] > 0) ? ($this->db->fetchField("SELECT Nama_Grup FROM inv_produk_grup WHERE Grup_InvID=?", [$apre['id_grup']]) ?? '') : '';
|
||||||
|
|
||||||
|
// generate report header
|
||||||
|
$apre['periode'] = $apre['tgl_from'] . ($apre['tgl_from'] !== $apre['tgl_to'] ? ' s/d '.$apre['tgl_to'] : '');
|
||||||
|
|
||||||
|
$tsql = ''; $asql = [tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to'])];
|
||||||
|
if ($this->id_cab > 0) {
|
||||||
|
$tsql .= " AND CabID=?";
|
||||||
|
array_push($asql, $this->id_cab);
|
||||||
|
}
|
||||||
|
if ($apre['id_sup'] > 0) {
|
||||||
|
$tsql .= " AND SupID=?";
|
||||||
|
array_push($asql, $apre['id_sup']);
|
||||||
|
}
|
||||||
|
//id_grup ?
|
||||||
|
|
||||||
|
if ($apre['tipe'] === "R") {
|
||||||
|
$apre['query'] = $this->db->runQuery("SELECT S.Nama_Sup,SUM(B.Real_Beli+B.Real_Diskon) Total_Beli,SUM(B.Real_Diskon) Total_Diskon,SUM(B.Real_Beli) Total FROM (SELECT * FROM inv_beli WHERE Data_Beli=1 AND (Tgl_Beli BETWEEN ? AND ?)".$tsql.") B LEFT JOIN para_supplier S ON (B.SupID=S.SupID) GROUP BY B.SupID ORDER BY S.Nama_Sup", $asql);
|
||||||
|
} else {
|
||||||
|
$apre['query'] = $this->db->runQuery("SELECT B.*,S.Nama_Sup,B.Total_Beli-B.Total_Diskon Total FROM (SELECT * FROM inv_beli WHERE Data_Beli=1 AND (Tgl_Beli BETWEEN ? AND ?)".$tsql.") B LEFT JOIN para_supplier S ON (B.SupID=S.SupID) ORDER BY B.No_Beli", $asql);
|
||||||
|
}
|
||||||
|
return $apre;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function print() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
|
||||||
|
$pre = new PrintHTML($this->app);
|
||||||
|
$pre->add_title([strtoupper($this->reg_name), ($apre['tipe']==="R"?"REKAP":"DETAIL")." PEMBELIAN", "Periode : ".$apre['periode']]);
|
||||||
|
|
||||||
|
if ($apre['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 ($apre['id_sup'] > 0) $pre->add_sub_title("Nama Supplier : ".$apre['nama_sup']);
|
||||||
|
if ($apre['id_grup'] > 0) $pre->add_sub_title("Grup Barang : ".$apre['nama_grup']);
|
||||||
|
|
||||||
|
$pre->show_titles();
|
||||||
|
$pre->show_headers();
|
||||||
|
|
||||||
|
$tot_beli = 0; $tot_diskon = 0; $nomor = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
//if ($row['Total] === 0) continue;
|
||||||
|
$tot_beli += $row['Total_Beli'];
|
||||||
|
$tot_diskon += $row['Total_Diskon'];
|
||||||
|
$pre->add_row([ ++$nomor, $row['Nama_Sup'], $row['Total_Beli'], $row['Total_Diskon'], $row['Total'] ]);
|
||||||
|
}
|
||||||
|
$pre->add_span([ ["GRAND TOTAL",2,"R,B"],[$tot_beli,1,"R,B","rupiah"],[$tot_diskon,1,"R,B","rupiah"],[$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 ($apre['id_sup'] > 0) $pre->add_sub_title("Nama Supplier : ".$apre['nama_sup']);
|
||||||
|
if ($apre['id_grup'] > 0) $pre->add_sub_title("Grup Barang : ".$apre['nama_grup']);
|
||||||
|
|
||||||
|
$pre->show_titles();
|
||||||
|
$pre->show_headers();
|
||||||
|
|
||||||
|
$tot_beli = 0; $tot_diskon = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_beli += $row['Total_Beli'];
|
||||||
|
$tot_diskon += $row['Total_Diskon'];
|
||||||
|
$pre->add_row([ $row['No_Beli'], $row['Tgl_Beli'], $row['No_Faktur'], $row['Nama_Sup'], $row['Total_Beli'], $row['Total_Diskon'], $row['Total'] ]);
|
||||||
|
}
|
||||||
|
$pre->add_span([ ["GRAND TOTAL",4,"R,B"],[$tot_beli,1,"R,B","rupiah"],[$tot_diskon,1,"R,B","rupiah"],[$tot_beli-$tot_diskon,1,"R,B","rupiah"] ]);
|
||||||
|
}
|
||||||
|
$pre->add_stamp(1, true);
|
||||||
|
$pre->show();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function excel() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
$xls = new Xlsx($this->app);
|
||||||
|
$xls->set_meta([
|
||||||
|
'title' => "Data Pembelian",
|
||||||
|
'desc' => "Export Data Pembelian"
|
||||||
|
]);
|
||||||
|
$xls->add_title([ $this->reg_name, "DATA ".($apre['tipe']==="R"?"REKAP":"DETAIL")." PEMBELIAN", "Periode : ".$apre['periode'] ]);
|
||||||
|
|
||||||
|
if ($apre['tipe'] === "R") {
|
||||||
|
$xls->add_field("No.", 5, "@integer");
|
||||||
|
$xls->add_field("Nama Supplier", 25, "@text");
|
||||||
|
$xls->add_field("Sub. Total", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Diskon", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Total", 15, "#,##0.00");
|
||||||
|
$xls->add_sheet("".str_replace("s/d","-",$apre['periode']));
|
||||||
|
|
||||||
|
if ($apre['id_sup'] > 0) $xls->add_sub_title("Nama Supplier : ".$apre['nama_sup']);
|
||||||
|
if ($apre['id_grup'] > 0) $xls->add_sub_title("Grup Barang : ".$apre['nama_grup']);
|
||||||
|
|
||||||
|
$xls->show_titles();
|
||||||
|
$xls->show_headers();
|
||||||
|
|
||||||
|
$tot_beli = 0; $tot_diskon = 0; $nomor = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_beli += $row['Total_Beli'];
|
||||||
|
$tot_diskon += $row['Total_Diskon'];
|
||||||
|
$xls->add_row([ ++$nomor, $row['Nama_Sup'], $row['Total_Beli'], $row['Total_Diskon'], $row['Total'] ]);
|
||||||
|
}
|
||||||
|
$xls->add_row_bold([ "", "GRAND TOTAL", $tot_beli, $tot_diskon, $tot_beli-$tot_diskon ]);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
$xls->add_field("No. Nota", 15, "@");
|
||||||
|
$xls->add_field("Tgl. Nota", 12, "@date");
|
||||||
|
$xls->add_field("No. Faktur", 15, "@text");
|
||||||
|
$xls->add_field("Nama Supplier", 20, "@text");
|
||||||
|
$xls->add_field("Sub. Total", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Diskon", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Total", 15, "#,##0.00");
|
||||||
|
$xls->add_sheet("".str_replace("s/d","-",$apre['periode']));
|
||||||
|
|
||||||
|
if ($apre['id_sup'] > 0) $xls->add_sub_title("Nama Supplier : ".$apre['nama_sup']);
|
||||||
|
if ($apre['id_grup'] > 0) $xls->add_sub_title("Grup Barang : ".$apre['nama_grup']);
|
||||||
|
|
||||||
|
$xls->show_titles();
|
||||||
|
$xls->show_headers();
|
||||||
|
|
||||||
|
$tot_beli = 0; $tot_diskon = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_beli += $row['Total_Beli'];
|
||||||
|
$tot_diskon += $row['Total_Diskon'];
|
||||||
|
$xls->add_row([ $row['No_Beli'], $row['Tgl_Beli'], $row['No_Faktur'], $row['Nama_Sup'], $row['Total_Beli'], $row['Total_Diskon'], $row['Total'] ]);
|
||||||
|
}
|
||||||
|
$xls->add_row_bold([ "", "", "", "GRAND TOTAL", $tot_beli, $tot_diskon, $tot_beli-$tot_diskon ]);
|
||||||
|
}
|
||||||
|
$xls->add_stamp(1, true);
|
||||||
|
$xls->download("Data Pembelian ".str_replace("s/d","-",$apre['periode']).".xlsx");
|
||||||
|
unset($xls);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$ttipe = $form->radio("_", "Tipe", "R", true, false, ["R"=>"Rekap","D"=>"Detail"]);
|
||||||
|
$tcab = $form->option_db("_", "CabID", $this->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);
|
||||||
|
$ajson['html'] = '
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="Tipe">Tipe Laporan</label>
|
||||||
|
<div class="col">'.$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>';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,160 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Report/Beli/MutasiController
|
||||||
|
Description : Laporan Mutasi Pembelian
|
||||||
|
Created By : Siau Pheng ([email protected]).
|
||||||
|
Created Date : April 3rd, 2013.
|
||||||
|
Last Modified : October 2nd, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Report\Beli;
|
||||||
|
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use flight\Session;
|
||||||
|
use Webapp\Data\Xlsx;
|
||||||
|
use Webapp\Printer\PrintHTML;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
|
||||||
|
class MutasiController {
|
||||||
|
|
||||||
|
private int $id_cab;
|
||||||
|
private string $reg_name;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->id_cab = Param::Int("CabID", 0);
|
||||||
|
$this->reg_name = $session->get('WEB_APP')['REG_NAME'];
|
||||||
|
}
|
||||||
|
|
||||||
|
private function prepare() {
|
||||||
|
$apre = [
|
||||||
|
'id_sup' => Param::Int("SupID", 0),
|
||||||
|
'tgl_from' => Param::Get("Tgl_From"),
|
||||||
|
'tgl_to' => Param::Get("Tgl_To"),
|
||||||
|
];
|
||||||
|
|
||||||
|
$apre['nama_sup'] = ($apre['id_sup'] > 0) ? ($this->db->fetchField("SELECT CONCAT(Nama_Sup,' (',Kode_Sup,')') Nama FROM para_supplier WHERE SupID=?", [$apre['id_sup']]) ?? '') : '';
|
||||||
|
|
||||||
|
// generate report header
|
||||||
|
$apre['periode'] = $apre['tgl_from'] . ($apre['tgl_from'] !== $apre['tgl_to'] ? ' s/d '.$apre['tgl_to'] : '');
|
||||||
|
|
||||||
|
$tsql = ''; $asql = [$apre['id_sup']];
|
||||||
|
if ($this->id_cab > 0) {
|
||||||
|
$tsql .= " AND CabID=?";
|
||||||
|
array_push($asql, $this->id_cab);
|
||||||
|
}
|
||||||
|
|
||||||
|
$n_saldo = (float) $this->db->fetchField("SELECT SUM(Real_Beli) Total FROM inv_beli WHERE Data_Beli=1 AND SupID=?".$tsql." AND Tgl_Beli<?", array_merge($asql,[tgl_sql2str($apre['tgl_from'])])) ?? 0;
|
||||||
|
|
||||||
|
$n_bayar = (float) $this->db->fetchField("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 AND SupID=?".$tsql.") AND Tgl_Bayar<?", array_merge($asql,[tgl_sql2str($apre['tgl_from'])])) ?? 0;
|
||||||
|
$n_saldo -= $n_bayar;
|
||||||
|
|
||||||
|
$apre['Saldo'] = $n_saldo;
|
||||||
|
$apre['query'] = $this->db->runQuery("(SELECT Tgl_Beli,SUM(Real_Beli) Total,0 Bayar FROM inv_beli WHERE Data_Beli=1 AND (Tgl_Beli BETWEEN ? AND ?) AND SupID=?".$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 AND SupID=?".$tsql.") AND (Tgl_Bayar BETWEEN ? AND ?) GROUP BY Tgl_Bayar) ORDER BY Tgl_Beli,Total DESC", array_merge([tgl_sql2str($apre['tgl_from']),tgl_sql2str($apre['tgl_to'])], $asql, $asql, [tgl_sql2str($apre['tgl_from']),tgl_sql2str($apre['tgl_to'])]));
|
||||||
|
return $apre;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function print() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
|
||||||
|
$pre = new PrintHTML($this->app);
|
||||||
|
$pre->add_title([strtoupper($this->reg_name), "MUTASI PEMBELIAN", "Periode : ".$apre['periode']]);
|
||||||
|
|
||||||
|
$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");
|
||||||
|
|
||||||
|
$pre->add_sub_title("Nama Supplier : ".$apre['nama_sup']);
|
||||||
|
|
||||||
|
$pre->show_titles();
|
||||||
|
$pre->show_headers();
|
||||||
|
|
||||||
|
$tot_sub = 0; $tot_bayar = 0;
|
||||||
|
$pre->add_span([ ["Saldo Awal",1,"R,B"],["0",1,"R,B"],["0",1,"R,B"],[$apre['Saldo'],1,"R,B","rupiah"] ]);
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_sub += $row['Total'];
|
||||||
|
$tot_bayar += $row['Bayar'];
|
||||||
|
$apre['Saldo'] += $row['Total'] - $row['Bayar'];
|
||||||
|
$pre->add_row([ $row['Tgl_Beli'], $row['Total'], $row['Bayar'], $apre['Saldo'] ]);
|
||||||
|
}
|
||||||
|
$pre->add_span([ ["Saldo Akhir",1,"R,B"],[$tot_sub,1,"R,B","rupiah"],[$tot_bayar,1,"R,B","rupiah"],[$apre['Saldo'],1,"R,B","rupiah"] ]);
|
||||||
|
|
||||||
|
$pre->add_stamp(1, true);
|
||||||
|
$pre->show();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function excel() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
$xls = new Xlsx($this->app);
|
||||||
|
$xls->set_meta([
|
||||||
|
'title' => "Data Mutasi Pembelian",
|
||||||
|
'desc' => "Export Data Mutasi Pembelian"
|
||||||
|
]);
|
||||||
|
$xls->add_title([ $this->reg_name, "DATA MUTASI PEMBELIAN", "Periode : ".$apre['periode'] ]);
|
||||||
|
|
||||||
|
$xls->add_field("Tanggal", 12, "@date");
|
||||||
|
$xls->add_field("Nota / Bon", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Bayar", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Sisa", 15, "#,##0.00");
|
||||||
|
$xls->add_sheet("".str_replace("s/d","-",$apre['periode']));
|
||||||
|
|
||||||
|
$xls->add_sub_title("Nama Supplier : ".$apre['nama_sup']);
|
||||||
|
|
||||||
|
$xls->show_titles();
|
||||||
|
$xls->show_headers();
|
||||||
|
|
||||||
|
$tot_sub = 0; $tot_bayar = 0;
|
||||||
|
$xls->add_row_bold([ "Saldo Awal", 0, 0, $apre['Saldo'] ]);
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_sub += $row['Total'];
|
||||||
|
$tot_bayar += $row['Bayar'];
|
||||||
|
$apre['Saldo'] += $row['Total'] - $row['Bayar'];
|
||||||
|
$xls->add_row([ $row['Tgl_Beli'], $row['Total'], $row['Bayar'], $apre['Saldo'] ]);
|
||||||
|
}
|
||||||
|
$xls->add_row_bold([ "Saldo Akhir", $tot_sub, $tot_bayar, $apre['Saldo'] ]);
|
||||||
|
|
||||||
|
$xls->add_stamp(1, true);
|
||||||
|
$xls->download("Data Mutasi Pembelian ".str_replace("s/d","-",$apre['periode']).".xlsx");
|
||||||
|
unset($xls);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tcab = $form->option_db("_", "CabID", $this->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," "]);
|
||||||
|
$tfrom = $form->datebox("_", "Tgl_From", tgl_ymd(), true, false);
|
||||||
|
$tto = $form->datebox("_", "Tgl_To", tgl_ymd(), true, false);
|
||||||
|
$ajson['html'] = '
|
||||||
|
<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>';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,201 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Report/Beli/ReturController
|
||||||
|
Description : Laporan Retur Pembelian
|
||||||
|
Created By : Siau Pheng ([email protected]).
|
||||||
|
Created Date : April 12th, 2011.
|
||||||
|
Last Modified : October 2nd, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Report\Beli;
|
||||||
|
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use flight\Session;
|
||||||
|
use Webapp\Data\Xlsx;
|
||||||
|
use Webapp\Printer\PrintHTML;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
|
||||||
|
class ReturController {
|
||||||
|
|
||||||
|
private int $id_cab;
|
||||||
|
private string $reg_name;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->id_cab = Param::Int("CabID", 0);
|
||||||
|
$this->reg_name = $session->get('WEB_APP')['REG_NAME'];
|
||||||
|
}
|
||||||
|
|
||||||
|
private function prepare() {
|
||||||
|
$apre = [
|
||||||
|
'tipe' => Param::Get("Tipe", "R"), // R or D
|
||||||
|
'id_sup' => Param::Int("SupID", 0),
|
||||||
|
'tgl_from' => Param::Get("Tgl_From"),
|
||||||
|
'tgl_to' => Param::Get("Tgl_To"),
|
||||||
|
];
|
||||||
|
|
||||||
|
$apre['nama_sup'] = ($apre['id_sup'] > 0) ? ($this->db->fetchField("SELECT CONCAT(Nama_Sup,' (',Kode_Sup,')') Nama FROM para_supplier WHERE SupID=?", [$apre['id_sup']]) ?? '') : '';
|
||||||
|
|
||||||
|
// generate report header
|
||||||
|
$apre['periode'] = $apre['tgl_from'] . ($apre['tgl_from'] !== $apre['tgl_to'] ? ' s/d '.$apre['tgl_to'] : '');
|
||||||
|
|
||||||
|
$tsql = ''; $asql = [tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to'])];
|
||||||
|
if ($this->id_cab > 0) {
|
||||||
|
$tsql .= " AND CabID=?";
|
||||||
|
array_push($asql, $this->id_cab);
|
||||||
|
}
|
||||||
|
if ($apre['id_sup'] > 0) {
|
||||||
|
$tsql .= " AND SupID=?";
|
||||||
|
array_push($asql, $apre['id_sup']);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($apre['tipe'] === "R") {
|
||||||
|
$apre['query'] = $this->db->runQuery("SELECT B.*,S.Nama_Sup FROM (SELECT SupID,SUM(-Real_Beli) Total_Retur FROM inv_beli WHERE Data_Beli=0 AND (Tgl_Beli BETWEEN ? AND ?)".$tsql." GROUP BY SupID) B LEFT JOIN para_supplier S ON (B.SupID=S.SupID) ORDER BY S.Nama_Sup", $asql);
|
||||||
|
} else {
|
||||||
|
$apre['query'] = $this->db->runQuery("SELECT B.*,S.Nama_Sup,-B.Real_Beli Retur FROM (SELECT * FROM inv_beli WHERE Data_Beli=0 AND (Tgl_Beli BETWEEN ? AND ?)".$tsql.") B LEFT JOIN para_supplier S ON (B.SupID=S.SupID) ORDER BY B.No_Beli", $asql);
|
||||||
|
}
|
||||||
|
return $apre;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function print() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
|
||||||
|
$pre = new PrintHTML($this->app);
|
||||||
|
$pre->add_title([strtoupper($this->reg_name), ($apre['tipe']==="R"?"REKAP":"DETAIL")." RETUR PEMBELIAN", "Periode : ".$apre['periode']]);
|
||||||
|
|
||||||
|
if ($apre['tipe'] === "R") {
|
||||||
|
$pre->add_field("No.",10,"C");
|
||||||
|
$pre->add_field("Nama Supplier",50,"L");
|
||||||
|
$pre->add_field("Total",20,"R","rupiah");
|
||||||
|
|
||||||
|
if ($apre['id_sup'] > 0) $pre->add_sub_title("Nama Supplier : ".$apre['nama_sup']);
|
||||||
|
|
||||||
|
$pre->show_titles();
|
||||||
|
$pre->show_headers();
|
||||||
|
|
||||||
|
$tot_retur = 0; $nomor = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_retur += $row['Total_Retur'];
|
||||||
|
$pre->add_row([ ++$nomor, $row['Nama_Sup'], $row['Total_Retur'] ]);
|
||||||
|
}
|
||||||
|
$pre->add_span([ ["GRAND TOTAL",2,"R,B"],[$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 ($apre['id_sup'] > 0) $pre->add_sub_title("Nama Supplier : ".$apre['nama_sup']);
|
||||||
|
|
||||||
|
$pre->show_titles();
|
||||||
|
$pre->show_headers();
|
||||||
|
|
||||||
|
$tot_retur = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_retur += $row['Retur'];
|
||||||
|
$pre->add_row([ $row['No_Beli'], $row['Tgl_Beli'], $row['Nama_Sup'], $row['Retur'], $row['No_Faktur'] ]);
|
||||||
|
}
|
||||||
|
$pre->add_span([ ["GRAND TOTAL",3,"R,B"],[$tot_retur,1,"R,B","rupiah"],["nbsp;",1,"L"] ]);
|
||||||
|
}
|
||||||
|
$pre->add_stamp(1, true);
|
||||||
|
$pre->show();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function excel() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
$xls = new Xlsx($this->app);
|
||||||
|
$xls->set_meta([
|
||||||
|
'title' => "Data Retur Pembelian",
|
||||||
|
'desc' => "Export Data Retur Pembelian"
|
||||||
|
]);
|
||||||
|
$xls->add_title([ $this->reg_name, "DATA ".($apre['tipe']==="R"?"REKAP":"DETAIL")." RETUR PEMBELIAN", "Periode : ".$apre['periode'] ]);
|
||||||
|
|
||||||
|
if ($apre['tipe'] === "R") {
|
||||||
|
$xls->add_field("No.", 5, "@integer");
|
||||||
|
$xls->add_field("Nama Supplier", 25, "@text");
|
||||||
|
$xls->add_field("Total", 15, "#,##0.00");
|
||||||
|
$xls->add_sheet("".str_replace("s/d","-",$apre['periode']));
|
||||||
|
|
||||||
|
if ($apre['id_sup'] > 0) $xls->add_sub_title("Nama Supplier : ".$apre['nama_sup']);
|
||||||
|
|
||||||
|
$xls->show_titles();
|
||||||
|
$xls->show_headers();
|
||||||
|
|
||||||
|
$tot_retur = 0; $nomor = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_retur += $row['Total_Retur'];
|
||||||
|
$xls->add_row([ ++$nomor, $row['Nama_Sup'], $row['Total_Retur'] ]);
|
||||||
|
}
|
||||||
|
$xls->add_row_bold([ "", "GRAND TOTAL", $tot_retur ]);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
$xls->add_field("No. Nota", 15, "@");
|
||||||
|
$xls->add_field("Tgl. Nota", 12, "@date");
|
||||||
|
$xls->add_field("Nama Supplier", 20, "@text");
|
||||||
|
$xls->add_field("Total", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Catatan", 25, "@text");
|
||||||
|
$xls->add_sheet("".str_replace("s/d","-",$apre['periode']));
|
||||||
|
|
||||||
|
if ($apre['id_sup'] > 0) $xls->add_sub_title("Nama Supplier : ".$apre['nama_sup']);
|
||||||
|
|
||||||
|
$xls->show_titles();
|
||||||
|
$xls->show_headers();
|
||||||
|
|
||||||
|
$tot_retur = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_retur += $row['Retur'];
|
||||||
|
$xls->add_row([ $row['No_Beli'], $row['Tgl_Beli'], $row['Nama_Sup'], $row['Retur'], $row['No_Faktur'] ]);
|
||||||
|
}
|
||||||
|
$xls->add_row_bold([ "", "", "GRAND TOTAL", $tot_retur, "" ]);
|
||||||
|
}
|
||||||
|
$xls->add_stamp(1, true);
|
||||||
|
$xls->download("Data Retur Pembelian ".str_replace("s/d","-",$apre['periode']).".xlsx");
|
||||||
|
unset($xls);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$ttipe = $form->radio("_", "Tipe", "R", true, false, ["R"=>"Rekap","D"=>"Detail"]);
|
||||||
|
$tcab = $form->option_db("_", "CabID", $this->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);
|
||||||
|
$ajson['html'] = '
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="Tipe">Tipe Laporan</label>
|
||||||
|
<div class="col">'.$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>';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,181 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Report/Dana/KeluarController
|
||||||
|
Description : Laporan Pengeluaran Dana
|
||||||
|
Created By : Siau Pheng ([email protected]).
|
||||||
|
Created Date : May 18th, 2012.
|
||||||
|
Last Modified : October 8th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Report\Dana;
|
||||||
|
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use flight\Session;
|
||||||
|
use Webapp\Data\Xlsx;
|
||||||
|
use Webapp\Printer\PrintHTML;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
|
||||||
|
class KeluarController {
|
||||||
|
|
||||||
|
private int $id_cab;
|
||||||
|
private string $reg_name;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->id_cab = Param::Int("CabID", 0);
|
||||||
|
$this->reg_name = $session->get('WEB_APP')['REG_NAME'];
|
||||||
|
}
|
||||||
|
|
||||||
|
private function prepare() {
|
||||||
|
$apre = [
|
||||||
|
'tipe' => Param::Get("Tipe", "R"), // R or D
|
||||||
|
'tgl_from' => Param::Get("Tgl_From"),
|
||||||
|
'tgl_to' => Param::Get("Tgl_To"),
|
||||||
|
];
|
||||||
|
|
||||||
|
// generate report header
|
||||||
|
$apre['periode'] = $apre['tgl_from'] . ($apre['tgl_from'] !== $apre['tgl_to'] ? ' s/d '.$apre['tgl_to'] : '');
|
||||||
|
|
||||||
|
$tsql = ''; $asql = [tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to'])];
|
||||||
|
if ($this->id_cab > 0) {
|
||||||
|
$tsql .= " AND CabID=?";
|
||||||
|
array_push($asql, $this->id_cab);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($apre['tipe'] === "R") {
|
||||||
|
$apre['query'] = $this->db->runQuery("SELECT Tgl_Bayar,SUM(Total_Bayar) Total_Bayar,'' Tipe_Bayar FROM inv_beli_lunas WHERE (Tgl_Bayar BETWEEN ? AND ?)".$tsql." GROUP BY Tgl_Bayar ORDER BY Tgl_Bayar", $asql);
|
||||||
|
} else {
|
||||||
|
$apre['query'] = $this->db->runQuery("SELECT L.*,S.Nama_Sup,'' Tipe_Bayar FROM (SELECT * FROM inv_beli_lunas WHERE (Tgl_Bayar BETWEEN ? AND ?)".$tsql.") L LEFT JOIN inv_beli B ON (B.No_Beli=L.No_Beli) LEFT JOIN para_supplier S ON (S.SupID=B.SupID) ORDER BY L.Tgl_Bayar", $asql);
|
||||||
|
}
|
||||||
|
return $apre;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function print() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
|
||||||
|
$pre = new PrintHTML($this->app);
|
||||||
|
$pre->add_title([strtoupper($this->reg_name), ($apre['tipe']==="R"?"REKAP":"DETAIL")." PENGELUARAN", "Periode : ".$apre['periode']]);
|
||||||
|
|
||||||
|
if ($apre['tipe'] === "R") {
|
||||||
|
$pre->add_field("No.",10,"C");
|
||||||
|
$pre->add_field("Tanggal",30,"C", "tgl_sql2str");
|
||||||
|
$pre->add_field("Tipe / Giro",20,"L");
|
||||||
|
$pre->add_field("Jumlah",20,"R","rupiah");
|
||||||
|
|
||||||
|
$pre->show_titles();
|
||||||
|
$pre->show_headers();
|
||||||
|
|
||||||
|
$tot_bayar = 0; $nomor = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_bayar += $row['Total_Bayar'];
|
||||||
|
$pre->add_row([ ++$nomor, $row['Tgl_Bayar'], $row['Tipe_Bayar'], $row['Total_Bayar'] ]);
|
||||||
|
}
|
||||||
|
$pre->add_span([ ["GRAND TOTAL",3,"R,B"],[$tot_bayar,1,"R,B","rupiah"] ]);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
$pre->add_field("Tanggal",30,"C", "tgl_sql2str");
|
||||||
|
$pre->add_field("Bayar Kepada",50,"L");
|
||||||
|
$pre->add_field("Tipe / Giro",20,"L");
|
||||||
|
$pre->add_field("Jumlah",30,"R","rupiah");
|
||||||
|
|
||||||
|
$pre->show_titles();
|
||||||
|
$pre->show_headers();
|
||||||
|
|
||||||
|
$tot_bayar = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_bayar += $row['Total_Bayar'];
|
||||||
|
$pre->add_row([ $row['Tgl_Bayar'], $row['No_Beli']." - ".$row['Nama_Sup'], $row['Tipe_Bayar'], $row['Total_Bayar'] ]);
|
||||||
|
}
|
||||||
|
$pre->add_span([ ["GRAND TOTAL",3,"R,B"],[$tot_bayar,1,"R,B","rupiah"] ]);
|
||||||
|
}
|
||||||
|
$pre->add_stamp(1, true);
|
||||||
|
$pre->show();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function excel() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
$xls = new Xlsx($this->app);
|
||||||
|
$xls->set_meta([
|
||||||
|
'title' => "Data Penerimaan Dana",
|
||||||
|
'desc' => "Export Data Penerimaan Dana"
|
||||||
|
]);
|
||||||
|
$xls->add_title([ $this->reg_name, "DATA ".($apre['tipe']==="R"?"REKAP":"DETAIL")." PENGELUARAN", "Periode : ".$apre['periode'] ]);
|
||||||
|
|
||||||
|
if ($apre['tipe'] === "R") {
|
||||||
|
$xls->add_field("No.", 5, "@integer");
|
||||||
|
$xls->add_field("Tanggal", 12, "@date");
|
||||||
|
$xls->add_field("Tipe / Giro", 20, "@text");
|
||||||
|
$xls->add_field("Jumlah", 15, "#,##0.00");
|
||||||
|
$xls->add_sheet("".str_replace("s/d","-",$apre['periode']));
|
||||||
|
|
||||||
|
$xls->show_titles();
|
||||||
|
$xls->show_headers();
|
||||||
|
|
||||||
|
$tot_bayar = 0; $nomor = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_bayar += $row['Total_Bayar'];
|
||||||
|
$xls->add_row([ ++$nomor, $row['Tgl_Bayar'], $row['Tipe_Bayar'], $row['Total_Bayar'] ]);
|
||||||
|
}
|
||||||
|
$xls->add_row_bold([ "", "", "GRAND TOTAL", $tot_bayar ]);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
$xls->add_field("Tanggal", 12, "@date");
|
||||||
|
$xls->add_field("Bayar Kepada", 25, "@text");
|
||||||
|
$xls->add_field("Tipe / Giro", 20, "@text");
|
||||||
|
$xls->add_field("Jumlah", 15, "#,##0.00");
|
||||||
|
$xls->add_sheet("".str_replace("s/d","-",$apre['periode']));
|
||||||
|
|
||||||
|
$xls->show_titles();
|
||||||
|
$xls->show_headers();
|
||||||
|
|
||||||
|
$tot_bayar = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_bayar += $row['Total_Bayar'];
|
||||||
|
$xls->add_row([ $row['Tgl_Bayar'], $row['No_Beli']." - ".$row['Nama_Sup'], $row['Tipe_Bayar'], $row['Total_Bayar'] ]);
|
||||||
|
}
|
||||||
|
$xls->add_row_bold([ "", "", "GRAND TOTAL", $tot_bayar ]);
|
||||||
|
}
|
||||||
|
$xls->add_stamp(1, true);
|
||||||
|
$xls->download("Data Pengeluaran ".str_replace("s/d","-",$apre['periode']).".xlsx");
|
||||||
|
unset($xls);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$ttipe = $form->radio("_", "Tipe", "R", true, false, ["R"=>"Rekap","D"=>"Detail"]);
|
||||||
|
$tcab = $form->option_db("_", "CabID", $this->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);
|
||||||
|
$ajson['html'] = '
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="Tipe">Tipe Laporan</label>
|
||||||
|
<div class="col">'.$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>';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,181 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Report/Dana/MasukController
|
||||||
|
Description : Laporan Penerimaan Dana
|
||||||
|
Created By : Siau Pheng ([email protected]).
|
||||||
|
Created Date : May 18th, 2012.
|
||||||
|
Last Modified : October 10th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Report\Dana;
|
||||||
|
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use flight\Session;
|
||||||
|
use Webapp\Data\Xlsx;
|
||||||
|
use Webapp\Printer\PrintHTML;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
|
||||||
|
class MasukController {
|
||||||
|
|
||||||
|
private int $id_cab;
|
||||||
|
private string $reg_name;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->id_cab = Param::Int("CabID", 0);
|
||||||
|
$this->reg_name = $session->get('WEB_APP')['REG_NAME'];
|
||||||
|
}
|
||||||
|
|
||||||
|
private function prepare() {
|
||||||
|
$apre = [
|
||||||
|
'tipe' => Param::Get("Tipe", "R"), // R or D
|
||||||
|
'tgl_from' => Param::Get("Tgl_From"),
|
||||||
|
'tgl_to' => Param::Get("Tgl_To"),
|
||||||
|
];
|
||||||
|
|
||||||
|
// generate report header
|
||||||
|
$apre['periode'] = $apre['tgl_from'] . ($apre['tgl_from'] !== $apre['tgl_to'] ? ' s/d '.$apre['tgl_to'] : '');
|
||||||
|
|
||||||
|
$tsql = ''; $asql = [tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to'])];
|
||||||
|
if ($this->id_cab > 0) {
|
||||||
|
$tsql .= " AND CabID=?";
|
||||||
|
array_push($asql, $this->id_cab);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($apre['tipe'] === "R") {
|
||||||
|
$apre['query'] = $this->db->runQuery("SELECT Tgl_Bayar,SUM(Total_Bayar) Total_Bayar,'' Tipe_Bayar FROM inv_jual_lunas WHERE (Tgl_Bayar BETWEEN ? AND ?)".$tsql." GROUP BY Tgl_Bayar ORDER BY Tgl_Bayar", $asql);
|
||||||
|
} else {
|
||||||
|
$apre['query'] = $this->db->runQuery("SELECT L.*,U.Nama_Member,'' Tipe_Bayar FROM (SELECT * FROM inv_jual_lunas WHERE (Tgl_Bayar BETWEEN ? AND ?)".$tsql.") L LEFT JOIN para_member U ON (U.MemberID=L.MemberID) ORDER BY L.Tgl_Bayar", $asql);
|
||||||
|
}
|
||||||
|
return $apre;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function print() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
|
||||||
|
$pre = new PrintHTML($this->app);
|
||||||
|
$pre->add_title([strtoupper($this->reg_name), ($apre['tipe']==="R"?"REKAP":"DETAIL")." PENERIMAAN", "Periode : ".$apre['periode']]);
|
||||||
|
|
||||||
|
if ($apre['tipe'] === "R") {
|
||||||
|
$pre->add_field("No.",10,"C");
|
||||||
|
$pre->add_field("Tanggal",30,"C", "tgl_sql2str");
|
||||||
|
$pre->add_field("Tipe / Giro",20,"L");
|
||||||
|
$pre->add_field("Jumlah",20,"R","rupiah");
|
||||||
|
|
||||||
|
$pre->show_titles();
|
||||||
|
$pre->show_headers();
|
||||||
|
|
||||||
|
$tot_bayar = 0; $nomor = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_bayar += $row['Total_Bayar'];
|
||||||
|
$pre->add_row([ ++$nomor, $row['Tgl_Bayar'], $row['Tipe_Bayar'], $row['Total_Bayar'] ]);
|
||||||
|
}
|
||||||
|
$pre->add_span([ ["GRAND TOTAL",3,"R,B"],[$tot_bayar,1,"R,B","rupiah"] ]);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
$pre->add_field("Tanggal",30,"C", "tgl_sql2str");
|
||||||
|
$pre->add_field("Terima Dari",50,"L");
|
||||||
|
$pre->add_field("Tipe / Giro",20,"L");
|
||||||
|
$pre->add_field("Jumlah",30,"R","rupiah");
|
||||||
|
|
||||||
|
$pre->show_titles();
|
||||||
|
$pre->show_headers();
|
||||||
|
|
||||||
|
$tot_bayar = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_bayar += $row['Total_Bayar'];
|
||||||
|
$pre->add_row([ $row['Tgl_Bayar'], $row['No_Jual']." - ".$row['Nama_Member'], $row['Tipe_Bayar'], $row['Total_Bayar'] ]);
|
||||||
|
}
|
||||||
|
$pre->add_span([ ["GRAND TOTAL",3,"R,B"],[$tot_bayar,1,"R,B","rupiah"] ]);
|
||||||
|
}
|
||||||
|
$pre->add_stamp(1, true);
|
||||||
|
$pre->show();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function excel() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
$xls = new Xlsx($this->app);
|
||||||
|
$xls->set_meta([
|
||||||
|
'title' => "Data Pengeluaran Dana",
|
||||||
|
'desc' => "Export Data Pengeluaran Dana"
|
||||||
|
]);
|
||||||
|
$xls->add_title([ $this->reg_name, "DATA ".($apre['tipe']==="R"?"REKAP":"DETAIL")." PENERIMAAN", "Periode : ".$apre['periode'] ]);
|
||||||
|
|
||||||
|
if ($apre['tipe'] === "R") {
|
||||||
|
$xls->add_field("No.", 5, "@integer");
|
||||||
|
$xls->add_field("Tanggal", 12, "@date");
|
||||||
|
$xls->add_field("Tipe / Giro", 20, "@text");
|
||||||
|
$xls->add_field("Jumlah", 15, "#,##0.00");
|
||||||
|
$xls->add_sheet("".str_replace("s/d","-",$apre['periode']));
|
||||||
|
|
||||||
|
$xls->show_titles();
|
||||||
|
$xls->show_headers();
|
||||||
|
|
||||||
|
$tot_bayar = 0; $nomor = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_bayar += $row['Total_Bayar'];
|
||||||
|
$xls->add_row([ ++$nomor, $row['Tgl_Bayar'], $row['Tipe_Bayar'], $row['Total_Bayar'] ]);
|
||||||
|
}
|
||||||
|
$xls->add_row_bold([ "", "", "GRAND TOTAL", $tot_bayar ]);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
$xls->add_field("Tanggal", 12, "@date");
|
||||||
|
$xls->add_field("Terima Dari", 25, "@text");
|
||||||
|
$xls->add_field("Tipe / Giro", 20, "@text");
|
||||||
|
$xls->add_field("Jumlah", 15, "#,##0.00");
|
||||||
|
$xls->add_sheet("".str_replace("s/d","-",$apre['periode']));
|
||||||
|
|
||||||
|
$xls->show_titles();
|
||||||
|
$xls->show_headers();
|
||||||
|
|
||||||
|
$tot_bayar = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_bayar += $row['Total_Bayar'];
|
||||||
|
$xls->add_row([ $row['Tgl_Bayar'], $row['No_Jual']." - ".$row['Nama_Member'], $row['Tipe_Bayar'], $row['Total_Bayar'] ]);
|
||||||
|
}
|
||||||
|
$xls->add_row_bold([ "", "", "GRAND TOTAL", $tot_bayar ]);
|
||||||
|
}
|
||||||
|
$xls->add_stamp(1, true);
|
||||||
|
$xls->download("Data Penerimaan ".str_replace("s/d","-",$apre['periode']).".xlsx");
|
||||||
|
unset($xls);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$ttipe = $form->radio("_", "Tipe", "R", true, false, ["R"=>"Rekap","D"=>"Detail"]);
|
||||||
|
$tcab = $form->option_db("_", "CabID", $this->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);
|
||||||
|
$ajson['html'] = '
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="Tipe">Tipe Laporan</label>
|
||||||
|
<div class="col">'.$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>';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,280 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Report/Dana/PosController
|
||||||
|
Description : Laporan Penerimaan Dana POS / Kasir
|
||||||
|
Created By : Siau Pheng ([email protected]).
|
||||||
|
Created Date : September 8th, 2012.
|
||||||
|
Last Modified : October 9th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Report\Dana;
|
||||||
|
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use flight\Session;
|
||||||
|
use Webapp\Data\Xlsx;
|
||||||
|
use Webapp\Printer\PrintHTML;
|
||||||
|
use Webapp\Printer\PrintPOS;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
|
||||||
|
class PosController {
|
||||||
|
|
||||||
|
private array $app_inv;
|
||||||
|
private string $reg_name;
|
||||||
|
private int $id_cab;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->app_inv = (array) $session->get('APP_INV');
|
||||||
|
$this->reg_name = $session->get('WEB_APP')['REG_NAME'];
|
||||||
|
$this->id_cab = Param::Int("CabID", $session->get('APP_INV')['CABANGID']);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function prepare(bool $is_pos = false) {
|
||||||
|
$apre = [
|
||||||
|
'tipe' => Param::Get("Tipe", "R"), // R or D
|
||||||
|
'id_kasir' => Param::Int("KasirID", 0),
|
||||||
|
'tgl_from' => Param::Get("Tgl_From"),
|
||||||
|
'tgl_to' => Param::Get("Tgl_To"),
|
||||||
|
];
|
||||||
|
|
||||||
|
// generate report header
|
||||||
|
$apre['periode'] = $apre['tgl_from'] . ($apre['tgl_from'] !== $apre['tgl_to'] ? ' s/d '.$apre['tgl_to'] : '');
|
||||||
|
|
||||||
|
$tsql = ''; $asql = [tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to'])];
|
||||||
|
if ($this->id_cab > 0) {
|
||||||
|
$tsql .= " AND CabID=?";
|
||||||
|
array_push($asql, $this->id_cab);
|
||||||
|
}
|
||||||
|
if ($apre['id_kasir'] > 0) {
|
||||||
|
$tsql .= " AND UserID=?";
|
||||||
|
array_push($asql, $apre['id_kasir']);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($is_pos === true) {
|
||||||
|
$apre['kasir'] = $this->db->fetchRow("SELECT * FROM app_operator WHERE UserID=?", [$apre['id_kasir']]);
|
||||||
|
$apre['query'] = $this->db->runQuery("SELECT J.KartuID,IF(J.KartuID=0,'Cash / Uang Tunai',K.Nama_Kartu) Kartu,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_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 ? AND ?)".$tsql." GROUP BY KartuID ORDER BY KartuID) UNION ALL (SELECT 'P' Kode,KartuID,SUM(Harga_Jual) Total_Jual,SUM(Harga_Jual-Total_Kartu) Total_Cash,SUM(Total_Kartu) Total_Kartu,0 Total_Diskon,0 Total_Potong FROM ppob_tx WHERE (Tgl_TX BETWEEN ? AND ?) AND Status=4".$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", array_merge($asql, $asql));
|
||||||
|
return $apre;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($apre['tipe'] === "R") {
|
||||||
|
$apre['query'] = $this->db->runQuery("SELECT O.UserID,O.Nama Nama_Kasir,SUM(IF(J.Kode='J',J.Total_Jual,0)) Total_Jual,SUM(IF(J.Kode='P',J.Total_Jual,0)) Total_Pulsa,SUM(IF(J.KartuID=0,J.Total_Jual-J.Total_Kartu-J.Total_Potong,0)) 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 ? AND ?)".$tsql." GROUP BY UserID,KartuID ORDER BY UserID,KartuID) UNION ALL (SELECT 'P' Kode,UserID,KartuID,SUM(Harga_Jual) Total_Jual,SUM(Total_Kartu) Total_Kartu,0 Total_Potong FROM ppob_tx WHERE (Tgl_TX BETWEEN ? AND ?) AND Status=4".$tsql." GROUP BY UserID,KartuID ORDER BY UserID,KartuID)) J LEFT JOIN app_operator O ON (J.UserID=O.UserID) GROUP BY J.UserID", array_merge($asql, $asql));
|
||||||
|
} else {
|
||||||
|
$apre['query'] = $this->db->runQuery("SELECT J.*,O.Nama Nama_Kasir FROM (SELECT *,Total_Jual-Total_Diskon Total_Jual2,Total_Jual-Total_Kartu-Total_Diskon-Total_Potong Total_Cash FROM inv_jual WHERE (Tgl_Jual BETWEEN ? AND ?)".$tsql.") J LEFT JOIN app_operator O ON (J.UserID=O.UserID) ORDER BY J.No_Jual", $asql);
|
||||||
|
}
|
||||||
|
return $apre;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function pos() {
|
||||||
|
$apre = $this->prepare(true);
|
||||||
|
|
||||||
|
$tot_jual = 0; $tot_pulsa = 0; $tot_diskon = 0; $tot_potong = 0; $tot_dana = 0; $adana = [["Cash / Uang Tunai",0]];
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$adana[0][1] += $row['Total_Cash'];
|
||||||
|
if ($row['KartuID'] > 0) $adana[$row['KartuID']] = [$row['Kartu'], $row['Total_Kartu']];
|
||||||
|
$tot_jual += $row['Total_Jual'];
|
||||||
|
$tot_pulsa += $row['Total_Pulsa'];
|
||||||
|
$tot_diskon += $row['Total_Diskon'];
|
||||||
|
$tot_potong += $row['Total_Potong'];
|
||||||
|
}
|
||||||
|
$tot_dana = $tot_jual + $tot_pulsa - $tot_potong - $tot_diskon;
|
||||||
|
|
||||||
|
$pre = new PrintPOS($this->app);
|
||||||
|
$pre->set_fontsize(2);//thermal
|
||||||
|
$pre->set_header_logo("logo-nota.png");//thermal
|
||||||
|
if ($this->app_inv['PRINT_OPENCD'] === 1) $pre->set_opendrawer();
|
||||||
|
if ($this->app_inv['PRINT_AUTOCUT'] === 1) $pre->set_cutpaper();
|
||||||
|
$pre->add_empty();
|
||||||
|
|
||||||
|
$pre->addc("REKAP PENERIMAAN KASIR / POS");
|
||||||
|
$pre->addc("Periode : ".$apre['periode']);
|
||||||
|
$pre->add_empty();
|
||||||
|
$pre->add("Username : ".$apre['kasir']['Username']);
|
||||||
|
$pre->add("Kasir : ".$apre['kasir']['Nama']);
|
||||||
|
$pre->add_empty();
|
||||||
|
$pre->add(["Jumlah Penjualan Rp.",24], [rupiah($tot_jual),16,"R"]);
|
||||||
|
$pre->add(["Jumlah Pulsa & PPOB Rp.",24], [rupiah($tot_pulsa),16,"R"]);
|
||||||
|
$pre->add(["Jumlah Diskon Rp.",24], [rupiah($tot_diskon),16,"R"]);
|
||||||
|
if ($tot_potong > 0) $pre->add(["Jumlah Promo Rp.",24], [rupiah($tot_potong),16,"R"]);
|
||||||
|
$pre->add_line("-");
|
||||||
|
if (count($adana) > 1) {
|
||||||
|
foreach ($adana as $_val) $pre->add([$_val[0],21,"L"], ["Rp.",3], [rupiah($_val[1]),16,"R"]);
|
||||||
|
$pre->add_line("-");
|
||||||
|
}
|
||||||
|
$pre->add(["TOTAL PENERIMAAN Rp.",24], [rupiah($tot_dana),16,"R"]);
|
||||||
|
$pre->add_line("=");
|
||||||
|
$pre->add_stamp(1, false);
|
||||||
|
$pre->add_empty($this->app_inv['PRINT_ROW']);
|
||||||
|
$pre->show();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function print() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
|
||||||
|
$pre = new PrintHTML($this->app);
|
||||||
|
$pre->add_title([strtoupper($this->reg_name), ($apre['tipe']==="R"?"REKAP":"DETAIL")." PENERIMAAN KASIR / POS", "Periode : ".$apre['periode']]);
|
||||||
|
|
||||||
|
if ($apre['tipe'] === "R") {
|
||||||
|
$pre->add_field("No.",10,"C");
|
||||||
|
$pre->add_field("Nama Kasir",20,"L");
|
||||||
|
$pre->add_field("Penjualan",20,"R","rupiah");
|
||||||
|
$pre->add_field("Pulsa & PPOB",20,"R","rupiah");
|
||||||
|
$pre->add_field("Promo",20,"R","rupiah");
|
||||||
|
$pre->add_field("Tunai / Cash",20,"R","rupiah");
|
||||||
|
$pre->add_field("Non Tunai",20,"R","rupiah");
|
||||||
|
|
||||||
|
$pre->show_titles();
|
||||||
|
$pre->show_headers();
|
||||||
|
|
||||||
|
$tot_jual = 0; $tot_pulsa = 0; $tot_potong = 0; $tot_cash = 0; $tot_kartu = 0; $nomor = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_jual += $row['Total_Jual'];
|
||||||
|
$tot_pulsa += $row['Total_Pulsa'];
|
||||||
|
$tot_potong += $row['Total_Potong'];
|
||||||
|
$tot_cash += $row['Total_Cash'];
|
||||||
|
$tot_kartu += $row['Total_Kartu'];
|
||||||
|
$pre->add_row([ ++$nomor, $row['Nama_Kasir'], $row['Total_Jual'], $row['Total_Pulsa'], $row['Total_Potong'], $row['Total_Cash'], $row['Total_Kartu'] ]);
|
||||||
|
}
|
||||||
|
$pre->add_span([ ["GRAND TOTAL",2,"R,B"],[$tot_jual,1,"R,B","rupiah"],[$tot_pulsa,1,"R,B","rupiah"],[$tot_potong,1,"R,B","rupiah"],[$tot_cash,1,"R,B","rupiah"],[$tot_kartu,1,"R,B","rupiah"] ]);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
$pre->add_field("No. Nota",30,"C");
|
||||||
|
$pre->add_field("Tanggal",30,"C", "tgl_sql2str");
|
||||||
|
$pre->add_field("Penjualan",30,"R","rupiah");
|
||||||
|
$pre->add_field("Promo",30,"R","rupiah");
|
||||||
|
$pre->add_field("Tunai / Cash",30,"R","rupiah");
|
||||||
|
$pre->add_field("Non Tunai",30,"R","rupiah");
|
||||||
|
$pre->add_field("Kasir",20,"L");
|
||||||
|
|
||||||
|
$pre->show_titles();
|
||||||
|
$pre->show_headers();
|
||||||
|
|
||||||
|
$tot_jual = 0; $tot_cash = 0; $tot_kartu = 0; $tot_potong = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_jual += $row['Total_Jual'];
|
||||||
|
$tot_cash += $row['Total_Cash'];
|
||||||
|
$tot_kartu += $row['Total_Kartu'];
|
||||||
|
$tot_potong += $row['Total_Potong'];
|
||||||
|
$pre->add_row([ $row['No_Jual'], $row['Tgl_Jual'], $row['Total_Jual2'], $row['Total_Potong'], $row['Total_Cash'], $row['Total_Kartu'], $row['Nama_Kasir'] ]);
|
||||||
|
}
|
||||||
|
$pre->add_span([ ["GRAND TOTAL",2,"R,B"],[$tot_jual,1,"R,B","rupiah"],[$tot_potong,1,"R,B","rupiah"],[$tot_cash,1,"R,B","rupiah"],[$tot_kartu,1,"R,B","rupiah"] ]);
|
||||||
|
}
|
||||||
|
$pre->add_stamp(1, true);
|
||||||
|
$pre->show();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function excel() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
$xls = new Xlsx($this->app);
|
||||||
|
$xls->set_meta([
|
||||||
|
'title' => "Data Penerimaan POS / Kasir",
|
||||||
|
'desc' => "Export Data Penerimaan POS / Kasir"
|
||||||
|
]);
|
||||||
|
$xls->add_title([ $this->reg_name, "DATA ".($apre['tipe']==="R"?"REKAP":"DETAIL")." PENERIMAAN POS / KASIR", "Periode : ".$apre['periode'] ]);
|
||||||
|
|
||||||
|
if ($apre['tipe'] === "R") {
|
||||||
|
$xls->add_field("No.", 5, "@integer");
|
||||||
|
$xls->add_field("Nama Kasir", 20, "@text");
|
||||||
|
$xls->add_field("Penjualan", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Pulsa & PPOB", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Promo", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Tunai", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Non Tunai", 15, "#,##0.00");
|
||||||
|
$xls->add_sheet("".str_replace("s/d","-",$apre['periode']));
|
||||||
|
|
||||||
|
$xls->show_titles();
|
||||||
|
$xls->show_headers();
|
||||||
|
|
||||||
|
$tot_jual = 0; $tot_pulsa = 0; $tot_potong = 0; $tot_cash = 0; $tot_kartu = 0; $nomor = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_jual += $row['Total_Jual'];
|
||||||
|
$tot_pulsa += $row['Total_Pulsa'];
|
||||||
|
$tot_potong += $row['Total_Potong'];
|
||||||
|
$tot_cash += $row['Total_Cash'];
|
||||||
|
$tot_kartu += $row['Total_Kartu'];
|
||||||
|
$xls->add_row([ ++$nomor, $row['Nama_Kasir'], $row['Total_Jual'], $row['Total_Pulsa'], $row['Total_Potong'], $row['Total_Cash'], $row['Total_Kartu'] ]);
|
||||||
|
}
|
||||||
|
$xls->add_row_bold([ "", "GRAND TOTAL", $tot_jual, $tot_pulsa, $tot_potong, $tot_cash, $tot_kartu ]);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
$xls->add_field("No. Nota", 12, "@text");
|
||||||
|
$xls->add_field("Tanggal", 12, "@date");
|
||||||
|
$xls->add_field("Penjualan", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Promo", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Tunai / Cash", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Non Tunai", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Kasir", 20, "@text");
|
||||||
|
$xls->add_sheet("".str_replace("s/d","-",$apre['periode']));
|
||||||
|
|
||||||
|
$xls->show_titles();
|
||||||
|
$xls->show_headers();
|
||||||
|
|
||||||
|
$tot_jual = 0; $tot_cash = 0; $tot_kartu = 0; $tot_potong = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_jual += $row['Total_Jual'];
|
||||||
|
$tot_cash += $row['Total_Cash'];
|
||||||
|
$tot_kartu += $row['Total_Kartu'];
|
||||||
|
$tot_potong += $row['Total_Potong'];
|
||||||
|
$xls->add_row([ $row['No_Jual'], $row['Tgl_Jual'], $row['Total_Jual2'], $row['Total_Potong'], $row['Total_Cash'], $row['Total_Kartu'], $row['Nama_Kasir'] ]);
|
||||||
|
}
|
||||||
|
$xls->add_row_bold([ "", "GRAND TOTAL", $tot_jual, $tot_potong, $tot_cash, $tot_kartu, "" ]);
|
||||||
|
}
|
||||||
|
$xls->add_stamp(1, true);
|
||||||
|
$xls->download("Data Penerimaan POS ".str_replace("s/d","-",$apre['periode']).".xlsx");
|
||||||
|
unset($xls);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
if ($this->app->user()->is_level(1)) {
|
||||||
|
$this->id_cab = 0;
|
||||||
|
$id_kasir = 0;
|
||||||
|
$tsql1 = '';
|
||||||
|
$tsql2 = ' AND Level>="'.$this->app->user()->level().'"';
|
||||||
|
if ($this->app->user()->id() > 1) $tsql2 .= ' AND UserID>1';
|
||||||
|
} else {
|
||||||
|
$id_kasir = $this->app->user()->id();
|
||||||
|
$tsql1 = ' AND CabID="'.$this->id_cab.'"';
|
||||||
|
$tsql2 = ' AND UserID="'.$this->app->user()->id().'"';
|
||||||
|
}
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$ttipe = $form->radio("_", "Tipe", "R", true, false, ["R"=>"Rekap","D"=>"Detail"]);
|
||||||
|
$tcab = $form->option_db("_", "CabID", $this->id_cab, true, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1".$tsql1." ORDER BY CabID", [0,"SEMUA CABANG"]);
|
||||||
|
$tkasir = $form->option_db("_", "KasirID", $id_kasir, true, false, "app_operator", ["UserID","Nama"], "Aktif=1".$tsql2." ORDER BY Username", [0,"SEMUA KASIR"]);
|
||||||
|
$tfrom = $form->datebox("_", "Tgl_From", tgl_ymd(), true, false);
|
||||||
|
$tto = $form->datebox("_", "Tgl_To", tgl_ymd(), true, false);
|
||||||
|
$ajson['html'] = '
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="Tipe">Tipe Laporan</label>
|
||||||
|
<div class="col">'.$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 Kasir</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-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>';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,192 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Report/Gel/BulanneracaController
|
||||||
|
Description : Laporan Neraca Bulanan
|
||||||
|
Created By : Siau Pheng ([email protected]).
|
||||||
|
Created Date : July 8th, 2008.
|
||||||
|
Last Modified : October 24th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Report\Gel;
|
||||||
|
|
||||||
|
use App\Utils\Gel;
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use flight\Session;
|
||||||
|
use Webapp\Data\Xlsx;
|
||||||
|
use Webapp\Printer\PrintHTML;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
|
||||||
|
class BulanneracaController {
|
||||||
|
|
||||||
|
private array $app_gel;
|
||||||
|
private string $reg_name;
|
||||||
|
private Gel $gel;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->app_gel = (array) $session->get('APP_GEL');
|
||||||
|
$this->reg_name = $session->get('WEB_APP')['REG_NAME'];
|
||||||
|
$this->gel = new Gel($app);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function prepare() {
|
||||||
|
$apre = [
|
||||||
|
'tipe' => Param::Int("Tipe"), // 1: rekap, 2: bulanan
|
||||||
|
'bulan' => Param::Int("Bulan"),
|
||||||
|
'tahun' => Param::Int("Tahun"),
|
||||||
|
'level' => Param::Int("Level"),
|
||||||
|
];
|
||||||
|
$tgl_akhir = tgl_akhbln("01-".isi_nol($apre['bulan'],2)."-".(string) $apre['tahun']);
|
||||||
|
|
||||||
|
// generate report header
|
||||||
|
$apre['periode'] = '01-'.($apre['tipe'] === 2 ? isi_nol($apre['bulan'],2) : '01').'-'.(string) $apre['tahun'].' s/d '.$tgl_akhir;
|
||||||
|
|
||||||
|
$apre['data'] = $this->gel->Saldo($tgl_akhir, $apre['tipe'], $apre['level']);
|
||||||
|
return $apre;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function print() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
|
||||||
|
$pre = new PrintHTML($this->app);
|
||||||
|
$pre->add_title([strtoupper($this->reg_name), "NERACA", "Periode : ".$apre['periode']]);
|
||||||
|
|
||||||
|
$pre->add_field("Keterangan",150,"L");
|
||||||
|
for ($i=0; $i<$apre['level']; $i++) {
|
||||||
|
$pre->add_field("Jumlah ".(string) $i,50,"R","rupiah");
|
||||||
|
}
|
||||||
|
|
||||||
|
$pre->show_titles();
|
||||||
|
$pre->show_headers(true);
|
||||||
|
|
||||||
|
$tot_aktiva = 0; $strpad = " ";
|
||||||
|
$pre->add_span([ ["A. AKTIVA",($apre['level']+1),"L,B"] ]);
|
||||||
|
foreach ($apre['data'] as $row) {
|
||||||
|
if ($row['Grup_RekID'] === 1 && !($row['Mode'] === "D" && $row['Jumlah'] === 0) && $row['Level'] > 1) {
|
||||||
|
$njum = $row['Jumlah'];
|
||||||
|
$temp_array = [str_repeat($strpad, ($row['Level']-1))." ".$row['Nama_Rek']];
|
||||||
|
for ($i=($apre['level']+1); $i>1; $i--) {
|
||||||
|
$temp_array[] = ($row['Level'] === $i) ? $njum : "";
|
||||||
|
}
|
||||||
|
$pre->add_row($temp_array);
|
||||||
|
if ($row['Level'] === 2) $tot_aktiva += $njum;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$pre->add_span([ ["JUMLAH AKTIVA",$apre['level'],"L,B"],[$tot_aktiva,1,"R,B","rupiah"] ]);
|
||||||
|
|
||||||
|
$pre->add_row([ "" ]);
|
||||||
|
$pre->add_span([ ["B. PASIVA",($apre['level']+1),"L,B"] ]);
|
||||||
|
$tot_pasiva = 0;
|
||||||
|
foreach ($apre['data'] as $row) {
|
||||||
|
if (($row['Grup_RekID'] === 2 || $row['Grup_RekID'] === 3) && !($row['Mode'] === "D" && $row['Jumlah'] === 0)) {
|
||||||
|
$njum = $row['Jumlah'] * -1;
|
||||||
|
$temp_array = [str_repeat($strpad, $row['Level'])." ".$row['Nama_Rek']];
|
||||||
|
for ($i=$apre['level']; $i>0; $i--) {
|
||||||
|
$temp_array[] = ($row['Level'] === $i) ? $njum : "";
|
||||||
|
}
|
||||||
|
$pre->add_row($temp_array);
|
||||||
|
if ($row['Level'] === 1) $tot_pasiva += $njum;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$pre->add_span([ ["JUMLAH PASIVA",$apre['level'],"L,B"], [$tot_pasiva,1,"R,B","rupiah"] ]);
|
||||||
|
|
||||||
|
$pre->add_stamp(1, true);
|
||||||
|
$pre->show();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function excel() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
$xls = new Xlsx($this->app);
|
||||||
|
$xls->set_meta([
|
||||||
|
'title' => "Data Neraca",
|
||||||
|
'desc' => "Export Data Neraca"
|
||||||
|
]);
|
||||||
|
$xls->add_title([ $this->reg_name, "NERACA", "Periode : ".$apre['periode'] ]);
|
||||||
|
|
||||||
|
$xls->add_field("Keterangan", 50, "@text");
|
||||||
|
for ($i=0; $i<$apre['level']; $i++) {
|
||||||
|
$xls->add_field("Jumlah ".(string) $i, 20, "#,##0.00");
|
||||||
|
}
|
||||||
|
$xls->add_sheet("".str_replace("s/d","-",$apre['periode']));
|
||||||
|
|
||||||
|
$xls->show_titles();
|
||||||
|
$xls->show_headers(true);
|
||||||
|
|
||||||
|
$tot_aktiva = 0; $strpad = " ";
|
||||||
|
$xls->add_row_bold([ "A. AKTIVA" ]);
|
||||||
|
foreach ($apre['data'] as $row) {
|
||||||
|
if ($row['Grup_RekID'] === 1 && !($row['Mode'] === "D" && $row['Jumlah'] === 0) && $row['Level'] > 1) {
|
||||||
|
$njum = $row['Jumlah'];
|
||||||
|
$temp_array = [str_repeat($strpad, ($row['Level']-1))." ".$row['Nama_Rek']];
|
||||||
|
for ($i=($apre['level']+1); $i>1; $i--) {
|
||||||
|
$temp_array[] = ($row['Level'] === $i) ? $njum : "";
|
||||||
|
}
|
||||||
|
$xls->add_row($temp_array);
|
||||||
|
if ($row['Level'] === 2) $tot_aktiva += $njum;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$_sjudul = ["JUMLAH AKTIVA"];
|
||||||
|
for ($i=0; $i<($apre['level']-1); $i++) $_sjudul[] = "";
|
||||||
|
$_sjudul[] = $tot_aktiva;
|
||||||
|
$xls->add_row_bold($_sjudul);
|
||||||
|
|
||||||
|
$xls->add_row([ "" ]);
|
||||||
|
$xls->add_row([ "B. PASIVA" ]);
|
||||||
|
$tot_pasiva = 0;
|
||||||
|
foreach ($apre['data'] as $row) {
|
||||||
|
if (($row['Grup_RekID'] === 2 || $row['Grup_RekID'] === 3) && !($row['Mode'] === "D" && $row['Jumlah'] === 0)) {
|
||||||
|
$njum = $row['Jumlah'] * -1;
|
||||||
|
$temp_array = [str_repeat($strpad, $row['Level'])." ".$row['Nama_Rek']];
|
||||||
|
for ($i=$apre['level']; $i>0; $i--) {
|
||||||
|
$temp_array[] = ($row['Level'] === $i) ? $njum : "";
|
||||||
|
}
|
||||||
|
$xls->add_row($temp_array);
|
||||||
|
if ($row['Level'] === 1) $tot_pasiva += $njum;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$_sjudul = ["JUMLAH PASIVA"];
|
||||||
|
for ($i=0; $i<($apre['level']-1); $i++) $_sjudul[] = "";
|
||||||
|
$_sjudul[] = $tot_pasiva;
|
||||||
|
$xls->add_row_bold($_sjudul);
|
||||||
|
|
||||||
|
$xls->add_stamp(1, true);
|
||||||
|
$xls->download("Data Neraca ".str_replace("s/d","-",$apre['periode']).".xlsx");
|
||||||
|
unset($xls);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$alevel = []; for ($i=2; $i<=($this->app_gel['MAX_LEVEL']-1); $i++) $alevel[$i] = "Level ".$i;
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$ttipe = $form->radio("_", "Tipe", 1, true, false, [1=>"Akumulasi", 2=>"Bulanan"]);
|
||||||
|
$tbulan = $form->option("_", "Bulan", date("n"), true, false, bulan_array());
|
||||||
|
$ttahun = $form->option("_", "Tahun", date("Y"), true, false, $this->gel->Tahun_Array());
|
||||||
|
$tlevel = $form->option("_", "Level", 3, true, false, $alevel);
|
||||||
|
$this->app->json([ 'html' => '
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-6 col-lg-4 col-form-label" for="Tipe">Tipe Laporan</label>
|
||||||
|
<div class="col">'.$ttipe.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-6 col-lg-4 col-form-label" for="Bulan">Periode Laporan</label>
|
||||||
|
<div class="col"><div class="input-group">'.$tbulan.$ttahun.'</div></div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-6 col-lg-4 col-form-label" for="Level">Level Rekening</label>
|
||||||
|
<div class="col-sm-6 col-lg-5">'.$tlevel.'</div>
|
||||||
|
</div>'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,169 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Report/Gel/BulanrlcabController
|
||||||
|
Description : Laporan Rugi / Laba Cabang
|
||||||
|
Created By : Siau Pheng ([email protected]).
|
||||||
|
Created Date : July 12th, 2008.
|
||||||
|
Last Modified : October 24th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Report\Gel;
|
||||||
|
|
||||||
|
use App\Utils\Gel;
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use flight\Session;
|
||||||
|
use Webapp\Data\Xlsx;
|
||||||
|
use Webapp\Printer\PrintHTML;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
|
||||||
|
class BulanrlcabController {
|
||||||
|
|
||||||
|
private string $reg_name;
|
||||||
|
private string $rek_hpp;
|
||||||
|
private int $id_cab;
|
||||||
|
private Gel $gel;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->reg_name = $session->get('WEB_APP')['REG_NAME'];
|
||||||
|
$this->rek_hpp = (string) $session->get('APP_GEL')['HPP'];
|
||||||
|
$this->id_cab = Param::Int("CabID", 0);
|
||||||
|
$this->gel = new Gel($app);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function prepare() {
|
||||||
|
$apre = [
|
||||||
|
'bulan1' => Param::Int("Bulan1"),
|
||||||
|
'bulan2' => Param::Int("Bulan2"),
|
||||||
|
'tahun' => Param::Int("Tahun"),
|
||||||
|
];
|
||||||
|
$tgl_akhir = tgl_akhbln("01-".isi_nol($apre['bulan2'],2)."-".(string) $apre['tahun']);
|
||||||
|
|
||||||
|
$apre['nama_cab'] = ($this->id_cab > 0) ? ($this->db->fetchField("SELECT Nama_Cab FROM para_cabang WHERE CabID=?", [$this->id_cab]) ?? '') : '';
|
||||||
|
|
||||||
|
// generate report header
|
||||||
|
$apre['periode'] = '01-'.isi_nol($apre['bulan1'],2).'-'.(string) $apre['tahun'].' s/d '.$tgl_akhir;
|
||||||
|
|
||||||
|
$tsql = ''; $asql = [$apre['tahun']."-".isi_nol($apre['bulan1'], 2)."-01" , tgl_sql2str($tgl_akhir)];
|
||||||
|
if ($this->id_cab > 0) {
|
||||||
|
$tsql .= " AND CabID=?";
|
||||||
|
array_push($asql, $this->id_cab);
|
||||||
|
}
|
||||||
|
|
||||||
|
$apre['pend'] = $this->db->fetchAll("SELECT D.*,R.Nama_Rek FROM (SELECT Kode_Rek,SUM(-Jumlah) Jumlah FROM gel_jurnal_detail WHERE (Tgl_Ref BETWEEN ? AND ?) AND (LEFT(Kode_Rek,1)='4' OR Kode_Rek='".$this->rek_hpp."')".$tsql." GROUP BY Kode_Rek ORDER BY Kode_Rek) D LEFT JOIN gel_acc R ON (D.Kode_Rek=R.Kode_Rek)", $asql);
|
||||||
|
$apre['biaya'] = $this->db->fetchAll("SELECT D.*,R.Nama_Rek FROM (SELECT Kode_Rek,SUM(Jumlah) Jumlah FROM gel_jurnal_detail WHERE (Tgl_Ref BETWEEN ? AND ?) AND LEFT(Kode_Rek,1)='5'".$tsql." GROUP BY Kode_Rek ORDER BY Kode_Rek) D LEFT JOIN gel_acc R ON (D.Kode_Rek=R.Kode_Rek)", $asql);
|
||||||
|
return $apre;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function print() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
|
||||||
|
$pre = new PrintHTML($this->app);
|
||||||
|
$pre->add_title([strtoupper($this->reg_name), "RUGI / LABA CABANG", "Periode : ".$apre['periode']]);
|
||||||
|
|
||||||
|
$pre->add_field("No.",10,"C");
|
||||||
|
$pre->add_field("Kode",20,"C");
|
||||||
|
$pre->add_field("Nama Rekening",150,"L");
|
||||||
|
$pre->add_field("Jumlah",50,"R","kurung2");
|
||||||
|
|
||||||
|
if ($this->id_cab > 0) $pre->add_sub_title("Nama Cabang : ".$apre['nama_cab']);
|
||||||
|
|
||||||
|
$pre->show_titles();
|
||||||
|
$pre->show_headers();
|
||||||
|
|
||||||
|
$nomor = 0; $tot_pend = 0; $tot_biaya = 0;
|
||||||
|
foreach ($apre['pend'] as $row) {
|
||||||
|
$tot_pend += $row['Jumlah'];
|
||||||
|
$pre->add_row([ ++$nomor, $row['Kode_Rek'], $row['Nama_Rek'], $row['Jumlah'] ]);
|
||||||
|
}
|
||||||
|
$pre->add_span([ ["TOTAL PENDAPATAN KOTOR",3,"L,B"],[$tot_pend,1,"R,B","kurung2"] ]);
|
||||||
|
|
||||||
|
$pre->add_row([ "" ]);
|
||||||
|
foreach ($apre['biaya'] as $row) {
|
||||||
|
if ((string) $row['Kode_Rek'] === $this->rek_hpp) continue;
|
||||||
|
$tot_biaya += $row['Jumlah'];
|
||||||
|
$pre->add_row([ ++$nomor, $row['Kode_Rek'], $row['Nama_Rek'], $row['Jumlah'] ]);
|
||||||
|
}
|
||||||
|
$pre->add_span([ ["TOTAL BIAYA",3,"L,B"],[$tot_biaya,1,"R,B","kurung2"] ]);
|
||||||
|
$pre->add_span([ ["SELISIH R / L CABANG ( ".($tot_pend>$tot_biaya?"PROFIT":"DEFISIT")." )",3,"L,B"],[$tot_pend - $tot_biaya,1,"R,B","kurung2"] ]);
|
||||||
|
|
||||||
|
$pre->add_stamp(1, true);
|
||||||
|
$pre->show();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function excel() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
$xls = new Xlsx($this->app);
|
||||||
|
$xls->set_meta([
|
||||||
|
'title' => "Data Rugi / Laba Cabang",
|
||||||
|
'desc' => "Export Data Rugi / Laba Cabang"
|
||||||
|
]);
|
||||||
|
$xls->add_title([ $this->reg_name, "RUGI / LABA CABANG", "Periode : ".$apre['periode'] ]);
|
||||||
|
|
||||||
|
$xls->add_field("No.", 5, "@integer");
|
||||||
|
$xls->add_field("Kode", 10, "@text");
|
||||||
|
$xls->add_field("Nama Rekening", 40, "@text");
|
||||||
|
$xls->add_field("Jumlah", 20, "#,##0.00");
|
||||||
|
$xls->add_sheet("".str_replace("s/d","-",$apre['periode']));
|
||||||
|
|
||||||
|
if ($this->id_cab > 0) $xls->add_sub_title("Nama Cabang : ".$apre['nama_cab']);
|
||||||
|
|
||||||
|
$xls->show_titles();
|
||||||
|
$xls->show_headers();
|
||||||
|
|
||||||
|
$nomor = 0; $tot_pend = 0; $tot_biaya = 0;
|
||||||
|
foreach ($apre['pend'] as $row) {
|
||||||
|
$tot_pend += $row['Jumlah'];
|
||||||
|
$xls->add_row([ ++$nomor, $row['Kode_Rek'], $row['Nama_Rek'], $row['Jumlah'] ]);
|
||||||
|
}
|
||||||
|
$xls->add_row_bold([ "", "", "TOTAL PENDAPATAN KOTOR", $tot_pend ]);
|
||||||
|
|
||||||
|
$xls->add_row([ "" ]);
|
||||||
|
foreach ($apre['biaya'] as $row) {
|
||||||
|
if ((string) $row['Kode_Rek'] === $this->rek_hpp) continue;
|
||||||
|
$tot_biaya += $row['Jumlah'];
|
||||||
|
$xls->add_row([ ++$nomor, $row['Kode_Rek'], $row['Nama_Rek'], $row['Jumlah'] ]);
|
||||||
|
}
|
||||||
|
$xls->add_row_bold([ "", "", "TOTAL BIAYA", $tot_biaya ]);
|
||||||
|
$xls->add_row_bold([ "", "", "SELISIH R / L CABANG ( ".($tot_pend>$tot_biaya?"PROFIT":"DEFISIT")." )", $tot_pend - $tot_biaya ]);
|
||||||
|
|
||||||
|
$xls->add_stamp(1, true);
|
||||||
|
$xls->download("Data Rugi Laba Cabang ".str_replace("s/d","-",$apre['periode']).".xlsx");
|
||||||
|
unset($xls);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tcab = $form->option_db("_", "CabID", $this->id_cab, true, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID", [0,"SEMUA CABANG"]);
|
||||||
|
$tbulan1 = $form->option("_", "Bulan1", date("n"), true, false, bulan_array());
|
||||||
|
$tbulan2 = $form->option("_", "Bulan2", date("n"), true, false, bulan_array());
|
||||||
|
$ttahun = $form->option("_", "Tahun", date("Y"), true, false, $this->gel->Tahun_Array());
|
||||||
|
$this->app->json([ 'html' => '
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-6 col-lg-4 col-form-label" for="CabID">Nama Cabang</label>
|
||||||
|
<div class="col">'.$tcab.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-6 col-lg-4 col-form-label" for="Bulan1">Periode Laporan</label>
|
||||||
|
<div class="col"><div class="input-group">'.$tbulan1.'<span class="input-group-text"><i class="bi-arrow-right-short"></i></span>'.$tbulan2.'</div></div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-6 col-lg-4 col-form-label" for="Tahun">Tahun Data</label>
|
||||||
|
<div class="col-sm-6 col-lg-6">'.$ttahun.'</div>
|
||||||
|
</div>'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,142 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Report/Gel/BulansaldoController
|
||||||
|
Description : Laporan Neraca Saldo Bulanan
|
||||||
|
Created By : Siau Pheng ([email protected]).
|
||||||
|
Created Date : July 12th, 2008.
|
||||||
|
Last Modified : October 24th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Report\Gel;
|
||||||
|
|
||||||
|
use App\Utils\Gel;
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use flight\Session;
|
||||||
|
use Webapp\Data\Xlsx;
|
||||||
|
use Webapp\Printer\PrintHTML;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
|
||||||
|
class BulansaldoController {
|
||||||
|
|
||||||
|
private string $reg_name;
|
||||||
|
private Gel $gel;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->reg_name = $session->get('WEB_APP')['REG_NAME'];
|
||||||
|
$this->gel = new Gel($app);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function prepare() {
|
||||||
|
$apre = [
|
||||||
|
'tipe' => Param::Int("Tipe"), // 1: rekap, 2: bulanan
|
||||||
|
'bulan' => Param::Int("Bulan"),
|
||||||
|
'tahun' => Param::Int("Tahun"),
|
||||||
|
];
|
||||||
|
$tgl_akhir = tgl_akhbln("01-".isi_nol($apre['bulan'],2)."-".(string) $apre['tahun']);
|
||||||
|
|
||||||
|
// generate report header
|
||||||
|
$apre['periode'] = '01-'.($apre['tipe'] === 2 ? isi_nol($apre['bulan'],2) : '01').'-'.(string) $apre['tahun'].' s/d '.$tgl_akhir;
|
||||||
|
|
||||||
|
// hitung total saldo rekening dari gel_rekap
|
||||||
|
$tjml = "R.Open";
|
||||||
|
for ($i=1; $i<=$apre['bulan']; $i++) $tjml .= "+R.Muta_".isi_nol($i, 2);
|
||||||
|
$tjml = ($apre['tipe'] === 1) ? $tjml : "R.Muta_".isi_nol($apre['bulan'], 2);
|
||||||
|
|
||||||
|
$apre['query'] = $this->db->runQuery("SELECT R.Kode_Rek, A.Nama_Rek, ".$tjml." Jumlah FROM (SELECT * FROM gel_rekap WHERE Tahun=?) R LEFT JOIN gel_acc A ON (R.Kode_Rek=A.Kode_Rek) WHERE ".$tjml."<>0 ORDER BY R.Kode_Rek", [$apre['tahun']]);
|
||||||
|
return $apre;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function print() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
|
||||||
|
$pre = new PrintHTML($this->app);
|
||||||
|
$pre->add_title([strtoupper($this->reg_name), "NERACA SALDO", "Periode : ".$apre['periode']]);
|
||||||
|
|
||||||
|
$pre->add_field("No.",10,"C");
|
||||||
|
$pre->add_field("Kode",20,"C");
|
||||||
|
$pre->add_field("Nama Rekening",150,"L");
|
||||||
|
$pre->add_field("Debit",50,"R","rupiah");
|
||||||
|
$pre->add_field("Kredit",50,"R","rupiah");
|
||||||
|
|
||||||
|
$pre->show_titles();
|
||||||
|
$pre->show_headers();
|
||||||
|
|
||||||
|
$nomor = 0; $tot_debit = 0; $tot_kredit = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$ndebit = ($row['Jumlah'] > 0) ? $row['Jumlah'] : 0;
|
||||||
|
$nkredit = ($row['Jumlah'] < 0) ? abs($row['Jumlah']) : 0;
|
||||||
|
$tot_debit += $ndebit;
|
||||||
|
$tot_kredit += $nkredit;
|
||||||
|
$pre->add_row([ ++$nomor, $row['Kode_Rek'], $row['Nama_Rek'], $ndebit, $nkredit ]);
|
||||||
|
}
|
||||||
|
$pre->add_span([ ["TOTAL SALDO",3,"L,B"],[$tot_debit,1,"R,B","rupiah"],[$tot_kredit,1,"R,B","rupiah"] ]);
|
||||||
|
|
||||||
|
$pre->add_stamp(1, true);
|
||||||
|
$pre->show();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function excel() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
$xls = new Xlsx($this->app);
|
||||||
|
$xls->set_meta([
|
||||||
|
'title' => "Data Neraca Saldo",
|
||||||
|
'desc' => "Export Data Neraca Saldo"
|
||||||
|
]);
|
||||||
|
$xls->add_title([ $this->reg_name, "NERACA SALDO", "Periode : ".$apre['periode'] ]);
|
||||||
|
|
||||||
|
$xls->add_field("No.", 5, "@integer");
|
||||||
|
$xls->add_field("Kode", 10, "@text");
|
||||||
|
$xls->add_field("Nama Rekening", 40, "@text");
|
||||||
|
$xls->add_field("Debit", 20, "#,##0.00");
|
||||||
|
$xls->add_field("Kredit", 20, "#,##0.00");
|
||||||
|
$xls->add_sheet("".str_replace("s/d","-",$apre['periode']));
|
||||||
|
|
||||||
|
$xls->show_titles();
|
||||||
|
$xls->show_headers();
|
||||||
|
|
||||||
|
$nomor = 0; $tot_debit = 0; $tot_kredit = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$ndebit = ($row['Jumlah'] > 0) ? $row['Jumlah'] : 0;
|
||||||
|
$nkredit = ($row['Jumlah'] < 0) ? abs($row['Jumlah']) : 0;
|
||||||
|
$tot_debit += $ndebit;
|
||||||
|
$tot_kredit += $nkredit;
|
||||||
|
$xls->add_row([ ++$nomor, $row['Kode_Rek'], $row['Nama_Rek'], $ndebit, $nkredit ]);
|
||||||
|
}
|
||||||
|
$xls->add_row_bold([ "", "", "TOTAL SALDO", $tot_debit, $tot_kredit ]);
|
||||||
|
|
||||||
|
$xls->add_stamp(1, true);
|
||||||
|
$xls->download("Data Neraca Saldo ".str_replace("s/d","-",$apre['periode']).".xlsx");
|
||||||
|
unset($xls);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$ttipe = $form->radio("_", "Tipe", 1, true, false, [1=>"Akumulasi", 2=>"Bulanan"]);
|
||||||
|
$tbulan = $form->option("_", "Bulan", date("n"), true, false, bulan_array());
|
||||||
|
$ttahun = $form->option("_", "Tahun", date("Y"), true, false, $this->gel->Tahun_Array());
|
||||||
|
$this->app->json([ 'html' => '
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-6 col-lg-4 col-form-label" for="Tipe">Tipe Laporan</label>
|
||||||
|
<div class="col">'.$ttipe.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-6 col-lg-4 col-form-label" for="Bulan">Periode Laporan</label>
|
||||||
|
<div class="col"><div class="input-group">'.$tbulan.$ttahun.'</div></div>
|
||||||
|
</div>'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,198 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Report/Gel/BulanshuController
|
||||||
|
Description : Laporan SHU Bulanan
|
||||||
|
Created By : Siau Pheng ([email protected]).
|
||||||
|
Created Date : July 12th, 2008.
|
||||||
|
Last Modified : October 24th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Report\Gel;
|
||||||
|
|
||||||
|
use App\Utils\Gel;
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use flight\Session;
|
||||||
|
use Webapp\Data\Xlsx;
|
||||||
|
use Webapp\Printer\PrintHTML;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
|
||||||
|
class BulanshuController {
|
||||||
|
|
||||||
|
private array $app_gel;
|
||||||
|
private string $reg_name;
|
||||||
|
private Gel $gel;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->app_gel = (array) $session->get('APP_GEL');
|
||||||
|
$this->reg_name = $session->get('WEB_APP')['REG_NAME'];
|
||||||
|
$this->gel = new Gel($app);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function prepare() {
|
||||||
|
$apre = [
|
||||||
|
'bulan1' => Param::Int("Bulan1"),
|
||||||
|
'bulan2' => Param::Int("Bulan2"),
|
||||||
|
'tahun' => Param::Int("Tahun"),
|
||||||
|
'level' => Param::Int("Level"),
|
||||||
|
];
|
||||||
|
$tgl_akhir = tgl_akhbln("01-".isi_nol($apre['bulan2'],2)."-".(string) $apre['tahun']);
|
||||||
|
|
||||||
|
// generate report header
|
||||||
|
$apre['periode'] = '01-'.isi_nol($apre['bulan1'],2).'-'.(string) $apre['tahun'].' s/d '.$tgl_akhir;
|
||||||
|
|
||||||
|
$apre['data'] = $this->gel->RugiLaba($apre['bulan1'], $apre['tahun'], $apre['bulan2'], $apre['tahun'], $apre['level']);
|
||||||
|
return $apre;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function print() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
|
||||||
|
$pre = new PrintHTML($this->app);
|
||||||
|
$pre->add_title([strtoupper($this->reg_name), "RUGI / LABA", "Periode : ".$apre['periode']]);
|
||||||
|
|
||||||
|
$pre->add_field("Keterangan",150,"L");
|
||||||
|
for ($i=0; $i<$apre['level']; $i++) {
|
||||||
|
$pre->add_field("Jumlah ".(string) $i,50,"R","rupiah");
|
||||||
|
}
|
||||||
|
|
||||||
|
$pre->show_titles();
|
||||||
|
$pre->show_headers(true);
|
||||||
|
|
||||||
|
$tot_pend = 0; $strpad = " ";
|
||||||
|
$pre->add_span([ ["A. PENDAPATAN",($apre['level']+1),"L,B"] ]);
|
||||||
|
foreach ($apre['data'] as $row) {
|
||||||
|
if ($row['Grup_RekID'] === 4 && !($row['Mode'] === "D" && $row['Jumlah'] === 0) && $row['Level'] > 1) {
|
||||||
|
$njum = $row['Jumlah'] * -1;
|
||||||
|
$temp_array = [str_repeat($strpad, ($row['Level']-1))." ".$row['Nama_Rek']];
|
||||||
|
for ($i=($apre['level']+1); $i>1; $i--) {
|
||||||
|
$temp_array[] = ($row['Level'] === $i) ? $njum : "";
|
||||||
|
}
|
||||||
|
$pre->add_row($temp_array);
|
||||||
|
if ($row['Level'] === 2) $tot_pend += $njum;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$pre->add_span([ ["JUMLAH PENDAPATAN",$apre['level'],"L,B,I"],[$tot_pend,1,"R,B,I","rupiah"] ]);
|
||||||
|
|
||||||
|
$pre->add_row([ "" ]);
|
||||||
|
$pre->add_span([ ["B. BIAYA - BIAYA",($apre['level']+1),"L,B"] ]);
|
||||||
|
$tot_biaya = 0;
|
||||||
|
foreach ($apre['data'] as $row) {
|
||||||
|
if ($row['Grup_RekID'] === 5 && !($row['Mode'] === "D" && $row['Jumlah'] === 0) && $row['Level'] > 1) {
|
||||||
|
$njum = $row['Jumlah'];
|
||||||
|
$temp_array = [str_repeat($strpad, $row['Level'])." ".$row['Nama_Rek']];
|
||||||
|
for ($i=$apre['level']; $i>0; $i--) {
|
||||||
|
$temp_array[] = ($row['Level'] === $i) ? $njum : "";
|
||||||
|
}
|
||||||
|
$pre->add_row($temp_array);
|
||||||
|
if ($row['Level'] === 2) $tot_biaya += $njum;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$pre->add_span([ ["JUMLAH BIAYA - BIAYA",$apre['level'],"L,B,I"], [$tot_biaya,1,"R,B,I","rupiah"] ]);
|
||||||
|
$pre->add_span([ ["SISA HASIL USAHA (".((($tot_pend-$tot_biaya)>0)?"SURPLUS":"DEFISIT").")",$apre['level'],"L,B,I"], [$tot_pend-$tot_biaya,1,"R,B,I","rupiah"] ]);
|
||||||
|
|
||||||
|
$pre->add_stamp(1, true);
|
||||||
|
$pre->show();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function excel() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
$xls = new Xlsx($this->app);
|
||||||
|
$xls->set_meta([
|
||||||
|
'title' => "Data Rugi / Laba",
|
||||||
|
'desc' => "Export Data Rugi / Laba"
|
||||||
|
]);
|
||||||
|
$xls->add_title([ $this->reg_name, "RUGI / LABA", "Periode : ".$apre['periode'] ]);
|
||||||
|
|
||||||
|
$xls->add_field("Keterangan", 50, "@text");
|
||||||
|
for ($i=0; $i<$apre['level']; $i++) {
|
||||||
|
$xls->add_field("Jumlah ".(string) $i, 20, "#,##0.00");
|
||||||
|
}
|
||||||
|
$xls->add_sheet("".str_replace("s/d","-",$apre['periode']));
|
||||||
|
|
||||||
|
$xls->show_titles();
|
||||||
|
$xls->show_headers(true);
|
||||||
|
|
||||||
|
$tot_pend = 0; $strpad = " ";
|
||||||
|
$xls->add_row_bold([ "A. PENDAPATAN" ]);
|
||||||
|
foreach ($apre['data'] as $row) {
|
||||||
|
if ($row['Grup_RekID'] === 4 && !($row['Mode'] === "D" && $row['Jumlah'] === 0) && $row['Level'] > 1) {
|
||||||
|
$njum = $row['Jumlah'] * -1;
|
||||||
|
$temp_array = [str_repeat($strpad, ($row['Level']-1))." ".$row['Nama_Rek']];
|
||||||
|
for ($i=($apre['level']+1); $i>1; $i--) {
|
||||||
|
$temp_array[] = ($row['Level'] === $i) ? $njum : "";
|
||||||
|
}
|
||||||
|
$xls->add_row($temp_array);
|
||||||
|
if ($row['Level'] === 2) $tot_pend += $njum;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$_sjudul = ["JUMLAH PENDAPATAN"];
|
||||||
|
for ($i=0; $i<($apre['level']-1); $i++) $_sjudul[] = "";
|
||||||
|
$_sjudul[] = $tot_pend;
|
||||||
|
$xls->add_row_bold($_sjudul);
|
||||||
|
|
||||||
|
$xls->add_row([ "" ]);
|
||||||
|
$xls->add_row([ "B. BIAYA - BIAYA" ]);
|
||||||
|
$tot_biaya = 0;
|
||||||
|
foreach ($apre['data'] as $row) {
|
||||||
|
if ($row['Grup_RekID'] === 5 && !($row['Mode'] === "D" && $row['Jumlah'] === 0) && $row['Level'] > 1) {
|
||||||
|
$njum = $row['Jumlah'];
|
||||||
|
$temp_array = [str_repeat($strpad, $row['Level'])." ".$row['Nama_Rek']];
|
||||||
|
for ($i=$apre['level']; $i>0; $i--) {
|
||||||
|
$temp_array[] = ($row['Level'] === $i) ? $njum : "";
|
||||||
|
}
|
||||||
|
$xls->add_row($temp_array);
|
||||||
|
if ($row['Level'] === 2) $tot_biaya += $njum;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$_sjudul = ["JUMLAH BIAYA - BIAYA"];
|
||||||
|
for ($i=0; $i<($apre['level']-1); $i++) $_sjudul[] = "";
|
||||||
|
$_sjudul[] = $tot_biaya;
|
||||||
|
$xls->add_row_bold($_sjudul);
|
||||||
|
|
||||||
|
$_sjudul = ["SISA HASIL USAHA (".((($tot_pend-$tot_biaya)>0)?"SURPLUS":"DEFISIT").")"];
|
||||||
|
for ($i=0; $i<($apre['level']-1); $i++) $_sjudul[] = "";
|
||||||
|
$_sjudul[] = $tot_pend - $tot_biaya;
|
||||||
|
$xls->add_row_bold($_sjudul);
|
||||||
|
|
||||||
|
$xls->add_stamp(1, true);
|
||||||
|
$xls->download("Data Rugi Laba ".str_replace("s/d","-",$apre['periode']).".xlsx");
|
||||||
|
unset($xls);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$alevel = []; for ($i=2; $i<=($this->app_gel['MAX_LEVEL']-1); $i++) $alevel[$i] = "Level ".$i;
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tbulan1 = $form->option("_", "Bulan1", date("n"), true, false, bulan_array());
|
||||||
|
$tbulan2 = $form->option("_", "Bulan2", date("n"), true, false, bulan_array());
|
||||||
|
$ttahun = $form->option("_", "Tahun", date("Y"), true, false, $this->gel->Tahun_Array());
|
||||||
|
$tlevel = $form->option("_", "Level", 3, true, false, $alevel);
|
||||||
|
$this->app->json([ 'html' => '
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-6 col-lg-4 col-form-label" for="Bulan1">Periode Laporan</label>
|
||||||
|
<div class="col"><div class="input-group">'.$tbulan1.'<span class="input-group-text"><i class="bi-arrow-right-short"></i></span>'.$tbulan2.'</div></div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-6 col-lg-4 col-form-label" for="Tahun">Tahun Data</label>
|
||||||
|
<div class="col-sm-6 col-lg-6">'.$ttahun.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-6 col-lg-4 col-form-label" for="Level">Level Rekening</label>
|
||||||
|
<div class="col-sm-6 col-lg-5">'.$tlevel.'</div>
|
||||||
|
</div>'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,208 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Report/Gel/HarianbantuController
|
||||||
|
Description : Laporan Buku Pembantu Harian
|
||||||
|
Created By : Siau Pheng ([email protected]).
|
||||||
|
Created Date : July 2nd, 2009.
|
||||||
|
Last Modified : October 22nd, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Report\Gel;
|
||||||
|
|
||||||
|
use App\Utils\Gel;
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use flight\Session;
|
||||||
|
use Webapp\Data\Xlsx;
|
||||||
|
use Webapp\Printer\PrintHTML;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
|
||||||
|
class HarianbantuController {
|
||||||
|
|
||||||
|
private string $reg_name;
|
||||||
|
private array $app_gel;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->app_gel = (array) $session->get('APP_GEL');
|
||||||
|
$this->reg_name = $session->get('WEB_APP')['REG_NAME'];
|
||||||
|
}
|
||||||
|
|
||||||
|
private function prepare() {
|
||||||
|
$apre = [
|
||||||
|
'kode_rek' => Param::Int("Kode_Rek"),
|
||||||
|
'tgl_from' => Param::Get("Tgl_From"),
|
||||||
|
'tgl_to' => Param::Get("Tgl_To"),
|
||||||
|
'nama_rek' => "",
|
||||||
|
'kali' => 1,
|
||||||
|
];
|
||||||
|
|
||||||
|
$tahun = substr($apre['tgl_from'], 6);
|
||||||
|
if (!empty($apre['kode_rek'])) {
|
||||||
|
$arek = $this->db->fetchRow("SELECT * FROM gel_acc WHERE Kode_Rek=?", [$apre['kode_rek']]);
|
||||||
|
if ($arek) {
|
||||||
|
$dk = Gel::DK($arek['Grup_RekID']);
|
||||||
|
if ($dk === "K") $apre['kali'] = -1;
|
||||||
|
$apre['nama_rek'] = $arek['Kode_Rek'] . " [".$dk."] - " . $arek['Nama_Rek'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// generate report header
|
||||||
|
$apre['periode'] = $apre['tgl_from'] . ($apre['tgl_from'] !== $apre['tgl_to'] ? ' s/d '.$apre['tgl_to'] : '');
|
||||||
|
|
||||||
|
$apre['saldo'] = ($this->db->fetchField("SELECT Open FROM gel_rekap WHERE Kode_Rek=? AND Tahun=?", [$apre['kode_rek'], $tahun]) ?? 0) * $apre['kali'];
|
||||||
|
$_ext = $this->db->fetchField("SELECT SUM(Jumlah) Saldo FROM gel_jurnal_detail WHERE Tahun=? AND Kode_Rek=? AND Tgl_Ref<?", [$tahun, $apre['kode_rek'], tgl_sql2str($apre['tgl_from'])]) ?? 0;
|
||||||
|
if ($_ext > 0) $apre['saldo'] += $_ext * $apre['kali'];
|
||||||
|
|
||||||
|
if ($apre['kode_rek'] === $this->app_gel['PIU_USAHA']) {
|
||||||
|
$apre['query'] = $this->db->runQuery("SELECT D.*,CONCAT(J.Kode_Ref,' / ',J.Catatan) Kode_Ref,CONCAT(IFNULL(M.Nama_Member,''),' [',IFNULL(M.Kode_Member,'000000'),']') Nama_Member FROM (SELECT Kode_Jurnal,Tgl_Ref,IF(DK='D',Jumlah,0) Debit, IF(DK='K',Jumlah*-1,0) Kredit, Jumlah Saldo,MemberID FROM gel_jurnal_detail WHERE (Tgl_Ref BETWEEN ? AND ?) AND Kode_Rek=?) D LEFT JOIN gel_jurnal J ON (D.Kode_Jurnal=J.Kode_Jurnal) LEFT JOIN para_member M ON (M.MemberID=D.MemberID) ORDER BY D.Tgl_Ref,D.Kode_Jurnal", [tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to']), $apre['kode_rek']]);
|
||||||
|
} else if ($apre['kode_rek'] === $this->app_gel['HUT_USAHA']) {
|
||||||
|
$apre['query'] = $this->db->runQuery("SELECT D.*,CONCAT(J.Kode_Ref,' / ',J.Catatan) Kode_Ref,CONCAT(IFNULL(S.Nama_Sup,''),' [',IFNULL(S.Kode_Sup,'0000'),']') Nama_Sup FROM (SELECT Kode_Jurnal,Tgl_Ref,IF(DK='D',Jumlah,0) Debit, IF(DK='K',Jumlah*-1,0) Kredit, Jumlah Saldo,SupID FROM gel_jurnal_detail WHERE (Tgl_Ref BETWEEN ? AND ?) AND Kode_Rek=?) D LEFT JOIN gel_jurnal J ON (D.Kode_Jurnal=J.Kode_Jurnal) LEFT JOIN para_supplier S ON (S.SupID=D.SupID) ORDER BY D.Tgl_Ref,D.Kode_Jurnal", [tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to']), $apre['kode_rek']]);
|
||||||
|
} else {
|
||||||
|
$apre['query'] = $this->db->runQuery("SELECT D.*,CONCAT(J.Kode_Ref,' / ',J.Catatan) Kode_Ref FROM (SELECT Kode_Jurnal,Tgl_Ref,IF(DK='D',Jumlah,0) Debit, IF(DK='K',Jumlah*-1,0) Kredit, Jumlah Saldo FROM gel_jurnal_detail WHERE (Tgl_Ref BETWEEN ? AND ?) AND Kode_Rek=?) D LEFT JOIN gel_jurnal J ON (D.Kode_Jurnal=J.Kode_Jurnal) ORDER BY D.Tgl_Ref,D.Kode_Jurnal", [tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to']), $apre['kode_rek']]);
|
||||||
|
}
|
||||||
|
return $apre;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function print() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
|
||||||
|
$pre = new PrintHTML($this->app);
|
||||||
|
$pre->add_title([strtoupper($this->reg_name), "BUKU PEMBANTU HARIAN", "Periode : ".$apre['periode']]);
|
||||||
|
|
||||||
|
$pre->add_field("No.",10,"C");
|
||||||
|
$pre->add_field("Tanggal",30,"C","sqltgl");
|
||||||
|
$pre->add_field("Kode Jurnal",50,"L");
|
||||||
|
$pre->add_field("Kode Ref / Deskripsi",150,"L");
|
||||||
|
if ($apre['kode_rek'] === $this->app_gel['PIU_USAHA']) {
|
||||||
|
$pre->add_field("Nama Member",150,"L");
|
||||||
|
} else if ($apre['kode_rek'] === $this->app_gel['HUT_USAHA']) {
|
||||||
|
$pre->add_field("Nama Supplier",150,"L");
|
||||||
|
}
|
||||||
|
$pre->add_field("Debit",20,"R","rupiah");
|
||||||
|
$pre->add_field("Kredit",20,"R","rupiah");
|
||||||
|
$pre->add_field("Saldo",20,"R","rupiah");
|
||||||
|
|
||||||
|
if (!empty($apre['kode_rek'])) $pre->add_sub_title("Rekening : ".$apre['nama_rek']);
|
||||||
|
|
||||||
|
$pre->show_titles();
|
||||||
|
$pre->show_headers();
|
||||||
|
|
||||||
|
$nomor = 0; $tot_debit = 0; $tot_kredit = 0;
|
||||||
|
if ($apre['kode_rek'] === $this->app_gel['PIU_USAHA'] || $apre['kode_rek'] === $this->app_gel['HUT_USAHA']) {
|
||||||
|
$pre->add_span([ ["Saldo Awal",5,"R,B"],["",1,"R,B"],["",1,"R,B"],[$apre['saldo'],1,"R,B","rupiah"] ]);
|
||||||
|
} else {
|
||||||
|
$pre->add_span([ ["Saldo Awal",4,"R,B"],["",1,"R,B"],["",1,"R,B"],[$apre['saldo'],1,"R,B","rupiah"] ]);
|
||||||
|
}
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_debit += $row['Debit'];
|
||||||
|
$tot_kredit += $row['Kredit'];
|
||||||
|
$apre['saldo'] += $row['Saldo'] * $apre['kali'];
|
||||||
|
if ($apre['kode_rek'] === $this->app_gel['PIU_USAHA']) {
|
||||||
|
$pre->add_row([ ++$nomor, $row['Tgl_Ref'], $row['Kode_Jurnal'], $row['Kode_Ref'], $row['Nama_Member'], $row['Debit'], $row['Kredit'], $apre['saldo'] ]);
|
||||||
|
} else if ($apre['kode_rek'] === $this->app_gel['HUT_USAHA']) {
|
||||||
|
$pre->add_row([ ++$nomor, $row['Tgl_Ref'], $row['Kode_Jurnal'], $row['Kode_Ref'], $row['Nama_Sup'], $row['Debit'], $row['Kredit'], $apre['saldo'] ]);
|
||||||
|
} else {
|
||||||
|
$pre->add_row([ ++$nomor, $row['Tgl_Ref'], $row['Kode_Jurnal'], $row['Kode_Ref'], $row['Debit'], $row['Kredit'], $apre['saldo'] ]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($apre['kode_rek'] === $this->app_gel['PIU_USAHA'] || $apre['kode_rek'] === $this->app_gel['HUT_USAHA']) {
|
||||||
|
$pre->add_span([ ["Saldo Akhir",5,"R,B"],[$tot_debit,1,"R,B","rupiah"],[$tot_kredit,1,"R,B","rupiah"],[$apre['saldo'],1,"R,B","rupiah"] ]);
|
||||||
|
} else {
|
||||||
|
$pre->add_span([ ["Saldo Akhir",4,"R,B"],[$tot_debit,1,"R,B","rupiah"],[$tot_kredit,1,"R,B","rupiah"],[$apre['saldo'],1,"R,B","rupiah"] ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$pre->add_stamp(1, true);
|
||||||
|
$pre->show();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function excel() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
$xls = new Xlsx($this->app);
|
||||||
|
$xls->set_meta([
|
||||||
|
'title' => "Data Buku Pembantu Harian",
|
||||||
|
'desc' => "Export Data Buku Pembantu Harian"
|
||||||
|
]);
|
||||||
|
$xls->add_title([ $this->reg_name, "DATA BUKU PEMBANTU HARIAN", "Periode : ".$apre['periode'] ]);
|
||||||
|
|
||||||
|
$xls->add_field("No.", 5, "@integer");
|
||||||
|
$xls->add_field("Tanggal", 12, "@date");
|
||||||
|
$xls->add_field("Kode Jurnal", 20, "@text");
|
||||||
|
$xls->add_field("Kode Ref / Deskripsi", 40, "@text");
|
||||||
|
if ($apre['kode_rek'] === $this->app_gel['PIU_USAHA']) {
|
||||||
|
$xls->add_field("Nama Member", 40, "@text");
|
||||||
|
} else if ($apre['kode_rek'] === $this->app_gel['HUT_USAHA']) {
|
||||||
|
$xls->add_field("Nama Supplier", 40, "@text");
|
||||||
|
}
|
||||||
|
$xls->add_field("Debit", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Kredit", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Saldo", 15, "#,##0.00");
|
||||||
|
$xls->add_sheet("".str_replace("s/d","-",$apre['periode']));
|
||||||
|
|
||||||
|
if (!empty($apre['kode_rek'])) $xls->add_sub_title("Rekening : ".$apre['nama_rek']);
|
||||||
|
|
||||||
|
$xls->show_titles();
|
||||||
|
$xls->show_headers();
|
||||||
|
|
||||||
|
$nomor = 0; $tot_debit = 0; $tot_kredit = 0;
|
||||||
|
if ($apre['kode_rek'] === $this->app_gel['PIU_USAHA'] || $apre['kode_rek'] === $this->app_gel['HUT_USAHA']) {
|
||||||
|
$xls->add_row_bold([ "", "", "", "Saldo Awal", "", "", "", $apre['saldo'] ]);
|
||||||
|
} else {
|
||||||
|
$xls->add_row_bold([ "", "", "", "Saldo Awal", "", "", $apre['saldo'] ]);
|
||||||
|
}
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_debit += $row['Debit'];
|
||||||
|
$tot_kredit += $row['Kredit'];
|
||||||
|
$apre['saldo'] += $row['Saldo'] * $apre['kali'];
|
||||||
|
if ($apre['kode_rek'] === $this->app_gel['PIU_USAHA']) {
|
||||||
|
$xls->add_row([ ++$nomor, $row['Tgl_Ref'], $row['Kode_Jurnal'], $row['Kode_Ref'], $row['Nama_Member'], $row['Debit'], $row['Kredit'], $apre['saldo'] ]);
|
||||||
|
} else if ($apre['kode_rek'] === $this->app_gel['HUT_USAHA']) {
|
||||||
|
$xls->add_row([ ++$nomor, $row['Tgl_Ref'], $row['Kode_Jurnal'], $row['Kode_Ref'], $row['Nama_Sup'], $row['Debit'], $row['Kredit'], $apre['saldo'] ]);
|
||||||
|
} else {
|
||||||
|
$xls->add_row([ ++$nomor, $row['Tgl_Ref'], $row['Kode_Jurnal'], $row['Kode_Ref'], $row['Debit'], $row['Kredit'], $apre['saldo'] ]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($apre['kode_rek'] === $this->app_gel['PIU_USAHA'] || $apre['kode_rek'] === $this->app_gel['HUT_USAHA']) {
|
||||||
|
$xls->add_row_bold([ "", "", "", "Saldo Akhir", "", $tot_debit, $tot_kredit, $apre['saldo'] ]);
|
||||||
|
} else {
|
||||||
|
$xls->add_row_bold([ "", "", "", "Saldo Akhir", $tot_debit, $tot_kredit, $apre['saldo'] ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$xls->add_stamp(1, true);
|
||||||
|
$xls->download("Data Buku Pembantu Harian ".str_replace("s/d","-",$apre['periode']).".xlsx");
|
||||||
|
unset($xls);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tkode = $form->option_db("_", "Kode_Rek", "", true, false, "vi_gel_acc", ["Kode_Rek","Nama_Lengkap"], "Aktif=1 AND Mode='D' AND Kode_Rek IN (1141,1142,2111)");
|
||||||
|
$tfrom = $form->datebox("_", "Tgl_From", tgl_ymd(), true, false);
|
||||||
|
$tto = $form->datebox("_", "Tgl_To", tgl_ymd(), true, false);
|
||||||
|
$this->app->json([ 'html' => '
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="Kode_Rek">Nama Rekening</label>
|
||||||
|
<div class="col">'.$tkode.'</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-4">'.$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-4">'.$tto.'</div>
|
||||||
|
</div>'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,230 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Report/Gel/HarianbesarController
|
||||||
|
Description : Laporan Buku Besar Harian
|
||||||
|
Created By : Siau Pheng ([email protected]).
|
||||||
|
Created Date : May 1st, 2009.
|
||||||
|
Last Modified : October 22nd, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Report\Gel;
|
||||||
|
|
||||||
|
use App\Utils\Gel;
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use flight\Session;
|
||||||
|
use Webapp\Data\Xlsx;
|
||||||
|
use Webapp\Printer\PrintHTML;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
use Webapp\Web\Table;
|
||||||
|
|
||||||
|
class HarianbesarController {
|
||||||
|
|
||||||
|
private string $reg_name;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->reg_name = $session->get('WEB_APP')['REG_NAME'];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function brow_rek() {
|
||||||
|
$tcari = Param::Get("Cari_Rek");
|
||||||
|
$tsql = 'Aktif=1 AND Mode="D"'; $asql = [];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql .= " AND CONCAT(Kode_Rek,Nama_Rek) LIKE ?";
|
||||||
|
array_push($asql, '%' . $tcari . '%');
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("gel_acc", "*", $tsql, $asql);
|
||||||
|
$obj->add_field("Kode_Rek", "Kode", "c");
|
||||||
|
$obj->add_field("Nama_Rek", "Nama Rekening", "awr");
|
||||||
|
$obj->add_field("Level", "Level", "c");
|
||||||
|
$obj->set_field_order("Kode_Rek", "A");
|
||||||
|
$obj->set_func_select("RepoGelHBesarJS.rek_select");
|
||||||
|
$this->app->json([ $obj->db_table("divBrowRek") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function auto_rek() {
|
||||||
|
$tcari = Param::Get("Auto_Query");
|
||||||
|
$ajson['autodata'] = [];
|
||||||
|
$stat = $this->db->runQuery("SELECT Kode_Rek,Nama_Rek,CONCAT(Kode_Rek,' - ',Nama_Rek) Nama_Lengkap FROM gel_acc WHERE Aktif=1 AND Mode='D' AND CONCAT(Kode_Rek,Nama_Rek) LIKE ? ORDER BY Kode_Rek LIMIT 50", ['%'.$tcari.'%']);
|
||||||
|
while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$ajson['autodata'][] = ['value'=>$row['Kode_Rek'], 'text'=>$row['Nama_Rek'], 'html'=>'<span class="text-primary">'.$row['Kode_Rek'].'</span> '.$row['Nama_Rek'], 'data'=>"", 'bc'=>0];
|
||||||
|
}
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function prepare() {
|
||||||
|
$apre = [
|
||||||
|
'kode_rek' => Param::Get("Kode_Rek"),
|
||||||
|
'jenis' => Param::Get("Jenis", "Y"),
|
||||||
|
'tgl_from' => Param::Get("Tgl_From"),
|
||||||
|
'tgl_to' => Param::Get("Tgl_To"),
|
||||||
|
'nama_rek' => "",
|
||||||
|
'kali' => 1,
|
||||||
|
];
|
||||||
|
|
||||||
|
$tahun = substr($apre['tgl_from'], 6);
|
||||||
|
if (!empty($apre['kode_rek'])) {
|
||||||
|
$arek = $this->db->fetchRow("SELECT * FROM gel_acc WHERE Kode_Rek=?", [$apre['kode_rek']]);
|
||||||
|
if ($arek) {
|
||||||
|
$dk = Gel::DK($arek['Grup_RekID']);
|
||||||
|
if ($dk === "K") $apre['kali'] = -1;
|
||||||
|
$apre['nama_rek'] = $arek['Kode_Rek'] . " [".$dk."] - " . $arek['Nama_Rek'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// generate report header
|
||||||
|
$apre['periode'] = $apre['tgl_from'] . ($apre['tgl_from'] !== $apre['tgl_to'] ? ' s/d '.$apre['tgl_to'] : '');
|
||||||
|
|
||||||
|
$apre['saldo'] = ($this->db->fetchField("SELECT Open FROM gel_rekap WHERE Kode_Rek=? AND Tahun=?", [$apre['kode_rek'], $tahun]) ?? 0) * $apre['kali'];
|
||||||
|
$_ext = $this->db->fetchField("SELECT SUM(Jumlah) Saldo FROM gel_jurnal_detail WHERE Tahun=? AND Kode_Rek=? AND Tgl_Ref<?", [$tahun, $apre['kode_rek'], tgl_sql2str($apre['tgl_from'])]) ?? 0;
|
||||||
|
if ($_ext > 0) $apre['saldo'] += $_ext * $apre['kali'];
|
||||||
|
|
||||||
|
if ($apre['jenis'] === "Y") {
|
||||||
|
$apre['query'] = $this->db->runQuery("SELECT Tgl_Ref,SUM(IF(DK='D',Jumlah,0)) Debit, SUM(IF(DK='K',Jumlah*-1,0)) Kredit, SUM(Jumlah) Saldo FROM gel_jurnal_detail WHERE (Tgl_Ref BETWEEN ? AND ?) AND Kode_Rek=? GROUP BY Tgl_Ref ORDER BY Tgl_Ref", [tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to']), $apre['kode_rek']]);
|
||||||
|
} else {
|
||||||
|
$apre['query'] = $this->db->runQuery("SELECT D.*,CONCAT(J.Kode_Ref,' / ',J.Catatan) Kode_Ref FROM (SELECT Kode_Jurnal,Tgl_Ref,IF(DK='D',Jumlah,0) Debit, IF(DK='K',Jumlah*-1,0) Kredit, Jumlah Saldo FROM gel_jurnal_detail WHERE (Tgl_Ref BETWEEN ? AND ?) AND Kode_Rek=?) D LEFT JOIN gel_jurnal J ON (D.Kode_Jurnal=J.Kode_Jurnal) ORDER BY D.Tgl_Ref,D.Kode_Jurnal", [tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to']), $apre['kode_rek']]);
|
||||||
|
}
|
||||||
|
return $apre;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function print() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
|
||||||
|
$pre = new PrintHTML($this->app);
|
||||||
|
$pre->add_title([strtoupper($this->reg_name), "BUKU BESAR HARIAN", "Periode : ".$apre['periode']]);
|
||||||
|
|
||||||
|
$pre->add_field("No.",10,"C");
|
||||||
|
$pre->add_field("Tanggal",30,"C","sqltgl");
|
||||||
|
if ($apre['jenis'] !== "Y") {
|
||||||
|
$pre->add_field("Kode Jurnal",50,"L");
|
||||||
|
$pre->add_field("Kode Ref / Deskripsi",150,"L");
|
||||||
|
}
|
||||||
|
$pre->add_field("Debit",20,"R","rupiah");
|
||||||
|
$pre->add_field("Kredit",20,"R","rupiah");
|
||||||
|
$pre->add_field("Saldo",20,"R","rupiah");
|
||||||
|
|
||||||
|
if (!empty($apre['kode_rek'])) $pre->add_sub_title("Rekening : ".$apre['nama_rek']);
|
||||||
|
|
||||||
|
$pre->show_titles();
|
||||||
|
$pre->show_headers();
|
||||||
|
|
||||||
|
$nomor = 0; $tot_debit = 0; $tot_kredit = 0;
|
||||||
|
if ($apre['jenis'] === "Y") {
|
||||||
|
$pre->add_span([ ["Saldo Awal",2,"R,B"],["",1,"R,B"],["",1,"R,B"],[$apre['saldo'],1,"R,B","rupiah"] ]);
|
||||||
|
} else {
|
||||||
|
$pre->add_span([ ["Saldo Awal",4,"R,B"],["",1,"R,B"],["",1,"R,B"],[$apre['saldo'],1,"R,B","rupiah"] ]);
|
||||||
|
}
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_debit += $row['Debit'];
|
||||||
|
$tot_kredit += $row['Kredit'];
|
||||||
|
$apre['saldo'] += $row['Saldo'] * $apre['kali'];
|
||||||
|
if ($apre['jenis'] === "Y") {
|
||||||
|
$pre->add_row([ ++$nomor, $row['Tgl_Ref'], $row['Debit'], $row['Kredit'], $apre['saldo'] ]);
|
||||||
|
} else {
|
||||||
|
$pre->add_row([ ++$nomor, $row['Tgl_Ref'], $row['Kode_Jurnal'], $row['Kode_Ref'], $row['Debit'], $row['Kredit'], $apre['saldo'] ]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($apre['jenis'] === "Y") {
|
||||||
|
$pre->add_span([ ["Saldo Akhir",2,"R,B"],[$tot_debit,1,"R,B","rupiah"],[$tot_kredit,1,"R,B","rupiah"],[$apre['saldo'],1,"R,B","rupiah"] ]);
|
||||||
|
} else {
|
||||||
|
$pre->add_span([ ["Saldo Akhir",4,"R,B"],[$tot_debit,1,"R,B","rupiah"],[$tot_kredit,1,"R,B","rupiah"],[$apre['saldo'],1,"R,B","rupiah"] ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$pre->add_stamp(1, true);
|
||||||
|
$pre->show();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function excel() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
$xls = new Xlsx($this->app);
|
||||||
|
$xls->set_meta([
|
||||||
|
'title' => "Data Buku Besar Harian",
|
||||||
|
'desc' => "Export Data Buku Besar Harian"
|
||||||
|
]);
|
||||||
|
$xls->add_title([ $this->reg_name, "DATA BUKU BESAR HARIAN", "Periode : ".$apre['periode'] ]);
|
||||||
|
|
||||||
|
$xls->add_field("No.", 5, "@integer");
|
||||||
|
$xls->add_field("Tanggal", 12, "@date");
|
||||||
|
if ($apre['jenis'] !== "Y") {
|
||||||
|
$xls->add_field("Kode Jurnal", 20, "@text");
|
||||||
|
$xls->add_field("Kode Ref / Deskripsi", 40, "@text");
|
||||||
|
}
|
||||||
|
$xls->add_field("Debit", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Kredit", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Saldo", 15, "#,##0.00");
|
||||||
|
$xls->add_sheet("".str_replace("s/d","-",$apre['periode']));
|
||||||
|
|
||||||
|
if (!empty($apre['kode_rek'])) $xls->add_sub_title("Rekening : ".$apre['nama_rek']);
|
||||||
|
|
||||||
|
$xls->show_titles();
|
||||||
|
$xls->show_headers();
|
||||||
|
|
||||||
|
$nomor = 0; $tot_debit = 0; $tot_kredit = 0;
|
||||||
|
if ($apre['jenis'] === "Y") {
|
||||||
|
$xls->add_row_bold([ "", "Saldo Awal", "", "", $apre['saldo'] ]);
|
||||||
|
} else {
|
||||||
|
$xls->add_row_bold([ "", "", "", "Saldo Awal", "", "", $apre['saldo'] ]);
|
||||||
|
}
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_debit += $row['Debit'];
|
||||||
|
$tot_kredit += $row['Kredit'];
|
||||||
|
$apre['saldo'] += $row['Saldo'] * $apre['kali'];
|
||||||
|
if ($apre['jenis'] === "Y") {
|
||||||
|
$xls->add_row([ ++$nomor, $row['Tgl_Ref'], $row['Debit'], $row['Kredit'], $apre['saldo'] ]);
|
||||||
|
} else {
|
||||||
|
$xls->add_row([ ++$nomor, $row['Tgl_Ref'], $row['Kode_Jurnal'], $row['Kode_Ref'], $row['Debit'], $row['Kredit'], $apre['saldo'] ]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($apre['jenis'] === "Y") {
|
||||||
|
$xls->add_row_bold([ "", "Saldo Akhir", $tot_debit, $tot_kredit, $apre['saldo'] ]);
|
||||||
|
} else {
|
||||||
|
$xls->add_row_bold([ "", "", "", "Saldo Akhir", $tot_debit, $tot_kredit, $apre['saldo'] ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$xls->add_stamp(1, true);
|
||||||
|
$xls->download("Data Buku Besar Harian ".str_replace("s/d","-",$apre['periode']).".xlsx");
|
||||||
|
unset($xls);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tnama = $form->textauto("_", "Nama_Rek", ['value'=>"",'text'=>""], true, true, "ketik kode / nama rekening");
|
||||||
|
$tjenis = $form->radio("_", "Jenis", "Y", true, false, ['Y'=>"Ya", 'N'=>"Tidak"]);
|
||||||
|
$tfrom = $form->datebox("_", "Tgl_From", tgl_ymd(), true, false);
|
||||||
|
$tto = $form->datebox("_", "Tgl_To", tgl_ymd(), true, false);
|
||||||
|
$this->app->json([ 'html' => '
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="Nama_Rek">Kode Rekening</label>
|
||||||
|
<div class="col"><div class="input-group">'.$tnama.'<button id="butBrowRek" class="btn btn-info" type="button"><i class="bi-search"></i></button></div></div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="Jenis">Rekap Harian</label>
|
||||||
|
<div class="col">'.$tjenis.'</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-4">'.$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-4">'.$tto.'</div>
|
||||||
|
</div>
|
||||||
|
<input type="hidden" id="Kode_Rek" value="0">'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,123 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Report/Gel/HariandetailController
|
||||||
|
Description : Laporan Jurnal Detail
|
||||||
|
Created By : Siau Pheng ([email protected]).
|
||||||
|
Created Date : June 5th, 2009.
|
||||||
|
Last Modified : October 24th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Report\Gel;
|
||||||
|
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use flight\Session;
|
||||||
|
use Webapp\Printer\PrintHTML;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
use Webapp\Web\Table;
|
||||||
|
|
||||||
|
class HariandetailController {
|
||||||
|
|
||||||
|
private string $reg_name;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->reg_name = $session->get('WEB_APP')['REG_NAME'];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function brow_jurnal() {
|
||||||
|
$tcari = Param::Get("Cari_Jurnal");
|
||||||
|
$tsql = ''; $asql = [];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql .= " WHERE CONCAT(Kode_Jurnal,DATE_FORMAT(Tanggal,'%d-%m-%Y'),Kode_Ref,Catatan) LIKE ?";
|
||||||
|
array_push($asql, '%' . $tcari . '%');
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("(SELECT * FROM gel_jurnal".$tsql.") J LEFT JOIN gel_tipe T ON (T.TipeID=J.TipeID)", "J.*,T.Kode_Tipe", "", $asql);
|
||||||
|
$obj->add_field("Kode_Jurnal", "Kode Jurnal", "c");
|
||||||
|
$obj->add_field("Tanggal", "Tanggal", "c", "sqltgl", "", "val-tgl");
|
||||||
|
$obj->add_field("Kode_Ref", "Kode Ref.", "l");
|
||||||
|
$obj->add_field("Catatan", "Deskripsi", "awr");
|
||||||
|
$obj->add_field("Kode_Tipe", "Tipe", "l");
|
||||||
|
$obj->set_field_order("Kode_Jurnal", "D");
|
||||||
|
$obj->set_func_select("RepoGelHDetailJS.jurnal_select");
|
||||||
|
$this->app->json([ $obj->db_table("divBrowJurnal") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function prepare() {
|
||||||
|
$apre = [
|
||||||
|
'kode_jurnal' => Param::Get("Kode_Jurnal"),
|
||||||
|
'header' => [],
|
||||||
|
'detail' => [],
|
||||||
|
];
|
||||||
|
|
||||||
|
// ambil detail informasi jurnal
|
||||||
|
$apre['header'] = $this->db->fetchRow("SELECT J.*, O.Nama NamaUser, CONCAT(YEAR(J.Tanggal),'-',IF(MONTH(J.Tanggal)<10,'0',''),MONTH(J.Tanggal)) Periode,T.Kode_Tipe,T.Nama_Tipe FROM (SELECT * FROM gel_jurnal WHERE Kode_Jurnal=?) J LEFT JOIN app_operator O ON (J.UserID=O.UserID) LEFT JOIN gel_tipe T ON (J.TipeID=T.TipeID)", [$apre['kode_jurnal']]);
|
||||||
|
|
||||||
|
// check status jurnal
|
||||||
|
$cek = (float) $this->db->fetchField("SELECT SUM(Jumlah) FROM gel_jurnal_detail WHERE Kode_Jurnal=?", [$apre['kode_jurnal']]) ?? 0;
|
||||||
|
$apre['header']['Status'] = ($cek === 0.0) ? '<b class="text-success">OK</b>' : '<b class="text-danger">Tidak Seimbang</b>';
|
||||||
|
|
||||||
|
// query detail jurnal
|
||||||
|
$apre['detail'] = $this->db->fetchAll("SELECT D.*, A.Nama_Rek FROM (SELECT ID,Kode_Rek,DK,IF(DK='D',Jumlah,0) Debit, IF(DK='K',Jumlah*-1,0) Kredit FROM gel_jurnal_detail WHERE Kode_Jurnal=?) D LEFT JOIN gel_acc A ON (D.Kode_Rek=A.Kode_Rek) ORDER BY D.ID", [$apre['kode_jurnal']]);
|
||||||
|
|
||||||
|
return $apre;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function print() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
|
||||||
|
$pre = new PrintHTML($this->app);
|
||||||
|
$pre->add_title([strtoupper($this->reg_name), "JURNAL DETAIL"]);
|
||||||
|
|
||||||
|
$pre->add_field("No.",10,"C");
|
||||||
|
$pre->add_field("Kode",50,"C");
|
||||||
|
$pre->add_field("Nama Rekening",150,"L");
|
||||||
|
$pre->add_field("D / K",10,"C");
|
||||||
|
$pre->add_field("Debit",20,"R","rupiah");
|
||||||
|
$pre->add_field("Kredit",20,"R","rupiah");
|
||||||
|
|
||||||
|
$pre->show_titles();
|
||||||
|
|
||||||
|
$kop = '<table class="notaHeader"><tbody>';
|
||||||
|
$kop .= '<tr><td width="15%">Kode Jurnal</td><td width="35%" class="ttkdua">'.$apre['header']['Kode_Jurnal'].'</td><td width="15%">Periode</td><td width="35%" class="ttkdua">'.$apre['header']['Periode'].'</td></tr>';
|
||||||
|
$kop .= '<tr><td>Tanggal</td><td class="ttkdua">'.tgl_sql2str($apre['header']['Tanggal']).'</td><td>Tipe Jurnal</td><td class="ttkdua">['.$apre['header']['Kode_Tipe']."] Jurnal ".$apre['header']['Nama_Tipe'].'</td></tr>';
|
||||||
|
$kop .= '<tr><td>Kode Referensi</td><td class="ttkdua">'.$apre['header']['Kode_Ref'].'</td><td>Informasi User</td><td class="ttkdua">['.isi_nol($apre['header']['UserID'],3)."] ".$apre['header']['NamaUser'].'</td></tr>';
|
||||||
|
$kop .= '<tr><td>Keterangan</td><td class="ttkdua" colspan="3">'.$apre['header']['Catatan'].'</td></tr>';
|
||||||
|
$kop .= '<tr><td>Status</td><td class="ttkdua" colspan="3">'.$apre['header']['Status'].'</td></tr>';
|
||||||
|
$kop .= '</tbody></table>';
|
||||||
|
echo $kop;
|
||||||
|
|
||||||
|
$pre->show_headers();
|
||||||
|
foreach ($apre['detail'] as $row) {
|
||||||
|
$pre->add_row([ $row['ID'], $row['Kode_Rek'], $row['Nama_Rek'], $row['DK'], $row['Debit'], $row['Kredit'] ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$pre->add_stamp(1, true);
|
||||||
|
$pre->show();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tkode = $form->textbox("_", "Kode_Jurnal", "", true, false, "text", "kode jurnal");
|
||||||
|
$this->app->json([ 'html' => '
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-6 col-lg-4 col-form-label" for="Kode_Jurnal">Kode Jurnal</label>
|
||||||
|
<div class="col"><div class="input-group">'.$tkode.'<button id="butBrowJurnal" class="btn btn-info" type="button"><i class="bi-search"></i></button></div></div>
|
||||||
|
</div>'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,149 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Report/Gel/HarianjurnalController
|
||||||
|
Description : Laporan Jurnal Harian
|
||||||
|
Created By : Siau Pheng ([email protected]).
|
||||||
|
Created Date : December 16th, 2008.
|
||||||
|
Last Modified : October 22nd, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Report\Gel;
|
||||||
|
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use flight\Session;
|
||||||
|
use Webapp\Data\Xlsx;
|
||||||
|
use Webapp\Printer\PrintHTML;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
|
||||||
|
class HarianjurnalController {
|
||||||
|
|
||||||
|
private string $reg_name;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->reg_name = $session->get('WEB_APP')['REG_NAME'];
|
||||||
|
}
|
||||||
|
|
||||||
|
private function prepare() {
|
||||||
|
$apre = [
|
||||||
|
'id_tipe' => Param::Int("TipeID"),
|
||||||
|
'tgl_from' => Param::Get("Tgl_From"),
|
||||||
|
'tgl_to' => Param::Get("Tgl_To"),
|
||||||
|
];
|
||||||
|
|
||||||
|
$apre['nama_tipe'] = ($apre['id_tipe'] > 0) ? ($this->db->fetchField("SELECT Nama_Tipe FROM gel_tipe WHERE TipeID=?", [$apre['id_tipe']]) ?? '') : '';
|
||||||
|
|
||||||
|
// generate report header
|
||||||
|
$apre['periode'] = $apre['tgl_from'] . ($apre['tgl_from'] !== $apre['tgl_to'] ? ' s/d '.$apre['tgl_to'] : '');
|
||||||
|
|
||||||
|
$tsql = ''; $asql = [tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to'])];
|
||||||
|
if ($apre['id_tipe'] > 0) {
|
||||||
|
$tsql .= " AND TipeID=?";
|
||||||
|
array_push($asql, $apre['id_tipe']);
|
||||||
|
}
|
||||||
|
|
||||||
|
$apre['query'] = $this->db->runQuery("SELECT D.Kode_Jurnal, D.Kode_Rek, A.Nama_Rek, J.Catatan, IF(D.DK='D',D.Jumlah,0) Debit, IF(D.DK='K',D.Jumlah*-1,0) Kredit FROM (SELECT * FROM gel_jurnal_detail WHERE Tgl_Ref BETWEEN ? AND ?".$tsql.") D LEFT JOIN gel_jurnal J ON (D.Kode_Jurnal=J.Kode_Jurnal) LEFT JOIN gel_acc A ON (D.Kode_Rek=A.Kode_Rek) ORDER BY D.Kode_Jurnal, D.DK", $asql);
|
||||||
|
return $apre;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function print() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
|
||||||
|
$pre = new PrintHTML($this->app);
|
||||||
|
$pre->add_title([strtoupper($this->reg_name), "JURNAL HARIAN", "Periode : ".$apre['periode']]);
|
||||||
|
|
||||||
|
$pre->add_field("Kode Jurnal",20,"C");
|
||||||
|
$pre->add_field("Kode",15,"C");
|
||||||
|
$pre->add_field("Nama Rekening",100,"L");
|
||||||
|
$pre->add_field("Deskripsi",150,"L");
|
||||||
|
$pre->add_field("Debit",20,"R","rupiah");
|
||||||
|
$pre->add_field("Kredit",20,"R","rupiah");
|
||||||
|
|
||||||
|
if ($apre['id_tipe'] > 0) $pre->add_sub_title("Tipe Jurnal : ".$apre['nama_tipe']);
|
||||||
|
|
||||||
|
$pre->show_titles();
|
||||||
|
$pre->show_headers();
|
||||||
|
|
||||||
|
$tot_debit = 0; $tot_kredit = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_debit += $row['Debit'];
|
||||||
|
$tot_kredit += $row['Kredit'];
|
||||||
|
|
||||||
|
$pre->add_row([ $row['Kode_Jurnal'], $row['Kode_Rek'], $row['Nama_Rek'], $row['Catatan'], $row['Debit'], $row['Kredit'] ]);
|
||||||
|
}
|
||||||
|
$pre->add_span([ ["TOTAL",4,"R,B"],[$tot_debit,1,"R,B","rupiah"],[$tot_kredit,1,"R,B","rupiah"] ]);
|
||||||
|
|
||||||
|
$pre->add_stamp(1, true);
|
||||||
|
$pre->show();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function excel() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
$xls = new Xlsx($this->app);
|
||||||
|
$xls->set_meta([
|
||||||
|
'title' => "Data Jurnal Harian",
|
||||||
|
'desc' => "Export Data Jurnal Harian"
|
||||||
|
]);
|
||||||
|
$xls->add_title([ $this->reg_name, "DATA JURNAL HARIAN", "Periode : ".$apre['periode'] ]);
|
||||||
|
|
||||||
|
$xls->add_field("Kode Jurnal", 12, "@text");
|
||||||
|
$xls->add_field("Kode", 10, "@text");
|
||||||
|
$xls->add_field("Nama Rekening", 30, "@text");
|
||||||
|
$xls->add_field("Deskripsi", 40, "@text");
|
||||||
|
$xls->add_field("Debit", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Kredit", 15, "#,##0.00");
|
||||||
|
$xls->add_sheet("".str_replace("s/d","-",$apre['periode']));
|
||||||
|
|
||||||
|
if ($apre['id_tipe'] > 0) $xls->add_sub_title("Tipe Jurnal : ".$apre['nama_tipe']);
|
||||||
|
|
||||||
|
$xls->show_titles();
|
||||||
|
$xls->show_headers();
|
||||||
|
|
||||||
|
$tot_debit = 0; $tot_kredit = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_debit += $row['Debit'];
|
||||||
|
$tot_kredit += $row['Kredit'];
|
||||||
|
|
||||||
|
$xls->add_row([ $row['Kode_Jurnal'], $row['Kode_Rek'], $row['Nama_Rek'], $row['Catatan'], $row['Debit'], $row['Kredit'] ]);
|
||||||
|
}
|
||||||
|
$xls->add_row_bold([ "", "", "TOTAL", "", $tot_debit, $tot_kredit ]);
|
||||||
|
|
||||||
|
$xls->add_stamp(1, true);
|
||||||
|
$xls->download("Data Jurnal Harian ".str_replace("s/d","-",$apre['periode']).".xlsx");
|
||||||
|
unset($xls);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$ttipe = $form->option_db("_", "TipeID", 0, true, false, "gel_tipe", ["TipeID","Nama_Tipe"], "Aktif=1", [0,"SEMUA TIPE"]);
|
||||||
|
$tfrom = $form->datebox("_", "Tgl_From", tgl_ymd(), true, false);
|
||||||
|
$tto = $form->datebox("_", "Tgl_To", tgl_ymd(), true, false);
|
||||||
|
$this->app->json([ 'html' => '
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-6 col-lg-4 col-form-label" for="TipeID">Tipe Jurnal</label>
|
||||||
|
<div class="col">'.$ttipe.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-6 col-lg-4 col-form-label" for="Tgl_From">Dari Tanggal</label>
|
||||||
|
<div class="col-sm-6 col-lg-6">'.$tfrom.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-6 col-lg-4 col-form-label" for="Tgl_To">Sampai Tanggal</label>
|
||||||
|
<div class="col-sm-6 col-lg-6">'.$tto.'</div>
|
||||||
|
</div>'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,131 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Report/Gel/HariansaldoController
|
||||||
|
Description : Laporan Rekap Saldo Harian
|
||||||
|
Created By : Siau Pheng ([email protected]).
|
||||||
|
Created Date : December 16th, 2008.
|
||||||
|
Last Modified : October 22nd, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Report\Gel;
|
||||||
|
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use flight\Session;
|
||||||
|
use Webapp\Data\Xlsx;
|
||||||
|
use Webapp\Printer\PrintHTML;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
|
||||||
|
class HariansaldoController {
|
||||||
|
|
||||||
|
private string $reg_name;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->reg_name = $session->get('WEB_APP')['REG_NAME'];
|
||||||
|
}
|
||||||
|
|
||||||
|
private function prepare() {
|
||||||
|
$apre = [
|
||||||
|
'tgl_from' => Param::Get("Tgl_From"),
|
||||||
|
'tgl_to' => Param::Get("Tgl_To"),
|
||||||
|
];
|
||||||
|
|
||||||
|
// generate report header
|
||||||
|
$apre['periode'] = $apre['tgl_from'] . ($apre['tgl_from'] !== $apre['tgl_to'] ? ' s/d '.$apre['tgl_to'] : '');
|
||||||
|
|
||||||
|
$apre['query'] = $this->db->runQuery("SELECT D.*, A.Nama_Rek FROM (SELECT Kode_Rek, SUM(IF(DK='D',Jumlah,0)) Debit, SUM(IF(DK='K',Jumlah*-1,0)) Kredit, SUM(Jumlah) Saldo FROM gel_jurnal_detail WHERE Tgl_Ref BETWEEN ? AND ? GROUP BY Kode_Rek) D LEFT JOIN gel_acc A ON (D.Kode_Rek=A.Kode_Rek)", [tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to'])]);
|
||||||
|
return $apre;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function print() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
|
||||||
|
$pre = new PrintHTML($this->app);
|
||||||
|
$pre->add_title([strtoupper($this->reg_name), "REKAP SALDO HARIAN", "Periode : ".$apre['periode']]);
|
||||||
|
|
||||||
|
$pre->add_field("No.",10,"C");
|
||||||
|
$pre->add_field("Kode",20,"C");
|
||||||
|
$pre->add_field("Nama Rekening",100,"L");
|
||||||
|
$pre->add_field("Debit",20,"R","rupiah");
|
||||||
|
$pre->add_field("Kredit",20,"R","rupiah");
|
||||||
|
$pre->add_field("Saldo",20,"R","rupiah");
|
||||||
|
|
||||||
|
$pre->show_titles();
|
||||||
|
$pre->show_headers();
|
||||||
|
|
||||||
|
$nomor = 0; $tot_debit = 0; $tot_kredit = 0; $tot_saldo = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_debit += $row['Debit'];
|
||||||
|
$tot_kredit += $row['Kredit'];
|
||||||
|
$tot_saldo += $row['Saldo'];
|
||||||
|
$pre->add_row([ ++$nomor, $row['Kode_Rek'], $row['Nama_Rek'], $row['Debit'], $row['Kredit'], $row['Saldo'] ]);
|
||||||
|
}
|
||||||
|
$pre->add_span([ ["TOTAL",3,"R,B"],[$tot_debit,1,"R,B","rupiah"],[$tot_kredit,1,"R,B","rupiah"],[$tot_saldo,1,"R,B","rupiah"] ]);
|
||||||
|
|
||||||
|
$pre->add_stamp(1, true);
|
||||||
|
$pre->show();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function excel() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
$xls = new Xlsx($this->app);
|
||||||
|
$xls->set_meta([
|
||||||
|
'title' => "Data Rekap Saldo Harian",
|
||||||
|
'desc' => "Export Data Rekap Saldo Harian"
|
||||||
|
]);
|
||||||
|
$xls->add_title([ $this->reg_name, "DATA REKAP SALDO HARIAN", "Periode : ".$apre['periode'] ]);
|
||||||
|
|
||||||
|
$xls->add_field("No.", 5, "@integer");
|
||||||
|
$xls->add_field("Kode", 10, "@text");
|
||||||
|
$xls->add_field("Nama Rekening", 30, "@text");
|
||||||
|
$xls->add_field("Debit", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Kredit", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Saldo", 15, "#,##0.00");
|
||||||
|
$xls->add_sheet("".str_replace("s/d","-",$apre['periode']));
|
||||||
|
|
||||||
|
$xls->show_titles();
|
||||||
|
$xls->show_headers();
|
||||||
|
|
||||||
|
$nomor = 0; $tot_debit = 0; $tot_kredit = 0; $tot_saldo = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_debit += $row['Debit'];
|
||||||
|
$tot_kredit += $row['Kredit'];
|
||||||
|
$tot_saldo += $row['Saldo'];
|
||||||
|
$xls->add_row([ ++$nomor, $row['Kode_Rek'], $row['Nama_Rek'], $row['Debit'], $row['Kredit'], $row['Saldo'] ]);
|
||||||
|
}
|
||||||
|
$xls->add_row_bold([ "", "", "TOTAL", $tot_debit, $tot_kredit, $tot_saldo ]);
|
||||||
|
|
||||||
|
$xls->add_stamp(1, true);
|
||||||
|
$xls->download("Data Rekap Saldo Harian ".str_replace("s/d","-",$apre['periode']).".xlsx");
|
||||||
|
unset($xls);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tfrom = $form->datebox("_", "Tgl_From", tgl_ymd(), true, false);
|
||||||
|
$tto = $form->datebox("_", "Tgl_To", tgl_ymd(), true, false);
|
||||||
|
$this->app->json([ 'html' => '
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-6 col-lg-4 col-form-label" for="Tgl_From">Dari Tanggal</label>
|
||||||
|
<div class="col-sm-6 col-lg-6">'.$tfrom.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-6 col-lg-4 col-form-label" for="Tgl_To">Sampai Tanggal</label>
|
||||||
|
<div class="col-sm-6 col-lg-6">'.$tto.'</div>
|
||||||
|
</div>'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,201 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Report/Inv/BarcodeController
|
||||||
|
Description : Laporan Barcode Barang
|
||||||
|
Created By : Siau Pheng ([email protected]).
|
||||||
|
Created Date : October 28th, 2013.
|
||||||
|
Last Modified : October 14th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Report\Inv;
|
||||||
|
|
||||||
|
use App\Utils\Invesa;
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use flight\Session;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
use Webapp\Web\Table;
|
||||||
|
|
||||||
|
class BarcodeController {
|
||||||
|
|
||||||
|
private string $ip_addr;
|
||||||
|
private int $id_cab;
|
||||||
|
private int $id_grup;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->ip_addr = $app->request()->ip;
|
||||||
|
$this->id_cab = $session->get('APP_INV')['CABANGID'] ?? 0;
|
||||||
|
$this->id_grup = $session->get('APP_INV')['ECERANID'] ?? 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function brow_produk() {
|
||||||
|
$tcari = Param::Get("Cari_Produk");
|
||||||
|
$tsql = ''; $asql = [$this->id_grup, 1];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql .= " AND Barcode_Nama LIKE ?";
|
||||||
|
$asql[] = '%' . $tcari . '%';
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("inv_produk_join", "*", "Grup_MemberID=? AND Aktif=?".$tsql, $asql);
|
||||||
|
$obj->add_field("InvID", "ID", "hid");
|
||||||
|
$obj->add_field("SatuanID", "ID", "hid");
|
||||||
|
$obj->add_field("VarianID", "ID", "hid");
|
||||||
|
$obj->add_field("Kode_SKU", "SKU", "c");
|
||||||
|
$obj->add_field("Kode_Barcode", "Barcode", "c");
|
||||||
|
$obj->add_field("Nama_Lengkap", "Nama Barang", "awr");
|
||||||
|
$obj->set_field_order("Kode_SKU", "A");
|
||||||
|
$obj->set_func_select("RepoInvBarcodeJS.produk_select");
|
||||||
|
$this->app->json([ $obj->db_table("divBrowProduk") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function auto_produk() {
|
||||||
|
$tcari = Param::Get("Auto_Query", "");
|
||||||
|
$ajson['autodata'] = [];
|
||||||
|
$bcode = 0; $arec = [];
|
||||||
|
|
||||||
|
// Cari by SKU + Barcode
|
||||||
|
$_row = $this->db->fetchRow("SELECT P.InvID,P.Nama_Lengkap,CONCAT(P.SatuanID,':',P.VarianID,':',P.Kode_SKU) Data2 FROM (SELECT * FROM inv_produk_join WHERE Grup_MemberID=? AND Aktif=1 AND (Kode_SKU=? OR Kode_Barcode=?)) P", [$this->id_grup, $tcari, $tcari]);
|
||||||
|
if ($_row) {
|
||||||
|
$bcode = 1;
|
||||||
|
$arec = $_row->getData();
|
||||||
|
}
|
||||||
|
if ($bcode === 1) {
|
||||||
|
$ajson['autodata'][] = ['value'=>$arec['InvID'], 'text'=>$arec['Nama_Lengkap'], 'data'=>$arec['Data2'], 'bc'=>1];
|
||||||
|
} else {
|
||||||
|
$stat = $this->db->runQuery("SELECT P.InvID,P.Nama_Lengkap,P.Kode_SKU,CONCAT(P.SatuanID,':',P.VarianID,':',P.Kode_SKU) Data2 FROM (SELECT * FROM inv_produk_join WHERE Barcode_Nama LIKE ? AND Grup_MemberID=? AND Aktif=1) P ORDER BY P.Nama_Produk,P.Qty LIMIT 50", ['%'.$tcari.'%', $this->id_grup]);
|
||||||
|
while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$ajson['autodata'][] = ['value'=>$row['InvID'], 'text'=>$row['Nama_Lengkap'], 'html'=>'<span class="text-primary">'.$row['Kode_SKU'].'</span> '.$row['Nama_Lengkap'], 'data'=>$row['Data2'], 'bc'=>0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function barcode() {
|
||||||
|
$id_inv = Param::Int("InvID", 0);
|
||||||
|
$id_sat = Param::Int("SatuanID", 0);
|
||||||
|
$id_var = Param::Int("VarianID", 0);
|
||||||
|
$qty = Param::Int("Qty", 3);
|
||||||
|
$nkolom = (str_contains(Param::Get("Printer"), "XP")) ? 2 : 3;
|
||||||
|
$nbaris = (int) ceil($qty / $nkolom);
|
||||||
|
$ajson = [];
|
||||||
|
|
||||||
|
$barang = $this->db->fetchRow("SELECT Kode_SKU,Harga_Jual,LEFT(Nama_Lengkap,20) Nama FROM inv_produk_join WHERE InvID=? AND SatuanID=? AND VarianID=? AND Grup_MemberID=? ORDER BY Harga_Jual DESC LIMIT 1", [$id_inv, $id_sat, $id_var, $this->id_grup]);
|
||||||
|
if ($barang) {
|
||||||
|
$ajson = ['type' => "epl", 'config' => ['times' => 1], 'content' => $this->gen_bc_epl("Rp.".rupiah($barang->Harga_Jual), $barang->Nama, $barang->Kode_SKU, $nbaris, $nkolom)];
|
||||||
|
}
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function load_printer() {
|
||||||
|
$aprint = json_decode(stripslashes(Param::Get("Printer", "[]")), true);
|
||||||
|
$avalue = [['value'=>"", 'html'=>"Pilih Printer"]];
|
||||||
|
$tdefp = Param::Get("DefPrint", "");
|
||||||
|
$this->db->runQuery("DELETE FROM app_printer WHERE IP=? AND CabID=?", [$this->ip_addr, $this->id_cab]);
|
||||||
|
foreach ($aprint as $_val) {
|
||||||
|
if (!empty($_val)) {
|
||||||
|
$this->db->runQuery("INSERT IGNORE INTO app_printer SET IP=?,CabID=?,N_Printer=?,Defa=?", [$this->ip_addr, $this->id_cab, $_val, ($tdefp === $_val) ? 1 : 0]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$aprinter = $this->db->fetchAll("SELECT * FROM app_printer WHERE IP=? AND CabID=?", [$this->ip_addr, $this->id_cab]);
|
||||||
|
foreach ($aprinter as $row) $avalue[] = ['value'=>$row['N_Printer'], 'html'=>$row['N_Printer']];
|
||||||
|
$ajson[] = ['type'=>"option", 'id'=>"Printer", 'avalue'=>$avalue];
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tsku = $form->textbox("_", "Kode_SKU", null, false, false);
|
||||||
|
$tproduk = $form->textauto("_", "Nama_Produk", ['value'=>0,'text'=>""], true, true, "nama barang");
|
||||||
|
$tprt = $form->option_db("_", "Printer", "", true, false, "app_printer", ["N_Printer","N_Printer"], "IP='".$this->ip_addr."' AND CabID='".(string) $this->id_cab."'", [0,"Pilih Printer"]);
|
||||||
|
$tqty = $form->textbox("_", "Qty", 3, true, false, "number");
|
||||||
|
$ajson['html'] = '
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label">Kode SKU</label>
|
||||||
|
<div class="col-sm-6 col-lg-5">'.$tsku.'</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"><div class="input-group">'.$tproduk.'<button id="butBrowProduk" class="btn btn-info" type="button"><i class="bi-bag"></i></button></div></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-4 col-lg-3 col-form-label" for="Printer">Nama Printer</label>
|
||||||
|
<div class="col"><div class="input-group">'.$tprt.'<button id="butLoadPrinter" class="btn btn-warning" type="button"><i class="bi-printer"></i></button></div></div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="Qty">Jumlah Stiker</label>
|
||||||
|
<div class="col-sm-5 col-lg-3"><div class="input-group">'.$tqty.Invesa::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" >
|
||||||
|
<input type="hidden" id="VarianID" value="0" >';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function gen_bc_epl(string $harga="", string $nama="", string $barc="", int $baris=1, int $kolom=3): array {
|
||||||
|
if ($kolom == 2) {
|
||||||
|
//q582
|
||||||
|
$hasil = ['N',
|
||||||
|
'Q120,24',
|
||||||
|
'A6,99,3,3,1,1,N,"Cahaya"',
|
||||||
|
'A26,83,3,3,1,1,N,"Masa"',
|
||||||
|
'A14,1,0,2,1,1,N,"'.$nama.'"',
|
||||||
|
'B54,22,0,1,2,5,60,N,"'.$barc.'"',
|
||||||
|
'A64,75,0,4,1,1,N,"'.$harga.'"',
|
||||||
|
'A238,22,1,3,1,1,N,"HSmart"',
|
||||||
|
'A258,30,1,3,1,1,N,"RYN\'S"',
|
||||||
|
'A293,99,3,3,1,1,N,"Cahaya"',
|
||||||
|
'A313,83,3,3,1,1,N,"Masa"',
|
||||||
|
'A301,1,0,2,1,1,N,"'.$nama.'"',
|
||||||
|
'B341,22,0,1,2,5,60,N,"'.$barc.'"',
|
||||||
|
'A351,72,0,4,1,1,N,"'.$harga.'"',
|
||||||
|
'A525,22,1,3,1,1,N,"HSmart"',
|
||||||
|
'A545,30,1,3,1,1,N,"RYN\'S"',
|
||||||
|
'P'.$baris,
|
||||||
|
''];
|
||||||
|
|
||||||
|
} else {
|
||||||
|
//q960
|
||||||
|
$hasil = ['N',
|
||||||
|
'Q120,24',
|
||||||
|
'A4,98,3,3,1,1,N,"Cahaya"',
|
||||||
|
'A24,82,3,3,1,1,N,"Masa"',
|
||||||
|
'A12,0,0,2,1,1,N,"'.$nama.'"',
|
||||||
|
'B52,21,0,1,2,5,60,N,"'.$barc.'"',
|
||||||
|
'A62,74,0,4,1,1,N,"'.$harga.'"',
|
||||||
|
'A236,21,1,3,1,1,N,"HSmart"',
|
||||||
|
'A256,29,1,3,1,1,N,"RYN\'S"',
|
||||||
|
'A284,98,3,3,1,1,N,"Cahaya"',
|
||||||
|
'A304,82,3,3,1,1,N,"Masa"',
|
||||||
|
'A292,0,0,2,1,1,N,"'.$nama.'"',
|
||||||
|
'B332,21,0,1,2,5,60,N,"'.$barc.'"',
|
||||||
|
'A342,71,0,4,1,1,N,"'.$harga.'"',
|
||||||
|
'A516,21,1,3,1,1,N,"HSmart"',
|
||||||
|
'A536,29,1,3,1,1,N,"RYN\'S"',
|
||||||
|
'A564,98,3,3,1,1,N,"Cahaya"',
|
||||||
|
'A584,82,3,3,1,1,N,"Masa"',
|
||||||
|
'A572,0,0,2,1,1,N,"'.$nama.'"',
|
||||||
|
'B612,21,0,1,2,5,60,N,"'.$barc.'"',
|
||||||
|
'A622,71,0,4,1,1,N,"'.$harga.'"',
|
||||||
|
'A796,21,1,3,1,1,N,"HSmart"',
|
||||||
|
'A816,29,1,3,1,1,N,"RYN\'S"',
|
||||||
|
'P'.$baris,
|
||||||
|
''];
|
||||||
|
}
|
||||||
|
return $hasil;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,211 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Report/Inv/HutangController
|
||||||
|
Description : Laporan Hutang Supplier
|
||||||
|
Created By : Siau Pheng ([email protected]).
|
||||||
|
Created Date : July 17th, 2011.
|
||||||
|
Last Modified : October 8th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Report\Inv;
|
||||||
|
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use flight\Session;
|
||||||
|
use Webapp\Data\Xlsx;
|
||||||
|
use Webapp\Printer\PrintHTML;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
|
||||||
|
class HutangController {
|
||||||
|
|
||||||
|
private int $id_cab;
|
||||||
|
private string $reg_name;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->id_cab = Param::Int("CabID", 0);
|
||||||
|
$this->reg_name = $session->get('WEB_APP')['REG_NAME'];
|
||||||
|
}
|
||||||
|
|
||||||
|
private function prepare() {
|
||||||
|
$apre = [
|
||||||
|
'tipe' => Param::Get("Tipe", "R"), // R or D
|
||||||
|
'id_sup' => Param::Int("SupID", 0),
|
||||||
|
'tgl_from' => Param::Get("Tgl_From"),
|
||||||
|
'tgl_to' => Param::Get("Tgl_To"),
|
||||||
|
];
|
||||||
|
|
||||||
|
$apre['nama_sup'] = ($apre['id_sup'] > 0) ? ($this->db->fetchField("SELECT CONCAT(Nama_Sup,' (',Kode_Sup,')') Nama FROM para_supplier WHERE SupID=?", [$apre['id_sup']]) ?? '') : '';
|
||||||
|
|
||||||
|
// generate report header
|
||||||
|
$apre['periode'] = $apre['tgl_from'] . ($apre['tgl_from'] !== $apre['tgl_to'] ? ' s/d '.$apre['tgl_to'] : '');
|
||||||
|
|
||||||
|
$tsql = ''; $asql = [tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to'])];
|
||||||
|
if ($this->id_cab > 0) {
|
||||||
|
$tsql .= " AND CabID=?";
|
||||||
|
array_push($asql, $this->id_cab);
|
||||||
|
}
|
||||||
|
if ($apre['id_sup'] > 0) {
|
||||||
|
$tsql .= " AND SupID=?";
|
||||||
|
array_push($asql, $apre['id_sup']);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($apre['tipe'] === "R") {
|
||||||
|
$apre['query'] = $this->db->runQuery("SELECT B.*,S.Nama_Sup FROM (SELECT SupID,SUM(Real_Beli) Total_Hutang,SUM(Total_Bayar+Total_Potong) Total_Bayar FROM inv_beli WHERE Lunas=0 AND (Tgl_Beli BETWEEN ? AND ?)".$tsql." GROUP BY SupID) B LEFT JOIN para_supplier S ON (B.SupID=S.SupID) ORDER BY S.Nama_Sup", $asql);
|
||||||
|
} else {
|
||||||
|
$apre['query'] = $this->db->runQuery("SELECT B.*,CONCAT(S.Nama_Sup,IF(B.Data_Beli=1,'',' <i>(Retur)</i>')) Nama_Sup,B.Real_Beli Total_Hutang,B.Total_Bayar+B.Total_Potong Total_Bayar FROM (SELECT * FROM inv_beli WHERE Lunas=0 AND (Tgl_Beli BETWEEN ? AND ?)".$tsql.") B LEFT JOIN para_supplier S ON (B.SupID=S.SupID) ORDER BY B.No_Beli", $asql);
|
||||||
|
}
|
||||||
|
return $apre;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function print() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
|
||||||
|
$pre = new PrintHTML($this->app);
|
||||||
|
$pre->add_title([strtoupper($this->reg_name), ($apre['tipe']==="R"?"REKAP":"DETAIL")." HUTANG SUPPLIER", "Periode : ".$apre['periode']]);
|
||||||
|
|
||||||
|
if ($apre['tipe'] === "R") {
|
||||||
|
$pre->add_field("No.",10,"C");
|
||||||
|
$pre->add_field("Nama Supplier",50,"L");
|
||||||
|
$pre->add_field("Jumlah Faktur",20,"R","rupiah");
|
||||||
|
$pre->add_field("Jumlah Bayar",20,"R","rupiah");
|
||||||
|
$pre->add_field("Sisa Hutang",20,"R","rupiah");
|
||||||
|
|
||||||
|
if ($apre['id_sup'] > 0) $pre->add_sub_title("Nama Supplier : ".$apre['nama_sup']);
|
||||||
|
|
||||||
|
$pre->show_titles();
|
||||||
|
$pre->show_headers();
|
||||||
|
|
||||||
|
$tot_hutang = 0; $tot_bayar = 0; $nomor = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_hutang += $row['Total_Hutang'];
|
||||||
|
$tot_bayar += $row['Total_Bayar'];
|
||||||
|
$pre->add_row([ ++$nomor, $row['Nama_Sup'], $row['Total_Hutang'], $row['Total_Bayar'], $row['Total_Hutang'] - $row['Total_Bayar'] ]);
|
||||||
|
}
|
||||||
|
$pre->add_span([ ["GRAND TOTAL",2,"R,B"],[$tot_hutang,1,"R,B","rupiah"],[$tot_bayar,1,"R,B","rupiah"],[$tot_hutang-$tot_bayar,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("Jumlah",20,"R","rupiah");
|
||||||
|
$pre->add_field("Bayar",20,"R","rupiah");
|
||||||
|
$pre->add_field("Sisa Hutang",20,"R","rupiah");
|
||||||
|
|
||||||
|
if ($apre['id_sup'] > 0) $pre->add_sub_title("Nama Supplier : ".$apre['nama_sup']);
|
||||||
|
|
||||||
|
$pre->show_titles();
|
||||||
|
$pre->show_headers();
|
||||||
|
|
||||||
|
$tot_hutang = 0; $tot_bayar = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_hutang += $row['Total_Hutang'];
|
||||||
|
$tot_bayar += $row['Total_Bayar'];
|
||||||
|
$pre->add_row([ $row['No_Beli'], $row['Tgl_Beli'], $row['Nama_Sup'], $row['Total_Hutang'], $row['Total_Bayar'], $row['Total_Hutang'] - $row['Total_Bayar'] ]);
|
||||||
|
}
|
||||||
|
$pre->add_span([ ["GRAND TOTAL",3,"R,B"],[$tot_hutang,1,"R,B","rupiah"],[$tot_bayar,1,"R,B","rupiah"],[$tot_hutang-$tot_bayar,1,"R,B","rupiah"] ]);
|
||||||
|
}
|
||||||
|
$pre->add_stamp(1, true);
|
||||||
|
$pre->show();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function excel() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
$xls = new Xlsx($this->app);
|
||||||
|
$xls->set_meta([
|
||||||
|
'title' => "Data Hutang Supplier",
|
||||||
|
'desc' => "Export Data Hutang Supplier"
|
||||||
|
]);
|
||||||
|
$xls->add_title([ $this->reg_name, "DATA ".($apre['tipe']==="R"?"REKAP":"DETAIL")." HUTANG SUPPLIER", "Periode : ".$apre['periode'] ]);
|
||||||
|
|
||||||
|
if ($apre['tipe'] === "R") {
|
||||||
|
$xls->add_field("No.", 5, "@integer");
|
||||||
|
$xls->add_field("Nama Supplier", 25, "@text");
|
||||||
|
$xls->add_field("Jumlah Faktur", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Jumlah Bayar", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Sisa Hutang", 15, "#,##0.00");
|
||||||
|
$xls->add_sheet("".str_replace("s/d","-",$apre['periode']));
|
||||||
|
|
||||||
|
if ($apre['id_sup'] > 0) $xls->add_sub_title("Nama Supplier : ".$apre['nama_sup']);
|
||||||
|
|
||||||
|
$xls->show_titles();
|
||||||
|
$xls->show_headers();
|
||||||
|
|
||||||
|
$tot_hutang = 0; $tot_bayar = 0; $nomor = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_hutang += $row['Total_Hutang'];
|
||||||
|
$tot_bayar += $row['Total_Bayar'];
|
||||||
|
$xls->add_row([ ++$nomor, $row['Nama_Sup'], $row['Total_Hutang'], $row['Total_Bayar'], $row['Total_Hutang'] - $row['Total_Bayar'] ]);
|
||||||
|
}
|
||||||
|
$xls->add_row_bold([ "", "GRAND TOTAL", $tot_hutang, $tot_bayar, $tot_hutang-$tot_bayar ]);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
$xls->add_field("No. Nota", 15, "@");
|
||||||
|
$xls->add_field("Tgl. Nota", 12, "@date");
|
||||||
|
$xls->add_field("Nama Supplier", 20, "@text");
|
||||||
|
$xls->add_field("Jumlah", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Bayar", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Sisa Hutang", 15, "#,##0.00");
|
||||||
|
$xls->add_sheet("".str_replace("s/d","-",$apre['periode']));
|
||||||
|
|
||||||
|
if ($apre['id_sup'] > 0) $xls->add_sub_title("Nama Supplier : ".$apre['nama_sup']);
|
||||||
|
|
||||||
|
$xls->show_titles();
|
||||||
|
$xls->show_headers();
|
||||||
|
|
||||||
|
$tot_hutang = 0; $tot_bayar = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_hutang += $row['Total_Hutang'];
|
||||||
|
$tot_bayar += $row['Total_Bayar'];
|
||||||
|
$xls->add_row([ $row['No_Beli'], $row['Tgl_Beli'], $row['Nama_Sup'], $row['Total_Hutang'], $row['Total_Bayar'], $row['Total_Hutang'] - $row['Total_Bayar'] ]);
|
||||||
|
}
|
||||||
|
$xls->add_row_bold([ "", "", "GRAND TOTAL", $tot_hutang, $tot_bayar, $tot_hutang-$tot_bayar ]);
|
||||||
|
}
|
||||||
|
$xls->add_stamp(1, true);
|
||||||
|
$xls->download("Data Hutang Supplier ".str_replace("s/d","-",$apre['periode']).".xlsx");
|
||||||
|
unset($xls);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$ttipe = $form->radio("_", "Tipe", "R", true, false, ["R"=>"Rekap","D"=>"Detail"]);
|
||||||
|
$tcab = $form->option_db("_", "CabID", $this->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);
|
||||||
|
$ajson['html'] = '
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="Tipe">Tipe Laporan</label>
|
||||||
|
<div class="col">'.$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>';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,188 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Report/Inv/LabelController
|
||||||
|
Description : Cetak Label Harga
|
||||||
|
Created By : Siau Pheng ([email protected]).
|
||||||
|
Created Date : September 13th, 2014.
|
||||||
|
Last Modified : October 16th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Report\Inv;
|
||||||
|
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use flight\Session;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
use Webapp\Web\Table;
|
||||||
|
|
||||||
|
class LabelController {
|
||||||
|
|
||||||
|
private string $mode;
|
||||||
|
private string $mode_detail;
|
||||||
|
private int $id_grup;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->mode = Param::Get("mode", "");
|
||||||
|
$this->mode_detail = Param::Get("mode_detail", "");
|
||||||
|
$this->id_grup = $session->get('APP_INV')['ECERANID'] ?? 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function table_detail() {
|
||||||
|
if ( $this->mode_detail === "empty" ) {
|
||||||
|
$this->db->runQuery("TRUNCATE rep_label");
|
||||||
|
} else if ( $this->mode_detail === "update" ) {
|
||||||
|
$this->db->runQuery("UPDATE rep_label SET Nama_Produk=? WHERE ID=?", [Param::Get("Nama_Produk"), Param::Int("ID", 0)]);
|
||||||
|
} else if ( $this->mode_detail === "delete" ) {
|
||||||
|
$this->db->runQuery("DELETE FROM rep_label WHERE ID=?", [Param::Int("ID", 0)]);;
|
||||||
|
} else if ( $this->mode_detail === "simpan-produk" ) {
|
||||||
|
$list_id = Param::Get("List_CB_InvID", "0");
|
||||||
|
if ($list_id !== "0") {
|
||||||
|
$alist = explode(",", $list_id);
|
||||||
|
$this->db->runQuery("INSERT INTO rep_label (InvID,Nama_Produk,Harga_Jual,UserID) SELECT InvID,LEFT(Nama_Produk,25),Harga_Jual,? FROM inv_produk_join WHERE InvID IN (?) AND Grup_MemberID=?", [$this->app->user()->id(), $alist, $this->id_grup]);
|
||||||
|
}
|
||||||
|
} else if ( $this->mode_detail === "simpan-grup" ) {
|
||||||
|
$id_grup = Param::Int("Grup_InvID", 0);
|
||||||
|
if ($id_grup > 0) {
|
||||||
|
$this->db->runQuery("INSERT INTO rep_label (InvID,Nama_Produk,Harga_Jual,UserID) SELECT InvID,LEFT(Nama_Produk,25),Harga_Jual,? FROM inv_produk_join WHERE Aktif=1 AND Grup_MemberID=? AND Grup_InvID=? AND Harga_Jual>0", [$this->app->user()->id(), $this->id_grup, $id_grup]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("rep_label", "*", "", []);
|
||||||
|
$obj->add_field("ID", "No", "c");
|
||||||
|
$obj->add_field("Nama_Produk", "Nama Barang", "awr");
|
||||||
|
$obj->add_field("Harga_Jual", "Harga @", "r", "rupiah");
|
||||||
|
$obj->set_field_order("ID", "D");
|
||||||
|
$obj->add_row_btn("clipboard", "Ubah", "RepoInvLabelJS.detail_ubah");
|
||||||
|
$obj->add_row_btn("trash", "Hapus", "RepoInvLabelJS.detail_hapus", "UserID", $this->app->user()->id());
|
||||||
|
$obj->set_func_btn("RepoInvLabelJS.produk_brow", '<i class="bi-plus-lg me-1"></i> Barang');
|
||||||
|
$obj->set_func_btn("RepoInvLabelJS.grup_brow", '<i class="bi-table me-1"></i> Browse');
|
||||||
|
$ajson[] = $obj->json_table("divDetailTabel");
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function brow_grup() {
|
||||||
|
$tcari = Param::Get("Cari_Grup");
|
||||||
|
$tsql = ''; $asql = [];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql .= " AND CONCAT(Kode_Grup,Nama_Grup) LIKE ?";
|
||||||
|
array_push($asql, '%' . $tcari . '%');
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("inv_produk_grup", "*", "Aktif=1".$tsql, $asql);
|
||||||
|
$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->set_func_select("RepoInvLabelJS.grup_select");
|
||||||
|
$this->app->json([ $obj->db_table("divBrowGrup") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function brow_produk() {
|
||||||
|
$tcari = Param::Get("Cari_Produk");
|
||||||
|
$tsql = ''; $asql = [];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql .= " AND Barcode_Nama LIKE ?";
|
||||||
|
array_push($asql, '%' . $tcari . '%');
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("(SELECT * FROM inv_produk_join WHERE Aktif=1".$tsql." GROUP BY InvID,SatuanID,VarianID) P LEFT JOIN rep_label L ON (L.InvID=P.InvID)", "P.*,IF(IFNULL(L.InvID,0)=0,'N','Y') Pilih", "", $asql);
|
||||||
|
$obj->add_field("InvID", "ID", "hid");
|
||||||
|
$obj->add_field("SatuanID", "ID", "hid");
|
||||||
|
$obj->add_field("VarianID", "ID", "hid");
|
||||||
|
$obj->add_field("Kode_SKU", "SKU", "c");
|
||||||
|
$obj->add_field("Kode_Barcode", "Barcode", "c");
|
||||||
|
$obj->add_field("Nama_Lengkap", "Nama Barang", "awr");
|
||||||
|
$obj->set_field_order("Kode_SKU", "A");
|
||||||
|
$obj->add_row_checkbox("InvID", "Pilih", ['Y','N']);
|
||||||
|
$this->app->json([ $obj->db_table("divBrowProduk") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_detail() {
|
||||||
|
$id = Param::Int("ID", 0);
|
||||||
|
$atabel = [ 'ID'=>$id, 'Nama_Produk'=>"" ];
|
||||||
|
if ($id > 0) {
|
||||||
|
$_row = $this->db->fetchRow("SELECT * FROM rep_label WHERE ID=?", [$id]);
|
||||||
|
if ($_row) $atabel = array_merge($atabel, $_row->getData());
|
||||||
|
}
|
||||||
|
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tproduk = $form->textbox("_", "Nama_Produk", $atabel['Nama_Produk'], true, false, "text");
|
||||||
|
$ajson['html'] = '
|
||||||
|
<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">'.$tproduk.'</div>
|
||||||
|
</div>
|
||||||
|
<input type="hidden" id="ID" value="'.$atabel['ID'].'" >
|
||||||
|
<input type="hidden" id="mode_detail" value="'.$this->mode_detail.'" >';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function print() {
|
||||||
|
$query = $this->db->runQuery("SELECT * FROM rep_label ORDER BY ID");
|
||||||
|
if ($query->rowCount() === 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 = 1; $nb = 1; $cont = "";
|
||||||
|
while ($row = $query->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
if ($ni === 4) {
|
||||||
|
if ($nb === 8) {
|
||||||
|
$cont .= '</tr></table><p id="linebreak">................ page break ................</p><p id="pagebreak"> </p>' . $_head;
|
||||||
|
$nb = 0;
|
||||||
|
} else {
|
||||||
|
$cont .= '</tr><tr>';
|
||||||
|
}
|
||||||
|
$ni = 1;
|
||||||
|
$nb++;
|
||||||
|
}
|
||||||
|
$cont .= sprintf($_line, $row['Nama_Produk'], "Rp. ".rupiah($row['Harga_Jual']));
|
||||||
|
$ni++;
|
||||||
|
}
|
||||||
|
if ($ni < 4) {
|
||||||
|
while ($ni < 4) {
|
||||||
|
$cont .= sprintf($_line, "", "");
|
||||||
|
$ni++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
echo '<p id="autopage"> </p>' . $_head . $cont . "</tr></table>";
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$this->app->json(['html' => '
|
||||||
|
<div class="fade-in">
|
||||||
|
<div class="card"><div class="card-body">
|
||||||
|
<ul class="nav nav-tabs" role="tablist">
|
||||||
|
<li class="nav-item" role="presentation">
|
||||||
|
<button class="nav-link active" id="tx-tab" data-bs-toggle="tab" data-bs-target="#tx" type="button" role="tab" aria-controls="tx" aria-selected="true"><i class="bi-printer me-2"></i>Cetak Label Harga</button>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item ms-auto">
|
||||||
|
<button class="btn btn-warning mb-1 ms-2" id="butHapus" type="button"><i class="bi-trash me-2"></i>Hapus</button>
|
||||||
|
<button class="btn btn-secondary mb-1 ms-2" id="butPrint" type="button"><i class="bi-printer me-2"></i>Cetak</button>
|
||||||
|
<button class="btn btn-secondary mb-1 ms-2" id="butPreview" type="button"><i class="bi-display me-2"></i>Pratinjau</button>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<div class="tab-content border border-top-0 p-3">
|
||||||
|
<div class="tab-pane fade active show" id="tx" role="tabpanel" aria-labelledby="tx-tab">
|
||||||
|
<div id="divDetailTabel"> </div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div></div>
|
||||||
|
</div>'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,245 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Report/Inv/PiutangController
|
||||||
|
Description : Laporan Piutang Member
|
||||||
|
Created By : Siau Pheng ([email protected]).
|
||||||
|
Created Date : July 17th, 2011.
|
||||||
|
Last Modified : October 8th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Report\Inv;
|
||||||
|
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use flight\Session;
|
||||||
|
use Webapp\Data\Xlsx;
|
||||||
|
use Webapp\Printer\PrintHTML;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
use Webapp\Web\Table;
|
||||||
|
|
||||||
|
class PiutangController {
|
||||||
|
|
||||||
|
private int $id_cab;
|
||||||
|
private string $reg_name;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->id_cab = Param::Int("CabID", 0);
|
||||||
|
$this->reg_name = $session->get('WEB_APP')['REG_NAME'];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function brow_member() {
|
||||||
|
$tcari = Param::Get("Cari_Member");
|
||||||
|
$tsql = ''; $asql = [1];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql .= " AND CONCAT_WS(Kode_Member,Nama_Member,Alamat_Member,Telp_Member) LIKE ?";
|
||||||
|
$asql[] = '%' . $tcari . '%';
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("para_member", "*,CONCAT(IF(Kode_Member='','',CONCAT(Kode_Member,' - ')),Nama_Member) Kode_Nama", "Aktif=?".$tsql, $asql);
|
||||||
|
$obj->add_field("MemberID", "ID", "hid");
|
||||||
|
$obj->add_field("Kode_Nama", "Kode_Nama", "hid");
|
||||||
|
$obj->add_field("Kode_Member", "Kode", "c");
|
||||||
|
$obj->add_field("Nama_Member", "Nama Member", "awr");
|
||||||
|
$obj->add_field("Alamat_Member", "Alamat", "awr");
|
||||||
|
$obj->add_field("Telp_Member", "Telp.", "awr");
|
||||||
|
$obj->set_field_order("Nama_Member", "A");
|
||||||
|
$obj->set_func_select("RepoInvPiutangJS.member_select");
|
||||||
|
$this->app->json([ $obj->db_table("divBrowMember") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function auto_member() {
|
||||||
|
$tcari = Param::Get("Auto_Query", "");
|
||||||
|
$ajson['autodata'] = [];
|
||||||
|
|
||||||
|
$stat = $this->db->runQuery("SELECT MemberID,Grup_MemberID,Kode_Member,Nama_Member,CONCAT(IF(Kode_Member='','',CONCAT(Kode_Member,' - ')),Nama_Member) Kode_Nama FROM para_member WHERE Aktif=1 AND CONCAT(Kode_Member,Nama_Member,Alamat_Member,Telp_Member) LIKE ? ORDER BY Nama_Member LIMIT 50", ['%'.$tcari.'%']);
|
||||||
|
while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$ajson['autodata'][] = ['value'=>$row['MemberID'], 'text'=>$row['Kode_Nama'], 'html'=>'<span class="text-primary">'.$row['Kode_Member'].'</span> '.$row['Nama_Member'], 'data'=>0, 'bc'=>0];
|
||||||
|
}
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function prepare() {
|
||||||
|
$apre = [
|
||||||
|
'tipe' => Param::Get("Tipe", "R"), // R or D
|
||||||
|
'id_mem' => Param::Int("MemberID", 0),
|
||||||
|
'tgl_from' => Param::Get("Tgl_From"),
|
||||||
|
'tgl_to' => Param::Get("Tgl_To"),
|
||||||
|
];
|
||||||
|
|
||||||
|
$apre['nama_mem'] = ($apre['id_mem'] > 0) ? ($this->db->fetchField("SELECT CONCAT(Nama_Member,' (',Kode_Member,')') Nama FROM para_member WHERE MemberID=?", [$apre['id_mem']]) ?? '') : '';
|
||||||
|
|
||||||
|
// generate report header
|
||||||
|
$apre['periode'] = $apre['tgl_from'] . ($apre['tgl_from'] !== $apre['tgl_to'] ? ' s/d '.$apre['tgl_to'] : '');
|
||||||
|
|
||||||
|
$tsql = ''; $asql = [tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to'])];
|
||||||
|
if ($this->id_cab > 0) {
|
||||||
|
$tsql .= " AND CabID=?";
|
||||||
|
array_push($asql, $this->id_cab);
|
||||||
|
}
|
||||||
|
if ($apre['id_mem'] > 0) {
|
||||||
|
$tsql .= " AND MemberID=?";
|
||||||
|
array_push($asql, $apre['id_mem']);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($apre['tipe'] === "R") {
|
||||||
|
$apre['query'] = $this->db->runQuery("SELECT J.*,O.Nama_Member FROM (SELECT MemberID,SUM(Total_Jual-Total_Diskon) Total_Piutang,SUM(Total_Bayar+Total_Potong) Total_Bayar, SUM(Total_Jual-Total_Diskon-Total_Bayar-Total_Potong) Total_Sisa FROM inv_jual WHERE Lunas=0 AND (Tgl_Jual BETWEEN ? AND ?)".$tsql." GROUP BY MemberID) J LEFT JOIN para_member O ON (J.MemberID=O.MemberID) ORDER BY O.Nama_Member", $asql);
|
||||||
|
} else {
|
||||||
|
$apre['query'] = $this->db->runQuery("SELECT J.*,O.Nama_Member FROM (SELECT *,Total_Jual-Total_Diskon Total_Piutang,Total_Jual-Total_Diskon-Total_Bayar-Total_Potong Total_Sisa FROM inv_jual WHERE Lunas=0 AND (Tgl_Jual BETWEEN ? AND ?)".$tsql.") J LEFT JOIN para_member O ON (J.MemberID=O.MemberID) ORDER BY J.No_Jual", $asql);
|
||||||
|
}
|
||||||
|
return $apre;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function print() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
|
||||||
|
$pre = new PrintHTML($this->app);
|
||||||
|
$pre->add_title([strtoupper($this->reg_name), ($apre['tipe']==="R"?"REKAP":"DETAIL")." PIUTANG MEMBER", "Periode : ".$apre['periode']]);
|
||||||
|
|
||||||
|
if ($apre['tipe'] === "R") {
|
||||||
|
$pre->add_field("No.",10,"C");
|
||||||
|
$pre->add_field("Nama Member",50,"L");
|
||||||
|
$pre->add_field("Jumlah Faktur",20,"R","rupiah");
|
||||||
|
$pre->add_field("Jumlah Bayar",20,"R","rupiah");
|
||||||
|
$pre->add_field("Sisa Piutang",20,"R","rupiah");
|
||||||
|
|
||||||
|
if ($apre['id_mem'] > 0) $pre->add_sub_title("Nama Member : ".$apre['nama_mem']);
|
||||||
|
|
||||||
|
$pre->show_titles();
|
||||||
|
$pre->show_headers();
|
||||||
|
|
||||||
|
$tot_piutang = 0; $tot_bayar = 0; $nomor = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_piutang += $row['Total_Piutang'];
|
||||||
|
$tot_bayar += $row['Total_Bayar'];
|
||||||
|
$pre->add_row([ ++$nomor, $row['Nama_Member'], $row['Total_Piutang'], $row['Total_Bayar'], $row['Total_Sisa'] ]);
|
||||||
|
}
|
||||||
|
$pre->add_span([ ["GRAND TOTAL",2,"R,B"],[$tot_piutang,1,"R,B","rupiah"],[$tot_bayar,1,"R,B","rupiah"],[$tot_piutang-$tot_bayar,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 Member",50,"L");
|
||||||
|
$pre->add_field("Jumlah",20,"R","rupiah");
|
||||||
|
$pre->add_field("Bayar",20,"R","rupiah");
|
||||||
|
$pre->add_field("Sisa Piutang",20,"R","rupiah");
|
||||||
|
|
||||||
|
if ($apre['id_mem'] > 0) $pre->add_sub_title("Nama Member : ".$apre['nama_mem']);
|
||||||
|
|
||||||
|
$pre->show_titles();
|
||||||
|
$pre->show_headers();
|
||||||
|
|
||||||
|
$tot_piutang = 0; $tot_bayar = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_piutang += $row['Total_Piutang'];
|
||||||
|
$tot_bayar += $row['Total_Bayar'];
|
||||||
|
$pre->add_row([ $row['No_Jual'], $row['Tgl_Jual'], $row['Nama_Member'], $row['Total_Piutang'], $row['Total_Bayar'], $row['Total_Sisa'] ]);
|
||||||
|
}
|
||||||
|
$pre->add_span([ ["GRAND TOTAL",3,"R,B"],[$tot_piutang,1,"R,B","rupiah"],[$tot_bayar,1,"R,B","rupiah"],[$tot_piutang-$tot_bayar,1,"R,B","rupiah"] ]);
|
||||||
|
}
|
||||||
|
$pre->add_stamp(1, true);
|
||||||
|
$pre->show();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function excel() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
$xls = new Xlsx($this->app);
|
||||||
|
$xls->set_meta([
|
||||||
|
'title' => "Data Piutang Member",
|
||||||
|
'desc' => "Export Data Piutang Member"
|
||||||
|
]);
|
||||||
|
$xls->add_title([ $this->reg_name, "DATA ".($apre['tipe']==="R"?"REKAP":"DETAIL")." PIUTANG MEMBER", "Periode : ".$apre['periode'] ]);
|
||||||
|
|
||||||
|
if ($apre['tipe'] === "R") {
|
||||||
|
$xls->add_field("No.", 5, "@integer");
|
||||||
|
$xls->add_field("Nama Member", 25, "@text");
|
||||||
|
$xls->add_field("Jumlah Faktur", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Jumlah Bayar", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Sisa Piutang", 15, "#,##0.00");
|
||||||
|
$xls->add_sheet("".str_replace("s/d","-",$apre['periode']));
|
||||||
|
|
||||||
|
if ($apre['id_mem'] > 0) $xls->add_sub_title("Nama Member : ".$apre['nama_mem']);
|
||||||
|
|
||||||
|
$xls->show_titles();
|
||||||
|
$xls->show_headers();
|
||||||
|
|
||||||
|
$tot_piutang = 0; $tot_bayar = 0; $nomor = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_piutang += $row['Total_Piutang'];
|
||||||
|
$tot_bayar += $row['Total_Bayar'];
|
||||||
|
$xls->add_row([ ++$nomor, $row['Nama_Member'], $row['Total_Piutang'], $row['Total_Bayar'], $row['Total_Sisa'] ]);
|
||||||
|
}
|
||||||
|
$xls->add_row_bold([ "", "GRAND TOTAL", $tot_piutang, $tot_bayar, $tot_piutang-$tot_bayar ]);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
$xls->add_field("No. Nota", 15, "@");
|
||||||
|
$xls->add_field("Tgl. Nota", 12, "@date");
|
||||||
|
$xls->add_field("Nama Member", 20, "@text");
|
||||||
|
$xls->add_field("Jumlah", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Bayar", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Sisa Piutang", 15, "#,##0.00");
|
||||||
|
$xls->add_sheet("".str_replace("s/d","-",$apre['periode']));
|
||||||
|
|
||||||
|
if ($apre['id_mem'] > 0) $xls->add_sub_title("Nama Member : ".$apre['nama_mem']);
|
||||||
|
|
||||||
|
$xls->show_titles();
|
||||||
|
$xls->show_headers();
|
||||||
|
|
||||||
|
$tot_piutang = 0; $tot_bayar = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_piutang += $row['Total_Piutang'];
|
||||||
|
$tot_bayar += $row['Total_Bayar'];
|
||||||
|
$xls->add_row([ $row['No_Jual'], $row['Tgl_Jual'], $row['Nama_Member'], $row['Total_Piutang'], $row['Total_Bayar'], $row['Total_Sisa'] ]);
|
||||||
|
}
|
||||||
|
$xls->add_row_bold([ "", "", "GRAND TOTAL", $tot_piutang, $tot_bayar, $tot_piutang-$tot_bayar ]);
|
||||||
|
}
|
||||||
|
$xls->add_stamp(1, true);
|
||||||
|
$xls->download("Data Piutang Member ".str_replace("s/d","-",$apre['periode']).".xlsx");
|
||||||
|
unset($xls);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$ttipe = $form->radio("_", "Tipe", "R", true, false, ["R"=>"Rekap","D"=>"Detail"]);
|
||||||
|
$tcab = $form->option_db("_", "CabID", $this->id_cab, true, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID", [0,"SEMUA CABANG"]);
|
||||||
|
$tmem = $form->textauto("_", "Nama_Member", ['value'=>0,'text'=>"SEMUA MEMBER"], true, true, "nama member");
|
||||||
|
$tfrom = $form->datebox("_", "Tgl_From", tgl_ymd(), true, false);
|
||||||
|
$tto = $form->datebox("_", "Tgl_To", tgl_ymd(), true, false);
|
||||||
|
$ajson['html'] = '
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="Tipe">Tipe Laporan</label>
|
||||||
|
<div class="col">'.$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="Nama_Member">Nama Member</label>
|
||||||
|
<div class="col"><div class="input-group">'.$tmem.'<button id="butBrowMember" class="btn btn-info" type="button"><i class="bi-people-fill"></i></button></div></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>
|
||||||
|
<input type="hidden" id="MemberID" value="0" >';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,371 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Report/Jual/AnalisaController
|
||||||
|
Description : Laporan Analisa Penjualan
|
||||||
|
Created By : Siau Pheng ([email protected]).
|
||||||
|
Created Date : May 9th, 2013.
|
||||||
|
Last Modified : October 5th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Report\Jual;
|
||||||
|
|
||||||
|
use App\Utils\Invesa;
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use flight\Session;
|
||||||
|
use Webapp\Data\Xlsx;
|
||||||
|
use Webapp\Printer\PrintHTML;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
use Webapp\Web\Table;
|
||||||
|
|
||||||
|
class AnalisaController {
|
||||||
|
|
||||||
|
private int $id_cab;
|
||||||
|
private string $reg_name;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->id_cab = Param::Int("CabID", 0);
|
||||||
|
$this->reg_name = $session->get('WEB_APP')['REG_NAME'];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function brow_member() {
|
||||||
|
$tcari = Param::Get("Cari_Member");
|
||||||
|
$tsql = ''; $asql = [1];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql .= " AND CONCAT_WS(Kode_Member,Nama_Member,Alamat_Member,Telp_Member) LIKE ?";
|
||||||
|
$asql[] = '%' . $tcari . '%';
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("para_member", "*,CONCAT(IF(Kode_Member='','',CONCAT(Kode_Member,' - ')),Nama_Member) Kode_Nama", "Aktif=?".$tsql, $asql);
|
||||||
|
$obj->add_field("MemberID", "ID", "hid");
|
||||||
|
$obj->add_field("Kode_Nama", "Kode_Nama", "hid");
|
||||||
|
$obj->add_field("Kode_Member", "Kode", "c");
|
||||||
|
$obj->add_field("Nama_Member", "Nama Member", "awr");
|
||||||
|
$obj->add_field("Alamat_Member", "Alamat", "awr");
|
||||||
|
$obj->add_field("Telp_Member", "Telp.", "awr");
|
||||||
|
$obj->set_field_order("Nama_Member", "A");
|
||||||
|
$obj->set_func_select("RepoJualAnalisaJS.member_select");
|
||||||
|
$this->app->json([ $obj->db_table("divBrowMember") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function auto_member() {
|
||||||
|
$tcari = Param::Get("Auto_Query", "");
|
||||||
|
$ajson['autodata'] = [];
|
||||||
|
|
||||||
|
$stat = $this->db->runQuery("SELECT MemberID,Grup_MemberID,Kode_Member,Nama_Member,CONCAT(IF(Kode_Member='','',CONCAT(Kode_Member,' - ')),Nama_Member) Kode_Nama FROM para_member WHERE Aktif=1 AND CONCAT(Kode_Member,Nama_Member,Alamat_Member,Telp_Member) LIKE ? ORDER BY Nama_Member LIMIT 50", ['%'.$tcari.'%']);
|
||||||
|
while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$ajson['autodata'][] = ['value'=>$row['MemberID'], 'text'=>$row['Kode_Nama'], 'html'=>'<span class="text-primary">'.$row['Kode_Member'].'</span> '.$row['Nama_Member'], 'data'=>0, 'bc'=>0];
|
||||||
|
}
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function prepare() {
|
||||||
|
$apre = [
|
||||||
|
'tipe' => Param::Get("Tipe", "V"), // V or R or M
|
||||||
|
'id_grup_mem' => Param::Int("Grup_MemberID", 0),
|
||||||
|
'id_mem' => Param::Int("MemberID", 0),
|
||||||
|
'id_sup' => Param::Int("SupID", 0),
|
||||||
|
'id_grup_inv' => Param::Int("Grup_InvID", 0),
|
||||||
|
'urut' => Param::Get("Urut", "B"),
|
||||||
|
'tgl_from' => Param::Get("Tgl_From"),
|
||||||
|
'tgl_to' => Param::Get("Tgl_To"),
|
||||||
|
];
|
||||||
|
$apre['Hari'] = tgl_range_hari($apre['tgl_from'], $apre['tgl_to'], true);
|
||||||
|
|
||||||
|
$apre['nama_mem'] = ($apre['id_mem'] > 0) ? ($this->db->fetchField("SELECT CONCAT(Nama_Member,' (',Kode_Member,')') Nama FROM para_member WHERE MemberID=?", [$apre['id_mem']]) ?? '') : '';
|
||||||
|
$apre['nama_sup'] = ($apre['id_sup'] > 0) ? ($this->db->fetchField("SELECT CONCAT(Nama_Sup,' (',Kode_Sup,')') Nama FROM para_supplier WHERE SupID=?", [$apre['id_sup']]) ?? '') : '';
|
||||||
|
$apre['nama_grup_inv'] = ($apre['id_grup_inv'] > 0 && $apre['id_sup']===0) ? ($this->db->fetchField("SELECT Nama_Grup FROM inv_produk_grup WHERE Grup_InvID=?", [$apre['id_grup_inv']]) ?? '') : '';
|
||||||
|
|
||||||
|
// generate report header
|
||||||
|
$apre['periode'] = $apre['tgl_from'] . ($apre['tgl_from'] !== $apre['tgl_to'] ? ' s/d '.$apre['tgl_to'] : '');
|
||||||
|
|
||||||
|
$tsql1 = ''; $tsql2 = ''; $tsql3 = '';
|
||||||
|
$asql1 = [tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to'])];
|
||||||
|
$asql2 = [tgl_sql2str($apre['tgl_to'])];
|
||||||
|
$asql3 = [];
|
||||||
|
|
||||||
|
if ($this->id_cab > 0) {
|
||||||
|
$tsql1 .= " AND CabID=?";
|
||||||
|
array_push($asql1, $this->id_cab);
|
||||||
|
$tsql2 .= " AND CabID=?";
|
||||||
|
array_push($asql2, $this->id_cab);
|
||||||
|
}
|
||||||
|
if ($apre['id_mem'] > 0) {
|
||||||
|
$tsql1 .= " AND No_Ref IN (SELECT No_Jual FROM inv_jual WHERE MemberID=? AND (Tgl_Jual BETWEEN ? AND ?))";
|
||||||
|
array_push($asql1, $apre['id_mem'], tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to']));
|
||||||
|
}
|
||||||
|
if ($apre['id_grup_mem'] > 0) {
|
||||||
|
$tsql1 .= " AND No_Ref IN (SELECT No_Jual FROM inv_jual WHERE MemberID IN (SELECT MemberID FROM para_member WHERE Grup_MemberID=?) AND (Tgl_Jual BETWEEN ? AND ?))";
|
||||||
|
array_push($asql1, $apre['id_grup_mem'], tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to']));
|
||||||
|
}
|
||||||
|
if ($apre['id_sup'] > 0) {
|
||||||
|
$tsql3 .= " AND D.InvID IN (SELECT InvID FROM inv_produk_sup WHERE SupID=?)";
|
||||||
|
array_push($asql3, $apre['id_sup']);
|
||||||
|
} else {
|
||||||
|
if ($apre['id_grup_inv'] > 0) {
|
||||||
|
$tsql3 .= " AND P.Grup_InvID=?";
|
||||||
|
array_push($asql3, $apre['id_grup_inv']);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$torder = ($apre['urut'] === "B") ? "P.Nama_Produk" : "D.Jumlah";
|
||||||
|
$torder = ($apre['urut'] === "S") ? "S.Stok" : $torder;
|
||||||
|
$tsql3 = (count($asql3) > 0) ? " WHERE".substr($tsql3, 4) : '';
|
||||||
|
|
||||||
|
if ($apre['tipe'] === "V") {
|
||||||
|
$apre['query'] = $this->db->runQuery("SELECT CONCAT(P.Nama_Produk,' ',IF(ISNULL(V.Nama_Varian),'',V.Nama_Varian)) Nama_Produk,P.Satuan_Normal,P.Satuan_Stok,D.Jumlah,S.Stok,P.Qty Kali FROM (SELECT InvID,VarianID,SUM(-Stok) Jumlah FROM inv_detail WHERE (Tgl_Ref BETWEEN ? AND ?) AND NotaID IN (5,6)".$tsql1." GROUP BY InvID,VarianID ORDER BY InvID,VarianID) D LEFT JOIN (SELECT InvID,VarianID,SUM(Stok) Stok FROM inv_detail WHERE Tgl_Ref<=?".$tsql2." GROUP BY InvID,VarianID) S ON (D.InvID=S.InvID AND D.VarianID=S.VarianID) LEFT JOIN vi_inv_produk2 P ON (D.InvID=P.InvID) LEFT JOIN para_varian V ON (D.VarianID=V.VarianID)".$tsql3." ORDER BY ".$torder, array_merge($asql1, $asql2, $asql3));
|
||||||
|
$apre['judul'] = "VOLUME";
|
||||||
|
} else if ($apre['tipe'] === "R") {
|
||||||
|
$apre['query'] = $this->db->runQuery("SELECT CONCAT(P.Nama_Produk,' ',IF(ISNULL(V.Nama_Varian),'',V.Nama_Varian)) Nama_Produk,P.Satuan_Normal,P.Satuan_Stok,D.Jumlah,S.Stok,P.Qty Kali FROM (SELECT InvID,VarianID,SUM(-Qty*Harga_Jual) Jumlah FROM inv_detail WHERE (Tgl_Ref BETWEEN ? AND ?) AND NotaID IN (5,6)".$tsql1." GROUP BY InvID,VarianID ORDER BY InvID,VarianID) D LEFT JOIN (SELECT InvID,VarianID,SUM(Stok) Stok FROM inv_detail WHERE Tgl_Ref<=?".$tsql2." GROUP BY InvID,VarianID) S ON (D.InvID=S.InvID AND D.VarianID=S.VarianID) LEFT JOIN vi_inv_produk2 P ON (D.InvID=P.InvID) LEFT JOIN para_varian V ON (D.VarianID=V.VarianID)".$tsql3." ORDER BY ".$torder, array_merge($asql1, $asql2, $asql3));
|
||||||
|
$apre['judul'] = "RUPIAH";
|
||||||
|
} else if ($apre['tipe'] === "M") {
|
||||||
|
$torder = ($apre['urut'] === "M") ? "D.Margin" : $torder;
|
||||||
|
$torder = ($apre['urut'] === "S") ? "S.Stok" : $torder;
|
||||||
|
$apre['query'] = $this->db->runQuery("SELECT CONCAT(P.Nama_Produk,' ',IF(ISNULL(V.Nama_Varian),'',V.Nama_Varian)) Nama_Produk,P.Satuan_Normal,P.Satuan_Stok,D.Margin,D.Jumlah,S.Stok,P.Qty Kali FROM (SELECT InvID,VarianID,((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 ? AND ?) AND NotaID IN (5,6)".$tsql1." GROUP BY InvID,VarianID ORDER BY InvID,VarianID) D LEFT JOIN (SELECT InvID,VarianID,SUM(Stok) Stok FROM inv_detail WHERE Tgl_Ref<=?".$tsql2." GROUP BY InvID,VarianID) S ON (D.InvID=S.InvID AND D.VarianID=S.VarianID) LEFT JOIN vi_inv_produk2 P ON (D.InvID=P.InvID) LEFT JOIN para_varian V ON (D.VarianID=V.VarianID)".$tsql2." ORDER BY ".$torder, array_merge($asql1, $asql2, $asql3));
|
||||||
|
$apre['judul'] = "MARGIN";
|
||||||
|
}
|
||||||
|
return $apre;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function print() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
|
||||||
|
$pre = new PrintHTML($this->app);
|
||||||
|
$pre->add_title([strtoupper($this->reg_name), "REKAP ".$apre['judul']." PENJUALAN", "Periode : ".$apre['periode']]);
|
||||||
|
|
||||||
|
if ($apre['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");
|
||||||
|
$pre->add_field("Sisa Stok",20,"R");
|
||||||
|
|
||||||
|
if ($apre['id_mem'] > 0) $pre->add_sub_title("Nama Member : ".$apre['nama_mem']);
|
||||||
|
if ($apre['id_sup'] > 0) $pre->add_sub_title("Nama Supplier : ".$apre['nama_sup']);
|
||||||
|
if ($apre['id_grup_inv'] > 0 && $apre['id_sup']===0) $pre->add_sub_title("Grup Barang : ".$apre['nama_grup_inv']);
|
||||||
|
|
||||||
|
$pre->show_titles();
|
||||||
|
$pre->show_headers();
|
||||||
|
|
||||||
|
$nomor = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$total = $row['Jumlah'] ?? 0;
|
||||||
|
$mg_total = $total / ($apre['Hari'] / 7);
|
||||||
|
$kali = $row['Kali'] ?? 1;
|
||||||
|
$stok = Invesa::Format_Stok($total, $kali, $row['Satuan_Normal'], $row['Satuan_Stok']);
|
||||||
|
$mg_stok = Invesa::Format_Stok($mg_total, $kali, $row['Satuan_Normal'], $row['Satuan_Stok']);
|
||||||
|
$ss_stok = Invesa::Format_Stok($row['Stok'], $kali, $row['Satuan_Normal'], $row['Satuan_Stok']);
|
||||||
|
$pre->add_row([ ++$nomor, $row['Nama_Produk'], $stok, $mg_stok, $ss_stok ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
} else if ($apre['tipe'] === "R") {
|
||||||
|
$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");
|
||||||
|
$pre->add_field("Sisa Stok",20,"R");
|
||||||
|
|
||||||
|
if ($apre['id_mem'] > 0) $pre->add_sub_title("Nama Member : ".$apre['nama_mem']);
|
||||||
|
if ($apre['id_sup'] > 0) $pre->add_sub_title("Nama Supplier : ".$apre['nama_sup']);
|
||||||
|
if ($apre['id_grup_inv'] > 0 && $apre['id_sup']===0) $pre->add_sub_title("Grup Barang : ".$apre['nama_grup_inv']);
|
||||||
|
|
||||||
|
$pre->show_titles();
|
||||||
|
$pre->show_headers();
|
||||||
|
|
||||||
|
$nomor = 0; $tot_rup = 0; $tot_mg = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$mg_avg = ($row['Jumlah'] > 0) ? $row['Jumlah'] / ($apre['Hari'] / 7) : 0;
|
||||||
|
$tot_rup += $row['Jumlah'];
|
||||||
|
$tot_mg += $mg_avg;
|
||||||
|
$ss_stok = Invesa::Format_Stok($row['Stok'], $row['Kali'] ?? 1, $row['Satuan_Normal'], $row['Satuan_Stok']);
|
||||||
|
$pre->add_row([ ++$nomor, $row['Nama_Produk'], $row['Jumlah'], $mg_avg, $ss_stok ]);
|
||||||
|
}
|
||||||
|
$pre->add_span([ ["GRAND TOTAL",2,"R,B"],[$tot_rup,1,"R,B","rupiah"],[$tot_mg,1,"R,B","rupiah"], ["",1] ]);
|
||||||
|
|
||||||
|
} else if ($apre['tipe'] === "M") {
|
||||||
|
$pre->add_field("No.",10,"C");
|
||||||
|
$pre->add_field("Nama Barang",50,"L");
|
||||||
|
$pre->add_field("Jumlah",20,"R","rupiah");
|
||||||
|
$pre->add_field("Margin (%)",20,"R","rupiah2");
|
||||||
|
$pre->add_field("Mingguan",20,"R","rupiah");
|
||||||
|
$pre->add_field("Sisa Stok",20,"R");
|
||||||
|
|
||||||
|
if ($apre['id_mem'] > 0) $pre->add_sub_title("Nama Member : ".$apre['nama_mem']);
|
||||||
|
if ($apre['id_sup'] > 0) $pre->add_sub_title("Nama Supplier : ".$apre['nama_sup']);
|
||||||
|
if ($apre['id_grup_inv'] > 0 && $apre['id_sup']===0) $pre->add_sub_title("Grup Barang : ".$apre['nama_grup_inv']);
|
||||||
|
|
||||||
|
$pre->show_titles();
|
||||||
|
$pre->show_headers();
|
||||||
|
|
||||||
|
$nomor = 0; $tot_rup = 0; $tot_mar = 0; $tot_mg = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$mg_avg = ($row['Jumlah'] > 0) ? $row['Jumlah'] / ($apre['Hari'] / 7) : 0;
|
||||||
|
$tot_rup += $row['Jumlah'];
|
||||||
|
$tot_mar += $row['Margin'];
|
||||||
|
$tot_mg += $mg_avg;
|
||||||
|
$ss_stok = Invesa::Format_Stok($row['Stok'], $row['Kali'] ?? 1, $row['Satuan_Normal'], $row['Satuan_Stok']);
|
||||||
|
$pre->add_row([ ++$nomor, $row['Nama_Produk'], $row['Jumlah'], $row['Margin'], $mg_avg, $ss_stok ]);
|
||||||
|
}
|
||||||
|
$pre->add_span([ ["GRAND TOTAL",2,"R,B"],[$tot_rup,1,"R,B","rupiah"],[$tot_mar,1,"R,B","rupiah"],[$tot_mg,1,"R,B","rupiah"], ["",1] ]);
|
||||||
|
}
|
||||||
|
$pre->add_stamp(1, true);
|
||||||
|
$pre->show();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function excel() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
$xls = new Xlsx($this->app);
|
||||||
|
$xls->set_meta([
|
||||||
|
'title' => "Data Analisa Penjualan",
|
||||||
|
'desc' => "Export Data Analisa Penjualan"
|
||||||
|
]);
|
||||||
|
$xls->add_title([ $this->reg_name, "REKAP ".$apre['judul']." PENJUALAN", "Periode : ".$apre['periode'] ]);
|
||||||
|
|
||||||
|
if ($apre['tipe'] === "V") {
|
||||||
|
$xls->add_field("No.", 5, "@integer");
|
||||||
|
$xls->add_field("Nama Barang", 25, "@text");
|
||||||
|
$xls->add_field("Jumlah", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Mingguan", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Sisa Stok", 15, "@");
|
||||||
|
$xls->add_sheet("".str_replace("s/d","-",$apre['periode']));
|
||||||
|
|
||||||
|
if ($apre['id_mem'] > 0) $xls->add_sub_title("Nama Member : ".$apre['nama_mem']);
|
||||||
|
if ($apre['id_sup'] > 0) $xls->add_sub_title("Nama Supplier : ".$apre['nama_sup']);
|
||||||
|
if ($apre['id_grup_inv'] > 0 && $apre['id_sup']===0) $xls->add_sub_title("Grup Barang : ".$apre['nama_grup_inv']);
|
||||||
|
|
||||||
|
$xls->show_titles();
|
||||||
|
$xls->show_headers();
|
||||||
|
|
||||||
|
$nomor = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$total = $row['Jumlah'] ?? 0;
|
||||||
|
$mg_total = $total / ($apre['Hari'] / 7);
|
||||||
|
$kali = $row['Kali'] ?? 1;
|
||||||
|
$stok = Invesa::Format_Stok($total, $kali, $row['Satuan_Normal'], $row['Satuan_Stok']);
|
||||||
|
$mg_stok = Invesa::Format_Stok($mg_total, $kali, $row['Satuan_Normal'], $row['Satuan_Stok']);
|
||||||
|
$ss_stok = Invesa::Format_Stok($row['Stok'], $kali, $row['Satuan_Normal'], $row['Satuan_Stok']);
|
||||||
|
$xls->add_row([ ++$nomor, $row['Nama_Produk'], $stok, $mg_stok, $ss_stok ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
} else if ($apre['tipe'] === "R") {
|
||||||
|
$xls->add_field("No.", 5, "@integer");
|
||||||
|
$xls->add_field("Nama Barang", 20, "@text");
|
||||||
|
$xls->add_field("Jumlah", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Mingguan", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Sisa Stok", 15, "@");
|
||||||
|
$xls->add_sheet("".str_replace("s/d","-",$apre['periode']));
|
||||||
|
|
||||||
|
if ($apre['id_mem'] > 0) $xls->add_sub_title("Nama Member : ".$apre['nama_mem']);
|
||||||
|
if ($apre['id_sup'] > 0) $xls->add_sub_title("Nama Supplier : ".$apre['nama_sup']);
|
||||||
|
if ($apre['id_grup_inv'] > 0 && $apre['id_sup']===0) $xls->add_sub_title("Grup Barang : ".$apre['nama_grup_inv']);
|
||||||
|
|
||||||
|
$xls->show_titles();
|
||||||
|
$xls->show_headers();
|
||||||
|
|
||||||
|
$nomor = 0; $tot_rup = 0; $tot_mg = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$mg_avg = ($row['Jumlah'] > 0) ? $row['Jumlah'] / ($apre['Hari'] / 7) : 0;
|
||||||
|
$tot_rup += $row['Jumlah'];
|
||||||
|
$tot_mg += $mg_avg;
|
||||||
|
$ss_stok = Invesa::Format_Stok($row['Stok'], $row['Kali'] ?? 1, $row['Satuan_Normal'], $row['Satuan_Stok']);
|
||||||
|
$xls->add_row([ ++$nomor, $row['Nama_Produk'], $row['Jumlah'], $mg_avg, $ss_stok ]);
|
||||||
|
}
|
||||||
|
$xls->add_row_bold([ "", "GRAND TOTAL", $tot_rup, $tot_mg, "" ]);
|
||||||
|
|
||||||
|
} else if ($apre['tipe'] === "M") {
|
||||||
|
$xls->add_field("No.", 5, "@integer");
|
||||||
|
$xls->add_field("Nama Barang", 20, "@text");
|
||||||
|
$xls->add_field("Jumlah", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Margin (%)", 15, "@percent");
|
||||||
|
$xls->add_field("Mingguan", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Sisa Stok", 15, "@");
|
||||||
|
$xls->add_sheet("".str_replace("s/d","-",$apre['periode']));
|
||||||
|
|
||||||
|
if ($apre['id_mem'] > 0) $xls->add_sub_title("Nama Member : ".$apre['nama_mem']);
|
||||||
|
if ($apre['id_sup'] > 0) $xls->add_sub_title("Nama Supplier : ".$apre['nama_sup']);
|
||||||
|
if ($apre['id_grup_inv'] > 0 && $apre['id_sup']===0) $xls->add_sub_title("Grup Barang : ".$apre['nama_grup_inv']);
|
||||||
|
|
||||||
|
$xls->show_titles();
|
||||||
|
$xls->show_headers();
|
||||||
|
|
||||||
|
$nomor = 0; $tot_rup = 0; $tot_mar = 0; $tot_mg = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$mg_avg = ($row['Jumlah'] > 0) ? $row['Jumlah'] / ($apre['Hari'] / 7) : 0;
|
||||||
|
$tot_rup += $row['Jumlah'];
|
||||||
|
$tot_mar += $row['Margin'];
|
||||||
|
$tot_mg += $mg_avg;
|
||||||
|
$ss_stok = Invesa::Format_Stok($row['Stok'], $row['Kali'] ?? 1, $row['Satuan_Normal'], $row['Satuan_Stok']);
|
||||||
|
$xls->add_row([ ++$nomor, $row['Nama_Produk'], $row['Jumlah'], $row['Margin'], $mg_avg, $ss_stok ]);
|
||||||
|
}
|
||||||
|
$xls->add_row_bold([ "", "GRAND TOTAL", $tot_rup, $tot_mar, $tot_mg, "" ]);
|
||||||
|
}
|
||||||
|
$xls->add_stamp(1, true);
|
||||||
|
$xls->download("Data Pembelian ".str_replace("s/d","-",$apre['periode']).".xlsx");
|
||||||
|
unset($xls);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$ttipe = $form->radio("_", "Tipe", "V", true, false, ["V"=>"Volume","R"=>"Rupiah","M"=>"Margin"]);
|
||||||
|
$tcab = $form->option_db("_", "CabID", $this->id_cab, true, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID", [0,"SEMUA CABANG"]);
|
||||||
|
$tgrup_inv = $form->option_db("_", "Grup_InvID", 0, true, false, "inv_produk_grup", ["Grup_InvID","Nama_Grup"], "Aktif=1 ORDER BY Nama_Grup", [0,"SEMUA GRUP"]);
|
||||||
|
$tgrup_mem = $form->option_db("_", "Grup_MemberID", 0, true, false, "para_member_grup", ["Grup_MemberID","Nama_Grup"], "Aktif=1 ORDER BY Nama_Grup", [0,"SEMUA GRUP"]);
|
||||||
|
$tmem = $form->textauto("_", "Nama_Member", ['value'=>0,'text'=>"SEMUA MEMBER"], true, true, "nama member");
|
||||||
|
$tsup = $form->option_db("_", "SupID", 0, true, false, "para_supplier", ["SupID","Nama_Sup"], "Aktif=1 ORDER BY Nama_Sup", [0,"SEMUA SUPPLIER"]);
|
||||||
|
$turut = $form->radio("_", "Urut", "B", true, false, ['B'=>"Nama Barang",'J'=>"Jumlah / Nilai",'M'=>"Margin",'S'=>"Stok"]);
|
||||||
|
$tfrom = $form->datebox("_", "Tgl_From", tgl_ymd(), true, false);
|
||||||
|
$tto = $form->datebox("_", "Tgl_To", tgl_ymd(), true, false);
|
||||||
|
$ajson['html'] = '
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="Tipe">Tipe Laporan</label>
|
||||||
|
<div class="col">'.$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="Grup_MemberID">Grup Member</label>
|
||||||
|
<div class="col">'.$tgrup_mem.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="Nama_Member">Nama Member</label>
|
||||||
|
<div class="col"><div class="input-group">'.$tmem.'<button id="butBrowMember" class="btn btn-info" type="button"><i class="bi-people-fill"></i></button></div></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.Invesa::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_inv.'</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">'.$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>
|
||||||
|
<input type="hidden" id="MemberID" value="0" >';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,223 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Report/Jual/JualController
|
||||||
|
Description : Laporan Penjualan
|
||||||
|
Created By : Siau Pheng ([email protected]).
|
||||||
|
Created Date : April 12th, 2011.
|
||||||
|
Last Modified : October 4th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Report\Jual;
|
||||||
|
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use flight\Session;
|
||||||
|
use Webapp\Data\Xlsx;
|
||||||
|
use Webapp\Printer\PrintHTML;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
|
||||||
|
class JualController {
|
||||||
|
|
||||||
|
private int $id_cab;
|
||||||
|
private string $reg_name;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->id_cab = Param::Int("CabID", 0);
|
||||||
|
$this->reg_name = $session->get('WEB_APP')['REG_NAME'];
|
||||||
|
}
|
||||||
|
|
||||||
|
private function prepare() {
|
||||||
|
$apre = [
|
||||||
|
'tipe' => Param::Get("Tipe", "R"), // R or D
|
||||||
|
'id_mem' => Param::Int("MemberID", 0),
|
||||||
|
'id_grup' => Param::Int("Grup_InvID", 0),
|
||||||
|
'tgl_from' => Param::Get("Tgl_From"),
|
||||||
|
'tgl_to' => Param::Get("Tgl_To"),
|
||||||
|
];
|
||||||
|
|
||||||
|
$apre['nama_mem'] = ($apre['id_mem'] > 0) ? ($this->db->fetchField("SELECT CONCAT(Nama_Member,' (',Kode_Member,')') Nama FROM para_member WHERE MemberID=?", [$apre['id_mem']]) ?? '') : '';
|
||||||
|
$apre['nama_grup'] = ($apre['id_grup'] > 0) ? ($this->db->fetchField("SELECT Nama_Grup FROM inv_produk_grup WHERE Grup_InvID=?", [$apre['id_grup']]) ?? '') : '';
|
||||||
|
|
||||||
|
// generate report header
|
||||||
|
$apre['periode'] = $apre['tgl_from'] . ($apre['tgl_from'] !== $apre['tgl_to'] ? ' s/d '.$apre['tgl_to'] : '');
|
||||||
|
|
||||||
|
$tsql = ''; $asql = [tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to'])];
|
||||||
|
if ($this->id_cab > 0) {
|
||||||
|
$tsql .= " AND CabID=?";
|
||||||
|
array_push($asql, $this->id_cab);
|
||||||
|
}
|
||||||
|
if ($apre['id_mem'] > 0) {
|
||||||
|
$tsql .= " AND MemberID=?";
|
||||||
|
array_push($asql, $apre['id_mem']);
|
||||||
|
}
|
||||||
|
//id_grup ?
|
||||||
|
|
||||||
|
if ($apre['tipe'] === "R") {
|
||||||
|
$apre['query'] = $this->db->runQuery("SELECT IF(ISNULL(O.Nama_Member),'KASIR POS',O.Nama_Member) Nama_Member,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 ? AND ?)".$tsql.") J LEFT JOIN para_member O ON (J.MemberID=O.MemberID) GROUP BY J.MemberID ORDER BY O.Nama_Member", $asql);
|
||||||
|
} else {
|
||||||
|
$apre['query'] = $this->db->runQuery("SELECT J.*,IF(ISNULL(O.Nama_Member),'KASIR POS',O.Nama_Member) Nama_Member,J.Total_Jual-J.Total_Diskon Total FROM (SELECT * FROM inv_jual WHERE (Tgl_Jual BETWEEN ? AND ?)".$tsql.") J LEFT JOIN para_member O ON (J.MemberID=O.MemberID) ORDER BY J.No_Jual", $asql);
|
||||||
|
}
|
||||||
|
return $apre;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function print() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
|
||||||
|
$pre = new PrintHTML($this->app);
|
||||||
|
$pre->add_title([strtoupper($this->reg_name), ($apre['tipe']==="R"?"REKAP":"DETAIL")." PENJUALAN", "Periode : ".$apre['periode']]);
|
||||||
|
|
||||||
|
if ($apre['tipe'] === "R") {
|
||||||
|
$pre->add_field("No.",10,"C");
|
||||||
|
$pre->add_field("Nama Member",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 ($apre['id_mem'] > 0) $pre->add_sub_title("Nama Member : ".$apre['nama_mem']);
|
||||||
|
if ($apre['id_grup'] > 0) $pre->add_sub_title("Grup Barang : ".$apre['nama_grup']);
|
||||||
|
|
||||||
|
$pre->show_titles();
|
||||||
|
$pre->show_headers();
|
||||||
|
|
||||||
|
$tot_jual = 0; $tot_diskon = 0; $nomor = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_jual += $row['Total_Jual'];
|
||||||
|
$tot_diskon += $row['Total_Diskon'];
|
||||||
|
$pre->add_row([ ++$nomor, $row['Nama_Member'], $row['Total_Jual'], $row['Total_Diskon'], $row['Total'] ]);
|
||||||
|
}
|
||||||
|
$pre->add_span([ ["GRAND TOTAL",2,"R,B"],[$tot_jual,1,"R,B","rupiah"],[$tot_diskon,1,"R,B","rupiah"],[$tot_jual-$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("Nama Member",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 ($apre['id_mem'] > 0) $pre->add_sub_title("Nama Member : ".$apre['nama_mem']);
|
||||||
|
if ($apre['id_grup'] > 0) $pre->add_sub_title("Grup Barang : ".$apre['nama_grup']);
|
||||||
|
|
||||||
|
$pre->show_titles();
|
||||||
|
$pre->show_headers();
|
||||||
|
|
||||||
|
$tot_jual = 0; $tot_diskon = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_jual += $row['Total_Jual'];
|
||||||
|
$tot_diskon += $row['Total_Diskon'];
|
||||||
|
$pre->add_row([ $row['No_Jual'], $row['Tgl_Jual'], $row['Nama_Member'], $row['Total_Jual'], $row['Total_Diskon'], $row['Total'] ]);
|
||||||
|
}
|
||||||
|
$pre->add_span([ ["GRAND TOTAL",3,"R,B"],[$tot_jual,1,"R,B","rupiah"],[$tot_diskon,1,"R,B","rupiah"],[$tot_jual-$tot_diskon,1,"R,B","rupiah"] ]);
|
||||||
|
}
|
||||||
|
$pre->add_stamp(1, true);
|
||||||
|
$pre->show();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function excel() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
$xls = new Xlsx($this->app);
|
||||||
|
$xls->set_meta([
|
||||||
|
'title' => "Data Penjualan",
|
||||||
|
'desc' => "Export Data Penjualan"
|
||||||
|
]);
|
||||||
|
$xls->add_title([ $this->reg_name, "DATA ".($apre['tipe']==="R"?"REKAP":"DETAIL")." PENJUALAN", "Periode : ".$apre['periode'] ]);
|
||||||
|
|
||||||
|
if ($apre['tipe'] === "R") {
|
||||||
|
$xls->add_field("No.", 5, "@integer");
|
||||||
|
$xls->add_field("Nama Member", 25, "@text");
|
||||||
|
$xls->add_field("Sub. Total", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Diskon", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Total", 15, "#,##0.00");
|
||||||
|
$xls->add_sheet("".str_replace("s/d","-",$apre['periode']));
|
||||||
|
|
||||||
|
if ($apre['id_mem'] > 0) $xls->add_sub_title("Nama Member : ".$apre['nama_mem']);
|
||||||
|
if ($apre['id_grup'] > 0) $xls->add_sub_title("Grup Barang : ".$apre['nama_grup']);
|
||||||
|
|
||||||
|
$xls->show_titles();
|
||||||
|
$xls->show_headers();
|
||||||
|
|
||||||
|
$tot_jual = 0; $tot_diskon = 0; $nomor = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_jual += $row['Total_Jual'];
|
||||||
|
$tot_diskon += $row['Total_Diskon'];
|
||||||
|
$xls->add_row([ ++$nomor, $row['Nama_Member'], $row['Total_Jual'], $row['Total_Diskon'], $row['Total'] ]);
|
||||||
|
}
|
||||||
|
$xls->add_row_bold([ "", "GRAND TOTAL", $tot_jual, $tot_diskon, $tot_jual-$tot_diskon ]);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
$xls->add_field("No. Nota", 15, "@");
|
||||||
|
$xls->add_field("Tgl. Nota", 12, "@date");
|
||||||
|
$xls->add_field("Nama Member", 20, "@text");
|
||||||
|
$xls->add_field("Sub. Total", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Diskon", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Total", 15, "#,##0.00");
|
||||||
|
$xls->add_sheet("".str_replace("s/d","-",$apre['periode']));
|
||||||
|
|
||||||
|
if ($apre['id_mem'] > 0) $xls->add_sub_title("Nama Member : ".$apre['nama_mem']);
|
||||||
|
if ($apre['id_grup'] > 0) $xls->add_sub_title("Grup Barang : ".$apre['nama_grup']);
|
||||||
|
|
||||||
|
$xls->show_titles();
|
||||||
|
$xls->show_headers();
|
||||||
|
|
||||||
|
$tot_jual = 0; $tot_diskon = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_jual += $row['Total_Jual'];
|
||||||
|
$tot_diskon += $row['Total_Diskon'];
|
||||||
|
$xls->add_row([ $row['No_Jual'], $row['Tgl_Jual'], $row['Nama_Member'], $row['Total_Jual'], $row['Total_Diskon'], $row['Total'] ]);
|
||||||
|
}
|
||||||
|
$xls->add_row_bold([ "", "", "GRAND TOTAL", $tot_jual, $tot_diskon, $tot_jual-$tot_diskon ]);
|
||||||
|
}
|
||||||
|
$xls->add_stamp(1, true);
|
||||||
|
$xls->download("Data Penjualan ".str_replace("s/d","-",$apre['periode']).".xlsx");
|
||||||
|
unset($xls);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$ttipe = $form->radio("_", "Tipe", "R", true, false, ["R"=>"Rekap","D"=>"Detail"]);
|
||||||
|
$tcab = $form->option_db("_", "CabID", $this->id_cab, true, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID", [0,"SEMUA CABANG"]);
|
||||||
|
$tmemb = $form->option_db("_", "MemberID", 0, true, false, "para_member", ["MemberID","Nama_Member"], "Aktif=1 ORDER BY Nama_Member", [0,"SEMUA MEMBER"]);
|
||||||
|
$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);
|
||||||
|
$ajson['html'] = '
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="Tipe">Tipe Laporan</label>
|
||||||
|
<div class="col">'.$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="MemberID">Nama Member</label>
|
||||||
|
<div class="col">'.$tmemb.'</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>';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,261 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Report/Jual/MarginController
|
||||||
|
Description : Laporan Margin Penjualan / Member
|
||||||
|
Created By : Siau Pheng ([email protected]).
|
||||||
|
Created Date : October 12nd, 2012.
|
||||||
|
Last Modified : October 7th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Report\Jual;
|
||||||
|
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use flight\Session;
|
||||||
|
use Webapp\Data\Xlsx;
|
||||||
|
use Webapp\Printer\PrintHTML;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
use Webapp\Web\Table;
|
||||||
|
|
||||||
|
class MarginController {
|
||||||
|
|
||||||
|
private int $id_cab;
|
||||||
|
private string $reg_name;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->id_cab = Param::Int("CabID", 0);
|
||||||
|
$this->reg_name = $session->get('WEB_APP')['REG_NAME'];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function brow_member() {
|
||||||
|
$tcari = Param::Get("Cari_Member");
|
||||||
|
$tsql = ''; $asql = [1];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql .= " AND CONCAT_WS(Kode_Member,Nama_Member,Alamat_Member,Telp_Member) LIKE ?";
|
||||||
|
$asql[] = '%' . $tcari . '%';
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("para_member", "*,CONCAT(IF(Kode_Member='','',CONCAT(Kode_Member,' - ')),Nama_Member) Kode_Nama", "Aktif=?".$tsql, $asql);
|
||||||
|
$obj->add_field("MemberID", "ID", "hid");
|
||||||
|
$obj->add_field("Kode_Nama", "Kode_Nama", "hid");
|
||||||
|
$obj->add_field("Kode_Member", "Kode", "c");
|
||||||
|
$obj->add_field("Nama_Member", "Nama Member", "awr");
|
||||||
|
$obj->add_field("Alamat_Member", "Alamat", "awr");
|
||||||
|
$obj->add_field("Telp_Member", "Telp.", "awr");
|
||||||
|
$obj->set_field_order("Nama_Member", "A");
|
||||||
|
$obj->set_func_select("RepoJualMarginJS.member_select");
|
||||||
|
$this->app->json([ $obj->db_table("divBrowMember") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function auto_member() {
|
||||||
|
$tcari = Param::Get("Auto_Query", "");
|
||||||
|
$ajson['autodata'] = [];
|
||||||
|
|
||||||
|
$stat = $this->db->runQuery("SELECT MemberID,Grup_MemberID,Kode_Member,Nama_Member,CONCAT(IF(Kode_Member='','',CONCAT(Kode_Member,' - ')),Nama_Member) Kode_Nama FROM para_member WHERE Aktif=1 AND CONCAT(Kode_Member,Nama_Member,Alamat_Member,Telp_Member) LIKE ? ORDER BY Nama_Member LIMIT 50", ['%'.$tcari.'%']);
|
||||||
|
while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$ajson['autodata'][] = ['value'=>$row['MemberID'], 'text'=>$row['Kode_Nama'], 'html'=>'<span class="text-primary">'.$row['Kode_Member'].'</span> '.$row['Nama_Member'], 'data'=>0, 'bc'=>0];
|
||||||
|
}
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function prepare() {
|
||||||
|
$apre = [
|
||||||
|
'tipe' => Param::Get("Tipe", "R"), // R or D
|
||||||
|
'id_mem' => Param::Int("MemberID", 0),
|
||||||
|
'urut' => Param::Get("Urut", "M"),
|
||||||
|
'tgl_from' => Param::Get("Tgl_From"),
|
||||||
|
'tgl_to' => Param::Get("Tgl_To"),
|
||||||
|
];
|
||||||
|
|
||||||
|
$apre['nama_mem'] = ($apre['id_mem'] > 0) ? ($this->db->fetchField("SELECT CONCAT(Nama_Member,' (',Kode_Member,')') Nama FROM para_member WHERE MemberID=?", [$apre['id_mem']]) ?? '') : '';
|
||||||
|
|
||||||
|
// generate report header
|
||||||
|
$apre['periode'] = $apre['tgl_from'] . ($apre['tgl_from'] !== $apre['tgl_to'] ? ' s/d '.$apre['tgl_to'] : '');
|
||||||
|
|
||||||
|
$tsql = ''; $asql = [tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to'])];
|
||||||
|
if ($this->id_cab > 0) {
|
||||||
|
$tsql .= " AND CabID=?";
|
||||||
|
array_push($asql, $this->id_cab);
|
||||||
|
}
|
||||||
|
if ($apre['id_mem'] > 0) {
|
||||||
|
$tsql .= " AND MemberID=?";
|
||||||
|
array_push($asql, $apre['id_mem']);
|
||||||
|
}
|
||||||
|
$torder = ($apre['urut'] === "M") ? "J.Total_Margin" : "J.Total_Jual";
|
||||||
|
|
||||||
|
if ($apre['tipe'] === "R") {
|
||||||
|
$apre['query'] = $this->db->runQuery("SELECT J.*,IFNULL(O.Nama_Member,'KASIR POS') Nama_Member FROM (SELECT MemberID,SUM(Total_HPP) Total_Modal,SUM(Total_Jual-Total_Diskon) Total_Jual,SUM(Total_Jual-Total_Diskon-Total_HPP) Total_Margin FROM inv_jual WHERE (Tgl_Jual BETWEEN ? AND ?)".$tsql." GROUP BY MemberID) J LEFT JOIN para_member O ON (J.MemberID=O.MemberID) ORDER BY ".$torder." DESC", $asql);
|
||||||
|
} else {
|
||||||
|
$apre['query'] = $this->db->runQuery("SELECT J.*,IFNULL(O.Nama_Member,'KASIR POS') Nama_Member FROM (SELECT No_Jual,Tgl_Jual,MemberID,Total_HPP Total_Modal,(Total_Jual-Total_Diskon) Total_Jual,(Total_Jual-Total_Diskon-Total_HPP) Total_Margin FROM inv_jual WHERE (Tgl_Jual BETWEEN ? AND ?)".$tsql.") J LEFT JOIN para_member O ON (J.MemberID=O.MemberID) ORDER BY ".$torder." DESC", $asql);
|
||||||
|
}
|
||||||
|
$apre['judul'] = ['R'=>"REKAP",'D'=>"DETAIL"];
|
||||||
|
return $apre;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function print() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
|
||||||
|
$pre = new PrintHTML($this->app);
|
||||||
|
$pre->add_title([strtoupper($this->reg_name), $apre['judul'][$apre['tipe']]." MARGIN PENJUALAN", "Periode : ".$apre['periode']]);
|
||||||
|
|
||||||
|
if ($apre['tipe'] === "R") {
|
||||||
|
$pre->add_field("No.",10,"C");
|
||||||
|
$pre->add_field("Nama Member",50,"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");
|
||||||
|
|
||||||
|
if ($apre['id_mem'] > 0) $pre->add_sub_title("Nama Member : ".$apre['nama_mem']);
|
||||||
|
|
||||||
|
$pre->show_titles();
|
||||||
|
$pre->show_headers();
|
||||||
|
|
||||||
|
$tot_modal = 0; $tot_jual = 0; $tot_margin =0; $nomor = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_jual += $row['Total_Jual'];
|
||||||
|
$tot_modal += $row['Total_Modal'];
|
||||||
|
$tot_margin += $row['Total_Margin'];
|
||||||
|
$pre->add_row([ ++$nomor, $row['Nama_Member'], $row['Total_Modal'], $row['Total_Jual'], $row['Total_Margin'], ($row['Total_Margin']*100)/$row['Total_Jual'] ]);
|
||||||
|
}
|
||||||
|
$pre->add_span([ ["GRAND TOTAL",2,"R,B"],[$tot_modal,1,"R,B","rupiah"],[$tot_jual,1,"R,B","rupiah"],[$tot_margin,1,"R,B","rupiah"],[($tot_margin*100)/$tot_jual,1,"R,B","rupiah2"] ]);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
$pre->add_field("No. Nota",30,"C");
|
||||||
|
$pre->add_field("Tgl. Nota",30,"C", "tgl_sql2str");
|
||||||
|
$pre->add_field("Nama Member",50,"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");
|
||||||
|
|
||||||
|
if ($apre['id_mem'] > 0) $pre->add_sub_title("Nama Member : ".$apre['nama_mem']);
|
||||||
|
|
||||||
|
$pre->show_titles();
|
||||||
|
$pre->show_headers();
|
||||||
|
|
||||||
|
$tot_jual = 0; $tot_modal = 0; $tot_margin = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_jual += $row['Total_Jual'];
|
||||||
|
$tot_modal += $row['Total_Modal'];
|
||||||
|
$tot_margin += $row['Total_Margin'];
|
||||||
|
$pre->add_row([ $row['No_Jual'], $row['Tgl_Jual'], $row['Nama_Member'], $row['Total_Modal'], $row['Total_Jual'], $row['Total_Margin'], ($row['Total_Margin']*100)/$row['Total_Jual'] ]);
|
||||||
|
}
|
||||||
|
$pre->add_span([ ["GRAND TOTAL",3,"R,B"],[$tot_modal,1,"R,B","rupiah"],[$tot_jual,1,"R,B","rupiah"],[$tot_margin,1,"R,B","rupiah"],[($tot_margin*100)/$tot_jual,1,"R,B","rupiah2"] ]);
|
||||||
|
}
|
||||||
|
$pre->add_stamp(1, true);
|
||||||
|
$pre->show();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function excel() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
$xls = new Xlsx($this->app);
|
||||||
|
$xls->set_meta([
|
||||||
|
'title' => "Data Margin Penjualan",
|
||||||
|
'desc' => "Export Data Margin Penjualan"
|
||||||
|
]);
|
||||||
|
$xls->add_title([ $this->reg_name, "DATA ".$apre['judul'][$apre['tipe']]." MARGIN PENJUALAN", "Periode : ".$apre['periode'] ]);
|
||||||
|
|
||||||
|
if ($apre['tipe'] === "R") {
|
||||||
|
$xls->add_field("No.", 5, "@integer");
|
||||||
|
$xls->add_field("Nama Member", 25, "@text");
|
||||||
|
$xls->add_field("Harga Modal", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Harga Jual", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Margin", 15, "#,##0.00");
|
||||||
|
$xls->add_field("%", 8, "0.00%");
|
||||||
|
$xls->add_sheet("".str_replace("s/d","-",$apre['periode']));
|
||||||
|
|
||||||
|
if ($apre['id_mem'] > 0) $xls->add_sub_title("Nama Member : ".$apre['nama_mem']);
|
||||||
|
|
||||||
|
$xls->show_titles();
|
||||||
|
$xls->show_headers();
|
||||||
|
|
||||||
|
$tot_jual = 0; $tot_modal = 0; $tot_margin = 0; $nomor = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_jual += $row['Total_Jual'];
|
||||||
|
$tot_modal += $row['Total_Modal'];
|
||||||
|
$tot_margin += $row['Total_Margin'];
|
||||||
|
$xls->add_row([ ++$nomor, $row['Nama_Member'], $row['Total_Modal'], $row['Total_Jual'], $row['Total_Margin'], (($row['Total_Margin'])/$row['Total_Jual']) ]);
|
||||||
|
}
|
||||||
|
$xls->add_row_bold([ "", "GRAND TOTAL", $tot_modal, $tot_jual, $tot_margin, (($tot_margin)/$tot_jual) ]);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
$xls->add_field("No. Nota", 15, "@");
|
||||||
|
$xls->add_field("Tgl. Nota", 12, "@date");
|
||||||
|
$xls->add_field("Nama Member", 20, "@text");
|
||||||
|
$xls->add_field("Harga Modal", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Harga Jual", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Margin", 15, "#,##0.00");
|
||||||
|
$xls->add_field("%", 8, "0.00%");
|
||||||
|
$xls->add_sheet("".str_replace("s/d","-",$apre['periode']));
|
||||||
|
|
||||||
|
if ($apre['id_mem'] > 0) $xls->add_sub_title("Nama Member : ".$apre['nama_mem']);
|
||||||
|
|
||||||
|
$xls->show_titles();
|
||||||
|
$xls->show_headers();
|
||||||
|
|
||||||
|
$tot_jual = 0; $tot_modal = 0; $tot_margin = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_jual += $row['Total_Jual'];
|
||||||
|
$tot_modal += $row['Total_Modal'];
|
||||||
|
$tot_margin += $row['Total_Margin'];
|
||||||
|
$xls->add_row([ $row['No_Jual'], $row['Tgl_Jual'], $row['Nama_Member'], $row['Total_Modal'], $row['Total_Jual'], $row['Total_Margin'], (($row['Total_Margin'])/$row['Total_Jual']) ]);
|
||||||
|
}
|
||||||
|
$xls->add_row_bold([ "", "", "GRAND TOTAL", $tot_modal, $tot_jual, $tot_margin, (($tot_margin)/$tot_jual) ]);
|
||||||
|
}
|
||||||
|
$xls->add_stamp(1, true);
|
||||||
|
$xls->download("Data Margin Penjualan ".str_replace("s/d","-",$apre['periode']).".xlsx");
|
||||||
|
unset($xls);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$ttipe = $form->radio("_", "Tipe", "R", true, false, ["R"=>"Rekap","D"=>"Detail"]);
|
||||||
|
$tcab = $form->option_db("_", "CabID", $this->id_cab, true, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID", [0,"SEMUA CABANG"]);
|
||||||
|
$tmem = $form->textauto("_", "Nama_Member", ['value'=>0,'text'=>"SEMUA MEMBER"], true, true, "nama member");
|
||||||
|
$turut = $form->radio("_", "Urut", "B", true, false, ['H'=>"Harga Jual",'M'=>"Margin"]);
|
||||||
|
$tfrom = $form->datebox("_", "Tgl_From", tgl_ymd(), true, false);
|
||||||
|
$tto = $form->datebox("_", "Tgl_To", tgl_ymd(), true, false);
|
||||||
|
$ajson['html'] = '
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="Tipe">Tipe Laporan</label>
|
||||||
|
<div class="col">'.$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="Nama_Member">Nama Member</label>
|
||||||
|
<div class="col"><div class="input-group">'.$tmem.'<button id="butBrowMember" class="btn btn-info" type="button"><i class="bi-people-fill"></i></button></div></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">'.$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>
|
||||||
|
<input type="hidden" id="MemberID" value="0" >';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,200 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Report/Jual/MarginposController
|
||||||
|
Description : Laporan Margin Penjualan / POS
|
||||||
|
Created By : Siau Pheng ([email protected]).
|
||||||
|
Created Date : October 12nd, 2012.
|
||||||
|
Last Modified : October 7th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Report\Jual;
|
||||||
|
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use flight\Session;
|
||||||
|
use Webapp\Data\Xlsx;
|
||||||
|
use Webapp\Printer\PrintHTML;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
|
||||||
|
class MarginposController {
|
||||||
|
|
||||||
|
private int $id_cab;
|
||||||
|
private string $reg_name;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->id_cab = Param::Int("CabID", 0);
|
||||||
|
$this->reg_name = $session->get('WEB_APP')['REG_NAME'];
|
||||||
|
}
|
||||||
|
|
||||||
|
private function prepare() {
|
||||||
|
$apre = [
|
||||||
|
'tipe' => Param::Get("Tipe", "R"), // R or D
|
||||||
|
'tgl_from' => Param::Get("Tgl_From"),
|
||||||
|
'tgl_to' => Param::Get("Tgl_To"),
|
||||||
|
];
|
||||||
|
|
||||||
|
// generate report header
|
||||||
|
$apre['periode'] = $apre['tgl_from'] . ($apre['tgl_from'] !== $apre['tgl_to'] ? ' s/d '.$apre['tgl_to'] : '');
|
||||||
|
|
||||||
|
$tsql = ''; $asql = [tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to'])];
|
||||||
|
if ($this->id_cab > 0) {
|
||||||
|
$tsql .= " AND CabID=?";
|
||||||
|
array_push($asql, $this->id_cab);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($apre['tipe'] === "R") {
|
||||||
|
$apre['query'] = $this->db->runQuery("SELECT J.*,IFNULL(O.Nama,'KASIR POS') Nama_User FROM (SELECT UserID,SUM(Total_HPP) Total_Modal,SUM(Total_Jual-Total_Diskon) Total_Jual,SUM(Total_Jual-Total_Diskon-Total_HPP) Total_Margin FROM inv_jual WHERE (Tgl_Jual BETWEEN ? AND ?)".$tsql." GROUP BY UserID) J LEFT JOIN app_operator O ON (J.UserID=O.UserID) ORDER BY O.Nama", $asql);
|
||||||
|
} else {
|
||||||
|
$apre['query'] = $this->db->runQuery("SELECT J.*,IFNULL(O.Nama,'KASIR POS') Nama_User FROM (SELECT No_Jual,Tgl_Jual,UserID,Total_HPP Total_Modal,(Total_Jual-Total_Diskon) Total_Jual,(Total_Jual-Total_Diskon-Total_HPP) Total_Margin FROM inv_jual WHERE (Tgl_Jual BETWEEN ? AND ?)".$tsql.") J LEFT JOIN app_operator O ON (J.UserID=O.UserID) ORDER BY J.Tgl_Jual,O.Nama", $asql);
|
||||||
|
}
|
||||||
|
$apre['judul'] = ['R'=>"REKAP",'D'=>"DETAIL"];
|
||||||
|
return $apre;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function print() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
|
||||||
|
$pre = new PrintHTML($this->app);
|
||||||
|
$pre->add_title([strtoupper($this->reg_name), $apre['judul'][$apre['tipe']]." MARGIN PENJUALAN / KASIR", "Periode : ".$apre['periode']]);
|
||||||
|
|
||||||
|
if ($apre['tipe'] === "R") {
|
||||||
|
$pre->add_field("No.",10,"C");
|
||||||
|
$pre->add_field("Nama Kasir",50,"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");
|
||||||
|
|
||||||
|
$pre->show_titles();
|
||||||
|
$pre->show_headers();
|
||||||
|
|
||||||
|
$tot_modal = 0; $tot_jual = 0; $tot_margin =0; $nomor = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_jual += $row['Total_Jual'];
|
||||||
|
$tot_modal += $row['Total_Modal'];
|
||||||
|
$tot_margin += $row['Total_Margin'];
|
||||||
|
$pre->add_row([ ++$nomor, $row['Nama_User'], $row['Total_Modal'], $row['Total_Jual'], $row['Total_Margin'], ($row['Total_Margin']*100)/$row['Total_Jual'] ]);
|
||||||
|
}
|
||||||
|
$pre->add_span([ ["GRAND TOTAL",2,"R,B"],[$tot_modal,1,"R,B","rupiah"],[$tot_jual,1,"R,B","rupiah"],[$tot_margin,1,"R,B","rupiah"],[($tot_margin*100)/$tot_jual,1,"R,B","rupiah2"] ]);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
$pre->add_field("No. Nota",30,"C");
|
||||||
|
$pre->add_field("Tgl. Nota",30,"C", "tgl_sql2str");
|
||||||
|
$pre->add_field("Nama Kasir",50,"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");
|
||||||
|
|
||||||
|
$pre->show_titles();
|
||||||
|
$pre->show_headers();
|
||||||
|
|
||||||
|
$tot_jual = 0; $tot_modal = 0; $tot_margin = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_jual += $row['Total_Jual'];
|
||||||
|
$tot_modal += $row['Total_Modal'];
|
||||||
|
$tot_margin += $row['Total_Margin'];
|
||||||
|
$pre->add_row([ $row['No_Jual'], $row['Tgl_Jual'], $row['Nama_User'], $row['Total_Modal'], $row['Total_Jual'], $row['Total_Margin'], ($row['Total_Margin']*100)/$row['Total_Jual'] ]);
|
||||||
|
}
|
||||||
|
$pre->add_span([ ["GRAND TOTAL",3,"R,B"],[$tot_modal,1,"R,B","rupiah"],[$tot_jual,1,"R,B","rupiah"],[$tot_margin,1,"R,B","rupiah"],[($tot_margin*100)/$tot_jual,1,"R,B","rupiah2"] ]);
|
||||||
|
}
|
||||||
|
$pre->add_stamp(1, true);
|
||||||
|
$pre->show();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function excel() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
$xls = new Xlsx($this->app);
|
||||||
|
$xls->set_meta([
|
||||||
|
'title' => "Data Margin Penjualan / Kasir",
|
||||||
|
'desc' => "Export Data Margin Penjualan / Kasir",
|
||||||
|
]);
|
||||||
|
$xls->add_title([ $this->reg_name, "DATA ".$apre['judul'][$apre['tipe']]." MARGIN PENJUALAN / KASIR", "Periode : ".$apre['periode'] ]);
|
||||||
|
|
||||||
|
if ($apre['tipe'] === "R") {
|
||||||
|
$xls->add_field("No.", 5, "@integer");
|
||||||
|
$xls->add_field("Nama Kasir", 25, "@text");
|
||||||
|
$xls->add_field("Harga Modal", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Harga Jual", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Margin", 15, "#,##0.00");
|
||||||
|
$xls->add_field("%", 8, "0.00%");
|
||||||
|
$xls->add_sheet("".str_replace("s/d","-",$apre['periode']));
|
||||||
|
|
||||||
|
$xls->show_titles();
|
||||||
|
$xls->show_headers();
|
||||||
|
|
||||||
|
$tot_jual = 0; $tot_modal = 0; $tot_margin = 0; $nomor = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_jual += $row['Total_Jual'];
|
||||||
|
$tot_modal += $row['Total_Modal'];
|
||||||
|
$tot_margin += $row['Total_Margin'];
|
||||||
|
$xls->add_row([ ++$nomor, $row['Nama_User'], $row['Total_Modal'], $row['Total_Jual'], $row['Total_Margin'], (($row['Total_Margin'])/$row['Total_Jual']) ]);
|
||||||
|
}
|
||||||
|
$xls->add_row_bold([ "", "GRAND TOTAL", $tot_modal, $tot_jual, $tot_margin, (($tot_margin)/$tot_jual) ]);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
$xls->add_field("No. Nota", 15, "@");
|
||||||
|
$xls->add_field("Tgl. Nota", 12, "@date");
|
||||||
|
$xls->add_field("Nama Kasir", 20, "@text");
|
||||||
|
$xls->add_field("Harga Modal", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Harga Jual", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Margin", 15, "#,##0.00");
|
||||||
|
$xls->add_field("%", 8, "0.00%");
|
||||||
|
$xls->add_sheet("".str_replace("s/d","-",$apre['periode']));
|
||||||
|
|
||||||
|
$xls->show_titles();
|
||||||
|
$xls->show_headers();
|
||||||
|
|
||||||
|
$tot_jual = 0; $tot_modal = 0; $tot_margin = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_jual += $row['Total_Jual'];
|
||||||
|
$tot_modal += $row['Total_Modal'];
|
||||||
|
$tot_margin += $row['Total_Margin'];
|
||||||
|
$xls->add_row([ $row['No_Jual'], $row['Tgl_Jual'], $row['Nama_User'], $row['Total_Modal'], $row['Total_Jual'], $row['Total_Margin'], (($row['Total_Margin'])/$row['Total_Jual']) ]);
|
||||||
|
}
|
||||||
|
$xls->add_row_bold([ "", "", "GRAND TOTAL", $tot_modal, $tot_jual, $tot_margin, (($tot_margin)/$tot_jual) ]);
|
||||||
|
}
|
||||||
|
$xls->add_stamp(1, true);
|
||||||
|
$xls->download("Data Margin Penjualan per Kasir ".str_replace("s/d","-",$apre['periode']).".xlsx");
|
||||||
|
unset($xls);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$ttipe = $form->radio("_", "Tipe", "R", true, false, ["R"=>"Rekap","D"=>"Detail"]);
|
||||||
|
$tcab = $form->option_db("_", "CabID", $this->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);
|
||||||
|
$ajson['html'] = '
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="Tipe">Tipe Laporan</label>
|
||||||
|
<div class="col">'.$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>';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,195 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Report/Jual/MutasiController
|
||||||
|
Description : Laporan Mutasi Penjualan
|
||||||
|
Created By : Siau Pheng ([email protected]).
|
||||||
|
Created Date : April 3rd, 2013.
|
||||||
|
Last Modified : October 4th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Report\Jual;
|
||||||
|
|
||||||
|
use App\Utils\Invesa;
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use flight\Session;
|
||||||
|
use Webapp\Data\Xlsx;
|
||||||
|
use Webapp\Printer\PrintHTML;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
use Webapp\Web\Table;
|
||||||
|
|
||||||
|
class MutasiController {
|
||||||
|
|
||||||
|
private int $id_cab;
|
||||||
|
private string $reg_name;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->id_cab = Param::Int("CabID", 0);
|
||||||
|
$this->reg_name = $session->get('WEB_APP')['REG_NAME'];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function brow_member() {
|
||||||
|
$tcari = Param::Get("Cari_Member");
|
||||||
|
$tsql = ''; $asql = [1];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql .= " AND CONCAT_WS(Kode_Member,Nama_Member,Alamat_Member,Telp_Member) LIKE ?";
|
||||||
|
$asql[] = '%' . $tcari . '%';
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("para_member", "*,CONCAT(IF(Kode_Member='','',CONCAT(Kode_Member,' - ')),Nama_Member) Kode_Nama", "Aktif=?".$tsql, $asql);
|
||||||
|
$obj->add_field("MemberID", "ID", "hid");
|
||||||
|
$obj->add_field("Kode_Nama", "Kode_Nama", "hid");
|
||||||
|
$obj->add_field("Kode_Member", "Kode", "c");
|
||||||
|
$obj->add_field("Nama_Member", "Nama Member", "awr");
|
||||||
|
$obj->add_field("Alamat_Member", "Alamat", "awr");
|
||||||
|
$obj->add_field("Telp_Member", "Telp.", "awr");
|
||||||
|
$obj->set_field_order("Nama_Member", "A");
|
||||||
|
$obj->set_func_select("RepoJualMutasiJS.member_select");
|
||||||
|
$this->app->json([ $obj->db_table("divBrowMember") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function auto_member() {
|
||||||
|
$tcari = Param::Get("Auto_Query", "");
|
||||||
|
$ajson['autodata'] = [];
|
||||||
|
|
||||||
|
$stat = $this->db->runQuery("SELECT MemberID,Grup_MemberID,Kode_Member,Nama_Member,CONCAT(IF(Kode_Member='','',CONCAT(Kode_Member,' - ')),Nama_Member) Kode_Nama FROM para_member WHERE Aktif=1 AND CONCAT(Kode_Member,Nama_Member,Alamat_Member,Telp_Member) LIKE ? ORDER BY Nama_Member LIMIT 50", ['%'.$tcari.'%']);
|
||||||
|
while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$ajson['autodata'][] = ['value'=>$row['MemberID'], 'text'=>$row['Kode_Nama'], 'html'=>'<span class="text-primary">'.$row['Kode_Member'].'</span> '.$row['Nama_Member'], 'data'=>0, 'bc'=>0];
|
||||||
|
}
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function prepare() {
|
||||||
|
$apre = [
|
||||||
|
'id_mem' => Param::Int("MemberID", 0),
|
||||||
|
'tgl_from' => Param::Get("Tgl_From"),
|
||||||
|
'tgl_to' => Param::Get("Tgl_To"),
|
||||||
|
];
|
||||||
|
|
||||||
|
$apre['nama_mem'] = $this->db->fetchField("SELECT CONCAT(Nama_Member,' (',Kode_Member,')') Nama FROM para_member WHERE MemberID=?", [$apre['id_mem']]) ?? '';
|
||||||
|
|
||||||
|
// generate report header
|
||||||
|
$apre['periode'] = $apre['tgl_from'] . ($apre['tgl_from'] !== $apre['tgl_to'] ? ' s/d '.$apre['tgl_to'] : '');
|
||||||
|
|
||||||
|
$tsql = ''; $asql = [$apre['id_mem']];
|
||||||
|
if ($this->id_cab > 0) {
|
||||||
|
$tsql .= " AND CabID=?";
|
||||||
|
array_push($asql, $this->id_cab);
|
||||||
|
}
|
||||||
|
|
||||||
|
$n_saldo = (float) $this->db->fetchField("SELECT SUM(Total_Jual-Total_Diskon) Total FROM inv_jual WHERE MemberID=?".$tsql." AND Tgl_Jual<?", array_merge($asql,[tgl_sql2str($apre['tgl_from'])])) ?? 0;
|
||||||
|
|
||||||
|
$n_bayar = (float) $this->db->fetchField("SELECT SUM(Total_Bayar+Total_Potong) Bayar FROM inv_jual_lunas WHERE No_Jual IN (SELECT No_Jual FROM inv_jual WHERE MemberID=?".$tsql.") AND Tgl_Bayar<?", array_merge($asql,[tgl_sql2str($apre['tgl_from'])])) ?? 0;
|
||||||
|
$n_saldo -= $n_bayar;
|
||||||
|
|
||||||
|
$apre['Saldo'] = $n_saldo;
|
||||||
|
$apre['query'] = $this->db->runQuery("(SELECT Tgl_Jual,SUM(Total_Jual-Total_Diskon) Total,0 Bayar FROM inv_jual WHERE (Tgl_Jual BETWEEN ? AND ?) AND MemberID=?".$tsql." GROUP BY Tgl_Jual) UNION ALL (SELECT Tgl_Bayar Tgl_Jual,0 Total,SUM(Total_Bayar+Total_Potong) Bayar FROM inv_jual_lunas WHERE No_Jual IN (SELECT No_Jual FROM inv_jual WHERE MemberID=?".$tsql.") AND (Tgl_Bayar BETWEEN ? AND ?) GROUP BY Tgl_Bayar) ORDER BY Tgl_Jual,Total DESC", array_merge([tgl_sql2str($apre['tgl_from']),tgl_sql2str($apre['tgl_to'])], $asql, $asql, [tgl_sql2str($apre['tgl_from']),tgl_sql2str($apre['tgl_to'])]));
|
||||||
|
return $apre;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function print() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
|
||||||
|
$pre = new PrintHTML($this->app);
|
||||||
|
$pre->add_title([strtoupper($this->reg_name), "MUTASI PENJUALAN", "Periode : ".$apre['periode']]);
|
||||||
|
|
||||||
|
$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");
|
||||||
|
|
||||||
|
$pre->add_sub_title("Nama Member : ".$apre['nama_mem']);
|
||||||
|
|
||||||
|
$pre->show_titles();
|
||||||
|
$pre->show_headers();
|
||||||
|
|
||||||
|
$tot_sub = 0; $tot_bayar = 0;
|
||||||
|
$pre->add_span([ ["Saldo Awal",1,"R,B"],["0",1,"R,B"],["0",1,"R,B"],[$apre['Saldo'],1,"R,B","rupiah"] ]);
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_sub += $row['Total'];
|
||||||
|
$tot_bayar += $row['Bayar'];
|
||||||
|
$apre['Saldo'] += $row['Total'] - $row['Bayar'];
|
||||||
|
$pre->add_row([ $row['Tgl_Beli'], $row['Total'], $row['Bayar'], $apre['Saldo'] ]);
|
||||||
|
}
|
||||||
|
$pre->add_span([ ["Saldo Akhir",1,"R,B"],[$tot_sub,1,"R,B","rupiah"],[$tot_bayar,1,"R,B","rupiah"],[$apre['Saldo'],1,"R,B","rupiah"] ]);
|
||||||
|
|
||||||
|
$pre->add_stamp(1, true);
|
||||||
|
$pre->show();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function excel() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
$xls = new Xlsx($this->app);
|
||||||
|
$xls->set_meta([
|
||||||
|
'title' => "Data Mutasi Penjualan",
|
||||||
|
'desc' => "Export Data Mutasi Penjualan"
|
||||||
|
]);
|
||||||
|
$xls->add_title([ $this->reg_name, "DATA MUTASI PENJUALAN", "Periode : ".$apre['periode'] ]);
|
||||||
|
|
||||||
|
$xls->add_field("Tanggal", 12, "@date");
|
||||||
|
$xls->add_field("Nota / Bon", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Bayar", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Sisa", 15, "#,##0.00");
|
||||||
|
$xls->add_sheet("".str_replace("s/d","-",$apre['periode']));
|
||||||
|
|
||||||
|
$xls->add_sub_title("Nama Member : ".$apre['nama_mem']);
|
||||||
|
|
||||||
|
$xls->show_titles();
|
||||||
|
$xls->show_headers();
|
||||||
|
|
||||||
|
$tot_sub = 0; $tot_bayar = 0;
|
||||||
|
$xls->add_row_bold([ "Saldo Awal", 0, 0, $apre['Saldo'] ]);
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_sub += $row['Total'];
|
||||||
|
$tot_bayar += $row['Bayar'];
|
||||||
|
$apre['Saldo'] += $row['Total'] - $row['Bayar'];
|
||||||
|
$xls->add_row([ $row['Tgl_Beli'], $row['Total'], $row['Bayar'], $apre['Saldo'] ]);
|
||||||
|
}
|
||||||
|
$xls->add_row_bold([ "Saldo Akhir", $tot_sub, $tot_bayar, $apre['Saldo'] ]);
|
||||||
|
|
||||||
|
$xls->add_stamp(1, true);
|
||||||
|
$xls->download("Data Mutasi Penjualan ".str_replace("s/d","-",$apre['periode']).".xlsx");
|
||||||
|
unset($xls);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tcab = $form->option_db("_", "CabID", $this->id_cab, true, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID", [0,"SEMUA CABANG"]);
|
||||||
|
$tmember = $form->textauto("_", "Nama_Member", ['value'=>0,'text'=>""], true, true, "nama member");
|
||||||
|
$tfrom = $form->datebox("_", "Tgl_From", tgl_ymd(), true, false);
|
||||||
|
$tto = $form->datebox("_", "Tgl_To", tgl_ymd(), true, false);
|
||||||
|
$ajson['html'] = '
|
||||||
|
<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="Nama_Member">Nama Member</label>
|
||||||
|
<div class="col"><div class="input-group">'.$tmember.'<button id="butBrowMember" class="btn btn-info" type="button"><i class="bi-people-fill"></i></button></div></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>
|
||||||
|
<input type="hidden" id="MemberID" value="0" >';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,242 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Report/Jual/RekapController
|
||||||
|
Description : Laporan Rekap Penjualan
|
||||||
|
Created By : Siau Pheng ([email protected]).
|
||||||
|
Created Date : July 16th, 2011.
|
||||||
|
Last Modified : October 4th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Report\Jual;
|
||||||
|
|
||||||
|
use App\Utils\Invesa;
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use flight\Session;
|
||||||
|
use Webapp\Data\Xlsx;
|
||||||
|
use Webapp\Printer\PrintHTML;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
use Webapp\Web\Table;
|
||||||
|
|
||||||
|
class RekapController {
|
||||||
|
|
||||||
|
private int $id_cab;
|
||||||
|
private string $reg_name;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->id_cab = Param::Int("CabID", 0);
|
||||||
|
$this->reg_name = $session->get('WEB_APP')['REG_NAME'];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function brow_member() {
|
||||||
|
$tcari = Param::Get("Cari_Member");
|
||||||
|
$tsql = ''; $asql = [1];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql .= " AND CONCAT_WS(Kode_Member,Nama_Member,Alamat_Member,Telp_Member) LIKE ?";
|
||||||
|
$asql[] = '%' . $tcari . '%';
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("para_member", "*,CONCAT(IF(Kode_Member='','',CONCAT(Kode_Member,' - ')),Nama_Member) Kode_Nama", "Aktif=?".$tsql, $asql);
|
||||||
|
$obj->add_field("MemberID", "ID", "hid");
|
||||||
|
$obj->add_field("Kode_Nama", "Kode_Nama", "hid");
|
||||||
|
$obj->add_field("Kode_Member", "Kode", "c");
|
||||||
|
$obj->add_field("Nama_Member", "Nama Member", "awr");
|
||||||
|
$obj->add_field("Alamat_Member", "Alamat", "awr");
|
||||||
|
$obj->add_field("Telp_Member", "Telp.", "awr");
|
||||||
|
$obj->set_field_order("Nama_Member", "A");
|
||||||
|
$obj->set_func_select("RepoJualRekapJS.member_select");
|
||||||
|
$this->app->json([ $obj->db_table("divBrowMember") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function brow_produk() {
|
||||||
|
$tcari = Param::Get("Cari_Produk");
|
||||||
|
$tsql = ''; $asql = [1];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql .= " AND Barcode_Nama LIKE ?";
|
||||||
|
$asql[] = '%' . $tcari . '%';
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("vi_inv_produk", "*", "Aktif=?".$tsql, $asql);
|
||||||
|
$obj->add_field("InvID", "ID", "hid");
|
||||||
|
$obj->add_field("SatuanID", "ID", "hid");
|
||||||
|
$obj->add_field("VarianID", "ID", "hid");
|
||||||
|
$obj->add_field("Kode_SKU", "SKU", "c");
|
||||||
|
$obj->add_field("Kode_Barcode", "Barcode", "c");
|
||||||
|
$obj->add_field("Nama_Lengkap", "Nama Barang", "awr");
|
||||||
|
$obj->set_field_order("Kode_SKU", "A");
|
||||||
|
$obj->set_func_select("RepoJualRekapJS.produk_select");
|
||||||
|
$this->app->json([ $obj->db_table("divBrowProduk") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function auto_member() {
|
||||||
|
$tcari = Param::Get("Auto_Query", "");
|
||||||
|
$ajson['autodata'] = [];
|
||||||
|
|
||||||
|
$stat = $this->db->runQuery("SELECT MemberID,Grup_MemberID,Kode_Member,Nama_Member,CONCAT(IF(Kode_Member='','',CONCAT(Kode_Member,' - ')),Nama_Member) Kode_Nama FROM para_member WHERE Aktif=1 AND CONCAT(Kode_Member,Nama_Member,Alamat_Member,Telp_Member) LIKE ? ORDER BY Nama_Member LIMIT 50", ['%'.$tcari.'%']);
|
||||||
|
while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$ajson['autodata'][] = ['value'=>$row['MemberID'], 'text'=>$row['Kode_Nama'], 'html'=>'<span class="text-primary">'.$row['Kode_Member'].'</span> '.$row['Nama_Member'], 'data'=>0, 'bc'=>0];
|
||||||
|
}
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function auto_produk() {
|
||||||
|
$tcari = Param::Get("Auto_Query", "");
|
||||||
|
$ajson['autodata'] = [];
|
||||||
|
$bcode = 0; $arec = [];
|
||||||
|
|
||||||
|
// Cari by SKU + Barcode
|
||||||
|
$_row = $this->db->fetchRow("SELECT P.InvID,P.Nama_Lengkap FROM (SELECT * FROM vi_inv_produk WHERE Aktif=1 AND (Kode_SKU=? OR Kode_Barcode=?)) P", [$tcari, $tcari]);
|
||||||
|
if ($_row) {
|
||||||
|
$bcode = 1;
|
||||||
|
$arec = $_row->getData();
|
||||||
|
}
|
||||||
|
if ($bcode === 1) {
|
||||||
|
$ajson['autodata'][] = ['value'=>$arec['InvID'], 'text'=>$arec['Nama_Lengkap'], 'data'=>0, 'bc'=>1];
|
||||||
|
} else {
|
||||||
|
$stat = $this->db->runQuery("SELECT P.InvID,P.Nama_Lengkap,P.Kode_SKU FROM (SELECT * FROM vi_inv_produk WHERE Barcode_Nama LIKE ? AND Aktif=1) P ORDER BY P.Nama_Produk,P.Qty LIMIT 50", ['%'.$tcari.'%']);
|
||||||
|
while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$ajson['autodata'][] = ['value'=>$row['InvID'], 'text'=>$row['Nama_Lengkap'], 'html'=>'<span class="text-primary">'.$row['Kode_SKU'].'</span> '.$row['Nama_Lengkap'], 'data'=>0, 'bc'=>0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function prepare() {
|
||||||
|
$apre = [
|
||||||
|
'id_mem' => Param::Int("MemberID", 0),
|
||||||
|
'id_inv' => Param::Int("InvID", 0),
|
||||||
|
'tgl_from' => Param::Get("Tgl_From"),
|
||||||
|
'tgl_to' => Param::Get("Tgl_To"),
|
||||||
|
'Nama_Produk' => "",
|
||||||
|
'Qty' => 1,
|
||||||
|
'Satuan_Stok' => "",
|
||||||
|
'Satuan_Kemasan' => "",
|
||||||
|
];
|
||||||
|
|
||||||
|
$apre['nama_mem'] = $this->db->fetchField("SELECT CONCAT(Nama_Member,' (',Kode_Member,')') Nama FROM para_member WHERE MemberID=?", [$apre['id_mem']]) ?? '';
|
||||||
|
$_produk = $this->db->fetchRow("SELECT Nama_Produk,Qty,Satuan_Stok,Nama_Satuan Satuan_Kemasan FROM vi_inv_produk WHERE InvID=? ORDER BY Qty LIMIT 1", [$apre['id_inv']]);
|
||||||
|
if ($_produk) $apre = array_merge($apre, $_produk->getData());
|
||||||
|
|
||||||
|
// generate report header
|
||||||
|
$apre['periode'] = $apre['tgl_from'] . ($apre['tgl_from'] !== $apre['tgl_to'] ? ' s/d '.$apre['tgl_to'] : '');
|
||||||
|
|
||||||
|
$tsql = ''; $asql = [$apre['id_inv'], tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to'])];
|
||||||
|
if ($this->id_cab > 0) {
|
||||||
|
$tsql .= " AND CabID=?";
|
||||||
|
array_push($asql, $this->id_cab);
|
||||||
|
}
|
||||||
|
array_push($asql, tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to']), $apre['id_mem']);
|
||||||
|
|
||||||
|
$apre['query'] = $this->db->runQuery("SELECT D.*,C.Nama_Cab FROM (SELECT No_Ref,Tgl_Ref,-Qty Qty FROM inv_detail WHERE NotaID IN (5,6) AND InvID=? AND (Tgl_Ref BETWEEN ? AND ?)".$tsql." ORDER BY No_Ref) D LEFT JOIN (SELECT No_Jual,CabID FROM inv_jual WHERE (Tgl_Jual BETWEEN ? AND ?) AND MemberID=?) J ON (J.No_Jual=D.No_Ref) LEFT JOIN para_cabang C ON (J.CabID=C.CabID) ORDER BY D.Tgl_Ref", $asql);
|
||||||
|
return $apre;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function print() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
|
||||||
|
$pre = new PrintHTML($this->app);
|
||||||
|
$pre->add_title([strtoupper($this->reg_name), "REKAP PENJUALAN PER MEMBER", "Periode : ".$apre['periode']]);
|
||||||
|
|
||||||
|
$pre->add_field("No.",10,"C");
|
||||||
|
$pre->add_field("No. Nota",30,"C");
|
||||||
|
$pre->add_field("Tgl. Nota",30,"C", "tgl_sql2str");
|
||||||
|
$pre->add_field("Cabang",50,"L");
|
||||||
|
$pre->add_field("Qty",20,"R");
|
||||||
|
|
||||||
|
$pre->add_sub_title("Nama Member : ".$apre['nama_mem']);
|
||||||
|
$pre->add_sub_title("Nama Barang : ".$apre['Nama_Produk']);
|
||||||
|
|
||||||
|
$pre->show_titles();
|
||||||
|
$pre->show_headers();
|
||||||
|
|
||||||
|
$no_urut = 0; $tot_qty = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_qty += $row['Qty'];
|
||||||
|
$pre->add_row([ ++$no_urut, $row['No_Ref'], $row['Tgl_Ref'], $row['Nama_Cab'], Invesa::Format_Stok($row['Qty'], $apre['Qty'], $apre['Satuan_Kemasan'], $apre['Satuan_Stok']) ]);
|
||||||
|
}
|
||||||
|
$pre->add_span([ ["TOTAL PENJUALAN",4,"R,B"],[Invesa::Format_Stok($tot_qty, $apre['Qty'], $apre['Satuan_Kemasan'], $apre['Satuan_Stok']),1,"R,B"] ]);
|
||||||
|
$pre->add_stamp(1, true);
|
||||||
|
$pre->show();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function excel() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
$xls = new Xlsx($this->app);
|
||||||
|
$xls->set_meta([
|
||||||
|
'title' => "Data Rekap Penjualan",
|
||||||
|
'desc' => "Export Data Rekap Penjualan"
|
||||||
|
]);
|
||||||
|
$xls->add_title([ $this->reg_name, "DATA REKAP PENJUALAN", "Periode : ".$apre['periode'] ]);
|
||||||
|
|
||||||
|
$xls->add_field("No.", 6, "@integer");
|
||||||
|
$xls->add_field("No. Nota", 15, "@text");
|
||||||
|
$xls->add_field("Tgl. Nota", 12, "@date");
|
||||||
|
$xls->add_field("Cabang", 20, "@text");
|
||||||
|
$xls->add_field("Qty", 15, "@");
|
||||||
|
$xls->add_sheet("".str_replace("s/d","-",$apre['periode']));
|
||||||
|
|
||||||
|
$xls->add_sub_title("Nama Member : ".$apre['nama_mem']);
|
||||||
|
$xls->add_sub_title("Nama Barang : ".$apre['Nama_Produk']);
|
||||||
|
|
||||||
|
$xls->show_titles();
|
||||||
|
$xls->show_headers();
|
||||||
|
|
||||||
|
$no_urut = 0; $tot_qty = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_qty += $row['Qty'];
|
||||||
|
$xls->add_row([ ++$no_urut, $row['No_Ref'], $row['Tgl_Ref'], $row['Nama_Cab'], Invesa::Format_Stok($row['Qty'], $apre['Qty'], $apre['Satuan_Kemasan'], $apre['Satuan_Stok']) ]);
|
||||||
|
}
|
||||||
|
$xls->add_row_bold([ "", "", "", "GRAND TOTAL", Invesa::Format_Stok($tot_qty, $apre['Qty'], $apre['Satuan_Kemasan'], $apre['Satuan_Stok']) ]);
|
||||||
|
$xls->add_stamp(1, true);
|
||||||
|
$xls->download("Data Rekap Penjualan ".str_replace("s/d","-",$apre['periode']).".xlsx");
|
||||||
|
unset($xls);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tcab = $form->option_db("_", "CabID", $this->id_cab, true, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID", [0,"SEMUA CABANG"]);
|
||||||
|
$tmember = $form->textauto("_", "Nama_Member", ['value'=>0,'text'=>""], true, true, "nama member");
|
||||||
|
$tproduk = $form->textauto("_", "Nama_Produk", ['value'=>0,'text'=>""], true, true, "nama barang");
|
||||||
|
$tfrom = $form->datebox("_", "Tgl_From", tgl_ymd(), true, false);
|
||||||
|
$tto = $form->datebox("_", "Tgl_To", tgl_ymd(), true, false);
|
||||||
|
$ajson['html'] = '
|
||||||
|
<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="Nama_Member">Nama Member</label>
|
||||||
|
<div class="col"><div class="input-group">'.$tmember.'<button id="butBrowMember" class="btn btn-info" type="button"><i class="bi-people-fill"></i></button></div></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"><div class="input-group">'.$tproduk.'<button id="butBrowProduk" class="btn btn-info" type="button"><i class="bi-bag"></i></button></div></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>
|
||||||
|
<input type="hidden" id="InvID" value="0" >
|
||||||
|
<input type="hidden" id="MemberID" value="0" >';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,203 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Report/Member/HistoriController
|
||||||
|
Description : Laporan Sejarah Point Member
|
||||||
|
Created By : Siau Pheng ([email protected]).
|
||||||
|
Created Date : May 9th, 2017.
|
||||||
|
Last Modified : October 17th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Report\Member;
|
||||||
|
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use flight\Session;
|
||||||
|
use Webapp\Data\Xlsx;
|
||||||
|
use Webapp\Printer\PrintHTML;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
use Webapp\Web\Table;
|
||||||
|
|
||||||
|
class HistoriController {
|
||||||
|
|
||||||
|
private int $id_cab;
|
||||||
|
private string $reg_name;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->id_cab = Param::Int("CabID", 0);
|
||||||
|
$this->reg_name = $session->get('WEB_APP')['REG_NAME'];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function brow_member() {
|
||||||
|
$tcari = Param::Get("Cari_Member");
|
||||||
|
$tsql = ''; $asql = [1];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql .= " AND CONCAT_WS(Kode_Member,Nama_Member,Alamat_Member,Telp_Member) LIKE ?";
|
||||||
|
$asql[] = '%' . $tcari . '%';
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("para_member", "*,CONCAT(IF(Kode_Member='','',CONCAT(Kode_Member,' - ')),Nama_Member) Kode_Nama", "Aktif=?".$tsql, $asql);
|
||||||
|
$obj->add_field("MemberID", "ID", "hid");
|
||||||
|
$obj->add_field("Kode_Nama", "Kode_Nama", "hid");
|
||||||
|
$obj->add_field("Kode_Member", "Kode", "c");
|
||||||
|
$obj->add_field("Nama_Member", "Nama Member", "awr");
|
||||||
|
$obj->add_field("Alamat_Member", "Alamat", "awr");
|
||||||
|
$obj->add_field("Telp_Member", "Telp.", "awr");
|
||||||
|
$obj->set_field_order("Nama_Member", "A");
|
||||||
|
$obj->set_func_select("RepoMemberHistoriJS.member_select");
|
||||||
|
$this->app->json([ $obj->db_table("divBrowMember") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function auto_member() {
|
||||||
|
$tcari = Param::Get("Auto_Query", "");
|
||||||
|
$ajson['autodata'] = [];
|
||||||
|
|
||||||
|
$stat = $this->db->runQuery("SELECT MemberID,Grup_MemberID,Kode_Member,Nama_Member,CONCAT(IF(Kode_Member='','',CONCAT(Kode_Member,' - ')),Nama_Member) Kode_Nama FROM para_member WHERE Aktif=1 AND CONCAT(Kode_Member,Nama_Member,Alamat_Member,Telp_Member) LIKE ? ORDER BY Nama_Member LIMIT 50", ['%'.$tcari.'%']);
|
||||||
|
while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$ajson['autodata'][] = ['value'=>$row['MemberID'], 'text'=>$row['Kode_Nama'], 'html'=>'<span class="text-primary">'.$row['Kode_Member'].'</span> '.$row['Nama_Member'], 'data'=>0, 'bc'=>0];
|
||||||
|
}
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function prepare() {
|
||||||
|
$apre = [
|
||||||
|
'id_tipe' => Param::Int("Point_TipeID", 0),
|
||||||
|
'id_mem' => Param::Int("MemberID", 0),
|
||||||
|
'tgl_from' => Param::Get("Tgl_From"),
|
||||||
|
'tgl_to' => Param::Get("Tgl_To"),
|
||||||
|
];
|
||||||
|
|
||||||
|
$apre['nama_tipe'] = ($apre['id_tipe'] > 0) ? ($this->db->fetchField("SELECT UPPER(Nama_Tipe) FROM inv_point_tipe WHERE Point_TipeID=?", [$apre['id_tipe']]) ?? '') : '';
|
||||||
|
$apre['nama_mem'] = ($apre['id_mem'] > 0) ? ($this->db->fetchField("SELECT CONCAT(IFNULL(Kode_Member,'000000'),' - ',UPPER(Nama_Member)) FROM para_member WHERE MemberID=?", [$apre['id_mem']]) ?? '') : '';
|
||||||
|
|
||||||
|
// generate report header
|
||||||
|
$apre['periode'] = $apre['tgl_from'] . ($apre['tgl_from'] !== $apre['tgl_to'] ? ' s/d '.$apre['tgl_to'] : '');
|
||||||
|
|
||||||
|
$tsql = ''; $asql = [$apre['id_tipe'], $apre['id_mem'], tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to'])];
|
||||||
|
if ($this->id_cab > 0) {
|
||||||
|
$tsql .= " AND CabID=?";
|
||||||
|
array_push($asql, $this->id_cab);
|
||||||
|
}
|
||||||
|
|
||||||
|
$apre['saldo'] = $this->db->fetchField("SELECT SUM(Nilai_Point) Saldo FROM inv_point_tx WHERE Point_TipeID=? AND MemberID=? AND Tgl_TX<?", [$apre['id_tipe'], $apre['id_mem'], tgl_sql2str($apre['tgl_from'])]) ?? 0;
|
||||||
|
|
||||||
|
$apre['query'] = $this->db->runQuery("SELECT P.*,C.Nama_Cab FROM (SELECT No_TX,Tgl_TX,CabID,IF(Nilai_Point>0,Nilai_Point,0) Tambah,IF(Nilai_Point<0,-Nilai_Point,0) Kurang,Nilai_Point FROM inv_point_tx WHERE Point_TipeID=? AND MemberID=? AND (Tgl_TX BETWEEN ? AND ?)".$tsql." ORDER BY CabID) P LEFT JOIN para_cabang C ON (C.CabID=P.CabID) ORDER BY DATE(P.Tgl_TX) ASC,P.Nilai_Point DESC", $asql);
|
||||||
|
return $apre;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function print() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
|
||||||
|
$pre = new PrintHTML($this->app);
|
||||||
|
$pre->add_title([strtoupper($this->reg_name), "SEJARAH POINT MEMBER ".$apre['nama_tipe'], "Periode : ".$apre['periode']]);
|
||||||
|
|
||||||
|
$pre->add_field("No.",10,"C");
|
||||||
|
$pre->add_field("No. TX",20,"L");
|
||||||
|
$pre->add_field("Tgl. TX",20,"C","tgl_sql2str");
|
||||||
|
$pre->add_field("Cabang",40,"L");
|
||||||
|
$pre->add_field("Perolehan",20,"R","rupiah");
|
||||||
|
$pre->add_field("Penukaran",20,"R","rupiah");
|
||||||
|
$pre->add_field("Sisa Point",20,"R","rupiah");
|
||||||
|
|
||||||
|
if ($apre['id_mem'] > 0) $pre->add_sub_title("Nama Member : ".$apre['nama_mem']);
|
||||||
|
|
||||||
|
$pre->show_titles();
|
||||||
|
$pre->show_headers();
|
||||||
|
|
||||||
|
$nomor = 0; $tot_tambah = 0; $tot_kurang = 0;
|
||||||
|
$pre->add_span([ ["Point Sebelumnya",4,"R,B"],['',1],['',1],[$apre['saldo'],1,"R,B","rupiah"] ]);
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_tambah += $row['Tambah'];
|
||||||
|
$tot_kurang += $row['Kurang'];
|
||||||
|
$apre['saldo'] += $row['Nilai_Point'];
|
||||||
|
$pre->add_row([ ++$nomor, $row['No_TX'], $row['Tgl_TX'], $row['Nama_Cab'], $row['Tambah'], $row['Kurang'], $apre['saldo'] ]);
|
||||||
|
}
|
||||||
|
$pre->add_span([ ["Jumlah / Sisa Point",4,"R,B"],[$tot_tambah,1,"R,B","rupiah"],[$tot_kurang,1,"R,B","rupiah"],[$apre['saldo'],1,"R,B","rupiah"] ]);
|
||||||
|
|
||||||
|
$pre->add_stamp(1, true);
|
||||||
|
$pre->show();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function excel() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
$xls = new Xlsx($this->app);
|
||||||
|
$xls->set_meta([
|
||||||
|
'title' => "Data Sejarah Point Member",
|
||||||
|
'desc' => "Export Data Sejarah Point Member"
|
||||||
|
]);
|
||||||
|
$xls->add_title([ $this->reg_name, "DATA SEJARAH POINT MEMBER ".$apre['nama_tipe'], "Periode : ".$apre['periode'] ]);
|
||||||
|
|
||||||
|
$xls->add_field("No.", 5, "@integer");
|
||||||
|
$xls->add_field("No. TX", 10, "@text");
|
||||||
|
$xls->add_field("Tgl. TX", 12, "@date");
|
||||||
|
$xls->add_field("Cabang", 15, "@text");
|
||||||
|
$xls->add_field("Perolehan", 15, "#,##0");
|
||||||
|
$xls->add_field("Penukaran", 15, "#,##0");
|
||||||
|
$xls->add_field("Sisa Point", 15, "#,##0");
|
||||||
|
$xls->add_sheet("".str_replace("s/d","-",$apre['periode']));
|
||||||
|
|
||||||
|
if ($apre['id_mem'] > 0) $xls->add_sub_title("Nama Member : ".$apre['nama_mem']);
|
||||||
|
|
||||||
|
$xls->show_titles();
|
||||||
|
$xls->show_headers();
|
||||||
|
|
||||||
|
$nomor = 0; $tot_tambah = 0; $tot_kurang = 0;
|
||||||
|
$xls->add_row_bold([ "", "", "", "Point Sebelumnya", "", "", $apre['saldo'] ]);
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_tambah += $row['Tambah'];
|
||||||
|
$tot_kurang += $row['Kurang'];
|
||||||
|
$apre['saldo'] += $row['Nilai_Point'];
|
||||||
|
$xls->add_row([ ++$nomor, $row['No_TX'], $row['Tgl_TX'], $row['Nama_Cab'], $row['Tambah'], $row['Kurang'], $apre['saldo'] ]);
|
||||||
|
}
|
||||||
|
$xls->add_row_bold([ "", "", "", "Jumlah / Sisa Point", $tot_tambah, $tot_kurang, $apre['saldo'] ]);
|
||||||
|
|
||||||
|
$xls->add_stamp(1, true);
|
||||||
|
$xls->download("Data Sejarah Point Member ".str_replace("s/d","-",$apre['periode']).".xlsx");
|
||||||
|
unset($xls);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$ttipe = $form->option_db("_", "Point_TipeID", 0, true, false, "inv_point_tipe", ["Point_TipeID","Nama_Tipe"], "TRUE ORDER BY Point_TipeID", [0," "]);
|
||||||
|
$tcab = $form->option_db("_", "CabID", $this->id_cab, true, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID", [0,"SEMUA CABANG"]);
|
||||||
|
$tmem = $form->textauto("_", "Nama_Member", ['value'=>0,'text'=>""], true, true, "nama member");
|
||||||
|
$tfrom = $form->datebox("_", "Tgl_From", tgl_ymd(), true, false);
|
||||||
|
$tto = $form->datebox("_", "Tgl_To", tgl_ymd(), true, false);
|
||||||
|
$ajson['html'] = '
|
||||||
|
<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="Point_TipeID">Tipe Point</label>
|
||||||
|
<div class="col">'.$ttipe.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="Nama_Member">Nama Member</label>
|
||||||
|
<div class="col"><div class="input-group">'.$tmem.'<button id="butBrowMember" class="btn btn-info" type="button"><i class="bi-people-fill"></i></button></div></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>
|
||||||
|
<input type="hidden" id="MemberID" value="0" >';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,176 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Report/Member/PointController
|
||||||
|
Description : Laporan Point Member
|
||||||
|
Created By : Siau Pheng ([email protected]).
|
||||||
|
Created Date : May 9th, 2017.
|
||||||
|
Last Modified : October 17th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Report\Member;
|
||||||
|
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use flight\Session;
|
||||||
|
use Webapp\Data\Xlsx;
|
||||||
|
use Webapp\Printer\PrintHTML;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
|
||||||
|
class PointController {
|
||||||
|
|
||||||
|
private int $id_cab;
|
||||||
|
private string $reg_name;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->id_cab = Param::Int("CabID", 0);
|
||||||
|
$this->reg_name = $session->get('WEB_APP')['REG_NAME'];
|
||||||
|
}
|
||||||
|
|
||||||
|
private function prepare() {
|
||||||
|
$apre = [
|
||||||
|
'id_tipe' => Param::Int("Point_TipeID", 0),
|
||||||
|
'id_grup_mem' => Param::Int("Grup_MemberID", 0),
|
||||||
|
'urut' => Param::Get("Urut", "P"),
|
||||||
|
'tgl_from' => Param::Get("Tgl_From"),
|
||||||
|
'tgl_to' => Param::Get("Tgl_To"),
|
||||||
|
];
|
||||||
|
|
||||||
|
$apre['nama_tipe'] = ($apre['id_tipe'] > 0) ? ($this->db->fetchField("SELECT UPPER(Nama_Tipe) FROM inv_point_tipe WHERE Point_TipeID=?", [$apre['id_tipe']]) ?? '') : '';
|
||||||
|
|
||||||
|
// generate report header
|
||||||
|
$apre['periode'] = $apre['tgl_from'] . ($apre['tgl_from'] !== $apre['tgl_to'] ? ' s/d '.$apre['tgl_to'] : '');
|
||||||
|
|
||||||
|
$tsql1 = ''; $tsql2 = ''; $asql1 = []; $asql2 = [$apre['id_tipe'], tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to'])];
|
||||||
|
if ($this->id_cab > 0) {
|
||||||
|
$tsql2 .= " AND CabID=?";
|
||||||
|
array_push($asql2, $this->id_cab);
|
||||||
|
}
|
||||||
|
if ($apre['id_grup_mem'] > 0) {
|
||||||
|
$tsql1 .= " AND Grup_MemberID=?";
|
||||||
|
array_push($asql1, $apre['id_grup_mem']);
|
||||||
|
}
|
||||||
|
$torder = ($apre['urut'] === "N") ? "M.Nama_Member ASC" : "P.Sisa_Point DESC";
|
||||||
|
$torder = ($apre['urut'] === "P") ? "P.Tambah_Point DESC" : $torder;
|
||||||
|
|
||||||
|
$apre['query'] = $this->db->runQuery("SELECT M.*,G.Nama_Grup,P.* FROM (SELECT * FROM para_member WHERE (IM=1 OR (IM=0 AND Kode_Member<>''))".$tsql1.") M LEFT JOIN para_member_grup G ON (G.Grup_MemberID=M.Grup_MemberID) LEFT JOIN (SELECT MemberID,SUM(IF(Nilai_Point>0,Nilai_Point,0)) Tambah_Point,SUM(IF(Nilai_Point<0,-Nilai_Point,0)) Kurang_Point,SUM(Nilai_Point) Sisa_Point FROM inv_point_tx WHERE Point_TipeID=? AND Tgl_TX BETWEEN ? AND ?".$tsql2." GROUP BY MemberID ORDER BY MemberID) P ON (P.MemberID=M.MemberID) ORDER BY ".$torder, array_merge($asql1, $asql2));
|
||||||
|
return $apre;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function print() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
|
||||||
|
$pre = new PrintHTML($this->app);
|
||||||
|
$pre->add_title([strtoupper($this->reg_name), "JUMLAH POINT MEMBER ".$apre['nama_tipe'], "Periode : ".$apre['periode']]);
|
||||||
|
|
||||||
|
$pre->add_field("No.",10,"C");
|
||||||
|
$pre->add_field("ID Member",20,"L");
|
||||||
|
$pre->add_field("Grup Member",40,"L");
|
||||||
|
$pre->add_field("Nama Member",80,"L");
|
||||||
|
$pre->add_field("No. Telp",80,"L");
|
||||||
|
$pre->add_field("Alamat Member",120,"L");
|
||||||
|
$pre->add_field("Jumlah Point",20,"R","rupiah");
|
||||||
|
$pre->add_field("Jumlah Tukar",20,"R","rupiah");
|
||||||
|
$pre->add_field("Sisa Point",20,"R","rupiah");
|
||||||
|
|
||||||
|
$pre->show_titles();
|
||||||
|
$pre->show_headers();
|
||||||
|
|
||||||
|
$nomor = 0; $tot_point = 0; $tot_tukar = 0; $tot_sisa = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_point += $row['Tambah_Point'];
|
||||||
|
$tot_tukar += $row['Kurang_Point'];
|
||||||
|
$tot_sisa += $row['Sisa_Point'];
|
||||||
|
$pre->add_row([ ++$nomor, $row['Kode_Member'], $row['Nama_Grup'], $row['Nama_Member'], $row['Telp_Member'], $row['Alamat_Member'], $row['Tambah_Point'], $row['Kurang_Point'], $row['Sisa_Point'] ]);
|
||||||
|
}
|
||||||
|
$pre->add_span([ ["GRAND TOTAL",6,"R,B"],[$tot_point,1,"R,B","rupiah"],[$tot_tukar,1,"R,B","rupiah"],[$tot_sisa,1,"R,B","rupiah"] ]);
|
||||||
|
|
||||||
|
$pre->add_stamp(1, true);
|
||||||
|
$pre->show();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function excel() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
$xls = new Xlsx($this->app);
|
||||||
|
$xls->set_meta([
|
||||||
|
'title' => "Data Jumlah Point Member",
|
||||||
|
'desc' => "Export Data Jumlah Point Member"
|
||||||
|
]);
|
||||||
|
$xls->add_title([ $this->reg_name, "DATA JUMLAH POINT MEMBER ".$apre['nama_tipe'], "Periode : ".$apre['periode'] ]);
|
||||||
|
|
||||||
|
$xls->add_field("No.", 5, "@integer");
|
||||||
|
$xls->add_field("ID Member", 10, "@text");
|
||||||
|
$xls->add_field("Grup Member", 15, "@text");
|
||||||
|
$xls->add_field("Nama Member", 15, "@text");
|
||||||
|
$xls->add_field("No. Telp", 12, "@text");
|
||||||
|
$xls->add_field("Alamat Member", 25, "@text");
|
||||||
|
$xls->add_field("Jumlah Point", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Jumlah Tukar", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Sisa Point", 15, "#,##0.00");
|
||||||
|
$xls->add_sheet("".str_replace("s/d","-",$apre['periode']));
|
||||||
|
|
||||||
|
$xls->show_titles();
|
||||||
|
$xls->show_headers();
|
||||||
|
|
||||||
|
$nomor = 0; $tot_point = 0; $tot_tukar = 0; $tot_sisa = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_point += $row['Tambah_Point'];
|
||||||
|
$tot_tukar += $row['Kurang_Point'];
|
||||||
|
$tot_sisa += $row['Sisa_Point'];
|
||||||
|
$xls->add_row([ ++$nomor, $row['Kode_Member'], $row['Nama_Grup'], $row['Nama_Member'], $row['Telp_Member'], $row['Alamat_Member'], $row['Tambah_Point'], $row['Kurang_Point'], $row['Sisa_Point'] ]);
|
||||||
|
}
|
||||||
|
$xls->add_row_bold([ "", "", "", "GRAND TOTAL", "", "", $tot_point, $tot_tukar, $tot_sisa ]);
|
||||||
|
|
||||||
|
$xls->add_stamp(1, true);
|
||||||
|
$xls->download("Data Jumlah Point Member ".str_replace("s/d","-",$apre['periode']).".xlsx");
|
||||||
|
unset($xls);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$ttipe = $form->option_db("_", "Point_TipeID", 0, true, false, "inv_point_tipe", ["Point_TipeID","Nama_Tipe"], "TRUE ORDER BY Point_TipeID", [0," "]);
|
||||||
|
$tcab = $form->option_db("_", "CabID", $this->id_cab, true, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID", [0,"SEMUA CABANG"]);
|
||||||
|
$tgrup_mem = $form->option_db("_", "Grup_MemberID", 0, true, false, "para_member_grup", ["Grup_MemberID","Nama_Grup"], "TRUE ORDER BY Nama_Grup", [0,"SEMUA GRUP"]);
|
||||||
|
$turut = $form->radio("_", "Urut", "B", true, false, ['N'=>"Nama (A-Z)",'P'=>"Jumlah Point (Z-A)",'S'=>"Sisa Point (Z-A)"]);
|
||||||
|
$tfrom = $form->datebox("_", "Tgl_From", tgl_ymd(), true, false);
|
||||||
|
$tto = $form->datebox("_", "Tgl_To", tgl_ymd(), true, false);
|
||||||
|
$ajson['html'] = '
|
||||||
|
<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="Point_TipeID">Tipe Point</label>
|
||||||
|
<div class="col">'.$ttipe.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="Grup_MemberID">Grup Member</label>
|
||||||
|
<div class="col">'.$tgrup_mem.'</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">'.$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>';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,157 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Report/Member/TukarController
|
||||||
|
Description : Laporan Penukaran Barang
|
||||||
|
Created By : Siau Pheng (siaupheng@3fonia.com).
|
||||||
|
Created Date : May 9th, 2017.
|
||||||
|
Last Modified : October 18th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Report\Member;
|
||||||
|
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use flight\Session;
|
||||||
|
use Webapp\Data\Xlsx;
|
||||||
|
use Webapp\Printer\PrintHTML;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
|
||||||
|
class TukarController {
|
||||||
|
|
||||||
|
private int $id_cab;
|
||||||
|
private string $reg_name;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->id_cab = Param::Int("CabID", 0);
|
||||||
|
$this->reg_name = $session->get('WEB_APP')['REG_NAME'];
|
||||||
|
}
|
||||||
|
|
||||||
|
private function prepare() {
|
||||||
|
$apre = [
|
||||||
|
'id_tipe' => Param::Int("Point_TipeID", 0),
|
||||||
|
'id_grup_mem' => Param::Int("Grup_MemberID", 0),
|
||||||
|
'tgl_from' => Param::Get("Tgl_From"),
|
||||||
|
'tgl_to' => Param::Get("Tgl_To"),
|
||||||
|
];
|
||||||
|
|
||||||
|
$apre['nama_tipe'] = ($apre['id_tipe'] > 0) ? ($this->db->fetchField("SELECT UPPER(Nama_Tipe) FROM inv_point_tipe WHERE Point_TipeID=?", [$apre['id_tipe']]) ?? '') : '';
|
||||||
|
|
||||||
|
// generate report header
|
||||||
|
$apre['periode'] = $apre['tgl_from'] . ($apre['tgl_from'] !== $apre['tgl_to'] ? ' s/d '.$apre['tgl_to'] : '');
|
||||||
|
|
||||||
|
$tsql = ''; $asql = [$apre['id_tipe'], tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to'])];
|
||||||
|
if ($this->id_cab > 0) {
|
||||||
|
$tsql .= " AND CabID=?";
|
||||||
|
array_push($asql, $this->id_cab);
|
||||||
|
}
|
||||||
|
if ($apre['id_grup_mem'] > 0) {
|
||||||
|
$tsql .= " AND MemberID IN (SELECT MemberID FROM para_member WHERE Grup_MemberID=?)";
|
||||||
|
array_push($asql, $apre['id_grup_mem']);
|
||||||
|
}
|
||||||
|
|
||||||
|
$apre['query'] = $this->db->runQuery("SELECT P.*,B.Nama_Barang FROM (SELECT InvPID,SUM(Nilai_Point) Nilai_Point,COUNT(*) Qty FROM inv_point_tx WHERE Point_TipeID=? AND (Tgl_TX BETWEEN ? AND ?)".$tsql." GROUP BY InvPID ORDER BY InvPID) P LEFT JOIN inv_point_barang B ON (P.InvPID=B.InvPID) ORDER BY B.Nama_Barang", $asql);
|
||||||
|
return $apre;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function print() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
|
||||||
|
$pre = new PrintHTML($this->app);
|
||||||
|
$pre->add_title([strtoupper($this->reg_name), "PENUKARAN BARANG ".$apre['nama_tipe'], "Periode : ".$apre['periode']]);
|
||||||
|
|
||||||
|
$pre->add_field("No.",10,"C");
|
||||||
|
$pre->add_field("Nama Barang",80,"L");
|
||||||
|
$pre->add_field("Qty Tukar",20,"R","rupiah");
|
||||||
|
$pre->add_field("Point Tukar",20,"R","rupiah");
|
||||||
|
|
||||||
|
$pre->show_titles();
|
||||||
|
$pre->show_headers();
|
||||||
|
|
||||||
|
$nomor = 0; $tot_point = 0; $tot_tukar = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_point += $row['Nilai_Point'];
|
||||||
|
$tot_tukar += $row['Qty'];
|
||||||
|
$pre->add_row([ ++$nomor, $row['Nama_Barang'], $row['Qty'], $row['Nilai_Point'] ]);
|
||||||
|
}
|
||||||
|
$pre->add_span([ ["Grand Total",2,"R,B"],[$tot_point,1,"R,B","rupiah"],[$tot_tukar,1,"R,B","rupiah"] ]);
|
||||||
|
|
||||||
|
$pre->add_stamp(1, true);
|
||||||
|
$pre->show();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function excel() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
$xls = new Xlsx($this->app);
|
||||||
|
$xls->set_meta([
|
||||||
|
'title' => "Data Penukaran Barang",
|
||||||
|
'desc' => "Export Data Penukaran Barang"
|
||||||
|
]);
|
||||||
|
$xls->add_title([ $this->reg_name, "DATA PENUKARAN BARANG ".$apre['nama_tipe'], "Periode : ".$apre['periode'] ]);
|
||||||
|
|
||||||
|
$xls->add_field("No.", 5, "@integer");
|
||||||
|
$xls->add_field("Nama Barang", 25, "@text");
|
||||||
|
$xls->add_field("Qty Tukar", 15, "#,##0");
|
||||||
|
$xls->add_field("Point Tukar", 15, "#,##0");
|
||||||
|
$xls->add_sheet("".str_replace("s/d","-",$apre['periode']));
|
||||||
|
|
||||||
|
$xls->show_titles();
|
||||||
|
$xls->show_headers();
|
||||||
|
|
||||||
|
$nomor = 0; $tot_point = 0; $tot_tukar = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_point += $row['Nilai_Point'];
|
||||||
|
$tot_tukar += $row['Qty'];
|
||||||
|
$xls->add_row([ ++$nomor, $row['Nama_Barang'], $row['Qty'], $row['Nilai_Point'] ]);
|
||||||
|
}
|
||||||
|
$xls->add_row_bold([ "", "Grand Total", $tot_point, $tot_tukar ]);
|
||||||
|
|
||||||
|
$xls->add_stamp(1, true);
|
||||||
|
$xls->download("Data Penukaran Barang ".str_replace("s/d","-",$apre['periode']).".xlsx");
|
||||||
|
unset($xls);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tcab = $form->option_db("_", "CabID", $this->id_cab, true, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID", [0,"SEMUA CABANG"]);
|
||||||
|
$ttipe = $form->option_db("_", "Point_TipeID", 0, true, false, "inv_point_tipe", ["Point_TipeID","Nama_Tipe"], "TRUE ORDER BY Point_TipeID", [0," "]);
|
||||||
|
$tgrup_mem = $form->option_db("_", "Grup_MemberID", 0, true, false, "para_member_grup", ["Grup_MemberID","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);
|
||||||
|
$ajson['html'] = '
|
||||||
|
<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="Point_TipeID">Tipe Point</label>
|
||||||
|
<div class="col">'.$ttipe.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="Grup_MemberID">Grup Member</label>
|
||||||
|
<div class="col">'.$tgrup_mem.'</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>
|
||||||
|
<input type="hidden" id="MemberID" value="0" >';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,523 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Report/NotaController
|
||||||
|
Description : Cetak Struk / Nota POS
|
||||||
|
Created By : Siau Pheng (siaupheng@3fonia.com).
|
||||||
|
Created Date : April 12th, 2011.
|
||||||
|
Last Modified : October 3rd, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Report;
|
||||||
|
|
||||||
|
use App\Utils\PPOBClient;
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use flight\Session;
|
||||||
|
use Webapp\Printer\PrintPOS;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
|
||||||
|
class NotaController {
|
||||||
|
|
||||||
|
private array $web_app;
|
||||||
|
private array $app_inv;
|
||||||
|
private string $no_cetak;
|
||||||
|
private int $op_cash;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->web_app = (array) $session->get('WEB_APP');
|
||||||
|
$this->app_inv = (array) $session->get('APP_INV');
|
||||||
|
$this->no_cetak = Param::Get("Nomor_Cetak", "");
|
||||||
|
$this->op_cash = Param::Int("Open_Cash", 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function pos(): void {
|
||||||
|
if (empty($this->no_cetak)) return;
|
||||||
|
|
||||||
|
$ncetak = 1; $is_orig = ($this->op_cash > 0) ? true : false; $apromo = [];
|
||||||
|
$ainfo = $this->db->fetchRow("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=?) J LEFT JOIN app_operator O ON (J.UserID=O.UserID) LEFT JOIN para_rek_pos B ON (J.KartuID=B.KartuID)", [$this->no_cetak]);
|
||||||
|
if ($ainfo) $ainfo = $ainfo->getData();
|
||||||
|
if ($ainfo['KartuID'] > 0) $ncetak++;
|
||||||
|
|
||||||
|
$is_member = !in_array($ainfo['MemberID'], [0,36,103,90,146]);
|
||||||
|
if ($is_member) {
|
||||||
|
$_member = $this->db->fetchRow("SELECT IM,Kode_Member,Nama_Member FROM para_member WHERE MemberID=?", [$ainfo['MemberID']]);
|
||||||
|
$_member = ($_member) ? $_member->getData() : ['IM'=>0, 'Kode_Member'=>"", 'Nama_Member'=>""];
|
||||||
|
$ainfo = array_merge($ainfo, $_member);
|
||||||
|
}
|
||||||
|
|
||||||
|
$aitem = $this->db->fetchAll("SELECT D.*,P.Kode_SKU,P.Nama_Produk_Varian,P.Nama_Lengkap,P.Nama_Satuan FROM (SELECT No_Ref,ID,InvID,SatuanID,VarianID,Harga_Jual,Disk_Rupiah,SUM(-Qty) Qty,SUM(-Qty*Harga_Jual) Jual,SUM(-Qty*Disk_Rupiah) Diskon,Total_Diskon,Promo FROM inv_detail WHERE No_Ref=? AND Qty<>0 GROUP BY InvID,SatuanID,VarianID,Harga_Jual,Promo) D LEFT JOIN vi_inv_produk P ON (D.InvID=P.InvID AND D.SatuanID=P.SatuanID AND D.VarianID=P.VarianID) ORDER BY P.Nama_Produk_Varian", [$this->no_cetak]);
|
||||||
|
if (count($aitem) === 0) return;
|
||||||
|
|
||||||
|
$pre = new PrintPOS($this->app);
|
||||||
|
$pre->set_fontsize(2);//thermal
|
||||||
|
$pre->set_header_logo("logo-nota.png");//thermal
|
||||||
|
if ($this->app_inv['PRINT_OPENCD'] === 1 && $this->op_cash === 1) $pre->set_opendrawer();
|
||||||
|
if ($this->app_inv['PRINT_AUTOCUT'] === 1) $pre->set_cutpaper();
|
||||||
|
if (!empty($this->app_inv['TITLE_BEGIN'])) {
|
||||||
|
$_ahead = explode("[br]", stripslashes($this->app_inv['TITLE_BEGIN']));
|
||||||
|
foreach($_ahead as $val) $pre->addc($val);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($is_member) {
|
||||||
|
$pre->add([$ainfo['No_Jual'],14], [$ainfo['Nama_User'],26,"R"]);
|
||||||
|
$pre->add([$ainfo['Kode_Member'] ?? "00000000",28], [$ainfo['Tgl_Jual2'],12,"R"]);
|
||||||
|
$pre->add([$ainfo['Nama_Member'],30], [$ainfo['Jam_Jual'],10,"R"]);
|
||||||
|
} else {
|
||||||
|
$pre->add([$ainfo['No_Jual'],20], [$ainfo['Tgl_Jual2'],20,"R"]);
|
||||||
|
$pre->add([$ainfo['Nama_User'],20], [$ainfo['Jam_Jual'],20,"R"]);
|
||||||
|
}
|
||||||
|
$pre->add_line();
|
||||||
|
|
||||||
|
$items = 0; $qty = 0;
|
||||||
|
foreach ($aitem as $item) {
|
||||||
|
if ($item['Promo'] > 1) {
|
||||||
|
$apromo[] = rupiah($item['Qty'])." ".$item['Nama_Satuan']." ".$item['Nama_Produk_Varian'];
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if ($is_member) {
|
||||||
|
$pre->add($item['Nama_Produk_Varian']);
|
||||||
|
$pre->add([rupiah($item['Qty']),8,"R"], [" ".$item['Nama_Satuan'],7], [" @",2], [rupiah($item['Harga_Jual']),10,"R"], [rupiah($item['Jual']),13,"R"]);
|
||||||
|
} else {
|
||||||
|
$pre->add($item['Nama_Lengkap']);
|
||||||
|
$pre->add([$item['Kode_SKU'],8], [rupiah($item['Qty']),8,"R"], [" @",2], [rupiah($item['Harga_Jual']),9,"R"], [rupiah($item['Jual']),13,"R"]);
|
||||||
|
}
|
||||||
|
if ($item['Disk_Rupiah'] > 0) {
|
||||||
|
if ($item['Promo'] === 1) {
|
||||||
|
$pre->add([" DISKON PROMO",27], [rupiah($item['Total_Diskon']*-1),13,"R"]);
|
||||||
|
} else {
|
||||||
|
if ($is_member) {
|
||||||
|
$pre->add([rupiah($item['Qty']),8,"R"], [" ".$item['Nama_Satuan'],7], [" @",2], [rupiah($item['Disk_Rupiah']*-1),10,"R"], [" DISC",5], [rupiah($item['Diskon']*-1),8,"R"]);
|
||||||
|
} else {
|
||||||
|
$pre->add([" DISC",8], [rupiah($item['Qty']),8,"R"], [" @",2], [rupiah($item['Disk_Rupiah']*-1),9,"R"], [rupiah($item['Diskon']*-1),13,"R"]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$qty += (int) $item['Qty'];
|
||||||
|
$items++;
|
||||||
|
}
|
||||||
|
|
||||||
|
$pre->add_line();
|
||||||
|
if ($ainfo['POS'] === 1) {
|
||||||
|
$pre->add([(string) $items."I/".(string) $qty."Q",14], ["JUMLAH Rp.",13,"R"], [rupiah($ainfo['Total_Jual']-$ainfo['Total_Diskon']),13,"R"]);
|
||||||
|
if ($ainfo['Total_Tunai'] > 0) $pre->add(["TUNAI Rp.",27,"R"], [rupiah($ainfo['Total_Tunai']),13,"R"]);
|
||||||
|
if ($ainfo['Total_Kartu'] > 0) $pre->add(["NON TUNAI Rp.",27,"R"], [rupiah($ainfo['Total_Kartu']),13,"R"]);
|
||||||
|
} else {
|
||||||
|
$pre->add($pre->set_align((string) $items."I/".(string) $qty."Q",14,"L") . $pre->set_align("JUMLAH",9,"R") ."_BOLD_ Rp.". $pre->set_align(rupiah($ainfo['Total_Jual']-$ainfo['Total_Diskon']),13,"R") ."_NORM_", "X");
|
||||||
|
}
|
||||||
|
if ($ainfo['Total_Potong'] > 0) {
|
||||||
|
$pre->add([" ",14], ["PROMO Rp.",13,"R"], [rupiah($ainfo['Total_Potong']),13,"R"]);
|
||||||
|
$apromo[] = "Potongan Promo Rp. ".rupiah($ainfo['Total_Potong']);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($ainfo['POS'] === 1) {
|
||||||
|
if ($ainfo['KartuID'] === 0) {
|
||||||
|
$pre->add(["KEMBALI Rp.",27,"R"], [rupiah($ainfo['Total_Sisa']),13,"R"]);
|
||||||
|
} else {
|
||||||
|
$pre->add_empty();
|
||||||
|
$pre->add("* ".$ainfo['Kode_Kartu2']." - ".($ainfo['No_Kartu2'] ?? "XXXX"));
|
||||||
|
if (!empty($ainfo['Nama_Kartu2'])) $pre->add(" ".$ainfo['Nama_Kartu2']);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// CETAK POINT
|
||||||
|
if ($is_member) {
|
||||||
|
$apoint = $this->db->fetchAll("SELECT P.*,T.Nilai_Point,IF(S.Sisa_Point-T.Nilai_Point<0,0,S.Sisa_Point) Sisa_Point FROM inv_point_tipe P LEFT JOIN (SELECT * FROM inv_point_tx WHERE No_TX=?) T ON (P.Point_TipeID=T.Point_TipeID) LEFT JOIN (SELECT Point_TipeID,SUM(Nilai_Point) Sisa_Point FROM inv_point_tx WHERE MemberID=? GROUP BY Point_TipeID ORDER BY Point_TipeID) S ON (S.Point_TipeID=P.Point_TipeID) WHERE P.Aktif=1 ORDER BY P.Point_TipeID", [$ainfo['No_Jual'], $ainfo['MemberID']]);
|
||||||
|
if (count($apoint) > 0) $pre->add_line();
|
||||||
|
$is_2line = false;
|
||||||
|
foreach ($apoint as $point) {
|
||||||
|
if ($point['Point_TipeID'] === 1 && $ainfo['IM'] === 0) continue;
|
||||||
|
if ($point['Point_TipeID'] > 1 && $ainfo['IM'] === 0 && empty($ainfo['Kode_Member'])) continue;
|
||||||
|
if ($is_2line === true) $pre->add_empty();
|
||||||
|
if ($point['Nilai_Point'] > 0) $pre->addc(str_replace('[POINT]', rupiah($point['Nilai_Point']), $point['Txt_Struk2']));
|
||||||
|
if ($point['Sisa_Point'] > 0) $pre->addc(str_replace('[TOT_POINT]', rupiah($point['Sisa_Point']), $point['Txt_Struk1']));
|
||||||
|
$is_2line = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (count($apromo) > 0) {
|
||||||
|
$pre->add_line();
|
||||||
|
$pre->add("HADIAH PROMO :");
|
||||||
|
foreach ($apromo as $promo) $pre->add($promo);
|
||||||
|
}
|
||||||
|
$pre->add_empty();
|
||||||
|
if (!empty($this->app_inv['TITLE_END'])) {
|
||||||
|
$_afoo = explode("[br]", stripslashes($this->app_inv['TITLE_END']));
|
||||||
|
foreach($_afoo as $val) $pre->addc($val);
|
||||||
|
}
|
||||||
|
if ($is_orig === false) $pre->addc("-- SALINAN / COPY --");
|
||||||
|
$pre->add_stamp(1, false);
|
||||||
|
$pre->add_empty($this->app_inv['PRINT_ROW']);
|
||||||
|
$pre->show($ncetak);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function beli(): void {
|
||||||
|
if (empty($this->no_cetak)) return;
|
||||||
|
|
||||||
|
$ainfo = $this->db->fetchRow("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_Beli-B.Total_Diskon Jumlah FROM (SELECT * FROM inv_beli WHERE No_Beli=?) B LEFT JOIN para_supplier S ON (S.SupID=B.SupID)", [$this->no_cetak]);
|
||||||
|
$ainfo['Alamat_Sup'] = str_replace("\n", "<br>", $ainfo['Alamat_Sup']);
|
||||||
|
|
||||||
|
$aitem = $this->db->fetchAll("SELECT D.*,P.Nama_Produk_Varian,P.Nama_Satuan FROM (SELECT InvID,SatuanID,VarianID,Harga_Beli,SUM(Total_Diskon) Total_Diskon,SUM(Qty) Qty,SUM(Qty*Harga_Beli) Jumlah FROM inv_detail WHERE No_Ref=? GROUP BY InvID,SatuanID,VarianID,Harga_Beli) D LEFT JOIN vi_inv_produk P ON (P.InvID=D.InvID AND P.SatuanID=D.SatuanID AND P.VarianID=D.VarianID) ORDER BY P.Nama_Produk_Varian", [$this->no_cetak]);
|
||||||
|
if (count($aitem) === 0) return;
|
||||||
|
|
||||||
|
// menampilkan judul dibagian atas laporan
|
||||||
|
$kop = '<div class="notaTitle"><div>'.$this->web_app['REG_NAME'].'</div>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="notaTable"><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;
|
||||||
|
foreach ($aitem as $item) {
|
||||||
|
$body .= sprintf($_line, $no_urut++, $item['Nama_Produk_Varian'], rupiah2($item['Qty']), $item['Nama_Satuan'], rupiah2($item['Harga_Beli']), rupiah2($item['Jumlah']));
|
||||||
|
}
|
||||||
|
$body .= sprintf($_sline, "Sub. Total Rp.", rupiah2($ainfo['Total_Beli']));
|
||||||
|
$body .= sprintf($_sline, "Diskon Rp.", rupiah2($ainfo['Total_Diskon']));
|
||||||
|
$body .= sprintf($_sline, "Total Rp.", rupiah2($ainfo['Jumlah']));
|
||||||
|
|
||||||
|
$t_catat = empty($ainfo['Catatan']) ? ' ' : 'Catatan : <i>'.$ainfo['Catatan'].'</i>.';
|
||||||
|
$body .= '</tbody></table><table class="notaFooter"><tr><td colspan="2">'.$t_catat.'</td></tr><tr><td class="stamp"> </td><td class="r stamp">'.$this->Report_Stamp(1,true).'</td></tr></table>';
|
||||||
|
|
||||||
|
echo '<div>' . $body . '</div>';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function beli_retur(): void {
|
||||||
|
if (empty($this->no_cetak)) return;
|
||||||
|
|
||||||
|
$ainfo = $this->db->fetchRow("SELECT B.*,DATE_FORMAT(B.Tgl_Beli,'%d-%m-%Y') Tgl_Beli2,S.Kode_Sup,S.Nama_Sup,S.Alamat_Sup,-B.Total_Beli Jumlah FROM (SELECT * FROM inv_beli WHERE No_Beli=?) B LEFT JOIN para_supplier S ON (S.SupID=B.SupID)", [$this->no_cetak]);
|
||||||
|
$ainfo['Alamat_Sup'] = str_replace("\n", "<br>", $ainfo['Alamat_Sup']);
|
||||||
|
|
||||||
|
$aitem = $this->db->fetchAll("SELECT D.*,P.Nama_Produk,P.Nama_Satuan_Varian FROM (SELECT InvID,SatuanID,VarianID,Harga_Beli,SUM(-Qty) Qty,SUM(-Qty*Harga_Beli) Jumlah FROM inv_detail WHERE No_Ref=? GROUP BY InvID,SatuanID,VarianID,Harga_Beli) D LEFT JOIN vi_inv_produk P ON (P.InvID=D.InvID AND P.SatuanID=D.SatuanID AND P.VarianID=D.VarianID) ORDER BY P.Nama_Produk", [$this->no_cetak]);
|
||||||
|
if (count($aitem) === 0) return;
|
||||||
|
|
||||||
|
// menampilkan judul dibagian atas laporan
|
||||||
|
$kop = '<div class="notaTitle"><div>'.$this->web_app['REG_NAME'].'</div>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="notaTable"><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;
|
||||||
|
foreach ($aitem as $item) {
|
||||||
|
$body .= sprintf($_line, $no_urut++, $item['Nama_Produk'], rupiah2($item['Qty']), $item['Nama_Satuan'], rupiah2($item['Harga_Beli']), rupiah2($item['Jumlah']));
|
||||||
|
}
|
||||||
|
$body .= sprintf($_sline, "Total (Rp.)", rupiah2($ainfo['Jumlah']));
|
||||||
|
|
||||||
|
$t_catat = empty($ainfo['No_Faktur']) ? ' ' : 'Catatan : <i>'.$ainfo['No_Faktur'].'</i>.';
|
||||||
|
$body .= '</tbody></table><table class="notaFooter"><tr><td colspan="2">'.$t_catat.'</td></tr><tr><td class="stamp"> </td><td class="r stamp">'.$this->Report_Stamp(1,true).'</td></tr></table>';
|
||||||
|
|
||||||
|
echo '<div>' . $body . '</div>';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function jual(): void {
|
||||||
|
if (empty($this->no_cetak)) return;
|
||||||
|
|
||||||
|
$ainfo = $this->db->fetchRow("SELECT J.*,DATE_FORMAT(J.Tgl_Jual,'%d-%m-%Y') Tgl_Jual2,B.Kode_Member,B.Nama_Member,B.Alamat_Member,J.Total_Jual-J.Total_Diskon Jumlah FROM inv_jual J LEFT JOIN para_member B ON (J.MemberID=B.MemberID) WHERE J.No_Jual=?", [$this->no_cetak]);
|
||||||
|
$ainfo['Alamat_Member'] = str_replace("\n", "<br>", $ainfo['Alamat_Member']);
|
||||||
|
|
||||||
|
$aitem = $this->db->fetchAll("SELECT D.*,P.Nama_Produk_Varian,P.Nama_Satuan FROM (SELECT InvID,SatuanID,VarianID,Harga_Jual,Disk_Rupiah,SUM(-Qty) Qty,SUM(-Qty*Harga_Jual)-SUM(Total_Diskon) Jumlah FROM inv_detail WHERE No_Ref=? GROUP BY InvID,SatuanID,VarianID,Harga_Jual,Disk_Rupiah) D LEFT JOIN vi_inv_produk P ON (D.InvID=P.InvID AND D.SatuanID=P.SatuanID AND D.VarianID=P.VarianID) ORDER BY P.Nama_Produk_Varian", [$this->no_cetak]);
|
||||||
|
if (count($aitem) === 0) return;
|
||||||
|
|
||||||
|
// menampilkan judul dibagian atas laporan
|
||||||
|
$kop = '<table class="notaHeader"><tbody>';
|
||||||
|
$kop .= '<tr><td width="50%" class="fw-bold fs-6">'.$this->web_app['REG_NAME'].'</td><td width="50%">Kepada Yth.,</td></tr>';
|
||||||
|
$kop .= '<tr><td>'.$this->web_app['REG_CITY'].'</td><td><span class="fw-bold fs-6">'.$ainfo['Nama_Member'].'</span>'.(($ainfo['Kode_Member'])?" [".$ainfo['Kode_Member']."]":"").'</td></tr>';
|
||||||
|
$kop .= '<tr><td>'.$this->web_app['REG_PHONE'].'</td><td>'.$ainfo['Alamat_Member'].'</td></tr>';
|
||||||
|
$kop .= '<tr><td>No. Faktur : '.$ainfo['No_Jual'].'</td><td>Tanggal : '.$ainfo['Tgl_Jual2'].'</td></tr>';
|
||||||
|
$kop .= '</tbody></table>';
|
||||||
|
|
||||||
|
$header = '<table class="notaTable"><thead><tr><th style="width:5ch">No.</th><th>Nama Barang</th><th colspan="2" style="width:3cm">Banyaknya</th><th style="width:2cm">Harga @</th><th style="width:2cm">Diskon @</th><th style="width:3cm">Jumlah</th></tr></thead><tbody>';
|
||||||
|
$_line = '<tr><td class="c">%s</td><td>%s</td><td class="r nbr">%s</td><td class="nbl">%s</td><td class="r">%s</td><td class="r">%s</td><td class="r">%s</td></tr>';
|
||||||
|
$_sline = '<tr><td class="r b" colspan="5">%s</td><td class="r b">%s</td><td class="r b">%s</td></tr>';
|
||||||
|
$_empt = '<tr><td colspan="7"> </td></tr>';
|
||||||
|
|
||||||
|
$body = $kop.$header; $no_urut = 0;
|
||||||
|
foreach ($aitem as $item) {
|
||||||
|
$body .= sprintf($_line, ++$no_urut, $item['Nama_Produk_Varian'], rupiah2($item['Qty']), $item['Nama_Satuan'], rupiah2($item['Harga_Jual']), rupiah2($item['Disk_Rupiah']), rupiah2($item['Jumlah']));
|
||||||
|
}
|
||||||
|
if ($no_urut < 8) {
|
||||||
|
$body .= str_repeat($_empt, 8-$no_urut);
|
||||||
|
}
|
||||||
|
$body .= sprintf($_sline, "Total (Rp.)", rupiah2($ainfo['Total_Diskon']), rupiah2($ainfo['Jumlah']));
|
||||||
|
|
||||||
|
$body .= '</tbody></table><table class="notaFooter"><tr><td>Penerima,</td><td>Hormat Kami,</td></tr><tr><td class="stamp"> </td><td class="r stamp">'.$this->Report_Stamp(1,true).'</td></tr></table>';
|
||||||
|
|
||||||
|
echo '<div>' . $body . '</div>';
|
||||||
|
}
|
||||||
|
|
||||||
|
function opname(): void {
|
||||||
|
if (empty($this->no_cetak)) return;
|
||||||
|
|
||||||
|
$ainfo = $this->db->fetchRow("SELECT *,DATE_FORMAT(Tgl_Opname,'%d-%m-%Y') Tgl_Opname2 FROM inv_opname WHERE No_Opname=?", [$this->no_cetak]);
|
||||||
|
$ainfo['Catatan'] = str_replace("\n", "<br>", $ainfo['Catatan']);
|
||||||
|
|
||||||
|
$aitem = $this->db->fetchAll("SELECT D.*,P.Nama_Produk_Varian,P.Nama_Satuan FROM (SELECT InvID,SatuanID,VarianID,SUM(Qty) Qty FROM inv_detail WHERE No_Ref=? GROUP BY InvID,SatuanID,VarianID,Harga_Beli) D LEFT JOIN vi_inv_produk P ON (P.InvID=D.InvID AND P.SatuanID=D.SatuanID AND P.VarianID=D.VarianID) ORDER BY P.Nama_Produk_Varian", [$this->no_cetak]);
|
||||||
|
if (count($aitem) === 0) return;
|
||||||
|
|
||||||
|
// menampilkan judul dibagian atas laporan
|
||||||
|
$kop = '<div class="notaTitle"><div>'.$this->web_app['REG_NAME'].'</div>STOK OPNAME</div>';
|
||||||
|
$kop .= '<table class="notaHeader"><tbody>';
|
||||||
|
$kop .= '<tr><td width="15%">No. Opname</td><td width="35%" class="ttkdua">'.$ainfo['No_Opname'].'</td><td width="15%"> </td><td width="35%" class=""> </td></tr>';
|
||||||
|
$kop .= '<tr><td>Tanggal Opname</td><td class="ttkdua">'.$ainfo['Tgl_Opname2'].'</td><td> </td><td class=""> </td></tr>';
|
||||||
|
$kop .= '</tbody></table>';
|
||||||
|
|
||||||
|
$header = '<table class="garis"><thead><tr><th style="width:1cm">No.</th><th>Nama Barang</th><th style="width:2.2cm">Qty</th><th>Satuan</th></tr></thead><tbody>';
|
||||||
|
$_line = '<tr><td class="c">%s</td><td>%s</td><td class="r">%s</td><td>%s</td></tr>';
|
||||||
|
|
||||||
|
$body = $kop.$header; $no_urut = 1;
|
||||||
|
foreach ($aitem as $item) {
|
||||||
|
$body .= sprintf($_line, $no_urut++, $item['Nama_Produk_Varian'], rupiah2($item['Qty']), $item['Nama_Satuan']);
|
||||||
|
}
|
||||||
|
|
||||||
|
$t_catat = empty($ainfo['Catatan']) ? ' ' : 'Catatan : <i>'.$ainfo['Catatan'].'</i>.';
|
||||||
|
$body .= '</tbody></table><table class="notaFooter"><tr><td colspan="2">'.$t_catat.'</td></tr><tr><td class="stamp"> </td><td class="r stamp">'.$this->Report_Stamp(1,true).'</td></tr></table>';
|
||||||
|
|
||||||
|
echo '<div>' . $body . '</div>';
|
||||||
|
}
|
||||||
|
|
||||||
|
function mutasi(): void {
|
||||||
|
if (empty($this->no_cetak)) return;
|
||||||
|
|
||||||
|
$ainfo = $this->db->fetchRow("SELECT M.*,C1.Nama_Cab Cabang1,C2.Nama_Cab Cabang2 FROM (SELECT * FROM inv_mutasi WHERE No_Mutasi=?) M LEFT JOIN para_cabang C1 ON (C1.CabID=M.Dari_CabID) LEFT JOIN para_cabang C2 ON (C2.CabID=M.Ke_CabID)", [$this->no_cetak]);
|
||||||
|
$ainfo['Catatan'] = str_replace("\n", "<br>", $ainfo['Catatan']);
|
||||||
|
|
||||||
|
$aitem = $this->db->fetchAll("SELECT D.*,P.Nama_Produk_Varian,P.Nama_Satuan FROM (SELECT InvID,SatuanID,VarianID,Harga_Beli,SUM(Qty) Qty,SUM(Qty*Harga_Beli) Jumlah FROM inv_detail WHERE No_Ref=? AND Qty>0 GROUP BY InvID,SatuanID,VarianID,Harga_Beli) D LEFT JOIN vi_inv_produk P ON (P.InvID=D.InvID AND P.SatuanID=D.SatuanID AND P.VarianID=D.VarianID) ORDER BY P.Nama_Produk_Varian", [$this->no_cetak]);
|
||||||
|
if (count($aitem) === 0) return;
|
||||||
|
|
||||||
|
// menampilkan judul dibagian atas laporan
|
||||||
|
$kop = '<div class="notaTitle"><div>'.$this->web_app['REG_NAME'].'</div>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;
|
||||||
|
foreach ($aitem as $item) {
|
||||||
|
$body .= sprintf($_line, $no_urut++, $item['Nama_Produk_Varian'], rupiah2($item['Qty']), $item['Nama_Satuan'], rupiah2($item['Harga_Beli']), rupiah2($item['Jumlah']));
|
||||||
|
}
|
||||||
|
$body .= sprintf($_sline, "Total (Rp.)", rupiah2($ainfo['Total_Mutasi']));
|
||||||
|
|
||||||
|
$t_catat = empty($ainfo['Catatan']) ? ' ' : 'Catatan : <i>'.$ainfo['Catatan'].'</i>.';
|
||||||
|
$body .= '</tbody></table><table class="notaFooter"><tr><td colspan="2">'.$t_catat.'</td></tr><tr><td class="stamp"> </td><td class="r stamp">'.$this->Report_Stamp(1,true).'</td></tr></table>';
|
||||||
|
|
||||||
|
echo '<div>' . $body . '</div>';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function mutasi_pos() {
|
||||||
|
if (empty($this->no_cetak)) return;
|
||||||
|
|
||||||
|
$ainfo = $this->db->fetchRow("SELECT M.*,C1.Nama_Cab Cabang1,C2.Nama_Cab Cabang2 FROM (SELECT * FROM inv_mutasi WHERE No_Mutasi=?) M LEFT JOIN para_cabang C1 ON (C1.CabID=M.Dari_CabID) LEFT JOIN para_cabang C2 ON (C2.CabID=M.Ke_CabID)", [$this->no_cetak]);
|
||||||
|
$ainfo['Catatan'] = str_replace("\n", "<br>", $ainfo['Catatan']);
|
||||||
|
|
||||||
|
$aitem = $this->db->fetchAll("SELECT D.*,P.Nama_Produk_Varian,P.Nama_Satuan FROM (SELECT InvID,SatuanID,VarianID,Harga_Beli,SUM(Qty) Qty,SUM(Qty*Harga_Beli) Jumlah FROM inv_detail WHERE No_Ref=? AND Qty>0 GROUP BY InvID,SatuanID,VarianID,Harga_Beli) D LEFT JOIN vi_inv_produk P ON (P.InvID=D.InvID AND P.SatuanID=D.SatuanID AND P.VarianID=D.VarianID) ORDER BY P.Nama_Produk_Varian", [$this->no_cetak]);
|
||||||
|
if (count($aitem) === 0) return;
|
||||||
|
|
||||||
|
$pre = new PrintPOS($this->app);
|
||||||
|
$pre->set_fontsize(2);
|
||||||
|
$pre->set_header_logo("logo-nota.png");
|
||||||
|
if ($this->app_inv['PRINT_AUTOCUT'] === 1) $pre->set_cutpaper();
|
||||||
|
$pre->add([$ainfo['No_Mutasi'],20,"L"], [tgl_sql2str($ainfo['Tgl_Mutasi']),20,"R"]);
|
||||||
|
$pre->add(["Dari Cabang : ",14,"L"], [$ainfo['Cabang1'],36,"L"]);
|
||||||
|
$pre->add(["Ke Cabang : ",14,"L"], [$ainfo['Cabang2'],36,"L"]);
|
||||||
|
$pre->add_line("-");
|
||||||
|
|
||||||
|
foreach ($aitem as $item) {
|
||||||
|
$pre->add([$item['Nama_Produk_Varian'],29,"L"], [rupiah2($item['Qty']),7,"R"], [$item['Nama_Satuan'],4,"L"]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$pre->add_line("-");
|
||||||
|
$pre->add_stamp(1, false);
|
||||||
|
$pre->add_empty($this->app_inv['PRINT_ROW']);
|
||||||
|
$pre->show();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function tukarpoint_pos() {
|
||||||
|
if (empty($this->no_cetak)) return;
|
||||||
|
|
||||||
|
$ainfo = $this->db->fetchRow("SELECT T.*,DATE_FORMAT(T.Tgl_TX,'%d-%m-%Y') Tgl_TX2,DATE_FORMAT(T.DateStamp,'%H:%i:%s') Jam_TX,UCASE(O.Nama) Nama_User,M.Kode_Member,M.Nama_Member,M.IM,B.Nama_Barang,UPPER(P.Nama_Tipe) Nama_Tipe FROM (SELECT * FROM inv_point_tx WHERE No_TX=?) T LEFT JOIN app_operator O ON (T.UserID=O.UserID) LEFT JOIN para_member M ON (M.MemberID=T.MemberID) LEFT JOIN inv_point_barang B ON (T.InvPID=B.InvPID) LEFT JOIN inv_point_tipe P ON (P.Point_TipeID=T.Point_TipeID)", [$this->no_cetak]);
|
||||||
|
|
||||||
|
$pre = new PrintPOS($this->app);
|
||||||
|
$pre->set_fontsize(2);
|
||||||
|
$pre->set_header_logo("logo-nota.png");
|
||||||
|
if ($this->app_inv['PRINT_AUTOCUT'] === 1) $pre->set_cutpaper();
|
||||||
|
if (!empty($this->app_inv['TITLE_BEGIN'])) {
|
||||||
|
$_ahead = explode("[br]", stripslashes($this->app_inv['TITLE_BEGIN']));
|
||||||
|
foreach($_ahead as $val) $pre->addc($val);
|
||||||
|
}
|
||||||
|
|
||||||
|
$pre->add([$ainfo['No_TX'],20,"L"], [$ainfo['Tgl_TX2'],20,"R"]);
|
||||||
|
$pre->add([$ainfo['Nama_User'],20,"L"], [$ainfo['Jam_TX'],20,"R"]);
|
||||||
|
$pre->add_line("-");
|
||||||
|
|
||||||
|
$pre->add("Kode Member : ".$ainfo['Kode_Member']);
|
||||||
|
$pre->add("Nama Member : ".$ainfo['Nama_Member']);
|
||||||
|
$pre->add_empty();
|
||||||
|
$pre->addc("PENUKARAN POINT MEMBER ".$ainfo['Nama_Tipe']);
|
||||||
|
$pre->add(rupiah($ainfo['Qty'])." ".$ainfo['Nama_Barang']." @ ".rupiah($ainfo['Point']*-1));
|
||||||
|
$pre->add("Sejumlah ".rupiah($ainfo['Nilai_Point']*-1)." Point");
|
||||||
|
|
||||||
|
$apoint = $this->db->fetchAll("SELECT P.*,S.Sisa_Point FROM inv_point_tipe P LEFT JOIN (SELECT Point_TipeID,SUM(Nilai_Point) Sisa_Point FROM inv_point_tx WHERE MemberID=? GROUP BY Point_TipeID ORDER BY Point_TipeID) S ON (S.Point_TipeID=P.Point_TipeID) WHERE P.Aktif=1 ORDER BY P.Point_TipeID", [$ainfo['MemberID']]);
|
||||||
|
if (count($apoint) > 0) $pre->add_line();
|
||||||
|
foreach ($apoint as $point) {
|
||||||
|
if ($point['Point_TipeID'] === 1 && $ainfo['IM'] === 0) continue;
|
||||||
|
if ($point['Point_TipeID'] > 1 && $ainfo['IM'] === 0 && empty($ainfo['Kode_Member'])) continue;
|
||||||
|
$pre->addc(str_replace('[TOT_POINT]', rupiah($point['Sisa_Point']), $point['Txt_Struk1']));
|
||||||
|
}
|
||||||
|
|
||||||
|
$pre->add_empty();
|
||||||
|
if (!empty($this->app_inv['TITLE_END'])) {
|
||||||
|
$_afoo = explode("[br]", stripslashes($this->app_inv['TITLE_END']));
|
||||||
|
foreach($_afoo as $val) $pre->addc($val);
|
||||||
|
}
|
||||||
|
$pre->add_stamp(1, false);
|
||||||
|
$pre->add_empty($this->app_inv['PRINT_ROW']);
|
||||||
|
$pre->show();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function gaji(): void {
|
||||||
|
$list_id = Param::Get("List_CB_ID", "0");
|
||||||
|
if (empty($this->no_cetak) && $list_id === "0") return;
|
||||||
|
$abulan = bulan_array();
|
||||||
|
|
||||||
|
$pre = new PrintPOS($this->app);
|
||||||
|
$pre->set_fontsize(2);
|
||||||
|
$pre->set_header_logo("logo-nota.png");
|
||||||
|
if ($this->app_inv['PRINT_AUTOCUT'] === 1) $pre->set_cutpaper();
|
||||||
|
|
||||||
|
$_info = $this->db->fetchRow("SELECT DATE_FORMAT(Tgl_Gaji,'%d-%m-%Y') Tgl_Gaji,Tgl_Gaji Tgl_Gaji2,Minggu,Bulan,Tahun,Kode_Jurnal,Catatan Catatan1,UserID FROM gel_gaji WHERE No_Gaji=?", [$this->no_cetak]);
|
||||||
|
$ainfo = ($_info) ? $_info->getData() : [];
|
||||||
|
if ($ainfo['UserID']) {
|
||||||
|
$ainfo['Nama_OP'] = $this->db->fetchField("SELECT CONCAT(LPAD(UserID,3,'0'),'/',Nama) FROM app_operator WHERE UserID=?", [$ainfo['UserID']]) ?? '';
|
||||||
|
}
|
||||||
|
$aitem = $this->db->fetchAll("SELECT D.*,K.Nama_Karya,P.Sisa_Pinjam FROM (SELECT * FROM gel_gaji_detail WHERE No_Gaji=? AND ID IN (?)) D LEFT JOIN para_karyawan K ON (K.KaryaID=D.KaryaID) LEFT JOIN (SELECT KaryaID,SUM(Total_Pinjam-Total_Bayar) Sisa_Pinjam FROM gel_karyawan WHERE Tgl_Trans<=? GROUP BY KaryaID) P ON (P.KaryaID=D.KaryaID)", [$this->no_cetak, explode(',', $list_id), $ainfo['Tgl_Gaji2']]);
|
||||||
|
if (count($aitem) === 0) return;
|
||||||
|
|
||||||
|
foreach ($aitem as $item) {
|
||||||
|
$ainfo = array_merge($ainfo, $item);
|
||||||
|
$acatat = [];
|
||||||
|
if (!empty($ainfo['Catatan1'])) {
|
||||||
|
$acatat = str_split(ucfirst(trim($ainfo['Catatan1'])), 40);
|
||||||
|
}
|
||||||
|
if (!empty($ainfo['Catatan'])) {
|
||||||
|
$acatat = array_merge($acatat, str_split(ucfirst(trim($ainfo['Catatan'])), 40));
|
||||||
|
}
|
||||||
|
|
||||||
|
$txt_qty_hari = ($ainfo['Qty_Harian'] === round($ainfo['Qty_Harian'])) ? rupiah($ainfo['Qty_Harian']) : rupiah($ainfo['Qty_Harian'],1);
|
||||||
|
$pre->add(["SLIP GAJI",20,"L"], [$ainfo['Tgl_Gaji'],20,"R"]);
|
||||||
|
$pre->add("Minggu ".$ainfo['Minggu']." / Bulan ".$abulan[$ainfo['Bulan']]." ".$ainfo['Tahun']);
|
||||||
|
$pre->add_empty();
|
||||||
|
$pre->add("Nama Karyawan : ".$ainfo['Nama_Karya']);
|
||||||
|
if ($ainfo['Sisa_Pinjam'] !== 0 ) $pre->add([($ainfo['Sisa_Pinjam']>0?"Sisa Pinjaman ":"Saldo Tabungan")." : Rp.",20], [rupiah(abs($ainfo['Sisa_Pinjam'])),20,"R"]);
|
||||||
|
$pre->add("Hari Kerja : ".$txt_qty_hari." Hari");
|
||||||
|
$pre->add(["Gaji Mingguan : Rp.",20], [rupiah($ainfo['Total_Gaji']),20,"R"]);
|
||||||
|
if ($ainfo['Total_Lembur'] > 0) $pre->add(["Lembur Harian : Rp.",20], [rupiah($ainfo['Total_Lembur']),20,"R"]);
|
||||||
|
if ($ainfo['Total_BonusM'] > 0) $pre->add(["Bonus Mingguan : Rp.",20], [rupiah($ainfo['Total_BonusM']),20,"R"]);
|
||||||
|
if ($ainfo['Total_BonusB'] > 0) $pre->add(["Bonus Bulanan : Rp.",20], [rupiah($ainfo['Total_BonusB']),20,"R"]);
|
||||||
|
if ($ainfo['Total_Potong'] > 0) $pre->add(["Potongan : Rp.",20], [rupiah($ainfo['Total_Potong']*-1),20,"R"]);
|
||||||
|
$pre->add_line("-");
|
||||||
|
$pre->add(["GAJI BERSIH : RP.",20], [rupiah($ainfo['Total_Semua']),20,"R"]);
|
||||||
|
$pre->add_line("=");
|
||||||
|
$pre->add([date("YmdHis")."=",15], [$ainfo['Nama_OP'],25,"R"]);
|
||||||
|
if (count($acatat) > 0) {
|
||||||
|
$pre->add_empty(1);
|
||||||
|
$pre->add("INFORMASI :");
|
||||||
|
foreach ($acatat as $val) $pre->add($val);
|
||||||
|
}
|
||||||
|
$pre->add_empty($this->app_inv['PRINT_ROW']);
|
||||||
|
$pre->add_sheet();
|
||||||
|
}
|
||||||
|
$pre->show();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function ppob(): void {
|
||||||
|
if (empty($this->no_cetak)) return;
|
||||||
|
|
||||||
|
$ncetak = 1; $is_orig = ($this->op_cash > 0) ? true : false;
|
||||||
|
$is_token = 0;
|
||||||
|
$ainfo = $this->db->fetchRow("SELECT P.*,UCASE(O.Nama) Nama_User,UCASE(LEFT(B.Nama_Kartu,23)) Kode_Kartu2,UCASE(P.Nama_Kartu) Nama_Kartu2,RIGHT(P.No_Kartu,4) No_Kartu2,U.Nama_Produk,U.KateID FROM (SELECT *,DATE_FORMAT(Tgl_TX,'%d-%m-%Y') Tgl_TX2,DATE_FORMAT(DateStamp,'%H:%i:%s') Jam_Jual,(Total_Bayar-Harga_Jual) Total_Sisa FROM ppob_tx WHERE No_TX=?) P LEFT JOIN app_operator O ON (P.UserID=O.UserID) LEFT JOIN para_rek_pos B ON (P.KartuID=B.KartuID) LEFT JOIN ppob_produk U ON (P.ProdukID=U.ProdukID)", [$this->no_cetak]);
|
||||||
|
if ((int) $ainfo['KartuID'] > 0) $ncetak++;
|
||||||
|
if ((int) $ainfo['KateID'] === 5) $is_token = 1;
|
||||||
|
|
||||||
|
$pre = new PrintPOS($this->app);
|
||||||
|
$pre->set_fontsize(2);
|
||||||
|
$pre->set_header_logo("logo-nota.png");
|
||||||
|
if ($this->app_inv['PRINT_OPENCD'] === 1 && $this->op_cash === 1) $pre->set_opendrawer();
|
||||||
|
if ($this->app_inv['PRINT_AUTOCUT'] === 1) $pre->set_cutpaper();
|
||||||
|
if (!empty($this->app_inv['TITLE_BEGIN'])) {
|
||||||
|
$_ahead = explode("[br]", stripslashes($this->app_inv['TITLE_BEGIN']));
|
||||||
|
foreach($_ahead as $val) $pre->addc($val);
|
||||||
|
}
|
||||||
|
|
||||||
|
$pre->add([$ainfo['No_TX'],20], [$ainfo['Tgl_TX2'],20,"R"]);
|
||||||
|
$pre->add([$ainfo['Nama_User'],20], [$ainfo['Jam_Jual'],20,"R"]);
|
||||||
|
$pre->add_line("-");
|
||||||
|
$pre->add(["Nomor Tujuan",14], [": ".$ainfo['Tujuan'],27,"L"]);
|
||||||
|
$pre->add(["Isi Ulang",14], [": ".$ainfo['Nama_Produk'],27,"L"]);
|
||||||
|
if ($is_token === 1) {
|
||||||
|
$atoken = PPOBClient::SN_PLN($ainfo['SN']);
|
||||||
|
$pre->add(["Nama Pelanggan",14], [": ".$atoken['Nama'],27,"L"]);
|
||||||
|
$pre->add(["Tarif / Daya",14], [": ".$atoken['Daya'],27,"L"]);
|
||||||
|
$pre->add(["Nilai Token",14], [": ".$atoken['Kwh'],27,"L"]);
|
||||||
|
$pre->add(["Kode Token",14], [": ",27,"L"]);
|
||||||
|
$pre->add("_SBOLD_".$atoken['Token']."_NORM_", "X");
|
||||||
|
}
|
||||||
|
$pre->add_line("-");
|
||||||
|
$pre->add(["JUMLAH Rp.",25,"R"], [rupiah($ainfo['Harga_Jual']),15,"R"]);
|
||||||
|
if ((float) $ainfo['Total_Tunai'] > 0) $pre->add(["TUNAI Rp.",25,"R"], [rupiah($ainfo['Total_Tunai']),15,"R"]);
|
||||||
|
if ((float) $ainfo['Total_Kartu'] > 0) $pre->add(["NON TUNAI Rp.",25,"R"], [rupiah($ainfo['Total_Kartu']),15,"R"]);
|
||||||
|
|
||||||
|
if ((int) $ainfo['KartuID'] === 0) {
|
||||||
|
$pre->add(["KEMBALI Rp.",25,"R"], [rupiah($ainfo['Total_Sisa']),15,"R"]);
|
||||||
|
} else {
|
||||||
|
$pre->add_empty();
|
||||||
|
$pre->add("* ".$ainfo['Kode_Kartu2']." - ".($ainfo['No_Kartu2'] ?: "XXXX"));
|
||||||
|
if (!empty($ainfo['Nama_Kartu2'])) $pre->add(" ".$ainfo['Nama_Kartu2']);
|
||||||
|
}
|
||||||
|
|
||||||
|
$pre->add_empty();
|
||||||
|
if (!empty($this->app_inv['TITLE_END'])) {
|
||||||
|
$_afoo = explode("[br]", stripslashes($this->app_inv['TITLE_END']));
|
||||||
|
foreach($_afoo as $val) $pre->addc($val);
|
||||||
|
}
|
||||||
|
if ($is_orig === false) $pre->addc("-- SALINAN / COPY --");
|
||||||
|
$pre->add_stamp(1, false);
|
||||||
|
$pre->add_empty($this->app_inv['PRINT_ROW']);
|
||||||
|
$pre->show($ncetak);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function open_cash(): void {
|
||||||
|
$pre = new PrintPOS($this->app);
|
||||||
|
if ($this->app_inv['PRINT_OPENCD'] === 1) $pre->set_opendrawer();
|
||||||
|
$pre->show();
|
||||||
|
}
|
||||||
|
|
||||||
|
private function Report_Stamp(int $ctk_ke=1, bool $bnama=false): string {
|
||||||
|
return $this->web_app['APP_NAME']."v".$this->web_app['APP_VER'].date("\@ymd.His")."-".$this->app->user()->id(3).(($bnama==true)?"/".strtoupper($this->app->user()->username()):"").(($ctk_ke>0)?"#".isi_nol($ctk_ke,2):"");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,195 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Report/Ppob/JualController
|
||||||
|
Description : Laporan Penjualan PPOB
|
||||||
|
Created By : Siau Pheng (siaupheng@3fonia.com).
|
||||||
|
Created Date : April 12th, 2011.
|
||||||
|
Last Modified : October 8th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Report\Ppob;
|
||||||
|
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use flight\Session;
|
||||||
|
use Webapp\Data\Xlsx;
|
||||||
|
use Webapp\Printer\PrintHTML;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
|
||||||
|
class JualController {
|
||||||
|
|
||||||
|
private int $id_cab;
|
||||||
|
private string $reg_name;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->id_cab = Param::Int("CabID", 0);
|
||||||
|
$this->reg_name = $session->get('WEB_APP')['REG_NAME'];
|
||||||
|
}
|
||||||
|
|
||||||
|
private function prepare() {
|
||||||
|
$apre = [
|
||||||
|
'tipe' => Param::Get("Tipe", "R"), // R or D
|
||||||
|
'tgl_from' => Param::Get("Tgl_From"),
|
||||||
|
'tgl_to' => Param::Get("Tgl_To"),
|
||||||
|
];
|
||||||
|
|
||||||
|
// generate report header
|
||||||
|
$apre['periode'] = $apre['tgl_from'] . ($apre['tgl_from'] !== $apre['tgl_to'] ? ' s/d '.$apre['tgl_to'] : '');
|
||||||
|
|
||||||
|
$tsql = ''; $asql = [tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to'])];
|
||||||
|
if ($this->id_cab > 0) {
|
||||||
|
$tsql .= " AND CabID=?";
|
||||||
|
array_push($asql, $this->id_cab);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($apre['tipe'] === "R") {
|
||||||
|
$apre['query'] = $this->db->runQuery("SELECT P.Nama_Produk,J.*,O.OpeID,O.N_Ope FROM (SELECT ProdukID,SUM(Harga_Jual) Total,COUNT(*) Qty FROM ppob_tx WHERE (Tgl_TX BETWEEN ? AND ?)".$tsql." GROUP BY ProdukID) J LEFT JOIN ppob_produk P ON (J.ProdukID=P.ProdukID) LEFT JOIN ppob_operator O ON (P.OpeID=O.OpeID) ORDER BY P.Nama_Produk", $asql);
|
||||||
|
} else {
|
||||||
|
$apre['query'] = $this->db->runQuery("SELECT J.*,P.Nama_Produk FROM (SELECT * FROM ppob_tx WHERE (Tgl_TX BETWEEN ? AND ?)".$tsql.") J LEFT JOIN ppob_produk P ON (J.ProdukID=P.ProdukID) ORDER BY J.No_TX", $asql);
|
||||||
|
}
|
||||||
|
return $apre;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function print() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
|
||||||
|
$pre = new PrintHTML($this->app);
|
||||||
|
$pre->add_title([strtoupper($this->reg_name), ($apre['tipe']==="R"?"REKAP":"DETAIL")." PENJUALAN PRABAYAR PPOB", "Periode : ".$apre['periode']]);
|
||||||
|
|
||||||
|
if ($apre['tipe'] === "R") {
|
||||||
|
$pre->add_field("No.",10,"C");
|
||||||
|
$pre->add_field("Nama Produk",50,"L");
|
||||||
|
$pre->add_field("Qty",20,"R","rupiah");
|
||||||
|
$pre->add_field("Total",20,"R","rupiah");
|
||||||
|
|
||||||
|
$pre->show_titles();
|
||||||
|
$pre->show_headers();
|
||||||
|
|
||||||
|
$tot_jual = 0; $tot_qty = 0; $nomor = 0; $id_ope = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
if ($id_ope <> $row['OpeID']) {
|
||||||
|
$pre->add_span([$row['N_Ope'],4,"L,B"]);
|
||||||
|
$id_ope = $row['OpeID'];
|
||||||
|
}
|
||||||
|
$tot_jual += $row['Total'];
|
||||||
|
$tot_qty += $row['Qty'];
|
||||||
|
$pre->add_row([ ++$nomor, $row['Nama_Produk'], $row['Qty'], $row['Total'] ]);
|
||||||
|
}
|
||||||
|
$pre->add_span([ ["GRAND TOTAL",2,"R,B"],[$tot_qty,1,"R,B","rupiah"],[$tot_jual,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 Produk",50,"L");
|
||||||
|
$pre->add_field("No. Tujuan",20,"L");
|
||||||
|
$pre->add_field("No. HP",20,"L");
|
||||||
|
$pre->add_field("Total",30,"R","rupiah");
|
||||||
|
|
||||||
|
$pre->show_titles();
|
||||||
|
$pre->show_headers();
|
||||||
|
|
||||||
|
$tot_jual = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_jual += $row['Harga_Jual'];
|
||||||
|
$pre->add_row([ $row['No_TX'], $row['Tgl_TX'], $row['Nama_Produk'], $row['Tujuan'], $row['No_HP'], $row['Harga_Jual'] ]);
|
||||||
|
}
|
||||||
|
$pre->add_span([ ["GRAND TOTAL",5,"R,B"],[$tot_jual,1,"R,B","rupiah"] ]);
|
||||||
|
}
|
||||||
|
$pre->add_stamp(1, true);
|
||||||
|
$pre->show();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function excel() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
$xls = new Xlsx($this->app);
|
||||||
|
$xls->set_meta([
|
||||||
|
'title' => "Data Penjualan Prabayar PPOB",
|
||||||
|
'desc' => "Export Data Penjualan Prabayar PPOB Periode : ".$apre['periode'],
|
||||||
|
]);
|
||||||
|
$xls->add_title([ $this->reg_name, "DATA ".($apre['tipe']==="R"?"REKAP":"DETAIL")." PENJUALAN PRABAYAR PPOB", "Periode : ".$apre['periode'] ]);
|
||||||
|
|
||||||
|
if ($apre['tipe'] === "R") {
|
||||||
|
$xls->add_field("No.", 5, "@integer");
|
||||||
|
$xls->add_field("Nama Produk", 25, "@text");
|
||||||
|
$xls->add_field("Qty", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Total", 15, "#,##0.00");
|
||||||
|
$xls->add_sheet("".str_replace("s/d","-",$apre['periode']));
|
||||||
|
|
||||||
|
$xls->show_titles();
|
||||||
|
$xls->show_headers();
|
||||||
|
|
||||||
|
$tot_jual = 0; $tot_qty = 0; $nomor = 0; $id_ope = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
if ($id_ope <> $row['OpeID']) {
|
||||||
|
$xls->add_row_bold([ $row['N_Ope'] ]);
|
||||||
|
$id_ope = $row['OpeID'];
|
||||||
|
}
|
||||||
|
$tot_jual += $row['Total'];
|
||||||
|
$tot_qty += $row['Qty'];
|
||||||
|
$xls->add_row([ ++$nomor, $row['Nama_Produk'], $row['Qty'], $row['Total'] ]);
|
||||||
|
}
|
||||||
|
$xls->add_row_bold([ "", "GRAND TOTAL", $tot_qty, $tot_jual ]);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
$xls->add_field("No. Nota", 15, "@");
|
||||||
|
$xls->add_field("Tgl. Nota", 12, "@date");
|
||||||
|
$xls->add_field("Nama Produk", 20, "@text");
|
||||||
|
$xls->add_field("No. Tujuan", 15, "@text");
|
||||||
|
$xls->add_field("No. HP", 15, "@text");
|
||||||
|
$xls->add_field("Total", 15, "#,##0.00");
|
||||||
|
$xls->add_sheet("".str_replace("s/d","-",$apre['periode']));
|
||||||
|
|
||||||
|
$xls->show_titles();
|
||||||
|
$xls->show_headers();
|
||||||
|
|
||||||
|
$tot_jual = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_jual += $row['Harga_Jual'];
|
||||||
|
$xls->add_row([ $row['No_TX'], $row['Tgl_TX'], $row['Nama_Produk'], $row['Tujuan'], $row['No_HP'], $row['Harga_Jual'] ]);
|
||||||
|
}
|
||||||
|
$xls->add_row_bold([ "", "", "GRAND TOTAL", "", "", $tot_jual ]);
|
||||||
|
}
|
||||||
|
$xls->add_stamp(1, true);
|
||||||
|
$xls->download("Data Penjualan Prabayar PPOB ".str_replace("s/d","-",$apre['periode']).".xlsx");
|
||||||
|
unset($xls);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$ttipe = $form->radio("_", "Tipe", "R", true, false, ["R"=>"Rekap","D"=>"Detail"]);
|
||||||
|
$tcab = $form->option_db("_", "CabID", $this->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);
|
||||||
|
$ajson['html'] = '
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="Tipe">Tipe Laporan</label>
|
||||||
|
<div class="col">'.$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>';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,211 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Report/Ppob/MarginController
|
||||||
|
Description : Laporan Margin Penjualan PPOB
|
||||||
|
Created By : Siau Pheng (siaupheng@3fonia.com).
|
||||||
|
Created Date : April 12th, 2011.
|
||||||
|
Last Modified : October 8th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Report\Ppob;
|
||||||
|
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use flight\Session;
|
||||||
|
use Webapp\Data\Xlsx;
|
||||||
|
use Webapp\Printer\PrintHTML;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
|
||||||
|
class MarginController {
|
||||||
|
|
||||||
|
private int $id_cab;
|
||||||
|
private string $reg_name;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->id_cab = Param::Int("CabID", 0);
|
||||||
|
$this->reg_name = $session->get('WEB_APP')['REG_NAME'];
|
||||||
|
}
|
||||||
|
|
||||||
|
private function prepare() {
|
||||||
|
$apre = [
|
||||||
|
'tipe' => Param::Get("Tipe", "R"), // R or D
|
||||||
|
'tgl_from' => Param::Get("Tgl_From"),
|
||||||
|
'tgl_to' => Param::Get("Tgl_To"),
|
||||||
|
];
|
||||||
|
|
||||||
|
// generate report header
|
||||||
|
$apre['periode'] = $apre['tgl_from'] . ($apre['tgl_from'] !== $apre['tgl_to'] ? ' s/d '.$apre['tgl_to'] : '');
|
||||||
|
|
||||||
|
$tsql = ''; $asql = [tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to'])];
|
||||||
|
if ($this->id_cab > 0) {
|
||||||
|
$tsql .= " AND CabID=?";
|
||||||
|
array_push($asql, $this->id_cab);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($apre['tipe'] === "R") {
|
||||||
|
$apre['query'] = $this->db->runQuery("SELECT P.Nama_Produk,J.*,(J.Total_Jual-J.Total_Beli) Total_Margin,O.OpeID,O.N_Ope FROM (SELECT ProdukID,SUM(Harga_Beli) Total_Beli,SUM(Harga_Jual) Total_Jual,COUNT(*) Qty FROM ppob_tx WHERE (Tgl_TX BETWEEN ? AND ?)".$tsql." GROUP BY ProdukID) J LEFT JOIN ppob_produk P ON (J.ProdukID=P.ProdukID) LEFT JOIN ppob_operator O ON (P.OpeID=O.OpeID) ORDER BY P.Nama_Produk", $asql);
|
||||||
|
} else {
|
||||||
|
$apre['query'] = $this->db->runQuery("SELECT J.*,(J.Harga_Jual-J.Harga_Beli) Harga_Margin,P.Kode,P.Nama_Produk FROM (SELECT * FROM ppob_tx WHERE (Tgl_TX BETWEEN ? AND ?)".$tsql.") J LEFT JOIN ppob_produk P ON (J.ProdukID=P.ProdukID) ORDER BY J.No_TX", $asql);
|
||||||
|
}
|
||||||
|
return $apre;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function print() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
|
||||||
|
$pre = new PrintHTML($this->app);
|
||||||
|
$pre->add_title([strtoupper($this->reg_name), ($apre['tipe']==="R"?"REKAP":"DETAIL")." MARGIN PENJUALAN PRABAYAR PPOB", "Periode : ".$apre['periode']]);
|
||||||
|
|
||||||
|
if ($apre['tipe'] === "R") {
|
||||||
|
$pre->add_field("No.",10,"C");
|
||||||
|
$pre->add_field("Nama Produk",50,"L");
|
||||||
|
$pre->add_field("Qty",20,"R","rupiah");
|
||||||
|
$pre->add_field("Total HPP",20,"R","rupiah");
|
||||||
|
$pre->add_field("Total Jual",20,"R","rupiah");
|
||||||
|
$pre->add_field("Total Margin",20,"R","rupiah");
|
||||||
|
|
||||||
|
$pre->show_titles();
|
||||||
|
$pre->show_headers();
|
||||||
|
|
||||||
|
$tot_hpp = 0; $tot_jual = 0; $tot_margin = 0; $tot_qty = 0; $nomor = 0; $id_ope = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
if ($id_ope <> $row['OpeID']) {
|
||||||
|
$pre->add_span([$row['N_Ope'],6,"L,B"]);
|
||||||
|
$id_ope = $row['OpeID'];
|
||||||
|
}
|
||||||
|
$tot_hpp += $row['Total_Beli'];
|
||||||
|
$tot_jual += $row['Total_Jual'];
|
||||||
|
$tot_margin += $row['Total_Margin'];
|
||||||
|
$tot_qty += $row['Qty'];
|
||||||
|
$pre->add_row([ ++$nomor, $row['Nama_Produk'], $row['Qty'], $row['Total_Beli'], $row['Total_Jual'], $row['Total_Margin'] ]);
|
||||||
|
}
|
||||||
|
$pre->add_span([ ["GRAND TOTAL",2,"R,B"],[$tot_qty,1,"R,B","rupiah"],[$tot_hpp,1,"R,B","rupiah"],[$tot_jual,1,"R,B","rupiah"],[$tot_margin,1,"R,B","rupiah"] ]);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
$pre->add_field("No. Nota",30,"C");
|
||||||
|
$pre->add_field("Tgl. Nota",30,"C", "tgl_sql2str");
|
||||||
|
$pre->add_field("Kode",10,"L");
|
||||||
|
$pre->add_field("Nama Produk",50,"L");
|
||||||
|
$pre->add_field("No. Tujuan",20,"L");
|
||||||
|
$pre->add_field("Total HPP",30,"R","rupiah");
|
||||||
|
$pre->add_field("Total Jual",30,"R","rupiah");
|
||||||
|
$pre->add_field("Total Margin",30,"R","rupiah");
|
||||||
|
|
||||||
|
$pre->show_titles();
|
||||||
|
$pre->show_headers();
|
||||||
|
|
||||||
|
$tot_hpp = 0; $tot_jual = 0; $tot_margin = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_hpp += $row['Harga_Beli'];
|
||||||
|
$tot_jual += $row['Harga_Jual'];
|
||||||
|
$tot_margin += $row['Harga_Margin'];
|
||||||
|
$pre->add_row([ $row['No_TX'], $row['Tgl_TX'], $row['Kode'], $row['Nama_Produk'], $row['Tujuan'], $row['Harga_Beli'], $row['Harga_Jual'], $row['Harga_Margin'] ]);
|
||||||
|
}
|
||||||
|
$pre->add_span([ ["GRAND TOTAL",5,"R,B"],[$tot_hpp,1,"R,B","rupiah"],[$tot_jual,1,"R,B","rupiah"],[$tot_margin,1,"R,B","rupiah"] ]);
|
||||||
|
}
|
||||||
|
$pre->add_stamp(1, true);
|
||||||
|
$pre->show();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function excel() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
$xls = new Xlsx($this->app);
|
||||||
|
$xls->set_meta([
|
||||||
|
'title' => "Data Margin Penjualan Prabayar PPOB",
|
||||||
|
'desc' => "Export Data Margin Penjualan Prabayar PPOB Periode : ".$apre['periode'],
|
||||||
|
]);
|
||||||
|
$xls->add_title([ $this->reg_name, "DATA ".($apre['tipe']==="R"?"REKAP":"DETAIL")." MARGIN PENJUALAN PRABAYAR PPOB", "Periode : ".$apre['periode'] ]);
|
||||||
|
|
||||||
|
if ($apre['tipe'] === "R") {
|
||||||
|
$xls->add_field("No.", 5, "@integer");
|
||||||
|
$xls->add_field("Nama Produk", 25, "@text");
|
||||||
|
$xls->add_field("Qty", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Total HPP", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Total Jual", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Total Margin", 15, "#,##0.00");
|
||||||
|
$xls->add_sheet("".str_replace("s/d","-",$apre['periode']));
|
||||||
|
|
||||||
|
$xls->show_titles();
|
||||||
|
$xls->show_headers();
|
||||||
|
|
||||||
|
$tot_hpp = 0; $tot_jual = 0; $tot_margin = 0; $tot_qty = 0; $nomor = 0; $id_ope = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
if ($id_ope <> $row['OpeID']) {
|
||||||
|
$xls->add_row_bold([ $row['N_Ope'] ]);
|
||||||
|
$id_ope = $row['OpeID'];
|
||||||
|
}
|
||||||
|
$tot_hpp += $row['Harga_Beli'];
|
||||||
|
$tot_jual += $row['Harga_Jual'];
|
||||||
|
$tot_margin += $row['Harga_Margin'];
|
||||||
|
$tot_qty += $row['Qty'];
|
||||||
|
$xls->add_row([ ++$nomor, $row['Nama_Produk'], $row['Qty'], $row['Harga_Beli'], $row['Harga_Jual'], $row['Harga_Margin'] ]);
|
||||||
|
}
|
||||||
|
$xls->add_row_bold([ "", "GRAND TOTAL", $tot_qty, $tot_hpp, $tot_jual, $tot_margin ]);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
$xls->add_field("No. Nota", 15, "@");
|
||||||
|
$xls->add_field("Tgl. Nota", 12, "@date");
|
||||||
|
$xls->add_field("Kode", 8, "@text");
|
||||||
|
$xls->add_field("Nama Produk", 20, "@text");
|
||||||
|
$xls->add_field("No. Tujuan", 15, "@text");
|
||||||
|
$xls->add_field("Total HPP", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Total Jual", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Total Margin", 15, "#,##0.00");
|
||||||
|
$xls->add_sheet("".str_replace("s/d","-",$apre['periode']));
|
||||||
|
|
||||||
|
$xls->show_titles();
|
||||||
|
$xls->show_headers();
|
||||||
|
|
||||||
|
$tot_hpp = 0; $tot_jual = 0; $tot_margin = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_hpp += $row['Harga_Beli'];
|
||||||
|
$tot_jual += $row['Harga_Jual'];
|
||||||
|
$tot_margin += $row['Harga_Margin'];
|
||||||
|
$xls->add_row([ $row['No_TX'], $row['Tgl_TX'], $row['Kode'], $row['Nama_Produk'], $row['Tujuan'], $row['Harga_Beli'], $row['Harga_Jual'], $row['Harga_Margin'] ]);
|
||||||
|
}
|
||||||
|
$xls->add_row_bold([ "", "", "", "GRAND TOTAL", "", $tot_hpp, $tot_jual, $tot_margin ]);
|
||||||
|
}
|
||||||
|
$xls->add_stamp(1, true);
|
||||||
|
$xls->download("Data Margin Penjualan Prabayar PPOB ".str_replace("s/d","-",$apre['periode']).".xlsx");
|
||||||
|
unset($xls);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$ttipe = $form->radio("_", "Tipe", "R", true, false, ["R"=>"Rekap","D"=>"Detail"]);
|
||||||
|
$tcab = $form->option_db("_", "CabID", $this->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);
|
||||||
|
$ajson['html'] = '
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="Tipe">Tipe Laporan</label>
|
||||||
|
<div class="col">'.$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>';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,190 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Report/Rekap/MarginController
|
||||||
|
Description : Laporan Rekap Margin Harian
|
||||||
|
Created By : Siau Pheng (siaupheng@3fonia.com).
|
||||||
|
Created Date : January 19th, 2013.
|
||||||
|
Last Modified : October 10th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Report\Rekap;
|
||||||
|
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use flight\Session;
|
||||||
|
use Webapp\Data\Xlsx;
|
||||||
|
use Webapp\Printer\PrintHTML;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
|
||||||
|
class MarginController {
|
||||||
|
|
||||||
|
private int $id_cab;
|
||||||
|
private string $reg_name;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->id_cab = Param::Int("CabID", 0);
|
||||||
|
$this->reg_name = $session->get('WEB_APP')['REG_NAME'];
|
||||||
|
}
|
||||||
|
|
||||||
|
private function prepare() {
|
||||||
|
$apre = [
|
||||||
|
'tgl_from' => Param::Get("Tgl_From"),
|
||||||
|
'tgl_to' => Param::Get("Tgl_To"),
|
||||||
|
];
|
||||||
|
|
||||||
|
// generate report header
|
||||||
|
$apre['periode'] = $apre['tgl_from'] . ($apre['tgl_from'] !== $apre['tgl_to'] ? ' s/d '.$apre['tgl_to'] : '');
|
||||||
|
|
||||||
|
$tsql = ''; $asql = [];
|
||||||
|
if ($this->id_cab > 0) {
|
||||||
|
$tsql .= " AND CabID=?";
|
||||||
|
array_push($asql, $this->id_cab);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->db->delete("rep_rekap_margin", "UserID=?", [$this->app->user()->id()]);
|
||||||
|
// insert jual dan terima pos
|
||||||
|
$this->db->runQuery("INSERT INTO rep_rekap_margin (Tanggal,Jual,Masuk,UserID) SELECT Tgl_Jual,SUM(Total_Jual-Total_Diskon) Jual, SUM(IF(POS=1,Total_Jual-Total_Diskon,0)) Masuk,? FROM inv_jual WHERE (Tgl_Jual BETWEEN ? AND ?)".$tsql." GROUP BY Tgl_Jual", array_merge([$this->app->user()->id(), tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to'])], $asql));
|
||||||
|
// insert tgl sesuai range
|
||||||
|
$dtgl = $apre['tgl_from'];
|
||||||
|
while ($dtgl <= $apre['tgl_to']) {
|
||||||
|
$this->db->runQuery("INSERT IGNORE INTO rep_rekap_margin (Tanggal,UserID) VALUES (?,?)", [tgl_sql2str($dtgl), $this->app->user()->id()]);
|
||||||
|
$dtgl = tgl_operasi($dtgl, 1);
|
||||||
|
}
|
||||||
|
// insert beli
|
||||||
|
$arow = $this->db->fetchAll("SELECT Tgl_Beli, SUM(Real_Beli) Beli FROM inv_beli WHERE (Tgl_Beli BETWEEN ? AND ?)".$tsql." GROUP BY Tgl_Beli", array_merge([tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to'])], $asql));
|
||||||
|
foreach ($arow as $row) {
|
||||||
|
$this->db->runQuery("UPDATE rep_rekap_margin SET Beli=? WHERE Tanggal=? AND UserID=?", [$row['Beli'], $row['Tgl_Beli'], $this->app->user()->id()]);
|
||||||
|
}
|
||||||
|
// insert keluar / lunas beli
|
||||||
|
$arow = $this->db->fetchAll("SELECT Tgl_Bayar, SUM(Total_Bayar-Total_Potong) Keluar FROM inv_beli_lunas WHERE (Tgl_Bayar BETWEEN ? AND ?)".$tsql." GROUP BY Tgl_Bayar", array_merge([tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to'])], $asql));
|
||||||
|
foreach ($arow as $row) {
|
||||||
|
$this->db->runQuery("UPDATE rep_rekap_margin SET Keluar=? WHERE Tanggal=? AND UserID=?", [$row['Keluar'], $row['Tgl_Bayar'], $this->app->user()->id()]);
|
||||||
|
}
|
||||||
|
// insert modal
|
||||||
|
$arow = $this->db->fetchAll("SELECT Tgl_Ref, SUM(-Qty*Harga_Beli) Modal FROM inv_detail WHERE (Tgl_Ref BETWEEN ? AND ?) AND NotaID IN (5,6)".$tsql." GROUP BY Tgl_Ref", array_merge([tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to'])], $asql));
|
||||||
|
foreach ($arow as $row) {
|
||||||
|
$this->db->runQuery("UPDATE rep_rekap_margin SET Modal=? WHERE Tanggal=? AND UserID=?", [$row['Modal'], $row['Tgl_Ref'], $this->app->user()->id()]);
|
||||||
|
}
|
||||||
|
// update margin dan persen
|
||||||
|
$this->db->runQuery("UPDATE rep_rekap_margin SET Margin=Jual-Modal,Persen=(Margin/Jual)*100 WHERE UserID=?", [$this->app->user()->id()]);
|
||||||
|
$apre['query'] = $this->db->runQuery("SELECT * FROM rep_rekap_margin WHERE UserID=? ORDER BY Tanggal ASC", [$this->app->user()->id()]);
|
||||||
|
return $apre;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function print() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
|
||||||
|
$pre = new PrintHTML($this->app);
|
||||||
|
$pre->add_title([strtoupper($this->reg_name), "REKAP MARGIN HARIAN", "Periode : ".$apre['periode']]);
|
||||||
|
|
||||||
|
$pre->add_field("Hari",10,"C");
|
||||||
|
$pre->add_field("Tanggal",20,"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");
|
||||||
|
|
||||||
|
$pre->show_titles();
|
||||||
|
$pre->show_headers();
|
||||||
|
|
||||||
|
$item = 0; $tot_j = 0; $tot_b = 0; $tot_p = 0; $tot_m = 0; $tot_k = 0; $tot_mar = 0; $tot_psn = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$item++;
|
||||||
|
$tot_j += $row['Jual'];
|
||||||
|
$tot_b += $row['Beli'];
|
||||||
|
$tot_m += $row['Masuk'];
|
||||||
|
$tot_k += $row['Keluar'];
|
||||||
|
$tot_p += $row['Modal'];
|
||||||
|
$tot_mar += $row['Margin'];
|
||||||
|
$pre->add_row([ tgl_hari(tgl_sql2str($row['Tanggal'])), $row['Tanggal'], $row['Jual'], $row['Beli'], $row['Modal'], $row['Masuk'], $row['Keluar'], $row['Margin'], $row['Persen'] ]);
|
||||||
|
}
|
||||||
|
if ($item > 0 && $tot_j > 0) {
|
||||||
|
$pre->add_span([ ["JUMLAH",2,"R,B"],[$tot_j,1,"R,B","rupiah"],[$tot_b,1,"R,B","rupiah"],[$tot_p,1,"R,B","rupiah"],[$tot_m,1,"R,B","rupiah"],[$tot_k,1,"R,B","rupiah"],[$tot_mar,1,"R,B","rupiah"],[($tot_j===0?0:($tot_mar/$tot_j)*100),1,"R,B","rupiah2"] ]);
|
||||||
|
$pre->add_span([ ["RATA-RATA",2,"R,B"],[$tot_j/$item,1,"R,B","rupiah"],[$tot_b/$item,1,"R,B","rupiah"],[$tot_p/$item,1,"R,B","rupiah"],[$tot_m/$item,1,"R,B","rupiah"],[$tot_k/$item,1,"R,B","rupiah"],[$tot_mar/$item,1,"R,B","rupiah"],[($tot_mar/$tot_j)*100/$item,1,"R,B","rupiah2"] ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$pre->add_stamp(1, true);
|
||||||
|
$pre->show();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function excel() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
$xls = new Xlsx($this->app);
|
||||||
|
$xls->set_meta([
|
||||||
|
'title' => "Data Rekap Margin Harian",
|
||||||
|
'desc' => "Export Data Rekap Margin Harian"
|
||||||
|
]);
|
||||||
|
$xls->add_title([ $this->reg_name, "DATA REKAP MARGIN HARIAN", "Periode : ".$apre['periode'] ]);
|
||||||
|
|
||||||
|
$xls->add_field("Hari", 15, "@");
|
||||||
|
$xls->add_field("Tanggal", 12, "@date");
|
||||||
|
$xls->add_field("Penjualan", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Pembelian", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Modal", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Penerimaan", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Pengeluaran", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Margin", 15, "#,##0.00");
|
||||||
|
$xls->add_field("%", 15, "#,##0.00");
|
||||||
|
$xls->add_sheet("".str_replace("s/d","-",$apre['periode']));
|
||||||
|
|
||||||
|
$xls->show_titles();
|
||||||
|
$xls->show_headers();
|
||||||
|
|
||||||
|
$item = 0; $tot_j = 0; $tot_b = 0; $tot_p = 0; $tot_m = 0; $tot_k = 0; $tot_mar = 0; $tot_psn = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$item++;
|
||||||
|
$tot_j += $row['Jual'];
|
||||||
|
$tot_b += $row['Beli'];
|
||||||
|
$tot_m += $row['Masuk'];
|
||||||
|
$tot_k += $row['Keluar'];
|
||||||
|
$tot_p += $row['Modal'];
|
||||||
|
$tot_mar += $row['Margin'];
|
||||||
|
$xls->add_row([ tgl_hari(tgl_sql2str($row['Tanggal'])), $row['Tanggal'], $row['Jual'], $row['Beli'], $row['Modal'], $row['Masuk'], $row['Keluar'], $row['Margin'], $row['Persen'] ]);
|
||||||
|
}
|
||||||
|
if ($item > 0 && $tot_j > 0) {
|
||||||
|
$xls->add_row_bold([ "", "JUMLAH", $tot_j, $tot_b, $tot_p, $tot_m, $tot_k, $tot_mar, ($tot_j===0?0:($tot_mar/$tot_j)*100) ]);
|
||||||
|
$xls->add_row_bold([ "", "RATA-RATA", $tot_j/$item, $tot_b/$item, $tot_p/$item, $tot_m/$item, $tot_k/$item, $tot_mar/$item, ($tot_mar/$tot_j)*100/$item ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$xls->add_stamp(1, true);
|
||||||
|
$xls->download("Data Rekap Margin Harian ".str_replace("s/d","-",$apre['periode']).".xlsx");
|
||||||
|
unset($xls);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tcab = $form->option_db("_", "CabID", $this->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);
|
||||||
|
$ajson['html'] = '
|
||||||
|
<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>';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,143 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Report/Rekap/ModalController
|
||||||
|
Description : Laporan Rekap Modal Harian
|
||||||
|
Created By : Siau Pheng (siaupheng@3fonia.com).
|
||||||
|
Created Date : January 19th, 2013.
|
||||||
|
Last Modified : October 10th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Report\Rekap;
|
||||||
|
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use flight\Session;
|
||||||
|
use Webapp\Data\Xlsx;
|
||||||
|
use Webapp\Printer\PrintHTML;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
|
||||||
|
class ModalController {
|
||||||
|
|
||||||
|
private int $id_cab;
|
||||||
|
private string $reg_name;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->id_cab = Param::Int("CabID", 0);
|
||||||
|
$this->reg_name = $session->get('WEB_APP')['REG_NAME'];
|
||||||
|
}
|
||||||
|
|
||||||
|
private function prepare() {
|
||||||
|
$apre = [
|
||||||
|
'tgl_from' => Param::Get("Tgl_From"),
|
||||||
|
'tgl_to' => Param::Get("Tgl_To"),
|
||||||
|
];
|
||||||
|
|
||||||
|
// generate report header
|
||||||
|
$apre['periode'] = $apre['tgl_from'] . ($apre['tgl_from'] !== $apre['tgl_to'] ? ' s/d '.$apre['tgl_to'] : '');
|
||||||
|
|
||||||
|
$tsql = ''; $asql = [];
|
||||||
|
if ($this->id_cab > 0) {
|
||||||
|
$tsql .= " AND CabID=?";
|
||||||
|
array_push($asql, $this->id_cab);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->db->delete("rep_rekap_modal", "UserID=?", [$this->app->user()->id()]);
|
||||||
|
$dtgl = $apre['tgl_from'];
|
||||||
|
while ($dtgl <= $apre['tgl_to']) {
|
||||||
|
$stok = $this->db->fetchField("SELECT SUM(D.Stok*P.Harga_Pokok) Stok FROM (SELECT * FROM inv_detail WHERE Tgl_Ref<=?".$tsql.") D LEFT JOIN inv_produk P ON (P.InvID=D.InvID)", array_merge([tgl_sql2str($dtgl)], $asql)) ?? 0;
|
||||||
|
$piutang = $this->db->fetchField("SELECT SUM(Total_Jual-Total_Diskon-Total_Bayar-Total_Potong) Piutang FROM inv_jual WHERE Tgl_Jual<=? AND Tgl_Lunas>?".$tsql, array_merge([tgl_sql2str($dtgl), tgl_sql2str($dtgl)], $asql)) ?? 0;
|
||||||
|
$hutang = $this->db->fetchField("SELECT SUM(Real_Beli) Hutang FROM inv_beli WHERE Tgl_Beli<=? AND (Lunas=0 OR (Lunas=1 AND Tgl_Lunas>?))".$tsql, array_merge([tgl_sql2str($dtgl), tgl_sql2str($dtgl)], $asql)) ?? 0;
|
||||||
|
$this->db->runQuery("INSERT IGNORE INTO rep_rekap_modal (Tanggal,Stok,Piutang,Hutang,Jumlah,UserID) VALUES (?,?,?,?,?,?)", [tgl_sql2str($dtgl), $stok, $piutang, $hutang, $stok + $piutang - $hutang, $this->app->user()->id()]);
|
||||||
|
$dtgl = tgl_operasi($dtgl, 1);
|
||||||
|
}
|
||||||
|
$apre['query'] = $this->db->runQuery("SELECT * FROM rep_rekap_modal WHERE UserID=? ORDER BY Tanggal ASC", [$this->app->user()->id()]);
|
||||||
|
return $apre;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function print() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
|
||||||
|
$pre = new PrintHTML($this->app);
|
||||||
|
$pre->add_title([strtoupper($this->reg_name), "REKAP MODAL HARIAN", "Periode : ".$apre['periode']]);
|
||||||
|
|
||||||
|
$pre->add_field("Hari",10,"C");
|
||||||
|
$pre->add_field("Tanggal",20,"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");
|
||||||
|
|
||||||
|
$pre->show_titles();
|
||||||
|
$pre->show_headers();
|
||||||
|
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$pre->add_row([ tgl_hari(tgl_sql2str($row['Tanggal'])), $row['Tanggal'], $row['Stok'], $row['Piutang'], $row['Hutang'], $row['Jumlah'] ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$pre->add_stamp(1, true);
|
||||||
|
$pre->show();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function excel() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
$xls = new Xlsx($this->app);
|
||||||
|
$xls->set_meta([
|
||||||
|
'title' => "Data Rekap Modal Harian",
|
||||||
|
'desc' => "Export Data Rekap Modal Harian"
|
||||||
|
]);
|
||||||
|
$xls->add_title([ $this->reg_name, "DATA REKAP MODAL HARIAN", "Periode : ".$apre['periode'] ]);
|
||||||
|
|
||||||
|
$xls->add_field("Hari", 15, "@");
|
||||||
|
$xls->add_field("Tanggal", 12, "@date");
|
||||||
|
$xls->add_field("Stok Barang", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Piutang", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Hutang", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Jumlah", 15, "#,##0.00");
|
||||||
|
$xls->add_sheet("".str_replace("s/d","-",$apre['periode']));
|
||||||
|
|
||||||
|
$xls->show_titles();
|
||||||
|
$xls->show_headers();
|
||||||
|
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$xls->add_row([ tgl_hari(tgl_sql2str($row['Tanggal'])), $row['Tanggal'], $row['Stok'], $row['Piutang'], $row['Hutang'], $row['Jumlah'] ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$xls->add_stamp(1, true);
|
||||||
|
$xls->download("Data Rekap Modal Harian ".str_replace("s/d","-",$apre['periode']).".xlsx");
|
||||||
|
unset($xls);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tcab = $form->option_db("_", "CabID", $this->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);
|
||||||
|
$ajson['html'] = '
|
||||||
|
<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>';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,229 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Report/Stok/AkhirController
|
||||||
|
Description : Laporan Stok Akhir Barang
|
||||||
|
Created By : Siau Pheng (siaupheng@3fonia.com).
|
||||||
|
Created Date : January 24th, 2011.
|
||||||
|
Last Modified : October 13th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Report\Stok;
|
||||||
|
|
||||||
|
use App\Utils\Invesa;
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use flight\Session;
|
||||||
|
use Webapp\Data\Xlsx;
|
||||||
|
use Webapp\Printer\PrintHTML;
|
||||||
|
use Webapp\Printer\PrintPOS;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
|
||||||
|
class AkhirController {
|
||||||
|
|
||||||
|
private array $app_inv;
|
||||||
|
private int $id_cab;
|
||||||
|
private string $reg_name;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->app_inv = (array) $session->get('APP_INV');
|
||||||
|
$this->id_cab = Param::Int("CabID", 0);
|
||||||
|
$this->reg_name = $session->get('WEB_APP')['REG_NAME'];
|
||||||
|
}
|
||||||
|
|
||||||
|
private function prepare() {
|
||||||
|
$apre = [
|
||||||
|
'id_sup' => Param::Int("SupID", 0),
|
||||||
|
'id_grup_inv' => Param::Int("Grup_InvID", 0),
|
||||||
|
'ppn' => Param::Int("PPN", 9),
|
||||||
|
'tgl' => Param::Get("Tanggal"),
|
||||||
|
'urut' => Param::Get("Urut", "B"),
|
||||||
|
'min' => Param::Get("Min_Stok", "N"),
|
||||||
|
'qty' => Param::Int("Min_Qty", 0),
|
||||||
|
];
|
||||||
|
|
||||||
|
$apre['nama_sup'] = ($apre['id_sup'] > 0) ? ($this->db->fetchField("SELECT CONCAT(Nama_Sup,' (',Kode_Sup,')') Nama FROM para_supplier WHERE SupID=?", [$apre['id_sup']]) ?? '') : '';
|
||||||
|
$apre['nama_grup_inv'] = ($apre['id_grup_inv'] > 0 && $apre['id_sup']===0) ? ($this->db->fetchField("SELECT Nama_Grup FROM inv_produk_grup WHERE Grup_InvID=?", [$apre['id_grup_inv']]) ?? '') : '';
|
||||||
|
|
||||||
|
// generate report header
|
||||||
|
$apre['periode'] = $apre['tgl'];
|
||||||
|
|
||||||
|
$tsql1 = ''; $tsql2 = '';
|
||||||
|
$asql1 = [];
|
||||||
|
$asql2 = [];
|
||||||
|
|
||||||
|
if ($this->id_cab > 0) {
|
||||||
|
$tsql1 = " WHERE CabID=?";
|
||||||
|
array_push($asql1, $this->id_cab);
|
||||||
|
}
|
||||||
|
if ($apre['id_sup'] > 0) {
|
||||||
|
$tsql2 .= " AND D.InvID IN (SELECT InvID FROM inv_produk_sup WHERE SupID=?)";
|
||||||
|
array_push($asql2, $apre['id_sup']);
|
||||||
|
}
|
||||||
|
if ($apre['id_grup_inv'] > 0) {
|
||||||
|
$tsql2 .= " AND P.Grup_InvID=?";
|
||||||
|
array_push($asql2, $apre['id_grup_inv']);
|
||||||
|
}
|
||||||
|
if ($apre['ppn'] !== 9) {
|
||||||
|
$tsql2 .= " AND P.PPN=?";
|
||||||
|
array_push($asql2, $apre['ppn']);
|
||||||
|
}
|
||||||
|
if ($apre['min'] !== 'N') {
|
||||||
|
$tsql2 .= " AND D.Stok<=?";
|
||||||
|
array_push($asql2, $apre['qty']);
|
||||||
|
}
|
||||||
|
$torder = ($apre['urut'] === "B") ? "P.Nama_Produk" : "Total";
|
||||||
|
|
||||||
|
$apre['query'] = $this->db->runQuery("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_stok".$tsql1." GROUP BY InvID) D LEFT JOIN vi_inv_produk2 P ON (P.InvID=D.InvID) WHERE (NOT (D.Stok=0 AND P.Aktif=0)) AND (P.InvID IS NOT NULL)".$tsql2." ORDER BY ".$torder, array_merge($asql1, $asql2));
|
||||||
|
return $apre;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function pos() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
|
||||||
|
$pre = new PrintPOS($this->app);
|
||||||
|
$pre->set_fontsize(2);//thermal
|
||||||
|
$pre->set_header_logo("logo-nota.png");//thermal
|
||||||
|
if ($this->app_inv['PRINT_AUTOCUT'] === 1) $pre->set_cutpaper();
|
||||||
|
$pre->add_empty();
|
||||||
|
|
||||||
|
$pre->addc("STOK AKHIR BARANG");
|
||||||
|
$pre->addc("Periode : ".$apre['periode']);
|
||||||
|
$pre->add_line("-");
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$stok = Invesa::Format_Stok(($row['Jumlah'] ?? 0), ($row['Kali'] ?? 1), ($row['Satuan_Normal'] ?? ''), ($row['Satuan_Stok'] ?? ''));
|
||||||
|
$pre->add([$row['Nama_Produk'],39-strlen($stok),"L"], [" ",1,"L"], [$stok,strlen($stok),"L"]);
|
||||||
|
}
|
||||||
|
$pre->add_line("-");
|
||||||
|
$pre->add_stamp(1, false);
|
||||||
|
$pre->add_empty($this->app_inv['PRINT_ROW']);
|
||||||
|
$pre->show();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function print() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
|
||||||
|
$pre = new PrintHTML($this->app);
|
||||||
|
$pre->add_title([strtoupper($this->reg_name), "STOK AKHIR BARANG", "Periode : ".$apre['periode']]);
|
||||||
|
|
||||||
|
$pre->add_field("No.",10,"C");
|
||||||
|
$pre->add_field("Nama Barang",50,"L");
|
||||||
|
$pre->add_field("Stok",20,"R");
|
||||||
|
if ($this->app->user()->is_level(2)) {
|
||||||
|
$pre->add_field("Harga",20,"R","rupiah");
|
||||||
|
$pre->add_field("Total",20,"R","rupiah");
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($apre['id_sup'] > 0) $pre->add_sub_title("Nama Supplier : ".$apre['nama_sup']);
|
||||||
|
if ($apre['id_grup_inv'] > 0) $pre->add_sub_title("Grup Barang : ".$apre['nama_grup_inv']);
|
||||||
|
|
||||||
|
$pre->show_titles();
|
||||||
|
$pre->show_headers();
|
||||||
|
|
||||||
|
$nomor = 0; $tot_stok = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_stok += $row['Total'];
|
||||||
|
$_row = [ ++$nomor, $row['Nama_Produk'], Invesa::Format_Stok(($row['Jumlah'] ?? 0), ($row['Kali'] ?? 1), ($row['Satuan_Normal'] ?? ''), ($row['Satuan_Stok'] ?? '')) ];
|
||||||
|
if ($this->app->user()->is_level(2)) array_push($_row, $row['Harga_Pokok'], $row['Total']);
|
||||||
|
$pre->add_row($_row);
|
||||||
|
}
|
||||||
|
if ($this->app->user()->is_level(2)) $pre->add_span([ ["GRAND TOTAL",4,"R,B"], [$tot_stok,1,"R,B","rupiah"] ]);
|
||||||
|
|
||||||
|
$pre->add_stamp(1, true);
|
||||||
|
$pre->show();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function excel() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
$xls = new Xlsx($this->app);
|
||||||
|
$xls->set_meta([
|
||||||
|
'title' => "Data Stok Akhir Barang",
|
||||||
|
'desc' => "Export Data Stok Akhir Barang"
|
||||||
|
]);
|
||||||
|
$xls->add_title([ $this->reg_name, "STOK AKHIR BARANG", "Periode : ".$apre['periode'] ]);
|
||||||
|
|
||||||
|
$xls->add_field("No.", 10, "@integer");
|
||||||
|
$xls->add_field("Nama Barang", 35, "@text");
|
||||||
|
$xls->add_field("Stok", 15, "@");
|
||||||
|
if ($this->app->user()->is_level(2)) {
|
||||||
|
$xls->add_field("Harga", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Total", 15, "#,##0.00");
|
||||||
|
}
|
||||||
|
$xls->add_sheet("".str_replace("s/d","-",$apre['periode']));
|
||||||
|
|
||||||
|
if ($apre['id_sup'] > 0) $xls->add_sub_title("Nama Supplier : ".$apre['nama_sup']);
|
||||||
|
if ($apre['id_grup_inv'] > 0) $xls->add_sub_title("Grup Barang : ".$apre['nama_grup_inv']);
|
||||||
|
|
||||||
|
$xls->show_titles();
|
||||||
|
$xls->show_headers();
|
||||||
|
|
||||||
|
$nomor = 0; $tot_stok = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_stok += $row['Total'];
|
||||||
|
$_row = [ ++$nomor, $row['Nama_Produk'], Invesa::Format_Stok(($row['Jumlah'] ?? 0), ($row['Kali'] ?? 1), ($row['Satuan_Normal'] ?? ''), ($row['Satuan_Stok'] ?? '')) ];
|
||||||
|
if ($this->app->user()->is_level(2)) array_push($_row, $row['Harga_Pokok'], $row['Total']);
|
||||||
|
$xls->add_row($_row);
|
||||||
|
}
|
||||||
|
if ($this->app->user()->is_level(2)) $xls->add_row_bold([ "", "GRAND TOTAL", "", "", $tot_stok ]);
|
||||||
|
|
||||||
|
$xls->add_stamp(1, true);
|
||||||
|
$xls->download("Data Stok Akhir Barang ".str_replace("s/d","-",$apre['periode']).".xlsx");
|
||||||
|
unset($xls);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tcab = $form->option_db("_", "CabID", $this->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_inv = $form->option_db("_", "Grup_InvID", 0, true, false, "inv_produk_grup", ["Grup_InvID","Nama_Grup"], "Aktif=1 ORDER BY Nama_Grup", [0,"SEMUA GRUP"]);
|
||||||
|
$tppn = $form->option("_", "PPN", 9, true, false, [9 => "SEMUA STATUS"] + Invesa::PPN_Array());
|
||||||
|
$ttgl = $form->datebox("_", "Tanggal", tgl_ymd(), false, false);
|
||||||
|
$turut = $form->radio("_", "Urut", "B", true, false, ['B'=>"Nama Barang",'J'=>"Jumlah / Nilai"]);
|
||||||
|
$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");
|
||||||
|
$ajson['html'] = '
|
||||||
|
<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_inv.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="PPN">Status PPN</label>
|
||||||
|
<div class="col">'.$tppn.'</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"><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="Urut">Urut Berdasarkan</label>
|
||||||
|
<div class="col">'.$turut.'</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">'.$tstok.'</div>
|
||||||
|
<div class="col-sm-4 col-lg-3">'.$tqty.'</div>
|
||||||
|
</div>';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,162 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Report/Stok/CabangController
|
||||||
|
Description : Laporan Stok Barang per Cabang
|
||||||
|
Created By : Siau Pheng (siaupheng@3fonia.com).
|
||||||
|
Created Date : July 16th, 2011.
|
||||||
|
Last Modified : October 13th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Report\Stok;
|
||||||
|
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use flight\Session;
|
||||||
|
use Webapp\Data\Xlsx;
|
||||||
|
use Webapp\Printer\PrintHTML;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
|
||||||
|
class CabangController {
|
||||||
|
|
||||||
|
private int $id_cab1;
|
||||||
|
private int $id_cab2;
|
||||||
|
private string $reg_name;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->id_cab1 = Param::Int("Cab1ID", 0);
|
||||||
|
$this->id_cab2 = Param::Int("Cab2ID", 0);
|
||||||
|
$this->reg_name = $session->get('WEB_APP')['REG_NAME'];
|
||||||
|
}
|
||||||
|
|
||||||
|
private function prepare() {
|
||||||
|
$apre = [
|
||||||
|
'tgl_from' => Param::Get("Tgl_From"),
|
||||||
|
'tgl_to' => Param::Get("Tgl_To"),
|
||||||
|
'cab_from' => "Semua Cabang",
|
||||||
|
'cab_to' => "Semua Cabang",
|
||||||
|
];
|
||||||
|
|
||||||
|
if ($this->id_cab1 > 0) $apre['cab_from'] = $this->db->fetchField("SELECT Nama_Cab FROM para_cabang WHERE CabID=?", [$this->id_cab1]);
|
||||||
|
if ($this->id_cab2 > 0) $apre['cab_to'] = $this->db->fetchField("SELECT Nama_Cab FROM para_cabang WHERE CabID=?", [$this->id_cab2]);
|
||||||
|
|
||||||
|
// generate report header
|
||||||
|
$apre['periode'] = $apre['tgl_from'] . ($apre['tgl_from'] !== $apre['tgl_to'] ? ' s/d '.$apre['tgl_to'] : '');
|
||||||
|
|
||||||
|
$tsql = ''; $asql = [tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to'])];
|
||||||
|
if ($this->id_cab1 > 0) {
|
||||||
|
$tsql .= " AND Dari_CabID=?";
|
||||||
|
array_push($asql, $this->id_cab1);
|
||||||
|
}
|
||||||
|
if ($this->id_cab2 > 0) {
|
||||||
|
$tsql .= " AND Ke_CabID=?";
|
||||||
|
array_push($asql, $this->id_cab2);
|
||||||
|
}
|
||||||
|
|
||||||
|
$apre['query'] = $this->db->runQuery("SELECT M.*,C1.Nama_Cab Nama1,C2.Nama_Cab Nama2 FROM (SELECT * FROM inv_mutasi WHERE (Tgl_Mutasi BETWEEN ? AND ?)".$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", $asql);
|
||||||
|
return $apre;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function print() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
|
||||||
|
$pre = new PrintHTML($this->app);
|
||||||
|
$pre->add_title([strtoupper($this->reg_name), "MUTASI STOK CABANG", "Periode : ".$apre['periode']]);
|
||||||
|
|
||||||
|
$pre->add_field("Tanggal",30,"C", "tgl_sql2str");
|
||||||
|
$pre->add_field("No. Mutasi",30,"L");
|
||||||
|
$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");
|
||||||
|
|
||||||
|
$pre->add_sub_title("Cari Cabang : ".$apre['cab_from']);
|
||||||
|
$pre->add_sub_title("Ke Cabang : ".$apre['cab_to']);
|
||||||
|
|
||||||
|
$pre->show_titles();
|
||||||
|
$pre->show_headers();
|
||||||
|
|
||||||
|
$tot_m = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_m += $row['Total_Mutasi'];
|
||||||
|
$pre->add_row([ $row['Tgl_Mutasi'], $row['No_Mutasi'], $row['Nama1'], $row['Nama2'], $row['Total_Mutasi'], $row['Catatan'] ]);
|
||||||
|
}
|
||||||
|
$pre->add_span([ ["GRAND TOTAL",4,"R,B"],[$tot_m,1,"R,B","rupiah"],["",1,"L,B"] ]);
|
||||||
|
|
||||||
|
$pre->add_stamp(1, true);
|
||||||
|
$pre->show();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function excel() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
$xls = new Xlsx($this->app);
|
||||||
|
$xls->set_meta([
|
||||||
|
'title' => "Data Mutasi Stok Cabang",
|
||||||
|
'desc' => "Export Data Mutasi Stok Cabang"
|
||||||
|
]);
|
||||||
|
$xls->add_title([ $this->reg_name, "DATA MUTASI STOK CABANG", "Periode : ".$apre['periode'] ]);
|
||||||
|
|
||||||
|
$xls->add_field("Tanggal", 12, "@date");
|
||||||
|
$xls->add_field("No. Mutasi", 15, "@text");
|
||||||
|
$xls->add_field("Dari Cabang", 10, "@text");
|
||||||
|
$xls->add_field("Ke Cabang", 10, "@text");
|
||||||
|
$xls->add_field("Total", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Catatan", 30, "@text");
|
||||||
|
$xls->add_sheet("".str_replace("s/d","-",$apre['periode']));
|
||||||
|
|
||||||
|
$xls->add_sub_title("Dari Cabang : ".$apre['cab_from']);
|
||||||
|
$xls->add_sub_title("Ke Cabang : ".$apre['cab_to']);
|
||||||
|
|
||||||
|
$xls->show_titles();
|
||||||
|
$xls->show_headers();
|
||||||
|
|
||||||
|
$tot_m = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_m += $row['Total_Mutasi'];
|
||||||
|
$xls->add_row([ $row['Tgl_Mutasi'], $row['No_Mutasi'], $row['Nama1'], $row['Nama2'], $row['Total_Mutasi'], $row['Catatan'] ]);
|
||||||
|
}
|
||||||
|
$xls->add_row_bold([ "", "", "Stok Akhir", "", $tot_m, "" ]);
|
||||||
|
|
||||||
|
$xls->add_stamp(1, true);
|
||||||
|
$xls->download("Data Mutasi Stok Cabang ".str_replace("s/d","-",$apre['periode']).".xlsx");
|
||||||
|
unset($xls);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tcab1 = $form->option_db("_", "Cab1ID", $this->id_cab1, true, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID", [0,"SEMUA CABANG"]);
|
||||||
|
$tcab2 = $form->option_db("_", "Cab2ID", $this->id_cab2, 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);
|
||||||
|
$ajson['html'] = '
|
||||||
|
<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>';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,218 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Report/Stok/MutasiController
|
||||||
|
Description : Laporan Mutasi Stok Barang
|
||||||
|
Created By : Siau Pheng (siaupheng@3fonia.com).
|
||||||
|
Created Date : July 16th, 2011.
|
||||||
|
Last Modified : October 12th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Report\Stok;
|
||||||
|
|
||||||
|
use App\Utils\Invesa;
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use flight\Session;
|
||||||
|
use Webapp\Data\Xlsx;
|
||||||
|
use Webapp\Printer\PrintHTML;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
use Webapp\Web\Table;
|
||||||
|
|
||||||
|
class MutasiController {
|
||||||
|
|
||||||
|
private int $id_cab;
|
||||||
|
private string $reg_name;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->id_cab = Param::Int("CabID", 0);
|
||||||
|
$this->reg_name = $session->get('WEB_APP')['REG_NAME'];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function brow_produk() {
|
||||||
|
$tcari = Param::Get("Cari_Produk");
|
||||||
|
$tsql = ''; $asql = [1];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql .= " AND Barcode_Nama LIKE ?";
|
||||||
|
$asql[] = '%' . $tcari . '%';
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("vi_inv_produk", "*", "Aktif=?".$tsql, $asql);
|
||||||
|
$obj->add_field("InvID", "ID", "hid");
|
||||||
|
$obj->add_field("SatuanID", "ID", "hid");
|
||||||
|
$obj->add_field("VarianID", "ID", "hid");
|
||||||
|
$obj->add_field("Kode_SKU", "SKU", "c");
|
||||||
|
$obj->add_field("Kode_Barcode", "Barcode", "c");
|
||||||
|
$obj->add_field("Nama_Lengkap", "Nama Barang", "awr");
|
||||||
|
$obj->set_field_order("Kode_SKU", "A");
|
||||||
|
$obj->set_func_select("RepoStokMutasiJS.produk_select");
|
||||||
|
$this->app->json([ $obj->db_table("divBrowProduk") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function auto_produk() {
|
||||||
|
$tcari = Param::Get("Auto_Query", "");
|
||||||
|
$ajson['autodata'] = [];
|
||||||
|
$bcode = 0; $arec = [];
|
||||||
|
|
||||||
|
// Cari by SKU + Barcode
|
||||||
|
$_row = $this->db->fetchRow("SELECT P.InvID,P.Nama_Lengkap FROM (SELECT * FROM vi_inv_produk WHERE Aktif=1 AND (Kode_SKU=? OR Kode_Barcode=?)) P", [$tcari, $tcari]);
|
||||||
|
if ($_row) {
|
||||||
|
$bcode = 1;
|
||||||
|
$arec = $_row->getData();
|
||||||
|
}
|
||||||
|
if ($bcode === 1) {
|
||||||
|
$ajson['autodata'][] = ['value'=>$arec['InvID'], 'text'=>$arec['Nama_Lengkap'], 'data'=>0, 'bc'=>1];
|
||||||
|
} else {
|
||||||
|
$stat = $this->db->runQuery("SELECT P.InvID,P.Nama_Lengkap,P.Kode_SKU FROM (SELECT * FROM vi_inv_produk WHERE Barcode_Nama LIKE ? AND Aktif=1) P ORDER BY P.Nama_Produk,P.Qty LIMIT 50", ['%'.$tcari.'%']);
|
||||||
|
while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$ajson['autodata'][] = ['value'=>$row['InvID'], 'text'=>$row['Nama_Lengkap'], 'html'=>'<span class="text-primary">'.$row['Kode_SKU'].'</span> '.$row['Nama_Lengkap'], 'data'=>0, 'bc'=>0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function prepare() {
|
||||||
|
$apre = [
|
||||||
|
'id_inv' => Param::Int("InvID", 0),
|
||||||
|
'tgl_from' => Param::Get("Tgl_From"),
|
||||||
|
'tgl_to' => Param::Get("Tgl_To"),
|
||||||
|
'Nama_Produk' => "",
|
||||||
|
'Qty' => 1,
|
||||||
|
'Satuan_Stok' => "",
|
||||||
|
'Satuan_Kemasan' => "",
|
||||||
|
];
|
||||||
|
|
||||||
|
$_produk = $this->db->fetchRow("SELECT Nama_Produk,Qty,Satuan_Stok,Nama_Satuan Satuan_Kemasan FROM vi_inv_produk WHERE InvID=? ORDER BY Qty LIMIT 1", [$apre['id_inv']]);
|
||||||
|
if ($_produk) $apre = array_merge($apre, $_produk->getData());
|
||||||
|
|
||||||
|
// generate report header
|
||||||
|
$apre['periode'] = $apre['tgl_from'] . ($apre['tgl_from'] !== $apre['tgl_to'] ? ' s/d '.$apre['tgl_to'] : '');
|
||||||
|
|
||||||
|
$tsql = ''; $asql = [tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to']), $apre['id_inv']];
|
||||||
|
if ($this->id_cab > 0) {
|
||||||
|
$tsql .= " AND CabID=?";
|
||||||
|
array_push($asql, $this->id_cab);
|
||||||
|
}
|
||||||
|
|
||||||
|
$apre['query'] = $this->db->runQuery("SELECT D.Tgl_Ref,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),T.Nama_Member,CONCAT(S.Nama_Sup,IF(B.Data_Beli=1,'',' <i>(Retur)</i>'))) Nama,C.Kode_Cab FROM (SELECT No_Ref,Tgl_Ref,CabID,NotaID,SUM(Stok) Stok FROM inv_detail WHERE (Tgl_Ref BETWEEN ? AND ?) AND InvID=? 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 para_member T ON (T.MemberID=J.MemberID) LEFT JOIN para_cabang C ON (C.CabID=D.CabID) 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", $asql);
|
||||||
|
|
||||||
|
unset($asql[1]); $asql = array_values($asql);
|
||||||
|
$apre['stok'] = $this->db->fetchField("SELECT SUM(Stok) Stok FROM inv_detail WHERE Tgl_Ref<? AND InvID=?".$tsql, $asql) ?? 0;
|
||||||
|
return $apre;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function print() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
|
||||||
|
$pre = new PrintHTML($this->app);
|
||||||
|
$pre->add_title([strtoupper($this->reg_name), "MUTASI STOK BARANG", "Periode : ".$apre['periode']]);
|
||||||
|
|
||||||
|
$pre->add_field("Tanggal",30,"C", "tgl_sql2str");
|
||||||
|
$pre->add_field("No. Nota",30,"L");
|
||||||
|
$pre->add_field("Nama Supplier / Member",80,"L");
|
||||||
|
$pre->add_field("Cabang",10,"L");
|
||||||
|
$pre->add_field("Masuk",20,"R");
|
||||||
|
$pre->add_field("Keluar",20,"R");
|
||||||
|
$pre->add_field("Stok",20,"R");
|
||||||
|
|
||||||
|
$pre->add_sub_title("Nama Barang : ".$apre['Nama_Produk']);
|
||||||
|
|
||||||
|
$pre->show_titles();
|
||||||
|
$pre->show_headers();
|
||||||
|
|
||||||
|
$tot_m = 0; $tot_k = 0;
|
||||||
|
$pre->add_span([ ["Stok Awal",4,"R,B"],["",1,"R,B"],["",1,"R,B"],[Invesa::Format_Stok($apre['stok'], $apre['Qty'], $apre['Satuan_Kemasan'], $apre['Satuan_Stok']),1,"R,B"] ]);
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$msk = $row['Masuk'];
|
||||||
|
$klr = $row['Keluar'];
|
||||||
|
$apre['stok'] += $msk - $klr;
|
||||||
|
$tot_m += $msk;
|
||||||
|
$tot_k += $klr;
|
||||||
|
$pre->add_row([ $row['Tgl_Ref'], $row['No_Ref'], $row['Nama'], $row['Kode_Cab'], ($msk===0?'':Invesa::Format_Stok($msk, $apre['Qty'], $apre['Satuan_Kemasan'], $apre['Satuan_Stok'])), ($klr===0?'':Invesa::Format_Stok($klr, $apre['Qty'], $apre['Satuan_Kemasan'], $apre['Satuan_Stok'])), Invesa::Format_Stok($apre['stok'], $apre['Qty'], $apre['Satuan_Kemasan'], $apre['Satuan_Stok']) ]);
|
||||||
|
}
|
||||||
|
$pre->add_span([ ["Stok Akhir",4,"R,B"],[Invesa::Format_Stok($tot_m, $apre['Qty'], $apre['Satuan_Kemasan'], $apre['Satuan_Stok']),1,"R,B"],[Invesa::Format_Stok($tot_k, $apre['Qty'], $apre['Satuan_Kemasan'], $apre['Satuan_Stok']),1,"R,B"],[Invesa::Format_Stok($apre['stok'], $apre['Qty'], $apre['Satuan_Kemasan'], $apre['Satuan_Stok']),1,"R,B"] ]);
|
||||||
|
|
||||||
|
$pre->add_stamp(1, true);
|
||||||
|
$pre->show();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function excel() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
$xls = new Xlsx($this->app);
|
||||||
|
$xls->set_meta([
|
||||||
|
'title' => "Data Mutasi Stok Barang",
|
||||||
|
'desc' => "Export Data Mutasi Stok Barang"
|
||||||
|
]);
|
||||||
|
$xls->add_title([ $this->reg_name, "DATA MUTASI STOK BARANG", "Periode : ".$apre['periode'] ]);
|
||||||
|
|
||||||
|
$xls->add_field("Tanggal", 12, "@date");
|
||||||
|
$xls->add_field("No. Nota", 15, "@text");
|
||||||
|
$xls->add_field("Nama Supplier / Member", 40, "@text");
|
||||||
|
$xls->add_field("Cabang", 10, "@text");
|
||||||
|
$xls->add_field("Masuk", 15, "@");
|
||||||
|
$xls->add_field("Keluar", 15, "@");
|
||||||
|
$xls->add_field("Stok", 15, "@");
|
||||||
|
$xls->add_sheet("".str_replace("s/d","-",$apre['periode']));
|
||||||
|
|
||||||
|
$xls->add_sub_title("Nama Barang : ".$apre['Nama_Produk']);
|
||||||
|
|
||||||
|
$xls->show_titles();
|
||||||
|
$xls->show_headers();
|
||||||
|
|
||||||
|
$tot_m = 0; $tot_k = 0;
|
||||||
|
$xls->add_row_bold([ "", "", "Stok Awal", "", "", "", Invesa::Format_Stok($apre['stok'], $apre['Qty'], $apre['Satuan_Kemasan'], $apre['Satuan_Stok']) ]);
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$msk = $row['Masuk'];
|
||||||
|
$klr = $row['Keluar'];
|
||||||
|
$apre['stok'] += $msk - $klr;
|
||||||
|
$tot_m += $msk;
|
||||||
|
$tot_k += $klr;
|
||||||
|
$xls->add_row([ $row['Tgl_Ref'], $row['No_Ref'], $row['Nama'], $row['Kode_Cab'], ($msk===0?'':Invesa::Format_Stok($msk, $apre['Qty'], $apre['Satuan_Kemasan'], $apre['Satuan_Stok'])), ($klr===0?'':Invesa::Format_Stok($klr, $apre['Qty'], $apre['Satuan_Kemasan'], $apre['Satuan_Stok'])), Invesa::Format_Stok($apre['stok'], $apre['Qty'], $apre['Satuan_Kemasan'], $apre['Satuan_Stok']) ]);
|
||||||
|
}
|
||||||
|
$xls->add_row_bold([ "", "", "Stok Akhir", "", Invesa::Format_Stok($tot_m, $apre['Qty'], $apre['Satuan_Kemasan'], $apre['Satuan_Stok']), Invesa::Format_Stok($tot_k, $apre['Qty'], $apre['Satuan_Kemasan'], $apre['Satuan_Stok']), Invesa::Format_Stok($apre['stok'], $apre['Qty'], $apre['Satuan_Kemasan'], $apre['Satuan_Stok']) ]);
|
||||||
|
|
||||||
|
$xls->add_stamp(1, true);
|
||||||
|
$xls->download("Data Mutasi Stok Barang ".str_replace("s/d","-",$apre['periode']).".xlsx");
|
||||||
|
unset($xls);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tcab = $form->option_db("_", "CabID", $this->id_cab, true, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID", [0,"SEMUA CABANG"]);
|
||||||
|
$tproduk = $form->textauto("_", "Nama_Produk", ['value'=>0,'text'=>""], true, true, "nama barang");
|
||||||
|
$tfrom = $form->datebox("_", "Tgl_From", tgl_ymd(), true, false);
|
||||||
|
$tto = $form->datebox("_", "Tgl_To", tgl_ymd(), true, false);
|
||||||
|
$ajson['html'] = '
|
||||||
|
<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="Nama_Produk">Nama Barang</label>
|
||||||
|
<div class="col"><div class="input-group">'.$tproduk.'<button id="butBrowProduk" class="btn btn-info" type="button"><i class="bi-bag"></i></button></div></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>
|
||||||
|
<input type="hidden" id="InvID" value="0" >';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,161 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Report/Stok/OpnameController
|
||||||
|
Description : Laporan Stok Opname Barang
|
||||||
|
Created By : Siau Pheng (siaupheng@3fonia.com).
|
||||||
|
Created Date : March 2nd, 2014.
|
||||||
|
Last Modified : October 13th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Report\Stok;
|
||||||
|
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use flight\Session;
|
||||||
|
use Webapp\Data\Xlsx;
|
||||||
|
use Webapp\Printer\PrintHTML;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
|
||||||
|
class OpnameController {
|
||||||
|
|
||||||
|
private array $app_inv;
|
||||||
|
private int $id_cab;
|
||||||
|
private string $reg_name;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->app_inv = (array) $session->get('APP_INV');
|
||||||
|
$this->id_cab = Param::Int("CabID", 0);
|
||||||
|
$this->reg_name = $session->get('WEB_APP')['REG_NAME'];
|
||||||
|
}
|
||||||
|
|
||||||
|
private function prepare() {
|
||||||
|
$apre = [
|
||||||
|
'id_grup_inv' => Param::Int("Grup_InvID", 0),
|
||||||
|
'tgl_from' => Param::Get("Tgl_From"),
|
||||||
|
'tgl_to' => Param::Get("Tgl_To"),
|
||||||
|
];
|
||||||
|
|
||||||
|
$apre['nama_grup_inv'] = ($apre['id_grup_inv'] > 0 && $apre['id_sup']===0) ? ($this->db->fetchField("SELECT Nama_Grup FROM inv_produk_grup WHERE Grup_InvID=?", [$apre['id_grup_inv']]) ?? '') : '';
|
||||||
|
|
||||||
|
// generate report header
|
||||||
|
$apre['periode'] = $apre['tgl_from'] . (($apre['tgl_from']!==$apre['tgl_to']) ? " s/d ".$apre['tgl_to'] : '');
|
||||||
|
|
||||||
|
$tsql1 = ''; $tsql2 = '';
|
||||||
|
$asql1 = [tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to'])];
|
||||||
|
$asql2 = [];
|
||||||
|
|
||||||
|
if ($this->id_cab > 0) {
|
||||||
|
$tsql1 .= " AND CabID=?";
|
||||||
|
array_push($asql1, $this->id_cab);
|
||||||
|
}
|
||||||
|
if ($apre['id_grup_inv'] > 0) {
|
||||||
|
$tsql2 = " WHERE P.Grup_InvID=?";
|
||||||
|
array_push($asql2, $apre['id_grup_inv']);
|
||||||
|
}
|
||||||
|
|
||||||
|
$apre['query'] = $this->db->runQuery("SELECT D.*,P.Nama_Produk,P.Nama_Satuan FROM (SELECT InvID,SatuanID,-Qty Qty,Harga_Beli,(-Qty*Harga_Beli) Jumlah FROM inv_detail WHERE NotaID=1 AND (Tgl_Ref BETWEEN ? AND ?)".$tsql1.") D LEFT JOIN vi_inv_produk P ON (P.InvID=D.InvID AND P.SatuanID=D.SatuanID)".$tsql2." ORDER BY P.Nama_Produk", array_merge($asql1, $asql2));
|
||||||
|
return $apre;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function print() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
|
||||||
|
$pre = new PrintHTML($this->app);
|
||||||
|
$pre->add_title([strtoupper($this->reg_name), "OPNAME STOK BARANG", "Periode : ".$apre['periode']]);
|
||||||
|
|
||||||
|
$pre->add_field("No.",10,"C");
|
||||||
|
$pre->add_field("Nama Barang",50,"L");
|
||||||
|
$pre->add_field("Satuan",30,"L");
|
||||||
|
$pre->add_field("Qty",20,"R","rupiah2");
|
||||||
|
$pre->add_field("HPP",20,"R","rupiah2");
|
||||||
|
$pre->add_field("Jumlah",20,"R","rupiah2");
|
||||||
|
|
||||||
|
if ($apre['id_grup_inv'] > 0) $pre->add_sub_title("Grup Barang : ".$apre['nama_grup_inv']);
|
||||||
|
|
||||||
|
$pre->show_titles();
|
||||||
|
$pre->show_headers();
|
||||||
|
|
||||||
|
$nomor = 0; $tot_opname = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_opname += $row['Jumlah'];
|
||||||
|
$pre->add_row([ ++$nomor, $row['Nama_Produk'], $row['Nama_Satuan'], $row['Qty'], $row['Harga_Beli'], $row['Jumlah'] ]);
|
||||||
|
}
|
||||||
|
$pre->add_span([ ["GRAND TOTAL",5,"R,B"], [$tot_opname,1,"R,B","rupiah2"] ]);
|
||||||
|
|
||||||
|
$pre->add_stamp(1, true);
|
||||||
|
$pre->show();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function excel() {
|
||||||
|
$apre = $this->prepare();
|
||||||
|
$xls = new Xlsx($this->app);
|
||||||
|
$xls->set_meta([
|
||||||
|
'title' => "Data Opname Stok Barang",
|
||||||
|
'desc' => "Export Data Opname Stok Barang"
|
||||||
|
]);
|
||||||
|
$xls->add_title([ $this->reg_name, "OPNAME STOK BARANG", "Periode : ".$apre['periode'] ]);
|
||||||
|
|
||||||
|
$xls->add_field("No.", 10, "@integer");
|
||||||
|
$xls->add_field("Nama Barang", 35, "@text");
|
||||||
|
$xls->add_field("Satuan", 10, "@text");
|
||||||
|
$xls->add_field("Qty", 15, "@");
|
||||||
|
$xls->add_field("HPP", 15, "#,##0.00");
|
||||||
|
$xls->add_field("Jumlah", 15, "#,##0.00");
|
||||||
|
$xls->add_sheet("".str_replace("s/d","-",$apre['periode']));
|
||||||
|
|
||||||
|
if ($apre['id_grup_inv'] > 0) $xls->add_sub_title("Grup Barang : ".$apre['nama_grup_inv']);
|
||||||
|
|
||||||
|
$xls->show_titles();
|
||||||
|
$xls->show_headers();
|
||||||
|
|
||||||
|
$nomor = 0; $tot_opname = 0;
|
||||||
|
while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$tot_opname += $row['Jumlah'];
|
||||||
|
$xls->add_row([ ++$nomor, $row['Nama_Produk'], $row['Nama_Satuan'], $row['Qty'], $row['Harga_Beli'], $row['Jumlah'] ]);
|
||||||
|
}
|
||||||
|
$xls->add_row_bold([ "", "GRAND TOTAL", "", "", "", $tot_opname ]);
|
||||||
|
|
||||||
|
$xls->add_stamp(1, true);
|
||||||
|
$xls->download("Data Opname Stok Barang ".str_replace("s/d","-",$apre['periode']).".xlsx");
|
||||||
|
unset($xls);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tcab = $form->option_db("_", "CabID", $this->id_cab, true, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID", [0,"SEMUA CABANG"]);
|
||||||
|
$tgrup_inv = $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);
|
||||||
|
$ajson['html'] = '
|
||||||
|
<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="Grup_InvID">Grup Barang</label>
|
||||||
|
<div class="col">'.$tgrup_inv.'</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>';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,142 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/System/AboutController
|
||||||
|
Description : Informasi Aplikasi
|
||||||
|
Created By : Siau Pheng (siaupheng@3fonia.com).
|
||||||
|
Created Date : November 23th, 2011.
|
||||||
|
Last Modified : August 13th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\System;
|
||||||
|
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\Session;
|
||||||
|
use Webapp\App\Register;
|
||||||
|
use Webapp\App\Update;
|
||||||
|
use Webapp\DB\CheckSQL;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
|
||||||
|
class AboutController {
|
||||||
|
|
||||||
|
protected Engine $app;
|
||||||
|
protected Session $session;
|
||||||
|
protected Update $update;
|
||||||
|
protected CheckSQL $check;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->session = $session;
|
||||||
|
$this->update = new Update($app);
|
||||||
|
$this->check = new CheckSQL($app);
|
||||||
|
$this->check->ignore_table("app_auth","app_backup","app_config","app_menu","app_operator");
|
||||||
|
}
|
||||||
|
|
||||||
|
public function update_check() {
|
||||||
|
$ainfo = $this->update->check();
|
||||||
|
$ajson['is_update'] = $ainfo['cur_sha1'] === $ainfo['new_sha1'];
|
||||||
|
$ajson['html'] = '
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-4 col-lg-4 col-form-label">Versi Aplikasi</div>
|
||||||
|
<div class="col col-form-label"><span class="form-control">'.$ainfo['cur_version'].'</span></div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-4 col-lg-4 col-form-label">Commit Sekarang</div>
|
||||||
|
<div class="col col-form-label"><span class="form-control"><strong>'.$ainfo['cur_sha'].'</strong> '.$ainfo['cur_date'].'</span></div>
|
||||||
|
</div>
|
||||||
|
<div class="row"><div class="col"><hr class="my-1"></div></div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-4 col-lg-4 col-form-label">Commit Update</div>
|
||||||
|
<div class="col col-form-label"><span class="form-control"><strong>'.$ainfo['new_sha'].'</strong> '.$ainfo['new_date'].'</span></div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-4 col-lg-4 col-form-label">Informasi Update</div>
|
||||||
|
<div class="col col-form-label"><span class="form-control">'.$ainfo['new_message'].'</span></div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-4 col-lg-4 col-form-label">Status Server</div>
|
||||||
|
<div class="col">
|
||||||
|
<span class="form-control text-'.($ainfo['svr_status']===1?'success border-primary':'warning border-danger').'" id="spanStatus">'.$ainfo['svr_message'].'</span>
|
||||||
|
</div>
|
||||||
|
</div>';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function update_proses() {
|
||||||
|
$ajson = $this->update->go();
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function db_check() {
|
||||||
|
$ajson['html'] = '<ul id="db-list"><li>Proses ...</li></ul>';
|
||||||
|
$ajson['db_count'] = $this->check->count_db();
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function db_proses() {
|
||||||
|
$nomor = Param::Get('Nomor', 0);
|
||||||
|
$ajson['html'] = $this->check->check_db_step($nomor);
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function opti_proses() {
|
||||||
|
$nomor = Param::Get('Nomor', 0);
|
||||||
|
$ajson['html'] = $this->check->optimize_db_step($nomor);
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$ajson = [];
|
||||||
|
$apps = $this->session->get('WEB_APP');
|
||||||
|
|
||||||
|
$ajson['html'] = '<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>'.$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($this->session).'</td></tr>
|
||||||
|
<tr><td>Register Code</td><td class="c">:</td><td>'.Register::reg_code($this->session).'</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;"><i class="bi-c-circle pe-1"></i>'.$apps['CREATOR_YEARS'].', '.$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">Proses Cek dan Otomatis Repair 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" id="butDBCek">Cek Database</button></div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-2">
|
||||||
|
<div class="col-md-8">Proses Optimalisasi database, merampingkan kembali database aplikasi.</div>
|
||||||
|
<div class="col-md-4 d-grid gap-2 my-auto"><button type="button" class="btn btn-warning col-12" id="butDBOpti">Opti 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-success col-12" id="butUpdateCek">Cek Update</button></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/System/ChpasswdController
|
||||||
|
Description : Data Ubah Password
|
||||||
|
Created By : Siau Pheng (siaupheng@3fonia.com).
|
||||||
|
Created Date : December 7th, 2008.
|
||||||
|
Last Modified : August 9th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\System;
|
||||||
|
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\Session;
|
||||||
|
use Webapp\App\Auth;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
|
||||||
|
class ChpasswdController {
|
||||||
|
|
||||||
|
protected Engine $app;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function simpan() {
|
||||||
|
$ajson['status'] = false;
|
||||||
|
|
||||||
|
$l_pass = Param::Get("LPass");
|
||||||
|
$b_pass1 = Param::Get("BPass1");
|
||||||
|
|
||||||
|
$auth = new Auth($this->app);
|
||||||
|
if ($auth->user_check($this->app->user()->username(), $l_pass)) {
|
||||||
|
$this->app->db()->update('app_operator', 'Password=MD5(?) WHERE UserID=?', [$b_pass1, $this->app->user()->id()]);
|
||||||
|
$ajson['status'] = true;
|
||||||
|
$ajson['message'] = "Sukses merubah password Anda!";
|
||||||
|
} else {
|
||||||
|
$ajson['message'] = "Password lama Anda salah!";
|
||||||
|
}
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$t_passl = $form->password("_", "LPass", '', true, true, "masukkan password lama", 20);
|
||||||
|
$t_passb1 = $form->password("_", "BPass1", '', true, true, "masukkan password baru 1", 20);
|
||||||
|
$t_passb2 = $form->password("_", "BPass2", '', true, true, "masukkan password baru 2", 20);
|
||||||
|
$ajson['html'] = '
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-6 col-lg-4 col-form-label" for="LPass">Password Lama</label>
|
||||||
|
<div class="col">'.$t_passl.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-6 col-lg-4 col-form-label" for="BPass1">Password Baru 1</label>
|
||||||
|
<div class="col">'.$t_passb1.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-6 col-lg-4 col-form-label" for="BPass2">Password Baru 2</label>
|
||||||
|
<div class="col">'.$t_passb2.'</div>
|
||||||
|
</div>';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,82 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/System/ConfigController
|
||||||
|
Description : Konfigurasi Informasi Perusahaan
|
||||||
|
Created By : Siau Pheng (siaupheng@3fonia.com).
|
||||||
|
Created Date : May 25th, 2010.
|
||||||
|
Last Modified : August 14th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\System;
|
||||||
|
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\Session;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use Webapp\DB\SQL;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
|
||||||
|
class ConfigController {
|
||||||
|
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
protected Session $session;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->session = $session;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function config() {
|
||||||
|
$mode = Param::Get('mode', 'view');
|
||||||
|
|
||||||
|
if ($mode === 'save') {
|
||||||
|
$sql = new SQL($this->app);
|
||||||
|
$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();
|
||||||
|
}
|
||||||
|
|
||||||
|
$benable = ($mode === 'edit') ? true : false;
|
||||||
|
$id_reg = Param::Get("REG_ID", $this->session->get('WEB_APP')['REG_ID']);
|
||||||
|
$para = $this->db->fetchRow('SELECT * FROM app_config WHERE REG_ID=?', [$id_reg]);
|
||||||
|
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$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, "angka", "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);
|
||||||
|
$ajson['html'] = $form->show(3);
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$this->app->json(['html' => '<div id="divMaster"></div>']);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,165 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/System/MenugrupController
|
||||||
|
Description : Grup Login Menu
|
||||||
|
Created By : Siau Pheng (siaupheng@3fonia.com).
|
||||||
|
Created Date : August 8th, 2013.
|
||||||
|
Last Modified : August 19th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\System;
|
||||||
|
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\Session;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use Webapp\DB\SQL;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
use Webapp\Web\Table;
|
||||||
|
|
||||||
|
class MenugrupController {
|
||||||
|
|
||||||
|
private string $mode;
|
||||||
|
private int $id_grup;
|
||||||
|
private string $parent_code;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
protected Session $session;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->session = $session;
|
||||||
|
$this->mode = (string) Param::Get('mode');
|
||||||
|
$this->id_grup = (int) Param::Get("Grup_MenuID", 0);
|
||||||
|
$this->parent_code = (string) $session->get('WEB_APP')['PARENT_CODE'];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function table_detail() {
|
||||||
|
if (in_array($this->mode, ['add','edit','del'])) {
|
||||||
|
$sql = new SQL($this->app);
|
||||||
|
$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 ($this->mode === "add") {
|
||||||
|
$sql->InsertDB();
|
||||||
|
} else if ($this->mode === "edit") {
|
||||||
|
$sql->UpdateDB();
|
||||||
|
} else if ($this->mode === "del") {
|
||||||
|
$sql->DeleteDB();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$tcari = Param::Get("Cari_Grup", "");
|
||||||
|
$twhere = ''; $apar = [];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$twhere = 'Nama_Grup LIKE ?';
|
||||||
|
$apar[] = '%'.$tcari.'%';
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table('app_menu_grup', '*,IF(Grup_MenuID=1,0,1) IDel', $twhere, $apar);
|
||||||
|
$obj->add_field("Grup_MenuID", "ID", "hid");
|
||||||
|
$obj->add_field("Nama_Grup", "Nama Grup");
|
||||||
|
$obj->add_field("Ket", "Keterangan");
|
||||||
|
$obj->add_field("DateStamp", "Update Terakhir", "c", 'sqljam');
|
||||||
|
$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_btn("MenuGrupJS.detail_tambah", "+ Grup");
|
||||||
|
$this->app->json([ $obj->json_table("divDetail") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function detail_grup() {
|
||||||
|
$agrup = [ 'Nama_Grup' => '', 'Ket' => '', 'Aktif' => 1, 'Grup_MenuID' => 0 ];
|
||||||
|
if ($this->mode === 'edit') {
|
||||||
|
$agrup = $this->db->fetchRow('SELECT * FROM app_menu_grup WHERE Grup_MenuID=?', [$this->id_grup]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$form->textbox("Nama Grup Menu", "Nama_Grup", $agrup['Nama_Grup'], true, false, "text", "nama grup menu");
|
||||||
|
$form->textarea("Keterangan Grup", "Ket", $agrup['Ket'], true, false, 1, "keterangan grup menu");
|
||||||
|
$form->switch("Status Aktif", "Aktif", $agrup['Aktif'], true, false, ["1","0"]);
|
||||||
|
$form->hidden("Grup_MenuID", $agrup['Grup_MenuID']);
|
||||||
|
$form->hidden("mode", $this->mode);
|
||||||
|
$ajson['html'] = $form->show(3);
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function detail_menu() {
|
||||||
|
$agrup = $this->db->fetchRow('SELECT Grup_MenuID,Nama_Grup,CONVERT(DECODE(Menu,?) USING UTF8MB4) Menu FROM app_menu_grup WHERE Grup_MenuID=?', [$this->session->get('WEB_APP')['PARENT_CODE'], $this->id_grup]);
|
||||||
|
$amenu = explode(",", $agrup['Menu']);
|
||||||
|
|
||||||
|
$amodul = $this->db->fetchAll("SELECT * FROM app_menu WHERE Level=0 AND Modul<>'IND' AND Aktif=1 ORDER BY Urut ASC");
|
||||||
|
$hasil = '<div id="tabMenuList">';
|
||||||
|
$ajson = ['html' => ''];
|
||||||
|
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">';
|
||||||
|
foreach ($amodul as $i => $modul) {
|
||||||
|
$alist = $this->db->fetchAll("SELECT * FROM app_menu WHERE Modul=? AND Level>0 AND Aktif=1 ORDER BY Kode", [$modul['Modul']]);
|
||||||
|
$hasil .= '<div class="tab-pane fade'.($i==0?' show active':'').'" role="tabpanel" id="i'.$modul['Modul'].'" aria-labelledby="i'.$modul['Modul'].'-tab">';
|
||||||
|
$hasil .= $this->modul_gen($alist, $amenu);
|
||||||
|
$hasil .= '</div>';
|
||||||
|
}
|
||||||
|
$hasil .= '</div>';
|
||||||
|
} else {
|
||||||
|
$alist = $this->db->fetchAll("SELECT * FROM app_menu WHERE Modul=? AND Level>0 AND Aktif=1 ORDER BY Kode", [$amodul[0]['Modul']]);
|
||||||
|
$hasil .= $this->modul_gen($alist, $amenu);
|
||||||
|
}
|
||||||
|
$ajson['html'] .= $hasil.'</div>';
|
||||||
|
$ajson['html'] .= '<input type="hidden" id="Grup_MenuID" value="'. $agrup['Grup_MenuID'] .'" />';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function save_menu() {
|
||||||
|
$amenu = explode(",", (string) Param::Get("Menu"));
|
||||||
|
$ahasil = [];
|
||||||
|
$amodul = $this->db->fetchAll("SELECT * FROM app_menu WHERE Level=0 AND Modul<>'IND' AND Aktif=1 ORDER BY Urut ASC");
|
||||||
|
foreach ($amodul as $modul) {
|
||||||
|
$akode = $this->db->fetchColumn("SELECT Kode FROM app_menu WHERE Modul=? AND Level>0 AND Aktif=1 ORDER BY Kode", [$modul['Modul']]);
|
||||||
|
$asub = array_intersect($amenu, $akode);
|
||||||
|
if (count($asub)>0) $ahasil = array_merge($ahasil, [$modul['Kode']], $asub);
|
||||||
|
}
|
||||||
|
$this->db->runQuery("UPDATE app_menu_grup SET Menu=ENCODE('".implode(",",$ahasil)."',?),DateStamp=NOW(),UserID=? WHERE Grup_MenuID=?", [$this->parent_code, $this->session->get('WEB_USER')['UserID'], $this->id_grup]);
|
||||||
|
$this->app->json([ 'status' => true ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function modul_gen(array $alist = [], array $amenu = []): string {
|
||||||
|
$hasil = '<table class="table table-striped table-bordered table-hover">';
|
||||||
|
$hasil .= '<thead><tr><th>Nama Menu</th><th>Keterangan</th><th width="30"><input type="checkbox" class="form-check-input cek-modul mx-2" omodul="'.$alist[0]['Modul'].'" /></th></tr></thead><tbody>';
|
||||||
|
foreach ($alist as $list) {
|
||||||
|
$checked = (in_array($list['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("--", $list['Level']-1)."> ".$list['Menu'], $list['Judul'], $list['Modul'], $list['Kode'], $checked);
|
||||||
|
}
|
||||||
|
$hasil .= '</tbody></table>';
|
||||||
|
return $hasil;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$this->app->json([
|
||||||
|
'html' => '
|
||||||
|
<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"> </div></div></div>
|
||||||
|
</div>'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,237 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/System/OperatorController
|
||||||
|
Description : Data Pengguna
|
||||||
|
Created By : Siau Pheng (siaupheng@3fonia.com).
|
||||||
|
Created Date : August 1st, 2008.
|
||||||
|
Last Modified : August 27th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\System;
|
||||||
|
|
||||||
|
use App\Utils\Invesa;
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\Session;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use Webapp\DB\SQL;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
use Webapp\Web\Table;
|
||||||
|
|
||||||
|
class OperatorController {
|
||||||
|
|
||||||
|
private string $mode;
|
||||||
|
private int $id_user;
|
||||||
|
private int $filter;
|
||||||
|
private string $parent_code;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
protected Session $session;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->session = $session;
|
||||||
|
$this->mode = (string) Param::Get('mode');
|
||||||
|
$this->id_user = (int) Param::Get("UserID");
|
||||||
|
$this->filter = (int) Param::Get("Filter_Level");
|
||||||
|
$this->parent_code = (string) $session->get('WEB_APP')['PARENT_CODE'];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function table_detail() {
|
||||||
|
$cari = Param::Get("Cari_User");
|
||||||
|
$twhere = ''; $apar = [];
|
||||||
|
if ($this->filter === 99) {
|
||||||
|
$twhere = "Level>=?";
|
||||||
|
$apar[] = $this->session->get('WEB_USER')['Level'];
|
||||||
|
} else {
|
||||||
|
$twhere = "Level=?";
|
||||||
|
$apar[] = $this->filter;
|
||||||
|
}
|
||||||
|
if (!empty($cari)) {
|
||||||
|
$twhere .= ' AND CONCAT(Username,Nama) LIKE ?';
|
||||||
|
$apar[] = '%'.$cari.'%';
|
||||||
|
}
|
||||||
|
$id = (int) $this->session->get('WEB_USER')['UserID'] ?? 0;
|
||||||
|
$twhere .= ($id === 2) ? ' AND UserID>1' : ($id > 2 ? ' AND UserID>2' : '');
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("app_operator", "*", $twhere, $apar);
|
||||||
|
$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", $this->session->get('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_btn("OperatorJS.detail_tambah", "+ Pengguna");
|
||||||
|
$this->app->json([ $obj->json_table("divDetail") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function detail_filter() {
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tfilter = $form->option("_", "Fi_Level", $this->filter, true, false, [99=>"SEMUA LEVEL PENGGUNA"] + $this->session->get('WEB_APP')['USER_LEVEL']);
|
||||||
|
$ajson['html'] = '
|
||||||
|
<div class="row mb-3"><div class="col text-center">Tampilan Berdasarkan :</div></div>
|
||||||
|
<div class="row"><div class="col text-center">'.$tfilter.'</div></div>';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function detail_user() {
|
||||||
|
$auser = [ 'UserID'=>0, 'Username'=>"", 'Nama'=>"", 'Posisi'=>"", 'Level' => 9, 'Aktif' => 1, 'Grup_MenuID' => 0 ];
|
||||||
|
if ($this->mode === 'edit') {
|
||||||
|
$auser = $this->db->fetchRow('SELECT * FROM app_operator WHERE UserID=?', [$this->id_user]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$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"]);
|
||||||
|
$ajson['html'] = '
|
||||||
|
<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-sm-8 col-lg-5"><div class="input-group">'.$t_pass.Invesa::Form_Info("biarkan kosong jika tidak ingin mengubah password.").'</div></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="'.$this->mode.'" >';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function detail_menu() {
|
||||||
|
$auser = $this->db->fetchRow("SELECT UserID,Nama,Grup_MenuID,CONVERT(DECODE(Menu,?) USING UTF8MB4) Menu FROM app_operator WHERE UserID=?", [$this->parent_code, $this->id_user]);
|
||||||
|
$amenu = explode(",", $auser['Menu']);
|
||||||
|
|
||||||
|
$aglist = []; $ajson = ['html' => ''];
|
||||||
|
$glist = $this->db->fetchField("SELECT CONVERT(DECODE(Menu,?) USING UTF8MB4) FROM app_menu_grup WHERE Grup_MenuID=?", [$this->parent_code, $auser['Grup_MenuID']]);
|
||||||
|
if (!empty($glist)) $aglist = explode(",", $glist);
|
||||||
|
|
||||||
|
$amodul = $this->db->fetchAll("SELECT * FROM app_menu WHERE Level=0 AND Modul<>'IND' AND Aktif=1 ORDER BY Urut ASC");
|
||||||
|
$hasil = '<div id="tabMenuList">';
|
||||||
|
if (count($amodul)>1) {
|
||||||
|
$hasil .= '<ul class="nav nav-tabs" role="tablist">';
|
||||||
|
foreach ($amodul as $i => $modul) {
|
||||||
|
$hasil .= '<li class="nav-item" role="presentation"><button class="nav-link'.($i==0?' active':'').'" id="i'.$modul['Modul'].'-tab" data-bs-toggle="tab" data-bs-target="#i'.$modul['Modul'].'" type="button" role="tab" aria-controls="i'.$modul['Modul'].'" aria-selected="'.($i==0?'true':'false').'">'.$modul['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">';
|
||||||
|
foreach ($amodul as $i => $modul) {
|
||||||
|
$alist = $this->db->fetchAll("SELECT * FROM app_menu WHERE Modul=? AND Level>0 AND Aktif=1 ORDER BY Kode", [$modul['Modul']]);
|
||||||
|
$hasil .= '<div class="tab-pane fade'.($i==0?' show active':'').'" role="tabpanel" id="i'.$modul['Modul'].'" aria-labelledby="i'.$modul['Modul'].'-tab">';
|
||||||
|
$hasil .= $this->modul_gen($alist, $amenu, $aglist);
|
||||||
|
$hasil .= '</div>';
|
||||||
|
}
|
||||||
|
$hasil .= '</div>';
|
||||||
|
} else {
|
||||||
|
$alist = $this->db->fetchAll("SELECT * FROM app_menu WHERE Modul=? AND Level>0 AND Aktif=1 ORDER BY Kode", [$amodul[0]['Modul']]);
|
||||||
|
$hasil .= $this->modul_gen($alist, $amenu, $aglist);
|
||||||
|
}
|
||||||
|
$ajson['html'] .= $hasil.'</div>';
|
||||||
|
$ajson['html'] .= '<input type="hidden" id="UserID" value="'. $auser['UserID'] .'" />';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function save_user() {
|
||||||
|
$sql = new SQL($this->app);
|
||||||
|
$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", $this->session->get('WEB_USER')['UserID']);
|
||||||
|
$sql->add_where("UserID");
|
||||||
|
|
||||||
|
if ($this->mode === "add") {
|
||||||
|
$sql->InsertDB();
|
||||||
|
} else if ($this->mode === "edit") {
|
||||||
|
$sql->UpdateDB();
|
||||||
|
} else if ($this->mode === "del") {
|
||||||
|
$sql->DeleteDB();
|
||||||
|
}
|
||||||
|
// SIMPAN PASSWORD
|
||||||
|
$pass = Param::Get("Password");
|
||||||
|
if (($this->mode !== "del") and !empty($pass)) {
|
||||||
|
$this->db->runQuery("UPDATE app_operator SET Password=MD5(?) WHERE Username=?", [$pass, Param::Get("Username")]);
|
||||||
|
}
|
||||||
|
$this->app->json([ 'status' => true ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function save_menu() {
|
||||||
|
$amenu = explode(",", (string) Param::Get("Menu")); $ahasil = [];
|
||||||
|
$amodul = $this->db->fetchAll("SELECT * FROM app_menu WHERE Level=0 AND Modul<>'IND' AND Aktif=1 ORDER BY Urut ASC");
|
||||||
|
foreach ($amodul as $modul) {
|
||||||
|
$akode = $this->db->fetchColumn("SELECT Kode FROM app_menu WHERE Modul=? AND Level>0 AND Aktif=1 ORDER BY Kode", [$modul['Modul']]);
|
||||||
|
$asub = array_intersect($amenu, $akode);
|
||||||
|
if (count($asub)>0) $ahasil = array_merge($ahasil, [$modul['Kode']], $asub);
|
||||||
|
}
|
||||||
|
$this->db->runQuery("UPDATE app_operator SET Menu=ENCODE('".implode(",",$ahasil)."',?),DateStamp=NOW(),SuperID=? WHERE UserID=?", [$this->parent_code, $this->session->get('WEB_USER')['UserID'], $this->id_user]);
|
||||||
|
$this->app->json([ 'status' => true ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function check_user() {
|
||||||
|
$ada = (int) $this->db->fetchField("SELECT COUNT(*) FROM app_operator WHERE Username=?", [Param::Get("Username")]) > 0;
|
||||||
|
$this->app->json([ 'ada' => $ada ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function modul_gen(array $alist = [], array $amenu = [], array $aglist = []): string {
|
||||||
|
$hasil = '<table class="table table-striped table-bordered table-hover">';
|
||||||
|
$hasil .= '<thead><tr><th>Nama Menu</th><th>Keterangan</th><th width="30"><input type="checkbox" class="form-check-input cek-modul mx-2" omodul="'.$alist[0]['Modul'].'" /></th><th width="30"><input type="checkbox" class="form-check-input mx-2" disabled /></th></tr></thead><tbody>';
|
||||||
|
foreach ($alist as $list) {
|
||||||
|
$checked = (in_array($list['Kode'], $amenu)) ? "checked" : "";
|
||||||
|
$gchecked = (in_array($list['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("--", $list['Level']-1)."> ".$list['Menu'], $list['Judul'], $list['Modul'], $list['Kode'], $checked, $gchecked);
|
||||||
|
}
|
||||||
|
$hasil .= '</tbody></table>';
|
||||||
|
return $hasil;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$this->app->json([
|
||||||
|
'html' => '
|
||||||
|
<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" value="99"></div></div><div id="divDetail"> </div></div></div>
|
||||||
|
</div>'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,128 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/System/PrinterController
|
||||||
|
Description : Printer POS
|
||||||
|
Created By : Siau Pheng (siaupheng@3fonia.com).
|
||||||
|
Created Date : August 4th, 2013.
|
||||||
|
Last Modified : October 12th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\System;
|
||||||
|
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\Session;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use Webapp\DB\SQL;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
use Webapp\Web\Table;
|
||||||
|
use App\Utils\Invesa;
|
||||||
|
|
||||||
|
class PrinterController {
|
||||||
|
|
||||||
|
private string $mode;
|
||||||
|
private string $id_reg;
|
||||||
|
private string $curr_id_reg;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
protected Session $session;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->session = $session;
|
||||||
|
$this->mode = Param::Get("mode", "");
|
||||||
|
$this->curr_id_reg = (string) $session->get('WEB_APP')['REG_ID'];
|
||||||
|
$this->id_reg = Param::Get("REG_ID", $this->curr_id_reg);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_printer() {
|
||||||
|
if ( $this->mode === "save" ) {
|
||||||
|
$sql = new SQL($this->app);
|
||||||
|
$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_BEGIN");
|
||||||
|
$sql->add_param("TITLE_END");
|
||||||
|
$sql->add_where("REG_ID");
|
||||||
|
$sql->UpdateDB();
|
||||||
|
|
||||||
|
if ($this->id_reg === $this->curr_id_reg) {
|
||||||
|
$_sess = $this->session->get('APP_INV', []);
|
||||||
|
$_sess['PRINT_AUTO'] = Param::Get("PRINT_AUTO", 1);
|
||||||
|
$_sess['PRINT_OPENCD'] = Param::Get("PRINT_OPENCD", 1);
|
||||||
|
$_sess['PRINT_AUTOCUT'] = Param::Get("PRINT_AUTOCUT", 1);
|
||||||
|
$_sess['PRINT_ROW'] = Param::Get("PRINT_ROW", 0);
|
||||||
|
$_sess['TITLE_BEGIN'] = Param::Get("TITLE_BEGIN", "");
|
||||||
|
$_sess['TITLE_END'] = Param::Get("TITLE_END", "");
|
||||||
|
$this->session->set('APP_INV', $_sess);
|
||||||
|
}
|
||||||
|
|
||||||
|
$ajson['sukses'] = true;
|
||||||
|
$this->mode = "view";
|
||||||
|
}
|
||||||
|
|
||||||
|
$para = [];
|
||||||
|
if ($this->id_reg > 0) {
|
||||||
|
$para = $this->db->fetchRow("SELECT * FROM inv_config WHERE REG_ID=?", [$this->id_reg]);
|
||||||
|
$para['Nama_Cab'] = $this->db->fetchField("SELECT Nama_Cab FROM para_cabang WHERE CabID=?", [$para['CABANGID']]) ?? '';
|
||||||
|
}
|
||||||
|
|
||||||
|
$benable = ($this->mode === "edit") ? true : false;
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$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]);
|
||||||
|
$ftitlebegin = $form->textbox("_", "TITLE_BEGIN", $para['TITLE_BEGIN'], $benable, false, "text", "catatan atas struk");
|
||||||
|
$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;">Header Struk</span>'.$ftitlebegin.Invesa::Form_Info("Gunakan [br] untuk header yang terdiri dari beberapa baris.").'</div></div>
|
||||||
|
</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.Invesa::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.Invesa::Form_Info("Jumlah baris kosong dibawah struk/nota sebelum potong.").'</div></div>
|
||||||
|
</div>
|
||||||
|
<input type="hidden" id="mode" value="'.$this->mode.'" >';
|
||||||
|
$ajson['Nama_Cab'] = $para['Nama_Cab'];
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function brow_cabang() {
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("(SELECT * FROM para_cabang WHERE Aktif=1) C LEFT JOIN inv_config G ON (G.CABANGID=C.CabID)", "C.*,G.REG_ID");
|
||||||
|
$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->set_func_select("PrinterJS.cab_select");
|
||||||
|
$this->app->json([ $obj->json_table("divBrowCab") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$this->app->json(['html' =>
|
||||||
|
'<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"><i class="bi-search"></i></button></div></div></div><div class="card"><div class="card-body"><div id="divPrinter"> </div><input type="hidden" id="REG_ID" value="'.$this->id_reg.'"></div></div>'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,61 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/System/SuperController
|
||||||
|
Description : Supervisi Operator
|
||||||
|
Created By : Siau Pheng (siaupheng@3fonia.com).
|
||||||
|
Created Date : September 11st, 2012.
|
||||||
|
Last Modified : August 29th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\System;
|
||||||
|
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\Session;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
use Webapp\Web\Table;
|
||||||
|
|
||||||
|
class SuperController {
|
||||||
|
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function approve() {
|
||||||
|
$this->db->runQuery('UPDATE app_auth SET Auth=1,SuperID=? WHERE AuthID=?', [$this->app->user()->id(), Param::Get("AuthID",0)]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function table_detail() {
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table('(SELECT AuthID,UserID,Kode,DATE_FORMAT(Tanggal,"%d-%m-%Y %H:%i:%s") Tanggal,REQ,Catatan FROM app_auth WHERE Auth=0) A LEFT JOIN app_operator O ON (A.UserID=O.UserID) LEFT JOIN app_menu M ON (A.Kode=M.Kode)', 'A.*,O.Nama Nama_User,M.Judul');
|
||||||
|
$obj->add_field("AuthID", "ID", "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");
|
||||||
|
$ajson[] = $obj->json_table("divSuper");
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$this->app->json([
|
||||||
|
'html' => '
|
||||||
|
<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"> </div></div></div>
|
||||||
|
</div>'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,83 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Table/Gel/GajiController
|
||||||
|
Description : Master Standar Gaji
|
||||||
|
Created By : Siau Pheng (siaupheng@3fonia.com).
|
||||||
|
Created Date : September 17th, 2014.
|
||||||
|
Last Modified : September 4th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Table\Gel;
|
||||||
|
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use flight\Session;
|
||||||
|
use Webapp\DB\SQL;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
|
||||||
|
class GajiController {
|
||||||
|
|
||||||
|
private string $mode_detail;
|
||||||
|
private int $id_reg;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->mode_detail = Param::Get("mode_detail", "");
|
||||||
|
$this->id_reg = Param::Int("REG_ID", $session->get('WEB_APP')['REG_ID']);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_gaji() {
|
||||||
|
if ( $this->mode_detail == "save" ) {
|
||||||
|
$sql = new SQL($this->app);
|
||||||
|
$sql->set_table("gel_config");
|
||||||
|
$sql->add_param("LEMBUR");
|
||||||
|
$sql->add_param("BONUS1");
|
||||||
|
$sql->add_param("BONUS2");
|
||||||
|
$sql->add_where("REG_ID");
|
||||||
|
$sql->UpdateDB();
|
||||||
|
$this->mode_detail = "view";
|
||||||
|
}
|
||||||
|
|
||||||
|
$atabel = [ 'REG_ID'=>0, 'LEMBUR'=>0, 'BONUS1'=>0, 'BONUS2'=>0 ];
|
||||||
|
if ($this->id_reg > 0) {
|
||||||
|
$atabel = $this->db->fetchRow("SELECT * FROM gel_config WHERE REG_ID=?", [$this->id_reg]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$benable = ($this->mode_detail === "update") ? true : false;
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tlembur = $form->textbox("_", "LEMBUR", $atabel['LEMBUR'], $benable, false, "double", "nilai lembur harian");
|
||||||
|
$tbonus1 = $form->textbox("_", "BONUS1", $atabel['BONUS1'], $benable, false, "double", "nilai bonus mingguan");
|
||||||
|
$tbonus2 = $form->textbox("_", "BONUS2", $atabel['BONUS2'], $benable, false, "double", "nilai bonus bulanan");
|
||||||
|
$ajson['html'] = '
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-6 col-lg-5 col-form-label" for="LEMBUR">Lembur Harian</label>
|
||||||
|
<div class="col">'.$tlembur.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-6 col-lg-5 col-form-label" for="BONUS1">Bonus Mingguan</label>
|
||||||
|
<div class="col">'.$tbonus1.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-6 col-lg-5 col-form-label" for="BONUS2">Bonus Bulanan</label>
|
||||||
|
<div class="col">'.$tbonus2.'</div>
|
||||||
|
</div>
|
||||||
|
<input type="hidden" id="REG_ID" value="'.$atabel['REG_ID'].'" >
|
||||||
|
<input type="hidden" id="mode_detail" value="'.$this->mode_detail.'" >';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$this->app->json(['html' => '<div id="divMaster"> </div>' ]);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,105 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
// PHP Class : /Controller/Table/Gel/GrupController
|
||||||
|
Description : Master Grup Rekening
|
||||||
|
Created By : Siau Pheng (siaupheng@3fonia.com).
|
||||||
|
Created Date : May 19th, 2010.
|
||||||
|
Last Modified : September 4th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Table\Gel;
|
||||||
|
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use Webapp\DB\SQL;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
use Webapp\Web\Table;
|
||||||
|
|
||||||
|
class GrupController {
|
||||||
|
|
||||||
|
private string $mode_detail;
|
||||||
|
private int $id_grup;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->mode_detail = Param::Get("mode_detail", "");
|
||||||
|
$this->id_grup = Param::Int("Grup_RekID", 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function table_detail() {
|
||||||
|
if (in_array($this->mode_detail, ["insert","update","delete"])) {
|
||||||
|
$sql = new SQL($this->app);
|
||||||
|
$sql->set_table("gel_acc_grup");
|
||||||
|
$sql->add_param("Nama_Grup");
|
||||||
|
$sql->add_param("Aktif");
|
||||||
|
$sql->add_param_userid();
|
||||||
|
$sql->add_where("Grup_RekID");
|
||||||
|
|
||||||
|
if ($this->mode_detail === "insert") {
|
||||||
|
$sql->InsertDB();
|
||||||
|
} else if ($this->mode_detail === "update") {
|
||||||
|
$sql->UpdateDB();
|
||||||
|
} else if ($this->mode_detail === "delete") {
|
||||||
|
$sql->DeleteDB();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$tcari = Param::Get("Cari_Rek");
|
||||||
|
$tsql = ''; $asql = [];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql = 'Nama_Grup LIKE ?';
|
||||||
|
$asql[] = '%'. $tcari .'%';
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("gel_acc_grup", "*", $tsql, $asql);
|
||||||
|
$obj->add_field("Grup_RekID", "ID", "hid");
|
||||||
|
$obj->add_field("Nama_Grup", "Nama Grup Rekening", "awr");
|
||||||
|
$obj->add_field("Aktif", "Aktif", "c", "checkbox");
|
||||||
|
$obj->set_field_order("Nama_Grup", "A");
|
||||||
|
$obj->add_row_btn("clipboard", "Ubah", "RekGrupJS.detail_ubah");
|
||||||
|
$obj->add_row_btn("trash", "Hapus", "RekGrupJS.detail_hapus");
|
||||||
|
$obj->set_func_btn("RekGrupJS.detail_tambah", "+ Grup Rekening");
|
||||||
|
$this->app->json([ $obj->json_table("divDetail") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_grup() {
|
||||||
|
$atabel = [ 'Grup_RekID'=>0, 'Nama_Grup'=>"", 'Aktif'=>1 ];
|
||||||
|
if ($this->id_grup > 0) {
|
||||||
|
$atabel = $this->db->fetchRow("SELECT * FROM gel_acc_Grup WHERE Grup_RekID=?", [$this->id_grup]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tnama = $form->textbox("_", "Nama_Grup", $atabel['Nama_Grup'], true, true, "text", "nama grup rekening");
|
||||||
|
$taktif = $form->radio("_", "Aktif", $atabel['Aktif'], true, false, [1=>"Aktif",0=>"Tidak"]);
|
||||||
|
$ajson['html'] = '
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="Nama_Grup">Nama Grup</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 d-flex gap-2">'.$taktif.'</div>
|
||||||
|
</div>
|
||||||
|
<input type="hidden" id="Grup_RekID" value="'.$atabel['Grup_RekID'].'" >
|
||||||
|
<input type="hidden" id="mode_detail" value="'.$this->mode_detail.'" >';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$this->app->json(['html' => '
|
||||||
|
<div class="fade-in"><div class="card"><div class="card-header custom-style">Daftar Grup Rekening</div><div class="card-body"><div class="row mb-1"><div class="col"><div class="input-group"><input class="form-control" id="Cari_Rek" 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"> </div></div></div></div>'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,126 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Table/Gel/KaryawanController
|
||||||
|
Description : Master Standar Gaji
|
||||||
|
Created By : Siau Pheng (siaupheng@3fonia.com).
|
||||||
|
Created Date : September 17th, 2014.
|
||||||
|
Last Modified : September 4th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Table\Gel;
|
||||||
|
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use Webapp\DB\SQL;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
use Webapp\Web\Table;
|
||||||
|
|
||||||
|
class KaryawanController {
|
||||||
|
|
||||||
|
private string $mode_detail;
|
||||||
|
private int $id_karya;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->mode_detail = Param::Get("mode_detail", "");
|
||||||
|
$this->id_karya = Param::Int("KaryaID", 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function table_detail() {
|
||||||
|
if (in_array($this->mode_detail, ["insert","update","delete"])) {
|
||||||
|
$sql = new SQL($this->app);
|
||||||
|
$sql->set_table("para_karyawan");
|
||||||
|
$sql->add_param("Nama_Karya");
|
||||||
|
$sql->add_param("Gaji_Harian");
|
||||||
|
$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 ($this->mode_detail === "insert") {
|
||||||
|
$sql->InsertDB();
|
||||||
|
} else if ($this->mode_detail === "update") {
|
||||||
|
$sql->UpdateDB();
|
||||||
|
} else if ($this->mode_detail === "delete") {
|
||||||
|
$sql->DeleteDB();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$tcari = Param::Get("Cari_Karya");
|
||||||
|
$tsql = ''; $asql = [];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql = 'Nama_Karya LIKE ?';
|
||||||
|
$asql[] = '%'. $tcari .'%';
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("para_karyawan", "*", $tsql, $asql);
|
||||||
|
$obj->add_field("KaryaID", "ID", "hid");
|
||||||
|
$obj->add_field("Nama_Karya", "Nama Karyawan", "awr");
|
||||||
|
$obj->add_field("Gaji_Harian", "Gaji Harian", "r", "rupiah");
|
||||||
|
$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_btn("KaryawanJS.detail_tambah", "+ Karyawan");
|
||||||
|
$this->app->json([ $obj->json_table("divDetail") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_karya() {
|
||||||
|
$atabel = [ 'KaryaID'=>0, 'Nama_Karya'=>"", 'Gaji_Harian'=>0, 'Tgl_Masuk'=>tgl_ymd(), 'Tgl_Keluar'=>'0000-00-00', 'Aktif'=>1 ];
|
||||||
|
if ($this->id_karya > 0) {
|
||||||
|
$atabel = $this->db->fetchRow("SELECT * FROM para_karyawan WHERE KaryaID=?", [$this->id_karya]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tnama = $form->textbox("_", "Nama_Karya", $atabel['Nama_Karya'], true, true, "text", "nama karyawan");
|
||||||
|
$tgaji = $form->textbox("_", "Gaji_Harian", $atabel['Gaji_Harian'], true, true, "double", "gaji harian");
|
||||||
|
$tmasuk = $form->datebox("_", "Tgl_Masuk", $atabel['Tgl_Masuk'], true, false);
|
||||||
|
$tkeluar = $form->datebox("_", "Tgl_Keluar", $atabel['Tgl_Keluar'], true, false);
|
||||||
|
$taktif = $form->radio("_", "Aktif", $atabel['Aktif'], true, true, ['1'=>"Aktif",'0'=>"Tidak"]);
|
||||||
|
$ajson['html'] = '
|
||||||
|
<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="Gaji_Harian">Gaji Harian</label>
|
||||||
|
<div class="col-sm-6 col-lg-5">'.$tgaji.'</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 d-flex gap-2">'.$taktif.'</div>
|
||||||
|
</div>
|
||||||
|
<input type="hidden" id="KaryaID" value="'.$atabel['KaryaID'].'" >
|
||||||
|
<input type="hidden" id="mode_detail" value="'.$this->mode_detail.'" >';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$this->app->json(['html' => '
|
||||||
|
<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"> </div></div></div></div>'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,210 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Table/Gel/RekController
|
||||||
|
Description : Master Rekening
|
||||||
|
Created By : Siau Pheng (siaupheng@3fonia.com).
|
||||||
|
Created Date : December 7th, 2010.
|
||||||
|
Last Modified : September 4th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Table\Gel;
|
||||||
|
|
||||||
|
use App\Utils\Invesa;
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use flight\Session;
|
||||||
|
use Webapp\DB\SQL;
|
||||||
|
use Webapp\Printer\PrintHTML;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
use Webapp\Web\Table;
|
||||||
|
|
||||||
|
class RekController {
|
||||||
|
|
||||||
|
private string $reg_name;
|
||||||
|
private int $max_level;
|
||||||
|
private string $mode_detail;
|
||||||
|
private string $kode_rek;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->reg_name = (string) $session->get('WEB_APP')['REG_NAME'];
|
||||||
|
$this->max_level = (int) $session->get('APP_GEL')['MAX_LEVEL'] ?? 5;
|
||||||
|
$this->mode_detail = Param::Get("mode_detail", "");
|
||||||
|
$this->kode_rek = Param::Get("Kode_Rek", "");
|
||||||
|
}
|
||||||
|
|
||||||
|
public function table_detail() {
|
||||||
|
if (in_array($this->mode_detail, ["insert","update","delete"])) {
|
||||||
|
$sql = new SQL($this->app);
|
||||||
|
$sql->set_table("gel_acc");
|
||||||
|
$sql->add_param("Kode_Induk");
|
||||||
|
$sql->add_param("Nama_Rek");
|
||||||
|
$sql->add_param("Grup_RekID");
|
||||||
|
$sql->add_param("Level");
|
||||||
|
$sql->add_param("Mode");
|
||||||
|
$sql->add_param("Kas_Rek");
|
||||||
|
$sql->add_param("Aktif");
|
||||||
|
$sql->add_param_userid();
|
||||||
|
$sql->add_where("Kode_Rek");
|
||||||
|
|
||||||
|
if ($this->mode_detail === "insert") {
|
||||||
|
$sql->add_param("Kode_Rek");
|
||||||
|
$sql->InsertDB();
|
||||||
|
} else if ($this->mode_detail === "update") {
|
||||||
|
$sql->UpdateDB();
|
||||||
|
} else if ($this->mode_detail === "delete") {
|
||||||
|
$sql->DeleteDB();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$tcari = Param::Get("Cari_Rek");
|
||||||
|
$tsql = ''; $asql = [];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql = 'CONCAT(A.Kode_Rek,A.Nama_Rek) LIKE ?';
|
||||||
|
$asql[] = '%'. $tcari .'%';
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("gel_acc A LEFT JOIN gel_acc_grup G ON (A.Grup_RekID=G.Grup_RekID)", "A.*,G.Nama_Grup", $tsql, $asql);
|
||||||
|
$obj->add_field("Kode_Rek", "Kode", "c");
|
||||||
|
$obj->add_field("Nama_Rek", "Nama Rekening", "awr");
|
||||||
|
$obj->add_field("Nama_Grup", "Grup", "l");
|
||||||
|
$obj->add_field("Level", "Level", "c");
|
||||||
|
$obj->add_field("Mode", "Mode", "c");
|
||||||
|
$obj->add_field("Aktif", "Aktif", "c", "checkbox");
|
||||||
|
$obj->set_row_color("Mode", "G", "rblue");
|
||||||
|
$obj->set_field_order("Kode_Rek", "A");
|
||||||
|
$obj->add_row_btn("clipboard", "Ubah", "RekJS.detail_ubah");
|
||||||
|
$obj->add_row_btn("trash", "Hapus", "RekJS.detail_hapus");
|
||||||
|
$obj->set_func_btn("RekJS.detail_tambah", "+ Rekening");
|
||||||
|
$this->app->json([ $obj->json_table("divDetail") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_rek() {
|
||||||
|
$atabel = [ 'Kode_Rek'=>0, 'Nama_Rek'=>"", 'Kode_Induk'=>0, 'Grup_RekID'=>0, 'Level'=>1, 'Mode'=>"D", 'Kas_Rek'=>0, 'Aktif'=>1 ];
|
||||||
|
if (!empty($this->kode_rek)) {
|
||||||
|
$atabel = $this->db->fetchRow("SELECT * FROM gel_acc WHERE Kode_Rek=?", [$this->kode_rek]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tgrup = $form->option_db("_", "Grup_RekID", $atabel['Grup_RekID'], true, false, "gel_acc_grup", ["Grup_RekID","Nama_Grup"], "Aktif=1 ORDER BY Grup_RekID");
|
||||||
|
$tinduk = $form->option_db("_", "Kode_Induk", $atabel['Kode_Induk'], true, false, "gel_acc", ["Kode_Rek","Nama_Rek"], "Mode='G' AND Aktif=1 ORDER BY Kode_Rek", [0,"TOP LEVEL"]);
|
||||||
|
$tkode = $form->textbox("_", "Kode_Rek", $atabel['Kode_Rek'], true, false, "text", "kode rekening");
|
||||||
|
$tnama = $form->textbox("_", "Nama_Rek", $atabel['Nama_Rek'], true, true, "text", "nama rekening");
|
||||||
|
$tlevel = $form->option("_", "Level", $atabel['Level'], true, false, $this->Level_Array());
|
||||||
|
$tmode = $form->radio("_", "Mode", $atabel['Mode'], true, true, ['G'=>"Grup",'D'=>"Detail"]);
|
||||||
|
$tkas_rek = $form->radio("_", "Kas_Rek", $atabel['Kas_Rek'], true, true, ['1'=>"Ya",'0'=>"Tidak"]);
|
||||||
|
$taktif = $form->radio("_", "Aktif", $atabel['Aktif'], true, true, ['1'=>"Aktif",'0'=>"Tidak"]);
|
||||||
|
$ajson['html'] = '
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-5 col-lg-2 col-form-label" for="Grup_RekID">Grup Rekening</label>
|
||||||
|
<div class="col-sm-7 col-lg-4">'.$tgrup.'</div>
|
||||||
|
<label class="col-sm-5 col-lg-2 col-form-label" for="Aktif">Status Aktif ?</label>
|
||||||
|
<div class="col d-flex gap-2">'.$taktif.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-5 col-lg-2 col-form-label" for="Kode_Rek">Kode Rekening</label>
|
||||||
|
<div class="col-sm-7 col-lg-4">'.$tkode.'</div>
|
||||||
|
<label class="col-sm-5 col-lg-2 col-form-label" for="Kas_Rek">Rekening Kas ?</label>
|
||||||
|
<div class="col d-flex gap-2">'.$tkas_rek.Invesa::Form_Info("Rekening untuk Transaksi Penerimaan / Pembayaran.").'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-5 col-lg-2 col-form-label" for="Kode_Induk">Rekening Induk</label>
|
||||||
|
<div class="col-sm-7 col-lg-10">'.$tinduk.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-5 col-lg-2 col-form-label" for="Nama_Rek">Nama Rekening</label>
|
||||||
|
<div class="col-sm-7 col-lg-10">'.$tnama.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-5 col-lg-2 col-form-label" for="Level">Level Rekening</label>
|
||||||
|
<div class="col-sm-7 col-lg-4">'.$tlevel.'</div>
|
||||||
|
<label class="col-sm-5 col-lg-2 col-form-label" for="Mode">Mode Rekening</label>
|
||||||
|
<div class="col d-flex gap-2">'.$tmode.'</div>
|
||||||
|
</div>
|
||||||
|
<input type="hidden" id="mode_detail" value="'.$this->mode_detail.'" />';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function detail_print() {
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tgrup = $form->option_db("_", "Grup_RekID", 0, true, false, "gel_acc_grup", ["Grup_RekID","Nama_Grup"], "Aktif=1 ORDER BY Grup_RekID", [0, "SEMUA GRUP"]);
|
||||||
|
$tlevel = $form->option("_", "Level", $this->max_level, true, false, $this->Level_Array());
|
||||||
|
$ttgl = $form->datebox("_", "Tgl_Cetak", tgl_ymd(), true, false);
|
||||||
|
$ajson['html'] = '
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="Grup_RekID">Grup Rekening</label>
|
||||||
|
<div class="col">'.$tgrup.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="Level">Level Rekening</label>
|
||||||
|
<div class="col col-form-label">'.$tlevel.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="Tgl_Cetak">Tanggal Cetak</label>
|
||||||
|
<div class="col-sm-4 col-lg-4">'.$ttgl.'</div>
|
||||||
|
</div>';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function print_rek() {
|
||||||
|
$id_grup = Param::Get("Grup_RekID", 0);
|
||||||
|
$level = Param::Get("Level", 0);
|
||||||
|
$nama_grup = "";
|
||||||
|
if ($id_grup > 0) $nama_grup = $this->db->fetchField("SELECT Nama_Grup FROM gel_acc_grup WHERE Grup_RekID=?", [$id_grup]);
|
||||||
|
|
||||||
|
// generate report header
|
||||||
|
$tglheader = "Tanggal Cetak : ".Param::Get("Tgl_Cetak");
|
||||||
|
$tsql = ''; $asql = [];
|
||||||
|
if ($id_grup > 0) { $tsql .= " AND Grup_RekID=?"; $asql[] = $id_grup; }
|
||||||
|
if ($level > 0) { $tsql .= " AND Level<=?"; $asql[] = $level; }
|
||||||
|
$tsql = (strlen($tsql) > 0) ? ' WHERE '.substr($tsql, 4) : '';
|
||||||
|
|
||||||
|
// query data laporan
|
||||||
|
$stat = $this->db->runQuery("SELECT A.*,G.Nama_Grup FROM (SELECT * FROM gel_acc".$tsql.") A LEFT JOIN gel_acc_grup G ON (A.Grup_RekID=G.Grup_RekID) ORDER BY A.Kode_Rek ASC", $asql);
|
||||||
|
|
||||||
|
$pre = new PrintHTML($this->app);
|
||||||
|
$pre->add_title([strtoupper($this->reg_name), "Laporan Daftar Rekening", $tglheader]);
|
||||||
|
|
||||||
|
$pre->add_field("No",10,"C");
|
||||||
|
$pre->add_field("Kode",20, "C");
|
||||||
|
$pre->add_field("Nama Rekening",80, "L");
|
||||||
|
$pre->add_field("Grup",50, "L");
|
||||||
|
$pre->add_field("Level",20, "C");
|
||||||
|
$pre->add_field("Mode",20, "C");
|
||||||
|
|
||||||
|
if ($id_grup > 0) $pre->add_sub_title("Grup Rekening : ".$nama_grup);
|
||||||
|
|
||||||
|
$pre->show_titles();
|
||||||
|
$pre->show_headers();
|
||||||
|
|
||||||
|
$nomor = 1; $strpad = " ";
|
||||||
|
while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$pre->add_row([ $nomor++, $row['Kode_Rek'], str_repeat($strpad, (int) $row['Level']-1).$row['Nama_Rek'], $row['Nama_Grup'], $row['Level'], $row['Mode'] ]);
|
||||||
|
}
|
||||||
|
$pre->add_stamp(0, true);
|
||||||
|
$pre->show();
|
||||||
|
}
|
||||||
|
|
||||||
|
private function Level_Array($item = -1) {
|
||||||
|
$_alevel = []; for ($i=1; $i<=$this->max_level; $i++) $_alevel[$i] = "Level ".$i;
|
||||||
|
return ($item == -1) ? $_alevel : $_alevel[$item];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$this->app->json(['html' => '
|
||||||
|
<div class="fade-in"><div class="card"><div class="card-header custom-style">Daftar Rekening</div><div class="card-body"><div class="row mb-1"><div class="col-10"><div class="input-group"><input class="form-control" id="Cari_Rek" 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-2 btn-group"><button class="btn btn-info shadow-none" type="button" id="butPrint"><i class="bi-printer me-2"></i>Cetak</button></div></div><div id="divDetail"> </div></div></div></div>'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,215 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Table/Member/MemberController
|
||||||
|
Description : Master Member
|
||||||
|
Created By : Siau Pheng (siaupheng@3fonia.com).
|
||||||
|
Created Date : December 7th, 2010.
|
||||||
|
Last Modified : September 3rd, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Table\Member;
|
||||||
|
|
||||||
|
use App\Utils\Invesa;
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use flight\Session;
|
||||||
|
use Webapp\DB\SQL;
|
||||||
|
use Webapp\Printer\PrintHTML;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
use Webapp\Web\Table;
|
||||||
|
|
||||||
|
class MemberController {
|
||||||
|
|
||||||
|
private string $reg_name;
|
||||||
|
private string $mode_detail;
|
||||||
|
private int $id_member;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->reg_name = (string) $session->get('WEB_APP')['REG_NAME'];
|
||||||
|
$this->mode_detail = Param::Get("mode_detail", "");
|
||||||
|
$this->id_member = (int) Param::Get("MemberID", 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function table_detail() {
|
||||||
|
if (in_array($this->mode_detail, ["insert","update","delete"])) {
|
||||||
|
$sql = new SQL($this->app);
|
||||||
|
$sql->set_table("para_member");
|
||||||
|
$sql->add_param("Grup_MemberID");
|
||||||
|
$sql->add_param("Kode_Member");
|
||||||
|
$sql->add_param("Nama_Member");
|
||||||
|
$sql->add_param("Alamat_Member");
|
||||||
|
$sql->add_param("Kota_Member");
|
||||||
|
$sql->add_param("Telp_Member");
|
||||||
|
$sql->add_param("KTP_Member");
|
||||||
|
$sql->add_param_date("Tgl_Lahir");
|
||||||
|
$sql->add_param_date("Tgl_Daftar");
|
||||||
|
$sql->add_param("IM");
|
||||||
|
$sql->add_param("Aktif");
|
||||||
|
$sql->add_param_userid();
|
||||||
|
$sql->add_where("MemberID");
|
||||||
|
|
||||||
|
if ($this->mode_detail === "insert") {
|
||||||
|
$sql->InsertDB();
|
||||||
|
} else if ($this->mode_detail === "update") {
|
||||||
|
$sql->UpdateDB();
|
||||||
|
} else if ($this->mode_detail === "delete") {
|
||||||
|
$sql->DeleteDB();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$tcari = Param::Get("Cari_Member");
|
||||||
|
$tsql = ''; $asql = [];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql = 'CONCAT(Kode_Member,Nama_Member,Telp_Member) LIKE ?';
|
||||||
|
$asql[] = '%'. $tcari .'%';
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("para_member", "*", $tsql, $asql);
|
||||||
|
$obj->add_field("MemberID", "ID", "hid");
|
||||||
|
$obj->add_field("Kode_Member", "Kode / ID", "c");
|
||||||
|
$obj->add_field("Nama_Member", "Nama Member", "awr");
|
||||||
|
$obj->add_field("Alamat_Member", "Alamat", "awr");
|
||||||
|
$obj->add_field("Telp_Member", "No. Telp", "l");
|
||||||
|
$obj->add_field("IM", "Member", "c", "checkbox");
|
||||||
|
$obj->add_field("Aktif", "Aktif", "c", "checkbox");
|
||||||
|
$obj->set_field_order("Kode_Member", "A");
|
||||||
|
$obj->add_row_btn("clipboard", "Ubah", "MemberJS.detail_ubah");
|
||||||
|
$obj->add_row_btn("trash", "Hapus", "MemberJS.detail_hapus");
|
||||||
|
$obj->set_func_btn("MemberJS.detail_tambah", "+ Member");
|
||||||
|
$this->app->json([ $obj->db_table("divDetail") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_member() {
|
||||||
|
$atabel = Invesa::A_Member_Member();
|
||||||
|
if ($this->id_member > 0) {
|
||||||
|
$atabel = $this->db->fetchRow("SELECT * FROM para_member WHERE MemberID=?", [$this->id_member]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tgrup = $form->option_db("_", "Grup_MemberID", $atabel['Grup_MemberID'], true, false, "para_member_grup", ["Grup_MemberID","Nama_Grup"], "Aktif=1 ORDER BY Nama_Grup");
|
||||||
|
$tkode = $form->textbox("_", "Kode_Member", $atabel['Kode_Member'], true, false, "text", "kode member");
|
||||||
|
$tnama = $form->textbox("_", "Nama_Member", $atabel['Nama_Member'], true, true, "text", "nama member");
|
||||||
|
$talamat = $form->textarea("_", "Alamat_Member", $atabel['Alamat_Member'], true, true, 2);
|
||||||
|
$tkota = $form->textbox("_", "Kota_Member", $atabel['Kota_Member'], true, true, "text", "kota member");
|
||||||
|
$ttelp = $form->textbox("_", "Telp_Member", $atabel['Telp_Member'], true, true, "text", "telp member");
|
||||||
|
$tktp = $form->textbox("_", "KTP_Member", $atabel['KTP_Member'], true, true, "text", "ktp member");
|
||||||
|
$tlahir = $form->datebox("_", "Tgl_Lahir", $atabel['Tgl_Lahir'], true, true);
|
||||||
|
$tdaftar = $form->datebox("_", "Tgl_Daftar", $atabel['Tgl_Daftar'], true, true);
|
||||||
|
$tim = $form->checkbox("_", "IM", $atabel['IM'], true, true, [1,0]);
|
||||||
|
$taktif = $form->radio("_", "Aktif", $atabel['Aktif'], true, true, [1=>"Ya",0=>"Tidak"]);
|
||||||
|
$ajson['html'] = '
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-5 col-lg-2 col-form-label" for="Grup_MemberID">Grup Member</label>
|
||||||
|
<div class="col-sm-7 col-lg-4">'.$tgrup.'</div>
|
||||||
|
<label class="col-sm-5 col-lg-2 col-form-label" for="Aktif">Status Aktif ?</label>
|
||||||
|
<div class="col-sm-7 col-lg-4 d-flex gap-2">'.$taktif.'<div class="col-form-label ms-auto me-2">Member ?</div>'.$tim.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-5 col-lg-2 col-form-label" for="Kode_Member">Kode / ID Member</label>
|
||||||
|
<div class="col-sm-7 col-lg-4"><div class="input-group">'.$tkode.Invesa::Form_Info("Kode / ID Barcode Member (Scan dari Kartu Member). Contoh : 17000017.").'</div></div>
|
||||||
|
<label class="col-sm-5 col-lg-2 col-form-label" for="Tgl_Daftar">Tanggal Daftar</label>
|
||||||
|
<div class="col-sm-7 col-lg-4">'.$tdaftar.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-5 col-lg-2 col-form-label" for="KTP_Member">No. KTP / SIM</label>
|
||||||
|
<div class="col-sm-7 col-lg-4">'.$tktp.'</div>
|
||||||
|
<label class="col-sm-5 col-lg-2 col-form-label" for="Tgl_Lahir">Tanggal Lahir</label>
|
||||||
|
<div class="col-sm-7 col-lg-4">'.$tlahir.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-5 col-lg-2 col-form-label" for="Nama_Member">Nama Member</label>
|
||||||
|
<div class="col-sm-7 col-lg-10">'.$tnama.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-5 col-lg-2 col-form-label" for="Alamat_Member">Alamat Member</label>
|
||||||
|
<div class="col-sm-7 col-lg-10">'.$talamat.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-5 col-lg-2 col-form-label" for="Kota_Member">Kota Member</label>
|
||||||
|
<div class="col-sm-7 col-lg-4">'.$tkota.'</div>
|
||||||
|
<label class="col-sm-5 col-lg-2 col-form-label" for="Telp_Member">Telp. Member</label>
|
||||||
|
<div class="col-sm-7 col-lg-4">'.$ttelp.'</div>
|
||||||
|
</div>
|
||||||
|
<input type="hidden" id="MemberID" value="'.$atabel['MemberID'].'" />
|
||||||
|
<input type="hidden" id="mode_detail" value="'.$this->mode_detail.'" />';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function detail_print() {
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tgrup = $form->option_db("_", "Grup_MemberID", 0, true, false, "para_member_grup", ["Grup_MemberID","Nama_Grup"], "Aktif=1 ORDER BY Nama_Grup", [0,"SEMUA GRUP MEMBER"]);
|
||||||
|
$taktif = $form->radio("_", "Aktif", 9, true, true, [9=>"Semua",'1'=>"Ya",'0'=>"Tidak"]);
|
||||||
|
$ttgl = $form->datebox("_", "Tgl_Cetak", tgl_ymd(), true, false);
|
||||||
|
$ajson['html'] = '
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="Grup_MemberID">Grup Member</label>
|
||||||
|
<div class="col">'.$tgrup.'</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 d-flex gap-2">'.$taktif.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="Tgl_Cetak">Tanggal Cetak</label>
|
||||||
|
<div class="col-sm-4 col-lg-4">'.$ttgl.'</div>
|
||||||
|
</div>';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function print_member() {
|
||||||
|
$id_grup = Param::Get("Grup_MemberID", 0);
|
||||||
|
$aktif = Param::Get("Aktif", 9);
|
||||||
|
$nama_grup = ""; $nama_aktif = ($aktif==0) ? "Tidak Aktif" : "Aktif";
|
||||||
|
if ($id_grup > 0) $nama_grup = $this->db->fetchField("SELECT Nama_Grup FROM para_member_grup WHERE Grup_MemberID=?", [$id_grup]);
|
||||||
|
|
||||||
|
// generate report header
|
||||||
|
$tglheader = "Tanggal Cetak : ".Param::Get("Tgl_Cetak");
|
||||||
|
$tsql = ''; $asql = [];
|
||||||
|
if ($id_grup > 0) { $tsql .= " AND Grup_MemberID=?"; $asql[] = $id_grup; }
|
||||||
|
if ($aktif < 9) { $tsql .= " AND Aktif=?"; $asql[] = $aktif; }
|
||||||
|
$tsql = (strlen($tsql) > 0) ? ' WHERE '.substr($tsql, 4) : '';
|
||||||
|
|
||||||
|
// query data laporan
|
||||||
|
$stat = $this->db->runQuery("SELECT * FROM para_member".$tsql." ORDER BY Nama_Member", $asql);
|
||||||
|
|
||||||
|
$pre = new PrintHTML($this->app);
|
||||||
|
$pre->add_title([strtoupper($this->reg_name), "Laporan Daftar Member", $tglheader]);
|
||||||
|
|
||||||
|
$pre->add_field("No",10,"C");
|
||||||
|
$pre->add_field("Nama Member",80, "L");
|
||||||
|
$pre->add_field("Alamat",12, "L");
|
||||||
|
$pre->add_field("Kota",12, "L");
|
||||||
|
|
||||||
|
if ($id_grup > 0) $pre->add_sub_title("Grup Member : ".$nama_grup);
|
||||||
|
if ($aktif < 9) $pre->add_sub_title("Status Aktif : ".$nama_aktif);
|
||||||
|
|
||||||
|
$pre->show_titles();
|
||||||
|
$pre->show_headers();
|
||||||
|
|
||||||
|
$nomor = 1;
|
||||||
|
while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$pre->add_row([ $nomor++, $row['Nama_Member'], $row['Alamat_Member'], $row['Kota_Member'] ]);
|
||||||
|
}
|
||||||
|
$pre->add_stamp(0, true);
|
||||||
|
$pre->show();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$this->app->json(['html' => '
|
||||||
|
<div class="fade-in"><div class="card"><div class="card-header custom-style">Daftar Member</div><div class="card-body"><div class="row mb-1"><div class="col-10"><div class="input-group"><input class="form-control" id="Cari_Member" 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-2 btn-group"><button class="btn btn-info shadow-none" type="button" id="butPrint"><i class="bi-printer me-2"></i>Cetak</button></div></div><div id="divDetail"> </div></div></div></div>'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,115 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Table/Member/MembergrupController
|
||||||
|
Description : Master Grup Member
|
||||||
|
Created By : Siau Pheng (siaupheng@3fonia.com).
|
||||||
|
Created Date : May 19th, 2010.
|
||||||
|
Last Modified : September 3rd, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Table\Member;
|
||||||
|
|
||||||
|
use App\Utils\Invesa;
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use Webapp\DB\SQL;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
use Webapp\Web\Table;
|
||||||
|
|
||||||
|
class MembergrupController {
|
||||||
|
|
||||||
|
private string $mode_detail;
|
||||||
|
private int $id_grup;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->mode_detail = Param::Get("mode_detail", "");
|
||||||
|
$this->id_grup = (int) Param::Get("Grup_MemberID", 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function table_detail() {
|
||||||
|
if (in_array($this->mode_detail, ["insert","update","delete"])) {
|
||||||
|
$sql = new SQL($this->app);
|
||||||
|
$sql->set_table("para_member_grup");
|
||||||
|
$sql->add_param("Kode_Grup");
|
||||||
|
$sql->add_param("Nama_Grup");
|
||||||
|
$sql->add_param("Aktif");
|
||||||
|
$sql->add_param_userid();
|
||||||
|
$sql->add_where("Grup_MemberID");
|
||||||
|
|
||||||
|
if ($this->mode_detail === "insert") {
|
||||||
|
$sql->InsertDB();
|
||||||
|
} else if ($this->mode_detail === "update") {
|
||||||
|
$sql->UpdateDB();
|
||||||
|
} else if ($this->mode_detail === "delete") {
|
||||||
|
$sql->DeleteDB();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$tcari = Param::Get("Cari_Member");
|
||||||
|
$tsql = ''; $asql = [];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql = 'CONCAT(Kode_Grup,Nama_Grup) LIKE ?';
|
||||||
|
$asql[] = '%'. $tcari .'%';
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("para_member_grup", "*", $tsql, $asql);
|
||||||
|
$obj->add_field("Grup_MemberID", "ID", "hid");
|
||||||
|
$obj->add_field("Kode_Grup", "Kode");
|
||||||
|
$obj->add_field("Nama_Grup", "Nama Grup Member", "awr");
|
||||||
|
$obj->add_field("Aktif", "Aktif", "c", "checkbox");
|
||||||
|
$obj->set_field_order("Kode_Grup", "A");
|
||||||
|
$obj->add_row_btn("clipboard", "Ubah", "MemberGrupJS.detail_ubah");
|
||||||
|
$obj->add_row_btn("trash", "Hapus", "MemberGrupJS.detail_hapus");
|
||||||
|
$obj->set_func_btn("MemberGrupJS.detail_tambah", "+ Grup Member");
|
||||||
|
$this->app->json([ $obj->json_table("divDetail") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_grup() {
|
||||||
|
$atabel = Invesa::A_Member_Grup();
|
||||||
|
if ($this->id_grup > 0) {
|
||||||
|
$atabel = $this->db->fetchRow("SELECT * FROM para_member_grup WHERE Grup_MemberID=?", [$this->id_grup]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tkode = $form->textbox("_", "Kode_Grup", $atabel['Kode_Grup'], true, true, "text", "kode grup member");
|
||||||
|
$tnama = $form->textbox("_", "Nama_Grup", $atabel['Nama_Grup'], true, true, "text", "nama grup member");
|
||||||
|
$taktif = $form->radio("_", "Aktif", $atabel['Aktif'], true, true, ['1'=>"Aktif",'0'=>"Tidak"]);
|
||||||
|
$ajson['html'] = '
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="Kode_Grup">Kode Grup Member</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_Grup">Nama Grup Member</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 d-flex gap-2">'.$taktif.'</div>
|
||||||
|
</div>
|
||||||
|
<input type="hidden" id="Grup_MemberID" value="'.$atabel['Grup_MemberID'].'" >
|
||||||
|
<input type="hidden" id="mode_detail" value="'.$this->mode_detail.'" >';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$this->app->json(['html' => '
|
||||||
|
<div class="fade-in">
|
||||||
|
<div class="card"><div class="card-header custom-style">Daftar Grup Member</div><div class="card-body"><div class="row mb-1"><div class="col"><div class="input-group"><input class="form-control" id="Cari_Member" 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"> </div></div></div>
|
||||||
|
</div>'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,135 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Table/Member/PointbarangController
|
||||||
|
Description : Master Point Penukanan Barang
|
||||||
|
Created By : Siau Pheng (siaupheng@3fonia.com).
|
||||||
|
Created Date : May 19th, 2010.
|
||||||
|
Last Modified : September 4th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Table\Member;
|
||||||
|
|
||||||
|
use App\Utils\Invesa;
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use Webapp\DB\SQL;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
use Webapp\Web\Table;
|
||||||
|
|
||||||
|
class PointbarangController {
|
||||||
|
|
||||||
|
private string $mode_detail;
|
||||||
|
private int $id_point;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->mode_detail = Param::Get("mode_detail", "");
|
||||||
|
$this->id_point = (int) Param::Get("InvPID", 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function table_detail() {
|
||||||
|
if (in_array($this->mode_detail, ["insert","update","delete"])) {
|
||||||
|
$sql = new SQL($this->app);
|
||||||
|
$sql->set_table("inv_point_barang");
|
||||||
|
$sql->add_param("Point_TipeID");
|
||||||
|
$sql->add_param("Nama_Barang");
|
||||||
|
$sql->add_param("SatuanID");
|
||||||
|
$sql->add_param("Nilai_Barang");
|
||||||
|
$sql->add_param("Nilai_Point");
|
||||||
|
$sql->add_param("Aktif");
|
||||||
|
$sql->add_param_userid();
|
||||||
|
$sql->add_where("InvPID");
|
||||||
|
|
||||||
|
if ($this->mode_detail === "insert") {
|
||||||
|
$sql->InsertDB();
|
||||||
|
} else if ($this->mode_detail === "update") {
|
||||||
|
$sql->UpdateDB();
|
||||||
|
} else if ($this->mode_detail === "delete") {
|
||||||
|
$sql->DeleteDB();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$tcari = Param::Get("Cari_Barang");
|
||||||
|
$tsql = ''; $asql = [];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql = 'Nama_Barang LIKE ?';
|
||||||
|
$asql[] = '%'. $tcari .'%';
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("inv_point_barang B LEFT JOIN inv_point_tipe T ON (B.Point_TipeID=T.Point_TipeID)", "B.*,T.Nama_Tipe", $tsql, $asql);
|
||||||
|
$obj->add_field("InvPID", "ID", "hid");
|
||||||
|
$obj->add_field("Nama_Tipe", "Tipe Point", "awr");
|
||||||
|
$obj->add_field("Nama_Barang", "Nama Barang", "awr");
|
||||||
|
$obj->add_field("Nilai_Barang", "Nilai Barang", "r", "rupiah");
|
||||||
|
$obj->add_field("Nilai_Point", "Nilai Point", "r", "rupiah");
|
||||||
|
$obj->add_field("Aktif", "Aktif", "c", "checkbox");
|
||||||
|
$obj->set_field_order("Nama_Barang", "A");
|
||||||
|
$obj->add_row_btn("clipboard", "Ubah", "PointBarangJS.detail_ubah");
|
||||||
|
$obj->add_row_btn("trash", "Hapus", "PointBarangJS.detail_hapus");
|
||||||
|
$obj->set_func_btn("PointBarangJS.detail_tambah", "+ Barang");
|
||||||
|
$this->app->json([ $obj->json_table("divDetail") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_barang() {
|
||||||
|
$atabel = [ 'InvPID'=>0, 'Point_TipeID'=>0, 'Nama_Barang'=>"", 'SatuanID'=>0, 'Nilai_Barang'=>0, 'Nilai_Point'=>0, 'Aktif'=>1];
|
||||||
|
if ($this->id_point > 0) {
|
||||||
|
$atabel = $this->db->fetchRow("SELECT * FROM inv_point_barang WHERE InvPID=?", [$this->id_point]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$ttipe = $form->option_db("_", "Point_TipeID", $atabel['Point_TipeID'], true, false, "inv_point_tipe", ["Point_TipeID","Nama_Tipe"], "Aktif=1 ORDER BY Point_TipeID", [0," "]);
|
||||||
|
$tnama = $form->textbox("_", "Nama_Barang", $atabel['Nama_Barang'], true, true, "text");
|
||||||
|
$tsatuan = $form->option_db("_", "SatuanID", $atabel['SatuanID'], true, false, "para_satuan", ["SatuanID","Nama_Satuan"], "Aktif=1 ORDER BY Nama_Satuan", [0," "]);
|
||||||
|
$tnilai = $form->textbox("_", "Nilai_Barang", $atabel['Nilai_Barang'], true, false, "double");
|
||||||
|
$tpoint = $form->textbox("_", "Nilai_Point", $atabel['Nilai_Point'], true, false, "number");
|
||||||
|
$taktif = $form->radio("_", "Aktif", $atabel['Aktif'], true, false, [1=>"Aktif",0=>"Tidak"]);
|
||||||
|
$ajson['html'] = '
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="Point_TipeID">Tipe Point</label>
|
||||||
|
<div class="col">'.$ttipe.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="Nama_Barang">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="SatuanID">Satuan Barang</label>
|
||||||
|
<div class="col-sm-6 col-lg-5">'.$tsatuan.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="Nilai_Barang">Nilai Barang</label>
|
||||||
|
<div class="col-sm-6 col-lg-5">'.$tnilai.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="Nilai_Point">Point Barang</label>
|
||||||
|
<div class="col-sm-6 col-lg-5">'.$tpoint.'</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 d-flex gap-2">'.$taktif.'</div>
|
||||||
|
</div>
|
||||||
|
<input type="hidden" id="InvPID" value="'.$atabel['InvPID'].'" >
|
||||||
|
<input type="hidden" id="mode_detail" value="'.$this->mode_detail.'" >';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$this->app->json(['html' => '
|
||||||
|
<div class="fade-in">
|
||||||
|
<div class="card"><div class="card-header custom-style">Daftar Point Penukarang Barang</div><div class="card-body"><div class="row mb-1"><div class="col"><div class="input-group"><input class="form-control" id="Cari_Barang" 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"> </div></div></div>
|
||||||
|
</div>'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,223 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Table/Member/PointskemaController
|
||||||
|
Description : Master Skema Point Member
|
||||||
|
Created By : Siau Pheng (siaupheng@3fonia.com).
|
||||||
|
Created Date : September 28th, 2014.
|
||||||
|
Last Modified : September 4th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Table\Member;
|
||||||
|
|
||||||
|
use App\Utils\Invesa;
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use Webapp\DB\SQL;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
use Webapp\Web\Table;
|
||||||
|
|
||||||
|
class PointskemaController {
|
||||||
|
|
||||||
|
private string $mode_detail;
|
||||||
|
private int $id_point;
|
||||||
|
private string $kode_barang;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->mode_detail = Param::Get("mode_detail", "");
|
||||||
|
$this->id_point = (int) Param::Get("PointID", 0);
|
||||||
|
$this->kode_barang = (string) Param::Get("Kode_Barang", "");
|
||||||
|
}
|
||||||
|
|
||||||
|
public function table_detail() {
|
||||||
|
if (in_array($this->mode_detail, ["insert","update","delete"])) {
|
||||||
|
$sql = new SQL($this->app);
|
||||||
|
$sql->set_table("inv_point");
|
||||||
|
$sql->add_param("Point_TipeID");
|
||||||
|
$sql->add_param("KartuID");
|
||||||
|
$sql->add_param("CabID");
|
||||||
|
$sql->add_param("Grup_MemberID");
|
||||||
|
$sql->add_param("Nilai_Jual");
|
||||||
|
$sql->add_param("Grup_Barang");
|
||||||
|
$sql->add_param("Kode_Barang");
|
||||||
|
$sql->add_param_date("Tgl_Mulai");
|
||||||
|
$sql->add_param("Aktif");
|
||||||
|
$sql->add_param_userid();
|
||||||
|
$sql->add_where("PointID");
|
||||||
|
|
||||||
|
if ($this->mode_detail === "insert") {
|
||||||
|
$sql->InsertDB();
|
||||||
|
} else if ($this->mode_detail === "update") {
|
||||||
|
$sql->UpdateDB();
|
||||||
|
} else if ($this->mode_detail === "delete") {
|
||||||
|
$sql->DeleteDB();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$tcari = Param::Get("Cari_Skema");
|
||||||
|
$tsql = ''; $asql = [];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql = 'CONCAT_WS(G.Nama_Grup,T.Nama_Tipe) LIKE ?';
|
||||||
|
$asql[] = '%'. $tcari .'%';
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("inv_point P LEFT JOIN para_member_grup G ON (G.Grup_MemberID=P.Grup_MemberID) LEFT JOIN para_cabang C ON (P.CabID=C.CabID) LEFT JOIN para_rek_pos K ON (P.KartuID=K.KartuID) LEFT JOIN inv_point_tipe T ON (P.Point_TipeID=T.Point_TipeID)", "P.*,IF(P.KartuID=0,'SEMUA JENIS',K.Nama_Kartu) Nama_Kartu,IF(P.Grup_MemberID=0,'SEMUA GRUP',G.Nama_Grup) Nama_Grup,IF(P.CabID=0,'SEMUA CABANG',C.Nama_Cab) Nama_Cab,T.Nama_Tipe", $tsql, $asql);
|
||||||
|
$obj->add_field("PointID", "ID", "hid");
|
||||||
|
$obj->add_field("Nama_Tipe", "Tipe", "l");
|
||||||
|
$obj->add_field("Nama_Cab", "Cabang", "l");
|
||||||
|
$obj->add_field("Nama_Kartu", "Pembayaran", "l");
|
||||||
|
$obj->add_field("Nama_Grup", "Grup Member", "l");
|
||||||
|
$obj->add_field("Grup_Barang", "Grup Barang", "awr");
|
||||||
|
$obj->add_field("Nilai_Jual", "Nominal (Rp.)", "r", "rupiah");
|
||||||
|
$obj->add_field("Tgl_Mulai", "Tgl. Mulai", "c", "sqltgl", "", "val-tgl");
|
||||||
|
$obj->add_field("Aktif", "Aktif", "c", "checkbox");
|
||||||
|
$obj->set_field_order("Nama_Tipe", "A");
|
||||||
|
$obj->add_row_btn("clipboard", "Ubah", "PointSkemaJS.detail_ubah");
|
||||||
|
$obj->add_row_btn("trash", "Hapus", "PointSkemaJS.detail_hapus");
|
||||||
|
$obj->set_func_btn("PointSkemaJS.detail_tambah", "+ Skema Point");
|
||||||
|
$this->app->json([ $obj->json_table("divDetail") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function table_barang() {
|
||||||
|
$ainv = (empty($this->kode_barang)) ? [] : explode(",", $this->kode_barang);
|
||||||
|
if (in_array($this->mode_detail, ["insert","delete"])) {
|
||||||
|
$id_inv = Param::Get("InvID", 0);
|
||||||
|
if ($this->mode_detail === "insert") {
|
||||||
|
if (!in_array($id_inv, $ainv)) $ainv[] = $id_inv;
|
||||||
|
} else if ($this->mode_detail === "delete") {
|
||||||
|
if (($key = array_search($id_inv, $ainv)) !== false) unset($ainv[$key]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$tsql = 'FALSE'; $asql = [];
|
||||||
|
if (count($ainv) > 0) {
|
||||||
|
$tsql = 'InvID IN (?)';
|
||||||
|
$asql[] = $ainv;
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("inv_produk", "*,1 Hapus", $tsql, $asql);
|
||||||
|
$obj->add_field("InvID", "ID", "hid");
|
||||||
|
$obj->add_field("Nama_Produk", "Nama Barang", "awr");
|
||||||
|
$obj->add_row_btn("trash", "Hapus", "PointSkemaJS.barang_hapus");
|
||||||
|
$this->app->json([ $obj->json_table("divBarang"), ['type'=>"form", 'id'=>"Kode_Barang", 'value'=>implode(',', $ainv)] ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function auto_produk() {
|
||||||
|
$tcari = Param::Get("Auto_Query");
|
||||||
|
$ajson['autodata'] = [];
|
||||||
|
$bcode = 0; $arec = [];
|
||||||
|
// Cari by SKU & Barcode
|
||||||
|
$arec = $this->db->fetchRow("SELECT V.InvID,P.Nama_Produk FROM (SELECT * FROM inv_produk_varian WHERE Kode_SKU=? OR Kode_Barcode=? LIMIT 1) V LEFT JOIN inv_produk P ON (P.InvID=V.InvID) WHERE P.Aktif=1", [$tcari, $tcari]);
|
||||||
|
if (is_array($arec) && count($arec) > 0) $bcode = 1;
|
||||||
|
if ($bcode === 1) {
|
||||||
|
$ajson['autodata'][] = ['value'=>$arec['InvID'], 'text'=>$arec['Nama_Produk'], 'data'=>0, 'bc'=>1];
|
||||||
|
} else {
|
||||||
|
// Cari by Nama
|
||||||
|
$stat = $this->db->runQuery("SELECT InvID,Nama_Produk FROM inv_produk WHERE Aktif=1 AND Nama_Produk LIKE ? ORDER BY Nama_Produk LIMIT 50", ['%'.$tcari.'%']);
|
||||||
|
while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$ajson['autodata'][] = ['value'=>$row['InvID'], 'text'=>$row['Nama_Produk'], 'html'=>$row['Nama_Produk'], 'data'=>0, 'bc'=>0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_skema() {
|
||||||
|
$atabel = [ 'PointID'=>0,'CabID'=>0,'Grup_MemberID'=>0,'Point_TipeID'=>0,'KartuID'=>0,'Grup_Barang'=>"",'Kode_Barang'=>"",'Nilai_Jual'=>0,'Tgl_Mulai'=>tgl_ymd(),'Aktif'=>1 ];
|
||||||
|
if ($this->id_point > 0) {
|
||||||
|
$atabel = $this->db->fetchRow("SELECT * FROM inv_point WHERE PointID=?", [$this->id_point]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tcab = $form->option_db("_", "CabID", $atabel['CabID'], true, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY Nama_Cab", [0,"SEMUA CABANG"]);
|
||||||
|
$tgrup = $form->option_db("_", "Grup_MemberID", $atabel['Grup_MemberID'], true, false, "para_member_grup", ["Grup_MemberID","Nama_Grup"], "Aktif=1 ORDER BY Nama_Grup", [0,"SEMUA GRUP"]);
|
||||||
|
$ttipe = $form->option_db("_", "Point_TipeID", $atabel['Point_TipeID'], true, false, "inv_point_tipe", ["Point_TipeID","Nama_Tipe"], "Aktif=1 ORDER BY Point_TipeID", [0," "]);
|
||||||
|
$tkartu = $form->option_db("_", "KartuID", $atabel['KartuID'], true, false, "para_rek_pos", ["KartuID","Nama_Kartu"], "Aktif=1", [0,"SEMUA JENIS PEMBAYARAN"]);
|
||||||
|
$t_grup = $form->textbox("_", "Grup_Barang", $atabel['Grup_Barang'], false, false, "text");
|
||||||
|
$t_brg = $form->textbox("_", "Kode_Barang", $atabel['Kode_Barang'], false, false, "text");
|
||||||
|
$t_nilai = $form->textbox("_", "Nilai_Jual", $atabel['Nilai_Jual'], true, false, "double");
|
||||||
|
$ttglmulai = $form->datebox("_", "Tgl_Mulai", $atabel['Tgl_Mulai'], true, false);
|
||||||
|
$taktif = $form->radio("_", "Aktif", $atabel['Aktif'], true, false, ['1'=>"Ya",'0'=>"Tidak"]);
|
||||||
|
$ajson['html'] = '
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-2 col-form-label" for="Point_TipeID">Tipe Point</label>
|
||||||
|
<div class="col">'.$ttipe.'</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>
|
||||||
|
<label class="col-sm-4 col-lg-2 col-form-label" for="Grup_MemberID">Grup Member</label>
|
||||||
|
<div class="col-sm-8 col-lg-4">'.$tgrup.'</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">'.$t_grup.'<button id="butBrow1" class="btn btn-info" type="button"><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">Daftar Barang</label>
|
||||||
|
<div class="col"><div class="input-group">'.$t_brg.'<button id="butBrow2" class="btn btn-info" type="button"><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="Nilai_Jual">Nominal Penjualan</label>
|
||||||
|
<div class="col-sm-8 col-lg-4"><div class="input-group">'.$t_nilai.Invesa::Form_Info("Jumlah Nominal Penjualan untuk Memperoleh Point (berlaku kelipatan). Contoh : Rp 100.000").'</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="KartuID">Jenis Pembayaran</label>
|
||||||
|
<div class="col-sm-8 col-lg-4">'.$tkartu.'</div>
|
||||||
|
<label class="col-sm-4 col-lg-2 col-form-label" for="Aktif">Status Aktif ?</label>
|
||||||
|
<div class="col d-flex gap-2">'.$taktif.'</div>
|
||||||
|
</div>
|
||||||
|
<input type="hidden" id="PointID" value="'.$atabel['PointID'].'" >
|
||||||
|
<input type="hidden" id="mode_detail" value="'.$this->mode_detail.'" >';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_grup() {
|
||||||
|
$agrup = explode(",", Param::Get("Grup_Barang","0"));
|
||||||
|
$ajson['html'] = '<table class="table table-striped table-bordered table-hover" id="tabGrupList"><thead><tr><th>Nama Grup Barang</th><th>Aksi</th></tr></thead><tbody>';
|
||||||
|
|
||||||
|
$stat = $this->db->runQuery("SELECT * FROM inv_produk_grup ORDER BY Nama_Grup");
|
||||||
|
while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$checked = (in_array($row['Grup_InvID'], $agrup)) ? "checked" : "";
|
||||||
|
$ajson['html'] .= sprintf('<tr><td class="l">%s</td><td class="c"><input class="form-check-input" type="checkbox" value="%s" %s/></td></tr>', $row['Nama_Grup'], $row['Grup_InvID'], $checked);
|
||||||
|
}
|
||||||
|
$ajson['html'] .= '</tbody></table>';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_barang() {
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tnama = $form->textauto("_", "Nama_Produk", [], true, true, "ketik nama produk");
|
||||||
|
$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 id="divBarang"> </div>
|
||||||
|
<input type="hidden" id="InvID" value="0" >';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$this->app->json(['html' => '
|
||||||
|
<div class="fade-in">
|
||||||
|
<div class="card"><div class="card-header custom-style">Daftar Skema Point Member</div><div class="card-body"><div class="row mb-1"><div class="col"><div class="input-group"><input class="form-control" id="Cari_Skema" 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"> </div></div></div>
|
||||||
|
</div>'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,120 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Table/Member/PointtipeController
|
||||||
|
Description : Master Tipe Point Member
|
||||||
|
Created By : Siau Pheng (siaupheng@3fonia.com).
|
||||||
|
Created Date : May 19th, 2010.
|
||||||
|
Last Modified : September 4th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Table\Member;
|
||||||
|
|
||||||
|
use App\Utils\Invesa;
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use Webapp\DB\SQL;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
use Webapp\Web\Table;
|
||||||
|
|
||||||
|
class PointtipeController {
|
||||||
|
|
||||||
|
private string $mode_detail;
|
||||||
|
private int $id_tipe;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->mode_detail = Param::Get("mode_detail", "");
|
||||||
|
$this->id_tipe = (int) Param::Get("Point_TipeID", 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function table_detail() {
|
||||||
|
if (in_array($this->mode_detail, ["insert","update","delete"])) {
|
||||||
|
$sql = new SQL($this->app);
|
||||||
|
$sql->set_table("inv_point_tipe");
|
||||||
|
$sql->add_param("Nama_Tipe");
|
||||||
|
$sql->add_param("Txt_Struk1");
|
||||||
|
$sql->add_param("Txt_Struk2");
|
||||||
|
$sql->add_param("Aktif");
|
||||||
|
$sql->add_param_userid();
|
||||||
|
$sql->add_where("Point_TipeID");
|
||||||
|
|
||||||
|
if ($this->mode_detail === "insert") {
|
||||||
|
$sql->InsertDB();
|
||||||
|
} else if ($this->mode_detail === "update") {
|
||||||
|
$sql->UpdateDB();
|
||||||
|
} else if ($this->mode_detail === "delete") {
|
||||||
|
$sql->DeleteDB();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$tcari = Param::Get("Cari_Tipe");
|
||||||
|
$tsql = ''; $asql = [];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql = 'Nama_Tipe LIKE ?';
|
||||||
|
$asql[] = '%'. $tcari .'%';
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("inv_point_tipe", "*", $tsql, $asql);
|
||||||
|
$obj->add_field("Point_TipeID", "ID", "hid");
|
||||||
|
$obj->add_field("Nama_Tipe", "Tipe Point", "awr");
|
||||||
|
$obj->add_field("Aktif", "Aktif", "c", "checkbox");
|
||||||
|
$obj->set_field_order("Nama_Tipe", "A");
|
||||||
|
$obj->add_row_btn("clipboard", "Ubah", "PointTipeJS.detail_ubah");
|
||||||
|
$obj->add_row_btn("trash", "Hapus", "PointTipeJS.detail_hapus");
|
||||||
|
$obj->set_func_btn("PointTipeJS.detail_tambah", "+ Tipe Point");
|
||||||
|
$this->app->json([ $obj->json_table("divDetail") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_tipe() {
|
||||||
|
$atabel = [ 'Point_TipeID'=>0, 'Nama_Tipe'=>"", 'Txt_Struk1'=>"", 'Txt_Struk2'=>"", 'Aktif'=>1 ];
|
||||||
|
if ($this->id_tipe > 0) {
|
||||||
|
$atabel = $this->db->fetchRow("SELECT * FROM inv_point_tipe WHERE Point_TipeID=?", [$this->id_tipe]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tnama = $form->textbox("_", "Nama_Tipe", $atabel['Nama_Tipe'], true, true, "text", "nama tipe point");
|
||||||
|
$tstruk1 = $form->textbox("_", "Txt_Struk1", $atabel['Txt_Struk1'], true, true, "text", "text struk utk dapat point baru");
|
||||||
|
$tstruk2 = $form->textbox("_", "Txt_Struk2", $atabel['Txt_Struk2'], true, true, "text", "text struk utk tampilan total point");
|
||||||
|
$taktif = $form->radio("_", "Aktif", $atabel['Aktif'], true, false, [1=>"Aktif",0=>"Tidak"]);
|
||||||
|
$ajson['html'] = '
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="Nama_Tipe">Nama Tipe Point</label>
|
||||||
|
<div class="col">'.$tnama.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="Txt_Struk2">Tulisan Point Baru</label>
|
||||||
|
<div class="col"><div class="input-group">'.$tstruk2.Invesa::Form_Info("Gunakan [TOT_POINT] untuk tampilan nilai.").'</div></div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="Txt_Struk1">Tulisan Total Point</label>
|
||||||
|
<div class="col"><div class="input-group">'.$tstruk1.Invesa::Form_Info("Gunakan [POINT] untuk tampilan nilai.").'</div></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 d-flex gap-2">'.$taktif.'</div>
|
||||||
|
</div>
|
||||||
|
<input type="hidden" id="Point_TipeID" value="'.$atabel['Point_TipeID'].'" >
|
||||||
|
<input type="hidden" id="mode_detail" value="'.$this->mode_detail.'" >';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$this->app->json(['html' => '
|
||||||
|
<div class="fade-in">
|
||||||
|
<div class="card"><div class="card-header custom-style">Daftar Tipe Point Member</div><div class="card-body"><div class="row mb-1"><div class="col"><div class="input-group"><input class="form-control" id="Cari_Tipe" 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"> </div></div></div>
|
||||||
|
</div>'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,93 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
// PHP Class : /Controller/Table/Ppob/KategoriController
|
||||||
|
Description : Master Kategori PPOB
|
||||||
|
Created By : Siau Pheng (siaupheng@3fonia.com).
|
||||||
|
Created Date : May 19th, 2010.
|
||||||
|
Last Modified : September 1st, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Table\Ppob;
|
||||||
|
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
use Webapp\Web\Table;
|
||||||
|
|
||||||
|
class KategoriController {
|
||||||
|
|
||||||
|
private string $mode_detail;
|
||||||
|
private int $id_kate;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->mode_detail = Param::Get("mode_detail", "");
|
||||||
|
$this->id_kate = (int) Param::Get("KateID", 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function table_detail() {
|
||||||
|
$tcari = Param::Get("Cari_Kate");
|
||||||
|
$tsql = ''; $asql = [];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql = 'N_Kate LIKE ?';
|
||||||
|
$asql[] = '%'. $tcari .'%';
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("ppob_kategori", "*", $tsql, $asql);
|
||||||
|
$obj->add_field("KateID", "ID", "hid");
|
||||||
|
$obj->add_field("K_Kate", "Kode", "l");
|
||||||
|
$obj->add_field("N_Kate", "Nama Kategori", "awr");
|
||||||
|
$obj->add_field("Status", "Status", "c", "checkbox");
|
||||||
|
$obj->set_field_order("K_Kate", "A");
|
||||||
|
$obj->add_row_btn("clipboard", "Detail", "PPOBKateJS.detail_ubah");
|
||||||
|
$this->app->json([ $obj->json_table("divDetail") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_kategori() {
|
||||||
|
$atabel = ['KateID'=>0, 'K_Kate'=>"", 'N_Kate'=>"", 'Status'=>1];
|
||||||
|
if ($this->id_kate > 0) {
|
||||||
|
$atabel = $this->db->fetchRow("SELECT * FROM ppob_kategori WHERE KateID=?", [$this->id_kate]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tkode = $form->textbox("_", "K_Kate", $atabel['K_Kate'], false, false, "text");
|
||||||
|
$tnama = $form->textbox("_", "N_Kate", $atabel['N_Kate'], false, false, "text");
|
||||||
|
$tstatus = $form->radio("_", "Status", $atabel['Status'], true, true, ['1'=>"Aktif",'0'=>"Tidak"]);
|
||||||
|
$ajson['html'] = '
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="K_Kate">Kode Kategori</label>
|
||||||
|
<div class="col">'.$tkode.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="N_Kate">Nama Kategori</label>
|
||||||
|
<div class="col">'.$tnama.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="Status">Status ?</label>
|
||||||
|
<div class="col d-flex gap-2">'.$tstatus.'</div>
|
||||||
|
</div>
|
||||||
|
<input type="hidden" id="KateID" value="'.$atabel['KateID'].'" >
|
||||||
|
<input type="hidden" id="mode_detail" value="'.$this->mode_detail.'" >';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$this->app->json(['html' => '
|
||||||
|
<div class="fade-in">
|
||||||
|
<div class="card"><div class="card-header custom-style">Daftar Kategori PPOB</div><div class="card-body"><div class="row mb-1"><div class="col"><div class="input-group"><input class="form-control" id="Cari_Kate" 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"> </div></div></div>
|
||||||
|
</div>'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,98 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Table/Ppob/OperatorController
|
||||||
|
Description : Master Operator PPOB
|
||||||
|
Created By : Siau Pheng (siaupheng@3fonia.com).
|
||||||
|
Created Date : May 19th, 2010.
|
||||||
|
Last Modified : September 1st, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Table\Ppob;
|
||||||
|
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
use Webapp\Web\Table;
|
||||||
|
|
||||||
|
class OperatorController {
|
||||||
|
|
||||||
|
private string $mode_detail;
|
||||||
|
private int $id_ope;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->mode_detail = Param::Get("mode_detail", "");
|
||||||
|
$this->id_ope = (int) Param::Get("OpeID", 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function table_detail() {
|
||||||
|
$tcari = Param::Get("Cari_Ope");
|
||||||
|
$tsql = ''; $asql = [];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql = 'CONCAT(N_Ope,Prefix_Ope) LIKE ?';
|
||||||
|
$asql[] = '%'. $tcari .'%';
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("ppob_operator", "*", $tsql, $asql);
|
||||||
|
$obj->add_field("OpeID", "ID", "hid");
|
||||||
|
$obj->add_field("K_Ope", "Kode", "l");
|
||||||
|
$obj->add_field("N_Ope", "Nama Operator", "awr");
|
||||||
|
$obj->add_field("Status", "Status", "c", "checkbox");
|
||||||
|
$obj->set_field_order("K_Ope", "A");
|
||||||
|
$obj->add_row_btn("clipboard", "Detail", "PPOBOpeJS.detail_ubah");
|
||||||
|
$this->app->json([ $obj->json_table("divDetail") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_operator() {
|
||||||
|
$atabel = ['OpeID'=>0, 'K_Ope'=>"", 'N_Ope'=>"", 'Prefix_Ope'=>"", 'Status'=>1];
|
||||||
|
if ($this->id_ope > 0) {
|
||||||
|
$atabel = $this->db->fetchRow("SELECT * FROM ppob_operator WHERE OpeID=?", [$this->id_ope]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tkode = $form->textbox("_", "K_Ope", $atabel['K_Ope'], false, false, "text");
|
||||||
|
$tnama = $form->textbox("_", "N_Ope", $atabel['N_Ope'], false, false, "text");
|
||||||
|
$tpref = $form->textbox("_", "Prefix_Ope", $atabel['Prefix_Ope'], false, false, "text");
|
||||||
|
$tstatus = $form->radio("_", "Status", $atabel['Status'], true, true, ['1'=>"Aktif",'0'=>"Tidak"]);
|
||||||
|
$ajson['html'] = '
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="K_Ope">Kode Operator</label>
|
||||||
|
<div class="col">'.$tkode.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="N_Ope">Nama Operator</label>
|
||||||
|
<div class="col">'.$tnama.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="Prefix_Ope">Prefix Operator</label>
|
||||||
|
<div class="col">'.$tpref.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="Status">Status ?</label>
|
||||||
|
<div class="col d-flex gap-2">'.$tstatus.'</div>
|
||||||
|
</div>
|
||||||
|
<input type="hidden" id="OpeID" value="'.$atabel['OpeID'].'" >
|
||||||
|
<input type="hidden" id="mode_detail" value="'.$this->mode_detail.'" >';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$this->app->json(['html' => '
|
||||||
|
<div class="fade-in">
|
||||||
|
<div class="card"><div class="card-header custom-style">Daftar Operator PPOB</div><div class="card-body"><div class="row mb-1"><div class="col"><div class="input-group"><input class="form-control" id="Cari_Ope" 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"> </div></div></div>
|
||||||
|
</div>'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,221 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Table/Ppob/ProdukController
|
||||||
|
Description : Master Produk PPOB
|
||||||
|
Created By : Siau Pheng (siaupheng@3fonia.com).
|
||||||
|
Created Date : May 19th, 2010.
|
||||||
|
Last Modified : September 1st, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Table\Ppob;
|
||||||
|
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\Session;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use Webapp\DB\SQL;
|
||||||
|
use Webapp\Printer\PrintHTML;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
use Webapp\Web\Table;
|
||||||
|
use App\Utils\Invesa;
|
||||||
|
use App\Utils\PPOBClient;
|
||||||
|
|
||||||
|
class ProdukController {
|
||||||
|
|
||||||
|
private string $reg_name;
|
||||||
|
private string $mode_detail;
|
||||||
|
private int $id_ope;
|
||||||
|
private int $id_kate;
|
||||||
|
private int $id_produk;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->reg_name = (string) $session->get('WEB_APP')['REG_NAME'];
|
||||||
|
$this->mode_detail = Param::Get("mode_detail", "");
|
||||||
|
$this->id_kate = (int) Param::Get("KateID", 0);
|
||||||
|
$this->id_ope = (int) Param::Get("OpeID", 0);
|
||||||
|
$this->id_produk = (int) Param::Get("ProdukID", 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function table_produk() {
|
||||||
|
if ($this->mode_detail === "update") {
|
||||||
|
$sql = new SQL($this->app);
|
||||||
|
$sql->set_table("ppob_produk");
|
||||||
|
$sql->add_param("OpeID");
|
||||||
|
$sql->add_param("KateID");
|
||||||
|
$sql->add_param("Nama_Produk");
|
||||||
|
$sql->add_param("Harga_Pokok");
|
||||||
|
$sql->add_param("Harga_Jual");
|
||||||
|
$sql->add_param("Status");
|
||||||
|
$sql->add_param_userid();
|
||||||
|
$sql->add_where("ProdukID");
|
||||||
|
$sql->UpdateDB();
|
||||||
|
}
|
||||||
|
|
||||||
|
$tcari = Param::Get("Cari_Produk");
|
||||||
|
$tsql = ''; $asql = [];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql = 'Nama_Produk LIKE ?';
|
||||||
|
$asql[] = '%'. $tcari .'%';
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("ppob_produk", "*,((Harga_Jual-Harga_Pokok)/Harga_Pokok)*100 Margin", $tsql, $asql);
|
||||||
|
$obj->add_field("ProdukID", "ID", "hid");
|
||||||
|
$obj->add_field("Nama_Produk", "Nama Produk", "awr");
|
||||||
|
$obj->add_field("Harga_Pokok", "Harga Modal", "r", "rupiah");
|
||||||
|
$obj->add_field("Harga_Jual", "Harga Jual", "r", "rupiah");
|
||||||
|
$obj->add_field("Margin", "%", "r", "rupiah2");
|
||||||
|
$obj->add_field("Status", "Status", "c", "checkbox");
|
||||||
|
$obj->set_field_order("Nama_Produk", "A");
|
||||||
|
$obj->set_row_color("Harga_Jual", "0", "rdanger");
|
||||||
|
$obj->add_row_btn("clipboard", "Ubah", "PPOBProdukJS.produk_ubah");
|
||||||
|
$this->app->json([ $obj->json_table("divDetail") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_produk() {
|
||||||
|
$atabel = ['ProdukID'=>0, 'Kode'=>"", 'Nama_Produk'=>"", 'OpeID'=>0, 'Harga_Pokok'=>0, 'Harga_Jual'=>0, 'Status'=>1];
|
||||||
|
if ($this->id_produk > 0) {
|
||||||
|
$atabel = $this->db->fetchRow("SELECT * FROM ppob_produk WHERE ProdukID=?", [$this->id_produk]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tkode = $form->textbox("_", "Kode", $atabel['Kode'], false, false, "text");
|
||||||
|
$tnama = $form->textbox("_", "Nama_Produk", $atabel['Nama_Produk'], true, true, "text", "nama produk");
|
||||||
|
$tkate = $form->option_db("_", "KateID", $atabel['KateID'], true, false, "ppob_kategori", ["KateID","N_Kate"], "Status=1 ORDER BY N_Kate");
|
||||||
|
$tope = $form->option_db("_", "OpeID", $atabel['OpeID'], true, false, "ppob_operator", ["OpeID","N_Ope"], "Status=1 ORDER BY N_Ope");
|
||||||
|
$thpp = $form->textbox("_", "Harga_Pokok", $atabel['Harga_Pokok'], true, true, "double", "harga pokok");
|
||||||
|
$tjual = $form->textbox("_", "Harga_Jual", $atabel['Harga_Jual'], true, true, "double", "harga jual");
|
||||||
|
$tstatus = $form->radio("_", "Status", $atabel['Status'], true, true, ['1'=>"Aktif",'0'=>"Tidak"]);
|
||||||
|
$ajson['html'] = '
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-2 col-form-label" for="KateID">Nama Kategori</label>
|
||||||
|
<div class="col-sm-4 col-lg-5">'.$tkate.'</div>
|
||||||
|
<div class="col d-flex gap-2 justify-content-end"><label class="col-form-label me-2">Status ?</label>'.$tstatus.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-2 col-form-label" for="OpeID">Nama Operator</label>
|
||||||
|
<div class="col-sm-4 col-lg-5">'.$tope.'</div>
|
||||||
|
<div class="col-sm-4 col-lg-5"><div class="input-group"><span class="input-group-text" style="min-width:30%;">Kode Produk</span>'.$tkode.'</div></div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-2 col-form-label" for="Nama_Produk">Nama Produk</label>
|
||||||
|
<div class="col">'.$tnama.'</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-3">'.$thpp.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-2 col-form-label" for="Harga_Jual">Harga Jual</label>
|
||||||
|
<div class="col-sm-4 col-lg-3">'.$tjual.'</div>
|
||||||
|
</div>
|
||||||
|
<input type="hidden" id="ProdukID" value="'.$atabel['ProdukID'].'" />
|
||||||
|
<input type="hidden" id="mode_detail" value="'.$this->mode_detail.'" />';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function detail_print() {
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tkate = $form->option_db("_", "KateID", 0, true, false, "ppob_kategori", ["KateID","N_Kate"], "Status=1 ORDER BY N_Kate", [0,"SEMUA KATEGORI"]);
|
||||||
|
$tope = $form->option_db("_", "OpeID", 0, true, false, "ppob_operator", ["OpeID","N_Ope"], "Status=1 ORDER BY N_Ope", [0,"SEMUA OPERATOR"]);
|
||||||
|
$ttgl = $form->datebox("_", "Tgl_Cetak", tgl_ymd(), true, false);
|
||||||
|
$ajson['html'] = '
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="KateID">Nama Kategori</label>
|
||||||
|
<div class="col">'.$tkate.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="OpeID">Nama Operator</label>
|
||||||
|
<div class="col">'.$tope.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="Tgl_Cetak">Tanggal Cetak</label>
|
||||||
|
<div class="col-sm-4 col-lg-4">'.$ttgl.'</div>
|
||||||
|
</div>';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function detail_update() {
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tkate = $form->option_db("_", "K_Kate", "", true, false, "ppob_kategori", ["K_Kate","N_Kate"], "Status=1 ORDER BY N_Kate", ["","SEMUA KATEGORI"]);
|
||||||
|
$tope = $form->option_db("_", "K_Ope", "", true, false, "ppob_operator", ["K_Ope","N_Ope"], "Status=1 ORDER BY N_Ope", ["","SEMUA OPERATOR"]);
|
||||||
|
$ajson['html'] = '
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="K_Kate">Nama Kategori</label>
|
||||||
|
<div class="col">'.$tkate.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="K_Ope">Nama Operator</label>
|
||||||
|
<div class="col">'.$tope.'</div>
|
||||||
|
</div>';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function proses_update() {
|
||||||
|
// PROSES API TRIFONIA PULSA
|
||||||
|
$cppob = new PPOBClient($this->app);
|
||||||
|
$appob = $cppob->Produk(Param::Get("K_Kate"), Param::Get("K_Ope"));
|
||||||
|
if (count($appob) > 0 && (int) $appob['Status'] === 4) {
|
||||||
|
$ajson[] = ['type'=>"msg", 'mode'=>"info", 'wait'=>2000, 'value'=>$appob['Message']];
|
||||||
|
} else {
|
||||||
|
$ajson[] = ['type'=>"msg", 'mode'=>"error", 'wait'=>2000, 'value'=>$appob['Message']];
|
||||||
|
}
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function print_produk() {
|
||||||
|
$nama_kate = ""; $nama_ope = "";
|
||||||
|
if ($this->id_kate > 0) $nama_kate = $this->db->fetchField("SELECT N_Kate FROM ppob_kategori WHERE KateID=?", [$this->id_kate]);
|
||||||
|
if ($this->id_ope > 0) $nama_ope = $this->db->fetchField("SELECT N_Ope FROM ppob_operator WHERE OpeID=?", [$this->id_ope]);
|
||||||
|
|
||||||
|
// generate report header
|
||||||
|
$tglheader = "Tanggal Cetak : ".Param::Get("Tgl_Cetak");
|
||||||
|
$tsql = ''; $asql = [];
|
||||||
|
if ($this->id_kate > 0) { $tsql .= " AND KateID=?"; $asql[] = $this->id_kate; }
|
||||||
|
if ($this->id_ope > 0) { $tsql .= " AND OpeID=?"; $asql[] = $this->id_ope; }
|
||||||
|
$tsql = (strlen($tsql) > 0) ? ' WHERE '.substr($tsql, 4) : '';
|
||||||
|
|
||||||
|
// query data laporan
|
||||||
|
$stat = $this->db->runQuery("SELECT * FROM ppob_produk".$tsql." ORDER BY KateID,OpeID,ProdukID", $asql);
|
||||||
|
|
||||||
|
$pre = new PrintHTML($this->app);
|
||||||
|
$pre->add_title([strtoupper($this->reg_name), "Laporan Daftar Produk PPOB", $tglheader]);
|
||||||
|
|
||||||
|
$pre->add_field("No",10,"C");
|
||||||
|
$pre->add_field("Nama Produk",80);
|
||||||
|
$pre->add_field("Harga Modal",12, "R", "rupiah");
|
||||||
|
$pre->add_field("Harga Jual",12, "R", "rupiah");
|
||||||
|
$pre->add_field("Margin",12, "R", "rupiah");
|
||||||
|
$pre->add_field("%",5, "R", "rupiah2");
|
||||||
|
|
||||||
|
if ($this->id_kate > 0) $pre->add_sub_title("Nama Kategori : ".$nama_kate);
|
||||||
|
if ($this->id_ope > 0) $pre->add_sub_title("Nama Operator : ".$nama_ope);
|
||||||
|
|
||||||
|
$pre->show_titles();
|
||||||
|
$pre->show_headers();
|
||||||
|
|
||||||
|
$nomor = 0;
|
||||||
|
while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
$pre->add_row([ ++$nomor, $row['Nama_Produk'], $row['Harga_Pokok'], $row['Harga_Jual'], ((float) $row['Harga_Jual']-(float) $row['Harga_Pokok']), ((((float) $row['Harga_Jual']-(float) $row['Harga_Pokok'])*100)/(float) $row['Harga_Pokok']) ]);
|
||||||
|
}
|
||||||
|
$pre->add_stamp(0, true);
|
||||||
|
$pre->show();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$this->app->json(['html' => '
|
||||||
|
<div class="fade-in"><div class="card"><div class="card-header custom-style">Daftar Produk PPOB</div><div class="card-body"><div class="row mb-1"><div class="col-9"><div class="input-group"><input class="form-control" id="Cari_Produk" placeholder="Kunci Pencarian" type="text"><button class="btn btn-info shadow-none" type="button" id="butSearch">Cari</button><button class="btn btn-secondary shadow-none" type="button" id="butAll">Semua</button></div></div><div class="col-3 btn-group"><button class="btn btn-info shadow-none" type="button" id="butPrint"><i class="bi-printer me-2"></i>Cetak</button><button class="btn btn-warning shadow-none" type="button" id="butUpdate"><i class="bi-download me-2"></i>Update Produk</button></div></div><div id="divDetail"> </div></div></div></div>'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,835 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Table/ProdukController
|
||||||
|
Description : Master Barang
|
||||||
|
Created By : Siau Pheng (siaupheng@3fonia.com).
|
||||||
|
Created Date : May 19th, 2010.
|
||||||
|
Last Modified : September 10th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Table;
|
||||||
|
|
||||||
|
use App\Utils\Invesa;
|
||||||
|
use App\Utils\Inv;
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\Session;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use Webapp\DB\SQL;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
use Webapp\Web\Table;
|
||||||
|
use Webapp\Printer\PrintHTML;
|
||||||
|
|
||||||
|
class ProdukController {
|
||||||
|
|
||||||
|
private string $reg_name;
|
||||||
|
private string $mode;
|
||||||
|
private string $mode_detail;
|
||||||
|
private int $id_inv;
|
||||||
|
private int $id_kemasan;
|
||||||
|
private int $id_varian;
|
||||||
|
private int $id_harga;
|
||||||
|
private string $md5_key;
|
||||||
|
private int $i_filter;
|
||||||
|
private int $id_eceran;
|
||||||
|
private int $def_satuan;
|
||||||
|
private Inv $inv;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->reg_name = (string) $session->get('WEB_APP')['REG_NAME'];
|
||||||
|
$this->mode = Param::Get("mode", "");
|
||||||
|
$this->mode_detail = Param::Get("mode_detail", "");
|
||||||
|
$this->id_inv = Param::Int("InvID", 0);
|
||||||
|
$this->id_kemasan = Param::Int("InvKemasanID", 0);
|
||||||
|
$this->id_varian = Param::Int("InvVarianID", 0);
|
||||||
|
$this->id_harga = Param::Int("InvHargaID", 0);
|
||||||
|
$this->md5_key = Param::Get("MD5Key", "");
|
||||||
|
$this->i_filter = Param::Int("Filter_Produk", 0);
|
||||||
|
$this->id_eceran = (int) $session->get('APP_INV')['ECERANID'] ?? 5;
|
||||||
|
$this->def_satuan = (int) $session->get('APP_INV')['DEF_SATUANID'] ?? 0;
|
||||||
|
$this->inv = new Inv($app);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function brow_produk() {
|
||||||
|
$tcari = Param::Get("Cari_Produk2", "");
|
||||||
|
$tsql = ''; $asql = [];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql = " AND Barcode_Nama LIKE ?";
|
||||||
|
$asql[] = '%'. $tcari . '%';
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("vi_inv_produk", "*", "Aktif=1".$tsql, $asql);
|
||||||
|
$obj->add_field("InvID", "ID", "hid");
|
||||||
|
$obj->add_field("Kode_SKU", "SKU", "c");
|
||||||
|
$obj->add_field("Nama_Lengkap", "Nama Barang", "awr");
|
||||||
|
$obj->add_field("Nama_Satuan", "Satuan", "l");
|
||||||
|
$obj->set_field_order("Kode_SKU", "A");
|
||||||
|
$obj->add_row_btn("save", "Pilih", "ProdukJS.produk_select");
|
||||||
|
$this->app->json([ $obj->db_table("divBrowProduk") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function tabel_produk() {
|
||||||
|
$tcari = Param::Get("Cari_Produk", "");
|
||||||
|
$awhere = [];
|
||||||
|
if (empty($tcari)) {
|
||||||
|
if ($this->i_filter > 0) $awhere[] = "Grup_InvID='".(string)$this->i_filter."'";
|
||||||
|
} else {
|
||||||
|
$tsql = "Nama_Produk LIKE '%".$tcari."%'";
|
||||||
|
if (is_numeric($tcari)) {
|
||||||
|
$tsql .= " OR InvID IN (SELECT InvID FROM inv_produk_varian WHERE Kode_SKU LIKE '%".$tcari."%' OR Kode_Barcode LIKE '%".$tcari."%')";
|
||||||
|
}
|
||||||
|
$awhere[] = $tsql;
|
||||||
|
}
|
||||||
|
$tsql = (count($awhere) > 0) ? " WHERE ".implode(' AND ', $awhere) : '';
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("(SELECT * FROM inv_produk".$tsql.") P LEFT JOIN inv_produk_kemasan K ON (K.InvID=P.InvID) LEFT JOIN inv_produk_harga H ON (K.InvID=H.InvID AND K.SatuanID=H.SatuanID AND H.Grup_MemberID='".(string)$this->id_eceran."') LEFT JOIN para_satuan S ON (S.SatuanID=K.SatuanID) LEFT JOIN (SELECT InvID,SUM(Stok) Stok FROM inv_stok GROUP BY InvID) T ON (T.InvID=P.InvID)", "P.InvID,P.Aktif,P.Nama_Produk,'' Nama_Grup,IFNULL(S.Nama_Satuan,'') Nama_Kemasan,Round(P.Harga_Pokok*IFNULL(K.Qty,1),2) Harga_Pokok,IF(IFNULL(H.Harga_Jual,0)=0,0,(((H.Harga_Jual-(P.Harga_Pokok*IFNULL(K.Qty,1)))*100)/H.Harga_Jual)) Margin,IFNULL(H.Harga_Jual,0) Harga_Jual,IF(IFNULL(T.Stok,0)=0,0,T.Stok/IFNULL(K.Qty,1)) Stok,IF((ISNULL(H.Harga_Jual) OR H.Harga_Jual<(P.Harga_Pokok*IFNULL(K.Qty,1))) AND P.Aktif=1,1,0) Rugi", "");
|
||||||
|
if ($this->app->user()->is_level(2)) $obj->set_table("(SELECT * FROM inv_produk".$tsql.") P LEFT JOIN inv_produk_kemasan K ON (K.InvID=P.InvID) LEFT JOIN inv_produk_harga H ON (K.InvID=H.InvID AND K.SatuanID=H.SatuanID) LEFT JOIN para_member_grup MG ON (H.Grup_MemberID=MG.Grup_MemberID) LEFT JOIN para_satuan S ON (S.SatuanID=K.SatuanID) LEFT JOIN (SELECT InvID,SUM(Stok) Stok FROM inv_stok GROUP BY InvID) T ON (T.InvID=P.InvID)", "P.InvID,P.Aktif,P.Nama_Produk,IFNULL(MG.Kode_Grup,'') Nama_Grup,IFNULL(S.Nama_Satuan,'') Nama_Kemasan,Round(P.Harga_Pokok*IFNULL(K.Qty,1),2) Harga_Pokok,IF(IFNULL(H.Harga_Jual,0)=0,0,(((H.Harga_Jual-(P.Harga_Pokok*IFNULL(K.Qty,1)))*100)/H.Harga_Jual)) Margin,IFNULL(H.Harga_Jual,0) Harga_Jual,IF(IFNULL(T.Stok,0)=0,0,T.Stok/IFNULL(K.Qty,1)) Stok,IF((ISNULL(H.Harga_Jual) OR H.Harga_Jual<(P.Harga_Pokok*IFNULL(K.Qty,1))) AND P.Aktif=1,1,0) Rugi", "");
|
||||||
|
$obj->add_field("InvID", "No.", "c");
|
||||||
|
$obj->add_field("Nama_Produk", "Nama Barang", "awr");
|
||||||
|
if ($this->app->user()->is_level(2)) $obj->add_field("Nama_Grup", "Grup Member", "l");
|
||||||
|
$obj->add_field("Nama_Kemasan", "Kemasan", "l");
|
||||||
|
if ($this->app->user()->is_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", "Stok", "r", "rupiah2");
|
||||||
|
$obj->add_field("Aktif", "Aktif", "c", "checkbox");
|
||||||
|
$obj->set_field_order("InvID", "D");
|
||||||
|
$obj->set_row_color("Rugi", "1", "rdanger");
|
||||||
|
$obj->add_row_btn("clipboard", "Ubah", "ProdukJS.produk_ubah");
|
||||||
|
if ($this->app->user()->is_level(2)) $obj->add_row_btn("arrow-counterclockwise", "Restore", "ProdukJS.produk_restore");
|
||||||
|
$obj->add_row_btn("trash", "Hapus", "ProdukJS.produk_hapus");
|
||||||
|
$obj->set_func_btn("ProdukJS.produk_tambah", "+ Produk");
|
||||||
|
$this->app->json([ $obj->db_table("divDetail") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function tabel_kemasan() {
|
||||||
|
if (in_array($this->mode_detail, ["update","delete"])) {
|
||||||
|
$sql = new SQL($this->app);
|
||||||
|
$sql->set_table("inv_produk_kemasan");
|
||||||
|
$sql->add_param("SatuanID");
|
||||||
|
$sql->add_param("Qty");
|
||||||
|
$sql->add_param_userid();
|
||||||
|
$sql->add_where("InvKemasanID", $this->id_kemasan);
|
||||||
|
|
||||||
|
$sat_baru = (int) Param::Get("SatuanID", 0);
|
||||||
|
$sat_lama = (int) Param::Get("SatuanLamaID", 0);
|
||||||
|
if ($this->mode_detail === "update") {
|
||||||
|
if ($this->id_kemasan === 0) {
|
||||||
|
$sql->add_param("InvID");
|
||||||
|
$sql->InsertDB();
|
||||||
|
$this->db->runQuery("INSERT INTO inv_produk_varian (InvID,SatuanID,Kode_SKU,UserID) SELECT InvID,SatuanID,'SKU_BARU',UserID FROM inv_produk_kemasan WHERE InvID=?", [$this->id_inv]);
|
||||||
|
} else {
|
||||||
|
$sql->UpdateDB();
|
||||||
|
if ($sat_baru !== $sat_lama) {
|
||||||
|
$this->db->update('inv_produk_varian', ['SatuanID'=>$sat_baru], 'InvID=? AND SatuanID=?', [$this->id_inv,$sat_lama]);
|
||||||
|
$this->db->update('inv_produk_harga', ['SatuanID'=>$sat_baru], 'InvID=? AND SatuanID=?', [$this->id_inv,$sat_lama]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if ($this->mode_detail === "delete") {
|
||||||
|
$sql->DeleteDB();
|
||||||
|
$this->db->delete('inv_produk_varian', 'InvID=? AND SatuanID=?', [$this->id_inv, $sat_lama]);
|
||||||
|
$this->db->delete('inv_produk_harga', 'InvID=? AND SatuanID=?', [$this->id_inv, $sat_lama]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("(SELECT * FROM inv_produk_kemasan WHERE InvID='".$this->id_inv."') K LEFT JOIN para_satuan S ON (K.SatuanID=S.SatuanID)", "K.*,S.Nama_Satuan,CONCAT(ROUND(K.Qty),' ','".Param::Get("Satuan_Stok","")."') Qty_Satuan", "");
|
||||||
|
$obj->add_field("InvKemasanID", "ID", "hid");
|
||||||
|
$obj->add_field("SatuanID", "ID2", "hid");
|
||||||
|
$obj->add_field("Nama_Satuan", "Kemasan", "l");
|
||||||
|
$obj->add_field("Qty_Satuan", "Qty", "r");
|
||||||
|
$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", '<i class="bi-plus-lg me-2"></i>Kemasan');
|
||||||
|
$obj->set_func_btn("ProdukJS.kemasan_copy", '<i class="bi-copy me-2"></i>Salin Kemasan');
|
||||||
|
$this->app->json([ $obj->json_table("divKemasan") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function tabel_varian() {
|
||||||
|
if (in_array($this->mode_detail, ["update","delete"])) {
|
||||||
|
$sql = new SQL($this->app);
|
||||||
|
$sql->set_table("inv_produk_varian");
|
||||||
|
$sql->add_param("SatuanID");
|
||||||
|
$sql->add_param("VarianID");
|
||||||
|
$sql->add_param("Kode_Barcode");
|
||||||
|
$sql->add_param_userid();
|
||||||
|
$sql->add_where("InvVarianID", $this->id_varian);
|
||||||
|
|
||||||
|
if ($this->mode_detail === "update") {
|
||||||
|
if ($this->id_varian === 0) {
|
||||||
|
$sql->add_param("InvID");
|
||||||
|
$sql->add_param("Kode_SKU", "SKU_BARU");
|
||||||
|
$sql->InsertDB();
|
||||||
|
} else {
|
||||||
|
$sql->UpdateDB();
|
||||||
|
}
|
||||||
|
} else if ($this->mode_detail === "delete") {
|
||||||
|
$sql->DeleteDB();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("(SELECT * FROM inv_produk_varian WHERE InvID='".$this->id_inv."') V LEFT JOIN (SELECT SatuanID,MIN(VarianID) VarianID FROM inv_produk_varian WHERE invid='".$this->id_inv."' GROUP BY SatuanID) X ON (V.SatuanID=X.SatuanID AND V.VarianID=X.VarianID) LEFT JOIN para_varian N ON (V.VarianID=N.VarianID) LEFT JOIN para_satuan S ON (V.SatuanID=S.SatuanID)", "V.*,S.Nama_Satuan,IFNULL(N.Nama_Varian,'<i>Tanpa Varian</i>') Nama_Varian,IFNULL(X.SatuanID,0) Bisa_Del");
|
||||||
|
$obj->add_field("InvVarianID", "ID", "hid");
|
||||||
|
$obj->add_field("Kode_SKU", "SKU", "c");
|
||||||
|
$obj->add_field("Kode_Barcode", "Barcode", "l");
|
||||||
|
$obj->add_field("Nama_Satuan", "Kemasan", "l");
|
||||||
|
$obj->add_field("Nama_Varian", "Varian", "l");
|
||||||
|
$obj->set_field_order("Nama_Satuan", "A");
|
||||||
|
$obj->add_row_form("pencil-square", "Detail", "ProdukJS.varian_form");
|
||||||
|
$obj->add_row_btn("trash", "Hapus", "ProdukJS.varian_del", "Bisa_Del", "0");
|
||||||
|
$obj->set_func_btn("ProdukJS.varian_add", "+ Varian");
|
||||||
|
$this->app->json([ $obj->json_table("divVarian") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function tabel_harga() {
|
||||||
|
if (in_array($this->mode_detail, ["update","delete"])) {
|
||||||
|
$sql = new SQL($this->app);
|
||||||
|
$sql->set_table("inv_produk_harga");
|
||||||
|
$sql->add_param("SatuanID");
|
||||||
|
$sql->add_param("Grup_MemberID");
|
||||||
|
$sql->add_param("Harga_Jual");
|
||||||
|
$sql->add_param_userid();
|
||||||
|
$sql->add_where("InvHargaID", $this->id_harga);
|
||||||
|
|
||||||
|
if ($this->mode_detail === "update") {
|
||||||
|
if ($this->id_harga === 0) {
|
||||||
|
$sql->add_param("InvID");
|
||||||
|
$sql->InsertDB();
|
||||||
|
} else {
|
||||||
|
$sql->UpdateDB();
|
||||||
|
}
|
||||||
|
} else if ($this->mode_detail === "delete") {
|
||||||
|
$sql->DeleteDB();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("(SELECT * FROM inv_produk_harga WHERE InvID='".$this->id_inv."'".($this->app->user()->is_level(2)?"":" AND Grup_MemberID='".(string)$this->id_eceran."'").") H LEFT JOIN (SELECT * FROM inv_produk_kemasan WHERE InvID='".$this->id_inv."') K ON (H.InvID=K.InvID AND H.SatuanID=K.SatuanID) LEFT JOIN (SELECT * FROM inv_produk WHERE InvID='".$this->id_inv."') P ON (H.InvID=P.InvID) LEFT JOIN para_satuan S ON (H.SatuanID=S.SatuanID) LEFT JOIN para_member_grup G ON (H.Grup_MemberID=G.Grup_MemberID)", "H.*,S.Nama_Satuan,G.Nama_Grup,(K.Qty*P.Harga_Pokok) Harga_Modal,IF(H.Harga_Jual=0,0,H.Harga_Jual-(K.Qty*P.Harga_Pokok)) Margin_Rup, IF(H.Harga_Jual=0,0,((H.Harga_Jual-(K.Qty*P.Harga_Pokok))*100)/H.Harga_Jual) Margin_Per");
|
||||||
|
$obj->add_field("InvHargaID", "ID", "hid");
|
||||||
|
$obj->add_field("Nama_Satuan", "Kemasan", "l");
|
||||||
|
$obj->add_field("Nama_Grup", "Grup Member", "l");
|
||||||
|
$obj->add_field("Harga_Jual", "Harga Jual", "r", "rupiah");
|
||||||
|
if ($this->app->user()->is_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", "rwarning");
|
||||||
|
$obj->set_field_order("Nama_Satuan", "A");
|
||||||
|
$obj->add_row_form("pencil-square", "Detail", "ProdukJS.harga_form");
|
||||||
|
$obj->add_row_btn("trash", "Hapus", "ProdukJS.harga_del");
|
||||||
|
$obj->set_func_btn("ProdukJS.harga_add", "+ Harga");
|
||||||
|
$this->app->json([ $obj->json_table("divHarga") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function tabel_restore() {
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("inv_produk_backup", "Tanggal,MD5Key,UserID", "InvID='".$this->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");
|
||||||
|
$this->app->json([ $obj->db_table("divBrowBackup") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function detail_produk() {
|
||||||
|
$atabel = ['InvID'=>0,'Nama_Produk'=>"",'Grup_InvID'=>0,'StokID'=>$this->def_satuan,'NormalID'=>$this->def_satuan,'Harga_Beli'=>0,'Harga_Tambah'=>0,'Harga_Pokok'=>0,'Stok_Min'=>0,'Stok_Max'=>0,'Aktif'=>1,'PPN'=>0];
|
||||||
|
if ($this->id_inv > 0) {
|
||||||
|
$atabel = $this->db->fetchRow("SELECT * FROM inv_produk WHERE InvID=?", [$this->id_inv]);
|
||||||
|
$this->Produk_Backup();
|
||||||
|
} else {
|
||||||
|
$atabel['InvID'] = $this->Produk_Baru(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$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," "]);
|
||||||
|
$tstok = $form->option_db("_", "StokID", $atabel['StokID'], true, false, "para_satuan", ["SatuanID","Nama_Satuan"], "Aktif=1 ORDER BY Nama_Satuan", [0," "]);
|
||||||
|
$tnormal = $form->option_db("_", "NormalID", $atabel['NormalID'], true, false, "para_satuan", ["SatuanID","Nama_Satuan"], "Aktif=1 ORDER BY Nama_Satuan", [0," "]);
|
||||||
|
$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");
|
||||||
|
$tppn = $form->option("_", "PPN", $atabel['PPN'], true, true, Invesa::PPN_Array());
|
||||||
|
$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</button>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item" role="presentation">
|
||||||
|
<button class="nav-link" id="varian-tab" data-bs-toggle="tab" data-bs-target="#varian" type="button" role="tab" aria-controls="varian" aria-selected="false">Varian</button>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item" role="presentation">
|
||||||
|
<button class="nav-link" id="harga-tab" data-bs-toggle="tab" data-bs-target="#harga" type="button" role="tab" aria-controls="harga" aria-selected="false">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 d-flex gap-2 justify-content-end"><label class="col-form-label me-2">Barang Aktif ?</label>'.$taktif.'</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.Invesa::Form_Info("Ukuran satuan terkecil produk.").'</div></div>
|
||||||
|
<div class="col-sm-4 col-lg-5"><div class="input-group">'.$tnormal.Invesa::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%;">Status PPN <strong> *</strong></span>'.$tppn.'</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 Minimum</span>'.$tsmin.'</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 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>
|
||||||
|
<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 class="tab-pane fade" id="varian" role="tabpanel" aria-labelledby="varian-tab">
|
||||||
|
<div class="row"><div class="col" id="divVarian"></div></div>
|
||||||
|
</div>
|
||||||
|
<div class="tab-pane fade" id="harga" role="tabpanel" aria-labelledby="harga-tab">
|
||||||
|
<div class="row"><div class="col" id="divHarga"></div></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<input type="hidden" id="InvID" value="'.$atabel['InvID'].'" />
|
||||||
|
<input type="hidden" id="mode" value="'.$this->mode.'" />';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function detail_print() {
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tginv = $form->option_db("_", "Grup_InvID", 0, true, false, "inv_produk_grup", ["Grup_InvID","Nama_Grup"], "Aktif=1 ORDER BY Nama_Grup", [0,"SEMUA GRUP"]);
|
||||||
|
$tsup = $form->option_db("_", "SupID", 0, true, false, "para_supplier", ["SupID","Nama_Sup"], "Aktif=1 ORDER BY Nama_Sup", [0,"SEMUA SUPPLIER"]);
|
||||||
|
$tmem = $form->option_db("_", "Grup_MemberID", $this->id_eceran, $this->app->user()->is_level(2), false, "para_member_grup", ["Grup_MemberID","Nama_Grup"], "Aktif=1 ORDER BY Nama_Grup");
|
||||||
|
$ttgl = $form->datebox("_", "Tgl_Cetak", tgl_ymd(), true, false);
|
||||||
|
$ajson['html'] = '
|
||||||
|
<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">'.$tginv.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="Grup_MemberID">Grup Member</label>
|
||||||
|
<div class="col">'.$tmem.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="Tgl_Cetak">Tanggal Cetak</label>
|
||||||
|
<div class="col-sm-4 col-lg-4">'.$ttgl.'</div>
|
||||||
|
</div>';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function detail_filter() {
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$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"]);
|
||||||
|
$ajson['html'] = '
|
||||||
|
<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>';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function detail_restore() {
|
||||||
|
$atabel = ['InvID'=>$this->id_inv, 'Nama_Produk'=>""];
|
||||||
|
if ($this->id_inv > 0) {
|
||||||
|
$atabel = $this->db->fetchRow("SELECT * FROM inv_produk WHERE InvID=?", [$this->id_inv]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$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"> </div>
|
||||||
|
<input type="hidden" id="InvID" value="'.$atabel['InvID'].'">
|
||||||
|
</div></div>';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_kemasan() {
|
||||||
|
$arec = ['InvKemasanID'=>0,'SatuanID'=>0,'Qty'=>0];
|
||||||
|
if ($this->id_kemasan > 0) {
|
||||||
|
$arec = $this->db->fetchRow("SELECT * FROM inv_produk_kemasan WHERE InvKemasanID=?", [$this->id_kemasan]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$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");
|
||||||
|
$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>
|
||||||
|
<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("Satuan_Stok","?").'</span></div></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>';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_varian() {
|
||||||
|
$arec = ['InvVarianID'=>0,'SatuanID'=>0,'VarianID'=>0,'Kode_SKU'=>"SKU_BARU",'Kode_Barcode'=>""];
|
||||||
|
if ($this->id_varian > 0) {
|
||||||
|
$arec = $this->db->fetchRow("SELECT * FROM inv_produk_varian WHERE InvVarianID=?", [$this->id_varian]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tsatuan = $form->option_que("_", "SatuanID", $arec['SatuanID'], true, false, "SELECT SatuanID,Nama_Satuan FROM para_satuan WHERE Aktif=1 AND SatuanID IN (SELECT SatuanID FROM inv_produk_kemasan WHERE InvID='".$this->id_inv."') ORDER BY Nama_Satuan", ["SatuanID","Nama_Satuan"]);
|
||||||
|
$tvarian = $form->option_db("_", "VarianID", $arec['VarianID'], true, false, "para_varian", ["VarianID","Nama_Varian"], "Aktif=1 ORDER BY Nama_Varian", [0,"-- TANPA VARIAN --"]);
|
||||||
|
$tsku = $form->textbox("_", "Kode_SKU", $arec['Kode_SKU'], false, false, "text");
|
||||||
|
$tbcode = $form->textbox("_", "Kode_Barcode", $arec['Kode_Barcode'], true, true, "text");
|
||||||
|
$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="VarianID">Nama Varian</label>
|
||||||
|
<div class="col-sm-6 col-lg-4">'.$tvarian.'</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">
|
||||||
|
<div class="col text-end">
|
||||||
|
<button type="button" class="btn btn-warning shadow-none me-2" id="butBatalVarian">Batal</button><button type="button" class="btn btn-success shadow-none" id="butSimpanVarian">Simpan</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<input type="hidden" id="InvVarianID" value="'.$arec['InvVarianID'].'">
|
||||||
|
<input type="hidden" id="SatuanLamaID" value="'.$arec['SatuanID'].'">
|
||||||
|
<input type="hidden" id="VarianLamaID" value="'.$arec['VarianID'].'">
|
||||||
|
<input type="hidden" id="Kode_BarcodeLama" value="'.$arec['Kode_Barcode'].'">
|
||||||
|
</div></div>';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_harga() {
|
||||||
|
$arec = ['InvHargaID'=>0,'SatuanID'=>0,'Grup_MemberID'=>$this->id_eceran,'Harga_Modal'=>0,'Harga_Jual'=>0,'Persen_Jual'=>0];
|
||||||
|
if ($this->id_harga > 0) {
|
||||||
|
$arec = $this->db->fetchRow("SELECT * FROM inv_produk_harga WHERE InvHargaID=?", [$this->id_harga]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tsatuan = $form->option_que("_", "SatuanID", $arec['SatuanID'], true, false, "SELECT SatuanID,Nama_Satuan FROM para_satuan WHERE Aktif=1 AND SatuanID IN (SELECT SatuanID FROM inv_produk_kemasan WHERE InvID='".$this->id_inv."') ORDER BY Nama_Satuan", ["SatuanID","Nama_Satuan"], null, null, "ProdukJS.calc_Modal");
|
||||||
|
$tgrup = $form->option_db("_", "Grup_MemberID", $arec['Grup_MemberID'], $this->app->user()->is_level(2), false, "para_member_grup", ["Grup_MemberID","Nama_Grup"], "Aktif=1 ORDER BY Nama_Grup");
|
||||||
|
$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_Harga1");
|
||||||
|
$tpersen = $form->textbox("_", "Persen_Jual", $arec['Persen_Jual'], true, false, "double", "persen jual", null, null, "ProdukJS.calc_Harga2");
|
||||||
|
$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>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-6 col-lg-2 col-form-label" for="Grup_MemberID">Grup Member</label>
|
||||||
|
<div class="col-sm-6 col-lg-4">'.$tgrup.'</div>
|
||||||
|
<div class="col-sm-12 col-lg-6"><div class="input-group'.($this->app->user()->is_level(2)?'':' d-none').'"><span class="input-group-text" style="min-width:30%;">Harga Modal</span>'.$tmodal.'</div></div>
|
||||||
|
</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'.($this->app->user()->is_level(2)?'':' d-none').'"><div class="input-group-text">≈</div>'.$tpersen.'<div class="input-group-text">%</div></div></div>
|
||||||
|
<div class="col-sm-6 col-lg-4 text-end">
|
||||||
|
<button type="button" class="btn btn-warning shadow-none me-2" id="butBatalHarga">Batal</button><button type="button" class="btn btn-success shadow-none" id="butSimpanHarga">Simpan</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<input type="hidden" id="InvHargaID" value="'.$arec['InvHargaID'].'">
|
||||||
|
<input type="hidden" id="SatuanLamaID" value="'.$arec['SatuanID'].'">
|
||||||
|
<input type="hidden" id="GrupLamaID" value="'.$arec['Grup_MemberID'].'">
|
||||||
|
</div></div>';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_restore() {
|
||||||
|
$atabel = ['InvID'=>$this->id_inv, 'Nama_Grup'=>"", 'Nama_Stok'=>"", 'Nama_Normal'=>""];
|
||||||
|
$akemasan = []; $avarian = []; $aharga = [];
|
||||||
|
if (!empty($this->md5_key)) {
|
||||||
|
$arow = $this->db->fetchRow("SELECT * FROM inv_produk_backup WHERE MD5Key=?", [$this->md5_key]);
|
||||||
|
$atabel = array_merge($atabel, json_decode($arow['Produk'] ?? '[]', true)[0]);
|
||||||
|
$akemasan = json_decode($arow['Kemasan'] ?? '[]', true);
|
||||||
|
$avarian = json_decode($arow['Varian'] ?? '[]', true);
|
||||||
|
$aharga = json_decode($arow['Harga'] ?? '[]', true);
|
||||||
|
$atabel['Nama_Grup'] = (empty($atabel['Grup_InvID'])) ? '' : $this->db->fetchField("SELECT Nama_Grup FROM inv_produk_grup WHERE Grup_InvID=?", [$atabel['Grup_InvID']]);
|
||||||
|
$atabel['Nama_Stok'] = (empty($atabel['StokID'])) ? '' : $this->db->fetchField("SELECT Nama_Satuan FROM para_satuan WHERE SatuanID=?", [$atabel['StokID']]);
|
||||||
|
$atabel['Nama_Normal'] = (empty($atabel['NormalID'])) ? '' : $this->db->fetchField("SELECT Nama_Satuan FROM para_satuan WHERE SatuanID=?", [$atabel['NormalID']]);
|
||||||
|
$atabel['PPN'] = Invesa::PPN_Array()[$atabel['PPN']];
|
||||||
|
$atabel['Status_Aktif'] = ($atabel['Aktif']==1) ? "Aktif" : "Tidak";
|
||||||
|
}
|
||||||
|
|
||||||
|
$tnama = '<input type="text" class="form-control" value="'.$atabel['Nama_Produk'].'" readonly="">';
|
||||||
|
$tgrup = '<input type="text" class="form-control" value="'.$atabel['Nama_Grup'].'" 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="">';
|
||||||
|
$tppn = '<input type="text" class="form-control" value="'.$atabel['PPN'].'" 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;">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;">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 PPN<strong> *</strong></span>'.$tppn.'</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</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>Kemasan</th><th>Qty</th></tr></thead>
|
||||||
|
<tbody>';
|
||||||
|
|
||||||
|
if (count($akemasan) == 0) {
|
||||||
|
$ajson['html'] .= '<tr><td class="c" colspan="2">belum ada data</td></tr>';
|
||||||
|
}
|
||||||
|
foreach($akemasan as $val) {
|
||||||
|
$val['Nama_Satuan'] = (empty($val['SatuanID'])) ? '' : $this->db->fetchField("SELECT Nama_Satuan FROM para_satuan WHERE SatuanID=?", [$val['SatuanID']]);
|
||||||
|
$ajson['html'] .= sprintf('<tr><td class="l">%s</td><td class="r">%s</td></tr>', $val['Nama_Satuan'], rupiah((float)$val['Qty'])." ".$atabel['Nama_Stok']);
|
||||||
|
}
|
||||||
|
|
||||||
|
$ajson['html'] .= '
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div></div></div>
|
||||||
|
<!-- end kemasan -->
|
||||||
|
<!-- start varian -->
|
||||||
|
<div class="accordion-item">
|
||||||
|
<h2 class="accordion-header" id="flush-tri"><button class="accordion-button bg-success bg-gradient collapsed" style="--bs-bg-opacity: .5;" type="button" data-bs-toggle="collapse" data-bs-target="#flush-coll-tri" aria-controls="flush-coll-tri" aria-expanded="false">Varian</button></h2>
|
||||||
|
<div id="flush-coll-tri" class="accordion-collapse collapse" aria-labelledby="flush-head-tri" 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>SKU</th><th>Barcode</th><th>Kemasan</th><th>Varian</th></tr></thead>
|
||||||
|
<tbody>';
|
||||||
|
|
||||||
|
if (count($avarian) == 0) {
|
||||||
|
$ajson['html'] .= '<tr><td class="c" colspan="4">belum ada data</td></tr>';
|
||||||
|
}
|
||||||
|
foreach($avarian as $val) {
|
||||||
|
$val['Nama_Satuan'] = (empty($val['SatuanID'])) ? '' : $this->db->fetchField("SELECT Nama_Satuan FROM para_satuan WHERE SatuanID=?", [$val['SatuanID']]);
|
||||||
|
$val['Nama_Varian'] = (empty($val['VarianID'])) ? '' : $this->db->fetchField("SELECT Nama_Varian FROM para_varian WHERE VarianID=?", [$val['VarianID']]);
|
||||||
|
$ajson['html'] .= sprintf('<tr><td class="c">%s</td><td class="l">%s</td><td class="l">%s</td><td class="l">%s</td></tr>', $val['Kode_SKU'], $val['Kode_Barcode'], $val['Nama_Satuan'], $val['Nama_Varian']);
|
||||||
|
}
|
||||||
|
|
||||||
|
$ajson['html'] .= '
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div></div></div>
|
||||||
|
<!-- end varian -->
|
||||||
|
<!-- start harga -->
|
||||||
|
<div class="accordion-item">
|
||||||
|
<h2 class="accordion-header" id="flush-for"><button class="accordion-button bg-primary bg-gradient collapsed" style="--bs-bg-opacity: .5;" type="button" data-bs-toggle="collapse" data-bs-target="#flush-coll-for" aria-controls="flush-coll-for" aria-expanded="false">Harga Jual</button></h2>
|
||||||
|
<div id="flush-coll-for" class="accordion-collapse collapse" aria-labelledby="flush-head-for" 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>Kemasan</th><th>Grup Member</th><th>Harga Jual</th></tr></thead>
|
||||||
|
<tbody>';
|
||||||
|
|
||||||
|
if (count($aharga) == 0) {
|
||||||
|
$ajson['html'] .= '<tr><td class="c" colspan="3">belum ada data</td></tr>';
|
||||||
|
}
|
||||||
|
foreach($aharga as $val) {
|
||||||
|
$val['Nama_Satuan'] = (empty($val['SatuanID'])) ? '' : $this->db->fetchField("SELECT Nama_Satuan FROM para_satuan WHERE SatuanID=?", [$val['SatuanID']]);
|
||||||
|
$val['Nama_Grup'] = (empty($val['Grup_MemberID'])) ? '' : $this->db->fetchField("SELECT Nama_Grup FROM para_member_grup WHERE Grup_MemberID=?", [$val['Grup_MemberID']]);
|
||||||
|
$ajson['html'] .= sprintf('<tr><td class="l">%s</td><td class="l">%s</td><td class="r">%s</td></tr>', $val['Nama_Satuan'], $val['Nama_Grup'], rupiah((float)$val['Harga_Jual']));
|
||||||
|
}
|
||||||
|
|
||||||
|
$ajson['html'] .= '
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div></div></div>
|
||||||
|
<!-- end harga -->
|
||||||
|
</div>
|
||||||
|
</div></div>';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function proses_simpan() {
|
||||||
|
if ($this->mode === "cancel") {
|
||||||
|
if (Param::Get("mode_before", "") === "add") {
|
||||||
|
$this->db->delete("inv_produk_kemasan", "InvID=?", [$this->id_inv]);
|
||||||
|
$this->db->delete("inv_produk_varian", "InvID=?", [$this->id_inv]);
|
||||||
|
$this->db->delete("inv_produk_harga", "InvID=?", [$this->id_inv]);
|
||||||
|
$this->db->delete("inv_produk", "InvID=?", [$this->id_inv]);
|
||||||
|
} else {
|
||||||
|
$this->Produk_Restore();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$sql = new SQL($this->app);
|
||||||
|
$sql->set_table("inv_produk");
|
||||||
|
$sql->add_param("Grup_InvID");
|
||||||
|
$sql->add_param("Nama_Produk");
|
||||||
|
$sql->add_param("StokID");
|
||||||
|
$sql->add_param("NormalID");
|
||||||
|
$sql->add_param("PPN");
|
||||||
|
$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($this->mode, ["add","edit"])) {
|
||||||
|
$sql->UpdateDB();
|
||||||
|
} else if ($this->mode === "del") {
|
||||||
|
$sql->DeleteDB();
|
||||||
|
$this->db->delete("inv_produk_kemasan", "InvID=?", [$this->id_inv]);
|
||||||
|
$this->db->delete("inv_produk_varian", "InvID=?", [$this->id_inv]);
|
||||||
|
$this->db->delete("inv_produk_harga", "InvID=?", [$this->id_inv]);
|
||||||
|
}
|
||||||
|
if ($this->mode !== "del") {
|
||||||
|
$this->Produk_Save();
|
||||||
|
$this->Produk_Backup();
|
||||||
|
}
|
||||||
|
$this->inv->Produk_Join($this->id_inv);
|
||||||
|
}
|
||||||
|
$this->app->json([ 'status' => true ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function proses_restore() {
|
||||||
|
$this->Produk_Restore();
|
||||||
|
$this->app->json([ 'status' => true ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function proses_copy() {
|
||||||
|
$invBaru = Param::Get("InvBaruID", 0);
|
||||||
|
// Hapus kemasan dan harga sekarang
|
||||||
|
$this->db->runQuery("DELETE FROM inv_produk_kemasan WHERE InvID=?", [$this->id_inv]);
|
||||||
|
$this->db->runQuery("DELETE FROM inv_produk_varian WHERE InvID=?", [$this->id_inv]);
|
||||||
|
$this->db->runQuery("DELETE FROM inv_produk_harga WHERE InvID=?", [$this->id_inv]);
|
||||||
|
// Salin data baru kemasan dan harga
|
||||||
|
$this->db->runQuery("INSERT INTO inv_produk_kemasan (InvID,SatuanID,Qty,UserID) SELECT ?,SatuanID,Qty,UserID FROM inv_produk_kemasan WHERE InvID=?", [$this->id_inv, $invBaru]);
|
||||||
|
$this->db->runQuery("INSERT INTO inv_produk_varian (InvID,SatuanID,Kode_SKU,UserID) SELECT ?,SatuanID,'SKU_BARU',UserID FROM inv_produk_kemasan WHERE InvID=?", [$this->id_inv, $invBaru]);
|
||||||
|
$this->db->runQuery("INSERT INTO inv_produk_harga (InvID,SatuanID,Grup_MemberID,Harga_Jual,UserID) SELECT ?,SatuanID,Grup_MemberID,Harga_Jual,UserID FROM inv_produk_harga WHERE InvID=?", [$this->id_inv, $invBaru]);
|
||||||
|
$this->app->json([ 'status' => true ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function check_kemasan() {
|
||||||
|
$ada = (int) $this->db->fetchField("SELECT COUNT(*) FROM inv_produk_kemasan WHERE InvID=? AND SatuanID=?", [$this->id_inv, Param::Get("SatuanID",0)]) > 0;
|
||||||
|
$this->app->json([ 'ada' => $ada ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function check_varian() {
|
||||||
|
$ada = (int) $this->db->fetchField("SELECT COUNT(*) FROM inv_produk_varian WHERE (InvID=? AND SatuanID=? AND VarianID=?) OR Kode_Barcode=?", [$this->id_inv, Param::Get("SatuanID",0), Param::Get("VarianID",0), Param::Get("Kode_Barcode","")]) > 0;
|
||||||
|
$this->app->json([ 'ada' => $ada ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function check_harga() {
|
||||||
|
$ada = (int) $this->db->fetchField("SELECT COUNT(*) FROM inv_produk_harga WHERE InvID=? AND SatuanID=? AND Grup_MemberID=?", [$this->id_inv, Param::Get("SatuanID",0), Param::Get("Grup_MemberID",0)]) > 0;
|
||||||
|
$this->app->json([ 'ada' => $ada ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function check_modal() {
|
||||||
|
$qty = (int) $this->db->fetchField("SELECT Qty FROM inv_produk_kemasan WHERE InvID=? AND SatuanID=?", [$this->id_inv, Param::Get("SatuanID",0)]) ?? 0;
|
||||||
|
$this->app->json([ 'Qty' => $qty ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function print_barang() {
|
||||||
|
$id_sup = Param::Get("SupID", 0);
|
||||||
|
$id_grup = Param::Get("Grup_InvID", 0);
|
||||||
|
$id_member = Param::Get("Grup_MemberID", 0);
|
||||||
|
$nama_sup = ""; $nama_grup = ""; $nama_member = "";
|
||||||
|
if ($id_sup > 0) $nama_sup = $this->db->fetchField("SELECT CONCAT(Nama_Sup,' (',Kode_Sup,')') FROM para_supplier WHERE SupID=?", [$id_sup]);
|
||||||
|
if ($id_grup > 0) $nama_grup = $this->db->fetchField("SELECT Nama_Grup FROM inv_produk_grup WHERE Grup_InvID=?", [$id_grup]);
|
||||||
|
if ($id_member > 0) $nama_member = $this->db->fetchField("SELECT Nama_Grup FROM para_member_grup WHERE Grup_MemberID=?", [$id_member]);
|
||||||
|
|
||||||
|
// generate report header
|
||||||
|
$tglheader = "Tanggal Cetak : ".Param::Get("Tgl_Cetak");
|
||||||
|
$tsql = ''; $asql = [$id_member];
|
||||||
|
if ($id_sup > 0) { $tsql .= " AND S.SupID=?"; $asql[] = $id_sup; }
|
||||||
|
if ($id_grup > 0) { $tsql .= " AND P.Grup_InvID=?"; $asql[] = $id_grup; }
|
||||||
|
$tsql = (strlen($tsql) > 0) ? substr($tsql, 4) : 'TRUE';
|
||||||
|
|
||||||
|
// query data laporan
|
||||||
|
$stat = $this->db->runQuery("SELECT P.*,H.Harga_Jual FROM (SELECT * FROM inv_produk_harga WHERE Grup_MemberID=?) H LEFT JOIN vi_inv_produk P ON (H.InvID=P.InvID AND H.SatuanID=P.SatuanID) LEFT JOIN inv_produk_sup S ON (P.InvID=S.InvID) WHERE ".$tsql." GROUP BY P.InvID,P.SatuanID ORDER BY P.Nama_Produk, P.Qty DESC", $asql);
|
||||||
|
|
||||||
|
$pre = new PrintHTML($this->app);
|
||||||
|
$pre->add_title([strtoupper($this->reg_name), "Laporan Daftar Barang", $tglheader]);
|
||||||
|
|
||||||
|
$pre->add_field("No",10,"C");
|
||||||
|
$pre->add_field("Nama Barang",80);
|
||||||
|
$pre->add_field("Kemasan",10);
|
||||||
|
if ($this->app->user()->is_level(2)) $pre->add_field("Modal",12, "R", "rupiah");
|
||||||
|
$pre->add_field("Harga ".ucfirst(strtolower($nama_member)),12, "R", "rupiah");
|
||||||
|
if ($this->app->user()->is_level(2)) {
|
||||||
|
$pre->add_field("Margin",12, "R", "rupiah");
|
||||||
|
$pre->add_field("%",5, "R", "rupiah2");
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($id_sup > 0) $pre->add_sub_title("Nama Supplier : ".$nama_sup);
|
||||||
|
if ($id_grup > 0) $pre->add_sub_title("Grup Barang : ".$nama_grup);
|
||||||
|
|
||||||
|
$pre->show_titles();
|
||||||
|
$pre->show_headers();
|
||||||
|
|
||||||
|
$nomor = 0;
|
||||||
|
while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) {
|
||||||
|
if ($this->app->user()->is_level(2)) {
|
||||||
|
$pre->add_row([ ++$nomor, $row['Nama_Produk'], $row['Nama_Satuan'], $row['Harga_Pokok'], $row['Harga_Jual'], ((float) $row['Harga_Jual']-(float) $row['Harga_Pokok']), ((((float) $row['Harga_Jual']-(float) $row['Harga_Pokok'])*100)/(float) $row['Harga_Jual']) ]);
|
||||||
|
} else $pre->add_row([ ++$nomor, $row['Nama_Produk'], $row['Nama_Satuan'], $row['Harga_Jual'] ]);
|
||||||
|
}
|
||||||
|
$pre->add_stamp(0, true);
|
||||||
|
$pre->show();
|
||||||
|
}
|
||||||
|
|
||||||
|
private function Produk_Baru(bool $autosave = false): int {
|
||||||
|
$ino = $this->db->fetchField("SELECT MAX(InvID)+1 FROM inv_produk") ?? 1;
|
||||||
|
if ($autosave) $this->db->insert('inv_produk', ['InvID' => $ino]);
|
||||||
|
return $ino;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function Produk_Save(): void {
|
||||||
|
if ($this->id_inv === 0) return;
|
||||||
|
$sku_last = $this->db->fetchField("SELECT MAX(MID(Kode_SKU,6,2)) FROM inv_produk_varian WHERE Kode_SKU LIKE ?", ['%'.(string) $this->id_inv.'%']) ?? 1;
|
||||||
|
$avarian = $this->db->fetchColumn("SELECT InvVarianID FROM inv_produk_varian WHERE InvID=? AND (Kode_SKU='' OR Kode_SKU LIKE '%BARU%')", [$this->id_inv]);
|
||||||
|
if (count($avarian) > 0) {
|
||||||
|
foreach ($avarian as $val) {
|
||||||
|
$this->db->runQuery("UPDATE inv_produk_varian SET Kode_SKU=? WHERE InvVarianID=?", [Invesa::genEAN8((string) $this->id_inv, $sku_last), $val]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private function Produk_Backup(): void {
|
||||||
|
if ($this->id_inv === 0) return;
|
||||||
|
$this->db->runQuery("INSERT IGNORE INTO inv_produk_backup (InvID,UserID,Produk,Kemasan,Varian,Harga,MD5Key) SELECT A.InvID,A.UserID,A.Produk,IFNULL(B.Kemasan,'[]'),IFNULL(C.Varian,'[]'),IFNULL(D.Harga,'[]'),UPPER(MD5(CONCAT(A.Produk,IFNULL(B.Kemasan,'[]'),IFNULL(C.Varian,'[]'),IFNULL(D.Harga,'[]')))) FROM (SELECT InvID,UserID,JSON_ARRAYAGG(JSON_OBJECT('InvID',InvID,'Grup_InvID',Grup_InvID,'Nama_Produk',Nama_Produk,'StokID',StokID,'NormalID',NormalID,'PPN',PPN,'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='".$this->id_inv."') A LEFT JOIN (SELECT InvID,JSON_ARRAYAGG(JSON_OBJECT('InvKemasanID',InvKemasanID,'InvID',InvID,'SatuanID',SatuanID,'Qty',Qty)) Kemasan FROM inv_produk_kemasan WHERE InvID='".$this->id_inv."') B ON (A.InvID=B.InvID) LEFT JOIN (SELECT InvID,JSON_ARRAYAGG(JSON_OBJECT('InvVarianID',InvVarianID,'InvID',InvID,'SatuanID',SatuanID,'VarianID',VarianID,'Kode_SKU',Kode_SKU,'Kode_Barcode',Kode_Barcode)) Varian FROM inv_produk_varian WHERE InvID='".$this->id_inv."') C ON (A.InvID=C.InvID) LEFT JOIN (SELECT InvID,JSON_ARRAYAGG(JSON_OBJECT('InvHargaID',InvHargaID,'InvID',InvID,'SatuanID',SatuanID,'Grup_MemberID',Grup_MemberID,'Harga_Jual',Harga_Jual)) Harga FROM inv_produk_harga WHERE InvID='".$this->id_inv."') D ON (A.InvID=D.InvID)");
|
||||||
|
}
|
||||||
|
|
||||||
|
private function Produk_Restore(): void {
|
||||||
|
if ($this->id_inv === 0) return;
|
||||||
|
$_json_produk = []; $_json_kemasan = []; $_json_varian = []; $_json_harga = []; $_userid = 0;
|
||||||
|
$asql = [$this->id_inv]; $tsql = '';
|
||||||
|
if (empty($this->md5_key)) {
|
||||||
|
$tsql = 'ORDER BY Tanggal DESC';
|
||||||
|
} else {
|
||||||
|
$tsql = 'AND MD5Key=?';
|
||||||
|
$asql[] = $this->md5_key;
|
||||||
|
}
|
||||||
|
$arow = $this->db->fetchRow("SELECT * FROM inv_produk_backup WHERE InvID=? ".$tsql, $asql);
|
||||||
|
$_json_produk = json_decode($arow['Produk'] ?? '[]', true);
|
||||||
|
$_json_kemasan = json_decode($arow['Kemasan'] ?? '[]', true);
|
||||||
|
$_json_varian = json_decode($arow['Varian'] ?? '[]', true);
|
||||||
|
$_json_harga = json_decode($arow['Harga'] ?? '[]', true);
|
||||||
|
$_userid = $arow['UserID'] ?? 0;
|
||||||
|
if (isset($_json_produk[0]['InvID'])) {
|
||||||
|
$this->db->runQuery("DELETE FROM inv_produk_kemasan WHERE InvID=?", [$this->id_inv]);
|
||||||
|
$this->db->runQuery("DELETE FROM inv_produk_varian WHERE InvID=?", [$this->id_inv]);
|
||||||
|
$this->db->runQuery("DELETE FROM inv_produk_harga WHERE InvID=?", [$this->id_inv]);
|
||||||
|
foreach($_json_produk as $_key => $val) {
|
||||||
|
$this->db->runQuery("REPLACE INTO inv_produk (InvID,Grup_InvID,Nama_Produk,StokID,NormalID,PPN,Harga_Beli,Harga_Tambah,Harga_Pokok,Stok_Min,Stok_Max,Aktif,UserID) VALUES ('".$val['InvID']."','".$val['Grup_InvID']."','".$val['Nama_Produk']."','".$val['StokID']."','".$val['NormalID']."','".$val['PPN']."','".$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) {
|
||||||
|
$this->db->runQuery("INSERT INTO inv_produk_kemasan (InvKemasanID,InvID,SatuanID,Qty,UserID) VALUES ('".$val['InvKemasanID']."','".$val['InvID']."','".$val['SatuanID']."','".$val['Qty']."','".$_userid."') LIMIT 1");
|
||||||
|
}
|
||||||
|
foreach($_json_varian as $_key => $val) {
|
||||||
|
$this->db->runQuery("INSERT INTO inv_produk_varian (InvVarianID,InvID,SatuanID,VarianID,Kode_SKU,Kode_Barcode,UserID) VALUES ('".$val['InvVarianID']."','".$val['InvID']."','".$val['SatuanID']."','".$val['VarianID']."','".$val['Kode_SKU']."','".$val['Kode_Barcode']."','".$_userid."') LIMIT 1");
|
||||||
|
}
|
||||||
|
foreach($_json_harga as $_key => $val) {
|
||||||
|
$this->db->runQuery("INSERT INTO inv_produk_harga (InvHargaID,InvID,SatuanID,Grup_MemberID,Harga_Jual,UserID) VALUES ('".$val['InvHargaID']."','".$val['InvID']."','".$val['SatuanID']."','".$val['Grup_MemberID']."','".$val['Harga_Jual']."','".$_userid."') LIMIT 1");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$this->app->json(['html' => '
|
||||||
|
<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-9"><div class="input-group"><input class="form-control" id="Cari_Produk" placeholder="Kunci Pencarian" type="text"><button class="btn btn-info shadow-none" type="button" id="butSearch">Cari</button><button class="btn btn-secondary shadow-none" type="button" id="butAll">Semua</button></div></div><div class="col-3 btn-group"><button class="btn btn-info shadow-none" type="button" id="butPrint"><i class="bi-printer me-2"></i>Cetak</button><button class="btn btn-secondary shadow-none" type="button" id="butFilter"><i class="bi-filter me-2"></i>Filter</button></div><input type="hidden" id="Filter_Produk" value="0" /></div><div id="divDetail"> </div></div></div></div>'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,121 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Table/ProdukgrupController
|
||||||
|
Description : Master Grup Barang
|
||||||
|
Created By : Siau Pheng (siaupheng@3fonia.com).
|
||||||
|
Created Date : February 8th, 2011.
|
||||||
|
Last Modified : August 31st, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Table;
|
||||||
|
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use Webapp\DB\SQL;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
use Webapp\Web\Table;
|
||||||
|
|
||||||
|
class ProdukgrupController {
|
||||||
|
|
||||||
|
private string $mode_detail;
|
||||||
|
private int $id_grup;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->mode_detail = Param::Get("mode_detail", "");
|
||||||
|
$this->id_grup = (int) Param::Get("Grup_InvID", 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function table_detail() {
|
||||||
|
if (in_array($this->mode_detail, ["insert","update","delete"])) {
|
||||||
|
$sql = new SQL($this->app);
|
||||||
|
$sql->set_table("inv_produk_grup");
|
||||||
|
$sql->add_param("Kode_Grup");
|
||||||
|
$sql->add_param("Nama_Grup");
|
||||||
|
$sql->add_param("Margin");
|
||||||
|
$sql->add_param("Aktif");
|
||||||
|
$sql->add_param_userid();
|
||||||
|
$sql->add_where("Grup_InvID");
|
||||||
|
|
||||||
|
if ($this->mode_detail === "insert") {
|
||||||
|
$sql->InsertDB();
|
||||||
|
} else if ($this->mode_detail === "update") {
|
||||||
|
$sql->UpdateDB();
|
||||||
|
} else if ($this->mode_detail === "delete") {
|
||||||
|
$sql->DeleteDB();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$tcari = Param::Get("Cari_Grup");
|
||||||
|
$tsql = ''; $asql = [];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql = 'CONCAT(Kode_Grup,Nama_Grup) LIKE ?';
|
||||||
|
$asql[] = '%'. $tcari .'%';
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("inv_produk_grup", "*", $tsql, $asql);
|
||||||
|
$obj->add_field("Grup_InvID", "ID", "hid");
|
||||||
|
$obj->add_field("Kode_Grup", "Kode Grup", "l");
|
||||||
|
$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_btn("ProdukGrupJS.detail_tambah", "+ Grup Produk");
|
||||||
|
$this->app->json([ $obj->json_table("divDetail") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_grup() {
|
||||||
|
$atabel = ['Grup_InvID'=>0, 'Kode_Grup'=>"", 'Nama_Grup'=>"", 'Margin'=>0, 'Aktif'=>1];
|
||||||
|
if ($this->id_grup > 0) {
|
||||||
|
$atabel = $this->db->fetchRow("SELECT * FROM inv_produk_grup WHERE Grup_InvID=?", [$this->id_grup]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$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->radio("_", "Aktif", $atabel['Aktif'], true, true, ['1'=>"Aktif",'0'=>"Tidak"]);
|
||||||
|
$ajson['html'] = '
|
||||||
|
<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">'.$tkode.'</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 d-flex gap-2">'.$taktif.'</div>
|
||||||
|
</div>
|
||||||
|
<input type="hidden" id="Grup_InvID" value="'.$atabel['Grup_InvID'].'" >
|
||||||
|
<input type="hidden" id="mode_detail" value="'.$this->mode_detail.'" >';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$this->app->json(['html' => '
|
||||||
|
<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"> </div></div></div>
|
||||||
|
</div>'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,121 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Table/RekposController
|
||||||
|
Description : Master Jenis Pembayaran POS
|
||||||
|
Created By : Siau Pheng (siaupheng@3fonia.com).
|
||||||
|
Created Date : September 9th, 2014.
|
||||||
|
Last Modified : August 31st, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Table;
|
||||||
|
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use Webapp\DB\SQL;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
use Webapp\Web\Table;
|
||||||
|
|
||||||
|
class RekposController {
|
||||||
|
|
||||||
|
private string $mode_detail;
|
||||||
|
private int $id_kartu;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->mode_detail = Param::Get("mode_detail", "");
|
||||||
|
$this->id_kartu = (int) Param::Get("KartuID", 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function table_detail() {
|
||||||
|
if (in_array($this->mode_detail, ["insert","update","delete"])) {
|
||||||
|
$sql = new SQL($this->app);
|
||||||
|
$sql->set_table("para_rek_pos");
|
||||||
|
$sql->add_param("Kode_Kartu");
|
||||||
|
$sql->add_param("Nama_Kartu");
|
||||||
|
$sql->add_param("Kode_Rek");
|
||||||
|
$sql->add_param("Aktif");
|
||||||
|
$sql->add_param_userid();
|
||||||
|
$sql->add_where("KartuID");
|
||||||
|
|
||||||
|
if ($this->mode_detail === "insert") {
|
||||||
|
$sql->InsertDB();
|
||||||
|
} else if ($this->mode_detail === "update") {
|
||||||
|
$sql->UpdateDB();
|
||||||
|
} else if ($this->mode_detail === "delete") {
|
||||||
|
$sql->DeleteDB();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$tcari = Param::Get("Cari_Rekpos");
|
||||||
|
$tsql = ''; $asql = [];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql = 'CONCAT(Kode_Kartu,Nama_Kartu) LIKE ?';
|
||||||
|
$asql[] = '%'. $tcari .'%';
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("para_rek_pos", "*", $tsql, $asql);
|
||||||
|
$obj->add_field("KartuID", "ID", "hid");
|
||||||
|
$obj->add_field("Kode_Kartu", "Kode");
|
||||||
|
$obj->add_field("Nama_Kartu", "Nama Jenis Pembayaran", "awr");
|
||||||
|
$obj->add_field("Kode_Rek", "Rekening", "c");
|
||||||
|
$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_btn("RekPOSJS.detail_tambah", "+ Jenis Pembayaran");
|
||||||
|
$this->app->json([ $obj->json_table("divDetail") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_rekpos() {
|
||||||
|
$atabel = ['KartuID'=>0, 'Kode_Kartu'=>"", 'Nama_Kartu'=>"", 'Kode_Rek'=>"", 'Aktif'=>1];
|
||||||
|
if ($this->id_kartu > 0) {
|
||||||
|
$atabel = $this->db->fetchRow("SELECT * FROM para_rek_pos WHERE KartuID=?", [$this->id_kartu]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$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");
|
||||||
|
$trek = $form->option_db("_", "Kode_Rek", $atabel['Kode_Rek'], true, false, "vi_gel_acc", ["Kode_Rek","Nama_Lengkap"], "Kode_Induk='1100' AND Mode='D' AND Aktif=1 ORDER BY Nama_Lengkap", [0," "]);
|
||||||
|
$taktif = $form->radio("_", "Aktif", $atabel['Aktif'], true, true, ['1'=>"Aktif",'0'=>"Tidak"]);
|
||||||
|
$ajson['html'] = '
|
||||||
|
<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="Kode_Rek">Nama Rekening</label>
|
||||||
|
<div class="col">'.$trek.'</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 d-flex gap-2">'.$taktif.'</div>
|
||||||
|
</div>
|
||||||
|
<input type="hidden" id="KartuID" value="'.$atabel['KartuID'].'" >
|
||||||
|
<input type="hidden" id="mode_detail" value="'.$this->mode_detail.'" >';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$this->app->json(['html' => '
|
||||||
|
<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_Rekpos" 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"> </div></div></div>
|
||||||
|
</div>'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,114 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Table/SatuanController
|
||||||
|
Description : Master Satuan
|
||||||
|
Created By : Siau Pheng (siaupheng@3fonia.com).
|
||||||
|
Created Date : May 19th, 2010.
|
||||||
|
Last Modified : August 31st, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Table;
|
||||||
|
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use Webapp\DB\SQL;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
use Webapp\Web\Table;
|
||||||
|
|
||||||
|
class SatuanController {
|
||||||
|
|
||||||
|
private string $mode_detail;
|
||||||
|
private int $id_satuan;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->mode_detail = Param::Get("mode_detail", "");
|
||||||
|
$this->id_satuan = (int) Param::Get("SatuanID", 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function table_detail() {
|
||||||
|
if (in_array($this->mode_detail, ["insert","update","delete"])) {
|
||||||
|
$sql = new SQL($this->app);
|
||||||
|
$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 ($this->mode_detail === "insert") {
|
||||||
|
$sql->InsertDB();
|
||||||
|
} else if ($this->mode_detail === "update") {
|
||||||
|
$sql->UpdateDB();
|
||||||
|
} else if ($this->mode_detail === "delete") {
|
||||||
|
$sql->DeleteDB();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$tcari = Param::Get("Cari_Satuan");
|
||||||
|
$tsql = ''; $asql = [];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql = 'CONCAT(Kode_Satuan,Nama_Satuan) LIKE ?';
|
||||||
|
$asql[] = '%'. $tcari .'%';
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("para_satuan", "*", $tsql, $asql);
|
||||||
|
$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_btn("SatuanJS.detail_tambah", "+ Satuan");
|
||||||
|
$this->app->json([ $obj->json_table("divDetail") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_satuan() {
|
||||||
|
$atabel = ['SatuanID'=>0, 'Kode_Satuan'=>"", 'Nama_Satuan'=>"", 'Aktif'=>1];
|
||||||
|
if ($this->id_satuan > 0) {
|
||||||
|
$atabel = $this->db->fetchRow("SELECT * FROM para_satuan WHERE SatuanID=?", [$this->id_satuan]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$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->radio("_", "Aktif", $atabel['Aktif'], true, true, ['1'=>"Aktif",'0'=>"Tidak"]);
|
||||||
|
$ajson['html'] = '
|
||||||
|
<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 d-flex gap-2">'.$taktif.'</div>
|
||||||
|
</div>
|
||||||
|
<input type="hidden" id="SatuanID" value="'.$atabel['SatuanID'].'" >
|
||||||
|
<input type="hidden" id="mode_detail" value="'.$this->mode_detail.'" >';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$this->app->json(['html' => '
|
||||||
|
<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"> </div></div></div>
|
||||||
|
</div>'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,135 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Table/SupplierController
|
||||||
|
Description : Master Supplier
|
||||||
|
Created By : Siau Pheng (siaupheng@3fonia.com).
|
||||||
|
Created Date : December 7th, 2010.
|
||||||
|
Last Modified : August 31st, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Table;
|
||||||
|
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use Webapp\DB\SQL;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
use Webapp\Web\Table;
|
||||||
|
|
||||||
|
class SupplierController {
|
||||||
|
|
||||||
|
private string $mode_detail;
|
||||||
|
private int $id_sup;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->mode_detail = Param::Get("mode_detail", "");
|
||||||
|
$this->id_sup = (int) Param::Get("SupID", 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function table_detail() {
|
||||||
|
if (in_array($this->mode_detail, ["insert","update","delete"])) {
|
||||||
|
$sql = new SQL($this->app);
|
||||||
|
$sql->set_table("para_supplier");
|
||||||
|
$sql->add_param("Kode_Sup");
|
||||||
|
$sql->add_param("Nama_Sup");
|
||||||
|
$sql->add_param("Alamat_Sup");
|
||||||
|
$sql->add_param("Telp_Sup");
|
||||||
|
$sql->add_param("No_NPWP");
|
||||||
|
$sql->add_param("No_NITKU");
|
||||||
|
$sql->add_param("Aktif");
|
||||||
|
$sql->add_param_userid();
|
||||||
|
$sql->add_where("SupID");
|
||||||
|
|
||||||
|
if ($this->mode_detail === "insert") {
|
||||||
|
$sql->InsertDB();
|
||||||
|
} else if ($this->mode_detail === "update") {
|
||||||
|
$sql->UpdateDB();
|
||||||
|
} else if ($this->mode_detail === "delete") {
|
||||||
|
$sql->DeleteDB();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$tcari = Param::Get("Cari_Sup");
|
||||||
|
$tsql = ''; $asql = [];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql = 'CONCAT(Kode_Sup,Nama_Sup,Telp_Sup) LIKE ?';
|
||||||
|
$asql[] = '%'. $tcari .'%';
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("para_supplier", "*", $tsql, $asql);
|
||||||
|
$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_btn("SupplierJS.detail_tambah", "+ Supplier");
|
||||||
|
$this->app->json([ $obj->json_table("divDetail") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_supplier() {
|
||||||
|
$atabel = ['SupID'=>0, 'Kode_Sup'=>"", 'Nama_Sup'=>"", 'Alamat_Sup', 'Telp_Sup'=>"", 'No_NPWP'=>"", 'No_NITKU'=>"", 'Aktif'=>1];
|
||||||
|
if ($this->id_sup > 0) {
|
||||||
|
$atabel = $this->db->fetchRow("SELECT * FROM para_supplier WHERE SupID=?", [$this->id_sup]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tkode = $form->textbox("_", "Kode_Sup", $atabel['Kode_Sup'], true, true, "text", "kode supplier");
|
||||||
|
$tnama = $form->textbox("_", "Nama_Sup", $atabel['Nama_Sup'], true, true, "text", "nama supplier");
|
||||||
|
$talamat = $form->textarea("_", "Alamat_Sup", $atabel['Alamat_Sup'], true, true, 3, "alamat supplier");
|
||||||
|
$ttelp = $form->textbox("_", "Telp_Sup", $atabel['Telp_Sup'], true, true, "text", "telp supplier");
|
||||||
|
$tnpwp = $form->textbox("NPWP Supplier", "No_NPWP", $atabel['No_NPWP'], true, true, "text", "0000000000000000", 16);
|
||||||
|
$tnitku = $form->textbox("NITKU Supplier", "No_NITKU", $atabel['No_NITKU'], true, true, "text", "000000", 6);
|
||||||
|
$taktif = $form->radio("_", "Aktif", $atabel['Aktif'], true, true, ['1'=>"Aktif",'0'=>"Tidak"]);
|
||||||
|
$ajson['html'] = '
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-5 col-lg-2 col-form-label" for="Kode_Sup">Kode Supplier</label>
|
||||||
|
<div class="col-sm-7 col-lg-4">'.$tkode.'</div>
|
||||||
|
<label class="col-sm-5 col-lg-2 col-form-label" for="Aktif">Status Aktif ?</label>
|
||||||
|
<div class="col d-flex gap-2">'.$taktif.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-5 col-lg-2 col-form-label" for="Nama_Sup">Nama Supplier</label>
|
||||||
|
<div class="col-sm-7 col-lg-10">'.$tnama.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-5 col-lg-2 col-form-label" for="Alamat_Sup">Alamat Supplier</label>
|
||||||
|
<div class="col-sm-7 col-lg-10">'.$talamat.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-5 col-lg-2 col-form-label" for="Telp_Sup">Telpon Supplier</label>
|
||||||
|
<div class="col-sm-7 col-lg-10">'.$ttelp.'</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-5 col-lg-2 col-form-label" for="No_NPWP">NPWP Member</label>
|
||||||
|
<div class="col-sm-7 col-lg-4">'.$tnpwp.'</div>
|
||||||
|
<label class="col-sm-5 col-lg-2 col-form-label" for="No_NITKU">NITKU Member</label>
|
||||||
|
<div class="col-sm-7 col-lg-4">'.$tnitku.'</div>
|
||||||
|
</div>
|
||||||
|
<input type="hidden" id="SupID" value="'.$atabel['SupID'].'" />
|
||||||
|
<input type="hidden" id="mode_detail" value="'.$this->mode_detail.'" />';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$this->app->json(['html' => '
|
||||||
|
<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"> </div></div></div>
|
||||||
|
</div>'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,107 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Controller/Table/VarianController
|
||||||
|
Description : Master Varian
|
||||||
|
Created By : Siau Pheng (siaupheng@3fonia.com).
|
||||||
|
Created Date : May 19th, 2010.
|
||||||
|
Last Modified : August 31st, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Controller\Table;
|
||||||
|
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\database\SimplePdo;
|
||||||
|
use Webapp\DB\SQL;
|
||||||
|
use Webapp\Web\Form;
|
||||||
|
use Webapp\Web\Param;
|
||||||
|
use Webapp\Web\Table;
|
||||||
|
|
||||||
|
class VarianController {
|
||||||
|
|
||||||
|
private string $mode_detail;
|
||||||
|
private int $id_varian;
|
||||||
|
protected Engine $app;
|
||||||
|
protected SimplePdo $db;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, SimplePdo $db) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->db = $db;
|
||||||
|
$this->mode_detail = Param::Get("mode_detail", "");
|
||||||
|
$this->id_varian = (int) Param::Get("VarianID", 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function table_detail() {
|
||||||
|
if (in_array($this->mode_detail, ["insert","update","delete"])) {
|
||||||
|
$sql = new SQL($this->app);
|
||||||
|
$sql->set_table("para_varian");
|
||||||
|
$sql->add_param("Nama_Varian");
|
||||||
|
$sql->add_param("Aktif");
|
||||||
|
$sql->add_param_userid();
|
||||||
|
$sql->add_where("VarianID");
|
||||||
|
|
||||||
|
if ($this->mode_detail === "insert") {
|
||||||
|
$sql->InsertDB();
|
||||||
|
} else if ($this->mode_detail === "update") {
|
||||||
|
$sql->UpdateDB();
|
||||||
|
} else if ($this->mode_detail === "delete") {
|
||||||
|
$sql->DeleteDB();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$tcari = Param::Get("Cari_Varian");
|
||||||
|
$tsql = ''; $asql = [];
|
||||||
|
if (!empty($tcari)) {
|
||||||
|
$tsql = 'Nama_Varian LIKE ?';
|
||||||
|
$asql[] = '%'. $tcari .'%';
|
||||||
|
}
|
||||||
|
|
||||||
|
$obj = new Table($this->app);
|
||||||
|
$obj->set_table("para_varian", "*", $tsql, $asql);
|
||||||
|
$obj->add_field("VarianID", "ID", "hid");
|
||||||
|
$obj->add_field("Nama_Varian", "Nama Varian", "awr");
|
||||||
|
$obj->add_field("Aktif", "Aktif", "c", "checkbox");
|
||||||
|
$obj->set_field_order("Nama_Varian", "A");
|
||||||
|
$obj->add_row_btn("clipboard", "Ubah", "VarianJS.detail_ubah");
|
||||||
|
$obj->add_row_btn("trash", "Hapus", "VarianJS.detail_hapus");
|
||||||
|
$obj->set_func_btn("VarianJS.detail_tambah", "+ Varian");
|
||||||
|
$this->app->json([ $obj->json_table("divDetail") ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function form_varian() {
|
||||||
|
$atabel = ['VarianID'=>0, 'Nama_Varian'=>"", 'Aktif'=>1];
|
||||||
|
if ($this->id_varian > 0) {
|
||||||
|
$atabel = $this->db->fetchRow("SELECT * FROM para_varian WHERE VarianID=?", [$this->id_varian]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$form = new Form($this->app);
|
||||||
|
$tnama = $form->textbox("_", "Nama_Varian", $atabel['Nama_Varian'], true, true, "text", "nama varian barang");
|
||||||
|
$taktif = $form->radio("_", "Aktif", $atabel['Aktif'], true, true, ['1'=>"Aktif",'0'=>"Tidak"]);
|
||||||
|
$ajson['html'] = '
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label class="col-sm-4 col-lg-3 col-form-label" for="Nama_Varian">Nama Varian</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 d-flex gap-2">'.$taktif.'</div>
|
||||||
|
</div>
|
||||||
|
<input type="hidden" id="VarianID" value="'.$atabel['VarianID'].'" >
|
||||||
|
<input type="hidden" id="mode_detail" value="'.$this->mode_detail.'" >';
|
||||||
|
$this->app->json($ajson);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index() {
|
||||||
|
$this->app->json(['html' => '
|
||||||
|
<div class="fade-in">
|
||||||
|
<div class="card"><div class="card-header custom-style">Daftar Varian Barang</div><div class="card-body"><div class="row mb-1"><div class="col"><div class="input-group"><input class="form-control" id="Cari_Varian" 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"> </div></div></div>
|
||||||
|
</div>'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,69 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
|
||||||
|
PHP Class : /Middleware/SecurityHeaders
|
||||||
|
Description : Control User Sesion dan CSP
|
||||||
|
Created By : Siau Pheng (siaupheng@3fonia.com).
|
||||||
|
Created Date : December 7th, 2008.
|
||||||
|
Last Modified : October 20th, 2026.
|
||||||
|
|
||||||
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
||||||
|
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace App\Middleware;
|
||||||
|
|
||||||
|
use flight\Engine;
|
||||||
|
use flight\Session;
|
||||||
|
use Webapp\App\Register;
|
||||||
|
use Tracy\Debugger;
|
||||||
|
|
||||||
|
class SecurityHeaders {
|
||||||
|
|
||||||
|
protected Engine $app;
|
||||||
|
protected Session $session;
|
||||||
|
|
||||||
|
public function __construct(Engine $app, Session $session) {
|
||||||
|
$this->app = $app;
|
||||||
|
$this->session = $session;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function before(): void {
|
||||||
|
$url = $this->app->request()->url;
|
||||||
|
|
||||||
|
// check if slash on end url
|
||||||
|
if ($url !== '/' && substr($url, -1) === '/') {
|
||||||
|
$clean_url = rtrim($url, '/');
|
||||||
|
$this->app->redirect($clean_url, 301);
|
||||||
|
}
|
||||||
|
|
||||||
|
// check register
|
||||||
|
if (Register::reg_check($this->session)) {
|
||||||
|
if (!$this->app->user()->logged() && !str_ends_with($url, '/login') && !str_contains($url, 'monitor') && !str_contains($url, '/cache')) {
|
||||||
|
$this->app->redirect('login', 307);
|
||||||
|
$this->app->stop();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (!str_ends_with($url, '/401')) {
|
||||||
|
$this->session->delete('WEB_APP');
|
||||||
|
$this->app->redirect('401', 308);
|
||||||
|
$this->app->stop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// security
|
||||||
|
$nonce = $this->app->get('csp_nonce');
|
||||||
|
$tracyCssBypass = (Debugger::$showBar === true) ? '\'unsafe-inline\'' : "'nonce-{$nonce}'";
|
||||||
|
|
||||||
|
$this->app->response()->header('X-Frame-Options', 'SAMEORIGIN');
|
||||||
|
$this->app->response()->header("Content-Security-Policy", "default-src 'self'; script-src 'self' 'nonce-{$nonce}'; style-src 'self' {$tracyCssBypass}; img-src 'self' data:; connect-src 'self' ws://localhost:* wss://localhost:*");
|
||||||
|
$this->app->response()->header('X-XSS-Protection', '1; mode=block');
|
||||||
|
$this->app->response()->header('X-Content-Type-Options', 'nosniff');
|
||||||
|
$this->app->response()->header('Referrer-Policy', 'no-referrer-when-downgrade');
|
||||||
|
$this->app->response()->header('Strict-Transport-Security', 'max-age=31536000; includeSubDomains; preload');
|
||||||
|
$this->app->response()->header('Permissions-Policy', 'geolocation=()');
|
||||||
|
}
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user