Resolve "Save battery when new battery JO is fulfilled" #869
7 changed files with 141 additions and 46 deletions
|
|
@ -34,6 +34,11 @@ vehicle_delete:
|
||||||
controller: App\Controller\VehicleController::destroy
|
controller: App\Controller\VehicleController::destroy
|
||||||
methods: [DELETE]
|
methods: [DELETE]
|
||||||
|
|
||||||
|
vehicle_batteries:
|
||||||
|
path: /vehicle/batteries
|
||||||
|
controller: App\Controller\VehicleController::getBatteries
|
||||||
|
methods: [POST]
|
||||||
|
|
||||||
# vehicle manufacturers
|
# vehicle manufacturers
|
||||||
|
|
||||||
vmfg_list:
|
vmfg_list:
|
||||||
|
|
|
||||||
|
|
@ -277,43 +277,10 @@ class BatteryManufacturerController extends BaseController
|
||||||
|
|
||||||
// get row data
|
// get row data
|
||||||
$em = $this->getDoctrine()->getManager();
|
$em = $this->getDoctrine()->getManager();
|
||||||
$obj = $em->getRepository(BatteryManufacturer::class)->find($req->request->get('id'));
|
|
||||||
$vobj = $em->getRepository(Vehicle::class)->find($req->request->get('vehicle_id'));
|
|
||||||
$all_batts = $em->getRepository(Battery::class)->findAll();
|
$all_batts = $em->getRepository(Battery::class)->findAll();
|
||||||
|
|
||||||
if (empty($obj) || empty($vobj))
|
|
||||||
throw $this->createNotFoundException('The item does not exist');
|
|
||||||
|
|
||||||
// build batteries array
|
|
||||||
$batteries = [];
|
|
||||||
$battery_index = [];
|
|
||||||
|
|
||||||
// get compatible batteries from selected manufacturer
|
|
||||||
foreach ($vobj->getBatteries() as $battery)
|
|
||||||
{
|
|
||||||
if ($battery->getManufacturer()->getID() == $obj->getID())
|
|
||||||
{
|
|
||||||
$batteries[] = [
|
|
||||||
'id' => $battery->getID(),
|
|
||||||
'mfg_name' => $battery->getManufacturer()->getName(),
|
|
||||||
'model_name' => $battery->getModel()->getName(),
|
|
||||||
'size_name' => $battery->getSize()->getName(),
|
|
||||||
'prod_code' => $battery->getProductCode(),
|
|
||||||
'sell_price' => $battery->getSellingPrice(),
|
|
||||||
'warr_private' => $battery->getWarrantyPrivate(),
|
|
||||||
'warr_commercial' => $battery->getWarrantyCommercial(),
|
|
||||||
];
|
|
||||||
$battery_index[$battery->getID()] = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// add all other batteries, because they want options
|
|
||||||
foreach ($all_batts as $battery)
|
foreach ($all_batts as $battery)
|
||||||
{
|
{
|
||||||
// if we already listed it
|
|
||||||
if (isset($battery_index[$battery->getID()]))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
$batteries[] = [
|
$batteries[] = [
|
||||||
'id' => $battery->getID(),
|
'id' => $battery->getID(),
|
||||||
'mfg_name' => $battery->getManufacturer()->getName(),
|
'mfg_name' => $battery->getManufacturer()->getName(),
|
||||||
|
|
@ -326,14 +293,6 @@ class BatteryManufacturerController extends BaseController
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
// NOTE: no need to order by price for control center / only for app
|
|
||||||
// order by price
|
|
||||||
usort($batteries, function ($a, $b) {
|
|
||||||
return -($a['sell_price'] <=> $b['sell_price']);
|
|
||||||
});
|
|
||||||
*/
|
|
||||||
|
|
||||||
// response
|
// response
|
||||||
return $this->json([
|
return $this->json([
|
||||||
'data' => $batteries
|
'data' => $batteries
|
||||||
|
|
|
||||||
|
|
@ -155,6 +155,7 @@ class CustomerController extends BaseController
|
||||||
$params['status_conditions'] = VehicleStatusCondition::getCollection();
|
$params['status_conditions'] = VehicleStatusCondition::getCollection();
|
||||||
|
|
||||||
$params['years'] = $this->generateYearOptions();
|
$params['years'] = $this->generateYearOptions();
|
||||||
|
$params['batteries'] = $em->getRepository(Battery::class)->findAll();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function addForm()
|
public function addForm()
|
||||||
|
|
|
||||||
|
|
@ -42,6 +42,7 @@ use CrEOF\Spatial\PHP\Types\Geometry\Point;
|
||||||
|
|
||||||
use Mosquitto\Client as MosquittoClient;
|
use Mosquitto\Client as MosquittoClient;
|
||||||
use DateTime;
|
use DateTime;
|
||||||
|
use DateInterval;
|
||||||
|
|
||||||
class JobOrderController extends BaseController
|
class JobOrderController extends BaseController
|
||||||
{
|
{
|
||||||
|
|
@ -989,6 +990,58 @@ class JobOrderController extends BaseController
|
||||||
return $this->render('job-order/form.html.twig', $params);
|
return $this->render('job-order/form.html.twig', $params);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function updateVehicleBattery(JobOrder $jo)
|
||||||
|
{
|
||||||
|
// check if new battery
|
||||||
|
if ($jo->getServiceType() != ServiceType::BATTERY_REPLACEMENT_NEW)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// customer vehicle
|
||||||
|
$cv = $jo->getCustomerVehicle();
|
||||||
|
if ($cv == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// invoice
|
||||||
|
$invoice = $jo->getInvoice();
|
||||||
|
if ($invoice == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// invoice items
|
||||||
|
$items = $invoice->getItems();
|
||||||
|
if (count($items) <= 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// get first battery from invoice
|
||||||
|
$battery = null;
|
||||||
|
foreach ($items as $item)
|
||||||
|
{
|
||||||
|
$battery = $item->getBattery();
|
||||||
|
if ($battery != null)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// no battery in order
|
||||||
|
if ($battery == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// warranty expiration
|
||||||
|
$warr = $jo->getWarrantyClass();
|
||||||
|
if ($warr == WarrantyClass::WTY_PRIVATE)
|
||||||
|
$warr_months = $battery->getWarrantyPrivate();
|
||||||
|
else if ($warr == WarrantyClass::WTY_COMMERCIAL)
|
||||||
|
$warr_months = $battery->getWarrantyCommercial();
|
||||||
|
else if ($warr == WarrantyClass::WTY_TNV)
|
||||||
|
$warr_months = 12;
|
||||||
|
|
||||||
|
$warr_date = new DateTime();
|
||||||
|
$warr_date->add(new DateInterval('P' . $warr_months . 'M'));
|
||||||
|
|
||||||
|
// update customer vehicle battery
|
||||||
|
$cv->setCurrentBattery($battery)
|
||||||
|
->setHasMotoliteBattery(true)
|
||||||
|
->setWarrantyExpiration($warr_date);
|
||||||
|
}
|
||||||
|
|
||||||
public function fulfillmentSubmit(Request $req, ValidatorInterface $validator, $id)
|
public function fulfillmentSubmit(Request $req, ValidatorInterface $validator, $id)
|
||||||
{
|
{
|
||||||
$this->denyAccessUnlessGranted('jo_fulfill.list', null, 'No access.');
|
$this->denyAccessUnlessGranted('jo_fulfill.list', null, 'No access.');
|
||||||
|
|
@ -1057,6 +1110,9 @@ class JobOrderController extends BaseController
|
||||||
->setJobOrder($obj);
|
->setJobOrder($obj);
|
||||||
$em->persist($event);
|
$em->persist($event);
|
||||||
|
|
||||||
|
// save to customer vehicle battery record
|
||||||
|
$this->updateVehicleBattery($obj);
|
||||||
|
|
||||||
// validated! save the entity
|
// validated! save the entity
|
||||||
$em->flush();
|
$em->flush();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@ namespace App\Controller;
|
||||||
use App\Ramcar\BaseController;
|
use App\Ramcar\BaseController;
|
||||||
use App\Entity\Vehicle;
|
use App\Entity\Vehicle;
|
||||||
use App\Entity\VehicleManufacturer;
|
use App\Entity\VehicleManufacturer;
|
||||||
|
use App\Entity\Battery;
|
||||||
|
|
||||||
use Doctrine\ORM\Query;
|
use Doctrine\ORM\Query;
|
||||||
use Symfony\Component\HttpFoundation\Request;
|
use Symfony\Component\HttpFoundation\Request;
|
||||||
|
|
@ -310,4 +311,74 @@ class VehicleController extends BaseController
|
||||||
->setParameter('filter', '%' . $datatable['query']['data-rows-search'] . '%');
|
->setParameter('filter', '%' . $datatable['query']['data-rows-search'] . '%');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getBatteries(Request $req)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
if (!$this->isGranted('customer.add') && !$this->isGranted('customer.update')) {
|
||||||
|
$exception = $this->createAccessDeniedException('No access.');
|
||||||
|
throw $exception;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
// get row data
|
||||||
|
$em = $this->getDoctrine()->getManager();
|
||||||
|
$vobj = $em->getRepository(Vehicle::class)->find($req->request->get('vehicle_id'));
|
||||||
|
$all_batts = $em->getRepository(Battery::class)->findAll();
|
||||||
|
|
||||||
|
if (empty($vobj))
|
||||||
|
throw $this->createNotFoundException('The item does not exist');
|
||||||
|
|
||||||
|
// build batteries array
|
||||||
|
$batteries = [];
|
||||||
|
$battery_index = [];
|
||||||
|
|
||||||
|
// get compatible batteries from selected manufacturer
|
||||||
|
foreach ($vobj->getBatteries() as $battery)
|
||||||
|
{
|
||||||
|
$batteries[] = [
|
||||||
|
'id' => $battery->getID(),
|
||||||
|
'mfg_name' => $battery->getManufacturer()->getName(),
|
||||||
|
'model_name' => $battery->getModel()->getName(),
|
||||||
|
'size_name' => $battery->getSize()->getName(),
|
||||||
|
'prod_code' => $battery->getProductCode(),
|
||||||
|
'sell_price' => $battery->getSellingPrice(),
|
||||||
|
'warr_private' => $battery->getWarrantyPrivate(),
|
||||||
|
'warr_commercial' => $battery->getWarrantyCommercial(),
|
||||||
|
];
|
||||||
|
$battery_index[$battery->getID()] = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// add all other batteries, because they want options
|
||||||
|
foreach ($all_batts as $battery)
|
||||||
|
{
|
||||||
|
// if we already listed it
|
||||||
|
if (isset($battery_index[$battery->getID()]))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
$batteries[] = [
|
||||||
|
'id' => $battery->getID(),
|
||||||
|
'mfg_name' => $battery->getManufacturer()->getName(),
|
||||||
|
'model_name' => $battery->getModel()->getName(),
|
||||||
|
'size_name' => $battery->getSize()->getName(),
|
||||||
|
'prod_code' => $battery->getProductCode(),
|
||||||
|
'sell_price' => $battery->getSellingPrice(),
|
||||||
|
'warr_private' => $battery->getWarrantyPrivate(),
|
||||||
|
'warr_commercial' => $battery->getWarrantyCommercial(),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
// NOTE: no need to order by price for control center / only for app
|
||||||
|
// order by price
|
||||||
|
usort($batteries, function ($a, $b) {
|
||||||
|
return -($a['sell_price'] <=> $b['sell_price']);
|
||||||
|
});
|
||||||
|
*/
|
||||||
|
|
||||||
|
// response
|
||||||
|
return $this->json([
|
||||||
|
'data' => $batteries
|
||||||
|
]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -375,15 +375,18 @@
|
||||||
<select name="bmfg" class="form-control m-input" id="bmfg" data-required="0">
|
<select name="bmfg" class="form-control m-input" id="bmfg" data-required="0">
|
||||||
<option value="">Select a manufacturer</option>
|
<option value="">Select a manufacturer</option>
|
||||||
{% for manufacturer in bmfgs %}
|
{% for manufacturer in bmfgs %}
|
||||||
<option value="{{ manufacturer.getID() }}">{{ manufacturer.getName() }}</option>
|
<option value="{{ manufacturer.getID }}">{{ manufacturer.getName() }}</option>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</select>
|
</select>
|
||||||
<div class="form-control-feedback hide" data-field="bmfg"></div>
|
<div class="form-control-feedback hide" data-field="bmfg"></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-lg-3">
|
<div class="col-lg-3">
|
||||||
<label for="battery" data-field="battery">Product</label>
|
<label for="battery" data-field="battery">Product</label>
|
||||||
<select name="battery" class="form-control m-input" id="battery" data-value="" disabled data-required="0">
|
<select name="battery" class="form-control m-input" id="battery" data-value="" data-required="0">
|
||||||
<option value="">Select a manufacturer first</option>
|
<option value="">Select a battery</option>
|
||||||
|
{% for batt in batteries %}
|
||||||
|
<option value="{{ batt.getID }}">{{ batt.getModel.getName }} {{ batt.getSize.getName }}</option>
|
||||||
|
{% endfor %}
|
||||||
</select>
|
</select>
|
||||||
<div class="form-control-feedback hide" data-field="battery"></div>
|
<div class="form-control-feedback hide" data-field="battery"></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -748,6 +751,7 @@
|
||||||
// set entity ids
|
// set entity ids
|
||||||
$("#vehicle").data('id', row.vehicle);
|
$("#vehicle").data('id', row.vehicle);
|
||||||
$("#battery").data('id', row.battery);
|
$("#battery").data('id', row.battery);
|
||||||
|
$("#battery").val(row.battery);
|
||||||
$("#cv-id").val(row.id);
|
$("#cv-id").val(row.id);
|
||||||
|
|
||||||
// set select box values
|
// set select box values
|
||||||
|
|
@ -755,7 +759,6 @@
|
||||||
|
|
||||||
if (row.battery) {
|
if (row.battery) {
|
||||||
$("#flag-motolite-battery").prop('checked', true).change();
|
$("#flag-motolite-battery").prop('checked', true).change();
|
||||||
$("#bmfg").val(row.bmfg).change();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$("#flag-active").prop('checked', row.flag_active);
|
$("#flag-active").prop('checked', row.flag_active);
|
||||||
|
|
|
||||||
|
|
@ -1124,7 +1124,7 @@ $(function() {
|
||||||
// get vehicles for this manufacturer
|
// get vehicles for this manufacturer
|
||||||
$.ajax({
|
$.ajax({
|
||||||
method: "POST",
|
method: "POST",
|
||||||
url: "{{ url('bmfg_batteries') }}",
|
url: "{{ url('vehicle_batteries') }}",
|
||||||
data: {
|
data: {
|
||||||
id: id,
|
id: id,
|
||||||
vehicle_id: vdata.vehicle.id
|
vehicle_id: vdata.vehicle.id
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue