QuizController (Before) QuizController (After)
<?php <?php
   
namespace App\Http\Controllers; namespace App\Http\Controllers;
   
use DB; use DB;
use Log; use Log;
use App\Users; use App\Users;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use App\Http\ResponseHelper; use App\Http\ResponseHelper;
use App\Jobs\CreateShopifyCustomerJob; use App\Jobs\CreateShopifyCustomerJob;
use App\Jobs\TagUserJob; use App\Jobs\TagUserJob;
use JsonSerializable; use JsonSerializable;
  use Carbon\Carbon;  
   
use OhMyBrew\BasicShopifyAPI; use OhMyBrew\BasicShopifyAPI;
use Config; use Config;
   
class QuizController extends Controller class QuizController extends Controller
{ {
   
   private $helper;    private $helper;
   
   public function __construct()    public function __construct()
   {    {
   
       $this->iterableUrl = env('ITERABLE_URL', true);        $this->iterableUrl = env('ITERABLE_URL', true);
       $this->iterableApiKey = env('ITERABLE_API_KEY',true);        $this->iterableApiKey = env('ITERABLE_API_KEY',true);
       $this->helper = new ResponseHelper();        $this->helper = new ResponseHelper();
   }    }
   
   public function storeQuiz(Request $request)    public function storeQuiz(Request $request)
   {    {
       $page         = $request->input('page');        $page         = $request->input('page');
       $sessionID    = $request->input('sessionID');        $sessionID    = $request->input('sessionID');
       $question     = $request->input('question');        $question     = $request->input('question');
       $questionID   = $request->input('questionID');        $questionID   = $request->input('questionID');
       $questionNo   = $request->input('questionNo');        $questionNo   = $request->input('questionNo');
       $responses    = $request->input('responses');        $responses    = $request->input('responses');
       $responseIds  = $request->input('responseIDs');        $responseIds  = $request->input('responseIDs');
       $responseKeys = $request->input('responseKeys');        $responseKeys = $request->input('responseKeys');
   
       $questionTextArray = array('31','49');        $questionTextArray = array('31','49');
                 
       if(empty($sessionID)) {        if(empty($sessionID)) {
                         
           // error            // error
           $returnData = [            $returnData = [
               'error' => 'Invalid Session'                 'error' => 'Invalid Session' 
           ];            ];
   
           return $this->helper->returnData(600, "error", $returnData );            return $this->helper->returnData(600, "error", $returnData );
       }        }
                 
       if( $page == 'close')        if( $page == 'close')
       {        {
           Log::info('Inside close page - '.$sessionID);            Log::info('Inside close page - '.$sessionID);
           $updateQuizUser = DB::table('quiz_user')            $updateQuizUser = DB::table('quiz_user')
               ->where('session_id', $sessionID)                ->where('session_id', $sessionID)
               ->update(['status' => 1]);                ->update(['status' => 1]);
                         
           $other = DB::table('question_responses')->select('id')->where([            $other = DB::table('question_responses')->select('id')->where([
               ['qn_id', '=', '12'],                ['qn_id', '=', '12'],
               ['response', '=', 'Other']                ['response', '=', 'Other']
           ])->value('id');            ])->value('id');
   
           $userResponse = DB::select('            $userResponse = DB::select('
               select                select
                   qm.id,                    qm.id,
                   qm.question,                    qm.question,
                   qm.question_no,                    qm.question_no,
                   qr.response,                    qr.response,
                   qr.response_key,                    qr.response_key,
                   ur.response_text                    ur.response_text
               from                from
                   user_responses as ur                    user_responses as ur
               join                join
                   question_master as qm                    question_master as qm
               on                on
                   qm.id = ur.qn_id                    qm.id = ur.qn_id
               left join                left join
                   question_responses as qr                    question_responses as qr
               on                on
                   ur.response_id = qr.id                    ur.response_id = qr.id
               where                where
                   session_id = ?', [$sessionID]);                    session_id = ?', [$sessionID]);
   
           $dataResult = [];            $dataResult = [];
           $details = [];            $details = [];
                                       
                                         
           if(!empty($userResponse))            if(!empty($userResponse))
           {            {
                                 
               foreach($userResponse as $response)                foreach($userResponse as $response)
               {                {
                   $questionId   = $response->id ;                    $questionId   = $response->id ;
                   $questionNo   = $response->question_no;                    $questionNo   = $response->question_no;
                   $questionText = $response->question;                    $questionText = $response->question;
                   $answerText   = $response->response;                    $answerText   = $response->response;
                   $answerKey    = $response->response_key;                    $answerKey    = $response->response_key;
                   $responseText = $response->response_text;                    $responseText = $response->response_text;
                                         
                   if($questionNo == '11' && $responseText != null)                    if($questionNo == '11' && $responseText != null)
                   {                    {
                       $details[$questionNo]['QuestionNo'] = $questionNo;                        $details[$questionNo]['QuestionNo'] = $questionNo;
                       $details[$questionNo]['AnswerText'][] = $other;                        $details[$questionNo]['AnswerText'][] = $other;
                       continue;                        continue;
                   }                    }
   
                   if (!isset($details[$questionNo])){                    if (!isset($details[$questionNo])){
                       $details[$questionNo] = [];                        $details[$questionNo] = [];
                       $details[$questionNo]['QuestionNo'] = $questionNo;                        $details[$questionNo]['QuestionNo'] = $questionNo;
                   }                    }
                                         
                   if(in_array($questionNo, $questionTextArray))                    if(in_array($questionNo, $questionTextArray))
                   {                    {
                       $details[$questionNo]['AnswerText'][] = $answerText;                        $details[$questionNo]['AnswerText'][] = $answerText;
                   }                    }
                   else                    else
                   {                    {
                       $details[$questionNo]['AnswerText'][] = empty($answerKey) ? $responseText : strval($answerKey);                        $details[$questionNo]['AnswerText'][] = empty($answerKey) ? $responseText : strval($answerKey);
                   }                    }
               }                }
               $questionDetails = array_values($details);                $questionDetails = array_values($details);
               $dataResult['SurveyAnswers']['SessionId'] = $sessionID;                $dataResult['SurveyAnswers']['SessionId'] = $sessionID;
               $dataResult['SurveyAnswers']['Questions'] = $questionDetails;                $dataResult['SurveyAnswers']['Questions'] = $questionDetails;
           }            }
   
           $returnData = $dataResult;            $returnData = $dataResult;
                         
           $jsonData = json_encode($returnData);            $jsonData = json_encode($returnData);
           Log::info($jsonData);            Log::info($jsonData);
   
           $returnASCII = $this->encode_items($returnData);            $returnASCII = $this->encode_items($returnData);
   
           $jsonDataASCII = json_encode($returnASCII);            $jsonDataASCII = json_encode($returnASCII);
           Log::info($jsonDataASCII);            Log::info($jsonDataASCII);
   
           // CALL to Recommendation API            // CALL to Recommendation API
           Log::info('Before recommendation called - '.$sessionID);            Log::info('Before recommendation called - '.$sessionID);
           $recommendation = $this->callRecommendation($returnASCII);            $recommendation = $this->callRecommendation($returnASCII);
                         
           $recommendationObj = json_decode($recommendation);            $recommendationObj = json_decode($recommendation);
           if (isset($recommendationObj->Result)) {            if (isset($recommendationObj->Result)) {
               $recommendationObj = $recommendationObj->Result;                $recommendationObj = $recommendationObj->Result;
           }            }
   
           if(isset($recommendationObj->Recommendation) && !empty($recommendationObj->Recommendation))            if(isset($recommendationObj->Recommendation) && !empty($recommendationObj->Recommendation))
           {            {
               Log::info('Recommendation is not empty- '.$sessionID);                Log::info('Recommendation is not empty- '.$sessionID);
   
               $updateData = $updateQuizUser = DB::table('quiz_user')->where(['session_id' => $sessionID])                $updateData = $updateQuizUser = DB::table('quiz_user')->where(['session_id' => $sessionID])
                   ->update(['recommended_at' => date('Y-m-d H:i:s')]);                    ->update(['recommended_at' => date('Y-m-d H:i:s')]);
   
   
               $lastInsertedId = DB::table('recommendations')->insertGetId(                $lastInsertedId = DB::table('recommendations')->insertGetId(
                   [                    [
                       'session_id' => $sessionID,                          'session_id' => $sessionID,  
                       'email' => isset($recommendationObj->Email) ? $recommendationObj->Email : '',                        'email' => isset($recommendationObj->Email) ? $recommendationObj->Email : '',
                       'first_name' => isset($recommendationObj->Firstname) ? $recommendationObj->Firstname : '',                        'first_name' => isset($recommendationObj->Firstname) ? $recommendationObj->Firstname : '',
                       'sex_profile' => $recommendationObj->SexProfile,                        'sex_profile' => $recommendationObj->SexProfile,
                       'sex' => $recommendationObj->Sex,                        'sex' => $recommendationObj->Sex,
                       'age' => $recommendationObj->Age,                        'age' => $recommendationObj->Age,
                       'zipcode' => $recommendationObj->ZipCode,                        'zipcode' => $recommendationObj->ZipCode,
                       'latitude' => $recommendationObj->Latitude,                        'latitude' => $recommendationObj->Latitude,
                       'longitude' => $recommendationObj->Longitude,                        'longitude' => $recommendationObj->Longitude,
                       'city' => $recommendationObj->City,                        'city' => $recommendationObj->City,
                       'state' => $recommendationObj->State,                        'state' => $recommendationObj->State,
                       'allergens' => json_encode($recommendationObj->Allergens),                        'allergens' => json_encode($recommendationObj->Allergens),
                       'deficiencies' => json_encode($recommendationObj->Deficiencies),                        'deficiencies' => json_encode($recommendationObj->Deficiencies),
                       'recommendation' => json_encode($recommendationObj->Recommendation),                        'recommendation' => json_encode($recommendationObj->Recommendation),
                       'buzz_words' => json_encode($recommendationObj->BuzzWordsTips),                        'buzz_words' => json_encode($recommendationObj->BuzzWordsTips),
                       'north37' => $recommendationObj->North37,                        'north37' => $recommendationObj->North37,
                       'prostate_interest' => $recommendationObj->ProstateInterest,                        'prostate_interest' => $recommendationObj->ProstateInterest,
                       'prenatal_interest' => $recommendationObj->PrenatalInterest,                        'prenatal_interest' => $recommendationObj->PrenatalInterest,
                       'postnatal_interest' => $recommendationObj->PostnatalInterest,                        'postnatal_interest' => $recommendationObj->PostnatalInterest,
                       'healthy_interest' => $recommendationObj->HealthyMentrualCycleInterest,                        'healthy_interest' => $recommendationObj->HealthyMentrualCycleInterest,
                       'perimenopause_interest' => $recommendationObj->PerimenopauseInterest,                        'perimenopause_interest' => $recommendationObj->PerimenopauseInterest,
                       'menopause_interest' => $recommendationObj->MenopauseInterest,                        'menopause_interest' => $recommendationObj->MenopauseInterest,
                       'planning_pregnancy' => $recommendationObj->PlanningPregnancy,                        'planning_pregnancy' => $recommendationObj->PlanningPregnancy,
                       'pregnant' => $recommendationObj->Pregnant,                        'pregnant' => $recommendationObj->Pregnant,
                       'breastfeeding' => $recommendationObj->Breastfeeding,                        'breastfeeding' => $recommendationObj->Breastfeeding,
                       'taking_medication' => $recommendationObj->TakingMedication,                        'taking_medication' => $recommendationObj->TakingMedication,
                       'blood_clotting_issue' => $recommendationObj->BloodClottingIssue,                        'blood_clotting_issue' => $recommendationObj->BloodClottingIssue,
                         
                   ]                    ]
               );                );
         
               if(empty($lastInsertedId))                if(empty($lastInsertedId))
               {                {
                   $returnData = [                    $returnData = [
                       'error' => 'Insertion Failed'                         'error' => 'Insertion Failed' 
                   ];                    ];
                 
                   return $this->helper->returnData(600, "error", $returnData );                    return $this->helper->returnData(600, "error", $returnData );
               }                }
         
               // For the tagging purpose                // For the tagging purpose
               $questionResponse = DB::select('                $questionResponse = DB::select('
                   select                    select
                       qm.id,                        qm.id,
                       qm.question,                        qm.question,
                       qr.response                        qr.response
                   from                    from
                       user_responses as ur                        user_responses as ur
                   join                    join
                       question_master as qm                        question_master as qm
                   on                    on
                       qm.id = ur.qn_id                        qm.id = ur.qn_id
                   left join                    left join
                       question_responses as qr                        question_responses as qr
                   on                    on
                       ur.response_id = qr.id                        ur.response_id = qr.id
                   where                    where
                       session_id = ? and ur.qn_id in (14,32)', [$sessionID]);                        session_id = ? and ur.qn_id in (14,32)', [$sessionID]);
         
               $tagQuestion = array();                $tagQuestion = array();
               if(!empty($questionResponse))                        if(!empty($questionResponse))        
               {                {
                   foreach($questionResponse as $qResponse)                    foreach($questionResponse as $qResponse)
                   {                    {
                       if(!isset($tagQuestion[$qResponse->id]))                        if(!isset($tagQuestion[$qResponse->id]))
                       {                        {
                           $tagQuestion[$qResponse->id][] = $qResponse->response;                            $tagQuestion[$qResponse->id][] = $qResponse->response;
                       }                        }
                       else{                        else{
                           $tagQuestion[$qResponse->id][] = $qResponse->response;                            $tagQuestion[$qResponse->id][] = $qResponse->response;
                       }                        }
                   }                    }
               }                }
               // Tag User                // Tag User
               $tagUser = dispatch(new TagUserJob($recommendation, $tagQuestion, $sessionID));                $tagUser = dispatch(new TagUserJob($recommendation, $tagQuestion, $sessionID));
   
               $recProducts = $recommendationObj->Recommendation;                $recProducts = $recommendationObj->Recommendation;
   
               if(!empty($recProducts)){                if(!empty($recProducts)){
                                         
                   foreach($recProducts as $recProd){                    foreach($recProducts as $recProd){
                                                 
                       $reason = array();                        $reason = array();
                       $reasonProduct  = $recProd->ReasonsForProduct;                        $reasonProduct  = $recProd->ReasonsForProduct;
   
                       if(!empty($reasonProduct)){                        if(!empty($reasonProduct)){
                           foreach($reasonProduct as $value){                            foreach($reasonProduct as $value){
                               $stripValue = preg_replace('/[^a-zA-Z0-9-;.,+"()%\/(&deg;) ]/', '', $value);                                $stripValue = preg_replace('/[^a-zA-Z0-9-;.,+"()%\/(&deg;) ]/', '', $value);
                               array_push($reason, $stripValue);                                array_push($reason, $stripValue);
                           }                            }
                           $recProd->ReasonsForProduct = $reason;                            $recProd->ReasonsForProduct = $reason;
                       }                        }
                   }                    }
               }                }
   
               $recommendationObj = json_decode($recommendation);                $recommendationObj = json_decode($recommendation);
               if (isset($recommendationObj->Result)) {                if (isset($recommendationObj->Result)) {
                   $recommendationObj = $recommendationObj->Result;                    $recommendationObj = $recommendationObj->Result;
               }                }
                                         
               $recommendationObj->Recommendation = $recProducts;                $recommendationObj->Recommendation = $recProducts;
   
               if(!empty($recommendationObj->Email)){                if(!empty($recommendationObj->Email)){
                                         
                   $triggerEmailRequest = array(                    $triggerEmailRequest = array(
                       "campaignId" => 882346,                        "campaignId" => 882346,
                       "recipientEmail" => $recommendationObj->Email                        "recipientEmail" => $recommendationObj->Email
                   );                    );
                   /* Trigger Email */                     /* Trigger Email */ 
                   /*$triggerEmailResponse = $this->triggerEmailTarget(json_encode($triggerEmailRequest));                    /*$triggerEmailResponse = $this->triggerEmailTarget(json_encode($triggerEmailRequest));
                   if(isset($triggerEmailResponse->code) && $triggerEmailResponse->code == 'Success'){                    if(isset($triggerEmailResponse->code) && $triggerEmailResponse->code == 'Success'){
                       Log::info('Mail sent successfully to '.$recommendationObj->Email);                        Log::info('Mail sent successfully to '.$recommendationObj->Email);
                       // Update the mail sent field to 1                            // Update the mail sent field to 1    
                       $updateQuizUser = DB::table('quiz_user')                        $updateQuizUser = DB::table('quiz_user')
                           ->where(['session_id' => $sessionID])                            ->where(['session_id' => $sessionID])
                           ->update(['mail_sent' => 1]);                            ->update(['mail_sent' => 1]);
                   }                    }
                   else{                    else{
                       Log::info('Mail not sent');                        Log::info('Mail not sent');
                       Log::info($triggerEmailResponse->code);                        Log::info($triggerEmailResponse->code);
                       Log::info($triggerEmailResponse->msg);                        Log::info($triggerEmailResponse->msg);
                   }*/                     }*/ 
                   /* End trigger email */                     /* End trigger email */ 
   
                   $eventRequest = array(                    $eventRequest = array(
                       "email" => $recommendationObj->Email,                        "email" => $recommendationObj->Email,
                       "eventName" => "Quiz Completion",                        "eventName" => "Quiz Completion",
                       // "campaignId" => 882346,                        // "campaignId" => 882346,
                       "dataFields" => array("userName" => $recommendationObj->Firstname)                        "dataFields" => array("userName" => $recommendationObj->Firstname)
                   );                    );
                    // Trigger Event                     // Trigger Event
                   $eventResponse = $this->createEvent(json_encode($eventRequest));                    $eventResponse = $this->createEvent(json_encode($eventRequest));
   
                   if(isset($eventResponse->code) && $eventResponse->code == 'Success'){                    if(isset($eventResponse->code) && $eventResponse->code == 'Success'){
                       Log::info('Event triggered successfully Please check mail : '.$recommendationObj->Email);                        Log::info('Event triggered successfully Please check mail : '.$recommendationObj->Email);
                   }                    }
                   else{                    else{
                       Log::info('Event not triggered');                        Log::info('Event not triggered');
                       // Log::info($eventResponse);                        // Log::info($eventResponse);
                       // Log::info($eventResponse->code);                        // Log::info($eventResponse->code);
                       // Log::info($eventResponse->msg);                        // Log::info($eventResponse->msg);
                   }                    }
                                         
               }                }
               return $this->helper->returnData(200, "success", json_decode($recommendation) );                return $this->helper->returnData(200, "success", json_decode($recommendation) );
         
           }            }
           else{            else{
               Log::info('Recommendation is empty- '.$sessionID);                Log::info('Recommendation is empty- '.$sessionID);
               $returnData = [                $returnData = [
                   'error' => 'Empty Recommendation'                     'error' => 'Empty Recommendation' 
               ];                ];
         
               return $this->helper->returnData(600, "error", $returnData );                return $this->helper->returnData(600, "error", $returnData );
           }            }
                         
       }        }
   
       if(empty($questionID)) {        if(empty($questionID)) {
           // error            // error
   
           $returnData = [            $returnData = [
               'error' => 'Quiz not found'                 'error' => 'Quiz not found' 
           ];            ];
   
           return $this->helper->returnData(600, "error", $returnData );            return $this->helper->returnData(600, "error", $returnData );
       }        }
   
       // To delete the already existing question and update the new record        // To delete the already existing question and update the new record
       $deleteQuizDetails = DB::table('user_responses')        $deleteQuizDetails = DB::table('user_responses')
                   ->where([                    ->where([
                       ['session_id', '=', $sessionID],                        ['session_id', '=', $sessionID],
                       ['qn_no', '>=', $questionNo]                        ['qn_no', '>=', $questionNo]
                   ])->delete();                    ])->delete();
   
       if(!empty($responseIds))        if(!empty($responseIds))
       {        {
           $lastInsertedId = null;            $lastInsertedId = null;
           foreach($responseIds as $responseId)            foreach($responseIds as $responseId)
           {            {
               $lastInsertedId = DB::table('user_responses')->insertGetId(                $lastInsertedId = DB::table('user_responses')->insertGetId(
                   [                    [
                       'session_id' => $sessionID,                        'session_id' => $sessionID,
                       'qn_id' => $questionID,                        'qn_id' => $questionID,
                       'qn_no' => $questionNo,                        'qn_no' => $questionNo,
                       'response_id' => $responseId,                        'response_id' => $responseId,
                       // 'response_text' => null,                        // 'response_text' => null,
                       'deleted' => 0,                        'deleted' => 0,
                       'status' => 0                        'status' => 0
                   ]                    ]
               );                );
           }            }
   
           if(empty($lastInsertedId))            if(empty($lastInsertedId))
           {            {
               $returnData = [                $returnData = [
                   'error' => 'Insertion Failed'                     'error' => 'Insertion Failed' 
               ];                ];
         
               return $this->helper->returnData(600, "error", $returnData );                return $this->helper->returnData(600, "error", $returnData );
           }            }
   
           $returnData = [            $returnData = [
               'stored' => true,                'stored' => true,
               'message' => 'success'                 'message' => 'success' 
           ];                        ];            
   
       }        }
       else        else
       {        {
                 
           $lastInsertedId = DB::table('user_responses')->insertGetId(            $lastInsertedId = DB::table('user_responses')->insertGetId(
               [                [
                   'session_id' => $sessionID,                    'session_id' => $sessionID,
                   'qn_id' => $questionID,                    'qn_id' => $questionID,
                   'qn_no' => $questionNo,                    'qn_no' => $questionNo,
                   'response_id' => null,                    'response_id' => null,
                   'response_text' => $responses[0],                    'response_text' => $responses[0],
                   'deleted' => 0,                    'deleted' => 0,
                   'status' => 0                    'status' => 0
               ]                ]
           );            );
   
           if(empty($lastInsertedId))            if(empty($lastInsertedId))
           {            {
               $returnData = [                $returnData = [
                   'error' => 'Insertion Failed'                     'error' => 'Insertion Failed' 
               ];                ];
         
               return $this->helper->returnData(600, "error", $returnData );                return $this->helper->returnData(600, "error", $returnData );
           }            }
   
           $returnData = [            $returnData = [
               'stored' => true,                'stored' => true,
               'message' => 'success'                 'message' => 'success' 
           ];            ];
   
       }        }
   
       if($page == 'email')        if($page == 'email')
       {        {
           Log::info('Inside email page - '.$sessionID);            Log::info('Inside email page - '.$sessionID);
           $email = isset($responses[0]) ? $responses[0] : '';            $email = isset($responses[0]) ? $responses[0] : '';
   
           if(empty($email))            if(empty($email))
           {            {
               $returnData = [                $returnData = [
                   'error' => 'Email is empty'                     'error' => 'Email is empty' 
               ];                ];
         
               return $this->helper->returnData(600, "error", $returnData );                return $this->helper->returnData(600, "error", $returnData );
           }            }
   
           $user = DB::table('users')->where('user_email', '=', $email)->get();            $user = DB::table('users')->where('user_email', '=', $email)->get();
   
           if(!isset($user[0]->user_email))            if(!isset($user[0]->user_email))
           {            {
               // create                // create
               $userName = '';                $userName = '';
               $userId = DB::table('users')->insertGetId([                $userId = DB::table('users')->insertGetId([
                   'user_email' => $email,                    'user_email' => $email,
                   'status' => 1                    'status' => 1
               ]);                ]);
   
               $quizId = DB::table('quiz_user')->select('id')->where([                $quizId = DB::table('quiz_user')->select('id')->where([
                   'session_id' => $sessionID                    'session_id' => $sessionID
               ])->value('id');                ])->value('id');
         
               if($quizId) {                if($quizId) {
                                         
                   $updateQuizUser = DB::table('quiz_user')->where(['id' => $quizId])                    $updateQuizUser = DB::table('quiz_user')->where(['id' => $quizId])
                       ->update(['user_id' => $userId]);                        ->update(['user_id' => $userId]);
         
               } else {                } else {
                   $quizId = DB::table('quiz_user')->insertGetId([                    $quizId = DB::table('quiz_user')->insertGetId([
                       'user_id' => $userId,                        'user_id' => $userId,
                       'session_id' => $sessionID,                        'session_id' => $sessionID,
                       'deleted' => 0,                        'deleted' => 0,
                       'status' => 0                        'status' => 0
                   ]);                    ]);
               }                }
         
   
               $userNameResponse =  DB::table('user_responses')->where([                $userNameResponse =  DB::table('user_responses')->where([
                   ['session_id', '=', $sessionID],                    ['session_id', '=', $sessionID],
                   ['qn_id', '=', '2']                    ['qn_id', '=', '2']
               ])->get();                ])->get();
   
               if($userNameResponse[0])                if($userNameResponse[0])
               {                {
                   $userName = $userNameResponse[0]->response_text;                    $userName = $userNameResponse[0]->response_text;
               }                }
   
               // Create customer in Shopify                // Create customer in Shopify
               $result = dispatch(new CreateShopifyCustomerJob($email, $userName));                $result = dispatch(new CreateShopifyCustomerJob($email, $userName));
           } else {            } else {
               $userId    = $user[0]->id;                $userId    = $user[0]->id;
               $quizId = DB::table('quiz_user')->select('id')->where([                $quizId = DB::table('quiz_user')->select('id')->where([
                   'session_id' => $sessionID                    'session_id' => $sessionID
               ])->value('id');                ])->value('id');
         
               if($quizId) {                if($quizId) {
                                         
                   $updateQuizUser = DB::table('quiz_user')->where(['id' => $quizId])                    $updateQuizUser = DB::table('quiz_user')->where(['id' => $quizId])
                       ->update(['user_id' => $userId]);                        ->update(['user_id' => $userId]);
         
               } else {                } else {
                   $quizId = DB::table('quiz_user')->insertGetId([                    $quizId = DB::table('quiz_user')->insertGetId([
                       'user_id' => $userId,                        'user_id' => $userId,
                       'session_id' => $sessionID,                        'session_id' => $sessionID,
                       'deleted' => 0,                        'deleted' => 0,
                       'status' => 0                        'status' => 0
                   ]);                    ]);
               }                }
           
           }            }
                         
           $returnData = [            $returnData = [
               'stored' => true,                'stored' => true,
               'message' => 'success'                 'message' => 'success' 
           ];            ];
   
       }        }
       return $this->helper->returnData(200, "success", $returnData );        return $this->helper->returnData(200, "success", $returnData );
                 
   }    }
   
