'boolean', 'webhook_configuration' => 'array', 'updated_at' => 'timestamp', 'created_at' => 'timestamp', 'deleted_at' => 'timestamp', 'trial_enabled' => 'boolean', 'allow_plan_changes' => 'boolean', ]; protected $with = [ 'company', ]; public function service(): SubscriptionService { return new SubscriptionService($this); } public function link_service(): PaymentLinkService { return new PaymentLinkService($this); } public function status(RecurringInvoice $recurring_invoice): SubscriptionStatus { return (new SubscriptionStatus($this, $recurring_invoice))->run(); } public function calc(): SubscriptionCalculator { return new SubscriptionCalculator($this); } public function company(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(Company::class); } public function user(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(User::class)->withTrashed(); } public function group_settings() { return $this->belongsTo(GroupSetting::class, 'group_id', 'id'); } public function nextDateByInterval($date, $frequency_id) { switch ($frequency_id) { case RecurringInvoice::FREQUENCY_DAILY: return $date->addDay(); case RecurringInvoice::FREQUENCY_WEEKLY: return $date->addWeek(); case RecurringInvoice::FREQUENCY_TWO_WEEKS: return $date->addWeeks(2); case RecurringInvoice::FREQUENCY_FOUR_WEEKS: return $date->addWeeks(4); case RecurringInvoice::FREQUENCY_MONTHLY: return $date->addMonthNoOverflow(); case RecurringInvoice::FREQUENCY_TWO_MONTHS: return $date->addMonthsNoOverflow(2); case RecurringInvoice::FREQUENCY_THREE_MONTHS: return $date->addMonthsNoOverflow(3); case RecurringInvoice::FREQUENCY_FOUR_MONTHS: return $date->addMonthsNoOverflow(4); case RecurringInvoice::FREQUENCY_SIX_MONTHS: return $date->addMonthsNoOverflow(6); case RecurringInvoice::FREQUENCY_ANNUALLY: return $date->addYear(); case RecurringInvoice::FREQUENCY_TWO_YEARS: return $date->addYears(2); case RecurringInvoice::FREQUENCY_THREE_YEARS: return $date->addYears(3); default: return null; } } /** * Calculates the maximum product quantity available * * @param mixed $product * @return int */ public function maxQuantity(mixed $product): int { $max_quantity = data_get($product, 'max_quantity', 0); $in_stock_quantity = data_get($product, 'in_stock_quantity', 0); $max_limit = 100; if(!$this->use_inventory_management) return $max_quantity != 0 ? $max_quantity : $max_limit; return $max_quantity !=0 ? $max_quantity : min($max_limit, $in_stock_quantity); } }