40require
"../main.inc.php";
51require_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
52require_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
53require_once DOL_DOCUMENT_ROOT.
'/core/lib/contract.lib.php';
54require_once DOL_DOCUMENT_ROOT.
'/contrat/class/contrat.class.php';
55require_once DOL_DOCUMENT_ROOT.
'/core/modules/contract/modules_contract.php';
56require_once DOL_DOCUMENT_ROOT.
'/core/class/doleditor.class.php';
57require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formfile.class.php';
58require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
59require_once DOL_DOCUMENT_ROOT.
'/compta/facture/class/facture.class.php';
60require_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.facture.class.php';
62 require_once DOL_DOCUMENT_ROOT.
'/comm/propal/class/propal.class.php';
65 require_once DOL_DOCUMENT_ROOT.
'/projet/class/project.class.php';
66 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formprojet.class.php';
70$langs->loadLangs(array(
"contracts",
"orders",
"companies",
"bills",
"products",
'compta',
'propal'));
72$action =
GETPOST(
'action',
'aZ09');
73$confirm =
GETPOST(
'confirm',
'alpha');
74$cancel =
GETPOST(
'cancel',
'alpha');
75$backtopage =
GETPOST(
'backtopage',
'alpha');
76$backtopageforcancel =
GETPOST(
'backtopageforcancel',
'alpha');
81$origin =
GETPOST(
'origin',
'alpha');
84$attribute =
GETPOST(
'attribute',
'aZ09');
100 $socid = $user->socid;
104$hookmanager->initHooks(array(
'contractcard',
'globalcard'));
113if ($id > 0 || !empty($ref) && $action !=
'add') {
114 $ret =
$object->fetch($id, $ref);
116 $ret =
$object->fetch_thirdparty();
119 dol_print_error(
null,
$object->error);
124$extrafields->fetch_name_optionals_label(
$object->table_element);
127$extralabelslines = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
129$permissionnote = $user->hasRight(
'contrat',
'creer');
130$permissiondellink = $user->hasRight(
'contrat',
'creer');
131$permissiontodelete = ($user->hasRight(
'contrat',
'creer') &&
$object->status == $object::STATUS_DRAFT) || $user->hasRight(
'contrat',
'supprimer');
132$permissiontoadd = $user->hasRight(
'contrat',
'creer');
133$permissiontoedit = $permissiontoadd;
134$permissiontoactivate = $user->hasRight(
'contrat',
'activer');
135$permissiontodisable = $user->hasRight(
'contrat',
'desactiver');
136$permissiontoeditextra = $permissiontoadd;
137if (
GETPOST(
'attribute',
'aZ09') && isset($extrafields->attributes[
$object->table_element][
'perms'][
GETPOST(
'attribute',
'aZ09')])) {
139 $permissiontoeditextra =
dol_eval((
string) $extrafields->attributes[
$object->table_element][
'perms'][
GETPOST(
'attribute',
'aZ09')]);
147if (!(
$object->id > 0) && ($action ==
'view' || $action ==
'')) {
156$parameters = array(
'socid' => $socid);
157$reshook = $hookmanager->executeHooks(
'doActions', $parameters, $object, $action);
159 setEventMessages($hookmanager->error, $hookmanager->errors,
'errors');
161if (empty($reshook)) {
162 $backurlforlist =
dolBuildUrl(DOL_URL_ROOT .
'/contrat/list.php');
164 if (empty($backtopage) || ($cancel && empty($id))) {
165 if (empty($backtopage) || ($cancel && strpos($backtopage,
'__ID__'))) {
166 if (empty($id) && (($action !=
'add' && $action !=
'create') || $cancel)) {
167 $backtopage = $backurlforlist;
169 $backtopage =
dolBuildUrl(DOL_URL_ROOT .
'/contrat/card.php', [
'id'=> ((!empty($id) && $id > 0) ? $id :
'__ID__')]);
175 if (!empty($backtopageforcancel)) {
176 header(
"Location: ".$backtopageforcancel);
178 } elseif (!empty($backtopage)) {
179 header(
"Location: ".$backtopage);
185 include DOL_DOCUMENT_ROOT.
'/core/actions_setnotes.inc.php';
187 include DOL_DOCUMENT_ROOT.
'/core/actions_dellink.inc.php';
189 include DOL_DOCUMENT_ROOT.
'/core/actions_lineupdown.inc.php';
191 if ($action ==
'confirm_active' && $confirm ==
'yes' && $permissiontoactivate) {
204 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
209 } elseif ($action ==
'confirm_sign' && $confirm ==
'yes' && $user->hasRight(
'contract',
'creer')) {
210 $result =
$object->setSignedStatus($user,
GETPOSTINT(
'signed_status'), 0,
'CONTRACT_MODIFY');
212 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id);
217 } elseif ($action ==
'confirm_unsign' && $confirm ==
'yes' && $user->hasRight(
'contract',
'creer')) {
218 $result =
$object->setSignedStatus($user, Contrat::$SIGNED_STATUSES[
'STATUS_NO_SIGNATURE'], 0,
'CONTRACT_MODIFY');
220 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id);
225 } elseif ($action ==
'confirm_closeline' && $confirm ==
'yes' && $permissiontodisable) {
232 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"DateEnd")),
null,
'errors');
237 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
245 if (
GETPOST(
'mode') ==
'predefined') {
257 $date_start_update =
'';
258 $date_end_update =
'';
259 $date_start_real_update =
'';
260 $date_end_real_update =
'';
261 if (
GETPOST(
'date_start_updatemonth') &&
GETPOST(
'date_start_updateday') &&
GETPOST(
'date_start_updateyear')) {
264 if (
GETPOST(
'date_end_updatemonth') &&
GETPOST(
'date_end_updateday') &&
GETPOST(
'date_end_updateyear')) {
267 if (
GETPOST(
'date_start_real_updatemonth') &&
GETPOST(
'date_start_real_updateday') &&
GETPOST(
'date_start_real_updateyear')) {
270 if (
GETPOST(
'date_end_real_updatemonth') &&
GETPOST(
'date_end_real_updateday') &&
GETPOST(
'date_end_real_updateyear')) {
278 if ($action ==
'add' && $user->hasRight(
'contrat',
'creer')) {
280 if (empty($datecontrat)) {
282 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Date")),
null,
'errors');
287 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"ThirdParty")),
null,
'errors');
293 $ret = $extrafields->setOptionalsFromPost(
null, $object);
301 $object->date_contrat = $datecontrat;
316 if (!empty($origin) && !empty($originid)) {
318 $object->origin_id = $originid;
323 $object->linked_objects = array_merge(
$object->linked_objects,
GETPOST(
'other_linked_objects',
'array:int'));
331 $srcobject = fetchObjectByElement(
$object->origin_id, $origin);
333 if (is_object($srcobject) && $srcobject->id > 0) {
334 '@phan-var-force Commande|Propal|Facture $srcobject';
335 $srcobject->fetch_thirdparty();
336 $lines = $srcobject->lines;
337 if (empty($lines) && method_exists($srcobject,
'fetch_lines')) {
338 $srcobject->fetch_lines();
339 $lines = $srcobject->lines;
343 $num = count($lines);
346 for ($i = 0; $i < $num; $i++) {
347 $product_type = ($lines[$i]->product_type ? $lines[$i]->product_type : 0);
349 if ($product_type == 1 || (
getDolGlobalString(
'CONTRACT_SUPPORT_PRODUCTS') && in_array($product_type, array(0, 1)))) {
351 if ($lines[$i]->fk_product > 0) {
355 $prod->id = $lines[$i]->fk_product;
356 $prod->getMultiLangs();
358 $outputlangs = $langs;
360 if (
GETPOST(
'lang_id',
'aZ09')) {
361 $newlang =
GETPOST(
'lang_id',
'aZ09');
363 if (empty($newlang)) {
364 $newlang = $srcobject->thirdparty->default_lang;
366 if (!empty($newlang)) {
368 $outputlangs->setDefaultLang($newlang);
371 $label = (!empty(
$prod->multilangs[$outputlangs->defaultlang][
"libelle"])) ?
$prod->multilangs[$outputlangs->defaultlang][
"libelle"] : $lines[$i]->product_label;
373 $label = $lines[$i]->product_label;
375 $desc = ($lines[$i]->desc && $lines[$i]->desc != $lines[$i]->label) ?
dol_htmlentitiesbr($lines[$i]->desc) :
'';
381 $array_options = array();
383 if (method_exists($lines[$i],
'fetch_optionals')) {
384 $lines[$i]->fetch_optionals();
385 $array_options = $lines[$i]->array_options;
388 $txtva = $lines[$i]->vat_src_code ? $lines[$i]->tva_tx.
' ('.$lines[$i]->vat_src_code.
')' : $lines[$i]->tva_tx;
396 $line_price_base_type = $lines[$i]->getPriceBaseType();
399 $lines[$i]->subprice,
404 $lines[$i]->fk_product,
405 $lines[$i]->remise_percent,
406 $lines[$i]->date_start,
407 $lines[$i]->date_end,
408 $line_price_base_type,
409 (
float) $lines[$i]->subprice_ttc,
410 $lines[$i]->info_bits,
411 $lines[$i]->fk_fournprice,
414 (
int) $lines[$i]->fk_unit,
425 if (is_object($srcobject) && !empty($srcobject->error)) {
426 $srcobjecterror = $srcobject->error;
428 $langs->load(
"errors");
429 $srcobjecterror = $langs->trans(
"ErrorRecordNotFound");
431 setEventMessages($srcobjecterror, (is_object($srcobject) ? $srcobject->errors : null),
'errors');
436 $parameters = array(
'objFrom' => (is_object($srcobject) ? $srcobject : null));
437 $reshook = $hookmanager->executeHooks(
'createFrom', $parameters, $object, $action);
440 setEventMessages($hookmanager->error, $hookmanager->errors,
'errors');
451 $result =
$object->create($user);
453 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
461 } elseif ($action ==
'classin' && $user->hasRight(
'contrat',
'creer')) {
463 } elseif ($action ==
'addline' && $user->hasRight(
'contrat',
'creer')) {
470 $price_ht_devise =
'';
472 $price_ttc_devise =
'';
474 $rang = count(
$object->lines) + 1;
476 if (
GETPOST(
'price_ht') !==
'') {
479 if (
GETPOST(
'multicurrency_price_ht') !==
'') {
482 if (
GETPOST(
'price_ttc') !==
'') {
485 if (
GETPOST(
'multicurrency_price_ttc') !==
'') {
489 if (
GETPOST(
'prod_entry_mode',
'alpha') ==
'free') {
495 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"ProductOrService")),
null,
'errors');
500 $tva_tx =
GETPOST(
'tva_tx',
'alpha');
504 if (empty($remise_percent)) {
509 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Qty")),
null,
'errors');
512 if (
GETPOST(
'prod_entry_mode',
'alpha') ==
'free' && (empty($idprod) || $idprod < 0) && empty($line_desc)) {
513 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Description")),
null,
'errors');
520 setEventMessages($langs->trans(
"Error").
': '.$langs->trans(
"DateStartPlanned").
' > '.$langs->trans(
"DateEndPlanned"),
null,
'errors');
525 $extralabelsline = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
526 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line, $predef);
528 if (is_array($extralabelsline)) {
530 foreach ($extralabelsline as $key => $value) {
531 unset($_POST[
"options_".$key]);
540 $price_base_type =
'';
546 $prod->fetch($idprod);
555 $price_min =
$prod->price_min;
556 $price_min_ttc =
$prod->price_min_ttc;
560 $price_min =
$prod->multiprices_min[
$object->thirdparty->price_level];
561 $price_min_ttc =
$prod->multiprices_min_ttc[
$object->thirdparty->price_level];
564 require_once DOL_DOCUMENT_ROOT.
'/product/class/productcustomerprice.class.php';
568 $filter = array(
't.fk_product' => (
string)
$prod->id,
't.fk_soc' => (
string)
$object->thirdparty->id);
570 $result = $prodcustprice->fetchAll(
'',
'', 0, 0, $filter);
572 if (count($prodcustprice->lines) > 0) {
573 $date_now = (int) floor(
dol_now() / 86400) * 86400;
574 foreach ($prodcustprice->lines as $k => $custprice_line) {
575 if ($custprice_line->date_begin <= $date_now && (empty($custprice_line->date_end) || $date_now <= $custprice_line->date_end)) {
576 $price_min =
price($custprice_line->price_min);
577 $price_min_ttc =
price($custprice_line->price_min_ttc);
593 $tmpvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', $tva_tx));
594 $tmpprodvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', (
string)
$prod->tva_tx));
597 if (!empty($price_ht) || $price_ht ===
'0') {
599 $pu_ttc =
price2num((
float) $pu_ht * (1 + ((
float) $tmpvat / 100)),
'MU');
600 $price_base_type =
'HT';
601 } elseif (!empty($price_ttc) || $price_ttc ===
'0') {
603 $pu_ht =
price2num((
float) $pu_ttc / (1 + ((
float) $tmpvat / 100)),
'MU');
604 $price_base_type =
'TTC';
607 $desc =
$prod->description;
617 $fk_unit =
$prod->fk_unit;
621 $tva_npr = (preg_match(
'/\*/', $tva_tx) ? 1 : 0);
622 if (empty($tva_tx)) {
625 $tva_tx = str_replace(
'*',
'', $tva_tx);
628 $pu_ht_devise =
price2num($price_ht_devise,
'MU');
629 $pu_ttc_devise =
price2num($price_ttc_devise,
'MU');
631 $tmpvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', $tva_tx));
634 if (!empty($price_ht) || $price_ht ===
'0') {
636 $pu_ttc =
price2num((
float) $pu_ht * (1 + ((
float) $tmpvat / 100)),
'MU');
637 $price_base_type =
'HT';
638 } elseif (!empty($price_ttc) || $price_ttc ===
'0') {
640 $pu_ht =
price2num((
float) $pu_ttc / (1 + ((
float) $tmpvat / 100)),
'MU');
641 $price_base_type =
'TTC';
649 $fk_fournprice =
GETPOST(
'fournprice');
651 $pa_ht =
GETPOST(
'buying_price');
661 if (((
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && !$user->hasRight(
'produit',
'ignore_price_min_advance'))
663 $object->error = $langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, -1,
$conf->currency));
681 (
int) $fk_fournprice,
692 $outputlangs = $langs;
695 $newlang =
GETPOST(
'lang_id',
'aZ09');
698 $newlang =
$object->thirdparty->default_lang;
700 if (!empty($newlang)) {
702 $outputlangs->setDefaultLang($newlang);
707 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
710 unset($_POST[
'prod_entry_mode']);
712 unset($_POST[
'qty']);
713 unset($_POST[
'type']);
714 unset($_POST[
'remise_percent']);
715 unset($_POST[
'price_ht']);
716 unset($_POST[
'multicurrency_price_ht']);
717 unset($_POST[
'price_ttc']);
718 unset($_POST[
'tva_tx']);
719 unset($_POST[
'product_ref']);
720 unset($_POST[
'product_label']);
721 unset($_POST[
'product_desc']);
722 unset($_POST[
'fournprice']);
723 unset($_POST[
'buying_price']);
724 unset($_POST[
'np_marginRate']);
725 unset($_POST[
'np_markRate']);
726 unset($_POST[
'dp_desc']);
727 unset($_POST[
'idprod']);
729 unset($_POST[
'date_starthour']);
730 unset($_POST[
'date_startmin']);
731 unset($_POST[
'date_startsec']);
732 unset($_POST[
'date_startday']);
733 unset($_POST[
'date_startmonth']);
734 unset($_POST[
'date_startyear']);
735 unset($_POST[
'date_endhour']);
736 unset($_POST[
'date_endmin']);
737 unset($_POST[
'date_endsec']);
738 unset($_POST[
'date_endday']);
739 unset($_POST[
'date_endmonth']);
740 unset($_POST[
'date_endyear']);
745 } elseif ($action ==
'updateline' && $user->hasRight(
'contrat',
'creer') && !
GETPOST(
'cancel',
'alpha')) {
749 if (!empty($date_start_update) && !empty($date_end_update) && $date_start_update > $date_end_update) {
750 setEventMessages($langs->trans(
"Error").
': '.$langs->trans(
"DateStartPlanned").
' > '.$langs->trans(
"DateEndPlanned"),
null,
'errors');
751 $action =
'editline';
757 if ($objectline->fetch($idline) < 0) {
758 setEventMessages($objectline->error, $objectline->errors,
'errors');
761 $objectline->fetch_optionals();
763 $objectline->oldcopy =
dol_clone($objectline, 2);
771 if ($date_start_real_update ==
'') {
772 $date_start_real_update = $objectline->date_start_real;
774 if ($date_end_real_update ==
'') {
775 $date_end_real_update = $objectline->date_end_real;
778 $vat_rate =
GETPOST(
'eltva_tx',
'alpha');
781 if (preg_match(
'/\*/', $vat_rate)) {
786 $vat_rate = str_replace(
'*',
'', $vat_rate);
795 if (preg_match(
'/\((.*)\)/', $txtva, $reg)) {
796 $vat_src_code = $reg[1];
797 $txtva = preg_replace(
'/\s*\(.*\)/',
'', $txtva);
813 $objectline->fk_product =
GETPOSTINT(
'idprod');
814 $objectline->description =
GETPOST(
'product_desc',
'restricthtml');
818 if (isset($objectline->oldcopy) && (float) $objectline->subprice != (
float) $objectline->oldcopy->subprice) {
819 $objectline->subprice_ttc = 0;
822 $objectline->remise_percent = $remise_percent;
823 $objectline->tva_tx = ($txtva ? $txtva : 0);
824 $objectline->vat_src_code = $vat_src_code;
825 $objectline->localtax1_tx = is_numeric($localtax1_tx) ? $localtax1_tx : 0;
826 $objectline->localtax2_tx = is_numeric($localtax2_tx) ? $localtax2_tx : 0;
827 $objectline->date_start = $date_start_update;
828 $objectline->date_start_real = $date_start_real_update;
829 $objectline->date_end = $date_end_update;
830 $objectline->date_end_real = $date_end_real_update;
831 $objectline->user_closing_id = $user->id;
833 $objectline->pa_ht = $pa_ht;
839 $objectline->fk_unit =
null;
843 $extralabelsline = $extrafields->fetch_name_optionals_label($objectline->table_element);
844 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line, $predef);
846 if (is_array($array_options) && count($array_options) > 0) {
848 foreach ($array_options as $key => $value) {
849 $objectline->array_options[$key] = $array_options[$key];
855 $result = $objectline->update($user);
858 $action =
'editline';
859 $_GET[
'rowid'] =
GETPOST(
'elrowid');
860 setEventMessages($objectline->error, $objectline->errors,
'errors');
869 } elseif ($action ==
'confirm_deleteline' && $confirm ==
'yes' && $user->hasRight(
'contrat',
'creer')) {
873 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
878 } elseif ($action ==
'confirm_valid' && $confirm ==
'yes' && $user->hasRight(
'contrat',
'creer')) {
879 $result =
$object->validate($user);
884 $outputlangs = $langs;
887 $newlang =
GETPOST(
'lang_id',
'aZ09');
890 $newlang =
$object->thirdparty->default_lang;
892 if (!empty($newlang)) {
894 $outputlangs->setDefaultLang($newlang);
899 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
904 } elseif ($action ==
'reopen' && $user->hasRight(
'contrat',
'creer')) {
905 $result =
$object->reopen($user);
909 } elseif ($action ==
'confirm_close' && $confirm ==
'yes' && $permissiontodisable) {
911 $result =
$object->closeAll($user);
915 } elseif ($action ==
'confirm_activate' && $confirm ==
'yes' && $permissiontoactivate) {
918 $comment =
GETPOST(
'comment',
'alpha');
923 } elseif ($action ==
'confirm_delete' && $confirm ==
'yes' && $permissiontodelete) {
925 $result =
$object->delete($user);
927 header(
"Location: list.php?restore_lastsearch_values=1");
932 } elseif ($action ==
'confirm_move' && $confirm ==
'yes' && $permissiontoedit) {
935 $result = $contractline->fetch(
GETPOSTINT(
'lineid'));
936 $contractline->fk_contrat =
GETPOSTINT(
'newcid');
937 $result = $contractline->update($user, 1);
939 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$id);
945 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentities(
"RefNewContract")),
null,
'errors');
947 } elseif ($action ==
'update_extras' && $permissiontoeditextra) {
950 $attribute =
GETPOST(
'attribute',
'aZ09');
953 $ret = $extrafields->setOptionalsFromPost(
null, $object, $attribute);
955 setEventMessages($extrafields->error,
$object->errors,
'errors');
960 $result =
$object->updateExtraField($attribute,
'CONTRACT_MODIFY');
968 $action =
'edit_extras';
970 } elseif ($action ==
'setref_supplier' && $permissiontoadd) {
974 $result =
$object->setValueFrom(
'ref_supplier',
GETPOST(
'ref_supplier',
'alpha'),
'',
null,
'text',
'', $user,
'CONTRACT_MODIFY');
977 $action =
'editref_supplier';
979 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
983 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$id);
986 } elseif ($action ==
'setref_customer' && $permissiontoadd) {
990 $result =
$object->setValueFrom(
'ref_customer',
GETPOST(
'ref_customer',
'alpha'),
'',
null,
'text',
'', $user,
'CONTRACT_MODIFY');
993 $action =
'editref_customer';
995 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
999 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$id);
1002 } elseif ($action ==
'setref' && $permissiontoadd) {
1004 $result =
$object->fetch($id);
1011 $result =
$object->setValueFrom(
'ref',
GETPOST(
'ref',
'alpha'),
'',
null,
'text',
'', $user,
'CONTRACT_MODIFY');
1014 $action =
'editref';
1016 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
1023 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
1027 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$id);
1030 } elseif ($action ==
'setdate_contrat' && $permissiontoadd) {
1032 $result =
$object->fetch($id);
1037 $result =
$object->setValueFrom(
'date_contrat', $datacontrat,
'',
null,
'date',
'', $user,
'CONTRACT_MODIFY');
1040 $action =
'editdate_contrat';
1042 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
1046 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$id);
1052 include DOL_DOCUMENT_ROOT.
'/core/actions_printing.inc.php';
1056 include DOL_DOCUMENT_ROOT.
'/core/actions_builddoc.inc.php';
1059 $triggersendname =
'CONTRACT_SENTBYMAIL';
1061 $mode =
'emailfromcontract';
1062 $trackid =
'con'.$object->id;
1063 include DOL_DOCUMENT_ROOT.
'/core/actions_sendmails.inc.php';
1067 if ($action ==
'addcontact' && $user->hasRight(
'contrat',
'creer')) {
1070 $result =
$object->add_contact($contactid, $typeid,
GETPOST(
"source",
'aZ09'));
1073 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
1076 if (
$object->error ==
'DB_ERROR_RECORD_ALREADY_EXISTS') {
1077 $langs->load(
"errors");
1078 setEventMessages($langs->trans(
"ErrorThisContactIsAlreadyDefinedAsThisType"),
null,
'errors');
1083 } elseif ($action ==
'swapstatut' && $user->hasRight(
'contrat',
'creer')) {
1086 } elseif ($action ==
'deletecontact' && $user->hasRight(
'contrat',
'creer')) {
1091 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
1100 if ($action ==
'confirm_clone' && $confirm ==
'yes' && $user->hasRight(
'contrat',
'creer')) {
1102 setEventMessages($langs->trans(
"NoCloneOptionsSpecified"),
null,
'errors');
1105 $result =
$object->createFromClone($user, $socid);
1107 header(
"Location: ".$_SERVER[
'PHP_SELF'].
'?id='.$result);
1110 if (count(
$object->errors) > 0) {
1125$title =
$object->ref.
" - ".$langs->trans(
'Contract');
1126if ($action ==
'create') {
1127 $title = $langs->trans(
"NewContract");
1129$help_url =
'EN:Module_Contracts|FR:Module_Contrat|ES:Contratos_de_servicio';
1131llxHeader(
'', $title, $help_url,
'', 0, 0,
'',
'',
'',
'mod-contrat page-card');
1133$form =
new Form($db);
1142if (substr(
$module, 0, 13) ==
'mod_contract_' && substr(
$module, -3) ==
'php') {
1146$modCodeContract =
null;
1148 $modCodeContract =
new $module();
1150 '@phan-var-force ModelNumRefContracts $modCodeContract';
1154if ($action ==
'create') {
1161 $soc->fetch($socid);
1168 if (preg_match(
'/^([^_]+)_([^_]+)/i',
GETPOST(
'origin'), $regs)) {
1169 $element = $regs[1];
1172 if ($element ==
'project') {
1176 $objectsrc = fetchObjectByElement($originid, $origin);
1178 if (is_object($objectsrc) && $objectsrc->id > 0) {
1179 '@phan-var-force Commande|Propal|Facture $objectsrc';
1180 if (empty($objectsrc->lines) && method_exists($objectsrc,
'fetch_lines')) {
1181 $objectsrc->fetch_lines();
1183 $objectsrc->fetch_thirdparty();
1186 $objectsrc->fetch_optionals();
1187 $object->array_options = $objectsrc->array_options;
1189 $projectid = (int) $objectsrc->fk_project;
1191 $soc = $objectsrc->thirdparty;
1193 $note_private = (!empty($objectsrc->note_private) ? $objectsrc->note_private :
'');
1194 $note_public = (!empty($objectsrc->note_public) ? $objectsrc->note_public :
'');
1197 $srccontactslist = $objectsrc->liste_contact(-1,
'external', 1);
1204 $note_private =
GETPOST(
"note_private",
"alpha");
1205 $note_public =
GETPOST(
"note_public",
"alpha");
1210 print
'<form name="form_contract" action="'.$_SERVER[
"PHP_SELF"].
'" method="post">';
1211 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1212 print
'<input type="hidden" name="action" value="add">';
1213 print
'<input type="hidden" name="socid" value="'.$soc->id.
'">'.
"\n";
1214 print
'<input type="hidden" name="remise_percent" value="0">';
1215 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
1216 print
'<input type="hidden" name="contract_type" value="'.GETPOSTINT(
'contract_type').
'">';
1220 print
'<table class="border centpercent">';
1223 if (empty($modCodeContract->code_auto)) {
1224 print
'<tr><td class="titlefield fieldrequired">'.$langs->trans(
'Ref').
'</td><td>';
1228 $tmpcode =
'<input name="ref" class="maxwidth100" maxlength="128" value="'.dol_escape_htmltag(
GETPOST(
'ref',
'alpha')).
'">';
1236 print
'<tr><td>'.$langs->trans(
'RefCustomer').
'</td>';
1237 print
'<td><input type="text" class="maxwidth150" name="ref_customer" id="ref_customer" value="'.dol_escape_htmltag(
GETPOST(
'ref_customer',
'alpha')).
'"></td></tr>';
1241 print
'<tr><td>'.$langs->trans(
'RefSupplier').
'</td>';
1242 print
'<td><input type="text" class="maxwidth150" name="ref_supplier" id="ref_supplier" value="'.dol_escape_htmltag(
GETPOST(
'ref_supplier',
'alpha')).
'"></td></tr>';
1247 print
'<td class="fieldrequired">'.$langs->trans(
'ThirdParty').
'</td>';
1250 print $soc->getNomUrl(1);
1251 print
'<input type="hidden" name="socid" value="'.$soc->id.
'">';
1255 print img_picto(
'',
'company',
'class="pictofixedwidth"');
1256 print $form->select_company(
'',
'socid',
'',
'SelectThirdParty', 1, 0, array(), 0,
'minwidth150 widthcentpercentminusxx maxwidth500');
1257 print
' <a href="'.dolBuildUrl(DOL_URL_ROOT .
'/societe/card.php', [
'action' =>
'create',
'customer' => 3,
'backtopage' =>
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'action' =>
'create'])]).
'"><span class="fa fa-plus-circle valignmiddle paddingleft" title="'.$langs->trans(
"AddThirdParty").
'"></span></a>';
1264 print
'<tr><td>'.$langs->trans(
'Discounts').
'</td><td>';
1265 if ($soc->remise_percent) {
1266 print $langs->trans(
"CompanyHasRelativeDiscount", $soc->remise_percent).
' ';
1268 print
'<span class="hideonsmartphone">'.$langs->trans(
"CompanyHasNoRelativeDiscount").
'. </span>';
1270 $absolute_discount = $soc->getAvailableDiscounts();
1271 if ($absolute_discount) {
1272 print $langs->trans(
"CompanyHasAbsoluteDiscount",
price($absolute_discount), $langs->trans(
"Currency".$conf->currency)).
'.';
1274 print
'<span class="hideonsmartphone">'.$langs->trans(
"CompanyHasNoAbsoluteDiscount").
'.</span>';
1280 print
'<tr><td class="nowrap"><span class="fieldrequired">'.$langs->trans(
"TypeContact_contrat_internal_SALESREPFOLL").
'</span></td><td>';
1281 print img_picto(
'',
'user',
'class="pictofixedwidth"');
1282 print $form->select_dolusers(
GETPOST(
"commercial_suivi_id") ?
GETPOST(
"commercial_suivi_id") : $user->id,
'commercial_suivi_id', 1, null);
1286 print
'<tr><td class="nowrap"><span class="fieldrequired">'.$langs->trans(
"TypeContact_contrat_internal_SALESREPSIGN").
'</span></td><td>';
1287 print img_picto(
'',
'user',
'class="pictofixedwidth"');
1288 print $form->select_dolusers(
GETPOST(
"commercial_signature_id") ?
GETPOST(
"commercial_signature_id") : $user->id,
'commercial_signature_id', 1, null);
1291 print
'<tr><td><span class="fieldrequired">'.$langs->trans(
"Date").
'</span></td><td>';
1292 print img_picto(
'',
'action',
'class="pictofixedwidth"');
1293 print $form->selectDate($datecontrat,
'', 0, 0, 0,
"contrat");
1298 $langs->load(
'projects');
1302 print
'<tr><td>'.$langs->trans(
"Project").
'</td><td>';
1303 print img_picto(
'',
'project',
'class="pictofixedwidth"');
1304 $formproject->select_projects(($soc->id > 0 ? $soc->id : -1), $projectid,
"projectid", 0, 0, 1, 1, 0, 0, 0,
'', 0, 0,
'minwidth150 maxwidth300 widthcentpercentminusxx');
1305 print
' <a href="' .
dolBuildUrl(DOL_URL_ROOT .
'/projet/card.php', [
'socid' => $soc->id,
'action' =>
'create',
'status' => 1,
'backtopage' =>
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'action' =>
'create',
'socid' => $soc->id])]) .
'"><span class="fa fa-plus-circle valignmiddle" title="'.$langs->trans(
"AddProject").
'"></span></a>';
1310 print
'<tr><td>'.$langs->trans(
"NotePublic").
'</td><td class="tdtop">';
1311 $doleditor =
new DolEditor(
'note_public', (
string) $note_public,
'', 100,
'dolibarr_notes',
'In',
true,
true, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PUBLIC') ? 0 : 1, ROWS_3,
'90%');
1312 print $doleditor->Create(1);
1316 if (empty($user->socid)) {
1317 print
'<tr><td>'.$langs->trans(
"NotePrivate").
'</td><td class="tdtop">';
1318 $doleditor =
new DolEditor(
'note_private', (
string) $note_private,
'', 100,
'dolibarr_notes',
'In',
true,
true, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PRIVATE') ? 0 : 1, ROWS_3,
'90%');
1319 print $doleditor->Create(1);
1324 $parameters = array(
'objectsrc' => $objectsrc,
'colspan' =>
' colspan="3"',
'cols' =>
'3');
1325 $reshook = $hookmanager->executeHooks(
'formObjectOptions', $parameters, $object, $action);
1326 print $hookmanager->resPrint;
1329 if (empty($reshook)) {
1330 print
$object->showOptionals($extrafields,
'create', $parameters);
1337 print $form->buttonsSaveCancel(
"CreateDraft");
1339 if (is_object($objectsrc)) {
1340 print
'<input type="hidden" name="origin" value="'.$objectsrc->element.
'">';
1341 print
'<input type="hidden" name="originid" value="'.$objectsrc->id.
'">';
1344 print
'<br>'.$langs->trans(
"Note").
': '.$langs->trans(
"OnlyLinesWithTypeServiceAreUsed");
1358 $result =
$object->fetch_lines();
1360 dol_print_error($db,
$object->error);
1363 $nbofservices = count(
$object->lines);
1365 $author =
new User($db);
1366 $author->fetch(
$object->user_author_id);
1368 $commercial_signature =
new User($db);
1369 $commercial_signature->fetch(
$object->commercial_signature_id);
1371 $commercial_suivi =
new User($db);
1372 $commercial_suivi->fetch(
$object->commercial_suivi_id);
1379 print
dol_get_fiche_head($head, $hselected, $langs->trans(
"Contract"), -1,
'contract', 0,
'',
'', 0,
'', 1);
1382 if ($action ==
'delete') {
1384 $formconfirm = $form->formconfirm($_SERVER[
'PHP_SELF'].
"?id=".
$object->id, $langs->trans(
"DeleteAContract"), $langs->trans(
"ConfirmDeleteAContract"),
"confirm_delete",
'', 0, 1);
1385 } elseif ($action ==
'valid') {
1387 $ref = substr(
$object->ref, 1, 4);
1388 if ($ref ==
'PROV' && !empty($modCodeContract->code_auto)) {
1391 $numref = (string)
$object->ref;
1393 $text = $langs->trans(
'ConfirmValidateContract', $numref);
1394 $formconfirm = $form->formconfirm($_SERVER[
'PHP_SELF'].
"?id=".
$object->id, $langs->trans(
"ValidateAContract"), $text,
"confirm_valid",
'', 0, 1);
1395 } elseif ($action ==
'close') {
1397 $formconfirm = $form->formconfirm($_SERVER[
'PHP_SELF'].
"?id=".
$object->id, $langs->trans(
"CloseAContract"), $langs->trans(
"ConfirmCloseContract"),
"confirm_close",
'', 0, 1);
1398 } elseif ($action ==
'activate') {
1399 $formquestion = array(
1400 array(
'type' =>
'date',
'name' =>
'd_start',
'label' => $langs->trans(
"DateServiceActivate"),
'value' =>
dol_now()),
1401 array(
'type' =>
'date',
'name' =>
'd_end',
'label' => $langs->trans(
"DateEndPlanned"), 0 =>
'', 1 =>
''),
1402 array(
'type' =>
'text',
'name' =>
'comment',
'label' => $langs->trans(
"Comment"),
'value' =>
'', 0 =>
'', 1 =>
'',
'class' =>
'minwidth300',
'moreattr' =>
'autofocus')
1404 $formconfirm = $form->formconfirm($_SERVER[
'PHP_SELF'].
"?id=".
$object->id, $langs->trans(
"ActivateAllOnContract"), $langs->trans(
"ConfirmActivateAllOnContract"),
"confirm_activate", $formquestion,
'yes', 1, 300);
1405 } elseif ($action ==
'clone') {
1406 $filter =
'(s.client:IN:1,2,3) OR (s.fournisseur:=:1)';
1408 $formquestion = array(array(
'type' =>
'other',
'name' =>
'socid',
'label' => $langs->trans(
"SelectThirdParty"),
'value' => $form->select_company(
GETPOSTINT(
'socid'),
'socid', $filter)));
1409 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'ToClone'), $langs->trans(
'ConfirmCloneContract',
$object->ref),
'confirm_clone', $formquestion,
'yes', 1);
1410 } elseif ($action ==
'sign') {
1411 $text = $langs->trans(
'ConfirmSignContract');
1413 require_once DOL_DOCUMENT_ROOT.
'/core/class/notify.class.php';
1414 $notify =
new Notify($db);
1416 $text .= $notify->confirmMessage(
'CONTRACT_MODIFY',
$object->socid, $object);
1421 'name' =>
'signed_status',
1422 'label' =>
'<span class="fieldrequired">'.$langs->trans(
'SignStatus').
'</span>',
1423 'values' =>
$object->getSignedStatusLocalisedArray()
1425 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'SignContract'), $text,
'confirm_sign', $formquestion, 0, 1);
1426 } elseif ($action ==
'unsign') {
1427 $text = $langs->trans(
'ConfirmUnsignContract');
1429 require_once DOL_DOCUMENT_ROOT.
'/core/class/notify.class.php';
1430 $notify =
new Notify($db);
1432 $text .= $notify->confirmMessage(
'CONTRACT_MODIFY',
$object->socid, $object);
1434 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'UnsignContract'), $text,
'confirm_unsign',
'', 0, 1);
1439 $parameters = array(
1440 'formConfirm' => $formconfirm,
1445 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters, $object, $action);
1446 if (empty($reshook)) {
1447 $formconfirm .= $hookmanager->resPrint;
1448 } elseif ($reshook > 0) {
1449 $formconfirm = $hookmanager->resPrint;
1457 if (
$object->status == $object::STATUS_DRAFT && $user->hasRight(
'contrat',
'creer')) {
1458 print
'<form action="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'" method="POST">';
1459 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1460 print
'<input type="hidden" name="action" value="setremise">';
1461 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
1466 $linkback =
'<a href="'.DOL_URL_ROOT.
'/contrat/list.php?restore_lastsearch_values=1'.(!empty($socid) ?
'&socid='.$socid :
'').
'">'.$langs->trans(
"BackToList").
'</a>';
1470 if (!empty($modCodeContract->code_auto)) {
1473 $morehtmlref .= $form->editfieldkey(
"",
'ref',
$object->ref, $object, $user->hasRight(
'contrat',
'creer'),
'string',
'', 0, 3);
1474 $morehtmlref .= $form->editfieldval(
"",
'ref',
$object->ref, $object, $user->hasRight(
'contrat',
'creer'),
'string',
'',
null,
'2');
1477 $morehtmlref .=
'<div class="refidno">';
1479 $morehtmlref .= $form->editfieldkey(
"RefCustomer",
'ref_customer',
$object->ref_customer, $object, $user->hasRight(
'contrat',
'creer'),
'string',
'', 0, 1);
1480 $morehtmlref .= $form->editfieldval(
"RefCustomer",
'ref_customer',
$object->ref_customer, $object, $user->hasRight(
'contrat',
'creer'),
'string'.(isset(
$conf->global->THIRDPARTY_REF_INPUT_SIZE) ?
':' .
getDolGlobalString(
'THIRDPARTY_REF_INPUT_SIZE') :
''),
'', null, null,
'', 1,
'getFormatedCustomerRef');
1482 $morehtmlref .=
'<br>';
1483 $morehtmlref .= $form->editfieldkey(
"RefSupplier",
'ref_supplier',
$object->ref_supplier, $object, $user->hasRight(
'contrat',
'creer'),
'string',
'', 0, 1);
1484 $morehtmlref .= $form->editfieldval(
"RefSupplier",
'ref_supplier',
$object->ref_supplier, $object, $user->hasRight(
'contrat',
'creer'),
'string',
'',
null,
null,
'', 1,
'getFormatedSupplierRef');
1486 $morehtmlref .=
'<br>'.$object->thirdparty->getNomUrl(1);
1488 $morehtmlref .=
' <span class="otherlink valignmiddle">(<a href="'.DOL_URL_ROOT.
'/contrat/list.php?socid='.((int)
$object->thirdparty->id).
'">'.$langs->trans(
"OtherContracts").
'</a>)</span>';
1492 $langs->load(
"projects");
1493 $morehtmlref .=
'<br>';
1494 if ($permissiontoadd) {
1495 $morehtmlref .= img_picto($langs->trans(
"Project"),
'project',
'class="pictofixedwidth"');
1496 if ($action !=
'classify') {
1497 $morehtmlref .=
'<a class="editfielda" href="'.dolBuildUrl($_SERVER[
'PHP_SELF'], [
'action' =>
'classify',
'id' => ((
int)
$object->id)],
true).
'">'.img_edit($langs->transnoentitiesnoconv(
'SetProject')).
'</a> ';
1499 $morehtmlref .= $form->form_project($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->socid, (
string)
$object->fk_project, ($action ==
'classify' ?
'projectid' :
'none'), 0, 0, 0, 1,
'',
'maxwidth300');
1501 if (!empty(
$object->fk_project)) {
1503 $proj->fetch(
$object->fk_project);
1504 $morehtmlref .= $proj->getNomUrl(1);
1506 $morehtmlref .=
'<span class="opacitymedium"> - '.dol_escape_htmltag($proj->title).
'</span>';
1511 $morehtmlref .=
'</div>';
1514 dol_banner_tab($object,
'ref', $linkback, 1,
'ref',
'none', $morehtmlref);
1517 print
'<div class="fichecenter">';
1518 print
'<div class="fichehalfleft">';
1519 print
'<div class="underbanner clearboth"></div>';
1521 print
'<table class="border centpercent tableforfield">';
1524 print
'<tr><td class="titlefield">'.$langs->trans(
'Discount').
'</td><td colspan="3">';
1525 if (
$object->thirdparty->remise_percent) {
1526 print $langs->trans(
"CompanyHasRelativeDiscount",
$object->thirdparty->remise_percent).
'. ';
1528 print
'<span class="hideonsmartphone opacitymedium">'.$langs->trans(
"CompanyHasNoRelativeDiscount").
'. </span>';
1530 $absolute_discount =
$object->thirdparty->getAvailableDiscounts();
1531 if ($absolute_discount) {
1532 print $langs->trans(
"CompanyHasAbsoluteDiscount",
price($absolute_discount), $langs->trans(
"Currency".$conf->currency)).
'.';
1534 print
'<span class="hideonsmartphone opacitymedium">'.$langs->trans(
"CompanyHasNoAbsoluteDiscount").
'.</span>';
1540 print
'<td class="titlefield">';
1541 print $form->editfieldkey(
"Date",
'date_contrat',
$object->date_contrat, $object, $user->hasRight(
'contrat',
'creer'));
1543 print $form->editfieldval(
"Date",
'date_contrat',
$object->date_contrat, $object, $user->hasRight(
'contrat',
'creer'),
'datehourpicker');
1548 $contractTypeLabels = array(0 => $langs->trans(
'CustomerContract'), 1 => $langs->trans(
'SupplierContract'));
1549 print
'<tr><td class="titlefield">'.$langs->trans(
'ContractType').
'</td>';
1550 print
'<td>'.dol_escape_htmltag($contractTypeLabels[(
int)
$object->fk_contract_type] ?? $contractTypeLabels[0]).
'</td>';
1554 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_view.tpl.php';
1559 print
'<div class="fichehalfright">';
1561 print
'<!-- amounts -->'.
"\n";
1562 print
'<div class="underbanner clearboth"></div>';
1565 print
'<div class="div-table-responsive-no-min">';
1566 print
'<table class="border tableforfield centpercent">';
1569 print
'<tr><td class="titlefield">'.
"".
'</td>';
1570 print
'<td class=right>'.$langs->trans(
'Total').
'</td>';
1571 print
'<td class=right>'.$staticcontractline->LibStatut(0, 5, 0).
'</td>';
1572 print
'<td class=right>'.$staticcontractline->LibStatut(4, 5, 0).
'</td>';
1573 print
'<td class=right>'.$staticcontractline->LibStatut(4, 5, 1).
'</td>';
1574 print
'<td class=right>'.$staticcontractline->LibStatut(5, 5, 0).
'</td>';
1577 $all=
$object->getTotalizedLines(-1, 0);
1578 $draft=
$object->getTotalizedLines(0, 0);
1579 $enabled=
$object->getTotalizedLines(4, 0);
1580 $expired=
$object->getTotalizedLines(4, 1);
1581 $close=
$object->getTotalizedLines(5, 0);
1584 print
'<tr><td class="titlefield">'.$langs->trans(
"Quantity").
'</td>';
1585 print
'<td class="right nowrap">'.($all[
'total_qty'] ?
price2num($all[
'total_qty']) :
'<span class="opacitymedium">0</span>').
'</td>';
1586 print
'<td class="right">'.($draft[
'total_qty'] ?
price2num($draft[
'total_qty']) :
'<span class="opacitymedium">0</span>').
'</td>';
1587 print
'<td class="right">'.($enabled[
'total_qty'] ?
price2num($enabled[
'total_qty']) :
'<span class="opacitymedium">0</span>').
'</td>';
1588 print
'<td class="right">'.($expired[
'total_qty'] ?
price2num($expired[
'total_qty']) :
'<span class="opacitymedium">0</span>').
'</td>';
1589 print
'<td class="right">'.($close[
'total_qty'] ?
price2num($close[
'total_qty']) :
'<span class="opacitymedium">0</span>').
'</td>';
1592 print
'<tr><td class="titlefield">'.$langs->trans(
"TotalHT").
'</td>';
1593 print
'<td class="nowraponall amountcard right">'.($all[
'total_ht'] ?
price($all[
'total_ht']) :
'<span class="opacitymedium">0</span>').
'</td>';
1594 print
'<td class="nowraponall amountcard right">'.($draft[
'total_ht'] ?
price($draft[
'total_ht']) :
'<span class="opacitymedium">0</span>').
'</td>';
1595 print
'<td class="nowraponall amountcard right">'.($enabled[
'total_ht'] ?
price($enabled[
'total_ht']) :
'<span class="opacitymedium">0</span>').
'</td>';
1596 print
'<td class="nowraponall amountcard right">'.($expired[
'total_ht'] ?
price($expired[
'total_ht']) :
'<span class="opacitymedium">0</span>').
'</td>';
1597 print
'<td class="nowraponall amountcard right">'.($close[
'total_ht'] ?
price($close[
'total_ht']) :
'<span class="opacitymedium">0</span>').
'</td>';
1600 print
'<tr><td class="titlefield">'.$langs->trans(
"TotalVAT").
'</td>';
1601 print
'<td class="nowraponall amountcard right nowrap">'.($all[
'total_tva'] ?
price($all[
'total_tva']) :
'<span class="opacitymedium">0</span>').
'</td>';
1602 print
'<td class="nowraponall amountcard right">'.($draft[
'total_tva'] ?
price($draft[
'total_tva']) :
'<span class="opacitymedium">0</span>').
'</td>';
1603 print
'<td class="nowraponall amountcard right">'.($enabled[
'total_tva'] ?
price($enabled[
'total_tva']) :
'<span class="opacitymedium">0</span>').
'</td>';
1604 print
'<td class="nowraponall amountcard right">'.($expired[
'total_tva'] ?
price($expired[
'total_tva']) :
'<span class="opacitymedium">0</span>').
'</td>';
1605 print
'<td class="nowraponall amountcard right">'.($close[
'total_tva'] ?
price($close[
'total_tva']) :
'<span class="opacitymedium">0</span>').
'</td>';
1608 if (
$mysoc->localtax1_assuj ==
"1" || $all[
'total_localtax1'] != 0) {
1609 print
'<tr><td class="titlefield">' . $langs->trans(
"TotalLT1") .
'</td>';
1610 print
'<td class="nowraponall amountcard right nowrap">' . ($all[
'total_localtax1'] ?
price($all[
'total_localtax1']) :
'<span class="opacitymedium">0</span>') .
'</td>';
1611 print
'<td class="nowraponall amountcard right">' . ($draft[
'total_localtax1'] ?
price($draft[
'total_localtax1']) :
'<span class="opacitymedium">0</span>') .
'</td>';
1612 print
'<td class="nowraponall amountcard right">' . ($enabled[
'total_localtax1'] ?
price($enabled[
'total_localtax1']) :
'<span class="opacitymedium">0</span>') .
'</td>';
1613 print
'<td class="nowraponall amountcard right">' . ($expired[
'total_localtax1'] ?
price($expired[
'total_localtax1']) :
'<span class="opacitymedium">0</span>') .
'</td>';
1614 print
'<td class="nowraponall amountcard right">' . ($close[
'total_localtax1'] ?
price($close[
'total_localtax1']) :
'<span class="opacitymedium">0</span>') .
'</td>';
1618 if (
$mysoc->localtax2_assuj ==
"1" || $all[
'total_localtax2'] != 0) {
1619 print
'<tr><td class="titlefield">' . $langs->trans(
"TotalLT2") .
'</td>';
1620 print
'<td class="nowraponall amountcard right nowrap">' . ($all[
'total_localtax2'] ?
price($all[
'total_localtax2']) :
'<span class="opacitymedium">0</span>') .
'</td>';
1621 print
'<td class="nowraponall amountcard right">' . ($draft[
'total_localtax2'] ?
price($draft[
'total_localtax2']) :
'<span class="opacitymedium">0</span>') .
'</td>';
1622 print
'<td class="nowraponall amountcard right">' . ($enabled[
'total_localtax2'] ?
price($enabled[
'total_localtax2']) :
'<span class="opacitymedium">0</span>') .
'</td>';
1623 print
'<td class="nowraponall amountcard right">' . ($expired[
'total_localtax2'] ?
price($expired[
'total_localtax2']) :
'<span class="opacitymedium">0</span>') .
'</td>';
1624 print
'<td class="nowraponall amountcard right">' . ($close[
'total_localtax2'] ?
price($close[
'total_localtax2']) :
'<span class="opacitymedium">0</span>') .
'</td>';
1628 print
'<tr><td class="titlefield">'.$langs->trans(
"TotalTTC").
'</td>';
1629 print
'<td class="nowraponall amountcard right nowrap">'.($all[
'total_ttc'] ?
price($all[
'total_ttc']):
'<span class="opacitymedium">0</span>').
'</td>';
1630 print
'<td class="nowraponall amountcard right">'.($draft[
'total_ttc'] ?
price($draft[
'total_ttc']) :
'<span class="opacitymedium">0</span>').
'</td>';
1631 print
'<td class="nowraponall amountcard right">'.($enabled[
'total_ttc'] ?
price($enabled[
'total_ttc']) :
'<span class="opacitymedium">0</span>').
'</td>';
1632 print
'<td class="nowraponall amountcard right">'.($expired[
'total_ttc'] ?
price($expired[
'total_ttc']) :
'<span class="opacitymedium">0</span>').
'</td>';
1633 print
'<td class="nowraponall amountcard right">'.($close[
'total_ttc'] ?
price($close[
'total_ttc']) :
'<span class="opacitymedium">0</span>').
'</td>';
1643 print
'<div class="clearboth"></div><br>';
1645 if (
$object->status == $object::STATUS_DRAFT && $user->hasRight(
'contrat',
'creer')) {
1652 $blocname =
'contacts';
1653 $title = $langs->trans(
'ContactsAddresses');
1654 include DOL_DOCUMENT_ROOT.
'/core/tpl/bloc_showhide.tpl.php';
1658 $blocname =
'notes';
1659 $title = $langs->trans(
'Notes');
1660 include DOL_DOCUMENT_ROOT.
'/core/tpl/bloc_showhide.tpl.php';
1664 $arrayothercontracts =
$object->getListOfContracts(
'others');
1672 global $inputalsopricewithtax;
1673 $inputalsopricewithtax = 1;
1675 $productstatic =
new Product($db);
1678 if (
isModEnabled(
'margin') && !empty(
$object->element) && in_array(
$object->element, array(
'facture',
'propal',
'commande'))) {
1682 $parameters = array(
'nbOfLines' => &$nbofservices);
1683 $reshook = $hookmanager->executeHooks(
'printObjectLinesBlock', $parameters, $object, $action);
1684 if (empty($reshook)) {
1688 print
'<div id="contrat-lines-container" id="contractlines" data-contractid="'.$object->id.
'" data-element="'.
$object->element.
'" >';
1689 while ($cursorline <= $nbofservices) {
1690 print
'<div id="contrat-line-container'.$object->lines[$cursorline - 1]->id.
'" data-contratlineid = "'.
$object->lines[$cursorline - 1]->id.
'" data-element="'.
$object->lines[$cursorline - 1]->element.
'" >';
1691 print
'<form name="update" id="addproduct" action="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'" method="post">';
1692 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1693 print
'<input type="hidden" name="action" value="updateline">';
1694 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
1695 print
'<input type="hidden" name="elrowid" value="'.$object->lines[$cursorline - 1]->id.
'">';
1696 print
'<input type="hidden" name="fournprice" value="'.(!empty(
$object->lines[$cursorline - 1]->fk_fournprice) ?
$object->lines[$cursorline - 1]->fk_fournprice : 0).
'">';
1699 print
'<div class="div-table-responsive-no-min">';
1700 print
'<table class="notopnoleftnoright allwidth tableforservicepart1 centpercent">';
1702 $sql =
"SELECT cd.rowid, cd.statut, cd.label as label_det, cd.fk_product, cd.product_type, cd.description, cd.qty,";
1703 $sql .=
" cd.tva_tx, cd.vat_src_code, cd.remise_percent, cd.info_bits, cd.subprice, cd.multicurrency_subprice,";
1704 $sql .=
" cd.date_ouverture_prevue as date_start, cd.date_ouverture as date_start_real,";
1705 $sql .=
" cd.date_fin_validite as date_end, cd.date_cloture as date_end_real,";
1706 $sql .=
" cd.commentaire as comment, cd.fk_product_fournisseur_price as fk_fournprice, cd.buy_price_ht as pa_ht,";
1707 $sql .=
" cd.fk_unit,";
1708 $sql .=
" p.rowid as pid, p.ref as pref, p.label as plabel, p.fk_product_type as ptype, p.entity as pentity, p.tosell, p.tobuy, p.tobatch";
1709 $sql .=
" ,cd.rang";
1710 $sql .=
" FROM ".MAIN_DB_PREFIX.
"contratdet as cd";
1711 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"product as p ON cd.fk_product = p.rowid";
1712 $sql .=
" WHERE cd.rowid = ".((int)
$object->lines[$cursorline - 1]->id);
1714 $result = $db->query($sql);
1719 $objp = $db->fetch_object($result);
1722 print
'<tr class="liste_titre'.($cursorline ?
' liste_titre_add' :
'').
'">';
1723 print
'<td>'.$langs->trans(
"ServiceNb", $cursorline).
'</td>';
1724 print
'<td width="80" class="center">'.$langs->trans(
"VAT").
'</td>';
1725 print
'<td width="80" class="right">'.$langs->trans(
"PriceUHT").
'</td>';
1729 print
'<td width="30" class="center">'.$langs->trans(
"Qty").
'</td>';
1731 print
'<td width="30" class="left">'.$langs->trans(
"Unit").
'</td>';
1733 print
'<td width="50" class="right">'.$langs->trans(
"ReductionShort").
'</td>';
1735 print
'<td width="50" class="right">'.$langs->trans(
"BuyingPrice").
'</td>';
1739 if ($nbofservices > 1 &&
$conf->browser->layout !=
'phone' && $user->hasRight(
'contrat',
'creer')) {
1740 print
'<td width="30" class="linecolmove tdlineupdown center">';
1741 if ($cursorline > 1) {
1742 print
'<a class="lineupdown reposition paddingrightonly paddingleftonly" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=up&token='.
newToken().
'&rowid='.$objp->rowid.
'">';
1743 echo
img_up(
'default', 0,
'imgupforline');
1746 if ($cursorline < $nbofservices) {
1747 print
'<a class="lineupdown reposition paddingrightonly paddingleftonly" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=down&token='.
newToken().
'&rowid='.$objp->rowid.
'">';
1748 echo
img_down(
'default', 0,
'imgdownforline');
1753 print
'<td width="30"> </td>';
1761 if ($action !=
'editline' || $idline != $objp->rowid) {
1763 if (
getDolGlobalString(
'CONTRACT_HIDE_CLOSED_SERVICES_BY_DEFAULT') && $objp->statut == ContratLigne::STATUS_CLOSED && $action !=
'showclosedlines') {
1764 $moreparam =
'style="display: none;"';
1768 $line->id = $objp->rowid;
1772 print
'<tr class="tdtop oddeven" '.$moreparam.
'>';
1775 print
'<td class="linecoldescription minwidth300imp">';
1777 print
'<div id="line_'.$line->rowid.
'"></div>';
1778 if ($objp->fk_product > 0) {
1779 $productstatic->id = $objp->fk_product;
1780 $productstatic->type = $objp->ptype;
1781 $productstatic->ref = $objp->pref;
1782 $productstatic->entity = $objp->pentity;
1783 $productstatic->label = $objp->plabel;
1784 $productstatic->status = $objp->tosell;
1785 $productstatic->status_buy = $objp->tobuy;
1786 $productstatic->status_batch = $objp->tobatch;
1788 $text = $productstatic->getNomUrl(1,
'', 32);
1789 if ($objp->plabel) {
1791 $text .= $objp->plabel;
1793 $description = $objp->description;
1796 print (!empty($line->fk_parent_line) ? img_picto(
'',
'rightarrow.png') :
'') . $text;
1798 print $form->textwithpicto(
'', $description);
1801 print $form->textwithtooltip($text, $description, 3, 0,
'',
'', 0, (!empty($line->fk_parent_line) ? img_picto(
'',
'rightarrow.png') :
''));
1805 if ($line->fk_product > 0 &&
getDolGlobalInt(
'PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE')) {
1806 print (!empty($line->description) && $line->description != $line->plabel) ? (($line->date_start || $line->date_end) ?
'' :
'<br>').
'<br>'.
dol_htmlentitiesbr($line->
description) :
'';
1809 print img_object($langs->trans(
"ShowProductOrService"), ($objp->product_type ?
'service' :
'product')).
' '.
dol_htmlentitiesbr($objp->
description).
"\n";
1814 print
'<td class="center">';
1815 print
vatrate($objp->tva_tx.($objp->vat_src_code ? (
' ('.$objp->vat_src_code.
')') :
''), true, $objp->info_bits);
1818 print
'<td class="right">'.($objp->subprice !=
'' ?
price($objp->subprice) :
'').
"</td>\n";
1824 print
'<td class="center">'.$objp->qty.
'</td>';
1827 print
'<td class="left">'.$object->lines[$cursorline - 1]->getLabelOfUnit(
'long', $langs).
'</td>';
1830 if ($objp->remise_percent > 0) {
1831 print
'<td class="right">'.$objp->remise_percent.
"%</td>\n";
1833 print
'<td> </td>';
1838 print
'<td class="right nowraponall">'.price($objp->pa_ht).
'</td>';
1842 print
'<td class="nowraponall right">';
1843 if ($user->hasRight(
'contrat',
'creer') && is_array($arrayothercontracts) && count($arrayothercontracts) && (
$object->status >= 0)) {
1844 print
'<!-- link to move service line into another contract -->';
1845 print
'<a class="reposition marginrightonly" style="padding-left: 5px;" href="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'&action=move&token='.
newToken().
'&elrowid='.$objp->rowid.
'">';
1846 print img_picto($langs->trans(
"MoveToAnotherContract"),
'uparrow');
1849 if ($user->hasRight(
'contrat',
'creer') && (
$object->statut >= 0)) {
1850 print
'<a class="reposition marginrightonly editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'&action=editline&token='.
newToken().
'&elrowid='.$objp->rowid.
'">';
1854 if ($user->hasRight(
'contrat',
'creer') && (
$object->statut >= 0)) {
1855 print
'<a class="reposition marginrightonly" href="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'&action=deleteline&token='.
newToken().
'&elrowid='.$objp->rowid.
'">';
1872 if ($objp->subprice >= 0) {
1873 print
'<tr class="oddeven" '.$moreparam.
'>';
1874 print
'<td colspan="'.$colspan.
'">';
1877 print $langs->trans(
"DateStartPlanned").
': ';
1878 if ($objp->date_start) {
1881 if ($objp->statut == 0 && $db->jdate($objp->date_start) < ($now -
$conf->contrat->services->inactifs->warning_delay)) {
1882 $warning_delay =
$conf->contrat->services->inactifs->warning_delay / 3600 / 24;
1883 $textlate = $langs->trans(
"Late").
' = '.$langs->trans(
"DateReference").
' > '.$langs->trans(
"DateToday").
' '.(ceil($warning_delay) >= 0 ?
'+' :
'').ceil($warning_delay).
' '.$langs->trans(
"days");
1884 print
" ".img_warning($textlate);
1887 print $langs->trans(
"Unknown");
1889 print
' - ';
1890 print $langs->trans(
"DateEndPlanned").
': ';
1891 if ($objp->date_end) {
1893 if ($objp->statut == 4 && $db->jdate($objp->date_end) < ($now -
$conf->contrat->services->expires->warning_delay)) {
1894 $warning_delay =
$conf->contrat->services->expires->warning_delay / 3600 / 24;
1895 $textlate = $langs->trans(
"Late").
' = '.$langs->trans(
"DateReference").
' > '.$langs->trans(
"DateToday").
' '.(ceil($warning_delay) >= 0 ?
'+' :
'').ceil($warning_delay).
' '.$langs->trans(
"days");
1896 print
" ".img_warning($textlate);
1899 print $langs->trans(
"Unknown");
1906 $parameters = [
'line' =>
$object->lines[$cursorline - 1],
'i' => $cursorline - 1,
'coldisplay' => &$coldisplay,
'colspan' => $colspan,
'moreparam' => $moreparam];
1907 $reshook = $hookmanager->executeHooks(
'objectLineView_BeforeProductExtrafield', $parameters, $object, $action);
1908 print $hookmanager->resPrint;
1911 if (empty($reshook) && is_array($extralabelslines) && count($extralabelslines) > 0) {
1913 $line->id = $objp->rowid;
1914 $line->fetch_optionals();
1915 print $line->showOptionals($extrafields,
'view', array(
'class' =>
'oddeven',
'style' => $moreparam,
'colspan' => $colspan,
'tdclass' =>
'notitlefieldcreate'),
'',
'',
'1');
1920 print
'<tr class="oddeven">';
1922 $currentLineProductId =
GETPOSTISSET(
'idprod') ?
GETPOST(
'idprod') : (!empty(
$object->lines[$cursorline - 1]->fk_product) ?
$object->lines[$cursorline - 1]->fk_product : 0);
1923 if ($objp->fk_product > 0) {
1924 $canchangeproduct = 1;
1927 if (empty($canchangeproduct)) {
1928 $productstatic->id = $objp->fk_product;
1929 $productstatic->type = $objp->ptype;
1930 $productstatic->ref = $objp->pref;
1931 $productstatic->entity = $objp->pentity;
1932 print $productstatic->getNomUrl(1,
'', 32);
1933 print $objp->label ?
' - '.dol_trunc($objp->label, 32) :
'';
1934 print
'<input type="hidden" name="idprod" value="'.$currentLineProductId.
'">';
1936 $senderissupplier = 0;
1937 if (empty($senderissupplier)) {
1943 print $form->select_produits($currentLineProductId,
'idprod', $filtertype, 0, 0, 1, 2,
'', 0, array(), 0, 1, 0,
'minwidth250onall maxwidth500 widthcentpercentminusx');
1945 $form->select_produits_fournisseurs($currentLineProductId,
'idprod');
1950 print $objp->label ? $objp->label.
'<br>' :
'';
1951 print
'<input type="hidden" name="idprod" value="'.$currentLineProductId.
'">';
1955 require_once DOL_DOCUMENT_ROOT.
'/core/class/doleditor.class.php';
1960 $doleditor =
new DolEditor(
'product_desc', (
GETPOSTISSET(
'product_desc') ?
GETPOST(
'product_desc') : $objp->
description),
'', 92,
'dolibarr_details',
'', false, true,
getDolGlobalInt(
'FCKEDITOR_ENABLE_DETAILS'), $nbrows,
'90%');
1961 $doleditor->Create();
1966 print
'<td class="right">';
1967 print $form->load_tva(
"eltva_tx", $objp->tva_tx.($objp->vat_src_code ? (
' ('.$objp->vat_src_code.
')') :
''),
$mysoc,
$object->thirdparty, $currentLineProductId, $objp->info_bits, $objp->product_type, false, 1);
1971 print
'<td class="right"><input class="width50" type="text" name="elprice" value="'.(GETPOSTISSET(
'elprice') ?
GETPOST(
'elprice') :
price($objp->subprice)).
'"></td>';
1979 print
'<td class="center"><input size="2" type="text" name="elqty" value="'.(GETPOSTISSET(
'elqty') ?
GETPOST(
'elqty') : $objp->qty).
'"></td>';
1983 print
'<td class="left">';
1989 print
'<td class="nowraponall right"><input size="1" type="text" name="elremise_percent" value="'.(GETPOSTISSET(
'elremise_percent') ?
GETPOST(
'elremise_percent') : $objp->remise_percent).
'">%</td>';
1991 if (!empty($usemargins)) {
1992 print
'<td class="right">';
1993 if ($objp->fk_product) {
1994 print
'<select id="fournprice" name="fournprice"></select>';
1996 print
'<input id="buying_price" type="text" class="width50" name="buying_price" value="'.price((
GETPOSTISSET(
'buying_price') ?
GETPOST(
'buying_price') : $objp->pa_ht), 0,
'', 0).
'"></td>';
1998 print
'<td class="center">';
1999 print
'<input type="submit" class="button margintoponly marginbottomonly" name="save" value="'.$langs->trans(
"Modify").
'">';
2000 print
'<br><input type="submit" class="button margintoponly marginbottomonly button-cancel" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
2013 print
'<tr class="oddeven">';
2014 print
'<td colspan="'.$colspan.
'">';
2015 print $langs->trans(
"DateStartPlanned").
' ';
2016 print $form->selectDate($db->jdate($objp->date_start),
"date_start_update", $usehm, $usehm, ($db->jdate($objp->date_start) > 0 ? 0 : 1),
"update");
2017 print
' '.$langs->trans(
"DateEndPlanned").
' ';
2018 print $form->selectDate($db->jdate($objp->date_end),
"date_end_update", $usehm, $usehm, ($db->jdate($objp->date_end) > 0 ? 0 : 1),
"update");
2022 if (is_array($extralabelslines) && count($extralabelslines) > 0) {
2024 $line->id = $objp->rowid;
2025 $line->fetch_optionals();
2027 print $line->showOptionals($extrafields,
'edit', array(
'style' =>
'class="oddeven"',
'colspan' => $colspan,
'tdclass' =>
'notitlefieldcreate'),
'',
'',
'1');
2033 dol_print_error($db);
2038 if (
getDolGlobalString(
'CONTRACT_HIDE_CLOSED_SERVICES_BY_DEFAULT') &&
$object->lines[$cursorline - 1]->statut == ContratLigne::STATUS_CLOSED && $action !=
'showclosedlines') {
2039 $moreparam =
'style="display: none;"';
2050 print
'<tr class="oddeven" '.$moreparam.
'>';
2051 print
'<td class="tdhrthin" colspan="'.$colspan.
'"><hr class="opacitymedium tdhrthin"></td>';
2064 if ($action ==
'deleteline' && !$cancel && $user->hasRight(
'contrat',
'creer') &&
$object->lines[$cursorline - 1]->id == $idline) {
2065 print $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".((
int)
$object->id).
"&lineid=".((
int) $idline), $langs->trans(
"DeleteContractLine"), $langs->trans(
"ConfirmDeleteContractLine"),
"confirm_deleteline",
'', 0, 1);
2066 if ($ret ==
'html') {
2067 print
'<table class="notopnoleftnoright centpercent"><tr class="oddeven" height="6"><td></td></tr></table>';
2074 if ($action ==
'move' && !$cancel && $user->hasRight(
'contrat',
'creer') &&
$object->lines[$cursorline - 1]->id == $idline) {
2075 $arraycontractid = array();
2076 foreach ($arrayothercontracts as $contractcursor) {
2077 $arraycontractid[$contractcursor->id] = $contractcursor->ref;
2081 $formquestion = array(
2082 'text' => $langs->trans(
"ConfirmMoveToAnotherContractQuestion"),
2083 0 => array(
'type' =>
'select',
'name' =>
'newcid',
'values' => $arraycontractid));
2085 print $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".((
int)
$object->id).
"&lineid=".((
int) $idline), $langs->trans(
"MoveToAnotherContract"), $langs->trans(
"ConfirmMoveToAnotherContract"),
"confirm_move", $formquestion,
'yes');
2086 print
'<table class="notopnoleftnoright centpercent"><tr class="oddeven" height="6"><td></td></tr></table>';
2091 print
'<table class="notopnoleftnoright tableforservicepart2'.($cursorline < $nbofservices ?
' boxtablenobottom' :
'').
' centpercent">';
2093 print
'<tr class="oddeven" '.$moreparam.
'>';
2094 print
'<td><span class="valignmiddle hideonsmartphone">'.$langs->trans(
"ServiceStatus").
':</span> '.
$object->lines[$cursorline - 1]->getLibStatut(4).
'</td>';
2095 print
'<td width="30" class="right">';
2096 if ($user->socid == 0) {
2097 if (
$object->status > 0 && $action !=
'activateline' && $action !=
'unactivateline' && is_object($objp)) {
2098 $tmpaction =
'activateline';
2099 $tmpactionpicto =
'play';
2100 $tmpactiontext = $langs->trans(
"Activate");
2101 if ($objp->statut == 4) {
2102 $tmpaction =
'unactivateline';
2103 $tmpactionpicto =
'playstop.png';
2104 $tmpactiontext = $langs->trans(
"Disable");
2106 if (($tmpaction ==
'activateline' && $user->hasRight(
'contrat',
'activer')) || ($tmpaction ==
'unactivateline' && $user->hasRight(
'contrat',
'desactiver'))) {
2107 print
'<a class="reposition" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&ligne='.
$object->lines[$cursorline - 1]->id.
'&action='.$tmpaction.
'&token='.
newToken().
'">';
2108 print img_picto($tmpactiontext, $tmpactionpicto);
2116 print
'<tr class="oddeven" '.$moreparam.
'>';
2120 if (!$objp->date_start_real) {
2121 print $langs->trans(
"DateStartReal").
': ';
2122 if ($objp->date_start_real) {
2125 print $langs->trans(
"ContractStatusNotRunning");
2129 if ($objp->date_start_real && !$objp->date_end_real) {
2130 print $langs->trans(
"DateStartReal").
': ';
2134 if ($objp->date_start_real && $objp->date_end_real) {
2135 print $langs->trans(
"DateStartReal").
': ';
2137 print
' - ';
2138 print $langs->trans(
"DateEndReal").
': ';
2141 if (!empty($objp->comment)) {
2142 print
" - ".$objp->comment;
2146 print
'<td class="center"> </td>';
2153 if ($permissiontoactivate && $action ==
'activateline' &&
$object->lines[$cursorline - 1]->id ==
GETPOSTINT(
'ligne') && is_object($objp)) {
2154 print
'<form name="active" action="'.$_SERVER[
"PHP_SELF"].
'" method="POST">';
2155 print
'<input type="hidden" name="token" value="'.newToken().
'">';
2156 print
'<input type="hidden" name="action" value="confirm_active">';
2157 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
2158 print
'<input type="hidden" name="id" value="'.$object->id.
'">';
2159 print
'<input type="hidden" name="ligne" value="'.GETPOSTINT(
'ligne').
'">';
2160 print
'<input type="hidden" name="confirm" value="yes">';
2162 print
'<table class="noborder tableforservicepart2'.($cursorline < $nbofservices ?
' boxtablenobottom' :
'').
' centpercent">';
2165 $dateactstart = $objp->date_start;
2168 } elseif (!$dateactstart) {
2172 $dateactend = $objp->date_end;
2175 } elseif (!$dateactend) {
2176 if ($objp->fk_product > 0) {
2178 $product->fetch($objp->fk_product);
2179 if (!empty($product->duration_value) && !empty($product->duration_unit)) {
2185 print
'<tr class="oddeven">';
2186 print
'<td class="nohover">'.$langs->trans(
"DateServiceActivate").
'</td><td class="nohover">';
2187 print $form->selectDate($dateactstart,
'start', $usehm, $usehm, 0,
"active", 1, 0);
2189 print
'<td class="nohover">'.$langs->trans(
"DateEndPlanned").
'</td><td class="nohover">';
2190 print $form->selectDate($dateactend,
"end", $usehm, $usehm, 0,
"active", 1, 0);
2192 print
'<td class="center nohover">';
2197 print
'<tr class="oddeven">';
2198 print
'<td class="nohover">'.$langs->trans(
"Comment").
'</td><td colspan="3" class="nohover" colspan="'.(
isModEnabled(
'margin') ? 4 : 3).
'"><input type="text" class="minwidth300" name="comment" value="'.
dol_escape_htmltag(
GETPOST(
"comment",
'alphanohtml')).
'"></td>';
2199 print
'<td class="nohover right">';
2200 print
'<input type="submit" class="button" name="activate" value="'.$langs->trans(
"Activate").
'"> ';
2201 print
'<input type="submit" class="button button-cancel" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
2211 if ($permissiontodisable && $action ==
'unactivateline' &&
$object->lines[$cursorline - 1]->id ==
GETPOSTINT(
'ligne') && is_object($objp)) {
2212 print
'<!-- Form to disabled a line -->'.
"\n";
2213 print
'<form name="confirm_closeline" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&ligne='.
$object->lines[$cursorline - 1]->id.
'" method="post">';
2214 print
'<input type="hidden" name="token" value="'.newToken().
'">';
2215 print
'<input type="hidden" name="confirm" value="yes">';
2216 print
'<input type="hidden" name="action" value="confirm_closeline">';
2217 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
2219 print
'<table class="noborder tableforservicepart2'.($cursorline < $nbofservices ?
' boxtablenobottom' :
'').
' centpercent">';
2222 $dateactstart = $objp->date_start_real;
2225 } elseif (!$dateactstart) {
2229 $dateactend = $objp->date_end_real;
2232 } elseif (!$dateactend) {
2233 if ($objp->fk_product > 0) {
2235 $product->fetch($objp->fk_product);
2240 if ($dateactend > $now) {
2244 print
'<tr class="oddeven"><td colspan="2" class="nohover">';
2245 if ($objp->statut >= 4) {
2246 if ($objp->statut == 4) {
2247 print $langs->trans(
"DateEndReal").
' ';
2248 print $form->selectDate($dateactend,
"end", $usehm, $usehm, ($objp->date_end_real > 0 ? 0 : 1),
"closeline", 1, 1);
2252 print
'<td class="center nohover">';
2255 print
'<tr class="oddeven">';
2256 print
'<td class="nohover">'.$langs->trans(
"Comment").
'</td><td class="nohover"><input class="quatrevingtpercent" type="text" class="flat" name="comment" value="'.
dol_escape_htmltag(
GETPOST(
'comment',
'alpha')).
'"></td>';
2257 print
'<td class="nohover right">';
2258 print
'<input type="submit" class="button" name="close" value="'.$langs->trans(
"Disable").
'"> ';
2259 print
'<input type="submit" class="button button-cancel" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
2274 if ($user->hasRight(
'contrat',
'creer') && (
$object->status == 0)) {
2278 print
' <form name="addproduct" id="addproduct" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.(($action !=
'editline') ?
'' :
'#line_'.
GETPOSTINT(
'lineid')).
'" method="POST">
2279 <input type="hidden" name="token" value="'.
newToken().
'">
2280 <input type="hidden" name="action" value="'.(($action !=
'editline') ?
'addline' :
'updateline').
'">
2281 <input type="hidden" name="mode" value="">
2282 <input type="hidden" name="id" value="'.
$object->id.
'">
2283 <input type="hidden" name="page_y" value="">
2284 <input type="hidden" name="backtopage" value="'.$backtopage.
'">
2287 print
'<div class="div-table-responsive-no-min">';
2288 print
'<table id="tablelines" class="noborder noshadow" width="100%">';
2291 if ($action !=
'editline') {
2292 $forcetoshowtitlelines = 1;
2293 if (empty(
$object->multicurrency_code)) {
2299 $parameters = array();
2300 $reshook = $hookmanager->executeHooks(
'formAddObjectLine', $parameters, $object, $action);
2302 setEventMessages($hookmanager->error, $hookmanager->errors,
'errors');
2304 if (empty($reshook)) {
2317 if (
GETPOST(
'modelselected')) {
2318 $action =
'presend';
2324 if ($user->socid == 0 && $action !=
'presend' && $action !=
'editline') {
2325 print
'<div class="tabsAction">';
2327 $parameters = array();
2328 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters, $object, $action);
2330 if (empty($reshook)) {
2334 'class' =>
'classfortooltip'
2339 if (empty($user->socid)) {
2340 if (
$object->status == $object::STATUS_VALIDATED) {
2341 if ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') || $user->hasRight(
'contrat',
'creer'))) {
2342 print dolGetButtonAction(
'', $langs->trans(
'SendMail'),
'email', $_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=presend&token='.
newToken().
'&mode=init#formmailbeforetitle',
'',
true, $params);
2344 print dolGetButtonAction(
'', $langs->trans(
'SendMail'),
'email',
'#',
'',
false, $params);
2349 if (
$object->status == $object::STATUS_DRAFT && $nbofservices) {
2350 if ($user->hasRight(
'contrat',
'creer')) {
2351 unset($params[
'attr'][
'title']);
2352 print dolGetButtonAction($langs->trans(
'Validate'),
'',
'default', $_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=valid&token='.
newToken(),
'',
true, $params);
2354 $params[
'attr'][
'title'] = $langs->trans(
"NotEnoughPermissions");
2355 print dolGetButtonAction($langs->trans(
'Validate'),
'',
'default',
'#',
'',
false, $params);
2358 if (
$object->status == $object::STATUS_VALIDATED) {
2359 if ($user->hasRight(
'contrat',
'creer')) {
2360 unset($params[
'attr'][
'title']);
2361 print dolGetButtonAction($langs->trans(
'Modify'),
'',
'default', $_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=reopen&token='.
newToken(),
'',
true, $params);
2363 $params[
'attr'][
'title'] = $langs->trans(
"NotEnoughPermissions");
2364 print dolGetButtonAction($langs->trans(
'Modify'),
'',
'default',
'#',
'',
false, $params);
2369 $arrayofcreatebutton = array();
2371 $arrayofcreatebutton[] = array(
2372 'url' =>
'/comm/propal/card.php?action=create&origin='.
$object->element.
'&originid='.
$object->id.
'&socid='.
$object->thirdparty->id.
'&renewal=true',
2373 'label' => $langs->trans(
'AddProp'),
2375 'perm' => $user->hasRight(
'propale',
'creer') ?
true : false,
2381 $arrayofcreatebutton[] = array(
2382 'url' =>
'/commande/card.php?action=create&token='.
newToken().
'&origin='.
$object->element.
'&originid='.
$object->id.
'&socid='.
$object->thirdparty->id,
2383 'label' => $langs->trans(
'AddOrder'),
2385 'perm' => $user->hasRight(
'commande',
'creer') ?
true : false,
2390 $arrayofcreatebutton[] = array(
2391 'url' =>
'/compta/facture/card.php?action=create&origin='.
$object->element.
'&originid='.
$object->id.
'&socid='.
$object->thirdparty->id,
2392 'label' => $langs->trans(
'CreateBill'),
2394 'perm' => $user->hasRight(
'facture',
'creer') ?
true : false,
2399 $langs->load(
"suppliers");
2400 $arrayofcreatebutton[] = array(
2401 'url' =>
'/fourn/facture/card.php?action=create&origin='.
$object->element.
'&originid='.
$object->id.
'&socid='.
$object->thirdparty->id,
2402 'label' => $langs->trans(
'AddSupplierInvoice'),
2404 'perm' => $user->hasRight(
'fournisseur',
'facture',
'creer') ?
true : false,
2408 if (count($arrayofcreatebutton)) {
2409 unset($params[
'attr'][
'title']);
2410 print dolGetButtonAction(
'', $langs->trans(
"Create"),
'default', $arrayofcreatebutton,
'',
true, $params);
2413 $arrayforbutaction = array();
2414 $arrayforbutaction[] = array(
2415 'url' =>
'/contrat/card.php?id='.
$object->id.
'&action=activate&token='.
newToken(),
2416 'label' => $langs->trans(
'ActivateAllContracts'),
2418 'perm' => (
$object->nbofservicesclosed > 0 ||
$object->nbofserviceswait > 0) ? $permissiontoactivate : -1,
2421 $arrayforbutaction[] = array(
2422 'url' =>
'/contrat/card.php?id='.
$object->id.
'&action=close&token='.
newToken(),
2423 'label' => $langs->trans(
'CloseAllContracts'),
2425 'perm' => (
$object->nbofservicesclosed < $nbofservices) ? $permissiontodisable : -1,
2429 if (count($arrayforbutaction)) {
2430 unset($params[
'attr'][
'title']);
2431 print dolGetButtonAction(
'', $langs->trans(
"Enable").
" / ".$langs->trans(
"Close"),
'default', $arrayforbutaction,
'',
true, $params);
2435 if ($action ==
'showclosedlines') {
2436 print
'<div class="inline-block divButAction"><a class="butAction" id="btnhideclosedlines" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=hideclosedlines&token='.
newToken().
'">'.$langs->trans(
"HideClosedServices").
'</a></div>';
2438 print
'<div class="inline-block divButAction"><a class="butAction" id="btnshowclosedlines" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=showclosedlines&token='.
newToken().
'">'.$langs->trans(
"ShowClosedServices").
'</a></div>';
2443 if (
getDolGlobalString(
'CONTRACT_SHOW_SIGNATURE_STATUS_WITH_SERVICE_STATUS') &&
$object->status > Contrat::STATUS_DRAFT) {
2444 if (
$object->signed_status != Contrat::$SIGNED_STATUSES[
'STATUS_SIGNED_ALL']) {
2445 print
'<div class="inline-block divButAction"><a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=sign&token=' .
newToken() .
'">' . $langs->trans(
"ContractSign") .
'</a></div>';
2447 print
'<div class="inline-block divButAction"><a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=unsign&token=' .
newToken() .
'">' . $langs->trans(
"ContractUnsign") .
'</a></div>';
2452 if ($user->hasRight(
'contrat',
'creer')) {
2453 unset($params[
'attr'][
'title']);
2454 print dolGetButtonAction($langs->trans(
'ToClone'), $langs->trans(
'ToClone'),
'clone', $_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'&socid='.
$object->socid.
'&action=clone&token='.
newToken(),
'',
true, array(
'attr' => array(
'class' =>
'reposition')));
2458 unset($params[
'attr'][
'title']);
2459 print dolGetButtonAction($langs->trans(
'Delete'), $langs->trans(
'Delete'),
'delete', $_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=delete&token='.
newToken(),
'', $permissiontodelete, array(
'attr' => array(
'class' =>
'reposition'))).
"\n";
2465 if ($action !=
'presend') {
2466 print
'<div class="fichecenter"><div class="fichehalfleft">';
2473 $urlsource = $_SERVER[
"PHP_SELF"].
"?id=".
$object->id;
2474 $genallowed = $user->hasRight(
'contrat',
'lire');
2475 $delallowed = $user->hasRight(
'contrat',
'creer');
2476 $tooltipAfterComboOfModels =
'';
2478 $tooltipAfterComboOfModels = $langs->trans(
"AccordingToYourSetupTheFileWillBeConcatenated",
getDolGlobalString(
'MAIN_INFO_CONTRACT_TERMSOFSALE'));
2481 print $formfile->showdocuments(
'contract', $filename, $filedir, $urlsource, $genallowed, $delallowed, (
$object->model_pdf ?
$object->model_pdf :
getDolGlobalString(
'CONTRACT_ADDON_PDF')), 1, 0, 0, 28, 0,
'',
'0',
'', $soc->default_lang,
'',
$object, 0,
'remove_file', $tooltipAfterComboOfModels);
2485 $tmparray = $form->showLinkToObjectBlock($object, array(), array(
'contrat'), 1);
2486 $linktoelem = $tmparray[
'linktoelem'];
2487 $htmltoenteralink = $tmparray[
'htmltoenteralink'];
2488 print $htmltoenteralink;
2490 $somethingshown = $form->showLinkedObjectBlock($object, $linktoelem);
2494 print
'<br><!-- Link to sign -->';
2495 require_once DOL_DOCUMENT_ROOT.
'/core/lib/signature.lib.php';
2497 print showOnlineSignatureUrl(
'contract',
$object->ref, $object).
'<br>';
2500 print
'</div><div class="fichehalfright">';
2504 $morehtmlcenter =
'<div class="nowraponall">';
2505 $morehtmlcenter .=
dolGetButtonTitle($langs->trans(
'FullConversation'),
'',
'fa fa-comments imgforviewmode', DOL_URL_ROOT.
'/contrat/messaging.php?id='.
$object->id);
2506 $morehtmlcenter .=
dolGetButtonTitle($langs->trans(
'SeeAll'),
'',
'fa fa-bars imgforviewmode', DOL_URL_ROOT.
'/contrat/agenda.php?id='.
$object->id);
2507 $morehtmlcenter .=
'</div>';
2511 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
2513 $somethingshown = $formactions->showactions($object,
'contract', $socid, 1,
'listactions', $MAXEVENT,
'', $morehtmlcenter);
2515 print
'</div></div>';
2519 $modelmail =
'contract';
2520 $defaulttopic =
'SendContractRef';
2521 $diroutput =
$conf->contract->multidir_output[
$object->entity ??
$conf->entity];
2522 $trackid =
'con'.$object->id;
2524 include DOL_DOCUMENT_ROOT.
'/core/tpl/card_presend.tpl.php';
2536 print
"\n".
'<script type="text/javascript">'.
"\n";
2538 $(document).ready(
function() {
2539 var idprod = $(
"input[name='idprod']").val();
2540 var fournprice = $(
"input[name='fournprice']").val();
2541 var token =
'<?php echo currentToken(); ?>';
2543 $.post(
'<?php echo DOL_URL_ROOT; ?>/fourn/ajax/getSupplierPrices.php', {
2547 if (data.length > 0) {
2550 $(data).each(
function() {
2551 options +=
'<option value="'+this.
id+
'" price="'+this.price+
'"';
2552 if (fournprice > 0) {
2553 if (this.
id == fournprice) {
2554 options +=
' selected';
2555 $(
"#buying_price").val(pricejs(this.price,
'MU'));
2559 options +=
'>'+this.label+
'</option>';
2561 options +=
'<option value=null'+(trouve?
'':
' selected')+
'><?php echo $langs->trans("InputPrice"); ?></option>';
2562 $(
"#fournprice").html(options);
2564 $(
"#buying_price").hide();
2565 $(
"#fournprice").show();
2568 $(
"#buying_price").show();
2570 $(
"#fournprice").change(
function() {
2571 var selval = $(
this).find(
'option:selected').attr(
"price");
2573 $(
"#buying_price").val(pricejs(selval,
'MU')).hide();
2575 $(
'#buying_price').show();
2579 $(
"#fournprice").hide();
2580 $(
'#buying_price').show();
2586 $(
"#fournprice").hide();
2587 $(
'#buying_price').show();
2591 print
'</script>'.
"\n";
$id
Support class for third parties, contacts, members, users or resources.
if(! $sortfield) if(! $sortorder) $object
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
Class to manage lines of contracts.
Class to manage a WYSIWYG editor.
Class to manage the table of subscription to notifications.
File of class to manage predefined price products or services by customer.
Class to manage products or services.
Class to manage projects.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage translations.
Class to manage Dolibarr users.
if(! $sortfield) if(! $sortorder) $module
contract_prepare_head(Contrat $object)
Prepare array with list of tabs.
dol_time_plus_duree($time, $duration_value, $duration_unit, $ruleforendofmonth=0)
Add a delay to a date.
print $script_file $mode $langs defaultlang(is_numeric($duration_value) ? " delay=". $duration_value :"").(is_numeric($duration_value2) ? " after cd cd cd description as description
Only used if Module[ID]Desc translation string is not found.
dol_move_dir($srcdir, $destdir, $overwriteifexists=1, $indexdatabase=1, $renamedircontent=1)
Move a directory into another name.
$date_start
Variables from include:
dol_now($mode='gmt')
Return date for now.
recordNotFound($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Displays an error page when a record is not found.
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed information (by default a local PHP server timestamp) Rep...
vatrate($rate, $addpercent=false, $info_bits=0, $usestarfornpr=0, $html=0)
Return a string with VAT rate label formatted for view output Used into pdf and HTML pages.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dolBuildUrl($url, $params=[], $addtoken=false, $anchor='')
Return path of url.
dol_eval($s, $returnvalue=1, $hideerrors=1, $onlysimplestring='1')
Replace eval function to add more security.
dol_sanitizeFileName($str, $newstr='_', $unaccent=1, $includequotes=0, $allowdash=0)
Clean a string to use it as a file name.
dol_strlen($string, $stringencoding='UTF-8')
Make a strlen call.
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.
GETPOSTISARRAY($paramname, $method=0)
Return true if the parameter $paramname is submit from a POST OR GET as an array.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
if(!function_exists( 'dol_getprefix')) dol_include_once($relpath, $classname='')
Make an include_once using default root and alternate root if it fails.
newToken()
Return the value of token currently saved into session with name 'newtoken'.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0, $nodefault=0)
Return value of a param into GET or POST supervariable.
dol_concatdesc($text1, $text2, $forxml=false, $invert=false)
Concat 2 descriptions with a new line between them (second operand after first one with appropriate n...
GETPOSTINT($paramname, $method=0, $nodefault=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_clone($srcobject, $native=2)
Create a clone of instance of object (new instance with same value for each properties) With native =...
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false, $decorate=0)
Output date in a string format according to outputlangs (or langs if not defined).
GETPOSTISSET($paramname)
Return true if we are in a context of submitting the parameter $paramname from a POST of a form.
dol_htmlentitiesbr($stringtoencode, $nl2brmode=0, $pagecodefrom='UTF-8', $removelasteolbr=1)
This function is called to encode a string into a HTML string but differs from htmlentities because a...
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
get_localtax($vatrate, $local, $thirdparty_buyer=null, $thirdparty_seller=null, $vatnpr=0)
Return localtax rate for a particular VAT rate, when selling a product with vat $vatrate,...
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0, $morecssdiv='')
Show tabs of a record.
dolGetButtonTitle($label, $helpText='', $iconClass='fa fa-file', $url='', $id='', $status=1, $params=array())
Function dolGetButtonTitle : this kind of buttons are used in title in list.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
img_down($titlealt='default', $selected=0, $moreclass='')
Show down arrow logo.
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='', $morecssonpicto='widthpictotitle')
Load a title with picto.
img_up($titlealt='default', $selected=0, $moreclass='')
Show top arrow logo.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
restrictedArea(User $user, $features, $object=0, $tableandshare='', $feature2='', $dbt_keyfield='fk_soc', $dbt_select='rowid', $isdraft=0, $nodie=0, $mode='')
Check permissions of a user to show a page and an object.