<?php
namespace LaunchPad\Bundle\LaunchPadBundle\Base\Entity\Transaction;
use DateTime;
use DateTimeImmutable;
use DateTimeInterface;
use Doctrine\Common\Inflector\Inflector;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\ORM\Mapping\JoinColumn;
use Doctrine\ORM\Mapping\ManyToOne;
use Doctrine\ORM\Mapping\OneToOne;
use LaunchPad\Bundle\LaunchPadBundle\Base\Entity\Account\Account;
use LaunchPad\Bundle\LaunchPadBundle\Base\Entity\BaseEntity;
use LaunchPad\Bundle\LaunchPadBundle\Base\Entity\Country;
use LaunchPad\Bundle\LaunchPadBundle\Base\Entity\Payment\PaymentCard;
use LaunchPad\Bundle\LaunchPadBundle\Base\Entity\PaymentDevice\PaymentDevice;
use LaunchPad\Bundle\LaunchPadBundle\Base\Entity\User\User;
use Symfony\Component\Serializer\Annotation\Groups;
/**
* @ORM\Entity
* @ORM\Table(name="transaction")
*/
class Transaction extends BaseEntity
{
/** @var string */
public const TYPE_LOAD = 'load';
/** @var string */
public const TYPE_UNLOAD = 'unload';
/** @var string */
public const TYPE_PAYMENT = 'payment';
/** @var string */
public const TYPE_SPEND = 'spend';
/** @var string */
public const TYPE_CORRECTION = 'correction';
/** @var string */
public const TYPE_REFUND = 'refund';
/** @var string */
public const TYPE_BALANCE_ADJUSTMENT = 'balance_adjustment';
/** @var string */
public const STATUS_ACCEPTED = 'accepted';
/** @var string */
public const STATUS_COMPLETED = 'completed';
/** @var string */
public const STATUS_PENDING = 'pending';
/** @var string */
public const STATUS_FAILED= 'failed';
/** @var string */
public const STATUS_DECLINED = 'declined';
/** @var string */
public const STATUS_SETTLED = 'settled';
/** @var string */
public const GROUP_POS = 'pos';
/** @var string */
public const GROUP_ATM = 'atm';
/**
* @var int|null
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
* @Groups({"transaction_data"})
*/
protected $id;
/**
* @var User|null
* @ManyToOne(targetEntity="LaunchPad\Bundle\LaunchPadBundle\Base\Entity\User\User")
* @JoinColumn(name="user_id", referencedColumnName="id", nullable=true)
* @Groups({"transaction_data"})
*/
private $user;
/**
* @var string|null
* @ORM\Column(name="title", type="string", length=50, nullable=true)
* @Groups({"transaction_data"})
*/
private $title;
/**
* @var Account|null
* @ManyToOne(targetEntity="LaunchPad\Bundle\LaunchPadBundle\Base\Entity\Account\Account")
* @JoinColumn(name="account_id", referencedColumnName="id", nullable=true)
* @Groups({"transaction_data"})
*/
private $account;
/**
* @var PaymentDevice|null
* @ManyToOne(targetEntity="LaunchPad\Bundle\LaunchPadBundle\Base\Entity\PaymentDevice\PaymentDevice")
* @JoinColumn(name="payment_device_id", referencedColumnName="id", nullable=true)
* @Groups({"transaction_data"})
*/
private $paymentDevice;
/**
* @var TransactionCategory|null
* @ManyToOne(targetEntity="TransactionCategory")
* @JoinColumn(name="category_id", referencedColumnName="id", nullable=true)
* @Groups({"transaction_data"})
*/
private $category;
/**
* @var TransactionMerchant|null
* @ManyToOne(targetEntity="TransactionMerchant")
* @JoinColumn(name="merchant_id", referencedColumnName="id", nullable=true)
* @Groups({"transaction_data"})
*/
private $merchant;
/**
* @var Country|null
* @ManyToOne(targetEntity="LaunchPad\Bundle\LaunchPadBundle\Base\Entity\Country")
* @JoinColumn(name="country_id", referencedColumnName="id", nullable=true)
* @Groups({"transaction_data"})
*/
private $country;
/**
* @var PaymentCard|null
* @ManyToOne(targetEntity="LaunchPad\Bundle\LaunchPadBundle\Base\Entity\Payment\PaymentCard")
* @JoinColumn(name="payment_card_id", referencedColumnName="id", nullable=true)
*/
private $paymentCard;
/**
* @var string|null
* @ORM\Column(name="note", type="string", length=500, nullable=true)
* @Groups({"transaction_data"})
*/
private $note;
/**
* @var string|null
* @ORM\Column(name="merchant_name", type="string", length=50, nullable=true)
* @Groups({"transaction_data"})
*/
private $merchantName;
/**
* @var string|null
* @ORM\Column(name="merchant_street", type="string", length=50, nullable=true)
* @Groups({"transaction_data"})
*/
private $merchantStreet;
/**
* @var string|null
* @ORM\Column(name="merchant_city", type="string", length=50, nullable=true)
* @Groups({"transaction_data"})
*/
private $merchantCity;
/**
* @var string|null
* @ORM\Column(name="merchant_region", type="string", length=50, nullable=true)
* @Groups({"transaction_data"})
*/
private $merchantRegion;
/**
* @var string|null
* @ORM\Column(name="merchant_postcode", type="string", length=50, nullable=true)
* @Groups({"transaction_data"})
*/
private $merchantPostcode;
/**
* @var string|null
* @ORM\Column(name="merchant_country", type="string", length=50, nullable=true)
* @Groups({"transaction_data"})
*/
private $merchantCountry;
/**
* @var string|null
* @ORM\Column(name="country_code", type="string", length=50, nullable=true)
* @Groups({"transaction_data"})
*/
private $countryCode;
/**
* @var float|null
* @ORM\Column(name="amount", type="float", scale=2, nullable=true)
* @Groups({"transaction_data"})
*/
private $amount;
/**
* @var string|null
* @ORM\Column(name="amount_currency", type="string", length=3, nullable=true)
* @Groups({"transaction_data"})
*/
private $amountCurrency;
/**
* @var string|null
* @ORM\Column(name="original_amount", type="float", scale=2, nullable=true)
* @Groups({"transaction_data"})
*/
private $originalAmount;
/**
* @var string|null
* @ORM\Column(name="original_amount_currency", type="string", length=3, nullable=true)
* @Groups({"transaction_data"})
*/
private $originalAmountCurrency;
/**
* @var float|null
* @ORM\Column(name="fee", type="float", scale=2, nullable=true)
* @Groups({"transaction_data"})
*/
private $fee = 0.0;
/**
* @var string|null
* @ORM\Column(name="fee_currency", type="string", length=3, nullable=true)
* @Groups({"transaction_data"})
*/
private $feeCurrency;
/**
* @var string|null
* @ORM\Column(name="card_token", type="string", length=50, nullable=true)
* @Groups({"transaction_data"})
*/
private $cardToken;
/**
* @var string|null
* @ORM\Column(name="mcc", type="string", length=10, nullable=true)
* @Groups({"transaction_data"})
*/
private $mcc;
/**
* @var DateTimeInterface|null
* @ORM\Column(name="transaction_date", type="datetime", nullable=true)
* @Groups({"transaction_data"})
*/
private $transactionDate;
/**
* @var DateTimeInterface|null
* @ORM\Column(name="post_date", type="datetime", nullable=true)
* @Groups({"transaction_data"})
*/
private $postDate;
/**
* @var string|null
* @ORM\Column(name="external_reference", type="string", length=255, nullable=true)
* @Groups({"transaction_data"})
*/
private $externalReference;
/**
* @var string|null
* @ORM\Column(name="transaction_group", type="string", length=20, nullable=true)
* @Groups({"transaction_data"})
*/
private $group;
/**
* @var string|null
* @ORM\Column(name="status", type="string", length=20, nullable=true)
* @Groups({"transaction_data"})
*/
private $status = self::STATUS_PENDING;
/**
* @var string|null
* @ORM\Column(name="type", type="string", length=20, nullable=true)
* @Groups({"transaction_data"})
*/
private $type = self::TYPE_SPEND;
/**
* @var string|null
* @ORM\Column(name="gps_latitude", type="string", length=20, nullable=true)
* @Groups({"transaction_data"})
*/
private $gpsLatitude;
/**
* @var string|null
* @ORM\Column(name="gps_longitude", type="string", length=20, nullable=true)
* @Groups({"transaction_data"})
*/
private $gpsLongitude;
/**
* @var float|null
* @ORM\Column(name="running_balance", type="float", scale=2, nullable=true, options={"default":0})
* @Groups({"transaction_data"})
*/
private $runningBalance = 0;
/**
* @var string|null
* @ORM\Column(name="auth_id", type="string", length=20, nullable=true)
* @Groups({"transaction_data"})
*/
private $authId;
/**
* @var string|null
* @ORM\Column(name="fin_id", type="string", length=20, nullable=true)
* @Groups({"transaction_data"})
*/
private $finId;
/**
* @var string|null
* @ORM\Column(name="load_id", type="string", length=20, nullable=true)
* @Groups({"transaction_data"})
*/
private $loadId;
/**
* @var string|null
* @ORM\Column(name="load_source", type="string", length=20, nullable=true)
* @Groups({"transaction_data"})
*/
private $loadSource;
/**
* @var boolean|null
* @ORM\Column(name="is_fx", type="boolean", nullable=true)
* @Groups({"transaction_data"})
*/
private $isFx;
/**
* @OneToOne(targetEntity="LaunchPad\Bundle\LaunchPadBundle\Base\Entity\Transaction\ForeignExchangeFee")
* @Groups({"transaction_data"})
*/
protected $fxFee;
public function __construct()
{
$this->transactionDate = new DateTimeImmutable();
}
/**
* @return int|null
*/
public function getId(): ?int
{
return $this->id;
}
/**
* @param int|null $id
* @return Transaction
*/
public function setId(?int $id): Transaction
{
$this->id = $id;
return $this;
}
/**
* @return User|null
*/
public function getUser(): ?User
{
return $this->user;
}
/**
* @param User|null $user
* @return Transaction
*/
public function setUser(?User $user): Transaction
{
$this->user = $user;
return $this;
}
/**
* @return string|null
*/
public function getTitle(): ?string
{
return $this->title;
}
/**
* @param string|null $title
* @return Transaction
*/
public function setTitle(?string $title): Transaction
{
$this->title = $title;
return $this;
}
/**
* @return Account|null
*/
public function getAccount(): ?Account
{
return $this->account;
}
/**
* @param Account|null $account
* @return Transaction
*/
public function setAccount(?Account $account): Transaction
{
$this->account = $account;
return $this;
}
/**
* @return PaymentDevice|null
*/
public function getPaymentDevice(): ?PaymentDevice
{
return $this->paymentDevice;
}
/**
* @param PaymentDevice|null $paymentDevice
* @return Transaction
*/
public function setPaymentDevice(?PaymentDevice $paymentDevice): Transaction
{
$this->paymentDevice = $paymentDevice;
return $this;
}
/**
* @return TransactionCategory|null
*/
public function getCategory(): ?TransactionCategory
{
return $this->category;
}
/**
* @param TransactionCategory|null $category
* @return Transaction
*/
public function setCategory(?TransactionCategory $category): Transaction
{
$this->category = $category;
return $this;
}
/**
* @return TransactionMerchant|null
*/
public function getMerchant(): ?TransactionMerchant
{
return $this->merchant;
}
/**
* @param TransactionMerchant|null $merchant
* @return Transaction
*/
public function setMerchant(?TransactionMerchant $merchant): Transaction
{
$this->merchant = $merchant;
return $this;
}
/**
* @return Country|null
*/
public function getCountry(): ?Country
{
return $this->country;
}
/**
* @param Country|null $country
* @return Transaction
*/
public function setCountry(?Country $country): Transaction
{
$this->country = $country;
return $this;
}
/**
* @return string|null
*/
public function getNote(): ?string
{
return $this->note;
}
/**
* @param string|null $note
* @return Transaction
*/
public function setNote(?string $note): Transaction
{
$this->note = $note;
return $this;
}
/**
* @return string|null
*/
public function getMerchantName(): ?string
{
return $this->merchantName;
}
/**
* @param string|null $merchantName
* @return Transaction
*/
public function setMerchantName(?string $merchantName): Transaction
{
$this->merchantName = $merchantName;
return $this;
}
/**
* @return string|null
*/
public function getMerchantStreet(): ?string
{
return $this->merchantStreet;
}
/**
* @param string|null $merchantStreet
* @return Transaction
*/
public function setMerchantStreet(?string $merchantStreet): Transaction
{
$this->merchantStreet = $merchantStreet;
return $this;
}
/**
* @return string|null
*/
public function getMerchantCity(): ?string
{
return $this->merchantCity;
}
/**
* @param string|null $merchantCity
* @return Transaction
*/
public function setMerchantCity(?string $merchantCity): Transaction
{
$this->merchantCity = $merchantCity;
return $this;
}
/**
* @return string|null
*/
public function getMerchantRegion(): ?string
{
return $this->merchantRegion;
}
/**
* @param string|null $merchantRegion
* @return Transaction
*/
public function setMerchantRegion(?string $merchantRegion): Transaction
{
$this->merchantRegion = $merchantRegion;
return $this;
}
/**
* @return string|null
*/
public function getMerchantPostcode(): ?string
{
return $this->merchantPostcode;
}
/**
* @param string|null $merchantPostcode
* @return Transaction
*/
public function setMerchantPostcode(?string $merchantPostcode): Transaction
{
$this->merchantPostcode = $merchantPostcode;
return $this;
}
/**
* @return string|null
*/
public function getMerchantCountry(): ?string
{
return $this->merchantCountry;
}
/**
* @param string|null $merchantCountry
* @return Transaction
*/
public function setMerchantCountry(?string $merchantCountry): Transaction
{
$this->merchantCountry = $merchantCountry;
return $this;
}
/**
* @return string|null
*/
public function getCountryCode(): ?string
{
return $this->countryCode;
}
/**
* @param string|null $countryCode
* @return Transaction
*/
public function setCountryCode(?string $countryCode): Transaction
{
$this->countryCode = $countryCode;
return $this;
}
/**
* @return float|null
*/
public function getAmount(): ?float
{
return $this->amount;
}
/**
* @param float|null $amount
* @return Transaction
*/
public function setAmount(?float $amount): Transaction
{
$this->amount = $amount;
return $this;
}
/**
* @return string|null
*/
public function getAmountCurrency(): ?string
{
return $this->amountCurrency;
}
/**
* @param string|null $amountCurrency
* @return Transaction
*/
public function setAmountCurrency(?string $amountCurrency): Transaction
{
$this->amountCurrency = $amountCurrency;
return $this;
}
/**
* @return string|null
*/
public function getOriginalAmount(): ?string
{
return $this->originalAmount;
}
/**
* @param string|null $originalAmount
* @return Transaction
*/
public function setOriginalAmount(?string $originalAmount): Transaction
{
$this->originalAmount = $originalAmount;
return $this;
}
/**
* @return string|null
*/
public function getOriginalAmountCurrency(): ?string
{
return $this->originalAmountCurrency;
}
/**
* @param string|null $originalAmountCurrency
* @return Transaction
*/
public function setOriginalAmountCurrency(?string $originalAmountCurrency): Transaction
{
$this->originalAmountCurrency = $originalAmountCurrency;
return $this;
}
/**
* @return float|null
*/
public function getFee(): ?float
{
return $this->fee;
}
/**
* @param float|null $fee
* @return Transaction
*/
public function setFee(?float $fee): Transaction
{
$this->fee = $fee;
return $this;
}
/**
* @return string|null
*/
public function getFeeCurrency(): ?string
{
return $this->feeCurrency;
}
/**
* @param string|null $feeCurrency
* @return Transaction
*/
public function setFeeCurrency(?string $feeCurrency): Transaction
{
$this->feeCurrency = $feeCurrency;
return $this;
}
/**
* @return string|null
*/
public function getCardToken(): ?string
{
return $this->cardToken;
}
/**
* @param string|null $cardToken
* @return Transaction
*/
public function setCardToken(?string $cardToken): Transaction
{
$this->cardToken = $cardToken;
return $this;
}
/**
* @return string|null
*/
public function getMcc(): ?string
{
return $this->mcc;
}
/**
* @param string|null $mcc
* @return Transaction
*/
public function setMcc(?string $mcc): Transaction
{
$this->mcc = $mcc;
return $this;
}
/**
* @return DateTimeInterface|null
*/
public function getTransactionDate(): ?DateTimeInterface
{
return $this->transactionDate;
}
/**
* @param DateTimeInterface|null $transactionDate
* @return Transaction
*/
public function setTransactionDate(?DateTimeInterface $transactionDate): Transaction
{
$this->transactionDate = $transactionDate;
return $this;
}
/**
* @return DateTime|null
*/
public function getPostDate(): ?DateTime
{
return $this->postDate;
}
/**
* @param DateTime|null $postDate
* @return Transaction
*/
public function setPostDate(?DateTime $postDate): Transaction
{
$this->postDate = $postDate;
return $this;
}
/**
* @return string|null
*/
public function getExternalReference(): ?string
{
return $this->externalReference;
}
/**
* @param string|null $externalReference
* @return Transaction
*/
public function setExternalReference(?string $externalReference): Transaction
{
$this->externalReference = $externalReference;
return $this;
}
/**
* @return string|null
*/
public function getGroup(): ?string
{
return $this->group;
}
/**
* @param string|null $group
* @return Transaction
*/
public function setGroup(?string $group): Transaction
{
$this->group = $group;
return $this;
}
/**
* @return string|null
*/
public function getStatus(): ?string
{
return $this->status;
}
/**
* @param string|null $status
* @return Transaction
*/
public function setStatus(?string $status): Transaction
{
$this->status = $status;
return $this;
}
/**
* @return string|null
*/
public function getType(): ?string
{
return $this->type;
}
/**
* @param string|null $type
* @return Transaction
*/
public function setType(?string $type): Transaction
{
$this->type = $type;
return $this;
}
/**
* @return string|null
*/
public function getGpsLatitude(): ?string
{
return $this->gpsLatitude;
}
/**
* @param string|null $gpsLatitude
* @return Transaction
*/
public function setGpsLatitude(?string $gpsLatitude): Transaction
{
$this->gpsLatitude = $gpsLatitude;
return $this;
}
/**
* @return string|null
*/
public function getGpsLongitude(): ?string
{
return $this->gpsLongitude;
}
/**
* @param string|null $gpsLongitude
* @return Transaction
*/
public function setGpsLongitude(?string $gpsLongitude): Transaction
{
$this->gpsLongitude = $gpsLongitude;
return $this;
}
/**
* @return float|null
*/
public function getRunningBalance(): ?float
{
return $this->runningBalance;
}
/**
* @param float|null $runningBalance
* @return Transaction
*/
public function setRunningBalance(?float $runningBalance): Transaction
{
$this->runningBalance = $runningBalance;
return $this;
}
/**
* @return string|null
*/
public function getAuthId(): ?string
{
return $this->authId;
}
/**
* @param string|null $authId
* @return Transaction
*/
public function setAuthId(?string $authId): Transaction
{
$this->authId = $authId;
return $this;
}
/**
* @return string|null
*/
public function getFinId(): ?string
{
return $this->finId;
}
/**
* @param string|null $finId
* @return Transaction
*/
public function setFinId(?string $finId): Transaction
{
$this->finId = $finId;
return $this;
}
/**
* @return string|null
*/
public function getLoadId(): ?string
{
return $this->loadId;
}
/**
* @param string|null $loadId
* @return Transaction
*/
public function setLoadId(?string $loadId): Transaction
{
$this->loadId = $loadId;
return $this;
}
/**
* @return string|null
*/
public function getLoadSource(): ?string
{
return $this->loadSource;
}
/**
* @param string|null $loadSource
* @return Transaction
*/
public function setLoadSource(?string $loadSource): Transaction
{
$this->loadSource = $loadSource;
return $this;
}
/**
* @return PaymentCard|null
*/
public function getPaymentCard(): ?PaymentCard
{
return $this->paymentCard;
}
/**
* @param PaymentCard|null $paymentCard
* @return Transaction
*/
public function setPaymentCard(?PaymentCard $paymentCard): Transaction
{
$this->paymentCard = $paymentCard;
return $this;
}
/**
* @Groups({"transaction_data"})
* @return string|null
*/
public function getStatusReadable(): ?string
{
return $this->status ? Inflector::ucwords($this->status) : null;
}
/**
* @Groups({"transaction_data"})
* @return string|null
*/
public function getTypeReadable(): ?string
{
return $this->type ? Inflector::ucwords($this->type) : null;
}
/**
* @Groups({"transaction_data"})
* @return string
*/
public function getCategoryIcon(): string
{
return $this->category ? $this->category->getIcon() : 'fa.info';
}
/**
* @Groups({"transaction_data"})
*/
public function getCardPan()
{
return $this->paymentDevice ? $this->paymentDevice->getPan() : null;
}
/**
* @return string
*/
public function __toString(): string
{
return $this->note ?: '';
}
/**
* @return bool|null
*/
public function getIsFx()
{
return $this->isFx;
}
/**
* @param bool|null $isFx
*/
public function setIsFx($isFx)
{
$this->isFx = $isFx;
}
/**
* @return mixed
*/
public function getFxFee()
{
return $this->fxFee;
}
/**
* @param mixed $fxFee
* @return Transaction
*/
public function setFxFee($fxFee)
{
$this->fxFee = $fxFee;
return $this;
}
}