Spaces:
No application file
No application file
declare(strict_types=1); | |
namespace Mautic\PointBundle\Model; | |
use Mautic\CoreBundle\Model\FormModel as CommonFormModel; | |
use Mautic\LeadBundle\Entity\Lead; | |
use Mautic\PointBundle\Entity\Group; | |
use Mautic\PointBundle\Entity\GroupContactScore; | |
use Mautic\PointBundle\Entity\GroupRepository; | |
use Mautic\PointBundle\Event as Events; | |
use Mautic\PointBundle\Form\Type\GroupType; | |
use Mautic\PointBundle\PointGroupEvents; | |
use Symfony\Component\Form\FormFactory; | |
use Symfony\Component\Form\FormInterface; | |
use Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException; | |
use Symfony\Contracts\EventDispatcher\Event; | |
/** | |
* @extends CommonFormModel<Group> | |
*/ | |
class PointGroupModel extends CommonFormModel | |
{ | |
public function getRepository(): GroupRepository | |
{ | |
return $this->em->getRepository(Group::class); | |
} | |
public function getPermissionBase(): string | |
{ | |
return 'point:groups'; | |
} | |
/** | |
* @param object $entity | |
* @param FormFactory $formFactory | |
* @param string|null $action | |
* @param array<string,string> $options | |
* | |
* @throws MethodNotAllowedHttpException | |
*/ | |
public function createForm($entity, $formFactory, $action = null, $options = []): FormInterface | |
{ | |
if (!$entity instanceof Group) { | |
throw new MethodNotAllowedHttpException(['Group']); | |
} | |
if (!empty($action)) { | |
$options['action'] = $action; | |
} | |
return $formFactory->create(GroupType::class, $entity, $options); | |
} | |
/** | |
* Get a specific entity or generate a new one if id is empty. | |
* | |
* @param int $id | |
*/ | |
public function getEntity($id = null): ?Group | |
{ | |
if (null === $id) { | |
return new Group(); | |
} | |
return parent::getEntity($id); | |
} | |
/** | |
* @throws MethodNotAllowedHttpException | |
*/ | |
protected function dispatchEvent($action, &$entity, $isNew = false, Event $event = null): ?Event | |
{ | |
if (!$entity instanceof Group) { | |
throw new MethodNotAllowedHttpException(['Group']); | |
} | |
switch ($action) { | |
case 'pre_save': | |
$name = PointGroupEvents::GROUP_PRE_SAVE; | |
break; | |
case 'post_save': | |
$name = PointGroupEvents::GROUP_POST_SAVE; | |
break; | |
case 'pre_delete': | |
$name = PointGroupEvents::GROUP_PRE_DELETE; | |
break; | |
case 'post_delete': | |
$name = PointGroupEvents::GROUP_POST_DELETE; | |
break; | |
default: | |
return null; | |
} | |
if ($this->dispatcher->hasListeners($name)) { | |
if (empty($event)) { | |
$event = new Events\GroupEvent($entity); | |
} | |
$this->dispatcher->dispatch($event, $name); | |
return $event; | |
} | |
return null; | |
} | |
public function adjustPoints(Lead $contact, Group $group, int $points, string $operator = Lead::POINTS_ADD): Lead | |
{ | |
$contactScore = $contact->getGroupScore($group); | |
if (empty($contactScore)) { | |
$contactScore = new GroupContactScore(); | |
$contactScore->setContact($contact); | |
$contactScore->setGroup($group); | |
$contactScore->setScore(0); | |
$contact->addGroupScore($contactScore); | |
} | |
$oldScore = $contactScore->getScore(); | |
$newScore = $oldScore; | |
match ($operator) { | |
Lead::POINTS_ADD => $newScore += $points, | |
Lead::POINTS_SUBTRACT => $newScore -= $points, | |
Lead::POINTS_MULTIPLY => $newScore *= $points, | |
Lead::POINTS_DIVIDE => $newScore /= $points, | |
Lead::POINTS_SET => $newScore = $points, | |
default => throw new \UnexpectedValueException('Invalid operator'), | |
}; | |
$contactScore->setScore($newScore); | |
$this->em->persist($contactScore); | |
$this->em->flush(); | |
$scoreChangeEvent = new Events\GroupScoreChangeEvent($contactScore, $oldScore, $newScore); | |
$this->dispatcher->dispatch($scoreChangeEvent, PointGroupEvents::SCORE_CHANGE); | |
return $contact; | |
} | |
public static function isAllowedPointOperation(string $operator): bool | |
{ | |
return in_array($operator, [Lead::POINTS_ADD, Lead::POINTS_SUBTRACT, Lead::POINTS_MULTIPLY, Lead::POINTS_DIVIDE, Lead::POINTS_SET]); | |
} | |
} | |