whereNotNull('tbr_fixed_value') ->whereNotNull('unit_id') ->orderByDesc('created_at') ->get() ->unique('unit_id') ->values(); return $latestContracts->map(fn ($contract) => $this->buildPreview($contract)); } private function buildPreview(FranchiseeContract $contract): array { $tbrValue = (float) $contract->tbr_fixed_value; $contractMonth = $this->resolveContractMonth($contract); $isExempt = $contractMonth <= self::EXEMPT_MONTHS; $royaltiesValue = $isExempt ? 0.0 : round($tbrValue * (float) $contract->tbr_fixed_value_percentage, 2); $fnmValue = $isExempt ? 0.0 : round($tbrValue * (float) $contract->marketing_fund_percentage, 2); $maintenanceValue = round($tbrValue * self::MAINTENANCE_RATE, 2); return [ 'id' => $contract->unit_id, 'unit_name' => $contract->unit?->fantasy_name, 'tbr_value' => $tbrValue, 'royalties_value' => $royaltiesValue, 'royalties_rule' => 'Fixo TBR', 'fnm_value' => $fnmValue, 'fnm_rule' => 'Fixo TBR', 'maintenance_value' => $maintenanceValue, 'total' => round($royaltiesValue + $fnmValue + $maintenanceValue, 2), ]; } private function resolveContractMonth(FranchiseeContract $contract): int { $startDate = $contract->start_date ?? $contract->signature_date; if (!$startDate) { return 1; } return (int) $startDate->startOfMonth()->diffInMonths(now()->startOfMonth()) + 1; } }