Files
admin/app/Models/Package.php
Husanjonazamov e0f1989655 classify admin
2026-02-24 12:52:01 +05:00

192 lines
6.4 KiB
PHP

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Storage;
class Package extends Model {
use HasFactory;
protected $fillable = [
'name',
'price',
'discount_in_percentage',
'final_price',
'duration',
'item_limit',
'type',
'icon',
'description',
'status',
'ios_product_id',
'is_global',
'key_points',
'listing_duration_type',
'listing_duration_days'
];
protected $appends = ['translated_name', 'translated_description','translated_key_points'];
/**
* Get listing duration type, fallback to package duration if null
*
* @return string|null
*/
public function getListingDurationTypeAttribute($value)
{
// If listing_duration_type is null, return 'package' to indicate it uses package duration
if ($value === null) {
return 'package';
}
return $value;
}
/**
* Get listing duration days, fallback to package duration if null and type is package
*
* @return int|string|null
*/
public function getListingDurationDaysAttribute($value)
{
// If listing_duration_days is null and listing_duration_type is null or 'package', use package duration
if ($value === null || $value === '') {
$listingDurationType = $this->attributes['listing_duration_type'] ?? null;
if ($listingDurationType === null || $listingDurationType === '' || $listingDurationType === 'package') {
// Use raw duration attribute to avoid infinite loop
return $this->attributes['duration'] ?? null;
}
}
return $value;
}
public function user_purchased_packages() {
return $this->hasMany(UserPurchasedPackage::class);
}
public function translations()
{
return $this->hasMany(PackageTranslation::class);
}
public function categories()
{
return $this->belongsToMany(Category::class, 'package_categories', 'package_id', 'category_id');
}
public function package_categories()
{
return $this->hasMany(PackageCategory::class);
}
public function getIconAttribute($icon) {
if (!empty($icon)) {
return url(Storage::url($icon));
}
return $icon;
}
public function scopeSearch($query, $search) {
$search = "%" . $search . "%";
$query = $query->where(function ($q) use ($search) {
$q->orWhere('name', 'LIKE', $search)
->orWhere('price', 'LIKE', $search)
->orWhere('discount_in_percentage', 'LIKE', $search)
->orWhere('final_price', 'LIKE', $search)
->orWhere('duration', 'LIKE', $search)
->orWhere('item_limit', 'LIKE', $search)
->orWhere('type', 'LIKE', $search)
->orWhere('description', 'LIKE', $search)
->orWhere('status', 'LIKE', $search)
->orWhere('created_at', 'LIKE', $search)
->orWhere('updated_at', 'LIKE', $search);
});
return $query;
}
public function getTranslatedNameAttribute() {
$languageCode = request()->header('Content-Language') ?? app()->getLocale();
if (!empty($languageCode) && $this->relationLoaded('translations')) {
// NOTE : This code can be done in Cache
$language = Language::select(['id', 'code'])->where('code', $languageCode)->first();
$translation = $this->translations->first(static function ($data) use ($language) {
return $data->language_id == $language->id;
});
return !empty($translation?->name) ? $translation->name : $this->name;
}
return $this->name;
}
public function getTranslatedDescriptionAttribute() {
$languageCode = request()->header('Content-Language') ?? app()->getLocale();
if (!empty($languageCode) && $this->relationLoaded('translations')) {
$language = Language::select(['id', 'code'])->where('code', $languageCode)->first();
$translation = $this->translations->first(static function ($data) use ($language) {
return $data->language_id == $language->id;
});
return !empty($translation?->description) ? $translation->description : $this->description;
}
return $this->description;
}
public function scopeFilter($query, $filterObject) {
if (!empty($filterObject)) {
foreach ($filterObject as $column => $value) {
if ($column == "type") {
$query->where('type', $value);
} else {
$query->where((string)$column, (string)$value);
}
}
}
return $query;
}
public function getTranslatedKeyPointsAttribute()
{
$languageCode = request()->header('Content-Language') ?? app()->getLocale();
// ---------- Default / fallback ----------
if (!empty($this->key_points)) {
$defaultKeyPoints = is_array($this->key_points)
? $this->key_points
: (json_decode($this->key_points, true) ?? []);
} else {
$defaultKeyPoints = [];
}
// ---------- Translation ----------
if (!empty($languageCode) && $this->relationLoaded('translations')) {
$language = Language::select(['id', 'code'])
->where('code', $languageCode)
->first();
if ($language) {
$translation = $this->translations->first(static function ($data) use ($language) {
return $data->language_id == $language->id;
});
if (!empty($translation?->key_points)) {
$translatedKeyPoints = is_array($translation->key_points)
? $translation->key_points
: json_decode($translation->key_points, true);
if (json_last_error() === JSON_ERROR_NONE && is_array($translatedKeyPoints)) {
return $translatedKeyPoints;
}
}
}
}
return is_array($defaultKeyPoints) ? $defaultKeyPoints : [];
}
}