This commit is contained in:
2026-11-02 08:08:05 +02:00
parent 13a6cb9922
commit 504b01b244
246 changed files with 24499 additions and 185 deletions
+48 -2
View File
@@ -10,6 +10,38 @@ use Illuminate\Support\Facades\Schema;
class OrganizationAccess
{
public const PERMISSIONS = [
'warehouse_request_review' => 'Autorizar ou rejeitar requisições internas ao armazém do departamento, de forma independente',
'warehouse_request_deliver' => 'Entregar material de requisições internas autorizadas (exige função de armazém)',
'warehouse_request_prepare' => 'Preparar requisições próprias ao armazém com destino de utilização',
'warehouse_request_read' => 'Consultar requisições ao armazém da empresa',
'warehouse_availability_read' => 'Consultar disponibilidade e necessidades planeadas para requisições ao armazém',
'inventory_lot_read' => 'Consultar lotes, validade e quarentena',
'inventory_lot_prepare' => 'Preparar controlo por lotes e correcções de identificação',
'inventory_lot_review' => 'Conferir activação e parâmetros do controlo por lotes',
'inventory_lot_hold' => 'Colocar lotes em quarentena',
'inventory_lot_release' => 'Conferir identificação e libertar lotes de forma independente',
'inventory_adjust_review' => 'Conferir e aplicar ajustes físicos por lote de forma independente',
'inventory_disposition_read' => 'Consultar devoluções a fornecedores e abates físicos',
'inventory_disposition_prepare' => 'Preparar devoluções a fornecedores e abates físicos',
'inventory_disposition_review' => 'Conferir devoluções e abates de forma independente',
'inventory_reversal_read' => 'Consultar estornos integrais de stock e respectivas origens',
'inventory_reversal_prepare' => 'Preparar estornos de stock ligados ao original',
'inventory_reversal_review' => 'Conferir estornos de stock de forma independente',
'supply_read' => 'Consultar fornecimentos e calendário de reposição',
'supply_prepare' => 'Preparar acordos habituais e políticas de reposição',
'supply_review' => 'Conferir e aprovar acordos e políticas de reposição',
'supply_suggest_prepare' => 'Preparar e actualizar sugestões de reposição',
'supply_suggest_review' => 'Conferir e decidir sugestões de reposição',
'supply_suggest_convert' => 'Converter sugestões aprovadas em requisições próprias',
'supply_history_prepare' => 'Preparar análise e cobertura do histórico de consumo',
'supply_history_review' => 'Conferir o histórico de consumo de forma independente',
'supply_reserve' => 'Reservar necessidades e conferir satisfação por saídas',
'supply_delivery' => 'Registar confirmações e replaneamento de entregas',
'supply_technical_prepare' => 'Preparar equivalências técnicas de artigos',
'supply_technical_review' => 'Validar equivalências técnicas de forma independente',
'import_read' => 'Consultar processos de importação',
'import_prepare' => 'Preparar e acompanhar logística de importações',
'import_customs' => 'Conferir documentação e libertação aduaneira',
'requester' => 'Solicitar e acompanhar compras próprias',
'department_head' => 'Supervisão e aprovação do departamento',
'procurement' => 'Preparação e gestão operacional de compras',
@@ -30,7 +62,7 @@ class OrganizationAccess
}
/** @return list<string> */
public function permissions(User $user): array
public function permissions(User $user, ?string $context = null): array
{
if ($user->tenant_id === null) {
return [];
@@ -38,11 +70,25 @@ class OrganizationAccess
if (! $this->active($user->tenant_id)) {
return $user->purchasing_role === null || $user->purchasing_role === PurchasingRole::Configured ? [] : [$user->purchasing_role->value];
}
$contextKey = $context;
if ($contextKey === null && app()->bound('request') && request()->hasSession() && WorkContext::area(request()->path()) !== null && app(WorkContext::class)->enforced($user)) {
$contextKey = app(WorkContext::class)->active(request());
if ($contextKey === null) {
return [];
}
}
$columns = ['p.permissions'];
if (Schema::hasColumn('organization_profiles', 'work_contexts')) {
$columns[] = 'p.work_contexts';
}
$rows = DB::table('organization_memberships as m')->join('organization_profiles as p', 'p.id', '=', 'm.profile_id')
->where('m.tenant_id', $user->tenant_id)->where('p.tenant_id', $user->tenant_id)->where('m.user_id', $user->id)
->where(fn ($q) => $q->whereNull('m.expires_at')->orWhere('m.expires_at', '>', now()))->get(['p.permissions']);
->where(fn ($q) => $q->whereNull('m.expires_at')->orWhere('m.expires_at', '>', now()))->get($columns);
$permissions = [];
foreach ($rows as $row) {
if ($contextKey !== null && ! in_array($contextKey, json_decode($row->work_contexts ?? '[]', true, 32, JSON_THROW_ON_ERROR), true)) {
continue;
}
$permissions = [...$permissions, ...json_decode($row->permissions, true, 32, JSON_THROW_ON_ERROR)];
}