Snippets Collections
touch resources/views/constancias-servicio/{index,create,show,edit}.blade.php
Recomendación: Usa la Opción 1 si es un solo registro, ya que es más simple y directa.

esto no lo puedo hacer de una manera mas simplificada:INSERT INTO public.entes
SELECT
    (data->>'id_ente')::integer,
    data->>'nombre_ente',
    data->>'descripcion',
    (data->>'id_sector')::integer,
    (data->>'id_estatus')::integer,
    data->>'rif',
    data->>'direccion',
    data->>'telf_ente',
    (data->>'id_asociacionente')::integer
FROM json_array_elements('[
    {
        "id_ente": 25,
        "nombre_ente": "FUVIDIT",
        "descripcion": "Fundación Venezolana de Investigación, Desarrollo e Innovación para el Transporte",
        "id_sector": 1,
        "id_estatus": 2,
        "rif": "RIF. G-20016149-3",
        "direccion": "Av. Francisco de Miranda con Av. hacia autopista Francisco Fajardo frente al Museo del Transporte, antiguo Complejo Vivero Odebrecht, Código Postal 1071, Edo. Miranda",
        "telf_ente": "(0212) 238.33.47",
        "id_asociacionente": 5
    }
]') AS data;
¡Sí, puedes simplificarlo! PostgreSQL tiene formas más directas para trabajar con JSON. Aquí te muestro algunas opciones más simplificadas:

Opción más simple (PostgreSQL 9.4+):
sql
INSERT INTO public.entes
SELECT * FROM json_populate_record(
    NULL::public.entes,
    '{
        "id_ente": 25,
        "nombre_ente": "FUVIDIT",
        "descripcion": "Fundación Venezolana de Investigación, Desarrollo e Innovación para el Transporte",
        "id_sector": 1,
        "id_estatus": 2,
        "rif": "RIF. G-20016149-3",
        "direccion": "Av. Francisco de Miranda con Av. hacia autopista Francisco Fajardo frente al Museo del Transporte, antiguo Complejo Vivero Odebrecht, Código Postal 1071, Edo. Miranda",
        "telf_ente": "(0212) 238.33.47",
        "id_asociacionente": 5
    }'
);
Otra forma aún más directa (PostgreSQL 9.5+):
sql
INSERT INTO public.entes
SELECT *
FROM jsonb_to_record('{
    "id_ente": 25,
    "nombre_ente": "FUVIDIT",
    "descripcion": "Fundación Venezolana de Investigación, Desarrollo e Innovación para el Transporte",
    "id_sector": 1,
    "id_estatus": 2,
    "rif": "RIF. G-20016149-3",
    "direccion": "Av. Francisco de Miranda con Av. hacia autopista Francisco Fajardo frente al Museo del Transporte, antiguo Complejo Vivero Odebrecht, Código Postal 1071, Edo. Miranda",
    "telf_ente": "(0212) 238.33.47",
    "id_asociacionente": 5
}') AS x(
    id_ente integer,
    nombre_ente varchar,
    descripcion varchar,
    id_sector integer,
    id_estatus integer,
    rif varchar,
    direccion varchar,
    telf_ente varchar,
    id_asociacionente integer
);
La más simple de todas (si tienes el JSON como variable):
Si estás usando un lenguaje de programación, la forma más simple sería:

sql
-- Si estás en psql o tienes el JSON como texto
\set contenido_json '{"id_ente":25,"nombre_ente":"FUVIDIT","descripcion":"Fundación Venezolana de Investigación, Desarrollo e Innovación para el Transporte","id_sector":1,"id_estatus":2,"rif":"RIF. G-20016149-3","direccion":"Av. Francisco de Miranda con Av. hacia autopista Francisco Fajardo frente al Museo del Transporte, antiguo Complejo Vivero Odebrecht, Código Postal 1071, Edo. Miranda","telf_ente":"(0212) 238.33.47","id_asociacionente":5}'

INSERT INTO public.entes SELECT * FROM json_populate_record(NULL::public.entes, :'contenido_json');
Mi recomendación:
Usa json_populate_record (primera opción) porque:

Es más corto y legible

No necesitas especificar los tipos de datos manualmente

Se adapta automáticamente a la estructura de la tabla

Es nativo de PostgreSQL

sql
-- Esta es la más simple y elegante:
INSERT INTO public.entes
SELECT * FROM json_populate_record(
    NULL::public.entes,
    '{"id_ente":25,"nombre_ente":"FUVIDIT","descripcion":"Fundación Venezolana de Investigación, Desarrollo e Innovación para el Transporte","id_sector":1,"id_estatus":2,"rif":"RIF. G-20016149-3","direccion":"Av. Francisco de Miranda con Av. hacia autopista Francisco Fajardo frente al Museo del Transporte, antiguo Complejo Vivero Odebrecht, Código Postal 1071, Edo. Miranda","telf_ente":"(0212) 238.33.47","id_asociacionente":5}'
);
Nota: Si tu JSON tiene un array (como en tu ejemplo original con []), usa json_populate_recordset en lugar de json_populate_record.

Listar todas las tareas disponibles:
bash
task --list-all
3. Ejecutar tareas específicas:
Instalación completa:

bash
task all
Solo herramientas esenciales:

bash
task quick
Para desarrollo web:

bash
task web-dev
Configurar solo el terminal:

bash
task terminal-setup
Instalación mínima:

bash
task minimal
Verificar lo instalado:

bash
task check
Ejecutar el script bash original:

bash
task run-script
Pasos finales de configuración:

bash
task finalize
4. Ejecutar pasos específicos:
Si quieres ejecutar solo ciertas partes:

bash
task update-system    # Solo actualizar sistema
task git              # Solo instalar Git
task vscode           # Solo instalar VS Code
task php              # Solo instalar PHP
task database         # Solo instalar bases de datos
task terminal         # Solo configurar terminal
task nodejs           # Solo instalar Node.js
5. Tareas de mantenimiento:
bash
task clean            # Limpiar archivos temporales
task fix-permissions  # Corregir permisos
task backup-zsh       # Hacer backup de Zsh
Ejemplos prácticos:
Ejemplo 1: Instalación paso a paso
bash
# Primero lo básico
task minimal

# Luego añadir PHP
task php

# Finalmente bases de datos
task database
Ejemplo 2: Solo herramientas de desarrollo
bash
task tools
Ejemplo 3: Instalación con logging
bash
task all 2>&1 | tee installation.log
Ejemplo 4: Modo dry-run (ver qué haría)
bash
task --dry all
Ventajas de usar Taskfile:
Modularidad: Puedes ejecutar partes específicas

Reusabilidad: Fácil de modificar y extender

Legibilidad: Comandos bien organizados

Documentación: Cada tarea tiene descripción

Cross-platform: Funciona en Linux, macOS, Windows

Personalización adicional:
Puedes añadir estas variables al inicio del Taskfile para personalizar:

yaml
vars:
  # Personalizar versiones
  NODE_VERSION: "22"
  PHP_VERSION: "8.4"
  
  # Rutas personalizadas
  PROJECTS_DIR: "/var/www/html"
  ZSH_THEME: "powerlevel10k/powerlevel10k"
  
  # Opciones de instalación
  INSTALL_CHROME: true
  INSTALL_VSCODE: true
¿Quieres que añada alguna funcionalidad específica o modifique algo del Taskfile?

version: '3'

# Variables globales
vars:
  SCRIPT_NAME: setup-dev.sh
  LOG_FILE: setup.log

# Entorno de ejecución
env:
  DEBIAN_FRONTEND: noninteractive

