Move the invoice generation out of the job order service and into the invoice generator service. #270
This commit is contained in:
parent
08bd23fe30
commit
f205f04b48
5 changed files with 290 additions and 271 deletions
|
|
@ -3,6 +3,9 @@
|
||||||
namespace App\Service\InvoiceGenerator;
|
namespace App\Service\InvoiceGenerator;
|
||||||
|
|
||||||
use Symfony\Component\Security\Core\Security;
|
use Symfony\Component\Security\Core\Security;
|
||||||
|
use Symfony\Component\Validator\Validator\ValidatorInterface;
|
||||||
|
|
||||||
|
use Doctrine\ORM\EntityManagerInterface;
|
||||||
|
|
||||||
use App\Ramcar\InvoiceCriteria;
|
use App\Ramcar\InvoiceCriteria;
|
||||||
use App\Ramcar\InvoiceStatus;
|
use App\Ramcar\InvoiceStatus;
|
||||||
|
|
@ -13,6 +16,8 @@ use App\Ramcar\FuelType;
|
||||||
|
|
||||||
use App\Entity\Invoice;
|
use App\Entity\Invoice;
|
||||||
use App\Entity\InvoiceItem;
|
use App\Entity\InvoiceItem;
|
||||||
|
use App\Entity\Battery;
|
||||||
|
use App\Entity\Promo;
|
||||||
use App\Entity\User;
|
use App\Entity\User;
|
||||||
|
|
||||||
use App\Service\InvoiceGeneratorInterface;
|
use App\Service\InvoiceGeneratorInterface;
|
||||||
|
|
@ -33,11 +38,16 @@ class CMBInvoiceGenerator implements InvoiceGeneratorInterface
|
||||||
const REFUEL_FEE_DIESEL = 220;
|
const REFUEL_FEE_DIESEL = 220;
|
||||||
|
|
||||||
private $security;
|
private $security;
|
||||||
|
protected $em;
|
||||||
|
protected $validator;
|
||||||
|
|
||||||
// creates invoice based on the criteria sent
|
// creates invoice based on the criteria sent
|
||||||
public function __construct(Security $security)
|
public function __construct(Security $security, EntityManagerInterface $em,
|
||||||
|
ValidatorInterface $validator)
|
||||||
{
|
{
|
||||||
$this->security = $security;
|
$this->security = $security;
|
||||||
|
$this->em = $em;
|
||||||
|
$this->validator = $validator;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function generateInvoice(InvoiceCriteria $criteria)
|
public function generateInvoice(InvoiceCriteria $criteria)
|
||||||
|
|
@ -121,6 +131,69 @@ class CMBInvoiceGenerator implements InvoiceGeneratorInterface
|
||||||
return $invoice;
|
return $invoice;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// generate invoice criteria
|
||||||
|
public function generateInvoiceCriteria($jo, $promo_id, $invoice_items, &$error_array)
|
||||||
|
{
|
||||||
|
$em = $this->em;
|
||||||
|
|
||||||
|
// instantiate the invoice criteria
|
||||||
|
$criteria = new InvoiceCriteria();
|
||||||
|
$criteria->setServiceType($jo->getServiceType())
|
||||||
|
->setCustomerVehicle($jo->getCustomerVehicle());
|
||||||
|
|
||||||
|
$ierror = $this->invoicePromo($criteria, $promo_id);
|
||||||
|
|
||||||
|
if (!$ierror && !empty($invoice_items))
|
||||||
|
{
|
||||||
|
// check for trade-in so we can mark it for mobile app
|
||||||
|
foreach ($invoice_items as $item)
|
||||||
|
{
|
||||||
|
// get first trade-in
|
||||||
|
if (!empty($item['trade_in']))
|
||||||
|
{
|
||||||
|
$jo->getTradeInType($item['trade_in']);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$ierror = $this->invoiceBatteries($criteria, $invoice_items);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($ierror)
|
||||||
|
{
|
||||||
|
$error_array['invoice'] = $ierror;
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// generate the invoice
|
||||||
|
$iobj = $this->generateInvoice($criteria);
|
||||||
|
|
||||||
|
// validate
|
||||||
|
$ierrors = $this->validator->validate($iobj);
|
||||||
|
|
||||||
|
// add errors to list
|
||||||
|
foreach ($ierrors as $error) {
|
||||||
|
$error_array[$error->getPropertyPath()] = $error->getMessage();
|
||||||
|
}
|
||||||
|
|
||||||
|
// check if invoice already exists for JO
|
||||||
|
$old_invoice = $jo->getInvoice();
|
||||||
|
if ($old_invoice != null)
|
||||||
|
{
|
||||||
|
// remove old invoice
|
||||||
|
$em->remove($old_invoice);
|
||||||
|
$em->flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
// add invoice to JO
|
||||||
|
$jo->setInvoice($iobj);
|
||||||
|
|
||||||
|
$em->persist($iobj);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected function getTaxAmount($price)
|
protected function getTaxAmount($price)
|
||||||
{
|
{
|
||||||
$vat_ex_price = $this->getTaxExclusivePrice($price);
|
$vat_ex_price = $this->getTaxExclusivePrice($price);
|
||||||
|
|
@ -154,6 +227,75 @@ class CMBInvoiceGenerator implements InvoiceGeneratorInterface
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function invoicePromo(InvoiceCriteria $criteria, $promo_id)
|
||||||
|
{
|
||||||
|
// return error if there's a problem, false otherwise
|
||||||
|
// check service type
|
||||||
|
$stype = $criteria->getServiceType();
|
||||||
|
if ($stype != ServiceType::BATTERY_REPLACEMENT_NEW)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
|
||||||
|
if (empty($promo_id))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// check if this is a valid promo
|
||||||
|
$promo = $this->em->getRepository(Promo::class)->find($promo_id);
|
||||||
|
|
||||||
|
if (empty($promo))
|
||||||
|
return 'Invalid promo specified.';
|
||||||
|
|
||||||
|
$criteria->addPromo($promo);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function invoiceBatteries(InvoiceCriteria $criteria, $items)
|
||||||
|
{
|
||||||
|
// check service type
|
||||||
|
$stype = $criteria->getServiceType();
|
||||||
|
if ($stype != ServiceType::BATTERY_REPLACEMENT_NEW && $stype != ServiceType::BATTERY_REPLACEMENT_WARRANTY)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
// return error if there's a problem, false otherwise
|
||||||
|
if (!empty($items))
|
||||||
|
{
|
||||||
|
foreach ($items as $item)
|
||||||
|
{
|
||||||
|
// check if this is a valid battery
|
||||||
|
$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;
|
||||||
|
|
||||||
|
/*
|
||||||
|
// add to criteria
|
||||||
|
$criteria->addBattery($battery, $qty);
|
||||||
|
*/
|
||||||
|
|
||||||
|
// 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;
|
||||||
|
|
||||||
|
$criteria->addEntry($battery, $trade_in, $qty);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
protected function processEntries(&$total, InvoiceCriteria $criteria, Invoice $invoice)
|
protected function processEntries(&$total, InvoiceCriteria $criteria, Invoice $invoice)
|
||||||
{
|
{
|
||||||
// error_log('processing entries...');
|
// error_log('processing entries...');
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,9 @@
|
||||||
namespace App\Service\InvoiceGenerator;
|
namespace App\Service\InvoiceGenerator;
|
||||||
|
|
||||||
use Symfony\Component\Security\Core\Security;
|
use Symfony\Component\Security\Core\Security;
|
||||||
|
use Symfony\Component\Validator\Validator\ValidatorInterface;
|
||||||
|
|
||||||
|
use Doctrine\ORM\EntityManagerInterface;
|
||||||
|
|
||||||
use App\Ramcar\InvoiceCriteria;
|
use App\Ramcar\InvoiceCriteria;
|
||||||
use App\Ramcar\InvoiceStatus;
|
use App\Ramcar\InvoiceStatus;
|
||||||
|
|
@ -33,11 +36,16 @@ class ResqInvoiceGenerator implements InvoiceGeneratorInterface
|
||||||
const REFUEL_FEE_DIESEL = 220;
|
const REFUEL_FEE_DIESEL = 220;
|
||||||
|
|
||||||
private $security;
|
private $security;
|
||||||
|
protected $em;
|
||||||
|
protected $validator;
|
||||||
|
|
||||||
// creates invoice based on the criteria sent
|
// creates invoice based on the criteria sent
|
||||||
public function __construct(Security $security)
|
public function __construct(Security $security, EntityManagerInterface $em,
|
||||||
|
ValidatorInterface $validator)
|
||||||
{
|
{
|
||||||
$this->security = $security;
|
$this->security = $security;
|
||||||
|
$this->em = $em;
|
||||||
|
$this->validator = $validator;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function generateInvoice(InvoiceCriteria $criteria)
|
public function generateInvoice(InvoiceCriteria $criteria)
|
||||||
|
|
@ -108,9 +116,6 @@ class ResqInvoiceGenerator implements InvoiceGeneratorInterface
|
||||||
$invoice->setCreatedBy($user);
|
$invoice->setCreatedBy($user);
|
||||||
}
|
}
|
||||||
|
|
||||||
// NOTE: we compute and save VAT up to the 2nd decimal place.
|
|
||||||
// it's only in the display when viewing a job order, where
|
|
||||||
// VAT is seen as a whole number.
|
|
||||||
$invoice->setTotalPrice($total['total_price'])
|
$invoice->setTotalPrice($total['total_price'])
|
||||||
->setVATExclusivePrice($total['vat_ex_price'])
|
->setVATExclusivePrice($total['vat_ex_price'])
|
||||||
->setVAT($total['vat'])
|
->setVAT($total['vat'])
|
||||||
|
|
@ -124,6 +129,69 @@ class ResqInvoiceGenerator implements InvoiceGeneratorInterface
|
||||||
return $invoice;
|
return $invoice;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// generate invoice criteria
|
||||||
|
public function generateInvoiceCriteria($jo, $promo_id, $invoice_items, &$error_array)
|
||||||
|
{
|
||||||
|
$em = $this->em;
|
||||||
|
|
||||||
|
// instantiate the invoice criteria
|
||||||
|
$criteria = new InvoiceCriteria();
|
||||||
|
$criteria->setServiceType($jo->getServiceType())
|
||||||
|
->setCustomerVehicle($jo->getCustomerVehicle());
|
||||||
|
|
||||||
|
$ierror = $this->invoicePromo($criteria, $promo_id);
|
||||||
|
|
||||||
|
if (!$ierror && !empty($invoice_items))
|
||||||
|
{
|
||||||
|
// check for trade-in so we can mark it for mobile app
|
||||||
|
foreach ($invoice_items as $item)
|
||||||
|
{
|
||||||
|
// get first trade-in
|
||||||
|
if (!empty($item['trade_in']))
|
||||||
|
{
|
||||||
|
$jo->getTradeInType($item['trade_in']);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$ierror = $this->invoiceBatteries($criteria, $invoice_items);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($ierror)
|
||||||
|
{
|
||||||
|
$error_array['invoice'] = $ierror;
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// generate the invoice
|
||||||
|
$iobj = $this->generateInvoice($criteria);
|
||||||
|
|
||||||
|
// validate
|
||||||
|
$ierrors = $this->validator->validate($iobj);
|
||||||
|
|
||||||
|
// add errors to list
|
||||||
|
foreach ($ierrors as $error) {
|
||||||
|
$error_array[$error->getPropertyPath()] = $error->getMessage();
|
||||||
|
}
|
||||||
|
|
||||||
|
// check if invoice already exists for JO
|
||||||
|
$old_invoice = $jo->getInvoice();
|
||||||
|
if ($old_invoice != null)
|
||||||
|
{
|
||||||
|
// remove old invoice
|
||||||
|
$em->remove($old_invoice);
|
||||||
|
$em->flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
// add invoice to JO
|
||||||
|
$jo->setInvoice($iobj);
|
||||||
|
|
||||||
|
$em->persist($iobj);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected function getTaxAmount($price)
|
protected function getTaxAmount($price)
|
||||||
{
|
{
|
||||||
$vat_ex_price = $this->getTaxExclusivePrice($price);
|
$vat_ex_price = $this->getTaxExclusivePrice($price);
|
||||||
|
|
@ -157,6 +225,75 @@ class ResqInvoiceGenerator implements InvoiceGeneratorInterface
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function invoicePromo(InvoiceCriteria $criteria, $promo_id)
|
||||||
|
{
|
||||||
|
// return error if there's a problem, false otherwise
|
||||||
|
// check service type
|
||||||
|
$stype = $criteria->getServiceType();
|
||||||
|
if ($stype != ServiceType::BATTERY_REPLACEMENT_NEW)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
|
||||||
|
if (empty($promo_id))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// check if this is a valid promo
|
||||||
|
$promo = $this->em->getRepository(Promo::class)->find($promo_id);
|
||||||
|
|
||||||
|
if (empty($promo))
|
||||||
|
return 'Invalid promo specified.';
|
||||||
|
|
||||||
|
$criteria->addPromo($promo);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function invoiceBatteries(InvoiceCriteria $criteria, $items)
|
||||||
|
{
|
||||||
|
// check service type
|
||||||
|
$stype = $criteria->getServiceType();
|
||||||
|
if ($stype != ServiceType::BATTERY_REPLACEMENT_NEW && $stype != ServiceType::BATTERY_REPLACEMENT_WARRANTY)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
// return error if there's a problem, false otherwise
|
||||||
|
if (!empty($items))
|
||||||
|
{
|
||||||
|
foreach ($items as $item)
|
||||||
|
{
|
||||||
|
// check if this is a valid battery
|
||||||
|
$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;
|
||||||
|
|
||||||
|
/*
|
||||||
|
// add to criteria
|
||||||
|
$criteria->addBattery($battery, $qty);
|
||||||
|
*/
|
||||||
|
|
||||||
|
// 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;
|
||||||
|
|
||||||
|
$criteria->addEntry($battery, $trade_in, $qty);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
protected function processEntries(&$total, InvoiceCriteria $criteria, Invoice $invoice)
|
protected function processEntries(&$total, InvoiceCriteria $criteria, Invoice $invoice)
|
||||||
{
|
{
|
||||||
// error_log('processing entries...');
|
// error_log('processing entries...');
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
namespace App\Service;
|
namespace App\Service;
|
||||||
|
|
||||||
use App\Entity\Invoice;
|
use App\Entity\Invoice;
|
||||||
|
use App\Entity\JobOrder;
|
||||||
|
|
||||||
use App\Ramcar\InvoiceCriteria;
|
use App\Ramcar\InvoiceCriteria;
|
||||||
|
|
||||||
|
|
@ -11,4 +12,7 @@ interface InvoiceGeneratorInterface
|
||||||
// generate invoice using a criteria
|
// generate invoice using a criteria
|
||||||
public function generateInvoice(InvoiceCriteria $criteria);
|
public function generateInvoice(InvoiceCriteria $criteria);
|
||||||
|
|
||||||
|
// generate invoice criteria
|
||||||
|
public function generateInvoiceCriteria(JobOrder $jo, int $promo_id, array $invoice_items, array &$error_array);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,6 @@ use Doctrine\DBAL\LockMode;
|
||||||
use Doctrine\ORM\PessimisticLockException;
|
use Doctrine\ORM\PessimisticLockException;
|
||||||
|
|
||||||
use App\Entity\JobOrder;
|
use App\Entity\JobOrder;
|
||||||
use App\Entity\Battery;
|
|
||||||
use App\Entity\BatteryManufacturer;
|
use App\Entity\BatteryManufacturer;
|
||||||
use App\Entity\JOEvent;
|
use App\Entity\JOEvent;
|
||||||
use App\Entity\CustomerVehicle;
|
use App\Entity\CustomerVehicle;
|
||||||
|
|
@ -338,8 +337,7 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface
|
||||||
// check if invoice changed
|
// check if invoice changed
|
||||||
if ($invoice_change)
|
if ($invoice_change)
|
||||||
{
|
{
|
||||||
// TODO: move invoice processing to InvoiceGenerator
|
$this->ic->generateInvoiceCriteria($jo, $promo_id, $invoice_items, $error_array);
|
||||||
$this->processInvoice($jo, $promo_id, $invoice_items, $error_array);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// validate
|
// validate
|
||||||
|
|
@ -2154,134 +2152,4 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface
|
||||||
->setParameter('status', $status);
|
->setParameter('status', $status);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: move this to InvoiceGenerator
|
|
||||||
protected function processInvoice($jo, $promo_id, $invoice_items, &$error_array)
|
|
||||||
{
|
|
||||||
// instantiate the invoice criteria
|
|
||||||
$criteria = new InvoiceCriteria();
|
|
||||||
$criteria->setServiceType($jo->getServiceType())
|
|
||||||
->setCustomerVehicle($jo->getCustomerVehicle());
|
|
||||||
|
|
||||||
$ierror = $this->invoicePromo($criteria, $promo_id);
|
|
||||||
|
|
||||||
if (!$ierror && !empty($invoice_items))
|
|
||||||
{
|
|
||||||
// check for trade-in so we can mark it for mobile app
|
|
||||||
foreach ($invoice_items as $item)
|
|
||||||
{
|
|
||||||
// get first trade-in
|
|
||||||
if (!empty($item['trade_in']))
|
|
||||||
{
|
|
||||||
$jo->getTradeInType($item['trade_in']);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$ierror = $this->invoiceBatteries($criteria, $invoice_items);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($ierror)
|
|
||||||
{
|
|
||||||
$error_array['invoice'] = $ierror;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// generate the invoice
|
|
||||||
$iobj = $this->ic->generateInvoice($criteria);
|
|
||||||
|
|
||||||
// validate
|
|
||||||
$ierrors = $this->validator->validate($iobj);
|
|
||||||
|
|
||||||
// add errors to list
|
|
||||||
foreach ($ierrors as $error) {
|
|
||||||
$error_array[$error->getPropertyPath()] = $error->getMessage();
|
|
||||||
}
|
|
||||||
|
|
||||||
// check if invoice already exists for JO
|
|
||||||
$old_invoice = $jo->getInvoice();
|
|
||||||
if ($old_invoice != null)
|
|
||||||
{
|
|
||||||
// remove old invoice
|
|
||||||
$this->em->remove($old_invoice);
|
|
||||||
$this->em->flush();
|
|
||||||
}
|
|
||||||
|
|
||||||
// add invoice to JO
|
|
||||||
$jo->setInvoice($iobj);
|
|
||||||
|
|
||||||
$this->em->persist($iobj);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//TODO: move this to InvoiceGenerator
|
|
||||||
protected function invoicePromo(InvoiceCriteria $criteria, $promo_id)
|
|
||||||
{
|
|
||||||
// return error if there's a problem, false otherwise
|
|
||||||
// check service type
|
|
||||||
$stype = $criteria->getServiceType();
|
|
||||||
if ($stype != ServiceType::BATTERY_REPLACEMENT_NEW)
|
|
||||||
return null;
|
|
||||||
|
|
||||||
|
|
||||||
if (empty($promo_id))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// check if this is a valid promo
|
|
||||||
$promo = $this->em->getRepository(Promo::class)->find($promo_id);
|
|
||||||
|
|
||||||
if (empty($promo))
|
|
||||||
return 'Invalid promo specified.';
|
|
||||||
|
|
||||||
$criteria->addPromo($promo);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: move this to InvoiceGenerator
|
|
||||||
protected function invoiceBatteries(InvoiceCriteria $criteria, $items)
|
|
||||||
{
|
|
||||||
// check service type
|
|
||||||
$stype = $criteria->getServiceType();
|
|
||||||
if ($stype != ServiceType::BATTERY_REPLACEMENT_NEW && $stype != ServiceType::BATTERY_REPLACEMENT_WARRANTY)
|
|
||||||
return null;
|
|
||||||
|
|
||||||
// return error if there's a problem, false otherwise
|
|
||||||
if (!empty($items))
|
|
||||||
{
|
|
||||||
foreach ($items as $item)
|
|
||||||
{
|
|
||||||
// check if this is a valid battery
|
|
||||||
$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;
|
|
||||||
|
|
||||||
/*
|
|
||||||
// add to criteria
|
|
||||||
$criteria->addBattery($battery, $qty);
|
|
||||||
*/
|
|
||||||
|
|
||||||
// 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;
|
|
||||||
|
|
||||||
$criteria->addEntry($battery, $trade_in, $qty);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,6 @@ use Doctrine\DBAL\LockMode;
|
||||||
use Doctrine\ORM\PessimisticLockException;
|
use Doctrine\ORM\PessimisticLockException;
|
||||||
|
|
||||||
use App\Entity\JobOrder;
|
use App\Entity\JobOrder;
|
||||||
use App\Entity\Battery;
|
|
||||||
use App\Entity\BatteryManufacturer;
|
use App\Entity\BatteryManufacturer;
|
||||||
use App\Entity\JOEvent;
|
use App\Entity\JOEvent;
|
||||||
use App\Entity\CustomerVehicle;
|
use App\Entity\CustomerVehicle;
|
||||||
|
|
@ -338,8 +337,7 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface
|
||||||
// check if invoice changed
|
// check if invoice changed
|
||||||
if ($invoice_change)
|
if ($invoice_change)
|
||||||
{
|
{
|
||||||
// TODO: move invoice processing to InvoiceGenerator
|
$this->ic->generateInvoiceCriteria($jo, $promo_id, $invoice_items, $error_array);
|
||||||
$this->processInvoice($jo, $promo_id, $invoice_items, $error_array);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// validate
|
// validate
|
||||||
|
|
@ -2154,134 +2152,4 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface
|
||||||
->setParameter('status', $status);
|
->setParameter('status', $status);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: move this to InvoiceGenerator
|
|
||||||
protected function processInvoice($jo, $promo_id, $invoice_items, &$error_array)
|
|
||||||
{
|
|
||||||
// instantiate the invoice criteria
|
|
||||||
$criteria = new InvoiceCriteria();
|
|
||||||
$criteria->setServiceType($jo->getServiceType())
|
|
||||||
->setCustomerVehicle($jo->getCustomerVehicle());
|
|
||||||
|
|
||||||
$ierror = $this->invoicePromo($criteria, $promo_id);
|
|
||||||
|
|
||||||
if (!$ierror && !empty($invoice_items))
|
|
||||||
{
|
|
||||||
// check for trade-in so we can mark it for mobile app
|
|
||||||
foreach ($invoice_items as $item)
|
|
||||||
{
|
|
||||||
// get first trade-in
|
|
||||||
if (!empty($item['trade_in']))
|
|
||||||
{
|
|
||||||
$jo->getTradeInType($item['trade_in']);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$ierror = $this->invoiceBatteries($criteria, $invoice_items);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($ierror)
|
|
||||||
{
|
|
||||||
$error_array['invoice'] = $ierror;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// generate the invoice
|
|
||||||
$iobj = $this->ic->generateInvoice($criteria);
|
|
||||||
|
|
||||||
// validate
|
|
||||||
$ierrors = $this->validator->validate($iobj);
|
|
||||||
|
|
||||||
// add errors to list
|
|
||||||
foreach ($ierrors as $error) {
|
|
||||||
$error_array[$error->getPropertyPath()] = $error->getMessage();
|
|
||||||
}
|
|
||||||
|
|
||||||
// check if invoice already exists for JO
|
|
||||||
$old_invoice = $jo->getInvoice();
|
|
||||||
if ($old_invoice != null)
|
|
||||||
{
|
|
||||||
// remove old invoice
|
|
||||||
$this->em->remove($old_invoice);
|
|
||||||
$this->em->flush();
|
|
||||||
}
|
|
||||||
|
|
||||||
// add invoice to JO
|
|
||||||
$jo->setInvoice($iobj);
|
|
||||||
|
|
||||||
$this->em->persist($iobj);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//TODO: move this to InvoiceGenerator
|
|
||||||
protected function invoicePromo(InvoiceCriteria $criteria, $promo_id)
|
|
||||||
{
|
|
||||||
// return error if there's a problem, false otherwise
|
|
||||||
// check service type
|
|
||||||
$stype = $criteria->getServiceType();
|
|
||||||
if ($stype != ServiceType::BATTERY_REPLACEMENT_NEW)
|
|
||||||
return null;
|
|
||||||
|
|
||||||
|
|
||||||
if (empty($promo_id))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// check if this is a valid promo
|
|
||||||
$promo = $this->em->getRepository(Promo::class)->find($promo_id);
|
|
||||||
|
|
||||||
if (empty($promo))
|
|
||||||
return 'Invalid promo specified.';
|
|
||||||
|
|
||||||
$criteria->addPromo($promo);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: move this to InvoiceGenerator
|
|
||||||
protected function invoiceBatteries(InvoiceCriteria $criteria, $items)
|
|
||||||
{
|
|
||||||
// check service type
|
|
||||||
$stype = $criteria->getServiceType();
|
|
||||||
if ($stype != ServiceType::BATTERY_REPLACEMENT_NEW && $stype != ServiceType::BATTERY_REPLACEMENT_WARRANTY)
|
|
||||||
return null;
|
|
||||||
|
|
||||||
// return error if there's a problem, false otherwise
|
|
||||||
if (!empty($items))
|
|
||||||
{
|
|
||||||
foreach ($items as $item)
|
|
||||||
{
|
|
||||||
// check if this is a valid battery
|
|
||||||
$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;
|
|
||||||
|
|
||||||
/*
|
|
||||||
// add to criteria
|
|
||||||
$criteria->addBattery($battery, $qty);
|
|
||||||
*/
|
|
||||||
|
|
||||||
// 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;
|
|
||||||
|
|
||||||
$criteria->addEntry($battery, $trade_in, $qty);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue