resq/src/InvoiceRule/PriceTier.php

220 lines
6.3 KiB
PHP

<?php
namespace App\InvoiceRule;
use Doctrine\ORM\EntityManagerInterface;
use App\InvoiceRuleInterface;
use App\Ramcar\ServiceType;
use App\Ramcar\TradeInType;
use App\Entity\PriceTier as PTEntity;
class PriceTier implements InvoiceRuleInterface
{
protected $em;
public function __construct(EntityManagerInterface $em)
{
$this->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;
}
}