Complementary attributes

From Dolibarr ERP CRM Wiki
Jump to navigation Jump to search

Introduction

Most of the Dolibarr modules have the possibilities to enhance the standard fields by new custom fields. These fields are called "Complementary attributes" can be defined for objects or object lines.

How to use

Go to the parameters of the module where you want to create new user fileds

Module configuration.png

On the configuration page, select the complementary attribute menu

Complementary attribute menu.png

Then click on New Attribute

List of fields for each complementary attribute

Each attribute has a some fields that need to be set

Fields of each complementary attribute.png

Label or translation key

  • Mandatory field
  • Label of the new field. This can be a translation key (new or existing), then you also need to set the 'language file' field.

Attribute code

  • Mandatory field
  • Code of the new field. Can only contain alphanumerical and lower case characters without space

Type

  • String (1 line) : Text on one line.
  • Long text (n lines) : Text on several lines.
  • Html text : Text with HTML tags.
  • Integer :
  • Float :
  • Date :
  • Date and hour :
  • Boolean (one checkbox) :
  • Price :
  • Phone :
  • Email :
  • Url :
  • Password :
  • Select list :
  • Select from table :
  • Radio buttons (one choice only) :
  • Checkboxes :
  • Checkboxes from table :
  • Link to an object :
  • Separator (not a field) :

Size

Position

Value

Language file

Computed field

Default value (Database)

Unique

Required

Can always be edited

Visibility

Define when a complementary attributes will be visible.

Display on PDF

Do we have to show the value into the generated PDF ?

Totalizable

Define is this new attribute can be summed and if the application must show the value of the sum on the line "Total" at the bottom of lists.

Help text to show on tooltip

Tips

Select from table

List of suppliers in a Category

  • On phpmyadmin use the following code SELECT cs.fk_soc, cs.fk_categorie, soc.nom FROM llx_categorie_societe cs inner join llx_societe soc WHERE cs.fk_soc=soc.rowid to create a new "view" that you can name llx_mylistcategorie
  • Then on the complementary attribute, use mylistcategorie:nom:fk_soc::fk_categorie=10

Computed Fields

You can enter here a formula using other properties of object or any PHP coding to get a dynamic computed value. You can use any PHP compatible formulas including the "?" condition operator, and following global object: $db, $conf, $langs, $mysoc, $user, $object.

WARNING: Only some properties of $object may be available. If you need a properties not loaded, just fetch yourself the object into your formula like in the second example.

Using a computed field means you can't enter yourself any value from interface. Also, if there is a syntax error, the formula may return nothing.


Example of formula:

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


Example to reload object

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


Other example of formula to force load of object and its parent object:

(($reloadedobj = new Task($db)) && ($reloadedobj->fetchNoCompute($object->id) > 0) && ($secondloadedobj = new Project($db)) && ($secondloadedobj->fetchNoCompute($reloadedobj->fk_project) > 0)) ? $secondloadedobj->ref: 'Parent project not found'

Example to have the third party balance

(($reloadedobj = new Societe($db)) && ($reloadedobj->fetchNoCompute($obj->rowid)) && ( $ret=$reloadedobj->getOutStandingBills()) ) ? $ret['opened']: 666

Example to have the third party open invoices

(($reloadedobj = new Societe($db)) && ($reloadedobj->fetchNoCompute($obj->rowid)) && ( $ret=$reloadedobj->getOutStandingBills()) ) ? sizeof($ret['refsopened']): 666

Visibility

To display one attribute only if the object belongs to a certain category, you can use the following code : (($c = new Categorie($db)) && ($cats = $c->containing($object->id, Categorie::TYPE_PRODUCT))&& (in_array('mycategory_id',$cats ))) ? 1 : 0

To display one attribute only if the object is a product : ((preg_match('/type=product',$_SERVER['QUERY_STRING']) || preg_match('/type=0',$_SERVER['QUERY_STRING']))? 1 : 0