Tarea #1334

CORE v2023

Rediseñar la clase Model para reemplazar a ModelClass. La nueva versión que se colocaría en la carpeta Template, de acuerdo a la nueva estructura de carpetas del Core. La versión original permanecería en Core/Model/Base para mantener compatibilidad durante unos meses.

Ejemplo de modelo

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

use FacturaScripts\Core\Template\Model;
use FacturaScripts\Core\Template\ModelTrait;

class Project extends Model
{
    use ModelTrait;

    const ID_COLUMN = 'id';
    const TABLE_NAME = 'proyectos';
}

La clase Model incluye por defecto las columnas id, creation_date, nick, last_update y last_nick.

Ejemplo de uso

// cargamos el proyecto 23
$project = new Project();
if ($project->load(23) ) {
    // lo ha cargado de la base de datos

    // imprimimos su clave primaria
    echo $project->id(); // antes era con primaryColumnValue()
}

Para dar compatibilidad hacia atrás se implementarían los alias a las funciones correspondientes en el ModelClass anterior, es decir, añadirle una función loadFromCode() que internamente llame a load() y una primaryColumnValue() que llame a id().

Nueva función estática all()

Project::all(); // devuelve los primeros 50 proyectos, ya que sigue teniendo el límite de 50 predeterminado
Project::all([], [], 0, 0); // devuelve todos los proyectos
Project::all(['nick', 'pepe']); // devuelve los primeros 50 proyectos con nick = 'pepe'
Project::all(['nick', 'pepe'], ['name' => 'ASC'], 0, 0); // devuelve todos los proyectos con nick = 'pepe' y ordenados por name
Project::all([['nick', 'pepe'], ['total', 1000, '>']], ['name' => 'ASC'], 0, 0); // devuelve todos los proyectos con nick = 'pepe' y total > 1000 y ordenados por name

// con Where
$where = [
    Where::column('nick', 'pepe'),
    Where::and('total', 1000, '>')
];
Project::all($where, ['name' => 'ASC'], 0, 0); // devuelve todos los proyectos con nick = 'pepe' y total > 1000 y ordenados por name

Nuevas fuciones load() y derivados

$project = new Project();
$project->load(1); // carga el proyecto 1, carga y devuelve true si lo encuentra. clear() y devuelve false en caso contrario
$project->loadOrFail(1); // carga el proyecto 1, carga los datos si lo encuentra. Lanza una excepción en caso contrario
$project->loadWhere(['nick', 'pepe']); // carga el primer proyecto con nick = 'pepe' y devuelve true. clear() y devuelve false en caso contrario

$project->loadWhereOrNew(['nick', 'pepe']); // carga el primer proyecto con nick = 'pepe'. clear() y asigna esos valores en caso contrario
// la función anterior sirve para reemplazar a estructuras de este estilo
$where = [
    ['nick', 'jose'],
    ['codalmacen' => 'ALG']
];
if(false === $project->loadWhere($where)) {
    // no existe, lo creamos
    $project->nick = 'jose';
    $project->codalmacen = 'ALG'
}

Nuevas funciones find() y derivados

