2 namespace Workspace\Controller;
6 class DeviceWorkspaceController extends \Zend\Mvc\Controller\AbstractActionController
10 * @var \Zend\Session\Container
22 * @var \Zend\ServiceManager\ServiceManager
30 protected $authenticated = false;
32 * @var \User\Service\Authentication
34 protected $authDetails;
39 * Retrieve workspace manager.
41 public function initPost($initSession = true, $tokenParam = 'authToken')
43 defined('APPLICATION')
44 || define('APPLICATION', 'Mobile');
45 $this->request = $_POST;
46 $this->response = array();
49 if (!isset($this->request[$tokenParam]) || empty($this->request[$tokenParam]))
55 \Utility\Registry::setSession($this->request[$tokenParam]);
56 $this->authenticated = true;
57 $this->authDetails = \Utility\Registry::getAuthData();
64 \Utility\Registry::setServiceManager($this->serviceLocator);
65 \Utility\Registry::addDynamicConfig(
66 \Utility\Registry::getEntityManager()
67 ->getRepository('Config\Entity\Config')
75 * Convenience method to extract parameters from request packet.
76 * @param string $paramName
77 * @param unknown $default
80 protected function reqParam($paramName, $default = null)
82 return isset($this->request[$paramName])
83 ? $this->request[$paramName]
88 * Convenience method to extract parameters from a nested request packet.
90 * @param string $paramName
91 * @param unknown $default
94 protected function reqNestedParam($root, $paramName, $default = null)
96 return isset($this->request[$root][$paramName])
97 ? $this->request[$root][$paramName]
102 * Convenience method to extract parameters from a nested request packet.
103 * @param string $root
104 * @param string $paramName
105 * @param string $entityName
106 * @param unknown $default
109 protected function reqNestedParamRef($root, $paramName, $entityName, $default = null)
111 return isset($this->request[$root][$paramName])
112 && !is_null($this->request[$root][$paramName])
113 && 0 != $this->request[$root][$paramName]
114 ? $this->em->getReference($entityName, $this->request[$root][$paramName])
121 * Display list of tasks for specified workflows.
122 * @see \Zend\Mvc\Controller\AbstractActionController::indexAction()
123 * @return \Zend\View\Model\JsonModel
125 public function indexAction()
127 return new \Zend\View\Model\JsonModel(array(
128 'login' => 'Requires an array with `email`, `pin`.',
129 'get-dataset' => 'Requires `token`, `datasetName`, [`page`, `timeStart`, `timeEnd`]'
136 * @return \Zend\View\Model\JsonModel
138 public function pingAction()
140 return new \Zend\View\Model\JsonModel(array(
143 'Status' => 'Success',
147 'ServerTime' => time()
154 * Mobile device connected to push server.
155 * @return \Zend\View\Model\JsonModel
157 public function registerDeviceAction()
159 $this->initPost(true, 'ident');
161 if ($this->authenticated)
163 \Utility\Registry::setAuthParam('pubid', $this->request['pubid']);
164 $em = \Utility\Registry::getEntityManager();
165 $session = $em->getRepository('\User\Entity\Session')
166 ->findOneBy(array('authToken' => $this->request['ident']));
167 if (!is_null($session))
169 $session->pubId = $this->request['pubid'];
173 /* error_log('User connected');
175 && error_log('Email: ' . $this->authDetails['email']);
176 error_log('pubid: ' . $this->request['pubid']);
177 error_log('ident: ' . $this->request['ident']); */
178 return new \Zend\View\Model\JsonModel(array('ApeReg' => 'Success'));
182 * Mobile device disconnected from push server.
183 * @return \Zend\View\Model\JsonModel
185 public function deregisterDeviceAction()
187 $this->initPost(true, 'ident');
189 if ($this->authenticated)
191 \Utility\Registry::setAuthParam('pubid', null);
192 $em = \Utility\Registry::getEntityManager();
193 $session = $em->getRepository('\User\Entity\Session')
194 ->findOneBy(array('authToken' => $this->request['ident']));
195 if (!is_null($session))
197 $session->pubId = null;
201 /* error_log('User disconnected');
202 error_log('pubid: ' . $this->request['pubid']);
203 error_log('ident: ' . $this->request['ident']); */
204 return new \Zend\View\Model\JsonModel(array('ApeDereg' => 'Success'));
208 * Broadcast a dataset change
209 * @return \Zend\View\Model\JsonModel
211 public function notifyDeviceAction()
213 $this->initJson(false);
215 $ds = isset($this->request['ds'])
216 ? $this->request['ds']
218 $pubid = isset($this->request['pubid'])
219 ? $this->request['pubid']
221 //$response = \Utility\Comms\Ape::broadcast('synchv1', array('dataSet' => $ds), 'data', $pubid);
222 return new \Zend\View\Model\JsonModel(array('Response' => $response));
226 * Log debug data to db.
227 * @return \Zend\View\Model\JsonModel
229 public function logDebugAction()
231 $this->initPost(false);
232 $em = \Utility\Registry::getEntityManager();
233 $debugLog = new \Utility\Entity\DebugLog();
234 $debugLog->userId = $this->reqParam('userId', null);
235 $debugLog->callName = $this->reqParam('callName', null);
236 $debugLog->params = serialize($this->reqParam('params', array()));
237 $debugLog->errorString = $this->reqParam('errorString', null);
238 $em->persist($debugLog);
240 return new \Zend\View\Model\JsonModel(array(
242 'Task' => 'LogDebug',
243 'Status' => 'Success',
252 * @return \Zend\View\Model\JsonModel
254 public function loginAction()
256 $this->initPost(false);
258 $input = new \Workspace\Utility\ServiceInput('ParamSet', array(
260 'email' => $this->request['email'],
261 'pin' => $this->request['pin']
264 $serviceInput = new \Workspace\Utility\ServiceInput('ServiceInput', array(
265 'data' => $input->pack()
267 $profileService = $this->serviceLocator->get('User.Service.Profile');
268 $response = $profileService->deviceLogin($serviceInput->pack());
269 if (isset($response['Data']['authToken']))
271 $em = \Utility\Registry::getEntityManager();
272 $session = new \User\Entity\Session();
273 $session->profile = $em->getReference('\User\Entity\Profile', $response['Data']['id']);
274 $session->authToken = $response['Data']['authToken'];
275 $em->persist($session);
278 return new \Zend\View\Model\JsonModel(array(
279 'Meta' => array_merge(array('Task' => 'Login'), $response['Meta']),
280 'Data' => $response['Data']
285 * Device user pin reset.
286 * @return \Zend\View\Model\JsonModel
288 public function resetPinAction()
290 $this->initPost(false);
292 $input = new \Workspace\Utility\ServiceInput('ParamSet', array(
294 'email' => isset($this->request['email'])
295 ? $this->request['email']
297 'mobile' => isset($this->request['mobile'])
298 ? $this->request['mobile']
302 $serviceInput = new \Workspace\Utility\ServiceInput('ServiceInput', array(
303 'data' => $input->pack()
305 $profileService = $this->serviceLocator->get('User.Service.Profile');
306 $response = $profileService->deviceResetPin($serviceInput->pack());
307 return new \Zend\View\Model\JsonModel(array(
308 'Meta' => array_merge(array('Task' => 'ResetPin'), $response['Meta']),
309 'Data' => $response['Data']
314 * Claim a job item from queue.
315 * @return \Zend\View\Model\JsonModel
317 public function claimJobAction()
319 if (!$this->initPost())
321 return new \Zend\View\Model\JsonModel(array(
323 'Task' => 'ClaimJob',
324 'Status' => 'Exception',
325 'StatusReason' => 'Invalid session requested.',
326 'DatasetName' => null
332 if (!isset($this->request['datasetName'])
333 || !isset($this->request['id'])
334 || 0 >= $this->request['id'])
336 return new \Zend\View\Model\JsonModel(array(
338 'Task' => 'ClaimJob',
340 'StatusReason' => 'Api call requires valid `datasetName` and `id` parameters.',
341 'DatasetName' => null
346 $ds = $this->request['datasetName'];
347 $id = $this->request['id'];
352 $entityName = '\Valuation\Entity\Valuation';
353 $service = new \Valuation\Service\Valuation();
354 $service->setWorkflow(new \Valuation\Workflow());
357 $em = \Utility\Registry::getEntityManager();
358 $record = $em->getRepository($entityName)
360 if (is_null($record) || 1 != $record->queueStatus)
362 if (!$record->claimQueueItem($em))
364 return new \Zend\View\Model\JsonModel(array(
366 'Task' => 'ClaimJob',
368 'StatusReason' => 'Job not available.',
371 'Data' => array('id' => $record->id)
376 return new \Zend\View\Model\JsonModel(array(
378 'Task' => 'ClaimJob',
379 'Status' => 'Success',
380 'StatusReason' => '',
383 'Data' => $record->toArray(array('stock'), array(), 2)
387 $record->claimQueueItem($em);
388 return new \Zend\View\Model\JsonModel(array(
390 'Task' => 'ClaimJob',
391 'Status' => 'Success',
392 'StatusReason' => '',
395 'Data' => $record->toArray(array('stock'), array(), 2)
400 * Return a claimed job item from queue.
401 * @return \Zend\View\Model\JsonModel
403 public function unclaimJobAction()
405 if (!$this->initPost())
407 return new \Zend\View\Model\JsonModel(array(
409 'Task' => 'UnclaimJob',
410 'Status' => 'Exception',
411 'StatusReason' => 'Invalid session requested.',
412 'DatasetName' => null
418 if (!isset($this->request['datasetName'])
419 || !isset($this->request['id'])
420 || 0 >= $this->request['id'])
422 return new \Zend\View\Model\JsonModel(array(
424 'Task' => 'ClaimJob',
426 'StatusReason' => 'Api call requires valid `datasetName` and `id` parameters.',
427 'DatasetName' => null
432 $ds = $this->request['datasetName'];
433 $id = $this->request['id'];
438 $entityName = '\Valuation\Entity\Valuation';
439 $service = new \Valuation\Service\Valuation();
440 $service->setWorkflow(new \Valuation\Workflow());
443 $em = \Utility\Registry::getEntityManager();
444 $record = $em->getRepository($entityName)
446 if (is_null($record) || 2 != $record->queueStatus)
448 return new \Zend\View\Model\JsonModel(array(
450 'Task' => 'UnclaimJob',
452 'StatusReason' => 'Job not claimed.',
455 'Data' => $record->toArray()
460 $record->unclaimQueueItem($em);
461 return new \Zend\View\Model\JsonModel(array(
463 'Task' => 'UnclaimJob',
464 'Status' => 'Success',
465 'StatusReason' => '',
468 'Data' => $record->toArray(array(), array(), false, 2)
471 catch (\Exception $e)
473 return new \Zend\View\Model\JsonModel(array(
475 'Task' => 'UnclaimJob',
477 'StatusReason' => 'Job owned by different user.',
480 'Data' => $record->toArray()
486 * Synchronize critical valuation info.
487 * @return \Zend\View\Model\JsonModel
489 public function synchPhotoAction()
491 if (!$this->initPost())
493 return new \Zend\View\Model\JsonModel(array(
495 'Task' => 'SynchPhoto',
496 'Status' => 'Exception',
497 'StatusReason' => 'Invalid session requested.',
498 'DatasetName' => null
504 $this->em = \Utility\Registry::getEntityManager();
505 $params = json_decode($this->request['params'], true);
506 $params = $params[0];
507 $uvi = $params['uvi'];
508 $type = $params['type'];
509 $params['photo'] = base64_decode($params['photo']);
510 $this->em = \Utility\Registry::getEntityManager();
512 ->getRepository('\Stock\Entity\Stock')
513 ->findOneBy(array('uvi' => $uvi));
516 #-> Write image to file.
517 $filePath = \Utility\Registry::getConfigParam('ImagePath');
518 $thumbPath = \Utility\Registry::getConfigParam('ThumbnailPath');
519 file_put_contents($filePath . $type . $uvi . '.jpg', $params['photo']);
520 $this->resizeImage($params['photo'], 'image/jpeg', $thumbPath . $type . $uvi . '.jpg');
522 #-> Create image entry.
523 $image = new \Utility\Entity\Image();
524 $image->filename = $type . $uvi . '.jpg';
525 $image->mimeType = 'image/jpeg';
526 $this->em->persist($image);
529 #-> Update stock entry.
533 $stock->mainImage = $image;
536 $stock->frontImage = $image;
539 $stock->rightImage = $image;
542 $stock->leftImage = $image;
545 $stock->backImage = $image;
548 $stock->engineImage = $image;
551 $stock->interiorImage = $image;
554 $stock->natisImage = $image;
558 return new \Zend\View\Model\JsonModel(array(
560 'Task' => 'SynchPhoto',
561 'Status' => 'Success',
562 'StatusReason' => 'Synchronized.'
564 'Data' => array(array('uvi' => $uvi, 'type' => $type))
569 return new \Zend\View\Model\JsonModel(array(
571 'Task' => 'SynchPhoto',
573 'StatusReason' => 'Valuation with UVI ' . $uvi . ' not found.'
580 private function resizeImage($imgString, $mimeType, $destination)
595 case 'image/x-windows-bmp':
601 /* $tmpFile = \Utility\Registry::getConfigParam('ImagePath')
602 . mt_rand(10000000, 99999999) . $fileExt; */
603 $tmpFile = $destination;
604 $bytesWritten = file_put_contents($tmpFile, $imgString);
605 list($img_width, $img_height) = getimagesize($tmpFile);
607 if (!$img_width || !$img_height)
611 $src_img = imagecreatefromstring($imgString);
618 file_put_contents($tmpFile, $imgString);
621 $new_width = $img_width * $scale;
622 $new_height = $img_height * $scale;
623 $new_img = @imagecreatetruecolor($new_width, $new_height);
628 $write_image = 'imagejpeg';
632 @imagecolortransparent($new_img, @imagecolorallocate($new_img, 0, 0, 0));
633 $write_image = 'imagegif';
634 $image_quality = null;
637 @imagecolortransparent($new_img, @imagecolorallocate($new_img, 0, 0, 0));
638 @imagealphablending($new_img, false);
639 @imagesavealpha($new_img, true);
640 $write_image = 'imagepng';
644 case 'image/x-windows-bmp':
645 $write_image = 'imagebmp';
646 $image_quality = null;
651 $success = @imagecopyresampled(
662 $write_image($new_img, $tmpFile, $image_quality);
663 @imagedestroy($src_img);
664 @imagedestroy($new_img);
667 @imagedestroy($src_img);
668 @imagedestroy($new_img);
673 * Synchronize multiple valuations.
674 * @return \Zend\View\Model\JsonModel
676 public function synchValuationsAction()
678 if (!$this->initPost())
680 return new \Zend\View\Model\JsonModel(array(
682 'Task' => 'SynchValuations',
683 'Status' => 'Exception',
684 'StatusReason' => 'Invalid session requested.',
685 'DatasetName' => null
691 $this->em = \Utility\Registry::getEntityManager();
692 $input = json_decode($this->request['params'], true);
693 $responses = array();
694 foreach ($input as $paramSet)
696 $response = $this->synchValuation($paramSet);
697 $responses[] = 'Success' == $response['Meta']['Status']
699 : array('uvi' => null);
701 return new \Zend\View\Model\JsonModel(array(
703 'Task' => 'SynchValuations',
704 'Status' => 'Success',
712 * Synchronize critical valuation info.
713 * @return \Zend\View\Model\JsonModel
715 public function synchValuationInfoAction()
717 if (!$this->initPost())
719 return new \Zend\View\Model\JsonModel(array(
721 'Task' => 'SynchValuationInfo',
722 'Status' => 'Exception',
723 'StatusReason' => 'Invalid session requested.',
724 'DatasetName' => null
730 $this->em = \Utility\Registry::getEntityManager();
731 $data = json_decode($this->request['params'], true);
732 $response = $this->synchValuation($data);
733 //$response['Data'] = array($response['Data']);
734 return new \Zend\View\Model\JsonModel(
740 * Synchronize critical valuation info.
741 * @return \Zend\View\Model\JsonModel
743 private function synchValuation($params)
745 $this->request['params'] = $params;
746 $this->request['params']['vehicle_accessories'] = is_array($this->request['params']['vehicle_accessories'])
747 ? $this->request['params']['vehicle_accessories']
748 : json_decode($this->request['params']['vehicle_accessories'], true);
749 $this->request['params']['vehicle_damages'] = is_array($this->request['params']['vehicle_damages'])
750 ? $this->request['params']['vehicle_damages']
751 : json_decode($this->request['params']['vehicle_damages'], true);
752 $this->request['params']['vehicle_accessories'] = isset($this->request['params']['vehicle_accessories']['values'])
753 ? $this->request['params']['vehicle_accessories']['values']
754 : $this->request['params']['vehicle_accessories'];
755 $this->request['params']['vehicle_damages'] = isset($this->request['params']['vehicle_damages']['values'])
756 ? $this->request['params']['vehicle_damages']['values']
757 : $this->request['params']['vehicle_damages'];
759 if (is_null($this->em))
761 $this->em = \Utility\Registry::getEntityManager();
763 $valuationId = $this->reqNestedParam('params', 'server_id', false);
764 $uvi = $this->reqNestedParam('params', 'valuation_id', false);
765 $tt = $this->reqNestedParamRef('params', 'vehicle_type', '\Stock\Entity\Type', false);
766 if (!$valuationId && !$uvi && !$tt)
770 'Task' => 'SynchValuation',
771 'Status' => 'Exception',
772 'StatusReason' => 'Insufficient data provided.'
774 'Data' => array('uvi' => $uvi)
778 $pgOverrideDoNotSend = false;
781 $valuation = $this->em
782 ->getRepository('\Valuation\Entity\Valuation')
783 ->find($valuationId);
784 if (is_null($valuation))
786 $valuation = new \Valuation\Entity\Valuation();
787 $stock = new \Stock\Entity\Stock();
788 $valuation->stock = $stock;
793 $stock = $valuation->stock;
794 if ('Price Guide' == $valuation->jobState || 'Price Guide' == $stock->jobState)
796 $pgOverrideDoNotSend = true;
803 ->getRepository('\Stock\Entity\Stock')
804 ->findOneBy(array('uvi' => $uvi));
807 if (!is_null($stock->valuation))
809 $valuation = $this->em
810 ->getRepository('\Valuation\Entity\Valuation')
811 ->find($stock->valuation->id);
812 if ('Price Guide' == $valuation->jobState || 'Price Guide' == $stock->jobState)
814 $pgOverrideDoNotSend = true;
819 $valuation = new \Valuation\Entity\Valuation();
820 $stock = new \Stock\Entity\Stock();
821 $valuation->stock = $stock;
827 $valuation = new \Valuation\Entity\Valuation();
828 $stock = new \Stock\Entity\Stock();
829 $valuation->stock = $stock;
834 $iterator = $stock->damages->getIterator();
835 foreach ($iterator as $dmg)
837 $this->em->remove($dmg);
839 $iterator = $stock->accessories->getIterator();
840 foreach ($iterator as $acc)
842 $this->em->remove($acc);
847 $accessories = array();
848 foreach ($this->reqNestedParam('params', 'vehicle_accessories', array()) as $accId)
850 $accessories[] = array('id' => $accId);
853 $tradePrice = $this->reqNestedParam('params', 'trade_price', null);
854 $retailPrice = $this->reqNestedParam('params', 'retail_price', null);
855 $listPrice = $this->reqNestedParam('params', 'list_price', null);
858 if (is_null($tradePrice) || 0 == $tradePrice
859 || is_null($retailPrice) || 0 == $retailPrice)
861 $vehicleYear = $this->em->find(
862 '\Stock\Entity\Year',
863 $this->reqNestedParam('params', 'vehicle_year', null));
864 $vehicleType = $this->em->find(
865 '\Stock\Entity\Type',
866 $this->reqNestedParam('params', 'vehicle_type', null));
867 if (is_object($vehicleYear) && is_object($vehicleType))
869 if ($vehicleYear->name != date('Y'))
871 $tu = new \Utility\Comms\TransUnion();
872 $tuRes = $tu->searchByMmCode($vehicleType->mmCode, $vehicleYear->name);
873 \Utility\Debug::errorLog('TY Fetch on Synch', $tuRes);
876 $tradePrice = $tuRes['VehicleDetails'][0]['Value']['TradePrice'];
877 $retailPrice = $tuRes['VehicleDetails'][0]['Value']['RetailPrice'];
883 catch (\Exception $e)
885 \Utility\Debug::errorLog('TY Fetch Error on Synch', $e->getMessage());
888 $keys = $this->reqNestedParam('params', 'vehicle_spare_keys', null);
891 $keys = 'Yes' == $keys
896 'vehicleYear' => $this->reqNestedParamRef('params', 'vehicle_year', '\Stock\Entity\Year', null),
897 'type' => $this->reqNestedParamRef('params', 'vehicle_type', '\Stock\Entity\Type', null),
898 'registrationNumber' => $this->reqNestedParam('params', 'vehicle_reg', null),
899 'fuelType' => $this->reqNestedParamRef('params', 'vehicle_fuel_type', 'Stock\Entity\FuelType', null),
900 'transmissionType' => $this->reqNestedParamRef('params', 'vehicle_transmission_type', 'Stock\Entity\TransmissionType', null),
902 'km' => $this->reqNestedParam('params', 'vehicle_mileage', null),
903 'tradePrice' => $this->reqNestedParam('params', 'trade_price', null),
904 'retailPrice' => $this->reqNestedParam('params', 'retail_price', null),
905 'listPrice' => $this->reqNestedParam('params', 'list_price', null),
906 'condition' => $this->reqNestedParamRef('params', 'vehicle_condition', 'Stock\Entity\Condition', null),
907 'exteriorColour' => $this->reqNestedParamRef('params', 'vehicle_exterior_colour', 'Stock\Entity\ExteriorColour', null),
908 'interiorColour' => $this->reqNestedParamRef('params', 'vehicle_interior_colour', 'Stock\Entity\InteriorColour', null),
909 'upholstery' => $this->reqNestedParamRef('params', 'vehicle_upholstery', 'Stock\Entity\Upholstery', null),
910 'vinNumber' => $this->reqNestedParam('params', 'vehicle_vin', null),
911 'engineNumber' => $this->reqNestedParam('params', 'vehicle_engine_number', null),
912 'previousRepairsNoted' => $this->reqNestedParam('params', 'vehicle_prev_repairs', null),
913 'previousRepairsNotes' => $this->reqNestedParam('params', 'vehicle_prev_repairs_comments', null),
914 'accessories' => $accessories,
915 'accessoryNotes' => $this->reqNestedParam('params', 'vehicle_accessories_comments', null),
916 'damages' => $this->reqNestedParam('params', 'vehicle_damages', null),
917 'damageNotes' => $this->reqNestedParam('params', 'vehicle_damages_comments', null),
918 'spareKeys' => $keys,
919 'papers' => $this->reqNestedParamRef('params', 'vehicle_papers', 'Stock\Entity\Paper', null),
920 'fullServiceHistory' => $this->reqNestedParamRef('params', 'vehicle_fsh', 'Stock\Entity\FullServiceHistory', null),
921 'fshNotes' => $this->reqNestedParam('params', 'vehicle_fsh_notes', null),
923 $valuationData = array(
924 'firstName' => $this->reqNestedParam('params', 'customer_name', null),
925 'familyName' => $this->reqNestedParam('params', 'customer_surname', null),
926 'mobile' => $this->reqNestedParam('params', 'customer_mobile_number', null),
927 'department' => $this->reqNestedParam('params', 'customer_department', null),
928 'idNumber' => $this->reqNestedParam('params', 'customer_id_number', null),
929 'email' => $this->reqNestedParam('params', 'customer_email', null)
931 $emailValidator = new \Zend\Validator\EmailAddress();
932 if (!$emailValidator->isValid($valuationData['email']))
934 $valuationData['email'] = null;
938 $wValuation = $this->serviceLocator->get('Valuation');
939 $valuation->fromArray($valuationData);
940 $stock->fromArray($stockData);
942 $stock->jobState = 'Valuation';
945 $this->em->persist($stock);
946 $this->em->persist($valuation);
948 $this->em->flush($stock);
949 $this->em->flush($valuation);
952 $stock->valuation = $valuation;
953 $stock->postInsert();
954 $valuation->postInsert();
955 $this->em->flush($stock);
957 $oValuation = new \Valuation\Service\Valuation();
958 $oValuation->setWorkflow($wValuation);
959 $wValuation->loadJob($valuation->id);
960 if (!$pgOverrideDoNotSend)
962 $wValuation->changeState('This.PendingValuation');
964 if (!$pgOverrideDoNotSend && $this->reqNestedParam('params', 'send_to_priceguide', false))
966 $authData = \Utility\Registry::getAuthData();
967 $clubs = $this->em->getRepository('\PriceGuide\Entity\Club')
969 'company' => $this->em->getReference('\Company\Entity\Company', $authData['company']['id']),
970 'useAsDefault' => true
975 foreach ($clubs as $club)
977 $sendTo[] = array('id' => $club->id);
979 $input = new \Workspace\Utility\ServiceInput('ParamSet', array(
980 'id' => $valuation->id,
984 'Valuation' => array(
985 'firstName' => $valuationData['firstName'],
986 'familyName' => $valuationData['familyName'],
987 'mobile' => $valuationData['mobile']
990 'vehicleYear' => $stockData['vehicleYear']->id,
991 'type' => $stockData['type']->id,
992 'registrationNumber' => $stockData['registrationNumber'],
993 'fuelType' => $stockData['fuelType']->id,
994 'transmissionType' => $stockData['transmissionType']->id
996 $serviceInput = new \Workspace\Utility\ServiceInput('ServiceInput', array(
997 'data' => $input->pack()
999 $contract = $serviceInput->pack();
1000 $result = $wValuation->executeRoute('Valuation.SendToPriceGuide', $valuation->id, $serviceInput->pack());
1004 catch (\Exception $e)
1006 \Utility\Debug::errorLog('SynchValuationInfo Exception', "$e");
1009 'Task' => 'SynchValuationInfo',
1010 'Status' => 'Exception',
1011 'StatusReason' => 'Server code exception occurred. Could not synchronize data.'
1013 'Data' => array('uvi' => $uvi)
1016 unset($this->request['params']);
1017 if (!$valuation->id)
1021 'Task' => 'SynchValuationInfo',
1022 'Status' => 'Error',
1023 'StatusReason' => 'Could not save entry to database.'
1025 'Data' => array('uvi' => $uvi)
1032 'Task' => 'SynchValuationInfo',
1033 'Status' => 'Success',
1034 'StatusReason' => 'Synchronized.'
1036 'Data' => array('uvi' => $uvi)
1042 * Retrieve a dataset.
1043 * @return \Zend\View\Model\JsonModel
1045 public function getDatasetAction()
1047 if (!$this->initPost())
1049 return new \Zend\View\Model\JsonModel(array(
1051 'Task' => 'GetDataset',
1052 'Status' => 'Exception',
1053 'StatusReason' => 'Invalid session requested.',
1054 'DatasetName' => null
1060 if (!isset($this->request['datasetName']))
1062 return new \Zend\View\Model\JsonModel(array(
1064 'Task' => 'GetDataset',
1066 'StatusReason' => 'Api call requires valid `datasetName` parameter.',
1067 'DatasetName' => null
1072 $ds = $this->request['datasetName'];
1077 case 'countries': $entityName = '\Location\Entity\Country'; break;
1078 case 'regions': $entityName = '\Location\Entity\Region'; break;
1079 case 'towns': $entityName = '\Location\Entity\Town'; break;
1081 case 'valuations': $entityName = '\Valuation\Entity\Valuation'; break;
1082 case 'accessories': $entityName = '\Stock\Entity\Accessory'; break;
1083 case 'damages': $entityName = '\Stock\Entity\Damage'; break;
1084 case 'upholstery': $entityName = '\Stock\Entity\Upholstery'; break;
1085 case 'condition': $entityName = '\Stock\Entity\Condition'; break;
1086 case 'exteriorColours': $entityName = '\Stock\Entity\ExteriorColour'; break;
1087 case 'interiorColours': $entityName = '\Stock\Entity\InteriorColour'; break;
1088 case 'fuelTypes': $entityName = '\Stock\Entity\FuelType'; break;
1089 case 'fullServiceHistory': $entityName = '\Stock\Entity\FullServiceHistory'; break;
1090 case 'transmissionTypes': $entityName = '\Stock\Entity\TransmissionType'; break;
1091 case 'natis': $entityName = '\Stock\Entity\Natis'; break;
1092 case 'papers': $entityName = '\Stock\Entity\Paper'; break;
1093 case 'years': $entityName = '\Stock\Entity\Year'; $reverse = true; break;
1094 case 'categories': $entityName = '\Stock\Entity\Category'; break;
1095 case 'makes': $entityName = '\Stock\Entity\Make'; break;
1096 case 'models': $entityName = '\Stock\Entity\Model'; break;
1097 case 'types': $entityName = '\Stock\Entity\Type'; break;
1099 return new \Zend\View\Model\JsonModel(array(
1101 'Task' => 'GetDataset',
1103 'StatusReason' => 'Unknown dataset requested.',
1104 'DatasetName' => $ds
1110 $em = $this->getServiceLocator()->get('doctrine.entitymanager.orm_default');
1111 if ('Build' == $entityName::PULL_SYNCH_STRATEGY || 'years' == $ds || 'accessories' == $ds)
1113 $filter = ' WHERE 1 = 1 ';
1114 $filter .= defined($entityName . '::JOB_QUEUE')
1115 ? ' AND a.queueStatus = 1 '
1117 $filter .= $entityName::ARCHIVE
1118 ? ' AND a.archived = 0 '
1120 if (method_exists($entityName, 'getSynchQuery'))
1122 $query = $em->createQuery(
1123 $entityName::getSynchQuery()
1128 $query = $em->createQuery(
1129 "SELECT a FROM $entityName a $filter ORDER BY a.id ASC"
1132 $data = $query->getResult();
1133 if (defined($entityName . '::JOB_QUEUE'))
1135 foreach ($data as $rowId => $record)
1137 $data[$rowId] = $record->toQueueArray();
1142 foreach ($data as $rowId => $record)
1144 $data[$rowId] = $record->toSynchArray();
1149 $data = array_reverse($data);
1156 $version = isset($this->request['version'])
1157 ? (int) $this->request['version']
1160 $filter .= defined($entityName . '::JOB_QUEUE')
1161 ? ' AND a.queueStatus = 1'
1163 $filter .= $entityName::ARCHIVE
1164 ? ' AND a.archived = 0'
1166 if (method_exists($entityName, 'getSynchFilter'))
1168 $synchMod = $entityName::getSynchFilter();
1179 $query = "SELECT [SELECTION] "
1180 . "FROM $entityName a "
1182 . "WHERE a.archived = :archived"
1183 . " $filter " . $synchMod['Filter']
1184 . " AND a.createVersion = :version"
1185 . " ORDER BY a.id ASC";
1187 'archived' => false,
1188 'version' => $version
1190 $data['Create'] = $em->createQuery(
1191 str_replace('[SELECTION]', 'a', $query)
1193 ->setParameters($params)
1196 #-> Records to update.
1197 $query = "SELECT [SELECTION] "
1198 . "FROM $entityName a "
1200 . "WHERE a.archived = :archived"
1201 . " $filter " . $synchMod['Filter']
1202 . " AND a.createVersion != :version"
1203 . " AND a.updateVersion = :version"
1204 . " ORDER BY a.id ASC";
1206 'archived' => false,
1207 'version' => $version
1209 $data['Update'] = $em->createQuery(
1210 str_replace('[SELECTION]', 'a', $query)
1212 ->setParameters($params)
1214 $data['Delete'] = array();
1218 if (defined($entityName . '::JOB_QUEUE'))
1220 foreach ($data as $type => $dataset)
1222 foreach ($dataset as $rowId => $record)
1224 $data[$type][$rowId] = $record->toQueueArray();
1230 foreach ($data as $type => $dataset)
1232 foreach ($dataset as $rowId => $record)
1234 $data[$type][$rowId] = $record->toSynchArray();
1240 return new \Zend\View\Model\JsonModel(array(
1242 'Task' => 'GetDataset',
1243 'Status' => 'Success',
1244 'StatusReason' => '',
1245 'DatasetName' => $ds,
1246 'Strategy' => $entityName::PULL_SYNCH_STRATEGY,
1250 'EndTime' => date('Y-m-d H:i:s')
1258 * Retrieve a dataset.
1259 * @return \Zend\View\Model\JsonModel
1261 public function getVersionedDatasetAction()
1263 if (!$this->initPost())
1265 return new \Zend\View\Model\JsonModel(array(
1267 'Task' => 'GetDataset',
1268 'Status' => 'Exception',
1269 'StatusReason' => 'Invalid session requested.',
1270 'DatasetName' => null
1276 if (!isset($this->request['datasetName']))
1278 return new \Zend\View\Model\JsonModel(array(
1280 'Task' => 'GetDataset',
1282 'StatusReason' => 'Api call requires valid `datasetName` parameter.',
1283 'DatasetName' => null
1288 $ds = $this->request['datasetName'];
1292 case 'countries': $entityName = '\Location\Entity\Country'; break;
1293 case 'regions': $entityName = '\Location\Entity\Region'; break;
1294 case 'towns': $entityName = '\Location\Entity\Town'; break;
1296 case 'valuations': $entityName = '\Valuation\Entity\Valuation'; break;
1297 case 'accessories': $entityName = '\Stock\Entity\Accessory'; break;
1298 case 'damages': $entityName = '\Stock\Entity\Damage'; break;
1299 case 'upholstery': $entityName = '\Stock\Entity\Upholstery'; break;
1300 case 'condition': $entityName = '\Stock\Entity\Condition'; break;
1301 case 'exteriorColours': $entityName = '\Stock\Entity\ExteriorColour'; break;
1302 case 'interiorColours': $entityName = '\Stock\Entity\InteriorColour'; break;
1303 case 'fuelTypes': $entityName = '\Stock\Entity\FuelType'; break;
1304 case 'fullServiceHistory': $entityName = '\Stock\Entity\FullServiceHistory'; break;
1305 case 'transmissionTypes': $entityName = '\Stock\Entity\TransmissionType'; break;
1306 case 'natis': $entityName = '\Stock\Entity\Natis'; break;
1307 case 'papers': $entityName = '\Stock\Entity\Paper'; break;
1308 case 'years': $entityName = '\Stock\Entity\Year'; break;
1309 case 'categories': $entityName = '\Stock\Entity\Category'; break;
1310 case 'makes': $entityName = '\Stock\Entity\Make'; break;
1311 case 'models': $entityName = '\Stock\Entity\Model'; break;
1312 case 'types': $entityName = '\Stock\Entity\Type'; break;
1314 return new \Zend\View\Model\JsonModel(array(
1316 'Task' => 'GetDataset',
1318 'StatusReason' => 'Unknown dataset requested.',
1319 'DatasetName' => $ds
1325 $em = $this->getServiceLocator()->get('doctrine.entitymanager.orm_default');
1326 if ('Build' == $entityName::PULL_SYNCH_STRATEGY)
1332 $timestamp = time(); */
1333 $filter = ' WHERE 1 = 1 ';
1334 $filter .= defined($entityName . '::JOB_QUEUE')
1335 ? ' AND a.queueStatus = 1 '
1337 $filter .= $entityName::ARCHIVE
1338 ? ' AND a.archived = 0 '
1340 if (method_exists($entityName, 'getSynchQuery'))
1342 $query = $em->createQuery(
1343 $entityName::getSynchQuery()
1348 $query = $em->createQuery(
1349 "SELECT a FROM $entityName a $filter ORDER BY a.id ASC"
1353 $data = $query->getResult();
1354 if (defined($entityName . '::JOB_QUEUE'))
1356 foreach ($data as $rowId => $record)
1358 $data[$rowId] = $record->toQueueArray();
1363 foreach ($data as $rowId => $record)
1365 $data[$rowId] = $record->toSynchArray();
1372 /* $page = isset($this->request['page'])
1373 ? (int) $this->request['page']
1375 $timeStart = isset($this->request['timeStart'])
1376 ? (int) $this->request['timeStart']
1378 $timeEnd = isset($this->request['timeEnd'])
1379 && 0 != $this->request['timeEnd']
1380 ? (int) $this->request['timeEnd']
1383 $version = isset($this->request['version'])
1384 ? (int) $this->request['version']
1388 $filter .= defined($entityName . '::JOB_QUEUE')
1389 ? ' AND a.queueStatus = 1'
1391 $filter .= $entityName::ARCHIVE
1392 ? ' AND a.archived = 0'
1394 if (method_exists($entityName, 'getSynchFilter'))
1396 $synchMod = $entityName::getSynchFilter();
1405 //$dateTimeFormat = \Utility\Definitions\Locale::getDateTimeFormat();
1409 $query = "SELECT [SELECTION] "
1410 . "FROM $entityName a "
1412 . "WHERE a.archived = :archived"
1413 . " $filter " . $synchMod['Filter']
1414 . " AND a.createVersion = :version"
1415 . " ORDER BY a.id ASC";
1417 'archived' => false,
1418 'version' => $version
1419 /* 'timeStart' => date($dateTimeFormat, $timeStart),
1420 'timeEnd' => date($dateTimeFormat, $timeEnd) */
1422 /* $numRecsRes = $em->createQuery(
1423 str_replace('[SELECTION]', 'COUNT(a.id) AS total', $query)
1425 ->setParameters($params)
1426 ->getSingleResult();
1427 $numRecs = ($numRecsRes['total'] > $numRecs)
1428 ? $numRecsRes['total']
1430 $data['Create'] = $em->createQuery(
1431 str_replace('[SELECTION]', 'a', $query)
1433 ->setParameters($params)
1435 /* ->setFirstResult(($page -1) * $recs)
1436 ->setMaxResults($recs) */
1438 #-> Records to update.
1439 $query = "SELECT [SELECTION] "
1440 . "FROM $entityName a "
1442 . "WHERE a.archived = :archived"
1443 . " $filter " . $synchMod['Filter']
1444 . " AND a.createVersion != :version"
1445 . " AND a.updateVersion = :version"
1446 . " ORDER BY a.id ASC";
1448 'archived' => false,
1449 'version' => $version
1450 /* 'timeStart' => date($dateTimeFormat, $timeStart),
1451 'timeEnd' => date($dateTimeFormat, $timeEnd) */
1453 /* $numRecsRes = $em->createQuery(
1454 str_replace('[SELECTION]', 'COUNT(a.id) AS total', $query)
1456 ->setParameters($params)
1457 ->getSingleResult();
1458 $numRecs = ($numRecsRes['total'] > $numRecs)
1459 ? $numRecsRes['total']
1461 $data['Update'] = $em->createQuery(
1462 str_replace('[SELECTION]', 'a', $query)
1464 ->setParameters($params)
1466 /* ->setFirstResult(($page -1) * $recs)
1467 ->setMaxResults($recs) */
1469 #-> Records to remove.
1470 /* $query = "SELECT [SELECTION] "
1471 . "FROM $entityName a "
1473 . "WHERE a.archived = :archived"
1474 . " $filter " . $synchMod['Filter']
1475 . " AND a.created NOT BETWEEN :timeStart AND :timeEnd"
1476 . " AND a.updated BETWEEN :timeStart AND :timeEnd"
1477 . " ORDER BY a.id ASC";
1480 'timeStart' => date($dateTimeFormat, $timeStart),
1481 'timeEnd' => date($dateTimeFormat, $timeEnd)
1483 $numRecsRes = $em->createQuery(
1484 str_replace('[SELECTION]', 'COUNT(a.id) AS total', $query)
1486 ->setParameters($params)
1487 ->getSingleResult();
1488 $numRecs = ($numRecsRes['total'] > $numRecs)
1489 ? $numRecsRes['total']
1491 $data['Delete'] = $em->createQuery(
1492 str_replace('[SELECTION]', 'a', $query)
1494 ->setParameters($params)
1495 ->setFirstResult(($page -1) * $recs)
1496 ->setMaxResults($recs)
1498 $data['Delete'] = array();
1499 if (empty($data['Create'])
1500 && empty($data['Update'])
1501 && empty($data['Delete']))
1508 if (defined($entityName . '::JOB_QUEUE'))
1510 foreach ($data as $type => $dataset)
1512 foreach ($dataset as $rowId => $record)
1514 $data[$type][$rowId] = $record->toQueueArray();
1520 foreach ($data as $type => $dataset)
1522 foreach ($dataset as $rowId => $record)
1524 $data[$type][$rowId] = $record->toSynchArray();
1530 return new \Zend\View\Model\JsonModel(array(
1532 'Task' => 'GetDataset',
1533 'Status' => 'Success',
1534 'StatusReason' => '',
1535 'DatasetName' => $ds,
1536 'Strategy' => $entityName::PULL_SYNCH_STRATEGY,
1537 'Version' => $version
1545 * Retrieve trade and retail from mmCode.
1546 * @return \Zend\View\Model\JsonModel
1548 public function transunionFromMmcodeAction()
1550 if (!$this->initPost())
1552 \Utility\Debug::errorLog('transunionFromMmcodeAction.Error', 'NO AUTH');
1553 return new \Zend\View\Model\JsonModel(array(
1555 'Task' => 'TransunionFromMmcodeAction',
1556 'Status' => 'Exception',
1557 'StatusReason' => 'Invalid session requested.',
1558 'DatasetName' => null
1564 if (!isset($this->request['mmCode']) || !is_numeric($this->request['mmCode'])
1565 || !isset($this->request['vehicleYear']) || !is_numeric($this->request['vehicleYear']))
1567 \Utility\Debug::errorLog('transunionFromMmcodeAction.Error', 'missing mmCode or vehicleYear');
1568 return new \Zend\View\Model\JsonModel(array(
1570 'Task' => 'TransunionFromMmcodeAction',
1572 'StatusReason' => 'Requires `mmCode` and `vehicleYear`. Optionally accepts `mileage` and `condition`.'
1577 $input = new \Workspace\Utility\ServiceInput('ParamSet', array(
1579 'mmCode' => $this->request['mmCode'],
1580 'vehicleYear' => $this->request['vehicleYear'],
1581 'mileage' => isset($this->request['mileage']) && !empty($this->request['mileage'])
1582 ? $this->request['mileage']
1584 'condition' => isset($this->request['condition']) && !empty($this->request['condition'])
1585 ? $this->request['condition']
1589 $serviceInput = new \Workspace\Utility\ServiceInput('ServiceInput', array(
1590 'data' => $input->pack()
1592 $stockUtilService = $this->serviceLocator->get('Stock.Service.Utility');
1593 $response = $stockUtilService->deviceTransUnionFromMmCode($serviceInput->pack());
1594 return new \Zend\View\Model\JsonModel(array(
1595 'Meta' => array_merge(array('Task' => 'Login'), $response['Meta']),
1596 'Data' => $response['Data']