Merge pull request #148 from goteo/feat/project-support-pumping
[feat] ProjectSupport pumping
This commit is contained in:
@@ -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;
|
||||
|
||||
/**
|
||||
|
||||
@@ -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'])) {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user