Tarea #910

CORE v2023

Rediseñar el ListController. La nueva versión 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/Lib/ExtendedController para mantener compatibilidad durante unos meses.

Ejemplo de uso

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

class ListProject extends \FacturaScripts\Core\Template\ListController
{
    const MENU  = 'sales';
    const TITLE = 'projects';
    const ICON  = 'fas fa-folders';

    protected function init()
    {
        $this->addTabProjects();
    }

    protected function addTabProject(string $tabName = 'ListProject')
    {
        // llamamos a addListTab() en lugar de addView() para que sea igual que en los EditController
        // también nos dejamos la puerta a añadir más tipos de pestañas
        $this->addListTab($tabName, 'Project')
                    ->addOrderBy(['name'], 'name')
                    ->addSearchFields(['name']);

        // tanto la función addListTab() como las funciones AddOrderBy() y addSearchField()
        // deben devolver siempre $this->tabs[$tabName]
        // así podemos encadenarlas
    }
}

Constantes en lugar de getPageData()

El uso de contantes permite al IDE autocompletar, mientras que con la función que devuelve un array te tienes que saber los nombres de los campos. Para mayor compatibilidad, la clase Controller tendrá una función getPageData() que devolverá un array usando los valores de estas constantes.

init() en lugar de createViews()

Esta sería la primera función de nuestro código que ejecute el ListController. Aquí podemos añadir las pestañas y botones y variables que necesitemos, pero también comprobar permisos. Por ejemplo, podríamos impedir la ejecución para un usuario no administrador:

protected function init()
{
    if($this->user->admin === false) {
       throw new KernelException('AccessDenied', 'access-denied');
    }

    $this->addTabProjects();
}

El flujo de ejecución del controlador sería:

  • init()
  • execPreviousAction()
  • loadData()
  • execAfterAction()
  • html() : la función que finalmente devuelve el HTML, ya que ahora este paso lo hace el controlador.

Tabs en lugar de Views

ListView, EditView, EditListView, etc son realmente pestañas, por lo que es mejor llamarlos tabs. Además deberíamos implementar las funciones tab() y deleteTab(), para mayor comodidad:

// añadimos una pestaña de listado
$this->addListTab($tabName, 'Project')
            ->addOrderBy(['name'], 'name')
            ->addSearchFields(['name']);

// añadimos otra opción de ordenación a una pestaña existente
$this->tab($tabName)->addOrderBy(['creationdate'], 'date');

// desactivamos la pestaña
$this->tab($tabName)->settings('active', false);

// eliminamos la pestaña
$this->deleteTab($tabName);

setPosition(int $pos)

Necesitamos poder añadir o mover pestañas a cierta posición, por ejemplo en segunda posición o en última posición. Para ello podemos añádir la función setPosition().

// añadimos una pestaña al final del todo
$this->addListTab($tabName, 'Project')
            ->setPosition(99)
            ->addOrderBy(['name'], 'name')
            ->addSearchFields(['name']);

setTitle(string $title)

Aunque se puede asignar el título de la pestaña al hacer el addListTab(), si lo ofrecemos también en una función independiente, podemos granar expresividad.

// añadimos una pestaña al final del todo
$this->addListTab($tabName, 'Project')
            ->setTitle('projects')
            ->addOrderBy(['name'], 'name')
            ->addSearchFields(['name']);

setIcon(string $icon)

Aunque se puede asignar el icono de la pestaña al hacer el addListTab(), si lo ofrecemos también en una función independiente, podemos granar expresividad.

// añadimos una pestaña al final del todo
$this->addListTab($tabName, 'Project')
            ->setIcon('fas fa-folders')
            ->addOrderBy(['name'], 'name')
            ->addSearchFields(['name']);

addColor(string $field, string $value, string $color, string $title)

Pintamos de ese color las filas del listado cuyo campo $field tenga el valor $value, o lo que es lo mismo, añadimos el option color al row status.

// añadimos una pestaña al final del todo
$this->addListTab($tabName, 'Project')
            ->addOrderBy(['name'], 'name')
            ->addSearchFields(['name'])
            ->addColor('name', 'test', 'danger', 'test');

addFilter(ListFilterInterface $filter)

Aunque ya tengamos las funciones para añadir filtros concretos, como selectores, filtros de fechas, etc. Si ofrecemos la función para añadir cualquier filtro, facilitamos la inclusión de nuevos filtros mediante plugins, haciendo que sean como otro cualquiera.

$this->addListTab($tabName, 'Project')
            ->addOrderBy(['name'], 'name')
            ->addSearchFields(['name'])
            ->addFilter(new FilterColor('colorvalue', 'color'));

Botones

Debemos poder añadir botones a la pestaña, como ya tenemos ahora:

