Skip to content

Commit cffcbc5

Browse files
committed
Merge branch 'develop'
# Conflicts: # src/Http/Middleware/HasCrmAccess.php
2 parents 8d3c978 + 3f79f47 commit cffcbc5

File tree

14 files changed

+514
-4
lines changed

14 files changed

+514
-4
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
2121
### Fixed
2222
### Removed --->
2323

24+
## 0.6.7 - 2021-09-11
25+
### Added
26+
- Roles & Permissions team support
27+
2428
## 0.6.6 - 2021-09-03
2529
### Changed
2630
- Default field level encryption security setting to false

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ This package will add CRM functionality to your laravel projects
2929
- Secure registration & login
3030
- Reset forgotten password
3131
- Laravel Jetstream/Spark teams support
32+
- Team level roles & permissions
3233

3334
## Installation (10-15mins)
3435

config/laravel-crm.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,15 @@
3535
|
3636
| For Spark see https://spark-classic.laravel.com/docs/11.0/teams
3737
|
38+
| IMPORTANT! This package uses the Spatie Permissions package to manage
39+
| user roles and permissions, which by default are system wide. Howwever
40+
| there is support added for roles & permissions at team level. To enable
41+
| you will need to adjust the settings in app/config/permission.php to
42+
| the following:
43+
|
44+
| 'permission' => VentureDrake\LaravelCrm\Models\Permission::class
45+
| 'role' => VentureDrake\LaravelCrm\Models\Role::class,
46+
|
3847
*/
3948

4049
'teams' => env('LARAVEL_CRM_TEAMS', false),

config/package.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,6 @@
1313
|
1414
*/
1515

16-
'version' => '0.6.6',
16+
'version' => '0.6.7',
1717

