add new url scraping data and create tab data lists

This commit is contained in:
arifal
2025-08-15 17:25:20 +07:00
parent 6896fd62a3
commit 209ef07f9c
18 changed files with 1220 additions and 424 deletions

View File

@@ -0,0 +1,161 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class PbgTaskDetailDataList extends Model
{
use HasFactory;
protected $table = 'pbg_task_detail_data_lists';
protected $fillable = [
'uid',
'name',
'description',
'status',
'status_name',
'data_type',
'data_type_name',
'file',
'note',
'pbg_task_uuid',
];
protected $casts = [
'status' => 'integer',
'data_type' => 'integer',
'created_at' => 'datetime',
'updated_at' => 'datetime',
];
/**
* Relationship to PbgTask (Many to One)
* Many data lists belong to one pbg_task
*/
public function pbgTask()
{
return $this->belongsTo(PbgTask::class, 'pbg_task_uuid', 'uuid');
}
/**
* Get the full file path
*/
public function getFilePathAttribute()
{
return $this->file ? storage_path('app/public/' . $this->file) : null;
}
/**
* Get the file URL
*/
public function getFileUrlAttribute()
{
return $this->file ? asset('storage/' . $this->file) : null;
}
/**
* Check if file exists
*/
public function hasFile()
{
return !empty($this->file) && file_exists($this->getFilePathAttribute());
}
/**
* Get status badge color based on status
*/
public function getStatusBadgeAttribute()
{
return match($this->status) {
1 => 'success', // Sesuai
0 => 'danger', // Tidak Sesuai
default => 'secondary'
};
}
/**
* Scope: Filter by status
*/
public function scopeByStatus($query, $status)
{
return $query->where('status', $status);
}
/**
* Scope: Filter by data type
*/
public function scopeByDataType($query, $dataType)
{
return $query->where('data_type', $dataType);
}
/**
* Scope: With files only
*/
public function scopeWithFiles($query)
{
return $query->whereNotNull('file')->where('file', '!=', '');
}
/**
* Scope: Search by name or description
*/
public function scopeSearch($query, $search)
{
return $query->where(function ($q) use ($search) {
$q->where('name', 'LIKE', "%{$search}%")
->orWhere('description', 'LIKE', "%{$search}%")
->orWhere('status_name', 'LIKE', "%{$search}%")
->orWhere('data_type_name', 'LIKE', "%{$search}%");
});
}
/**
* Get file extension from file path
*/
public function getFileExtensionAttribute()
{
if (!$this->file) {
return null;
}
return strtoupper(pathinfo($this->file, PATHINFO_EXTENSION));
}
/**
* Get filename from file path
*/
public function getFileNameAttribute()
{
if (!$this->file) {
return null;
}
return basename($this->file);
}
/**
* Get formatted created date
*/
public function getFormattedCreatedAtAttribute()
{
return $this->created_at ? $this->created_at->format('d M Y, H:i') : '-';
}
/**
* Get truncated description
*/
public function getTruncatedDescriptionAttribute()
{
return $this->description ? \Str::limit($this->description, 80) : null;
}
/**
* Get truncated note
*/
public function getTruncatedNoteAttribute()
{
return $this->note ? \Str::limit($this->note, 100) : null;
}
}