Merge branch '773-add-a-dropdown-box-in-customer-information-to-indicate-if-customer-is-new-old' into '746-resq-2-0-final'

Resolve "Add a dropdown box in Customer Information to indicate if customer is new/old"

See merge request jankstudio/resq!883
This commit is contained in:
Ramon Gutierrez 2023-11-10 05:47:05 +00:00
commit fba077d4d3
8 changed files with 210 additions and 14 deletions

View file

@ -0,0 +1,80 @@
<?php
namespace App\Command;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Doctrine\ORM\EntityManagerInterface;
use App\Service\JobOrderManager;
class SetJobOrderCustNewCommand extends Command
{
protected $em;
protected $jo_manager;
public function __construct(EntityManagerInterface $em, JobOrderManager $jo_manager)
{
$this->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
]);
}
}

View file

@ -49,6 +49,7 @@ use App\Service\HubDistributor;
use App\Service\HubFilterLogger; use App\Service\HubFilterLogger;
use App\Service\HubFilteringGeoChecker; use App\Service\HubFilteringGeoChecker;
use App\Service\HashGenerator; use App\Service\HashGenerator;
use App\Service\JobOrderManager;
use App\Entity\MobileSession; use App\Entity\MobileSession;
use App\Entity\Customer; use App\Entity\Customer;
@ -867,7 +868,7 @@ class APIController extends Controller implements LoggedController
MapTools $map_tools, InventoryManager $im, MQTTClient $mclient, MapTools $map_tools, InventoryManager $im, MQTTClient $mclient,
RiderAssignmentHandlerInterface $rah, PromoLogger $promo_logger, RiderAssignmentHandlerInterface $rah, PromoLogger $promo_logger,
HubSelector $hub_select, HubDistributor $hub_dist, HubFilterLogger $hub_filter_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 // check required parameters and api key
$required_params = [ $required_params = [
@ -928,7 +929,15 @@ class APIController extends Controller implements LoggedController
->setErrorMessage('No customer information found'); ->setErrorMessage('No customer information found');
return $res->getReturnResponse(); 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->setCustomer($cust);
$jo->setCustNew($flag_cust_new);
// validate service type // validate service type
$stype = $req->request->get('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, MapTools $map_tools, InventoryManager $im, MQTTClient $mclient,
RiderAssignmentHandlerInterface $rah, PromoLogger $promo_logger, RiderAssignmentHandlerInterface $rah, PromoLogger $promo_logger,
HubSelector $hub_select, HubDistributor $hub_dist, HubFilterLogger $hub_filter_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 // check required parameters and api key
$required_params = [ $required_params = [
@ -2857,7 +2866,15 @@ class APIController extends Controller implements LoggedController
// ->setErrorMessage('No customer information found'); // ->setErrorMessage('No customer information found');
// return $res->getReturnResponse(); // 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->setCustomer($cust);
$jo->setCustNew($flag_cust_new);
// validate service type // validate service type
$stype = $req->request->get('service_type'); $stype = $req->request->get('service_type');

View file

@ -20,6 +20,7 @@ use App\Service\HubSelector;
use App\Service\HubDistributor; use App\Service\HubDistributor;
use App\Service\HubFilterLogger; use App\Service\HubFilterLogger;
use App\Service\HubFilteringGeoChecker; use App\Service\HubFilteringGeoChecker;
use App\Service\JobOrderManager;
use App\Ramcar\ServiceType; use App\Ramcar\ServiceType;
use App\Ramcar\APIRiderStatus; use App\Ramcar\APIRiderStatus;
use App\Ramcar\InvoiceCriteria; use App\Ramcar\InvoiceCriteria;
@ -482,7 +483,8 @@ class JobOrderController extends ApiController
HubSelector $hub_select, HubSelector $hub_select,
HubDistributor $hub_dist, HubDistributor $hub_dist,
HubFilterLogger $hub_filter_logger, HubFilterLogger $hub_filter_logger,
HubFilteringGeoChecker $hub_geofence HubFilteringGeoChecker $hub_geofence,
JobOrderManager $jo_manager
) { ) {
// validate params // validate params
$validity = $this->validateRequest($req, [ $validity = $this->validateRequest($req, [
@ -594,7 +596,16 @@ class JobOrderController extends ApiController
// ->setErrorMessage('No customer information found'); // ->setErrorMessage('No customer information found');
// return $res->getReturnResponse(); // 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->setCustomer($cust);
$jo->setCustNew($flag_cust_new);
// validate service type // validate service type
$stype = $req->request->get('service_type'); $stype = $req->request->get('service_type');
@ -956,7 +967,8 @@ class JobOrderController extends ApiController
HubSelector $hub_select, HubSelector $hub_select,
HubDistributor $hub_dist, HubDistributor $hub_dist,
HubFilterLogger $hub_filter_logger, HubFilterLogger $hub_filter_logger,
HubFilteringGeoChecker $hub_geofence HubFilteringGeoChecker $hub_geofence,
JobOrderManager $jo_manager
) { ) {
// validate params // validate params
$validity = $this->validateRequest($req, [ $validity = $this->validateRequest($req, [
@ -1011,7 +1023,16 @@ class JobOrderController extends ApiController
if ($cust == null) { if ($cust == null) {
return new ApiResponse(false, 'No customer information found.'); 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->setCustomer($cust);
$jo->setCustNew($flag_cust_new);
// validate service type // validate service type
$stype = $req->request->get('service_type'); $stype = $req->request->get('service_type');

View file

@ -45,6 +45,7 @@ use App\Service\HubFilteringGeoChecker;
use App\Service\RiderTracker; use App\Service\RiderTracker;
use App\Service\PromoLogger; use App\Service\PromoLogger;
use App\Service\MapTools; use App\Service\MapTools;
use App\Service\JobOrderManager;
use App\Entity\JobOrder; use App\Entity\JobOrder;
use App\Entity\CustomerVehicle; use App\Entity\CustomerVehicle;
@ -78,7 +79,7 @@ class JobOrderController extends ApiController
FCMSender $fcmclient, FCMSender $fcmclient,
RiderAssignmentHandlerInterface $rah, PromoLogger $promo_logger, RiderAssignmentHandlerInterface $rah, PromoLogger $promo_logger,
HubSelector $hub_select, HubDistributor $hub_dist, HubFilterLogger $hub_filter_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.'); $this->denyAccessUnlessGranted('tapi_jo.request', null, 'No access.');
@ -107,7 +108,7 @@ class JobOrderController extends ApiController
// get data from request // get data from request
$data = []; $data = [];
$status = $this->getJobOrderRequestInfo($req, $em, $data); $status = $this->getJobOrderRequestInfo($req, $em, $jo_manager, $data);
if ($status != null) if ($status != null)
return new APIResponse(false, $status); return new APIResponse(false, $status);
@ -136,7 +137,8 @@ class JobOrderController extends ApiController
->setModeOfPayment($data['payment_mode']) ->setModeOfPayment($data['payment_mode'])
->setAdvanceOrder($data['is_advance_order']) ->setAdvanceOrder($data['is_advance_order'])
->setStatusAutoAssign(AutoAssignStatus::NOT_ASSIGNED) ->setStatusAutoAssign(AutoAssignStatus::NOT_ASSIGNED)
->setLandmark($data['landmark']); ->setLandmark($data['landmark'])
->setCustNew($data['flag_cust_new']);
$jo->setCustomer($data['customer']); $jo->setCustomer($data['customer']);
$jo->setCustomerVehicle($data['customer_vehicle']); $jo->setCustomerVehicle($data['customer_vehicle']);
@ -1245,7 +1247,7 @@ class JobOrderController extends ApiController
return $file_path; 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); $error = $this->validateJORequest($req, $em);
if ($error != null) if ($error != null)
@ -1368,7 +1370,7 @@ class JobOrderController extends ApiController
]; ];
// process customer and vehicle information // process customer and vehicle information
$cust_data = $this->processCustomerAndVehicleInformation($c_data, $em); $cust_data = $this->processCustomerAndVehicleInformation($c_data, $em, $jo_manager);
$data = [ $data = [
'trade_in_type' => $trade_in_type, 'trade_in_type' => $trade_in_type,
@ -1388,6 +1390,7 @@ class JobOrderController extends ApiController
'customer_vehicle' => $cust_data['customer_vehicle'], 'customer_vehicle' => $cust_data['customer_vehicle'],
'source' => TransactionOrigin::THIRD_PARTY, 'source' => TransactionOrigin::THIRD_PARTY,
'warranty_class' => $warranty_class, 'warranty_class' => $warranty_class,
'flag_cust_new' => $cust_data['flag_cust_new'],
]; ];
return null; return null;
@ -1544,7 +1547,7 @@ class JobOrderController extends ApiController
return null; return null;
} }
protected function processCustomerAndVehicleInformation($data, EntityManagerInterface $em) protected function processCustomerAndVehicleInformation($data, EntityManagerInterface $em, JobOrderManager $jo_manager)
{ {
$c_data = []; $c_data = [];
@ -1561,6 +1564,7 @@ class JobOrderController extends ApiController
// find customer + customer vehicle combo // find customer + customer vehicle combo
$cust_vehicle = $this->findCustomerAndCustomerVehicle($data, $em); $cust_vehicle = $this->findCustomerAndCustomerVehicle($data, $em);
$flag_cust_new = false;
if ($cust_vehicle == null) if ($cust_vehicle == null)
{ {
// find customer given phone number // find customer given phone number
@ -1596,7 +1600,8 @@ class JobOrderController extends ApiController
// add customer vehicle // add customer vehicle
$cust_vehicle = $this->createCustomerVehicle($em, $cust, $data); $cust_vehicle = $this->createCustomerVehicle($em, $cust, $data);
$flag_cust_new = true;
} }
else else
{ {
@ -1607,9 +1612,18 @@ class JobOrderController extends ApiController
$em->flush(); $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 = [ $c_data = [
'customer' => $cust_vehicle->getCustomer(), 'customer' => $cust_vehicle->getCustomer(),
'customer_vehicle' => $cust_vehicle, 'customer_vehicle' => $cust_vehicle,
'flag_cust_new' => $flag_cust_new,
]; ];
return $c_data; return $c_data;

View file

@ -435,6 +435,12 @@ class JobOrder
*/ */
protected $inventory_count; 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() public function __construct()
{ {
$this->date_create = new DateTime(); $this->date_create = new DateTime();
@ -461,6 +467,8 @@ class JobOrder
$this->will_wait = WillingToWaitContent::WILLING_TO_WAIT; $this->will_wait = WillingToWaitContent::WILLING_TO_WAIT;
$this->inventory_count = 0; $this->inventory_count = 0;
$this->flag_cust_new = false;
} }
public function getID() public function getID()
@ -1237,4 +1245,15 @@ class JobOrder
return $this->inventory_count; 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;
}
} }

View file

@ -68,6 +68,7 @@ use App\Service\PromoLogger;
use App\Service\HubSelector; use App\Service\HubSelector;
use App\Service\HubDistributor; use App\Service\HubDistributor;
use App\Service\HubFilteringGeoChecker; use App\Service\HubFilteringGeoChecker;
use App\Service\JobOrderManager;
use CrEOF\Spatial\PHP\Types\Geometry\Point; use CrEOF\Spatial\PHP\Types\Geometry\Point;
@ -94,6 +95,7 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface
protected $hub_geofence; protected $hub_geofence;
protected $cust_distance_limit; protected $cust_distance_limit;
protected $hub_filter_enable; protected $hub_filter_enable;
protected $jo_manager;
protected $template_hash; protected $template_hash;
@ -102,7 +104,7 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface
TranslatorInterface $translator, RiderAssignmentHandlerInterface $rah, TranslatorInterface $translator, RiderAssignmentHandlerInterface $rah,
string $country_code, WarrantyHandler $wh, RisingTideGateway $rt, string $country_code, WarrantyHandler $wh, RisingTideGateway $rt,
PromoLogger $promo_logger, HubDistributor $hub_dist, HubFilteringGeoChecker $hub_geofence, 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->em = $em;
$this->ic = $ic; $this->ic = $ic;
@ -118,6 +120,7 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface
$this->hub_geofence = $hub_geofence; $this->hub_geofence = $hub_geofence;
$this->cust_distance_limit = $cust_distance_limit; $this->cust_distance_limit = $cust_distance_limit;
$this->hub_filter_enabled = $hub_filter_enabled; $this->hub_filter_enabled = $hub_filter_enabled;
$this->jo_manager = $jo_manager;
$this->loadTemplates(); $this->loadTemplates();
} }
@ -214,7 +217,7 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface
($reason == CustomerNotWaitReason::RUSH_REQUEST)) ($reason == CustomerNotWaitReason::RUSH_REQUEST))
$is_emergency = true; $is_emergency = true;
} }
// add row data // add row data
$row['id'] = $orow->getID(); $row['id'] = $orow->getID();
$row['customer_name'] = $orow->getCustomer()->getFirstName() . ' ' . $orow->getCustomer()->getLastName(); $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_mobile'] = $orow->getSource() == TransactionOrigin::MOBILE_APP;
$row['is_vip'] = $is_vip; $row['is_vip'] = $is_vip;
$row['is_emergency'] = $is_emergency; $row['is_emergency'] = $is_emergency;
$row['flag_cust_new'] = $orow->isCustNew();
$row['date_assign'] = !empty($orow->getDateAssign()) ? $orow->getDateAssign()->format("c") : null; $row['date_assign'] = !empty($orow->getDateAssign()) ? $orow->getDateAssign()->format("c") : null;
$row['date_fulfill'] = !empty($orow->getDateFulfill()) ? $orow->getDateFulfill()->format("c") : null; $row['date_fulfill'] = !empty($orow->getDateFulfill()) ? $orow->getDateFulfill()->format("c") : null;
@ -361,6 +365,7 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface
// find customer // find customer
$cust_id = $req->request->get('cid'); $cust_id = $req->request->get('cid');
$customer = $em->getRepository(Customer::class)->find($cust_id); $customer = $em->getRepository(Customer::class)->find($cust_id);
$flag_cust_new = false;
if (empty($customer)) if (empty($customer))
{ {
$error_array['customer_vehicle'] = 'Invalid customer specified.'; $error_array['customer_vehicle'] = 'Invalid customer specified.';
@ -390,6 +395,11 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface
->setDpaConsent($is_dpa_checked); ->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 // check if lat and lng are provided
if (empty($req->request->get('coord_lng')) || empty($req->request->get('coord_lat'))) { 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.'; $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) ->setGender($gender)
->setEmergencyType($etype) ->setEmergencyType($etype)
->setOwnershipType($owner_type) ->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 // check if user is null, meaning call to create came from API
if ($user != null) if ($user != null)

View file

@ -5,9 +5,12 @@ namespace App\Service;
use App\Entity\JobOrder; use App\Entity\JobOrder;
use App\Ramcar\ServiceType; use App\Ramcar\ServiceType;
use App\Ramcar\JOStatus;
use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\EntityManagerInterface;
use PDO;
class JobOrderManager class JobOrderManager
{ {
protected $em; protected $em;
@ -36,6 +39,22 @@ class JobOrderManager
return false; 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) protected function updateCustomerVehicleBattery($cust_vehicle, $invoice)
{ {
if (($cust_vehicle != null) && ($invoice != null)) if (($cust_vehicle != null) && ($invoice != null))

View file

@ -121,6 +121,21 @@
field: 'plate_number', field: 'plate_number',
title: 'Plate #' title: 'Plate #'
}, },
{
field: 'flag_cust_new',
title: 'New',
template: function (row, index, datatable) {
var tag = '';
if (row.flag_cust_new === true) {
tag = '<span class="m-badge m-badge--success m-badge--wide">Yes</span>';
} else {
tag = '<span class="m-badge m-badge--danger m-badge--wide">No</span>';
}
return tag;
}
},
{ {
field: 'customer_name', field: 'customer_name',
title: 'Customer' title: 'Customer'