From fb91d462ffb616d49966c5212ca6d0ffca9e429f Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Mon, 20 Jun 2022 09:00:56 +0000 Subject: [PATCH] Add path to tapi calls. Add more required parameters for new job order. #686 --- config/api_acl.yaml | 8 +- config/packages/security.yaml | 8 ++ src/Controller/TAPI/JobOrderController.php | 132 +++++++++++++-------- 3 files changed, 96 insertions(+), 52 deletions(-) diff --git a/config/api_acl.yaml b/config/api_acl.yaml index 9182674e..b235ff81 100644 --- a/config/api_acl.yaml +++ b/config/api_acl.yaml @@ -81,17 +81,17 @@ access_keys: - id: tapi_vehicle.list label: List Third Party Vehicles - id: tapi_promo - labels: Third Party Promo Access + label: Third Party Promo Access acls: - id: tapi_promo.list label: List Third Party Promos - id: tapi_battery - labels: Third Party Battery Access + label: Third Party Battery Access acls: - id: tapi_battery_compatible.list label: List Third Party Compatible Batteries - id: tapi_jo - labels: Third Party Job Order Access + label: Third Party Job Order Access acls: - id: tapi_jo.request label: Third Party Request Job Order @@ -114,7 +114,7 @@ access_keys: - id: tapi_jo.get.info label: Third Party Get Job Order Info - id: tapi_service - labels: Third Party Service Access + label: Third Party Service Access acls: - id: tapi_service.list label: List Third Party Services diff --git a/config/packages/security.yaml b/config/packages/security.yaml index 2eecd1e8..60518b75 100644 --- a/config/packages/security.yaml +++ b/config/packages/security.yaml @@ -59,6 +59,14 @@ security: provider: api_key_user_provider user_checker: Catalyst\AuthBundle\Service\UserChecker + third_party_api: + pattern: ^\/tapi\/ + stateless: true + simple_preauth: + authenticator: Catalyst\APIBundle\Security\APIKeyAuthenticator + provider: api_key_user_provider + user_checker: Catalyst\AuthBundle\Service\UserChecker + main: provider: user_provider form_login: diff --git a/src/Controller/TAPI/JobOrderController.php b/src/Controller/TAPI/JobOrderController.php index a34f5a28..0127aadd 100644 --- a/src/Controller/TAPI/JobOrderController.php +++ b/src/Controller/TAPI/JobOrderController.php @@ -4,6 +4,7 @@ namespace App\Controller\TAPI; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\Dotenv\Dotenv; use Doctrine\ORM\Query; use Doctrine\ORM\EntityManagerInterface; @@ -25,6 +26,8 @@ use App\Ramcar\JOEventType; use App\Ramcar\HubCriteria; use App\Ramcar\ModeOfPayment; use App\Ramcar\APIRiderStatus; +use App\Ramcar\VehicleStatusCondition; +use App\Ramcar\FuelType; use App\Service\InvoiceGeneratorInterface; use App\Service\RisingTideGateway; @@ -49,6 +52,7 @@ use App\Entity\Customer; use App\Entity\Hub; use App\Entity\Invoice; use App\Entity\Vehicle; +use App\Entity\VehicleManufacturer; use DateTime; use DateInterval; @@ -71,9 +75,6 @@ class JobOrderController extends APIController HubSelector $hub_select, HubDistributor $hub_dist, HubFilterLogger $hub_filter_logger, HubFilteringGeoChecker $hub_geofence, EntityManagerInterface $em) { - // TODO: fix all the responses - $this->denyAccessUnlessGranted('tapi_jo.request', null, 'No access.'); - // check required parameters and api key $required_params = [ 'service_type', @@ -86,6 +87,10 @@ class JobOrderController extends APIController 'mobile_number', 'vehicle_manufacturer_id', 'vehicle_model_id', + 'vehicle_model_year', + 'vehicle_color', + 'vehicle_condition', + 'vehicle_fuel_type', 'plate_number' ]; @@ -94,7 +99,8 @@ class JobOrderController extends APIController return new APIResponse(false, $msg); // get data from request - $status = $this->getJobOrderRequestInfo($req, $data); + $data = []; + $status = $this->getJobOrderRequestInfo($req, $em, $data); if ($status != null) return new APIResponse(false, $status); @@ -112,6 +118,8 @@ class JobOrderController extends APIController $jo = new JobOrder(); $jo->setSource($data['source']) ->setStatus(JOStatus::PENDING) + ->setServiceType($data['service_type']) + ->setWarrantyClass($data['warranty_class']) ->setDeliveryInstructions($data['instructions']) ->setTier1Notes('') ->setTier2Notes('') @@ -124,6 +132,7 @@ class JobOrderController extends APIController ->setLandmark($data['landmark']); $jo->setCustomer($data['customer']); + $jo->setCustomerVehicle($data['customer_vehicle']); // set coordinates $point = new Point($data['long'], $data['lat']); @@ -136,10 +145,10 @@ class JobOrderController extends APIController // TODO add promo to criteria if any // check promo // put in criteria - $icrit->addPromo($data['promo']); + if ($data['promo'] != null) + $icrit->addPromo($data['promo']); $icrit->setCustomerVehicle($data['customer_vehicle']); - $jo->setCustomerVehicle($data['customer_vehicle']); $icrit->addEntry($data['batt'], $data['trade_in_type'], 1); @@ -149,6 +158,7 @@ class JobOrderController extends APIController // assign hub and rider // check if hub is null + $hub = $data['hub']; if ($hub == null) { // TODO: need to factor out the setting of HubCriteria fields @@ -158,7 +168,7 @@ class JobOrderController extends APIController // get distance limit for mobile from env // get value of hub_filter_enable from env $dotenv = new Dotenv(); - $dotenv->loadEnv(__DIR__.'/../../.env'); + $dotenv->loadEnv(__DIR__.'/../../../.env'); $limit_distance = $_ENV['CUST_DISTANCE_LIMIT']; $hub_filter_enabled = $_ENV['HUB_FILTER_ENABLE']; @@ -298,7 +308,7 @@ class JobOrderController extends APIController $jo->setStatus(JOStatus::RIDER_ASSIGN); $jo->setStatusAutoAssign(AutoAssignStatus::HUB_ASSIGNED); - if ($date_schedule != null) + if ($data['date_schedule'] != null) $jo->setDateSchedule($data['date_schedule']); // update redis hub_jo_count for hub @@ -1470,7 +1480,7 @@ class JobOrderController extends APIController protected function getJobOrderRequestInfo(Request $req, EntityManagerInterface $em, &$data) { - $error = $this->validateRequest($req); + $error = $this->validateRequest($req, $em); if ($error != null) { // there is a validation error @@ -1481,7 +1491,7 @@ class JobOrderController extends APIController // at this point, the request data has been validated // trade-in type - $trade_in_type = $this->cleanText($r->get('trade_in_type')); + $trade_in_type = $this->cleanText($r->get('trade_in_type', '')); switch ($trade_in_type) { case TradeInType::MOTOLITE: @@ -1507,12 +1517,12 @@ class JobOrderController extends APIController $lat = $r->get('latitude'); // get service type - $stype = $this->cleanText($r->get('service_type')); + $stype = $this->cleanText($r->get('service_type', '')); // get mode of payment - $payment_mode = $this->clean($r->get('mode_of_payment')); + $payment_mode = $this->cleanText($r->get('mode_of_payment', '')); - $advance_order = $r->get('flag_advance_order'); + $advance_order = $r->get('flag_advance_order', 0); // check for 'false' text if ($advance_order === false || $advance_order === 0 || $advance_order === '0' || $advance_order == 'false') $flag_advance_order = false; @@ -1525,28 +1535,22 @@ class JobOrderController extends APIController $hub = $em->getRepository(Hub::class)->find($hub_id); $schedule_date = $r->get('date_schedule'); - $slot_id = $r->get('slot_id'); // process the jo date schedule $date_schedule = null; - if ((strlen($schedule_date) > 0) && (strlen($slot_id) > 0)) - { - $time_schedule = $this->getTimeFromSlot($slot_id); - if (!empty($time_schedule)) - { - $s_date = $schedule_date . ' ' . $time_schedule; - $date_schedule = DateTime::createFromFormat('Y-m-d H:i', $s_date); - // error_log($date_schedule->format('Y-m-d H:i')); - } - } + if (strlen($schedule_date) > 0) + $date_schedule = DateTime::createFromFormat('Y-m-d H:i', $schedule_date); // get promo - $promo_id = $r->get('promo_id'); + $promo_id = $r->get('promo_id', 0); $promo = $em->getRepository(Promo::class)->find($promo_id); // check battery - $batt_id = $req->request->get('batt_id'); + $batt_id = $req->request->get('battery_id', 0); $batt = $em->getRepository(Battery::class)->find($batt_id); + $warranty_class = ''; + if (($batt != null) && ($stype == ServiceType::BATTERY_REPLACEMENT_NEW)) + $warranty_class = WarrantyClass::WTY_PRIVATE; // get customer and vehicle info $fname = trim($r->get('first_name', '')); @@ -1556,19 +1560,24 @@ class JobOrderController extends APIController // validate mobile number $clean_mobile = $this->cleanPhoneNumber($mobile); - $vmanu_id = $r->get('vehicle_manufacturer'); + $vmanu_id = $r->get('vehicle_manufacturer_id', 0); // find vehicle manufacturer $vmanu = $em->getRepository(VehicleManufacturer::class)->find($vmanu_id); - $vmodel_id = $r->get('vehicle_model'); + $vmodel_id = $r->get('vehicle_model_id', 0); // find vehicle $vehicle = $em->getRepository(Vehicle::class)->find($vmodel_id); - $plate_number = $r->get('plate_number'); + $plate_number = $r->get('plate_number', ''); // clean plate number $clean_plate = $this->cleanPlateNumber($plate_number); + $v_condition = $this->cleanText($r->get('vehicle_condition', '')); + $fuel_type = $this->cleanText($r->get('vehicle_fuel_type', '')); + $color = trim($r->get('vehicle_color', '')); + $model_year = trim($r->get('vehicle_model_year', 0)); + $c_data = [ 'first_name' => $fname, 'last_name' => $lname, @@ -1576,6 +1585,10 @@ class JobOrderController extends APIController 'vmanu' => $vmanu, 'vehicle' => $vehicle, 'plate_number' => $clean_plate, + 'model_year' => $model_year, + 'condition' => $v_condition, + 'color' => $color, + 'fuel_type' => $fuel_type, ]; // process customer and vehicle information @@ -1598,6 +1611,7 @@ class JobOrderController extends APIController 'customer' => $cust_data['customer'], 'customer_vehicle' => $cust_data['customer_vehicle'], 'source' => TransactionOrigin::THIRD_PARTY, + 'warranty_class' => $warranty_class, ]; return null; @@ -1608,15 +1622,16 @@ class JobOrderController extends APIController $r = $req->request; // validate trade-in type - $trade_in_type = $this->cleanText($r->get('trade_in_type')); - if (!TradeInType::validate($trade_in_type)) + $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; } // validate service type - $stype = $this->cleanText($r->get('service_type')); + $stype = $this->cleanText($r->get('service_type', '')); if (!ServiceType::validate($stype)) { $message = 'Invalid service type'; @@ -1624,7 +1639,7 @@ class JobOrderController extends APIController } // validate mode of payment - $payment_mode = $this->clean($r->get('mode_of_payment')); + $payment_mode = $this->cleanText($r->get('mode_of_payment', '')); if (!ModeOfPayment::validate($payment_mode)) { $message = 'Invalid mode of payment'; @@ -1633,7 +1648,7 @@ class JobOrderController extends APIController // check promo $promo = null; - $promo_id = $r->get('promo_id'); + $promo_id = $r->get('promo_id', 0); if (!empty($promo_id)) { $promo = $em->getRepository(Promo::class)->find($promo_id); @@ -1646,8 +1661,8 @@ class JobOrderController extends APIController // check battery $batt = null; - $batt_id = $req->request->get('batt_id'); - if ($empty($batt_id)) + $batt_id = $req->request->get('battery_id', 0); + if (!empty($batt_id)) { $batt = $em->getRepository(Battery::class)->find($batt_id); if ($batt == null) @@ -1667,7 +1682,7 @@ class JobOrderController extends APIController } $vmanu = null; - $vmanu_id = $r->get('vehicle_manufacturer'); + $vmanu_id = $r->get('vehicle_manufacturer_id', 0); // validate the vehicle manufacturer id // find vehicle manufacturer $vmanu = $em->getRepository(VehicleManufacturer::class)->find($vmanu_id); @@ -1678,23 +1693,39 @@ class JobOrderController extends APIController } $vmodel = null; - $vmodel_id = $r->get('vehicle_model'); + $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) + if ($vmodel == null) { $message = 'Invalid vehicle model id.'; return $message; } // confirm that vehicle model's manufacturer is the same as the one in vehicle - if ($vmodel->getManufacturer()->getID != $vmanu_id) + if ($vmodel->getManufacturer()->getID() != $vmanu_id) { $message = 'Invalid vehicle manufacturer id for vehicle model.'; return $message; } + // validate vehicle condition + $v_condition = $this->cleanText($r->get('vehicle_condition', '')); + if (!VehicleStatusCondition::validate($v_condition)) + { + $message = 'Invalid vehicle condition.'; + return $message; + } + + // validate fuel type + $fuel_type = $this->cleanText($r->get('vehicle_fuel_type', '')); + if (!FuelType::validate($fuel_type)) + { + $message = 'Invalid vehicle fuel type.'; + return $message; + } + return null; } @@ -1714,8 +1745,8 @@ class JobOrderController extends APIController $cust_vehicle = null; // find customer + customer vehicle combo - $cv = $this->findCustomerAndCustomerVehicle($data, $em); - if ($cv == null) + $cust_vehicle = $this->findCustomerAndCustomerVehicle($data, $em); + if ($cust_vehicle == null) { // find customer given phone number $cust = $em->getRepository(Customer::class)->findOneBy(['phone_mobile' => $mobile]); @@ -1749,34 +1780,39 @@ class JobOrderController extends APIController $em->persist($cust); // add customer vehicle - $cust_vehicle = $this->createCustomerVehicle($em, $cust, $vehicle); + $cust_vehicle = $this->createCustomerVehicle($em, $cust, $data); } else { // create customer vehicle - $cust_vehicle = $this->createCustomerVehicle($em, $cust, $vehicle); + $cust_vehicle = $this->createCustomerVehicle($em, $cust, $data); } $em->flush(); } $c_data = [ - 'customer' => $cust, + 'customer' => $cust_vehicle->getCustomer(), 'customer_vehicle' => $cust_vehicle, ]; return $c_data; } - protected function createCustomerVehicle(EntityManagerInterface $em, Customer $cust, Vehicle $vehicle) + protected function createCustomerVehicle(EntityManagerInterface $em, Customer $cust, $data) { // add customer vehicle $cust_vehicle = new CustomerVehicle(); $cust_vehicle->setCustomer($cust) - ->setPlateNumber($plate_number) - ->setVehicle($vehicle); + ->setPlateNumber($data['plate_number']) + ->setVehicle($data['vehicle']) + ->setModelYear($data['model_year']) + ->setStatusCondition($data['condition']) + ->setColor($data['color']) + ->setHasMotoliteBattery(true) + ->setFuelType($data['fuel_type']); $em->persist($cust_vehicle);