SyncAndreiaPermissions.php 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. <?php
  2. namespace App\Console\Commands;
  3. use Illuminate\Console\Command;
  4. use App\Models\User;
  5. use App\Models\Unit;
  6. use App\Models\UserType;
  7. use App\Models\UserTypePermission;
  8. class SyncAndreiaPermissions extends Command
  9. {
  10. protected $signature = 'app:sync-andreia-permissions';
  11. protected $description = 'Padroniza os perfis customizados (Neurotrainer, Financeiro, Gestor) para todos os franqueados usando a unidade da Andreia como template.';
  12. public function handle()
  13. {
  14. $andreia = User::find(11);
  15. if (!$andreia) {
  16. $this->error("Usuária Andreia não encontrada no banco.");
  17. return;
  18. }
  19. $andreiaUnitId = $andreia->units()->value('units.id');
  20. if (!$andreiaUnitId) {
  21. $this->error("A usuária {$andreia->name} não está vinculada a nenhuma unidade.");
  22. return;
  23. }
  24. // Pega todos os perfis customizados criados pela Andreia
  25. $templateRoles = UserType::where('unit_id', $andreiaUnitId)
  26. ->where('is_system', false)
  27. ->with('permissions')
  28. ->get();
  29. if ($templateRoles->isEmpty()) {
  30. $this->error("A unidade da Andreia não possui perfis customizados para replicar.");
  31. return;
  32. }
  33. $this->info("Encontrados {$templateRoles->count()} perfis na unidade da Andreia. Replicando para todas as outras unidades...");
  34. $units = Unit::where('id', '!=', $andreiaUnitId)->get();
  35. $countUnits = 0;
  36. foreach ($units as $unit) {
  37. foreach ($templateRoles as $templateRole) {
  38. // Checa se a unidade já tem um perfil com esse nome
  39. $existingRole = UserType::where('unit_id', $unit->id)
  40. ->where('label', $templateRole->label)
  41. ->first();
  42. if ($existingRole) {
  43. // Atualiza as permissões do perfil existente
  44. UserTypePermission::where('user_type_id', $existingRole->id)->delete();
  45. foreach ($templateRole->permissions as $p) {
  46. UserTypePermission::create([
  47. 'user_type' => $existingRole->slug,
  48. 'user_type_id' => $existingRole->id,
  49. 'permission_id' => $p->permission_id,
  50. 'bits' => $p->bits,
  51. ]);
  52. }
  53. } else {
  54. // Cria o novo perfil
  55. $newRole = UserType::create([
  56. 'unit_id' => $unit->id,
  57. 'system_key' => $templateRole->system_key,
  58. 'scope_key' => "unit:{$unit->id}",
  59. 'slug' => \Illuminate\Support\Str::slug($templateRole->label . '-' . $unit->id),
  60. 'is_system' => false,
  61. 'access_scope' => 'unit',
  62. ]);
  63. foreach ($templateRole->permissions as $p) {
  64. UserTypePermission::create([
  65. 'user_type' => $newRole->slug,
  66. 'user_type_id' => $newRole->id,
  67. 'permission_id' => $p->permission_id,
  68. 'bits' => $p->bits,
  69. ]);
  70. }
  71. }
  72. }
  73. $countUnits++;
  74. }
  75. $this->info("Concluído! Perfis replicados com sucesso para {$countUnits} unidades.");
  76. }
  77. }