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'