<?php
namespace AdminBundle\Entity;
use Doctrine\ORM\Event\LifecycleEventArgs;
use Doctrine\ORM\Mapping as ORM;
/**
* Invoice
*/
#[ORM\Table(name: 'transaction')]
#[ORM\UniqueConstraint(name: 'payment_braintree_transaction', columns: ['braintree_transaction_id', 'payment_id'])]
#[ORM\Entity(repositoryClass: \AdminBundle\Repository\TransactionRepository::class)]
#[ORM\HasLifecycleCallbacks]
class Transaction
{
const TYPE_BRAINTREE = 1;
const TYPE_SIMPLE_CASH = 2;
const TYPE_SIMPLE_BACS = 3;
const TYPE_SIMPLE_CREDIT = 4;
const TYPE_STRIPE = 5;
const TYPE_REFUND = 10;
const TYPE = [
self::TYPE_BRAINTREE => 'braintree',
self::TYPE_SIMPLE_CASH => 'simple cash',
self::TYPE_SIMPLE_BACS => 'simple bacs',
self::TYPE_SIMPLE_CREDIT => 'simple credit',
self::TYPE_REFUND => 'refund',
self::TYPE_STRIPE => 'stripe'
];
const CUSTOMER_TYPE = [
self::TYPE_BRAINTREE => 'braintree',
self::TYPE_STRIPE => 'stripe'
];
/**
* @var int
*/
#[ORM\Column(name: 'id', type: 'integer')]
#[ORM\Id]
#[ORM\GeneratedValue(strategy: 'AUTO')]
private $id;
/**
* @var \DateTime
*/
#[ORM\Column(name: 'create_date', type: 'datetime')]
private $createDate;
/**
* @var integer
*/
#[ORM\Column(name: 'type', type: 'smallint', length: 20)]
private $type;
/**
* @var string
*/
#[ORM\Column(name: 'braintree_transaction_id', type: 'string', length: 255, nullable: true)]
private $braintreeTransactionId;
/**
* @var string
*/
#[ORM\Column(name: 'stripe_transaction_id', type: 'string', length: 255, nullable: true)]
private $stripeTransactionId;
/**
* @var float
*/
#[ORM\Column(name: 'amount', type: 'float')]
private $amount;
/**
* @var string
*/
#[ORM\Column(name: 'notes', type: 'text', nullable: true)]
private $notes;
/**
* @var Payment
*/
#[ORM\JoinColumn(name: 'payment_id', referencedColumnName: 'id', onDelete: 'CASCADE')]
#[ORM\ManyToOne(targetEntity: \Payment::class, inversedBy: 'transactions')]
private $payment;
/**
* @var User
*/
#[ORM\JoinColumn(name: 'created_by_user_id', referencedColumnName: 'id', onDelete: 'CASCADE')]
#[ORM\ManyToOne(targetEntity: \AdminBundle\Entity\User::class)]
private $createdByUser;
/**
* Invoice constructor.
*/
public function __construct()
{
$this->createDate = new \DateTime();
}
/**
* Get id
*
* @return int
*/
public function getId()
{
return $this->id;
}
/**
* Set createDate
*
* @param \DateTime $createDate
*
* @return Transaction
*/
public function setCreateDate($createDate)
{
$this->createDate = $createDate;
return $this;
}
/**
* Get createDate
*
* @return \DateTime
*/
public function getCreateDate()
{
return $this->createDate;
}
/**
* Set type
*
* @param integer $type
*
* @return Transaction
*/
public function setType($type)
{
$this->type = $type;
return $this;
}
/**
* Get type
*
* @return integer
*/
public function getType()
{
return $this->type;
}
/**
* Set braintreeTransactionId
*
* @param string $braintreeTransactionId
*
* @return Transaction
*/
public function setBraintreeTransactionId($braintreeTransactionId)
{
$this->braintreeTransactionId = $braintreeTransactionId;
return $this;
}
/**
* Get braintreeTransactionId
*
* @return string
*/
public function getBraintreeTransactionId()
{
return $this->braintreeTransactionId;
}
/**
* Set stripeTransactionId
*
* @param string $stripeTransactionId
*
* @return Transaction
*/
public function setStripeTransactionId($stripeTransactionId)
{
$this->stripeTransactionId = $stripeTransactionId;
return $this;
}
/**
* Get stripeTransactionId
*
* @return string
*/
public function getStripeTransactionId()
{
return $this->stripeTransactionId;
}
/**
* Set amount
*
* @param float $amount
*
* @return Transaction
*/
public function setAmount($amount)
{
$this->amount = $amount;
return $this;
}
/**
* Get amount
*
* @return float
*/
public function getAmount()
{
return $this->amount;
}
/**
* Set notes
*
* @param string $notes
*
* @return Transaction
*/
public function setNotes($notes)
{
$this->notes = $notes;
return $this;
}
/**
* Get notes
*
* @return string
*/
public function getNotes()
{
return $this->notes;
}
/**
* Set payment
*
* @param \AdminBundle\Entity\Payment $payment
*
* @return Transaction
*/
public function setPayment(\AdminBundle\Entity\Payment $payment = null)
{
$this->payment = $payment;
return $this;
}
/**
* Get payment
*
* @return \AdminBundle\Entity\Payment
*/
public function getPayment()
{
return $this->payment;
}
/**
* @return User|null
*/
public function getCreatedByUser()
{
return $this->createdByUser;
}
/**
* @param User|null $createdByUser
* @return Transaction
*/
public function setCreatedByUser($createdByUser): Transaction
{
$this->createdByUser = $createdByUser;
return $this;
}
public function __toString() {
return $this->getId().'.'.(!empty($this->type) ? ucfirst(self::TYPE[$this->type]) : '').
($this->type === 1 ? '('.$this->braintreeTransactionId.')' : ''). ' amount:'.
$this->getAmount() . (!empty($this->notes) ? ' ('.$this->notes.')' : '');
}
public function stringType() {
return (!empty($this->type) ? ucfirst(self::TYPE[$this->type]) : '');
}
/**
*
* @return Transaction
*/
#[ORM\PrePersist]
#[ORM\PreUpdate]
public function updateAmountLeft(LifecycleEventArgs $args) {
if(!empty($this->getPayment())) {
$this->getPayment()->updateAmountLeft();
if ($this->getPayment()->getAmountLeftCash() > 0 && $this->type === self::TYPE_SIMPLE_CASH) {
$this->getPayment()->setAmountLeftCash($this->getPayment()->getAmountLeftCash() - $this->getAmount());
}
}
return $this;
}
public function getCreateDateFormated()
{
return $this->createDate->format('d/m/Y H:i:s');
}
}