initial commit
This commit is contained in:
commit
501a8e18e0
103
app/BaseModel.php
Normal file
103
app/BaseModel.php
Normal file
@ -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];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
212
app/Company.php
Normal file
212
app/Company.php
Normal file
@ -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);
|
||||
}
|
||||
}
|
10
app/CompanySetting.php
Normal file
10
app/CompanySetting.php
Normal file
@ -0,0 +1,10 @@
|
||||
<?php
|
||||
|
||||
namespace App;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class CompanySetting extends BaseModel
|
||||
{
|
||||
protected $table = 'organisation_settings';
|
||||
}
|
33
app/Events/CompanyRegistered.php
Normal file
33
app/Events/CompanyRegistered.php
Normal file
@ -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');
|
||||
}
|
||||
}
|
72
app/Exceptions/Handler.php
Normal file
72
app/Exceptions/Handler.php
Normal file
@ -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'));
|
||||
}
|
||||
}
|
184
app/Helper/Files.php
Normal file
184
app/Helper/Files.php
Normal file
@ -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;
|
||||
}
|
||||
|
||||
}
|
57
app/Http/Controllers/Controller.php
Normal file
57
app/Http/Controllers/Controller.php
Normal file
@ -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');
|
||||
}
|
||||
}
|
||||
}
|
59
app/Http/Controllers/NotificationController.php
Normal file
59
app/Http/Controllers/NotificationController.php
Normal file
@ -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);
|
||||
}
|
||||
}
|
82
app/Http/Controllers/SuperAdmin/SuperAdminBaseController.php
Normal file
82
app/Http/Controllers/SuperAdmin/SuperAdminBaseController.php
Normal file
@ -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);
|
||||
});
|
||||
}
|
||||
}
|
402
app/Http/Controllers/SuperAdmin/SuperAdminCompanyController.php
Normal file
402
app/Http/Controllers/SuperAdmin/SuperAdminCompanyController.php
Normal file
@ -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'));
|
||||
}
|
||||
}
|
36
app/Http/Middleware/SuperAdmin.php
Normal file
36
app/Http/Middleware/SuperAdmin.php
Normal file
@ -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);
|
||||
}
|
||||
}
|
21
app/Http/Requests/SuperAdmin/Companies/DeleteRequest.php
Normal file
21
app/Http/Requests/SuperAdmin/Companies/DeleteRequest.php
Normal file
@ -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 [
|
||||
//
|
||||
];
|
||||
}
|
||||
|
||||
}
|
75
app/Http/Requests/SuperAdmin/Companies/StoreRequest.php
Normal file
75
app/Http/Requests/SuperAdmin/Companies/StoreRequest.php
Normal file
@ -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.'
|
||||
];
|
||||
}
|
||||
}
|
37
app/Http/Requests/SuperAdmin/Companies/UpdateRequest.php
Normal file
37
app/Http/Requests/SuperAdmin/Companies/UpdateRequest.php
Normal file
@ -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]);
|
||||
}
|
||||
}
|
18
app/Http/Requests/SuperAdmin/SuperAdminBaseRequest.php
Normal file
18
app/Http/Requests/SuperAdmin/SuperAdminBaseRequest.php
Normal file
@ -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());
|
||||
}
|
||||
}
|
37
app/Listeners/CompanyRegisteredListener.php
Normal file
37
app/Listeners/CompanyRegisteredListener.php
Normal file
@ -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));
|
||||
}
|
||||
}
|
||||
}
|
96
app/Notifications/NewCompanyRegister.php
Normal file
96
app/Notifications/NewCompanyRegister.php
Normal file
@ -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).'*');
|
||||
}
|
||||
|
||||
}
|
1046
app/Observers/CompanyObserver.php
Normal file
1046
app/Observers/CompanyObserver.php
Normal file
File diff suppressed because it is too large
Load Diff
35
app/Scopes/CompanyScope.php
Normal file
35
app/Scopes/CompanyScope.php
Normal file
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user