Bienvenido a los foros %s

Foro comunidad hispana Dolibarr

Identificarse Registrarse

Crear un nuevo extrafield con campo combinado.

Cuestiones sobre cómo utilizar Dolibarr, ayudas sobre las funcionalidades o cualquier cuestión que no está relacionada con un error.
Apolo
Novato
Mensajes: 30
Registrado: Lun, 29/05/2017, 10:49

Crear un nuevo extrafield con campo combinado.

Mensaje por Apolo »

Buenos dias.

Hoy me he planteado un ejercicio, crear un nuevo extrafield por ejemplo en facturas, que dé un valor conseguido con el campo combinado.

Por ejemplo..
Un dato que podria ser interesante es traerme la fecha del pago de la factura que no sale en el listado.

Los pasos a seguir, los tengo claros, pero no he jugado aún con el campo combinado. No logro entender parte de la formula. El '?' debe ser un IF, los ':' el ELSE. Mi dificultad reside en saber llamar al objeto del ejemplo que he puesto, que me valdria otro, para entenderlo.


1. Primero Modulo de facturas.
photo_2022-03-02_09-36-17.jpg
photo_2022-03-02_09-36-17.jpg (9.83 KiB) Visto 2266 veces
2. Crear nuevo Campo adicional. Para ello debo elegir un campo de texto, para que salga el campo combinado.
Captura de pantalla 2022-03-28 105422.jpg
Captura de pantalla 2022-03-28 105422.jpg (72.72 KiB) Visto 2266 veces

En la ayuda para calcular el campo combinado sale este texto:
Captura de pantalla 2022-03-28 105611.jpg
Captura de pantalla 2022-03-28 105611.jpg (119.43 KiB) Visto 2266 veces

Puede introducir aquí una fórmula utilizando otras propiedades de objeto o cualquier código PHP para obtener un valor calculado dinámico. Puede utilizar cualquier fórmula compatible con PHP, incluido el operador de condición "?" y los objetos globales siguientes: $db, $conf, $langs, $mysoc, $user, $object.
ATENCIÓN: Sólo algunas propiedades de $object pueden estar disponibles. Si necesita propiedades no cargadas, solo busque el objeto en su fórmula como en el segundo ejemplo.
Usando un campo computado significa que no puede ingresar ningún valor de la interfaz. Además, si hay un error de sintaxis, la fórmula puede devolver nada.

Ejemplo de fórmula:
$object->id < 10 ? round($object->id / 2, 2) : ($object->id + 2 * $user->id) * (int) substr($mysoc->zip, 1, 2)

Ejemlo de recarga de objeto
(($reloadedobj = new Societe($db)) && ($reloadedobj->fetch($obj->id ? $obj->id : ($obj->rowid ? $obj->rowid : $object->id)) > 0)) ? $reloadedobj->array_options['options_extrafieldkey'] * $reloadedobj->capital / 5 : '-1'

Otro ejemplo de fórmula para forzar la carga del objeto y su objeto principal:
(($reloadedobj = new Task($db)) && ($reloadedobj->fetch($object->id) > 0) && ($secondloadedobj = new Project($db)) && ($secondloadedobj->fetch($reloadedobj->fk_project) > 0)) ? $secondloadedobj->ref : 'Proyecto principal no encontrado'

Alguna ayuda?

Jesus

Apolo
Novato
Mensajes: 30
Registrado: Lun, 29/05/2017, 10:49

Mensaje por Apolo »

Buenos dias,

Voy avanzando y empiezo a entender algo más,

Concretando como ejercicio quiero listar el campo rowid de terceros, para ello he creado un campo extrafield con el siguiente codigo para el campo combinado:
(($reloadedobj = new Societe($db)) && ($reloadedobj->fetch($obj->rowid) > 0)) ? $reloadedobj->id: 0
Funcionar funciona pero solo para los terceros creados anteriormente a la creación del extrafield. He intentado opciones al codigo sin lograr que salgan los que se crean a posteriori.
Por si no me explicado bien, muestra correctamente los rowid en el listado de terceros, pero todos los terceros que son creados nuevos, no salen en el listado.

Si alguien ve el error, agradezco cualquier ayuda para comprender el por qué?

Gracias.
Jesus

Apolo
Novato
Mensajes: 30
Registrado: Lun, 29/05/2017, 10:49

Mensaje por Apolo »

Buenas,


Resulta que para sacar el rowid en los listados, existe esta variable de configuración:

MAIN_SHOW_TECHNICAL_ID ► Show also technical IDs on elements cards or some lists (not supported everywhere).

