[ 'name' => 'WhatsApp Automations', 'description' => 'Send reminders, reconfirmations and allow customers to reserve directly inside WhatsApp.', 'url' => 'https://alexreservations.com/features/whatsapp-automations', 'icon' => 'chat', ], 'addon_tables_layouts' => [ 'name' => 'Tables with Custom Pricing', 'description' => 'Define a custom price per table, perfect for events or premium dining experiences.', 'url' => 'https://alexreservations.com/features/tables-layouts', 'icon' => 'currency', ], 'addon_tables_schedule' => [ 'name' => 'Custom Schedule per Table', 'description' => 'Optimize each table with its own individual schedule for maximum flexibility.', 'url' => 'https://alexreservations.com/features/tables-schedules', 'icon' => 'calendar', ], ]; } /** * Default DB values for each addon (only these fields are stored) */ public static function defaultAddonsData() { $data = []; foreach (array_keys(self::addonsCatalog()) as $slug) { $data[] = [ 'slug' => $slug, 'license' => '', 'status' => 'inactive', ]; } return $data; } public static function getId($tenantId) { $addon = Addon_old::where(self::$pivot_tenant_field, $tenantId)->first(); if ($addon) { return $addon->id; } $addon = Addon_old::create([ 'restaurant_id' => $tenantId, 'meta_value' => [ 'config' => [ 'addons' => self::defaultAddonsData() ] ] ]); return $addon->id; } public static function getItems(AppSettingsRequest $request, $tenantId) { $addonId = Addon_old::getId($tenantId); $addon = Addon_old::find($addonId); $config = $addon->config ?? []; $savedAddons = $config['addons'] ?? []; $catalog = self::addonsCatalog(); $merged = []; // For each addon in catalog, merge static metadata with saved DB data foreach ($catalog as $slug => $meta) { $saved = null; foreach ($savedAddons as $s) { if ($s['slug'] === $slug) { $saved = $s; break; } } $merged[] = array_merge( ['slug' => $slug], $meta, [ 'license' => $saved['license'] ?? '', 'status' => $saved['status'] ?? 'inactive', ] ); } return ['addons' => $merged]; } }