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 siniestro como false por defecto
  • primaryColumn(): Define idcoche como 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ículos
  • fechaitv: Modal específico para cambiar fecha ITV
  • Configuración con setSettings('modalInsert')
  • Validaciones required="true" en campos

Estados Visuales

  • Fila tipo status para destacar estados
  • Color danger para vehículos siniestrados
  • Condición: fieldname='siniestro' y valor 1
  • Feedback visual inmediato al usuario

Gestón Masiva

  • Acciones sobre múltiples registros seleccionados
  • getArray('codes') para obtener IDs
  • Loop foreach para 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.