/** * Пересчитываем итоговую сумму платежа по всем билетам * с учетом скидки * * @param Payment $payment * @param Event $event */ public function checkTicketsPricesInPayment($payment, $event) { // Вытягиваем скидку из конфига $paymentsConfig = $this->container->getParameter('stfalcon_event.config'); $discount = (double) $paymentsConfig['discount']; $eventCost = $event->getCost(); /** @var Ticket $ticket */ foreach ($payment->getTickets() as $ticket) { // получаем оплаченые платежи пользователя $paidPayments = $this->repository->findPaidPaymentsForUser($ticket->getUser()); //правильно ли установлен флаг наличия скидки // @todo с расчетом скидки у нас явно проблемы. ниже почти такой же код идет. плюс ещё в нескольких // местах по коду делаем подобные расчеты. плюс в самой модели билета есть логика расчета цены со скидкой... $isCorrectDiscount = $ticket->getHasDiscount() == (count($paidPayments) > 0 && $event->getUseDiscounts() || $ticket->hasPromoCode()); // если цена билета без скидки не ровна новой цене на ивент // или неверно указан флаг наличия скидки if ($ticket->getAmountWithoutDiscount() != $eventCost || !$isCorrectDiscount) { // если не правильно установлен флаг наличия скидки, тогда устанавливаем его заново if (!$isCorrectDiscount) { // @todo для реализации возможности отключения скидки постоянных участников мне пришлось // использовать метод $event->getUseDiscounts() в трех разных местах. а нужно, чтобы // это можно было сделать в одном месте $ticket->setHasDiscount(count($paidPayments) > 0 && $event->getUseDiscounts() || $ticket->hasPromoCode()); } $ticket->setAmountWithoutDiscount($eventCost); if ($ticket->getHasDiscount()) { $ticket->setAmountWithDiscount($discount); } else { $ticket->setAmount($eventCost); } $this->entityManager->merge($ticket); } } $payment->recalculateAmount(); //set base price $payment->setBaseAmount($payment->getAmount()); $this->entityManager->merge($payment); $this->flush(); }
/** * @param \Doctrine\Common\Persistence\ObjectManager $manager */ public function load(ObjectManager $manager) { /** @var User $userDefault */ $userDefault = $manager->merge($this->getReference('user-default')); $payment = new Payment(); $payment->setUser($userDefault); $payment->setAmount(0); $payment->setBaseAmount(0); $payment->setStatus(Payment::STATUS_PAID); $manager->persist($payment); $this->addReference('payment', $payment); $payment = new Payment(); $payment->setUser($userDefault); $payment->setAmount(0); $payment->setBaseAmount(0); $payment->setStatus(Payment::STATUS_PENDING); $manager->persist($payment); $this->addReference('pending', $payment); /** @var User $userDefault2 */ $userDefault2 = $manager->merge($this->getReference('user-default2')); $payment = new Payment(); $payment->setUser($userDefault2); $payment->setAmount(0); $payment->setBaseAmount(0); $payment->setStatus(Payment::STATUS_PAID); $manager->persist($payment); $this->addReference('payment2', $payment); $payment = new Payment(); $payment->setUser($userDefault2); $payment->setAmount(0); $payment->setBaseAmount(0); $payment->setStatus(Payment::STATUS_PENDING); $manager->persist($payment); $this->addReference('pending2', $payment); $manager->flush(); }