Files
sibedas/app/Models/PbgTask.php
2025-08-19 13:00:40 +07:00

141 lines
4.0 KiB
PHP

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class PbgTask extends Model
{
use HasFactory;
protected $table = 'pbg_task';
protected $fillable = [
'uuid',
'name',
'owner_name',
'application_type',
'application_type_name',
'condition',
'registration_number',
'document_number',
'address',
'status',
'status_name',
'slf_status',
'slf_status_name',
'function_type',
'consultation_type',
'due_date',
'land_certificate_phase',
'task_created_at',
'is_valid'
];
public function pbg_task_retributions(){
return $this->hasOne(PbgTaskRetributions::class, 'pbg_task_uid', 'uuid');
}
public function pbg_task_index_integrations(){
return $this->hasOne(PbgTaskIndexIntegrations::class, 'pbg_task_uid', 'uuid');
}
public function pbg_task_detail(){
return $this->hasOne(PbgTaskDetail::class, 'pbg_task_uid', 'uuid');
}
public function googleSheet(){
return $this->hasOne(PbgTaskGoogleSheet::class, 'formatted_registration_number', 'registration_number');
}
public function taskAssignments()
{
return $this->hasMany(TaskAssignment::class, 'pbg_task_uid', 'uuid');
}
public function attachments(){
return $this->hasMany(PbgTaskAttachment::class, 'pbg_task_id', 'id');
}
/**
* Get the data lists associated with this PBG task (One to Many)
* One pbg_task can have many data lists
*/
public function dataLists()
{
return $this->hasMany(PbgTaskDetailDataList::class, 'pbg_task_uuid', 'uuid');
}
/**
* Get only data lists with files
*/
public function dataListsWithFiles()
{
return $this->hasMany(PbgTaskDetailDataList::class, 'pbg_task_uuid', 'uuid')
->whereNotNull('file')
->where('file', '!=', '');
}
/**
* Get data lists by status
*/
public function dataListsByStatus($status)
{
return $this->hasMany(PbgTaskDetailDataList::class, 'pbg_task_uuid', 'uuid')
->where('status', $status);
}
/**
* Get data lists by data type
*/
public function dataListsByType($dataType)
{
return $this->hasMany(PbgTaskDetailDataList::class, 'pbg_task_uuid', 'uuid')
->where('data_type', $dataType);
}
/**
* Create or update data lists from API response
*/
public function syncDataLists(array $dataLists): void
{
foreach ($dataLists as $listData) {
PbgTaskDetailDataList::updateOrCreate(
['uid' => $listData['uid']],
[
'name' => $listData['name'] ?? null,
'description' => $listData['description'] ?? null,
'status' => $listData['status'] ?? null,
'status_name' => $listData['status_name'] ?? null,
'data_type' => $listData['data_type'] ?? null,
'data_type_name' => $listData['data_type_name'] ?? null,
'file' => $listData['file'] ?? null,
'note' => $listData['note'] ?? null,
'pbg_task_uuid' => $this->uuid,
]
);
}
}
/**
* Get data lists count by status
*/
public function getDataListsCountByStatusAttribute()
{
return $this->dataLists()
->selectRaw('status, COUNT(*) as count')
->groupBy('status')
->pluck('count', 'status');
}
/**
* Get data lists count by data type
*/
public function getDataListsCountByTypeAttribute()
{
return $this->dataLists()
->selectRaw('data_type, COUNT(*) as count')
->groupBy('data_type')
->pluck('count', 'data_type');
}
}