src/Entity/Sales/AccountEnrollment.php line 22

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