|
Server : Apache/2.4.41 (Ubuntu) System : Linux vmi1525618.contaboserver.net 5.4.0-105-generic #119-Ubuntu SMP Mon Mar 7 18:49:24 UTC 2022 x86_64 User : www-data ( 33) PHP Version : 8.2.12 Disable Function : NONE Directory : /var/www/lecturebazaar.com/app/Models/ |
Upload File : |
<?php
namespace App\Models;
use App\User;
use Astrotomic\Translatable\Contracts\Translatable as TranslatableContract;
use Astrotomic\Translatable\Translatable;
use Illuminate\Database\Eloquent\Model;
class Installment extends Model implements TranslatableContract
{
use Translatable;
protected $table = 'installments';
public $timestamps = false;
protected $guarded = ['id'];
static $optionsExplodeKey = "8888";
// Enums
static $targetTypes = ['all', 'courses', 'store_products', 'bundles', 'meetings', 'registration_packages', 'subscription_packages'];
static $courseTargets = ['all_courses', 'live_classes', 'video_courses', 'text_courses', 'specific_categories', 'specific_instructors', 'specific_courses'];
static $productTargets = ['all_products', 'virtual_products', 'physical_products', 'specific_categories', 'specific_sellers', 'specific_products'];
static $bundleTargets = ['all_bundles', 'specific_categories', 'specific_instructors', 'specific_bundles'];
static $meetingTargets = ['all_meetings', 'specific_instructors'];
static $subscriptionTargets = ['all_packages', 'specific_packages'];
static $registrationPackagesTargets = ['all_packages', 'specific_packages'];
public $translatedAttributes = ['title', 'main_title', 'description', 'banner', 'options', 'verification_description', 'verification_banner', 'verification_video'];
public function getTitleAttribute()
{
return getTranslateAttributeValue($this, 'title');
}
public function getMainTitleAttribute()
{
return getTranslateAttributeValue($this, 'main_title');
}
public function getDescriptionAttribute()
{
return getTranslateAttributeValue($this, 'description');
}
public function getBannerAttribute()
{
return getTranslateAttributeValue($this, 'banner');
}
public function getOptionsAttribute()
{
return getTranslateAttributeValue($this, 'options');
}
public function getVerificationDescriptionAttribute()
{
return getTranslateAttributeValue($this, 'verification_description');
}
public function getVerificationBannerAttribute()
{
return getTranslateAttributeValue($this, 'verification_banner');
}
public function getVerificationVideoAttribute()
{
return getTranslateAttributeValue($this, 'verification_video');
}
public function getUpfrontAttribute()
{
return $this->attributes['upfront'] + 0;
}
// #############
// Relations
// ############
public function userGroups()
{
return $this->hasMany(InstallmentUserGroup::class, 'installment_id', 'id');
}
public function specificationItems() // used just in query
{
return $this->hasMany(InstallmentSpecificationItem::class, 'installment_id', 'id');
}
public function categories()
{
return $this->belongsToMany(Category::class, 'installment_specification_items', 'installment_id', 'category_id');
}
public function instructors()
{
return $this->belongsToMany(User::class, 'installment_specification_items', 'installment_id', 'instructor_id');
}
public function sellers()
{
return $this->belongsToMany(User::class, 'installment_specification_items', 'installment_id', 'seller_id');
}
public function webinars()
{
return $this->belongsToMany(Webinar::class, 'installment_specification_items', 'installment_id', 'webinar_id');
}
public function products()
{
return $this->belongsToMany(Product::class, 'installment_specification_items', 'installment_id', 'product_id');
}
public function bundles()
{
return $this->belongsToMany(Bundle::class, 'installment_specification_items', 'installment_id', 'bundle_id');
}
public function subscribes()
{
return $this->belongsToMany(Subscribe::class, 'installment_specification_items', 'installment_id', 'subscribe_id');
}
public function registrationPackages()
{
return $this->belongsToMany(RegistrationPackage::class, 'installment_specification_items', 'installment_id', 'registration_package_id');
}
public function steps()
{
return $this->hasMany(InstallmentStep::class, 'installment_id', 'id');
}
public function orders()
{
return $this->hasMany(InstallmentOrder::class, 'installment_id', 'id');
}
// #############
// Helpers
// ############
public function reachedCapacityPercent()
{
$orders = InstallmentOrder::query()
->where('installment_id', $this->id)
->whereIn('status', ['open', 'pending_verification'])
->count();
$percent = 0;
if ($orders > 0 and $this->capacity > 0) {
$percent = ($orders / $this->capacity) * 100;
}
return $percent;
}
public function hasCapacity()
{
$result = true;
if (!empty($this->capacity)) {
$orders = InstallmentOrder::query()
->where('installment_id', $this->id)
->whereIn('status', ['open', 'pending_verification'])
->count();
if ($orders >= $this->capacity) {
$result = false;
}
}
return $result;
}
public function getUpfront($itemPrice = 1)
{
$result = 0;
if (!empty($this->upfront) and $this->upfront > 0) {
if ($this->upfront_type == 'percent') {
$result = ($itemPrice * $this->upfront) / 100;
} else {
$result = $this->upfront;
}
}
return $result;
}
public function totalPayments($itemPrice = 1, $withUpfront = true)
{
$total = 0;
if (!empty($this->upfront) and $withUpfront) {
if ($this->upfront_type == 'percent') {
$total += ($itemPrice * $this->upfront) / 100;
} else {
$total += $this->upfront;
}
}
foreach ($this->steps as $step) {
$total += $step->getPrice($itemPrice);
}
return $total;
}
public function totalInterest($itemPrice = 1, $totalPayments = null)
{
if (empty($totalPayments)) {
$totalPayments = $this->totalPayments($itemPrice);
}
$result = 0;
$tmp = ($totalPayments - $itemPrice);
if ($tmp > 0) {
$tmp2 = ($tmp / $itemPrice) * 100;
if ($tmp2 > 0) {
$result = number_format($tmp2, 2);
}
}
return $result;
}
public function needToVerify($user = null)
{
$result = false;
if (empty($user)) {
$user = auth()->user();
}
if ($this->verification) {
$result = true;
if (!empty($user) and $this->bypass_verification_for_verified_users and $user->installment_approval) {
$result = false;
}
}
return $result;
}
}