seed(RoleSeeder::class); $this->org = Organisation::factory()->create(); $this->event = Event::factory()->create(['organisation_id' => $this->org->id]); $this->artist = Artist::factory()->create(['organisation_id' => $this->org->id]); } private function compute(array $attrs): array { $eng = ArtistEngagement::factory()->create(array_merge([ 'artist_id' => $this->artist->id, 'event_id' => $this->event->id, ], $attrs)); $req = Request::create('/'); $payload = (new ArtistEngagementResource($eng))->toArray($req); return $payload['computed']; } public function test_organisation_handles_buma_includes_buma_in_vat_grondslag(): void { $c = $this->compute([ 'fee_amount' => 1000.00, 'buma_applicable' => true, 'buma_percentage' => 7.00, 'buma_handled_by' => BumaHandledBy::Organisation, 'vat_applicable' => true, 'vat_percentage' => 21.00, 'deal_breakdown' => [], ]); $this->assertSame(70.0, $c['buma_amount']); $this->assertSame(1070.0, $c['vat_grondslag']); $this->assertSame(224.7, $c['vat_amount']); $this->assertSame(1294.7, $c['total_cost']); } public function test_booking_agency_handles_buma_excludes_from_vat_grondslag(): void { $c = $this->compute([ 'fee_amount' => 1000.00, 'buma_applicable' => true, 'buma_percentage' => 7.00, 'buma_handled_by' => BumaHandledBy::BookingAgency, 'vat_applicable' => true, 'vat_percentage' => 21.00, 'deal_breakdown' => [], ]); $this->assertSame(0.0, $c['buma_amount']); $this->assertSame(1000.0, $c['vat_grondslag']); $this->assertSame(210.0, $c['vat_amount']); $this->assertSame(1210.0, $c['total_cost']); } public function test_not_applicable_buma_yields_zero_buma(): void { $c = $this->compute([ 'fee_amount' => 1000.00, 'buma_applicable' => false, 'buma_percentage' => 7.00, 'buma_handled_by' => BumaHandledBy::NotApplicable, 'vat_applicable' => true, 'vat_percentage' => 21.00, 'deal_breakdown' => [], ]); $this->assertSame(0.0, $c['buma_amount']); $this->assertSame(1000.0, $c['vat_grondslag']); } public function test_vat_disabled_yields_zero_vat(): void { $c = $this->compute([ 'fee_amount' => 1000.00, 'buma_applicable' => true, 'buma_percentage' => 7.00, 'buma_handled_by' => BumaHandledBy::Organisation, 'vat_applicable' => false, 'vat_percentage' => 21.00, 'deal_breakdown' => [], ]); $this->assertSame(70.0, $c['buma_amount']); $this->assertSame(0.0, $c['vat_amount']); } public function test_breakdown_summed_into_total_cost(): void { $c = $this->compute([ 'fee_amount' => 500.00, 'buma_applicable' => false, 'buma_handled_by' => BumaHandledBy::NotApplicable, 'vat_applicable' => false, 'deal_breakdown' => [ ['label' => 'Hospitality', 'amount' => 50.00], ['label' => 'Hotel', 'amount' => 120.00], ], ]); $this->assertSame(170.0, $c['breakdown_total']); $this->assertSame(670.0, $c['total_cost']); } public function test_zero_fee_yields_zero_components(): void { $c = $this->compute([ 'fee_amount' => 0, 'buma_applicable' => true, 'buma_percentage' => 7.00, 'buma_handled_by' => BumaHandledBy::Organisation, 'vat_applicable' => true, 'vat_percentage' => 21.00, 'deal_breakdown' => [], ]); $this->assertSame(0.0, $c['buma_amount']); $this->assertSame(0.0, $c['vat_amount']); $this->assertSame(0.0, $c['total_cost']); } }