From c5fe392caed289fc01cada98f5fae4932911f025 Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Wed, 4 Apr 2018 21:23:26 +0800 Subject: [PATCH] Modify invoice creator to properly compute for trade-ins based on size #70 --- src/Controller/JobOrderController.php | 9 ++- src/Ramcar/InvoiceCriteria.php | 30 +++++++-- src/Service/InvoiceCreator.php | 89 +++++++++++++++++---------- 3 files changed, 90 insertions(+), 38 deletions(-) diff --git a/src/Controller/JobOrderController.php b/src/Controller/JobOrderController.php index 6f4cedbc..7bec3f1f 100644 --- a/src/Controller/JobOrderController.php +++ b/src/Controller/JobOrderController.php @@ -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); } } diff --git a/src/Ramcar/InvoiceCriteria.php b/src/Ramcar/InvoiceCriteria.php index 4ad00445..9d4ce652 100644 --- a/src/Ramcar/InvoiceCriteria.php +++ b/src/Ramcar/InvoiceCriteria.php @@ -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; + } } diff --git a/src/Service/InvoiceCreator.php b/src/Service/InvoiceCreator.php index aea1d63f..500a5ad0 100644 --- a/src/Service/InvoiceCreator.php +++ b/src/Service/InvoiceCreator.php @@ -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;