OfferingType::class, 'sellable' => 'boolean', 'purchasable' => 'boolean', ]; public function clearSellableAdjustments(): void { if (! $this->sellable) { $this->income_account_id = null; $adjustmentIds = $this->salesAdjustments()->pluck('adjustment_id'); $this->adjustments()->detach($adjustmentIds); } } public function clearPurchasableAdjustments(): void { if (! $this->purchasable) { $this->expense_account_id = null; $adjustmentIds = $this->purchaseAdjustments()->pluck('adjustment_id'); $this->adjustments()->detach($adjustmentIds); } } public function incomeAccount(): BelongsTo { return $this->belongsTo(Account::class, 'income_account_id'); } public function expenseAccount(): BelongsTo { return $this->belongsTo(Account::class, 'expense_account_id'); } public function adjustments(): MorphToMany { return $this->morphToMany(Adjustment::class, 'adjustmentable', 'adjustmentables'); } public function salesAdjustments(): MorphToMany { return $this->adjustments()->where('type', AdjustmentType::Sales); } public function purchaseAdjustments(): MorphToMany { return $this->adjustments()->where('type', AdjustmentType::Purchase); } public function salesTaxes(): MorphToMany { return $this->adjustments()->where('category', AdjustmentCategory::Tax)->where('type', AdjustmentType::Sales); } public function purchaseTaxes(): MorphToMany { return $this->adjustments()->where('category', AdjustmentCategory::Tax)->where('type', AdjustmentType::Purchase); } public function salesDiscounts(): MorphToMany { return $this->adjustments()->where('category', AdjustmentCategory::Discount)->where('type', AdjustmentType::Sales); } public function purchaseDiscounts(): MorphToMany { return $this->adjustments()->where('category', AdjustmentCategory::Discount)->where('type', AdjustmentType::Purchase); } public function hasInactiveAdjustments(): bool { return $this->adjustments->contains(function (Adjustment $adjustment) { return $adjustment->isInactive(); }); } }