| Install | |
|---|---|
composer require bachisoft/thunder-pack |
|
| Latest Version: | 1.6.7 |
| PHP: | ^8.2 |
Paquete completo de Laravel para construir aplicaciones SaaS multi-tenant con gestión de suscripciones, sistema flexible de límites, integración con WhatsApp, y panel de Super Admin.
max_clients, max_projects, api_calls_per_monthcustom_branding, api_accesswhatsapp, reports, analytics@hasFeature('custom_branding')
<!-- Mostrar contenido personalizado -->
@endhasFeature
@canUseResource('max_clients', 5)
<!-- Permitir crear 5 clientes más -->
@endcanUseResource
@hasAnyFeature(['api_access', 'webhooks'])
<!-- Tiene al menos una característica -->
@endhasAnyFeature
composer require bachisoft/thunder-pack
php artisan thunder-pack:install
Este comando:
Agrega el trait HasTenants a tu modelo User:
use ThunderPack\Traits\HasTenants;
class User extends Authenticatable
{
use HasTenants;
// ... resto del modelo
}
El paquete registra automáticamente los middleware con aliases:
tenant - Validación de acceso al tenantsubscription - Verificación de suscripción activasuperadmin - Restricción a super adminstenant.permission - Control de permisos dentro del tenantAplícalos en tus rutas:
Route::middleware(['auth', 'tenant', 'subscription'])->group(function () {
Route::get('/dashboard', [DashboardController::class, 'index']);
});
Route::middleware(['auth', 'superadmin'])->prefix('sa')->group(function () {
Route::get('/dashboard', [SuperAdminController::class, 'index']);
});
Agrega las credenciales en tu .env:
WHATSAPP_EVOLUTION_ENABLED=true
WHATSAPP_EVOLUTION_API_URL=https://api.evolutionapi.com
WHATSAPP_EVOLUTION_API_KEY=tu_api_key_aqui
WHATSAPP_EVOLUTION_DEFAULT_INSTANCE=default
Publica el archivo de configuración:
php artisan vendor:publish --tag=thunder-pack-config
El archivo config/thunder-pack.php permite personalizar:
return [
'table_prefix' => '', // Prefijo para tablas
'models' => [
'tenant' => \ThunderPack\Models\Tenant::class,
'plan' => \ThunderPack\Models\Plan::class,
// Sobrescribe modelos según necesites
],
'routes' => [
'enabled' => true,
'prefix' => '',
'middleware' => ['web', 'auth'],
'super_admin_prefix' => 'sa',
],
'features' => [
'whatsapp' => true,
'team_invitations' => true,
'super_admin_panel' => true,
],
'cache' => [
'ttl' => [
'limits' => 300, // 5 minutos
'features' => 600, // 10 minutos
],
],
];
use ThunderPack\Facades\FeatureGate;
// Verificar si el tenant tiene una característica
if (FeatureGate::has('api_access')) {
// Permitir acceso a la API
}
// Verificar límite numérico
if (FeatureGate::can('max_clients', 10)) {
// Puede crear 10 clientes más
}
// Obtener valor de límite
$maxProjects = FeatureGate::get('max_projects', 5); // 5 es el valor por defecto
use ThunderPack\Facades\PlanLimitService;
// Registrar uso de recurso
PlanLimitService::recordUsage('api_calls', 1);
// Obtener uso actual
$usage = PlanLimitService::getCurrentUsage('api_calls', 'month');
use ThunderPack\Facades\SubscriptionService;
// Activar suscripción manualmente
SubscriptionService::activateManual($tenant, $plan, $days = 30);
// Verificar estado
if (SubscriptionService::isSubscriptionActive($tenant)) {
// Suscripción activa
}
// Obtener días restantes
$daysLeft = SubscriptionService::getDaysUntilExpiration($tenant);
use ThunderPack\Services\WhatsAppService;
use ThunderPack\Jobs\SendWhatsAppNotificationJob;
// Enviar vía Job (recomendado)
SendWhatsAppNotificationJob::dispatch(
$tenant,
'subscription_activated',
['plan_name' => 'Pro']
);
// O directamente
$whatsapp = app(WhatsAppService::class);
$whatsapp->sendNotification($tenant, 'payment_received', ['amount' => 500]);
Publica las vistas para personalizarlas:
php artisan vendor:publish --tag=thunder-pack-views
Las vistas se copiarán a resources/views/vendor/thunder-pack/
composer test
composer update bachisoft/thunder-pack
php artisan migrate
php artisan view:clear
Las contribuciones son bienvenidas. Por favor, abre un issue primero para discutir cambios mayores.
MIT License. Ver LICENSE para más detalles.
Desarrollado por Bachisoft
Para reportar bugs o solicitar características, por favor usa GitHub Issues.