34require
"../main.inc.php";
35require_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
36require_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
37require_once DOL_DOCUMENT_ROOT.
'/core/lib/contract.lib.php';
38require_once DOL_DOCUMENT_ROOT.
'/contrat/class/contrat.class.php';
39require_once DOL_DOCUMENT_ROOT.
'/core/modules/contract/modules_contract.php';
40require_once DOL_DOCUMENT_ROOT.
'/core/class/doleditor.class.php';
41require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formfile.class.php';
42require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
43require_once DOL_DOCUMENT_ROOT.
'/compta/facture/class/facture.class.php';
44if (isModEnabled(
"propal")) {
45 require_once DOL_DOCUMENT_ROOT.
'/comm/propal/class/propal.class.php';
47if (isModEnabled(
'project')) {
48 require_once DOL_DOCUMENT_ROOT.
'/projet/class/project.class.php';
49 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formprojet.class.php';
51require_once DOL_DOCUMENT_ROOT.
'/core/class/extrafields.class.php';
54$langs->loadLangs(array(
"contracts",
"orders",
"companies",
"bills",
"products",
'compta'));
56$action =
GETPOST(
'action',
'aZ09');
57$confirm =
GETPOST(
'confirm',
'alpha');
58$cancel =
GETPOST(
'cancel',
'alpha');
59$backtopage =
GETPOST(
'backtopage',
'alpha');
61$socid =
GETPOST(
'socid',
'int');
64$origin =
GETPOST(
'origin',
'alpha');
65$originid =
GETPOST(
'originid',
'int');
68$usehm = (!empty($conf->global->MAIN_USE_HOURMIN_IN_DATE_RANGE) ? $conf->global->MAIN_USE_HOURMIN_IN_DATE_RANGE : 0);
72 $socid = $user->socid;
77$hookmanager->initHooks(array(
'contractcard',
'globalcard'));
83if ($id > 0 || !empty($ref) && $action !=
'add') {
84 $ret = $object->fetch($id, $ref);
86 $ret = $object->fetch_thirdparty();
94$extrafields->fetch_name_optionals_label($object->table_element);
97$extralabelslines = $extrafields->fetch_name_optionals_label($object->table_element_line);
99$permissionnote = $user->hasRight(
'contrat',
'creer');
100$permissiondellink = $user->hasRight(
'contrat',
'creer');
101$permissiontodelete = ($user->hasRight(
'contrat',
'creer') && $object->statut == $object::STATUS_DRAFT) || $user->hasRight(
'contrat',
'supprimer');
102$permissiontoadd = $user->hasRight(
'contrat',
'creer');
103$permissiontoedit = $permissiontoadd;
111$parameters = array(
'socid' => $socid);
112$reshook = $hookmanager->executeHooks(
'doActions', $parameters, $object, $action);
116if (empty($reshook)) {
117 $backurlforlist = DOL_URL_ROOT.
'/contrat/list.php';
119 if (empty($backtopage) || ($cancel && empty($id))) {
120 if (empty($backtopage) || ($cancel && strpos($backtopage,
'__ID__'))) {
121 if (empty($id) && (($action !=
'add' && $action !=
'create') || $cancel)) {
122 $backtopage = $backurlforlist;
124 $backtopage = DOL_URL_ROOT.
'/contrat/card.php?id='.((!empty($id) && $id > 0) ? $id :
'__ID__');
130 if (!empty($backtopageforcancel)) {
131 header(
"Location: ".$backtopageforcancel);
133 } elseif (!empty($backtopage)) {
134 header(
"Location: ".$backtopage);
140 include DOL_DOCUMENT_ROOT.
'/core/actions_setnotes.inc.php';
142 include DOL_DOCUMENT_ROOT.
'/core/actions_dellink.inc.php';
144 include DOL_DOCUMENT_ROOT.
'/core/actions_lineupdown.inc.php';
146 if ($action ==
'confirm_active' && $confirm ==
'yes' && $user->rights->contrat->activer) {
156 $result = $object->active_line($user,
GETPOST(
'ligne',
'int'), $date_start, $date_end,
GETPOST(
'comment'));
159 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$object->id);
164 } elseif ($action ==
'confirm_closeline' && $confirm ==
'yes' && $user->rights->contrat->activer) {
171 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"DateEnd")),
null,
'errors');
174 $result = $object->close_line($user,
GETPOST(
'ligne',
'int'), $date_end, urldecode(
GETPOST(
'comment')));
176 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$object->id);
185 if (
GETPOST(
'mode') ==
'predefined') {
197 $date_start_update =
'';
198 $date_end_update =
'';
199 $date_start_real_update =
'';
200 $date_end_real_update =
'';
201 if (
GETPOST(
'date_start_updatemonth') &&
GETPOST(
'date_start_updateday') &&
GETPOST(
'date_start_updateyear')) {
204 if (
GETPOST(
'date_end_updatemonth') &&
GETPOST(
'date_end_updateday') &&
GETPOST(
'date_end_updateyear')) {
207 if (
GETPOST(
'date_start_real_updatemonth') &&
GETPOST(
'date_start_real_updateday') &&
GETPOST(
'date_start_real_updateyear')) {
208 $date_start_real_update =
dol_mktime(
GETPOST(
'date_start_real_updatehour'),
GETPOST(
'date_start_real_updatemin'), 0,
GETPOST(
'date_start_real_updatemonth'),
GETPOST(
'date_start_real_updateday'),
GETPOST(
'date_start_real_updateyear'));
210 if (
GETPOST(
'date_end_real_updatemonth') &&
GETPOST(
'date_end_real_updateday') &&
GETPOST(
'date_end_real_updateyear')) {
211 $date_end_real_update =
dol_mktime(
GETPOST(
'date_end_real_updatehour'),
GETPOST(
'date_end_real_updatemin'), 0,
GETPOST(
'date_end_real_updatemonth'),
GETPOST(
'date_end_real_updateday'),
GETPOST(
'date_end_real_updateyear'));
218 if ($action ==
'add' && $user->hasRight(
'contrat',
'creer')) {
220 if (empty($datecontrat)) {
222 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Date")),
null,
'errors');
227 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"ThirdParty")),
null,
'errors');
233 $ret = $extrafields->setOptionalsFromPost(
null, $object);
240 $object->socid = $socid;
241 $object->date_contrat = $datecontrat;
243 $object->commercial_suivi_id =
GETPOST(
'commercial_suivi_id',
'int');
244 $object->commercial_signature_id =
GETPOST(
'commercial_signature_id',
'int');
246 $object->note_private =
GETPOST(
'note_private',
'alpha');
247 $object->note_public =
GETPOST(
'note_public',
'alpha');
248 $object->fk_project =
GETPOST(
'projectid',
'int');
250 $object->ref =
GETPOST(
'ref',
'alpha');
251 $object->ref_customer =
GETPOST(
'ref_customer',
'alpha');
252 $object->ref_supplier =
GETPOST(
'ref_supplier',
'alpha');
255 if (!empty($origin) && !empty($originid)) {
257 $element = $subelement = $origin;
258 if (preg_match(
'/^([^_]+)_([^_]+)/i', $origin, $regs)) {
260 $subelement = $regs[2];
264 if ($element ==
'order') {
265 $element = $subelement =
'commande';
267 if ($element ==
'propal') {
268 $element =
'comm/propal'; $subelement =
'propal';
270 if ($element ==
'invoice' || $element ==
'facture') {
271 $element =
'compta/facture';
272 $subelement =
'facture';
275 $object->origin = $origin;
276 $object->origin_id = $originid;
279 $object->linked_objects[$object->origin] = $object->origin_id;
280 if (is_array($_POST[
'other_linked_objects']) && !empty($_POST[
'other_linked_objects'])) {
281 $object->linked_objects = array_merge($object->linked_objects, $_POST[
'other_linked_objects']);
284 $id = $object->create($user);
288 $classname = ucfirst($subelement);
289 $srcobject =
new $classname($db);
291 dol_syslog(
"Try to find source object origin=".$object->origin.
" originid=".$object->origin_id.
" to add lines");
292 $result = $srcobject->fetch($object->origin_id);
294 $srcobject->fetch_thirdparty();
295 $lines = $srcobject->lines;
296 if (empty($lines) && method_exists($srcobject,
'fetch_lines')) {
297 $srcobject->fetch_lines();
298 $lines = $srcobject->lines;
302 $num = count($lines);
304 for ($i = 0; $i < $num; $i++) {
305 $product_type = ($lines[$i]->product_type ? $lines[$i]->product_type : 0);
307 if ($product_type == 1 || (!empty($conf->global->CONTRACT_SUPPORT_PRODUCTS) && in_array($product_type, array(0, 1)))) {
309 if ($lines[$i]->fk_product > 0) {
310 $product_static =
new Product($db);
313 if (
getDolGlobalInt(
'MAIN_MULTILANGS') && !empty($conf->global->PRODUIT_TEXTS_IN_THIRDPARTY_LANGUAGE)) {
315 $prod->id = $lines[$i]->fk_product;
316 $prod->getMultiLangs();
318 $outputlangs = $langs;
320 if (empty($newlang) &&
GETPOST(
'lang_id',
'aZ09')) {
321 $newlang =
GETPOST(
'lang_id',
'aZ09');
323 if (empty($newlang)) {
324 $newlang = $srcobject->thirdparty->default_lang;
326 if (!empty($newlang)) {
328 $outputlangs->setDefaultLang($newlang);
331 $label = (!empty($prod->multilangs[$outputlangs->defaultlang][
"libelle"])) ? $prod->multilangs[$outputlangs->defaultlang][
"libelle"] : $lines[$i]->product_label;
333 $label = $lines[$i]->product_label;
335 $desc = ($lines[$i]->desc && $lines[$i]->desc != $lines[$i]->libelle) ?
dol_htmlentitiesbr($lines[$i]->desc) :
'';
341 $array_options = array();
343 if (method_exists($lines[$i],
'fetch_optionals')) {
344 $lines[$i]->fetch_optionals();
345 $array_options = $lines[$i]->array_options;
348 $txtva = $lines[$i]->vat_src_code ? $lines[$i]->tva_tx.
' ('.$lines[$i]->vat_src_code.
')' : $lines[$i]->tva_tx;
351 $localtax1_tx =
get_localtax($txtva, 1, $object->thirdparty);
352 $localtax2_tx =
get_localtax($txtva, 2, $object->thirdparty);
354 $result = $object->addline(
356 $lines[$i]->subprice,
361 $lines[$i]->fk_product,
362 $lines[$i]->remise_percent,
363 $lines[$i]->date_start,
364 $lines[$i]->date_end,
367 $lines[$i]->info_bits,
368 $lines[$i]->fk_fournprice,
387 $parameters = array(
'objFrom' => $srcobject);
388 $reshook = $hookmanager->executeHooks(
'createFrom', $parameters, $object, $action);
402 $result = $object->create($user);
404 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$object->id);
412 } elseif ($action ==
'classin' && $user->hasRight(
'contrat',
'creer')) {
413 $object->setProject(
GETPOST(
'projectid'));
414 } elseif ($action ==
'addline' && $user->hasRight(
'contrat',
'creer')) {
418 $product_desc = (GETPOSTISSET(
'dp_desc') ?
GETPOST(
'dp_desc',
'restricthtml') :
'');
421 $price_ht_devise =
'';
423 $price_ttc_devise =
'';
425 $rang = count($object->lines) + 1;
427 if (
GETPOST(
'price_ht') !==
'') {
430 if (
GETPOST(
'multicurrency_price_ht') !==
'') {
433 if (
GETPOST(
'price_ttc') !==
'') {
436 if (
GETPOST(
'multicurrency_price_ttc') !==
'') {
440 if (
GETPOST(
'prod_entry_mode',
'alpha') ==
'free') {
443 $idprod =
GETPOST(
'idprod',
'int');
445 if (!empty($conf->global->MAIN_DISABLE_FREE_LINES) && $idprod <= 0) {
446 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"ProductOrService")),
null,
'errors');
451 $tva_tx =
GETPOST(
'tva_tx',
'alpha');
454 $remise_percent = (GETPOSTISSET(
'remise_percent'.$predef) ?
price2num(
GETPOST(
'remise_percent'.$predef), 2) : 0);
455 if (empty($remise_percent)) {
460 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Qty")),
null,
'errors');
463 if (
GETPOST(
'prod_entry_mode',
'alpha') ==
'free' && (empty($idprod) || $idprod < 0) && empty($product_desc)) {
464 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Description")),
null,
'errors');
470 if (!empty($date_start) && !empty($date_end) && $date_start > $date_end) {
471 setEventMessages($langs->trans(
"Error").
': '.$langs->trans(
"DateStartPlanned").
' > '.$langs->trans(
"DateEndPlanned"),
null,
'errors');
476 $extralabelsline = $extrafields->fetch_name_optionals_label($object->table_element_line);
477 $array_options = $extrafields->getOptionalsFromPost($object->table_element_line, $predef);
479 if (is_array($extralabelsline)) {
481 foreach ($extralabelsline as $key => $value) {
482 unset($_POST[
"options_".$key]);
495 $prod->fetch($idprod);
504 $price_min = $prod->price_min;
505 $price_min_ttc = $prod->price_min_ttc;
508 if ($conf->global->PRODUIT_MULTIPRICES && $object->thirdparty->price_level) {
509 $price_min = $prod->multiprices_min[$object->thirdparty->price_level];
510 $price_min_ttc = $prod->multiprices_min_ttc[$object->thirdparty->price_level];
511 } elseif (!empty($conf->global->PRODUIT_CUSTOMER_PRICES)) {
513 require_once DOL_DOCUMENT_ROOT.
'/product/class/productcustomerprice.class.php';
517 $filter = array(
't.fk_product' => $prod->id,
't.fk_soc' => $object->thirdparty->id);
519 $result = $prodcustprice->fetchAll(
'',
'', 0, 0, $filter);
521 if (count($prodcustprice->lines) > 0) {
522 $price_min =
price($prodcustprice->lines[0]->price_min);
523 $price_min_ttc =
price($prodcustprice->lines[0]->price_min_ttc);
536 $tmpvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', $tva_tx));
537 $tmpprodvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', $prod->tva_tx));
540 if (!empty($price_ht) || $price_ht ===
'0') {
542 $pu_ttc =
price2num($pu_ht * (1 + ($tmpvat / 100)),
'MU');
543 $price_base_type =
'HT';
544 } elseif (!empty($price_ttc) || $price_ttc ===
'0') {
546 $pu_ht =
price2num($pu_ttc / (1 + ($tmpvat / 100)),
'MU');
547 $price_base_type =
'TTC';
550 $desc = $prod->description;
553 if ($product_desc == $desc && !empty($conf->global->PRODUIT_AUTOFILL_DESC)) {
557 if (!empty($product_desc) && !empty($conf->global->MAIN_NO_CONCAT_DESCRIPTION)) {
558 $desc = $product_desc;
560 $desc =
dol_concatdesc($desc, $product_desc,
'', !empty($conf->global->MAIN_CHANGE_ORDER_CONCAT_DESCRIPTION));
563 $fk_unit = $prod->fk_unit;
567 $tva_npr = (preg_match(
'/\*/', $tva_tx) ? 1 : 0);
568 if (empty($tva_tx)) {
571 $tva_tx = str_replace(
'*',
'', $tva_tx);
572 $desc = $product_desc;
573 $fk_unit =
GETPOST(
'units',
'alpha');
574 $pu_ht_devise =
price2num($price_ht_devise,
'MU');
575 $pu_ttc_devise =
price2num($price_ttc_devise,
'MU');
577 $tmpvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', $tva_tx));
580 if (!empty($price_ht) || $price_ht ===
'0') {
582 $pu_ttc =
price2num($pu_ht * (1 + ((
float) $tmpvat / 100)),
'MU');
583 $price_base_type =
'HT';
584 } elseif (!empty($price_ttc) || $price_ttc ===
'0') {
586 $pu_ht =
price2num($pu_ttc / (1 + ((
float) $tmpvat / 100)),
'MU');
587 $price_base_type =
'TTC';
591 $localtax1_tx =
get_localtax($tva_tx, 1, $object->thirdparty, $mysoc, $tva_npr);
592 $localtax2_tx =
get_localtax($tva_tx, 2, $object->thirdparty, $mysoc, $tva_npr);
595 $fk_fournprice =
GETPOST(
'fournprice');
597 $pa_ht =
GETPOST(
'buying_price');
607 if (((!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !$user->hasRight(
'produit',
'ignore_price_min_advance'))
608 || empty($conf->global->MAIN_USE_ADVANCED_PERMS)) && ($price_min && (
price2num($pu_ht) * (1 -
price2num($remise_percent) / 100) <
price2num($price_min)))) {
609 $object->error = $langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, -1, $conf->currency));
613 $result = $object->addline(
637 if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE) && !empty($conf->global->CONTRACT_ADDON_PDF)) {
638 $outputlangs = $langs;
641 $newlang =
GETPOST(
'lang_id',
'aZ09');
644 $newlang = $object->thirdparty->default_lang;
646 if (!empty($newlang)) {
648 $outputlangs->setDefaultLang($newlang);
651 $ret = $object->fetch($id);
653 $object->generateDocument($object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
656 unset($_POST[
'prod_entry_mode']);
658 unset($_POST[
'qty']);
659 unset($_POST[
'type']);
660 unset($_POST[
'remise_percent']);
661 unset($_POST[
'price_ht']);
662 unset($_POST[
'multicurrency_price_ht']);
663 unset($_POST[
'price_ttc']);
664 unset($_POST[
'tva_tx']);
665 unset($_POST[
'product_ref']);
666 unset($_POST[
'product_label']);
667 unset($_POST[
'product_desc']);
668 unset($_POST[
'fournprice']);
669 unset($_POST[
'buying_price']);
670 unset($_POST[
'np_marginRate']);
671 unset($_POST[
'np_markRate']);
672 unset($_POST[
'dp_desc']);
673 unset($_POST[
'idprod']);
675 unset($_POST[
'date_starthour']);
676 unset($_POST[
'date_startmin']);
677 unset($_POST[
'date_startsec']);
678 unset($_POST[
'date_startday']);
679 unset($_POST[
'date_startmonth']);
680 unset($_POST[
'date_startyear']);
681 unset($_POST[
'date_endhour']);
682 unset($_POST[
'date_endmin']);
683 unset($_POST[
'date_endsec']);
684 unset($_POST[
'date_endday']);
685 unset($_POST[
'date_endmonth']);
686 unset($_POST[
'date_endyear']);
691 } elseif ($action ==
'updateline' && $user->hasRight(
'contrat',
'creer') && !
GETPOST(
'cancel',
'alpha')) {
695 if (!empty($date_start_update) && !empty($date_end_update) && $date_start_update > $date_end_update) {
696 setEventMessages($langs->trans(
"Error").
': '.$langs->trans(
"DateStartPlanned").
' > '.$langs->trans(
"DateEndPlanned"),
null,
'errors');
697 $action =
'editline';
698 $_GET[
'rowid'] =
GETPOST(
'elrowid');
704 if ($objectline->fetch(
GETPOST(
'elrowid',
'int')) < 0) {
708 $objectline->fetch_optionals();
710 $objectline->oldcopy =
dol_clone($objectline);
716 if ($date_start_real_update ==
'') {
717 $date_start_real_update = $objectline->date_start_real;
719 if ($date_end_real_update ==
'') {
720 $date_end_real_update = $objectline->date_end_real;
723 $vat_rate =
GETPOST(
'eltva_tx',
'alpha');
726 if (preg_match(
'/\*/', $vat_rate)) {
731 $vat_rate = str_replace(
'*',
'', $vat_rate);
732 $localtax1_tx =
get_localtax($vat_rate, 1, $object->thirdparty, $mysoc);
733 $localtax2_tx =
get_localtax($vat_rate, 2, $object->thirdparty, $mysoc);
740 if (preg_match(
'/\((.*)\)/', $txtva, $reg)) {
741 $vat_src_code = $reg[1];
742 $txtva = preg_replace(
'/\s*\(.*\)/',
'', $txtva);
752 $fk_unit =
GETPOST(
'unit',
'alpha');
765 $objectline->fk_product =
GETPOST(
'idprod',
'int');
766 $objectline->description =
GETPOST(
'product_desc',
'restricthtml');
767 $objectline->price_ht = $price_ht;
770 $objectline->remise_percent = $remise_percent;
771 $objectline->tva_tx = ($txtva ? $txtva : 0);
772 $objectline->vat_src_code = $vat_src_code;
773 $objectline->localtax1_tx = is_numeric($localtax1_tx) ? $localtax1_tx : 0;
774 $objectline->localtax2_tx = is_numeric($localtax2_tx) ? $localtax2_tx : 0;
775 $objectline->date_start = $date_start_update;
776 $objectline->date_start_real = $date_start_real_update;
777 $objectline->date_end = $date_end_update;
778 $objectline->date_end_real = $date_end_real_update;
779 $objectline->fk_user_cloture = $user->id;
781 $objectline->pa_ht = $pa_ht;
782 $objectline->rang = $objectline->rang;
785 $objectline->fk_unit =
GETPOST(
'unit');
787 $objectline->fk_unit =
null;
791 $extralabelsline = $extrafields->fetch_name_optionals_label($objectline->table_element);
792 $array_options = $extrafields->getOptionalsFromPost($object->table_element_line, $predef);
794 if (is_array($array_options) && count($array_options) > 0) {
796 foreach ($array_options as $key => $value) {
797 $objectline->array_options[$key] = $array_options[$key];
803 $result = $objectline->update($user);
806 $action =
'editline';
807 $_GET[
'rowid'] =
GETPOST(
'elrowid');
817 } elseif ($action ==
'confirm_deleteline' && $confirm ==
'yes' && $user->hasRight(
'contrat',
'creer')) {
818 $result = $object->deleteline(
GETPOST(
'lineid',
'int'), $user);
821 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$object->id);
826 } elseif ($action ==
'confirm_valid' && $confirm ==
'yes' && $user->hasRight(
'contrat',
'creer')) {
827 $result = $object->validate($user);
831 if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) {
832 $outputlangs = $langs;
835 $newlang =
GETPOST(
'lang_id',
'aZ09');
838 $newlang = $object->thirdparty->default_lang;
840 if (!empty($newlang)) {
842 $outputlangs->setDefaultLang($newlang);
844 $model = $object->model_pdf;
845 $ret = $object->fetch($id);
847 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
852 } elseif ($action ==
'reopen' && $user->hasRight(
'contrat',
'creer')) {
853 $result = $object->reopen($user);
857 } elseif ($action ==
'confirm_close' && $confirm ==
'yes' && $user->hasRight(
'contrat',
'creer')) {
859 $result = $object->closeAll($user);
863 } elseif ($action ==
'confirm_activate' && $confirm ==
'yes' && $user->hasRight(
'contrat',
'creer')) {
866 $comment =
GETPOST(
'comment',
'alpha');
867 $result = $object->activateAll($user, $date_start, 0, $comment, $date_end);
871 } elseif ($action ==
'confirm_delete' && $confirm ==
'yes' && $user->hasRight(
'contrat',
'supprimer')) {
872 $result = $object->delete($user);
874 header(
"Location: list.php?restore_lastsearch_values=1");
879 } elseif ($action ==
'confirm_move' && $confirm ==
'yes' && $user->hasRight(
'contrat',
'creer')) {
882 $result = $contractline->fetch(
GETPOSTINT(
'lineid'));
883 $contractline->fk_contrat =
GETPOSTINT(
'newcid');
884 $result = $contractline->update($user, 1);
886 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$id);
892 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentities(
"RefNewContract")),
null,
'errors');
894 } elseif ($action ==
'update_extras') {
898 $ret = $extrafields->setOptionalsFromPost(
null, $object,
GETPOST(
'attribute',
'restricthtml'));
904 $result = $object->insertExtraFields(
'CONTRACT_MODIFY');
912 $action =
'edit_extras';
914 } elseif ($action ==
'setref_supplier') {
918 $result = $object->setValueFrom(
'ref_supplier',
GETPOST(
'ref_supplier',
'alpha'),
'',
null,
'text',
'', $user,
'CONTRACT_MODIFY');
921 $action =
'editref_supplier';
923 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$object->id);
927 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$id);
930 } elseif ($action ==
'setref_customer') {
934 $result = $object->setValueFrom(
'ref_customer',
GETPOST(
'ref_customer',
'alpha'),
'',
null,
'text',
'', $user,
'CONTRACT_MODIFY');
937 $action =
'editref_customer';
939 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$object->id);
943 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$id);
946 } elseif ($action ==
'setref') {
948 $result = $object->fetch($id);
953 $old_ref = $object->ref;
955 $result = $object->setValueFrom(
'ref',
GETPOST(
'ref',
'alpha'),
'',
null,
'text',
'', $user,
'CONTRACT_MODIFY');
960 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
961 $old_filedir = $conf->contrat->multidir_output[$object->entity].
'/'.
dol_sanitizeFileName($old_ref);
962 $new_filedir = $conf->contrat->multidir_output[$object->entity].
'/'.
dol_sanitizeFileName($object->ref);
967 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$object->id);
971 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$id);
974 } elseif ($action ==
'setdate_contrat') {
976 $result = $object->fetch($id);
981 $result = $object->setValueFrom(
'date_contrat', $datacontrat,
'',
null,
'date',
'', $user,
'CONTRACT_MODIFY');
984 $action =
'editdate_contrat';
986 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$object->id);
990 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$id);
996 include DOL_DOCUMENT_ROOT.
'/core/actions_printing.inc.php';
999 $upload_dir = $conf->contrat->multidir_output[$object->entity];
1000 include DOL_DOCUMENT_ROOT.
'/core/actions_builddoc.inc.php';
1003 $triggersendname =
'CONTRACT_SENTBYMAIL';
1005 $mode =
'emailfromcontract';
1006 $trackid =
'con'.$object->id;
1007 include DOL_DOCUMENT_ROOT.
'/core/actions_sendmails.inc.php';
1010 if (!empty($conf->global->MAIN_DISABLE_CONTACTS_TAB) && $user->hasRight(
'contrat',
'creer')) {
1011 if ($action ==
'addcontact') {
1014 $result = $object->add_contact($contactid, $typeid,
GETPOST(
"source",
'aZ09'));
1017 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$object->id);
1020 if ($object->error ==
'DB_ERROR_RECORD_ALREADY_EXISTS') {
1021 $langs->load(
"errors");
1022 setEventMessages($langs->trans(
"ErrorThisContactIsAlreadyDefinedAsThisType"),
null,
'errors');
1027 } elseif ($action ==
'swapstatut') {
1029 $result = $object->swapContactStatus(
GETPOST(
'ligne',
'int'));
1030 } elseif ($action ==
'deletecontact') {
1032 $result = $object->delete_contact(
GETPOST(
'lineid',
'int'));
1035 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$object->id);
1044 if ($action ==
'confirm_clone' && $confirm ==
'yes') {
1046 setEventMessages($langs->trans(
"NoCloneOptionsSpecified"),
null,
'errors');
1048 if ($object->id > 0) {
1049 $result = $object->createFromClone($user, $socid);
1051 header(
"Location: ".$_SERVER[
'PHP_SELF'].
'?id='.$result);
1054 if (count($object->errors) > 0) {
1070$help_url =
'EN:Module_Contracts|FR:Module_Contrat';
1072llxHeader(
'', $langs->trans(
"Contract"), $help_url);
1074$form =
new Form($db);
1076if (isModEnabled(
'project')) {
1081$module = (!empty($conf->global->CONTRACT_ADDON) ? $conf->global->CONTRACT_ADDON :
'mod_contract_serpis');
1082if (substr($module, 0, 13) ==
'mod_contract_' && substr($module, -3) ==
'php') {
1083 $module = substr($module, 0,
dol_strlen($module) - 4);
1087 $modCodeContract =
new $module();
1091if ($action ==
'create') {
1096 $soc->fetch($socid);
1102 $element = $subelement =
GETPOST(
'origin');
1103 if (preg_match(
'/^([^_]+)_([^_]+)/i',
GETPOST(
'origin'), $regs)) {
1104 $element = $regs[1];
1105 $subelement = $regs[2];
1108 if ($element ==
'project') {
1109 $projectid =
GETPOST(
'originid',
'int');
1112 if ($element ==
'order' || $element ==
'commande') {
1113 $element = $subelement =
'commande';
1115 if ($element ==
'propal') {
1116 $element =
'comm/propal'; $subelement =
'propal';
1118 if ($element ==
'invoice' || $element ==
'facture') {
1119 $element =
'compta/facture';
1120 $subelement =
'facture';
1125 $classname = ucfirst($subelement);
1126 $objectsrc =
new $classname($db);
1127 $objectsrc->fetch($originid);
1128 if (empty($objectsrc->lines) && method_exists($objectsrc,
'fetch_lines')) {
1129 $objectsrc->fetch_lines();
1131 $objectsrc->fetch_thirdparty();
1134 $objectsrc->fetch_optionals();
1135 $object->array_options = $objectsrc->array_options;
1137 $projectid = (!empty($objectsrc->fk_project) ? $objectsrc->fk_project :
'');
1139 $soc = $objectsrc->thirdparty;
1141 $note_private = (!empty($objectsrc->note_private) ? $objectsrc->note_private :
'');
1142 $note_public = (!empty($objectsrc->note_public) ? $objectsrc->note_public :
'');
1145 $srccontactslist = $objectsrc->liste_contact(-1,
'external', 1);
1148 $projectid =
GETPOST(
'projectid',
'int');
1149 $note_private =
GETPOST(
"note_private");
1150 $note_public =
GETPOST(
"note_public");
1153 $object->date_contrat =
dol_now();
1155 print
'<form name="form_contract" action="'.$_SERVER[
"PHP_SELF"].
'" method="post">';
1156 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1157 print
'<input type="hidden" name="action" value="add">';
1158 print
'<input type="hidden" name="socid" value="'.$soc->id.
'">'.
"\n";
1159 print
'<input type="hidden" name="remise_percent" value="0">';
1160 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
1164 print
'<table class="border centpercent">';
1167 print
'<tr><td class="titlefieldcreate fieldrequired">'.$langs->trans(
'Ref').
'</td><td>';
1168 if (!empty($modCodeContract->code_auto)) {
1169 $tmpcode = $langs->trans(
"Draft");
1171 $tmpcode =
'<input name="ref" class="maxwidth100" maxlength="128" value="'.dol_escape_htmltag(
GETPOST(
'ref') ?
GETPOST(
'ref') : $tmpcode).
'">';
1177 print
'<tr><td>'.$langs->trans(
'RefCustomer').
'</td>';
1178 print
'<td><input type="text" class="maxwidth150" name="ref_customer" id="ref_customer" value="'.dol_escape_htmltag(
GETPOST(
'ref_customer',
'alpha')).
'"></td></tr>';
1181 print
'<tr><td>'.$langs->trans(
'RefSupplier').
'</td>';
1182 print
'<td><input type="text" class="maxwidth150" name="ref_supplier" id="ref_supplier" value="'.dol_escape_htmltag(
GETPOST(
'ref_supplier',
'alpha')).
'"></td></tr>';
1186 print
'<td class="fieldrequired">'.$langs->trans(
'ThirdParty').
'</td>';
1189 print $soc->getNomUrl(1);
1190 print
'<input type="hidden" name="socid" value="'.$soc->id.
'">';
1194 print
img_picto(
'',
'company',
'class="pictofixedwidth"');
1195 print $form->select_company(
'',
'socid',
'',
'SelectThirdParty', 1, 0,
null, 0,
'minwidth300 widthcentpercentminusxx maxwidth500');
1196 print
' <a href="'.DOL_URL_ROOT.
'/societe/card.php?action=create&backtopage='.urlencode($_SERVER[
"PHP_SELF"].
'?action=create').
'"><span class="fa fa-plus-circle valignmiddle paddingleft" title="'.$langs->trans(
"AddThirdParty").
'"></span></a>';
1203 print
'<tr><td>'.$langs->trans(
'Discounts').
'</td><td>';
1204 if ($soc->remise_percent) {
1205 print $langs->trans(
"CompanyHasRelativeDiscount", $soc->remise_percent).
' ';
1207 print
'<span class="hideonsmartphone">'.$langs->trans(
"CompanyHasNoRelativeDiscount").
'. </span>';
1209 $absolute_discount = $soc->getAvailableDiscounts();
1210 if ($absolute_discount) {
1211 print $langs->trans(
"CompanyHasAbsoluteDiscount",
price($absolute_discount), $langs->trans(
"Currency".$conf->currency)).
'.';
1213 print
'<span class="hideonsmartphone">'.$langs->trans(
"CompanyHasNoAbsoluteDiscount").
'.</span>';
1219 print
'<tr><td class="nowrap"><span class="fieldrequired">'.$langs->trans(
"TypeContact_contrat_internal_SALESREPFOLL").
'</span></td><td>';
1220 print
img_picto(
'',
'user',
'class="pictofixedwidth"');
1221 print $form->select_dolusers(
GETPOST(
"commercial_suivi_id") ?
GETPOST(
"commercial_suivi_id") : $user->id,
'commercial_suivi_id', 1,
'');
1225 print
'<tr><td class="nowrap"><span class="fieldrequired">'.$langs->trans(
"TypeContact_contrat_internal_SALESREPSIGN").
'</span></td><td>';
1226 print
img_picto(
'',
'user',
'class="pictofixedwidth"');
1227 print $form->select_dolusers(
GETPOST(
"commercial_signature_id") ?
GETPOST(
"commercial_signature_id") : $user->id,
'commercial_signature_id', 1,
'');
1230 print
'<tr><td><span class="fieldrequired">'.$langs->trans(
"Date").
'</span></td><td>';
1231 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
1232 print $form->selectDate($datecontrat,
'', 0, 0,
'',
"contrat");
1236 if (isModEnabled(
'project')) {
1237 $langs->load(
'projects');
1241 print
'<tr><td>'.$langs->trans(
"Project").
'</td><td>';
1242 print
img_picto(
'',
'project',
'class="pictofixedwidth"');
1243 $formproject->select_projects(($soc->id > 0 ? $soc->id : -1), $projectid,
"projectid", 0, 0, 1, 1);
1244 print
' <a href="'.DOL_URL_ROOT.
'/projet/card.php?socid='.$soc->id.
'&action=create&status=1&backtopage='.urlencode($_SERVER[
"PHP_SELF"].
'?action=create&socid='.$soc->id).
'"><span class="fa fa-plus-circle valignmiddle" title="'.$langs->trans(
"AddProject").
'"></span></a>';
1248 print
'<tr><td>'.$langs->trans(
"NotePublic").
'</td><td class="tdtop">';
1249 $doleditor =
new DolEditor(
'note_public', $note_public,
'',
'100',
'dolibarr_notes',
'In', 1,
true, empty($conf->global->FCKEDITOR_ENABLE_NOTE_PUBLIC) ? 0 : 1, ROWS_3,
'90%');
1250 print $doleditor->Create(1);
1253 if (empty($user->socid)) {
1254 print
'<tr><td>'.$langs->trans(
"NotePrivate").
'</td><td class="tdtop">';
1255 $doleditor =
new DolEditor(
'note_private', $note_private,
'',
'100',
'dolibarr_notes',
'In', 1,
true, empty($conf->global->FCKEDITOR_ENABLE_NOTE_PRIVATE) ? 0 : 1, ROWS_3,
'90%');
1256 print $doleditor->Create(1);
1261 $parameters = array(
'objectsrc' => $objectsrc,
'colspan' =>
' colspan="3"',
'cols' =>
'3');
1262 $reshook = $hookmanager->executeHooks(
'formObjectOptions', $parameters, $object, $action);
1263 print $hookmanager->resPrint;
1266 if (empty($reshook)) {
1267 print $object->showOptionals($extrafields,
'create', $parameters);
1274 print $form->buttonsSaveCancel(
"Create");
1276 if (is_object($objectsrc)) {
1277 print
'<input type="hidden" name="origin" value="'.$objectsrc->element.
'">';
1278 print
'<input type="hidden" name="originid" value="'.$objectsrc->id.
'">';
1280 if (empty($conf->global->CONTRACT_SUPPORT_PRODUCTS)) {
1281 print
'<br>'.$langs->trans(
"Note").
': '.$langs->trans(
"OnlyLinesWithTypeServiceAreUsed");
1290 if ($object->id > 0) {
1291 $object->fetch_thirdparty();
1293 $soc = $object->thirdparty;
1295 $result = $object->fetch_lines();
1300 $nbofservices = count($object->lines);
1302 $author =
new User($db);
1303 $author->fetch($object->user_author_id);
1305 $commercial_signature =
new User($db);
1306 $commercial_signature->fetch($object->commercial_signature_id);
1308 $commercial_suivi =
new User($db);
1309 $commercial_suivi->fetch($object->commercial_suivi_id);
1316 print
dol_get_fiche_head($head, $hselected, $langs->trans(
"Contract"), -1,
'contract');
1319 if ($action ==
'delete') {
1321 $formconfirm = $form->formconfirm($_SERVER[
'PHP_SELF'].
"?id=".$object->id, $langs->trans(
"DeleteAContract"), $langs->trans(
"ConfirmDeleteAContract"),
"confirm_delete",
'', 0, 1);
1322 } elseif ($action ==
'valid') {
1324 $ref = substr($object->ref, 1, 4);
1325 if ($ref ==
'PROV' && !empty($modCodeContract->code_auto)) {
1326 $numref = $object->getNextNumRef($object->thirdparty);
1328 $numref = $object->ref;
1330 $text = $langs->trans(
'ConfirmValidateContract', $numref);
1331 $formconfirm = $form->formconfirm($_SERVER[
'PHP_SELF'].
"?id=".$object->id, $langs->trans(
"ValidateAContract"), $text,
"confirm_valid",
'', 0, 1);
1332 } elseif ($action ==
'close') {
1334 $formconfirm = $form->formconfirm($_SERVER[
'PHP_SELF'].
"?id=".$object->id, $langs->trans(
"CloseAContract"), $langs->trans(
"ConfirmCloseContract"),
"confirm_close",
'', 0, 1);
1335 } elseif ($action ==
'activate') {
1336 $formquestion = array(
1337 array(
'type' =>
'date',
'name' =>
'd_start',
'label' => $langs->trans(
"DateServiceActivate"),
'value' =>
dol_now()),
1338 array(
'type' =>
'date',
'name' =>
'd_end',
'label' => $langs->trans(
"DateEndPlanned"),
'',
''),
1339 array(
'type' =>
'text',
'name' =>
'comment',
'label' => $langs->trans(
"Comment"),
'value' =>
'',
'',
'',
'class' =>
'minwidth300',
'moreattr'=>
'autofocus')
1341 $formconfirm = $form->formconfirm($_SERVER[
'PHP_SELF'].
"?id=".$object->id, $langs->trans(
"ActivateAllOnContract"), $langs->trans(
"ConfirmActivateAllOnContract"),
"confirm_activate", $formquestion,
'yes', 1, 280);
1342 } elseif ($action ==
'clone') {
1343 $filter =
'(s.client:IN:1,2,3)';
1345 $formquestion = array(array(
'type' =>
'other',
'name' =>
'socid',
'label' => $langs->trans(
"SelectThirdParty"),
'value' => $form->select_company(
GETPOST(
'socid',
'int'),
'socid', $filter)));
1346 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.$object->id, $langs->trans(
'ToClone'), $langs->trans(
'ConfirmCloneContract', $object->ref),
'confirm_clone', $formquestion,
'yes', 1);
1351 $parameters = array(
1352 'formConfirm' => $formconfirm,
1357 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters, $object, $action);
1358 if (empty($reshook)) {
1359 $formconfirm .= $hookmanager->resPrint;
1360 } elseif ($reshook > 0) {
1361 $formconfirm = $hookmanager->resPrint;
1369 if (!empty($object->brouillon) && $user->hasRight(
'contrat',
'creer')) {
1370 print
'<form action="'.$_SERVER[
'PHP_SELF'].
'?id='.$object->id.
'" method="POST">';
1371 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1372 print
'<input type="hidden" name="action" value="setremise">';
1373 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
1378 $linkback =
'<a href="'.DOL_URL_ROOT.
'/contrat/list.php?restore_lastsearch_values=1'.(!empty($socid) ?
'&socid='.$socid :
'').
'">'.$langs->trans(
"BackToList").
'</a>';
1382 if (!empty($modCodeContract->code_auto)) {
1383 $morehtmlref .= $object->ref;
1385 $morehtmlref .= $form->editfieldkey(
"",
'ref', $object->ref, $object, $user->rights->contrat->creer,
'string',
'', 0, 3);
1386 $morehtmlref .= $form->editfieldval(
"",
'ref', $object->ref, $object, $user->rights->contrat->creer,
'string',
'', 0, 2);
1389 $morehtmlref .=
'<div class="refidno">';
1391 $morehtmlref .= $form->editfieldkey(
"RefCustomer",
'ref_customer', $object->ref_customer, $object, $user->rights->contrat->creer,
'string',
'', 0, 1);
1392 $morehtmlref .= $form->editfieldval(
"RefCustomer",
'ref_customer', $object->ref_customer, $object, $user->rights->contrat->creer,
'string'.(isset($conf->global->THIRDPARTY_REF_INPUT_SIZE) ?
':'.$conf->global->THIRDPARTY_REF_INPUT_SIZE :
''),
'', null, null,
'', 1,
'getFormatedCustomerRef');
1394 $morehtmlref .=
'<br>';
1395 $morehtmlref .= $form->editfieldkey(
"RefSupplier",
'ref_supplier', $object->ref_supplier, $object, $user->rights->contrat->creer,
'string',
'', 0, 1);
1396 $morehtmlref .= $form->editfieldval(
"RefSupplier",
'ref_supplier', $object->ref_supplier, $object, $user->rights->contrat->creer,
'string',
'',
null,
null,
'', 1,
'getFormatedSupplierRef');
1398 $morehtmlref .=
'<br>'.$object->thirdparty->getNomUrl(1);
1399 if (empty($conf->global->MAIN_DISABLE_OTHER_LINK) && $object->thirdparty->id > 0) {
1400 $morehtmlref .=
' (<a href="'.DOL_URL_ROOT.
'/contrat/list.php?socid='.$object->thirdparty->id.
'&search_name='.urlencode($object->thirdparty->name).
'">'.$langs->trans(
"OtherContracts").
'</a>)';
1403 if (isModEnabled(
'project')) {
1404 $langs->load(
"projects");
1405 $morehtmlref .=
'<br>';
1406 if ($permissiontoadd) {
1407 $morehtmlref .=
img_picto($langs->trans(
"Project"),
'project',
'class="pictofixedwidth"');
1408 if ($action !=
'classify') {
1409 $morehtmlref .=
'<a class="editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?action=classify&token='.newToken().
'&id='.$object->id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetProject')).
'</a> ';
1411 $morehtmlref .= $form->form_project($_SERVER[
'PHP_SELF'].
'?id='.$object->id, $object->socid, $object->fk_project, ($action ==
'classify' ?
'projectid' :
'none'), 0, 0, 0, 1,
'',
'maxwidth300');
1413 if (!empty($object->fk_project)) {
1415 $proj->fetch($object->fk_project);
1416 $morehtmlref .= $proj->getNomUrl(1);
1418 $morehtmlref .=
'<span class="opacitymedium"> - '.dol_escape_htmltag($proj->title).
'</span>';
1423 $morehtmlref .=
'</div>';
1426 dol_banner_tab($object,
'ref', $linkback, 1,
'ref',
'none', $morehtmlref);
1429 print
'<div class="fichecenter">';
1430 print
'<div class="underbanner clearboth"></div>';
1433 print
'<table class="border tableforfield" width="100%">';
1436 print
'<tr><td class="titlefield">'.$langs->trans(
'Discount').
'</td><td colspan="3">';
1437 if ($object->thirdparty->remise_percent) {
1438 print $langs->trans(
"CompanyHasRelativeDiscount", $object->thirdparty->remise_percent).
'. ';
1440 print
'<span class="hideonsmartphone">'.$langs->trans(
"CompanyHasNoRelativeDiscount").
'. </span>';
1442 $absolute_discount = $object->thirdparty->getAvailableDiscounts();
1443 if ($absolute_discount) {
1444 print $langs->trans(
"CompanyHasAbsoluteDiscount",
price($absolute_discount), $langs->trans(
"Currency".$conf->currency)).
'.';
1446 print
'<span class="hideonsmartphone">'.$langs->trans(
"CompanyHasNoAbsoluteDiscount").
'.</span>';
1452 print
'<td class="titlefield">';
1453 print $form->editfieldkey(
"Date",
'date_contrat', $object->date_contrat, $object, $user->rights->contrat->creer);
1455 print $form->editfieldval(
"Date",
'date_contrat', $object->date_contrat, $object, $user->rights->contrat->creer,
'datehourpicker');
1461 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_view.tpl.php';
1467 if (!empty($object->brouillon) && $user->hasRight(
'contrat',
'creer')) {
1473 if (!empty($conf->global->MAIN_DISABLE_CONTACTS_TAB)) {
1474 $blocname =
'contacts';
1475 $title = $langs->trans(
'ContactsAddresses');
1476 include DOL_DOCUMENT_ROOT.
'/core/tpl/bloc_showhide.tpl.php';
1479 if (!empty($conf->global->MAIN_DISABLE_NOTES_TAB)) {
1480 $blocname =
'notes';
1481 $title = $langs->trans(
'Notes');
1482 include DOL_DOCUMENT_ROOT.
'/core/tpl/bloc_showhide.tpl.php';
1486 $arrayothercontracts = $object->getListOfContracts(
'others');
1494 global $inputalsopricewithtax;
1495 $inputalsopricewithtax = 1;
1497 $productstatic =
new Product($db);
1500 if (isModEnabled(
'margin') && !empty($object->element) && in_array($object->element, array(
'facture',
'propal',
'commande'))) {
1508 print
'<div id="contrat-lines-container" id="contractlines" data-contractid="'.$object->id.
'" data-element="'.$object->element.
'" >';
1509 while ($cursorline <= $nbofservices) {
1510 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.
'" >';
1511 print
'<form name="update" action="'.$_SERVER[
'PHP_SELF'].
'?id='.$object->id.
'" method="post">';
1512 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1513 print
'<input type="hidden" name="action" value="updateline">';
1514 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
1515 print
'<input type="hidden" name="elrowid" value="'.$object->lines[$cursorline - 1]->id.
'">';
1516 print
'<input type="hidden" name="fournprice" value="'.(!empty($object->lines[$cursorline - 1]->fk_fournprice) ? $object->lines[$cursorline - 1]->fk_fournprice : 0).
'">';
1519 print
'<div class="div-table-responsive-no-min">';
1520 print
'<table class="notopnoleftnoright allwidth tableforservicepart1 centpercent">';
1522 $sql =
"SELECT cd.rowid, cd.statut, cd.label as label_det, cd.fk_product, cd.product_type, cd.description, cd.price_ht, cd.qty,";
1523 $sql .=
" cd.tva_tx, cd.vat_src_code, cd.remise_percent, cd.info_bits, cd.subprice, cd.multicurrency_subprice,";
1524 $sql .=
" cd.date_ouverture_prevue as date_start, cd.date_ouverture as date_start_real,";
1525 $sql .=
" cd.date_fin_validite as date_end, cd.date_cloture as date_end_real,";
1526 $sql .=
" cd.commentaire as comment, cd.fk_product_fournisseur_price as fk_fournprice, cd.buy_price_ht as pa_ht,";
1527 $sql .=
" cd.fk_unit,";
1528 $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";
1529 $sql .=
" ,cd.rang";
1530 $sql .=
" FROM ".MAIN_DB_PREFIX.
"contratdet as cd";
1531 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"product as p ON cd.fk_product = p.rowid";
1532 $sql .=
" WHERE cd.rowid = ".((int) $object->lines[$cursorline - 1]->id);
1534 $result = $db->query($sql);
1538 $objp = $db->fetch_object($result);
1541 print
'<tr class="liste_titre'.($cursorline ?
' liste_titre_add' :
'').
'">';
1542 print
'<td>'.$langs->trans(
"ServiceNb", $cursorline).
'</td>';
1543 print
'<td width="80" class="center">'.$langs->trans(
"VAT").
'</td>';
1544 print
'<td width="80" class="right">'.$langs->trans(
"PriceUHT").
'</td>';
1548 print
'<td width="30" class="center">'.$langs->trans(
"Qty").
'</td>';
1550 print
'<td width="30" class="left">'.$langs->trans(
"Unit").
'</td>';
1552 print
'<td width="50" class="right">'.$langs->trans(
"ReductionShort").
'</td>';
1553 if (isModEnabled(
'margin') && !empty($conf->global->MARGIN_SHOW_ON_CONTRACT)) {
1554 print
'<td width="50" class="right">'.$langs->trans(
"BuyingPrice").
'</td>';
1558 if ($nbofservices > 1 && $conf->browser->layout !=
'phone' && !empty($user->rights->contrat->creer)) {
1559 print
'<td width="30" class="linecolmove tdlineupdown center">';
1560 if ($cursorline > 1) {
1561 print
'<a class="lineupdown reposition" href="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=up&token='.newToken().
'&rowid='.$objp->rowid.
'">';
1562 echo
img_up(
'default', 0,
'imgupforline');
1565 if ($cursorline < $nbofservices) {
1566 print
'<a class="lineupdown reposition" href="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=down&token='.newToken().
'&rowid='.$objp->rowid.
'">';
1567 echo
img_down(
'default', 0,
'imgdownforline');
1572 print
'<td width="30"> </td>';
1580 if ($action !=
'editline' ||
GETPOST(
'rowid') != $objp->rowid) {
1582 if (!empty($conf->global->CONTRACT_HIDE_CLOSED_SERVICES_BY_DEFAULT) && $objp->statut == ContratLigne::STATUS_CLOSED && $action !=
'showclosedlines') {
1583 $moreparam =
'style="display: none;"';
1586 print
'<tr class="tdtop oddeven" '.$moreparam.
'>';
1589 if ($objp->fk_product > 0) {
1590 $productstatic->id = $objp->fk_product;
1591 $productstatic->type = $objp->ptype;
1592 $productstatic->ref = $objp->pref;
1593 $productstatic->entity = $objp->pentity;
1594 $productstatic->label = $objp->plabel;
1595 $productstatic->status = $objp->tosell;
1596 $productstatic->status_buy = $objp->tobuy;
1597 $productstatic->status_batch = $objp->tobatch;
1600 $text = $productstatic->getNomUrl(1,
'', 32);
1601 if ($objp->plabel) {
1603 $text .= $objp->plabel;
1605 $description = $objp->description;
1609 $text .= (!empty($objp->description) && $objp->description != $objp->plabel) ?
'<br>'.
dol_htmlentitiesbr($objp->description) :
'';
1613 print $form->textwithtooltip($text, $description, 3,
'',
'', $cursorline, 3, (!empty($line->fk_parent_line) ?
img_picto(
'',
'rightarrow') :
''));
1617 print
'<td>'.img_object($langs->trans(
"ShowProductOrService"), ($objp->product_type ?
'service' :
'product')).
' '.
dol_htmlentitiesbr($objp->
description).
"</td>\n";
1620 print
'<td class="center">';
1621 print
vatrate($objp->tva_tx.($objp->vat_src_code ? (
' ('.$objp->vat_src_code.
')') :
''),
'%', $objp->info_bits);
1624 print
'<td class="right">'.($objp->subprice !=
'' ?
price($objp->subprice) :
'').
"</td>\n";
1630 print
'<td class="center">'.$objp->qty.
'</td>';
1633 print
'<td class="left">'.$langs->trans($object->lines[$cursorline - 1]->getLabelOfUnit()).
'</td>';
1636 if ($objp->remise_percent > 0) {
1637 print
'<td class="right">'.$objp->remise_percent.
"%</td>\n";
1639 print
'<td> </td>';
1643 if (isModEnabled(
'margin') && !empty($conf->global->MARGIN_SHOW_ON_CONTRACT)) {
1644 print
'<td class="right nowraponall">'.price($objp->pa_ht).
'</td>';
1648 print
'<td class="nowraponall right">';
1649 if ($user->rights->contrat->creer && is_array($arrayothercontracts) && count($arrayothercontracts) && ($object->statut >= 0)) {
1650 print
'<!-- link to move service line into another contract -->';
1651 print
'<a class="reposition marginrightonly" style="padding-left: 5px;" href="'.$_SERVER[
'PHP_SELF'].
'?id='.$object->id.
'&action=move&token='.newToken().
'&rowid='.$objp->rowid.
'">';
1652 print
img_picto($langs->trans(
"MoveToAnotherContract"),
'uparrow');
1655 if ($user->rights->contrat->creer && ($object->statut >= 0)) {
1656 print
'<a class="reposition marginrightonly editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?id='.$object->id.
'&action=editline&token='.newToken().
'&rowid='.$objp->rowid.
'">';
1660 if ($user->rights->contrat->creer && ($object->statut >= 0)) {
1661 print
'<a class="reposition marginrightonly" href="'.$_SERVER[
'PHP_SELF'].
'?id='.$object->id.
'&action=deleteline&token='.newToken().
'&rowid='.$objp->rowid.
'">';
1673 if (isModEnabled(
'margin') && !empty($conf->global->MARGIN_SHOW_ON_CONTRACT)) {
1678 if ($objp->subprice >= 0) {
1679 print
'<tr class="oddeven" '.$moreparam.
'>';
1680 print
'<td colspan="'.$colspan.
'">';
1683 print $langs->trans(
"DateStartPlanned").
': ';
1684 if ($objp->date_start) {
1687 if ($objp->statut == 0 && $db->jdate($objp->date_start) < ($now - $conf->contrat->services->inactifs->warning_delay)) {
1688 $warning_delay = $conf->contrat->services->inactifs->warning_delay / 3600 / 24;
1689 $textlate = $langs->trans(
"Late").
' = '.$langs->trans(
"DateReference").
' > '.$langs->trans(
"DateToday").
' '.(ceil($warning_delay) >= 0 ?
'+' :
'').ceil($warning_delay).
' '.$langs->trans(
"days");
1690 print
" ".img_warning($textlate);
1693 print $langs->trans(
"Unknown");
1695 print
' - ';
1696 print $langs->trans(
"DateEndPlanned").
': ';
1697 if ($objp->date_end) {
1699 if ($objp->statut == 4 && $db->jdate($objp->date_end) < ($now - $conf->contrat->services->expires->warning_delay)) {
1700 $warning_delay = $conf->contrat->services->expires->warning_delay / 3600 / 24;
1701 $textlate = $langs->trans(
"Late").
' = '.$langs->trans(
"DateReference").
' > '.$langs->trans(
"DateToday").
' '.(ceil($warning_delay) >= 0 ?
'+' :
'').ceil($warning_delay).
' '.$langs->trans(
"days");
1702 print
" ".img_warning($textlate);
1705 print $langs->trans(
"Unknown");
1713 if (is_array($extralabelslines) && count($extralabelslines) > 0) {
1715 $line->id = $objp->rowid;
1716 $line->fetch_optionals();
1717 print $line->showOptionals($extrafields,
'view', array(
'class'=>
'oddeven',
'style'=>$moreparam,
'colspan'=>$colspan,
'tdclass' =>
'notitlefieldcreate'),
'',
'', 1);
1722 print
'<tr class="oddeven">';
1724 if ($objp->fk_product > 0) {
1725 $canchangeproduct = 1;
1726 if (empty($canchangeproduct)) {
1727 $productstatic->id = $objp->fk_product;
1728 $productstatic->type = $objp->ptype;
1729 $productstatic->ref = $objp->pref;
1730 $productstatic->entity = $objp->pentity;
1731 print $productstatic->getNomUrl(1,
'', 32);
1732 print $objp->label ?
' - '.dol_trunc($objp->label, 32) :
'';
1733 print
'<input type="hidden" name="idprod" value="'.(!empty($object->lines[$cursorline - 1]->fk_product) ? $object->lines[$cursorline - 1]->fk_product : 0).
'">';
1735 $senderissupplier = 0;
1736 if (empty($senderissupplier)) {
1737 print $form->select_produits((!empty($object->lines[$cursorline - 1]->fk_product) ? $object->lines[$cursorline - 1]->fk_product : 0),
'idprod');
1739 $form->select_produits_fournisseurs((!empty($object->lines[$cursorline - 1]->fk_product) ? $object->lines[$cursorline - 1]->fk_product : 0),
'idprod');
1744 print $objp->label ? $objp->label.
'<br>' :
'';
1745 print
'<input type="hidden" name="idprod" value="'.(!empty($object->lines[$cursorline - 1]->fk_product) ? $object->lines[$cursorline - 1]->fk_product : 0).
'">';
1749 require_once DOL_DOCUMENT_ROOT.
'/core/class/doleditor.class.php';
1751 if (!empty($conf->global->MAIN_INPUT_DESC_HEIGHT)) {
1752 $nbrows = $conf->global->MAIN_INPUT_DESC_HEIGHT;
1754 $enable = (isset($conf->global->FCKEDITOR_ENABLE_DETAILS) ? $conf->global->FCKEDITOR_ENABLE_DETAILS : 0);
1755 $doleditor =
new DolEditor(
'product_desc', $objp->description,
'', 92,
'dolibarr_details',
'',
false,
true, $enable, $nbrows,
'90%');
1756 $doleditor->Create();
1761 print
'<td class="right">';
1762 print $form->load_tva(
"eltva_tx", $objp->tva_tx.($objp->vat_src_code ? (
' ('.$objp->vat_src_code.
')') :
''), $mysoc, $object->thirdparty, $objp->fk_product, $objp->info_bits, $objp->product_type, 0, 1);
1766 print
'<td class="right"><input size="5" type="text" name="elprice" value="'.price($objp->subprice).
'"></td>';
1774 print
'<td class="center"><input size="2" type="text" name="elqty" value="'.$objp->qty.
'"></td>';
1778 print
'<td class="left">';
1779 print $form->selectUnits($objp->fk_unit,
"unit");
1784 print
'<td class="nowrap right"><input size="1" type="text" name="elremise_percent" value="'.$objp->remise_percent.
'">%</td>';
1786 if (!empty($usemargins)) {
1787 print
'<td class="right">';
1788 if ($objp->fk_product) {
1789 print
'<select id="fournprice" name="fournprice"></select>';
1791 print
'<input id="buying_price" type="text" size="5" name="buying_price" value="'.price($objp->pa_ht, 0,
'', 0).
'"></td>';
1793 print
'<td class="center">';
1794 print
'<input type="submit" class="button margintoponly marginbottomonly" name="save" value="'.$langs->trans(
"Modify").
'">';
1795 print
'<br><input type="submit" class="button margintoponly marginbottomonly button-cancel" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
1800 if (isModEnabled(
'margin') && !empty($conf->global->MARGIN_SHOW_ON_CONTRACT)) {
1808 print
'<tr class="oddeven">';
1809 print
'<td colspan="'.$colspan.
'">';
1810 print $langs->trans(
"DateStartPlanned").
' ';
1811 print $form->selectDate($db->jdate($objp->date_start),
"date_start_update", $usehm, $usehm, ($db->jdate($objp->date_start) > 0 ? 0 : 1),
"update");
1812 print
' '.$langs->trans(
"DateEndPlanned").
' ';
1813 print $form->selectDate($db->jdate($objp->date_end),
"date_end_update", $usehm, $usehm, ($db->jdate($objp->date_end) > 0 ? 0 : 1),
"update");
1817 if (is_array($extralabelslines) && count($extralabelslines) > 0) {
1819 $line->id = $objp->rowid;
1820 $line->fetch_optionals();
1821 print $line->showOptionals($extrafields,
'edit', array(
'style'=>
'class="oddeven"',
'colspan'=>$colspan,
'tdclass' =>
'notitlefieldcreate'),
'',
'', 1);
1830 if ($object->statut > 0) {
1832 if (!empty($conf->global->CONTRACT_HIDE_CLOSED_SERVICES_BY_DEFAULT) && $object->lines[$cursorline - 1]->statut == ContratLigne::STATUS_CLOSED && $action !=
'showclosedlines') {
1833 $moreparam =
'style="display: none;"';
1844 print
'<tr class="oddeven" '.$moreparam.
'>';
1845 print
'<td class="tdhrthin" colspan="'.$colspan.
'"><hr class="opacitymedium tdhrthin"></td>';
1858 if ($action ==
'deleteline' && !$_REQUEST[
"cancel"] && $user->hasRight(
'contrat',
'creer') && $object->lines[$cursorline - 1]->id ==
GETPOST(
'rowid')) {
1859 print $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$object->id.
"&lineid=".
GETPOST(
'rowid'), $langs->trans(
"DeleteContractLine"), $langs->trans(
"ConfirmDeleteContractLine"),
"confirm_deleteline",
'', 0, 1);
1860 if ($ret ==
'html') {
1861 print
'<table class="notopnoleftnoright" width="100%"><tr class="oddeven" height="6"><td></td></tr></table>';
1868 if ($action ==
'move' && !$_REQUEST[
"cancel"] && $user->hasRight(
'contrat',
'creer') && $object->lines[$cursorline - 1]->id ==
GETPOST(
'rowid')) {
1869 $arraycontractid = array();
1870 foreach ($arrayothercontracts as $contractcursor) {
1871 $arraycontractid[$contractcursor->id] = $contractcursor->ref;
1875 $formquestion = array(
1876 'text' => $langs->trans(
"ConfirmMoveToAnotherContractQuestion"),
1877 array(
'type' =>
'select',
'name' =>
'newcid',
'values' => $arraycontractid));
1879 print $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$object->id.
"&lineid=".
GETPOST(
'rowid',
'int'), $langs->trans(
"MoveToAnotherContract"), $langs->trans(
"ConfirmMoveToAnotherContract"),
"confirm_move", $formquestion);
1880 print
'<table class="notopnoleftnoright" width="100%"><tr class="oddeven" height="6"><td></td></tr></table>';
1884 if ($object->statut > 0) {
1885 print
'<table class="notopnoleftnoright tableforservicepart2'.($cursorline < $nbofservices ?
' boxtablenobottom' :
'').
' centpercent">';
1887 print
'<tr class="oddeven" '.$moreparam.
'>';
1888 print
'<td><span class="valignmiddle hideonsmartphone">'.$langs->trans(
"ServiceStatus").
':</span> '.$object->lines[$cursorline - 1]->getLibStatut(4).
'</td>';
1889 print
'<td width="30" class="right">';
1890 if ($user->socid == 0) {
1891 if ($object->statut > 0 && $action !=
'activateline' && $action !=
'unactivateline') {
1892 $tmpaction =
'activateline';
1893 $tmpactionpicto =
'play';
1894 $tmpactiontext = $langs->trans(
"Activate");
1895 if ($objp->statut == 4) {
1896 $tmpaction =
'unactivateline';
1897 $tmpactionpicto =
'playstop';
1898 $tmpactiontext = $langs->trans(
"Disable");
1900 if (($tmpaction ==
'activateline' && $user->rights->contrat->activer) || ($tmpaction ==
'unactivateline' && $user->rights->contrat->desactiver)) {
1901 print
'<a class="reposition" href="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&ligne='.$object->lines[$cursorline - 1]->id.
'&action='.$tmpaction.
'">';
1902 print
img_picto($tmpactiontext, $tmpactionpicto);
1910 print
'<tr class="oddeven" '.$moreparam.
'>';
1914 if (!$objp->date_start_real) {
1915 print $langs->trans(
"DateStartReal").
': ';
1916 if ($objp->date_start_real) {
1919 print $langs->trans(
"ContractStatusNotRunning");
1923 if ($objp->date_start_real && !$objp->date_end_real) {
1924 print $langs->trans(
"DateStartReal").
': ';
1928 if ($objp->date_start_real && $objp->date_end_real) {
1929 print $langs->trans(
"DateStartReal").
': ';
1931 print
' - ';
1932 print $langs->trans(
"DateEndReal").
': ';
1935 if (!empty($objp->comment)) {
1936 print
" - ".$objp->comment;
1940 print
'<td class="center"> </td>';
1947 if ($user->rights->contrat->activer && $action ==
'activateline' && $object->lines[$cursorline - 1]->id ==
GETPOST(
'ligne',
'int')) {
1948 print
'<form name="active" action="'.$_SERVER[
"PHP_SELF"].
'" method="POST">';
1949 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1950 print
'<input type="hidden" name="action" value="confirm_active">';
1951 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
1952 print
'<input type="hidden" name="id" value="'.$object->id.
'">';
1953 print
'<input type="hidden" name="ligne" value="'.GETPOST(
'ligne',
'int').
'">';
1954 print
'<input type="hidden" name="confirm" value="yes">';
1956 print
'<table class="noborder tableforservicepart2'.($cursorline < $nbofservices ?
' boxtablenobottom' :
'').
' centpercent">';
1959 $dateactstart = $objp->date_start;
1962 } elseif (!$dateactstart) {
1963 $dateactstart = time();
1966 $dateactend = $objp->date_end;
1969 } elseif (!$dateactend) {
1970 if ($objp->fk_product > 0) {
1972 $product->fetch($objp->fk_product);
1973 if (!empty($product->duration_value) && !empty($product->duration_unit)) {
1974 $dateactend =
dol_time_plus_duree(time(), $product->duration_value, $product->duration_unit);
1979 print
'<tr class="oddeven">';
1980 print
'<td class="nohover">'.$langs->trans(
"DateServiceActivate").
'</td><td class="nohover">';
1981 print $form->selectDate($dateactstart,
'start', $usehm, $usehm,
'',
"active", 1, 0);
1983 print
'<td class="nohover">'.$langs->trans(
"DateEndPlanned").
'</td><td class="nohover">';
1984 print $form->selectDate($dateactend,
"end", $usehm, $usehm,
'',
"active", 1, 0);
1986 print
'<td class="center nohover">';
1991 print
'<tr class="oddeven">';
1992 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>';
1993 print
'<td class="nohover right">';
1994 print
'<input type="submit" class="button" name="activate" value="'.$langs->trans(
"Activate").
'"> ';
1995 print
'<input type="submit" class="button button-cancel" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
2004 if ($user->rights->contrat->activer && $action ==
'unactivateline' && $object->lines[$cursorline - 1]->id ==
GETPOST(
'ligne',
'int')) {
2008 print
'<!-- Form to disabled a line -->'.
"\n";
2009 print
'<form name="confirm_closeline" action="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&ligne='.$object->lines[$cursorline - 1]->id.
'" method="post">';
2010 print
'<input type="hidden" name="token" value="'.newToken().
'">';
2011 print
'<input type="hidden" name="confirm" value="yes">';
2012 print
'<input type="hidden" name="action" value="confirm_closeline">';
2013 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
2015 print
'<table class="noborder tableforservicepart2'.($cursorline < $nbofservices ?
' boxtablenobottom' :
'').
' centpercent">';
2018 $dateactstart = $objp->date_start_real;
2021 } elseif (!$dateactstart) {
2022 $dateactstart = time();
2025 $dateactend = $objp->date_end_real;
2028 } elseif (!$dateactend) {
2029 if ($objp->fk_product > 0) {
2031 $product->fetch($objp->fk_product);
2032 $dateactend =
dol_time_plus_duree(time(), $product->duration_value, $product->duration_unit);
2036 if ($dateactend > $now) {
2040 print
'<tr class="oddeven"><td colspan="2" class="nohover">';
2041 if ($objp->statut >= 4) {
2042 if ($objp->statut == 4) {
2043 print $langs->trans(
"DateEndReal").
' ';
2044 print $form->selectDate($dateactend,
"end", $usehm, $usehm, ($objp->date_end_real > 0 ? 0 : 1),
"closeline", 1, 1);
2048 print
'<td class="center nohover">';
2051 print
'<tr class="oddeven">';
2052 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>';
2053 print
'<td class="nohover right">';
2054 print
'<input type="submit" class="button" name="close" value="'.$langs->trans(
"Disable").
'"> ';
2055 print
'<input type="submit" class="button button-cancel" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
2069 if ($user->hasRight(
'contrat',
'creer') && ($object->statut == 0)) {
2073 print
' <form name="addproduct" id="addproduct" action="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.(($action !=
'editline') ?
'' :
'#line_'.
GETPOST(
'lineid',
'int')).
'" method="POST">
2074 <input type="hidden" name="token" value="'.newToken().
'">
2075 <input type="hidden" name="action" value="'.(($action !=
'editline') ?
'addline' :
'updateline').
'">
2076 <input type="hidden" name="mode" value="">
2077 <input type="hidden" name="id" value="'.$object->id.
'">
2078 <input type="hidden" name="page_y" value="">
2079 <input type="hidden" name="backtopage" value="'.$backtopage.
'">
2082 print
'<div class="div-table-responsive-no-min">';
2083 print
'<table id="tablelines" class="noborder noshadow" width="100%">';
2086 if ($action !=
'editline') {
2087 $forcetoshowtitlelines = 1;
2088 if (empty($object->multicurrency_code)) {
2089 $object->multicurrency_code = $conf->currency;
2094 $parameters = array();
2095 $reshook = $hookmanager->executeHooks(
'formAddObjectLine', $parameters, $object, $action);
2096 if ($reshook < 0)
setEventMessages($hookmanager->error, $hookmanager->errors,
'errors');
2097 if (empty($reshook))
2098 $object->formAddObjectLine(1, $mysoc, $soc);
2109 if (
GETPOST(
'modelselected')) {
2110 $action =
'presend';
2116 if ($user->socid == 0 && $action !=
'presend' && $action !=
'editline') {
2117 print
'<div class="tabsAction">';
2119 $parameters = array();
2120 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters, $object, $action);
2122 if (empty($reshook)) {
2126 'class' =>
'classfortooltip'
2131 if (empty($user->socid)) {
2132 if ($object->statut == 1) {
2133 if ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) || $user->hasRight(
'contrat',
'creer'))) {
2134 print
dolGetButtonAction(
'', $langs->trans(
'SendMail'),
'default', $_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=presend&token='.newToken().
'&mode=init#formmailbeforetitle',
'',
true, $params);
2136 print
dolGetButtonAction(
'', $langs->trans(
'SendMail'),
'default',
'#',
'',
false, $params);
2141 if ($object->statut == 0 && $nbofservices) {
2142 if ($user->hasRight(
'contrat',
'creer')) {
2143 print
dolGetButtonAction($langs->trans(
'Validate'),
'',
'default', $_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=valid&token='.newToken(),
'',
true, $params);
2145 $params[
'attr'][
'title'] = $langs->trans(
"NotEnoughPermissions");
2146 print
dolGetButtonAction($langs->trans(
'Validate'),
'',
'default',
'#',
'',
false, $params);
2149 if ($object->statut == 1) {
2150 if ($user->hasRight(
'contrat',
'creer')) {
2151 print
dolGetButtonAction($langs->trans(
'Modify'),
'',
'default', $_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=reopen&token='.newToken(),
'',
true, $params);
2153 $params[
'attr'][
'title'] = $langs->trans(
"NotEnoughPermissions");
2154 print
dolGetButtonAction($langs->trans(
'Modify'),
'',
'default',
'#',
'',
false, $params);
2158 if (isModEnabled(
'commande') && $object->statut > 0 && $object->nbofservicesclosed < $nbofservices) {
2159 $langs->load(
"orders");
2160 if ($user->hasRight(
'commande',
'creer')) {
2161 print
dolGetButtonAction($langs->trans(
'CreateOrder'),
'',
'default', DOL_URL_ROOT.
'/commande/card.php?action=create&token='.newToken().
'&origin='.$object->element.
'&originid='.$object->id.
'&socid='.$object->thirdparty->id,
'',
true, $params);
2163 $params[
'attr'][
'title'] = $langs->trans(
"NotEnoughPermissions");
2164 print
dolGetButtonAction($langs->trans(
'CreateOrder'),
'',
'default',
'#',
'',
false, $params);
2168 if (isModEnabled(
'facture') && $object->statut > 0) {
2169 $langs->load(
"bills");
2170 if ($user->hasRight(
'facture',
'creer')) {
2171 print
dolGetButtonAction($langs->trans(
'CreateBill'),
'',
'default', DOL_URL_ROOT.
'/compta/facture/card.php?action=create&origin='.$object->element.
'&originid='.$object->id.
'&socid='.$object->thirdparty->id,
'',
true, $params);
2173 $params[
'attr'][
'title'] = $langs->trans(
"NotEnoughPermissions");
2174 print
dolGetButtonAction($langs->trans(
'CreateBill'),
'',
'default',
'#',
'',
false, $params);
2178 if ($object->nbofservicesclosed > 0 || $object->nbofserviceswait > 0) {
2179 if ($user->rights->contrat->activer) {
2180 print
dolGetButtonAction($langs->trans(
'ActivateAllContracts'),
'',
'default', $_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=activate&token='.newToken(),
'',
true, $params);
2182 print
dolGetButtonAction($langs->trans(
'ActivateAllContracts'),
'',
'default',
'#',
'',
false, $params);
2185 if ($object->nbofservicesclosed < $nbofservices) {
2186 if ($user->rights->contrat->desactiver) {
2187 print
dolGetButtonAction($langs->trans(
'CloseAllContracts'),
'',
'default', $_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=close&token='.newToken(),
'',
true, $params);
2189 print
dolGetButtonAction($langs->trans(
'CloseAllContracts'),
'',
'default',
'#',
'',
false, $params);
2201 if (!empty($conf->global->CONTRACT_HIDE_CLOSED_SERVICES_BY_DEFAULT) && $object->nbofservicesclosed > 0) {
2202 if ($action ==
'showclosedlines') {
2203 print
'<div class="inline-block divButAction"><a class="butAction" id="btnhideclosedlines" href="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=hideclosedlines">'.$langs->trans(
"HideClosedServices").
'</a></div>';
2205 print
'<div class="inline-block divButAction"><a class="butAction" id="btnshowclosedlines" href="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=showclosedlines">'.$langs->trans(
"ShowClosedServices").
'</a></div>';
2210 if ($user->hasRight(
'contrat',
'creer')) {
2211 print
dolGetButtonAction($langs->trans(
'ToClone'),
'',
'default', $_SERVER[
'PHP_SELF'].
'?id='.$object->id.
'&socid='.$object->socid.
'&action=clone&token='.newToken(),
'',
true, $params);
2215 print
dolGetButtonAction($langs->trans(
'Delete'),
'',
'delete', $_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=delete&token='.newToken(),
'', $permissiontodelete, $params);
2221 if ($action !=
'presend') {
2222 print
'<div class="fichecenter"><div class="fichehalfleft">';
2228 $filedir = $conf->contrat->multidir_output[$object->entity].
"/".
dol_sanitizeFileName($object->ref);
2229 $urlsource = $_SERVER[
"PHP_SELF"].
"?id=".$object->id;
2230 $genallowed = $user->hasRight(
'contrat',
'lire');
2231 $delallowed = $user->hasRight(
'contrat',
'creer');
2234 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);
2238 $linktoelem = $form->showLinkToObjectBlock($object,
null, array(
'contrat'));
2239 $somethingshown = $form->showLinkedObjectBlock($object, $linktoelem);
2242 if ($object->statut != Contrat::STATUS_DRAFT &&
getDolGlobalString(
'CONTRACT_ALLOW_ONLINESIGN')) {
2243 print
'<br><!-- Link to sign -->';
2244 require_once DOL_DOCUMENT_ROOT.
'/core/lib/signature.lib.php';
2246 print showOnlineSignatureUrl(
'contract', $object->ref, $object).
'<br>';
2249 print
'</div><div class="fichehalfright">';
2253 $morehtmlcenter =
dolGetButtonTitle($langs->trans(
'SeeAll'),
'',
'fa fa-bars imgforviewmode', DOL_URL_ROOT.
'/contrat/agenda.php?id='.$object->id);
2257 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
2259 $somethingshown =
$formactions->showactions($object,
'contract', $socid, 1,
'listactions', $MAXEVENT,
'', $morehtmlcenter);
2261 print
'</div></div>';
2265 $modelmail =
'contract';
2266 $defaulttopic =
'SendContractRef';
2267 $diroutput = $conf->contrat->multidir_output[$object->entity];
2268 $trackid =
'con'.$object->id;
2270 include DOL_DOCUMENT_ROOT.
'/core/tpl/card_presend.tpl.php';
2281if (isModEnabled(
'margin') && $action ==
'editline') {
2284<script
type=
"text/javascript">
2285$(document).ready(
function() {
2286 var idprod = $(
"input[name='idprod']").val();
2287 var fournprice = $(
"input[name='fournprice']").val();
2288 var token =
'<?php echo currentToken(); ?>';
2290 $.post(
'<?php echo DOL_URL_ROOT; ?>/fourn/ajax/getSupplierPrices.php', {
2294 if (data.length > 0) {
2297 $(data).each(
function() {
2298 options +=
'<option value="'+this.
id+
'" price="'+this.
price+
'"';
2299 if (fournprice > 0) {
2300 if (this.
id == fournprice) {
2301 options +=
' selected';
2302 $(
"#buying_price").val(this.price);
2306 options +=
'>'+this.label+
'</option>';
2308 options +=
'<option value=null'+(trouve?
'':
' selected')+
'><?php echo $langs->trans("InputPrice"); ?></option>';
2309 $(
"#fournprice").html(options);
2311 $(
"#buying_price").hide();
2312 $(
"#fournprice").show();
2315 $(
"#buying_price").show();
2317 $(
"#fournprice").change(
function() {
2318 var selval = $(
this).find(
'option:selected').attr(
"price");
2320 $(
"#buying_price").val(selval).hide();
2322 $(
'#buying_price').show();
2326 $(
"#fournprice").hide();
2327 $(
'#buying_price').show();
2333 $(
"#fournprice").hide();
2334 $(
'#buying_price').show();
if(preg_match('/set_([a-z0-9_\-]+)/i', $action, $reg)) if(preg_match('/del_([a-z0-9_\-]+)/i', $action, $reg)) if($action=='set') elseif( $action=='specimen') elseif($action=='setmodel') elseif( $action=='del') elseif($action=='setdoc') $formactions
View.
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader()
Empty header.
Class to manage contracts.
Class to manage lines of contracts.
Class to manage a WYSIWYG editor.
Class to manage products or services.
File of class to manage predefined price products or services by customer.
Class to manage projects.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage translations.
Class to manage Dolibarr users.
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.
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.
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed informations (by default a local PHP server timestamp) Re...
vatrate($rate, $addpercent=false, $info_bits=0, $usestarfornpr=0, $html=0)
Return a string with VAT rate label formated for view output Used into pdf and HTML pages.
load_fiche_titre($titre, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
img_delete($titlealt='default', $other='class="pictodelete"', $morecss='')
Show delete logo.
GETPOSTINT($paramname, $method=0)
Return value of a param into GET or POST supervariable.
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...
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.
dol_strlen($string, $stringencoding='UTF-8')
Make a strlen call.
img_down($titlealt='default', $selected=0, $moreclass='')
Show down arrow logo.
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.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs='', $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return dolibarr global constant int value.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
if(!function_exists( 'dol_getprefix')) dol_include_once($relpath, $classname='')
Make an include_once using default root and alternate root if it fails.
dol_clone($object, $native=0)
Create a clone of instance of object (new instance with same value for each properties) With native =...
dolGetButtonAction($label, $text='', $actionType='default', $url='', $id='', $userRight=1, $params=array())
Function dolGetButtonAction.
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...
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.
get_localtax($vatrate, $local, $thirdparty_buyer="", $thirdparty_seller="", $vatnpr=0)
Return localtax rate for a particular vat, when selling a product with vat $vatrate,...
dol_sanitizeFileName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a file name.
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 dolibarr global constant string value.
img_edit($titlealt='default', $float=0, $other='')
Show logo editer/modifier fiche.
img_up($titlealt='default', $selected=0, $moreclass='')
Show top arrow logo.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
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...
if(preg_match('/crypted:/i', $dolibarr_main_db_pass)||!empty($dolibarr_main_db_encrypted_pass)) $conf db type
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.