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 and battery warranty (sometimes they add a battery // for battery warranty if (($service_type == ServiceType::BATTERY_REPLACEMENT_NEW) || ($service_type == ServiceType::BATTERY_REPLACEMENT_WARRANTY)) { $items = $this->processBatteryEntries($criteria, $total); } else { // TODO: process the service fees $items = $this->processServiceEntries($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(); } // TODO: finish this } 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) { // check if battery purchase or battery replacement if ($service_type == ServiceType::BATTERY_REPLACEMENT_NEW) $price = $batt->getSellingPrice(); else $price = 0; $items[] = [ 'service_type' => $this->getID(), 'battery' => $batt, 'qty' => $qty, 'title' => $this->getItemTitle($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 processServiceEntries($criteria, &$total) { } protected function getItemTitle($service_type, $battery) { $title =''; // TODO: check for service type switch ($service_type) { case (ServiceType::BATTERY_REPLACEMENT_NEW): $title = $battery->getModel()->getName() . ' ' . $battery->getSize()->getName(); break; case (ServiceType::BATTERY_REPLACEMENT_WARRANTY): $title = $battery->getModel()->getName() . ' ' . $battery->getSize()->getName() . ' - Service Unit'; break; default: $title = ''; break; } return $title; protected function getServiceTitle($service_type, $fuel_type) { $title = ''; switch ($service_type) { case (ServiceType::JUMPSTART_TROUBLESHOOT): case (ServiceType::JUMPSTART_WARRANTY): $title = 'Service - Troubleshooting fee'; break; case (ServiceType::OVERHEAT_ASSISTANCE): $title = 'Service - ' . ServiceType::getName(ServiceType::OVERHEAT_ASSISTANCE); break; case (ServiceType::POST_RECHARGED): $title = 'Recharge fee'; break; case (ServiceType::POST_REPLACEMENT): $title = 'Battery replacement'; break; case (ServiceType::TIRE_REPAIR): $title = 'Service - Flat Tire'; break; case (ServiceType::EMERGENCY_REFUEL): $title = '4L - ' . ucfirst($fuel_type); break; default: $title = ''; } return $title; } protected function getServiceCoolantTitle() { $title = '4L Coolant'; return $title; } }