@ -0,0 +1,103 @@ | |||
<?php | |||
namespace App; | |||
use Froiden\RestAPI\ApiModel; | |||
use Illuminate\Support\Facades\Schema; | |||
class BaseModel extends ApiModel | |||
{ | |||
protected $mimeType = [ | |||
'txt' => 'fa-file-text', | |||
'htm' => 'fa-file-code-o', | |||
'html' => 'fa-file-code-o', | |||
// 'php' => 'fa-file-code-o', | |||
'css' => 'fa-file-code-o', | |||
'js' => 'fa-file-code-o', | |||
'json' => 'fa-file-code-o', | |||
'xml' => 'fa-file-code-o', | |||
'swf' => 'fa-file-o', | |||
'CR2' => 'fa-file-o', | |||
'flv' => 'fa-file-video-o', | |||
// images | |||
'png' => 'fa-file-image-o', | |||
'jpe' => 'fa-file-image-o', | |||
'jpeg' => 'fa-file-image-o', | |||
'jpg' => 'fa-file-image-o', | |||
'gif' => 'fa-file-image-o', | |||
'bmp' => 'fa-file-image-o', | |||
'ico' => 'fa-file-image-o', | |||
'tiff' => 'fa-file-image-o', | |||
'tif' => 'fa-file-image-o', | |||
'svg' => 'fa-file-image-o', | |||
'svgz' => 'fa-file-image-o', | |||
// archives | |||
'zip' => 'fa-file-o', | |||
'rar' => 'fa-file-o', | |||
'exe' => 'fa-file-o', | |||
'msi' => 'fa-file-o', | |||
'cab' => 'fa-file-o', | |||
// audio/video | |||
'mp3' => 'fa-file-audio-o', | |||
'qt' => 'fa-file-video-o', | |||
'mov' => 'fa-file-video-o', | |||
'mp4' => 'fa-file-video-o', | |||
'mkv' => 'fa-file-video-o', | |||
'avi' => 'fa-file-video-o', | |||
'wmv' => 'fa-file-video-o', | |||
'mpg' => 'fa-file-video-o', | |||
'mp2' => 'fa-file-video-o', | |||
'mpeg' => 'fa-file-video-o', | |||
'mpe' => 'fa-file-video-o', | |||
'mpv' => 'fa-file-video-o', | |||
'3gp' => 'fa-file-video-o', | |||
'm4v' => 'fa-file-video-o', | |||
// adobe | |||
'pdf' => 'fa-file-pdf-o', | |||
'psd' => 'fa-file-image-o', | |||
'ai' => 'fa-file-o', | |||
'eps' => 'fa-file-o', | |||
'ps' => 'fa-file-o', | |||
// ms office | |||
'doc' => 'fa-file-text', | |||
'rtf' => 'fa-file-text', | |||
'xls' => 'fa-file-excel-o', | |||
'ppt' => 'fa-file-powerpoint-o', | |||
'docx' => 'fa-file-text', | |||
'xlsx' => 'fa-file-excel-o', | |||
'pptx' => 'fa-file-powerpoint-o', | |||
// open office | |||
'odt' => 'fa-file-text', | |||
'ods' => 'fa-file-text', | |||
]; | |||
public function getIconAttribute($value) { | |||
$isColExist = Schema::hasColumn($this->getTable(),'icon'); | |||
if($isColExist){ | |||
return $value; | |||
} | |||
if (is_null($this->external_link) && !$isColExist) { | |||
$ext = pathinfo($this->filename, PATHINFO_EXTENSION); | |||
if ($ext == 'png' || $ext == 'jpe' || $ext == 'jpeg' || $ext == 'jpg' || $ext == 'gif' || $ext == 'bmp' || | |||
$ext == 'ico' || $ext == 'tif' || $ext == 'svg' || $ext == 'svgz' || $ext == 'psd' || $ext == 'csv') | |||
{ | |||
return 'images'; | |||
} | |||
else{ | |||
return $this->mimeType[$ext]; | |||
} | |||
} | |||
} | |||
} |
@ -0,0 +1,212 @@ | |||
<?php | |||
namespace App; | |||
use App\Notifications\EmailVerification; | |||
use App\Notifications\NewUser; | |||
use App\Observers\CompanyObserver; | |||
use App\Scopes\CompanyScope; | |||
use GuzzleHttp\Client; | |||
use Illuminate\Notifications\Notifiable; | |||
use Laravel\Cashier\Billable; | |||
use Laravel\Cashier\Invoice; | |||
use Stripe\Invoice as StripeInvoice; | |||
class Company extends BaseModel | |||
{ | |||
protected $table = 'companies'; | |||
protected $dates = ['trial_ends_at', 'licence_expire_on', 'created_at', 'updated_at', 'last_login']; | |||
protected $fillable = ['last_login', 'company_name', 'company_email', 'company_phone', 'website', 'address', 'currency_id', 'timezone', 'locale', 'date_format', 'time_format', 'week_start', 'longitude', 'latitude', 'status']; | |||
protected $appends = ['logo_url', 'login_background_url','moment_date_format']; | |||
use Notifiable, Billable; | |||
// public function findInvoice($id) | |||
// { | |||
// try { | |||
// $stripeInvoice = StripeInvoice::retrieve( | |||
// $id, | |||
// $this->getStripeKey() | |||
// ); | |||
// $stripeInvoice->lines = StripeInvoice::retrieve($id, $this->getStripeKey()) | |||
// ->lines | |||
// ->all(['limit' => 1000]); | |||
// $stripeInvoice->date = $stripeInvoice->created; | |||
// return new Invoice($this, $stripeInvoice); | |||
// } catch (\Exception $e) { | |||
// // | |||
// } | |||
// } | |||
public static function boot() | |||
{ | |||
parent::boot(); | |||
static::observe(CompanyObserver::class); | |||
} | |||
public function currency() | |||
{ | |||
return $this->belongsTo(Currency::class, 'currency_id')->withoutGlobalScopes(['enable']); | |||
} | |||
public function package() | |||
{ | |||
return $this->belongsTo(Package::class, 'package_id'); | |||
} | |||
public function employees() | |||
{ | |||
return $this->hasMany(User::class) | |||
->join('employee_details', 'employee_details.user_id', 'users.id'); | |||
} | |||
public function file_storage() | |||
{ | |||
return $this->hasMany(FileStorage::class, 'company_id'); | |||
} | |||
public function getLogoUrlAttribute() | |||
{ | |||
if (is_null($this->logo)) { | |||
$global = global_settings(); | |||
return $global->logo_url; | |||
} | |||
return asset_url('app-logo/' . $this->logo); | |||
} | |||
public function getLoginBackgroundUrlAttribute() | |||
{ | |||
if (is_null($this->login_background) || $this->login_background == 'login-background.jpg') { | |||
return asset('img/login-bg.jpg'); | |||
} | |||
return asset_url('login-background/' . $this->login_background); | |||
} | |||
public function validateGoogleRecaptcha($googleRecaptchaResponse) | |||
{ | |||
$global = global_settings(); | |||
$client = new Client(); | |||
$response = $client->post( | |||
'https://www.google.com/recaptcha/api/siteverify', | |||
['form_params' => | |||
[ | |||
'secret' => $global->google_recaptcha_secret, | |||
'response' => $googleRecaptchaResponse, | |||
'remoteip' => $_SERVER['REMOTE_ADDR'] | |||
]] | |||
); | |||
$body = json_decode((string) $response->getBody()); | |||
return $body->success; | |||
} | |||
public function getMomentDateFormatAttribute() | |||
{ | |||
$momentDateFormats = [ | |||
'd-m-Y' => 'DD-MM-YYYY', | |||
'm-d-Y' => 'MM-DD-YYYY', | |||
'Y-m-d' => 'YYYY-MM-DD', | |||
'd.m.Y' => 'DD.MM.YYYY', | |||
'm.d.Y' => 'MM.DD.YYYY', | |||
'Y.m.d' => 'YYYY.MM.DD', | |||
'd/m/Y' => 'DD/MM/YYYY', | |||
'm/d/Y' => 'MM/DD/YYYY', | |||
'Y/m/d' => 'YYYY/MM/DD', | |||
'd/M/Y' => 'DD/MMM/YYYY', | |||
'd.M.Y' => 'DD.MMM.YYYY', | |||
'd-M-Y' => 'DD-MMM-YYYY', | |||
'd M Y' => 'DD MMM YYYY', | |||
'd F, Y' => 'DD MMMM, YYYY', | |||
'D/M/Y' => 'ddd/MMM/YYYY', | |||
'D.M.Y' => 'ddd.MMM.YYYY', | |||
'D-M-Y' => 'ddd-MMM-YYYY', | |||
'D M Y' => 'ddd MMM YYYY', | |||
'd D M Y' => 'DD ddd MMM YYYY', | |||
'D d M Y' => 'ddd DD MMM YYYY', | |||
'dS M Y' => 'Do MMM YYYY', | |||
]; | |||
return $momentDateFormats[$this->date_format]; | |||
} | |||
public function addUser($company, $request) | |||
{ | |||
// Save Admin | |||
$user = User::withoutGlobalScopes([CompanyScope::class, 'active'])->where('email', $request->email)->first(); | |||
if (is_null($user)) { | |||
$user = new User(); | |||
} | |||
$user->company_id = $company->id; | |||
$user->name = 'admin'; | |||
$user->email = $request->email; | |||
$user->password = bcrypt($request->password); | |||
$user->status = 'active'; | |||
$user->email_verification_code = str_random(40); | |||
$user->save(); | |||
return $user; | |||
} | |||
public function addEmployeeDetails($user) | |||
{ | |||
$employee = new EmployeeDetails(); | |||
$employee->user_id = $user->id; | |||
$employee->employee_id = 'emp-' . $user->id; | |||
$employee->company_id = $user->company_id; | |||
$employee->address = 'address'; | |||
$employee->hourly_rate = '50'; | |||
$employee->save(); | |||
$global = global_settings(); | |||
if ($global->email_verification == 1) { | |||
// Send verification mail | |||
$user->notify(new EmailVerification($user)); | |||
$user->status = 'deactive'; | |||
$user->save(); | |||
$message = __('messages.signUpThankYouVerify'); | |||
} else { | |||
$user->notify(new NewUser(request()->password)); | |||
$message = __('messages.signUpThankYou') . ' <a href="' . route('login') . '">Login Now</a>.'; | |||
} | |||
return $message; | |||
} | |||
public function recaptchaValidate($request) | |||
{ | |||
$global = global_settings(); | |||
if ($global->google_recaptcha_status) { | |||
$gRecaptchaResponseInput = 'g-recaptcha-response'; | |||
$gRecaptchaResponse = $request->{$gRecaptchaResponseInput}; | |||
$validateRecaptcha = $this->validateGoogleRecaptcha($gRecaptchaResponse); | |||
if (!$validateRecaptcha) { | |||
return false; | |||
} | |||
} | |||
return true; | |||
} | |||
public function assignRoles($user) | |||
{ | |||
// Assign roles even before verification | |||
$adminRole = Role::where('name', 'admin')->where('company_id', $user->company_id)->first(); | |||
$user->roles()->attach($adminRole->id); | |||
$employeeRole = Role::where('name', 'employee')->where('company_id', $user->company_id)->first(); | |||
$user->roles()->attach($employeeRole->id); | |||
return $user; | |||
} | |||
public function setSubDomainAttribute($value) | |||
{ | |||
// domain is added in the request Class | |||
$this->attributes['sub_domain'] = strtolower($value); | |||
} | |||
} |
@ -0,0 +1,10 @@ | |||
<?php | |||
namespace App; | |||
use Illuminate\Database\Eloquent\Model; | |||
class CompanySetting extends BaseModel | |||
{ | |||
protected $table = 'organisation_settings'; | |||
} |
@ -0,0 +1,33 @@ | |||
<?php | |||
namespace App\Events; | |||
use App\Company; | |||
use Illuminate\Broadcasting\Channel; | |||
use Illuminate\Broadcasting\InteractsWithSockets; | |||
use Illuminate\Broadcasting\PresenceChannel; | |||
use Illuminate\Broadcasting\PrivateChannel; | |||
use Illuminate\Contracts\Broadcasting\ShouldBroadcast; | |||
use Illuminate\Foundation\Events\Dispatchable; | |||
use Illuminate\Queue\SerializesModels; | |||
class CompanyRegistered | |||
{ | |||
use Dispatchable, InteractsWithSockets, SerializesModels; | |||
public $company; | |||
public function __construct(Company $company) | |||
{ | |||
$this->company = $company; | |||
} | |||
/** | |||
* Get the channels the event should broadcast on. | |||
* | |||
* @return \Illuminate\Broadcasting\Channel|array | |||
*/ | |||
public function broadcastOn() | |||
{ | |||
return new PrivateChannel('company-registered'); | |||
} | |||
} |
@ -0,0 +1,72 @@ | |||
<?php | |||
namespace App\Exceptions; | |||
use Exception; | |||
use Illuminate\Auth\AuthenticationException; | |||
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler; | |||
use Illuminate\Session\TokenMismatchException; | |||
use Throwable; | |||
use Illuminate\Validation\ValidationException as ValidationException; | |||
class Handler extends ExceptionHandler | |||
{ | |||
/** | |||
* A list of the exception types that should not be reported. | |||
* | |||
* @var array | |||
*/ | |||
protected $dontReport = [ | |||
\Illuminate\Auth\AuthenticationException::class, | |||
\Illuminate\Auth\Access\AuthorizationException::class, | |||
\Symfony\Component\HttpKernel\Exception\HttpException::class, | |||
\Illuminate\Database\Eloquent\ModelNotFoundException::class, | |||
\Illuminate\Session\TokenMismatchException::class, | |||
\Illuminate\Validation\ValidationException::class, | |||
]; | |||
public function report(Throwable $exception) | |||
{ | |||
parent::report($exception); | |||
} | |||
public function render($request, Throwable $exception) | |||
{ | |||
// if (api_user()) { | |||
// if ($exception instanceof ValidationException) { | |||
// return response()->json( | |||
// [ | |||
// 'message' => __('validation.givenDataInvalid'), | |||
// 'errors' => $exception->validator->getMessageBag() | |||
// ], | |||
// 422 | |||
// ); | |||
// } | |||
// } | |||
if ($exception instanceof TokenMismatchException) { | |||
return redirect(route('login'))->with('message', 'You page session expired. Please try again'); | |||
} | |||
return parent::render($request, $exception); | |||
} | |||
/** | |||
* Convert an authentication exception into an unauthenticated response. | |||
* | |||
* @param \Illuminate\Http\Request $request | |||
* @param \Illuminate\Auth\AuthenticationException $exception | |||
* @return \Illuminate\Http\Response | |||
*/ | |||
protected function unauthenticated($request, AuthenticationException $exception) | |||
{ | |||
if ($request->expectsJson()) { | |||
return response()->json(['error' => 'Unauthenticated.'], 401); | |||
} | |||
return redirect()->guest(route('login')); | |||
} | |||
} |
@ -0,0 +1,184 @@ | |||
<?php | |||
namespace App\Helper; | |||
use App\FileStorage; | |||
use Illuminate\Support\Facades\Storage; | |||
use Intervention\Image\ImageManagerStatic as Image; | |||
/** | |||
* Class Reply | |||
* @package App\Classes | |||
*/ | |||
class Files | |||
{ | |||
/** | |||
* @param $image | |||
* @param $dir | |||
* @param null $width | |||
* @param int $height | |||
* @param $crop | |||
* @return string | |||
* @throws \Exception | |||
*/ | |||
public static function upload($image, $dir, $width = null, $height = 800, $crop = false) | |||
{ | |||
config(['filesystems.default' => 'local']); | |||
/** @var UploadedFile $uploadedFile */ | |||
$uploadedFile = $image; | |||
$folder = $dir . '/'; | |||
if (!$uploadedFile->isValid()) { | |||
throw new \Exception('File was not uploaded correctly'); | |||
} | |||
$newName = self::generateNewFileName($uploadedFile->getClientOriginalName()); | |||
$tempPath = public_path('user-uploads/temp/' . $newName); | |||
/** Check if folder exits or not. If not then create the folder */ | |||
if (!\File::exists(public_path('user-uploads/' . $folder))) { | |||
\File::makeDirectory(public_path('user-uploads/' . $folder), 0775, true); | |||
} | |||
$newPath = $folder . '/' . $newName; | |||
/** @var UploadedFile $uploadedFile */ | |||
$uploadedFile->storeAs('temp', $newName); | |||
if (!empty($crop)) { | |||
// Crop image | |||
if (isset($crop[0])) { | |||
// To store the multiple images for the copped ones | |||
foreach ($crop as $cropped) { | |||
$image = Image::make($tempPath); | |||
if (isset($cropped['resize']['width']) && isset($cropped['resize']['height'])) { | |||
$image->crop(floor($cropped['width']), floor($cropped['height']), floor($cropped['x']), floor($cropped['y'])); | |||
$fileName = str_replace('.', '_' . $cropped['resize']['width'] . 'x' . $cropped['resize']['height'] . '.', $newName); | |||
$tempPathCropped = public_path('user-uploads/temp') . '/' . $fileName; | |||
$newPathCropped = $folder . '/' . $fileName; | |||
// Resize in Proper format | |||
$image->resize($cropped['resize']['width'], $cropped['resize']['height'], function ($constraint) { | |||
//$constraint->aspectRatio(); | |||
// $constraint->upsize(); | |||
}); | |||
$image->save($tempPathCropped); | |||
\Storage::put($newPathCropped, \File::get($tempPathCropped), ['public']); | |||
// Deleting cropped temp file | |||
\File::delete($tempPathCropped); | |||
} | |||
} | |||
} else { | |||
$image = Image::make($tempPath); | |||
$image->crop(floor($crop['width']), floor($crop['height']), floor($crop['x']), floor($crop['y'])); | |||
$image->save(); | |||
} | |||
} | |||
// Do not compress if the gif is uploaded | |||
if (($width || $height) && \File::extension($uploadedFile->getClientOriginalName()) !=='gif') { | |||
// Crop image | |||
$image = Image::make($tempPath); | |||
$image->resize($width, $height, function ($constraint) { | |||
$constraint->aspectRatio(); | |||
$constraint->upsize(); | |||
}); | |||
$image->save(); | |||
} | |||
\Storage::put($newPath, \File::get($tempPath), ['public']); | |||
// Deleting temp file | |||
\File::delete($tempPath); | |||
return $newName; | |||
} | |||
public static function generateNewFileName($currentFileName) | |||
{ | |||
$ext = strtolower(\File::extension($currentFileName)); | |||
$newName = md5(microtime()); | |||
if ($ext === '') { | |||
return $newName; | |||
} | |||
return $newName . '.' . $ext; | |||
} | |||
public static function uploadLocalOrS3($uploadedFile, $dir) | |||
{ | |||
if (!$uploadedFile->isValid()) { | |||
throw new \Exception('File was not uploaded correctly'); | |||
} | |||
if(config('filesystems.default') === 'local'){ | |||
$fileName = self::upload($uploadedFile,$dir,false,false,false); | |||
self::storeSize($uploadedFile,$dir,$fileName); | |||
return $fileName; | |||
} | |||
$newName = self::generateNewFileName($uploadedFile->getClientOriginalName()); | |||
self::storeSize($uploadedFile,$dir,$newName); | |||
// We have given 2 options of upload for now s3 and local | |||
#Storage::disk('s3')->putFileAs($dir, $uploadedFile, $newName, 'public'); | |||
Storage::disk('s3')->putFileAs($dir, $uploadedFile, $newName); | |||
return $newName; | |||
} | |||
private static function storeSize($uploadedFile,$dir,$fileName){ | |||
FileStorage::create( | |||
[ | |||
'name' => $fileName, | |||
'path' => $dir, | |||
'type' => $uploadedFile->getMimeType(), | |||
'size' => $uploadedFile->getSize(), | |||
] | |||
); | |||
} | |||
public static function deleteFile($image, $folder) | |||
{ | |||
$dir = trim($folder, '/'); | |||
$path = $dir . '/' . $image; | |||
if (!\File::exists(public_path($path))) { | |||
\Storage::delete($path); | |||
} | |||
try { | |||
session()->forget('company_setting'); | |||
session()->forget('company'); | |||
FileStorage::where('name', $image)->delete(); | |||
} catch (\Exception $e) { | |||
// | |||
} | |||
return true; | |||
} | |||
public static function deleteDirectory($folder) | |||
{ | |||
$dir = trim($folder); | |||
\Storage::deleteDirectory($dir); | |||
return true; | |||
} | |||
} |
@ -0,0 +1,57 @@ | |||
<?php | |||
namespace App\Http\Controllers; | |||
use Carbon\Carbon; | |||
use Froiden\Envato\Traits\AppBoot; | |||
use Illuminate\Foundation\Bus\DispatchesJobs; | |||
use Illuminate\Routing\Controller as BaseController; | |||
use Illuminate\Foundation\Validation\ValidatesRequests; | |||
use Illuminate\Foundation\Auth\Access\AuthorizesRequests; | |||
use Illuminate\Support\Facades\App; | |||
use Illuminate\Support\Facades\Artisan; | |||
class Controller extends BaseController | |||
{ | |||
use AuthorizesRequests, DispatchesJobs, ValidatesRequests, AppBoot; | |||
public function __construct() | |||
{ | |||
$this->showInstall(); | |||
$this->checkMigrateStatus(); | |||
$this->middleware(function ($request, $next) { | |||
$this->global = global_settings(); | |||
$this->superadmin = global_settings(); | |||
config(['app.name' => $this->global->company_name]); | |||
config(['app.url' => url('/')]); | |||
App::setLocale($this->superadmin->locale); | |||
Carbon::setLocale($this->superadmin->locale); | |||
setlocale(LC_TIME, 'en' . '_' . strtoupper('en')); | |||
$user = auth()->user(); | |||
if ($user && $user->super_admin == 1) { | |||
config(['froiden_envato.allow_users_id' => true]); | |||
} | |||
return $next($request); | |||
}); | |||
} | |||
public function checkMigrateStatus() | |||
{ | |||
$status = Artisan::call('migrate:check'); | |||
if ($status && !request()->ajax()) { | |||
Artisan::call('migrate', array('--force' => true)); //migrate database | |||
Artisan::call('optimize:clear'); | |||
} | |||
} | |||
} |
@ -0,0 +1,59 @@ | |||
<?php | |||
namespace App\Http\Controllers; | |||
use App\Helper\Reply; | |||
use App\Http\Controllers\Admin\AdminBaseController; | |||
use Illuminate\Http\Request; | |||
class NotificationController extends AdminBaseController | |||
{ | |||
public function __construct() | |||
{ | |||
parent::__construct(); | |||
} | |||
public function markAllRead() | |||
{ | |||
$this->user->unreadNotifications->markAsRead(); | |||
return Reply::success(__('messages.notificationRead')); | |||
} | |||
public function showAdminNotifications() | |||
{ | |||
$view = view('notifications.admin_user_notifications', $this->data)->render(); | |||
return Reply::dataOnly(['status' => 'success', 'html' => $view]); | |||
} | |||
public function showUserNotifications() | |||
{ | |||
$view = view('notifications.user_notifications', $this->data)->render(); | |||
return Reply::dataOnly(['status' => 'success', 'html' => $view]); | |||
} | |||
public function showClientNotifications() | |||
{ | |||
$view = view('notifications.client_notifications', $this->data)->render(); | |||
return Reply::dataOnly(['status' => 'success', 'html' => $view]); | |||
} | |||
public function showAllMemberNotifications() | |||
{ | |||
return view('notifications.member.all_notifications', $this->data); | |||
} | |||
public function showAllClientNotifications() | |||
{ | |||
return view('notifications.client.all_notifications', $this->data); | |||
} | |||
public function showAllAdminNotifications() | |||
{ | |||
return view('notifications.admin.all_notifications', $this->data); | |||
} | |||
public function showAllSuperAdminNotifications() | |||
{ | |||
return view('notifications.superadmin.all_notifications', $this->data); | |||
} | |||
} |
@ -0,0 +1,82 @@ | |||
<?php | |||
namespace App\Http\Controllers\SuperAdmin; | |||
use App\GlobalSetting; | |||
use App\LanguageSetting; | |||
use App\OfflinePlanChange; | |||
use App\Traits\FileSystemSettingTrait; | |||
use App\Http\Controllers\Controller; | |||
use Illuminate\Support\Facades\App; | |||
use Carbon\Carbon; | |||
use App\PushNotificationSetting; | |||
class SuperAdminBaseController extends Controller | |||
{ | |||
use FileSystemSettingTrait; | |||
/** | |||
* @var array | |||
*/ | |||
public $data = []; | |||
/** | |||
* @param $name | |||
* @param $value | |||
*/ | |||
public function __set($name, $value) | |||
{ | |||
$this->data[$name] = $value; | |||
} | |||
/** | |||
* @param $name | |||
* @return mixed | |||
*/ | |||
public function __get($name) | |||
{ | |||
return $this->data[$name]; | |||
} | |||
/** | |||
* @param $name | |||
* @return bool | |||
*/ | |||
public function __isset($name) | |||
{ | |||
return isset($this->data[ $name ]); | |||
} | |||
/** | |||
* UserBaseController constructor. | |||
*/ | |||
public function __construct() | |||
{ | |||
$this->global = global_settings(); | |||
$this->superadmin = $this->global; | |||
App::setLocale($this->global->locale); | |||
Carbon::setLocale($this->global->locale); | |||
setlocale(LC_TIME, $this->global->locale . '_' . strtoupper($this->global->locale)); | |||
$this->adminTheme = superadmin_theme(); | |||
$this->languageSettings = LanguageSetting::where('status', 'enabled')->get(); | |||
$this->pushSetting = PushNotificationSetting::first(); | |||
// Done for the purpose of updating. When updating this code runs before migration | |||
try{ | |||
$this->offlineRequestCount = OfflinePlanChange::where('status', 'pending')->count(); | |||
}catch (\Exception $e){ | |||
$this->offlineRequestCount = 0; | |||
} | |||
$this->worksuitePlugins = worksuite_plugins(); | |||
$this->middleware(function ($request, $next) { | |||
$this->user = user(); | |||
$this->unreadNotificationCount = count($this->user->unreadNotifications); | |||
return $next($request); | |||
}); | |||
} | |||
} |
@ -0,0 +1,402 @@ | |||
<?php | |||
namespace App\Http\Controllers\SuperAdmin; | |||
use App\Company; | |||
use App\Currency; | |||
use App\EmployeeDetails; | |||
use App\GlobalCurrency; | |||
use App\Helper\Files; | |||
use App\Helper\Reply; | |||
use App\Http\Requests\SuperAdmin\Companies\DeleteRequest; | |||
use App\Http\Requests\SuperAdmin\Companies\PackageUpdateRequest; | |||
use App\Http\Requests\SuperAdmin\Companies\StoreRequest; | |||
use App\Http\Requests\SuperAdmin\Companies\UpdateRequest; | |||
use App\LanguageSetting; | |||
use App\OfflineInvoice; | |||
use App\OfflinePaymentMethod; | |||
use App\Package; | |||
use App\Role; | |||
use App\Scopes\CompanyScope; | |||
use App\StripeInvoice; | |||
use App\Traits\CurrencyExchange; | |||
use App\User; | |||
use Carbon\Carbon; | |||
use Illuminate\Http\Request; | |||
use Illuminate\Support\Facades\DB; | |||
use Yajra\DataTables\Facades\DataTables; | |||
class SuperAdminCompanyController extends SuperAdminBaseController | |||
{ | |||
use CurrencyExchange; | |||
/** | |||
* AdminProductController constructor. | |||
*/ | |||
public function __construct() | |||
{ | |||
parent::__construct(); | |||
$this->pageTitle = 'Companies'; | |||
$this->pageIcon = 'icon-layers'; | |||
$this->colClass = '6'; | |||
if (module_enabled('Subdomain')) { | |||
$this->colClass = '4'; | |||
} | |||
} | |||
/** | |||
* Display a listing of the resource. | |||
* | |||
* @return \Illuminate\Http\Response | |||
*/ | |||
public function index() | |||
{ | |||
$this->totalCompanies = Company::count(); | |||
$this->packages = Package::all(); | |||
return view('super-admin.companies.index', $this->data); | |||
} | |||
/** | |||
* Show the form for creating a new resource. | |||
* | |||
* @return \Illuminate\Http\Response | |||
*/ | |||
public function create() | |||
{ | |||
$this->timezones = \DateTimeZone::listIdentifiers(\DateTimeZone::ALL); | |||
$this->currencies = GlobalCurrency::all(); | |||
return view('super-admin.companies.create', $this->data); | |||
} | |||
/** | |||
* Store a newly created resource in storage. | |||
* @param StoreRequest $request | |||
* @return array | |||
*/ | |||
public function store(StoreRequest $request) | |||
{ | |||
DB::beginTransaction(); | |||
$company = new Company(); | |||
$companyDetail = $this->storeAndUpdate($company, $request); | |||
$globalCurrency = GlobalCurrency::findOrFail($request->currency_id); | |||
$currency = Currency::where('currency_code', $globalCurrency->currency_code) | |||
->where('company_id', $companyDetail->id)->first(); | |||
if (is_null($currency)) { | |||
$currency = new Currency(); | |||
$currency->currency_name = $globalCurrency->currency_name; | |||
$currency->currency_symbol = $globalCurrency->currency_symbol; | |||
$currency->currency_code = $globalCurrency->currency_code; | |||
$currency->is_cryptocurrency = $globalCurrency->is_cryptocurrency; | |||
$currency->usd_price = $globalCurrency->usd_price; | |||
$currency->company_id = $companyDetail->id; | |||
$currency->save(); | |||
} | |||
$company->currency_id = $currency->id; | |||
$company->save(); | |||
$user = $company->addUser($company, $request); | |||
$company->addEmployeeDetails($user); | |||
$adminRole = Role::where('name', 'admin')->where('company_id', $companyDetail->id)->withoutGlobalScope('active')->first(); | |||
$user->roles()->attach($adminRole->id); | |||
$employeeRole = Role::where('name', 'employee')->where('company_id', $user->company_id)->first(); | |||
$user->roles()->attach($employeeRole->id); | |||
DB::commit(); | |||
return Reply::redirect(route('super-admin.companies.index'), 'Company added successfully.'); | |||
} | |||
/** | |||
* Display the specified resource. | |||
* | |||
* @param int $id | |||
*/ | |||
public function show($id) | |||
{ | |||
// | |||
} | |||
/** | |||
* @param $companyId | |||
* @return \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response | |||
* @throws \Throwable | |||
*/ | |||
public function editPackage($companyId) | |||
{ | |||
$packages = Package::all(); | |||
$global = $this->global; | |||
$company = Company::find($companyId); | |||
$currentPackage = Package::find($company->package_id); | |||
$lastInvoice = StripeInvoice::where('company_id', $companyId)->orderBy('created_at', 'desc')->first(); | |||
$packageInfo = []; | |||
foreach ($packages as $package) { | |||
$packageInfo[$package->id] = [ | |||
'monthly' => $package->monthly_price, | |||
'annual' => $package->annual_price | |||
]; | |||
} | |||
$offlinePaymentMethod = OfflinePaymentMethod::whereNull('company_id')->get(); | |||
$modal = view('super-admin.companies.editPackage', compact('packages', 'company', 'currentPackage', 'lastInvoice', 'packageInfo', 'global', 'offlinePaymentMethod'))->render(); | |||
return response(['status' => 'success', 'data' => $modal], 200); | |||
} | |||
public function updatePackage(PackageUpdateRequest $request, $companyId) | |||
{ | |||
$company = Company::find($companyId); | |||
try { | |||
$package = Package::find($request->package); | |||
$company->package_id = $package->id; | |||
$company->package_type = $request->packageType; | |||
$company->status = 'active'; | |||
$payDate = $request->pay_date ? Carbon::parse($request->pay_date) : Carbon::now(); | |||
$company->licence_expire_on = ($company->package_type == 'monthly') ? | |||
$payDate->copy()->addMonth()->format('Y-m-d') : | |||
$payDate->copy()->addYear()->format('Y-m-d'); | |||
$nextPayDate = $request->next_pay_date ? Carbon::parse($request->next_pay_date) : $company->licence_expire_on; | |||
if ($company->isDirty('package_id') || $company->isDirty('package_type')) { | |||
$offlineInvoice = new OfflineInvoice(); | |||
} else { | |||
$offlineInvoice = OfflineInvoice::where('company_id', $companyId)->orderBy('created_at', 'desc')->first(); | |||
if (!$offlineInvoice) { | |||
$offlineInvoice = new OfflineInvoice(); | |||
} | |||
} | |||
$offlineInvoice->company_id = $company->id; | |||
$offlineInvoice->package_id = $company->package_id; | |||
$offlineInvoice->package_type = $request->packageType; | |||
$offlineInvoice->amount = $request->amount ?: $package->{$request->packageType . '_price'}; | |||
$offlineInvoice->pay_date = $payDate; | |||
$offlineInvoice->next_pay_date = $nextPayDate; | |||
$offlineInvoice->status = 'paid'; | |||
$offlineInvoice->save(); | |||
$company->save(); | |||
return response(['status' => 'success', 'message' => 'Package Updated Successfully.'], 200); | |||
} catch (\Exception $e) { | |||
return $e; | |||
} | |||
} | |||
/** | |||
* Show the form for editing the specified resource. | |||
* | |||
* @param int $id | |||
* @return \Illuminate\Http\Response | |||
*/ | |||
public function edit($id) | |||
{ | |||
$this->company = Company::find($id); | |||
$this->timezones = \DateTimeZone::listIdentifiers(\DateTimeZone::ALL); | |||
$this->currencies = Currency::where('company_id', $id)->get(); | |||
$this->packages = Package::all(); | |||
$this->companyUser = User::where('company_id', $id)->withoutGlobalScope('active')->first(); | |||
return view('super-admin.companies.edit', $this->data); | |||
} | |||
public function defaultLanguage() | |||
{ | |||
$this->languages = LanguageSetting::where('status', 'enabled')->get(); | |||
return view('super-admin.companies.default-language', $this->data); | |||
} | |||
/** | |||
* @param Request $request | |||
* @return array | |||
*/ | |||
public function defaultLanguageUpdate(Request $request) | |||
{ | |||
$this->global->new_company_locale = $request->default_language; | |||
$this->global->save(); | |||
return Reply::success(__('messages.defaultCompanyLanguage')); | |||
} | |||
/** | |||
* Update the specified resource in storage. | |||
* | |||
* @param UpdateRequest $request | |||
* @param int $id | |||
* @return array | |||
*/ | |||
public function update(UpdateRequest $request, $id) | |||
{ | |||
$company = Company::find($id); | |||
$this->storeAndUpdate($company, $request); | |||
$company->currency_id = $request->currency_id; | |||
$company->save(); | |||
$user = User::where('company_id', $id)->withoutGlobalScope('active')->first(); | |||
$user->email = $request->email; | |||
if (!is_null($request->password)) { | |||
$user->password = bcrypt($request->password); | |||
} | |||
$user->save(); | |||
return Reply::redirect(route('super-admin.companies.index'), __('messages.updateSuccess')); | |||
} | |||
/** | |||
* Remove the specified resource from storage. | |||
* | |||
* @param DeleteRequest $request | |||
* @param int $id | |||
* @return array | |||
*/ | |||
public function destroy(DeleteRequest $request, $id) | |||
{ | |||
Company::destroy($id); | |||
return Reply::success(__('messages.deleteSuccess')); | |||
} | |||
/** | |||
* @param Request $request | |||
* @return mixed | |||
* @throws \Exception | |||
*/ | |||
public function data(Request $request) | |||
{ | |||
$packages = Company::with('currency', 'package'); | |||
if ($request->package != 'all' && $request->package != '') { | |||
$packages = $packages->where('package_id', $request->package); | |||
} | |||
if ($request->type != 'all' && $request->type != '') { | |||
$packages = $packages->where('package_type', $request->type); | |||
} | |||
return Datatables::of($packages) | |||
->addColumn('action', function ($row) { | |||
$companyUser = User::withoutGlobalScope(CompanyScope::class)->withoutGlobalScope('active')->where('company_id', $row->id)->first(); | |||
$list = '<p><a href="' . route('super-admin.companies.edit', [$row->id]) . '" class="btn btn-info btn-circle" | |||
data-toggle="tooltip" data-original-title="Edit"><i class="fa fa-pencil" aria-hidden="true"></i></a></p>'; | |||
if ($companyUser && $companyUser->email_verification_code != null) { | |||
$list .= '<p><a href="javascript:;" class="btn btn-success btn-circle verify-user" | |||
data-toggle="tooltip" data-user-id="' . $companyUser->id . '" data-original-title="' . __('modules.company.verifyNow') . '"><i class="fa fa-check" aria-hidden="true"></i></a></p>'; | |||
} else if (module_enabled('Subdomain')) { | |||
$list .= '<p><a href="javascript:;" class="btn btn-success btn-circle domain-params" | |||
data-toggle="tooltip" data-company-id="' . $row->id . '" data-company-url="' . request()->getScheme() . '://' . $row->sub_domain . '" data-original-title="Domain Notify to company admins"><i class="fa fa-bell" aria-hidden="true"></i></a></p>'; | |||
} | |||
$list .= '<p><a href="javascript:;" class="btn btn-danger btn-circle sa-params" | |||
data-toggle="tooltip" data-user-id="' . $row->id . '" data-original-title="Delete"><i class="fa fa-times" aria-hidden="true"></i></a></p>'; | |||
return $list; | |||
}) | |||
->editColumn('company_name', function ($row) { | |||
return ucfirst($row->company_name) . '<br />' . '<img src="' . $row->logo_url . '" class="img-responsive" style="max-height: 35px" />'; | |||
}) | |||
->editColumn('status', function ($row) { | |||
$class = ($row->status == 'active') ? 'label-custom' : 'label-danger'; | |||
return '<span class="label ' . $class . '">' . ucfirst($row->status) . '</span>'; | |||
}) | |||
->editColumn('company_email', function ($row) { | |||
return '<a href="mailto:' . $row->company_email . '" target="_blank">' . $row->company_email . '</a>'; | |||
}) | |||
->editColumn('sub_domain', function ($row) { | |||
return '<a href="http://' . $row->sub_domain . '" target="_blank">' . $row->sub_domain . '</a>'; | |||
}) | |||
->editColumn('last_login', function ($row) { | |||
if ($row->last_login != null) { | |||
return $row->last_login->diffForHumans(); | |||
} | |||
return '-'; | |||
}) | |||
->editColumn('package', function ($row) { | |||
$package = '<div class="w-100 text-center">'; | |||
$package .= '<div class="m-b-5">' . ucwords($row->package->name) . ' (' . ucfirst($row->package_type) . ')' . '</div>'; | |||
$package .= '<a href="javascript:;" class="label label-custom package-update-button" | |||
data-toggle="tooltip" data-company-id="' . $row->id . '" data-original-title="Change"><i class="fa fa-edit" aria-hidden="true"></i> Change </a>'; | |||
$package .= '</div>'; | |||
return $package; | |||
}) | |||
->addColumn('details', function ($row) { | |||
$companyUser = User::withoutGlobalScope(CompanyScope::class)->withoutGlobalScope('active')->where('company_id', $row->id)->first(); | |||
if ($companyUser && $companyUser->email_verification_code == null) { | |||
$verified = '<i class="fa fa-check-circle" style="color: green;"></i>'; | |||
} else if ($companyUser && $companyUser->email_verification_code != null) { | |||
$verified = '<i class="fa fa-times" style="color: red;"></i>'; | |||
} else { | |||
$verified = '-'; | |||
} | |||
$registerDate = $row->created_at->format('d-m-Y'); | |||
$totalUsers = User::withoutGlobalScope(CompanyScope::class)->withoutGlobalScope('active')->where('company_id', $row->id)->count(); | |||
$string = "<ul class='p-l-20'>"; | |||
$string .= "<li>" . __('modules.superadmin.verified') . ": " . $verified . "</li>"; | |||
$string .= "<li>" . __('modules.superadmin.registerDate') . ": " . $registerDate . "</li>"; | |||
$string .= "<li>" . __('modules.superadmin.totalUsers') . ": " . $totalUsers . "</li>"; | |||
$string .= "</ul>"; | |||
return $string; | |||
}) | |||
->rawColumns(['action', 'details', 'company_email', 'company_name', 'status', 'package', 'sub_domain']) | |||
->make(true); | |||
} | |||
public function storeAndUpdate($company, $request) | |||
{ | |||
$company->company_name = $request->input('company_name'); | |||
$company->company_email = $request->input('company_email'); | |||
$company->company_phone = $request->input('company_phone'); | |||
$company->website = $request->input('website'); | |||
$company->address = $request->input('address'); | |||
$company->timezone = $request->input('timezone'); | |||
$company->locale = $request->input('locale'); | |||
$company->status = $request->status; | |||
if ($request->hasFile('logo')) { | |||
$company->logo = Files::upload($request->logo, 'app-logo'); | |||
} | |||
$company->last_updated_by = $this->user->id; | |||
if (module_enabled('Subdomain')) { | |||
$company->sub_domain = $request->sub_domain; | |||
} | |||
$company->save(); | |||
try { | |||
$this->updateExchangeRatesCompanyWise($company); | |||
} catch (\Exception $e) { | |||
} | |||
return $company; | |||
} | |||
public function verifyUser() | |||
{ | |||
$userId = request('user_id'); | |||
$user = User::withoutGlobalScope(CompanyScope::class)->withoutGlobalScope('active')->find($userId); | |||
User::emailVerify($user->email_verification_code); | |||
return Reply::success(__('messages.updateSuccess')); | |||
} | |||
} |
@ -0,0 +1,36 @@ | |||
<?php | |||
namespace App\Http\Middleware; | |||
use App\GlobalSetting; | |||
use Closure; | |||
use Illuminate\Support\Facades\Auth; | |||
use Illuminate\Support\Facades\Redirect; | |||
use Illuminate\Support\Facades\Storage; | |||
class SuperAdmin | |||
{ | |||
/** | |||
* Handle an incoming request. | |||
* | |||
* @param \Illuminate\Http\Request $request | |||
* @param \Closure $next | |||
* @return mixed | |||
*/ | |||
public function handle($request, Closure $next) | |||
{ | |||
$user = auth()->user(); | |||
$exists = Storage::disk('storage')->exists('down'); | |||
$setting = GlobalSetting::first(); | |||
if($exists && is_null($setting->purchase_code) && (strpos(request()->getHost(), '.test') === false) ){ | |||
return Redirect::route('verify-purchase'); | |||
} | |||
if (!Auth::check() || $user->super_admin == '0'){ | |||
return Redirect::route('login'); | |||
} | |||
return $next($request); | |||
} | |||
} |
@ -0,0 +1,21 @@ | |||
<?php | |||
namespace App\Http\Requests\SuperAdmin\Companies; | |||
use App\Http\Requests\SuperAdmin\SuperAdminBaseRequest; | |||
class DeleteRequest extends SuperAdminBaseRequest | |||
{ | |||
/** | |||
* Get the validation rules that apply to the request. | |||
* | |||
* @return array | |||
*/ | |||
public function rules() | |||
{ | |||
return [ | |||
// | |||
]; | |||
} | |||
} |
@ -0,0 +1,75 @@ | |||
<?php | |||
namespace App\Http\Requests\SuperAdmin\Companies; | |||
use App\Http\Requests\SuperAdmin\SuperAdminBaseRequest; | |||
use App\Scopes\CompanyScope; | |||
use App\User; | |||
use Illuminate\Validation\Rule; | |||
use Illuminate\Validation\Validator; | |||
class StoreRequest extends SuperAdminBaseRequest | |||
{ | |||
/** | |||
* Get the validation rules that apply to the request. | |||
* | |||
* @return array | |||
*/ | |||
public function rules() | |||
{ | |||
\Illuminate\Support\Facades\Validator::extend('check_client', function($attribute, $value, $parameters, $validator) { | |||
$user = User::withoutGlobalScopes(['active', CompanyScope::class]) | |||
->join('client_details', 'client_details.user_id', 'users.id') | |||
->where('users.email', $value) | |||
->first(); | |||
$userTable = User::withoutGlobalScopes(['active', CompanyScope::class]) | |||
->where('users.email', $value)->first(); | |||
if(!is_null($user) && (!is_null($userTable) && !$userTable->hasRole('admin'))){ | |||
return true; | |||
} | |||
elseif((!is_null($userTable) && is_null($user) && $userTable->hasRole('admin')) ){ | |||
return false; | |||
} | |||
elseif(is_null($userTable) && is_null($user)){ | |||
return true; | |||
} | |||
return false; | |||
}); | |||
return [ | |||
"company_name" => "required", | |||
"company_email" => "required|email|unique:companies", | |||
'sub_domain' => module_enabled('Subdomain') ?'required|min:4|unique:companies,sub_domain|max:50|sub_domain':'', | |||
"company_phone" => "required", | |||
"address" => "required", | |||
"status" => "required", | |||
'email' => 'required|check_client', | |||
'password' => 'required|min:6' | |||
]; | |||
} | |||
public function prepareForValidation() | |||
{ | |||
if (empty($this->sub_domain)) { | |||
return; | |||
} | |||
// Add servername domain suffix at the end | |||
$subdomain = trim($this->sub_domain, '.') . '.' . get_domain(); | |||
$this->merge(['sub_domain' => $subdomain]); | |||
request()->merge(['sub_domain' => $subdomain]); | |||
} | |||
public function messages() | |||
{ | |||
return [ | |||
'email.check_client' => 'The email has already been taken.' | |||
]; | |||
} | |||
} |
@ -0,0 +1,37 @@ | |||
<?php | |||
namespace App\Http\Requests\SuperAdmin\Companies; | |||
use App\Http\Requests\SuperAdmin\SuperAdminBaseRequest; | |||
class UpdateRequest extends SuperAdminBaseRequest | |||
{ | |||
/** | |||
* Get the validation rules that apply to the request. | |||
* | |||
* @return array | |||
*/ | |||
public function rules() | |||
{ | |||
return [ | |||
'company_name' => 'required', | |||
'company_email' => 'required|email|unique:companies,company_email,'.$this->route('company'), | |||
'sub_domain' => module_enabled('Subdomain')?'required|min:4|max:50|sub_domain|unique:companies,sub_domain,'.$this->route('company'):'', | |||
'company_phone' => 'required', | |||
'address' => 'required', | |||
'status' => 'required' | |||
]; | |||
} | |||
public function prepareForValidation() | |||
{ | |||
if (empty($this->sub_domain)) { | |||
return; | |||
} | |||
// Add servername domain suffix at the end | |||
$subdomain = trim($this->sub_domain, '.') . '.' . get_domain(); | |||
$this->merge(['sub_domain' => $subdomain]); | |||
request()->merge(['sub_domain' => $subdomain]); | |||
} | |||
} |
@ -0,0 +1,18 @@ | |||
<?php | |||
namespace App\Http\Requests\SuperAdmin; | |||
use App\Http\Requests\CoreRequest; | |||
class SuperAdminBaseRequest extends CoreRequest | |||
{ | |||
/** | |||
* Determine if the user is authorized to make this request. | |||
* | |||
* @return bool | |||
*/ | |||
public function authorize() | |||
{ | |||
return !empty(superAdmin()); | |||
} | |||
} |
@ -0,0 +1,37 @@ | |||
<?php | |||
namespace App\Listeners; | |||
use App\Events\CompanyRegistered; | |||
use App\Notifications\NewCompanyRegister; | |||
use App\User; | |||
use Illuminate\Support\Facades\Notification; | |||
class CompanyRegisteredListener | |||
{ | |||
/** | |||
* Create the event listener. | |||
* | |||
* @return void | |||
*/ | |||
public function __construct() | |||
{ | |||
// | |||
} | |||
/** | |||
* Handle the event. | |||
* | |||
* @param CompanyRegistered $event | |||
* @return void | |||
*/ | |||
public function handle(CompanyRegistered $event) | |||
{ | |||
if (!isRunningInConsoleOrSeeding()) { | |||
$company = $event->company; | |||
$generatedBy = User::whereNull('company_id')->get(); | |||
Notification::send($generatedBy, new NewCompanyRegister($company)); | |||
} | |||
} | |||
} |
@ -0,0 +1,96 @@ | |||
<?php | |||
namespace App\Notifications; | |||
use App\Company; | |||
use App\SlackSetting; | |||
use App\Traits\SmtpSettings; | |||
use Illuminate\Bus\Queueable; | |||
use Illuminate\Notifications\Messages\SlackMessage; | |||
use Illuminate\Notifications\Notification; | |||
use Illuminate\Contracts\Queue\ShouldQueue; | |||
use Illuminate\Notifications\Messages\MailMessage; | |||
class NewCompanyRegister extends Notification implements ShouldQueue | |||
{ | |||
use Queueable, SmtpSettings; | |||
/** | |||
* Create a new notification instance. | |||
* | |||
* @return void | |||
*/ | |||
private $company; | |||
public function __construct(Company $company) | |||
{ | |||
$this->company = $company; | |||
$this->setMailConfigs(); | |||
} | |||
/** | |||
* Get the notification's delivery channels. | |||
*t('mail::layout') | |||
* @param mixed $notifiable | |||
* @return array | |||
*/ | |||
public function via($notifiable) | |||
{ | |||
$via = ['database']; | |||
if ($notifiable->email_notifications) { | |||
array_push($via, 'mail'); | |||
} | |||
return $via; | |||
} | |||
/** | |||
* Get the mail representation of the notification. | |||
* | |||
* @param mixed $notifiable | |||
* @return \Illuminate\Notifications\Messages\MailMessage | |||
*/ | |||
public function toMail($notifiable) | |||
{ | |||
return (new MailMessage) | |||
->subject(__('email.newCompany.subject').' '.config('app.name').'!') | |||
->greeting(__('email.hello').' '.ucwords($notifiable->name).'!') | |||
->line(__('email.newCompany.text')) | |||
->line('With name:- '.$this->company->company_name) | |||
->action(__('email.loginDashboard'), getDomainSpecificUrl(url('/login'))) | |||
->line(__('email.thankyouNote')); | |||
} | |||
/** | |||
* Get the array representation of the notification. | |||
* | |||
* @param mixed $notifiable | |||
* @return array | |||
*/ | |||
public function toArray($notifiable) | |||
{ | |||
return array_merge($notifiable->toArray(), ['company_name' => $this->company->company_name]); | |||
} | |||
/** | |||
* Get the Slack representation of the notification. | |||
* | |||
* @param mixed $notifiable | |||
* @return SlackMessage | |||
*/ | |||
public function toSlack($notifiable) | |||
{ | |||
$slack = SlackSetting::first(); | |||
if(count($notifiable->employee) > 0 && !is_null($notifiable->employee[0]->slack_username)){ | |||
return (new SlackMessage()) | |||
->from(config('app.name')) | |||
->image($slack->slack_logo_url) | |||
->to('@' . $notifiable->employee[0]->slack_username) | |||
->content('Welcome to ' . config('app.name') . '! New company has been registered.'); | |||
} | |||
return (new SlackMessage()) | |||
->from(config('app.name')) | |||
->image($slack->slack_logo_url) | |||
->content('This is a redirected notification. Add slack username for *'.ucwords($notifiable->name).'*'); | |||
} | |||
} |
@ -0,0 +1,35 @@ | |||
<?php | |||
namespace App\Scopes; | |||
use App\ClientDetails; | |||
use Illuminate\Database\Eloquent\Builder; | |||
use Illuminate\Database\Eloquent\Model; | |||
use Illuminate\Database\Eloquent\Scope; | |||
use Illuminate\Support\Facades\Schema; | |||
class CompanyScope implements Scope | |||
{ | |||
public function apply(Builder $builder, Model $model) | |||
{ | |||
// When user is logged in | |||
// auth()->user() do not work in apply so we have use auth()->hasUser() | |||
if ((session()->has('client_company') && $model->getTable() != "users") || !session()->has('client_company') ) { | |||
if (auth()->hasUser() && Schema::hasColumn($model->getTable(), 'company_id')) { | |||
$company = company(); | |||
if ($company) { | |||
$builder->where($model->getTable() . '.company_id', '=', $company->id); | |||
} | |||
} | |||
if (session()->has('company') && Schema::hasColumn($model->getTable(), 'company_id')) { | |||
$company = company(); | |||
if ($company) { | |||
$builder->where($model->getTable() . '.company_id', '=', $company->id); | |||
} | |||
} | |||
} | |||
} | |||
} |