qualified_partners; $perPartner = (float) $incentive->amount_per_partner; $partnerAmount = round($partners * $perPartner, 2); $rankBonus = $participant->is_qualified ? $incentive->rankBonus($participant->rank) : 0.0; return [ 'partners' => $partners, 'per_partner' => $perPartner, 'partner_amount' => $partnerAmount, 'rank_bonus' => $rankBonus, 'total' => round($partnerAmount + $rankBonus, 2), 'confirmed' => $participant->accepted_terms_at !== null, ]; } /** * Auszahlungszeilen: Teilnehmer mit bestaetigter Teilnahme und Praemie > 0, nach Rang. * * @return Collection */ public function rows(Incentive $incentive): Collection { return IncentiveParticipant::query() ->where('incentive_id', $incentive->id) ->with('user', 'user.account') ->orderByRankNullsLast() ->orderByDesc('qualified_partners') ->get() ->map(fn (IncentiveParticipant $participant) => [ 'participant' => $participant, 'payout' => $this->forParticipant($incentive, $participant), ]) ->filter(fn (array $row) => $row['payout']['confirmed'] && $row['payout']['total'] > 0) ->values(); } /** * Summen ueber alle Auszahlungszeilen. * * @param Collection $rows * @return array{recipients: int, partners: int, partner_amount: float, rank_bonus: float, total: float} */ public function totals(Collection $rows): array { return [ 'recipients' => $rows->count(), 'partners' => (int) $rows->sum(fn (array $row) => $row['payout']['partners']), 'partner_amount' => round((float) $rows->sum(fn (array $row) => $row['payout']['partner_amount']), 2), 'rank_bonus' => round((float) $rows->sum(fn (array $row) => $row['payout']['rank_bonus']), 2), 'total' => round((float) $rows->sum(fn (array $row) => $row['payout']['total']), 2), ]; } /** * Spaltenueberschriften des XLSX-Exports. * * @return list */ public function exportHeaders(): array { return [ __('incentive.rank'), __('incentive.export_user_id'), __('incentive.consultant'), 'E-Mail', __('incentive.admin_terms_accepted'), __('incentive.partners'), __('incentive.amount_per_partner'), __('incentive.payout_partner_amount'), __('incentive.payout_rank_bonus'), __('incentive.payout_total'), __('incentive.total_points'), __('incentive.qualified'), ]; } /** * Zeilen des XLSX-Exports (Betraege als Zahlen, damit Excel summieren kann). * * @return list> */ public function exportRows(Incentive $incentive): array { return $this->rows($incentive)->map(function (array $row) { $participant = $row['participant']; $payout = $row['payout']; $user = $participant->user; $name = $user?->account ? trim($user->account->first_name.' '.$user->account->last_name) : ($user?->getFullName() ?: ''); return [ $participant->rank ?? '', (int) $participant->user_id, $name, (string) ($user?->email ?? ''), $participant->accepted_terms_at ? $participant->accepted_terms_at->format('d.m.Y H:i') : __('incentive.admin_terms_pending'), $payout['partners'], $payout['per_partner'], $payout['partner_amount'], $payout['rank_bonus'], $payout['total'], (int) $participant->total_points, $participant->is_qualified ? __('incentive.yes') : __('incentive.no'), ]; })->all(); } public static function formatAmount(float $amount): string { return number_format($amount, 2, ',', '.').' €'; } }