From 70ee7fdd8972da0e400f3b36da6d1908478eee7b Mon Sep 17 00:00:00 2001 From: root Date: Fri, 19 Jan 2024 04:14:06 -0500 Subject: [PATCH] Add invoice rule for price tier. #782 --- src/InvoiceRule/PriceTier.php | 157 +++++++++++++++++++++++++++++++++ src/Ramcar/InvoiceCriteria.php | 12 +++ 2 files changed, 169 insertions(+) create mode 100644 src/InvoiceRule/PriceTier.php diff --git a/src/InvoiceRule/PriceTier.php b/src/InvoiceRule/PriceTier.php new file mode 100644 index 00000000..4db12b55 --- /dev/null +++ b/src/InvoiceRule/PriceTier.php @@ -0,0 +1,157 @@ +em = $em; + } + + public function getID() + { + return 'price_tier'; + } + + public function compute($criteria, &$total) + { + $pt_id = $criteria->getPriceTier(); + + // get the service type + $service_type = $criteria->getServiceType(); + + // get price tier + $pt = $em->getRepository(PTEntity::class)->find($pt_id); + + // price tier is default + if ($pt == null) + { + // check if service type is battery sales + if ($service_type == ServiceType::BATTERY_REPLACEMENT_NEW) + { + $items = $this->processBatteryEntries($criteria, $total); + } + } + else + { + // get items in price tier + $pt_items = $pt->getItemPrices(); + + foreach ($pt_items as $pt_item) + { + // make item price hash + $pt_prices[$pt_item->getItemID()] = $pt_item->getPrice(); + } + } + + return $items; + } + + public function validatePromo($criteria, $promo_id) + { + return false; + } + + public function validateInvoiceItems($criteria, $invoice_items) + { + // check service type. Only battery sales and battery warranty should have invoice items. + $stype = $criteria->getServiceType(); + if (($stype != ServiceType::BATTERY_REPLACEMENT_NEW) && + ($stype != ServiceType::BATTERY_REPLACEMENT_WARRANTY)) + return null; + + // return error if there's a problem, false otherwise + if (!empty($invoice_items)) + { + // check if this is a valid battery + foreach ($invoice_items as $item) + { + $battery = $this->em->getRepository(Battery::class)->find($item['battery']); + + if (empty($battery)) + { + $error = 'Invalid battery specified.'; + return $error; + } + + // quantity + $qty = $item['quantity']; + if ($qty < 1) + continue; + + // if this is a trade in, add trade in + if (!empty($item['trade_in']) && TradeInType::validate($item['trade_in'])) + $trade_in = $item['trade_in']; + else + $trade_in = null; + + $criteria->addEntry($battery, $trade_in, $qty); + } + } + + return null; + } + + protected function processBatteryEntries($criteria, &$total) + { + $items = []; + + // get the entries + $entries = $criteria->getEntries(); + foreach($entries as $entry) + { + $batt = $entry['battery']; + $qty = $entry['qty']; + $trade_in = null; + + if (isset($entry['trade_in'])) + $trade_in = $entry['trade_in']; + + $size = $batt->getSize(); + + if ($trade_in == null) + { + // battery purchase + $price = $batt->getSellingPrice(); + + $items[] = [ + 'service_type' => $this->getID(), + 'battery' => $batt, + 'qty' => $qty, + 'title' => $this->getTitle($criteria->getServiceType(), $batt), + 'price' => $price, + ]; + + $qty_price = bcmul($price, $qty, 2); + + $total['sell_price'] = bcadd($total['sell_price'], $qty_price, 2); + $total['total_price'] = bcadd($total['total_price'], $qty_price, 2); + } + } + + return $items; + } + + protected function getTitle($service_type, $battery) + { + $title =''; + + // TODO: check for service type + $title = $battery->getModel()->getName() . ' ' . $battery->getSize()->getName(); + + return $title; + } + +} diff --git a/src/Ramcar/InvoiceCriteria.php b/src/Ramcar/InvoiceCriteria.php index b27395da..18ebd82a 100644 --- a/src/Ramcar/InvoiceCriteria.php +++ b/src/Ramcar/InvoiceCriteria.php @@ -17,6 +17,7 @@ class InvoiceCriteria protected $service_charges; protected $flag_taxable; protected $source; // use Ramcar's TransactionOrigin + protected $price_tier; // entries are battery and trade-in combos protected $entries; @@ -32,6 +33,7 @@ class InvoiceCriteria $this->service_charges = []; $this->flag_taxable = false; $this->source = ''; + $this->price_tier = 0; // set to default } public function setServiceType($stype) @@ -179,4 +181,14 @@ class InvoiceCriteria return $this->source; } + public function setPriceTier($price_tier) + { + $this->price_tier = $price_tier; + return $this; + } + + public function getPriceTier() + { + return $this->price_tier; + } }