Modify invoice creator to properly compute for trade-ins based on size #70

This commit is contained in:
Kendrick Chan 2018-04-04 21:23:26 +08:00
parent ef85141587
commit c5fe392cae
3 changed files with 90 additions and 38 deletions

View file

@ -1541,6 +1541,7 @@ class JobOrderController extends BaseController
{
foreach ($items as $item)
{
error_log('ITEMS');
// check if this is a valid battery
$battery = $em->getRepository(Battery::class)->find($item['battery']);
@ -1555,12 +1556,18 @@ class JobOrderController extends BaseController
if ($qty < 1)
continue;
/*
// add to criteria
$criteria->addBattery($battery, $qty);
*/
// if this is a trade in, add trade in
if (!empty($item['trade_in']) && TradeInType::validate($item['trade_in']))
$criteria->addTradeIn($item['trade_in'] == 'motolite', $qty);
$trade_in = $item['trade_in'];
else
$trade_in = null;
$criteria->addEntry($battery, $trade_in, $qty);
}
}

View file

@ -8,16 +8,16 @@ use App\Entity\Promo;
class InvoiceCriteria
{
protected $stype;
protected $batteries;
protected $promos;
protected $trade_in;
// entries are battery and trade-in combos
protected $entries;
public function __construct()
{
$this->stype = 0;
$this->batteries = [];
$this->promos = [];
$this->trade_ins = [];
$this->entries = [];
}
public function setServiceType($stype)
@ -32,6 +32,7 @@ class InvoiceCriteria
return $this->stype;
}
/*
public function addBattery(Battery $battery, $qty = 1)
{
for ($i = 0; $i < $qty; $i++)
@ -43,6 +44,7 @@ class InvoiceCriteria
{
return $this->batteries;
}
*/
public function addPromo(Promo $promo)
{
@ -55,6 +57,7 @@ class InvoiceCriteria
return $this->promos;
}
/*
public function addTradeIn($is_motolite, $qty = 1)
{
// NOTE: this asumes that all the rates for trade-ins are standardized
@ -76,4 +79,23 @@ class InvoiceCriteria
{
return $this->trade_ins;
}
*/
public function addEntry($battery, $trade_in, $qty)
{
// trade_in is null if no trade_in specified
$entry = [
'battery' => $battery,
'trade_in' => $trade_in,
'qty' => $qty
];
$this->entries[] = $entry;
}
public function getEntries()
{
return $this->entries;
}
}

View file

@ -16,8 +16,6 @@ use Doctrine\Common\Util\Debug;
class InvoiceCreator
{
const VAT_RATE = 0.12;
const TIRATE_MOTOLITE = 200.00;
const TIRATE_OTHER = 100.00;
// creates invoice based on the criteria sent
public function __construct()
@ -35,37 +33,72 @@ class InvoiceCreator
return round($price / (1 + self::VAT_RATE), 2);
}
public function getTradeInRate($trade_in)
public function getTradeInRate($ti)
{
// TODO: modify this with the prices based on size
if ($trade_in == 'motolite')
return self::TIRATE_MOTOLITE;
$size = $ti['size'];
$trade_in = $ti['trade_in'];
return self::TIRATE_OTHER;
if ($trade_in == null)
return 0;
switch ($trade_in)
{
case TradeInType::MOTOLITE:
return $size->getTIPriceMotolite();
case TradeInType::PREMIUM:
return $size->getTIPricePremium();
case TradeInType::OTHER:
return $size->getTIPriceOther();
}
return 0;
}
protected function processBatteries(&$total, InvoiceCriteria $criteria, Invoice $invoice)
protected function processEntries(&$total, InvoiceCriteria $criteria, Invoice $invoice)
{
// get batteries
$batts = $criteria->getBatteries();
error_log('processing entries...');
$entries = $criteria->getEntries();
// consolidate batteries
$con_batts = [];
foreach ($batts as $batt)
$con_tis = [];
foreach ($entries as $entry)
{
$batt_id = $batt->getID();
$batt = $entry['battery'];
$qty = $entry['qty'];
$trade_in = $entry['trade_in'];
$size = $batt->getSize();
// initialize
// consolidate batteries
$batt_id = $batt->getID();
if (!isset($con_batts[$batt_id]))
$con_batts[$batt->getID()] = [
'batt' => $batt,
'qty' => 0
];
// increment quantity
$con_batts[$batt_id]['qty']++;
// no trade-in
if ($trade_in == null)
continue;
// consolidate trade-ins
$ti_key = $size->getID() . '|' . $trade_in;
if (!isset($con_tis[$ti_key]))
$con_tis[$ti_key] = [
'size' => $size,
'trade_in' => $trade_in,
'qty' => 0
];
$con_tis[$ti_key]['qty']++;
}
$this->processBatteries($total, $con_batts, $invoice);
$this->processTradeIns($total, $con_tis, $invoice);
}
protected function processBatteries(&$total, $con_batts, Invoice $invoice)
{
// process batteries
foreach ($con_batts as $con_data)
{
@ -94,24 +127,11 @@ class InvoiceCreator
}
}
protected function processTradeIns(&$total, InvoiceCriteria $criteria, Invoice $invoice)
protected function processTradeIns(&$total, $con_tis, Invoice $invoice)
{
// get trade-ins
$trade_ins = $criteria->getTradeIns();
// consolidate
$con_tis = [];
foreach ($trade_ins as $ti)
{
if (!isset($con_tis[$ti]))
$con_tis[$ti] = 0;
$con_tis[$ti]++;
}
// process
foreach ($con_tis as $ti => $qty)
foreach ($con_tis as $ti)
{
$qty = $ti['qty'];
$ti_rate = $this->getTradeInRate($ti);
$total['ti_rate'] += $ti_rate * $qty;
@ -120,7 +140,7 @@ class InvoiceCreator
// add item
$item = new InvoiceItem();
$item->setInvoice($invoice)
->setTitle('Trade-in ' . TradeInType::getName($ti) . ' battery')
->setTitle('Trade-in ' . TradeInType::getName($ti['trade_in']) . ' ' . $ti['size']->getName() . ' battery')
->setQuantity($qty)
->setPrice($ti_rate * -1);
@ -220,8 +240,11 @@ class InvoiceCreator
break;
case ServiceType::BATTERY_REPLACEMENT_NEW:
$this->processEntries($total, $criteria, $invoice);
/*
$this->processBatteries($total, $criteria, $invoice);
$this->processTradeIns($total, $criteria, $invoice);
*/
$this->processDiscount($total, $criteria, $invoice);
break;