Plugin Mascotas - FacturaScripts

Plugin completo para gestión de mascotas en clínicas veterinarias


📥 Descargar Plugin Completo

🚀 ¿Qué hace este Plugin?

Funcionalidades Principales

  • Gestión completa de mascotas: Crear, editar, listar y eliminar
  • Campos personalizados: Nombre, especie, género, edad, fecha de nacimiento
  • Acciones especiales: Borrado masivo y copia de registros
  • Integración con FacturaScripts: Menú "Clínica" con iconos personalizados

Características Técnicas

  • Arquitectura MVC: Modelo, Vista, Controlador separados
  • Base de datos: Tabla optimizada con clave primaria serial
  • Vistas XML: Interfaz responsive y personalizable
  • Controladores extendidos: Funcionalidades avanzadas incluidas

🔍 Explora los Componentes del Plugin

Selecciona qué parte del código quieres analizar en detalle:

Componentes del Plugin Mascotas

⚙️ Configuración - facturascripts.ini

name = 'MiPlugin'
description = 'Mi primer plugin para FacturaScripts'
version = 0.1
min_version = 2024

Explicación del Archivo de Configuración

  • name: Identificador único del plugin
  • description: Descripción que aparece en el panel de administración
  • version: Versión semántica del plugin
  • min_version: Versión mínima de FacturaScripts requerida

🗄️ Modelo de Datos - Mascota.php

Código del Modelo

<? php
namespace FacturaScripts\Plugins\MiPlugin\Model;

use FacturaScripts\Core\Model\Base\ModelClass;
use FacturaScripts\Core\Model\Base\ModelTrait;

class Mascota extends ModelClass
{
    use ModelTrait;

    public $idmascota;
    public $nombre;
    public $edad;
    public $especie;
    public $genero;
    public $fechanacimiento;

    public static function primaryColumn(): string
    {
        return 'idmascota';
    }

    public static function tableName(): string
    {
        return 'mascotas';
    }
}

Análisis del Modelo

  • Namespace: Organiza el código según la estructura de carpetas
  • ModelTrait: Proporciona métodos CRUD automáticos (save, delete, load)
  • Propiedades públicas: Mapean directamente con las columnas de la base de datos
  • primaryColumn(): Define la clave primaria de la tabla
  • tableName(): Especifica el nombre de la tabla en la BD

🗃️ Esquema de Base de Datos - mascotas.xml

Table/mascotas.xml

<?xml version="1.0" encoding="UTF-8"?>
<table>
    <column>
        <name>idmascota</name>
        <type>serial</type>
        <null>NO</null>
    </column>
    <column>
        <name>nombre</name>
        <type>character varying(25)</type>
        <null>NO</null>
    </column>
    <column>
        <name>edad</name>
        <type>integer</type>
    </column>
    <column>
        <name>especie</name>
        <type>character varying(25)</type>
    </column>
    <column>
        <name>genero</name>
        <type>character varying(25)</type>
    </column>
    <column>
        <name>fechanacimiento</name>
        <type>date</type>
    </column>
    <constraint>
        <name>mascotas_pkey</name>
        <type>PRIMARY KEY (idmascota)</type>
    </constraint>
</table>

Estructura de la Base de Datos

  • idmascota (serial): Clave primaria auto-incremental
  • nombre (varchar 25): Campo obligatorio para el nombre
  • edad (integer): Número entero para la edad
  • especie/género (varchar 25): Texto de longitud limitada
  • fechanacimiento (date): Tipo fecha para almacenar cumpleaños

🎮 Controladores

EditMascota.php - Controlador de Edición

<? php
namespace FacturaScripts\Plugins\MiPlugin\Controller;

use FacturaScripts\Core\Lib\ExtendedController\EditController;

class EditMascota extends EditController
{
    public function getModelClassName(): string
    {
        return 'Mascota';
    }
}

Función: Controlador minimalista que hereda toda la funcionalidad de edición de EditController. Solo necesita especificar qué modelo maneja.

ListMascota.php - Controlador de Listado

<? php
namespace FacturaScripts\Plugins\MiPlugin\Controller;

use FacturaScripts\Core\Lib\ExtendedController\ListController;
use FacturaScripts\Dinamic\Model\Mascota;
use FacturaScripts\Core\Tools;

class ListMascota extends ListController
{
    public function getPageData(): array
    {
        $page = parent::getPageData();
        $page['title'] = 'Mascotas';
        $page['menu'] = 'Clinica';
        $page['icon'] = 'fa-solid fa-paw';
        return $page;
    }

    protected function createViews()
    {
       $this->addView("ListMascota", 'mascota','mascota','fa-solid fa-paw')
            ->addOrderBy(['nombre'], 'nombre')
            ->addSearchFields(['nombre']); 

       $this->addView("ListCliente", "Cliente", "Clientes","fa-solid fa-person")
            ->addOrderBy(['nombre'], 'nombre')
            ->addSearchFields(['nombre']); 
    }

