(string) ($saved['serial'] ?? '1C26TCP'), 'next_number' => max(1, (int) ($saved['next_number'] ?? 1)), 'padding' => min(12, max(1, (int) ($saved['padding'] ?? 8))), 'auto_issue' => (bool) ($saved['auto_issue'] ?? false), ]; } public static function saveNumbering(array $config): void { Setting::updateOrCreate( ['key' => self::NUMBERING_KEY], ['value' => json_encode($config, JSON_UNESCAPED_UNICODE)] ); } public static function forget(): void { self::$rates = null; } private static function rates(): array { return self::$rates ??= collect(self::read(self::RATES_KEY)) ->filter(fn ($row) => is_array($row) && isset($row['type'])) ->mapWithKeys(fn ($row) => [$row['type'] => (float) ($row['vat_rate'] ?? 0)]) ->all(); } private static function read(string $key): array { $value = Setting::where('key', $key)->value('value'); $decoded = is_string($value) ? json_decode($value, true) : null; return is_array($decoded) ? $decoded : []; } }