32 require
'../../main.inc.php';
33 require_once DOL_DOCUMENT_ROOT.
'/product/class/html.formproduct.class.php';
34 require_once DOL_DOCUMENT_ROOT.
'/core/lib/product.lib.php';
35 require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
36 require_once DOL_DOCUMENT_ROOT.
'/categories/class/categorie.class.php';
39 $langs->loadLangs(array(
'bills',
'products',
'stocks'));
43 $action =
GETPOST(
'action',
'aZ09');
44 $confirm =
GETPOST(
'confirm',
'alpha');
45 $cancel =
GETPOST(
'cancel',
'alpha');
50 if (!empty($user->socid)) {
51 $socid = $user->socid;
53 $fieldvalue = (!empty($id) ? $id : (!empty($ref) ? $ref :
''));
54 $fieldtype = (!empty($ref) ?
'ref' :
'rowid');
57 $hookmanager->initHooks(array(
'productcompositioncard',
'globalcard'));
61 if ($id > 0 || !empty($ref)) {
62 $result = $object->fetch($id, $ref);
63 $objectid = $object->id;
67 $result =
restrictedArea($user,
'produit|service', $fieldvalue,
'product&product',
'',
'', $fieldtype);
69 if ($object->id > 0) {
70 if ($object->type == $object::TYPE_PRODUCT) {
71 restrictedArea($user,
'produit', $object->id,
'product&product',
'',
'');
73 if ($object->type == $object::TYPE_SERVICE) {
74 restrictedArea($user,
'service', $object->id,
'product&product',
'',
'');
77 restrictedArea($user,
'produit|service', $fieldvalue,
'product&product',
'',
'', $fieldtype);
92 $reshook = $hookmanager->executeHooks(
'doActions', [], $object, $action);
97 if (empty($reshook)) {
99 if ($action ==
'add_prod' && ($user->hasRight(
'produit',
'creer') || $user->hasRight(
'service',
'creer'))) {
101 $maxprod =
GETPOST(
"max_prod",
'int');
103 for ($i = 0; $i < $maxprod; $i++) {
106 if ($object->add_sousproduit($id,
GETPOST(
"prod_id_" . $i,
'int'), $qty,
GETPOST(
"prod_incdec_" . $i,
'int')) > 0) {
112 if ($object->error ==
"isFatherOfThis") {
113 setEventMessages($langs->trans(
"ErrorAssociationIsFatherOfThis"),
null,
'errors');
119 if ($object->del_sousproduit($id,
GETPOST(
"prod_id_" . $i,
'int')) > 0) {
130 header(
"Location: " . $_SERVER[
"PHP_SELF"] .
'?id=' . $object->id);
133 } elseif ($action ===
'save_composed_product') {
134 $TProduct =
GETPOST(
'TProduct',
'array');
135 if (!empty($TProduct)) {
136 foreach ($TProduct as $id_product => $row) {
137 if ($row[
'qty'] > 0) {
138 $object->update_sousproduit($id, $id_product, $row[
'qty'], isset($row[
'incdec']) ? 1 : 0);
140 $object->del_sousproduit($id, $id_product);
146 header(
"Location: " . $_SERVER[
"PHP_SELF"] .
'?id=' . $object->id);
158 $productstatic =
new Product($db);
161 if ($action ==
'search') {
162 $current_lang = $langs->getDefaultLang();
164 $sql =
'SELECT DISTINCT p.rowid, p.ref, p.label, p.fk_product_type as type, p.barcode, p.price, p.price_ttc, p.price_base_type, p.entity,';
165 $sql .=
' p.fk_product_type, p.tms as datem, p.tobatch';
166 $sql .=
', p.tosell as status, p.tobuy as status_buy';
168 $sql .=
', pl.label as labelm, pl.description as descriptionm';
172 $reshook = $hookmanager->executeHooks(
'printFieldListSelect',
$parameters, $object);
173 $sql .= $hookmanager->resPrint;
175 $sql .=
' FROM '.MAIN_DB_PREFIX.
'product as p';
176 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'categorie_product as cp ON p.rowid = cp.fk_product';
178 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"product_lang as pl ON pl.fk_product = p.rowid AND lang='".($current_lang).
"'";
180 $sql .=
' WHERE p.entity IN ('.getEntity(
'product').
')';
183 $reshook = $hookmanager->executeHooks(
'printFieldListWhere',
$parameters, $object);
184 $sql .= $hookmanager->resPrint;
188 $params = array(
'p.ref',
'p.label',
'p.description',
'p.note');
191 $params[] =
'pl.label';
192 $params[] =
'pl.description';
193 $params[] =
'pl.note';
196 $params[] =
'p.barcode';
200 if (
isModEnabled(
'categorie') && !empty($parent) && $parent != -1) {
201 $sql .=
" AND cp.fk_categorie ='".$db->escape($parent).
"'";
203 $sql .=
" ORDER BY p.ref ASC";
205 $resql = $db->query(
$sql);
208 $title = $langs->trans(
'ProductServiceCard');
210 $shortlabel =
dol_trunc($object->label, 16);
212 $title = $langs->trans(
'Product').
" ".$shortlabel.
" - ".$langs->trans(
'AssociatedProducts');
213 $help_url =
'EN:Module_Products|FR:Module_Produits|ES:Módulo_Productos|DE:Modul_Produkte';
216 $title = $langs->trans(
'Service').
" ".$shortlabel.
" - ".$langs->trans(
'AssociatedProducts');
217 $help_url =
'EN:Module_Services_En|FR:Module_Services|ES:Módulo_Servicios|DE:Modul_Leistungen';
224 $titre = $langs->trans(
"CardProduct".$object->type);
230 if ($id > 0 || !empty($ref)) {
234 if ($user->rights->produit->lire || $user->hasRight(
'service',
'lire')) {
235 $linkback =
'<a href="'.DOL_URL_ROOT.
'/product/list.php?restore_lastsearch_values=1">'.$langs->trans(
"BackToList").
'</a>';
238 if ($user->socid && !in_array(
'product', explode(
',', $conf->global->MAIN_MODULES_FOR_EXTERNAL))) {
244 if ($object->type !=
Product::TYPE_SERVICE || !empty($conf->global->STOCK_SUPPORTS_SERVICES) || empty($conf->global->PRODUIT_MULTIPRICES)) {
245 print
'<div class="fichecenter">';
246 print
'<div class="fichehalfleft">';
247 print
'<div class="underbanner clearboth"></div>';
249 print
'<table class="border centpercent tableforfield">';
253 $typeformat =
'select;0:'.$langs->trans(
"Product").
',1:'.$langs->trans(
"Service");
254 print
'<tr><td class="titlefield">';
255 print (empty($conf->global->PRODUCT_DENY_CHANGE_PRODUCT_TYPE)) ?
$form->editfieldkey(
"Type",
'fk_product_type', $object->type, $object, $usercancreate, $typeformat) : $langs->trans(
'Type');
257 print
$form->editfieldval(
"Type",
'fk_product_type', $object->type, $object, $usercancreate, $typeformat);
263 print
'</div><div class="fichehalfright">';
264 print
'<div class="underbanner clearboth"></div>';
266 print
'<table class="border centpercent tableforfield">';
270 if (empty($conf->global->PRODUCT_DISABLE_NATURE)) {
271 print
'<tr><td>'.$form->textwithpicto($langs->trans(
"NatureOfProductShort"), $langs->trans(
"NatureOfProductDesc")).
'</td><td>';
272 print $object->getLibFinished();
278 if (empty($conf->global->PRODUIT_MULTIPRICES)) {
280 print
'<tr><td class="titlefield">'.$langs->trans(
"SellingPrice").
'</td><td>';
281 if ($object->price_base_type ==
'TTC') {
282 print
price($object->price_ttc).
' '.$langs->trans($object->price_base_type);
284 print
price($object->price).
' '.$langs->trans($object->price_base_type ? $object->price_base_type :
'HT');
289 print
'<tr><td>'.$langs->trans(
"MinPrice").
'</td><td>';
290 if ($object->price_base_type ==
'TTC') {
291 print
price($object->price_min_ttc).
' '.$langs->trans($object->price_base_type);
293 print
price($object->price_min).
' '.$langs->trans($object->price_base_type ? $object->price_base_type :
'HT');
308 $prodsfather = $object->getFather();
309 $object->get_sousproduits_arbo();
310 $parent_label = $object->label;
311 $prods_arbo = $object->get_arbo_each_prod();
314 if (!empty($conf->use_javascript_ajax)) {
315 $nboflines = $prods_arbo;
316 $table_element_line=
'product_association';
318 include DOL_DOCUMENT_ROOT .
'/core/tpl/ajaxrow.tpl.php';
322 $nbofsubsubproducts = count($prods_arbo);
323 $prodschild = $object->getChildsArbo($id, 1);
324 $nbofsubproducts = count($prodschild);
327 print
'<div class="fichecenter">';
331 print
'<table class="liste">';
332 print
'<tr class="liste_titre">';
333 print
'<td>'.$langs->trans(
'ParentProducts').
'</td>';
334 print
'<td>'.$langs->trans(
'Label').
'</td>';
335 print
'<td class="right">'.$langs->trans(
'Qty').
'</td>';
337 if (count($prodsfather) > 0) {
338 foreach ($prodsfather as $value) {
339 $idprod = $value[
"id"];
340 $productstatic->id = $idprod;
341 $productstatic->type = $value[
"fk_product_type"];
342 $productstatic->ref = $value[
'ref'];
343 $productstatic->label = $value[
'label'];
344 $productstatic->entity = $value[
'entity'];
345 $productstatic->status = $value[
'status'];
346 $productstatic->status_buy = $value[
'status_buy'];
348 print
'<tr class="oddeven">';
349 print
'<td>'.$productstatic->getNomUrl(1,
'composition').
'</td>';
350 print
'<td>'.dol_escape_htmltag($productstatic->label).
'</td>';
351 print
'<td class="right">'.dol_escape_htmltag($value[
'qty']).
'</td>';
355 print
'<tr class="oddeven">';
356 print
'<td colspan="3"><span class="opacitymedium">'.$langs->trans(
"None").
'</span></td>';
365 print
'<div class="fichecenter">';
367 $atleastonenotdefined = 0;
370 print
'<form name="formComposedProduct" action="'.$_SERVER[
'PHP_SELF'].
'" method="post">';
371 print
'<input type="hidden" name="token" value="'.newToken().
'" />';
372 print
'<input type="hidden" name="action" value="save_composed_product" />';
373 print
'<input type="hidden" name="id" value="'.$id.
'" />';
375 print
'<table id="tablelines" class="ui-sortable liste nobottom">';
377 print
'<tr class="liste_titre nodrag nodrop">';
379 print
'<td>'.$langs->trans(
'Position').
'</td>';
381 print
'<td>'.$langs->trans(
'ComposedProduct').
'</td>';
383 print
'<td>'.$langs->trans(
'Label').
'</td>';
385 print
'<td class="right" colspan="2">'.$langs->trans(
'MinSupplierPrice').
'</td>';
387 print
'<td class="right" colspan="2">'.$langs->trans(
'MinCustomerPrice').
'</td>';
390 print
'<td class="right">'.$langs->trans(
'Stock').
'</td>';
393 print
'<td class="right">'.$langs->trans(
'Qty').
'</td>';
395 print
'<td class="center">'.$langs->trans(
'ComposedProductIncDecStock').
'</td>';
397 print
'<td class="linecolmove" style="width: 10px"></td>';
402 if (count($prods_arbo)) {
403 foreach ($prods_arbo as $value) {
404 $productstatic->fetch($value[
'id']);
406 if ($value[
'level'] <= 1) {
407 print
'<tr id="'.$object->sousprods[$parent_label][$value[
'id']][6].
'" class="drag drop oddeven level1">';
410 print
'<td>'.$object->sousprods[$parent_label][$value[
'id']][7].
'</td>';
413 $nb_of_subproduct = $value[
'nb'];
416 print
'<td>'.$productstatic->getNomUrl(1,
'composition').
'</td>';
419 print
'<td title="'.dol_escape_htmltag($productstatic->label).
'" class="tdoverflowmax150">'.
dol_escape_htmltag($productstatic->label).
'</td>';
422 print
'<td class="right">';
423 if ($product_fourn->find_min_price_product_fournisseur($productstatic->id) > 0) {
424 print $langs->trans(
"BuyingPriceMinShort").
': ';
425 if ($product_fourn->product_fourn_price_id > 0) {
426 print $product_fourn->display_price_product_fournisseur(0, 0);
428 print $langs->trans(
"NotDefined"); $notdefined++; $atleastonenotdefined++;
434 $fourn_unitprice = (!empty($product_fourn->fourn_unitprice) ? $product_fourn->fourn_unitprice : 0);
435 $fourn_remise_percent = (!empty($product_fourn->fourn_remise_percent) ? $product_fourn->fourn_remise_percent : 0);
436 $fourn_remise = (!empty($product_fourn->fourn_remise) ? $product_fourn->fourn_remise : 0);
438 $unitline =
price2num(($fourn_unitprice * (1 - ($fourn_remise_percent / 100)) - $fourn_remise),
'MU');
439 $totalline =
price2num($value[
'nb'] * ($fourn_unitprice * (1 - ($fourn_remise_percent / 100)) - $fourn_remise),
'MT');
440 $total += $totalline;
442 print
'<td class="right nowraponall">';
443 print ($notdefined ?
'' : ($value[
'nb'] > 1 ? $value[
'nb'].
'x ' :
'').
'<span class="amount">'.
price($unitline,
'',
'', 0, 0, -1, $conf->currency)).
'</span>';
447 $pricesell = $productstatic->price;
448 if (!empty($conf->global->PRODUIT_MULTIPRICES)) {
449 $pricesell =
'Variable';
451 $totallinesell =
price2num($value[
'nb'] * ($pricesell),
'MT');
452 $totalsell += $totallinesell;
454 print
'<td class="right" colspan="2">';
455 print ($notdefined ?
'' : ($value[
'nb'] > 1 ? $value[
'nb'].
'x ' :
''));
456 if (is_numeric($pricesell)) {
457 print
'<span class="amount">'.price($pricesell,
'',
'', 0, 0, -1, $conf->currency).
'</span>';
459 print
'<span class="opacitymedium">'.$langs->trans($pricesell).
'</span>';
465 print
'<td class="right">'.$value[
'stock'].
'</td>';
469 if ($user->hasRight(
'produit',
'creer') || $user->hasRight(
'service',
'creer')) {
470 print
'<td class="center"><input type="text" value="'.$nb_of_subproduct.
'" name="TProduct['.$productstatic->id.
'][qty]" class="right width40" /></td>';
471 print
'<td class="center"><input type="checkbox" name="TProduct['.$productstatic->id.
'][incdec]" value="1" '.($value[
'incdec'] == 1 ?
'checked' :
'').
' /></td>';
473 print
'<td>'.$nb_of_subproduct.
'</td>';
474 print
'<td>'.($value[
'incdec'] == 1 ?
'x' :
'').
'</td>';
478 print
'<td class="linecolmove tdlineupdown center"></td>';
483 if (empty($conf->global->PRODUCT_SHOW_SUB_SUB_PRODUCTS)) {
484 $hide =
' hideobject';
487 print
'<tr class="oddeven'.$hide.
'" id="sub-'.$value[
'id_parent'].
'" data-ignoreidfordnd=1>';
490 $productstatic->ref = $value[
'ref'];
497 for ($i = 0; $i < $value[
'level']; $i++) {
498 print
' ';
500 print $productstatic->getNomUrl(1,
'composition');
504 print
'<td>'.dol_escape_htmltag($productstatic->label).
'</td>';
507 print
'<td> </td>';
508 print
'<td> </td>';
510 print
'<td> </td>';
511 print
'<td> </td>';
519 print
'<td class="right">'.dol_escape_htmltag($value[
'nb']).
'</td>';
522 print
'<td> </td>';
525 print
'<td> </td>';
534 print
'<tr class="liste_total">';
540 print
'<td class="liste_total"></td>';
543 print
'<td class="liste_total"></td>';
546 print
'<td class="liste_total right">';
547 print $langs->trans(
"TotalBuyingPriceMinShort");
550 print
'<td class="liste_total right">';
551 if ($atleastonenotdefined) {
552 print $langs->trans(
"Unknown").
' ('.$langs->trans(
"SomeSubProductHaveNoPrices").
')';
554 print ($atleastonenotdefined ?
'' :
price($total,
'',
'', 0, 0, -1, $conf->currency));
558 print
'<td class="liste_total right">';
559 print $langs->trans(
"TotalSellingPriceMinShort");
562 print
'<td class="liste_total right">';
563 if ($atleastonenotdefined) {
564 print $langs->trans(
"Unknown").
' ('.$langs->trans(
"SomeSubProductHaveNoPrices").
')';
566 print ($atleastonenotdefined ?
'' :
price($totalsell,
'',
'', 0, 0, -1, $conf->currency));
571 print
'<td class="liste_total right"> </td>';
576 print
'<td class="center">';
577 if ($user->hasRight(
'produit',
'creer') || $user->hasRight(
'service',
'creer')) {
578 print
'<input type="submit" class="button button-save" value="'.$langs->trans(
"Save").
'">';
591 print
'<tr class="oddeven">';
592 print
'<td colspan="'.$colspan.
'"><span class="opacitymedium">'.$langs->trans(
"None").
'</span></td>';
608 if ((empty($action) || $action ==
'view' || $action ==
'edit' || $action ==
'search' || $action ==
're-edit') && ($user->hasRight(
'produit',
'creer') || $user->hasRight(
'service',
'creer'))) {
617 print
'<form action="'.DOL_URL_ROOT.
'/product/composition/card.php?id='.$id.
'" method="POST">';
618 print
'<input type="hidden" name="action" value="search">';
619 print
'<input type="hidden" name="id" value="'.$id.
'">';
620 print
'<div class="inline-block">';
621 print
'<input type="hidden" name="token" value="'.newToken().
'">';
622 print $langs->trans(
"KeywordFilter").
': ';
623 print
'<input type="text" name="key" value="'.$key.
'"> ';
626 require_once DOL_DOCUMENT_ROOT.
'/categories/class/categorie.class.php';
627 print
'<div class="inline-block">'.$langs->trans(
"CategoryFilter").
': ';
628 print
$form->select_all_categories(Categorie::TYPE_PRODUCT, $parent,
'parent').
' </div>';
631 print
'<div class="inline-block">';
632 print
'<input type="submit" class="button small" value="'.$langs->trans(
"Search").
'">';
639 if ($action ==
'search') {
641 print
'<form action="'.DOL_URL_ROOT.
'/product/composition/card.php?id='.$id.
'" method="post">';
642 print
'<input type="hidden" name="token" value="'.newToken().
'">';
643 print
'<input type="hidden" name="action" value="add_prod">';
644 print
'<input type="hidden" name="id" value="'.$id.
'">';
646 print
'<table class="noborder centpercent">';
647 print
'<tr class="liste_titre">';
648 print
'<th class="liste_titre">'.$langs->trans(
"ComposedProduct").
'</td>';
649 print
'<th class="liste_titre">'.$langs->trans(
"Label").
'</td>';
651 print
'<th class="liste_titre right">'.$langs->trans(
"Qty").
'</td>';
652 print
'<th class="center">'.$langs->trans(
'ComposedProductIncDecStock').
'</th>';
655 $num = $db->num_rows($resql);
659 print
'<tr><td colspan="4">'.$langs->trans(
"NoMatchFound").
'</td></tr>';
664 while ($i < min($num, $MAX)) {
665 $objp = $db->fetch_object($resql);
666 if ($objp->rowid != $id) {
669 $prod_arbo->id = $objp->rowid;
673 $prod_arbo->get_sousproduits_arbo();
675 $prods_arbo = $prod_arbo->get_arbo_each_prod();
676 if (count($prods_arbo) > 0) {
677 foreach ($prods_arbo as $key => $value) {
678 if ($value[1] == $id) {
690 print
'<tr class="oddeven">';
692 $productstatic->id = $objp->rowid;
693 $productstatic->ref = $objp->ref;
694 $productstatic->label = $objp->label;
695 $productstatic->type = $objp->type;
696 $productstatic->entity = $objp->entity;
697 $productstatic->status = $objp->status;
698 $productstatic->status_buy = $objp->status_buy;
699 $productstatic->status_batch = $objp->tobatch;
701 print
'<td>'.$productstatic->getNomUrl(1,
'', 24).
'</td>';
702 $labeltoshow = $objp->label;
704 $labeltoshow = $objp->labelm;
707 print
'<td>'.$labeltoshow.
'</td>';
710 if ($object->is_sousproduit($id, $objp->rowid)) {
712 $qty = $object->is_sousproduit_qty;
713 $incdec = $object->is_sousproduit_incdec;
723 print
'<td class="right"><input type="hidden" name="prod_id_'.$i.
'" value="'.$objp->rowid.
'"><input type="text" size="2" name="prod_qty_'.$i.
'" value="'.($qty ? $qty :
'').
'"></td>';
726 print
'<td class="center">';
728 print
'<input type="checkbox" name="prod_incdec_'.$i.
'" value="1" '.($incdec ?
'checked' :
'').
'>';
731 print
'<input type="checkbox" name="prod_incdec_'.$i.
'" value="1" checked>';
741 print
'<tr class="oddeven">';
742 print
'<td><span class="opacitymedium">'.$langs->trans(
"More").
'...</span></td>';
752 print
'<input type="hidden" name="max_prod" value="'.$i.
'">';
755 print
'<div class="center">';
756 print
'<input type="submit" class="button button-save" name="save" value="'.$langs->trans(
"Add").
'/'.$langs->trans(
"Update").
'">';
757 print
'<input type="submit" class="button button-cancel" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
if(GETPOST('button_removefilter_x', 'alpha')||GETPOST('button_removefilter.x', 'alpha')||GETPOST('button_removefilter', 'alpha')) if(GETPOST('button_search_x', 'alpha')||GETPOST('button_search.x', 'alpha')||GETPOST('button_search', 'alpha')) if($action=="save" &&empty($cancel)) $help_url
View.
ajax_combobox($htmlname, $events=array(), $minLengthToAutocomplete=0, $forcefocus=0, $widthTypeOfAutocomplete='resolve', $idforemptyvalue='-1', $morecss='')
Convert a html select field into an ajax combobox.
if(!defined('NOREQUIRESOC')) if(!defined('NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined('NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined('NOREQUIREAJAX')) llxHeader()
Empty header.
Class to manage predefined suppliers products.
Class to manage products or services.
const TYPE_PRODUCT
Regular product.
const TYPE_STOCKKIT
Advanced feature: stock kit.
const TYPE_SERVICE
Service.
const TYPE_ASSEMBLYKIT
Advanced feature: assembly kit.
if(isModEnabled('facture') && $user->hasRight('facture', 'lire')) if((isModEnabled('fournisseur') &&empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD) && $user->hasRight("fournisseur", "facture", "lire"))||(isModEnabled('supplier_invoice') && $user->hasRight("supplier_invoice", "lire"))) if(isModEnabled('don') && $user->hasRight('don', 'lire')) if(isModEnabled('tax') &&!empty($user->rights->tax->charges->lire)) if(isModEnabled('facture') &&isModEnabled('commande') && $user->hasRight("commande", "lire") &&empty($conf->global->WORKFLOW_DISABLE_CREATE_INVOICE_FROM_ORDER)) $sql
Social contributions to pay.
if($cancel &&! $id) if($action=='add' &&! $cancel) if($action=='delete') if($id) $form
Actions.
dol_banner_tab($object, $paramid, $morehtml='', $shownav=1, $fieldid='rowid', $fieldref='ref', $morehtmlref='', $moreparam='', $nodbprefix=0, $morehtmlleft='', $morehtmlstatus='', $onlybanner=0, $morehtmlright='')
Show tab footer of a card.
load_fiche_titre($titre, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0)
Show tabs of a record.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dol_print_error($db='', $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dol_get_fiche_end($notab=0)
Return tab footer of a card.
natural_search($fields, $value, $mode=0, $nofirstand=0)
Generate natural SQL search string for a criteria (this criteria can be tested on one or several fiel...
price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code='')
Function to format a value into an amount for visual output Function used into PDF and HTML pages.
getDolGlobalInt($key, $default=0)
Return dolibarr global constant int value.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
dol_trunc($string, $size=40, $trunc='right', $stringencoding='UTF-8', $nodot=0, $display=0)
Truncate a string to a particular length adding '…' if string larger than length.
isModEnabled($module)
Is Dolibarr module enabled.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
product_prepare_head($object)
Prepare array with list of tabs.
restrictedArea(User $user, $features, $object=0, $tableandshare='', $feature2='', $dbt_keyfield='fk_soc', $dbt_select='rowid', $isdraft=0, $mode=0)
Check permissions of a user to show a page and an object.