Merged in feature/margin-hargaemas-v2 (pull request #408)
Feature/margin hargaemas v2
This commit is contained in:
@@ -2,14 +2,206 @@
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Audit;
|
||||
use App\MaxMutuEmas;
|
||||
use App\MaxPinjaman;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
use Illuminate\Support\Facades\Log;
|
||||
class MaxPinjamanController extends Controller
|
||||
{
|
||||
public function getAllMaxPinjaman(){
|
||||
$pinjaman = MaxPinjaman::on('mysql7')->get();
|
||||
public function getAllMaxPinjaman(Request $request)
|
||||
{
|
||||
if (config('parameter.max_mutuemas')) {
|
||||
$data = MaxMutuEmas::on('mysql7')->select('karat', 'teller', 'pc', 'operasi')->get();
|
||||
|
||||
$calculateMargin = $this->calculateMaxPinjamanMutu($data, $request->mutu,$request->total_nilai_marhun);
|
||||
|
||||
$pinjaman = [
|
||||
[
|
||||
"user_type" => "teller",
|
||||
"max" => $calculateMargin['teller'],
|
||||
"teller_pinjaman" => $calculateMargin['teller_pinjaman']
|
||||
|
||||
],
|
||||
[
|
||||
"user_type" => "khazanah",
|
||||
"max" => $calculateMargin['pc'],
|
||||
"pc_pinjaman" => $calculateMargin['pc_pinjaman']
|
||||
],
|
||||
[
|
||||
"user_type" => "operasi",
|
||||
"max" => $calculateMargin['operasi'],
|
||||
"operasi_pinjaman" => $calculateMargin['operasi_pinjaman']
|
||||
]
|
||||
];
|
||||
} else {
|
||||
$pinjaman = MaxPinjaman::on('mysql7')->get();
|
||||
}
|
||||
return response()->json($pinjaman);
|
||||
}
|
||||
|
||||
public function calculateMaxPinjamanMutu($data, $mutu,$totalMarhun)
|
||||
{
|
||||
$totalMaxMarhunPC = 0;
|
||||
$totalMaxMarhunTeller = 0;
|
||||
$totalMaxMarhunOperasi = 0;
|
||||
|
||||
if($mutu == null || $totalMarhun == 0){
|
||||
return [
|
||||
"pc" => 0,
|
||||
"pc_pinjaman" => 0,
|
||||
"teller" => 0,
|
||||
"teller_pinjaman" => 0,
|
||||
"operasi" => 0,
|
||||
"operasi_pinjaman" => 0
|
||||
];
|
||||
}
|
||||
$mutuKarat = array_map(function($item) {
|
||||
return $item[0];
|
||||
}, $mutu);
|
||||
$mutuNilai = array_map(function($item) {
|
||||
return $item[1];
|
||||
}, $mutu);
|
||||
|
||||
foreach($mutuKarat as $index => $karat){
|
||||
$margin = $data->where('karat', $karat)->first();
|
||||
if($margin){
|
||||
$nilai = $mutuNilai[$index];
|
||||
$totalMaxMarhunPC += round(($margin->pc/100) * $nilai, 2);
|
||||
$totalMaxMarhunTeller += round(($margin->teller/100) * $nilai, 2);
|
||||
$totalMaxMarhunOperasi += round(($margin->operasi/100) * $nilai, 2);
|
||||
}
|
||||
}
|
||||
|
||||
$totalMaxPC = $totalMarhun > 0 ? ($totalMaxMarhunPC / $totalMarhun) * 100 : 0;
|
||||
$totalMaxTeller = $totalMarhun > 0 ? ($totalMaxMarhunTeller / $totalMarhun) * 100 : 0;
|
||||
$totalMaxOperasi = $totalMarhun > 0 ? ($totalMaxMarhunOperasi / $totalMarhun) * 100 : 0;
|
||||
return [
|
||||
"pc" => round($totalMaxPC,2),
|
||||
"pc_pinjaman" => round(($totalMaxPC / 100) * $totalMarhun, 2),
|
||||
"teller" => round($totalMaxTeller,2),
|
||||
"teller_pinjaman" => round(($totalMaxTeller / 100) * $totalMarhun, 2),
|
||||
"operasi" => round($totalMaxOperasi,2),
|
||||
"operasi_pinjaman" => round(($totalMaxOperasi / 100) * $totalMarhun, 2)
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
public function getAllMaxMutuEmas(Request $request)
|
||||
{
|
||||
$maxmutuemas = MaxMutuEmas::on('mysql7')->get();
|
||||
return response()->json($maxmutuemas);
|
||||
}
|
||||
|
||||
public function getSpecificMaxMutuEmas(Request $request)
|
||||
{
|
||||
$karat = $request->karat;
|
||||
$nilaimarhun = $request->nilaimarhun;
|
||||
|
||||
$nilaimarhun = preg_replace('/[^0-9.]/', '', $nilaimarhun); // Remove non-numeric characters except decimal point
|
||||
$nilaimarhun = is_numeric($nilaimarhun) ? (float)$nilaimarhun : 0;
|
||||
|
||||
$maxmutuemas = MaxMutuEmas::on('mysql7')->where('karat', $karat)->first();
|
||||
|
||||
if($maxmutuemas && $nilaimarhun > 0){
|
||||
$maxmutuemas->maxteller = round(($maxmutuemas->teller/100) * $nilaimarhun, 2);
|
||||
$maxmutuemas->maxpc = round(($maxmutuemas->pc/100) * $nilaimarhun, 2);
|
||||
$maxmutuemas->maxoperasi = round(($maxmutuemas->operasi/100) * $nilaimarhun, 2);
|
||||
} else if($maxmutuemas) {
|
||||
$maxmutuemas->maxteller = 0;
|
||||
$maxmutuemas->maxpc = 0;
|
||||
$maxmutuemas->maxoperasi = 0;
|
||||
}
|
||||
|
||||
return response()->json($maxmutuemas);
|
||||
}
|
||||
|
||||
public function updateMaxMutuEmas(Request $request)
|
||||
{
|
||||
// Validate the request manually for Lumen
|
||||
$validator = \Illuminate\Support\Facades\Validator::make($request->all(), [
|
||||
'recno' => 'required|integer',
|
||||
'karat' => 'required|string|max:10',
|
||||
'keterangan' => 'required|string|max:255',
|
||||
'teller' => 'required|numeric|min:0|max:100',
|
||||
'pc' => 'required|numeric|min:0|max:100',
|
||||
'operasi' => 'required|numeric|min:0|max:100',
|
||||
'username' => 'required|string|max:255'
|
||||
], [
|
||||
'recno.required' => 'Nombor rekod diperlukan.',
|
||||
'recno.integer' => 'Nombor rekod mesti berupa nombor.',
|
||||
'karat.required' => 'Karat diperlukan.',
|
||||
'karat.string' => 'Karat mesti berupa teks.',
|
||||
'karat.max' => 'Karat tidak boleh lebih dari 10 aksara.',
|
||||
'keterangan.required' => 'Keterangan diperlukan.',
|
||||
'keterangan.string' => 'Keterangan mesti berupa teks.',
|
||||
'keterangan.max' => 'Keterangan tidak boleh lebih dari 255 aksara.',
|
||||
'teller.required' => 'Peratus teller diperlukan.',
|
||||
'teller.numeric' => 'Peratus teller mesti berupa nombor.',
|
||||
'teller.min' => 'Peratus teller mestilah sekurang-kurangnya 0.',
|
||||
'teller.max' => 'Peratus teller tidak boleh melebihi 100.',
|
||||
'pc.required' => 'Peratus PC diperlukan.',
|
||||
'pc.numeric' => 'Peratus PC mesti berupa nombor.',
|
||||
'pc.min' => 'Peratus PC mestilah sekurang-kurangnya 0.',
|
||||
'pc.max' => 'Peratus PC tidak boleh melebihi 100.',
|
||||
'operasi.required' => 'Peratus operasi diperlukan.',
|
||||
'operasi.numeric' => 'Peratus operasi mesti berupa nombor.',
|
||||
'operasi.min' => 'Peratus operasi mestilah sekurang-kurangnya 0.',
|
||||
'operasi.max' => 'Peratus operasi tidak boleh melebihi 100.',
|
||||
]);
|
||||
|
||||
if ($validator->fails()) {
|
||||
return response()->json([
|
||||
'status' => 'error',
|
||||
'message' => 'Pengesahan gagal',
|
||||
'errors' => $validator->errors()
|
||||
], 422);
|
||||
}
|
||||
|
||||
$recno = $request->recno;
|
||||
$karat = $request->karat;
|
||||
$keterangan = $request->keterangan;
|
||||
$teller = $request->teller;
|
||||
$pc = $request->pc;
|
||||
$operasi = $request->operasi;
|
||||
$username = $request->username;
|
||||
|
||||
$current = \Carbon\Carbon::now();
|
||||
|
||||
$maxmutuemas = MaxMutuEmas::on('mysql7')->where('recno', $recno)->first();
|
||||
|
||||
if ($maxmutuemas) {
|
||||
$oldmax = $maxmutuemas->toJson();
|
||||
|
||||
$maxmutuemas->karat = $karat;
|
||||
$maxmutuemas->keterangan = $keterangan;
|
||||
$maxmutuemas->teller = $teller;
|
||||
$maxmutuemas->pc = $pc;
|
||||
$maxmutuemas->operasi = $operasi;
|
||||
$maxmutuemas->tarikhupdate = \Carbon\Carbon::now();
|
||||
$maxmutuemas->save();
|
||||
|
||||
Audit::create([
|
||||
'users' => $username,
|
||||
'actions' => 'Penukaran Mutu Margin',
|
||||
'norujukan' => '-',
|
||||
'new_data' => $maxmutuemas->toJson(),
|
||||
'old_data' => $oldmax,
|
||||
'kodcaw' => 'OPERASI',
|
||||
'created_at' => $current,
|
||||
'updated_at' => $current,
|
||||
]);
|
||||
|
||||
return response()->json([
|
||||
'status' => 'success',
|
||||
'message' => 'Max Mutu Emas updated successfully',
|
||||
'data' => $maxmutuemas
|
||||
]);
|
||||
} else {
|
||||
return response()->json([
|
||||
'status' => 'error',
|
||||
'message' => 'Record not found'
|
||||
], 404);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,78 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Reports;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
use App\Audit;
|
||||
|
||||
class AuditTrailController extends Controller
|
||||
{
|
||||
public function getAuditTrail(Request $request)
|
||||
{
|
||||
$limit = $request->get('limit', 100);
|
||||
|
||||
$audit_trails = Audit::query()
|
||||
->when($request->filled('norujukan'), fn($q) => $q->where('norujukan', $request->norujukan))
|
||||
->when($request->filled('actions'), fn($q) => $q->where('actions', $request->actions))
|
||||
->orderBy('created_at', 'desc')
|
||||
->limit($limit)
|
||||
->get();
|
||||
|
||||
return response()->json($audit_trails);
|
||||
}
|
||||
|
||||
public function AuditTrailOperasi(Request $request)
|
||||
{
|
||||
$date_first = $request->get('date', null);
|
||||
$date_till = $request->get('date_till', null);
|
||||
|
||||
$audit_trails = Audit::query()
|
||||
->where('kodcaw', 'operasi')
|
||||
->whereDate('created_at', '>=', $date_first)
|
||||
->whereDate('created_at', '<=', $date_till)
|
||||
->orderBy('created_at', 'asc')
|
||||
->get();
|
||||
|
||||
$audit_trails->map(function ($audit) {
|
||||
// Convert from UTC to Malaysia timezone (UTC+8)
|
||||
$audit->created_at = $audit->created_at->format('Y-m-d H:i:s');
|
||||
|
||||
// Get differences between old_data and new_data
|
||||
$old_data = json_decode($audit->old_data, true) ?? [];
|
||||
$new_data = json_decode($audit->new_data, true) ?? [];
|
||||
|
||||
$differences = [];
|
||||
|
||||
// Find changed fields
|
||||
foreach ($new_data as $key => $new_value) {
|
||||
if ($key === 'tarikhupdate') continue;
|
||||
|
||||
$old_value = $old_data[$key] ?? null;
|
||||
if ($old_value !== $new_value) {
|
||||
$differences[$key] = [
|
||||
'old' => $old_value,
|
||||
'new' => $new_value
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
// Check for removed fields
|
||||
foreach ($old_data as $key => $old_value) {
|
||||
if ($key === 'tarikhupdate') continue;
|
||||
|
||||
if (!array_key_exists($key, $new_data)) {
|
||||
$differences[$key] = [
|
||||
'old' => $old_value,
|
||||
'new' => null
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
$audit->differences = $differences;
|
||||
return $audit;
|
||||
});
|
||||
|
||||
return response()->json($audit_trails);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
<?php
|
||||
|
||||
namespace App;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class MaxMutuEmas extends Model
|
||||
{
|
||||
protected $table = 'max_mutuemas';
|
||||
protected $primaryKey = 'recno';
|
||||
public $timestamps = false;
|
||||
|
||||
/**
|
||||
* The attributes that are mass assignable.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $fillable = [
|
||||
'recno', 'karat', 'keterangan', 'teller', 'pc', 'operasi', 'tarikhupdate'
|
||||
];
|
||||
|
||||
/**
|
||||
* The attributes that should be cast to native types.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $casts = [
|
||||
'teller' => 'decimal:2',
|
||||
'pc' => 'decimal:2',
|
||||
'operasi' => 'decimal:2',
|
||||
'tarikhupdate' => 'datetime',
|
||||
];
|
||||
|
||||
/**
|
||||
* The attributes excluded from the model's JSON form.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
// protected $hidden = [];
|
||||
}
|
||||
+1
-1
@@ -64,7 +64,7 @@ $app->configure('tinker');
|
||||
$app->configure('tennant_database');
|
||||
$app->configure('report');
|
||||
$app->configure('app_parameter');
|
||||
|
||||
$app->configure('parameter');
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Register Middleware
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'max_mutuemas' => env('MAX_MUTUEMAS', true),
|
||||
];
|
||||
@@ -0,0 +1,140 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class CreateMaxMutuemasTable extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::create('max_mutuemas', function (Blueprint $table) {
|
||||
$table->id('recno');
|
||||
$table->string('karat');
|
||||
$table->string('keterangan');
|
||||
$table->decimal('teller', 8, 2);
|
||||
$table->decimal('pc', 8, 2);
|
||||
$table->decimal('operasi', 8, 2);
|
||||
$table->timestamp('tarikhupdate');
|
||||
});
|
||||
|
||||
// Insert data
|
||||
DB::table('max_mutuemas')->insert([
|
||||
[
|
||||
'recno' => 1,
|
||||
'karat' => '24.0Kgb',
|
||||
'keterangan' => '999 gb',
|
||||
'teller' => 75.00000,
|
||||
'pc' => 80.00000,
|
||||
'operasi' => 80.00000,
|
||||
'tarikhupdate' => '2025-01-12 00:00:00',
|
||||
],
|
||||
[
|
||||
'recno' => 2,
|
||||
'karat' => '24.0K',
|
||||
'keterangan' => '999',
|
||||
'teller' => 75.00000,
|
||||
'pc' => 80.00000,
|
||||
'operasi' => 80.00000,
|
||||
'tarikhupdate' => '2025-01-12 00:00:00',
|
||||
],
|
||||
[
|
||||
'recno' => 3,
|
||||
'karat' => '23.0K',
|
||||
'keterangan' => '950',
|
||||
'teller' => 74.00000,
|
||||
'pc' => 80.00000,
|
||||
'operasi' => 80.00000,
|
||||
'tarikhupdate' => '2025-01-12 00:00:00',
|
||||
],
|
||||
[
|
||||
'recno' => 4,
|
||||
'karat' => '22.0K',
|
||||
'keterangan' => '916',
|
||||
'teller' => 73.66667,
|
||||
'pc' => 80.00000,
|
||||
'operasi' => 80.00000,
|
||||
'tarikhupdate' => '2025-01-12 00:00:00',
|
||||
],
|
||||
[
|
||||
'recno' => 5,
|
||||
'karat' => '21.0K',
|
||||
'keterangan' => '900',
|
||||
'teller' => 73.16667,
|
||||
'pc' => 80.00000,
|
||||
'operasi' => 80.00000,
|
||||
'tarikhupdate' => '2025-01-12 00:00:00',
|
||||
],
|
||||
[
|
||||
'recno' => 6,
|
||||
'karat' => '20.0K',
|
||||
'keterangan' => '835',
|
||||
'teller' => 72.66667,
|
||||
'pc' => 80.00000,
|
||||
'operasi' => 80.00000,
|
||||
'tarikhupdate' => '2025-01-12 00:00:00',
|
||||
],
|
||||
[
|
||||
'recno' => 7,
|
||||
'karat' => '18.0Kp',
|
||||
'keterangan' => '750',
|
||||
'teller' => 72.16667,
|
||||
'pc' => 80.00000,
|
||||
'operasi' => 80.00000,
|
||||
'tarikhupdate' => '2025-01-12 00:00:00',
|
||||
],
|
||||
[
|
||||
'recno' => 8,
|
||||
'karat' => '18.0K',
|
||||
'keterangan' => '750',
|
||||
'teller' => 71.66667,
|
||||
'pc' => 80.00000,
|
||||
'operasi' => 80.00000,
|
||||
'tarikhupdate' => '2025-01-12 00:00:00',
|
||||
],
|
||||
[
|
||||
'recno' => 21,
|
||||
'karat' => '14.0K',
|
||||
'keterangan' => '585',
|
||||
'teller' => 71.16667,
|
||||
'pc' => 80.00000,
|
||||
'operasi' => 80.00000,
|
||||
'tarikhupdate' => '2025-01-12 00:00:00',
|
||||
],
|
||||
[
|
||||
'recno' => 22,
|
||||
'karat' => '14.0Kp',
|
||||
'keterangan' => '585',
|
||||
'teller' => 70.66667,
|
||||
'pc' => 80.00000,
|
||||
'operasi' => 80.00000,
|
||||
'tarikhupdate' => '2025-01-12 00:00:00',
|
||||
],
|
||||
[
|
||||
'recno' => 23,
|
||||
'karat' => '9.0K',
|
||||
'keterangan' => '375',
|
||||
'teller' => 70.16667,
|
||||
'pc' => 80.00000,
|
||||
'operasi' => 80.00000,
|
||||
'tarikhupdate' => '2025-01-12 00:00:00',
|
||||
],
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::dropIfExists('max_mutuemas');
|
||||
}
|
||||
}
|
||||
+2
-1
@@ -55,7 +55,8 @@ $router->group(['prefix' => 'api/reports'], function () use ($router) {
|
||||
$router->get('gadaitebus', ['uses' => 'GadaianController@getSummaryLaporanGadaiTebus']);
|
||||
$router->get('gadaitebusmasa', ['uses' => 'GadaianController@getSummaryLaporanGadaiTebusMasa']);
|
||||
$router->get('gadaitebusmasa/{kod_cawangan}', ['uses' => 'GadaianController@getLaporanGadaiTebusMasaCawangan']);
|
||||
|
||||
$router->get('audit-trail', ['uses' => 'AuditTrailController@getAuditTrail']);
|
||||
$router->get('audittrail/operasi',['uses'=>'AuditTrailController@AuditTrailOperasi']);
|
||||
$router->get('saringan/gadaian', ['uses' => 'SaringanGadaianController@getLaporanGadai']);
|
||||
|
||||
$router->get('data-pelanggan', ['uses' => 'AnalisaController@getSummaryLaporanDataPelanggan']);
|
||||
|
||||
@@ -262,6 +262,9 @@ $router->group(['prefix'=>'api'], function () use ($router){
|
||||
|
||||
|
||||
$router->get('maxpinjaman',['uses'=>'MaxPinjamanController@getAllMaxPinjaman']);
|
||||
$router->get('maxmutuemas',['uses'=>'MaxPinjamanController@getAllMaxMutuEmas']);
|
||||
$router->get('maxmutuemas/specific',['uses'=>'MaxPinjamanController@getSpecificMaxMutuEmas']);
|
||||
$router->post('maxmutuemas/update',['uses'=>'MaxPinjamanController@updateMaxMutuEmas']);
|
||||
|
||||
$router->get('transaksi_keuntungan/{norujukan}',['uses'=>'TransaksiKeuntunganController@getTransaksiKeuntunganByRujukan']);
|
||||
$router->get('transaksi_keuntungan_latest/{norujukan}',['uses'=>'TransaksiKeuntunganController@getTransaksiKeuntunganByRujukanLatest']);
|
||||
|
||||
Reference in New Issue
Block a user