<?php
namespace App\Models;
use App\Country;
use Carbon\Carbon;
use App\Traits\Tenantable;
use App\Models\LmsInstitute;
use App\Traits\UserChatMethods;
use Modules\Forum\Entities\Forum;
use App\Notifications\VerifyEmail;
use Illuminate\Support\Facades\DB;
use Laravel\Passport\HasApiTokens;
use Illuminate\Support\Facades\Log;
use Modules\Org\Entities\OrgBranch;
use Modules\Org\Entities\OrgPosition;
use Modules\Forum\Entities\ForumReply;
use Modules\Payment\Entities\Withdraw;
use Illuminate\Support\Facades\Session;
use Modules\Chat\Entities\Notification;
use Modules\CPD\Entities\AssignStudent;
use Illuminate\Notifications\Notifiable;
use Modules\Payment\Entities\Subscriber;
use Modules\RolePermission\Entities\Role;
use Modules\CourseSetting\Entities\Course;
use Modules\Localization\Entities\Language;
use Modules\SystemSetting\Entities\Message;
use Modules\SystemSetting\Entities\Currency;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Modules\Payment\Entities\InstructorPayout;
use Rennokki\QueryCache\Traits\QueryCacheable;
use App\Notifications\PasswordResetNotification;
use Modules\CourseSetting\Entities\CourseReveiw;
use Modules\Quiz\Entities\StudentTakeOnlineQuiz;
use Modules\CourseSetting\Entities\CourseEnrolled;
use Modules\Certificate\Entities\CertificateRecord;
use Modules\OfflinePayment\Entities\OfflinePayment;
use Modules\OrgInstructorPolicy\Entities\OrgPolicy;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable implements MustVerifyEmail
{
use HasApiTokens, Notifiable, QueryCacheable, UserChatMethods, Tenantable;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected static $flushCacheOnUpdate = true;
protected $table = 'users';
protected $fillable = [
'name', 'role_id', 'username', 'email', 'phone', 'password', 'email_verified_at', 'mobile_verified_at', 'avatar', 'subscribe', 'accept_affiliate_request'
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password', 'remember_token',
];
/**
* The attributes that should be cast to native types.
*
* @var array
*/
protected $casts = [
'email_verified_at' => 'datetime',
];
protected $appends = ['first_name', 'last_name', 'blocked_by_me'];
public function notifications()
{
return $this->morphMany(Notification::class, 'notifiable')->orderBy('created_at', 'desc');
}
public function role()
{
return $this->belongsTo(Role::class);
}
public function currency()
{
return $this->belongsTo(Currency::class)->withDefault();
}
public function offlinePayments()
{
return $this->hasMany(OfflinePayment::class, 'user_id');
}
public function courses()
{
return $this->hasMany(Course::class, 'user_id');
}
public function subscriptions()
{
return $this->hasMany(Subscriber::class, 'user_id', 'id')->whereDate('valid', '>=', Carbon::now());
}
public function enrolls()
{
return $this->hasManyThrough(CourseEnrolled::class, Course::class);
}
public function withdraws()
{
return $this->hasMany(Withdraw::class, 'instructor_id');
}
public function earnings()
{
return $this->hasMany(InstructorPayout::class, 'instructor_id');
}
public function forumReply()
{
return $this->hasMany(ForumReply::class, 'user_id');
}
public function forums()
{
return $this->hasMany(Forum::class, 'created_by');
}
public function gettotalEarnAttribute()
{
return round($this->earnings()->sum('reveune'), 2);
}
public function lastMessage()
{
$message = Message::where('sender_id', $this->id)->orWhere('reciever_id', $this->id)->orderBy('id', 'desc')->first();
if ($message) {
return $message;
} else {
return null;
}
}
public function reciever()
{
return $this->hasOne(Message::class, 'reciever_id')->latest();
}
public function sender()
{
return $this->hasOne(Message::class, 'sender_id')->latest();
}
public function getmessageFormatAttribute()
{
return Carbon::parse($this->created_at)->diffForHumans();
}
public function enrollCourse()
{
return $this->belongsToMany(Course::class, 'course_enrolleds', 'user_id', 'course_id');
}
public function enCoursesInstance()
{
return $this->hasMany(CourseEnrolled::class);
}
public function language()
{
return $this->belongsTo(Language::class);
}
public function recievers()
{
return $this->hasMany(Message::class, 'reciever_id')->latest();
}
public function senders()
{
return $this->hasMany(Message::class, 'sender_id')->latest();
}
public function userLanguage()
{
return $this->belongsTo(Language::class, 'language_id')->withDefault();
}
public function enrollStudents()
{
return $this->hasMany(CourseEnrolled::class)->EnrollStudent();
}
public function apiKey()
{
return $this->zoom_api_key_of_user;
}
public function apiSecret()
{
return $this->zoom_api_serect_of_user;
}
public function submittedExam()
{
return $this->hasOne(StudentTakeOnlineQuiz::class, 'student_id')->latest();
}
public function userCountry()
{
return $this->belongsTo(Country::class, 'country')->withDefault();
}
public function totalCourses()
{
$totalCourses = Course::where('user_id', '=', $this->id)->count();
return $totalCourses;
}
public function totalEnrolled()
{
$totalEnrolled = Course::where('user_id', '=', $this->id)->sum('total_enrolled');
return $totalEnrolled;
}
public function totalRating()
{
$totalRatings['total'] = 0;
$totalRatings['rating'] = 0;
$courses = Course::where('user_id', '=', $this->id)->get('id');
foreach ($courses as $course) {
$all = CourseReveiw::where('course_id', $course->id)->where('status', 1)->get();
$totalRatings['total'] = $totalRatings['total'] + count($all);
$ratings = 0;
foreach ($all as $data) {
$ratings = $data->star + $ratings;
}
$totalRatings['rating'] = $totalRatings['rating'] + $ratings;
}
if ($totalRatings['total'] != 0) {
$avg = ($totalRatings['rating'] / $totalRatings['total']);
} else {
$avg = 0;
}
if ($avg != 0) {
if ($avg - floor($avg) > 0) {
$rate = number_format($avg, 1);
} else {
$rate = number_format($avg, 0);
}
$totalRatings['rating'] = $rate;
}
return $totalRatings;
}
public function sendEmailVerificationNotification()
{
$this->notify(new VerifyEmail());
}
public function sendPasswordResetNotification($token)
{
$this->notify(new PasswordResetNotification($token));
}
public function cityName()
{
$find = DB::table('spn_cities')->where('id', $this->city)->first();
$city = '';
if ($find) {
$city = $find->name;
}
return $city;
}
public function totalSellCourse()
{
return $this->hasManyThrough(CourseEnrolled::class, Course::class, 'user_id', 'course_id', 'id');
}
public function totalReview()
{
return $this->hasManyThrough(CourseReveiw::class, Course::class, 'user_id', 'course_id', 'id');
}
public function routeNotificationForFcm($notification)
{
return $this->device_token;
}
public function position()
{
return $this->belongsTo(OrgPosition::class, 'org_position_code', 'code')->withDefault();
}
public function branch()
{
return $this->belongsTo(OrgBranch::class, 'org_chart_code', 'code')->withDefault();
}
public function policy()
{
return $this->belongsTo(OrgPolicy::class, 'policy_id')->withDefault();
}
public function totalCertificate()
{
return $this->hasMany(CertificateRecord::class, 'student_id')->count();
}
public function cpds()
{
return $this->hasMany(AssignStudent::class, 'student_id', 'id');
}
public function totalStudentCourses()
{
$enrolls = $this->hasMany(CourseEnrolled::class, 'user_id')->with('course')->get();
$result['complete'] = 0;
$result['process'] = 0;
foreach ($enrolls as $enroll) {
if ($enroll->course->loginUserTotalPercentage >= 100) {
$result['complete']++;
} else {
$result['process']++;
}
}
return $result;
}
public function category()
{
$courses = $this->courses;
$category_ids = [];
$category = [];
foreach ($courses as $key => $course) {
if (!array_search($course->category_id, $category_ids)) {
$category_ids[] = $course->category_id;
$category[] = $course->category->name;
}
}
if (count($category) != 0) {
$result = $category[0];
} else {
$result = 'N/A';
}
return $result;
}
protected static function boot()
{
parent::boot();
self::created(function ($model) {
if ($model->role_id == 2) {
saasPlanManagement('instructor', 'create');
}
if ($model->role_id == 3) {
saasPlanManagement('student', 'create');
}
});
self::deleted(function ($model) {
if ($model->role_id == 2) {
saasPlanManagement('instructor', 'delete');
}
if ($model->role_id == 3) {
saasPlanManagement('student', 'delete');
}
});
}
}