src/Entity/Sales/AccountEnrollment.php line 23

Open in your IDE?
  1. <?php
  2. /**
  3.  * Created by simpson <simpsonwork@gmail.com>
  4.  * Date: 2019-06-27
  5.  * Time: 11:00
  6.  */
  7. namespace App\Entity\Sales;
  8. use App\Entity\User;
  9. use App\Repository\AccountEnrollmentRepository;
  10. use App\Security\TeamMateView;
  11. use BigIdea\IdentityBundle\Entity\TeamMate;
  12. use Doctrine\ORM\Mapping as ORM;
  13. use Money\Currency;
  14. use Money\Money;
  15. /**
  16.  * Пополнение счета аккаунта (погашение купленных кодов)
  17.  */
  18. #[ORM\Table(name'account_enrollments')]
  19. #[ORM\Entity(repositoryClassAccountEnrollmentRepository::class)]
  20. class AccountEnrollment
  21. {
  22.     #[ORM\Id]
  23.     #[ORM\Column(name'id'type'integer')]
  24.     #[ORM\GeneratedValue(strategy'AUTO')]
  25.     protected int $id;
  26.     #[ORM\JoinColumn(name'account_id'referencedColumnName'id')]
  27.     #[ORM\ManyToOne(targetEntityUser::class, inversedBy'enrollments')]
  28.     protected User $account;
  29.     /**
  30.      * Аккаунт оператора, совершившего начисление вручную
  31.      */
  32.     #[ORM\JoinColumn(name'staff_account_id'referencedColumnName'id')]
  33.     #[ORM\ManyToOne(targetEntityTeamMate::class)]
  34.     protected ?TeamMate $enrolledBy;
  35.     #[ORM\Column(name'operation_id'type'string'length64nullabletrue)]
  36.     protected ?string $operationId;
  37.     #[ORM\JoinColumn(name'payment_product_id'referencedColumnName'id')]
  38.     #[ORM\ManyToOne(targetEntityPaymentProduct::class)]
  39.     protected ?PaymentProduct $paidProduct;
  40.     /**
  41.      * Фактическая сумма платежа
  42.      */
  43.     #[ORM\Column(name'paid_amount'type'integer')]
  44.     protected string $paidAmount;
  45.     /**
  46.      * Начисленная на счет юзера сумма (вместе с бонусной частью)
  47.      */
  48.     #[ORM\Column(name'enrolled_amount'type'integer')]
  49.     protected string $enrolledAmount;
  50.     #[ORM\Column(name'currency'type'string'length3)]
  51.     protected string $currency;
  52.     #[ORM\Column(name'date'type'datetimetz_immutable')]
  53.     protected \DateTimeImmutable $date;
  54.     #[ORM\Column(name'redeemed_token'type'string'length64nullabletrue)]
  55.     protected ?string $redeemedToken;
  56.     #[ORM\OneToOne(targetEntityAccountTransaction::class, mappedBy'enrollment'cascade: ['all'])]
  57.     protected AccountTransaction $transaction;
  58.     #[ORM\Column(type'json'nullabletrue)]
  59.     protected ?array $params null;
  60.     public static function enrollPaidValueByStaff(TeamMate $staffUser $accountMoney $enrolledMoney\DateTimeImmutable $date): self
  61.     {
  62.         $enrollment = new static($account$enrolledMoney$enrolledMoney$date);
  63.         $enrollment->enrolledBy $staff;
  64.         return $enrollment;
  65.     }
  66.     /**
  67.      * Начисление компенсаций и вознаграждений админами (без реального платежа)
  68.      */
  69.     public static function enrollBonusValueByStaff(TeamMate $staffUser $accountMoney $enrolledMoney\DateTimeImmutable $date): self
  70.     {
  71.         $enrollment = new static($accountnull$enrolledMoney$date);
  72.         $enrollment->enrolledBy $staff;
  73.         return $enrollment;
  74.     }
  75.     public static function enrollPaidValue(User $accountMoney $paidValueMoney $enrolledMoney\DateTimeImmutable $datestring $operationId): self
  76.     {
  77.         $enrollment = new static($account$paidValue$enrolledMoney$date);
  78.         $enrollment->operationId $operationId;
  79.         return $enrollment;
  80.     }
  81.     public static function enrollWithPrepaidToken(PaymentProduct $paymentProductUser $accountMoney $paidMoneyMoney $enrolledMoney\DateTimeImmutable $datestring $operationIdstring $redeemedToken, ?TeamMate $staffAccount null): self
  82.     {
  83.         $enrollment = new static($account$paidMoney$enrolledMoney$date);
  84.         $enrollment->paidProduct $paymentProduct;
  85.         $enrollment->operationId $operationId;
  86.         $enrollment->redeemedToken $redeemedToken;
  87.         $enrollment->enrolledBy $staffAccount;
  88.         return $enrollment;
  89.     }
  90.     /**
  91.      * Начисление бонуса по промо-коду (без реального платежа)
  92.      */
  93.     public static function enrollWithCustomToken(User $accountMoney $enrolledMoney\DateTimeImmutable $datestring $redeemedToken, ?array  $params): self
  94.     {
  95.         $enrollment = new static($accountnull$enrolledMoney$date);
  96.         $enrollment->redeemedToken $redeemedToken;
  97.         $enrollment->params $params;
  98.         return $enrollment;
  99.     }
  100.     protected function __construct(User $account, ?Money $paidMoneyMoney $enrolledMoney\DateTimeImmutable $date)
  101.     {
  102.         if (null !== $paidMoney && !$enrolledMoney->isSameCurrency($paidMoney)) {
  103.             throw new \LogicException('Currency mismatch between paid and enrolled amounts.');
  104.         }
  105.         $this->account $account;
  106.         $this->paidAmount $paidMoney?->getAmount() ?: '0';
  107.         $this->enrolledAmount $enrolledMoney->getAmount();
  108.         $this->currency $enrolledMoney->getCurrency()->getCode();
  109.         $this->date $date;
  110.         $this->transaction AccountTransaction::fromEnrollment($this);
  111.     }
  112.     public function getId(): int
  113.     {
  114.         return $this->id;
  115.     }
  116.     public function getEnrolledBy(): ?TeamMate
  117.     {
  118.         return $this->enrolledBy;
  119.     }
  120.     public function getEnrolledByDescription(): ?string
  121.     {
  122.         if (null !== $this->enrolledBy) {
  123.             return TeamMateView::email($this->enrolledBy);
  124.         }
  125.         if (null !== $this->paidProduct) {
  126.             return 'Digiseller';
  127.         }
  128.         if ($this->paidAmount 0) {
  129.             return 'BetaTransfer';
  130.         }
  131.         if (null !== $this->redeemedToken) {
  132.             return 'Bonus';
  133.         }
  134.         return null;
  135.     }
  136.     public function getAccount(): User
  137.     {
  138.         return $this->account;
  139.     }
  140.     public function getOperationId(): ?string
  141.     {
  142.         return $this->operationId;
  143.     }
  144.     public function getPaidProduct(): ?PaymentProduct
  145.     {
  146.         return $this->paidProduct;
  147.     }
  148.     public function getPaidMoney(): Money
  149.     {
  150.         return new Money($this->paidAmount, new Currency($this->currency));
  151.     }
  152.     public function getEnrolledMoney(): Money
  153.     {
  154.         return new Money($this->enrolledAmount, new Currency($this->currency));
  155.     }
  156.     public function getDate(): \DateTimeImmutable
  157.     {
  158.         return $this->date;
  159.     }
  160.     public function getRedeemedToken(): ?string
  161.     {
  162.         return $this->redeemedToken;
  163.     }
  164.     public function getTransaction(): AccountTransaction
  165.     {
  166.         return $this->transaction;
  167.     }
  168.     public function getParams(): ?array
  169.     {
  170.         return $this->params;
  171.     }
  172. }