diff --git a/config/routes/tapi.yaml b/config/routes/tapi.yaml index f72c1280..3d345d5f 100644 --- a/config/routes/tapi.yaml +++ b/config/routes/tapi.yaml @@ -6,6 +6,11 @@ tapi_jo_request: controller: App\Controller\TAPI\JobOrderController::requestJobOrder methods: [POST] +tapi_estimate: + path: /tapi/estimate + controller: App\Controller\TAPI\JobOrderController::getEstimate + methods: [POST] + # vehicle manufacturer and vehicle tapi_vehicle_mfg_list: path: /tapi/vehicle/mfgs diff --git a/src/Controller/TAPI/JobOrderController.php b/src/Controller/TAPI/JobOrderController.php index 4235dddd..e627b15f 100644 --- a/src/Controller/TAPI/JobOrderController.php +++ b/src/Controller/TAPI/JobOrderController.php @@ -412,78 +412,26 @@ class JobOrderController extends APIController // check required parameters and api key $required_params = [ 'service_type', - 'vehicle_id', + 'vehicle_model_id', ]; $msg = $this->checkRequiredParameters($req, $required_params); if ($msg) return new APIResponse(false, $msg); + $data = []; + $msg = $this->validateAndGetEstimateRequest($req, $em, $data); + if ($msg != null) + return new APIResponse(false, $msg); + // make invoice criteria $icrit = new InvoiceCriteria(); - $icrit->setServiceType($req->request->get('service_type')); + $icrit->setServiceType($data['service_type']); + $icrit->setCustomerVehicle($data['customer_vehicle']); - // check promo - $promo_id = $req->request->get('promo_id'); - if (!empty($promo_id)) - { - $promo = $em->getRepository(Promo::class)->find($promo_id); - if ($promo == null) - { - $res->setError(true) - ->setErrorMessage('Invalid promo id'); - return $res->getReturnResponse(); - } + if ($data['promo'] != null) + $icrit->addPromo($data['promo']); - // put in criteria - $icrit->addPromo($promo); - } - - // check customer vehicle - $cv = $em->getRepository(CustomerVehicle::class)->find($req->request->get('cv_id')); - if ($cv == null) - { - $res->setError(true) - ->setErrorMessage('Invalid customer vehicle id'); - return $res->getReturnResponse(); - } - $icrit->setCustomerVehicle($cv); - - // check if customer owns vehicle - if ($cust->getID() != $cv->getCustomer()->getID()) - { - $res->setError(true) - ->setErrorMessage('Customer does not own vehicle'); - return $res->getReturnResponse(); - } - - // check battery - $batt_id = $req->request->get('batt_id'); - if ($batt_id != null) - { - $batt = $em->getRepository(Battery::class)->find($batt_id); - if ($batt == null) - { - $res->setError(true) - ->setErrorMessage('Invalid battery id'); - return $res->getReturnResponse(); - } - } - else - $batt = null; - - $trade_in = $req->request->get('trade_in'); - switch ($trade_in) - { - case TradeInType::MOTOLITE: - case TradeInType::OTHER: - break; - - default: - $trade_in = ''; - break; - } - - $icrit->addEntry($batt, $trade_in, 1); + $icrit->addEntry($data['battery'], $data['trade_in_type'], 1); // send to invoice generator $invoice = $ic->generateInvoice($icrit); @@ -517,10 +465,8 @@ class JobOrderController extends APIController $data['items'] = $items_data; - // set data - $res->setData($data); - - return $res->getReturnResponse(); + $message = 'Estimate computed.'; + return new APIResponse(true, $message, $data); } public function getJOInvoice(Request $req, EntityManagerInterface $em) @@ -1663,6 +1609,18 @@ class JobOrderController extends APIController } } + // check if service type is BATTERY_REPLACEMENT_WARRANTY or + // BATTERY_REPLACEMENT_NEW and if battery_id is empty + if (($stype == ServiceType::BATTERY_REPLACEMENT_NEW) || + ($stype == ServiceType::BATTERY_REPLACEMENT_WARRANTY)) + { + if ($batt == null) + { + $message = 'battery_id cannot be empty for selected service type.'; + return $message; + } + } + // validate mobile number $mobile = $r->get('mobile_number', ''); $clean_mobile = $this->cleanPhoneNumber($mobile); @@ -1802,7 +1760,7 @@ class JobOrderController extends APIController ->setModelYear($data['model_year']) ->setStatusCondition($data['condition']) ->setColor($data['color']) - ->setHasMotoliteBattery(true) + ->setHasMotoliteBattery(false) ->setFuelType($data['fuel_type']); $em->persist($cust_vehicle); @@ -1833,6 +1791,125 @@ class JobOrderController extends APIController return $cust_vehicle; } + protected function validateAndGetEstimateRequest(Request $req, EntityManagerInterface $em, &$data) + { + $r = $req->request; + + // validate service type + $stype = $this->cleanText($r->get('service_type', '')); + if (!ServiceType::validate($stype)) + { + $message = 'Invalid service type'; + return $message; + } + + $trade_in_type = $this->cleanText($r->get('trade_in_type', '')); + if ((!empty($trade_in_type)) && + (!TradeInType::validate($trade_in_type))) + { + $message = 'Invalid trade in type'; + return $message; + } + + switch ($trade_in_type) + { + case TradeInType::MOTOLITE: + case TradeInType::OTHER: + break; + + default: + $trade_in_type = ''; + break; + } + + // check battery + $batt = null; + $batt_id = $req->request->get('battery_id', 0); + if (!empty($batt_id)) + { + $batt = $em->getRepository(Battery::class)->find($batt_id); + if ($batt == null) + { + $message = 'Invalid battery id'; + return $message; + } + } + + // check if service type is BATTERY_REPLACEMENT_WARRANTY or + // BATTERY_REPLACEMENT_NEW and if battery_id is empty + if (($stype == ServiceType::BATTERY_REPLACEMENT_NEW) || + ($stype == ServiceType::BATTERY_REPLACEMENT_WARRANTY)) + { + if ($batt == null) + { + $message = 'battery_id cannot be empty for selected service type.'; + return $message; + } + } + + $vmodel = null; + $vmodel_id = $r->get('vehicle_model_id', 0); + // validate the vehicle model id + // find vehicle + $vmodel = $em->getRepository(Vehicle::class)->find($vmodel_id); + if ($vmodel == null) + { + $message = 'Invalid vehicle model id.'; + return $message; + } + + // validate fuel type + $fuel_type = $this->cleanText($r->get('vehicle_fuel_type', '')); + if ((!empty($fuel_type)) && + (!FuelType::validate($fuel_type))) + { + $message = 'Invalid vehicle fuel type.'; + return $message; + } + + // validate promo + $promo = null; + $promo_id = $r->get('promo_id', 0); + if (!empty($promo_id)) + { + $promo = $em->getRepository(Promo::class)->find($promo_id); + if ($promo == null) + { + $message = 'Invalid promo id'; + return $message; + } + } + + // invoice criteria needs a customer vehicle object + // with customer set. We create dummy customer vehicle object + // with dummy customer set + $dummy_cv = $this->createDummyCustomerVehicle($vmodel, $fuel_type); + + $data = [ + 'service_type' => $stype, + 'trade_in_type' => $trade_in_type, + 'vehicle' => $vmodel, + 'battery' => $batt, + 'fuel_type' => $fuel_type, + 'promo' => $promo, + 'customer_vehicle' => $dummy_cv, + ]; + + return null; + } + + protected function createDummyCustomerVehicle($vmodel, $fuel_type) + { + $dummy_cv = new CustomerVehicle(); + $dummy_cust = new Customer(); + + $dummy_cv->setCustomer($dummy_cust) + ->setFuelType($fuel_type) + ->setHasMotoliteBattery(false); + + return $dummy_cv; + } + protected function cleanPhoneNumber($mobile) { // remove any non digit character from string