   public function deleteQuiz(Request $request)    public function deleteQuiz(Request $request)
   {    {
       $quizId = $request->input('quizId');        $quizId = $request->input('quizId');
       $email = $request->input('email');        $email = $request->input('email');
       $userID = '';        $userID = '';
   
       if(empty($quizId))        if(empty($quizId))
       {        {
           $returnData = [            $returnData = [
               'error' => 'Invalid Quiz Id'                 'error' => 'Invalid Quiz Id' 
           ];            ];
   
           return $this->helper->returnData(600, "error", $returnData );            return $this->helper->returnData(600, "error", $returnData );
                         
       }        }
   
       $userData  = DB::table('users')->where('user_email', '=', $email)->get();        $userData  = DB::table('users')->where('user_email', '=', $email)->get();
       if(isset($userData[0]->id))        if(isset($userData[0]->id))
       {        {
           $userID = $userData[0]->id;            $userID = $userData[0]->id;
       }        }
       else        else
       {        {
           $returnData = [            $returnData = [
               'error' => 'Invalid Email Id'                 'error' => 'Invalid Email Id' 
           ];            ];
   
           return $this->helper->returnData(600, "error", $returnData );            return $this->helper->returnData(600, "error", $returnData );
       }        }
       if(!empty($userID))        if(!empty($userID))
       {        {
           $quizIds = array();            $quizIds = array();
           $quizzes = DB::table('quiz_user')->where('user_id', '=', $userID)->get();            $quizzes = DB::table('quiz_user')->where('user_id', '=', $userID)->get();
   
           if(!empty($quizzes))            if(!empty($quizzes))
           {            {
               foreach($quizzes as $quiz)                foreach($quizzes as $quiz)
               {                {
                   array_push($quizIds, $quiz->id);                    array_push($quizIds, $quiz->id);
               }                }
           }            }
   
           if(!in_array($quizId, $quizIds))            if(!in_array($quizId, $quizIds))
           {            {
               $returnData = [                $returnData = [
                   'error' => 'Quiz not exist in the server'                     'error' => 'Quiz not exist in the server' 
               ];                ];
         
               return $this->helper->returnData(600, "error", $returnData );                return $this->helper->returnData(600, "error", $returnData );
           }            }
   
           $updateQuiz = DB::table('quiz_user')            $updateQuiz = DB::table('quiz_user')
               ->where('id', $quizId)                ->where('id', $quizId)
               ->update(['deleted' => 1]);                ->update(['deleted' => 1]);
   
           if($updateQuiz == 1)  // success            if($updateQuiz == 1)  // success
           {            {
               $returnData = [                $returnData = [
                   'deleted' => true,                    'deleted' => true,
                   'message' => 'successfully deleted'                     'message' => 'successfully deleted' 
               ];                ];
   
               return $this->helper->returnData(200, "success", $returnData );                return $this->helper->returnData(200, "success", $returnData );
           }            }
           else            else
           {            {
               $returnData = [                $returnData = [
                   'error' => 'Quiz does not exist'                     'error' => 'Quiz does not exist' 
               ];                ];
   
               return $this->helper->returnData(600, "error", $returnData );                return $this->helper->returnData(600, "error", $returnData );
           }              }  
       }        }
   }    }
   
   public function getQuizzes(Request $request)    public function getQuizzes(Request $request)
   {    {
       $userEmail = $request->input('email');        $userEmail = $request->input('email');
       $records   = 6 ; //$request->input('records');        $records   = 6 ; //$request->input('records');
       $page      = empty($request->input('page')) ? 1 : $request->input('page');        $page      = empty($request->input('page')) ? 1 : $request->input('page');
   
       $userData  = DB::table('users')->where('user_email', '=', $userEmail)->get();                $userData  = DB::table('users')->where('user_email', '=', $userEmail)->get();        
                 
   
       if(isset($userData[0]->id))        if(isset($userData[0]->id))
       {        {
           $userID = $userData[0]->id;            $userID = $userData[0]->id;
       }        }
       else        else
       {        {
           $returnData = [            $returnData = [
               'error' => 'Invalid Email Id'                 'error' => 'Invalid Email Id' 
           ];            ];
   
           return $this->helper->returnData(600, "error", $returnData );            return $this->helper->returnData(600, "error", $returnData );
       }        }
   
       $userQuizCount = DB::table('quiz_user')        $userQuizCount = DB::table('quiz_user')
       ->select(        ->select(
           'quiz_user.id'                         'quiz_user.id'             
       )        )
       ->leftJoin('recommendations', 'quiz_user.session_id', '=', 'recommendations.session_id')              ->leftJoin('recommendations', 'quiz_user.session_id', '=', 'recommendations.session_id')      
       ->where([        ->where([
           ['quiz_user.user_id', '=', $userID],            ['quiz_user.user_id', '=', $userID],
           ['quiz_user.deleted', '=', '0'],            ['quiz_user.deleted', '=', '0'],
           ['quiz_user.status', '=', '1']                        ['quiz_user.status', '=', '1']            
       ])        ])
       ->whereNotNull('recommendations.recommendation')        ->whereNotNull('recommendations.recommendation')
       ->get()->count();        ->get()->count();
   
   
       $userQuizDetails = DB::table('quiz_user')        $userQuizDetails = DB::table('quiz_user')
       ->select(        ->select(
           'quiz_user.id',            'quiz_user.id',
           'quiz_user.session_id',            'quiz_user.session_id',
           'quiz_user.created_at',            'quiz_user.created_at',
           'quiz_user.updated_at',            'quiz_user.updated_at',
           'recommendations.recommendation'                       'recommendations.recommendation'           
       )        )
       ->leftJoin('recommendations', 'quiz_user.session_id', '=', 'recommendations.session_id')              ->leftJoin('recommendations', 'quiz_user.session_id', '=', 'recommendations.session_id')      
       ->where([        ->where([
           ['quiz_user.user_id', '=', $userID],            ['quiz_user.user_id', '=', $userID],
           ['quiz_user.deleted', '=', '0'],            ['quiz_user.deleted', '=', '0'],
           ['quiz_user.status', '=', '1']                        ['quiz_user.status', '=', '1']            
       ])        ])
       ->whereNotNull('recommendations.recommendation')        ->whereNotNull('recommendations.recommendation')
       ->orderBy('id', 'desc')            ->orderBy('id', 'desc')    
       ->limit($records)        ->limit($records)
       ->offset(($page-1)*$records)        ->offset(($page-1)*$records)
       ->get();            ->get();    
                 
   
       /*$userQuizCount = DB::table('quiz_user')->where([        /*$userQuizCount = DB::table('quiz_user')->where([
           ['user_id', '=', $userID],            ['user_id', '=', $userID],
           ['deleted', '=', '0'],            ['deleted', '=', '0'],
           ['status', '=', '1']            ['status', '=', '1']
       ])->get()->count();        ])->get()->count();
                 
       $userQuizDetails = DB::table('quiz_user')        $userQuizDetails = DB::table('quiz_user')
           ->where([            ->where([
                   ['user_id', '=', $userID],                    ['user_id', '=', $userID],
                   ['deleted', '=', '0'],                    ['deleted', '=', '0'],
                   ['status', '=', '1']                    ['status', '=', '1']
               ])                ])
           ->orderBy('id', 'asc')                ->orderBy('id', 'asc')    
           ->limit($records)            ->limit($records)
           ->offset(($page-1)*$records)            ->offset(($page-1)*$records)
           ->get();*/             ->get();*/ 
   
       $sessionIds = [];        $sessionIds = [];
   
       foreach($userQuizDetails as $uDetails){        foreach($userQuizDetails as $uDetails){
           array_push($sessionIds, $uDetails->session_id);            array_push($sessionIds, $uDetails->session_id);
       }              }      
                       
   
       $interests = [];        $interests = [];
       if(!empty($sessionIds)){        if(!empty($sessionIds)){
           $quizResponses = DB::table('user_responses')            $quizResponses = DB::table('user_responses')
           ->select(                            ->select(                
               'user_responses.session_id',                'user_responses.session_id',
               'user_responses.response_id',                'user_responses.response_id',
               'question_responses.response'                 'question_responses.response' 
           )            )
           ->leftJoin('question_responses','user_responses.response_id','=','question_responses.id')            ->leftJoin('question_responses','user_responses.response_id','=','question_responses.id')
           ->where('user_responses.qn_id','=','14')            ->where('user_responses.qn_id','=','14')
           ->whereIn('session_id',$sessionIds)                        ->whereIn('session_id',$sessionIds)            
           ->get();            ->get();
                         
           foreach($quizResponses as $data){            foreach($quizResponses as $data){
               $interests[$data->session_id][] = $data->response;                $interests[$data->session_id][] = $data->response;
           }            }
   
       }        }
   
   
       $quizDetailsArray = [];        $quizDetailsArray = [];
   
       $sessionIds = [];        $sessionIds = [];
       foreach($userQuizDetails as $userQuizDetail)        foreach($userQuizDetails as $userQuizDetail)
       {        {
           $quizId    = $userQuizDetail->id;            $quizId    = $userQuizDetail->id;
           $sessionID = $userQuizDetail->session_id;            $sessionID = $userQuizDetail->session_id;
           $recommendation  = $userQuizDetail->recommendation;            $recommendation  = $userQuizDetail->recommendation;
           $createdAt = $userQuizDetail->created_at;            //$createdAt = $userQuizDetail->created_at;
           $updatedAt = $userQuizDetail->updated_at;                          //$updatedAt = $userQuizDetail->updated_at;  
   
             $createdAt = new Carbon($userQuizDetail->created_at, 'America/Los_Angeles');  
             $createdAt = $createdAt->tz('utc');  
   
             $updatedAt = new Carbon($userQuizDetail->updated_at, 'America/Los_Angeles');  
             $updatedAt = $updatedAt->tz('utc');              
                         
           $temp = [];            $temp = [];
           $temp['quizID']    = $quizId;            $temp['quizID']    = $quizId;
           $temp['sessionID'] = $sessionID;            $temp['sessionID'] = $sessionID;
           $temp['startDate'] = $createdAt;                      $temp['startDate'] = $createdAt;          
           $temp['endDate']   = $updatedAt;            $temp['endDate']   = $updatedAt;
   
           if(isset($interests[$sessionID])){                                if(isset($interests[$sessionID])){                    
               $temp['interests'] = $interests[$sessionID];                                $temp['interests'] = $interests[$sessionID];                
           }            }
   
           $quizDetailsArray[] = $temp;            $quizDetailsArray[] = $temp;
                         
       }        }
   
   
   
       if(($records * $page) < $userQuizCount)        if(($records * $page) < $userQuizCount)
       {        {
           $hasNext = true;            $hasNext = true;
       }        }
       else{        else{
           $hasNext = false;            $hasNext = false;
       }        }
   
       $returnData = [        $returnData = [
           'email' => $userEmail,            'email' => $userEmail,
           'totalRecords' => $userQuizCount,            'totalRecords' => $userQuizCount,
           'pageSize' => $records,            'pageSize' => $records,
           'pageNumber' => $page,            'pageNumber' => $page,
           'hasNext' => $hasNext,            'hasNext' => $hasNext,
           'quizzes' => $quizDetailsArray            'quizzes' => $quizDetailsArray
       ];        ];
       return $this->helper->returnData(200, "success", $returnData );              return $this->helper->returnData(200, "success", $returnData );      
   
   }    }
   
   function getRecommendation(Request $request)    function getRecommendation(Request $request)
   {    {
       $sessionID = $request->input('sessionID');        $sessionID = $request->input('sessionID');
   
       if(!empty($sessionID))        if(!empty($sessionID))
       {        {
           $results = DB::select('            $results = DB::select('
               select                select
                   recommendation                    recommendation
               from                from
                   recommendations                    recommendations
               where                where
                   session_id = ?', [$sessionID]);                    session_id = ?', [$sessionID]);
   
           if(isset($results[0]->recommendation))            if(isset($results[0]->recommendation))
           {            {
               $returnData = [                $returnData = [
                   'recommendation' => $results[0]->recommendation,                    'recommendation' => $results[0]->recommendation,
                                     
               ];                ];
               return $this->helper->returnData(200, "success", $returnData );                    return $this->helper->returnData(200, "success", $returnData );    
           }            }
           else            else
           {            {
               $returnData = [                $returnData = [
                   'error' => "No recommendation for the given SessionID",                    'error' => "No recommendation for the given SessionID",
                                     
               ];                ];
               return $this->helper->returnData(200, "error", $returnData );                return $this->helper->returnData(200, "error", $returnData );
           }            }
       }        }
       else{        else{
   
           $returnData = [            $returnData = [
               'error' => 'Invalid Session Id'                 'error' => 'Invalid Session Id' 
           ];            ];
           return $this->helper->returnData(200, "error", $returnData );            return $this->helper->returnData(200, "error", $returnData );
       }        }
                 
                 
   }    }
   
   public function getQuizDetails(Request $request)    public function getQuizDetails(Request $request)
   {    {
       // $quizId = $request->input('quizId');        // $quizId = $request->input('quizId');
       $sessionID = $request->input('sessionID');        $sessionID = $request->input('sessionID');
   
       $results = DB::select('        $results = DB::select('
       select        select
           qm.id,            qm.id,
           qm.question,            qm.question,
           IFNULL(qr.response,ur.response_text) as response,            IFNULL(qr.response,ur.response_text) as response,
           qm.page            qm.page
       from        from
           user_responses as ur            user_responses as ur
       join        join
           question_master as qm            question_master as qm
       on        on
           qm.id = ur.qn_id            qm.id = ur.qn_id
       left join        left join
           question_responses as qr            question_responses as qr
       on        on
           ur.response_id = qr.id            ur.response_id = qr.id
       where        where
           session_id = ?', [$sessionID]);            session_id = ?', [$sessionID]);
   
       $dataResult = [];        $dataResult = [];
       $details = [];        $details = [];
                 
       foreach($results as $result)        foreach($results as $result)
       {        {
           $questionId   = $result->id;            $questionId   = $result->id;
           $questionText = $result->question;            $questionText = $result->question;
           $answerText   = $result->response;            $answerText   = $result->response;
           $questionHandle = $result->page;            $questionHandle = $result->page;
   
           $temp = [];            $temp = [];
                       
           if (!isset($details[$questionId])){            if (!isset($details[$questionId])){
               $details[$questionId] = [];                $details[$questionId] = [];
               $details[$questionId]['QuestionNo']   = $questionId;                $details[$questionId]['QuestionNo']   = $questionId;
               $details[$questionId]['QuestionText'] = $questionText;                $details[$questionId]['QuestionText'] = $questionText;
               $details[$questionId]['QuestionHandle'] = $questionHandle;                $details[$questionId]['QuestionHandle'] = $questionHandle;
           }            }
                         
           $details[$questionId]['AnswerText'][]= $answerText;            $details[$questionId]['AnswerText'][]= $answerText;
       }        }
   
       $questionDetails['Questions'] = $details;        $questionDetails['Questions'] = $details;
       $dataResult['SessionId']      = $sessionID;        $dataResult['SessionId']      = $sessionID;
       $dataResult['SurveyAnswers']  = $questionDetails;        $dataResult['SurveyAnswers']  = $questionDetails;
                 
       $returnData = $dataResult;        $returnData = $dataResult;
   
       return $this->helper->returnData(200, "success", $returnData );        return $this->helper->returnData(200, "success", $returnData );
   }    }
   
   function callRecommendation($request)    function callRecommendation($request)
   {    {
       if(!empty($request)){        if(!empty($request)){
   
           //$url = 'http://nurishappd2/api/recommendation';            //$url = 'http://nurishappd2/api/recommendation';
           // $url = 'http://dev-nurishalgorithm.pharmavite.pharmcorp.net/api/recommendation';            // $url = 'http://dev-nurishalgorithm.pharmavite.pharmcorp.net/api/recommendation';
           $url = Config::get('recommendation.recommendationUrl');            $url = Config::get('recommendation.recommendationUrl');
           $type = 'POST';            $type = 'POST';
           $api_key = null;            $api_key = null;
           $api_passwd = null;            $api_passwd = null;
                         
           return $this->executeCurl($url, $type, $request, $api_key, $api_passwd);            return $this->executeCurl($url, $type, $request, $api_key, $api_passwd);
       }        }
       else{        else{
           return null;            return null;
       }        }
   }    }
   
   function callGetPack($request)    function callGetPack($request)
   {    {
       if(!empty($request)){        if(!empty($request)){
   
           // $url = 'http://dev-nurishatp2.pharmavite.pharmcorp.net/api/packs';            // $url = 'http://dev-nurishatp2.pharmavite.pharmcorp.net/api/packs';
           $url = Config::get('recommendation.packUrl');            $url = Config::get('recommendation.packUrl');
           $type = 'POST';            $type = 'POST';
           $api_key = null;            $api_key = null;
           $api_passwd = null;            $api_passwd = null;
                         
           return $this->executeCurl($url, $type, $request, $api_key, $api_passwd);            return $this->executeCurl($url, $type, $request, $api_key, $api_passwd);
       }        }
       else{        else{
           return null;            return null;
       }        }
   }    }
   
