ultimatepos/Modules/Crm/Services/LeadScoringService.php

50 lines
1.6 KiB
PHP

<?php
namespace Modules\Crm\Services;
use Modules\Crm\Entities\CrmCallAssessment;
use Modules\Crm\Entities\CrmCompany;
use Modules\Crm\Entities\CrmPhoneFollowUp;
class LeadScoringService
{
public function calculateFromAssessment(CrmCallAssessment $assessment, ?CrmCompany $company = null): float
{
$reception = (int) ($assessment->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
}
}
}
}