Project::find(1); // devuelve el proyecto con id = 1, o null si no lo encuentra
Project::findOrFail(1); // devuelve el proyecto con id = 1, o lanza excepción si no lo encuentra
Project::findWhere(['nick', 'pepe]); // devuelve el primer proyecto con nick = 'pepe' o null en caso contrario
Project::findWhereOrNew(['nick', 'pepe]); // devuelve el primer proyecto con nick = 'pepe' o uno nuevo con nick = 'pepe'

deleteAll(array $where): bool

En ocasiones queremos eliminar muchos registros de una sola vez:

  • Podemos hacer un bucle, pero es lento.
  • Podemos ejecutar el SQL correspondiente, pero entonces no podemos añadir comprobaciones, como hacemos al eliminar facturas, asientos, etc.
// eliminamos todos los proyectos con total = 0
Project::deleteAll(['total', 0]);

Internamente el método puede construir y ejecutar el SQL para eliminar todos esos registros de una sola vez. Pero a la vez, como es un método y podemos añadirle extensiones, podemos ejecutar código antes para hacer ciertas cosas o impedir que suceda si se dan ciertas condiciones.

sum(string $column, array $where): float

En ocasiones queremos sumar todos los valores de una columna. Con esta función ahorramos mucho código.

Nuevas funciones relatedOne() y relatedAll()

$project = new Project();
$project->load(123);
$project->relatedOne('User'); // devuelve el usuario con nick = nick de la tabla, null si no lo encuentra
$project->relatedOne('User', 'author'); // devuelve el usuario con nick = author de la tabla, null si no lo encuentra
$project->relatedAll('Task', 'idproject'); // devuelve las primeras 50 tareas con idproject = id() del modelo
$project->relatedAll('Task', 'idproject', [], 0, 0); // devuelve todas las tareas con idproject = id() del modelo
$project->relatedAll('Task', 'idproject', ['creationdate' => 'ASC'], 0, 0); // devuelve todas las tareas, ordenadas por creationdate, con idproject = id() del modelo

Validación de tipos

En el método test(), que se llama al hacer save(), debe comprobar que todas las columnas tengan valores válidos, es decir, si el campo total está definido como float en el xml de la tabla, que no permita guardar una cadena de texto.

  • Tampoco deben permitir guardar null en columnas not null.
  • Si la columna es varchar(10), no debe permitir guardar cadenas de más de 10 caracteres.
  • Debe escapar automáticamente el HTML de las columnas string.

Otras validaciones

Podemos añadir al xml de la tabla validaciones adicionales antes de guardar los datos, por ejemplo, para los campos que son email, podemos añadir una regla de validación de email, de forma que sin hacer nada más, el modelo compruebe que si hay un email debe ser correcto:

<column>
   <name>name</name>
   <type>character varying(100)</type>
   <validation>valid_email,min_length[5]</validation>
</column>

¿Por qué poner la regla en el xml? De esta forma podemos añadir validaciones o cambiarlas mediante extensiones. Podríamos añadir mediante una extensión un campo email a un modelo y definir ahí la validación de email, con solamente poner el xml en la carpeta Extension/Table del plugin.

Algunas validaciones interesantes:

ModelOnChange

En lugar de tener una clase ModelOnChange y solamente aquellos modelos que hereden de esta clase tendrán posibilidad de reaccionar a cambios de valores en sus columnas, todos los modelos deberían soportar estas características. Para ello hay que implementar en la clase Modelo las funciones:

  • monitorChanges(string $column) : añade la columna a la lista de columnas cuyos valores previos hay que recordar. Función estática.
  • getOriginal(string $column) : devuelve el valor original de la columna.
  • onChange(string $column)

Sugerencia

Esto es una sugerencia a debatir. Está abierta a comentarios, votación y debate en la reunión semanal. Si se aprueba pasará a estado pendiente.

Comentarios

PRO
daniel89fg_739

21-06-2023 14:13:24 daniel89fg_739

En codeigniter y laravel también existe la figura del cast() para definir el tipo de columna, eso ya lo tenemos en el xml, pero en el modelo en el test() se podría controlar/comprobar que el dato enviado corresponde con el tipo de columna. Si tengo una columna de tipo string y se pasa un int que salte el error, y así con todos los tipos.
Solamente autorizados y patrocinadores pueden comentar.

Tarea #2762

Añadir la opción de evitar añadir la descripción de atributos al añadir una variante a un documento. Motivación En ocasiones usamos atributos que luego no queremos que se impriman sus nombres o valores.

CORE - Pendiente 25-09-2023
Tarea #2749

Necesitamos poder añadir una imagen por familia de productos, para cuando es la misma imagen para todos los productos de la familia.

CORE - Pendiente 19-09-2023
Tarea #2576

Necesitamos guardar en cada cliente el total facturado y el total pendiente de cobro (almacenado en la propia tabla) para poder mostrarlo y filtrarlo en listados e informes. Implementación Añadir las columnas total_facturado y pte_pago a la tabla, modelo y xmlviews. Añadir un...

CORE - Pendiente 20-06-2023
Tarea #2493

Añadir el régimen especial para agricultores a la lista de regímenes de IVA.

CORE - Pendiente 18-05-2023
Tarea #2475

En las secuencias, tenemos que hacer una sustitución del patrón al guardar para evitar guardar patrones que generen códigos de más de 20 caracteres. Implementación Modificar el método test() del modelo para hacer esta comprobación. Modificar el test unitario para probar este...

CORE - Pendiente 10-05-2023
Tarea #2392

Al añadir líneas a un asiento, se coloca automáticamente en el debe o el haber el resto correspondiente, es decir, si has añadido una línea con 50 en el debe, al añadir la segunda línea colocará 50 en el haber. Problema: si estás añadiendo varias alíneas con debe, vas a tener...

CORE - Pendiente 13-04-2023
Tarea #2172

Modificar el widget Money para que, cuando el nombre del campo contine la palabra euro, mostrarlo en euros.

CORE - Pendiente 14-02-2023
Tarea #2370

En ocasiones es necesario hacer facturas a cero, por distintos motivos. El problema es que estas facturas no están generando asientos y por tanto no aparecen en los informes de impuestos, ni los modelos fiscales. Hay que dar soporte a este tipo de facturas para que si...

CORE - Pendiente 05-04-2023
Tarea #2442

En muchos listados, por ejemplo el de líneas de facturas, aparecen unos campos en el listado y en el PDF que luego no aparecen al exportar a excel, como es el caso del código de la factura. El motivo es que tanto el listado como el PDF muestran los valores a través de los...

CORE - Pendiente 26-04-2023
Tarea #878

Modificar el actualizador para que la acción de actualizar, una vez se ha descargado el zip, sea una llamada ajax, al igual que la acción de actualizar el dinamic. Motivación Hay que mejorar la tolerancia a errores del actualizador. No puede ser que cada vez que hagamos un...

CORE - Pendiente 19-04-2022
Tarea #2313

(BUG) cuando abrimos un presupuesto, pedido, albarán o factura, pulsamos cambiar el cliente y pulsamos en el botón nuevo, al guardar el cliente realmente nos ha creado un presupuesto nuevo (o lo que sea), en lugar de asignar ese nuevo cliente al documento original.

CORE - Pendiente 26-03-2023
Tarea #2273

Las miniaturas de imágenes de productos tienen mala resolución al incluirlas en los PDF (PlantillasPDF). Necesitamos aumentar la calidad de las miniaturas. Cliente interesado [email protected]

CORE - Pendiente 17-03-2023
Tarea #614

Necesitamos poder mostrar los totales en listados incluso aunque sea un JoinModel y no un modelo normal. Problema Ahora mismo el ListView solamente calcula los totales de un listado si es un modelo normal, excluyendo a los JoinModel de esta funcionalidad. El problema es que...

CORE - Pendiente 03-03-2022
Tarea #2233

Parece que hay un problema al calcular el importe del asiento de cierre del ejercicio. Issue relacionada https://facturascripts.com/issues/6286

CORE - Pendiente 07-03-2023
Tarea #2153

El filtro periodo solamente está preparado para campos date, no para datetime. Necesitamos una forma sencilla de indicarle que vamos a filtrar por un campo datetime. Problema Este filtro añade los filtros de fecha desde y hasta. Cuando seleccionamos hoy (10-02-2023), está...

CORE - Pendiente 10-02-2023
Tarea #2186

Necesitamos controlar cuando la devolución es por rotura y no queremos que se devuelva al stock.

CORE - Pendiente 20-02-2023
Tarea #2051

En el modal de productos en compras y ventas, cuando filtras por familia, deberían salir también aquellos productos que sean de una subfamilia de la seleccionada.

CORE - Pendiente 17-01-2023
Tarea #1996

Modificar el informe de impuestos para incluir la columna País, para poder saber de qué país viene cada factura (para las ventas).

CORE - Pendiente 09-01-2023
Tarea #1893

Hay que definir claramente en los modelos de documentos de compras y ventas qué campos son realmente no editables, para que no se permita modificar esos, peri el resto.

CORE - Pendiente 13-12-2022
Tarea #1892

Al pasar una factura de venta a emitida, ya no se debería volver a pasar a boceto, es decir, al pasar a emitida hay que marcar internamente la factura para no dejar cambiarla, ni eliminarla después.

CORE - Pendiente 13-12-2022
Tarea #2789

Mostrar el título empresa/almacén en el selector de almacén de los formularios de edición de documentos de compra y de venta.

CORE - Pendiente 03-10-2023
Tarea #2724

En los asientos se está colocando un enlace para abrir el documento relacionado solamente cuando es factura, pero tenemos asientos que son de recibos, asientos que son de remesas, etc. En todos estos casos deberíamos poder ir igualmente al modelo original. Implementación Hay...

CORE - Pendiente 28-08-2023
Tarea #2705

Al hacer la comprobación de espacio utilizado, ahora mismo está sumando los tamaños de todos los registros de la biblioteca, pero debería comprobar realmente el tamaño de MyFiles, y guardarlo en caché, para no calcular continuamente. Implementación...

CORE - Pendiente 22-08-2023
Tarea #2585

Necesitamos una función para asignar una fecha a la factura siempre que no haya facturas con fechas anteriores, para mantener la correlación. Motivación Al importar pedidos desde tiendas online, marketplaces, etc, nos encontramos que puede que el pedio a facturar tenga fecha...

CORE - Pendiente 27-06-2023
Tarea #2533

(BUG) al poner una fecha de pago para la cual todavía no existe ejercicio, se genera el pago, pero no se genera el asiento porque el ejercicio no existe. La única forma de solucionar esto es por sql. Necesitamos poder hacerlo desde la interfaz. Necesitamos Poder generar el...

CORE - Pendiente 05-06-2023
Tarea #2519

Añadir al test de los documentos de compra y venta, la comprobación del idempresa de la forma de pago con el idempresa del almacen. No se puede añadir una forma de pago con un idempresa diferente al idempresa del almacen del documento. Tests Añadir el correspondiente test...

CORE - Pendiente 30-05-2023
Tarea #1613

Invertir la forma en que un contacto se convierte en cliente o proveedor. Ahora mismo coge los campos del contacto manualmente y los pone en el cliente o proveedor. Si un cliente añade campos al contacto, al convertirlo en cliente no arrastra dichos campos, y para poder...

CORE - Pendiente 27-09-2022
Tarea #2114

En las políticas de precio de coste no está teniendo en cuenta la divisa en los precios de proveedor, de forma que si vendemos en euros y compramos en rupias, nos va a leer los precios de compra del producto en rupias como si fuesen euros. Habría que hacer una conversión...

CORE - Pendiente 30-01-2023
Tarea #2149

AÑADIR LA OPCIÓN DE PODER ACTIVAR/DESACTIVAR GRUPOS COMPLETOS DE MENUS EN EL APARTADO DE PERMISOS DE LOS GRUPOS PARA NO IR DE CHECKBOX EN CHECKBOX. Implementación En lugar de tener todos los permisos en el listado, como ahora, tener una pestaña de permisos para cada menú.

CORE - Pendiente 08-02-2023
Tarea #2466

BUG, al crear un factura con el almacen 1 que pertenece a la empresa 1. Después de guardar la factura, si se cambia el almacen, el idempresa de la factura sigue siendo el de la empresa 1, en vez del nuevo idempresa del almacen seleccionado.

CORE - Pendiente 09-05-2023
Tarea #2501

(BUG) en los recibos de las facturas. Creas una factura con una serie X, guardas. Se crean los recibos y se rellena el campo codigofactura. Cambias la serie de la factura y guardas. No se actualiza el campo codigofactura del recibo

CORE - Pendiente 25-05-2023
Tarea #825

Poder filtrar por grupo de clientes en los listados de albaranes, facturas, pedidos y presupuestos de venta.

CORE - Pendiente 06-04-2022
Tarea #1827

No permitir eliminar productos o variantes ya compradas o vendidas, es decir, que estén en líneas de albaranes o facturas. Implementación Modificar el delete del modelo Producto para llamar al delete de cada una de sus variantes. Modificar el delete del modelo Variantes para...

CORE - Pendiente 15-11-2022
Tarea #1835

(Posible bug) al instalar, el instalador puede que no detecte la zona horaria y se quede en blanco, por lo que fallará después. Issue relacionada https://facturascripts.com/issues/5842

CORE - Pendiente 17-11-2022
Tarea #1227

Agilizar la creación de variantes de productos seleccionando los atributos y sus valores desde un listado pulsando luego en un botón para que las genere todas de golpe.

CORE - Pendiente 05-07-2022
Tarea #1540

(Posible bug) al cambiar la fecha de una factura de compra no se está actualizando el recibo, permanece con la fecha anterior.

CORE - Pendiente 07-09-2022
Tarea #1177

(TEST) comprobar qué sucede cuando creamos un estado que genera el mismo tipo de documento. Si es problemático, impedir que un estado genere el mismo tipo de documento y añadir la comprobación al correspondiente test unitario.

CORE - Pendiente 28-06-2022
Tarea #1201

En las opciones de colores de row status necesitamos poder comparar el valor de un campo con otro. Ejemplo: poner la fila en amarillo cuando el último comentario es del autor de la issue: <rows> <row type="status"> <option color="warning"...

CORE - Pendiente 03-07-2022
Tarea #1175

(ListProducto) si el usuario no tiene permiso para ver la columna fabricante, no mostrar el filtro de fabricantes.

CORE - Pendiente 28-06-2022
Tarea #1682

Modificar el modelo Partida para poder desactivar la comprobación de si el asiento o el ejercicio está bloqueado. Necesitamos poder modificar el saldo de una partida independientemente de si el asiento está bloqueado. Nota No es toy seguro de si el modelo está comprobando si...

CORE - Pendiente 11-10-2022
Tarea #1152

Resolver bug con postgresql al inicializar modelos con datos predefinidos en data. Problema Se están importando correctamente los datos de data, pero no se están actualizando la secuencias. Eso produce errores al añadir nuevos registros. Se han tenido que modificar los tests...

CORE - Pendiente 24-06-2022
Tarea #1676

Crear un test unitario para el modelo Impuesto. Comprobar Se puede crear un impuesto y borrarlo. Se pueden crear dos impuestos con el mismo iva. Si se crea un impuesto de tipo porcentaje y 10 de iva, al hacer una compra con una línea con ese impuesto, cantidad 2 y precio 50,...

CORE - Pendiente 10-10-2022
Tarea #1110

Modificar el javascript que envía el los datos por ajax en la edición de asientos, compras y ventas para modificar el token en cada petición. Posteriormente añadir la validación de token en los respectivos controladores. Token de formulario El token (input multireqtoken)...

CORE - Pendiente 21-06-2022
Tarea #1668

Necesitamos poder ver todos los emails enviados generados por una notificación (EmailNotification). Es decir, cuando vamos al menú administrador, emails, notificaciones y hacemos clic en una, que aparezcan los emails enviados relacionados con esa notificación. Estas...

CORE - Pendiente 06-10-2022
Tarea #1111

Al generar el asiento de la factura, debe generarlo bloqueado, o por lo menos bloquearlo al terminar de generarlo. Pruebas Hacer una factura con una línea con precio 100 y cantidad 1. Comprobar que se ha creado un asiento y que está bloqueado. Modificar el precio de la línea....

CORE - Pendiente 21-06-2022
Tarea #1112

Restaurar las cuentas 4000, 4100 y 4300 del plan contable de España. Solamente estas cuentas tienen que tener la cuenta especial de clientes, proveedores y acreedores, para que al crear clientes, se cree una subcuenta dentro de la 4300, al crear un proveedor lo haga dentro de...

CORE - Pendiente 21-06-2022
Tarea #983

Añadir permisos: Solmante modificar lo suyo: el usuario solamente podrá modificar el modelo si este tiene su nick o codagente. Solamente eliminar lo suyo: el usuario solamente podrá eliminar el modelo si este tiene su nick o codagente. Motivación Ya existe un permiso para...

CORE - Pendiente 17-05-2022
Tarea #986

Añadir buscador al listado de plugins del menú administrador, plugins. Tanto en el listado de plugins instalados como en el de más plugins: Motivación Cuando tenemos un montónd e plugins instalados se tarda demasiado en localizar. Cada vez tenemos más plugins disponibles y se...

CORE - Pendiente 17-05-2022
Tarea #987

(AdminPlugins) en el listado de plugins instalados, debajo de la descripción, mostrar los plugins requieridos por ese plugins. Por ejemplo, el plugin PlantillaDetallada requiere el plugin PlantillasPDF. Archivos a modificar...

CORE - Pendiente 17-05-2022
Tarea #957

No permitir crear estados predeterminados y no editables. Que un estado no editable sea predeterminado, significa que los nuevos documentos que se creen serán no editables desde el mismo momento de su creación, y dado que primero hay que crear el documento para poder añadir...

CORE - Pendiente 13-05-2022
Cookies
Usamos cookies en nuestro sitio web para brindarte la experiencia más relevante recordando tus preferencias y visitas repetidas. Al hacer clic en "Aceptar", aceptas el uso de TODAS las cookies necesarias.

Copyright (c) 2013-2023 FacturaScripts

Soporte