src/Entity/Donation.php line 15

Open in your IDE?
  1. <?php
  2. namespace App\Entity;
  3. use App\Entity\Enum\DonationStatus;
  4. use App\Entity\Enum\TransactionStatus;
  5. use App\Entity\Traits\Identifiable;
  6. use App\Entity\Traits\Timestampable;
  7. use App\Repository\DonationRepository;
  8. use Doctrine\Common\Collections\ArrayCollection;
  9. use Doctrine\Common\Collections\Collection;
  10. use Doctrine\ORM\Mapping as ORM;
  11. #[ORM\Entity(repositoryClassDonationRepository::class)]
  12. class Donation
  13. {
  14.     use Identifiable;
  15.     use Timestampable;
  16.     #[ORM\ManyToOne(inversedBy'donations')]
  17.     private ?Person $person null;
  18.     #[ORM\ManyToOne(inversedBy'donations')]
  19.     private ?LegalPerson $legalPerson null;
  20.     #[ORM\Column]
  21.     private ?float $amount 0;
  22.     #[ORM\Column]
  23.     private ?float $amountPayed 0;
  24.     #[ORM\ManyToOne(inversedBy'donations')]
  25.     private ?Section $section null;
  26.     #[ORM\ManyToOne(inversedBy'donations')]
  27.     private ?Project $project null;
  28.     #[ORM\OneToMany(mappedBy'donation'targetEntityBenefactorTransaction::class, cascade: ['persist''remove'])]
  29.     private Collection $transactions;
  30.     #[ORM\Column(type'string'length20enumTypeDonationStatus::class)]
  31.     private ?DonationStatus $status DonationStatus::Prospect;
  32.     public function __construct()
  33.     {
  34.         $this->transactions = new ArrayCollection();
  35.     }
  36.     public function getPerson(): ?Person
  37.     {
  38.         return $this->person;
  39.     }
  40.     public function setPerson(?Person $person): self
  41.     {
  42.         $this->person $person;
  43.         return $this;
  44.     }
  45.     public function getLegalPerson(): ?LegalPerson
  46.     {
  47.         return $this->legalPerson;
  48.     }
  49.     public function setLegalPerson(?LegalPerson $legalPerson): self
  50.     {
  51.         $this->legalPerson $legalPerson;
  52.         return $this;
  53.     }
  54.     public function getAmount(): ?float
  55.     {
  56.         return $this->amount;
  57.     }
  58.     public function setAmount(float $amount): self
  59.     {
  60.         $this->amount $amount;
  61.         return $this;
  62.     }
  63.     public function getAmountPayed(): ?float
  64.     {
  65.         return $this->amountPayed;
  66.     }
  67.     public function setAmountPayed(float $amountPayed): self
  68.     {
  69.         $this->amountPayed $amountPayed;
  70.         return $this;
  71.     }
  72.     public function getRemainingAmount(): float
  73.     {
  74.         $amount $this->getAmount();
  75.         $statuses = [TransactionStatus::WaitingTransactionStatus::Successful];
  76.         foreach ($this->getTransactions(statuses$statuses) as $transaction) {
  77.             if ($transaction->getStatus() === TransactionStatus::Successful) {
  78.                 $amount -= $transaction->getAmountPayed();
  79.             }
  80.         }
  81.         return $amount;
  82.     }
  83.     public function getSection(): ?Section
  84.     {
  85.         return $this->section;
  86.     }
  87.     public function setSection(?Section $section): self
  88.     {
  89.         $this->section $section;
  90.         return $this;
  91.     }
  92.     public function getProject(): ?Project
  93.     {
  94.         return $this->project;
  95.     }
  96.     public function setProject(?Project $project): self
  97.     {
  98.         $this->project $project;
  99.         return $this;
  100.     }
  101.     /**
  102.      * @return Collection<int, BenefactorTransaction>
  103.      */
  104.     public function getTransactions(?string $type null, array|TransactionStatus $statuses null): Collection
  105.     {
  106.         $transactions $this->transactions;
  107.         if ($type) {
  108.             $transactions $transactions->filter(fn(BenefactorTransaction $t) => ($t instanceof $type));
  109.         }
  110.         if ($statuses) {
  111.             if (!is_array($statuses)) {
  112.                 $statuses = [$statuses];
  113.             }
  114.             $transactions $transactions->filter(
  115.                 fn(BenefactorTransaction $t) => (in_array($t->getStatus(), $statusestrue))
  116.             );
  117.         }
  118.         return $transactions;
  119.     }
  120.     public function addTransaction(BenefactorTransaction $transaction): self
  121.     {
  122.         if (!$this->transactions->contains($transaction)) {
  123.             $this->transactions->add($transaction);
  124.             $transaction->setDonation($this);
  125.         }
  126.         return $this;
  127.     }
  128.     public function removeTransaction(BenefactorTransaction $transaction): self
  129.     {
  130.         if ($this->transactions->removeElement($transaction)) {
  131.             // set the owning side to null (unless already changed)
  132.             if ($transaction->getDonation() === $this) {
  133.                 $transaction->setDonation(null);
  134.             }
  135.         }
  136.         return $this;
  137.     }
  138.     public function hasSuccessfulTransaction(?array $types = []): bool
  139.     {
  140.         $transactions $this->getTransactions()
  141.             ->filter(fn(BenefactorTransaction $t) => $t->getStatus() === TransactionStatus::Successful);
  142.         if (count($types) > 0) {
  143.             $transactions $transactions->filter(fn(BenefactorTransaction $t) => in_array(get_class($t), $typestrue)
  144.             );
  145.         }
  146.         return $transactions->count() > 0;
  147.     }
  148.     public function getStatus(): ?DonationStatus
  149.     {
  150.         return $this->status;
  151.     }
  152.     public function setStatus(DonationStatus $status): self
  153.     {
  154.         $this->status $status;
  155.         return $this;
  156.     }
  157.     public function guessPaymentType(): ?string
  158.     {
  159.         $foundTransaction null;
  160.         foreach ($this->getTransactions() as $transaction) {
  161.             if (null === $foundTransaction || $transaction->getStatus() === TransactionStatus::Successful) {
  162.                 $foundTransaction $transaction;
  163.             }
  164.         }
  165.         if ($foundTransaction) {
  166.             $type array_flip(BenefactorTransaction::TYPE_CLASSES)[$foundTransaction::class];
  167.             return BenefactorTransaction::TYPE_NAMES[$type];
  168.         }
  169.         return null;
  170.     }
  171. }