Con esto resuelvo el ejercicio. Me queda saber por qué falla el codigo para hacer lo mismo que resuelve esta configuración.y tambien retomaré el ejercicio inicial para comprender como funciona este campo combinado. Cualquier aportación seria bienvenida. :D

Seguimos.

Jesus.
Última edición por Apolo el Lun, 11/04/2022, 00:21, editado 1 vez en total.

Apolo
Novato
Mensajes: 30
Registrado: Lun, 29/05/2017, 10:49

Mensaje por Apolo »

Buenas,


Bien, pues vamos al lio. De momento voy a apuntarme por aqui, que tablas están implicadas para entender como guarda la Fecha de pago de una factura Dolibarr, que es el dato que quiero en el listado de facturas, con un extrafield y el campo combinado.

tabla de facturas-> llx_facture .> rowid
tabla de pagos de facturas-> llx_paiement -> rowid, datec
tabla de relacion de pagos de facturas-> llx_paiement_facture -> fk_paiment,fk_facture

El campo que me quiero traer esta en la tabla llx_paiment y se llama 'datec', que es la fecha del pago.

Si quisiera hacer una consulta SQL, la lógica seria esta mas o menos, se aceptan correcciones>

SELECT A.ref, B.datec
FROM llx_facture as A,llx_paiement as B, llx_paiement_facture as C
WHERE B.rowid=C.fk_paiement && A.rowid=C.fk_facture;

Con lo que si intento esta consulta; Me lanza un error de Bad string syntax to evaluate (dot char is forbidden), vamos que no puedo usar el punto en el codigo del campo combinado.

Qué sintaxi seria la correcta para inyectar ese SQL o su equivalencia en codigo?

Sequimos...

Jesus

Apolo
Novato
Mensajes: 30
Registrado: Lun, 29/05/2017, 10:49

Mensaje por Apolo »

Bueno pues entendiendo un poco el operador terniario de php, como forma sencilla del IF-THEN-ELSE

operando1 ? operando2 : operando3

Se mira si el operando1 es verdadero o falso, si es verdadero obtiene el valor del operando2 y si es falso obtiene el valor del operando3.

Seguimos.

Apolo
Novato
Mensajes: 30
Registrado: Lun, 29/05/2017, 10:49

Mensaje por Apolo »

Para los dos ejercicios que habia propuesto existen opciones, la del rowid con la variable MAIN_SHOW_TECHNICAL_ID, aunque no se muestra en todos los listados.
El primer ejercicio de mostrar la fecha del pago, también esta disponible entendiendo que cuando se paga por completo una factura se cierra, por lo que la fecha de cierre que ya está en el listado podria valer aunque interpretando solo como el pago total, no serviria para pagos parciales.
De todas formas lo que busco es entender el funcionamiento del campo combinado.

Seguimos.

Apolo
Novato
Mensajes: 30
Registrado: Lun, 29/05/2017, 10:49

Mensaje por Apolo »

Una vez entendido lo de los ternarios, lo siguiente es entender los objetos globales: $db, $conf, $langs, $mysoc, $user, $object, y para eso hay que ver mucho código. Además advierten que no están disponibles todas las propiedades de $object, pero proponen esta formula para obtener una propiedad no cargada:

(($reloadedobj = new Task($db)) && ($reloadedobj->fetch($object->id) > 0) && ($secondloadedobj = new Project($db)) && ($secondloadedobj->fetch($reloadedobj->fk_project) > 0))? $secondloadedobj->ref : 'Proyecto principal no encontrado'

Donde si lo desgranamos, el operando1 seria:
(($reloadedobj = new Task($db)) && ($reloadedobj->fetch($object->id) > 0) && ($secondloadedobj = new Project($db)) && ($secondloadedobj->fetch($reloadedobj->fk_project) > 0))

Analizando el operando1, tendriamos, dos partes claras, en esta primera, se selecciona la clase Task por el id si es mayor de cero,
(($reloadedobj = new Task($db)) && ($reloadedobj->fetch($object->id) > 0)

en la segunda parte se obtiene de la clase principal Project relacionandola con la clase Task por su clave foranea si es mayor de cero.
($secondloadedobj = new Project($db)) && ($secondloadedobj->fetch($reloadedobj->fk_project) > 0))

Si es verdadero obtendremos el operando2 , la referencia del Proyecto,
$secondloadedobj->ref

Si es falso el operando3, el texto,
'Proyecto principal no encontrado'

---------------

Seguimos