   function executeCurl($url,$type,$data,$api_key,$api_passwd)    function executeCurl($url,$type,$data,$api_key,$api_passwd)
   {    {
       // $str     = $api_key.":".$api_passwd;        // $str     = $api_key.":".$api_passwd;
       // $authKey = base64_encode($str);        // $authKey = base64_encode($str);
                 
       $ch = curl_init();        $ch = curl_init();
       // curl_setopt($ch, CURLOPT_USERPWD, "$api_key:$api_passwd");        // curl_setopt($ch, CURLOPT_USERPWD, "$api_key:$api_passwd");
       curl_setopt($ch, CURLOPT_URL, $url);        curl_setopt($ch, CURLOPT_URL, $url);
       curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
       curl_setopt($ch, CURLOPT_HEADER, FALSE);        curl_setopt($ch, CURLOPT_HEADER, FALSE);
       curl_setopt($ch, CURLOPT_HTTPHEADER, array(        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
               "Content-Type: application/json"                 "Content-Type: application/json" 
               // "Authorization: Basic ".$authKey                // "Authorization: Basic ".$authKey
       ));        ));
       curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); // temporarily disable SSL verification        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); // temporarily disable SSL verification
       curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // temporarily disable SSL verification        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // temporarily disable SSL verification
   
       if ($type == "POST"){        if ($type == "POST"){
           curl_setopt($ch, CURLOPT_POST, TRUE);            curl_setopt($ch, CURLOPT_POST, TRUE);
           $json = json_encode(new ArrayValue($data));            $json = json_encode(new ArrayValue($data));
           $payload = '"' . addslashes($json) . '"';            $payload = '"' . addslashes($json) . '"';
           curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);            curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
       }        }
               
      if($type == "PUT"){       if($type == "PUT"){
           curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");            curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
           $json = json_encode(new ArrayValue($data));            $json = json_encode(new ArrayValue($data));
           $payload = '"' . addslashes($json) . '"';            $payload = '"' . addslashes($json) . '"';
           curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);            curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
      }       }
   
       $result = curl_exec($ch);        $result = curl_exec($ch);
   
   
       if(curl_errno($ch)){        if(curl_errno($ch)){
           echo 'Request Error:' . curl_error($ch);            echo 'Request Error:' . curl_error($ch);
           return false;            return false;
       }        }
                 
       Log::info("curl result  => ".$result);        Log::info("curl result  => ".$result);
       return $result;        return $result;
   }    }
   
   function addExitTag(Request $request){    function addExitTag(Request $request){
   
       $api = new BasicShopifyAPI();        $api = new BasicShopifyAPI();
   
       $password   = Config::get('shopify.password');        $password   = Config::get('shopify.password');
       $shopDomain = Config::get('shopify.shopDomain');        $shopDomain = Config::get('shopify.shopDomain');
   
       $api->setShop($shopDomain);        $api->setShop($shopDomain);
       $api->setAccessToken($password);        $api->setAccessToken($password);
   
       Log::info($request->input());        Log::info($request->input());
                 
       $email = $request->input('email');        $email = $request->input('email');
       $exitTag = $request->input('tag');        $exitTag = $request->input('tag');
       $sessionID = $request->input('sessionID');        $sessionID = $request->input('sessionID');
       $questionID = $request->input('questionID');        $questionID = $request->input('questionID');
       $questionNo = $request->input('questionNo');        $questionNo = $request->input('questionNo');
       $responseID = $request->input('responseID');        $responseID = $request->input('responseID');
   
       Log::info($exitTag);        Log::info($exitTag);
   
       if(empty($sessionID)){        if(empty($sessionID)){
           $returnData = [            $returnData = [
               'error' => 'Parameter missing - sessionID'                 'error' => 'Parameter missing - sessionID' 
           ];            ];
   
           return $this->helper->returnData(600, "error", $returnData );            return $this->helper->returnData(600, "error", $returnData );
       }        }
   
       if(empty($email)){        if(empty($email)){
           $returnData = [            $returnData = [
               'error' => 'Parameter missing - email'                 'error' => 'Parameter missing - email' 
           ];            ];
   
           return $this->helper->returnData(600, "error", $returnData );            return $this->helper->returnData(600, "error", $returnData );
       }        }
   
       if(empty($exitTag)){        if(empty($exitTag)){
           $returnData = [            $returnData = [
               'error' => 'Parameter missing - tag'                 'error' => 'Parameter missing - tag' 
           ];            ];
   
           return $this->helper->returnData(600, "error", $returnData );            return $this->helper->returnData(600, "error", $returnData );
       }          }  
                 
       if(empty($questionID)){        if(empty($questionID)){
           $returnData = [            $returnData = [
               'error' => 'Parameter missing - questionID'                 'error' => 'Parameter missing - questionID' 
           ];            ];
   
           return $this->helper->returnData(600, "error", $returnData );            return $this->helper->returnData(600, "error", $returnData );
       }        }
   
       if(empty($responseID)){        if(empty($responseID)){
           $returnData = [            $returnData = [
               'error' => 'Parameter missing - responseID'                 'error' => 'Parameter missing - responseID' 
           ];            ];
   
           return $this->helper->returnData(600, "error", $returnData );            return $this->helper->returnData(600, "error", $returnData );
       }        }
                 
       $userEmailDetails = DB::select('        $userEmailDetails = DB::select('
           select            select
               u.user_email                u.user_email
           from            from
               quiz_user as qr                quiz_user as qr
           join            join
               users as u                users as u
           on            on
               u.id = qr.user_id                u.id = qr.user_id
           where            where
               qr.session_id = ?', [$sessionID]);                qr.session_id = ?', [$sessionID]);
   
       if(!isset($userEmailDetails[0]->user_email)){        if(!isset($userEmailDetails[0]->user_email)){
                         
           $returnData = [            $returnData = [
               'error' => 'email not matching with sesssionID'                 'error' => 'email not matching with sesssionID' 
           ];            ];
   
           return $this->helper->returnData(600, "error", $returnData );            return $this->helper->returnData(600, "error", $returnData );
       }        }
   
       if($userEmailDetails[0]->user_email == $email){        if($userEmailDetails[0]->user_email == $email){
   
   
           /** send email for exit tag cases */             /** send email for exit tag cases */ 
           if(!empty($email)){            if(!empty($email)){
                                         
                   $triggerEmailRequest = array(                    $triggerEmailRequest = array(
                       "campaignId" => 882346,                        "campaignId" => 882346,
                       "recipientEmail" => $email                        "recipientEmail" => $email
                   );                    );
   
                   /* Trigger email */                     /* Trigger email */ 
                   /*$triggerEmailResponse = $this->triggerEmailTarget(json_encode($triggerEmailRequest));                    /*$triggerEmailResponse = $this->triggerEmailTarget(json_encode($triggerEmailRequest));
                   if(isset($triggerEmailResponse->code) && $triggerEmailResponse->code == 'Success'){                    if(isset($triggerEmailResponse->code) && $triggerEmailResponse->code == 'Success'){
                       Log::info('Mail sent successfully to '.$email);                        Log::info('Mail sent successfully to '.$email);
   
                       $updateQuizUser = DB::table('quiz_user')                        $updateQuizUser = DB::table('quiz_user')
                           ->where(['session_id' => $sessionID])                            ->where(['session_id' => $sessionID])
                           ->update(['mail_sent' => 1]);                            ->update(['mail_sent' => 1]);
                   }                    }
                   else{                    else{
                       Log::info('Mail not sent');                        Log::info('Mail not sent');
                       Log::info($triggerEmailResponse->code);                        Log::info($triggerEmailResponse->code);
                       Log::info($triggerEmailResponse->msg);                        Log::info($triggerEmailResponse->msg);
                   }*/                     }*/ 
                   /* End trigger email */                     /* End trigger email */ 
   
                   $eventTag = '';                    $eventTag = '';
   
                   if($exitTag == "exit-surgery"){                    if($exitTag == "exit-surgery"){
                       $eventTag = 'Quiz Surgery';                        $eventTag = 'Quiz Surgery';
                   } elseif ($exitTag == "exit-veganDiet"){                    } elseif ($exitTag == "exit-veganDiet"){
                       $eventTag = 'quizExit-Vegan';                        $eventTag = 'quizExit-Vegan';
                   } else if ($exitTag == "exit-vegetarianDiet"){                    } else if ($exitTag == "exit-vegetarianDiet"){
                       $eventTag = 'quizExit-Vegetarian';                        $eventTag = 'quizExit-Vegetarian';
                   }                    }
   
                   $eventRequest = array(                    $eventRequest = array(
                       "email" => $email,                        "email" => $email,
                       "eventName" => $eventTag,                        "eventName" => $eventTag,
                       // "campaignId" => 882346,                        // "campaignId" => 882346,
                       "dataFields" => array("userName" => "")                        "dataFields" => array("userName" => "")
                   );                    );
                    // Trigger Event                     // Trigger Event
                   $eventResponse = $this->createEvent(json_encode($eventRequest));                    $eventResponse = $this->createEvent(json_encode($eventRequest));
   
                   if(isset($eventResponse->code) && $eventResponse->code == 'Success'){                    if(isset($eventResponse->code) && $eventResponse->code == 'Success'){
                       Log::info('Event triggered successfully Please check mail : '.$email);                        Log::info('Event triggered successfully Please check mail : '.$email);
                   }                    }
                   else{                    else{
                       Log::info('Event not triggered');                        Log::info('Event not triggered');
                       Log::info($eventResponse);                        Log::info($eventResponse);
                       Log::info($eventResponse->code);                        Log::info($eventResponse->code);
                       Log::info($eventResponse->msg);                        Log::info($eventResponse->msg);
                   }                    }
                                         
           }            }
                         
           /* send email for exit tag cases*/             /* send email for exit tag cases*/ 
   
   
           $params = NULL;            $params = NULL;
           $result = $api->rest('GET',            $result = $api->rest('GET',
                   htmlentities('/admin/customers/search.json?query=email:'.$email), $params);                    htmlentities('/admin/customers/search.json?query=email:'.$email), $params);
                         
           if(!isset($result->body->customers[0]) || empty($result->body->customers[0])) {            if(!isset($result->body->customers[0]) || empty($result->body->customers[0])) {
                                 
               $returnData = [                $returnData = [
                   'error' => 'email not found'                     'error' => 'email not found' 
               ];                ];
         
               return $this->helper->returnData(600, "error", $returnData );                return $this->helper->returnData(600, "error", $returnData );
           }            }
                         
           $customerId = $result->body->customers[0]->id;            $customerId = $result->body->customers[0]->id;
           $tags = $result->body->customers[0]->tags;            $tags = $result->body->customers[0]->tags;
         
           $newTags = $tags.",".$exitTag;            $newTags = $tags.",".$exitTag;
         
           $params = array(            $params = array(
               'customer' => array(                'customer' => array(
                   'id' => $customerId,                    'id' => $customerId,
                   'tags' => $newTags                      'tags' => $newTags  
               )                )
           );            );
           Log::info($params);            Log::info($params);
           $lastInsertedId = null;            $lastInsertedId = null;
   
           $lastInsertedId = DB::table('user_responses')->insertGetId(            $lastInsertedId = DB::table('user_responses')->insertGetId(
               [                [
                   'session_id' => $sessionID,                    'session_id' => $sessionID,
                   'qn_id' => $questionID,                    'qn_id' => $questionID,
                   'qn_no' => $questionNo,                    'qn_no' => $questionNo,
                   'response_id' => $responseID,                    'response_id' => $responseID,
                   // 'response_text' => null,                    // 'response_text' => null,
                   'deleted' => 0,                    'deleted' => 0,
                   'status' => 0                    'status' => 0
               ]                ]
           );            );
   
           if(empty($lastInsertedId))            if(empty($lastInsertedId))
           {            {
               $returnData = [                $returnData = [
                   'error' => 'Insertion Failed'                     'error' => 'Insertion Failed' 
               ];                ];
         
               return $this->helper->returnData(600, "error", $returnData );                return $this->helper->returnData(600, "error", $returnData );
           }            }
                         
           $updateQuizUser = DB::table('quiz_user')            $updateQuizUser = DB::table('quiz_user')
               ->where('session_id', $sessionID)                ->where('session_id', $sessionID)
               ->update(['status' => 1]);                ->update(['status' => 1]);
   
   
           //try maximum three times in case of unexpected response            //try maximum three times in case of unexpected response
           $try = 1;            $try = 1;
           $retry = false;            $retry = false;
           do{            do{
               $result = $api->rest('PUT', '/admin/customers/'.$customerId.'.json', $params);                $result = $api->rest('PUT', '/admin/customers/'.$customerId.'.json', $params);
               if(!isset($result->body->customer->id)){                if(!isset($result->body->customer->id)){
                   $retry = true;                    $retry = true;
                   $try++;                    $try++;
               }                }
           } while($retry && $try <=3);            } while($retry && $try <=3);
                         
           //return error            //return error
           if(!isset($result->body->customer->id)){            if(!isset($result->body->customer->id)){
               $returnData = [                $returnData = [
                   'error' => 'No such customer'                     'error' => 'No such customer' 
               ];                ];
         
               return $this->helper->returnData(600, "error", $returnData );                return $this->helper->returnData(600, "error", $returnData );
           }            }
                         
           //success            //success
           $returnData = [            $returnData = [
               'success' => 'Successfully updated'                 'success' => 'Successfully updated' 
           ];            ];
         
           return $this->helper->returnData(200, "success", $returnData );            return $this->helper->returnData(200, "success", $returnData );
       }          }  
   }    }
   
   function getPackCount(Request $request)    function getPackCount(Request $request)
   {    {
       $postData = $request->input();        $postData = $request->input();
   
       if(empty($postData)) {        if(empty($postData)) {
           $returnData = [            $returnData = [
               'error' => 'Empty parameters'                 'error' => 'Empty parameters' 
           ];            ];
   
           return $this->helper->returnData(600, "error", $returnData );            return $this->helper->returnData(600, "error", $returnData );
       }        }
   
       $packRequest['ProductItems'] = array();        $packRequest['ProductItems'] = array();
   
       foreach($postData as $data) {        foreach($postData as $data) {
           $bulkID = isset($data['bulkID']) ? $data['bulkID'] : '';            $bulkID = isset($data['bulkID']) ? $data['bulkID'] : '';
           $qty = isset($data['qty']) ? $data['qty'] : '';            $qty = isset($data['qty']) ? $data['qty'] : '';
   
           if(empty($bulkID)) {            if(empty($bulkID)) {
               $returnData = [                $returnData = [
                   'error' => 'Empty parameter value - bulkID'                     'error' => 'Empty parameter value - bulkID' 
               ];                ];
         
               return $this->helper->returnData(600, "error", $returnData );                return $this->helper->returnData(600, "error", $returnData );
           }            }
   
           if(empty($qty)) {            if(empty($qty)) {
               $returnData = [                $returnData = [
                   'error' => 'Empty parameter value - qty'                     'error' => 'Empty parameter value - qty' 
               ];                ];
         
               return $this->helper->returnData(600, "error", $returnData );                return $this->helper->returnData(600, "error", $returnData );
           }            }
   
           if($bulkID == 'vitamin-pack')            if($bulkID == 'vitamin-pack')
           {            {
               continue;                continue;
           }            }
   
           $tempPackRequest['BulkItem'] = $bulkID;            $tempPackRequest['BulkItem'] = $bulkID;
           $tempPackRequest['Quantity'] = $qty;            $tempPackRequest['Quantity'] = $qty;
           array_push($packRequest['ProductItems'], $tempPackRequest);            array_push($packRequest['ProductItems'], $tempPackRequest);
   
       }        }
   
       if(empty($packRequest['ProductItems'])) {        if(empty($packRequest['ProductItems'])) {
                         
           $returnData = [            $returnData = [
               'error' => 'Empty ProductItems'                 'error' => 'Empty ProductItems' 
           ];            ];
   
           return $this->helper->returnData(600, "error", $returnData );            return $this->helper->returnData(600, "error", $returnData );
       }        }
   
   
       $returnASCII = $this->encode_items($packRequest);        $returnASCII = $this->encode_items($packRequest);
       $packDetails = $this->callGetPack($returnASCII);        $packDetails = $this->callGetPack($returnASCII);
   
       if(strpos($packDetails, 'Packs') !== false){        if(strpos($packDetails, 'Packs') !== false){
           $stripData = explode("Packs", $packDetails );            $stripData = explode("Packs", $packDetails );
           $packData = $stripData[1];            $packData = $stripData[1];
           $packData = ltrim($packData, ":");            $packData = ltrim($packData, ":");
           $packData = rtrim($packData, "}");            $packData = rtrim($packData, "}");
                         
           $returnData = [            $returnData = [
               'Pack' => $packData                'Pack' => $packData
           ];            ];
   
           return $this->helper->returnData(200, "success", $returnData );            return $this->helper->returnData(200, "success", $returnData );
         
       } else {        } else {
           $returnData = [            $returnData = [
               'error' => 'No Pack details'                 'error' => 'No Pack details' 
           ];            ];
   
           return $this->helper->returnData(600, "error", $returnData );            return $this->helper->returnData(600, "error", $returnData );
       }        }
                 
   }    }
   
   function encode_items($array)    function encode_items($array)
   {    {
       foreach($array as $key => $value)        foreach($array as $key => $value)
       {        {
           if(is_array($value))            if(is_array($value))
           {            {
               $array[$key] = $this->encode_items($value);                $array[$key] = $this->encode_items($value);
           }            }
           else            else
           {            {
               $array[$key] = mb_convert_encoding($value, 'ASCII');                $array[$key] = mb_convert_encoding($value, 'ASCII');
           }            }
       }        }
   
       return $array;        return $array;
   }    }
   
   public function retakeQuiz(Request $request)    public function retakeQuiz(Request $request)
   {    {
       $page         = $request->input('page');        $page         = $request->input('page');
       $sessionID    = $request->input('sessionID');        $sessionID    = $request->input('sessionID');
       $question     = $request->input('question');        $question     = $request->input('question');
       $questionID   = $request->input('questionID');        $questionID   = $request->input('questionID');
       $questionNo   = $request->input('questionNo');        $questionNo   = $request->input('questionNo');
       $responses    = $request->input('responses');        $responses    = $request->input('responses');
       $responseIds  = $request->input('responseIDs');        $responseIds  = $request->input('responseIDs');
       $responseKeys = $request->input('responseKeys');        $responseKeys = $request->input('responseKeys');
       $email        = $request->input('email');        $email        = $request->input('email');
   
       $retakeID     = $request->input('retakeID');        $retakeID     = $request->input('retakeID');
   
       if($retakeID)        if($retakeID)
       {        {
           $recordDetails = $this->getQuizData($sessionID);            $recordDetails = $this->getQuizData($sessionID);
   
           if(empty($recordDetails)){            if(empty($recordDetails)){
   
               if(!empty($email))                if(!empty($email))
               {                {
                   $retakeUserID = DB::table('users')->select('id')->where([                    $retakeUserID = DB::table('users')->select('id')->where([
                       'user_email' => $email                        'user_email' => $email
                       ])->value('id');                        ])->value('id');
   
                   if(empty($retakeUserID)){                    if(empty($retakeUserID)){
                       $returnData = [                        $returnData = [
                           'error' => 'Could not found existing User details'                             'error' => 'Could not found existing User details' 
                       ];                        ];
         
                       return $this->helper->returnData(600, "error", $returnData );                        return $this->helper->returnData(600, "error", $returnData );
                   }                    }
   
                   $quizId = DB::table('quiz_user')->insertGetId([                    $quizId = DB::table('quiz_user')->insertGetId([
                       'user_id' => $retakeUserID,                        'user_id' => $retakeUserID,
                       'session_id' => $sessionID,                        'session_id' => $sessionID,
                       'deleted' => 0,                        'deleted' => 0,
                       'status' => 0                        'status' => 0
                   ]);                    ]);
   
               }                }
   
               $recordDetails = $this->getQuizData($retakeID);                $recordDetails = $this->getQuizData($retakeID);
   
               if(empty($recordDetails))                if(empty($recordDetails))
               {                {
                   $returnData = [                    $returnData = [
                       'error' => 'Could not found existing Quiz details'                         'error' => 'Could not found existing Quiz details' 
                   ];                    ];
   
                   return $this->helper->returnData(600, "error", $returnData );                    return $this->helper->returnData(600, "error", $returnData );
               }                }
   
               $retakeQuestionData = $recordDetails['SurveyAnswers']['Questions'][$questionID];                $retakeQuestionData = $recordDetails['SurveyAnswers']['Questions'][$questionID];
               $retakeResponseData = $recordDetails['SurveyAnswers']['Questions'];                $retakeResponseData = $recordDetails['SurveyAnswers']['Questions'];
   
               foreach($retakeResponseData as $key => $value){                foreach($retakeResponseData as $key => $value){
   
                   $answerIds  = null;                    $answerIds  = null;
                   if(isset($value['AnswerID'])){                    if(isset($value['AnswerID'])){
                       $answerIds  = $value['AnswerID'];                        $answerIds  = $value['AnswerID'];
                   }                    }
                                         
                   $answerText = $value['AnswerText'];                    $answerText = $value['AnswerText'];
                   $questNo = $value['QuestionNo'];                    $questNo = $value['QuestionNo'];
                   $questId = $value['QuestionId'];                    $questId = $value['QuestionId'];
   
                   if($key < $questionNo)                    if($key < $questionNo)
                   {                    {
                       if(!empty($answerIds))                        if(!empty($answerIds))
                       {                        {
                           $lastInsertedId = null;                            $lastInsertedId = null;
                           foreach($answerIds as $answerId)                            foreach($answerIds as $answerId)
                           {                            {
                               $lastInsertedId = DB::table('user_responses')->insertGetId(                                $lastInsertedId = DB::table('user_responses')->insertGetId(
                                   [                                    [
                                       'session_id' => $sessionID,                                        'session_id' => $sessionID,
                                       'qn_id' => $questId,                                        'qn_id' => $questId,
                                       'qn_no' => $questNo,                                        'qn_no' => $questNo,
                                       'response_id' => $answerId,                                        'response_id' => $answerId,
                                       // 'response_text' => null,                                        // 'response_text' => null,
                                       'deleted' => 0,                                        'deleted' => 0,
                                       'status' => 0                                        'status' => 0
                                   ]                                    ]
                               );                                );
                           }                            }
                                 
                           if(empty($lastInsertedId))                            if(empty($lastInsertedId))
                           {                            {
                               $returnData = [                                $returnData = [
                                   'error' => 'Insertion Failed'                                     'error' => 'Insertion Failed' 
                               ];                                ];
                                         
                               return $this->helper->returnData(600, "error", $returnData );                                return $this->helper->returnData(600, "error", $returnData );
                           }                            }
                                 
                           $returnData = [                            $returnData = [
                               'stored' => true,                                'stored' => true,
                               'message' => 'success'                                 'message' => 'success' 
                           ];                                        ];            
                                 
                       }                        }
                       else                        else
                       {                        {
                           $lastInsertedId = DB::table('user_responses')->insertGetId(                            $lastInsertedId = DB::table('user_responses')->insertGetId(
                               [                                [
                                   'session_id' => $sessionID,                                    'session_id' => $sessionID,
                                   'qn_id' => $questId,                                    'qn_id' => $questId,
                                   'qn_no' => $questNo,                                    'qn_no' => $questNo,
                                   'response_id' => null,                                    'response_id' => null,
                                   'response_text' => $answerText[0],                                    'response_text' => $answerText[0],
                                   'deleted' => 0,                                    'deleted' => 0,
                                   'status' => 0                                    'status' => 0
                               ]                                ]
                           );                            );
                                 
                           if(empty($lastInsertedId))                            if(empty($lastInsertedId))
                           {                            {
                               $returnData = [                                $returnData = [
                                   'error' => 'Insertion Failed'                                     'error' => 'Insertion Failed' 
                               ];                                ];
                                         
                               return $this->helper->returnData(600, "error", $returnData );                                return $this->helper->returnData(600, "error", $returnData );
                           }                            }
                                 
                           $returnData = [                            $returnData = [
                               'stored' => true,                                'stored' => true,
                               'message' => 'success'                                 'message' => 'success' 
                           ];                            ];
                                 
                       }                        }
                   }                    }
   
                   if($questionNo == $key)                    if($questionNo == $key)
                   {                    {
   
                       if(!empty($responseIds))                        if(!empty($responseIds))
                       {                        {
                           $lastInsertedId = null;                            $lastInsertedId = null;
                           foreach($responseIds as $responseId)                            foreach($responseIds as $responseId)
                           {                            {
   
                               $lastInsertedId = DB::table('user_responses')->insertGetId(                                $lastInsertedId = DB::table('user_responses')->insertGetId(
                                   [                                    [
                                       'session_id' => $sessionID,                                        'session_id' => $sessionID,
                                       'qn_id' => $questionID,                                        'qn_id' => $questionID,
                                       'qn_no' => $questionNo,                                        'qn_no' => $questionNo,
                                       'response_id' => $responseId,                                        'response_id' => $responseId,
                                       // 'response_text' => null,                                        // 'response_text' => null,
                                       'deleted' => 0,                                        'deleted' => 0,
                                       'status' => 0                                        'status' => 0
                                   ]                                    ]
                               );                                );
                           }                            }
   
                           if(empty($lastInsertedId))                            if(empty($lastInsertedId))
                           {                            {
                               $returnData = [                                $returnData = [
                                   'error' => 'Insertion Failed'                                     'error' => 'Insertion Failed' 
                               ];                                ];
                                         
                               return $this->helper->returnData(600, "error", $returnData );                                return $this->helper->returnData(600, "error", $returnData );
                           }                            }
   
                           $returnData = [                            $returnData = [
                               'stored' => true,                                'stored' => true,
                               'message' => 'success'                                 'message' => 'success' 
                           ];                                        ];            
   
                       }                        }
                       else                        else
                       {                        {
                           $lastInsertedId = DB::table('user_responses')->insertGetId(                            $lastInsertedId = DB::table('user_responses')->insertGetId(
                               [                                [
                                   'session_id' => $sessionID,                                    'session_id' => $sessionID,
                                   'qn_id' => $questionID,                                    'qn_id' => $questionID,
                                   'qn_no' => $questionNo,                                    'qn_no' => $questionNo,
                                   'response_id' => null,                                    'response_id' => null,
                                   'response_text' => $responses[0],                                    'response_text' => $responses[0],
                                   'deleted' => 0,                                    'deleted' => 0,
                                   'status' => 0                                    'status' => 0
                               ]                                ]
                           );                            );
   
                           if(empty($lastInsertedId))                            if(empty($lastInsertedId))
                           {                            {
                               $returnData = [                                $returnData = [
                                   'error' => 'Insertion Failed'                                     'error' => 'Insertion Failed' 
                               ];                                ];
                                         
                               return $this->helper->returnData(600, "error", $returnData );                                return $this->helper->returnData(600, "error", $returnData );
                           }                            }
   
                           $returnData = [                            $returnData = [
                               'stored' => true,                                'stored' => true,
                               'message' => 'success'                                 'message' => 'success' 
                           ];                            ];
   
                       }                        }
                                                 
                   }                    }
               }                }
   
           }            }
       }        }
   
       $questionTextArray = array('31','48');        $questionTextArray = array('31','48');
                 
       if(empty($sessionID)) {        if(empty($sessionID)) {
                         
           // error            // error
           $returnData = [            $returnData = [
               'error' => 'Invalid Session'                 'error' => 'Invalid Session' 
           ];            ];
   
           return $this->helper->returnData(600, "error", $returnData );            return $this->helper->returnData(600, "error", $returnData );
       }        }
                 
       if( $page == 'close')        if( $page == 'close')
       {        {
           $updateQuizUser = DB::table('quiz_user')            $updateQuizUser = DB::table('quiz_user')
               ->where('session_id', $sessionID)                ->where('session_id', $sessionID)
               ->update(['status' => 1]);                ->update(['status' => 1]);
                         
           $other = DB::table('question_responses')->select('id')->where([            $other = DB::table('question_responses')->select('id')->where([
               ['qn_id', '=', '12'],                ['qn_id', '=', '12'],
               ['response', '=', 'Other']                ['response', '=', 'Other']
           ])->value('id');            ])->value('id');
   
           $userResponse = DB::select('            $userResponse = DB::select('
               select                select
                   qm.id,                    qm.id,
                   qm.question,                    qm.question,
                   qm.question_no,                    qm.question_no,
                   qr.response,                    qr.response,
                   qr.response_key,                    qr.response_key,
                   ur.response_text                    ur.response_text
               from                from
                   user_responses as ur                    user_responses as ur
               join                join
                   question_master as qm                    question_master as qm
               on                on
                   qm.id = ur.qn_id                    qm.id = ur.qn_id
               left join                left join
                   question_responses as qr                    question_responses as qr
               on                on
                   ur.response_id = qr.id                    ur.response_id = qr.id
               where                where
                   session_id = ?', [$sessionID]);                    session_id = ?', [$sessionID]);
   
           $dataResult = [];            $dataResult = [];
           $details = [];            $details = [];
                                       
                                         
           if(!empty($userResponse))            if(!empty($userResponse))
           {            {
                                 
               foreach($userResponse as $response)                foreach($userResponse as $response)
               {                {
                   $questionId   = $response->id ;                    $questionId   = $response->id ;
                   $questionNo   = $response->question_no;                    $questionNo   = $response->question_no;
                   $questionText = $response->question;                    $questionText = $response->question;
                   $answerText   = $response->response;                    $answerText   = $response->response;
                   $answerKey    = $response->response_key;                    $answerKey    = $response->response_key;
                   $responseText = $response->response_text;                    $responseText = $response->response_text;
                                         
                   if($questionNo == '11' && $responseText != null)                    if($questionNo == '11' && $responseText != null)
                   {                    {
                       $details[$questionNo]['QuestionNo'] = $questionNo;                        $details[$questionNo]['QuestionNo'] = $questionNo;
                       $details[$questionNo]['AnswerText'][] = $other;                        $details[$questionNo]['AnswerText'][] = $other;
                       continue;                        continue;
                   }                    }
   
                   if (!isset($details[$questionNo])){                    if (!isset($details[$questionNo])){
                       $details[$questionNo] = [];                        $details[$questionNo] = [];
                       $details[$questionNo]['QuestionNo'] = $questionNo;                        $details[$questionNo]['QuestionNo'] = $questionNo;
                   }                    }
                                         
                   if(in_array($questionNo, $questionTextArray))                    if(in_array($questionNo, $questionTextArray))
                   {                    {
                       $details[$questionNo]['AnswerText'][] = $answerText;                        $details[$questionNo]['AnswerText'][] = $answerText;
                   }                    }
                   else                    else
                   {                    {
                       $details[$questionNo]['AnswerText'][] = empty($answerKey) ? $responseText : strval($answerKey);                        $details[$questionNo]['AnswerText'][] = empty($answerKey) ? $responseText : strval($answerKey);
                   }                    }
               }                }
               $questionDetails = array_values($details);                $questionDetails = array_values($details);
               $dataResult['SurveyAnswers']['SessionId'] = $sessionID;                $dataResult['SurveyAnswers']['SessionId'] = $sessionID;
               $dataResult['SurveyAnswers']['Questions'] = $questionDetails;                $dataResult['SurveyAnswers']['Questions'] = $questionDetails;
           }            }
   
           $returnData = $dataResult;            $returnData = $dataResult;
           $jsonData = json_encode($returnData);            $jsonData = json_encode($returnData);
           Log::info($jsonData);            Log::info($jsonData);
           // CALL to Recommendation API            // CALL to Recommendation API
           $recommendation = $this->callRecommendation($returnData);            $recommendation = $this->callRecommendation($returnData);
           Log:info($recommendation);            Log:info($recommendation);
           $recommendationObj = json_decode($recommendation);            $recommendationObj = json_decode($recommendation);
           if (isset($recommendationObj->Result)) {            if (isset($recommendationObj->Result)) {
               $recommendationObj = $recommendationObj->Result;                $recommendationObj = $recommendationObj->Result;
           }            }
   
           if(isset($recommendationObj->Recommendation) && !empty($recommendationObj->Recommendation))            if(isset($recommendationObj->Recommendation) && !empty($recommendationObj->Recommendation))
           {            {
                                 
               $lastInsertedId = DB::table('recommendations')->insertGetId(                $lastInsertedId = DB::table('recommendations')->insertGetId(
                   [                    [
                       'session_id' => $sessionID,                          'session_id' => $sessionID,  
                       'email' => isset($recommendationObj->Email) ? $recommendationObj->Email : '',                        'email' => isset($recommendationObj->Email) ? $recommendationObj->Email : '',
                       'first_name' => isset($recommendationObj->Firstname) ? $recommendationObj->Firstname : '',                        'first_name' => isset($recommendationObj->Firstname) ? $recommendationObj->Firstname : '',
                       'sex_profile' => $recommendationObj->SexProfile,                        'sex_profile' => $recommendationObj->SexProfile,
                       'sex' => $recommendationObj->Sex,                        'sex' => $recommendationObj->Sex,
                       'age' => $recommendationObj->Age,                        'age' => $recommendationObj->Age,
                       'zipcode' => $recommendationObj->ZipCode,                        'zipcode' => $recommendationObj->ZipCode,
                       'latitude' => $recommendationObj->Latitude,                        'latitude' => $recommendationObj->Latitude,
                       'longitude' => $recommendationObj->Longitude,                        'longitude' => $recommendationObj->Longitude,
                       'city' => $recommendationObj->City,                        'city' => $recommendationObj->City,
                       'state' => $recommendationObj->State,                        'state' => $recommendationObj->State,
                       'allergens' => json_encode($recommendationObj->Allergens),                        'allergens' => json_encode($recommendationObj->Allergens),
                       'deficiencies' => json_encode($recommendationObj->Deficiencies),                        'deficiencies' => json_encode($recommendationObj->Deficiencies),
                       'recommendation' => json_encode($recommendationObj->Recommendation),                        'recommendation' => json_encode($recommendationObj->Recommendation),
                       'buzz_words' => json_encode($recommendationObj->BuzzWordsTips),                        'buzz_words' => json_encode($recommendationObj->BuzzWordsTips),
                       'north37' => $recommendationObj->North37,                        'north37' => $recommendationObj->North37,
                       'prostate_interest' => $recommendationObj->ProstateInterest,                        'prostate_interest' => $recommendationObj->ProstateInterest,
                       'prenatal_interest' => $recommendationObj->PrenatalInterest,                        'prenatal_interest' => $recommendationObj->PrenatalInterest,
                       'postnatal_interest' => $recommendationObj->PostnatalInterest,                        'postnatal_interest' => $recommendationObj->PostnatalInterest,
                       'healthy_interest' => $recommendationObj->HealthyMentrualCycleInterest,                        'healthy_interest' => $recommendationObj->HealthyMentrualCycleInterest,
                       'perimenopause_interest' => $recommendationObj->PerimenopauseInterest,                        'perimenopause_interest' => $recommendationObj->PerimenopauseInterest,
                       'menopause_interest' => $recommendationObj->MenopauseInterest,                        'menopause_interest' => $recommendationObj->MenopauseInterest,
                       'planning_pregnancy' => $recommendationObj->PlanningPregnancy,                        'planning_pregnancy' => $recommendationObj->PlanningPregnancy,
                       'pregnant' => $recommendationObj->Pregnant,                        'pregnant' => $recommendationObj->Pregnant,
                       'breastfeeding' => $recommendationObj->Breastfeeding,                        'breastfeeding' => $recommendationObj->Breastfeeding,
                       'taking_medication' => $recommendationObj->TakingMedication,                        'taking_medication' => $recommendationObj->TakingMedication,
                       'blood_clotting_issue' => $recommendationObj->BloodClottingIssue,                        'blood_clotting_issue' => $recommendationObj->BloodClottingIssue,
                         
                   ]                    ]
               );                );
         
               if(empty($lastInsertedId))                if(empty($lastInsertedId))
               {                {
                   $returnData = [                    $returnData = [
                       'error' => 'Insertion Failed'                         'error' => 'Insertion Failed' 
                   ];                    ];
                 
                   return $this->helper->returnData(600, "error", $returnData );                    return $this->helper->returnData(600, "error", $returnData );
               }                }
         
               // For the tagging purpose                // For the tagging purpose
               $questionResponse = DB::select('                $questionResponse = DB::select('
                   select                    select
                       qm.id,                        qm.id,
                       qm.question,                        qm.question,
                       qr.response                        qr.response
                   from                    from
                       user_responses as ur                        user_responses as ur
                   join                    join
                       question_master as qm                        question_master as qm
                   on                    on
                       qm.id = ur.qn_id                        qm.id = ur.qn_id
                   left join                    left join
                       question_responses as qr                        question_responses as qr
                   on                    on
                       ur.response_id = qr.id                        ur.response_id = qr.id
                   where                    where
                       session_id = ? and ur.qn_id in (14,32)', [$sessionID]);                        session_id = ? and ur.qn_id in (14,32)', [$sessionID]);
         
               if(!empty($questionResponse))                        if(!empty($questionResponse))        
               {                {
                   $tagQuestion = array();                    $tagQuestion = array();
                   foreach($questionResponse as $qResponse)                    foreach($questionResponse as $qResponse)
                   {                    {
                       if(!isset($tagQuestion[$qResponse->id]))                        if(!isset($tagQuestion[$qResponse->id]))
                       {                        {
                           $tagQuestion[$qResponse->id][] = $qResponse->response;                            $tagQuestion[$qResponse->id][] = $qResponse->response;
                       }                        }
                       else{                        else{
                           $tagQuestion[$qResponse->id][] = $qResponse->response;                            $tagQuestion[$qResponse->id][] = $qResponse->response;
                       }                        }
                   }                    }
               }                }
   
               $reasonProduct = $recommendationObj->Recommendation->ReasonsForProduct;                $reasonProduct = $recommendationObj->Recommendation->ReasonsForProduct;
   
               if(!empty($reasonProduct)){                if(!empty($reasonProduct)){
                   $reason = array();                    $reason = array();
                   $recommendationObj = json_decode($recommendation);                    $recommendationObj = json_decode($recommendation);
                   if (isset($recommendationObj->Result)) {                    if (isset($recommendationObj->Result)) {
                       $recommendationObj = $recommendationObj->Result;                        $recommendationObj = $recommendationObj->Result;
                   }                    }
                   foreach($reasonProduct as $value){                    foreach($reasonProduct as $value){
                       $stripValue = preg_replace('/[^a-zA-Z0-9-;.,+"()%\/(&deg;) ]/', '', $value);                        $stripValue = preg_replace('/[^a-zA-Z0-9-;.,+"()%\/(&deg;) ]/', '', $value);
                       array_push($reason, $stripValue);                        array_push($reason, $stripValue);
                   }                    }
                   $recommendationObj->Recommendation->ReasonsForProduct = $reason;                    $recommendationObj->Recommendation->ReasonsForProduct = $reason;
               }                }
                                 
               // Tag User                // Tag User
               $tagUser = dispatch(new TagUserJob($recommendation, $tagQuestion, $sessionID));                $tagUser = dispatch(new TagUserJob($recommendation, $tagQuestion, $sessionID));
         
               // return $this->helper->returnData(200, "success", json_decode($recommendation) );                // return $this->helper->returnData(200, "success", json_decode($recommendation) );
               return $this->helper->returnData(200, "success", $recommendationObj );                return $this->helper->returnData(200, "success", $recommendationObj );
         
           }            }
           else{            else{
               $returnData = [                $returnData = [
                   'error' => 'Empty Recommendation'                     'error' => 'Empty Recommendation' 
               ];                ];
         
               return $this->helper->returnData(600, "error", $returnData );                return $this->helper->returnData(600, "error", $returnData );
           }            }
                         
       }        }
   
       if(empty($questionID)) {        if(empty($questionID)) {
           // error            // error
   
           $returnData = [            $returnData = [
               'error' => 'Quiz not found'                 'error' => 'Quiz not found' 
           ];            ];
   
           return $this->helper->returnData(600, "error", $returnData );            return $this->helper->returnData(600, "error", $returnData );
       }        }
   
       // To delete the already existing question and update the new record        // To delete the already existing question and update the new record
       $deleteQuizDetails = DB::table('user_responses')        $deleteQuizDetails = DB::table('user_responses')
                   ->where([                    ->where([
                       ['session_id', '=', $sessionID],                        ['session_id', '=', $sessionID],
                       ['qn_id', '>=', $questionID]                        ['qn_id', '>=', $questionID]
                   ])->delete();                    ])->delete();
   
       if(!empty($responseIds))        if(!empty($responseIds))
       {        {
           $lastInsertedId = null;            $lastInsertedId = null;
           foreach($responseIds as $responseId)            foreach($responseIds as $responseId)
           {            {
               $lastInsertedId = DB::table('user_responses')->insertGetId(                $lastInsertedId = DB::table('user_responses')->insertGetId(
                   [                    [
                       'session_id' => $sessionID,                        'session_id' => $sessionID,
                       'qn_id' => $questionID,                        'qn_id' => $questionID,
                       'qn_no' => $questionNo,                        'qn_no' => $questionNo,
                       'response_id' => $responseId,                        'response_id' => $responseId,
                       // 'response_text' => null,                        // 'response_text' => null,
                       'deleted' => 0,                        'deleted' => 0,
                       'status' => 0                        'status' => 0
                   ]                    ]
               );                );
           }            }
   
           if(empty($lastInsertedId))            if(empty($lastInsertedId))
           {            {
               $returnData = [                $returnData = [
                   'error' => 'Insertion Failed'                     'error' => 'Insertion Failed' 
               ];                ];
         
               return $this->helper->returnData(600, "error", $returnData );                return $this->helper->returnData(600, "error", $returnData );
           }            }
   
           $returnData = [            $returnData = [
               'stored' => true,                'stored' => true,
               'message' => 'success'                 'message' => 'success' 
           ];                        ];            
   
       }        }
       else        else
       {        {
                 
           $lastInsertedId = DB::table('user_responses')->insertGetId(            $lastInsertedId = DB::table('user_responses')->insertGetId(
               [                [
                   'session_id' => $sessionID,                    'session_id' => $sessionID,
                   'qn_id' => $questionID,                    'qn_id' => $questionID,
                   'qn_no' => $questionNo,                    'qn_no' => $questionNo,
                   'response_id' => null,                    'response_id' => null,
                   'response_text' => $responses[0],                    'response_text' => $responses[0],
                   'deleted' => 0,                    'deleted' => 0,
                   'status' => 0                    'status' => 0
               ]                ]
           );            );
   
           if(empty($lastInsertedId))            if(empty($lastInsertedId))
           {            {
               $returnData = [                $returnData = [
                   'error' => 'Insertion Failed'                     'error' => 'Insertion Failed' 
               ];                ];
         
               return $this->helper->returnData(600, "error", $returnData );                return $this->helper->returnData(600, "error", $returnData );
           }            }
   
           $returnData = [            $returnData = [
               'stored' => true,                'stored' => true,
               'message' => 'success'                 'message' => 'success' 
           ];            ];
   
       }        }
   
       if($page == 'email')        if($page == 'email')
       {        {
           $email = isset($responses[0]) ? $responses[0] : '';            $email = isset($responses[0]) ? $responses[0] : '';
   
           if(empty($email))            if(empty($email))
           {            {
               $returnData = [                $returnData = [
                   'error' => 'Email is empty'                     'error' => 'Email is empty' 
               ];                ];
         
               return $this->helper->returnData(600, "error", $returnData );                return $this->helper->returnData(600, "error", $returnData );
           }            }
   
           $user = DB::table('users')->where('user_email', '=', $email)->get();            $user = DB::table('users')->where('user_email', '=', $email)->get();
   
           if(!isset($user[0]->user_email))            if(!isset($user[0]->user_email))
           {            {
               // create                // create
               $userName = '';                $userName = '';
               $userId = DB::table('users')->insertGetId([                $userId = DB::table('users')->insertGetId([
                   'user_email' => $email,                    'user_email' => $email,
                   'status' => 1                    'status' => 1
               ]);                ]);
   
               $quizId = DB::table('quiz_user')->select('id')->where([                $quizId = DB::table('quiz_user')->select('id')->where([
                   'session_id' => $sessionID                    'session_id' => $sessionID
               ])->value('id');                ])->value('id');
         
               if($quizId) {                if($quizId) {
                                         
                   $updateQuizUser = DB::table('quiz_user')->where(['id' => $quizId])                    $updateQuizUser = DB::table('quiz_user')->where(['id' => $quizId])
                       ->update(['user_id' => $userId]);                        ->update(['user_id' => $userId]);
         
               } else {                } else {
                   $quizId = DB::table('quiz_user')->insertGetId([                    $quizId = DB::table('quiz_user')->insertGetId([
                       'user_id' => $userId,                        'user_id' => $userId,
                       'session_id' => $sessionID,                        'session_id' => $sessionID,
                       'deleted' => 0,                        'deleted' => 0,
                       'status' => 0                        'status' => 0
                   ]);                    ]);
               }                }
         
   
               $userNameResponse =  DB::table('user_responses')->where([                $userNameResponse =  DB::table('user_responses')->where([
                   ['session_id', '=', $sessionID],                    ['session_id', '=', $sessionID],
                   ['qn_id', '=', '2']                    ['qn_id', '=', '2']
               ])->get();                ])->get();
   
               if($userNameResponse[0])                if($userNameResponse[0])
               {                {
                   $userName = $userNameResponse[0]->response_text;                    $userName = $userNameResponse[0]->response_text;
               }                }
   
               // Create customer in Shopify                // Create customer in Shopify
               $result = dispatch(new CreateShopifyCustomerJob($email, $userName));                $result = dispatch(new CreateShopifyCustomerJob($email, $userName));
           } else {            } else {
               $userId    = $user[0]->id;                $userId    = $user[0]->id;
               $quizId = DB::table('quiz_user')->select('id')->where([                $quizId = DB::table('quiz_user')->select('id')->where([
                   'session_id' => $sessionID                    'session_id' => $sessionID
               ])->value('id');                ])->value('id');
         
               if($quizId) {                if($quizId) {
                                         
                   $updateQuizUser = DB::table('quiz_user')->where(['id' => $quizId])                    $updateQuizUser = DB::table('quiz_user')->where(['id' => $quizId])
                       ->update(['user_id' => $userId]);                        ->update(['user_id' => $userId]);
         
               } else {                } else {
                   $quizId = DB::table('quiz_user')->insertGetId([                    $quizId = DB::table('quiz_user')->insertGetId([
                       'user_id' => $userId,                        'user_id' => $userId,
                       'session_id' => $sessionID,                        'session_id' => $sessionID,
                       'deleted' => 0,                        'deleted' => 0,
                       'status' => 0                        'status' => 0
                   ]);                    ]);
               }                }
           
           }            }
                         
           $returnData = [            $returnData = [
               'stored' => true,                'stored' => true,
               'message' => 'success'                 'message' => 'success' 
           ];            ];
   
       }        }
       return $this->helper->returnData(200, "success", $returnData );        return $this->helper->returnData(200, "success", $returnData );
                 
   }    }
   
   public function newRetakeQuiz(Request $request)    public function newRetakeQuiz(Request $request)
   {    {
       $page         = $request->input('page');        $page         = $request->input('page');
       $sessionID    = $request->input('sessionID');        $sessionID    = $request->input('sessionID');
       $question     = $request->input('question');        $question     = $request->input('question');
       $questionID   = $request->input('questionID');        $questionID   = $request->input('questionID');
       $questionNo   = $request->input('questionNo');        $questionNo   = $request->input('questionNo');
       $responses    = $request->input('responses');        $responses    = $request->input('responses');
       $responseIds  = $request->input('responseIDs');        $responseIds  = $request->input('responseIDs');
       $responseKeys = $request->input('responseKeys');        $responseKeys = $request->input('responseKeys');
       $email        = $request->input('email');        $email        = $request->input('email');
   
       $retakeID     = $request->input('retakeID');        $retakeID     = $request->input('retakeID');
   
       if($retakeID)        if($retakeID)
       {        {
           $recordDetails = $this->getQuizData($sessionID);            $recordDetails = $this->getQuizData($sessionID);
   
           if(empty($recordDetails)){            if(empty($recordDetails)){
   
               if(!empty($email))                if(!empty($email))
               {                {
                   $retakeUserID = DB::table('users')->select('id')->where([                    $retakeUserID = DB::table('users')->select('id')->where([
                       'user_email' => $email                        'user_email' => $email
                       ])->value('id');                        ])->value('id');
   
                   if(empty($retakeUserID)){                    if(empty($retakeUserID)){
                       $returnData = [                        $returnData = [
                           'error' => 'Could not found existing User details'                             'error' => 'Could not found existing User details' 
                       ];                        ];
         
                       return $this->helper->returnData(600, "error", $returnData );                        return $this->helper->returnData(600, "error", $returnData );
                   }                    }
   
                   $quizId = DB::table('quiz_user')->insertGetId([                    $quizId = DB::table('quiz_user')->insertGetId([
                       'user_id' => $retakeUserID,                        'user_id' => $retakeUserID,
                       'session_id' => $sessionID,                        'session_id' => $sessionID,
                       'deleted' => 0,                        'deleted' => 0,
                       'status' => 0                        'status' => 0
                   ]);                    ]);
   
               }                }
   
               $recordDetails = $this->getQuizData($retakeID);                $recordDetails = $this->getQuizData($retakeID);
   
               if(empty($recordDetails))                if(empty($recordDetails))
               {                {
                   $returnData = [                    $returnData = [
                       'error' => 'Could not found existing Quiz details'                         'error' => 'Could not found existing Quiz details' 
                   ];                    ];
   
                   return $this->helper->returnData(600, "error", $returnData );                    return $this->helper->returnData(600, "error", $returnData );
               }                }
   
               $retakeQuestionData = $recordDetails['SurveyAnswers']['Questions'][$questionID];                $retakeQuestionData = $recordDetails['SurveyAnswers']['Questions'][$questionID];
               $retakeResponseData = $recordDetails['SurveyAnswers']['Questions'];                $retakeResponseData = $recordDetails['SurveyAnswers']['Questions'];
   
               foreach($retakeResponseData as $key => $value){                foreach($retakeResponseData as $key => $value){
   
                   $answerIds  = null;                    $answerIds  = null;
                   if(isset($value['AnswerID'])){                    if(isset($value['AnswerID'])){
                       $answerIds  = $value['AnswerID'];                        $answerIds  = $value['AnswerID'];
                   }                    }
                                         
                   $answerText = $value['AnswerText'];                    $answerText = $value['AnswerText'];
                   $questNo = $value['QuestionNo'];                    $questNo = $value['QuestionNo'];
                   $questId = $value['QuestionId'];                    $questId = $value['QuestionId'];
   
                   if($key != $questionNo)                    if($key != $questionNo)
                   {                    {
                       if(!empty($answerIds))                        if(!empty($answerIds))
                       {                        {
                           $lastInsertedId = null;                            $lastInsertedId = null;
                           foreach($answerIds as $answerId)                            foreach($answerIds as $answerId)
                           {                            {
                               $lastInsertedId = DB::table('user_responses')->insertGetId(                                $lastInsertedId = DB::table('user_responses')->insertGetId(
                                   [                                    [
                                       'session_id' => $sessionID,                                        'session_id' => $sessionID,
                                       'qn_id' => $questId,                                        'qn_id' => $questId,
                                       'qn_no' => $questNo,                                        'qn_no' => $questNo,
                                       'response_id' => $answerId,                                        'response_id' => $answerId,
                                       // 'response_text' => null,                                        // 'response_text' => null,
                                       'deleted' => 0,                                        'deleted' => 0,
                                       'status' => 0                                        'status' => 0
                                   ]                                    ]
                               );                                );
                           }                            }
                                 
                           if(empty($lastInsertedId))                            if(empty($lastInsertedId))
                           {                            {
                               $returnData = [                                $returnData = [
                                   'error' => 'Insertion Failed'                                     'error' => 'Insertion Failed' 
                               ];                                ];
                                         
                               return $this->helper->returnData(600, "error", $returnData );                                return $this->helper->returnData(600, "error", $returnData );
                           }                            }
                                 
                           $returnData = [                            $returnData = [
                               'stored' => true,                                'stored' => true,
                               'message' => 'success'                                 'message' => 'success' 
                           ];                                        ];            
                                 
                       }                        }
                       else                        else
                       {                        {
                           $lastInsertedId = DB::table('user_responses')->insertGetId(                            $lastInsertedId = DB::table('user_responses')->insertGetId(
                               [                                [
                                   'session_id' => $sessionID,                                    'session_id' => $sessionID,
                                   'qn_id' => $questId,                                    'qn_id' => $questId,
                                   'qn_no' => $questNo,                                    'qn_no' => $questNo,
                                   'response_id' => null,                                    'response_id' => null,
                                   'response_text' => $answerText[0],                                    'response_text' => $answerText[0],
                                   'deleted' => 0,                                    'deleted' => 0,
                                   'status' => 0                                    'status' => 0
                               ]                                ]
                           );                            );
                                 
                           if(empty($lastInsertedId))                            if(empty($lastInsertedId))
                           {                            {
                               $returnData = [                                $returnData = [
                                   'error' => 'Insertion Failed'                                     'error' => 'Insertion Failed' 
                               ];                                ];
                                         
                               return $this->helper->returnData(600, "error", $returnData );                                return $this->helper->returnData(600, "error", $returnData );
                           }                            }
                                 
                           $returnData = [                            $returnData = [
                               'stored' => true,                                'stored' => true,
                               'message' => 'success'                                 'message' => 'success' 
                           ];                            ];
                                 
                       }                        }
                   }                    }
   
                   if($questionNo == $key)                    if($questionNo == $key)
                   {                    {
   
                       if(!empty($responseIds))                        if(!empty($responseIds))
                       {                        {
                           $lastInsertedId = null;                            $lastInsertedId = null;
                           foreach($responseIds as $responseId)                            foreach($responseIds as $responseId)
                           {                            {
   
                               $lastInsertedId = DB::table('user_responses')->insertGetId(                                $lastInsertedId = DB::table('user_responses')->insertGetId(
                                   [                                    [
                                       'session_id' => $sessionID,                                        'session_id' => $sessionID,
                                       'qn_id' => $questionID,                                        'qn_id' => $questionID,
                                       'qn_no' => $questionNo,                                        'qn_no' => $questionNo,
                                       'response_id' => $responseId,                                        'response_id' => $responseId,
                                       // 'response_text' => null,                                        // 'response_text' => null,
                                       'deleted' => 0,                                        'deleted' => 0,
                                       'status' => 0                                        'status' => 0
                                   ]                                    ]
                               );                                );
                           }                            }
   
                           if(empty($lastInsertedId))                            if(empty($lastInsertedId))
                           {                            {
                               $returnData = [                                $returnData = [
                                   'error' => 'Insertion Failed'                                     'error' => 'Insertion Failed' 
                               ];                                ];
                                         
                               return $this->helper->returnData(600, "error", $returnData );                                return $this->helper->returnData(600, "error", $returnData );
                           }                            }
   
                           $returnData = [                            $returnData = [
                               'stored' => true,                                'stored' => true,
                               'message' => 'success'                                 'message' => 'success' 
                           ];                                        ];            
   
                       }                        }
                       else                        else
                       {                        {
                           $lastInsertedId = DB::table('user_responses')->insertGetId(                            $lastInsertedId = DB::table('user_responses')->insertGetId(
                               [                                [
                                   'session_id' => $sessionID,                                    'session_id' => $sessionID,
                                   'qn_id' => $questionID,                                    'qn_id' => $questionID,
                                   'qn_no' => $questionNo,                                    'qn_no' => $questionNo,
                                   'response_id' => null,                                    'response_id' => null,
                                   'response_text' => $responses[0],                                    'response_text' => $responses[0],
                                   'deleted' => 0,                                    'deleted' => 0,
                                   'status' => 0                                    'status' => 0
                               ]                                ]
                           );                            );
   
                           if(empty($lastInsertedId))                            if(empty($lastInsertedId))
                           {                            {
                               $returnData = [                                $returnData = [
                                   'error' => 'Insertion Failed'                                     'error' => 'Insertion Failed' 
                               ];                                ];
                                         
                               return $this->helper->returnData(600, "error", $returnData );                                return $this->helper->returnData(600, "error", $returnData );
                           }                            }
   
                           $returnData = [                            $returnData = [
                               'stored' => true,                                'stored' => true,
                               'message' => 'success'                                 'message' => 'success' 
                           ];                            ];
   
                       }                        }
                                                 
                   }                    }
               }                }
   
           }            }
       }        }
   
       $questionTextArray = array('31','48');        $questionTextArray = array('31','48');
                 
       if(empty($sessionID)) {        if(empty($sessionID)) {
                         
           // error            // error
           $returnData = [            $returnData = [
               'error' => 'Invalid Session'                 'error' => 'Invalid Session' 
           ];            ];
   
           return $this->helper->returnData(600, "error", $returnData );            return $this->helper->returnData(600, "error", $returnData );
       }        }
                 
       if( $page == 'close')        if( $page == 'close')
       {        {
           $updateQuizUser = DB::table('quiz_user')            $updateQuizUser = DB::table('quiz_user')
               ->where('session_id', $sessionID)                ->where('session_id', $sessionID)
               ->update(['status' => 1]);                ->update(['status' => 1]);
                         
           $other = DB::table('question_responses')->select('id')->where([            $other = DB::table('question_responses')->select('id')->where([
               ['qn_id', '=', '12'],                ['qn_id', '=', '12'],
               ['response', '=', 'Other']                ['response', '=', 'Other']
           ])->value('id');            ])->value('id');
   
           $userResponse = DB::select('            $userResponse = DB::select('
               select                select
                   qm.id,                    qm.id,
                   qm.question,                    qm.question,
                   qm.question_no,                    qm.question_no,
                   qr.response,                    qr.response,
                   qr.response_key,                    qr.response_key,
                   ur.response_text                    ur.response_text
               from                from
                   user_responses as ur                    user_responses as ur
               join                join
                   question_master as qm                    question_master as qm
               on                on
                   qm.id = ur.qn_id                    qm.id = ur.qn_id
               left join                left join
                   question_responses as qr                    question_responses as qr
               on                on
                   ur.response_id = qr.id                    ur.response_id = qr.id
               where                where
                   session_id = ?', [$sessionID]);                    session_id = ?', [$sessionID]);
   
           $dataResult = [];            $dataResult = [];
           $details = [];            $details = [];
                                       
                                         
           if(!empty($userResponse))            if(!empty($userResponse))
           {            {
                                 
               foreach($userResponse as $response)                foreach($userResponse as $response)
               {                {
                   $questionId   = $response->id ;                    $questionId   = $response->id ;
                   $questionNo   = $response->question_no;                    $questionNo   = $response->question_no;
                   $questionText = $response->question;                    $questionText = $response->question;
                   $answerText   = $response->response;                    $answerText   = $response->response;
                   $answerKey    = $response->response_key;                    $answerKey    = $response->response_key;
                   $responseText = $response->response_text;                    $responseText = $response->response_text;
                                         
                   if($questionNo == '11' && $responseText != null)                    if($questionNo == '11' && $responseText != null)
                   {                    {
                       $details[$questionNo]['QuestionNo'] = $questionNo;                        $details[$questionNo]['QuestionNo'] = $questionNo;
                       $details[$questionNo]['AnswerText'][] = $other;                        $details[$questionNo]['AnswerText'][] = $other;
                       continue;                        continue;
                   }                    }
   
                   if (!isset($details[$questionNo])){                    if (!isset($details[$questionNo])){
                       $details[$questionNo] = [];                        $details[$questionNo] = [];
                       $details[$questionNo]['QuestionNo'] = $questionNo;                        $details[$questionNo]['QuestionNo'] = $questionNo;
                   }                    }
                                         
                   if(in_array($questionNo, $questionTextArray))                    if(in_array($questionNo, $questionTextArray))
                   {                    {
                       $details[$questionNo]['AnswerText'][] = $answerText;                        $details[$questionNo]['AnswerText'][] = $answerText;
                   }                    }
                   else                    else
                   {                    {
                       $details[$questionNo]['AnswerText'][] = empty($answerKey) ? $responseText : strval($answerKey);                        $details[$questionNo]['AnswerText'][] = empty($answerKey) ? $responseText : strval($answerKey);
                   }                    }
               }                }
               $questionDetails = array_values($details);                $questionDetails = array_values($details);
               $dataResult['SurveyAnswers']['SessionId'] = $sessionID;                $dataResult['SurveyAnswers']['SessionId'] = $sessionID;
               $dataResult['SurveyAnswers']['Questions'] = $questionDetails;                $dataResult['SurveyAnswers']['Questions'] = $questionDetails;
           }            }
   
           $returnData = $dataResult;            $returnData = $dataResult;
           $jsonData = json_encode($returnData);            $jsonData = json_encode($returnData);
           Log::info($jsonData);            Log::info($jsonData);
           // CALL to Recommendation API            // CALL to Recommendation API
           $recommendation = $this->callRecommendation($returnData);            $recommendation = $this->callRecommendation($returnData);
           Log:info($recommendation);            Log:info($recommendation);
           $recommendationObj = json_decode($recommendation);            $recommendationObj = json_decode($recommendation);
           if (isset($recommendationObj->Result)) {            if (isset($recommendationObj->Result)) {
               $recommendationObj = $recommendationObj->Result;                $recommendationObj = $recommendationObj->Result;
           }            }
   
           if(isset($recommendationObj->Recommendation) && !empty($recommendationObj->Recommendation))            if(isset($recommendationObj->Recommendation) && !empty($recommendationObj->Recommendation))
           {            {
                                 
               $lastInsertedId = DB::table('recommendations')->insertGetId(                $lastInsertedId = DB::table('recommendations')->insertGetId(
                   [                    [
                       'session_id' => $sessionID,                          'session_id' => $sessionID,  
                       'email' => isset($recommendationObj->Email) ? $recommendationObj->Email : '',                        'email' => isset($recommendationObj->Email) ? $recommendationObj->Email : '',
                       'first_name' => isset($recommendationObj->Firstname) ? $recommendationObj->Firstname : '',                        'first_name' => isset($recommendationObj->Firstname) ? $recommendationObj->Firstname : '',
                       'sex_profile' => $recommendationObj->SexProfile,                        'sex_profile' => $recommendationObj->SexProfile,
                       'sex' => $recommendationObj->Sex,                        'sex' => $recommendationObj->Sex,
                       'age' => $recommendationObj->Age,                        'age' => $recommendationObj->Age,
                       'zipcode' => $recommendationObj->ZipCode,                        'zipcode' => $recommendationObj->ZipCode,
                       'latitude' => $recommendationObj->Latitude,                        'latitude' => $recommendationObj->Latitude,
                       'longitude' => $recommendationObj->Longitude,                        'longitude' => $recommendationObj->Longitude,
                       'city' => $recommendationObj->City,                        'city' => $recommendationObj->City,
                       'state' => $recommendationObj->State,                        'state' => $recommendationObj->State,
                       'allergens' => json_encode($recommendationObj->Allergens),                        'allergens' => json_encode($recommendationObj->Allergens),
                       'deficiencies' => json_encode($recommendationObj->Deficiencies),                        'deficiencies' => json_encode($recommendationObj->Deficiencies),
                       'recommendation' => json_encode($recommendationObj->Recommendation),                        'recommendation' => json_encode($recommendationObj->Recommendation),
                       'buzz_words' => json_encode($recommendationObj->BuzzWordsTips),                        'buzz_words' => json_encode($recommendationObj->BuzzWordsTips),
                       'north37' => $recommendationObj->North37,                        'north37' => $recommendationObj->North37,
                       'prostate_interest' => $recommendationObj->ProstateInterest,                        'prostate_interest' => $recommendationObj->ProstateInterest,
                       'prenatal_interest' => $recommendationObj->PrenatalInterest,                        'prenatal_interest' => $recommendationObj->PrenatalInterest,
                       'postnatal_interest' => $recommendationObj->PostnatalInterest,                        'postnatal_interest' => $recommendationObj->PostnatalInterest,
                       'healthy_interest' => $recommendationObj->HealthyMentrualCycleInterest,                        'healthy_interest' => $recommendationObj->HealthyMentrualCycleInterest,
                       'perimenopause_interest' => $recommendationObj->PerimenopauseInterest,                        'perimenopause_interest' => $recommendationObj->PerimenopauseInterest,
                       'menopause_interest' => $recommendationObj->MenopauseInterest,                        'menopause_interest' => $recommendationObj->MenopauseInterest,
                       'planning_pregnancy' => $recommendationObj->PlanningPregnancy,                        'planning_pregnancy' => $recommendationObj->PlanningPregnancy,
                       'pregnant' => $recommendationObj->Pregnant,                        'pregnant' => $recommendationObj->Pregnant,
                       'breastfeeding' => $recommendationObj->Breastfeeding,                        'breastfeeding' => $recommendationObj->Breastfeeding,
                       'taking_medication' => $recommendationObj->TakingMedication,                        'taking_medication' => $recommendationObj->TakingMedication,
                       'blood_clotting_issue' => $recommendationObj->BloodClottingIssue,                        'blood_clotting_issue' => $recommendationObj->BloodClottingIssue,
                         
                   ]                    ]
               );                );
         
               if(empty($lastInsertedId))                if(empty($lastInsertedId))
               {                {
                   $returnData = [                    $returnData = [
                       'error' => 'Insertion Failed'                         'error' => 'Insertion Failed' 
                   ];                    ];
                 
                   return $this->helper->returnData(600, "error", $returnData );                    return $this->helper->returnData(600, "error", $returnData );
               }                }
         
               // For the tagging purpose                // For the tagging purpose
               $questionResponse = DB::select('                $questionResponse = DB::select('
                   select                    select
                       qm.id,                        qm.id,
                       qm.question,                        qm.question,
                       qr.response                        qr.response
                   from                    from
                       user_responses as ur                        user_responses as ur
                   join                    join
                       question_master as qm                        question_master as qm
                   on                    on
                       qm.id = ur.qn_id                        qm.id = ur.qn_id
                   left join                    left join
                       question_responses as qr                        question_responses as qr
                   on                    on
                       ur.response_id = qr.id                        ur.response_id = qr.id
                   where                    where
                       session_id = ? and ur.qn_id in (14,32)', [$sessionID]);                        session_id = ? and ur.qn_id in (14,32)', [$sessionID]);
         
               if(!empty($questionResponse))                        if(!empty($questionResponse))        
               {                {
                   $tagQuestion = array();                    $tagQuestion = array();
                   foreach($questionResponse as $qResponse)                    foreach($questionResponse as $qResponse)
                   {                    {
                       if(!isset($tagQuestion[$qResponse->id]))                        if(!isset($tagQuestion[$qResponse->id]))
                       {                        {
                           $tagQuestion[$qResponse->id][] = $qResponse->response;                            $tagQuestion[$qResponse->id][] = $qResponse->response;
                       }                        }
                       else{                        else{
                           $tagQuestion[$qResponse->id][] = $qResponse->response;                            $tagQuestion[$qResponse->id][] = $qResponse->response;
                       }                        }
                   }                    }
               }                }
                                 
               // Tag User                // Tag User
               $tagUser = dispatch(new TagUserJob($recommendation, $tagQuestion, $sessionID));                $tagUser = dispatch(new TagUserJob($recommendation, $tagQuestion, $sessionID));
         
               return $this->helper->returnData(200, "success", json_decode($recommendation) );                return $this->helper->returnData(200, "success", json_decode($recommendation) );
         
           }            }
           else{            else{
               $returnData = [                $returnData = [
                   'error' => 'Empty Recommendation'                     'error' => 'Empty Recommendation' 
               ];                ];
         
               return $this->helper->returnData(600, "error", $returnData );                return $this->helper->returnData(600, "error", $returnData );
           }            }
                         
       }                }        
   }    }
   
   function getQuizData($sessionID){    function getQuizData($sessionID){
   
       if(empty($sessionID))        if(empty($sessionID))
       {        {
           return null;            return null;
       }        }
   
       $dataResult = array();        $dataResult = array();
   
       $results = DB::select('        $results = DB::select('
           select            select
               qm.id,                qm.id,
               qm.question_no,                qm.question_no,
               qm.question,                qm.question,
               IFNULL(qr.response,ur.response_text) as response,                IFNULL(qr.response,ur.response_text) as response,
               qr.id as response_id,                qr.id as response_id,
               qm.page                qm.page
           from            from
               user_responses as ur                user_responses as ur
           join            join
               question_master as qm                question_master as qm
           on            on
               qm.id = ur.qn_id                qm.id = ur.qn_id
           left join            left join
               question_responses as qr                question_responses as qr
           on            on
               ur.response_id = qr.id                ur.response_id = qr.id
           where            where
               session_id = ?', [$sessionID]);                session_id = ?', [$sessionID]);
   
       if(empty($results))        if(empty($results))
       {        {
           return null;            return null;
       }        }
                 
       foreach($results as $result)        foreach($results as $result)
       {        {
           $questionId     = $result->id;            $questionId     = $result->id;
           $questionNo     = $result->question_no;            $questionNo     = $result->question_no;
           $questionText   = $result->question;            $questionText   = $result->question;
           $answerText     = $result->response;            $answerText     = $result->response;
           $questionHandle = $result->page;            $questionHandle = $result->page;
           $answerID       = $result->response_id;            $answerID       = $result->response_id;
   
           $temp = [];            $temp = [];
                         
           if (!isset($details[$questionNo])){            if (!isset($details[$questionNo])){
               $details[$questionNo] = [];                $details[$questionNo] = [];
               $details[$questionNo]['QuestionNo']   = $questionNo;                $details[$questionNo]['QuestionNo']   = $questionNo;
               $details[$questionNo]['QuestionId']   = $questionId;                $details[$questionNo]['QuestionId']   = $questionId;
               $details[$questionNo]['QuestionText'] = $questionText;                $details[$questionNo]['QuestionText'] = $questionText;
               $details[$questionNo]['QuestionHandle'] = $questionHandle;                $details[$questionNo]['QuestionHandle'] = $questionHandle;
           }            }
                         
           $details[$questionNo]['AnswerText'][] = $answerText;            $details[$questionNo]['AnswerText'][] = $answerText;
   
           if(!empty($answerID)){            if(!empty($answerID)){
               $details[$questionNo]['AnswerID'][]   = $answerID;                $details[$questionNo]['AnswerID'][]   = $answerID;
           }            }
                         
       }        }
   
       $questionDetails['Questions'] = $details;        $questionDetails['Questions'] = $details;
       $dataResult['SessionId']      = $sessionID;        $dataResult['SessionId']      = $sessionID;
       $dataResult['SurveyAnswers']  = $questionDetails;        $dataResult['SurveyAnswers']  = $questionDetails;
   
       return $dataResult;        return $dataResult;
   }    }
         
   function createEvent($data){    function createEvent($data){
                       
       $path = $this->iterableUrl.'events/track';        $path = $this->iterableUrl.'events/track';
       $method = 'POST';        $method = 'POST';
       $response = $this->call($method, $path, $data);        $response = $this->call($method, $path, $data);
       return json_decode($response);        return json_decode($response);
   }    }
         
   function triggerEmailTarget($data){    function triggerEmailTarget($data){
                       
       $path = $this->iterableUrl.'email/target';        $path = $this->iterableUrl.'email/target';
       $method = 'POST';        $method = 'POST';
       $response = $this->call($method, $path, $data);        $response = $this->call($method, $path, $data);
       return json_decode($response);        return json_decode($response);
   }    }
   
   function call($method, $path, $data = []) {    function call($method, $path, $data = []) {
         
       $curl = curl_init();        $curl = curl_init();
       curl_setopt($curl, CURLOPT_URL, $path);        curl_setopt($curl, CURLOPT_URL, $path);
       curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
       curl_setopt($curl, CURLOPT_ENCODING, '');        curl_setopt($curl, CURLOPT_ENCODING, '');
       curl_setopt($curl, CURLOPT_MAXREDIRS, 10);        curl_setopt($curl, CURLOPT_MAXREDIRS, 10);
       curl_setopt($curl, CURLOPT_TIMEOUT, 30);        curl_setopt($curl, CURLOPT_TIMEOUT, 30);
       curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);        curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
       curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);        curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
       curl_setopt($curl, CURLOPT_HTTPHEADER, array(        curl_setopt($curl, CURLOPT_HTTPHEADER, array(
           "cache-control: no-cache",            "cache-control: no-cache",
           "content-type: application/json",            "content-type: application/json",
           "api_key: ".$this->iterableApiKey            "api_key: ".$this->iterableApiKey
       ));        ));
         
       if ($method !== 'GET') {        if ($method !== 'GET') {
         
           curl_setopt($curl, CURLOPT_POSTFIELDS, $data);            curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
       }        }
       $response = curl_exec($curl);        $response = curl_exec($curl);
       return $response;        return $response;
         
   }    }
   
} }
   
class ArrayValue implements JsonSerializable { class ArrayValue implements JsonSerializable {
   public function __construct(array $array) {    public function __construct(array $array) {
       $this->array = $array;        $this->array = $array;
   }    }
   
   public function jsonSerialize() {    public function jsonSerialize() {
       return $this->array;        return $this->array;
   }    }
} }