diff --git a/src/Command/SetJobOrderCustNewCommand.php b/src/Command/SetJobOrderCustNewCommand.php new file mode 100644 index 00000000..8eba6b6b --- /dev/null +++ b/src/Command/SetJobOrderCustNewCommand.php @@ -0,0 +1,80 @@ +em = $em; + $this->jo_manager = $jo_manager; + + parent::__construct(); + } + + protected function configure() + { + $this->setName('joborder:setcustomernew') + ->setDescription('Set job order\'s customer new flag for existing job orders.') + ->setHelp('Set job order\'s customer new flag for existing job orders'); + } + + protected function execute(InputInterface $input, OutputInterface $output) + { + $em = $this->em; + + // pdo connection + $db = $em->getConnection(); + + // get all the ids for all job orders + $all_query_sql = 'SELECT id AS jo_id, customer_id AS cust_id FROM job_order ORDER BY id'; + + $all_query_stmt = $db->prepare($all_query_sql); + $all_query_stmt->execute(); + + $all_jo_results = $all_query_stmt->fetchAll(); + + $output->writeln('Processing job orders...'); + + foreach ($all_jo_results as $jo_row) + { + // for each jo id, get the customer id + $jo_id = $jo_row['jo_id']; + $cust_id = $jo_row['cust_id']; + + // check how many JOs have that customer id + $jo_count = $this->jo_manager->getCustomerJobOrderCount($cust_id); + + // if one or less, set flag_cust_new to true + if ($jo_count <= 1) + $this->updateCustNew($db, $jo_id); + } + + $output->writeln('All done!'); + + return 0; + } + + protected function updateCustNew($db, $jo_id) + { + $update_jo_sql = 'UPDATE job_order SET flag_cust_new = :flag_cust_new WHERE id = :jo_id'; + + $update_jo_stmt = $db->prepare($update_jo_sql); + $update_jo_stmt->execute([ + 'flag_cust_new' => true, + 'jo_id' => $jo_id + ]); + } +} diff --git a/src/Controller/APIController.php b/src/Controller/APIController.php index 64662057..16a9cdf5 100644 --- a/src/Controller/APIController.php +++ b/src/Controller/APIController.php @@ -49,6 +49,7 @@ use App\Service\HubDistributor; use App\Service\HubFilterLogger; use App\Service\HubFilteringGeoChecker; use App\Service\HashGenerator; +use App\Service\JobOrderManager; use App\Entity\MobileSession; use App\Entity\Customer; @@ -867,7 +868,7 @@ class APIController extends Controller implements LoggedController MapTools $map_tools, InventoryManager $im, MQTTClient $mclient, RiderAssignmentHandlerInterface $rah, PromoLogger $promo_logger, HubSelector $hub_select, HubDistributor $hub_dist, HubFilterLogger $hub_filter_logger, - HubFilteringGeoChecker $hub_geofence) + HubFilteringGeoChecker $hub_geofence, JobOrderManager $jo_manager) { // check required parameters and api key $required_params = [ @@ -928,7 +929,15 @@ class APIController extends Controller implements LoggedController ->setErrorMessage('No customer information found'); return $res->getReturnResponse(); } + + // check if customer has more than one job order already + $flag_cust_new = false; + $cust_jo_count = $jo_manager->getCustomerJobOrderCount($cust->getID()); + if ($cust_jo_count <= 1) + $flag_cust_new = true; + $jo->setCustomer($cust); + $jo->setCustNew($flag_cust_new); // validate service type $stype = $req->request->get('service_type'); @@ -2732,7 +2741,7 @@ class APIController extends Controller implements LoggedController MapTools $map_tools, InventoryManager $im, MQTTClient $mclient, RiderAssignmentHandlerInterface $rah, PromoLogger $promo_logger, HubSelector $hub_select, HubDistributor $hub_dist, HubFilterLogger $hub_filter_logger, - HubFilteringGeoChecker $hub_geofence) + HubFilteringGeoChecker $hub_geofence, JobOrderManager $jo_manager) { // check required parameters and api key $required_params = [ @@ -2857,7 +2866,15 @@ class APIController extends Controller implements LoggedController // ->setErrorMessage('No customer information found'); // return $res->getReturnResponse(); // } + + // check if customer has more than one job order already + $flag_cust_new = false; + $cust_jo_count = $jo_manager->getCustomerJobOrderCount($cust->getID()); + if ($cust_jo_count <= 1) + $flag_cust_new = true; + $jo->setCustomer($cust); + $jo->setCustNew($flag_cust_new); // validate service type $stype = $req->request->get('service_type'); diff --git a/src/Controller/CustomerAppAPI/JobOrderController.php b/src/Controller/CustomerAppAPI/JobOrderController.php index 07356ce2..bd91e9fb 100644 --- a/src/Controller/CustomerAppAPI/JobOrderController.php +++ b/src/Controller/CustomerAppAPI/JobOrderController.php @@ -20,6 +20,7 @@ use App\Service\HubSelector; use App\Service\HubDistributor; use App\Service\HubFilterLogger; use App\Service\HubFilteringGeoChecker; +use App\Service\JobOrderManager; use App\Ramcar\ServiceType; use App\Ramcar\APIRiderStatus; use App\Ramcar\InvoiceCriteria; @@ -482,7 +483,8 @@ class JobOrderController extends ApiController HubSelector $hub_select, HubDistributor $hub_dist, HubFilterLogger $hub_filter_logger, - HubFilteringGeoChecker $hub_geofence + HubFilteringGeoChecker $hub_geofence, + JobOrderManager $jo_manager ) { // validate params $validity = $this->validateRequest($req, [ @@ -594,7 +596,16 @@ class JobOrderController extends ApiController // ->setErrorMessage('No customer information found'); // return $res->getReturnResponse(); // } + + // check if customer has more than one job order already + $flag_cust_new = false; + + $cust_jo_count = $jo_manager->getCustomerJobOrderCount($cust->getID()); + if ($cust_jo_count <= 1) + $flag_cust_new = true; + $jo->setCustomer($cust); + $jo->setCustNew($flag_cust_new); // validate service type $stype = $req->request->get('service_type'); @@ -956,7 +967,8 @@ class JobOrderController extends ApiController HubSelector $hub_select, HubDistributor $hub_dist, HubFilterLogger $hub_filter_logger, - HubFilteringGeoChecker $hub_geofence + HubFilteringGeoChecker $hub_geofence, + JobOrderManager $jo_manager ) { // validate params $validity = $this->validateRequest($req, [ @@ -1011,7 +1023,16 @@ class JobOrderController extends ApiController if ($cust == null) { return new ApiResponse(false, 'No customer information found.'); } + + // check if customer has more than one job order already + $flag_cust_new = false; + + $cust_jo_count = $jo_manager->getCustomerJobOrderCount($cust->getID()); + if ($cust_jo_count <= 1) + $flag_cust_new = true; + $jo->setCustomer($cust); + $jo->setCustNew($flag_cust_new); // validate service type $stype = $req->request->get('service_type'); diff --git a/src/Controller/TAPI/JobOrderController.php b/src/Controller/TAPI/JobOrderController.php index 83fb0a17..f7541b50 100644 --- a/src/Controller/TAPI/JobOrderController.php +++ b/src/Controller/TAPI/JobOrderController.php @@ -45,6 +45,7 @@ use App\Service\HubFilteringGeoChecker; use App\Service\RiderTracker; use App\Service\PromoLogger; use App\Service\MapTools; +use App\Service\JobOrderManager; use App\Entity\JobOrder; use App\Entity\CustomerVehicle; @@ -78,7 +79,7 @@ class JobOrderController extends ApiController FCMSender $fcmclient, RiderAssignmentHandlerInterface $rah, PromoLogger $promo_logger, HubSelector $hub_select, HubDistributor $hub_dist, HubFilterLogger $hub_filter_logger, - HubFilteringGeoChecker $hub_geofence, EntityManagerInterface $em) + HubFilteringGeoChecker $hub_geofence, EntityManagerInterface $em, JobOrderManager $jo_manager) { $this->denyAccessUnlessGranted('tapi_jo.request', null, 'No access.'); @@ -107,7 +108,7 @@ class JobOrderController extends ApiController // get data from request $data = []; - $status = $this->getJobOrderRequestInfo($req, $em, $data); + $status = $this->getJobOrderRequestInfo($req, $em, $jo_manager, $data); if ($status != null) return new APIResponse(false, $status); @@ -136,7 +137,8 @@ class JobOrderController extends ApiController ->setModeOfPayment($data['payment_mode']) ->setAdvanceOrder($data['is_advance_order']) ->setStatusAutoAssign(AutoAssignStatus::NOT_ASSIGNED) - ->setLandmark($data['landmark']); + ->setLandmark($data['landmark']) + ->setCustNew($data['flag_cust_new']); $jo->setCustomer($data['customer']); $jo->setCustomerVehicle($data['customer_vehicle']); @@ -1245,7 +1247,7 @@ class JobOrderController extends ApiController return $file_path; } - protected function getJobOrderRequestInfo(Request $req, EntityManagerInterface $em, &$data) + protected function getJobOrderRequestInfo(Request $req, EntityManagerInterface $em, JobOrderManager $jo_manager, &$data) { $error = $this->validateJORequest($req, $em); if ($error != null) @@ -1368,7 +1370,7 @@ class JobOrderController extends ApiController ]; // process customer and vehicle information - $cust_data = $this->processCustomerAndVehicleInformation($c_data, $em); + $cust_data = $this->processCustomerAndVehicleInformation($c_data, $em, $jo_manager); $data = [ 'trade_in_type' => $trade_in_type, @@ -1388,6 +1390,7 @@ class JobOrderController extends ApiController 'customer_vehicle' => $cust_data['customer_vehicle'], 'source' => TransactionOrigin::THIRD_PARTY, 'warranty_class' => $warranty_class, + 'flag_cust_new' => $cust_data['flag_cust_new'], ]; return null; @@ -1544,7 +1547,7 @@ class JobOrderController extends ApiController return null; } - protected function processCustomerAndVehicleInformation($data, EntityManagerInterface $em) + protected function processCustomerAndVehicleInformation($data, EntityManagerInterface $em, JobOrderManager $jo_manager) { $c_data = []; @@ -1561,6 +1564,7 @@ class JobOrderController extends ApiController // find customer + customer vehicle combo $cust_vehicle = $this->findCustomerAndCustomerVehicle($data, $em); + $flag_cust_new = false; if ($cust_vehicle == null) { // find customer given phone number @@ -1596,7 +1600,8 @@ class JobOrderController extends ApiController // add customer vehicle $cust_vehicle = $this->createCustomerVehicle($em, $cust, $data); - + + $flag_cust_new = true; } else { @@ -1607,9 +1612,18 @@ class JobOrderController extends ApiController $em->flush(); } + // check if customer has more than one job order already + if ($cust != null) + { + $cust_jo_count = $jo_manager->getCustomerJobOrderCount($cust->getID()); + if ($cust_jo_count <= 1) + $flag_cust_new = true; + } + $c_data = [ 'customer' => $cust_vehicle->getCustomer(), 'customer_vehicle' => $cust_vehicle, + 'flag_cust_new' => $flag_cust_new, ]; return $c_data; diff --git a/src/Entity/JobOrder.php b/src/Entity/JobOrder.php index c71f1846..885bc295 100644 --- a/src/Entity/JobOrder.php +++ b/src/Entity/JobOrder.php @@ -435,6 +435,12 @@ class JobOrder */ protected $inventory_count; + // flag to indicate if customer is new aka has one or less job order in system + /** + * @ORM\Column(type="boolean") + */ + protected $flag_cust_new; + public function __construct() { $this->date_create = new DateTime(); @@ -461,6 +467,8 @@ class JobOrder $this->will_wait = WillingToWaitContent::WILLING_TO_WAIT; $this->inventory_count = 0; + + $this->flag_cust_new = false; } public function getID() @@ -1237,4 +1245,15 @@ class JobOrder return $this->inventory_count; } + public function setCustNew($flag_cust_new = true) + { + $this->flag_cust_new = $flag_cust_new; + return $this; + } + + public function isCustNew() + { + return $this->flag_cust_new; + } + } diff --git a/src/Service/JobOrderHandler/ResqJobOrderHandler.php b/src/Service/JobOrderHandler/ResqJobOrderHandler.php index 97ddb2a3..361c0b22 100644 --- a/src/Service/JobOrderHandler/ResqJobOrderHandler.php +++ b/src/Service/JobOrderHandler/ResqJobOrderHandler.php @@ -68,6 +68,7 @@ use App\Service\PromoLogger; use App\Service\HubSelector; use App\Service\HubDistributor; use App\Service\HubFilteringGeoChecker; +use App\Service\JobOrderManager; use CrEOF\Spatial\PHP\Types\Geometry\Point; @@ -94,6 +95,7 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface protected $hub_geofence; protected $cust_distance_limit; protected $hub_filter_enable; + protected $jo_manager; protected $template_hash; @@ -102,7 +104,7 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface TranslatorInterface $translator, RiderAssignmentHandlerInterface $rah, string $country_code, WarrantyHandler $wh, RisingTideGateway $rt, PromoLogger $promo_logger, HubDistributor $hub_dist, HubFilteringGeoChecker $hub_geofence, - string $cust_distance_limit, string $hub_filter_enabled) + string $cust_distance_limit, string $hub_filter_enabled, JobOrderManager $jo_manager) { $this->em = $em; $this->ic = $ic; @@ -118,6 +120,7 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface $this->hub_geofence = $hub_geofence; $this->cust_distance_limit = $cust_distance_limit; $this->hub_filter_enabled = $hub_filter_enabled; + $this->jo_manager = $jo_manager; $this->loadTemplates(); } @@ -214,7 +217,7 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface ($reason == CustomerNotWaitReason::RUSH_REQUEST)) $is_emergency = true; } - + // add row data $row['id'] = $orow->getID(); $row['customer_name'] = $orow->getCustomer()->getFirstName() . ' ' . $orow->getCustomer()->getLastName(); @@ -228,6 +231,7 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface $row['is_mobile'] = $orow->getSource() == TransactionOrigin::MOBILE_APP; $row['is_vip'] = $is_vip; $row['is_emergency'] = $is_emergency; + $row['flag_cust_new'] = $orow->isCustNew(); $row['date_assign'] = !empty($orow->getDateAssign()) ? $orow->getDateAssign()->format("c") : null; $row['date_fulfill'] = !empty($orow->getDateFulfill()) ? $orow->getDateFulfill()->format("c") : null; @@ -361,6 +365,7 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface // find customer $cust_id = $req->request->get('cid'); $customer = $em->getRepository(Customer::class)->find($cust_id); + $flag_cust_new = false; if (empty($customer)) { $error_array['customer_vehicle'] = 'Invalid customer specified.'; @@ -390,6 +395,11 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface ->setDpaConsent($is_dpa_checked); } + // check if customer has more than one job order already + $cust_jo_count = $this->jo_manager->getCustomerJobOrderCount($customer->getID()); + if ($cust_jo_count <= 1) + $flag_cust_new = true; + // check if lat and lng are provided if (empty($req->request->get('coord_lng')) || empty($req->request->get('coord_lat'))) { $error_array['coordinates'] = 'No map coordinates provided. Please click on a location on the map.'; @@ -521,7 +531,8 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface ->setGender($gender) ->setEmergencyType($etype) ->setOwnershipType($owner_type) - ->setCustomerLocation($cust_location); + ->setCustomerLocation($cust_location) + ->setCustNew($flag_cust_new); // check if user is null, meaning call to create came from API if ($user != null) diff --git a/src/Service/JobOrderManager.php b/src/Service/JobOrderManager.php index c54557d6..e592b6ca 100644 --- a/src/Service/JobOrderManager.php +++ b/src/Service/JobOrderManager.php @@ -5,9 +5,12 @@ namespace App\Service; use App\Entity\JobOrder; use App\Ramcar\ServiceType; +use App\Ramcar\JOStatus; use Doctrine\ORM\EntityManagerInterface; +use PDO; + class JobOrderManager { protected $em; @@ -36,6 +39,22 @@ class JobOrderManager return false; } + public function getCustomerJobOrderCount($customer_id) + { + $db = $this->em->getConnection(); + + $query_sql = 'SELECT COUNT(*) AS jo_count FROM job_order WHERE customer_id = :cust_id AND status != :status_cancelled'; + + $query_stmt = $db->prepare($query_sql); + $query_stmt->bindValue('cust_id', $customer_id); + $query_stmt->bindValue('status_cancelled', JOStatus::CANCELLED); + + $jo_results = $query_stmt->executeQuery(); + $results = $jo_results->fetchAssociative(); + + return $results['jo_count']; + } + protected function updateCustomerVehicleBattery($cust_vehicle, $invoice) { if (($cust_vehicle != null) && ($invoice != null)) diff --git a/templates/job-order/list.all.html.twig b/templates/job-order/list.all.html.twig index 90b8b8e6..0eeddd1f 100644 --- a/templates/job-order/list.all.html.twig +++ b/templates/job-order/list.all.html.twig @@ -121,6 +121,21 @@ field: 'plate_number', title: 'Plate #' }, + { + field: 'flag_cust_new', + title: 'New', + template: function (row, index, datatable) { + var tag = ''; + + if (row.flag_cust_new === true) { + tag = 'Yes'; + } else { + tag = 'No'; + } + + return tag; + } + }, { field: 'customer_name', title: 'Customer'