Plugin Coches - FacturaScripts
Plugin completo para gestión de vehículos en talleres mecánicos
🚗 Descargar Plugin Completo🚀 ¿Qué hace este Plugin?
Funcionalidades Principales
- Gestión completa de vehículos: Crear, editar, listar y marcar como siniestro
- Campos especializados: Matrícula, marca, modelo, fecha ITV, estado siniestro
- Acciones personalizadas: Marcar como siniestro, cambiar fecha ITV, modal de creación rápida
- Integración con FacturaScripts: Menú "Coches" con iconos personalizados
Características Técnicas
- Arquitectura MVC: Modelo, Vista, Controlador separados
- Base de datos: Tabla optimizada con tipos específicos (boolean para siniestro)
- Vistas XML avanzadas: Incluye grupos, modales y estados personalizados
- Controladores extendidos: Funcionalidades avanzadas con modales integrados
🔍 Explora los Componentes del Plugin
Selecciona qué parte del código quieres analizar en detalle:
Componentes del Plugin Coches
⚙️ Configuración - facturascripts.ini
name = 'PluginCoches'
description = 'Plugin para gestión de vehículos en FacturaScripts'
version = 1.0
min_version = 2024
Explicación del Archivo de Configuración
- name: 'PluginCoches' - Identificador único
- description: Descripción que aparece en el panel de administración
- version: Versión inicial del plugin
- min_version: Versión mínima de FacturaScripts requerida
🗄️ Modelo de Datos - Coche.php
Código del Modelo
<?php
namespace FacturaScripts\Plugins\Coches\Model;
use FacturaScripts\Core\Template\ModelClass;
use FacturaScripts\Core\Template\ModelTrait;
use FacturaScripts\Core\Tools;
class Coche extends ModelClass
{
use ModelTrait;
public $idcoche;
public $matricula;
public $marca;
public $modelo;
public $fechaitv;
public $siniestro;
public function clear(): void
{
parent::clear();
$this->siniestro = false;
}
public static function primaryColumn(): string
{
return 'idcoche';
}
public static function tableName(): string
{
return 'coches';
}
}
Análisis del Modelo
- Namespace:
FacturaScripts\Plugins\Coches\Model - ModelTrait: Proporciona métodos CRUD automáticos
- Propiedades: Mapean con las columnas de la base de datos
- Método clear(): Inicializa
siniestrocomofalsepor defecto - primaryColumn(): Define
idcochecomo clave primaria - tableName(): Especifica la tabla
'coches'
🗃️ Esquema de Base de Datos - coches.xml
Table/coches.xml
<?xml version="1.0" encoding="UTF-8"?>
<table>
<column>
<name>idcoche</name>
<type>serial</type>
<null>NO</null>
</column>
<column>
<name>matricula</name>
<type>character varying(7)</type>
<null>NO</null>
</column>
<column>
<name>marca</name>
<type>character varying(20)</type>
<null>NO</null>
</column>
<column>
<name>modelo</name>
<type>character varying(20)</type>
<null>NO</null>
</column>
<column>
<name>fechaitv</name>
<type>date</type>
<null>NO</null>
</column>
<column>
<name>siniestro</name>
<type>boolean</type>
<null>NO</null>
</column>
<constraint>
<name>idcoche_pkey</name>
<type>PRIMARY KEY (idcoche)</type>
</constraint>
</table>
Estructura de la Base de Datos
- idcoche (serial): Clave primaria auto-incremental
- matricula (varchar 7): Matrícula española (7 caracteres)
- marca/modelo (varchar 20): Texto para marca y modelo
- fechaitv (date): Fecha de la última ITV
- siniestro (boolean): Estado booleano (true/false)
- Todos NOT NULL: Todos los campos son obligatorios
🎮 Controladores
EditCoche.php - Controlador de Edición
<?php
namespace FacturaScripts\Plugins\Coches\Controller;
use FacturaScripts\Core\Lib\ExtendedController\EditController;
class EditCoche extends EditController
{
public function getModelClassName(): string
{
return 'Coche';
}
}
Función: Controlador minimalista que hereda toda la funcionalidad de EditController. Solo necesita especificar qué modelo maneja.
ListCoche.php - Controlador de Listado
<?php
namespace FacturaScripts\Plugins\Coches\Controller;
use FacturaScripts\Core\Lib\ExtendedController\ListController;
use FacturaScripts\Dinamic\Model\Coche;
use FacturaScripts\Core\Tools;
class ListCoche extends ListController
{
public function getPageData(): array
{
$page = parent::getPageData();
$page['title'] = 'Coches';
$page['menu'] = 'Coches';
$page['icon'] = 'fas fa-search';
return $page;
}
protected function createViews()
{
$this->addView('ListCoche', 'coche', 'coche', 'fas fa-car')
->addOrderBy(['idcoche'], 'Creacion', 2)
->addSearchFields(['matricula', 'marca', 'modelo']);
$this->setSettings('ListCoche', 'modalInsert', 'modalCoche');
$this->addButton('ListCoche',[
'action' => 'siniestro',
'type' => 'action',
'icon' => 'fas fa-exclamation-triangle',
'label' => 'Baja',
'color' => 'danger',
'confirm' => true,
]);
$this->addButton('ListCoche',[
'action' => 'fechaitv',
'type' => 'modal',
'icon' => 'fas fa-exclamation-triangle',
'label' => 'ITV',
'color' => 'warning',
'confirm' => true,
]);
}
protected function execPreviousAction($action)
{
switch($action){
case 'siniestro':
$this->siniestro();
break;
case 'fechaitv':
$this->fechaitv();
break;
case 'modalCoche':
$this->modalCoche();
break;
}
return parent::execPreviousAction($action);
}
protected function siniestro()
{
$codes = $this->request->request->getArray('codes');
if (empty($codes)){
Tools::log()->warning('No se han seleccionado coches para marcar como siniestro.');
return;
}
foreach ($codes as $code) {
$coche = new Coche();
$coche = $coche->find($code);
$coche->siniestro=true;
$coche->save();
Tools::log()->notice('Marcado como siniestro los coches seleccionados.');
}
}
protected function fechaitv()
{
$codes = $this->request->request->getArray('codes');
if (empty($codes)){
Tools::log()->warning('No se han seleccionado coches para cambiar la ITV.');
return;
}
foreach ($codes as $code) {
$coche = new Coche();
$coche = $coche->find($code);
$coche->fechaitv = $this->request->request->get('fechaitv');
$coche->save();
Tools::log()->notice('ITV cambiada de los coches seleccionados.');
}
}
protected function modalCoche()
{
$coche = new Coche();
$coche->matricula = $this->request->request->get('matricula');
$coche->marca = $this->request->request->get('marca');
$coche->modelo = $this->request->request->get('modelo');
$coche->fechaitv = $this->request->request->get('fechaitv');
$coche->siniestro = false;
$coche->save();
Tools::log()->notice('Vehículo creado con éxito.');
}
}
Características avanzadas: Incluye acciones personalizadas con modales, botones con confirmación, gestión de registros seleccionados y creación rápida mediante modal.
👁️ Vistas XML
EditCoche.xml - Vista de Edición
<?xml version='1.0' encoding='UTF-8'?>
<view>
<columns>
<group name='coches' numcolumns='8' title='Identificación de vehículos cochiles' icon='fa-globe'>
<column name='ID' order='10'>
<widget type='text' fieldname='idcoche' />
</column>
<column name='matricula' order='20'>
<widget type='text' fieldname='matricula' />
</column>
<column name='marca' order='30'>
<widget type='text' fieldname='marca' />
</column>
<column name='modelo' order='40'>
<widget type='text' fieldname='modelo' />
</column>
<column name='fechaitv' order='50'>
<widget type='date' fieldname='fechaitv' />
</column>
<column name='siniestro' order='60'>
<widget type='checkbox' fieldname='siniestro' />
</column>
</group>
</columns>
</view>
Layout con grupos: Los campos están organizados en un grupo con título e icono. El grupo ocupa 8/12 columnas del ancho disponible.
ListCoche.xml - Vista de Listado
<?xml version='1.0' encoding='UTF-8'?>
<view>
<columns>
<column name='ID' order='10'>
<widget type='text' fieldname='idcoche' />
</column>
<column name='matricula' order='20'>
<widget type='text' fieldname='matricula' />
</column>
<column name='marca' order='30'>
<widget type='text' fieldname='marca' />
</column>
<column name='modelo' order='40'>
<widget type='text' fieldname='modelo' />
</column>
<column name='fechaitv' order='50'>
<widget type='date' fieldname='fechaitv' />
</column>
</columns>
<rows>
<row type='status'>
<option color='danger' fieldname='siniestro'>1</option>
</row>
<row type="actions">
<button type="modal" label="mostrar" color="warning" action="test" />
</row>
</rows>
<modals>
<group name="modalCoche" title="Modelo de Coche" icon="fas fa-car">
<column name="ID" numcolumns="12" description="desc-custommer-name">
<widget type="text" fieldname="idcoche" required="true" />
</column>
<column name="Matricula" numcolumns="6">
<widget type="text" fieldname="matricula" required="true" />
</column>
<column name="Marca" numcolumns="6">
<widget type="text" fieldname="marca" required="true" />
</column>
<column name="Modelo" numcolumns="6">
<widget type="text" fieldname="modelo" required="true" />
</column>
<column name="Fecha ITV" numcolumns="6">
<widget type="date" fieldname="fechaitv" required="true" />
</column>
<column name="Siniestro" numcolumns="6">
<widget type="checkbox" fieldname="siniestro" required="true" />
</column>
</group>
<group name="fechaitv" title="Fecha de ITV" icon="fas fa-car">
<column name="Fecha ITV" numcolumns="6">
<widget type="date" fieldname="fechaitv" required="true" />
</column>
</group>
</modals>
</view>
Vista avanzada: Incluye estados visuales (siniestro en rojo), botones de acción personalizados y múltiples modales para creación rápida y edición específica de campos.
🔄 Flujo de Trabajo del Plugin
1. Instalación y Activación
- Copiar carpeta PluginCoches a /Plugins/
- Activar desde Admin → Plugins
- El sistema crea automáticamente la tabla 'coches'
2. Navegación
- Aparece nuevo menú "Coches" con icono de búsqueda
- Submenú "Coches" para gestionar vehículos
- Vista de listado con colores para siniestros
3. Funcionalidades Avanzadas
- Creación rápida: Modal para añadir coches sin salir del listado
- Marcar siniestro: Botón rojo con confirmación
- Cambiar ITV: Modal específico para actualizar fechas
- Búsqueda: Por matrícula, marca o modelo
- Visualización: Siniestros destacados en rojo
✨ Características Especiales Implementadas
Modales Integrados
modalCoche: Para creación rápida de vehículosfechaitv: Modal específico para cambiar fecha ITV- Configuración con
setSettings('modalInsert') - Validaciones required="true" en campos
Estados Visuales
- Fila tipo
statuspara destacar estados - Color
dangerpara vehículos siniestrados - Condición:
fieldname='siniestro'y valor1 - Feedback visual inmediato al usuario
Gestón Masiva
- Acciones sobre múltiples registros seleccionados
getArray('codes')para obtener IDs- Loop
foreachpara procesar cada registro - Mensajes de log informativos
🚀 Posibles Mejoras y Extensiones
Validaciones de Matrícula
Implementar: Validación formato español (0000-XXX) o europeo.
Beneficio: Mayor consistencia en datos de matrículas.
Relaciones con Clientes
Implementar: Relación Many-to-One con tabla de clientes (dueños).
Beneficio: Gestión completa de vehículos y sus propietarios.
Historial de Mantenimiento
Implementar: Tabla relacionada para revisiones, reparaciones.
Beneficio: Sistema completo de historial de mantenimiento.