*/ protected function casts(): array { return [ 'deleted_at' => 'datetime', 'created_at' => 'datetime', ]; } /** * @return HasMany */ public function contacts(): HasMany { return $this->HasMany(Contact::class, 'company_id'); } /** * @return HasMany */ public function addresses(): HasMany { return $this->HasMany(Address::class, 'company_id'); } /** * @return belongsToMany */ public function segments(): belongsToMany { return $this->belongsToMany(Segment::class, (new SegmentCompany())->getTable(), 'company_id', 'segment_id'); } /** * @return belongsToMany */ public function seasonalSegments() { return $this->hasMany(SeasonalSegment::class); } /** * @return belongsToMany */ public function employees(): belongsToMany { return $this->belongsToMany(User::class, (new Employee())->getTable(), 'company_id','user_id'); } /** * @return MorphMany */ public function documents(): morphMany { return $this->morphMany(Document::class, 'owner'); } /** * @return HasMany */ public function banks(): HasMany { return $this->HasMany(Bank::class, 'company_id'); } /** * @return HasMany */ public function bookings(): HasMany { return $this->HasMany(Booking::class, 'company_id'); } /** * @return hasManyDeep */ public function transactions(): hasManyDeep { return $this->hasManyDeep(Transaction::class, [Booking::class], ['company_id', 'owner_id'], ['id', 'id']); } /** * @return HasMany */ public function issuerTransactions(): HasMany { return $this->HasMany(Transaction::class, 'issuer'); } /** * @return MorphMany */ public function wallets(): morphMany { return $this->morphMany(Wallet::class, 'owner'); } /** * @return Builder */ public function services(): Builder { if ($this->business_type === 3) { return ServiceType::where('status', ApprovalStatus::APPROVED)->whereHas('constants', function($query) { $query->where(function($query) { $query->where('reference', SegmentConstants::SERVICE_TYPE)->where('detail->is_active', true); })->orWhere(function($query) { $query->where('reference', SegmentConstants::CUSTOM_SERVICE_TYPE)->where('detail->is_active', true); }); }); } else { // Existing logic for other company types return ServiceType::where('status', ApprovalStatus::APPROVED)->whereHas('constants', function($query) { $query->Where(function($query){ $query->where('reference', SegmentConstants::SERVICE_TYPE)->where('detail->is_active', true); })->orWhere(function($query) { $query->where('reference', SegmentConstants::CUSTOM_SERVICE_TYPE)->where('detail->is_active', true)->whereIn('segment_id', $this->segments->pluck('id')); }); }); } } public function servicesConfigurations(): Collection { return $this->services()->get()->map(function($service) { return new ServiceConfigurationsObject($service, $service->constants->where('reference', SegmentConstants::SERVICE_TYPE)->first(), $service->constants->where('reference', SegmentConstants::CUSTOM_SERVICE_TYPE)->whereIn('segment_id', $this->segments->pluck('id'))); }); } }