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; } }