add sync to leader dashboard new from google spreadsheet
This commit is contained in:
33
app/Console/Commands/ScrapingLeaderData.php
Normal file
33
app/Console/Commands/ScrapingLeaderData.php
Normal file
@@ -0,0 +1,33 @@
|
||||
<?php
|
||||
|
||||
namespace App\Console\Commands;
|
||||
|
||||
use App\Services\ServiceGoogleSheet;
|
||||
use Illuminate\Console\Command;
|
||||
|
||||
class ScrapingLeaderData extends Command
|
||||
{
|
||||
/**
|
||||
* The name and signature of the console command.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $signature = 'app:scraping-leader-data';
|
||||
|
||||
/**
|
||||
* The console command description.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $description = 'Scraping leader data from google spreadsheet and save to database';
|
||||
|
||||
/**
|
||||
* Execute the console command.
|
||||
*/
|
||||
public function handle()
|
||||
{
|
||||
$service_google_sheet = app(ServiceGoogleSheet::class);
|
||||
$service_google_sheet->sync_leader_data();
|
||||
$this->info('Leader data synced successfully');
|
||||
}
|
||||
}
|
||||
@@ -21,4 +21,13 @@ class BigDataController extends Controller
|
||||
{
|
||||
return view('dashboards.pbg');
|
||||
}
|
||||
|
||||
public function leader()
|
||||
{
|
||||
$latest_import_datasource = ImportDatasource::latest()->first();
|
||||
$latest_created = $latest_import_datasource ?
|
||||
$latest_import_datasource->created_at->format("j F Y H:i:s") : null;
|
||||
$menus = Menu::all();
|
||||
return view('dashboards.leader', compact('latest_created', 'menus'));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,14 +1,16 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services;
|
||||
|
||||
use App\Models\BigdataResume;
|
||||
use App\Models\DataSetting;
|
||||
use App\Models\ImportDatasource;
|
||||
use App\Models\PbgTaskGoogleSheet;
|
||||
use Carbon\Carbon;
|
||||
use Exception;
|
||||
use Google_Client;
|
||||
use Google_Service_Sheets;
|
||||
use Log;
|
||||
use Google\Client as Google_Client;
|
||||
use Google\Service\Sheets as Google_Service_Sheets;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
class ServiceGoogleSheet
|
||||
{
|
||||
protected $client;
|
||||
@@ -210,6 +212,78 @@ class ServiceGoogleSheet
|
||||
}
|
||||
}
|
||||
|
||||
public function sync_leader_data(){
|
||||
$import_datasource = ImportDatasource::create([
|
||||
'message' => 'Processing leader data',
|
||||
'status' => 'processing',
|
||||
'start_time' => now(),
|
||||
'failed_uuid' => null
|
||||
]);
|
||||
try {
|
||||
$sections = [
|
||||
'TARGET_PAD' => "TARGET PAD 2024",
|
||||
'KEKURANGAN_POTENSI' => "DEVIASI TARGET DENGAN POTENSI TOTAL BERKAS",
|
||||
'TOTAL_POTENSI_BERKAS' => "•TOTAL BERKAS 2025",
|
||||
'BELUM_TERVERIFIKASI' => "•BERKAS AKTUAL BELUM TERVERIFIKASI (POTENSI):",
|
||||
'TERVERIFIKASI' => "•BERKAS AKTUAL TERVERIFIKASI DINAS TEKNIS 2025:",
|
||||
'NON_USAHA' => "•NON USAHA: HUNIAN, SOSBUD, KEAGAMAAN",
|
||||
'USAHA' => "•USAHA: USAHA, CAMPURAN, KOLEKTIF, PRASARANA"
|
||||
];
|
||||
|
||||
$result = [];
|
||||
|
||||
foreach ($sections as $key => $identifier) {
|
||||
$values = $this->get_values_from_section(2, $identifier, [10, 11]);
|
||||
|
||||
if (!empty($values)) {
|
||||
$result[$key] = [
|
||||
'identifier' => $identifier,
|
||||
'total' => $values[0] ?? null, // index 0 untuk total/jumlah
|
||||
'nominal' => $values[1] ?? null // index 1 untuk nominal
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
Log::info("Leader data synced", ['result' => $result]);
|
||||
|
||||
BigdataResume::create([
|
||||
'import_datasource_id' => $import_datasource->id,
|
||||
'year' => now()->year,
|
||||
// USAHA
|
||||
'business_count' => $this->convertToInteger($result['USAHA']['total'] ?? null) ?? 0,
|
||||
'business_sum' => $this->convertToDecimal($result['USAHA']['nominal'] ?? null) ?? 0,
|
||||
// NON USAHA
|
||||
'non_business_count' => $this->convertToInteger($result['NON_USAHA']['total'] ?? null) ?? 0,
|
||||
'non_business_sum' => $this->convertToDecimal($result['NON_USAHA']['nominal'] ?? null) ?? 0,
|
||||
// TERVERIFIKASI
|
||||
'verified_count' => $this->convertToInteger($result['TERVERIFIKASI']['total'] ?? null) ?? 0,
|
||||
'verified_sum' => $this->convertToDecimal($result['TERVERIFIKASI']['nominal'] ?? null) ?? 0,
|
||||
// BELUM TERVERIFIKASI
|
||||
'non_verified_count' => $this->convertToInteger($result['BELUM_TERVERIFIKASI']['total'] ?? null) ?? 0,
|
||||
'non_verified_sum' => $this->convertToDecimal($result['BELUM_TERVERIFIKASI']['nominal'] ?? null) ?? 0,
|
||||
// TOTAL POTENSI BERKAS
|
||||
'potention_count' => $this->convertToInteger($result['TOTAL_POTENSI_BERKAS']['total'] ?? null) ?? 0,
|
||||
'potention_sum' => $this->convertToDecimal($result['TOTAL_POTENSI_BERKAS']['nominal'] ?? null) ?? 0,
|
||||
]);
|
||||
|
||||
$import_datasource->update([
|
||||
'status' => 'success',
|
||||
'response_body' => json_encode($result),
|
||||
'message' => 'Leader data synced',
|
||||
'finish_time' => now()
|
||||
]);
|
||||
return $result;
|
||||
} catch (\Exception $e) {
|
||||
Log::error("Error syncing leader data", ['error' => $e->getMessage()]);
|
||||
$import_datasource->update([
|
||||
'status' => 'failed',
|
||||
'message' => 'Leader data sync failed',
|
||||
'finish_time' => now()
|
||||
]);
|
||||
throw $e;
|
||||
}
|
||||
}
|
||||
|
||||
public function get_big_resume_data(){
|
||||
try {
|
||||
$sheet_big_data = $this->get_data_by_sheet();
|
||||
@@ -261,9 +335,71 @@ class ServiceGoogleSheet
|
||||
return!empty($values)? $values : [];
|
||||
}
|
||||
|
||||
/**
|
||||
* Get specific values from a row that contains a specific text/section identifier
|
||||
* @param int $no_sheet Sheet number (0-based)
|
||||
* @param string $section_identifier Text to search for in the row
|
||||
* @param array $column_indices Array of column indices to extract values from
|
||||
* @return array Array of values from specified columns, or empty array if section not found
|
||||
*/
|
||||
private function get_values_from_section($no_sheet = 1, $section_identifier, $column_indices = []) {
|
||||
try {
|
||||
$sheet_data = $this->get_data_by_sheet($no_sheet);
|
||||
|
||||
if (empty($sheet_data)) {
|
||||
Log::warning("No data found in sheet", ['sheet' => $no_sheet]);
|
||||
return [];
|
||||
}
|
||||
|
||||
// Search for the row containing the section identifier
|
||||
$target_row = null;
|
||||
foreach ($sheet_data as $row_index => $row) {
|
||||
if (is_array($row)) {
|
||||
foreach ($row as $cell) {
|
||||
if (is_string($cell) && strpos($cell, $section_identifier) !== false) {
|
||||
$target_row = $row;
|
||||
break 2; // Break out of both loops
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($target_row === null) {
|
||||
Log::warning("Section not found", ['section_identifier' => $section_identifier]);
|
||||
return [];
|
||||
}
|
||||
|
||||
// Extract values from specified column indices
|
||||
$extracted_values = [];
|
||||
foreach ($column_indices as $col_index) {
|
||||
if (isset($target_row[$col_index])) {
|
||||
$value = trim($target_row[$col_index]);
|
||||
$extracted_values[] = $value !== '' ? $value : null;
|
||||
} else {
|
||||
$extracted_values[] = null;
|
||||
}
|
||||
}
|
||||
|
||||
Log::info("Values extracted from section", [
|
||||
'section_identifier' => $section_identifier,
|
||||
'column_indices' => $column_indices,
|
||||
'extracted_values' => $extracted_values
|
||||
]);
|
||||
|
||||
return $extracted_values;
|
||||
} catch (\Exception $e) {
|
||||
Log::error("Error getting values from section", [
|
||||
'error' => $e->getMessage(),
|
||||
'section_identifier' => $section_identifier,
|
||||
'sheet' => $no_sheet
|
||||
]);
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
private function convertToInteger($value) {
|
||||
// Check if the value is an empty string, and return null if true
|
||||
if (trim($value) === "") {
|
||||
// Check if the value is null or empty string, and return null if true
|
||||
if ($value === null || trim($value) === "") {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user