src/AtechNet/CoreBundle/Entity/PaymentData.php line 27

Open in your IDE?
  1. <?php
  2. namespace App\AtechNet\CoreBundle\Entity;
  3. use App\AtechNet\CoreBundle\DTO\Camt052\Camt052Message;
  4. use App\AtechNet\CoreBundle\Enum\PaymentSource;
  5. use App\AtechNet\CoreBundle\Enum\PaymentSubSource;
  6. use App\AtechNet\CoreBundle\ValueObject\PaymentIban;
  7. use DateTimeImmutable;
  8. use Doctrine\Common\Collections\ArrayCollection;
  9. use Doctrine\ORM\Mapping\Column;
  10. use Doctrine\ORM\Mapping\Entity;
  11. use Doctrine\ORM\Mapping\HasLifecycleCallbacks;
  12. use Doctrine\ORM\Mapping\JoinColumn;
  13. use Doctrine\ORM\Mapping\ManyToOne;
  14. use Doctrine\ORM\Mapping\OneToMany;
  15. use Doctrine\ORM\Mapping\OrderBy;
  16. use Doctrine\ORM\Mapping\Table as Table;
  17. /**
  18.  * PaymentData
  19.  *
  20.  * @Table(name="payment_data")
  21.  * @Entity(repositoryClass="App\AtechNet\CoreBundle\Repository\PaymentDataRepository")
  22.  * @HasLifecycleCallbacks
  23.  */
  24. class PaymentData extends AbstractSignedEntity
  25. {
  26.     public const TYPE_IN = 1;
  27.     public const TYPE_OUT = 2;
  28.     public const DOCUMENT_TYPE_CENTRALIS = 1;
  29.     public const DOCUMENT_TYPE_BILLINGO = 2;
  30.     public const IMPORT_TYPE_ALL = 1;
  31.     public const IMPORT_TYPE_BANK = 2;
  32.     public const IMPORT_TYPE_GLS = 3;
  33.     /**
  34.      * @return string[]
  35.      */
  36.     public static function getSourceTypes(): array
  37.     {
  38.         return PaymentSource::getSourceTypes();
  39.     }
  40.     public function getSubSourceType(): ?string
  41.     {
  42.         $allSubSourceTypes = PaymentSource::from($this->source)->getSubSourceTypes();
  43.         return $allSubSourceTypes[$this->subSource];
  44.     }
  45.     /**
  46.      * @return array
  47.      */
  48.     public static function getTypes(): array
  49.     {
  50.         return [
  51.             self::TYPE_IN => 'IN',
  52.             self::TYPE_OUT => 'OUT',
  53.         ];
  54.     }
  55.     /**
  56.      * @return array
  57.      */
  58.     public static function getImportTypes(): array
  59.     {
  60.         return [
  61.             self::IMPORT_TYPE_ALL,
  62.             self::IMPORT_TYPE_BANK,
  63.             self::IMPORT_TYPE_GLS,
  64.         ];
  65.     }
  66.     /**
  67.      * @return array
  68.      */
  69.     public static function getDocumentTypes(): array
  70.     {
  71.         return [
  72.             self::DOCUMENT_TYPE_CENTRALIS,
  73.             self::DOCUMENT_TYPE_BILLINGO,
  74.         ];
  75.     }
  76.     /**
  77.      * @var string
  78.      *
  79.      * @Column(name="transaction_id", type="string", length=128, nullable=true)
  80.      */
  81.     private $transId;
  82.     /**
  83.      * @var int
  84.      *
  85.      * @Column(name="source", type="integer")
  86.      */
  87.     private $source;
  88.     /**
  89.      * @var int
  90.      *
  91.      * @Column(name="sub_source", type="integer", nullable=true)
  92.      */
  93.     private $subSource;
  94.     /**
  95.      * @var string
  96.      *
  97.      * @Column(name="bank_transaction_id", type="string", nullable=true)
  98.      */
  99.     private $bankTransactionId;
  100.     /**
  101.      * @var int
  102.      *
  103.      * @Column(name="type", type="integer")
  104.      */
  105.     private $type;
  106.     /**
  107.      * @var int
  108.      *
  109.      * @Column(name="document_type", type="integer")
  110.      */
  111.     private $documentType = self::DOCUMENT_TYPE_CENTRALIS;
  112.     /**
  113.      * @var string
  114.      *
  115.      * @Column(name="variable_symbol", type="string", length=128)
  116.      */
  117.     private $variableSymbol;
  118.     /**
  119.      * @var string
  120.      *
  121.      * @Column(name="const_symbol", type="string", length=128, nullable=true)
  122.      */
  123.     private $constSymbol;
  124.     /**
  125.      * @var string
  126.      *
  127.      * @Column(name="spec_symbol", type="string", length=128, nullable=true)
  128.      */
  129.     private $specSymbol;
  130.     /**
  131.      * @var string
  132.      *
  133.      * @Column(name="sender", type="string", length=128)
  134.      */
  135.     private $sender;
  136.     /**
  137.      * @var string
  138.      *
  139.      * @Column(name="description", type="string", length=256)
  140.      */
  141.     private $description;
  142.     /**
  143.      * @var string
  144.      *
  145.      * @Column(name="internal_note", type="string", length=256, nullable=true)
  146.      */
  147.     private $internalNote;
  148.     /**
  149.      * @var Document
  150.      *
  151.      * @ManyToOne(targetEntity="Document", inversedBy="paymentDatas")
  152.      * @JoinColumn(name="document_id", referencedColumnName="id", nullable=true)
  153.      */
  154.     private $document;
  155.     /**
  156.      * @var CustomerBillingoData
  157.      *
  158.      * @ManyToOne(targetEntity="CustomerBillingoData", inversedBy="paymentDatas")
  159.      * @JoinColumn(name="billingo_data_id", referencedColumnName="id", nullable=true)
  160.      */
  161.     private $billingoDocument;
  162.     /**
  163.      * @var string
  164.      *
  165.      * @Column(name="amount", type="decimal", precision=10, scale=2)
  166.      */
  167.     private $amount = 0;
  168.     /**
  169.      * @var string
  170.      *
  171.      * @Column(name="currency", type="string", length=4)
  172.      */
  173.     private $currency;
  174.     /**
  175.      * @var \DateTime
  176.      *
  177.      * @Column(name="payment_date", type="datetime")
  178.      */
  179.     private $paymentDate;
  180.     /**
  181.      * @var User
  182.      *
  183.      * @ManyToOne(targetEntity="User")
  184.      * @JoinColumn(name="paired_by", referencedColumnName="id", nullable=true)
  185.      */
  186.     private $pairedBy;
  187.     /**
  188.      * @var \DateTime
  189.      *
  190.      * @Column(name="paired_date", type="datetime", nullable=true)
  191.      */
  192.     private $pairedDate;
  193.     /**
  194.      * @var bool
  195.      *
  196.      * @Column(name="pairable", type="boolean")
  197.      */
  198.     private $pairable = true;
  199.     /**
  200.      * @var string
  201.      *
  202.      * @Column(name="account_iban", type="string", length=32, nullable=true)
  203.      */
  204.     private $accountIban;
  205.     /**
  206.      * @var string
  207.      *
  208.      * @Column(name="counter_iban", type="string", length=32, nullable=true)
  209.      */
  210.     private $counterIban;
  211.     /**
  212.      * @var string
  213.      *
  214.      * @Column(name="reference_payer", type="string", length=256, nullable=true)
  215.      */
  216.     private $referencePayer;
  217.     /**
  218.      * @var PaymentData
  219.      *
  220.      * @ManyToOne(targetEntity="PaymentData", inversedBy="children")
  221.      * @JoinColumn(name="parent", referencedColumnName="id", nullable=true)
  222.      */
  223.     private $parent;
  224.     /**
  225.      * @var ArrayCollection
  226.      *
  227.      * @OneToMany(targetEntity="PaymentData", mappedBy="parent", orphanRemoval=true)
  228.      * @OrderBy({"created" = "DESC"})
  229.      **/
  230.     private $children;
  231.     /**
  232.      * @var User
  233.      *
  234.      * @ManyToOne(targetEntity="User")
  235.      * @JoinColumn(name="description_updated_by", referencedColumnName="id", nullable=true)
  236.      */
  237.     private $descriptionUpdatedBy;
  238.     /**
  239.      * @var \DateTime
  240.      *
  241.      * @Column(name="description_updated_date", type="datetime", nullable=true)
  242.      */
  243.     private $descriptionUpdatedDate;
  244.     /**
  245.      * @var User
  246.      *
  247.      * @ManyToOne(targetEntity="User")
  248.      * @JoinColumn(name="internal_note_updated_by", referencedColumnName="id", nullable=true)
  249.      */
  250.     private $internalNoteUpdatedBy;
  251.     /**
  252.      * @var \DateTime
  253.      *
  254.      * @Column(name="internal_note_updated_date", type="datetime", nullable=true)
  255.      */
  256.     private $internalNoteUpdatedDate;
  257.     public function __construct()
  258.     {
  259.         parent::__construct();
  260.         $this->children = new ArrayCollection();
  261.     }
  262.     /**
  263.      * @return string
  264.      */
  265.     public function getTransId()
  266.     {
  267.         return $this->transId;
  268.     }
  269.     /**
  270.      * @param string $transId
  271.      */
  272.     public function setTransId($transId)
  273.     {
  274.         $this->transId = $transId;
  275.     }
  276.     public function getSubSource(): ?PaymentSubSource
  277.     {
  278.         return $this->subSource 
  279.             ? PaymentSubSource::from($this->subSource)
  280.             : null; // TODO: refactor to NullObject?
  281.     }
  282.     public function setSubSource(?PaymentSubSource $subSource)
  283.     {
  284.         $this->subSource = $subSource->value;
  285.     }
  286.     /**
  287.      * @return int
  288.      */
  289.     public function getType()
  290.     {
  291.         return $this->type;
  292.     }
  293.     /**
  294.      * @param int $type
  295.      */
  296.     public function setType($type)
  297.     {
  298.         $this->type = $type;
  299.     }
  300.     public function getSource(): PaymentSource
  301.     {
  302.         return PaymentSource::from($this->source);
  303.     }
  304.     public function setSource(PaymentSource $source)
  305.     {
  306.         $this->source = $source->value;
  307.     }
  308.     /**
  309.      * @return string
  310.      */
  311.     public function getVariableSymbol()
  312.     {
  313.         return $this->variableSymbol;
  314.     }
  315.     /**
  316.      * @param string $variableSymbol
  317.      */
  318.     public function setVariableSymbol($variableSymbol)
  319.     {
  320.         $this->variableSymbol = $variableSymbol;
  321.     }
  322.     /**
  323.      * @return string
  324.      */
  325.     public function getConstSymbol()
  326.     {
  327.         return $this->constSymbol;
  328.     }
  329.     /**
  330.      * @param string $constSymbol
  331.      */
  332.     public function setConstSymbol($constSymbol)
  333.     {
  334.         $this->constSymbol = $constSymbol;
  335.     }
  336.     /**
  337.      * @return string
  338.      */
  339.     public function getSpecSymbol()
  340.     {
  341.         return $this->specSymbol;
  342.     }
  343.     /**
  344.      * @param string $specSymbol
  345.      */
  346.     public function setSpecSymbol($specSymbol)
  347.     {
  348.         $this->specSymbol = $specSymbol;
  349.     }
  350.     /**
  351.      * @return string
  352.      */
  353.     public function getSender()
  354.     {
  355.         return $this->sender;
  356.     }
  357.     /**
  358.      * @param string $sender
  359.      */
  360.     public function setSender($sender)
  361.     {
  362.         $this->sender = $sender;
  363.     }
  364.     /**
  365.      * @return string
  366.      */
  367.     public function getDescription()
  368.     {
  369.         return $this->description;
  370.     }
  371.     /**
  372.      * @param string $description
  373.      */
  374.     public function setDescription($description)
  375.     {
  376.         $this->description = $description;
  377.     }
  378.     /**
  379.      * @return string
  380.      */
  381.     public function getInternalNote()
  382.     {
  383.         return $this->internalNote;
  384.     }
  385.     /**
  386.      * @param string $internalNote
  387.      */
  388.     public function setInternalNote(string $internalNote)
  389.     {
  390.         $this->internalNote = $internalNote;
  391.     }
  392.     /**
  393.      * @return Document
  394.      */
  395.     public function getDocument()
  396.     {
  397.         return $this->document;
  398.     }
  399.     /**
  400.      * @param Document $document
  401.      */
  402.     public function setDocument($document)
  403.     {
  404.         $this->document = $document;
  405.     }
  406.     /**
  407.      * @return string
  408.      */
  409.     public function getAmount()
  410.     {
  411.         return $this->amount;
  412.     }
  413.     /**
  414.      * @param string $amount
  415.      */
  416.     public function setAmount($amount)
  417.     {
  418.         $this->amount = $amount;
  419.     }
  420.     /**
  421.      * @return string
  422.      */
  423.     public function getCurrency()
  424.     {
  425.         return $this->currency;
  426.     }
  427.     /**
  428.      * @param string $currency
  429.      */
  430.     public function setCurrency($currency)
  431.     {
  432.         $this->currency = $currency;
  433.     }
  434.     /**
  435.      * @return \DateTime
  436.      */
  437.     public function getPaymentDate()
  438.     {
  439.         return $this->paymentDate;
  440.     }
  441.     /**
  442.      * @param \DateTime $paymentDate
  443.      */
  444.     public function setPaymentDate($paymentDate)
  445.     {
  446.         $this->paymentDate = $paymentDate;
  447.     }
  448.     /**
  449.      * @return boolean
  450.      */
  451.     public function isPairable(): bool
  452.     {
  453.         return $this->pairable;
  454.     }
  455.     /**
  456.      * @param boolean $pairable
  457.      */
  458.     public function setPairable(bool $pairable)
  459.     {
  460.         $this->pairable = $pairable;
  461.     }
  462.     /**
  463.      * @return User|null
  464.      */
  465.     public function getPairedBy(): ?User
  466.     {
  467.         return $this->pairedBy;
  468.     }
  469.     /**
  470.      * @param User|null $pairedBy
  471.      */
  472.     public function setPairedBy(?User $pairedBy): void
  473.     {
  474.         $this->pairedBy = $pairedBy;
  475.     }
  476.     /**
  477.      * @return \DateTime|null
  478.      */
  479.     public function getPairedDate(): ?\DateTime
  480.     {
  481.         return $this->pairedDate;
  482.     }
  483.     /**
  484.      * @param \DateTime|null $pairedDate
  485.      */
  486.     public function setPairedDate(?\DateTime $pairedDate): void
  487.     {
  488.         $this->pairedDate = $pairedDate;
  489.     }
  490.     /**
  491.      * @return string|null
  492.      */
  493.     public function getAccountIban(): ?string
  494.     {
  495.         return $this->accountIban;
  496.     }
  497.     /**
  498.      * @param string|null $accountIban
  499.      */
  500.     public function setAccountIban(?string $accountIban): void
  501.     {
  502.         $this->accountIban = $accountIban;
  503.     }
  504.     /**
  505.      * @return string|null
  506.      */
  507.     public function getCounterIban(): ?string
  508.     {
  509.         return $this->counterIban;
  510.     }
  511.     /**
  512.      * @param string|null $counterIban
  513.      */
  514.     public function setCounterIban(?string $counterIban): void
  515.     {
  516.         $this->counterIban = $counterIban;
  517.     }
  518.     /**
  519.      * @return string|null
  520.      */
  521.     public function getReferencePayer(): ?string
  522.     {
  523.         return $this->referencePayer;
  524.     }
  525.     /**
  526.      * @param string|null $referencePayer
  527.      */
  528.     public function setReferencePayer(?string $referencePayer): void
  529.     {
  530.         $this->referencePayer = $referencePayer;
  531.     }
  532.     /**
  533.      * @return PaymentData|null
  534.      */
  535.     public function getParent(): ?PaymentData
  536.     {
  537.         return $this->parent;
  538.     }
  539.     /**
  540.      * @param PaymentData|null $parent
  541.      */
  542.     public function setParent(?PaymentData $parent): void
  543.     {
  544.         $this->parent = $parent;
  545.     }
  546.     public function getChildren()
  547.     {
  548.         return $this->children;
  549.     }
  550.     /**
  551.      * @return CustomerBillingoData|null
  552.      */
  553.     public function getBillingoDocument(): ?CustomerBillingoData
  554.     {
  555.         return $this->billingoDocument;
  556.     }
  557.     /**
  558.      * @param ?CustomerBillingoData|null $billingoDocument
  559.      */
  560.     public function setBillingoDocument(?CustomerBillingoData $billingoDocument): void
  561.     {
  562.         $this->billingoDocument = $billingoDocument;
  563.     }
  564.     /**
  565.      * @return int
  566.      */
  567.     public function getDocumentType(): int
  568.     {
  569.         return $this->documentType;
  570.     }
  571.     /**
  572.      * @param int $documentType
  573.      */
  574.     public function setDocumentType(int $documentType): void
  575.     {
  576.         $this->documentType = $documentType;
  577.     }
  578.     /**
  579.      * @return User|null
  580.      */
  581.     public function getDescriptionUpdatedBy(): ?User
  582.     {
  583.         return $this->descriptionUpdatedBy;
  584.     }
  585.     /**
  586.      * @param User|null $descriptionUpdatedBy
  587.      */
  588.     public function setDescriptionUpdatedBy(?User $descriptionUpdatedBy): void
  589.     {
  590.         $this->descriptionUpdatedBy = $descriptionUpdatedBy;
  591.     }
  592.     /**
  593.      * @return \DateTime|null
  594.      */
  595.     public function getDescriptionUpdatedDate(): ?\DateTime
  596.     {
  597.         return $this->descriptionUpdatedDate;
  598.     }
  599.     /**
  600.      * @param \DateTime|null $descriptionUpdatedDate
  601.      */
  602.     public function setDescriptionUpdatedDate(?\DateTime $descriptionUpdatedDate): void
  603.     {
  604.         $this->descriptionUpdatedDate = $descriptionUpdatedDate;
  605.     }
  606.     /**
  607.      * @return User|null
  608.      */
  609.     public function getInternalNoteUpdatedBy(): ?User
  610.     {
  611.         return $this->internalNoteUpdatedBy;
  612.     }
  613.     /**
  614.      * @param User|null $internalNoteUpdatedBy
  615.      */
  616.     public function setInternalNoteUpdatedBy(?User $internalNoteUpdatedBy): void
  617.     {
  618.         $this->internalNoteUpdatedBy = $internalNoteUpdatedBy;
  619.     }
  620.     /**
  621.      * @return \DateTime|null
  622.      */
  623.     public function getInternalNoteUpdatedDate(): ?\DateTime
  624.     {
  625.         return $this->internalNoteUpdatedDate;
  626.     }
  627.     /**
  628.      * @param \DateTime|null $internalNoteUpdatedDate
  629.      */
  630.     public function setInternalNoteUpdatedDate(?\DateTime $internalNoteUpdatedDate): void
  631.     {
  632.         $this->internalNoteUpdatedDate = $internalNoteUpdatedDate;
  633.     }
  634.     public static function fromCamt052Message(Camt052Message $message, User $createdByUser): self
  635.     {
  636.         $rpt = $message->Rpt[0];
  637.         $entry = $rpt->Ntry[0];
  638.         $entryDetails = $entry->NtryDtls[0];
  639.         $txDetails = $entryDetails->TxDtls[0];
  640.         $creditDebit = $entry->CdtDbtInd == $entry::CREDIT
  641.             ? self::TYPE_IN
  642.             : self::TYPE_OUT;
  643.         $subSource = match ($rpt->Acct->Id->IBAN) {
  644.             PaymentIban::IBAN_RAIFFEISEN_1 => PaymentSubSource::BANK_HU_RAIFFEISEN_1,
  645.             PaymentIban::IBAN_RAIFFEISEN_2 => PaymentSubSource::BANK_HU_RAIFFEISEN_2, 
  646.             default => null,
  647.         };
  648.         $self = new self();
  649.         $self->setTransId($entry->NtryRef);
  650.         $self->setSource(PaymentSource::BANK_HU_RAIFFEISEN);
  651.         $self->setDocumentType(self::DOCUMENT_TYPE_CENTRALIS);
  652.         $self->setSubSource($subSource);
  653.         $self->setType($creditDebit);
  654.         $self->setVariableSymbol($txDetails->Refs->InstrId);
  655.         $self->setConstSymbol(null);
  656.         $self->setSpecSymbol(null);
  657.         $self->setSender(trim($txDetails->RltdPties->Dbtr->Party->Nm));
  658.         $self->setDescription($txDetails->RmtInf->Ustrd[0] ?? '');
  659.         $self->setAmount($entry->Amt->Amt);
  660.         $self->setCurrency(trim($entry->Amt->Ccy));
  661.         $self->setPaymentDate(new DateTimeImmutable($entry->ValDt->Dt));
  662.         $self->setAccountIban(trim($txDetails->RltdPties->DbtrAcct->Id->IBAN));
  663.         $self->setCounterIban(trim($txDetails->RltdPties->CdtrAcct->Id->IBAN));
  664.         $self->setPairable(true);
  665.         $self->setCreatedBy($createdByUser);
  666.         return $self;
  667.     }
  668.     public function getBankTransactionId(): string
  669.     {
  670.         return $this->bankTransactionId ?? '';
  671.     }
  672.     public function setBankTransactionId(string $bankTransactionId): void
  673.     {
  674.         $this->bankTransactionId = $bankTransactionId;
  675.     }
  676. }