tasks:
  # ============================================
  # TAREA POR DEFECTO - MOSTRAR AYUDA
  # ============================================
  default:
    desc: "Muestra ayuda de tareas disponibles"
    cmds:
      - task --list-all

  # ============================================
  # TAREAS PRINCIPALES
  # ============================================
  all:
    desc: "Ejecuta todo el proceso de instalación completo"
    deps: [dependencies, tools, php, database, terminal, nodejs, finalize]
    cmds:
      - echo "✅ Instalación completa finalizada"
      - echo "📋 Resumen en: {{.LOG_FILE}}"

  quick:
    desc: "Instalación rápida (solo herramientas esenciales)"
    deps: [update-system, git, vscode, chrome, python, terminal-basics]
    cmds:
      - echo "✅ Instalación rápida completada"

  # ============================================
  # TAREAS POR SECCIONES
  # ============================================
  update-system:
    desc: "Actualizar sistema y dependencias básicas"
    cmds:
      - echo "🔄 Actualizando sistema..."
      - sudo apt update && sudo apt upgrade -y || true
      - sudo apt install -y wget curl gpg gnupg2 software-properties-common apt-transport-https ca-certificates lsb-release || true

  git:
    desc: "Instalar Git"
    cmds:
      - echo "📦 Instalando Git..."
      - sudo apt install -y git || true
      - git --version || echo "Git no se pudo instalar"

  vscode:
    desc: "Instalar VS Code"
    cmds:
      - |
        echo "💻 Instalando VS Code..."
        if ! command -v code &> /dev/null; then
          sudo mkdir -p /etc/apt/keyrings
          curl -fsSL https://packages.microsoft.com/keys/microsoft.asc | sudo gpg --dearmor -o /etc/apt/keyrings/packages.microsoft.gpg
          echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/packages.microsoft.gpg] https://packages.microsoft.com/repos/code stable main" | sudo tee /etc/apt/sources.list.d/vscode.list
          sudo apt update
          sudo apt install -y code || true
        else
          echo "VS Code ya está instalado"
        fi

  chrome:
    desc: "Instalar Google Chrome"
    cmds:
      - |
        echo "🌐 Instalando Google Chrome..."
        if ! command -v google-chrome-stable &> /dev/null && ! command -v google-chrome &> /dev/null; then
          sudo mkdir -p /etc/apt/keyrings
          curl -fsSL https://dl.google.com/linux/linux_signing_key.pub | sudo gpg --dearmor -o /etc/apt/keyrings/google-chrome.gpg
          echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/google-chrome.gpg] https://dl.google.com/linux/chrome/deb/ stable main" | sudo tee /etc/apt/sources.list.d/google-chrome.list
          sudo apt update
          sudo apt install -y google-chrome-stable || true
        else
          echo "Google Chrome ya está instalado"
        fi

  python:
    desc: "Instalar Python y herramientas"
    cmds:
      - echo "🐍 Instalando Python..."
      - sudo apt install -y python3 python3-pip python3-venv build-essential || true
      - python3 --version || echo "Python no se pudo instalar"

  # ============================================
  # GRUPOS DE TAREAS
  # ============================================
  dependencies:
    desc: "Instalar dependencias del sistema"
    cmds:
      - task: update-system
      - task: git

  tools:
    desc: "Instalar herramientas de desarrollo"
    cmds:
      - task: vscode
      - task: chrome
      - task: python

  php:
    desc: "Instalar PHP y Composer"
    cmds:
      - |
        echo "🐘 Instalando PHP..."
        sudo add-apt-repository ppa:ondrej/php -y
        sudo apt update
        
        # Instalar PHP 8.4
        sudo apt install -y php8.4 php8.4-pgsql php8.4-cli php8.4-fpm php8.4-mysql php8.4-zip \
          php8.4-gd php8.4-mbstring php8.4-curl php8.4-xml php8.4-bcmath || true
        
        # Configurar PHP 8.4 como predeterminado
        sudo update-alternatives --set php /usr/bin/php8.4 2>/dev/null || true
        
        # Instalar Composer
        if ! command -v composer &> /dev/null; then
          php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
          sudo php composer-setup.php --install-dir=/usr/local/bin --filename=composer
          php -r "unlink('composer-setup.php');"
        fi

  database:
    desc: "Instalar bases de datos y herramientas"
    cmds:
      - |
        echo "🗄️ Instalando PostgreSQL..."
        sudo apt install -y postgresql postgresql-contrib || true
        
        echo "🔧 Instalando pgAdmin4..."
        sudo apt install -y pgadmin4-desktop || true
        
        echo "🌐 Instalando Apache2..."
        sudo apt install -y apache2 || true

  terminal:
    desc: "Configurar terminal con Zsh y plugins"
    cmds:
      - |
        echo "💻 Configurando terminal..."
        
        # Instalar Zsh
        sudo apt install -y zsh || true
        
        # Instalar Oh My Zsh
        if [ ! -d "$HOME/.oh-my-zsh" ]; then
          sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" "" --unattended || true
        fi
        
        # Instalar Powerlevel10k
        if [ ! -d "${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k" ]; then
          git clone --depth=1 https://github.com/romkatv/powerlevel10k.git "${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k" || true
        fi
        
        # Instalar plugins
        if [ ! -d "${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions" ]; then
          git clone https://github.com/zsh-users/zsh-autosuggestions "${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions" || true
        fi
        
        if [ ! -d "${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting" ]; then
          git clone https://github.com/zsh-users/zsh-syntax-highlighting.git "${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting" || true
        fi

  terminal-basics:
    desc: "Instalación básica de terminal"
    cmds:
      - echo "🖥️ Instalando herramientas de terminal..."
      - sudo apt install -y zsh yakuake || true

  nodejs:
    desc: "Instalar Node.js y NVM"
    cmds:
      - |
        echo "⬢ Instalando Node.js..."
        if [ ! -d "$HOME/.nvm" ]; then
          curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
          
          # Cargar NVM temporalmente
          export NVM_DIR="$HOME/.nvm"
          [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
          
          # Instalar Node.js
          nvm install 22
          nvm use 22
          nvm alias default 22
        fi

  # ============================================
  # TAREAS DE UTILIDAD
  # ============================================
  run-script:
    desc: "Ejecutar el script bash original completo"
    cmds:
      - |
        if [ -f "{{.SCRIPT_NAME}}" ]; then
          echo "🚀 Ejecutando script original..."
          chmod +x {{.SCRIPT_NAME}}
          ./{{.SCRIPT_NAME}} | tee {{.LOG_FILE}}
        else
          echo "❌ Archivo {{.SCRIPT_NAME}} no encontrado"
          echo "   Copia tu script bash a este directorio o actualiza la variable SCRIPT_NAME"
        fi

  run-step:
    desc: "Ejecutar un paso específico del script original"
    vars:
      STEP:
        sh: "echo 'Ingresa el número del paso (1-25): ' && read step && echo $step"
    cmds:
      - |
        echo "🔧 Ejecutando paso {{.STEP}}..."
        # Esta es una implementación básica, puedes expandirla según tus necesidades
        case "{{.STEP}}" in
          1) echo "Actualizando sistema..." && sudo apt update && sudo apt upgrade -y ;;
          2) echo "Instalando dependencias..." && sudo apt install -y wget curl gpg gnupg2 software-properties-common ;;
          *) echo "Paso {{.STEP}} no implementado" ;;
        esac

  check:
    desc: "Verificar instalaciones"
    cmds:
      - |
        echo "🔍 Verificando instalaciones..."
        echo ""
        echo "=== VERSIONES INSTALADAS ==="
        command -v git >/dev/null && echo "✅ Git: $(git --version)" || echo "❌ Git: No instalado"
        command -v php >/dev/null && echo "✅ PHP: $(php --version | head -n1)" || echo "❌ PHP: No instalado"
        command -v python3 >/dev/null && echo "✅ Python: $(python3 --version)" || echo "❌ Python: No instalado"
        command -v node >/dev/null && echo "✅ Node.js: $(node --version)" || echo "❌ Node.js: No instalado"
        command -v zsh >/dev/null && echo "✅ Zsh: $(zsh --version)" || echo "❌ Zsh: No instalado"
        [ -d "$HOME/.oh-my-zsh" ] && echo "✅ Oh My Zsh: Instalado" || echo "❌ Oh My Zsh: No instalado"
        command -v code >/dev/null && echo "✅ VS Code: Instalado" || echo "❌ VS Code: No instalado"
        command -v psql >/dev/null && echo "✅ PostgreSQL: Instalado" || echo "❌ PostgreSQL: No instalado"

  finalize:
    desc: "Pasos finales de configuración"
    cmds:
      - |
        echo "🎯 Pasos finales:"
        echo "1. Para usar Zsh como shell predeterminado:"
        echo "   chsh -s $(which zsh)"
        echo ""
        echo "2. Para configurar Powerlevel10k:"
        echo "   p10k configure"
        echo ""
        echo "3. Recargar configuración:"
        echo "   source ~/.zshrc"
        echo ""
        echo "4. Para ver alias personalizados:"
        echo "   cat ~/.zshrc | grep '^alias'"

  clean:
    desc: "Limpiar archivos temporales"
    cmds:
      - echo "🧹 Limpiando archivos temporales..."
      - rm -f {{.LOG_FILE}} composer-setup.php 2>/dev/null || true
      - echo "✅ Limpieza completada"

  # ============================================
  # FLUJOS DE TRABAJO ESPECÍFICOS
  # ============================================
  web-dev:
    desc: "Configuración para desarrollo web"
    deps: [dependencies, php, database, nodejs]
    cmds:
      - echo "✅ Entorno web listo para PHP, Node.js y PostgreSQL"

  terminal-setup:
    desc: "Configurar terminal personalizado"
    deps: [terminal-basics, terminal]
    cmds:
      - echo "✅ Terminal personalizado configurado"
      - echo "🔧 Ejecuta 'task finalize' para completar la configuración"

  minimal:
    desc: "Instalación mínima para empezar"
    cmds:
      - task: update-system
      - task: git
      - task: vscode
      - task: terminal-basics
      - echo "✅ Instalación mínima completada"

  # ============================================
  # TAREAS DE MANTENIMIENTO
  # ============================================
  fix-permissions:
    desc: "Corregir permisos de archivos"
    cmds:
      - echo "🔧 Corrigiendo permisos..."
      - chmod +x {{.SCRIPT_NAME}} 2>/dev/null || true
      - chmod 644 Taskfile.yml 2>/dev/null || true
      - echo "✅ Permisos corregidos"

  backup-zsh:
    desc: "Crear backup de configuración Zsh"
    cmds:
      - |
        echo "💾 Creando backup de Zsh..."
        BACKUP_DIR="zsh-backup-$(date +%Y%m%d_%H%M%S)"
        mkdir -p "$BACKUP_DIR"
        cp -r ~/.zshrc ~/.oh-my-zsh "$BACKUP_DIR"/ 2>/dev/null || true
        echo "✅ Backup creado en: $BACKUP_DIR"
Herramientas Incluidas en DevToys
DevToys incluye muchas herramientas útiles:

Convertidores:
JSON ↔ YAML

Número a Base (Binario, Hex, Decimal)

String (Base64, URL, HTML)

Timestamp ↔ Fecha

Codificadores/Decodificadores:
Base64

URL

JWT Decoder

HTML

