diff --git a/src/ApiResource/Project/SupportApiResource.php b/src/ApiResource/Project/SupportApiResource.php index 36baf00..928d10b 100644 --- a/src/ApiResource/Project/SupportApiResource.php +++ b/src/ApiResource/Project/SupportApiResource.php @@ -2,6 +2,7 @@ namespace App\ApiResource\Project; +use ApiPlatform\Doctrine\Orm\Filter\BooleanFilter; use ApiPlatform\Doctrine\Orm\Filter\SearchFilter; use ApiPlatform\Doctrine\Orm\State\Options; use ApiPlatform\Metadata as API; @@ -72,6 +73,7 @@ class SupportApiResource */ #[Assert\NotNull()] #[Assert\Type('bool')] + #[API\ApiFilter(BooleanFilter::class)] public bool $anonymous = true; /** diff --git a/src/Benzina/CheckoutsPump.php b/src/Benzina/CheckoutsPump.php index 4cfcf22..d10ce7e 100644 --- a/src/Benzina/CheckoutsPump.php +++ b/src/Benzina/CheckoutsPump.php @@ -8,6 +8,7 @@ use App\Entity\Gateway\Charge; use App\Entity\Gateway\Checkout; use App\Entity\Gateway\Tracking; use App\Entity\Project\Project; +use App\Entity\Project\Support; use App\Entity\Tipjar; use App\Entity\User\User; use App\Gateway\ChargeStatus; @@ -20,6 +21,7 @@ use App\Gateway\Paypal\PaypalGateway; use App\Gateway\Stripe\StripeGateway; use App\Gateway\Wallet\WalletGateway; use App\Repository\Project\ProjectRepository; +use App\Repository\Project\SupportRepository; use App\Repository\TipjarRepository; use App\Repository\User\UserRepository; use App\Service\Gateway\CheckoutService; @@ -30,6 +32,7 @@ use Goteo\Benzina\Pump\PumpInterface; class CheckoutsPump implements PumpInterface { use ArrayPumpTrait; + use DatabasePumpTrait; use DoctrinePumpTrait; use CheckoutsPumpTrait; @@ -51,6 +54,7 @@ class CheckoutsPump implements PumpInterface public function __construct( private UserRepository $userRepository, private ProjectRepository $projectRepository, + private SupportRepository $supportRepository, private TipjarRepository $tipjarRepository, private CheckoutService $checkoutService, ) {} @@ -145,6 +149,17 @@ class CheckoutsPump implements PumpInterface $charge->addTransaction($transaction); + if ($project) { + $support = $this->getSupport($charge); + $support->setProject($project); + $support->setOrigin($checkout->getOrigin()); + $support->addTransaction($transaction); + $support->setAnonymous($this->getSupportAnon($record, $support)); + $support->setMessage($this->getSupportMessage($record, $support, $context)); + + $this->entityManager->persist($support); + } + if ($charge->getStatus() !== ChargeStatus::Refunded) { continue; } @@ -175,6 +190,49 @@ class CheckoutsPump implements PumpInterface return $this->projectRepository->findOneBy(['migratedId' => $record['project']]); } + private function getSupport(Charge $charge): Support + { + $support = $this->supportRepository->findOneBy([ + 'origin' => $charge->getCheckout()->getOrigin()->getId(), + 'project' => $charge->getTarget()->getOwner()->getId(), + ]); + + if ($support) { + return $support; + } + + return new Support(); + } + + private function getSupportAnon(array $record, Support $support): bool + { + if ($record['anonymous'] === 1) { + return true; + } + + if ($support->isAnonymous()) { + return true; + } + + return false; + } + + private function getSupportMessage(array $record, Support $support, array $context): ?string + { + $message = $support->getMessage(); + $msg = $this->getInvestMsg($record, $context); + + if (!$msg || empty($msg['msg'])) { + return $message; + } + + if (!$message) { + return $msg['msg']; + } + + return \sprintf("\n***\n%s", $msg['msg']); + } + private function getPlatformTipjar(): Tipjar { $tipjar = $this->tipjarRepository->findOneBy(['name' => self::PLATFORM_TIPJAR_NAME]); @@ -192,6 +250,17 @@ class CheckoutsPump implements PumpInterface return $tipjar; } + private function getInvestMsg(array $record, array $context) + { + $query = $this->getDbConnection($context)->prepare( + 'SELECT * FROM `invest_msg` m WHERE m.invest = :invest' + ); + + $query->execute(['invest' => $record['id']]); + + return $query->fetch(\PDO::FETCH_ASSOC); + } + private function getChargeType(array $record): ChargeType { if (\in_array($record['method'], ['stripe_subscription'])) { diff --git a/src/Entity/Project/Support.php b/src/Entity/Project/Support.php index 6a7f414..0605984 100644 --- a/src/Entity/Project/Support.php +++ b/src/Entity/Project/Support.php @@ -9,6 +9,7 @@ use App\Repository\Project\SupportRepository; use AutoMapper\Attribute\MapProvider; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\Collection; +use Doctrine\DBAL\Types\Types; use Doctrine\ORM\Mapping as ORM; #[MapProvider(EntityMapProvider::class)] @@ -40,9 +41,9 @@ class Support private Collection $transactions; #[ORM\Column] - private ?bool $anonymous = null; + private bool $anonymous = false; - #[ORM\Column(length: 255, nullable: true)] + #[ORM\Column(type: Types::TEXT, nullable: true)] private ?string $message = null; public function __construct() @@ -103,7 +104,7 @@ class Support return $this; } - public function isAnonymous(): ?bool + public function isAnonymous(): bool { return $this->anonymous; }