From d98df34f2c0c5272fe3ff0e66dae2dfebb337367 Mon Sep 17 00:00:00 2001 From: JokoPrasetio Date: Mon, 18 May 2026 16:48:41 +0700 Subject: [PATCH] fixing data double --- app/Http/Controllers/AuthController.php | 7 +- app/Http/Controllers/KaryawanController.php | 1 + app/Http/Controllers/PitStopController.php | 9 + routes/web.php | 245 ++++++++++++++++++++ 4 files changed, 258 insertions(+), 4 deletions(-) diff --git a/app/Http/Controllers/AuthController.php b/app/Http/Controllers/AuthController.php index 414fef4..38c340f 100644 --- a/app/Http/Controllers/AuthController.php +++ b/app/Http/Controllers/AuthController.php @@ -23,10 +23,8 @@ class AuthController extends Controller 'password' => 'required' ]); -// $allowedIds = [ -// 727,1755,2184,2549,993,3053,2319,1995,2011,2145,1113,2998,592,442,2787,1600,1109,2676,566,640,1109,868,2370,2342,1028,1079,2007,735,950,994,1069,1358,890,2291,1310,98,800, -// 2006,299265,892,2005,2531,2457,508,2147,401,1331,1430,1067,193,1071,639,1028,419,2626,2793,910,2055,645,637,325,365,1220,724,122,2371,1628,952,1323,793,1113,1058,316,979,748,30025,928,566,501, -// 59,217,2016,1173,707,30020,2147,401,1069,1335,1347,2147,401,1150,2194,2641,937,2640,1320,256,1716,2258,439,1067,519,550,975,2413,1050,890916,8056,561,1689,577,2293,959,1633,671,1358,890,833,2345,861,1528,2698,2115,2333,1696,1310,2790,1604,1288,2020,1137,142,2531,2457,897,81,1037,1429,3062,110,245,2371,1628]; +// // $allowedIds = +// [727,1755,2184,2549,993,3053,2319,1995,2011,2145,592,442,2787,1600,1109,2676,566,640,868,2370,2342,1028,1079,2007,735,950,994,1069,1358,890,2291,1310,98,800,2006,299265,892,2005,2531,2457,508,1331,1430,1067,193,1071,639,419,2626,2793,910,2055,645,637,325,365,1220,724,122,2371,1628,952,1323,793,1113,1058,316,979,748,30025,928,501,59,217,2016,1173,707,30020,1335,1347,1150,2194,2641,937,2640,1320,256,1716,2258,439,519,550,975,2413,1050,890916,8056,561,1689,577,2293,959,1633,671,833,2345,861,1528,2698,2115,2333,1696,2790,1604,1288,2020,1137,142,897,81,1037,1429,3062,110,245,1649,1864,503,2485,703,440,712,1131,109,1759,2998,752,2050,2085,354,1687,2632,2799,2816,1011,2792,3036,1032,1354,1306,2091,1019,395,673,1056,554,564,2347,2147,401,984,1757,598,553,953,184,2380,3,62,415,1219,663,1021,1068,2670,3015,3045,2768,538,660,2052,740,1092,30027,1171,3128,1449,940,1717,1774,2080,2289,955,2079,1065,764,543,1233,788299270,3092,299266,788299269,2381,1771] // IdAllowedLoginPitstop $allowedIdsRaw = DB::table('settingdatafixed_m')->where('namafield', 'IdAllowedLoginPitstop')->value('nilaifield'); $allowedIds = json_decode($allowedIdsRaw, true); @@ -34,6 +32,7 @@ class AuthController extends Controller if (!in_array($user->id, $allowedIds)) { return back()->with(['error' => 'Akun Anda tidak diizinkan login']); } + if ($user && $user->passcode === sha1($request->password)) { auth()->login($user); $request->session()->regenerate(); diff --git a/app/Http/Controllers/KaryawanController.php b/app/Http/Controllers/KaryawanController.php index b743809..859222b 100644 --- a/app/Http/Controllers/KaryawanController.php +++ b/app/Http/Controllers/KaryawanController.php @@ -42,6 +42,7 @@ class KaryawanController extends Controller $q->where('pg.namalengkap', 'ILIKE', "%$search%") ->orWhere('pg.nip_pns', 'ILIKE', "%$search%"); }) + ->whereNotIn('pg.kategorypegawai', ['11']) ->select([ 'pg.id', DB::raw("coalesce(pg.namalengkap, '-') as namalengkap"), diff --git a/app/Http/Controllers/PitStopController.php b/app/Http/Controllers/PitStopController.php index ff9c630..7ad323e 100644 --- a/app/Http/Controllers/PitStopController.php +++ b/app/Http/Controllers/PitStopController.php @@ -125,6 +125,7 @@ class PitStopController extends Controller ->where('mp.isprimary', true) ->where('pg.statusenabled', true) ->where('ukp.statusenabled', true) + ->whereNotIn('pg.kategorypegawai', ['11']) ->select([ DB::raw('ukp.id as unit_id'), DB::raw("coalesce(ukp.name, '-') as unit_name"), @@ -359,6 +360,7 @@ class PitStopController extends Controller $join->on(DB::raw('m.id::text'), '=', 'p.masterpitstop_id') ->where('m.statusenabled', true); }) + ->whereNotIn('pg.kategorypegawai', ['11']) ->where('mp.statusenabled', true) ->where('mp.isprimary', true) ->where('pg.statusenabled', true) @@ -442,6 +444,7 @@ class PitStopController extends Controller ->where('pg.kedudukanfk', 1) ->where('ukp.statusenabled', true) ->where('ukp.id', $unitId) + ->whereNotIn('pg.kategorypegawai', ['11']) ->select([ DB::raw('ukp.id as unit_id'), DB::raw("coalesce(ukp.name, '-') as unit_name"), @@ -666,6 +669,7 @@ class PitStopController extends Controller ->where('pg.statusenabled', true) ->where('pg.kedudukanfk', 1) ->where('ukp.statusenabled', true) + ->whereNotIn('pg.kategorypegawai', ['11']) ->select([ DB::raw('ukp.id as unit_id'), DB::raw("coalesce(ukp.name, '-') as unit_name"), @@ -708,6 +712,7 @@ class PitStopController extends Controller ->where('pg.statusenabled', true) ->where('pg.kedudukanfk', 1) ->where('ukp.statusenabled', true) + ->whereNotIn('pg.kategorypegawai', ['11']) ->select([ DB::raw('ukp.id as unit_id'), DB::raw("coalesce(ukp.name, '-') as unit_name"), @@ -889,6 +894,7 @@ class PitStopController extends Controller ->where('pg.kedudukanfk', 1) ->where('ukp.statusenabled', true) ->where('ukp.id', $unitId) + ->whereNotIn('pg.kategorypegawai', ['11']) ->select([ 'pg.id', DB::raw("coalesce(pg.namalengkap, '-') as nama"), @@ -1372,6 +1378,7 @@ class PitStopController extends Controller ->where('pg.kedudukanfk', 1) ->where('ukp.statusenabled', true) ->where('ukp.id', $unitId) + ->whereNotIn('pg.kategorypegawai', ['11']) ->select([ 'pg.id', DB::raw("coalesce(pg.namalengkap, '-') as nama"), @@ -1575,6 +1582,7 @@ class PitStopController extends Controller ->where('pg.statusenabled', true) ->where('pg.kedudukanfk', 1) ->where('ukp.statusenabled', true) + ->whereNotIn('pg.kategorypegawai', ['11']) ->select([ DB::raw("'internal' as tipe_karyawan"), 'pg.id', @@ -2056,6 +2064,7 @@ class PitStopController extends Controller ->where('pg.statusenabled', true) ->where('pg.kedudukanfk', 1) ->where('ukp.statusenabled', true) + ->whereNotIn('pg.kategorypegawai', ['11']) ->select([ DB::raw("'internal' as tipe_karyawan"), 'pg.id', diff --git a/routes/web.php b/routes/web.php index 080da13..63a51a9 100644 --- a/routes/web.php +++ b/routes/web.php @@ -5,6 +5,7 @@ use App\Http\Controllers\KaryawanController; use App\Http\Controllers\PitStopController; use App\Http\Controllers\MasterPitStopController; use App\Http\Controllers\AuthController; +use Illuminate\Support\Facades\DB; Route::middleware(['auth'])->group(function(){ @@ -54,3 +55,247 @@ Route::post('/login', [AuthController::class, 'submitLogin']); Route::get('/data/progress-all-karyawan-ghost', [PitStopController::class, 'dataProgressAllKaryawanGhost']); Route::get('/pitstop/progress-detail-ghost', [PitStopController::class, 'progressDetailGhost']); Route::get('/pitstop/progress-detail-external-ghost', [PitStopController::class, 'progressDetailExternal']); + +// Route::get('/outsorching', function(){ + +// $data = DB::connection('pgsql')->select(" + +// SELECT +// pl.nama AS nama_external, +// pl.tipe, +// pg.namalengkap AS nama_internal, +// ukp.name AS unit, +// similarity(LOWER(pl.nama), LOWER(pg.namalengkap)) as score, +// 'MATCH' as status_data + +// FROM public.pegawai_luar_pl pl +// JOIN public.pegawai_m pg +// ON similarity(LOWER(pl.nama), LOWER(pg.namalengkap)) > 0.6 + +// LEFT JOIN public.mappegawaijabatantounitkerja_m mp +// ON pg.id = mp.objectpegawaifk +// AND mp.statusenabled = true +// AND mp.isprimary = true + +// LEFT JOIN public.unitkerjapegawai_m ukp +// ON ukp.id = mp.objectunitkerjapegawaifk + +// WHERE +// pl.tipe ILIKE '%OUTSORCHING%' +// AND pg.statusenabled = true +// AND pg.kategorypegawai = '11' +// AND pg.kedudukanfk = 1 + + +// UNION ALL + + +// SELECT +// NULL AS nama_external, +// NULL AS tipe, +// pg.namalengkap AS nama_internal, +// ukp.name AS unit, +// NULL AS score, +// 'HANYA DI INTERNAL' as status_data + +// FROM public.pegawai_m pg + +// LEFT JOIN public.mappegawaijabatantounitkerja_m mp +// ON pg.id = mp.objectpegawaifk +// AND mp.statusenabled = true +// AND mp.isprimary = true + +// LEFT JOIN public.unitkerjapegawai_m ukp +// ON ukp.id = mp.objectunitkerjapegawaifk + +// WHERE +// pg.statusenabled = true +// AND pg.kategorypegawai = '11' +// AND pg.kedudukanfk = 1 +// AND NOT EXISTS ( +// SELECT 1 FROM public.pegawai_luar_pl pl +// WHERE pl.tipe ILIKE '%OUTSORCHING%' +// AND similarity(LOWER(pl.nama), LOWER(pg.namalengkap)) > 0.6 +// ) + +// ORDER BY status_data +// "); + +// $collection = collect($data); + +// return [ +// 'summary' => [ +// 'total' => $collection->count(), +// 'match' => $collection->where('status_data', 'MATCH')->count(), +// 'external_only' => $collection->where('status_data', 'HANYA DI EXTERNAL')->count(), +// 'internal_only' => $collection->where('status_data', 'HANYA DI INTERNAL')->count(), +// ], +// 'data' => $data +// ]; +// }); +Route::get('/outsorching', function(){ + + $data = DB::connection('pgsql')->select(" + +-- ========================= +-- 🔥 1. MATCH (FUZZY) +-- ========================= +SELECT + COALESCE(pl.nama, '-') AS nama_external, + pl.tipe, + pg.id as pegawai_id, + pg.namalengkap AS nama_internal, + ukp.name AS unit, + + ROUND(similarity(LOWER(pl.nama), LOWER(pg.namalengkap))::numeric, 2) as score, + true as is_match, + 'MATCH' as status_data, + + COUNT(pr.id) as total_praakre, + COUNT(*) FILTER (WHERE pr.status = 'LULUS') as jumlah_lulus, + COUNT(*) FILTER (WHERE pr.status = 'TIDAK LULUS') as jumlah_tidak_lulus, + + COALESCE( + json_agg( + json_build_object( + 'id', pr.id, + 'unit_id', pr.unit_id, + 'masterpitstop_id', pr.masterpitstop_id, + 'masterpitstop_nama', mpit.nama, + 'nilai', pr.nilai, + 'action_at', pm.namalengkap, + 'created_at', pr.created_at, + 'type_karyawan', pr.tipe_karyawan + ) + ORDER BY NULLIF(pr.masterpitstop_id, '')::int + ) FILTER (WHERE pr.id IS NOT NULL), + '[]'::json + ) as praakre_data + +FROM public.pegawai_luar_pl pl +JOIN public.pegawai_m pg + ON similarity(LOWER(pl.nama), LOWER(pg.namalengkap)) > 0.6 + +LEFT JOIN public.mappegawaijabatantounitkerja_m mp + ON pg.id = mp.objectpegawaifk + AND mp.statusenabled = true + AND mp.isprimary = true + +LEFT JOIN public.unitkerjapegawai_m ukp + ON ukp.id = mp.objectunitkerjapegawaifk + +-- 🔥 PRAAKRE INTERNAL + LUAR +LEFT JOIN public.praakre pr +ON ( + (pr.tipe_karyawan = 'internal' AND pr.pegawai_id::int = pg.id) + OR + (pr.tipe_karyawan = 'luar' AND pr.pegawai_id::int = pl.id) +) + +LEFT JOIN public.masterpitstop mpit + ON mpit.id = NULLIF(pr.masterpitstop_id, '')::int + +LEFT JOIN public.pegawai_m pm + ON pm.id = NULLIF(pr.action_at, '')::int + +WHERE + pl.tipe ILIKE '%OUTSORCHING%' + AND pg.statusenabled = true + AND pg.kategorypegawai = '11' + AND pg.kedudukanfk = 1 + +GROUP BY + pl.nama, pl.tipe, pg.id, pg.namalengkap, ukp.name + + +UNION ALL + + +-- ========================= +-- 🔥 2. HANYA DI INTERNAL +-- ========================= +SELECT + '-' AS nama_external, + NULL AS tipe, + pg.id as pegawai_id, + pg.namalengkap AS nama_internal, + ukp.name AS unit, + + NULL as score, + false as is_match, + 'HANYA DI INTERNAL' as status_data, + + COUNT(pr.id) as total_praakre, + + COALESCE( + json_agg( + json_build_object( + 'id', pr.id, + 'masterpitstop_id', pr.masterpitstop_id, + 'masterpitstop_nama', mpit.nama, + 'nilai', pr.nilai, + 'action_at', pm.namalengkap, + 'created_at', pr.created_at, + 'type_karyawan', pr.tipe_karyawan + ) + ORDER BY NULLIF(pr.masterpitstop_id, '')::int + ) FILTER (WHERE pr.id IS NOT NULL), + '[]'::json + ) as praakre_data + +FROM public.pegawai_m pg + +LEFT JOIN public.mappegawaijabatantounitkerja_m mp + ON pg.id = mp.objectpegawaifk + AND mp.statusenabled = true + AND mp.isprimary = true + +LEFT JOIN public.unitkerjapegawai_m ukp + ON ukp.id = mp.objectunitkerjapegawaifk + +-- 🔥 PRAAKRE INTERNAL SAJA +LEFT JOIN public.praakre pr + ON pr.tipe_karyawan = 'internal' + AND pr.pegawai_id::int = pg.id + +LEFT JOIN public.masterpitstop mpit + ON mpit.id = NULLIF(pr.masterpitstop_id, '')::int + +LEFT JOIN public.pegawai_m pm + ON pm.id = NULLIF(pr.action_at, '')::int + +WHERE + pg.statusenabled = true + AND pg.kategorypegawai = '11' + AND pg.kedudukanfk = 1 + AND NOT EXISTS ( + SELECT 1 FROM public.pegawai_luar_pl pl + WHERE pl.tipe ILIKE '%OUTSORCHING%' + AND similarity(LOWER(pl.nama), LOWER(pg.namalengkap)) > 0.6 + ) + +GROUP BY + pg.id, pg.namalengkap, ukp.name + +ORDER BY status_data, nama_internal +"); + + // 🔥 FIX: pastikan JSON jadi array beneran di Laravel + $data = collect($data)->map(function($item){ + $item->praakre_data = is_string($item->praakre_data) + ? json_decode($item->praakre_data, true) + : $item->praakre_data; + return $item; + }); + + return [ + 'summary' => [ + 'total' => $data->count(), + 'match' => $data->where('status_data', 'MATCH')->count(), + 'internal_only' => $data->where('status_data', 'HANYA DI INTERNAL')->count(), + 'total_lulus' => $data->sum('jumlah_lulus'), + 'total_tidak_lulus' => $data->sum('jumlah_tidak_lulus'), + ], + 'data' => $data + ]; +});