re-check final
This commit is contained in:
@@ -0,0 +1,59 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Console\Commands;
|
||||
|
||||
use App\Models\AppSetting;
|
||||
use Illuminate\Console\Command;
|
||||
use Illuminate\Support\Facades\View;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
|
||||
class ExportHelpPdf extends Command
|
||||
{
|
||||
protected $signature = 'help:export-pdf {--output= : Output path for the PDF file}';
|
||||
protected $description = 'Genera il PDF della guida completa';
|
||||
|
||||
public function handle(): int
|
||||
{
|
||||
$appName = AppSetting::getAppName() ?? 'Glastree';
|
||||
|
||||
$this->components->info('Generazione HTML della guida...');
|
||||
|
||||
$html = View::make('help.pdf', ['appName' => $appName])->render();
|
||||
|
||||
$tmpHtml = tempnam(sys_get_temp_dir(), 'help_') . '.html';
|
||||
file_put_contents($tmpHtml, $html);
|
||||
|
||||
$output = $this->option('output');
|
||||
if (!$output) {
|
||||
$output = storage_path('app/help-guida.pdf');
|
||||
}
|
||||
|
||||
$this->components->info('Conversione in PDF via Chromium...');
|
||||
|
||||
$cmd = sprintf(
|
||||
'/usr/bin/chromium --headless --no-sandbox --disable-gpu --print-to-pdf=%s %s 2>&1',
|
||||
escapeshellarg($output),
|
||||
escapeshellarg('file://' . $tmpHtml)
|
||||
);
|
||||
|
||||
exec($cmd, $execOutput, $exitCode);
|
||||
|
||||
unlink($tmpHtml);
|
||||
|
||||
if ($exitCode !== 0) {
|
||||
$this->components->error('Errore Chromium: ' . implode("\n", $execOutput));
|
||||
return Command::FAILURE;
|
||||
}
|
||||
|
||||
$size = filesize($output);
|
||||
$this->components->success(sprintf(
|
||||
'PDF generato: %s (%.2f MB)',
|
||||
$output,
|
||||
$size / 1024 / 1024
|
||||
));
|
||||
|
||||
return Command::SUCCESS;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\AppSetting;
|
||||
use Illuminate\View\View;
|
||||
use Symfony\Component\HttpFoundation\BinaryFileResponse;
|
||||
|
||||
class HelpController extends Controller
|
||||
{
|
||||
public function index(): View
|
||||
{
|
||||
return view('help.index', [
|
||||
'appName' => AppSetting::getAppName() ?? 'Glastree',
|
||||
]);
|
||||
}
|
||||
|
||||
public function pdf(): View
|
||||
{
|
||||
return view('help.pdf', [
|
||||
'appName' => AppSetting::getAppName() ?? 'Glastree',
|
||||
]);
|
||||
}
|
||||
|
||||
public function downloadPdf(): BinaryFileResponse
|
||||
{
|
||||
$pdfPath = storage_path('app/help-guida.pdf');
|
||||
|
||||
if (!file_exists($pdfPath)) {
|
||||
$appName = AppSetting::getAppName() ?? 'Glastree';
|
||||
|
||||
$html = view('help.pdf', ['appName' => $appName])->render();
|
||||
|
||||
$tmpHtml = tempnam(sys_get_temp_dir(), 'help_') . '.html';
|
||||
file_put_contents($tmpHtml, $html);
|
||||
|
||||
$cmd = sprintf(
|
||||
'/usr/bin/chromium --headless --no-sandbox --disable-gpu --print-to-pdf=%s %s 2>&1',
|
||||
escapeshellarg($pdfPath),
|
||||
escapeshellarg('file://' . $tmpHtml)
|
||||
);
|
||||
|
||||
exec($cmd, $execOutput, $exitCode);
|
||||
unlink($tmpHtml);
|
||||
|
||||
if ($exitCode !== 0 || !file_exists($pdfPath)) {
|
||||
abort(500, 'Errore generazione PDF. Assicurati che Chromium sia installato.');
|
||||
}
|
||||
}
|
||||
|
||||
return response()->download($pdfPath, 'guida-glastree.pdf', [
|
||||
'Content-Type' => 'application/pdf',
|
||||
]);
|
||||
}
|
||||
}
|
||||
@@ -11,6 +11,7 @@ use App\Models\Individuo;
|
||||
use App\Models\EmailMessage;
|
||||
use App\Models\MailingList;
|
||||
use App\Models\Notifica;
|
||||
use App\Services\BackupService;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
|
||||
class HomeController extends Controller
|
||||
@@ -19,9 +20,15 @@ class HomeController extends Controller
|
||||
{
|
||||
$user = Auth::user();
|
||||
|
||||
$backupsCount = 0;
|
||||
if ($user->canManage('settings')) {
|
||||
$backupsCount = count(app(BackupService::class)->list());
|
||||
}
|
||||
|
||||
$stats = [
|
||||
'individui' => Individuo::count(),
|
||||
'gruppi' => Gruppo::count(),
|
||||
'backups' => $backupsCount,
|
||||
'notifiche' => $user->unreadNotificheCount(),
|
||||
'documenti' => Documento::count(),
|
||||
'eventi' => Evento::count(),
|
||||
|
||||
@@ -19,8 +19,26 @@ class AppSetting extends Model
|
||||
'app_version',
|
||||
'dashboard_welcome',
|
||||
'show_version',
|
||||
'backup_path',
|
||||
'backup_retention_days',
|
||||
'backup_include_files',
|
||||
'backup_include_env',
|
||||
'backup_auto_enabled',
|
||||
'backup_auto_frequency',
|
||||
'backup_auto_hour',
|
||||
];
|
||||
|
||||
protected function casts(): array
|
||||
{
|
||||
return [
|
||||
'backup_retention_days' => 'integer',
|
||||
'backup_include_files' => 'boolean',
|
||||
'backup_include_env' => 'boolean',
|
||||
'backup_auto_enabled' => 'boolean',
|
||||
'backup_auto_hour' => 'integer',
|
||||
];
|
||||
}
|
||||
|
||||
public static function getSetting(string $key, $default = null)
|
||||
{
|
||||
$setting = self::first();
|
||||
|
||||
@@ -65,11 +65,10 @@ class BackupService
|
||||
$result = ['success' => true, 'message' => '', 'filename' => ''];
|
||||
|
||||
try {
|
||||
$this->cleanTemp();
|
||||
File::ensureDirectoryExists($this->tempDir, 0755, true);
|
||||
File::ensureDirectoryExists($this->backupDir, 0755, true);
|
||||
|
||||
$this->cleanTemp();
|
||||
|
||||
$timestamp = now()->format('Y-m-d_H-i-s');
|
||||
$appName = str_replace(' ', '_', AppSetting::getAppName() ?? 'app');
|
||||
$filename = $appName . '_' . $timestamp . '.zip';
|
||||
|
||||
Reference in New Issue
Block a user