unioil-mobile-api/app/Http/Controllers/API/UserController.php.save

1463 lines
54 KiB
Plaintext

<?php
namespace App\Http\Controllers\API;
use App\Libraries\CywareLibrary;
use App\Libraries\StratuscastLibrary;
use App\Libraries\M360;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use App\Helpers\HttpStatusCode;
use Validator;
use Carbon\Carbon;
use App\Http\Resources\MobileUserProfileResource;
use App\Contracts\UserResourceInterface;
use App\Contracts\AdminResourceInterface;
use App\Contracts\PasswordLogsResourceInterface;
use App\Contracts\AdminActionLogsInterface;
use App\Contracts\LoyaltyCardResourceInterface;
use App\Contracts\PersonalDetailsResourceInterface;
use App\Contracts\OtpLogResourceInterface;
use App\Contracts\LcardActionLogsInterface;
use App\Contracts\SystemPreferenceResourceInterface;
use App\Contracts\OtpAttemptsResourceInterface;
use App\Contracts\MobileAnalyticsResourceInterface;
use App\Contracts\MpinCodesResourceInterface;
use App\Http\Requests\UserFormValidation;
use App\Http\Requests\LoginMobileNumberFormValidation;
use App\Http\Requests\LoginCardNumberFormValidation;
use App\Http\Requests\LoginBirthdateFormValidation;
use App\Http\Requests\LoginActivateCardFormValidation;
use App\Http\Requests\MpinFormValidation;
use App\Helpers\StringHelper;
use GuzzleHttp\Exception\GuzzleException;
class UserController extends Controller
{
const MODULE = 'LOGIN';
public $user;
protected $format;
protected $module;
protected $model;
protected $admin;
protected $password_logs;
protected $loyalty_card;
protected $personal_details;
protected $otp_logs;
protected $admin_logs;
protected $lcard_logs;
protected $system_preferences;
protected $otp_attempts;
protected $mobile_usage;
public function __construct(UserResourceInterface $user,
HttpStatusCode $httpStatusCode,
AdminResourceInterface $admin,
PasswordLogsResourceInterface $password_logs,
LoyaltyCardResourceInterface $loyalty_card,
PersonalDetailsResourceInterface $personal_details,
OtpLogResourceInterface $otp_logs,
LcardActionLogsInterface $lcard_logs,
AdminActionLogsInterface $admin_logs,
SystemPreferenceResourceInterface $system_preferences,
OtpAttemptsResourceInterface $otp_attempts,
MobileAnalyticsResourceInterface $mobile_usage,
MpinCodesResourceInterface $mpin_codes)
{
$this->user = $user;
$this->format = $httpStatusCode;
$this->module = "User";
$this->model = "User";
$this->admin = $admin;
$this->password_logs = $password_logs;
$this->loyalty_card = $loyalty_card;
$this->personal_details = $personal_details;
$this->otp_logs = $otp_logs;
$this->admin_logs = $admin_logs;
$this->lcard_logs = $lcard_logs;
$this->system_preferences = $system_preferences;
$this->otp_attempts = $otp_attempts;
$this->mobile_usage = $mobile_usage;
$this->mpin_codes = $mpin_codes;
}
/**
* CMS api
*
* @return \Illuminate\Http\Response
*/
public function cms_usernameLogin(Request $request)
{
$admin = $this->admin->getByField([
'username' => $request->get('username'),
'is_active' => 1,
]);
if($admin->count())
{
if($admin[0]['status'] == 1)
{
$data['inactive'] = true;
return $this->format->unprocessableEntity("Username does not exist.",$data);
}
elseif($admin[0]['is_active'] == 1)
{
// note : password checking must be in the password form
// $password_log = $this->password_logs->getLastLog($admin[0]['admin_id']);
// if($password_log)
// {
// $hasExceeded = StringHelper::check_time_exceeded($password_log['created_dt'], '+15 minutes');
// if($password_log['generated_password'] != null && $hasExceeded == false)
// {
// $data['expired'] = true;
// return $this->format->unprocessableEntity("Your password is expired",$data);
// }
// }
$data['is_verified'] = true;
$data['role'] = $admin[0]['role'];
return $this->format->success("Success",$data);
}
}
$data['is_verified'] = false;
return $this->format->unprocessableEntity("Username does not exist.",$data);
}
public function cms_login()
{
if(Auth::attempt(['username' => request('username'), 'password' => request('password')]))
{
$user = Auth::user();
$admin = $this->admin->getByField([
'username' => request('username'),
'is_active' => 1,
]);
if($admin[0]['is_passwordChanged'] == 1)
{
$this->admin_logs->log($admin[0]['admin_id'],self::MODULE,'LOGIN');
// $success['token'] = $user->createToken('Admin')->accessToken;
$data = [
'grant_type' => 'password',
'client_id' => env("PASSPORT_ADMIN_CLIENT_ID", 2),
'client_secret' => env("PASSPORT_ADMIN_CLIENT_SECRET", "test"),
'username' => $admin[0]['email'],
'password' => request('password'),
'scope' => ''
];
$request = Request::create('/oauth/token', 'POST', $data);
$result = app()->handle($request)->getContent();
$result = json_decode($result);
$success['token'] = $result->access_token;
// $success['refresh_token'] = $result->refresh_token;
$message = 'Success';
}
else
{
$password_log = $this->password_logs->getLastLog($admin[0]['admin_id']);
if($password_log)
{
$hasExceeded = StringHelper::check_time_exceeded($password_log['created_dt'], '+15 minutes');
if($password_log['generated_password'] != null && $hasExceeded == false)
{
$data['expired'] = true;
return $this->format->unprocessableEntity("Your password is expired",$data);
}
}
$success['prompt_password'] = 1;
$success['admin_uuid'] = $admin[0]['admin_uuid'];
$message = 'User must change password';
}
return $this->format->success($message,$success);
}
else{
return $this->format->unauthorized("Incorrect Password");
}
}
public function cms_changePassword(UserFormValidation $request)
{
$admin = $this->admin->getByField(['admin_uuid' => $request->get('admin_uuid')]);
//added this to check if the admin uuid is correct and to avoid Undefined offset: 0
if ($admin->count() == 0){
return $this->format->unauthorized();
}
// Shall not be the same with the previous 2 passwords.
$logs = $this->password_logs->getByField([
'admin_id' =>$admin[0]['admin_id'],
'is_generated' => 0
]);
$good_password = true;
if(count($logs) > 0)
{
$ctr = 1;
foreach ($logs as $key => $value) {
if($ctr <= 2)
{
if($value['password'] == md5($request->get('password')))
$good_password = false;
}
$ctr++;
}
}
if($good_password)
{
$success_admin = $this->admin->changePassword($request);
$success_user = $this->user->changePassword($request,$admin[0]['username']);
$this->password_logs->store($admin[0]['admin_id'],$request->get('password'),$admin[0]['admin_id']);
if($success_user && $success_admin)
{
$this->admin_logs->log($admin[0]['admin_id'],self::MODULE,'UPDATE','Changed Password');
if(Auth::attempt(['username' => $admin[0]['username'], 'password' => $request->get('password')]))
{
$auth = Auth::user();
// $success['token'] = $auth->createToken('Admin')->accessToken;
$data = [
'grant_type' => 'password',
'client_id' => env("PASSPORT_ADMIN_CLIENT_ID", 2),
'client_secret' => env("PASSPORT_ADMIN_CLIENT_SECRET", "test"),
'username' => $admin[0]['email'],
'password' => $request->get('password'),
'scope' => ''
];
$auth_request = Request::create('/oauth/token', 'POST', $data);
$result = app()->handle($auth_request)->getContent();
$result = json_decode($result);
$success['token'] = $result->access_token;
// $success['refresh_token'] = $result->refresh_token;
$this->admin_logs->log($admin[0]['admin_id'],self::MODULE,'LOGIN');
return $this->format->success("SUCCESS",$success);
}
else
{
return $this->format->unauthorized();
}
}
}
else
{
$data['password'] = 'Shall not be the same with the previous 2 passwords';
return $this->format->unprocessableEntity("Shall not be the same with the previous 2 passwords",$data);
}
}
public function logout_cms()
{
if (Auth::check()) {
// Auth::user()->AauthAcessToken()->delete();
Auth::user()->token()->revoke();
return $this->format->success("Logout Success");
}
}
/**
* Mobile api
*
* @return \Illuminate\Http\Response
*/
public function mobile_loginCardNumber(LoginMobileNumberFormValidation $request)
{
$member_det = $this->loyalty_card->getByField([
'mobile' => '63'.$request->get('mobile_number'),
'is_active' => 1
]);
$cardnumber = null;
if($member_det != null && count($member_det) > 0 && $member_det[0]['card_number'] != null){
$cardnumber = $member_det[0]['card_number'];
}else{
return $this->format->mobile_error("Mobile number is not yet registered",['code' => 2]);
}
$cyware = new CywareLibrary();
$cyware->setCardNumber($cardnumber);
$cyware->state_validate();
if ($cyware->response['status_code'] == "200" && $cyware->response['data'] != null)
{
// check if locked
$member_det = $this->loyalty_card->getByField([
'card_number' => $cardnumber,
'is_active' => 1
]);
if(count($member_det))
{
if($member_det[0]['is_locked'] == 1)
{
if(!StringHelper::check_time_exceeded($member_det[0]['lock_dt'],'+24 hours'))
{
$this->loyalty_card->activate_locked($member_det[0]['lcard_uuid']);
$this->lcard_logs->log($member_det[0]['lcard_id'],'LOGIN','UPDATE','System automatically changes lock status to activated');
}
else
{
$customer_service_email = $this->system_preferences->getByField('name','contact_email_address_mobile');
$customer_service_number = $this->system_preferences->getByField('name','contact_number_mobile');
return $this->format->mobile_error('The account you are trying to access is locked. Please contact Customer Service for assistance, call or email customer service.',[
'code' => 1,
'email' => $customer_service_email[0]['value'],
'number' => $customer_service_number[0]['value'],
]);
}
}
// todo remove this comment on live
// if($member_det[0]['deviceUUID'] != "" && $member_det[0]['deviceUUID'] != $request->get('deviceUUID'))
// {
// return $this->format->mobile_error('Your account is already logged in a different device',['code' => 3]);
// }
}
return $this->format->mobile_success('Success',[
'is_valid' => 1,
'card_number' => $cardnumber
]);
}else{
return $this->format->mobile_error($cyware->response['message'],['code' => 2]);
}
}
public function mobile_loginMobileNumber(LoginMobileNumberFormValidation $request)
{
$cyware = new CywareLibrary();
$cyware->setMobile('63'.$request->get('mobile_number'));
$cyware->state_mobilevalidate();
if ($cyware->response['status_code'] == "200" && $cyware->response['data'] != null)
{
//get card number details
$dataResult = $cyware->response['data'];
$cardnumber = null;
if(is_array($dataResult)){
//get latest card
foreach ($dataResult as $key => $part) {
$sort[$key] = strtotime($part->app_date.$part->app_time);
}
array_multisort($sort, SORT_DESC, $dataResult);
$cardnumber = $dataResult[0]->card_number;
}else
$cardnumber = $dataResult->card_number;
// check if locked
$member_det = $this->loyalty_card->getByField([
'card_number' => $cardnumber,
'is_active' => 1
]);
if(count($member_det))
{
if($member_det[0]['is_locked'] == 1)
{
if(!StringHelper::check_time_exceeded($member_det[0]['lock_dt'],'+24 hours'))
{
$this->loyalty_card->activate_locked($member_det[0]['lcard_uuid']);
$this->lcard_logs->log($member_det[0]['lcard_id'],'LOGIN','UPDATE','System automatically changes lock status to activated');
}
else
{
$customer_service_email = $this->system_preferences->getByField('name','contact_email_address_mobile');
$customer_service_number = $this->system_preferences->getByField('name','contact_number_mobile');
return $this->format->mobile_error('The account you are trying to access is locked. Please contact Customer Service for assistance, call or email customer service.',[
'code' => 1,
'email' => $customer_service_email[0]['value'],
'number' => $customer_service_number[0]['value'],
]);
}
}
// todo remove this comment on live
// if($member_det[0]['deviceUUID'] != "" && $member_det[0]['deviceUUID'] != $request->get('deviceUUID'))
// {
// return $this->format->mobile_error('Your account is already logged in a different device',['code' => 3]);
// }
}
$lcard_uuid = $member_det[0]['lcard_uuid'];
return $this->format->mobile_success('Success',[
'is_valid' => 1,
'card_number' => $cardnumber,
'user_id' => $lcard_uuid
]);
}else{
return $this->format->mobile_error($cyware->response['message'],['code' => 2]);
}
}
public function mobile_loginCardNumber_enroll(LoginCardNumberFormValidation $request)
{
// // Number Verification Code
// $loyalty_card = $this->loyalty_card->getByField([
// 'mobile' => $request->get('mobile'),
// 'is_active' => 1,
// ]);
$cyware = new CywareLibrary();
$cyware->setCardNumber($request->get('card_number'));
$cyware->state_entry();
if ($cyware->response['status_code'] == "200" && $cyware->response['message'] == 'Pin is required')
{
$cyware->setCardNumber($request->get('card_number'));
$cyware->state_validate();
if ($cyware->response['status_code'] == "200" && $cyware->response['message'] == 'No Records Found')
{
return $this->format->mobile_success('Success',[
'is_valid' => 1
]);
}
else
{
$message = $cyware->response['message'];
$code = 2;
if(isset($cyware->response['message']) && $cyware->response['message'] == "Success")
{
// check if locked
$member_det = $this->loyalty_card->getByField([
'card_number' => $request->get('card_number'),
'is_active' => 1
]);
if(count($member_det))
{
if($member_det[0]['is_locked'] == 1)
{
if(!StringHelper::check_time_exceeded($member_det[0]['lock_dt'],'+24 hours'))
{
$this->loyalty_card->activate_locked($member_det[0]['lcard_uuid']);
$this->lcard_logs->log($member_det[0]['lcard_id'],'LOGIN','UPDATE','System automatically changes lock status to activated');
}
else
{
$customer_service_email = $this->system_preferences->getByField('name','contact_email_address_mobile');
$customer_service_number = $this->system_preferences->getByField('name','contact_number_mobile');
return $this->format->mobile_error('The account you are trying to access is locked. Please contact Customer Service for assistance, call or email customer service.',[
'code' => 1,
'email' => $customer_service_email[0]['value'],
'number' => $customer_service_number[0]['value'],
]);
}
}
// todo remove this comment on live
// if($member_det[0]['deviceUUID'] != "" && $member_det[0]['deviceUUID'] != $request->get('deviceUUID'))
// {
// return $this->format->mobile_error('Your account is already logged in a different device',['code' => 3]);
// }
}
$message = 'Card Number is already registered. Do you want to proceed to login?';
$code = 4;
return $this->format->mobile_error($message,['code' => $code,'number' => $cyware->response['data']->mobile]);
}
return $this->format->mobile_error($message,['code' => $code,'number' => $cyware->response['data']->mobile]);
}
}
else
{
return $this->format->mobile_error($cyware->response['message'],['code' => 2]);
}
}
public function mobile_loginBirthdate(LoginBirthdateFormValidation $request)
{
$cyware = new CywareLibrary();
$cyware->setCardNumber($request->get('card_number'));
$cyware->state_validate();
if ($cyware->response['status_code'] == "200" && $cyware->response['data'] != null)
{
if(Carbon::parse($request->get('birthdate'))->age < 18)
{
return $this->format->mobile_error('You must be at least 18 years old to join the Loyalty Program');
}
elseif($cyware->response['data']->birthdate != $request->get('birthdate'))
{
return $this->format->mobile_error( 'Incorrect Birthdate');
}
else
{
$loyalty_card = $this->loyalty_card->getByField([
'card_number' => $request->get('card_number'),
'is_active' => 1
],'codeCardType');
if(count($loyalty_card))
{
$cyware->state_retrieve();
// update device uuid
$this->loyalty_card->update_deviceuuid($loyalty_card[0]['lcard_id'],$request->get('deviceUUID'));
$success = [
'mobile_number' => $loyalty_card[0]['mobile'],
// 'card_type' => $loyalty_card[0]['card_type']['code'],
// 'card_number' => $loyalty_card[0]['card_number'],
'lcard_uuid' => $loyalty_card[0]['lcard_uuid'],
'state_retrieve' => $cyware->response["data"]
];
$this->lcard_logs->log($loyalty_card[0]['lcard_id'],'LOGIN','LOGIN','Member logs in a verified account');
}
else
{
// add details to database
$pd_id = $this->personal_details->store($cyware->response['data']);
$lcard_store = $this->loyalty_card->store($pd_id, $cyware->response['data'], $request->get('deviceUUID'),1);
$this->user->store_member($cyware->response['data']);
$this->mobile_usage->add_inactive();
$success = [
'mobile_number' => $cyware->response['data']->mobile,
// 'card_type' => $cyware->response['data']->card_type_code,
// 'card_number' => $cyware->response['data']->card_number,
'lcard_uuid' => $lcard_store['lcard_uuid'],
];
$this->lcard_logs->log($lcard_store['lcard_id'],'LOGIN','STORE','Member added a verified account to database');
}
return $this->format->mobile_success('Success',$success);
}
}else{
return $this->format->mobile_error('Error',['card_number' => $cyware->response['message']]);
}
}
public function create_otp(Request $request)
{
$loyalty_card = $this->loyalty_card->getByField([
'lcard_uuid' => $request->get('lcard_uuid'),
'is_active' => 1
]);
if(count($loyalty_card))
{
// get if loyalty card is less than 30 seconds
// this is due to iOS' double request for OTP
$last_log = $this->otp_logs->getLastLog($loyalty_card[0]['lcard_id']);
if((isset($last_log->created_at) && strtotime($last_log->created_at.' +30 seconds') > strtotime(date('Y-m-d H:i:s'))) && $request->is_resend == 'true')
return $this->format->mobile_success('Success');
if($request->has('is_resend') && $request->is_resend != 'true')
{
// reset otp_attempts
$this->otp_attempts->delete($loyalty_card[0]['lcard_id']);
}
if(env("M360_ENV", 'TEST') == 'LOCAL')
$otp = 1234;
else
$otp = StringHelper::random_num(4);
$content = 'Your Unioil Mobile Application OTP Code is '.$otp;
$transid = date('YmdHis').$loyalty_card[0]['lcard_id'];
$mobile = $request->has('mobile') ? '63'.$request->mobile : $loyalty_card[0]['mobile'];
$m360 = new M360();
$m360->set_msisdn($mobile);
$m360->set_content($content);
$m360->set_rcvd_transid($transid);
$m360->send();
if($m360->success())
{
// error_log( "SMS Sent!" );
$data = [
'otp' => $otp,
'msisdn' => $mobile,
'content' => $content,
'rcvd_transid' => $transid,
'transid' => $m360->get_transid()
];
if($this->otp_logs->store($loyalty_card[0]['lcard_id'],$data))
{
$this->lcard_logs->log($loyalty_card[0]['lcard_id'],'OTP','GENERATE','Member requested to generate an OTP');
return $this->format->mobile_success('Success');
}
else
{
return $this->format->mobile_error('Something went wrong');
}
}
else
{
return $this->format->mobile_error($m360->get_response_name(),$m360->get_response_message());
}
}
else
{
return $this->format->mobile_error('User doesn\'t exist');
}
}
public function mobile_otp(Request $request){
if($request->has('mobile')){
$mobile = '63'.$request->mobile;
$loyalty_card = $this->loyalty_card->getByField([
'mobile' => $mobile,
'is_active' => 1,
]);
if(count($loyalty_card)>0){
return $this->format->mobile_error('Mobile number already used.');
}else{
$lastlog = $this->otp_logs->getLastLogByNumber($mobile);
if($lastlog != null){
$timeB = time();
$lastlog = strtotime($lastlog->created_at);
if($lastlog+30 > $timeB){
return $this->format->mobile_error("OTP too fast to request.");
}
}
$otp = StringHelper::random_num(4);
$content = 'Your Unioil Mobile Application OTP Code is '.$otp;
$transid = date('YmdHis')."validate";
$m360 = new M360();
$m360->set_msisdn($mobile);
$m360->set_content($content);
$m360->set_rcvd_transid($transid);
$m360->send();
if($m360->success()){
$data = [
'otp' => $otp,
'msisdn' => $mobile,
'content' => $content,
'rcvd_transid' => $transid,
'transid' => $m360->get_transid()
];
// return $this->format->mobile_success('Success');
if($this->otp_logs->store("validation",$data)){
$this->lcard_logs->log("validation",'OTP','GENERATE','Member requested to generate an OTP');
return $this->format->mobile_success('Success', [
'trans_id' => $transid
]);
}else{
return $this->format->mobile_error('Something went wrong');
}
}else{
return $this->format->mobile_error($m360->get_response_name(),$m360->get_response_message());
}
// return $this->format->mobile_success("Mobile number is valid.");
}
}else{
return $this->format->mobile_error("Mobile number is required");
}
}
public function mobile_updateMpin(MpinFormValidation $request){
//check if code exist
$loyalty_card = $this->loyalty_card->getByField([
'lcard_uuid' => $request->get('lcard_uuid'),
'is_active' => 1
]);
if(count($loyalty_card))
{
$cardNumber = $loyalty_card[0]['card_number'];
//check if mpin exist
$mpin = $this->mpin_codes->getMpin($cardNumber);
if($mpin){
//update
$data = [];
$data['mpin_code'] = $request->get('mpin');
$res = $this->mpin_codes->updateMpin($cardNumber,$data);
if($res){
return $this->format->mobile_success('Success', [
'mpin' => $request->get('mpin')
]);
}else{
return $this->format->mobile_error('Something went wrong.');
}
}else{
//store
$data = [];
$data['lcard_id'] = $cardNumber;
$data['mpin_code'] = $request->get('mpin');
$res = $this->mpin_codes->store($data);
if($res){
return $this->format->mobile_success('Success', [
'mpin' => $request->get('mpin')
]);
}else{
return $this->format->mobile_error('Something went wrong.');
}
}
}else{
return $this->format->mobile_error('User doesn\'t exist');
}
}
public function mobile_getPin(Request $request){
$loyalty_card = $this->loyalty_card->getByField([
'lcard_uuid' => $request->get('lcard_uuid'),
'is_active' => 1
]);
if(count($loyalty_card))
{
$cardNumber = $loyalty_card[0]['card_number'];
$mpin = $this->mpin_codes->getMpin($cardNumber);
if($mpin){
return $this->format->mobile_success('Success', [
'mpin' => $mpin->mpin_code
]);
}else{
return $this->format->mobile_error('MPIN is not yet set by the user.');
}
}else{
return $this->format->mobile_error('User doesn\'t exist');
}
}
public function mobile_validate_otp(Request $request){
$otp_log = $this->otp_logs->getByField([
'rcvd_transid' => $request->trans_id
]);
if(count($otp_log)>0){
$_otp = $otp_log[0]->otp;
$_otp_id = $otp_log[0]->otplog_id;
$_otp_used = $otp_log[0]->used;
// return $this->format->mobile_success("test", $otp_log[0]->otp);
if($_otp_used == 0){
if($_otp == $request->otp){
if($this->otp_logs->setUsed($_otp_id)){
return $this->format->mobile_success('Success');
}else{
return $this->format->mobile_error("Something went wrong.");
}
}else{
return $this->format->mobile_error('Incorrect OTP. The OTP you have entered does not exist.',['code' => 2]);
}
}else{
return $this->format->mobile_error('The OTP you have entered has already used.');
}
}else{
return $this->format->mobile_error('Incorrect OTP. The OTP you have entered does not exist.',['code' => 2]);
}
}
public function validate_otp(Request $request)
{
// lock after 3 attempts
$numberOfAttempts = 0;
$attempts = $this->loyalty_card->numberOfOTPAttempts($request->get('lcard_uuid'));
if(!is_null($attempts))
{
$numberOfAttempts = $attempts->otpAttempts->count();
}
if($numberOfAttempts >= 3)
{
$customer_service_email = $this->system_preferences->getByField('name','contact_email_address_mobile');
$customer_service_number = $this->system_preferences->getByField('name','contact_number_mobile');
return $this->format->mobile_error('You already entered the wrong OTP 3 times. Your account is locked for 24 hours. Please contact Customer Service for assistance, call or email customer service.',[
'code' => 1,
'email' => $customer_service_email[0]['value'],
'number' => $customer_service_number[0]['value'],
]);
}
else
{
$loyalty_card = $this->loyalty_card->getByField([
'lcard_uuid' => $request->get('lcard_uuid'),
'is_active' => 1
],'personalDetails');
$getuserDetails = $this->loyalty_card->show($request->get('lcard_uuid'),['personalDetails','codeVehicleOwn','codeCivilStatus','codeGender','codeCardType','codeCity','codeFuelType']);
$data = new MobileUserProfileResource($getuserDetails);
$userDetails = null;
if($data != null){
$userDetails = $data->toArray($getuserDetails);
}
$numberOfAttempts++;
$this->otp_attempts->store($loyalty_card[0]['lcard_id'],$request->get('otp'));
$this->lcard_logs->log($loyalty_card[0]['lcard_id'],'OTP','ATTEMPT','Member entered otp '.$request->get('otp'));
// check if correct
$otpLog = $this->otp_logs->getByField(['lcard_id' => $loyalty_card[0]['lcard_id'], 'otp' => $request->get('otp')]);
//var_dump($otpLog);
if(count($otpLog))
{
$latestOtp = $this->otp_logs->getLastLog($loyalty_card[0]['lcard_id']);
// checks if otp entered is expired and it's the latest otp created
if(!StringHelper::check_time_exceeded($otpLog[0]['created_at'],'+5 minutes') || $latestOtp->otp != $request->get('otp'))
{
if($numberOfAttempts >= 3)
{
return $this->format->mobile_error('You have entered the wrong OTP for 3 times. Your account is now locked for 24 hours, call or email customer service.',$this->lock_member($loyalty_card));
}
return $this->format->mobile_error('The OTP you have entered has already expired. Please select the Resend OTP option',['code' => 3]);
}
else
{
if($loyalty_card[0]['cyware_synced'] == 0)
{
$cyware_response = $this->cyware_activate($loyalty_card[0]);
if($cyware_response['success'] == true && isset($cyware_response['data']))
{
$this->loyalty_card->cyware_activate($loyalty_card[0]['lcard_id'],$cyware_response['data']);
$this->user->store_member($cyware_response['data']);
$this->lcard_logs->log($loyalty_card[0]['lcard_id'],'LOGIN','ACTIVATE','Member activated a card');
}
else
{
return $this->format->mobile_error($cyware_response['message']);
}
}
if(Auth::attempt([ 'username' => $loyalty_card[0]['card_number'], 'password' => $loyalty_card[0]['birthdate']->toDateString() ]))
{
if($loyalty_card[0]['is_validated'] == 0)
{
$this->loyalty_card->validateMember($loyalty_card[0]['lcard_id']);
$this->mobile_usage->add_active();
}
$mpin = $this->mpin_codes->getMpin($loyalty_card[0]['card_number']);
$this->otp_logs->setUsed($latestOtp->otplog_id);
$user = Auth::user();
$success['is_valid'] = 1;
// $success['token'] = $user->createToken('Mobile')->accessToken; // for multiple login
// ---------------------------------------------------------------- new login start
$data = [
'grant_type' => 'password',
'client_id' => env("PASSPORT_ADMIN_CLIENT_ID", 2),
'client_secret' => env("PASSPORT_ADMIN_CLIENT_SECRET", "test"),
'username' => $loyalty_card[0]['card_number'],
'password' => $loyalty_card[0]['birthdate']->toDateString(),
'scope' => ''
];
// dd($data);
$request = Request::create('/oauth/token', 'POST', $data);
$result = app()->handle($request)->getContent();
$result = json_decode($result);
$success['token'] = $result->access_token;
$success['userDetails'] = $userDetails;
if($mpin){
$success['userDetails']['mpin'] = $mpin->mpin_code;
}
// ---------------------------------------------------------------- new login end
$this->lcard_logs->log($loyalty_card[0]['lcard_id'],'LOGIN','LOGIN','Member successfully logs in');
return $this->format->mobile_success('Sucess',$success,$data);
}
}
}
else
{
if($numberOfAttempts >= 3)
{
return $this->format->mobile_error('You have entered the wrong OTP for 3 times. Your account is now locked for 24 hours, call or email customer service.',$this->lock_member($loyalty_card));
}
return $this->format->mobile_error('Incorrect OTP. The OTP you have entered does not exist.',['code' => 2]);
}
}
}
private function cyware_activate($loyalty_card)
{
$err = '';
$cyware = new CywareLibrary();
$cyware->setCardNumber($loyalty_card['card_number']);
$cyware->setPin($loyalty_card['pin']);
$cyware->setFirstName($loyalty_card['personalDetails']['firstname']);
$cyware->setLastName($loyalty_card['personalDetails']['lastname']);
$cyware->setBirthday(date('Ymd',strtotime($loyalty_card['birthdate'])));
$cyware->setMobile($loyalty_card['mobile']);
$cyware->setEmail($loyalty_card['email']);
$cyware->state_entry();
if ($cyware->response['status_code'] == 200 && $cyware->response['message'] == 'success')
{
$cyware->state_validate();
if ($cyware->response['status_code'] == 200 && $cyware->response['data'] != null)
{
return ['success' => true , 'data' => $cyware->response['data']];
}
else
$err = $cyware->response['message'];
}
else
$err = $cyware->response['message'];
return ['success' => false , 'message' => $err];
}
private function lock_member($loyalty_card)
{
$this->loyalty_card->lockMember($loyalty_card[0]['lcard_id'],'01');
$this->lcard_logs->log($loyalty_card[0]['lcard_id'],'OTP','LOCKED','Account is locked due to wrong OTP entered for 3 times during login');
$this->mobile_usage->add_locked();
$customer_service_email = $this->system_preferences->getByField('name','contact_email_address_mobile');
$customer_service_number = $this->system_preferences->getByField('name','contact_number_mobile');
return [
'code' => 1,
'email' => $customer_service_email[0]['value'],
'number' => $customer_service_number[0]['value'],
];
}
public function mobile_validatePin(Request $request)
{
$cyware = new CywareLibrary();
$cyware->setCardNumber($request->get('card_number'));
$cyware->setPin($request->get('pin'));
$cyware->state_entry();
if ($cyware->response['status_code'] == "200" && $cyware->response['message'] == 'First name is required')
{
return $this->format->mobile_success('Success');
}
else
{
return $this->format->mobile_error($cyware->response['message']);
}
}
public function mobile_activateCard(LoginActivateCardFormValidation $request)
{
// check if exists
$loyalty_card = $this->loyalty_card->getByField([
'card_number' => $request->card_number,
'cyware_synced' => 0,
'is_active' => 1
],'personalDetails');
if(count($loyalty_card) > 0)
{
$pd_id = $this->personal_details->update_non_cyware_synced($loyalty_card[0]['pd_id'],$request);
$lcard_store = $this->loyalty_card->update_non_cyware_synced($loyalty_card[0]['lcard_id'], $request);
$this->lcard_logs->log($loyalty_card[0]['lcard_id'],'LOGIN','UPDATE','Member updated form for card activation');
}
else
{
$pd_id = $this->personal_details->store($request);
$lcard_store = $this->loyalty_card->store($pd_id, $request);
$this->lcard_logs->log($lcard_store['lcard_id'],'LOGIN','STORE','Member filed for card activation');
// ------ send OTP start
$loyalty_card = $this->loyalty_card->getByField([
'lcard_uuid' => $lcard_store['lcard_uuid'],
'is_active' => 1
]);
}
if(count($loyalty_card))
{
// reset otp_attempts
$this->otp_attempts->delete($loyalty_card[0]['lcard_id']);
if(env("M360_ENV", 'TEST') == 'LOCAL')
$otp = 1234;
else
$otp = StringHelper::random_num(4);
$content = 'Your Unioil Mobile Application OTP Code is '.$otp;
$transid = date('YmdHis').$loyalty_card[0]['lcard_id'];
$m360 = new M360();
$m360->set_msisdn($loyalty_card[0]['mobile']);
$m360->set_content($content);
$m360->set_rcvd_transid($transid);
$m360->send();
if($m360->success())
{
// error_log('SMS Sent Activation!');
$data = [
'otp' => $otp,
'msisdn' => $loyalty_card[0]['mobile'],
'content' => $content,
'rcvd_transid' => $transid,
'transid' => $m360->get_transid()
];
if($this->otp_logs->store($loyalty_card[0]['lcard_id'],$data))
{
$this->lcard_logs->log($loyalty_card[0]['lcard_id'],'OTP','GENERATE','Member requested to generate an OTP');
return $this->format->mobile_success('Success',[
'mobile_number' => $loyalty_card[0]['mobile'],
'lcard_uuid' => $loyalty_card[0]['lcard_uuid'],
]);
}
else
{
return $this->format->mobile_error('Something went wrong');
}
}
else
{
// return $this->format->mobile_error($m360->get_response_name(),$m360->get_response_message());
return $this->format->mobile_error('There was a problem sending your OTP. Please try again.',$m360->get_response_message());
}
}
else
{
return $this->format->mobile_error('User doesn\'t exist');
}
// ------ send OTP end
}
public function logout_mobile()
{
if (Auth::check()) {
$this->lcard_logs->log(0,'LOGIN','LOGOUT','Member logged out');
$this->loyalty_card->remove_deviceuuid(Auth::user()->username);
// Auth::user()->AauthAcessToken()->delete();
Auth::user()->token()->revoke();
return $this->format->mobile_success("Logout Success");
}
}
public function checkTime()
{
echo date('Y-m-d H:i:s').'<br>';
echo config('app.timezone');
}
public function convertmd5()
{
echo md5(request('value'));
}
public function checkOTP($card_number)
{
$loyalty_card = $this->loyalty_card->getByField([
'card_number' => $card_number,
'is_active' => 1,
]);
if(count($loyalty_card)>0)
{
$logs = $this->otp_logs->getLastLog_limit(1, $loyalty_card[0]->lcard_id);
if(count($logs) > 0)
{
foreach ($logs as $k => $v)
{
echo '
<h1>'.$v->otp.'</h1>
<b>'.($v->used == 1 ? 'used' : 'not used').'</b>
'.date('F d, Y h:i A',strtotime($v->created_at)).'
<br>
';
}
}
}
else
{
echo 'Card Number doesn\'t exists';
}
}
//check mobile number already exist
public function checkMobile($mobile)
{
$loyalty_card = $this->loyalty_card->getByField([
'mobile' => $mobile,
'is_active' => 1,
]);
if(count($loyalty_card)>0)
{
return $this->format->mobile_error('Mobile number already used.');
}
else
{
return $this->format->mobile_success("Mobile number is valid.");
}
}
//todo delete for testing only
public function state_validate()
{
$cyware = new CywareLibrary();
$cyware->setCardNumber($_GET['as']);
$cyware->setBirthday('19800222');
$cyware->state_validate();
if ($cyware->response['data'] == "200"){
return $this->format->success("curl success",$cyware->response['data']);
}else{
return $this->format->success($cyware->response['message'],$cyware->response['data']);
}
}
public function state_entry()
{
$cyware = new CywareLibrary();
$cyware->setCardNumber('1100000000000001');
$cyware->setFirstName('vic');
$cyware->setLastName('vic');
$cyware->setBirthday('19991010');
$cyware->setMobile('639178032215'); // must have 63
$cyware->setEmail('gasdga@fasd.com');
$cyware->setPin('99798722');
$cyware->state_entry();
$cyware->state_entry();
if ($cyware->response['data'] == "200"){
return $this->format->success("curl success",$cyware->response['data']);
}else{
return $this->format->success($cyware->response['message'],$cyware->response['data']);
}
}
public function state_trans()
{
$cyware = new CywareLibrary();
$cyware->setCardNumber('1100000000000001');
$cyware->setStartDate('20180101');
$cyware->setEndDate('20181231');
$cyware->state_trans();
if ($cyware->response['data'] == "200"){
return $this->format->success("curl success",$cyware->response['data']);
}else{
return $this->format->success($cyware->response['message'],$cyware->response['data']);
}
}
//this func is not yet available in phase 1 / but just in case
public function state_promo()
{
$cyware = new CywareLibrary();
$cyware->setCardNumber('1100000000000001');
$cyware->state_promo();
if ($cyware->response['data'] == "200"){
return $this->format->success("curl success",$cyware->response['data']);
}else{
return $this->format->success($cyware->response['message'],$cyware->response['data']);
}
}
public function state_retrieve()
{
$cyware = new CywareLibrary();
$cyware->setCardNumber('1100000000000001');
$cyware->state_retrieve();
if ($cyware->response['data'] == "200"){
return $this->format->success("curl success",$cyware->response['data']);
}else{
return $this->format->success($cyware->response['message'],$cyware->response['data']);
}
}
public function StateRetrieve($data){
$newData = $data->getData();
$mainData = [];
$mainData["lcard_uuid"] = $newData->data->lcard_uuid;
$mainData["card_number"] = $newData->data->card_number;
$mainData["pin"] = $newData->data->pin;
$mainData["birthdate"] = $newData->data->birthdate;
$mainData["mobile"] = $newData->data->mobile;
$mainData["email"] = $newData->data->email;
$mainData["firstname"] = $newData->data->firstname;
$mainData["lastname"] = $newData->data->lastname;
$mainData["photo"] = $newData->data->photo;
$mainData["card_type"] = $newData->data->card_type;
$mainData["card_code"] = $newData->data->card_code;
$mainData["card_image"] = $newData->data->card_image;
$mainData["card_bg_image"] = $newData->data->card_bg_image;
$mainData["card_black_label"] = $newData->data->card_black_label;
$mainData["expiry_date"] = $newData->data->expiry_date;
$mainData["points"] = $newData->data->points;
//DATA THAT MUST GET FROM STATE RETRIEVE
$mainData["middlename"] = $newData->retrieved->middle_initial;
$mainData["city_name"] = $newData->retrieved->address;
$mainData["address"] = $newData->retrieved->address;
$mainData["civilstatus_code"] = $newData->retrieved->civil_status_code;
$mainData["gender_code"] = $newData->retrieved->gender_code;
$mainData["vo_code"] = $newData->retrieved->vehicle_own_code;
$mainData["fueltype_code"] = $newData->retrieved->fuel_type_code;
//$mainData['log'] = "start:".$datestart." ---- end:".$dateend;
$newData->data = $mainData;
return response()->json($newData);
}
public function state_update()
{
$cyware = new CywareLibrary();
$cyware->setCardNumber('1100000000000001');
$cyware->setFirstName('vic');
$cyware->setLastName('abalos');
$cyware->setAddress('dun');
$cyware->setMobile('639178032215');
$cyware->setEmail('email@gmaill.com');
$cyware->setCivilStatusCode('S');
$cyware->setGenderCode('0');
$cyware->setCivilStatusCode('S');
$cyware->setFuelType('1');
$cyware->state_update();
if ($cyware->response['data'] == "200"){
return $this->format->success("curl success",$cyware->response['data']);
}else{
return $this->format->success($cyware->response['message'],$cyware->response['data']);
}
}
public function state_points()
{
$cyware = new CywareLibrary();
$cyware->setCardNumber('1100000000000001');
$cyware->setSiNum(rand(1000,3000));
$cyware->setTotalAmount('100');
$cyware->state_points();
if ($cyware->response['data'] == "200"){
return $this->format->success("curl success",$cyware->response['data']);
}else{
return $this->format->success($cyware->response['message'],$cyware->response['data']);
}
}
public function state_redeemed()
{
$cyware = new CywareLibrary();
$cyware->setCardNumber('1100000000000001');
$cyware->setStartDate('20180101');
$cyware->setEndDate('20181231');
$cyware->state_redeemed();
if ($cyware->response['data'] == "200"){
return $this->format->success("curl success",$cyware->response['data']);
}else{
return $this->format->success($cyware->response['message'],$cyware->response['data']);
}
}
public function stations_fuel_prices()
{
$cyware = new StratuscastLibrary();
$cyware->getAllFuelPrice();
if ($cyware->response['status_code'] == "200"){
return $this->format->success("curl success",$cyware->response['data']);
}
}
public function station_fuel_price_station()
{
$cyware = new StratuscastLibrary();
$cyware->getFuelPriceBystation($_GET['station']);
if ($cyware->response['status_code'] == "200"){
return $this->format->success("curl success",$cyware->response['data']);
}
}
public function city_provinces()
{
$cyware = new StratuscastLibrary();
$cyware->getCityAndProvince();
if ($cyware->response['status_code'] == "200"){
return $this->format->success("curl success",$cyware->response['data']);
}
}
public function city()
{
$cyware = new StratuscastLibrary();
$cyware->getCity();
if ($cyware->response['status_code'] == "200"){
return $this->format->success("curl success",$cyware->response['data']);
}
}
public function province()
{
$cyware = new StratuscastLibrary();
$cyware->getProvince();
if ($cyware->response['status_code'] == "200"){
return $this->format->success("curl success",$cyware->response['data']);
}
}
public function aboutus()
{
$cyware = new StratuscastLibrary();
$cyware->getAboutUs();
if ($cyware->response['status_code'] == "200"){
return $this->format->success("curl success",$cyware->response['data']);
}
}
public function product()
{
$cyware = new StratuscastLibrary();
$cyware->getProduct($_GET['id']);
if ($cyware->response['status_code'] == "200"){
return $this->format->success("curl success",$cyware->response['data']);
}
}
public function checkmobileotp($mobile){
$mobile = $mobile != null ? $mobile: "";
$lastlog = $this->otp_logs->getLastLogByNumber($mobile);
if($lastlog){
return $lastlog->content;
}
return "Sorry, this request is not available or no data found";
}
}