'int', 'area_id' => 'int', 'space_id' => 'int', 'min_seats' => 'int', 'max_seats' => 'int', 'ordering' => 'int', 'priority' => 'int', 'bookable_staff' => 'boolean', 'bookable_online' => 'boolean', 'shareable' => 'boolean', 'settings' => 'array', // Relacion booking_table //'pivot_table_id' => 'int', //'pivot_booking_id' => 'int', //'pivot_seats' => 'json', ]; public function restaurant() { return $this->belongsTo(Restaurant::class); } public function area() { return $this->belongsTo(Area::class); } public function space() { return $this->belongsTo(Space::class); } public function getCanvasAttribute() { $settings = $this->settings; return isset($this->settings['canvas']) ? $this->settings['canvas'] : []; } public function setCanvasAttribute($value) { // When updating from the form I do not receive canvas // so don't want to save null if ($value == null) return; $settings = $this->settings; if (!is_array($settings)){ $settings = []; } if (is_array($value)) { $settings['canvas'] = $value; } else if (is_string($value)){ $settings['canvas'] = json_decode($value, true) ; } $this->attributes['settings'] = $settings; } /** * Delete tables and combinations if areaa_id does not exists * @param $restaurant_id * * @return void */ public static function removeTablesAndCombinationsWithNoAreas($restaurant_id) { $areas = Area::where('restaurant_id', $restaurant_id)->get(); $tables = Table::where('restaurant_id', $restaurant_id)->get(); $combinations = Combination::where('restaurant_id', $restaurant_id)->get(); $areas_id = $areas->map(function($area) { return $area->id; })->toArray(); $tables_id = $tables->map(function($table) { return [ 'id' => $table->id, 'area_id' => $table->area_id]; })->toArray(); $combinations_id = $combinations->map(function($combination) { return [ 'id' => $combination->id, 'area_id' => $combination->area_id]; })->toArray(); // Encontrar y borrar mesas huerfanas de area $list_to_remove = []; foreach($tables_id as $table) { if (!in_array($table['area_id'], $areas_id)) { $list_to_remove[] = $table['id']; } } if (count($list_to_remove) > 0) { Table::whereIn('id', $list_to_remove)->delete(); } // Encontrar combinaciones huerfanas de area $list_to_remove = []; foreach($combinations_id as $combination) { if (!in_array($combination['area_id'], $areas_id)) { $list_to_remove[] = $combination['id']; } } if (count($list_to_remove) > 0) { Combination::whereIn('id', $list_to_remove)->delete(); } } public function isBookableOnline(){ if (!$this->bookable_online) return false; $area = $this->area; if (!$area) return false; return $area->bookable_online; } // Table Tags //-------------------------------------------------------------- // Relación many-to-many con etiquetas de mesa public function ttags() { return $this->belongsToMany(TTag::class, 'table_ttag', 'table_id', 'ttag_id'); } // Alias para mantener consistencia con otras entidades public function tags() { return $this->ttags(); } // Obtener lista de IDs de etiquetas public function getTagsListAttribute() { return $this->ttags->map(function($tag) { return intval($tag->id); })->toArray(); } // Lo necesito para evitar errores cuando actualiza el floor editor con las mesas public function setTagsListAttribute($list) { if (is_array($list)) { //ray('Set table tags list', $list); $this->tags()->sync($list); return true; } return false; } // Obtener nombres de etiquetas como string public function getTagsListNamesAttribute() { $names = $this->tagsListNamesArray; return implode(', ', $names); } // Obtener nombres de etiquetas como array public function getTagsListNamesArrayAttribute() { $names = $this->ttags->map(function($tag) { return $tag->name; })->toArray(); return $names; } // Sincronizar etiquetas de la mesa public function syncTags($tagIds) { if (is_array($tagIds)) { $this->ttags()->sync($tagIds); } else { $this->ttags()->sync([]); } } // Añadir etiqueta a la mesa public function addTag($tagId) { if (!$this->ttags->contains($tagId)) { $this->ttags()->attach($tagId); } } // Remover etiqueta de la mesa public function removeTag($tagId) { $this->ttags()->detach($tagId); } // Verificar si la mesa tiene una etiqueta específica public function hasTag($tagId) { return $this->ttags->contains('id', $tagId); } // Verificar si la mesa tiene alguna de las etiquetas public function hasAnyTag($tagIds) { if (!is_array($tagIds)) { $tagIds = [$tagIds]; } foreach ($tagIds as $tagId) { if ($this->hasTag($tagId)) { return true; } } return false; } // Verificar si la mesa tiene todas las etiquetas public function hasAllTags($tagIds) { if (!is_array($tagIds)) { $tagIds = [$tagIds]; } foreach ($tagIds as $tagId) { if (!$this->hasTag($tagId)) { return false; } } return true; } /* // Filtrar mesas por etiquetas public static function withTags($tagIds, $restaurant_id = null) { if (!is_array($tagIds)) { $tagIds = [$tagIds]; } $query = static::query() ->join('table_ttag', 'tables.id', '=', 'table_ttag.table_id') ->join('ttags', 'table_ttag.ttag_id', '=', 'ttags.id') ->whereIn('ttags.id', $tagIds) ->select('tables.*') ->distinct(); if ($restaurant_id) { $query->where('tables.restaurant_id', $restaurant_id); } return $query; } // Buscar mesas por nombre de etiqueta public static function withTagNames($tagNames, $restaurant_id = null) { if (!is_array($tagNames)) { $tagNames = [$tagNames]; } $query = static::query() ->join('table_ttag', 'tables.id', '=', 'table_ttag.table_id') ->join('ttags', 'table_ttag.ttag_id', '=', 'ttags.id') ->whereIn('ttags.name', $tagNames) ->select('tables.*') ->distinct(); if ($restaurant_id) { $query->where('tables.restaurant_id', $restaurant_id); } return $query; } // Obtener mesas sin etiquetas public static function withoutTags($restaurant_id = null) { $query = static::query() ->leftJoin('table_ttag', 'tables.id', '=', 'table_ttag.table_id') ->whereNull('table_ttag.table_id'); if ($restaurant_id) { $query->where('tables.restaurant_id', $restaurant_id); } return $query; } // Método para cargar con etiquetas public function loadWithTags() { $this->load('ttags'); return $this; } // Scope para incluir etiquetas automáticamente public function scopeWithTableTags($query) { return $query->with('ttags'); }*/ }