2 namespace User\Service;
3 ini_set('memory_limit', '512M');
7 * Authentication functionality.
11 class Profile extends \User\DataBin\Profile
16 * Login functionality for mobile devices.
17 * @param \Workspace\Utility\ServiceInputParams $contract
20 public function deviceLogin(\Workspace\Utility\ServiceInputParams $contract)
22 \Utility\Registry::clearAuthData();
23 $em = \Utility\Registry::getEntityManager();
24 $user = $em->getRepository('\User\Entity\Profile')
25 ->findOneBy(array('email' => $contract->data->Login['email']));
28 || !$user->passwordValid($contract->data->Login['pin']))
30 return $contract->deviceError('Authentication Failure.', 'Could not authenticate user.');
32 $authData = $user->toArray(array('company', 'permissions'));
33 if ($authData['company']['jobState'] != 'Active')
35 return $contract->deviceError('Authentication Failure.', 'Dealership suspended, no authentication allowed.');
37 if ($authData['jobState'] != 'Active')
39 return $contract->deviceError('Authentication Failure.', 'User account suspended, no authentication allowed.');
41 $user->lastLogin = new \DateTime("now");
42 $user->ipAddress = $_SERVER['REMOTE_ADDR'];
43 $log = new \User\Entity\AuthenticationLog();
44 $log->profile = $user;
45 $log->ipAddress = $_SERVER['REMOTE_ADDR'];
48 \Utility\Registry::setAuthData($authData);
49 return $contract->deviceSuccess('Authenticated.', \Utility\Registry::getAuthData());
53 * Pin reset functionality for mobile devices.
54 * @param \Workspace\Utility\ServiceInputParams $contract
57 public function deviceResetPin(\Workspace\Utility\ServiceInputParams $contract)
59 \Utility\Registry::clearAuthData();
60 $em = \Utility\Registry::getEntityManager();
61 $user = isset($contract->data->Login['email']) && !empty($contract->data->Login['email'])
62 ? $em->getRepository('\User\Entity\Profile')
63 ->findOneBy(array('email' => $contract->data->Login['email']))
64 : $em->getRepository('\User\Entity\Profile')
65 ->findOneBy(array('mobile' => $contract->data->Login['mobile']));
69 return $contract->deviceError('Reset Pin Failure.', 'Could not locate user.');
72 $pin = mt_rand(1000, 9999);
73 $user->password = $pin;
75 \Utility\Debug::errorLog('PinReset: ' . $user->email, $pin);
77 // Send notifications.
78 $this->sendPinResetNotification(null, $user, $pin);
80 return $contract->deviceSuccess('Pin Reset.', array());
84 * Contract to reset users pin.
85 * @param object|null $jobRecord
87 * @return \Workspace\Contract\UseOnce
89 public function contractForgotPassword($jobRecord, array $input = array())
91 $options = new \Workspace\UseCase\Options();
92 $requirement = new \Workspace\UseCase\Requirement();
93 $requirement->addOptionalInput(array(
95 'email' => 'String250',
96 'mobile' => 'String20'
99 return new \Workspace\Contract\UseOnce($options, $requirement);
103 * Reset pin for user.
104 * @param object|null $jobRecord
105 * @param \Workspace\Utility\ServiceInputParams $contract
108 public function executeForgotPassword($jobRecord, \Workspace\Utility\ServiceInputParams $contract)
110 \Utility\Registry::clearAuthData();
111 $em = \Utility\Registry::getEntityManager();
113 isset($contract->data->Reset['email'])
114 && !empty($contract->data->Reset['email'])
115 && $searchBy['email'] = $contract->data->Reset['email'];
116 isset($contract->data->Reset['mobile'])
117 && !empty($contract->data->Reset['mobile'])
118 && $searchBy['mobile'] = $contract->data->Reset['mobile'];
119 $user = $em->getRepository('\User\Entity\Profile')
120 ->findOneBy($searchBy);
124 return $contract->error('Reset Failure.', 'Could not reset pin.');
128 $pin = mt_rand(1000, 9999);
129 $user->password = $pin;
131 \Utility\Debug::errorLog('PinReset: ' . $user->email, $pin);
133 $this->sendPinResetNotification(null, $user, $pin);
135 return $contract->success('Pin Reset.', array());
139 * Contract to login a user.
140 * @param object|null $jobRecord
141 * @param array $input
142 * @return \Workspace\Contract\UseOnce
144 public function contractLogin($jobRecord, array $input = array())
146 \Utility\Registry::clearAuthData();
147 $options = new \Workspace\UseCase\Options();
148 $requirement = new \Workspace\UseCase\Requirement();
149 $requirement->addRequiredInput(array(
155 return new \Workspace\Contract\UseOnce($options, $requirement);
160 * @param object|null $jobRecord
161 * @param \Workspace\Utility\ServiceInputParams $contract
164 public function executeLogin($jobRecord, \Workspace\Utility\ServiceInputParams $contract)
166 \Utility\Registry::clearAuthData();
167 \Utility\Registry::clearSessionData();
168 $em = \Utility\Registry::getEntityManager();
169 $user = $em->getRepository('\User\Entity\Profile')
170 ->findOneBy(array('email' => $contract->data->Login['email']));
173 || !$user->passwordValid($contract->data->Login['pin']))
175 return $contract->error('Authentication Failure.', 'Could not authenticate user.');
177 $authData = $user->toArray(array(
178 'company', 'tradeCenter', 'group', 'groupDivision', 'permissions',
179 'city', 'region', 'contact', 'manager'
181 $auctionOpenDays = array();
182 if ($authData['company']
183 && isset($authData['company']['group'])
184 && is_array($authData['company']['group'])
185 && !empty($authData['company']['group']))
187 $openDays = $this->em->createQuery(
188 "SELECT openDayGroup, openDay "
189 . "FROM \\Auction\\Entity\\OpenDayGroup openDayGroup "
190 . "JOIN openDayGroup.openDay openDay "
191 . "WHERE IDENTITY(openDayGroup.companyGroup) = :groupId "
192 . "AND openDay.openDate >= :minDate"
194 ->setParameter('groupId', $authData['company']['group']['id'])
195 ->setParameter('minDate', new \DateTime('now'))
197 foreach ($openDays as $openDay)
199 $date = $openDay['openDay']['openDate']->format('Y-m-d');
200 $auctionOpenDays[$date] = $date;
203 $authData['auctionOpenDays'] = $auctionOpenDays;
204 if ($authData['company']['jobState'] != 'Active')
206 return $contract->error('Authentication Failure.', 'Dealership suspended, no authentication allowed.');
208 if ($authData['jobState'] != 'Active')
210 return $contract->error('Authentication Failure.', 'User account suspended, no authentication allowed.');
212 $user->lastLogin = new \DateTime("now");
213 $user->ipAddress = $_SERVER['REMOTE_ADDR'];
214 $log = new \User\Entity\AuthenticationLog();
215 $log->profile = $user;
216 $log->ipAddress = $_SERVER['REMOTE_ADDR'];
219 $authData['config'] = $em
220 ->getRepository('Config\Entity\Config')
223 \Utility\Registry::setAuthData($authData);
224 switch (\Utility\Registry::getUserType())
227 if (!$authData['permissions']['suDivisionFull'])
229 \Utility\Registry::setAuthSudo(
231 $authData['company']['groupDivision']['name'],
232 $authData['company']['groupDivision']['id']
236 case 'Dealer Principle':
239 $authData['servertime'] = time();
240 return $contract->success('Authenticated.', $authData);
243 public function contractLogout($jobRecord, array $input = array())
245 \Utility\Registry::clearAuthData();
246 $options = new \Workspace\UseCase\Options();
247 $requirement = new \Workspace\UseCase\Requirement();
248 $requirement->addRequiredInput(array());
249 return new \Workspace\Contract\UseOnce($options, $requirement);
254 * @param object|null $jobRecord
255 * @param \Workspace\Utility\ServiceInputParams $contract
258 public function executeLogout($jobRecord, \Workspace\Utility\ServiceInputParams $contract)
260 \Utility\Registry::clearAuthData();
261 \Utility\Registry::clearSessionData();
262 return $contract->success('Logged out.', array());
266 * Contract to login a user.
267 * @param object|null $jobRecord
268 * @param array $input
269 * @return \Workspace\Contract\UseOnce
271 public function contractActiveAccount($jobRecord, array $input = array())
273 if (!\Utility\Registry::isAuthenticated())
275 throw new \Exception('Not Authenticated.');
278 $options = new \Workspace\UseCase\Options();
279 $requirement = new \Workspace\UseCase\Requirement();
280 $requirement->addRequiredInput(array());
281 $contract = new \Workspace\Contract\UseOnce($options, $requirement);
282 $authData = \Utility\Registry::getAuthData();
283 if (isset($authData['pin']))
285 unset($authData['pin']);
287 if (isset($authData['password']))
289 unset($authData['password']);
291 if (isset($authData['salt']))
293 unset($authData['salt']);
295 $authData['servertime'] = time();
296 return $contract->setData(
301 public function executeActiveAccount($jobRecord, \Workspace\Utility\ServiceInputParams $contract)
303 return $contract->success('DevNull.', array());
307 * ExecuteAfter: Update.
308 * Send welcome notification with new pin for user just registered/created on system.
310 * @param object|null $jobRecord
311 * @param object|null $record
312 * @param \Workspace\Utility\ServiceInputParams $contract
315 public function updateAuthSession($meta, $jobRecord, $record, \Workspace\Utility\ServiceInputParams $contract)
317 #-> Do we need to update session data?
318 if (\Utility\Registry::getAuthParam('id') == $record->id)
320 $authData = $record->toArray(array(
321 'company', 'group', 'groupDivision', 'permissions',
322 'city', 'region', 'contact', 'manager'
324 \Utility\Registry::setAuthData($authData);
329 * ExecuteAfter: Create.
330 * Send welcome notification with new pin for user just registered/created on system.
332 * @param object|null $jobRecord
333 * @param object|null $record
334 * @param \Workspace\Utility\ServiceInputParams $contract
337 public function sendWelcomeNotification($meta, $jobRecord, $record, \Workspace\Utility\ServiceInputParams $contract)
339 #-> Pin generated by \User\Entity\Profile::fromArray()
340 $pin = \Utility\Registry::checkOnce('NewUser.Pin');
341 $record = !is_null($record)
343 : $jobRecord->toArray();
345 //echo '<pre>' . print_r($record, true) . '</pre>';
347 $authData = \Utility\Registry::getAuthData();
349 //echo '<pre>' . print_r($authData, true) . '</pre>';
352 $fromCompanyId = !is_null($authData) && isset($authData['company']['id']) ? $authData['company']['id'] : null;
353 $fromProfileId = !is_null($authData) && isset($authData['id']) ? $authData['id'] : null;
355 $toCompanyId = isset($record['company']['id']) ? $record['company']['id'] : null;
356 $toProfileId = isset($record['id']) ? $record['id'] : null;
357 $email = isset($record['email']) ? $record['email'] : null;
360 $templateName = 'new-profile-recipient';
363 $params['firstName'] = $record['firstName'];
364 $params['familyName'] = $record['familyName'];
365 $params['email'] = $record['email'];
366 $params['pin'] = $pin;
368 #-> Send welcome notification.
369 $oNotify = new \Utility\Comms\Notification();
370 $oNotify->sendFromTemplate(
371 $fromCompanyId, $fromProfileId,
372 $toCompanyId, $toProfileId,
380 public function sendPinResetNotification($jobRecord, $record, $pin)
382 $record = !is_null($record)
383 ? $record->toArray(array('company'))
384 : $jobRecord->toArray(array('company'));
386 $authData = \Utility\Registry::getAuthData();
388 $fromCompanyId = isset($authData['company']['id']) ? $authData['company']['id'] : null;
389 $fromProfileId = isset($authData['id']) ? $authData['id'] : null;
391 $toCompanyId = isset($record['company']['id']) ? $record['company']['id'] : null;
392 $toProfileId = isset($record['id']) ? $record['id'] : null;
393 $email = isset($record['email']) ? $record['email'] : null;
394 $mobile = isset($record['mobile']) ? $record['mobile'] : null;
396 $templateName = 'forgot-pin';
399 $params['firstName'] = $record['firstName'];
400 $params['familyName'] = $record['familyName'];
401 $params['email'] = $record['email'];
402 $params['pin'] = $pin;
404 #-> Send welcome notification.
405 $oNotify = new \Utility\Comms\Notification();
406 $oNotify->sendFromTemplate(
407 $fromCompanyId, $fromProfileId,
408 $toCompanyId, $toProfileId,
414 \Utility\Debug::errorLog("Profile","send from template");
418 * Contract to set sudo filter.
419 * @param object|null $jobRecord
420 * @param array $input
421 * @return \Workspace\Contract\UseOnce
423 public function contractSetSu($jobRecord, array $input = array())
425 $options = new \Workspace\UseCase\Options();
426 $requirement = new \Workspace\UseCase\Requirement();
427 $requirement->addOptionalInput(array(
429 'Group' => 'Integer',
430 'Division' => 'Integer',
431 'Company' => 'Integer'
434 return new \Workspace\Contract\Recurring($options, $requirement);
439 * @param object|null $jobRecord
440 * @param \Workspace\Utility\ServiceInputParams $contract
443 public function executeSetSu($jobRecord, \Workspace\Utility\ServiceInputParams $contract)
445 if (isset($contract->data->Sudo['Group']))
447 $id = 0 == $contract->data->Sudo['Group']
449 : $contract->data->Sudo['Group'];
453 $item = $this->em->getRepository('\Company\Entity\Group')
460 \Utility\Registry::setAuthSudo('Group', $name, $id);
461 \Utility\Registry::setAuthSudo('Division', '', false);
462 \Utility\Registry::setAuthSudo('Company', '', false);
464 if (isset($contract->data->Sudo['Division']))
466 $id = 0 == $contract->data->Sudo['Division']
468 : $contract->data->Sudo['Division'];
472 $item = $this->em->getRepository('\Company\Entity\GroupDivision')
479 \Utility\Registry::setAuthSudo('Division', $name, $id);
480 \Utility\Registry::setAuthSudo('Company', '', false);
482 if (isset($contract->data->Sudo['Company']))
484 $id = 0 == $contract->data->Sudo['Company']
486 : $contract->data->Sudo['Company'];
490 $item = $this->em->getRepository('\Company\Entity\Company')
497 \Utility\Registry::setAuthSudo('Company', $name, $id);
499 return $contract->success('Filter set.', array());