From c44fa661959692b9efbca56cf0e626bee2541e8f Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Fri, 9 Oct 2020 22:57:44 +0800 Subject: [PATCH 1/2] Create MotivConnector service #519 --- config/routes/dev/test.yaml | 4 ++ config/services.yaml | 7 ++++ src/Controller/TestController.php | 27 +++++++++++-- src/Service/MotivConnector.php | 63 +++++++++++++++++++++++++++++++ 4 files changed, 97 insertions(+), 4 deletions(-) create mode 100644 src/Service/MotivConnector.php diff --git a/config/routes/dev/test.yaml b/config/routes/dev/test.yaml index ccad499a..578332af 100644 --- a/config/routes/dev/test.yaml +++ b/config/routes/dev/test.yaml @@ -11,3 +11,7 @@ test_gmap: test_distance: path: /test/distance controller: App\Controller\TestController::distance + +test_motiv_connector: + path: /test/motiv_connector + controller: App\Controller\TestController::motivConnector diff --git a/config/services.yaml b/config/services.yaml index 05fd3b1a..43fb74df 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -242,3 +242,10 @@ services: App\EventSubscriber\LogSubscriber: arguments: $api_log_flag: "%env(API_LOGGING)%" + + # motiv connector + App\Service\MotivConnector: + arguments: + $base_url: "%env(MOTIV_BASE_URL)%" + $sub_key: "%env(MOTIV_KEY)%" + $token: "%env(MOTIV_TOKEN)%" diff --git a/src/Controller/TestController.php b/src/Controller/TestController.php index 4957cab0..a6ec4edb 100644 --- a/src/Controller/TestController.php +++ b/src/Controller/TestController.php @@ -6,14 +6,17 @@ use Catalyst\AuthBundle\Service\ACLGenerator; use CrEOF\Spatial\PHP\Types\Geometry\Point; -use App\Entity\Outlet; -use GuzzleHttp\Client as GuzzleClient; -use App\Service\MapTools; -use Doctrine\Common\Util\Debug; use Symfony\Bundle\FrameworkBundle\Controller\Controller; +use Doctrine\Common\Util\Debug; +use GuzzleHttp\Client as GuzzleClient; use Catalyst\MenuBundle\Annotation\Menu; +use App\Entity\Outlet; +use App\Service\MapTools; +use App\Service\MotivConnector; + + class TestController extends Controller { /** @@ -63,4 +66,20 @@ class TestController extends Controller return $this->render('home.html.twig'); } + + /** + * @Menu(selected="home") + */ + public function motivConnector(MotivConnector $motiv) + { + $branches = [ + 'ZL0133', + 'ZL0033', + ]; + $skus = [ + 'ECHD26AL-SPN00-L', + 'ECHD26AL-SPN00-LX', + ]; + $motiv->getInventory($branches, $skus); + } } diff --git a/src/Service/MotivConnector.php b/src/Service/MotivConnector.php new file mode 100644 index 00000000..263cb0d0 --- /dev/null +++ b/src/Service/MotivConnector.php @@ -0,0 +1,63 @@ +base_url = $base_url; + $this->sub_key = $sub_key; + $this->token = $token; + } + + public function generateToken() + { + // NOTE: no need for now, since we use the pre-generated token + } + + public function getInventory($branch_codes = [], $skus = []) + { + $body = [ + 'BranchCodes' => $branch_codes, + 'Skus' => $skus + ]; + + $body_text = json_encode($body); + + $res = $this->curlPost('InventoryService', $body_text); + } + + protected function curlPost($url, $body) + { + $curl = curl_init(); + + $options = [ + CURLOPT_URL => $this->base_url . '/' . $url, + CURLOPT_POST => true, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_POSTFIELDS => $body, + CURLOPT_HTTPHEADER => [ + 'Content-Type: application/json', + 'Ocp-Apim-Subscription-Key: ' . $this->sub_key, + 'Authorization: Bearer ' . $this->token, + ], + ]; + + curl_setopt_array($curl, $options); + $res = curl_exec($curl); + + curl_close($curl); + + error_log('MOTIV API connector'); + error_log(print_r($options, true)); + error_log($res); + + return $res; + } +} From 1227e03e1a6d9a2d51e2c6910302f4d2f901e443 Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Sat, 10 Oct 2020 00:52:45 +0800 Subject: [PATCH 2/2] Add inventory count to hub table in job order processing form #519 --- src/Controller/JobOrderController.php | 7 +-- .../JobOrderHandler/CMBJobOrderHandler.php | 2 +- .../JobOrderHandler/ResqJobOrderHandler.php | 49 ++++++++++++++++++- src/Service/JobOrderHandlerInterface.php | 2 +- src/Service/MotivConnector.php | 2 + templates/job-order/form.html.twig | 2 + 6 files changed, 57 insertions(+), 7 deletions(-) diff --git a/src/Controller/JobOrderController.php b/src/Controller/JobOrderController.php index f23fc73c..1549f48a 100644 --- a/src/Controller/JobOrderController.php +++ b/src/Controller/JobOrderController.php @@ -22,6 +22,8 @@ use App\Service\MapTools; use App\Service\MQTTClient; use App\Service\APNSClient; use App\Service\InventoryManager; +use App\Service\RiderTracker; +use App\Service\MotivConnector; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; @@ -30,7 +32,6 @@ use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter; use Doctrine\ORM\EntityManagerInterface; -use App\Service\RiderTracker; use Catalyst\MenuBundle\Annotation\Menu; @@ -309,13 +310,13 @@ class JobOrderController extends Controller /** * @Menu(selected="jo_proc") */ - public function processingForm(MapTools $map_tools, $id, JobOrderHandlerInterface $jo_handler, GISManagerInterface $gis) + public function processingForm(MapTools $map_tools, $id, JobOrderHandlerInterface $jo_handler, GISManagerInterface $gis, MotivConnector $motiv) { $this->denyAccessUnlessGranted('jo_proc.list', null, 'No access.'); try { - $params = $jo_handler->initializeProcessingForm($id, $map_tools); + $params = $jo_handler->initializeProcessingForm($id, $map_tools, $motiv); } catch (AccessDeniedHttpException $e) { diff --git a/src/Service/JobOrderHandler/CMBJobOrderHandler.php b/src/Service/JobOrderHandler/CMBJobOrderHandler.php index 862d431b..1dc1e735 100644 --- a/src/Service/JobOrderHandler/CMBJobOrderHandler.php +++ b/src/Service/JobOrderHandler/CMBJobOrderHandler.php @@ -1627,7 +1627,7 @@ class CMBJobOrderHandler implements JobOrderHandlerInterface } // initialize dispatch/processing job order form - public function initializeProcessingForm($id, $map_tools) + public function initializeProcessingForm($id, $map_tools, $motiv) { $em = $this->em; diff --git a/src/Service/JobOrderHandler/ResqJobOrderHandler.php b/src/Service/JobOrderHandler/ResqJobOrderHandler.php index e6cc6ec8..9694a2ba 100644 --- a/src/Service/JobOrderHandler/ResqJobOrderHandler.php +++ b/src/Service/JobOrderHandler/ResqJobOrderHandler.php @@ -1600,7 +1600,7 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface } // initialize dispatch/processing job order form - public function initializeProcessingForm($id, $map_tools) + public function initializeProcessingForm($id, $map_tools, $motiv) { $em = $this->em; @@ -1671,6 +1671,9 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface $params['hubs'] = []; + $branch_codes = []; + $inv_data = []; + // format duration and distance into friendly time foreach ($hubs as $hub) { // duration @@ -1711,13 +1714,55 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface } } - $params['hubs'][] = $hub; + // handle inventory data + $bcode = $hub['hub']->getBranchCode(); + $hub['inventory'] = 0; + if ($bcode != '') + { + $branch_codes[] = $bcode; + $inv_data[$bcode] = [ + 'hub_id' => $hub_id, + 'branch_code' => $bcode, + 'inventory' => 0, + ]; + } + + $params['hubs'][$hub_id] = $hub; } $params['obj'] = $obj; // get template to display $params['template'] = $this->getTwigTemplate('jo_processing_form'); + // get battery (if any) + $skus = []; + $invoice = $obj->getInvoice(); + $inv_items = $invoice->getItems(); + foreach ($inv_items as $inv_item) + { + $batt = $inv_item->getBattery(); + if ($batt == null) + continue; + + $skus[] = $batt->getSapCode(); + } + + // get inventory + $mres = $motiv->getInventory($branch_codes, $skus); + foreach ($mres as $mres_item) + { + $bcode = $mres_item['BranchCode']; + $inv_count = $mres_item['Quantity']; + if (isset($inv_data[$bcode])) + { + $hub_id = $inv_data[$bcode]['hub_id']; + + $params['hubs'][$hub_id]['inventory'] = $inv_count; + } + } + + error_log(print_r($mres, true)); + return $params; } diff --git a/src/Service/JobOrderHandlerInterface.php b/src/Service/JobOrderHandlerInterface.php index 590a0926..59aea943 100644 --- a/src/Service/JobOrderHandlerInterface.php +++ b/src/Service/JobOrderHandlerInterface.php @@ -67,7 +67,7 @@ interface JobOrderHandlerInterface public function initializeAllForm(int $id); // initialize dispatch/processing job order form - public function initializeProcessingForm(int $id, MapTools $map_tools); + public function initializeProcessingForm(int $id, MapTools $map_tools, $motiv); // initialize assign job order form public function initializeAssignForm(int $id); diff --git a/src/Service/MotivConnector.php b/src/Service/MotivConnector.php index 263cb0d0..f98e1b16 100644 --- a/src/Service/MotivConnector.php +++ b/src/Service/MotivConnector.php @@ -31,6 +31,8 @@ class MotivConnector $body_text = json_encode($body); $res = $this->curlPost('InventoryService', $body_text); + + return json_decode($res, true); } protected function curlPost($url, $body) diff --git a/templates/job-order/form.html.twig b/templates/job-order/form.html.twig index bba70b39..a6063f63 100644 --- a/templates/job-order/form.html.twig +++ b/templates/job-order/form.html.twig @@ -575,6 +575,7 @@ --> Available Riders Jobs For Assignment + Inventory Contact Numbers Action @@ -596,6 +597,7 @@ --> {{ hub.rider_count }} {{ hub.jo_count }} + {{ hub.inventory|default('0') }} {{ hub.hub.getContactNumbers|replace({"\n": ', '}) }} {% if hub.flag_rejected %}