50 lines
1.6 KiB
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
|
|
}
|
|
}
|
|
}
|
|
}
|