Resolve "Save battery when new battery JO is fulfilled" #869

Merged
jankstudio merged 1 commit from 71-save-battery-when-new-battery-jo-is-fulfilled into master 2018-04-05 05:55:10 +00:00
7 changed files with 141 additions and 46 deletions

View file

@ -34,6 +34,11 @@ vehicle_delete:
controller: App\Controller\VehicleController::destroy
methods: [DELETE]
vehicle_batteries:
path: /vehicle/batteries
controller: App\Controller\VehicleController::getBatteries
methods: [POST]
# vehicle manufacturers
vmfg_list:

View file

@ -277,43 +277,10 @@ class BatteryManufacturerController extends BaseController
// get row data
$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();
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)
{
// if we already listed it
if (isset($battery_index[$battery->getID()]))
continue;
$batteries[] = [
'id' => $battery->getID(),
'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
return $this->json([
'data' => $batteries

View file

@ -155,6 +155,7 @@ class CustomerController extends BaseController
$params['status_conditions'] = VehicleStatusCondition::getCollection();
$params['years'] = $this->generateYearOptions();
$params['batteries'] = $em->getRepository(Battery::class)->findAll();
}
public function addForm()

View file

@ -42,6 +42,7 @@ use CrEOF\Spatial\PHP\Types\Geometry\Point;
use Mosquitto\Client as MosquittoClient;
use DateTime;
use DateInterval;
class JobOrderController extends BaseController
{
@ -989,6 +990,58 @@ class JobOrderController extends BaseController
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)
{
$this->denyAccessUnlessGranted('jo_fulfill.list', null, 'No access.');
@ -1057,6 +1110,9 @@ class JobOrderController extends BaseController
->setJobOrder($obj);
$em->persist($event);
// save to customer vehicle battery record
$this->updateVehicleBattery($obj);
// validated! save the entity
$em->flush();

View file

@ -5,6 +5,7 @@ namespace App\Controller;
use App\Ramcar\BaseController;
use App\Entity\Vehicle;
use App\Entity\VehicleManufacturer;
use App\Entity\Battery;
use Doctrine\ORM\Query;
use Symfony\Component\HttpFoundation\Request;
@ -310,4 +311,74 @@ class VehicleController extends BaseController
->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
]);
}
}

View file

@ -375,15 +375,18 @@
<select name="bmfg" class="form-control m-input" id="bmfg" data-required="0">
<option value="">Select a manufacturer</option>
{% for manufacturer in bmfgs %}
<option value="{{ manufacturer.getID() }}">{{ manufacturer.getName() }}</option>
<option value="{{ manufacturer.getID }}">{{ manufacturer.getName() }}</option>
{% endfor %}
</select>
<div class="form-control-feedback hide" data-field="bmfg"></div>
</div>
<div class="col-lg-3">
<label for="battery" data-field="battery">Product</label>
<select name="battery" class="form-control m-input" id="battery" data-value="" disabled data-required="0">
<option value="">Select a manufacturer first</option>
<select name="battery" class="form-control m-input" id="battery" data-value="" data-required="0">
<option value="">Select a battery</option>
{% for batt in batteries %}
<option value="{{ batt.getID }}">{{ batt.getModel.getName }} {{ batt.getSize.getName }}</option>
{% endfor %}
</select>
<div class="form-control-feedback hide" data-field="battery"></div>
</div>
@ -748,6 +751,7 @@
// set entity ids
$("#vehicle").data('id', row.vehicle);
$("#battery").data('id', row.battery);
$("#battery").val(row.battery);
$("#cv-id").val(row.id);
// set select box values
@ -755,7 +759,6 @@
if (row.battery) {
$("#flag-motolite-battery").prop('checked', true).change();
$("#bmfg").val(row.bmfg).change();
}
$("#flag-active").prop('checked', row.flag_active);

View file

@ -1124,7 +1124,7 @@ $(function() {
// get vehicles for this manufacturer
$.ajax({
method: "POST",
url: "{{ url('bmfg_batteries') }}",
url: "{{ url('vehicle_batteries') }}",
data: {
id: id,
vehicle_id: vdata.vehicle.id