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.