Modelos de sólo visionado

JoinModel

Nota

Debido a que este modelo es sólo para la visualización de datos tiene una estructura básica, no usando la estructura completa de los modelos de datos estándar.

Para aquellos casos en los que deseamos mostrar información interelacionada almacenada en distintas tablas de la base de datos podemos usar este tipo de modelo. Su implementación es muy sencilla y rápida, necesitando sólo unos pocos métodos para su correcto funcionamiento.

Cómo usar el modelo

Para crear un modelo de sólo visualización debemos crearnos una clase que extienda la clase Core/Model/Base/JoinModel en vez de la clase de los modelos de datos, implementándose automáticamente los métodos necesarios por la vista para la obtención de los datos como count y all. Para que esta obtención automática de datos funcione es necesario implementar los métodos getTables, getFields y getSQLFrom que informan la de estructura que queremos obtener. (Se detallan en las siguientes secciones)

Nuestro nuevo modelo de sólo visionado es una clase que debe ir en un archivo con el mismo nombre y dentro de la carpeta Model/Join del plugin, completando la lista de métodos obligatorios (ver más abajo).

Ejemplo donde se combina las tablas de partidas y asientos contables.

namespace FacturaScripts\Plugins\MyNewPlugin\Model\Join;

class PartidaAsiento extends FacturaScripts\Core\Model\Base\JoinModel
{
    protected function getFields(): array
    {
        return [
            'concepto' => 'partidas.concepto',
            'debe' => 'partidas.debe',
            'fecha' => 'asientos.fecha',
            'haber' => 'partidas.haber',
            'idasiento' => 'partidas.idasiento',
            'idpartida' => 'partidas.idpartida',
            'numero' => 'asientos.numero'
        ];
    }

    protected function getSQLFrom(): string
    {
        return 'partidas LEFT JOIN asientos ON partidas.idasiento = asientos.idasiento';
    }

    protected function getTables(): array
    {
        return ['asientos', 'partidas'];
    }
}

La gestión de propiedades del modelo (los «campos» que se quieren visualizar) se realiza mediante los métodos mágicos de PHP por lo que no requieren de declaración previa, en cargándose del proceso la clase JoinModel. Sólo si deseamos tener campos calculados debemos sobrescribir los métodos clear y loadFromData donde asignaremos sus valores.

Ejemplo de campos calculados

protected function clear()
{
    parent::clear();

    $this->cuotaiva = 0.00;
    $this->cuotarecargo = 0.00;
    $this->total = 0.00;
}

protected function loadFromData($data)
{
    parent::loadFromData($data);

    $this->cuotaiva = $this->baseimponible * ($this->iva / 100.00);
    $this->cuotarecargo = $this->baseimponible * ($this->recargo / 100.00);
    $this->total = $this->baseimponible + $this->cuotaiva + $this->cuotarecargo;
}

Métodos obligatorios

getTables

Para el control de existencia y creación automática de los modelos es necesario informar de la lista de tablas que vamos a utilizar en la obtención de los datos. Lo haremos retornando un array con la lista de tablas. (No la clase modelo que referencia la tabla)

protected function getTables(): array
{
    return [
        'asientos',
        'partidas',
        'subcuentas'
    ];
}

getFields

Es el método encargado de retornar un array asociativo con la lista de campos y su «alias» que deseamos visualizar.

protected function getFields(): array
{
    return [
        'codejercicio' => 'asientos.codejercicio',
        'codcuentaesp' => 'subcuentas.codcuentaesp',
        'descripcion' => 'cuentasesp.descripcion',
        'codimpuesto' => 'subcuentas.codimpuesto',
        'iva' => 'partidas.iva',
        'recargo' => 'partidas.recargo',
        'baseimponible' => 'SUM(partidas.baseimponible)'
    ];
}

getSQLFrom

El detalle de las tablas a utilizar se realiza mediante este método que nos retorna una cadena de texto con la cláusula FROM a utilizar en la sentencia SQL.

protected function getSQLFrom(): string
{
    return 'asientos'
        . ' INNER JOIN partidas ON partidas.idasiento = asientos.idasiento'
        . ' INNER JOIN subcuentas ON subcuentas.idsubcuenta = partidas.idsubcuenta'
        . ' AND subcuentas.codimpuesto IS NOT NULL'
        . ' AND subcuentas.codcuentaesp IS NOT NULL'
        . ' LEFT JOIN cuentasesp ON cuentasesp.codcuentaesp = subcuentas.codcuentaesp';
}

Métodos opcionales

getGroupBy

Para los casos que deseemos agrupar información para obtener totales o datos estadísticos podemos definir las cláusulas group by y having de la sentencia SQL mediante la declaración de este método. Debemos devolver una cadena de texto con el valor a aplicar.

protected function getGroupBy(): string
{
    return 'GROUP BY asientos.codejercicio, subcuentas.codcuentaesp,'
                  . 'cuentasesp.descripcion, subcuentas.codimpuesto,'
                  . 'partidas.iva, partidas.recargo';
}

primaryColumnValue

Con este metodo podemos especificar cual es la clave primaria. De este modo al cargar el JoinModel, en un ListController, los checkbox de cada fila añadirán en su atributo value la clave primaria de cada final. Este método es necesario si necesitamos añadir alguna función extra, como un botón personalizado que haga algo con los checkbox seleccionados.

Edición y borrado de datos

Como se ha dicho, este modelo no permite la edición ni borrado directamente puesto que usa distintas tablas en el proceso de visualización de datos, pero se ha incluido un método que permite establecer un modelo como principal sobre el que se realizarán los procesos de edición y borrado.

Para establecer el modelo principal se debe llamar al método setMasterModel desde el constructor indicándole una instancia del modelo.

Ejemplo:

public function __construct($data = array())
{
    parent::__construct($data);

    $this->setMasterModel(new Cliente());
}