PermissionSeeder.php 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. <?php
  2. namespace Database\Seeders;
  3. use App\Models\Permission;
  4. use App\Services\PermissionService;
  5. use Illuminate\Database\Seeder;
  6. class PermissionSeeder extends Seeder
  7. {
  8. public function __construct(
  9. protected PermissionService $permissionService,
  10. ) {}
  11. public function run(): void
  12. {
  13. // Criação de Permissões
  14. /*
  15. view = 1
  16. add = 2
  17. edit = 4
  18. delete = 8
  19. print = 16
  20. export = 32
  21. import = 64
  22. limit = 128
  23. menu = 256
  24. para cada cada bit selecionado se faz a soma dos valores.
  25. */
  26. $permissions = [
  27. [
  28. 'scope' => 'dashboard',
  29. 'description' => 'Dashboard',
  30. 'bits' => 511,
  31. 'children' => [],
  32. ],
  33. [
  34. 'scope' => 'payment',
  35. 'description' => 'Pagamentos',
  36. 'bits' => 257,
  37. 'children' => [
  38. [
  39. 'scope' => 'payment-split',
  40. 'description' => 'Splits de Pagamento',
  41. 'bits' => 1,
  42. 'children' => [],
  43. ],
  44. ],
  45. ],
  46. [
  47. 'scope' => 'config',
  48. 'description' => 'Configurações',
  49. 'bits' => 271,
  50. 'children' => [
  51. [
  52. 'scope' => 'config.user',
  53. 'description' => 'Configurações de Usuários',
  54. 'bits' => 271,
  55. 'children' => [],
  56. ],
  57. [
  58. 'scope' => 'config.permission',
  59. 'description' => 'Configurações de Permissões',
  60. 'bits' => 271,
  61. 'children' => [],
  62. ],
  63. [
  64. 'scope' => 'config.address',
  65. 'description' => 'Configurações de Endereços',
  66. 'bits' => 271,
  67. 'children' => [],
  68. ],
  69. [
  70. 'scope' => 'config.city',
  71. 'description' => 'Configurações de Cidades',
  72. 'bits' => 271,
  73. 'children' => [],
  74. ],
  75. [
  76. 'scope' => 'config.client',
  77. 'description' => 'Configurações de Clientes',
  78. 'bits' => 271,
  79. 'children' => [],
  80. ],
  81. [
  82. 'scope' => 'config.client_favorite_provider',
  83. 'description' => 'Configurações de Prestadores Favoritos do Cliente',
  84. 'bits' => 271,
  85. 'children' => [],
  86. ],
  87. [
  88. 'scope' => 'config.provider_client_block',
  89. 'description' => 'Clientes Bloqueados do Prestador',
  90. 'bits' => 271,
  91. 'children' => [],
  92. ],
  93. [
  94. 'scope' => 'config.client_provider_block',
  95. 'description' => 'Prestadores Bloqueados do Cliente',
  96. 'bits' => 271,
  97. 'children' => [],
  98. ],
  99. [
  100. 'scope' => 'config.client_payment_method',
  101. 'description' => 'Configurações de Métodos de Pagamento do Cliente',
  102. 'bits' => 271,
  103. 'children' => [],
  104. ],
  105. [
  106. 'scope' => 'config.schedule',
  107. 'description' => 'Agendamentos',
  108. 'bits' => 271,
  109. 'children' => [],
  110. ],
  111. [
  112. 'scope' => 'config.custom_schedule',
  113. 'description' => 'Oportunidades (Agendamentos Personalizados)',
  114. 'bits' => 271,
  115. 'children' => [],
  116. ],
  117. [
  118. 'scope' => 'config.schedule_proposal',
  119. 'description' => 'Propostas de Agendamento',
  120. 'bits' => 271,
  121. 'children' => [],
  122. ],
  123. [
  124. 'scope' => 'config.schedule_refuse',
  125. 'description' => 'Recusas de Agendamento',
  126. 'bits' => 271,
  127. 'children' => [],
  128. ],
  129. [
  130. 'scope' => 'config.country',
  131. 'description' => 'Configurações de Países',
  132. 'bits' => 271,
  133. 'children' => [],
  134. ],
  135. [
  136. 'scope' => 'config.state',
  137. 'description' => 'Configurações de Estados',
  138. 'bits' => 271,
  139. 'children' => [],
  140. ],
  141. [
  142. 'scope' => 'config.provider',
  143. 'description' => 'Configurações de Prestadores',
  144. 'bits' => 271,
  145. 'children' => [],
  146. ],
  147. [
  148. 'scope' => 'config.provider_speciality',
  149. 'description' => 'Configurações de Especialidades do Prestador',
  150. 'bits' => 271,
  151. 'children' => [],
  152. ],
  153. [
  154. 'scope' => 'config.provider_services_types',
  155. 'description' => 'Configurações de Tipos de Serviços do Prestador',
  156. 'bits' => 271,
  157. 'children' => [],
  158. ],
  159. [
  160. 'scope' => 'config.provider_working_day',
  161. 'description' => 'Configurações de Dias de Trabalho do Prestador',
  162. 'bits' => 271,
  163. 'children' => [],
  164. ],
  165. [
  166. 'scope' => 'config.provider_blocked_day',
  167. 'description' => 'Configurações de Dias Bloqueados do Prestador',
  168. 'bits' => 271,
  169. 'children' => [],
  170. ],
  171. [
  172. 'scope' => 'config.improvement_type',
  173. 'description' => 'Configurações de Tipos de Melhoria',
  174. 'bits' => 271,
  175. 'children' => [],
  176. ],
  177. [
  178. 'scope' => 'config.media',
  179. 'description' => 'Configurações de Mídia',
  180. 'bits' => 271,
  181. 'children' => [],
  182. ],
  183. [
  184. 'scope' => 'config.service_type',
  185. 'description' => 'Configurações de Tipos de Serviço',
  186. 'bits' => 271,
  187. 'children' => [],
  188. ],
  189. [
  190. 'scope' => 'config.speciality',
  191. 'description' => 'Configurações de Especialidades',
  192. 'bits' => 271,
  193. 'children' => [],
  194. ],
  195. [
  196. 'scope' => 'config.review',
  197. 'description' => 'Avaliações',
  198. 'bits' => 271,
  199. 'children' => [],
  200. ],
  201. [
  202. 'scope' => 'config.review_improvement',
  203. 'description' => 'Melhorias das Avaliações',
  204. 'bits' => 271,
  205. 'children' => [],
  206. ],
  207. [
  208. 'scope' => 'notification',
  209. 'description' => 'Notificações',
  210. 'bits' => 271,
  211. 'children' => [],
  212. ],
  213. ],
  214. ],
  215. ];
  216. $this->createPermissionsAndChildren(permissions: $permissions);
  217. }
  218. /**
  219. * Recursively creates or updates permissions and handles nesting.
  220. *
  221. * @param array $permissions The array of permission data.
  222. * @param Permission|null $parent The parent Permission object (for nested sets).
  223. */
  224. private function createPermissionsAndChildren(
  225. array $permissions,
  226. ?Permission $parent = null,
  227. ): void {
  228. foreach ($permissions as $permissionData) {
  229. $children = $permissionData['children'];
  230. unset($permissionData['children']);
  231. $permissionNode = Permission::updateOrCreate(
  232. ['scope' => $permissionData['scope']],
  233. $permissionData,
  234. );
  235. if ($parent) {
  236. $parent->appendNode($permissionNode);
  237. }
  238. if (! empty($children)) {
  239. $this->createPermissionsAndChildren(
  240. permissions: $children,
  241. parent: $permissionNode,
  242. );
  243. }
  244. }
  245. }
  246. }