// añadimos el botón a la vez que la pestaña
$this->addListTab($tabName, 'Project')
            ->addOrderBy(['name'], 'name')
            ->addSearchFields(['name'])
            ->addButton([
                    'action' => 'test-action',
                    'icon' => 'fas fa-question',
                    'label' => 'test'
            ]);

// añadimos el botón después de añadir la pestaña
$this->tab($tabName)->addButton([
    'action' => 'test-action',
    'icon' => 'fas fa-question',
    'label' => 'test'
]);

Pero también debemos poder añadir botones a la propia página, fuera de la pestaña.

$this->addButton([
    'action' => 'test-action',
    'icon' => 'fas fa-question',
    'label' => 'test'
]);

boceto

Validación de token automática

Para prevenir ataques CSRF en cualquier controlador, la clase EditController debería lanzar una excepción cuando recibe datos por POST pero no hay un token asociado o el token no es válido. De este modo nos evitamos tener que hacer esta comprobación en cada método.

Widgets y filtros

Algunos widgets o filtros de las pestañas pueden necesitar enviar y recibir datos del controlador. Para estos casos lo correcto es estandarizar estas llamadas, por ejemplo, que envíen siempre el action=tab-actions, y desde execPreviousAction() podemos llamar al método tabAction(), que recorrería todos los widgets y todos los filtros de la pestaña seleccionada y ejecutaría su método action().

Posibles problemas de permisos

Existen varias situaciones relacionadas con permisos que hay que tener en cuenta:

  • El programador puede querer personalizar los permisos de visualización, modificación o eliminación para ese controlador, por ejemplo, puede querer que solamente los usuarios en determinada lista puedan eliminar registros, independientemente de los permisos configurados en el grupo.
  • En los widgets o filtros autocomplete, un usuario malintencionado puede modificar el html para cambiar la columna o la tabla sobre la que se hace el autcomplete y robar información de la empresa.

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

Solamente autorizados y patrocinadores pueden comentar.

Tarea #2135

(BUG) Al enviar una factura por email, en el texto se rellena el nombre del cliente escapando dos veces las comillas (el modelo ya escapa una y probablemente al pintar el texto en twig está escapando otra vez porque falta el | raw).

CORE - Pendiente
Tarea #2096

Necesitamos una forma sencilla de copiar y pegar facturas, albaranes, etc entre compras y ventas y también entre instalaciones distintas. CopyModelController Cuando abrimos una factura, albarán, etc y pulsamos el botón copiar, se abre el asistente de copia. Ahí podemos poner...

CORE - Pendiente
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
Tarea #2012

En las facturas, si el total es cero y no hay asientos, ocultar la pestaña de asientos. Objetivo Evitar que el usuario intente generar el asiento cuando la factura está a cero y no se puede generar el asiento. Implementación Modificar el loadData() del controlador para...

CORE - Pendiente
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
Tarea #1993

Modificar el CodeModel para poder ampliar el límite de elementos que devuelve. Ahora está limitado a 1000: https://github.com/NeoRazorX/facturascripts/blob/master/Core/Model/CodeModel.php#L34 La idea es reemplazar esa constante por una variable privada estática y dos...

CORE - Pendiente
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
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
Tarea #1745

Añadir el campo dailyexec al modelo CronJob para poder almacenar el número de ejecuciones diarias del trabajo. Modificar: Tabla Modelo XMLViews CronClass Modificar CronClass::jobDone() para que: Ponga a 0 dailyexec cuando la fecha de la última ejecución no es de hoy. Sume 1 a...

CORE - Pendiente
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
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
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
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
Tarea #1675

Añadir un test unitario para el modelo Ejercicio, siguiendo el patrón del test de AgenciaTransporte. Pruebas El test debe ejecutar las siguientes pruebas: Comprobar que se puede crear un ejercicio (y que se crea abierto) y borrarlo. Comprobar que no se puede crear un ejercio...

CORE - Pendiente
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
Tarea #2067

Al añadir un producto a un documento de venta, usando el botón del libro azul, igual que aparece la opción "Vendido anteriormente al cliente", aparecerá "Venido anteriormente al cliente a este precio" con el último precio de venta de dicho producto a dicho...

CORE - Pendiente
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
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
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
Tarea #1292

El selector de valores de atributos de la variante debería ir agrupado por atributo, es decir, en el campo atributo1 deberían salir solamente los valores del primer atributo, en el segundo campo los del segundo, etc. Para que siempre sea igual, deberíamos poder indicar en el...

CORE - Pendiente
Tarea #1787

Al imprimir facturas rectificativas, además de imprimir el código de la factura original, también hay que añadir la fecha de la factura original y el motivo del cambio, que es el campo observaciones de la propia factura que se imprime.

