From f3f941e0a002aee867f26619136d33d87be19304 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Mon, 17 Feb 2020 13:24:32 +0000 Subject: [PATCH] Add service charges to invoice generation. #341 --- src/Controller/JobOrderController.php | 4 ++ src/Ramcar/InvoiceCriteria.php | 15 ++++++ .../InvoiceGenerator/CMBInvoiceGenerator.php | 49 +++++++++++++++++++ 3 files changed, 68 insertions(+) diff --git a/src/Controller/JobOrderController.php b/src/Controller/JobOrderController.php index d50471fe..c06383c7 100644 --- a/src/Controller/JobOrderController.php +++ b/src/Controller/JobOrderController.php @@ -694,6 +694,7 @@ class JobOrderController extends Controller $items = $req->request->get('items'); $promo_id = $req->request->get('promo'); $cvid = $req->request->get('cvid'); + $service_charges = $req->request->get('service_charges'); $em = $this->getDoctrine()->getManager(); @@ -740,6 +741,9 @@ class JobOrderController extends Controller // TODO: this snippet should be in the invoice generator $error = $ic->validateDiscount($criteria, $promo_id); + // process service charges + $error = $ic->invoiceServiceCharges($criteria, $service_charges); + if (!$error) $error = $ic->invoiceBatteries($criteria, $items); diff --git a/src/Ramcar/InvoiceCriteria.php b/src/Ramcar/InvoiceCriteria.php index 49290e33..6665226d 100644 --- a/src/Ramcar/InvoiceCriteria.php +++ b/src/Ramcar/InvoiceCriteria.php @@ -5,6 +5,7 @@ namespace App\Ramcar; use App\Entity\Battery; use App\Entity\Promo; use App\Entity\CustomerVehicle; +use App\Entity\ServiceCharge; class InvoiceCriteria { @@ -13,6 +14,7 @@ class InvoiceCriteria protected $cv; protected $flag_coolant; protected $discount; + protected $service_charges; // entries are battery and trade-in combos protected $entries; @@ -25,6 +27,7 @@ class InvoiceCriteria $this->cv = null; $this->flag_coolant = false; $this->discount = 0; + $this->service_charges = []; } public function setServiceType($stype) @@ -138,4 +141,16 @@ class InvoiceCriteria { return $this->discount; } + + public function addServiceCharge(ServiceCharge $service_charge) + { + $this->service_charges[] = $service_charge; + return $this; + } + + public function getServiceCharges() + { + return $this->service_charges; + } + } diff --git a/src/Service/InvoiceGenerator/CMBInvoiceGenerator.php b/src/Service/InvoiceGenerator/CMBInvoiceGenerator.php index cb404c6c..405dfe33 100644 --- a/src/Service/InvoiceGenerator/CMBInvoiceGenerator.php +++ b/src/Service/InvoiceGenerator/CMBInvoiceGenerator.php @@ -18,6 +18,7 @@ use App\Entity\Invoice; use App\Entity\InvoiceItem; use App\Entity\Battery; use App\Entity\User; +use App\Entity\ServiceCharge; use App\Service\InvoiceGeneratorInterface; @@ -105,6 +106,13 @@ class CMBInvoiceGenerator implements InvoiceGeneratorInterface // break; } + // process service charges if any + $service_charges = $criteria->getServiceCharges(); + if (count($service_charges) > 0) + { + $this->processServiceCharges($total, $criteria, $invoice); + } + // get current user $user = $this->security->getUser(); if ($user != null) @@ -286,6 +294,28 @@ class CMBInvoiceGenerator implements InvoiceGeneratorInterface return null; } + public function invoiceServiceCharges(InvoiceCriteria $criteria, $service_charges) + { + if (!empty($service_charges)) + { + foreach ($service_charges as $service_charge) + { + // check if valid service charge + $sc = $this->em->getRepository(ServiceCharge::class)->find($service_charge['id']); + + if (empty($sc)) + { + $error = 'Invalid service charge specified.'; + return $error; + } + + $criteria->addServiceCharge($sc); + } + } + + return null; + } + protected function processEntries(&$total, InvoiceCriteria $criteria, Invoice $invoice) { @@ -604,4 +634,23 @@ class CMBInvoiceGenerator implements InvoiceGeneratorInterface $total['vat'] = $vat; } + protected function processServiceCharges(&$total, InvoiceCriteria $criteria, Invoice $invoice) + { + $service_charges = $criteria->getServiceCharges(); + + foreach ($service_charges as $service_charge) + { + $amount = $service_charge->getAmount(); + + $total['total_price'] += $amount; + // add item + $item = new InvoiceItem(); + $item->setInvoice($invoice) + ->setTitle('Service Charge - ' . $service_charge->getName()) + ->setQuantity(1) + ->setPrice($amount); + + $invoice->addItem($item); + } + } }