/**
  * Graba el registro nuevo alojado en el request en la tabla pasada por parámetro,
  * y alimenta la vista de forma que devuelva los mensajes de error/éxito procedentes.
  *
  * @param $tabla
  * @return $this|\Illuminate\Contracts\View\Factory|\Illuminate\View\View
  */
 public function store($tabla)
 {
     //Recuperamos el contenido del request del formulario correspondiente
     //al nuevo registro:
     $request = \Request::instance();
     //Reiniciamos los diferentes flags  y variables que necesitamos para valorar la situación
     //final de la operación:
     $ok = null;
     $grabado = null;
     $validacion = null;
     //Dependiendo de la tabla de la que se trate, necesitamos llamar a unas
     //validaciones y métodos de modelos diferentes:
     switch ($tabla) {
         case 'categorias':
             //Las validaciones de categoría, petición, subcategorías y usuarios_productos
             //son bastante básicas, nos limitamos a validar y grabar con los métodos ya
             //previstos en el modelo:
             $validacion = Categoria::validar($request);
             if (!$validacion->fails()) {
                 $grabado = Categoria::crear(['nombre_categoria' => $request->nombre_categoria]);
             }
             break;
         case 'peticiones':
             $validacion = Peticion::validar($request);
             if (!$validacion->fails()) {
                 $grabado = Peticion::alta($request, $request->usuario);
             }
             break;
         case 'productos':
             //Para productos tenemos más campos, pero la simplicidad es similar:
             $validacion = Producto::validar($request);
             if (!$validacion->fails()) {
                 $grabado = Producto::crear(['subcategoria' => $request->subcategoria, 'nombre_producto' => $request->nombre_producto, 'descripcion' => $request->descripcion, 'foto_producto' => $request->foto_producto, 'link_articulo' => $request->link_articulo]);
             }
             break;
         case 'subcategorias':
             $validacion = Subcategoria::validar($request);
             if (!$validacion->fails()) {
                 $grabado = Subcategoria::crear(['nombre_subcategoria' => $request->nombre_subcategoria, 'categoria' => $request->categoria]);
             }
             break;
         case 'usuarios':
             //En el caso de usuarios debemos transformar primero los campos de checkbox en datos binarios
             //que podamos alojar en la tabla prevista:
             $validacion = Usuario::validarAdmin($request);
             if (!$validacion->fails()) {
                 $data['acepto'] = isset($request->acepto) && $request->acepto ? 1 : null;
                 $data['whatsapp'] = isset($request->whatsapp) && $request->whatsapp ? 1 : 0;
                 $data['geolocalizacion'] = isset($request->geolocalizacion) && $request->geolocalizacion ? 1 : 0;
                 $grabado = Usuario::create(['nombre_usuario' => $request->nombre_usuario, 'password' => bcrypt($request->password), 'localizacion' => $request->localizacion, 'latitud' => $request->latitud, 'longitud' => $request->longitud, 'email' => $request->email, 'telefono' => $request->telefono, 'movil' => $request->movil, 'whatsapp' => $data['whatsapp'], 'geolocalizacion' => $data['geolocalizacion'], 'acepto' => $data['acepto']]);
             }
             break;
         case 'usuarios_productos':
             $validacion = Usuario_producto::validar($request);
             if (!$validacion->fails()) {
                 $grabado = Usuario_producto::create(['usuario' => $request->usuario, 'producto' => $request->producto]);
             }
     }
     //Alimentamos el resto de la vista que no tiene que ver con la grabación
     //del resistro:
     $resultados = DB::table($tabla)->get();
     $campos = DB::getSchemaBuilder()->getColumnListing($tabla);
     //En caso de grabación correcta, inicializamos las variables y flags que
     //alimentan la vista, de forma que se le pueda transmitir un mensaje de
     //Éxito al usuario:
     if ($grabado) {
         $ok = view('cpanel', ['exito' => true, 'editar' => false, 'nuevo' => false, 'tabla' => $tabla, 'id' => '', 'campos' => $campos, 'resultados' => $resultados, 'tablas' => DB::select('SHOW TABLES'), 'ddbb' => 'Tables_in_' . env('DB_DATABASE')]);
     } else {
         if ($validacion->fails()) {
             //Si no, hemos de guardar el resultado con los errores en la variable
             //prevista para ello:
             $ok = redirect()->back()->withInput()->withErrors($validacion->errors());
         } else {
             //En caso de que haya fallado la grabación en base de datos, se le pasa
             //a la vista la combinación para que muestr un mensaje de error específico.
             $ok = view('cpanel', ['exito' => false, 'editar' => false, 'nuevo' => false, 'tabla' => $tabla, 'id' => '', 'campos' => $campos, 'resultados' => $resultados, 'tablas' => DB::select('SHOW TABLES'), 'ddbb' => 'Tables_in_' . env('DB_DATABASE')]);
         }
     }
     return $ok;
 }
 /**
  * Método que crea un registro nuevo en la tabla, a a partir del nombre de producto y el código de
  * usuario pasados como parámetros. Se aprovecha el método create de la clase Model, que devuelve
  * el elemento creado.
  *
  * @param $cod_usuario
  * @param $nombre_producto
  * @return static
  */
 public static function crear($cod_usuario, $nombre_producto)
 {
     //Obtenemos primero el código del producto, con un método específico de la clase:
     $codProducto = Usuario_producto::getCodProducto($nombre_producto);
     return Usuario_producto::create(['usuario' => $cod_usuario, 'producto' => $codProducto]);
 }