    protected function execPreviousAction($action){
        switch($action){
            case "borrar-todo":
                $this->borrarTodo();
                break;
            case "copiar":
                $this->copiar();
                break;
            default:
                parent::execPreviousAction($action);
        }
    }

    protected function borrarTodo(){
        $mascotaModel = new Mascota();
        $mascotas = $mascotaModel->all();
        foreach($mascotas as $mascota){
            $mascota->delete();
        }
        Tools::log()->notice('Se han borrado todas las mascotas correctamente');
    }

    protected function copiar(){
        for($i = 0; $i <= 100; $i++){
            $mascota = new Mascota();
            $mascota->nombre = 'Copia';
            $mascota->especie = 'Perro';
            $mascota->genero = 'macho';
            $mascota->edad = '5';
            $mascota->fechanacimiento = 'pepe';
            $mascota->save();
        }
        Tools::log()->notice('Se ha copiado la mascota correctamente');
    }
}

Características avanzadas: Incluye acciones personalizadas (borrar todo, copiar), múltiples vistas, ordenamiento y búsqueda.

👁️ Vistas XML

EditMascota.xml - Vista de Edición

<?xml version='1.0' encoding='UTF-8'?>
<view>
    <columns>
        <column name='Nombre' numcolumns='6' order='100'>
            <widget type='text' fieldname='nombre'/>
        </column>
        <column name='Especie' order='105'>
            <widget type='text' fieldname='especie'/>
        </column>
        <column name='Genero' order='110'>
            <widget type='text' fieldname='genero'/>
        </column>
        <column name='Edad' order='115'>
            <widget type='text' fieldname='edad'/>
        </column>
        <column name='Fecha de Nacimiento' order='120'>
            <widget type='date' fieldname='fecha_nacimiento'/>
        </column>
    </columns>
</view>

Layout responsive: Nombre ocupa 6 columnas (mitad del ancho), los demás campos se distribuyen automáticamente.

ListMascota.xml - Vista de Listado

<?xml version='1.0' encoding='UTF-8'?>
<view>
    <columns>
        <column name='Nombre' order='100'>
            <widget type='text' fieldname='nombre'/>
        </column>
        <column name='Especie' order='105'>
            <widget type='text' fieldname='especie'/>
        </column>
        <column name='Genero' order='110'>
            <widget type='text' fieldname='genero'/>
        </column>
        <column name='Edad' order='115'>
            <widget type='text' fieldname='edad'/>
        </column>
        <column name='Fecha de Nacimiento' order='120'>
            <widget type='date' fieldname='fecha_nacimiento'/>
        </column>
    </columns>

    <rows>
        <row type="actions">
            <button action="borrar-todo" color="warning" icon="fas fa-vial" label="Borrar" type="action"/>
            <button action="copiar" color="warning" icon="fas fa-terminal" label="Copiar" type="action"/>
        </row>
    </rows>
</view>

Acciones personalizadas: Botones en la parte inferior para borrar todo y copiar registros, conectados a los métodos del controlador.

🔄 Flujo de Trabajo del Plugin

1. Instalación y Activación

  • Copiar carpeta MiPlugin a /Plugins/
  • Activar desde Admin → Plugins
  • El sistema crea automáticamente la tabla 'mascotas'

2. Navegación

  • Aparece nuevo menú "Clínica" con icono de pata
  • Submenú "Mascotas" para gestionar registros
  • Vista de listado con botones de acción

3. Funcionalidades

  • Crear: Formulario con validación automática
  • Editar: Interfaz responsive con todos los campos
  • Listar: Con ordenamiento y búsqueda
  • Acciones masivas: Borrar todo y copiar registros

✅ Mejores Prácticas Implementadas

Estructura

  • Namespaces organizados según estándares
  • Separación clara MVC
  • Archivos XML bien formados

Funcionalidad

  • Hereda de clases base de FacturaScripts
  • Usa Traits para funcionalidad común
  • Mensajes de log informativos

UX/UI

  • Iconos FontAwesome consistentes
  • Layout responsive
  • Acciones claramente etiquetadas

🚀 Posibles Mejoras y Extensiones

Validaciones Avanzadas

Implementar: Validación de fecha de nacimiento, especies predefinidas, géneros con select.

Beneficio: Mayor consistencia de datos.

Relaciones con Dueños

Implementar: Relación Many-to-One con tabla de clientes.

Beneficio: Gestión completa de mascotas y dueños.

Historial Médico

Implementar: Tabla relacionada para visitas veterinarias.

Beneficio: Sistema completo de historial clínico.