diff --git a/src/Entity/InvoiceItem.php b/src/Entity/InvoiceItem.php index 57758722..bd90c5e8 100644 --- a/src/Entity/InvoiceItem.php +++ b/src/Entity/InvoiceItem.php @@ -50,6 +50,13 @@ class InvoiceItem */ protected $battery; + // battery size for trade in items + /** + * @ORM\ManyToOne(targetEntity="BatterySize") + * @ORM\JoinColumn(name="battery_size_id", referencedColumnName="id") + */ + protected $battery_size; + public function __construct() { $this->title = ''; @@ -115,4 +122,15 @@ class InvoiceItem { return $this->battery; } + + public function setBatterySize(BatterySize $battery_size) + { + $this->battery_size = $battery_size; + return $this; + } + + public function getBatterySize() + { + return $this->battery_size; + } } diff --git a/src/InvoiceRule/BatterySales.php b/src/InvoiceRule/BatterySales.php index f3b66c11..5dba1398 100644 --- a/src/InvoiceRule/BatterySales.php +++ b/src/InvoiceRule/BatterySales.php @@ -117,12 +117,17 @@ class BatterySales implements InvoiceRuleInterface 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; + $trade_in = null; */ - $criteria->addEntry($battery, $trade_in, $qty); + if (empty($item['trade_in'])) + { + $trade_in = null; + $criteria->addEntry($battery, $trade_in, $qty); + } } } diff --git a/src/InvoiceRule/TradeIn.php b/src/InvoiceRule/TradeIn.php index 224bf098..b4872472 100644 --- a/src/InvoiceRule/TradeIn.php +++ b/src/InvoiceRule/TradeIn.php @@ -2,12 +2,24 @@ namespace App\InvoiceRule; +use Doctrine\ORM\EntityManagerInterface; + use App\InvoiceRuleInterface; use App\Ramcar\TradeInType; +use App\Ramcar\ServiceType; + +use App\Entity\Battery; class TradeIn implements InvoiceRuleInterface { + protected $em; + + public function __construct(EntityManagerInterface $em) + { + $this->em = $em; + } + public function getID() { return 'trade-in'; @@ -32,12 +44,12 @@ class TradeIn implements InvoiceRuleInterface // at this point, entry is a trade in // need to check if battery (coming from CRM) is set // or battery_size is set (coming from rider app) - if (isset($entry['battery'])) - { - $battery = $entry['battery']; - $batt_size = $battery->getSize(); - } - else + //if (isset($entry['battery'])) + //{ + // $battery = $entry['battery']; + // $batt_size = $battery->getSize(); + //} + //else $batt_size = $entry['battery_size']; $ti_rate = $this->getTradeInRate($batt_size, $trade_in_type); @@ -50,6 +62,7 @@ class TradeIn implements InvoiceRuleInterface $price = bcmul($ti_rate, -1, 2); $items[] = [ + 'battery_size' => $batt_size, 'qty' => $qty, 'title' => $this->getTitle($batt_size, $trade_in_type), 'price' => $price, @@ -67,6 +80,41 @@ class TradeIn implements InvoiceRuleInterface public function validateInvoiceItems($criteria, $invoice_items) { + // check service type. Only battery sales and battery warranty should have invoice items. Since this is the battery sales + // rule, we only check for battery sales. + $stype = $criteria->getServiceType(); + if ($stype != ServiceType::BATTERY_REPLACEMENT_NEW) + 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']; + $battery_size = $battery->getSize(); + $criteria->addTradeInEntry($battery_size, $trade_in, $qty); + } + } + } + return null; } diff --git a/src/Service/InvoiceManager.php b/src/Service/InvoiceManager.php index 8f655224..2a883593 100644 --- a/src/Service/InvoiceManager.php +++ b/src/Service/InvoiceManager.php @@ -55,7 +55,7 @@ class InvoiceManager implements InvoiceGeneratorInterface new InvoiceRule\Fuel($this->em, $this->pt_manager), new InvoiceRule\TireRepair($this->em, $this->pt_manager), new InvoiceRule\DiscountType($this->em), - new InvoiceRule\TradeIn(), + new InvoiceRule\TradeIn($this->em), new InvoiceRule\Tax($this->em, $this->pt_manager), ]; } @@ -166,6 +166,7 @@ class InvoiceManager implements InvoiceGeneratorInterface // (3) generateInvoiceCriteria // (4) RiderAPIHandler's changeService // (5) TAPI's JobOrderController + // (6) CAPI's RiderAppController public function generateInvoice($criteria) { // no need to validate since generateDraftInvoice was called before this was called @@ -214,17 +215,22 @@ class InvoiceManager implements InvoiceGeneratorInterface $price = $item['price']; $battery = null; + $battery_size = null; if (isset($item['battery'])) $battery = $item['battery']; if (isset($item['promo'])) $promo = $item['promo']; + if (isset($item['battery_size'])) + $battery_size = $item['battery_size']; + $invoice_items[] = [ 'title' => $title, 'quantity' => $quantity, 'price' => $price, 'battery' => $battery, + 'battery_size' => $battery_size, ]; } } @@ -278,6 +284,9 @@ class InvoiceManager implements InvoiceGeneratorInterface if ($item['battery'] != null) $invoice_item->setBattery($item['battery']); + if ($item['battery_size'] != null) + $invoice_item->setBatterySize($item['battery_size']); + $invoice->addItem($invoice_item); } diff --git a/src/Service/JobOrderHandler/ResqJobOrderHandler.php b/src/Service/JobOrderHandler/ResqJobOrderHandler.php index 419c27c3..55486d0c 100644 --- a/src/Service/JobOrderHandler/ResqJobOrderHandler.php +++ b/src/Service/JobOrderHandler/ResqJobOrderHandler.php @@ -2312,6 +2312,13 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface $em = $this->em; $jo = $em->getRepository(JobOrder::class)->find($id); + // get the job order's invoice items + $invoice = $jo->getInvoice(); + $invoice_items = []; + if ($invoice != null) + $invoice_items = $invoice->getItems(); + + $params['invoice_items'] = $invoice_items; $params['obj'] = $jo; $params['mode'] = 'open_edit'; $params['cvid'] = $jo->getCustomerVehicle()->getID(); diff --git a/templates/job-order/form.html.twig b/templates/job-order/form.html.twig index afebb564..c0332bb4 100644 --- a/templates/job-order/form.html.twig +++ b/templates/job-order/form.html.twig @@ -630,20 +630,24 @@
-
- - {% if ftags.invoice_edit %} - - - {% else %} - - {% endif %} -
+
+ + {% if ftags.invoice_edit %} + + + {% else %} + + {% endif %} +
@@ -1194,6 +1198,8 @@