diff --git a/Models/Feature.php b/Models/Feature.php index de37b99..f31ceb1 100644 --- a/Models/Feature.php +++ b/Models/Feature.php @@ -10,6 +10,35 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Database\Eloquent\Relations\HasMany; +/** + * Feature model - entitlement feature definition (e.g. social.accounts, bio.pages). + * + * @property int $id + * @property string $code + * @property string $name + * @property string|null $description + * @property string|null $category + * @property string $type + * @property string $reset_type + * @property int|null $rolling_window_days + * @property int|null $parent_feature_id + * @property int $sort_order + * @property bool $is_active + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @property-read \Illuminate\Database\Eloquent\Collection $packages + * @property-read Feature|null $parent + * @property-read \Illuminate\Database\Eloquent\Collection $children + * + * @method static \Illuminate\Database\Eloquent\Builder|Feature active() + * @method static \Illuminate\Database\Eloquent\Builder|Feature inCategory(string $category) + * @method static \Illuminate\Database\Eloquent\Builder|Feature root() + * @method static \Illuminate\Database\Eloquent\Builder|Feature newModelQuery() + * @method static \Illuminate\Database\Eloquent\Builder|Feature newQuery() + * @method static \Illuminate\Database\Eloquent\Builder|Feature query() + * + * @mixin \Eloquent + */ class Feature extends Model { use HasFactory; diff --git a/Models/Namespace_.php b/Models/Namespace_.php index b077de7..31a2664 100644 --- a/Models/Namespace_.php +++ b/Models/Namespace_.php @@ -19,10 +19,40 @@ use Illuminate\Support\Str; * a namespace rather than directly to User/Workspace. The namespace itself * has polymorphic ownership (User or Workspace can own). * - * Ownership patterns: - * - Individual user: User → Namespace → Products - * - Agency: Workspace → Namespace(s) → Products (one per client) - * - Team member: User in Workspace → access to Workspace's Namespaces + * @property int $id + * @property string $uuid + * @property string $name + * @property string $slug + * @property string|null $description + * @property string $icon + * @property string $color + * @property string $owner_type + * @property int $owner_id + * @property int|null $workspace_id + * @property array|null $settings + * @property bool $is_default + * @property bool $is_active + * @property int $sort_order + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @property \Illuminate\Support\Carbon|null $deleted_at + * @property-read User|Workspace $owner + * @property-read Workspace|null $workspace + * @property-read \Illuminate\Database\Eloquent\Collection $namespacePackages + * @property-read \Illuminate\Database\Eloquent\Collection $boosts + * @property-read \Illuminate\Database\Eloquent\Collection $usageRecords + * @property-read \Illuminate\Database\Eloquent\Collection $entitlementLogs + * + * @method static \Illuminate\Database\Eloquent\Builder|Namespace_ active() + * @method static \Illuminate\Database\Eloquent\Builder|Namespace_ ordered() + * @method static \Illuminate\Database\Eloquent\Builder|Namespace_ ownedByUser(User|int $user) + * @method static \Illuminate\Database\Eloquent\Builder|Namespace_ ownedByWorkspace(Workspace|int $workspace) + * @method static \Illuminate\Database\Eloquent\Builder|Namespace_ accessibleBy(User $user) + * @method static \Illuminate\Database\Eloquent\Builder|Namespace_ newModelQuery() + * @method static \Illuminate\Database\Eloquent\Builder|Namespace_ newQuery() + * @method static \Illuminate\Database\Eloquent\Builder|Namespace_ query() + * + * @mixin \Eloquent */ class Namespace_ extends Model { diff --git a/Models/Package.php b/Models/Package.php index 96bbc19..c2b8fa9 100644 --- a/Models/Package.php +++ b/Models/Package.php @@ -9,6 +9,47 @@ use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Database\Eloquent\Relations\HasMany; +/** + * Package model - entitlement package definition (e.g. Free, Creator, Agency). + * + * @property int $id + * @property string $code + * @property string $name + * @property string|null $description + * @property string|null $icon + * @property string|null $color + * @property int $sort_order + * @property bool $is_stackable + * @property bool $is_base_package + * @property bool $is_active + * @property bool $is_public + * @property string|null $blesta_package_id + * @property float|null $monthly_price + * @property float|null $yearly_price + * @property float $setup_fee + * @property int $trial_days + * @property string|null $stripe_price_id_monthly + * @property string|null $stripe_price_id_yearly + * @property string|null $btcpay_price_id_monthly + * @property string|null $btcpay_price_id_yearly + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @property-read \Illuminate\Database\Eloquent\Collection $features + * @property-read \Illuminate\Database\Eloquent\Collection $workspacePackages + * + * @method static \Illuminate\Database\Eloquent\Builder|Package active() + * @method static \Illuminate\Database\Eloquent\Builder|Package public() + * @method static \Illuminate\Database\Eloquent\Builder|Package base() + * @method static \Illuminate\Database\Eloquent\Builder|Package addons() + * @method static \Illuminate\Database\Eloquent\Builder|Package purchasable() + * @method static \Illuminate\Database\Eloquent\Builder|Package free() + * @method static \Illuminate\Database\Eloquent\Builder|Package ordered() + * @method static \Illuminate\Database\Eloquent\Builder|Package newModelQuery() + * @method static \Illuminate\Database\Eloquent\Builder|Package newQuery() + * @method static \Illuminate\Database\Eloquent\Builder|Package query() + * + * @mixin \Eloquent + */ class Package extends Model { use HasFactory; diff --git a/Models/User.php b/Models/User.php index 85af40f..8561557 100644 --- a/Models/User.php +++ b/Models/User.php @@ -18,6 +18,39 @@ use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Laravel\Pennant\Concerns\HasFeatures; +/** + * User model - authenticatable tenant user. + * + * @property int $id + * @property string $name + * @property string $email + * @property \Illuminate\Support\Carbon|null $email_verified_at + * @property string $password + * @property string|null $remember_token + * @property \Core\Tenant\Enums\UserTier $tier + * @property \Illuminate\Support\Carbon|null $tier_expires_at + * @property int|null $referred_by + * @property int $referral_count + * @property \Illuminate\Support\Carbon|null $referral_activated_at + * @property array|null $cached_stats + * @property \Illuminate\Support\Carbon|null $stats_computed_at + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @property-read \Illuminate\Database\Eloquent\Collection $workspaces + * @property-read \Illuminate\Database\Eloquent\Collection $ownedWorkspaces + * @property-read \Illuminate\Database\Eloquent\Collection $namespaces + * @property-read \Illuminate\Database\Eloquent\Collection $boosts + * @property-read User|null $referrer + * @property-read \Illuminate\Database\Eloquent\Collection $referrals + * @property-read \Illuminate\Notifications\DatabaseNotificationCollection $notifications + * + * @method static \Illuminate\Database\Eloquent\Builder|User newModelQuery() + * @method static \Illuminate\Database\Eloquent\Builder|User newQuery() + * @method static \Illuminate\Database\Eloquent\Builder|User query() + * @method static \Core\Tenant\Database\Factories\UserFactory factory($count = null, $state = []) + * + * @mixin \Eloquent + */ class User extends Authenticatable implements MustVerifyEmail { use HasFactory, HasFeatures, Notifiable; diff --git a/Models/Workspace.php b/Models/Workspace.php index 490bc64..c81c6ac 100644 --- a/Models/Workspace.php +++ b/Models/Workspace.php @@ -50,6 +50,65 @@ use Mod\Commerce\Models\Order; use Mod\Commerce\Models\PaymentMethod; use Mod\Commerce\Models\Subscription; +/** + * Workspace model - the core tenant boundary. + * + * @property int $id + * @property string $name + * @property string $slug + * @property string|null $domain + * @property string|null $icon + * @property string|null $color + * @property string|null $description + * @property string $type + * @property array|null $settings + * @property bool $is_active + * @property int $sort_order + * @property bool $wp_connector_enabled + * @property string|null $wp_connector_url + * @property string|null $wp_connector_secret + * @property \Illuminate\Support\Carbon|null $wp_connector_verified_at + * @property \Illuminate\Support\Carbon|null $wp_connector_last_sync + * @property array|null $wp_connector_config + * @property string|null $stripe_customer_id + * @property string|null $btcpay_customer_id + * @property string|null $billing_name + * @property string|null $billing_email + * @property string|null $billing_address_line1 + * @property string|null $billing_address_line2 + * @property string|null $billing_city + * @property string|null $billing_state + * @property string|null $billing_postal_code + * @property string|null $billing_country + * @property string|null $vat_number + * @property string|null $tax_id + * @property bool $tax_exempt + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @property-read string $cms_url + * @property-read string $wp_connector_webhook_url + * @property-read \Illuminate\Database\Eloquent\Collection $users + * @property-read \Illuminate\Database\Eloquent\Collection $members + * @property-read \Illuminate\Database\Eloquent\Collection $teams + * @property-read \Illuminate\Database\Eloquent\Collection $workspacePackages + * @property-read \Illuminate\Database\Eloquent\Collection $invitations + * @property-read \Illuminate\Database\Eloquent\Collection $namespaces + * @property-read \Illuminate\Database\Eloquent\Collection $packages + * @property-read \Illuminate\Database\Eloquent\Collection $boosts + * @property-read \Illuminate\Database\Eloquent\Collection $usageRecords + * @property-read \Illuminate\Database\Eloquent\Collection $entitlementLogs + * @property-read \Illuminate\Database\Eloquent\Collection $usageAlerts + * @property-read \Illuminate\Database\Eloquent\Collection $entitlementWebhooks + * + * @method static \Illuminate\Database\Eloquent\Builder|Workspace active() + * @method static \Illuminate\Database\Eloquent\Builder|Workspace ordered() + * @method static \Illuminate\Database\Eloquent\Builder|Workspace newModelQuery() + * @method static \Illuminate\Database\Eloquent\Builder|Workspace newQuery() + * @method static \Illuminate\Database\Eloquent\Builder|Workspace query() + * @method static \Core\Tenant\Database\Factories\WorkspaceFactory factory($count = null, $state = []) + * + * @mixin \Eloquent + */ class Workspace extends Model { use HasFactory; diff --git a/Models/WorkspaceInvitation.php b/Models/WorkspaceInvitation.php index a832d10..ebacee3 100644 --- a/Models/WorkspaceInvitation.php +++ b/Models/WorkspaceInvitation.php @@ -12,6 +12,33 @@ use Illuminate\Notifications\Notifiable; use Illuminate\Support\Facades\Hash; use Illuminate\Support\Str; +/** + * Workspace Invitation - manages invitations to join workspaces. + * + * @property int $id + * @property int $workspace_id + * @property string $email + * @property string $token + * @property string $role + * @property int|null $invited_by + * @property \Illuminate\Support\Carbon $expires_at + * @property \Illuminate\Support\Carbon|null $accepted_at + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @property-read Workspace $workspace + * @property-read User|null $inviter + * @property-read \Illuminate\Notifications\DatabaseNotificationCollection $notifications + * + * @method static \Illuminate\Database\Eloquent\Builder|WorkspaceInvitation pending() + * @method static \Illuminate\Database\Eloquent\Builder|WorkspaceInvitation expired() + * @method static \Illuminate\Database\Eloquent\Builder|WorkspaceInvitation accepted() + * @method static \Illuminate\Database\Eloquent\Builder|WorkspaceInvitation newModelQuery() + * @method static \Illuminate\Database\Eloquent\Builder|WorkspaceInvitation newQuery() + * @method static \Illuminate\Database\Eloquent\Builder|WorkspaceInvitation query() + * @method static \Core\Tenant\Database\Factories\WorkspaceInvitationFactory factory($count = null, $state = []) + * + * @mixin \Eloquent + */ class WorkspaceInvitation extends Model { use HasFactory; diff --git a/Models/WorkspaceMember.php b/Models/WorkspaceMember.php index 1d04a9c..2eb89ce 100644 --- a/Models/WorkspaceMember.php +++ b/Models/WorkspaceMember.php @@ -25,6 +25,21 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo; * @property int|null $invited_by * @property Carbon $created_at * @property Carbon $updated_at + * @property-read User $user + * @property-read Workspace $workspace + * @property-read WorkspaceTeam|null $team + * @property-read User|null $inviter + * + * @method static \Illuminate\Database\Eloquent\Builder|WorkspaceMember forWorkspace(Workspace|int $workspace) + * @method static \Illuminate\Database\Eloquent\Builder|WorkspaceMember forUser(User|int $user) + * @method static \Illuminate\Database\Eloquent\Builder|WorkspaceMember withRole(string $role) + * @method static \Illuminate\Database\Eloquent\Builder|WorkspaceMember inTeam(WorkspaceTeam|int $team) + * @method static \Illuminate\Database\Eloquent\Builder|WorkspaceMember owners() + * @method static \Illuminate\Database\Eloquent\Builder|WorkspaceMember newModelQuery() + * @method static \Illuminate\Database\Eloquent\Builder|WorkspaceMember newQuery() + * @method static \Illuminate\Database\Eloquent\Builder|WorkspaceMember query() + * + * @mixin \Eloquent */ class WorkspaceMember extends Model {