CORE - Pendiente
Tarea #1595

ListCliente y ListProveedor, en la pestaña de direcciones y contactos, añadir un select where para poder alternar entre contactos con cliente/proveedor o todos los contactos, es decir, en ListCliente se podría alternar entre contactos de clientes o todos y en ListProveedor lo...

CORE - Pendiente
Tarea #801

Modificar las series (modelo Serie) para añadir un selector para indicar si es normal, simplificada o rectificativa. En cuanto a las rectificativas, será necesario indicar cual es su serie normal, es decir, la serir R1, cuál es su serie que rectifica.

CORE - Pendiente
Tarea #1607

Añadir el test unitario del modelo ProductoProveedor. Comprobaciones Se puede crear un producto de proveedor. No se puede crear un producto de proveedor si el proveedor no existe. Al eliminar un proveedor se eliminan sus productos. Al hacer un albarán de compra a un...

CORE - Pendiente
Tarea #1538

(BUG) al crear un asiento descuadrado, sale el mensaje antes de guardar, pero al guardar no sale ningún otro mensaje, y no es fácil ver que está descuadrado:

CORE - Pendiente
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
Tarea #1397

Comprobar por qué cuando la empresa tiene régimen de recargo de equivalencia, no lo está aplicando a las ventas.

CORE - Pendiente
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
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
Tarea #1175

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

CORE - Pendiente
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
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
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
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
Tarea #1999

(ListView) Al hacer clic central (con la rueda del ratón) sobre una fila del listado, se abre una nueva pestaña y se coloca el foco en la nueva pestaña. Lo ideal es que el foco se mantega en la pestaña actual, no en la nueva. Solucionado https://facturascripts.com/roadmap/2141

CORE - Cancelado
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
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
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
Tarea #958

Modificar el modelo Variante para no permitir valores nulos en coste, precio o margen. Añadir las correspondientes funciones en el test unitario del modelo. Archivos a modificar https://github.com/NeoRazorX/facturascripts/blob/master/Test/Core/Model/ProductoTest.php...

CORE - Pendiente
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
Tarea #2117

Añadir la columna de beneficio a los documentos de venta, al igual que está la de coste. Solamente al documento, no a las líneas. Visualización Las columnas coste y beneficio deben estar como ocultas en los XMLView de presupuestos, pedidos, albaranes y facturas de compra, y...

CORE - Pendiente
Tarea #2144

Al agrupar documentos, en el card de más documentos para añadir, hay que mostrar la forma de pago, además de añadir un filtro de forma de pago y fecha, para poder, por ejemplo, agrupar todos los albaranes del mes anterior con forma de pago tarjeta. Cliente interesado tirolinasgo

CORE - Pendiente
Tarea #2145

Al agrupar documentos hay que poder seleccionar la serie para el nuevo documento: Por defecto (la del primero documento, como ahora) Serie A Serie... Cliente interesado TirolinasGo

CORE - Pendiente
Tarea #2143

En el controlador EditAsiento se está sobrescribiendo la función ExportAction(), y no se está comprobando los permisos de exportación, por lo que cualquiera podría exportar los datos del asiento.

CORE - Pendiente
Tarea #862

Añadir extensión a PDFDocument. Con los nuevos formularios de compras y ventas desde la versión 2022, varios plugins pueden añadir columnas y no hay problema en ello. Pero lo normal sería querer poder mostrar seguramente dichas columnas en el pdf al imprimir. Dichas columnas...

CORE - Pendiente
Tarea #860

Añadir las traducciones cortas save-ok, save-error, delete-ok y delete-error para usarlas al mostrar los mensajes al guardar o eliminar registros.

CORE - Pendiente
Tarea #721

En los listview, ocultar el botón de guardar filtros cuando no es un list controller, por ejemplo con una opción en el settings de la vista: Pruebas Ir al menú ventas, clientes, pestaña grupos, crear un grupo y guardar. En la parte de abajo pulsar el botón filtros y...

CORE - Pendiente
Tarea #665

Descomprimir automáticamente los archivos zip de la carpeta Plugins, cuando ejecutamos el controlador AdminPlugins. Archivo a modificar https://github.com/NeoRazorX/facturascripts/blob/master/Core/Controller/AdminPlugins.php

CORE - Pendiente
Tarea #674

Añadir calendario full-calendar al dashboard, para mostrar recibos.

CORE - Pendiente
Tarea #707

Añadir columna numdocs a albaranes, facturas, pedidos y presupuestos, para guardar el número de documentos adjuntos. Añadir también el correspondiente filtro a los listados: Filtro checkbox "tiene adjuntos". Al añadir un adjunto, aumentar el numdocs del modelo. Al...

CORE - Pendiente
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