resq/src/Service/InvoiceCreator.php
2018-02-02 02:31:22 +08:00

115 lines
2.8 KiB
PHP

<?php
namespace App\Service;
use App\Ramcar\InvoiceCriteria;
use App\Entity\Invoice;
use App\Entity\InvoiceItem;
use App\Entity\User;
use Doctrine\Common\Util\Debug;
class InvoiceCreator
{
const VAT_RATE = 0.12;
const TIRATE_MOTOLITE = 300.00;
const TIRATE_OTHER = 150.00;
// creates invoice based on the criteria sent
public function __construct()
{
}
public function getVATAmount($price)
{
$vat_ex_price = $this->getVATExclusivePrice($price);
return round($vat_ex_price * self::VAT_RATE, 2);
}
public function getVATExclusivePrice($price)
{
return round($price / (1 + self::VAT_RATE), 2);
}
public function getTradeInRate($trade_in)
{
if ($trade_in == 'motolite')
return self::TIRATE_MOTOLITE;
return self::TIRATE_OTHER;
}
public function processCriteria(InvoiceCriteria $criteria)
{
$invoice = new Invoice();
$total = [
'sell_price' => 0.0,
'vat' => 0.0,
'vat_ex_price' => 0.0,
'ti_rate' => 0.0,
'total_price' => 0.0,
];
// get batteries
$batts = $criteria->getBatteries();
foreach ($batts as $batt)
{
$sell_price = $batt->getSellingPrice();
$vat = $this->getVATAmount($sell_price);
$vat_ex_price = $this->getVATExclusivePrice($sell_price);
$total['sell_price'] += $sell_price;
$total['vat'] += $vat;
$total['vat_ex_price'] += $vat_ex_price;
$total['total_price'] += $sell_price;
// add item
$item = new InvoiceItem();
$item->setInvoice($invoice)
->setTitle($batt->getModel()->getName() . ' ' . $batt->getSize()->getName())
->setQuantity(1)
->setPrice($sell_price);
$invoice->addItem($item);
}
// get trade-ins
$trade_ins = $criteria->getTradeIns();
foreach ($trade_ins as $ti)
{
$ti_rate = $this->getTradeInRate($ti);
$total['ti_rate'] += $ti_rate;
$total['total_price'] -= $ti_rate;
// add item
$item = new InvoiceItem();
$item->setInvoice($invoice)
->setTitle('Trade-in battery')
->setQuantity(1)
->setPrice($ti_rate);
$invoice->addItem($item);
}
// TODO: check if any promo is applied
// apply discounts
$promos = $criteria->getPromos();
$invoice->setTotalPrice($total['total_price'])
->setVAT($total['vat'])
->setDiscount($total['ti_rate']);
// dump
//Debug::dump($invoice, 1);
return $invoice;
}
}