resolveAdmin((string) $this->argument('admin')); if (! $admin) { $this->error('Amministratore non trovato.'); return self::FAILURE; } $impostazioni = is_array($admin->impostazioni) ? $admin->impostazioni : []; $centralino = (array) ($impostazioni['centralino'] ?? []); $pbx = (array) ($impostazioni['pbx'] ?? []); $dayGroup = $this->digits((string) $this->option('day-group')); $nightGroup = $this->digits((string) $this->option('night-group')); $dayFallback = $this->digits((string) $this->option('day-fallback')); $nightFallback = $this->digits((string) $this->option('night-fallback')); $adminLine = $this->digits((string) $this->option('admin-line')); $adminTarget = $this->digits((string) $this->option('admin-target')); if ($adminTarget === '') { $adminTarget = $this->digits((string) ($centralino['interno_amministratore'] ?? '')); } if ($adminTarget !== '') { $centralino['interno_amministratore'] = $adminTarget; } $centralino['interno_gruppo_giorno'] = $dayGroup; $centralino['interno_gruppo_notte'] = $nightGroup; $pbx['provider'] = (string) ($pbx['provider'] ?? 'panasonic_ns1000'); $pbx['channel'] = (string) ($pbx['channel'] ?? 'hybrid'); $pbx['bridge_mode'] = (string) ($pbx['bridge_mode'] ?? 'group-first'); $watch = preg_split('/\s*,\s*/', (string) $this->option('watch'), -1, PREG_SPLIT_NO_EMPTY) ?: []; $watch = array_values(array_unique(array_filter(array_map( fn (string $value): string => $this->digits($value), array_merge($watch, [$dayGroup, $nightGroup, $dayFallback, $nightFallback, $adminLine, $adminTarget]) )))); $pbx['watch_extensions'] = implode(',', $watch); $pbx['response_groups'] = array_values(array_filter([ [ 'extension' => $dayGroup, 'label' => 'Gruppo giorno', 'mode' => 'giorno', 'target_extension' => $dayFallback, ], [ 'extension' => $nightGroup, 'label' => 'Gruppo notte', 'mode' => 'notte', 'target_extension' => $nightFallback, ], ], fn (array $row): bool => ($row['extension'] ?? '') !== '')); $incomingLines = []; if ($adminLine !== '') { $incomingLines[] = [ 'number' => $adminLine, 'label' => 'Linea amministratore', 'route_group' => '', 'target_extension' => $adminTarget, 'notes' => 'Smistamento dedicato amministratore su linea 0003.', ]; } $pbx['incoming_lines'] = $incomingLines; $impostazioni['centralino'] = $centralino; $impostazioni['pbx'] = $pbx; $this->line('Preset PBX Day0:'); $this->line(json_encode([ 'amministratore_id' => (int) $admin->id, 'codice_amministratore' => (string) ($admin->codice_amministratore ?? ''), 'centralino' => $centralino, 'pbx' => $pbx, ], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) ?: '{}'); if (! $this->option('apply')) { $this->warn('Dry-run completato. Riesegui con --apply per salvare il preset.'); return self::SUCCESS; } $admin->impostazioni = $impostazioni; $admin->save(); $this->info('Preset PBX salvato correttamente.'); return self::SUCCESS; } private function resolveAdmin(string $value): ?Amministratore { $value = trim($value); if ($value === '') { return null; } return Amministratore::query() ->when(is_numeric($value), fn ($query) => $query->orWhere('id', (int) $value)) ->orWhere('codice_amministratore', $value) ->orWhere('codice_univoco', $value) ->first(); } private function digits(string $value): string { return preg_replace('/\D+/', '', $value) ?: ''; } }