netgescon-day0/app/Console/Commands/NetgesconApplyPbxPresetCommand.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) ?: '';
}
}