<?php
namespace App\Repositories;
use App\Models\LmsInstitute;
use App\Subscription;
use App\Traits\ImageStore;
use App\User;
use DrewM\MailChimp\MailChimp;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
use Modules\Affiliate\Repositories\AffiliateRepository;
use Modules\Coupons\Entities\UserWiseCoupon;
use Modules\CourseSetting\Entities\Course;
use Modules\CourseSetting\Entities\CourseEnrolled;
use Modules\LmsSaas\Http\Controllers\LmsSaasController as LmsSaasController;
use Modules\LmsSaasMD\Http\Controllers\LmsSaasController as LmsSaasControllerMD;
use Modules\Newsletter\Entities\NewsletterSetting;
use Modules\Newsletter\Http\Controllers\AcelleController;
use Modules\Payment\Entities\Cart;
use Modules\RolePermission\Entities\Role;
use Modules\SystemSetting\Entities\Staff;
use Modules\SystemSetting\Entities\StaffDocument;
class UserRepository implements UserRepositoryInterface
{
use ImageStore;
public function create(array $data)
{
$user = User::create($data);
if (isModuleActive('Appointment')) {
$slug = Str::slug($data['name']);
$exitUser = User::where('slug', $slug)->first();
if ($exitUser) {
$title = $data['name'] . '-' . substr(str_shuffle("qwertyuiopasdfghjklzxcvbnm"), 0, 4);
$slug = Str::slug($title);
}
$user->slug = $slug;
$user->save();
}
// $user->dob = $data['dob'] ?? null;
// $user->gender = $data['gender'] ?? null;
// $user->student_type = $data['student_type'] ?? null;
// $user->job_title = $data['job_title'] ?? null;
// $user->identification_number = $data['identification_number'] ?? null;
// $user->company_id = $data['company_id'] ?? null;
if (isModuleActive('Org') && !empty(Settings('org_student_default_branch'))) {
$user->org_chart_code = Settings('org_student_default_branch');
}
$user->referral = generateUniqueId();
$user->level = $data['level'];
$user->save();
if ($user->role_id == 3) {
if (session()->get('cart') != null && count(session()->get('cart')) > 0) {
foreach (session()->get('cart') as $key => $session_cart) {
$checkHasCourse = Course::find($session_cart['course_id']);
if ($checkHasCourse) {
$enolledCousrs = CourseEnrolled::where('user_id', $user->id)->where('course_id', $session_cart['course_id'])->first();
if (!$enolledCousrs) {
$hasInCart = Cart::where('course_id', $session_cart['course_id'])->where('user_id', $user->id)->first();
if (!$hasInCart) {
if ($checkHasCourse->discount_price != null) {
$price = $checkHasCourse->discount_price;
} else {
$price = $checkHasCourse->price;
}
$cart = new Cart();
$cart->user_id = $user->id;
$cart->instructor_id = $session_cart['instructor_id'];
$cart->course_id = $session_cart['course_id'];
$cart->tracking = getTrx();
$cart->price = $price;
$cart->save();
}
}
}
}
}
}
applyDefaultRoleToUser($user);
if (isModuleActive('Affiliate')) {
$affiliateRepo = new AffiliateRepository();
$affiliateRepo->affiliateUser($user->id);
}
assignStaffToUser($user);
if (isset($data['is_lms_signup'])) {
$institute = new LmsInstitute();
$institute->name = $data['institute_name'];
$institute->domain = $data['domain'];
$institute->user_id = $user->id;
if (isModuleActive("LmsSaasMD")) {
if (config('lmssaasmd.db_setup') == 'automatic') {
$institute_status = 1;
} else {
$institute_status = 0;
}
$user->is_active = 0;
} else {
$institute_status = 1;
}
$institute->status = $institute_status;
$institute->save();
$user->lms_id = $institute->id;
$user->update();
if (isModuleActive("LmsSaasMD") && config('lmssaasmd.db_setup') == 'automatic') {
$saas_controller = new LmsSaasControllerMD();
$saas_controller->newDbCreate($institute->id);
}
if (isModuleActive("LmsSaas")) {
$saas_controller = new LmsSaasController();
$saas_controller->lmsSetup($institute->id);
}
} else {
if (session::get('referral') != null) {
$invited_by = User::where('referral', session::get('referral'))->first();
$user_coupon = new UserWiseCoupon();
$user_coupon->invite_by = $invited_by->id;
$user_coupon->invite_accept_by = $user->id;
$user_coupon->invite_code = session::get('referral');
$user_coupon->save();
}
$mailchimpStatus = saasEnv('MailChimp_Status') ?? false;
$getResponseStatus = saasEnv('GET_RESPONSE_STATUS') ?? false;
$acelleStatus = saasEnv('ACELLE_STATUS') ?? false;
if (hasTable('newsletter_settings')) {
$setting = NewsletterSetting::getData();
if ($data['role_id'] == 2) {
if ($setting->instructor_status == 1) {
$list = $setting->instructor_list_id;
if ($setting->instructor_service == "Mailchimp") {
if ($mailchimpStatus) {
try {
$MailChimp = new MailChimp(saasEnv('MailChimp_API'));
$MailChimp->post("lists/$list/members", [
'email_address' => $data['email'],
'status' => 'subscribed',
]);
} catch (\Exception $e) {
}
}
} elseif ($setting->instructor_service == "GetResponse") {
if ($getResponseStatus) {
try {
$getResponse = new \GetResponse(saasEnv('GET_RESPONSE_API'));
$getResponse->addContact(array(
'email' => $data['email'],
'campaign' => array('campaignId' => $list),
));
} catch (\Exception $e) {
}
}
} elseif ($setting->instructor_service == "Acelle") {
if ($acelleStatus) {
try {
$email = $data['email'];
$make_action_url = '/subscribers?list_uid=' . $list . '&EMAIL=' . $email;
$acelleController = new AcelleController();
$response = $acelleController->curlPostRequest($make_action_url);
} catch (\Exception $e) {
}
}
} elseif ($setting->instructor_service == "Local") {
try {
$check = Subscription::where('email', '=', $data['email'])->first();
if (empty($check)) {
$subscribe = new Subscription();
$subscribe->email = $data['email'];
$subscribe->type = 'Instructor';
$subscribe->save();
} else {
$check->type = "Instructor";
$check->save();
}
} catch (\Exception $e) {
}
}
}
} elseif ($data['role_id'] == 3) {
if ($setting->student_status == 1) {
$list = $setting->student_list_id;
if ($setting->student_service == "Mailchimp") {
if ($mailchimpStatus) {
try {
$MailChimp = new MailChimp(saasEnv('MailChimp_API'));
$MailChimp->post("lists/$list/members", [
'email_address' => $data['email'],
'status' => 'subscribed',
]);
} catch (\Exception $e) {
}
}
} elseif ($setting->student_service == "GetResponse") {
if ($getResponseStatus) {
try {
$getResponse = new \GetResponse(saasEnv('GET_RESPONSE_API'));
$getResponse->addContact(array(
'email' => $data['email'],
'campaign' => array('campaignId' => $list),
));
} catch (\Exception $e) {
}
}
} elseif ($setting->student_service == "Acelle") {
if ($acelleStatus) {
try {
$email = $data['email'];
$make_action_url = '/subscribers?list_uid=' . $list . '&EMAIL=' . $email;
$acelleController = new AcelleController();
$response = $acelleController->curlPostRequest($make_action_url);
} catch (\Exception $e) {
}
}
} elseif ($setting->student_service == "Local") {
try {
$check = Subscription::where('email', '=', $data['email'])->first();
if (empty($check)) {
$subscribe = new Subscription();
$subscribe->email = $data['email'];
$subscribe->type = 'Student';
$subscribe->save();
} else {
$check->type = "Student";
$check->save();
}
} catch (\Exception $e) {
}
}
}
}
}
}
if (Settings('email_verification') != 1) {
$user->email_verified_at = date('Y-m-d H:m:s');
$user->save();
} else {
if (isModuleActive('LmsSaas') && !empty($user->institute) && $user->institute->domain != SaasDomain()) {
Storage::put(md5($user->email), $user->email);
} else {
$user->sendEmailVerificationNotification();
}
// $user->sendEmailVerificationNotification();
}
return $user;
}
public function store(array $data)
{
$user = new User;
$user->name = $data['name'];
$user->email = $data['email'];
$user->username = $data['username'];
$user->role_id = $data['role_id'];
$user->country = $data['country'];
if (isset($data['photo'])) {
$data = Arr::add($data, 'avatar', $this->saveAvatar($data['photo']));
$user->image = $data['avatar'];
}
$user->password = Hash::make($data['password']);
if (Settings('email_verification') != 1) {
$user->email_verified_at = date('Y-m-d H:m:s');
$user->save();
} else {
$user->sendEmailVerificationNotification();
}
return $user;
}
public function update(array $data, $id)
{
$user = User::findOrFail($id);
if (Hash::check($data['password'], Auth::user()->password)) {
if (isset($data['photo'])) {
$data = Arr::add($data, 'avatar', $this->saveAvatar($data['photo']));
$user->image = $data['avatar'];
}
$user->name = $data['name'];
$user->username = $data['username'];
$user->role_id = $data['role_id'];
$user->password = Hash::make($data['password']);
if ($user->save()) {
$staff = $user->staff;
$staff->user_id = $user->id;
$staff->department_id = $data['department_id'];
$staff->employee_id = $data['employee_id'];
$staff->showroom_id = $data['showroom_id'];
// $staff->warehouse_id = $data['warehouse_id'];
$staff->phone = $data['phone'];
if ($staff->save()) {
if (Settings('email_verification') != 1) {
$user->email_verified_at = date('Y-m-d H:m:s');
$user->save();
} else {
$user->sendEmailVerificationNotification();
}
}
return $user;
}
}
}
///////
public function user()
{
return User::with('leaves', 'leaveDefines')->latest()->get();
}
public function all($relational_keyword = [])
{
if (count($relational_keyword) > 0) {
return Staff::latest()->get();
} else {
return Staff::latest()->get();
}
}
public function find($id)
{
return Staff::with('user')->findOrFail($id);
}
public function findUser($id)
{
return User::findOrFail($id);
}
public function findDocument($id)
{
return StaffDocument::where('staff_id', $id)->get();
}
public function updateProfile(array $data, $id)
{
$user = User::findOrFail($id);
if (isset($data['avatar'])) {
$user->avatar = $this->saveAvatar($data['avatar'], 60, 60);
}
$user->name = $data['name'];
if (isset($data['password']) and $data['password']) {
$user->password = bcrypt($data['password']);
}
$result = $user->save();
$staff = $user->staff;
if ($result) {
$staff->phone = $data['phone'];
if ($user->role_id != 1) {
$staff->bank_name = $data['bank_name'];
$staff->bank_branch_name = $data['bank_branch_name'];
$staff->bank_account_name = $data['bank_account_name'];
$staff->bank_account_no = $data['bank_account_no'];
$staff->current_address = $data['current_address'];
$staff->permanent_address = $data['permanent_address'];
}
$staff->save();
}
return $staff;
}
public function delete($id)
{
$user = User::findOrFail($id);
if ($user->staff) {
if (isModuleActive('HumanResource')) {
if ($user->staff->payrolls) {
$user->staff->payrolls()->delete();
}
}
$user->staff->delete();
}
$user->delete();
}
public function statusUpdate($data)
{
$user = User::find($data['id']);
$user->is_active = $data['status'];
$user->status = $data['status'];
$user->save();
}
public function deleteStaffDoc($id)
{
$document = StaffDocument::findOrFail($id)->delete();
}
public function normalUser()
{
$normal_roles_id = Role::where('type', 'regular_user')->pluck('id');
return User::where('id', Auth::id())->orwhereIn('role_id', $normal_roles_id)->get();
}
public function roleUsers($role_id)
{
return User::where('role_id', $role_id)->where('is_active', 1)->get();
}
}