Formateadores:
JSON

SQL

XML

Generadores:
Hash (MD5, SHA1, SHA256, etc.)

UUID

Lorem Ipsum

Código QR

Código de Barras

Texto:
Comparador de texto

Expresiones regulares

Inspector de texto

Gráficos:
Convertidor de color

Selector de color

Generador de degradados

Herramientas diversas:
Verificador de tipos MIME

Validador de tarjetas de crédito

Uso Práctico - Ejemplos
1. Convertir JSON a YAML
text
1. Abre DevToys
2. Ve a "Convertidores" → "JSON <> YAML"
3. Pega tu JSON en la izquierda
4. Automáticamente verás el YAML a la derecha
2. Codificar/Decodificar Base64
text
1. Ve a "Codificadores" → "Base64"
2. En "Texto plano", escribe tu texto
3. En "Base64" verás automáticamente la versión codificada
4. O pega Base64 para decodificar
3. Generar UUID
text
1. Ve a "Generadores" → "UUID"
2. Haz clic en "Generar"
3. Copia el UUID generado
4. Formatear JSON
text
1. Ve a "Formateadores" → "JSON"
2. Pega tu JSON minificado
3. Haz clic en "Formatear"
4. Copia el JSON formateado
Configuración Avanzada
Ejecutar desde terminal con parámetros:
bash
# Si usas AppImage
./devtoys.AppImage --help

# Ejecutar minimizado
./devtoys.AppImage --minimized

# Especificar idioma
./devtoys.AppImage --lang es
Integrar con tu workflow:
bash
# Usar DevToys para decodificar Base64 desde terminal
echo "SGVsbG8gV29ybGQh" | base64 -d
# Pero con DevToys GUI puedes ver múltiples formatos a la vez
Solución de Problemas Comunes
Si AppImage no ejecuta:
bash
# Error: "No se puede ejecutar el binario"
# Instalar FUSE
sudo apt install fuse libfuse2

# Dar permisos
chmod +x devtoys.AppImage

# Ejecutar con appimagelauncher (opcional)
sudo apt install appimagelauncher
Si Flatpak no funciona:
bash
# Instalar soporte Flatpak si no lo tienes
sudo apt install flatpak

# Reiniciar sesión después de instalar
# O ejecutar:
flatpak --user install flathub com.veler.DevToys
Actualizar DevToys:
bash
# Para AppImage:
# 1. Descargar nueva versión
# 2. Reemplazar el archivo viejo

# Para Flatpak:
flatpak update com.veler.DevToys

# Para Snap:
sudo snap refresh devtoys
Alternativas si DevToys no te funciona
Herramientas similares en terminal:
bash
# jq para JSON
sudo apt install jq
echo '{"nombre":"test"}' | jq

# yq para YAML
sudo apt install yq

# Convertir JSON a YAML con Python
python3 -c "import json,yaml,sys; print(yaml.dump(json.load(sys.stdin)))" < archivo.json

# Herramientas de hash
echo -n "texto" | md5sum
echo -n "texto" | sha256sum

# Base64
echo "texto" | base64
echo "dGV4dG8K" | base64 -d
Herramientas GUI alternativas:
Gpick: Selector de colores

Meld: Comparador de archivos

DBeaver: Para SQL

Postman: Para APIs

Mi Recomendación
Para Linux Mint, recomiendo:

bash
# 1. Instalar Flatpak (si no lo tienes)
sudo apt install flatpak
flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo

# 2. Instalar DevToys
flatpak install flathub com.veler.DevToys

# 3. Crear acceso directo en el menú
flatpak run com.veler.DevToys
# La primera vez se creará automáticamente en el menú

# 4. Buscar "DevToys" en el menú de aplicaciones
Ventajas de Flatpak:

Actualizaciones automáticas

Integrado con el sistema

Aislamiento (sandbox)

Más estable

Para uso rápido desde terminal:

bash
# Crear alias en tu .bashrc o .zshrc
echo 'alias devtoys="flatpak run com.veler.DevToys"' >> ~/.bashrc
source ~/.bashrc

# Ahora puedes ejecutar simplemente:
devtoys
Métodos de Instalación
Método 1: AppImage (Recomendado - Más fácil)
bash
# Descargar DevToys AppImage
wget https://github.com/veler/DevToys/releases/download/v1.0.16/DevToys-1.0.16-x86_64.AppImage

# Dar permisos de ejecución
chmod +x DevToys-1.0.16-x86_64.AppImage

# Ejecutar directamente
./DevToys-1.0.16-x86_64.AppImage

# Opcional: Mover a bin para usar desde cualquier lugar
sudo mv DevToys-1.0.16-x86_64.AppImage /usr/local/bin/devtoys
devtoys  # Ahora puedes ejecutarlo así
Método 2: Flatpak (Desde repositorio oficial)
bash
# 1. Añadir el repositorio de Flathub
flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo

# 2. Instalar DevToys
flatpak install flathub com.veler.DevToys

# 3. Ejecutar
flatpak run com.veler.DevToys

# 4. Crear lanzador en el menú (opcional)
flatpak install --assumeyes flathub com.veler.DevToys
Método 3: Snap (Otra opción)
bash
# Instalar desde Snap Store
sudo snap install devtoys

# Ejecutar
devtoys
Método 4: Descargar desde GitHub Releases
bash
# Ir a la página de releases
# https://github.com/veler/DevToys/releases

# Descargar la última versión .deb (para Linux Mint/Debian)
wget https://github.com/veler/DevToys/releases/download/v1.0.16/devtoys_1.0.16_amd64.deb

# Instalar
sudo dpkg -i devtoys_1.0.16_amd64.deb

# Si hay dependencias faltantes
sudo apt --fix-broken install

# Ejecutar
devtoys
Configuración Inicial
Crear acceso directo en el menú:
bash
# Crear archivo .desktop para AppImage
cat > ~/.local/share/applications/devtoys.desktop << EOF
[Desktop Entry]
Name=DevToys
Comment=Developer Tools
Exec=/home/$USER/devtoys.AppImage
Icon=/home/$USER/.local/share/icons/devtoys.png
Terminal=false
Type=Application
Categories=Development;
EOF

# Descargar un icono (opcional)
mkdir -p ~/.local/share/icons
wget https://raw.githubusercontent.com/veler/DevToys/main/Assets/appicon.ico -O ~/.local/share/icons/devtoys.png
1. Método más simple (Linux/macOS)
bash
# Descargar e instalar con un comando
sudo sh -c "$(curl --location https://taskfile.dev/install.sh)" -- -d -b /usr/local/bin

ejemplo de uso en la ruta actual ejecuta el comando task hola:

version: '3'

tasks:
  hola:
    desc: "Saludo de prueba"
    cmds:
      - echo "¡Taskfile funciona correctamente!"
      - echo "Sistema: $(uname -s)"
🚀 Guía Completa: Instalación de Zsh + Oh My Zsh + Powerlevel10k desde Cero
📋 PRIMERO: Verificar tu entorno actual
bash
# Verifica qué shell estás usando actualmente
echo $SHELL        # Shell por defecto
echo $0            # Shell actual en uso
ps -p $$           # Proceso actual

# Verifica si ya tienes instalaciones previas
ls -la ~/.oh-my-zsh/ 2>/dev/null || echo "No hay Oh My Zsh instalado"
ls -la ~/.powerlevel10k/ 2>/dev/null || echo "No hay Powerlevel10k instalado"
🔄 OPCIONAL: Limpiar instalaciones anteriores (si es necesario)
bash
# ⚠️ SOLO EJECUTAR SI QUIERES PARTIR DESDE CERO ⚠️
# Esto eliminará configuraciones previas
rm -rf ~/.oh-my-zsh ~/.powerlevel10k ~/.zshrc ~/.cache/p10k*
echo "Configuraciones anteriores eliminadas"
🎯 PASO 1: Instalar Zsh (si no lo tienes)
Para Debian/Ubuntu/MX Linux:
bash
# Actualizar repositorios e instalar Zsh
sudo apt update
sudo apt install -y zsh git curl fonts-powerline

# Verificar instalación
zsh --version
Para Arch Linux:
bash
sudo pacman -S zsh git curl powerline-fonts
Para Fedora/RHEL:
bash
sudo dnf install zsh git curl powerline-fonts
🛠 PASO 2: Cambiar shell por defecto a Zsh
bash
# Cambiar el shell por defecto a Zsh
chsh -s $(which zsh)

# Verificar el cambio
echo $SHELL  # Debería mostrar /bin/zsh o similar

# IMPORTANTE: Cierra y abre una NUEVA terminal para que el cambio surta efecto
# O ejecuta:
exec zsh
⭐ PASO 3: Instalar Oh My Zsh
bash
# Instalar Oh My Zsh con el script oficial
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

# Esto creará automáticamente:
# - ~/.oh-my-zsh/         # Directorio principal
# - ~/.zshrc             # Archivo de configuración
# - Tema "robbyrussell" por defecto
🧩 PASO 4: Instalar plugins esenciales
bash
# Navegar al directorio de plugins personalizados
cd ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/

# Instalar Zsh Autosuggestions (sugerencias de comandos)
git clone https://github.com/zsh-users/zsh-autosuggestions.git

# Instalar Zsh Syntax Highlighting (resaltado de sintaxis)
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git

# Verificar que se instalaron correctamente
ls -la
🌈 PASO 5: Instalar Powerlevel10k
bash
# Método 1: Como tema de Oh My Zsh (recomendado)
git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k

