Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
14 / 14
100.00% covered (success)
100.00%
1 / 1
CRAP
100.00% covered (success)
100.00%
1 / 1
MarkCommissionPaidAction
100.00% covered (success)
100.00%
14 / 14
100.00% covered (success)
100.00%
1 / 1
3
100.00% covered (success)
100.00%
1 / 1
 execute
100.00% covered (success)
100.00%
14 / 14
100.00% covered (success)
100.00%
1 / 1
3
1<?php
2
3declare(strict_types=1);
4
5namespace ImovelZapAi\Financial\Application\Actions;
6
7use Illuminate\Support\Facades\DB;
8use ImovelZapAi\Financial\Domain\Enums\CommissionStatus;
9use ImovelZapAi\Financial\Domain\Enums\SplitStatus;
10use ImovelZapAi\Financial\Domain\Events\CommissionPaid;
11use ImovelZapAi\Financial\Domain\Exceptions\FinancialException;
12use ImovelZapAi\Financial\Infrastructure\Persistence\Eloquent\FinancialCommissionModel;
13
14final class MarkCommissionPaidAction
15{
16    public function execute(string $tenantId, string $commissionId): FinancialCommissionModel
17    {
18        return DB::transaction(function () use ($tenantId, $commissionId): FinancialCommissionModel {
19            $commission = FinancialCommissionModel::query()
20                ->where('tenant_id', $tenantId)
21                ->with('splits')
22                ->find($commissionId);
23
24            if ($commission === null) {
25                throw FinancialException::notFound('Comissão');
26            }
27
28            if ($commission->status === CommissionStatus::Cancelled) {
29                throw FinancialException::invalidState('comissão cancelada');
30            }
31
32            $commission->update(['status' => CommissionStatus::Paid]);
33            $commission->splits()->update(['status' => SplitStatus::Paid]);
34
35            CommissionPaid::dispatch($tenantId, (string) $commission->id);
36
37            return $commission->fresh('splits');
38        });
39    }
40}