reception_score ?? 0); $tone = (int) ($assessment->tone_score ?? 0); $cooperation = (int) ($assessment->cooperation_score ?? 0); $profileCompletion = $company ? (int) $company->profile_completion : 0; $decisionBonus = $assessment->decision_maker_reached ? 20 : 0; $score = ($reception * 0.25) + ($tone * 0.20) + ($cooperation * 0.35) + $decisionBonus + ($profileCompletion * 0.20); return round(min(100, max(0, $score)), 2); } public function applyScore(CrmPhoneFollowUp $phone, float $score, ?CrmCompany $company = null): void { $phone->update(['lead_score' => $score]); if ($company) { $company->update(['lead_score' => $score]); } } public function handleFlags(CrmCallAssessment $assessment, CrmPhoneFollowUp $phone): void { if ($assessment->sentiment === 'hostile') { $phone->update(['block_auto_recall' => true]); } if ($assessment->gatekeeper_blocked) { $count = CrmCallAssessment::where('phone_follow_up_id', $phone->id) ->where('gatekeeper_blocked', true) ->count(); if ($count >= 3) { // flagged for supervisor review via notes } } } }