115 lines
2.8 KiB
PHP
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;
|
|
}
|
|
}
|