From 7c7aa0e2a58c43ba35f3e4e2f131f3fc99820647 Mon Sep 17 00:00:00 2001 From: arifal hidayat Date: Tue, 19 Aug 2025 02:25:03 +0700 Subject: [PATCH] partial update filter data year now pbg --- app/Console/Commands/SyncDashboardPbg.php | 6 +- app/Jobs/RetrySyncronizeJob.php | 10 +- app/Jobs/ScrapingDataJob.php | 3 +- app/Models/BigdataResume.php | 215 +++++++++++++++++- app/Services/ServiceSIMBG.php | 3 +- ...nd_new_resume_in_bigdata_resumes_table.php | 38 ++++ 6 files changed, 251 insertions(+), 24 deletions(-) create mode 100644 database/migrations/2025_08_19_014533_add_type_and_new_resume_in_bigdata_resumes_table.php diff --git a/app/Console/Commands/SyncDashboardPbg.php b/app/Console/Commands/SyncDashboardPbg.php index e0b3d01..878cb72 100644 --- a/app/Console/Commands/SyncDashboardPbg.php +++ b/app/Console/Commands/SyncDashboardPbg.php @@ -38,11 +38,7 @@ class SyncDashboardPbg extends Command ]); try { - $service = new ServiceGoogleSheet(); - - $data_setting_result = $service->get_big_resume_data(); - Log::info('Data setting result: ' . json_encode($data_setting_result)); - BigdataResume::generateResumeData($import_datasource->id, "simbg", $data_setting_result); + BigdataResume::generateResumeData($import_datasource->id, now()->year(), "simbg"); $import_datasource->update([ 'status' => 'success', diff --git a/app/Jobs/RetrySyncronizeJob.php b/app/Jobs/RetrySyncronizeJob.php index 9b7eb59..43b41e1 100644 --- a/app/Jobs/RetrySyncronizeJob.php +++ b/app/Jobs/RetrySyncronizeJob.php @@ -8,10 +8,11 @@ use App\Models\ImportDatasource; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Queue\Queueable; use App\Services\ServiceTabPbgTask; -use App\Services\ServiceGoogleSheet; use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\SerializesModels; +use Illuminate\Support\Facades\Log; + class RetrySyncronizeJob implements ShouldQueue { use Queueable, Dispatchable, InteractsWithQueue, SerializesModels; @@ -28,7 +29,6 @@ class RetrySyncronizeJob implements ShouldQueue { try{ $service_tab_pbg_task = app(ServiceTabPbgTask::class); - $service_google_sheet = app(ServiceGoogleSheet::class); $failed_import = ImportDatasource::find($this->import_datasource_id); @@ -46,9 +46,7 @@ class RetrySyncronizeJob implements ShouldQueue throw $e; } - $data_setting_result = $service_google_sheet->get_big_resume_data(); - - BigdataResume::generateResumeData($failed_import->id, "simbg", $data_setting_result); + BigdataResume::generateResumeData($failed_import->id, now()->year(), "simbg"); $failed_import->update([ 'status' => ImportDatasourceStatus::Success->value, @@ -57,7 +55,7 @@ class RetrySyncronizeJob implements ShouldQueue 'failed_uuid' => null ]); }catch(\Exception $e){ - \Log::error("RetrySyncronizeJob Failed: ". $e->getMessage(), [ + Log::error("RetrySyncronizeJob Failed: ". $e->getMessage(), [ 'exception' => $e, ]); if(isset($failed_import)){ diff --git a/app/Jobs/ScrapingDataJob.php b/app/Jobs/ScrapingDataJob.php index 633b65e..840b4fd 100644 --- a/app/Jobs/ScrapingDataJob.php +++ b/app/Jobs/ScrapingDataJob.php @@ -144,8 +144,7 @@ class ScrapingDataJob implements ShouldQueue Log::info("=== STEP 4: GENERATING BIGDATA RESUME ==="); $import_datasource->update(['message' => 'Generating BigData resume...']); - $data_setting_result = $service_google_sheet->get_big_resume_data(); - BigdataResume::generateResumeData($import_datasource->id, "simbg", $data_setting_result); + BigdataResume::generateResumeData($import_datasource->id, now()->year(), "simbg"); Log::info("BigData resume generated successfully"); diff --git a/app/Models/BigdataResume.php b/app/Models/BigdataResume.php index 5161156..e276b1e 100644 --- a/app/Models/BigdataResume.php +++ b/app/Models/BigdataResume.php @@ -32,6 +32,11 @@ class BigdataResume extends Model 'issuance_realization_pbg_sum', 'process_in_technical_office_count', 'process_in_technical_office_sum', + 'business_rab_count', + 'business_krk_count', + 'non_business_rab_count', + 'non_business_krk_count', + 'non_business_dlh_count', ]; public function importDatasource() @@ -39,14 +44,26 @@ class BigdataResume extends Model return $this->belongsTo(ImportDatasource::class, 'import_datasource_id'); } - public static function generateResumeData($import_datasource_id, $year, $data_setting){ + public static function generateResumeData($import_datasource_id, $year, $resume_type){ // Get accurate counts without joins to avoid duplicates from multiple retributions - $verified_count = PbgTask::whereIn('status', PbgTaskStatus::getVerified())->count(); - $non_verified_count = PbgTask::whereIn('status', PbgTaskStatus::getNonVerified())->count(); - $waiting_click_dpmptsp_count = PbgTask::whereIn('status', PbgTaskStatus::getWaitingClickDpmptsp())->count(); - $issuance_realization_pbg_count = PbgTask::whereIn('status', PbgTaskStatus::getIssuanceRealizationPbg())->count(); - $process_in_technical_office_count = PbgTask::whereIn('status', PbgTaskStatus::getProcessInTechnicalOffice())->count(); - $potention_count = PbgTask::whereIn('status', PbgTaskStatus::getPotention())->count(); + $verified_count = PbgTask::whereIn('status', PbgTaskStatus::getVerified()) + ->whereYear('task_created_at', $year) + ->count(); + $non_verified_count = PbgTask::whereIn('status', PbgTaskStatus::getNonVerified()) + ->whereYear('task_created_at', $year) + ->count(); + $waiting_click_dpmptsp_count = PbgTask::whereIn('status', PbgTaskStatus::getWaitingClickDpmptsp()) + ->whereYear('task_created_at', $year) + ->count(); + $issuance_realization_pbg_count = PbgTask::whereIn('status', PbgTaskStatus::getIssuanceRealizationPbg()) + ->whereYear('task_created_at', $year) + ->count(); + $process_in_technical_office_count = PbgTask::whereIn('status', PbgTaskStatus::getProcessInTechnicalOffice()) + ->whereYear('task_created_at', $year) + ->count(); + $potention_count = PbgTask::whereIn('status', PbgTaskStatus::getPotention()) + ->whereYear('task_created_at', $year) + ->count(); // Business count (same logic as RequestAssignmentController) $business_count = PbgTask::where(function ($q) { @@ -55,7 +72,9 @@ class BigdataResume extends Model ->orWhereRaw("LOWER(TRIM(function_type)) LIKE ?", ['%sebagai tempat usaha%']); }) ->whereIn("status", PbgTaskStatus::getNonVerified()); - })->count(); + }) + ->whereYear('task_created_at', $year) + ->count(); // Non-business count (same logic as RequestAssignmentController) $non_business_count = PbgTask::where(function ($q) { @@ -67,10 +86,182 @@ class BigdataResume extends Model ->orWhereNull('function_type'); }) ->whereIn("status", PbgTaskStatus::getNonVerified()); - })->count(); + }) + ->whereYear('task_created_at', $year) + ->count(); + + // Business RAB count - for each business task with data_type=3: + // if any status != 1 then return 1, if all status = 1 then return 0, then sum all + $business_rab_count = DB::table('pbg_task') + ->where(function ($q) { + $q->where(function ($q2) { + $q2->whereRaw("LOWER(TRIM(function_type)) LIKE ?", ['%fungsi usaha%']) + ->orWhereRaw("LOWER(TRIM(function_type)) LIKE ?", ['%sebagai tempat usaha%']); + }) + ->whereIn("status", PbgTaskStatus::getNonVerified()); + }) + ->whereYear('task_created_at', $year) + ->whereExists(function ($query) { + $query->select(DB::raw(1)) + ->from('pbg_task_detail_data_lists') + ->whereColumn('pbg_task_detail_data_lists.pbg_task_uuid', 'pbg_task.uuid') + ->where('pbg_task_detail_data_lists.data_type', 3); + }) + ->selectRaw(' + SUM( + CASE + WHEN EXISTS ( + SELECT 1 FROM pbg_task_detail_data_lists ptddl + WHERE ptddl.pbg_task_uuid = pbg_task.uuid + AND ptddl.data_type = 3 + AND ptddl.status != 1 + ) THEN 1 + ELSE 0 + END + ) as total_count + ') + ->value('total_count') ?? 0; + + // Business KRK count - for each business task with data_type=2: + // if any status != 1 then return 1, if all status = 1 then return 0, then sum all + $business_krk_count = DB::table('pbg_task') + ->where(function ($q) { + $q->where(function ($q2) { + $q2->whereRaw("LOWER(TRIM(function_type)) LIKE ?", ['%fungsi usaha%']) + ->orWhereRaw("LOWER(TRIM(function_type)) LIKE ?", ['%sebagai tempat usaha%']); + }) + ->whereIn("status", PbgTaskStatus::getNonVerified()); + }) + ->whereYear('task_created_at', $year) + ->whereExists(function ($query) { + $query->select(DB::raw(1)) + ->from('pbg_task_detail_data_lists') + ->whereColumn('pbg_task_detail_data_lists.pbg_task_uuid', 'pbg_task.uuid') + ->where('pbg_task_detail_data_lists.data_type', 2); + }) + ->selectRaw(' + SUM( + CASE + WHEN EXISTS ( + SELECT 1 FROM pbg_task_detail_data_lists ptddl + WHERE ptddl.pbg_task_uuid = pbg_task.uuid + AND ptddl.data_type = 2 + AND ptddl.status != 1 + ) THEN 1 + ELSE 0 + END + ) as total_count + ') + ->value('total_count') ?? 0; + + // Non-Business RAB count - for each non-business task with data_type=3: + // if any status != 1 then return 1, if all status = 1 then return 0, then sum all + $non_business_rab_count = DB::table('pbg_task') + ->where(function ($q) { + $q->where(function ($q2) { + $q2->where(function ($q3) { + $q3->whereRaw("LOWER(TRIM(function_type)) NOT LIKE ?", ['%fungsi usaha%']) + ->whereRaw("LOWER(TRIM(function_type)) NOT LIKE ?", ['%sebagai tempat usaha%']); + }) + ->orWhereNull('function_type'); + }) + ->whereIn("status", PbgTaskStatus::getNonVerified()); + }) + ->whereYear('task_created_at', $year) + ->whereExists(function ($query) { + $query->select(DB::raw(1)) + ->from('pbg_task_detail_data_lists') + ->whereColumn('pbg_task_detail_data_lists.pbg_task_uuid', 'pbg_task.uuid') + ->where('pbg_task_detail_data_lists.data_type', 3); + }) + ->selectRaw(' + SUM( + CASE + WHEN EXISTS ( + SELECT 1 FROM pbg_task_detail_data_lists ptddl + WHERE ptddl.pbg_task_uuid = pbg_task.uuid + AND ptddl.data_type = 3 + AND ptddl.status != 1 + ) THEN 1 + ELSE 0 + END + ) as total_count + ') + ->value('total_count') ?? 0; + + // Non-Business KRK count - for each non-business task with data_type=2: + // if any status != 1 then return 1, if all status = 1 then return 0, then sum all + $non_business_krk_count = DB::table('pbg_task') + ->where(function ($q) { + $q->where(function ($q2) { + $q2->where(function ($q3) { + $q3->whereRaw("LOWER(TRIM(function_type)) NOT LIKE ?", ['%fungsi usaha%']) + ->whereRaw("LOWER(TRIM(function_type)) NOT LIKE ?", ['%sebagai tempat usaha%']); + }) + ->orWhereNull('function_type'); + }) + ->whereIn("status", PbgTaskStatus::getNonVerified()); + }) + ->whereYear('task_created_at', $year) + ->whereExists(function ($query) { + $query->select(DB::raw(1)) + ->from('pbg_task_detail_data_lists') + ->whereColumn('pbg_task_detail_data_lists.pbg_task_uuid', 'pbg_task.uuid') + ->where('pbg_task_detail_data_lists.data_type', 2); + }) + ->selectRaw(' + SUM( + CASE + WHEN EXISTS ( + SELECT 1 FROM pbg_task_detail_data_lists ptddl + WHERE ptddl.pbg_task_uuid = pbg_task.uuid + AND ptddl.data_type = 2 + AND ptddl.status != 1 + ) THEN 1 + ELSE 0 + END + ) as total_count + ') + ->value('total_count') ?? 0; + + // Non-Business DLH count - for each non-business task with data_type=5: + // if any status != 1 then return 1, if all status = 1 then return 0, then sum all + $non_business_dlh_count = DB::table('pbg_task') + ->where(function ($q) { + $q->where(function ($q2) { + $q2->where(function ($q3) { + $q3->whereRaw("LOWER(TRIM(function_type)) NOT LIKE ?", ['%fungsi usaha%']) + ->whereRaw("LOWER(TRIM(function_type)) NOT LIKE ?", ['%sebagai tempat usaha%']); + }) + ->orWhereNull('function_type'); + }) + ->whereIn("status", PbgTaskStatus::getNonVerified()); + }) + ->whereYear('task_created_at', $year) + ->whereExists(function ($query) { + $query->select(DB::raw(1)) + ->from('pbg_task_detail_data_lists') + ->whereColumn('pbg_task_detail_data_lists.pbg_task_uuid', 'pbg_task.uuid') + ->where('pbg_task_detail_data_lists.data_type', 5); + }) + ->selectRaw(' + SUM( + CASE + WHEN EXISTS ( + SELECT 1 FROM pbg_task_detail_data_lists ptddl + WHERE ptddl.pbg_task_uuid = pbg_task.uuid + AND ptddl.data_type = 5 + AND ptddl.status != 1 + ) THEN 1 + ELSE 0 + END + ) as total_count + ') + ->value('total_count') ?? 0; // Get sum values using proper aggregation to handle multiple retributions $stats = PbgTask::leftJoin('pbg_task_retributions as ptr', 'pbg_task.uuid', '=', 'ptr.pbg_task_uid') + ->whereYear('pbg_task.task_created_at', $year) ->selectRaw(" SUM(CASE WHEN pbg_task.status in (".implode(',', PbgTaskStatus::getVerified()).") THEN ptr.nilai_retribusi_bangunan ELSE 0 END) AS verified_total, SUM(CASE WHEN pbg_task.status in (".implode(',', PbgTaskStatus::getNonVerified()).") THEN ptr.nilai_retribusi_bangunan ELSE 0 END) AS non_verified_total, @@ -111,6 +302,12 @@ class BigdataResume extends Model 'issuance_realization_pbg_sum' => $stats->issuance_realization_pbg_total ?? 0.00, 'process_in_technical_office_count' => $process_in_technical_office_count, 'process_in_technical_office_sum' => $stats->process_in_technical_office_total ?? 0.00, + 'business_rab_count' => $business_rab_count, + 'business_krk_count' => $business_krk_count, + 'non_business_rab_count' => $non_business_rab_count, + 'non_business_krk_count' => $non_business_krk_count, + 'non_business_dlh_count' => $non_business_dlh_count, + 'resume_type' => $resume_type, ]); } } diff --git a/app/Services/ServiceSIMBG.php b/app/Services/ServiceSIMBG.php index 466ec3a..9eba6f8 100644 --- a/app/Services/ServiceSIMBG.php +++ b/app/Services/ServiceSIMBG.php @@ -421,8 +421,7 @@ class ServiceSIMBG } } - BigdataResume::generateResumeData($importDatasource->id, "all", $data_setting_result); - BigdataResume::generateResumeData($importDatasource->id, now()->year, $data_setting_result); + BigdataResume::generateResumeData($importDatasource->id, now()->year(), "simbg"); // Final update after processing all pages $importDatasource->update([ diff --git a/database/migrations/2025_08_19_014533_add_type_and_new_resume_in_bigdata_resumes_table.php b/database/migrations/2025_08_19_014533_add_type_and_new_resume_in_bigdata_resumes_table.php new file mode 100644 index 0000000..580138f --- /dev/null +++ b/database/migrations/2025_08_19_014533_add_type_and_new_resume_in_bigdata_resumes_table.php @@ -0,0 +1,38 @@ +string('resume_type')->nullable(); + $table->integer('business_rab_count')->default(0); + $table->integer('business_krk_count')->default(0); + $table->integer('non_business_rab_count')->default(0); + $table->integer('non_business_krk_count')->default(0); + $table->integer('non_business_dlh_count')->default(0); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('bigdata_resumes', function (Blueprint $table) { + $table->dropColumn('resume_type'); + $table->dropColumn('business_rab_count'); + $table->dropColumn('business_krk_count'); + $table->dropColumn('non_business_rab_count'); + $table->dropColumn('non_business_krk_count'); + $table->dropColumn('non_business_dlh_count'); + }); + } +};