Modify invoice creator to properly compute for trade-ins based on size #70
This commit is contained in:
parent
ef85141587
commit
c5fe392cae
3 changed files with 90 additions and 38 deletions
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue