Tarea #1332

CORE v2023

Rediseñar el EditController. 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 EditProject extends \FacturaScripts\Core\Template\EditController
{
    const MENU  = 'sales';
    const TITLE = 'project';
    const ICON  = 'fas fa-folder-open';
    const MODEL = 'Project';
}

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 (a excepción de la primera). 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 en segunda posición
$this->addEditListTab($tabName, 'Project')
            ->setPosition(2)
            ->addOrderBy(['name'], 'name')
            ->addSearchFields(['name']);

setGroup(string $group)

Podríamos crear grupos para que cuando se muestran las pestañas en el lateral. Por ejemplo, podríamos separar las pestañas de facturas, albaranes, pedidos y presupuestos del cliente en un grupo, para que visualmente se vea que están relacionados.

$this->addEditListTab($tabName, 'FacturaCliente')
            ->setGroup('sales')
            ->setPosition(1)
            ->addOrderBy(['name'], 'name')
            ->addSearchFields(['name']);

grupo pestañas

Para modificar la posición de los grupos podemos tener una función addTabGroup(string $name, string $title, int $position).

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']);

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'
]);

Ahora mismo esta parte es un poco confusa. Los botones de imprimir y nuevo son realmente de la primera pestaña. Eso no debería ser así. Los botones de una pestaña deberían pintarse siempre en la pestaña y si los quieres fuera, defínelos fuera.

boceto

Validación de token automática

Para prevenir ataques CSRF en cualquier controlador, la clase ListController 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 #2284

Añadir filtro periodo sobre fecha de pago a los recibos de facturas (compra y venta). Para poder localizar rápidamente los pagados en unas fechas dadas.

CORE - Pendiente
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 julitosedano@gmail.com

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

En los listados de facturas se usa el color rojo tanto para facturas con recibo vencido como rectificativas. Necesitamos que las rectificativas usen un color distinto. Por ejemplo dark. Implementación Se deben modificar los xmlviews de los listados de facturas.

CORE - Pendiente
Tarea #2186

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

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

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

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 #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 #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 #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 #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 #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 #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 #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 #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 #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
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 #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
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 #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 #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 #708

Copiar enlaces a archivos adjuntos al aprobar un albarán, pedido o presupuesto.

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