159 lines
6.3 KiB
PHP
159 lines
6.3 KiB
PHP
<?php
|
|
namespace App\Console\Commands;
|
|
|
|
use App\Models\Amministratore;
|
|
use Illuminate\Console\Command;
|
|
|
|
class NetgesconApplyPbxPresetCommand extends Command
|
|
{
|
|
protected $signature = 'netgescon:pbx-apply-day0-preset
|
|
{admin : ID o codice amministratore}
|
|
{--apply : Salva il preset sull\'amministratore}
|
|
{--main-line=0001 : Linea principale studio}
|
|
{--main-number=0639731100 : Numero esterno linea principale}
|
|
{--day-group=601 : Gruppo risposta giorno}
|
|
{--night-group=603 : Gruppo risposta notte}
|
|
{--day-fallback=201 : Interno fallback giorno}
|
|
{--night-fallback=206 : Interno fallback notte}
|
|
{--admin-line=0003 : Linea/DID amministratore}
|
|
{--admin-number=0688812703 : Numero esterno linea amministratore}
|
|
{--admin-target= : Interno target amministratore, se diverso dall\'attuale}
|
|
{--watch=0001,0003,201,206,601,603 : Interni/linee monitorati CSV}';
|
|
|
|
protected $description = 'Applica o mostra il preset PBX Day0 con linee 0001/0003, gruppi 601/603 e fallback 201/206.';
|
|
|
|
public function handle(): int
|
|
{
|
|
$admin = $this->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'));
|
|
$mainLine = $this->digits((string) $this->option('main-line'));
|
|
$mainNumber = $this->digits((string) $this->option('main-number'));
|
|
$adminLine = $this->digits((string) $this->option('admin-line'));
|
|
$adminNumber = $this->digits((string) $this->option('admin-number'));
|
|
$adminTarget = $this->digits((string) $this->option('admin-target'));
|
|
|
|
if ($adminTarget === '') {
|
|
$adminTarget = $this->digits((string) ($centralino['interno_amministratore'] ?? ''));
|
|
}
|
|
|
|
if ($adminTarget !== '') {
|
|
$centralino['interno_amministratore'] = $adminTarget;
|
|
}
|
|
|
|
if ($mainNumber !== '') {
|
|
$centralino['numero_principale'] = $mainNumber;
|
|
}
|
|
if ($adminNumber !== '') {
|
|
$centralino['numero_backup'] = $adminNumber;
|
|
}
|
|
|
|
$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, [$mainLine, $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 ($mainLine !== '') {
|
|
$incomingLines[] = [
|
|
'number' => $mainLine,
|
|
'external_number' => $mainNumber,
|
|
'label' => 'Linea principale studio',
|
|
'route_group' => $dayGroup,
|
|
'target_extension' => $dayFallback,
|
|
'notes' => 'Linea esterna 0001 del centralino con instradamento gruppi 601/603 e fallback operativo.',
|
|
];
|
|
}
|
|
if ($adminLine !== '') {
|
|
$incomingLines[] = [
|
|
'number' => $adminLine,
|
|
'external_number' => $adminNumber,
|
|
'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) ?: '';
|
|
}
|
|
}
|