unioil-loyalty-app/app/Http/Controllers/API/MemberController.php

485 lines
17 KiB
PHP

<?php
namespace App\Http\Controllers\API;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Helpers\HttpStatusCode;
use Validator;
use App\Libraries\ParameterHelper;
use App\Contracts\LoyaltyCardResourceInterface;
use App\Contracts\PersonalDetailsResourceInterface;
use App\Contracts\AdminActionLogsInterface;
use App\Contracts\UserResourceInterface;
use App\Contracts\LcardActionLogsInterface;
use App\Contracts\SystemPreferenceResourceInterface;
use App\Contracts\OtpAttemptsResourceInterface;
use App\Contracts\OtpLogResourceInterface;
use App\Contracts\MpinCodesResourceInterface;
use App\Http\Resources\LoyaltyCardResource;
use App\Http\Resources\MobileUserProfileResource;
use App\Http\Requests\SecurityFormValidation;
use App\Http\Requests\MpinFormValidation;
use App\Contracts\MobileAnalyticsResourceInterface;
use App\Libraries\StaticContents;
use App\Http\Requests\MobileEditProfileFormValidation;
use App\Libraries\CywareLibrary;
use App\Helpers\CurrentUserHelper;
use App\CodeCity;
use App\Helpers\StringHelper;
use App\Libraries\S3;
class MemberController extends Controller
{
const MODULE = 'MEMBERMANAGEMENT';
public $loyalty_card;
public $personal_details;
public $admin_logs;
public $user;
public $lcard_logs;
public $mobile_usage;
protected $system_preferences;
protected $otp_attempts;
protected $otp_logs;
protected $format;
protected $mpin_codes;
public function __construct(LoyaltyCardResourceInterface $loyalty_card,
HttpStatusCode $httpStatusCode,
PersonalDetailsResourceInterface $personal_details,
AdminActionLogsInterface $admin_logs,
UserResourceInterface $user,
LcardActionLogsInterface $lcard_logs,
SystemPreferenceResourceInterface $system_preferences,
OtpAttemptsResourceInterface $otp_attempts,
OtpLogResourceInterface $otp_logs,
MobileAnalyticsResourceInterface $mobile_usage,
MpinCodesResourceInterface $mpin_codes)
{
$this->loyalty_card = $loyalty_card;
$this->personal_details = $personal_details;
$this->format = $httpStatusCode;
$this->admin_logs = $admin_logs;
$this->user = $user;
$this->lcard_logs = $lcard_logs;
$this->system_preferences = $system_preferences;
$this->otp_attempts = $otp_attempts;
$this->otp_logs = $otp_logs;
$this->mobile_usage = $mobile_usage;
$this->mpin_codes = $mpin_codes;
}
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index(Request $request)
{
$params = [
'locked' => ($request->has('_locked') ? 1 : 0),
'search' => ($request->has('_search') ? $request->get('_search') : NULL),
'page_size' => ($request->has('page_size') ? $request->get('page_size') : 10),
'page' => ($request->has('page') ? $request->get('page') : 10),
'sorting' => ParameterHelper::prepareSortingParameter($request),
'filter' => [
'is_validated' => ($request->has('status') ? $request->get('status') : null)
]
];
$list = $this->loyalty_card->listing($params);
if(count($list))
{
$additionals = $this->format->success("Success",[],false);
$data = LoyaltyCardResource::collection($list)->additional($additionals);
return $data->response()->setStatusCode(200);
}
else
{
return $this->format->success("No records found",[]);
}
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create()
{
//
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
//
}
/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($uuid)
{
$details = $this->loyalty_card->show($uuid,['personalDetails','codeVehicleOwn','codeCivilStatus','codeGender','codeCardType']);
if($details)
{
$additionals = $this->format->success("Success",[],false);
$data = (new LoyaltyCardResource($details))->additional($additionals);
return $data->response()->setStatusCode(200);
}
else
return $this->format->notFound();
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function edit($id)
{
//
}
/**
*
* This function is accessed from mobile
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(MobileEditProfileFormValidation $request)
{
$member_details = CurrentUserHelper::get_currentMember();
// $city = $request->has('city_uuid') ? CodeCity::uuid($request->city_uuid)->first() : null;
$cyware = new CywareLibrary();
$cyware->setCardNumber($member_details->card_number);
$cyware->setFirstName($member_details->personalDetails->firstname);
$cyware->setLastName($member_details->personalDetails->lastname);
$cyware->setAddress($request->address);
$cyware->setMobile('63'.$request->mobile);
$cyware->setEmail($request->email);
$cyware->setCivilStatusCode($request->civilstatus_code);
$cyware->setGenderCode($request->gender_code);
$cyware->setFuelType($request->fueltype_code);
$cyware->setVehicleOwn($request->vo_code);
$cyware->setCityCode($request->city);
// if($city)
// {
// $cyware->setCityCode($city->code);
// $request->merge(['city_id' => $city->city_id]);
// }
$cyware->state_update();
if($cyware->response['status_code'] == "200" && $cyware->response['message'] == "success")
{
$this->loyalty_card->update($request, $member_details->lcard_id);
// $this->user->updateMember($request, $member_details->card_number);
$path = $this->personal_details->update($request, $member_details->personalDetails->pd_id);
$this->lcard_logs->log($member_details->lcard_id,'PROFILE','UPDATE');
if($path)
{
// $photo_url = str_replace('/public/index.php','',secure_url('storage/app/'.$path));
// $photo_url = str_replace('https','http',$photo_url);
return $this->format->mobile_success('Profile updated',['photo' => S3::public_path($path)]);
}
else
return $this->format->mobile_success('Profile updated',['photo' => '']);
}
else
{
return $this->format->mobile_error($cyware->response['message']);
}
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($uuid)
{
}
public function batch_delete(Request $request)
{
$lcard_uuid = $request->has('lcard_uuid') ? $request->get('lcard_uuid') : null;
if($lcard_uuid)
{
$details_loyaltyCard = $this->loyalty_card->getDetailsWhereIn('lcard_uuid',$lcard_uuid,'personalDetails');
$pd_uuid = array();
foreach ($details_loyaltyCard as $key => $value)
{
$pd_uuid[] = $value['personal_details']['pd_uuid'];
$this->admin_logs->log($value['lcard_id'],self::MODULE,'DELETE');
}
if($this->loyalty_card->delete($lcard_uuid) && $this->personal_details->delete($pd_uuid))
{
return $this->format->success("Member Successfully Deleted");
}
else
{
return $this->format->badRequest('Something went wrong');
}
}
else
{
$data['lcard_uuid'] = 'lcard_uuid is required';
return $this->format->unprocessableEntity("Submit at least one user",$data);
}
}
public function activate_locked($uuid)
{
$details = $this->loyalty_card->getByField(['lcard_uuid' => $uuid]);
if($details->count())
{
$details = $details[0];
if($this->loyalty_card->activate_locked($uuid))
{
$adminLog = $this->admin_logs->log($details['lcard_id'],self::MODULE,'ACTIVATE');
$data['is_locked'] = false;
return $this->format->success('User has been activated', $data);
}
}
return $this->format->notFound();
}
// public function direct_update(MobileEditProfileFormValidation $request)
// {
// $status = $this->update($request);
// if($status == true)
// {
// return $this->format->mobile_success('Profile Details Updated', [
// 'photo' =>
// ]);
// }
// else
// {
// return $this->format->mobile_error($status);
// }
// }
public function confirm_otp(Request $request)
{
$member_details = CurrentUserHelper::get_currentMember();
// lock after 3 attempts
$numberOfAttempts = 0;
$attempts = $this->loyalty_card->numberOfOTPAttempts($member_details->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 have entered the wrong OTP for 3 times. Your account is now locked for 24 hours and you will be logged out of the system.',[
'code' => 1,
'email' => $customer_service_email[0]['value'],
'number' => $customer_service_number[0]['value'],
]);
}
else
{
$numberOfAttempts++;
$this->otp_attempts->store($member_details->lcard_id,$request->otp);
$this->lcard_logs->log($member_details->lcard_id,'OTP','ATTEMPT','Member entered otp '.$request->otp);
// check if correct
$otpLog = $this->otp_logs->getByField(['lcard_id' => $member_details->lcard_id, 'otp' => $request->otp]);
if(count($otpLog))
{
$latestOtp = $this->otp_logs->getLastLog($member_details->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->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($member_details));
$this->user->force_logout($member_details->card_number,2);
}
return $this->format->mobile_error('The OTP you have entered has already expired. Please select the Resend OTP option',['code' => 3]);
}
else
{
return $this->format->mobile_success('OTP Confirmed');
}
}
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($member_details));
}
return $this->format->mobile_error('Incorrect OTP. The OTP you have entered does not exist.',['code' => 2]);
}
}
}
private function lock_member($member_details)
{
$this->loyalty_card->lockMember($member_details->lcard_id,'02');
$this->lcard_logs->log($member_details->lcard_id,'OTP','LOCKED','Account is locked due to wrong OTP entered when updating the mobile phone number');
$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 myProfile()
{
$member_details = CurrentUserHelper::get_currentMember();
$cyware = new CywareLibrary();
$details = $this->loyalty_card->show($member_details->lcard_uuid,['personalDetails','codeVehicleOwn','codeCivilStatus','codeGender','codeCardType','codeCity','codeFuelType']);
if($details)
{
$cyware->setCardNumber($member_details->card_number);
$cyware->state_retrieve();
$additionals = $this->format->mobile_success("Success",[],false);
$additionals["retrieved"] = $cyware->response["data"];
$data = (new MobileUserProfileResource($details))->additional($additionals);
//return $data->response()->setStatusCode(200);
//getmpin
$mpin = $this->mpin_codes->getMpin($additionals["retrieved"]->customer_number);
$dataResult = $this->StateRetrieve($data->response()->setStatusCode(200),$mpin);
return $dataResult;
// return $this->StateRetrieve($data->response()->setStatusCode(200));
}
else
return $this->format->notFound();
}
public function validateMember(SecurityFormValidation $request)
{
// $member_details = CurrentUserHelper::get_currentMember();
// return $this->format->mobile_success($request->card_number,[
// 'is_valid' => 0
// ]);
$cyware = new CywareLibrary();
$cyware->setCardNumber($request->get('card_number'));
$cyware->state_validate();
if ($cyware->response['status_code'] == "200" && $cyware->response['data'] != null)
{
if($cyware->response['data']->birthdate != $request->get('birthdate'))
{
return $this->format->mobile_error( 'Incorrect Birthdate');
}
if(strtolower($cyware->response['data']->email) != strtolower($request->get('email_address')))
{
return $this->format->mobile_error( 'Incorrect Email');
}
return $this->format->mobile_success('Success',[
'is_valid' => 1
]);
}
else
{
return $this->format->mobile_error($cyware->response['message'], ['card_number' => $cyware->response['message']]);
}
}
public function StateRetrieve($data,$mpin){
$newData = $data->getData();
$mainData = [];
$mainData["lcard_uuid"] = $newData->data->lcard_uuid;
$mainData["card_number"] = $newData->data->card_number;
$mainData["customer_number"] = $newData->retrieved->customer_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;
if($mpin){
$mainData["mpin"] = $mpin->mpin_code;
}
//$mainData['log'] = "start:".$datestart." ---- end:".$dateend;
$newData->data = $mainData;
return response()->json($newData);
}
}