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/JobOrderController.php b/src/Controller/JobOrderController.php index e10f8496..11c7edf0 100644 --- a/src/Controller/JobOrderController.php +++ b/src/Controller/JobOrderController.php @@ -23,8 +23,13 @@ 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 App\Service\GeofenceTracker; + use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Bundle\FrameworkBundle\Controller\Controller; @@ -32,7 +37,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; @@ -311,13 +315,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/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/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 257a39a1..70cac92d 100644 --- a/src/Service/JobOrderHandler/ResqJobOrderHandler.php +++ b/src/Service/JobOrderHandler/ResqJobOrderHandler.php @@ -1810,7 +1810,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; @@ -1881,6 +1881,9 @@ class ResqJobOrderHandler implements JobOrderHandlerInterface $params['hubs'] = []; + $branch_codes = []; + $inv_data = []; + // format duration and distance into friendly time foreach ($hubs as $hub) { // duration @@ -1921,13 +1924,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 new file mode 100644 index 00000000..f98e1b16 --- /dev/null +++ b/src/Service/MotivConnector.php @@ -0,0 +1,65 @@ +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); + + return json_decode($res, true); + } + + 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; + } +} diff --git a/templates/job-order/form.html.twig b/templates/job-order/form.html.twig index b712ad4e..e23a623e 100644 --- a/templates/job-order/form.html.twig +++ b/templates/job-order/form.html.twig @@ -616,6 +616,7 @@ -->