# Método 2: Instalación manual (alternativa)
# git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ~/.powerlevel10k
⚙️ PASO 6: Configurar ~/.zshrc
Edita tu archivo de configuración:

bash
nano ~/.zshrc
Configuración recomendada:
bash
# ~/.zshrc - Configuración óptima

# Path a tu instalación de Oh My Zsh
export ZSH="$HOME/.oh-my-zsh"

# 1. TEMA: Usar Powerlevel10k
# COMENTA O ELIMINA: ZSH_THEME="robbyrussell"
# AÑADE:
ZSH_THEME="powerlevel10k/powerlevel10k"

# 2. PLUGINS: Lista completa de plugins
plugins=(
    git                     # Integración con Git
    zsh-autosuggestions     # Sugerencias automáticas
    zsh-syntax-highlighting # Resaltado de sintaxis
    sudo                    # Doble ESC para sudo
    history-substring-search # Búsqueda en historial
    colored-man-pages       # Manuales a color
    extract                 # Extraer archivos: extract archivo.tar.gz
    docker                  # Comandos Docker
    composer                # Comandos Composer
    laravel                 # Comandos Laravel
)

# 3. Cargar Oh My Zsh
source $ZSH/oh-my-zsh.sh

# 4. Configuración de Powerlevel10k
[[ ! -f ~/.p10k.zsh ]] || source ~/.p10k.zsh

  🔧 PASO 7: Configurar Powerlevel10k
bash
# Recargar la configuración
source ~/.zshrc

# Iniciar el configurador interactivo de Powerlevel10k
p10k configure

# Sigue las instrucciones en pantalla para personalizar tu prompt

  # Recargar toda la configuración
source ~/.zshrc
#!/bin/bash

# Colores para output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# Función para imprimir mensajes
print_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
print_success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; }
print_warning() { echo -e "${YELLOW}[WARNING]${NC} $1"; }
print_error() { echo -e "${RED}[ERROR]${NC} $1"; }

# -- Verificar si es ejecutado como root
if [[ $EUID -eq 0 ]]; then
    print_error "No ejecutes este script como root/sudo. Ejecútalo como usuario normal."
    exit 1
fi

# -- Función para instalar paquetes según la distribución
install_package() {
    local package=$1
    print_info "Instalando $package..."
    
    if command -v apt &> /dev/null; then
        sudo apt install -y "$package" 2>/dev/null || sudo apt-get install -y "$package"
    elif command -v dnf &> /dev/null; then
        sudo dnf install -y "$package"
    elif command -v yum &> /dev/null; then
        sudo yum install -y "$package"
    elif command -v pacman &> /dev/null; then
        sudo pacman -S --noconfirm "$package"
    else
        print_error "Gestor de paquetes no soportado"
        return 1
    fi
    
    return $?
}

# -- PASO 1: Actualizar el sistema
print_info "Actualizando sistema..."
sudo apt update && sudo apt upgrade -y

# -- PASO 2: Instalar dependencias básicas
print_info "Instalando dependencias básicas..."
sudo apt install -y wget curl gpg gnupg2 software-properties-common apt-transport-https ca-certificates lsb-release

# -- PASO 3: Instalar git
print_info "Instalando Git..."
install_package "git"

# -- PASO 4: Instalar vscode
print_info "Instalando VS Code..."
if ! command -v code &> /dev/null; then
    # Crear directorio para claves
    sudo mkdir -p /etc/apt/keyrings
    
    # Agregar clave GPG de Microsoft
    curl -fsSL https://packages.microsoft.com/keys/microsoft.asc | sudo gpg --dearmor -o /etc/apt/keyrings/packages.microsoft.gpg
    
    # Agregar repositorio de VS Code
    echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/packages.microsoft.gpg] https://packages.microsoft.com/repos/code stable main" | sudo tee /etc/apt/sources.list.d/vscode.list
    
    # Actualizar lista de paquetes e instalar VS Code
    sudo apt update
    install_package "code"
else
    print_info "VS Code ya está instalado"
fi

# -- PASO 5: Instalar google chrome
print_info "Instalando Google Chrome..."
if ! command -v google-chrome-stable &> /dev/null && ! command -v google-chrome &> /dev/null; then
    sudo mkdir -p /etc/apt/keyrings
    curl -fsSL https://dl.google.com/linux/linux_signing_key.pub | sudo gpg --dearmor -o /etc/apt/keyrings/google-chrome.gpg
    echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/google-chrome.gpg] https://dl.google.com/linux/chrome/deb/ stable main" | sudo tee /etc/apt/sources.list.d/google-chrome.list
    sudo apt update
    install_package "google-chrome-stable"
else
    print_info "Google Chrome ya está instalado"
fi

# -- PASO 6: Instalar php
print_info "Instalando PHP..."
sudo add-apt-repository ppa:ondrej/php -y
sudo apt update

# -- PASO 7: Instalar python
print_info "Instalando Python..."
install_package "python3"
install_package "python3-pip"
install_package "python3-venv"
install_package "build-essential"

# -- PASO 8: Instalar PHP 7.4 y extensiones comunes
print_info "Instalando PHP 7.4..."
install_package "php7.4"
install_package "php7.4-pgsql"
install_package "php7.4-cli"
install_package "php7.4-fpm"
install_package "php7.4-mysql"
install_package "php7.4-zip"
install_package "php7.4-gd"
install_package "php7.4-mbstring"
install_package "php7.4-curl"
install_package "php7.4-xml"
install_package "php7.4-bcmath"

# -- PASO 9: Instalar PHP 8.4 y extensiones
print_info "Instalando PHP 8.4..."
install_package "php8.4"
install_package "php8.4-pgsql"
install_package "php8.4-cli"
install_package "php8.4-fpm"
install_package "php8.4-mysql"
install_package "php8.4-zip"
install_package "php8.4-gd"
install_package "php8.4-mbstring"
install_package "php8.4-curl"
install_package "php8.4-xml"
install_package "php8.4-bcmath"

# -- PASO 10: Configurar PHP por defecto
print_info "Configurando PHP 8.4 como versión por defecto..."
sudo update-alternatives --set php /usr/bin/php8.4 2>/dev/null || true

# -- PASO 11: Instalar composer
print_info "Instalando Composer..."
if ! command -v composer &> /dev/null; then
    php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
    php composer-setup.php --install-dir=/usr/local/bin --filename=composer
    php -r "unlink('composer-setup.php');"
else
    print_info "Composer ya está instalado"
fi

# -- PASO 12: Instalar apache2
print_info "Instalando Apache2..."
install_package "apache2"

# -- PASO 13: Instalar postgres
print_info "Instalando PostgreSQL..."
if ! command -v psql &> /dev/null; then
    sudo mkdir -p /etc/apt/keyrings
    curl -fsS https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo gpg --dearmor -o /etc/apt/keyrings/postgresql.gpg
    echo "deb [signed-by=/etc/apt/keyrings/postgresql.gpg] https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" | sudo tee /etc/apt/sources.list.d/pgdg.list
    sudo apt update
    install_package "postgresql"
    install_package "postgresql-contrib"
else
    print_info "PostgreSQL ya está instalado"
fi

# -- PASO 14: Instalar pgadmin4
print_info "Instalando pgAdmin4..."
if ! command -v pgadmin4 &> /dev/null; then
    sudo mkdir -p /etc/apt/keyrings
    curl -fsS https://www.pgadmin.org/static/packages_pgadmin_org.pub | sudo gpg --dearmor -o /etc/apt/keyrings/pgadmin-keyring.gpg
    echo "deb [signed-by=/etc/apt/keyrings/pgadmin-keyring.gpg] https://ftp.postgresql.org/pub/pgadmin/pgadmin4/apt/$(lsb_release -cs) pgadmin4 main" | sudo tee /etc/apt/sources.list.d/pgadmin4.list
    sudo apt update
    install_package "pgadmin4-desktop"
else
    print_info "pgAdmin4 ya está instalado"
fi

# -- PASO 15: Instalar yakuake
print_info "Instalando Yakuake..."
install_package "yakuake"

# -- PASO 16: VERIFICAR E INSTALAR ZSH AUTOMÁTICAMENTE (MEJORA SOLICITADA)
print_info "Verificando e instalando Zsh..."
if ! command -v zsh &> /dev/null; then
    print_warning "Zsh no está instalado. Instalando automáticamente..."
    
    if install_package "zsh"; then
        if command -v zsh &> /dev/null; then
            print_success "Zsh instalado correctamente: $(zsh --version | head -n1)"
        else
            print_error "Zsh no se instaló correctamente"
            exit 1
        fi
    else
        print_error "No se pudo instalar Zsh automáticamente"
        print_info "Por favor, instala Zsh manualmente:"
        echo "  sudo apt install zsh"
        exit 1
    fi
else
    print_info "Zsh ya está instalado: $(zsh --version | head -n1)"
fi

# Verificar Git (necesario para plugins)
if ! command -v git &> /dev/null; then
    print_warning "Git no está instalado. Instalando..."
    if ! install_package "git"; then
        print_error "No se pudo instalar Git"
        exit 1
    fi
fi

# Verificar curl o wget (necesario para Oh My Zsh)
if ! command -v curl &> /dev/null && ! command -v wget &> /dev/null; then
    print_warning "Ni curl ni wget están instalados. Instalando curl..."
    if ! install_package "curl"; then
        print_warning "No se pudo instalar curl, intentando con wget..."
        if ! install_package "wget"; then
            print_error "No se pudo instalar curl ni wget"
            exit 1
        fi
    fi
