Add support for customer credits, add credit manager #730
This commit is contained in:
parent
6d416ee5f1
commit
cb11849489
4 changed files with 171 additions and 0 deletions
92
src/Entity/CreditTransaction.php
Normal file
92
src/Entity/CreditTransaction.php
Normal file
|
|
@ -0,0 +1,92 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Entity;
|
||||||
|
|
||||||
|
use Doctrine\ORM\Mapping as ORM;
|
||||||
|
use Symfony\Component\Validator\Constraints as Assert;
|
||||||
|
|
||||||
|
use DateTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ORM\Entity
|
||||||
|
* @ORM\Table(name="credit_transaction")
|
||||||
|
*/
|
||||||
|
|
||||||
|
class CreditTransaction
|
||||||
|
{
|
||||||
|
// unique id
|
||||||
|
/**
|
||||||
|
* @ORM\Id
|
||||||
|
* @ORM\Column(type="integer")
|
||||||
|
* @ORM\GeneratedValue(strategy="AUTO")
|
||||||
|
*/
|
||||||
|
protected $id;
|
||||||
|
|
||||||
|
// customer
|
||||||
|
/**
|
||||||
|
* @ORM\OneToOne(targetEntity="Customer")
|
||||||
|
* @ORM\JoinColumn(name="customer_id", referencedColumnName="id")
|
||||||
|
*/
|
||||||
|
protected $customer;
|
||||||
|
|
||||||
|
// date transaction was recorded
|
||||||
|
/**
|
||||||
|
* @ORM\Column(type="datetime")
|
||||||
|
*/
|
||||||
|
protected $date_create;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ORM\Column(type="integer")
|
||||||
|
* @Assert\NotBlank()
|
||||||
|
*/
|
||||||
|
protected $amount;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ORM\Column(type="string", length=80)
|
||||||
|
* @Assert\NotBlank()
|
||||||
|
*/
|
||||||
|
protected $transaction_type;
|
||||||
|
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
$this->date_create = new DateTime();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getID()
|
||||||
|
{
|
||||||
|
return $this->id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setCustomer(Customer $customer)
|
||||||
|
{
|
||||||
|
$this->customer = $customer;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setType($transaction_type)
|
||||||
|
{
|
||||||
|
$this->transaction_type = $transaction_type;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getType()
|
||||||
|
{
|
||||||
|
return $this->transaction_type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setAmount($amount)
|
||||||
|
{
|
||||||
|
$this->amount = $amount;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getAmount()
|
||||||
|
{
|
||||||
|
return $this->amount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getCustomer()
|
||||||
|
{
|
||||||
|
return $this->customer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -215,6 +215,11 @@ class Customer
|
||||||
*/
|
*/
|
||||||
protected $create_source;
|
protected $create_source;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ORM\Column(type="integer", options={"unsigned": true, "default":0})
|
||||||
|
*/
|
||||||
|
protected $credits;
|
||||||
|
|
||||||
// customer tags
|
// customer tags
|
||||||
/**
|
/**
|
||||||
* @ORM\ManyToMany(targetEntity="CustomerTag", inversedBy="customers", indexBy="id")
|
* @ORM\ManyToMany(targetEntity="CustomerTag", inversedBy="customers", indexBy="id")
|
||||||
|
|
@ -274,6 +279,8 @@ class Customer
|
||||||
$this->create_source = 'unknown';
|
$this->create_source = 'unknown';
|
||||||
|
|
||||||
$this->ratings = new ArrayCollection();
|
$this->ratings = new ArrayCollection();
|
||||||
|
|
||||||
|
$this->credits = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getID()
|
public function getID()
|
||||||
|
|
@ -700,4 +707,15 @@ class Customer
|
||||||
{
|
{
|
||||||
return $this->customer_user;
|
return $this->customer_user;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function modifyCredits($amount)
|
||||||
|
{
|
||||||
|
$this->credits = bcadd($this->credits, $amount);
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getCredits()
|
||||||
|
{
|
||||||
|
return $this->credits;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
14
src/Ramcar/CreditTransactionType.php
Normal file
14
src/Ramcar/CreditTransactionType.php
Normal file
|
|
@ -0,0 +1,14 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Ramcar;
|
||||||
|
|
||||||
|
class CreditTransactionType extends NameValue
|
||||||
|
{
|
||||||
|
const PURCHASE = 'purchase';
|
||||||
|
const REDEMPTION = 'redemption';
|
||||||
|
|
||||||
|
const COLLECTION = [
|
||||||
|
'purchase' => 'Purchase',
|
||||||
|
'redemption' => 'Redemption',
|
||||||
|
];
|
||||||
|
}
|
||||||
47
src/Service/CreditManager.php
Normal file
47
src/Service/CreditManager.php
Normal file
|
|
@ -0,0 +1,47 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Service;
|
||||||
|
|
||||||
|
use App\Entity\Customer;
|
||||||
|
use App\Entity\CreditTransaction;
|
||||||
|
use App\Ramcar\CreditTransactionType;
|
||||||
|
|
||||||
|
use Doctrine\ORM\EntityManagerInterface;
|
||||||
|
|
||||||
|
use Exception;
|
||||||
|
|
||||||
|
class CreditManager
|
||||||
|
{
|
||||||
|
protected $cust;
|
||||||
|
protected $em;
|
||||||
|
|
||||||
|
public function __construct(Customer $cust, EntityManagerInterface $em)
|
||||||
|
{
|
||||||
|
$this->cust = $cust;
|
||||||
|
$this->em = $em;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function recordTransaction($type, $amount)
|
||||||
|
{
|
||||||
|
// make sure this is a valid transaction type
|
||||||
|
$this->validateType($type);
|
||||||
|
|
||||||
|
// update customer
|
||||||
|
$this->cust->modifyCredits($amount);
|
||||||
|
|
||||||
|
// create new record
|
||||||
|
$trans = new CreditTransaction();
|
||||||
|
$trans->setCustomer($this->cust)
|
||||||
|
->setAmount($amount)
|
||||||
|
->setType($type);
|
||||||
|
|
||||||
|
$this->em->persist($trans);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function validateType($type)
|
||||||
|
{
|
||||||
|
if (!CreditTransactionType::validate($type)) {
|
||||||
|
throw new Exception('Invalid transaction type');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue