Если комиссия каждого агента считается от исходной цены полиса, сложите проценты всей цепочки и вычтите эту долю. Если проценты берутся от остатка, формула будет другой.
Вычисление чистой прибыли с учётом комиссий агентов и их подчинённых
Если комиссия каждого агента считается от исходной цены полиса, сложите проценты всей цепочки и вычтите эту долю. Если проценты берутся от остатка, формула будет другой.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо реализовать метод getProfit(), который рассчитывает чистую прибыль компании после распределения процентов (комиссий) всем участникам цепочки агентов, включая их под‑агентов.
class Agent {
public $childAgent; // ссылка на под‑агента
public $commission; // процент комиссии агента
}
class Policy {
public $policyPrice; // стоимость полиса
public function getProfit(Agent $rootAgent) {
// реализация расчёта прибыли
}
}
Метод должен рекурсивно проходить по всем уровням вложенных агентов, вычитать из цены полиса их комиссии и вернуть оставшуюся часть как прибыль компании.
Ответ
Если комиссия каждого агента считается от исходной цены полиса, сложите проценты всей цепочки и вычтите эту долю. Если проценты берутся от остатка, формула будет другой.
При явно принятом первом варианте учебная реализация метода:
public function getProfit(Agent $rootAgent): float {
$sum = function (?Agent $agent) use (&$sum): float {
if ($agent === null) return 0;
if ($agent->commission < 0 || $agent->commission > 100) {
throw new InvalidArgumentException('Invalid commission');
}
return $agent->commission + $sum($agent->childAgent);
};
$percent = $sum($rootAgent);
if ($percent > 100) throw new InvalidArgumentException('Total exceeds 100%');
return $this->policyPrice * (1 - $percent / 100);
}
Предполагаются ациклическая цепочка, конечные проценты и неотрицательная цена. В реальной денежной системе нужны целые минимальные единицы, точные доли и согласованное округление, а не float.