fi

print_success "Dependencias de Zsh verificadas e instaladas correctamente"

# -- PASO 17: Instalar oh my zsh (VERSIÓN MEJORADA)
print_info "Instalando Oh My Zsh..."

# Asegurar que .zshrc exista
if [ ! -f ~/.zshrc ]; then
    cat > ~/.zshrc << 'EOF'
# Path to Oh My Zsh installation
export ZSH="$HOME/.oh-my-zsh"

# Default theme
ZSH_THEME="robbyrussell"

# Default plugins
plugins=(git)

# Source Oh My Zsh
if [ -f "$ZSH/oh-my-zsh.sh" ]; then
    source $ZSH/oh-my-zsh.sh
fi
EOF
fi

# Instalar Oh My Zsh si no está
if [ ! -d "$HOME/.oh-my-zsh" ]; then
    # Usar RUNZSH=no para evitar cambiar de shell automáticamente
    export RUNZSH=no
    export CHSH=no
    
    if command -v curl &> /dev/null; then
        sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" "" --unattended
    elif command -v wget &> /dev/null; then
        sh -c "$(wget https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh -O -)" "" --unattended
    else
        print_error "Ni curl ni wget disponibles para instalar Oh My Zsh"
        exit 1
    fi
    
    if [ ! -d "$HOME/.oh-my-zsh" ]; then
        print_error "Oh My Zsh no se instaló correctamente"
        exit 1
    fi
    print_success "Oh My Zsh instalado correctamente"
else
    print_info "Oh My Zsh ya está instalado"
fi

# -- PASO 18: Instalar powerlevel10k (VERSIÓN CORREGIDA)
print_info "Instalando Powerlevel10k..."

# Crear directorio de temas personalizados si no existe
mkdir -p "${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes"

if [ -d "${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k" ]; then
    print_info "Powerlevel10k ya está instalado, actualizando..."
    cd "${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k"
    git pull --depth=1
    cd - > /dev/null
else
    git clone --depth=1 https://github.com/romkatv/powerlevel10k.git "${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k"
fi

# -- PASO 19: Configurar tema en ~/.zshrc
print_info "Configurando Powerlevel10k como tema..."

# Asegurar que ZSH está definido
if ! grep -q "export ZSH=" ~/.zshrc; then
    echo 'export ZSH="$HOME/.oh-my-zsh"' >> ~/.zshrc
fi

# Cambiar o añadir ZSH_THEME
if grep -q "ZSH_THEME=" ~/.zshrc; then
    # Si ya existe, reemplazar
    if command -v sed &> /dev/null; then
        sed -i.bak 's|^ZSH_THEME=.*|ZSH_THEME="powerlevel10k/powerlevel10k"|' ~/.zshrc
    else
        # Fallback para sistemas sin sed
        print_warning "sed no disponible, usando método alternativo..."
        cp ~/.zshrc ~/.zshrc.backup
        grep -v "ZSH_THEME=" ~/.zshrc.backup > ~/.zshrc
        echo 'ZSH_THEME="powerlevel10k/powerlevel10k"' >> ~/.zshrc
    fi
else
    # Si no existe, añadirlo
    echo 'ZSH_THEME="powerlevel10k/powerlevel10k"' >> ~/.zshrc
fi

# -- PASO 20: Instalar plugins de zsh (VERSIÓN CORREGIDA)
print_info "Instalando plugins de Zsh..."

# Crear directorio de plugins personalizados
mkdir -p "${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins"

# Instalar zsh-autosuggestions
if [ ! -d "${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions" ]; then
    git clone https://github.com/zsh-users/zsh-autosuggestions "${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions"
else
    print_info "zsh-autosuggestions ya está instalado"
fi

# Instalar zsh-syntax-highlighting
if [ ! -d "${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting" ]; then
    git clone https://github.com/zsh-users/zsh-syntax-highlighting.git "${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting"
else
    print_info "zsh-syntax-highlighting ya está instalado"
fi

# -- PASO 21: Actualizar plugins en .zshrc
print_info "Actualizando lista de plugins en .zshrc..."

# Crear backup
cp ~/.zshrc ~/.zshrc.backup_plugins

# Definir lista de plugins completa
PLUGINS_LIST='plugins=(git zsh-autosuggestions zsh-syntax-highlighting sudo history-substring-search colored-man-pages composer)'

if grep -q "^plugins=" ~/.zshrc; then
    # Reemplazar línea existente
    if command -v sed &> /dev/null; then
        sed -i "s/^plugins=.*/$PLUGINS_LIST/" ~/.zshrc
    else
        awk -v new="$PLUGINS_LIST" '/^plugins=/{print new; next} 1' ~/.zshrc.backup_plugins > ~/.zshrc
    fi
else
    # Buscar dónde insertar (antes de source oh-my-zsh.sh)
    if grep -q "source.*oh-my-zsh.sh" ~/.zshrc; then
        awk -v new="$PLUGINS_LIST" '/source.*oh-my-zsh.sh/{print new; print; next} 1' ~/.zshrc > ~/.zshrc.tmp && mv ~/.zshrc.tmp ~/.zshrc
    else
        # Insertar antes del final
        echo "$PLUGINS_LIST" >> ~/.zshrc
    fi
fi

# -- PASO 22: Añadir configuración de Powerlevel10k
print_info "Añadiendo configuración de Powerlevel10k..."
if ! grep -q "p10k.zsh" ~/.zshrc; then
    echo '' >> ~/.zshrc
    echo '# Powerlevel10k instant prompt' >> ~/.zshrc
    echo 'if [[ -r "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" ]]; then' >> ~/.zshrc
    echo '  source "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh"' >> ~/.zshrc
    echo 'fi' >> ~/.zshrc
    echo '' >> ~/.zshrc
    echo '# Powerlevel10k configuration' >> ~/.zshrc
    echo '[[ ! -f ~/.p10k.zsh ]] || source ~/.p10k.zsh' >> ~/.zshrc
fi

# -- PASO 23: Instalar NVM y Node.js (VERSIÓN MEJORADA)
print_info "Instalando NVM y Node.js..."
if [ ! -d "$HOME/.nvm" ]; then
    curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
    
    # Cargar NVM en el script actual
    export NVM_DIR="$HOME/.nvm"
    [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
    [ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"
    
    # Añadir NVM al .zshrc si no está
    if ! grep -q "NVM_DIR" ~/.zshrc; then
        echo '' >> ~/.zshrc
        echo '# NVM' >> ~/.zshrc
        echo 'export NVM_DIR="$HOME/.nvm"' >> ~/.zshrc
        echo '[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"' >> ~/.zshrc
        echo '[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"' >> ~/.zshrc
    fi
    
    # Instalar Node.js si NVM está disponible
    if command -v nvm &> /dev/null; then
        nvm install 22
        nvm use 22
        nvm alias default 22
        print_success "Node.js $(node --version) instalado"
    fi
else
    print_info "NVM ya está instalado"
fi

# -- PASO 24: Agregar configuraciones personalizadas al .zshrc
print_info "Añadiendo configuraciones personalizadas..."

# Verificar si ya existen nuestras configuraciones
if ! grep -q "function indicadores" ~/.zshrc; then
    cat >> ~/.zshrc << 'EOF'

# ============================================
# CONFIGURACIONES PERSONALIZADAS
# ============================================

# Funciones personalizadas
function indicadores() {
  cd /var/www/html/jobran/indicadores/ && ls -lt --color=auto
}

function proyectos() {
  cd /var/www/html/jobran/ && ls -lt --color=auto
}

php-server() {
  local framework=$1
  local port=${2:-8000}
  local ruta=$3
  case "$framework" in
    yii2)
      ruta=${ruta:-backend/web}
      echo "🚀 Iniciando Yii2 en http://localhost:$port"
      php -S localhost:$port -t "$ruta"
      ;;
    laravel)
      ruta=${ruta:-public}
      echo "🚀 Iniciando Laravel en http://localhost:$port"
      php -S localhost:$port -t "$ruta"
      ;;
    *)
      echo "⚠️  Framework no reconocido: '$framework'"
      echo "📌 Uso: php-server [yii2|laravel] [puerto] [ruta]"
      ;;
  esac
}

# Activar globbing avanzado
setopt extendedglob
setopt globdots
setopt nomatch

# ============================================
# ALIAS
# ============================================

# Laravel
alias art="php artisan"
alias tinker="php artisan tinker"
alias serve="php artisan serve"
alias migrate="php artisan migrate"
alias seed="php artisan db:seed"
alias fresh="php artisan migrate:fresh --seed"

# Composer
alias cdu="composer dump-autoload"
alias ci="composer install"
alias cu="composer update"

# PostgreSQL
alias psqlc="psql -h localhost -U postgres -W"
alias pgstart="sudo systemctl start postgresql"
alias pgstop="sudo systemctl stop postgresql"
alias pgrestart="sudo systemctl restart postgresql"
alias pgstatus="sudo systemctl status postgresql"
alias psql-iniciar="psql -h localhost -U postgres -W"

# Navegación
alias ..='cd ..'
alias ...='cd ../..'
alias ....='cd ../../..'
alias ll='ls -la'
alias la='ls -A'
alias l='ls -CF'

# Seguridad
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

# Git
alias gs='git status'
alias ga='git add'
alias gc='git commit -m'
alias gp='git push'
alias gl='git log --oneline --graph'

