Create an ODT or ODS document template: Difference between revisions

From Dolibarr ERP CRM Wiki
Jump to navigation Jump to search
Line 111: Line 111:
=== Other personalized tags ===
=== Other personalized tags ===
If you want to add a field that is not predefined, this is the solution:
If you want to add a field that is not predefined, this is the solution:
* First create a new module descriptor file. See page [[Module development]] for this.
* Add a file into htdocs/includes/modules/substitutions/functions_mymodule.lib.php
* Add a file into htdocs/includes/modules/substitutions/functions_mymodule.lib.php
* Inside this file, just write one function like this:
* Inside this file, just write one function like this:
Line 135: Line 134:
Function will be called before generating document to complete the array used for substitution and to replace tag myowntag with value $myvalue. You can add as many tags as you need and put all personalized code you want to define values (search into database, into files, calculation, from received parameters or from global variables)...  
Function will be called before generating document to complete the array used for substitution and to replace tag myowntag with value $myvalue. You can add as many tags as you need and put all personalized code you want to define values (search into database, into files, calculation, from received parameters or from global variables)...  


Warning: First parameter in function parameter declaration must start with & as valu is modified by your code and must be returned modified. Moreover, function will be called only if module '''mymodule''', created at first step, has been activated.
Warning: First parameter in function parameter declaration must start with & as valu is modified by your code and must be returned modified.
 
Note: With 3.2 and higher, if you have build your own module (See page [[Module development]]), you can put the substitution file inside a subdirectory of this module called htdocs/mymodule/core/substitutions.
Moreover, function will be called only if module '''mymodule''' contains an entry $this->module_parts = array('substitutions' => 1) and module has been activated.


== Store your document ==
== Store your document ==
To have your document to appear in list of available documents, put it into correct subdirectory found into
To have your document to appear in list of available documents, put it into correct subdirectory found into
directory '''documents/doctemplates'''
directory '''documents/doctemplates'''

Revision as of 16:43, 26 February 2012

This page describe how to build an ODT document template to build documents using ODT generation.

To know how to build a PDF template, see page Create a PDF document template. Building a PDF template require PHP development knowledge, but not building an ODT template.

Prerequisite

  • Dolibarr: 3.1+
  • OpenOffice: 3.2+, LibreOffice, ...

Create your document

  • Create from scratch an empty openoffice document and take a provided example. You may find them installed into a subdirectory of directory documents/doctemplates
  • Edit your document using all your Office suite features.

Include in your document the tags you want to see. Tags will be replaced during generation of document automatically by Dolibarr. List of all available tags are provided in next chapter.

Warning.png Warning, tags must be rounded with {} or [] for arrays (see later) and must be typed with no stop using Office suite (with no backward and no copy-paste). If not doing that, Office suite add some invisible informations making replacement not possible.

Tags

This is a list of tags that will be replaced with your informations:

Company/foundation information

mycompany_logo = {mycompany_logo}
mycompany_name = {mycompany_name}
mycompany_address = {mycompany_address}
mycompany_zip = {mycompany_zip}
mycompany_town = {mycompany_town}
mycompany_country = {mycompany_country}
mycompany_phone = {mycompany_phone}
mycompany_fax = {mycompany_fax}
mycompany_email = {mycompany_email}
mycompany_web = {mycompany_web}
mycompany_barcode = {mycompany_barcode}
mycompany_capital= {mycompany_capital}
mycompany_juridicalstatus= {mycompany_juridicalstatus}
mycompany_idprof1 = {mycompany_idprof1}
mycompany_idprof2 = {mycompany_idprof2}
mycompany_idprof3 = {mycompany_idprof3}
mycompany_idprof4 = {mycompany_idprof4}
mycompany_vatnumber = {mycompany_vatnumber}
mycompany_note = {mycompany_note}
...

Customers, prospects or suppliers information

company_name = {company_name}
company_address = {company_address}
company_zip = {company_zip}
company_town = {company_town}
company_country = {company_country}
company_phone = {company_phone}
company_fax = {company_fax}
company_email = {company_email}
company_web = {company_web}
company_barcode = {company_barcode}
company_customercode = {company_customercode}
company_suppliercode = {company_suppliercode}
company_capital = {company_capital}
company_juridicalstatus = {company_juridicalstatus}
company_idprof1 = {company_idprof1}
company_idprof2 = {company_idprof2}
company_idprof3 = {company_idprof3}
company_idprof4 = {company_idprof4}
company_vatnumber = {company_vatnumber}
company_note = {company_note}

