*/ 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 $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]); } }