# Sistema
alias update='sudo apt update && sudo apt upgrade -y'
alias reboot='sudo reboot'
alias shutdown='sudo shutdown -h now'
alias ports='sudo netstat -tulpn'

# Funciones útiles
mkcd() {
    mkdir -p "$1" && cd "$1"
}

findin() {
    grep -r "$1" . --color=always
}

EOF
fi

# -- PASO 25: Verificaciones finales
print_info "Verificando instalaciones..."
echo ""
echo "=== VERSIONES INSTALADAS ==="
[ -x "$(command -v psql)" ] && echo "PostgreSQL: $(psql --version | head -n1)" || echo "PostgreSQL: No instalado"
[ -x "$(command -v git)" ] && echo "Git: $(git --version)" || echo "Git: No instalado"
[ -x "$(command -v php)" ] && echo "PHP: $(php --version | head -n1)" || echo "PHP: No instalado"
[ -x "$(command -v python3)" ] && echo "Python: $(python3 --version)" || echo "Python: No instalado"
[ -x "$(command -v composer)" ] && echo "Composer: $(composer --version | head -n1)" || echo "Composer: No instalado"
[ -x "$(command -v code)" ] && echo "VS Code: $(code --version | head -n1)" || echo "VS Code: No instalado"
[ -x "$(command -v node)" ] && echo "Node.js: $(node --version)" || echo "Node.js: No instalado"
[ -x "$(command -v zsh)" ] && echo "Zsh: $(zsh --version)" || echo "Zsh: No instalado"
[ -d "$HOME/.oh-my-zsh" ] && echo "Oh My Zsh: Instalado" || echo "Oh My Zsh: No instalado"
[ -d "${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k" ] && echo "Powerlevel10k: Instalado" || echo "Powerlevel10k: No instalado"

echo ""
print_success "¡Instalación completada con éxito!"
print_warning "Pasos finales:"
echo "  1. Cierra y abre una nueva terminal"
echo "  2. O ejecuta: source ~/.zshrc"
echo "  3. Para configurar Powerlevel10k: p10k configure"
echo "  4. Para cambiar a Zsh como shell por defecto: chsh -s $(which zsh)"
echo ""
print_info "Si ves errores con Powerlevel10k, ejecuta manualmente:"
echo "  git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ~/.powerlevel10k"
echo "  echo 'source ~/.powerlevel10k/powerlevel10k.zsh-theme' >> ~/.zshrc"
echo "  source ~/.zshrc"
echo "  p10k configure"
Para hacerlo sencillo y fácil de usar:
Framework Web: Flask (como ya usamos) - Es ligero y fácil de entender
Base de Datos: PostgreSQL con psycopg2

Frontend:HTML5/CSS3 con animaciones CSS
JavaScript vanilla para interactividad
Librerías opcionales: Anime.js para animaciones más complejas
Subida de archivos: Werkzeug para manejo seguro de archivos
Efectos de sonido: Archivos MP3 para los efectos de ruleta

# Una vez activado el entorno virtual, instalar:
pip install flask psycopg2-binary werkzeug
python app.py

# Crear entorno virtual
python3 -m venv premios_env

# Activar entorno virtual (Linux/Mac)
source premios_env/bin/activate




## En Windows usarías:
## premios_env\Scripts\activate
6. Si prefieres editar manualmente:
Abre el archivo .env y agrega estas líneas al INICIO del archivo:

env
APP_NAME="Laravel Chat"
APP_ENV=local
APP_DEBUG=true
APP_URL=http://127.0.0.1:8000
APP_KEY=
Luego ejecuta:

bash
php artisan key:generate
7. Probar la aplicación
bash
php artisan serve
!#bin/bash

# --_Actualizar el sistema
sudo apt update && sudo apt upgrade -y

# --_Instalar vscode

# Instalar dependencias necesarias
sudo apt install wget gpg

# Agregar clave GPG de Microsoft
wget -qO- https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > packages.microsoft.gpg
sudo install -D -o root -g root -m 644 packages.microsoft.gpg /etc/apt/keyrings/packages.microsoft.gpg

# Agregar repositorio de VS Code
sudo sh -c 'echo "deb [arch=amd64,arm64,armhf signed-by=/etc/apt/keyrings/packages.microsoft.gpg] https://packages.microsoft.com/repos/code stable main" > /etc/apt/sources.list.d/vscode.list'

# Limpiar archivo temporal
rm -f packages.microsoft.gpg

# Actualizar lista de paquetes e instalar VS Code
sudo apt update
sudo apt install code


# --Instalar google chrome

# Agregar la clave GPG de Google
wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | sudo apt-key add -
# Agregar el repositorio de Chrome
echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" | sudo tee /etc/apt/sources.list.d/google-chrome.list
# Actualizar la lista de paquetes
sudo apt update
# Instalar Chrome
sudo apt install google-chrome-stable

# --Instalar php

#Instalar software para manejo de repositorios:
sudo apt install software-properties-common
#Agregar el repositorio PPA de Ondřej Surý para PHP:
sudo add-apt-repository ppa:ondrej/php
#Actualizar la información de paquetes:
sudo apt-get update

# Actualizar lista de paquetes
sudo apt update

# --_instalar python

# Instalar Python completo con herramientas de desarrollo
sudo apt install python3 python3-dev python3-venv python3-pip

# Instalar paquetes comúnmente necesarios
sudo apt install python3-setuptools python3-wheel build-essential

# Actualizar lista de paquetes
sudo apt update

# Instalar PHP 7.4 y extensiones comunes
# Instalar PHP 7.4 con extensiones comunes para desarrollo web
sudo apt install php7.4 php7.4-pgsql php7.4-cli php7.4-fpm php7.4-json php7.4-common php7.4-mysql php7.4-zip php7.4-gd php7.4-mbstring php7.4-curl php7.4-xml php7.4-bcmath libapache2-mod-php -y

# Verificar instalación
#php7.4 -v

# Agregar repositorio de PHP actualizado (Ondřej Surý)
sudo apt install software-properties-common
sudo add-apt-repository ppa:ondrej/php
sudo apt update

sudo apt install php8.5 php8.5-pgsql php8.5-cli php8.5-fpm php8.5-common php8.5-mysql php8.5-zip php8.5-gd php8.5-mbstring php8.5-curl php8.5-xml php8.5-bcmath


# Ahora busca again
#apt-cache search php | grep "^php8"

# Ver versiones de PHP instaladas
#update-alternatives --list php

# Configurar PHP 7.4 como versión por defecto
#sudo update-alternatives --set php /usr/bin/php7.4

# Verificar versión por defecto
#php -v

# --Instalar composer
#la manera correcta de instalarlo
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php composer-setup.php
 
#alternativamente los siguientes comandos instalarán Composer globalmente
sudo php composer-setup.php --install-dir=/usr/local/bin --filename=composer
 
#borrar el instalador
php -r "unlink('composer-setup.php');"
 
#Por último, ejecuta el siguiente comando en tu terminal para comprobar si Composer se ha #instalado correctamente:
composer

# --_Instalar apache2

# Actualizar lista de paquetes
sudo apt update

# Instalar Apache2
sudo apt install apache2 -y

# --_instalar postgres

# Crear directorio para claves si no existe
sudo mkdir -p /etc/apt/keyrings

# Descargar e instalar la clave GPG de PostgreSQL
curl -fsS https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo gpg --dearmor -o /etc/apt/keyrings/postgresql.gpg

# Agregar repositorio CORRECTO usando "noble" en lugar de "xia"
echo "deb [signed-by=/etc/apt/keyrings/postgresql.gpg] https://apt.postgresql.org/pub/repos/apt noble-pgdg main" | sudo tee /etc/apt/sources.list.d/pgdg.list

# Actualizar sistema
sudo apt update && sudo apt upgrade -y

# Instalar dependencias
sudo apt install wget curl gnupg2

# Agregar repositorio oficial de PostgreSQL
sudo sh -c 'echo "deb https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'

# Importar clave GPG
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -

# Actualizar lista de paquetes
sudo apt update

# Instalar PostgreSQL (última versión)
sudo apt install postgresql postgresql-contrib

# Verificar instalación y versión
#psql --version

# Ver estado del servicio
#sudo systemctl status postgresql

# --configuracion postgres 

# Iniciar servicio PostgreSQL
#sudo systemctl start postgresql
#sudo systemctl enable postgresql

# Configurar contraseña para usuario postgres
#sudo -u postgres psql
#\password postgres
#\q

# Editar configuración para acceso remoto (opcional)
#sudo nano /etc/postgresql/*/main/postgresql.conf
# Descomentar y cambiar: listen_addresses = '*'