User information

myuser_lastname = {myuser_lastname}
myuser_firstname = {myuser_firstname}
myuser_login = {myuser_login}
myuser_email = {myuser_email}
...

Object information (invoice, commercial proposal, order, ...)

object_id = {object_id}
object_ref = {object_ref}
object_ref_customer = {object_ref_customer}
object_ref_supplier = {object_ref_supplier}
object_date = {object_date}
object_date_creation = {object_date_creation}
object_date_validation = {object_date_validation}
object_total_ht = {object_total_ht}
object_total_vat = {object_total_vat}
object_total_ttc = {object_total_ttc}
object_vatrate = {object_vatrate}
object_note_private = {object_note_private}
object_note = {object_note}
...
Specific to proposals:
object_date_end = {object_date_end}    End date of validity of proposal

Lines of object

This is how to use arrays for lines of objects (invoices, commercial proposal, orders, etc...). You must create your array in the document and use a begin and end tag to define a line of the array. The line will then be repeated as much as required during generation.

[!-- BEGIN row.lines --]
...
[!-- END row.lines --]

Then, you can use following tags into your line:

{line_pos}
{line_desc}
{line_product_ref}
{line_product_ref_fourn}
{line_product_label}
{line_product_type}
{line_product_barcode}
{line_vatrate}
{line_localtax1_rate}
{line_localtax2_rate}
{line_up}
{line_up_locale}
{line_qty}
{line_discount_percent}
{line_price_ht}
{line_price_ht_locale}
{line_price_vat}
{line_price_vat_locale}
{line_price_ttc}
{line_price_ttc_locale}
{line_date_start}
{line_date_start_locale}
{line_date_start_rfc}
{line_date_end}
{line_date_end_locale}
{line_date_end_rfc}
{line_unit} : Needs PRODUCT_USE_UNITS to 1
{line_unit_short} : Needs PRODUCT_USE_UNITS to 1

{line_fulldesc} : contains both line_desc and line_product_ref and line_product_label

Multicurrency :
{line_multicurrency_code}
{line_multicurrency_subprice}
{line_multicurrency_total_ht}
{line_multicurrency_total_tva}
{line_multicurrency_total_ttc}
{line_multicurrency_subprice_locale}
{line_multicurrency_total_ht_locale}
{line_multicurrency_total_tva_locale}
{line_multicurrency_total_ttc_locale}

Specific to Shipments :
{line_qty_shipped}
{line_qty_asked}
{line_weight}
{line_length}
{line_surface}
{line_volume}

Extra fields:
{line_options_xxx} : Value of extra field (where xxx is code of extra field)
{line_product_options_xxx} : If the line is a product, Value of the Product extra filed (where xxx is code of Product extra field)

This an example of what you may have in your office suite: Line for document generation.png

Other personalized tags

If you want to add a field that is not predefined, this is the solution:

  • Add a file into htdocs/includes/modules/substitutions/functions_mymodule.lib.php
  • Inside this file, just write one function like this:
/** 		Function called to complete substitution array (before generating on ODT, or a personalized email)
 * 		functions xxx_completesubstitutionarray are called by make_substitutions() if file
 * 		is inside directory htdocs/includes/modules/substitutions
 * 
 *		@param	array		$substitutionarray	Array with substitution key=>val
 *		@param	Translate	$langs			Output langs
 *		@param	Object		$object			Object to use to get values
 * 		@return	void					The entry parameter $substitutionarray is modified
 */
function mymodule_completesubstitutionarray(&$substitutionarray,$langs,$object)
{
   global $conf,$db;

   $myvalue='Put here calculated value to insert';
   $substitutionarray['myowntag']=$myvalue;
}

Function will be called before generating document to complete the array used for substitution and to replace tag myowntag with value $myvalue. You can add as many tags as you need and put all personalized code you want to define values (search into database, into files, calculation, from received parameters or from global variables)...

Warning: First parameter in function parameter declaration must start with & as valu is modified by your code and must be returned modified.

Note: With 3.2 and higher, if you have build your own module (See page Module development), you can put the substitution file inside a subdirectory of this module called htdocs/mymodule/core/substitutions. Moreover, function will be called only if module mymodule contains an entry $this->module_parts = array('substitutions' => 1) and module has been activated.

Store your document

To have your document to appear in list of available documents, put it into correct subdirectory found into directory documents/doctemplates