user_type, self::portalTypes(), true); } public static function homeUrl(?User $user): string { if (! $user) { return '/login'; } return match ($user->user_type) { self::TYPE_CUSTOMER => '/customer/dashboard', self::TYPE_SUPPLIER => '/supplier/dashboard', self::TYPE_MARKETER => '/marketer/dashboard', default => '/home', }; } public static function userTypeForPortal(string $portal): string { return match ($portal) { self::PORTAL_SUPPLIER => self::TYPE_SUPPLIER, self::PORTAL_MARKETER => self::TYPE_MARKETER, default => self::TYPE_CUSTOMER, }; } public static function portalForUserType(string $userType): ?string { return match ($userType) { self::TYPE_CUSTOMER => self::PORTAL_CUSTOMER, self::TYPE_SUPPLIER => self::PORTAL_SUPPLIER, self::TYPE_MARKETER => self::PORTAL_MARKETER, default => null, }; } public static function userTypeForContact(string $contactType): string { if (in_array($contactType, ['supplier'], true)) { return self::TYPE_SUPPLIER; } return self::TYPE_CUSTOMER; } public static function portalForContactType(?string $contactType): string { return $contactType === 'supplier' ? self::PORTAL_SUPPLIER : self::PORTAL_CUSTOMER; } public static function subscriptionKey(string $portal): string { return match ($portal) { self::PORTAL_SUPPLIER => 'supplier_portal_module', self::PORTAL_MARKETER => 'marketer_portal_module', default => 'customer_portal_module', }; } public static function businessSettingKey(string $portal): string { return 'portal_enable_'.$portal; } public static function adminPermission(string $portal): string { return 'portal.'.$portal.'.access'; } public static function portalTypeLabel(string $userType): string { return match ($userType) { self::TYPE_CUSTOMER => __('portal::lang.customer_portal'), self::TYPE_SUPPLIER => __('portal::lang.supplier_portal'), self::TYPE_MARKETER => __('portal::lang.marketer_portal'), default => $userType, }; } public static function portalLabel(string $portal): string { return self::portalTypeLabel(self::userTypeForPortal($portal)); } public static function hasPortalSubscription(int $businessId, string $portal, ?ModuleUtil $moduleUtil = null): bool { $moduleUtil ??= app(ModuleUtil::class); $business = Business::find($businessId); if ($business) { $common = $business->common_settings ?? []; $settingKey = self::businessSettingKey($portal); if (array_key_exists($settingKey, $common) && empty($common[$settingKey])) { return false; } } $subscriptionKey = self::subscriptionKey($portal); if ($moduleUtil->hasThePermissionInSubscription($businessId, $subscriptionKey)) { return true; } if (in_array($portal, [self::PORTAL_CUSTOMER, self::PORTAL_SUPPLIER], true)) { return $moduleUtil->hasThePermissionInSubscription($businessId, 'crm_module'); } return false; } public static function assertPortalAccess(User $user, string $portal): void { if ($user->user_type !== self::userTypeForPortal($portal)) { abort(403, __('portal::lang.portal_access_denied')); } if (! self::hasPortalSubscription((int) $user->business_id, $portal)) { abort(403, __('portal::lang.portal_subscription_required', ['portal' => self::portalLabel($portal)])); } } public static function loginDeniedMessage(string $portal): string { return __('portal::lang.portal_login_denied', ['portal' => self::portalLabel($portal)]); } public static function adminCanManagePortal(User $user, int $businessId, string $portal): bool { if ($user->can('superadmin') || $user->can('portal.settings.manage')) { return self::hasPortalSubscription($businessId, $portal); } if (! self::hasPortalSubscription($businessId, $portal)) { return false; } return $user->can(self::adminPermission($portal)); } public static function adminCanManageContactLogin(User $user, int $businessId, ?string $contactType = null): bool { $portal = self::portalForContactType($contactType); if ($user->can('superadmin') || $user->can('portal.settings.manage')) { return self::hasPortalSubscription($businessId, $portal); } if (! self::hasPortalSubscription($businessId, $portal)) { return false; } if ($user->can(self::adminPermission($portal))) { return true; } return $user->can('crm.access_contact_login'); } }