sudo nano /etc/postgresql/*/main/pg_hba.conf
# Agregar: host all all 0.0.0.0/0 md5

# Reiniciar PostgreSQL
#sudo systemctl restart postgresql

# --comandos utiles

# Ver versiones instaladas
psql --version
pgadmin4 --version

# Gestión de servicios
#sudo systemctl status postgresql
#sudo systemctl restart postgresql
#sudo systemctl stop postgresql
#sudo systemctl start postgresql

# Conectarse a PostgreSQL
#psql -U postgres -h localhost

# Ver bases de datos
#sudo -u postgres psql -c "\l"

# Ver usuarios
#sudo -u postgres psql -c "\du"

# --_Iinstalar pgadmin4

# Clave GPG para pgAdmin
curl -fsS https://www.pgadmin.org/static/packages_pgadmin_org.pub | sudo gpg --dearmor -o /etc/apt/keyrings/pgadmin.gpg

# Repositorio correcto para pgAdmin
echo "deb [signed-by=/etc/apt/keyrings/pgadmin.gpg] https://ftp.postgresql.org/pub/pgadmin/pgadmin4/apt/noble pgadmin4 main" | sudo tee /etc/apt/sources.list.d/pgadmin4.list

# Actualizar sistema
sudo apt update && sudo apt upgrade -y

# Instalar dependencias necesarias
sudo apt install wget curl gnupg2

# 1. Agregar clave GPG de pgAdmin (método moderno)
sudo mkdir -p /etc/apt/keyrings
curl -fsS https://www.pgadmin.org/static/packages_pgadmin_org.pub | sudo gpg --dearmor -o /etc/apt/keyrings/pgadmin-keyring.gpg

# 2. Agregar repositorio usando "noble" en lugar de "xia"
echo "deb [signed-by=/etc/apt/keyrings/pgadmin-keyring.gpg] https://ftp.postgresql.org/pub/pgadmin/pgadmin4/apt/noble pgadmin4 main" | sudo tee /etc/apt/sources.list.d/pgadmin4.list

# 3. Actualizar e instalar
sudo apt update
sudo apt install pgadmin4-desktop

# --_instar git

# Actualizar lista de paquetes
sudo apt update

# Instalar Git con todas las herramientas comúnmente necesarias
sudo apt install git gitk git-gui meld

# Si instalaste desde repositorios
sudo apt update && sudo apt upgrade git

# Instalar documentación
sudo apt install git-doc

# Verificar instalación
#git --version

sudo apt update
sudo apt install yakuake

# Descargar e instalar NVM
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash

# Recargar el perfil
source ~/.bashrc
# O si usas Zsh:
# source ~/.zshrc

# Verificar instalación de NVM
nvm --version

# --_Instalar nodejs
# Instalar Node.js 22 (última versión estable)
nvm install 22

# Usar Node.js 22
nvm use 22

# Establecer como versión por defecto
nvm alias default 22

# Verificar instalación
node --version  # Debería mostrar v22.x.x
npm --version   # Debería mostrar 10.x.x
EJE CENTRAL: Arquitectura Unificada con Organización de Snippets
Para implementar las "carpetas", necesitamos un nuevo concepto clave: una tabla para las categorías (categories) y una relación con la tabla de snippets (snippets).
Relación Arquitectónica (Nivel Doctorado):
• Entidad Nueva: Category (Tu Carpeta).
• Relación: Uno a Muchos. Una Category puede tener muchos Snippets, pero cada Snippet pertenece a una única Category.
• Implementación: Añadiremos la llave foránea category_id a la tabla snippets.

--------------------------------------------------------------------------------
PASO A PASO: PROYECTO UNIFICADO CON CARPETAS Y TARJETAS
FASE 1: Configuración Base, Base de Datos y Autenticación
1.1. Creación del Proyecto Único
Creamos nuestro proyecto principal.
# 1. Crear el proyecto Laravel (única vez)
composer create-project laravel/laravel snippet-org-master
cd snippet-org-master
1.2. Configuración de PostgreSQL
Adaptamos el archivo .env para la conexión con PostgreSQL, siguiendo la adaptación necesaria para el entorno.
# Archivo .env
DB_CONNECTION=pgsql 
DB_HOST=127.0.0.1 
DB_PORT=5432 
DB_DATABASE=snippets_db_organizado 
DB_USERNAME=tu_usuario_pgsql 
DB_PASSWORD=tu_clave_pgsql
1.3. Vistas y Autenticación (Login / Registro con Formularios)
Instalamos Laravel UI para obtener las vistas de scaffolding (login y registro) y preparar el proyecto para formularios HTML.
# 1. Instalar el paquete de interfaz
composer require laravel/ui

# 2. Generar vistas de autenticación (Login/Registro) y layouts
php artisan ui bootstrap --auth 

# 3. Compilar los assets para estilos
npm install
npm run dev
Al hacer esto, las rutas de login y register ya están en routes/web.php y usan el sistema de sesiones, crucial para la parte de formularios.
1.4. Modelos y Migraciones (¡La Nueva Estructura!)
Necesitamos dos modelos y dos migraciones: Category y Snippet.
A. Modelo y Migración de Category (La Carpeta)
php artisan make:model Category -m
Definición de la Migración categories:
// database/migrations/..._create_categories_table.php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    public function up(): void
    {
        Schema::create('categories', function (Blueprint $table) {
            $table->id(); 
            // NAME: Nombre de la carpeta (ej: 'Scripts Python', 'Queries SQL')
            $table->string('name', 100)->unique(); 
            $table->string('description')->nullable(); // Opcional
            $table->timestamps(); 
        });
    }
    // ...
};
B. Modelo y Migración de Snippet (Con Llave Foránea)
Creamos el modelo Snippet e inmediatamente modificamos la migración para añadir la llave foránea category_id.
php artisan make:model Snippet -m
Definición de la Migración snippets:
// database/migrations/..._create_snippets_table.php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    public function up(): void
    {
        Schema::create('snippets', function (Blueprint $table) {
            $table->id(); 
            
            // Llave Foránea: Conexión con la tabla 'categories'
            $table->foreignId('category_id') 
                  ->constrained() // Crea la restricción automática
                  ->onDelete('cascade'); // Si borras la carpeta, se borran los snippets.

            $table->string('title', 255); 
            $table->text('code'); 
            $table->string('language', 50); 
            $table->timestamps(); 
        });
    }
    // ...
};
C. Ejecución de la Migración
# Ejecutamos las dos migraciones en PostgreSQL
php artisan migrate
1.5. Configuración de Relaciones en los Modelos
En los modelos, definimos las relaciones para que Laravel sepa cómo están conectadas las "carpetas" y los "snippets" (Nivel Doctorado - Eloquent ORM).
// app/Models/Category.php
// ...
use Illuminate\Database\Eloquent\Relations\HasMany;

class Category extends Model
{
    protected $fillable = ['name', 'description'];

    // Una categoría tiene muchos snippets (1:N)
    public function snippets(): HasMany
    {
        return $this->hasMany(Snippet::class);
    }
}
// app/Models/Snippet.php
// ...
use Illuminate\Database\Eloquent\Relations\BelongsTo;

class Snippet extends Model
{
    protected $fillable = ['title', 'code', 'language', 'category_id'];

    // Un snippet pertenece a una categoría (N:1)
    public function category(): BelongsTo
    {
        return $this->belongsTo(Category::class);
    }
}

--------------------------------------------------------------------------------
FASE 2: Implementación de la API REST (JSON)
La API debe ser capaz de aceptar y validar el nuevo campo category_id.
2.1 Creación del Controlador API
php artisan make:controller Api/SnippetApiController --resource
2.2 Lógica API ()
En la lógica store y update, la validación es clave: debemos asegurar que el category_id sea requerido y que realmente exista en la tabla categories.
// app/Http/Controllers/Api/SnippetApiController.php

// ... (Imports: Request, Validator, Snippet, Category) ...

public function store(Request $request)
{
    $rules = [
        'title' => 'required|string|max:255', 
        'code' => 'required|string', 
        'language' => 'required|string|max:50',
        
        // ¡Validación Mejorada para la carpeta!
        'category_id' => 'required|exists:categories,id|integer', 
        // 'exists:categories,id' asegura que el ID de la categoría exista en la tabla 'categories'.
    ];

    $validator = Validator::make($request->all(), $rules);
    
    if ($validator->fails()) {
        return response()->json(['status' => 400, 'errors' => $validator->errors()], 400); 
    }

    $snippet = Snippet::create($request->all());

    return response()->json(['status' => 201, 'message' => 'Creado', 'data' => $snippet], 201);
}

public function index()
{
    // Cargar la relación para obtener el nombre de la carpeta en la respuesta JSON
    $snippets = Snippet::with('category')->get(); 

    // Ahora el JSON incluirá el nombre de la categoría del snippet.
    return response()->json(['status' => 200, 'data' => $snippets], 200);
}
// ... (Otros métodos CRUD devolviendo JSON) ...
2.3 Rutas de la API
// routes/api.php
use App\Http\Controllers\Api\SnippetApiController;

// (Opcional: Agregar middleware de autenticación con token si se usa Sanctum, como se mencionó)
Route::resource('snippets', SnippetApiController::class)
    ->only(['index', 'store', 'show', 'update', 'destroy']);

--------------------------------------------------------------------------------
FASE 3: Implementación WEB (Formularios y Vistas en Tarjetas)
Usaremos el generador CRUD para las categorías y luego para los snippets, para obtener rápidamente los formularios.
3.1 Instalación del Generador CRUD
composer require ibex/crud-generator --dev
php artisan vendor:publish --tag=crud
3.2 Generación del CRUD de CATEGORIES (Las Carpetas)
Necesitas un CRUD para crear, editar y eliminar las carpetas/categorías.
# Creamos el CRUD para las carpetas
php artisan make:crud categories
Esto genera las vistas y el controlador CategoryController.php para gestionar tus carpetas.
3.3 Generación del CRUD de SNIPPETS
# Creamos el CRUD para los snippets
php artisan make:crud snippets
Nota Importante: El generador crea el controlador web (SnippetController) y las vistas, pero deberás modificar manualmente el formulario de creación (create.blade.php) y edición (edit.blade.php) para incluir un campo de selección (<select>) que liste las categorías disponibles.
3.4 Rutas Web (Protegidas)
Añadimos las rutas de los dos recursos en routes/web.php y las protegemos con el middleware auth.
// routes/web.php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\SnippetController; 
use App\Http\Controllers\CategoryController; 

Auth::routes(); 
Route::get('/', [App\Http\Controllers\HomeController::class, 'index'])->name('home');

Route::middleware('auth')->group(function () {
    // 1. CRUD de Carpetas/Categorías
    Route::resource('categories', CategoryController::class);

    // 2. CRUD de Snippets
    Route::resource('snippets', SnippetController::class);
});
3.5 Mejora de Vistas: Visualización en Tarjetas
El generador CRUD generó una tabla simple. Para mostrar el código como tarjetas bonitas, debes editar la vista principal: resources/views/snippets/index.blade.php.
Objetivo (Nivel Avanzado): Remplazar el HTML de tabla por un loop que use la estructura de tarjeta (asumiendo que Bootstrap está instalado por el paso 1.3).
Ejemplo Esquemático de Modificación de Vistas:
{{-- resources/views/snippets/index.blade.php --}}

@extends('layouts.app') 

@section('content')
    <div class="container">
        <h1>Mis Snippets Organizados</h1>
        <a href="{{ route('snippets.create') }}" class="btn btn-primary mb-3">Crear Nuevo Snippet</a>
        
        <div class="row">
            {{-- Iteramos sobre la lista de snippets --}}
            @foreach ($snippets as $snippet)
                <div class="col-md-4 mb-4">
                    {{-- Estructura de Tarjeta (Card) --}}
                    <div class="card shadow">
                        <div class="card-header bg-primary text-white">
                            {{ $snippet->title }} 
                            <span class="badge bg-secondary float-end">{{ $snippet->language }}</span>
                        </div>
                        <div class="card-body">
                            {{-- Mostramos el nombre de la carpeta/categoría --}}
                            <p class="card-text text-muted small">
                                Carpeta: <strong>{{ $snippet->category->name }}</strong>
                            </p>
                            
                            {{-- Vista previa del código (limitada) --}}
                            <pre class="bg-light p-2 rounded small overflow-auto" style="max-height: 100px;">
                                <code>{{ Str::limit($snippet->code, 150) }}</code>
                            </pre>

                            <a href="{{ route('snippets.show', $snippet->id) }}" class="btn btn-sm btn-info">Ver Detalle</a>
                            <a href="{{ route('snippets.edit', $snippet->id) }}" class="btn btn-sm btn-warning">Editar</a>
                            
                            {{-- Formulario para eliminar (como se muestra en el ejemplo CRUD) --}}
                            <form action="{{ route('snippets.destroy', $snippet->id) }}" method="POST" class="d-inline">
                                @csrf
                                @method('DELETE')
                                <button type="submit" class="btn btn-sm btn-danger" onclick="return confirm('¿Seguro?')">Eliminar</button>
                            </form>
                        </div>
                    </div>
                </div>
            @endforeach
        </div>
    </div>
@endsection
Al incorporar estas modificaciones, tu proyecto unificado estará completo: los datos se guardan en PostgreSQL con una estructura de organización (categorías), la API sirve JSON con la relación cargada, y la interfaz web presenta la información de manera visualmente atractiva mediante tarjetas.
guía paso a paso para configurar el sistema

Aquí tienes una guía paso a paso para configurar el sistema ZKBioAccess basada en la información oficial y práctica para su uso:

Guía paso a paso para configurar ZKBioAccess
1. Requisitos iniciales
Instala ZKBioAccess en un servidor Windows con especificaciones recomendadas: CPU dual core, 4GB RAM mínimo, 10GB disco mínimo.

Conecta el servidor a la red local donde estarán los dispositivos (lectores biométricos, cámaras).

2. Preparación de los dispositivos físicos
Configura la dirección IP de los dispositivos para que estén en el mismo segmento de red que el servidor. Por ejemplo: lector biométrico ZK-EFACE10 o panel ZK-INBIO260.

Establece en cada dispositivo la dirección IP y puerto del servidor ZKBioAccess (por defecto, puerto 8881).

3. Añadir dispositivos al software
Entra al software ZKBioAccess desde la interfaz web.

Para dispositivos de asistencia:

Ve a Attendance > Attendance Device > Authorized Device > Search para buscar y añadir dispositivos.

Para dispositivos de control de acceso:

Ve a Access > Device > Search para encontrar y añadir dispositivos automáticamente.

4. Configurar departamentos y usuarios
En el módulo Personnel, crea la estructura organizacional con departamentos y subdepartamentos.

Añade empleados con sus datos personales, fotos y credenciales biométricas o tarjetas RFID.

Puedes configurar diferentes tipos de biometría (huella, rostro, tarjeta).

5. Configurar permisos y horarios de acceso
En el módulo Access Control, asigna a cada usuario puertas y horarios en los que pueden acceder.

Configura políticas avanzadas de seguridad como Anti-passback para evitar que se comparta acceso entre usuarios.

Define reglas específicas para cada puerta y grupo de usuarios.

6. Configuración de video vigilancia (opcional)
Si tienes cámaras conectadas, añade los dispositivos al módulo Video Management.

Configura grabación, monitoreo en tiempo real y detección de eventos como movimiento o reconocimiento facial.

Relaciona eventos del control de acceso con acciones de cámaras para notificaciones o alarmas.

7. Supervisión y reportes
Supervisar el sistema en tiempo real desde la interfaz web.

Generar reportes detallados de asistencia, accesos, eventos y alarmas.

Configurar envíos automáticos de notificaciones por correo en eventos críticos (alertas, accesos bajo coacción, etc).

8. Mantenimiento y seguridad
Programa copias de seguridad automáticas de la base de datos.

Gestiona usuarios administradores con diferentes niveles de acceso.

Actualiza el software regularmente para contar con mejoras y nuevas funcionalidades.

Este flujo básico te permitirá tener operativo el sistema ZKBioAccess para control de acceso y asistencia en tu organización usando dispositivos ZKTeco compatibles.

¿Quieres que te brinde ejemplos detallados de alguna de estas etapas (por ejemplo, cómo añadir un dispositivo o crear un usuario)? ¿O prefieres que te oriente con la configuración avanzada de seguridad o integración de video vigilancia?

//para cualquier campo usar:
'headerOptions' => ['style' => 'text-align:center;'],
'contentOptions' => ['style' => 'text-align:center; width:2%; vertical-align:middle;'],
//para casos donde el campo venga del modelo 
$columns[] = [
        'attribute' => 'nombre_proyecto',
        'label' => 'Nombre del Proyecto',
        'headerOptions' => ['style' => 'text-align:center; width:10%;text-color:white;'],
        'contentOptions' => ['style' => 'text-align:center; vertical-align:middle;'],
        'value' => function ($data) {
            // Encoded to avoid XSS, then insert line breaks cada 40 caracteres
            $name = Html::encode($data->nombre_proyecto);
            return nl2br(wordwrap($name, 40, "\n", true));
        },
        'format' => 'raw',
    ];
 // para casos donde se use la funcion listar
 'id_indicador' => [
        'attribute' => 'id_indicador',
        'label' => 'Indicador',
        'headerOptions' => ['style' => 'text-align:center;'],
        'contentOptions' => ['style' => 'text-align:center; width:2%; vertical-align:middle;'],
        'filter' => app\models\Indicadores::listAcuatico(),
        'value' => function ($data) {
            $s = app\models\Indicadores::find()->where(['id_indicador' => $data->id_indicador])->one();
            if (!$s) {
                return '';
            }
            // Encoded to avoid XSS, then insert line breaks cada 20 caracteres
            $name = Html::encode($s->nombre_indicador);
            return nl2br(wordwrap($name, 40, "\n", true));
        },
        'format' => 'raw',
    ],
   
   
Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
star

Tue Dec 09 2025 19:13:26 GMT+0000 (Coordinated Universal Time)

#yii2
star

Mon Dec 08 2025 15:31:37 GMT+0000 (Coordinated Universal Time)

#yii2
star

Mon Dec 08 2025 14:00:59 GMT+0000 (Coordinated Universal Time)

#yii2
star

Mon Dec 08 2025 13:54:18 GMT+0000 (Coordinated Universal Time)

#yii2
star

Mon Dec 08 2025 13:49:26 GMT+0000 (Coordinated Universal Time)

#yii2
star

Thu Dec 04 2025 20:18:23 GMT+0000 (Coordinated Universal Time)

#yii2
star

Tue Nov 11 2025 14:18:28 GMT+0000 (Coordinated Universal Time)

#yii2
star

Wed Oct 29 2025 20:15:16 GMT+0000 (Coordinated Universal Time)

#yii2
star

Fri Oct 24 2025 14:21:09 GMT+0000 (Coordinated Universal Time)

#yii2
star

Thu Oct 16 2025 14:58:36 GMT+0000 (Coordinated Universal Time)

#yii2
star

Wed Oct 15 2025 13:45:02 GMT+0000 (Coordinated Universal Time)

#yii2
star

Mon Oct 13 2025 15:14:35 GMT+0000 (Coordinated Universal Time)

#yii2
star

Thu Feb 17 2022 19:32:53 GMT+0000 (Coordinated Universal Time) https://stackoverflow.com/questions/41675051/get-response-in-json-format-in-yii2

#php #yii2 #response #json #format

Save snippets that work with our extensions

Available in the Chrome Web Store Get Firefox Add-on Get VS Code extension