1818
];
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
<?php
2+
3+
use Illuminate\Database\Migrations\Migration;
4+
use Illuminate\Database\Schema\Blueprint;
5+
use Illuminate\Support\Facades\Schema;
6+
7+
class AddTeamIdToRolesPermissionsTables extends Migration
8+
{
9+
/**
10+
* Run the migrations.
11+
*
12+
* @return void
13+
*/
14+
public function up()
15+
{
16+
if (! Schema::hasColumn('roles', 'team_id'))
17+
{
18+
Schema::table('roles', function (Blueprint $table) {
19+
$table->unsignedBigInteger('team_id')->index()->nullable();
20+
$table->boolean('global')->default(false);
21+
$table->dropUnique(['name', 'guard_name']);
22+
$table->unique(['name', 'guard_name','team_id']);
23+
});
24+
}
25+
26+
if (! Schema::hasColumn('permissions', 'team_id'))
27+
{
28+
Schema::table('permissions', function (Blueprint $table) {
29+
$table->unsignedBigInteger('team_id')->index()->nullable();
30+
$table->boolean('global')->default(false);
31+
$table->dropUnique(['name', 'guard_name']);
32+
$table->unique(['name', 'guard_name','team_id']);
33+
});
34+
}
35+
}
36+
37+
/**
38+
* Reverse the migrations.
39+
*
40+
* @return void
41+
*/
42+
public function down()
43+
{
44+
Schema::table('roles', function (Blueprint $table) {
45+
$table->dropColumn(['team_id','global']);
46+
$table->dropUnique(['name', 'guard_name', 'team_id']);
47+
$table->unique(['name', 'guard_name']);
48+
});
49+
50+
Schema::table('permissions', function (Blueprint $table) {
51+
$table->dropUnique(['name', 'guard_name', 'team_id']);
52+
$table->dropColumn(['team_id','global']);
53+
$table->unique(['name', 'guard_name']);
54+
});
55+
}
56+
}
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
<?php
2+
3+
namespace VentureDrake\LaravelCrm\Console;
4+
5+
use Carbon\Carbon;
6+
use DB;
7+
use Illuminate\Console\Command;
8+
use Illuminate\Support\Composer;
9+
10+
class LaravelCrmPermissions extends Command
11+
{
12+
/**
13+
* The name and signature of the console command.
14+
*
15+
* @var string
16+
*/
17+
protected $signature = 'laravelcrm:permissions';
18+
19+
/**
20+
* The console command description.
21+
*
22+
* @var string
23+
*/
24+
protected $description = 'Install Laravel CRM package';
25+
26+
/**
27+
* The Composer instance.
28+
*
29+
* @var \Illuminate\Foundation\Composer
30+
*/
31+
protected $composer;
32+
33+
/**
34+
* Create a new command instance.
35+
*
36+
* @return void
37+
*/
38+
public function __construct(Composer $composer)
39+
{
40+
parent::__construct();
41+
$this->composer = $composer;
42+
}
43+
44+
/**
45+
* Execute the console command.
46+
*
47+
* @return mixed
48+
*/
49+
public function handle()
50+
{
51+
$this->info('Updating LaravelCRM Permissions...');
52+
53+
$this->comment('Clearing permissions cache');
54+
55+
app()[\Spatie\Permission\PermissionRegistrar::class]->forgetCachedPermissions();
56+
57+
foreach (DB::table('teams')->get() as $team) {
58+
foreach (DB::table('roles')
59+
->whereNull('team_id')
60+
->get() as $role) {
61+
$this->info('Inserting role '.$role->name.' for team '.$team->name);
62+
63+
DB::table('roles')->updateOrInsert([
64+
'name' => $role->name,
65+
'guard_name' => $role->guard_name,
66+
'description' => $role->description,
67+
'crm_role' => $role->crm_role,
68+
'team_id' => $team->id,
69+
], [
70+
'created_at' => Carbon::now(),
71+
'updated_at' => Carbon::now(),
72+
]);
73+
74+
if ($newRole = DB::table('roles')->where([
75+
'name' => $role->name,
76+
'guard_name' => $role->guard_name,
77+
'description' => $role->description,
78+
'crm_role' => $role->crm_role,
79+
'team_id' => $team->id,
80+
])->first()) {
81+
foreach (DB::table('permissions')
82+
->leftJoin('role_has_permissions', 'permissions.id', '=', 'role_has_permissions.permission_id')
83+
->where('role_has_permissions.role_id', $role->id)
84+
->get() as $permission) {
85+
$this->info('Inserting permission '.$permission->name.' for role '.$role->name);
86+
87+
DB::table('permissions')->updateOrInsert([
88+
'name' => $permission->name,
89+
'guard_name' => $permission->guard_name,
90+
'description' => $permission->description,
91+
'crm_permission' => $permission->crm_permission,
92+
'team_id' => $team->id,
93+
], [
94+
'created_at' => Carbon::now(),
95+
'updated_at' => Carbon::now(),
96+
]);
97+
98+
if ($newPermission = DB::table('permissions')->where([
99+
'name' => $permission->name,
100+
'guard_name' => $permission->guard_name,
101+
'description' => $permission->description,
102+
'crm_permission' => $permission->crm_permission,
103+
'team_id' => $team->id,
104+
])->first()) {
105+
DB::table('role_has_permissions')->updateOrInsert([
106+
'permission_id' => $newPermission->id,
107+
'role_id' => $newRole->id,
108+
]);
109+
}
110+
}
111+
}
112+
}
113+
}
114+
115+
$this->info('LaravelCRM Permissions Update Complete.');
116+
}
117+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?php
2+
3+
namespace VentureDrake\LaravelCrm\Http\Controllers\Jetstream;
4+
5+
use Illuminate\Http\Request;
6+
use Illuminate\Routing\Controller;
7+
use Laravel\Jetstream\Jetstream;
8+
9+
class CurrentTeamController extends Controller
10+
{
11+
/**
12+
* Update the authenticated user's current team.
13+
*
14+
* @param \Illuminate\Http\Request $request
15+
* @return \Illuminate\Http\RedirectResponse
16+
*/
17+
public function update(Request $request)
18+
{
19+
$team = Jetstream::newTeamModel()->findOrFail($request->team_id);
20+
21+
if ($request->user()->switchTeam($team)) {
22+
app()[\Spatie\Permission\PermissionRegistrar::class]->forgetCachedPermissions();
23+
} else {
24+
abort(403);
25+
}
26+
27+
return redirect(config('fortify.home'), 303);
28+
}
29+
}

src/Http/Middleware/HasCrmAccess.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ public function handle($request, Closure $next)
2222
if (auth()->user()->crm_access != 1 && config('laravel-crm.crm_owner') != auth()->user()->email) {
2323
abort('403');
2424
}
25-
26-
if (config('laravel-crm.crm_owner') == auth()->user()->email && (! auth()->user()->hasRole('Owner') || ! auth()->user()->hasCrmAccess())) {
25+
26+
if (! config('laravel-crm.teams') && config('laravel-crm.crm_owner') == auth()->user()->email && (! auth()->user()->hasRole('Owner') || ! auth()->user()->hasCrmAccess())) {
2727
auth()->user()->assignRole('Owner');
2828

2929
auth()->user()->forceFill([

src/Http/routes.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -503,7 +503,7 @@
503503
->middleware(['can:delete,role']);
504504
});
505505

506-
/* CRM routes (AJAX) */
506+
/* CRM (AJAX) */
507507
Route::group(['prefix' => 'crm', 'middleware' => 'auth.laravel-crm'], function () {
508508
Route::group(['prefix' => 'people', 'middleware' => 'auth.laravel-crm'], function () {
509509
Route::get('{person}/autocomplete', 'VentureDrake\LaravelCrm\Http\Controllers\PersonController@autocomplete')
@@ -524,3 +524,8 @@
524524
->middleware(['can:viewAny,VentureDrake\LaravelCrm\Models\Product']);
525525
});
526526
});
527+
528+
/* Jetstream */
529+
Route::put('/current-team', 'VentureDrake\LaravelCrm\Http\Controllers\Jetstream\CurrentTeamController@update')
530+
->name('current-team.update')
531+
->middleware(['auth', 'verified']);

src/LaravelCrmServiceProvider.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
use Illuminate\Support\Facades\Route;
1212
use Illuminate\Support\ServiceProvider;
1313
use VentureDrake\LaravelCrm\Console\LaravelCrmInstall;
14+
use VentureDrake\LaravelCrm\Console\LaravelCrmPermissions;
1415
use VentureDrake\LaravelCrm\Http\Middleware\Authenticate;
1516
use VentureDrake\LaravelCrm\Http\Middleware\HasCrmAccess;
1617
use VentureDrake\LaravelCrm\Http\Middleware\LastOnlineAt;
@@ -28,6 +29,8 @@
2829
use VentureDrake\LaravelCrm\Observers\PersonObserver;
2930
use VentureDrake\LaravelCrm\Observers\PhoneObserver;
3031
use VentureDrake\LaravelCrm\Observers\SettingObserver;
32+
use VentureDrake\LaravelCrm\Observers\TeamObserver;
33+
use VentureDrake\LaravelCrm\Observers\UserObserver;
3134

3235
class LaravelCrmServiceProvider extends ServiceProvider
3336
{
@@ -58,6 +61,7 @@ public function boot(Router $router, Filesystem $filesystem)
5861
{
5962
if ((app()->version() >= 8 && class_exists('App\Models\User')) || (class_exists('App\Models\User') && ! class_exists('App\User'))) {
6063
class_alias(config("auth.providers.users.model"), 'App\User');
64+
class_alias('App\Models\Team', 'App\Team');
6165
}
6266

6367
$this->registerPolicies();
@@ -88,6 +92,18 @@ class_alias(config("auth.providers.users.model"), 'App\User');
8892
Email::observe(EmailObserver::class);
8993
Setting::observe(SettingObserver::class);
9094

95+
if (class_exists('App\Models\User')) {
96+
\App\Models\User::observe(UserObserver::class);
97+
} else {
98+
\App\User::observe(UserObserver::class);
99+
}
100+
101+
if (class_exists('App\Models\Team')) {
102+
\App\Models\Team::observe(TeamObserver::class);
103+
} elseif (class_exists('App\Team')) {
104+
\App\Team::observe(TeamObserver::class);
105+
}
106+
91107
// Paginate on Collection
92108
if (! Collection::hasMacro('paginate')) {
93109
Collection::macro(
@@ -141,6 +157,7 @@ function ($perPage = 30, $page = null, $options = []) {
141157
__DIR__ . '/../database/migrations/create_laravel_crm_deal_products_table.php.stub' => $this->getMigrationFileName($filesystem, 'create_laravel_crm_deal_products_table.php', 10),
142158
__DIR__ . '/../database/migrations/add_global_to_laravel_crm_settings_table.php.stub' => $this->getMigrationFileName($filesystem, 'add_global_to_laravel_crm_settings_table.php', 11),
143159
__DIR__ . '/../database/migrations/alter_fields_for_encryption_on_laravel_crm_tables.php.stub' => $this->getMigrationFileName($filesystem, 'alter_fields_for_encryption_on_laravel_crm_tables.php', 12),
160+
__DIR__ . '/../database/migrations/add_team_id_to_roles_permissions_tables.php.stub' => $this->getMigrationFileName($filesystem, 'add_team_id_to_roles_permissions_tables.php', 13),
144161
], 'migrations');
145162

146163
// Publishing the seeders
@@ -163,6 +180,7 @@ function ($perPage = 30, $page = null, $options = []) {
163180
// Registering package commands.
164181
$this->commands([
165182
LaravelCrmInstall::class,
183+
LaravelCrmPermissions::class,
166184
]);
167185

168186
// Register the model factories

0 commit comments

Comments
 (0)