public function add_rule($hash_id, Request $request)
 {
     $enfermedad = Disease::findOrFail($this->decode($hash_id));
     $sintomas = Symptom::orderBy('name', 'asc')->lists('name', 'id')->toArray();
     $reglas = Rule::with('symptom')->where('disease_id', $enfermedad->id)->get()->groupBy('number');
     if ($request->isMethod('post')) {
         $this->validate($request, ['sintomas' => 'required']);
         if ($this->checkIfRuleExists($request->sintomas)) {
             alert('La regla ya existe, por favor ingrese otros síntomas', 'danger');
             return redirect()->back();
         }
         $lastRule = Rule::orderBy('id', 'desc')->first();
         if (is_null($lastRule)) {
             $numberRule = 1;
         } else {
             $numberRule = intval($lastRule->number) + 1;
         }
         $symptoms = Symptom::findOrFail($request->sintomas);
         foreach ($symptoms as $symptom) {
             $rule = new Rule();
             $rule->number = $numberRule;
             $rule->disease()->associate($enfermedad);
             $rule->symptom()->associate($symptom);
             $rule->save();
         }
         alert('Se registró la regla con éxito');
         return redirect()->back();
     }
     return view('admin.disease.add_rule')->with('enfermedad', $enfermedad)->with('reglas', $reglas)->with('sintomas', $sintomas);
 }
 public function index()
 {
     $countDiagnostic = count(auth()->user()->diagnostics);
     $countDiseases = Disease::count();
     $countSymptom = Symptom::count();
     $diagnostics = Diagnostic::with('disease')->where('user_id', auth()->user()->id)->orderBy('created_at', 'desc')->take(5)->get();
     return view('user.home')->with('countSymptom', $countSymptom)->with('countDiseases', $countDiseases)->with('countDiagnostic', $countDiagnostic)->with('diagnostics', $diagnostics);
 }
 public function home()
 {
     $countDiseases = Disease::count();
     $countSymptom = Symptom::count();
     $countDiagnostic = Diagnostic::count();
     $lastRegistered = User::orderBy('created_at', 'desc')->take(9)->get();
     return view('admin.home')->with('countDiagnostic', $countDiagnostic)->with('countSymptom', $countSymptom)->with('countDiseases', $countDiseases)->with('lastRegistered', $lastRegistered);
 }
 public function search(SearchRequest $request)
 {
     if (!$request->has('search')) {
         return redirect()->route('admin::sintoma::create');
     }
     $sintomas = Symptom::search($request->search)->get();
     return view('admin.symptom.result')->with('sintomas', $sintomas);
 }
 public function analyze(Request $request)
 {
     if ($request->isMethod('post')) {
         $this->validate($request, ['sintoma' => 'required'], ['sintoma.required' => 'Debe seleccionar un síntoma para continuar']);
         if ($request->session()->has('session_sintomas')) {
             // Acá busca si el elemento no está en el array de session, para agregarlo
             $sessionSymptoms = $request->session()->get('session_sintomas');
             if (!in_array($request->sintoma, $sessionSymptoms)) {
                 $sessionSymptoms[] = $request->sintoma;
                 $request->session()->put(['session_sintomas' => $sessionSymptoms]);
             }
         } else {
             $request->session()->put(['session_sintomas' => [$request->sintoma]]);
         }
     }
     $sessionSymptoms = $request->session()->get('session_sintomas');
     // Buscamos en la tabla de reglas con los síntomas obtenidos de la sesión primero buscando
     // por síntomas  y después buscando por número de regla
     $rules = Rule::with('symptom')->whereIn('symptom_id', $sessionSymptoms)->get()->groupBy('number');
     //dd($rules, $sessionSymptoms);
     list($rulesKeys) = array_divide($rules->toArray());
     // Después buscamos en la tabla de reglas en base a número de su regla
     // obtenido en la anterior operación
     $rules = Rule::with('symptom')->whereIn('number', $rulesKeys)->get()->groupBy('number');
     //Agrupamos los interiores de las reglas en base al número de su síntoma
     $rules = $rules->map(function ($symptoms, $key) {
         return $symptoms->groupBy('symptom_id');
     });
     // Filtramos solo las reglas que contengan un número de síntomas igual a
     // los de la sesión o mayores y que los síntomas de la sesión estén
     // contenidos en cada una de las reglas.
     // Ej: [1,7,9] >= [1, 9] && [1,9] = [1,9]
     $rules = $rules->filter(function ($rule) use($sessionSymptoms) {
         list($symptomKeys) = array_divide($rule->toArray());
         $intersect = array_intersect($sessionSymptoms, $symptomKeys);
         if ($rule->count() >= count($sessionSymptoms) && $intersect == $sessionSymptoms) {
             return true;
         }
     });
     //dd($rules, $sessionSymptoms);
     $symptomsForSelect = [];
     $diagnosticId = 0;
     $maxSymptomKey = 0;
     //dd($rules);
     foreach ($rules as $key => $ruleNumber) {
         list($symptomKeys) = array_divide($ruleNumber->toArray());
         $difference = array_diff($symptomKeys, $sessionSymptoms);
         // Contamos el arreglo de sintomas para saber cual es el que tendrá
         // más elementos y lo asignamos a la variable maxSymptomKey
         if (count($symptomKeys) > $maxSymptomKey) {
             $maxSymptomKey = count($symptomKeys);
         }
         //dd($difference, $symptomKeys);
         // Si esta vacío significa que no hay diferencias
         if (empty($difference)) {
             // tomamos el primer elemento del primer elemento de la coleccion
             // (está ordenado por id_sintoma)
             $diseaseKey = $ruleNumber->first()->first()->disease_id;
             $diagnosticId = $this->generateDiagnostic($diseaseKey, $request->user()->id);
             $request->session()->forget('session_sintomas');
             return redirect()->route('user::diagnosticos::show', $this->encode($diagnosticId));
         } elseif ($symptomKeys == $difference) {
             alert('No se encontró ninguna enfermedad con los síntomas brindados, intente de nuevo', 'danger');
             return redirect()->route('user::diagnosticos::create');
         } else {
             $tempSymptoms = Symptom::findOrFail($difference);
             foreach ($tempSymptoms as $tempSymptom) {
                 $symptomsForSelect[$tempSymptom->id] = $tempSymptom->name;
             }
         }
     }
     // Si se acabaron los síntomas o si los síntomas en sesión son mayores
     // al mayor arreglo por regla entonces es porque la enfermedad es
     // indetectable con los síntomas ingresados.
     // Ej: Máxima Regla = [1, 3, 9, 10]
     // Ej: Síntoma en sesión = [1, 3, 4, 5, 9, 10, 13]
     $numberSessionSymtoms = count($request->session()->get('session_sintomas'));
     if (empty($symptomsForSelect) || $numberSessionSymtoms > $maxSymptomKey) {
         alert('No se encontró ninguna enfermedad con los síntomas brindados, intente de nuevo', 'danger');
         return redirect()->route('user::diagnosticos::create');
     }
     // Listar los síntomas escogidos
     $tempSymptoms = Symptom::findOrFail($request->session()->get('session_sintomas'));
     foreach ($tempSymptoms as $tempSymptom) {
         $showSymptoms[$tempSymptom->id] = $tempSymptom->name;
     }
     return view('user.diagnostic.create')->with('showSymptoms', $showSymptoms)->with('sintomas', $symptomsForSelect);
 }
 public function index()
 {
     $sintomas = Symptom::orderBy('name', 'asc')->paginate(20);
     return view('user.symptom.index')->with('sintomas', $sintomas);
 }