Obtenir la somme d'attibuts supplémentaires (lignes)

Bonjour,

J’ai fait pas mal de recherches sur cette merveilleuse fonctionnalité que constituent les attributs supplémentaires et j’ai pu obtenir certains résultats très satisfaisants. Mais il me manque quelques petites choses pour obtenir pleine satisfaction.

Je vais tâcher de décrire précisément ma problématique et mon besoin.
J’utilise Dolibarr pour gérer mon autoentreprise, dont une grande part de l’activité réside dans la formation. Comme je dois, chaque année, saisir mon Bilan Pédagogique et Financier, qui consiste à calculer des totaux : nombre de stagiaires, nombre d’heures de formation dispensées, nombre d’heures-stagiaires (heures de formation * nombre de stagiaires), j’ai eu l’idée, il y a plusieurs années de cela, de créer des attributs supplémentaire sur mes factures :

  • un booléen intitulé Formation en tant qu’Attribut supplémentaire (factures) me permettant de filtrer facilement les factures de formation dans la liste de toutes les factures
  • un numérique entier en tant qu’Attribut supplémentaire (lignes) pour consigner le nombre de stagiaire
  • un décimal en tant qu’Attribut supplémentaire (lignes) pour saisir le nombre d’heures de formation
    Comme je facture une fois par mois les différentes écoles pour lesquelles je sous-traite, j’ai ainsi plusieurs lignes par facture.

Lors du bilan pédagogique et financier, je n’ai plus qu’à filtrer et à ouvrir chaque facture pour procéder aux différents totaux.

Mais, évidemment, je suis certain que l’on peut faire beaucoup mieux que cela.
J’ai donc cherché à comprendre comment fonctionnaient les champs calculés.
Je suis parvenu à calculer, pour chaque ligne, le nombre d’heures-stagiaires, avec cette formule :
$objectoffield->array_options['options_nbheuresligne'] * $objectoffield->array_options['options_nbstagligne']

Mon rêve serait, maintenant, de parvenir à calculer, au niveau de la facture elle-même, la somme des stagiaires, celle du nombre d’heures de formation dispensées, ainsi que celle du nombre d’heures-stagiaires.

Comme tous ces attributs supplémentaires (lignes) sont sommables, et j’ai bien coché la case correspondante, je me dis que cela doit être possible.

J’ai tenté ceci :
$objectoffield->lines[$i]->array_options['options_nbheuresligne']

et ceci :
$objectoffield->ligne[$i]->array_options['options_nbheuresligne']

…sans résultat…

Je me pose toutefois la question de l’efficacité du $i dans la mesure où aucune boucle n’a été préalablement déclarée. Par mes soins, en tout cas.

Mais avant de chercher à l’écrire moi-même, j’ai le sentiment que je devrais déjà obtenir un résultat en utilisant lines[0], etc. Mais ce n’est pas le cas. L’expression suivante :
$objectoffield->lines[0]->array_options['options_nbheuresligne']
ne donne rien.

J’aimerais beaucoup pouvoir utiliser var_dump() pour m’aider mais je n’y parviens pas. Comment procède-t-on exactement ? J’ai essayé de plusieurs manières, il me semble que créer un champ calculé pour y saisir…
var_dump($objectoffield);
…devrait fonctionner mais nenni, ma foi.
J’aurais souhaité saisir cette formule comme champ calculé d’une variable de type Texte long mais c’est impossible. Seuls les types Chaîne de caractères, Numérique entier et Décimal permettent la saisie de champs calculés, ce qui ne me parait pas tellement adapté. Pourquoi n’est-ce pas possible ? Comment et où peut-on afficher les résultats du var_dump() ?

Bref, quelques petites questions dont je n’ai pas su trouver les réponses dans la documentation…

Je poursuis mes investigations.

L’inspection du code de la page de facture, par l’inspecteur de Firefox, en l’occurrence, m’a permis de constater que l’affichage des champs supplémentaires était réalisé par le template extrafields_view.tpl.php, situé dans htdocs/core/tpl. En ouvrant ce fichier, on constate qu’il est parsemé de var_dump() commentés. Habile.

J’ai donc ajouté un var_dump($objectoffield); qui m’a permis d’afficher pas mal de choses très intéressantes. Notamment mes variables lignes, dans le détail de la facture.
Je ne suis pas encore parvenu à les utiliser dans mes champs calculés.

Cependant, le var_dump affiche uniquement la dernière ligne de la facture. Quid de toutes les autres ?

Autre fait « étrange », pour le béotien que je suis, sur les seules lignes présentes dans le var_dump, je ne parviens pas à afficher une valeur d’array dans un champ calculé.
Par exemple, var_dump($objectoffield->array_options); m’affiche ceci :

array(5) { ["options_formaligne"]=> string(1) "1" ["options_nbstagligne"]=> string(2) "20" ["options_nbheuresligne"]=> string(10) "4.00000000" ["options_typeformaligne"]=> string(1) "3" ["options_nb_h_stagiaires"]=> float(80) }

Un echo $objectoffield->array_options["options_nbheuresligne"]; me permet bien d’obtenir 4.00000000. Cependant, dans un champ calculé, j’obtiens ce message d’erreur :

Bad string syntax to evaluate. Some data were output when it should not when evaluating: $objectoffield->array_options["options_nbheuresligne"]

Bref, au vu de mes compétences actuelles et en l’absence totale de réaction sur ce forum, je crains qu’il ne me faille abandonner mes recherches. Je pense pourtant qu’il ne manquerait pas grand-chose. Les champs calculés étant sommables, on devrait pouvoir récupérer cette somme et l’afficher facilement quelque-part. J’espère que le développement de Dolibarr se poursuivra dans ce sens.

Bonjour @FO1

Vu l’envie et le niveau, avez vous pensé à faire un petit module pour faire ce que vous voulez ? Il serait plus simple de se baser sur des triggers pour mettre à jour des extrafields

Voici quelques ressources :

  1. Système de Triggers — Dolibarr ERP CRM Wiki
  2. https://www.youtube.com/playlist?list=PLxu1kps6H_E3kA3noBhxFdT591l1XqbVK

@+

Bonjour @DELTHAIR64 !

Merci beaucoup pour cette réponse. Je me dis, effectivement, qu’il serait intéressant d’écrire un module pour l’occasion. Mais le temps me manquait, donc j’ai fait autrement pour obtenir les informations dont j’avais besoin pour mon Bilan Pédagogique et Financier.
Donc je vais mettre cette question de côté un moment. Cela dit, l’idée d’appréhender un peu mieux le PHP pour concevoir un module me motive et je vais m’intéresser de plus près à ces questions de triggers.

Merci pour les liens !