36require
"../main.inc.php";
37require_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
38require_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
39require_once DOL_DOCUMENT_ROOT.
'/core/lib/contract.lib.php';
40require_once DOL_DOCUMENT_ROOT.
'/contrat/class/contrat.class.php';
41require_once DOL_DOCUMENT_ROOT.
'/core/modules/contract/modules_contract.php';
42require_once DOL_DOCUMENT_ROOT.
'/core/class/doleditor.class.php';
43require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formfile.class.php';
44require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
45require_once DOL_DOCUMENT_ROOT.
'/compta/facture/class/facture.class.php';
46require_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.facture.class.php';
47if (isModEnabled(
"propal")) {
48 require_once DOL_DOCUMENT_ROOT.
'/comm/propal/class/propal.class.php';
50if (isModEnabled(
'project')) {
51 require_once DOL_DOCUMENT_ROOT.
'/projet/class/project.class.php';
52 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formprojet.class.php';
54require_once DOL_DOCUMENT_ROOT.
'/core/class/extrafields.class.php';
57$langs->loadLangs(array(
"contracts",
"orders",
"companies",
"bills",
"products",
'compta'));
59$action =
GETPOST(
'action',
'aZ09');
60$confirm =
GETPOST(
'confirm',
'alpha');
61$cancel =
GETPOST(
'cancel',
'alpha');
62$backtopage =
GETPOST(
'backtopage',
'alpha');
64$socid =
GETPOST(
'socid',
'int');
67$origin =
GETPOST(
'origin',
'alpha');
68$originid =
GETPOST(
'originid',
'int');
77$usehm = (
getDolGlobalString(
'MAIN_USE_HOURMIN_IN_DATE_RANGE') ? $conf->global->MAIN_USE_HOURMIN_IN_DATE_RANGE : 0);
81 $socid = $user->socid;
85$hookmanager->initHooks(array(
'contractcard',
'globalcard'));
91if ($id > 0 || !empty($ref) && $action !=
'add') {
92 $ret = $object->fetch($id, $ref);
94 $ret = $object->fetch_thirdparty();
102$extrafields->fetch_name_optionals_label($object->table_element);
105$extralabelslines = $extrafields->fetch_name_optionals_label($object->table_element_line);
107$permissionnote = $user->hasRight(
'contrat',
'creer');
108$permissiondellink = $user->hasRight(
'contrat',
'creer');
109$permissiontodelete = ($user->hasRight(
'contrat',
'creer') && $object->statut == $object::STATUS_DRAFT) || $user->hasRight(
'contrat',
'supprimer');
110$permissiontoadd = $user->hasRight(
'contrat',
'creer');
111$permissiontoedit = $permissiontoadd;
112$permissiontoactivate = $user->hasRight(
'contrat',
'activer');
122$parameters = array(
'socid' => $socid);
123$reshook = $hookmanager->executeHooks(
'doActions', $parameters, $object, $action);
127if (empty($reshook)) {
128 $backurlforlist = DOL_URL_ROOT.
'/contrat/list.php';
130 if (empty($backtopage) || ($cancel && empty($id))) {
131 if (empty($backtopage) || ($cancel && strpos($backtopage,
'__ID__'))) {
132 if (empty($id) && (($action !=
'add' && $action !=
'create') || $cancel)) {
133 $backtopage = $backurlforlist;
135 $backtopage = DOL_URL_ROOT.
'/contrat/card.php?id='.((!empty($id) && $id > 0) ? $id :
'__ID__');
141 if (!empty($backtopageforcancel)) {
142 header(
"Location: ".$backtopageforcancel);
144 } elseif (!empty($backtopage)) {
145 header(
"Location: ".$backtopage);
151 include DOL_DOCUMENT_ROOT.
'/core/actions_setnotes.inc.php';
153 include DOL_DOCUMENT_ROOT.
'/core/actions_dellink.inc.php';
155 include DOL_DOCUMENT_ROOT.
'/core/actions_lineupdown.inc.php';
157 if ($action ==
'confirm_active' && $confirm ==
'yes' && $permissiontoactivate) {
167 $result = $object->active_line($user,
GETPOST(
'ligne',
'int'), $date_start, $date_end,
GETPOST(
'comment'));
170 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$object->id);
175 } elseif ($action ==
'confirm_closeline' && $confirm ==
'yes' && $permissiontoactivate) {
182 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"DateEnd")),
null,
'errors');
185 $result = $object->close_line($user,
GETPOST(
'ligne',
'int'), $date_end, urldecode(
GETPOST(
'comment')));
187 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$object->id);
195 if (
GETPOST(
'mode') ==
'predefined') {
207 $date_start_update =
'';
208 $date_end_update =
'';
209 $date_start_real_update =
'';
210 $date_end_real_update =
'';
211 if (
GETPOST(
'date_start_updatemonth') &&
GETPOST(
'date_start_updateday') &&
GETPOST(
'date_start_updateyear')) {
214 if (
GETPOST(
'date_end_updatemonth') &&
GETPOST(
'date_end_updateday') &&
GETPOST(
'date_end_updateyear')) {
217 if (
GETPOST(
'date_start_real_updatemonth') &&
GETPOST(
'date_start_real_updateday') &&
GETPOST(
'date_start_real_updateyear')) {
218 $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'));
220 if (
GETPOST(
'date_end_real_updatemonth') &&
GETPOST(
'date_end_real_updateday') &&
GETPOST(
'date_end_real_updateyear')) {
221 $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'));
228 if ($action ==
'add' && $user->hasRight(
'contrat',
'creer')) {
230 if (empty($datecontrat)) {
232 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Date")),
null,
'errors');
237 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"ThirdParty")),
null,
'errors');
243 $ret = $extrafields->setOptionalsFromPost(
null, $object);
250 $object->socid = $socid;
251 $object->date_contrat = $datecontrat;
253 $object->commercial_suivi_id =
GETPOST(
'commercial_suivi_id',
'int');
254 $object->commercial_signature_id =
GETPOST(
'commercial_signature_id',
'int');
256 $object->note_private =
GETPOST(
'note_private',
'alpha');
257 $object->note_public =
GETPOST(
'note_public',
'alpha');
258 $object->fk_project =
GETPOST(
'projectid',
'int');
260 $object->ref =
GETPOST(
'ref',
'alpha');
261 $object->ref_customer =
GETPOST(
'ref_customer',
'alpha');
262 $object->ref_supplier =
GETPOST(
'ref_supplier',
'alpha');
265 if (!empty($origin) && !empty($originid)) {
267 $element = $subelement = $origin;
268 if (preg_match(
'/^([^_]+)_([^_]+)/i', $origin, $regs)) {
270 $subelement = $regs[2];
274 if ($element ==
'order') {
275 $element = $subelement =
'commande';
277 if ($element ==
'propal') {
278 $element =
'comm/propal';
279 $subelement =
'propal';
281 if ($element ==
'invoice' || $element ==
'facture') {
282 $element =
'compta/facture';
283 $subelement =
'facture';
286 $object->origin = $origin;
287 $object->origin_id = $originid;
290 $object->linked_objects[$object->origin] = $object->origin_id;
291 if (is_array($_POST[
'other_linked_objects']) && !empty($_POST[
'other_linked_objects'])) {
292 $object->linked_objects = array_merge($object->linked_objects, $_POST[
'other_linked_objects']);
295 $id = $object->create($user);
299 $classname = ucfirst($subelement);
300 $srcobject =
new $classname($db);
302 dol_syslog(
"Try to find source object origin=".$object->origin.
" originid=".$object->origin_id.
" to add lines");
303 $result = $srcobject->fetch($object->origin_id);
305 $srcobject->fetch_thirdparty();
306 $lines = $srcobject->lines;
307 if (empty($lines) && method_exists($srcobject,
'fetch_lines')) {
308 $srcobject->fetch_lines();
309 $lines = $srcobject->lines;
313 $num = count($lines);
315 for ($i = 0; $i < $num; $i++) {
316 $product_type = ($lines[$i]->product_type ? $lines[$i]->product_type : 0);
318 if ($product_type == 1 || (
getDolGlobalString(
'CONTRACT_SUPPORT_PRODUCTS') && in_array($product_type, array(0, 1)))) {
320 if ($lines[$i]->fk_product > 0) {
321 $product_static =
new Product($db);
326 $prod->id = $lines[$i]->fk_product;
327 $prod->getMultiLangs();
329 $outputlangs = $langs;
331 if (empty($newlang) &&
GETPOST(
'lang_id',
'aZ09')) {
332 $newlang =
GETPOST(
'lang_id',
'aZ09');
334 if (empty($newlang)) {
335 $newlang = $srcobject->thirdparty->default_lang;
337 if (!empty($newlang)) {
339 $outputlangs->setDefaultLang($newlang);
342 $label = (!empty($prod->multilangs[$outputlangs->defaultlang][
"libelle"])) ? $prod->multilangs[$outputlangs->defaultlang][
"libelle"] : $lines[$i]->product_label;
344 $label = $lines[$i]->product_label;
346 $desc = ($lines[$i]->desc && $lines[$i]->desc != $lines[$i]->label) ?
dol_htmlentitiesbr($lines[$i]->desc) :
'';
352 $array_options = array();
354 if (method_exists($lines[$i],
'fetch_optionals')) {
355 $lines[$i]->fetch_optionals();
356 $array_options = $lines[$i]->array_options;
359 $txtva = $lines[$i]->vat_src_code ? $lines[$i]->tva_tx.
' ('.$lines[$i]->vat_src_code.
')' : $lines[$i]->tva_tx;
362 $localtax1_tx =
get_localtax($txtva, 1, $object->thirdparty);
363 $localtax2_tx =
get_localtax($txtva, 2, $object->thirdparty);
365 $result = $object->addline(
367 $lines[$i]->subprice,
372 $lines[$i]->fk_product,
373 $lines[$i]->remise_percent,
374 $lines[$i]->date_start,
375 $lines[$i]->date_end,
378 $lines[$i]->info_bits,
379 $lines[$i]->fk_fournprice,
398 $parameters = array(
'objFrom' => $srcobject);
399 $reshook = $hookmanager->executeHooks(
'createFrom', $parameters, $object, $action);
413 $result = $object->create($user);
415 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$object->id);
423 } elseif ($action ==
'classin' && $user->hasRight(
'contrat',
'creer')) {
424 $object->setProject(
GETPOST(
'projectid'));
425 } elseif ($action ==
'addline' && $user->hasRight(
'contrat',
'creer')) {
429 $product_desc = (GETPOSTISSET(
'dp_desc') ?
GETPOST(
'dp_desc',
'restricthtml') :
'');
432 $price_ht_devise =
'';
434 $price_ttc_devise =
'';
436 $rang = count($object->lines) + 1;
438 if (
GETPOST(
'price_ht') !==
'') {
441 if (
GETPOST(
'multicurrency_price_ht') !==
'') {
444 if (
GETPOST(
'price_ttc') !==
'') {
447 if (
GETPOST(
'multicurrency_price_ttc') !==
'') {
451 if (
GETPOST(
'prod_entry_mode',
'alpha') ==
'free') {
454 $idprod =
GETPOST(
'idprod',
'int');
457 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"ProductOrService")),
null,
'errors');
462 $tva_tx =
GETPOST(
'tva_tx',
'alpha');
465 $remise_percent = (GETPOSTISSET(
'remise_percent'.$predef) ?
price2num(
GETPOST(
'remise_percent'.$predef),
'', 2) : 0);
466 if (empty($remise_percent)) {
471 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Qty")),
null,
'errors');
474 if (
GETPOST(
'prod_entry_mode',
'alpha') ==
'free' && (empty($idprod) || $idprod < 0) && empty($product_desc)) {
475 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Description")),
null,
'errors');
481 if (!empty($date_start) && !empty($date_end) && $date_start > $date_end) {
482 setEventMessages($langs->trans(
"Error").
': '.$langs->trans(
"DateStartPlanned").
' > '.$langs->trans(
"DateEndPlanned"),
null,
'errors');
487 $extralabelsline = $extrafields->fetch_name_optionals_label($object->table_element_line);
488 $array_options = $extrafields->getOptionalsFromPost($object->table_element_line, $predef);
490 if (is_array($extralabelsline)) {
492 foreach ($extralabelsline as $key => $value) {
493 unset($_POST[
"options_".$key]);
506 $prod->fetch($idprod);
515 $price_min = $prod->price_min;
516 $price_min_ttc = $prod->price_min_ttc;
520 $price_min = $prod->multiprices_min[$object->thirdparty->price_level];
521 $price_min_ttc = $prod->multiprices_min_ttc[$object->thirdparty->price_level];
524 require_once DOL_DOCUMENT_ROOT.
'/product/class/productcustomerprice.class.php';
528 $filter = array(
't.fk_product' => $prod->id,
't.fk_soc' => $object->thirdparty->id);
530 $result = $prodcustprice->fetchAll(
'',
'', 0, 0, $filter);
532 if (count($prodcustprice->lines) > 0) {
533 $price_min =
price($prodcustprice->lines[0]->price_min);
534 $price_min_ttc =
price($prodcustprice->lines[0]->price_min_ttc);
547 $tmpvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', $tva_tx));
548 $tmpprodvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', $prod->tva_tx));
551 if (!empty($price_ht) || $price_ht ===
'0') {
553 $pu_ttc =
price2num($pu_ht * (1 + ($tmpvat / 100)),
'MU');
554 $price_base_type =
'HT';
555 } elseif (!empty($price_ttc) || $price_ttc ===
'0') {
557 $pu_ht =
price2num($pu_ttc / (1 + ($tmpvat / 100)),
'MU');
558 $price_base_type =
'TTC';
561 $desc = $prod->description;
569 $desc = $product_desc;
574 $fk_unit = $prod->fk_unit;
578 $tva_npr = (preg_match(
'/\*/', $tva_tx) ? 1 : 0);
579 if (empty($tva_tx)) {
582 $tva_tx = str_replace(
'*',
'', $tva_tx);
583 $desc = $product_desc;
584 $fk_unit =
GETPOST(
'units',
'alpha');
585 $pu_ht_devise =
price2num($price_ht_devise,
'MU');
586 $pu_ttc_devise =
price2num($price_ttc_devise,
'MU');
588 $tmpvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', $tva_tx));
591 if (!empty($price_ht) || $price_ht ===
'0') {
593 $pu_ttc =
price2num($pu_ht * (1 + ((
float) $tmpvat / 100)),
'MU');
594 $price_base_type =
'HT';
595 } elseif (!empty($price_ttc) || $price_ttc ===
'0') {
597 $pu_ht =
price2num($pu_ttc / (1 + ((
float) $tmpvat / 100)),
'MU');
598 $price_base_type =
'TTC';
602 $localtax1_tx =
get_localtax($tva_tx, 1, $object->thirdparty, $mysoc, $tva_npr);
603 $localtax2_tx =
get_localtax($tva_tx, 2, $object->thirdparty, $mysoc, $tva_npr);
606 $fk_fournprice =
GETPOST(
'fournprice');
608 $pa_ht =
GETPOST(
'buying_price');
618 if (((
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && !$user->hasRight(
'produit',
'ignore_price_min_advance'))
620 $object->error = $langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, -1, $conf->currency));
624 $result = $object->addline(
649 $outputlangs = $langs;
652 $newlang =
GETPOST(
'lang_id',
'aZ09');
655 $newlang = $object->thirdparty->default_lang;
657 if (!empty($newlang)) {
659 $outputlangs->setDefaultLang($newlang);
662 $ret = $object->fetch($id);
664 $object->generateDocument($object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
667 unset($_POST[
'prod_entry_mode']);
669 unset($_POST[
'qty']);
670 unset($_POST[
'type']);
671 unset($_POST[
'remise_percent']);
672 unset($_POST[
'price_ht']);
673 unset($_POST[
'multicurrency_price_ht']);
674 unset($_POST[
'price_ttc']);
675 unset($_POST[
'tva_tx']);
676 unset($_POST[
'product_ref']);
677 unset($_POST[
'product_label']);
678 unset($_POST[
'product_desc']);
679 unset($_POST[
'fournprice']);
680 unset($_POST[
'buying_price']);
681 unset($_POST[
'np_marginRate']);
682 unset($_POST[
'np_markRate']);
683 unset($_POST[
'dp_desc']);
684 unset($_POST[
'idprod']);
686 unset($_POST[
'date_starthour']);
687 unset($_POST[
'date_startmin']);
688 unset($_POST[
'date_startsec']);
689 unset($_POST[
'date_startday']);
690 unset($_POST[
'date_startmonth']);
691 unset($_POST[
'date_startyear']);
692 unset($_POST[
'date_endhour']);
693 unset($_POST[
'date_endmin']);
694 unset($_POST[
'date_endsec']);
695 unset($_POST[
'date_endday']);
696 unset($_POST[
'date_endmonth']);
697 unset($_POST[
'date_endyear']);
702 } elseif ($action ==
'updateline' && $user->hasRight(
'contrat',
'creer') && !
GETPOST(
'cancel',
'alpha')) {
706 if (!empty($date_start_update) && !empty($date_end_update) && $date_start_update > $date_end_update) {
707 setEventMessages($langs->trans(
"Error").
': '.$langs->trans(
"DateStartPlanned").
' > '.$langs->trans(
"DateEndPlanned"),
null,
'errors');
708 $action =
'editline';
709 $_GET[
'rowid'] =
GETPOST(
'elrowid');
715 if ($objectline->fetch(
GETPOST(
'elrowid',
'int')) < 0) {
719 $objectline->fetch_optionals();
721 $objectline->oldcopy =
dol_clone($objectline);
727 if ($date_start_real_update ==
'') {
728 $date_start_real_update = $objectline->date_start_real;
730 if ($date_end_real_update ==
'') {
731 $date_end_real_update = $objectline->date_end_real;
734 $vat_rate =
GETPOST(
'eltva_tx',
'alpha');
737 if (preg_match(
'/\*/', $vat_rate)) {
742 $vat_rate = str_replace(
'*',
'', $vat_rate);
743 $localtax1_tx =
get_localtax($vat_rate, 1, $object->thirdparty, $mysoc);
744 $localtax2_tx =
get_localtax($vat_rate, 2, $object->thirdparty, $mysoc);
751 if (preg_match(
'/\((.*)\)/', $txtva, $reg)) {
752 $vat_src_code = $reg[1];
753 $txtva = preg_replace(
'/\s*\(.*\)/',
'', $txtva);
763 $fk_unit =
GETPOST(
'unit',
'alpha');
770 if ($remise_percent > 0) {
771 $remise = round(($price_ht * $remise_percent / 100), 2);
774 $objectline->fk_product =
GETPOST(
'idprod',
'int');
775 $objectline->description =
GETPOST(
'product_desc',
'restricthtml');
776 $objectline->price_ht = $price_ht;
779 $objectline->remise_percent = $remise_percent;
780 $objectline->tva_tx = ($txtva ? $txtva : 0);
781 $objectline->vat_src_code = $vat_src_code;
782 $objectline->localtax1_tx = is_numeric($localtax1_tx) ? $localtax1_tx : 0;
783 $objectline->localtax2_tx = is_numeric($localtax2_tx) ? $localtax2_tx : 0;
784 $objectline->date_start = $date_start_update;
785 $objectline->date_start_real = $date_start_real_update;
786 $objectline->date_end = $date_end_update;
787 $objectline->date_end_real = $date_end_real_update;
788 $objectline->user_closing_id = $user->id;
790 $objectline->pa_ht = $pa_ht;
791 $objectline->rang = $objectline->rang;
794 $objectline->fk_unit =
GETPOST(
'unit');
796 $objectline->fk_unit =
null;
800 $extralabelsline = $extrafields->fetch_name_optionals_label($objectline->table_element);
801 $array_options = $extrafields->getOptionalsFromPost($object->table_element_line, $predef);
803 if (is_array($array_options) && count($array_options) > 0) {
805 foreach ($array_options as $key => $value) {
806 $objectline->array_options[$key] = $array_options[$key];
812 $result = $objectline->update($user);
815 $action =
'editline';
816 $_GET[
'rowid'] =
GETPOST(
'elrowid');
826 } elseif ($action ==
'confirm_deleteline' && $confirm ==
'yes' && $user->hasRight(
'contrat',
'creer')) {
827 $result = $object->deleteline(
GETPOST(
'lineid',
'int'), $user);
830 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$object->id);
835 } elseif ($action ==
'confirm_valid' && $confirm ==
'yes' && $user->hasRight(
'contrat',
'creer')) {
836 $result = $object->validate($user);
841 $outputlangs = $langs;
844 $newlang =
GETPOST(
'lang_id',
'aZ09');
847 $newlang = $object->thirdparty->default_lang;
849 if (!empty($newlang)) {
851 $outputlangs->setDefaultLang($newlang);
853 $model = $object->model_pdf;
854 $ret = $object->fetch($id);
856 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
861 } elseif ($action ==
'reopen' && $user->hasRight(
'contrat',
'creer')) {
862 $result = $object->reopen($user);
866 } elseif ($action ==
'confirm_close' && $confirm ==
'yes' && $user->hasRight(
'contrat',
'creer')) {
868 $result = $object->closeAll($user);
872 } elseif ($action ==
'confirm_activate' && $confirm ==
'yes' && $user->hasRight(
'contrat',
'creer')) {
875 $comment =
GETPOST(
'comment',
'alpha');
876 $result = $object->activateAll($user, $date_start, 0, $comment, $date_end);
880 } elseif ($action ==
'confirm_delete' && $confirm ==
'yes' && $user->hasRight(
'contrat',
'supprimer')) {
881 $result = $object->delete($user);
883 header(
"Location: list.php?restore_lastsearch_values=1");
888 } elseif ($action ==
'confirm_move' && $confirm ==
'yes' && $user->hasRight(
'contrat',
'creer')) {
891 $result = $contractline->fetch(
GETPOSTINT(
'lineid'));
892 $contractline->fk_contrat =
GETPOSTINT(
'newcid');
893 $result = $contractline->update($user, 1);
895 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$id);
901 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentities(
"RefNewContract")),
null,
'errors');
903 } elseif ($action ==
'update_extras' && $permissiontoadd) {
904 $object->oldcopy =
dol_clone($object, 2);
906 $attribute =
GETPOST(
'attribute',
'alphanohtml');
909 $ret = $extrafields->setOptionalsFromPost(
null, $object, $attribute);
916 $result = $object->updateExtraField($attribute,
'CONTRACT_MODIFY');
924 $action =
'edit_extras';
926 } elseif ($action ==
'setref_supplier' && $permissiontoadd) {
928 $object->oldcopy =
dol_clone($object, 2);
930 $result = $object->setValueFrom(
'ref_supplier',
GETPOST(
'ref_supplier',
'alpha'),
'',
null,
'text',
'', $user,
'CONTRACT_MODIFY');
933 $action =
'editref_supplier';
935 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$object->id);
939 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$id);
942 } elseif ($action ==
'setref_customer' && $permissiontoadd) {
944 $object->oldcopy =
dol_clone($object, 2);
946 $result = $object->setValueFrom(
'ref_customer',
GETPOST(
'ref_customer',
'alpha'),
'',
null,
'text',
'', $user,
'CONTRACT_MODIFY');
949 $action =
'editref_customer';
951 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$object->id);
955 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$id);
958 } elseif ($action ==
'setref' && $permissiontoadd) {
960 $result = $object->fetch($id);
965 $old_ref = $object->ref;
967 $result = $object->setValueFrom(
'ref',
GETPOST(
'ref',
'alpha'),
'',
null,
'text',
'', $user,
'CONTRACT_MODIFY');
972 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
973 $old_filedir = $conf->contrat->multidir_output[$object->entity].
'/'.
dol_sanitizeFileName($old_ref);
974 $new_filedir = $conf->contrat->multidir_output[$object->entity].
'/'.
dol_sanitizeFileName($object->ref);
979 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$object->id);
983 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$id);
986 } elseif ($action ==
'setdate_contrat' && $permissiontoadd) {
988 $result = $object->fetch($id);
993 $result = $object->setValueFrom(
'date_contrat', $datacontrat,
'',
null,
'date',
'', $user,
'CONTRACT_MODIFY');
996 $action =
'editdate_contrat';
998 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$object->id);
1002 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$id);
1008 include DOL_DOCUMENT_ROOT.
'/core/actions_printing.inc.php';
1011 $upload_dir = $conf->contrat->multidir_output[!empty($object->entity) ? $object->entity : $conf->entity];
1012 include DOL_DOCUMENT_ROOT.
'/core/actions_builddoc.inc.php';
1015 $triggersendname =
'CONTRACT_SENTBYMAIL';
1017 $mode =
'emailfromcontract';
1018 $trackid =
'con'.$object->id;
1019 include DOL_DOCUMENT_ROOT.
'/core/actions_sendmails.inc.php';
1022 if (
getDolGlobalString(
'MAIN_DISABLE_CONTACTS_TAB') && $user->hasRight(
'contrat',
'creer')) {
1023 if ($action ==
'addcontact') {
1026 $result = $object->add_contact($contactid, $typeid,
GETPOST(
"source",
'aZ09'));
1029 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$object->id);
1032 if ($object->error ==
'DB_ERROR_RECORD_ALREADY_EXISTS') {
1033 $langs->load(
"errors");
1034 setEventMessages($langs->trans(
"ErrorThisContactIsAlreadyDefinedAsThisType"),
null,
'errors');
1039 } elseif ($action ==
'swapstatut') {
1041 $result = $object->swapContactStatus(
GETPOST(
'ligne',
'int'));
1042 } elseif ($action ==
'deletecontact') {
1044 $result = $object->delete_contact(
GETPOST(
'lineid',
'int'));
1047 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$object->id);
1056 if ($action ==
'confirm_clone' && $confirm ==
'yes') {
1058 setEventMessages($langs->trans(
"NoCloneOptionsSpecified"),
null,
'errors');
1060 if ($object->id > 0) {
1061 $result = $object->createFromClone($user, $socid);
1063 header(
"Location: ".$_SERVER[
'PHP_SELF'].
'?id='.$result);
1066 if (count($object->errors) > 0) {
1081$help_url =
'EN:Module_Contracts|FR:Module_Contrat';
1083$title = $object->ref.
" - ".$langs->trans(
'Contract');
1084if ($action ==
'create') {
1085 $title = $langs->trans(
"NewContract");
1090$form =
new Form($db);
1092if (isModEnabled(
'project')) {
1097$module = (
getDolGlobalString(
'CONTRACT_ADDON') ? $conf->global->CONTRACT_ADDON :
'mod_contract_serpis');
1098if (substr($module, 0, 13) ==
'mod_contract_' && substr($module, -3) ==
'php') {
1099 $module = substr($module, 0,
dol_strlen($module) - 4);
1103 $modCodeContract =
new $module();
1107if ($action ==
'create') {
1113 $soc->fetch($socid);
1119 $element = $subelement =
GETPOST(
'origin');
1120 if (preg_match(
'/^([^_]+)_([^_]+)/i',
GETPOST(
'origin'), $regs)) {
1121 $element = $regs[1];
1122 $subelement = $regs[2];
1125 if ($element ==
'project') {
1126 $projectid =
GETPOST(
'originid',
'int');
1129 if ($element ==
'order' || $element ==
'commande') {
1130 $element = $subelement =
'commande';
1132 if ($element ==
'propal') {
1133 $element =
'comm/propal';
1134 $subelement =
'propal';
1136 if ($element ==
'invoice' || $element ==
'facture') {
1137 $element =
'compta/facture';
1138 $subelement =
'facture';
1143 $classname = ucfirst($subelement);
1144 $objectsrc =
new $classname($db);
1145 $objectsrc->fetch($originid);
1146 if (empty($objectsrc->lines) && method_exists($objectsrc,
'fetch_lines')) {
1147 $objectsrc->fetch_lines();
1149 $objectsrc->fetch_thirdparty();
1152 $objectsrc->fetch_optionals();
1153 $object->array_options = $objectsrc->array_options;
1155 $projectid = (!empty($objectsrc->fk_project) ? $objectsrc->fk_project :
'');
1157 $soc = $objectsrc->thirdparty;
1159 $note_private = (!empty($objectsrc->note_private) ? $objectsrc->note_private :
'');
1160 $note_public = (!empty($objectsrc->note_public) ? $objectsrc->note_public :
'');
1163 $srccontactslist = $objectsrc->liste_contact(-1,
'external', 1);
1166 $projectid =
GETPOST(
'projectid',
'int');
1167 $note_private =
GETPOST(
"note_private");
1168 $note_public =
GETPOST(
"note_public");
1171 $object->date_contrat =
dol_now();
1173 print
'<form name="form_contract" action="'.$_SERVER[
"PHP_SELF"].
'" method="post">';
1174 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1175 print
'<input type="hidden" name="action" value="add">';
1176 print
'<input type="hidden" name="socid" value="'.$soc->id.
'">'.
"\n";
1177 print
'<input type="hidden" name="remise_percent" value="0">';
1178 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
1182 print
'<table class="border centpercent">';
1185 print
'<tr><td class="titlefieldcreate fieldrequired">'.$langs->trans(
'Ref').
'</td><td>';
1186 if (!empty($modCodeContract->code_auto)) {
1187 $tmpcode = $langs->trans(
"Draft");
1189 $tmpcode =
'<input name="ref" class="maxwidth100" maxlength="128" value="'.dol_escape_htmltag(
GETPOST(
'ref') ?
GETPOST(
'ref') : $tmpcode).
'">';
1195 print
'<tr><td>'.$langs->trans(
'RefCustomer').
'</td>';
1196 print
'<td><input type="text" class="maxwidth150" name="ref_customer" id="ref_customer" value="'.dol_escape_htmltag(
GETPOST(
'ref_customer',
'alpha')).
'"></td></tr>';
1199 print
'<tr><td>'.$langs->trans(
'RefSupplier').
'</td>';
1200 print
'<td><input type="text" class="maxwidth150" name="ref_supplier" id="ref_supplier" value="'.dol_escape_htmltag(
GETPOST(
'ref_supplier',
'alpha')).
'"></td></tr>';
1204 print
'<td class="fieldrequired">'.$langs->trans(
'ThirdParty').
'</td>';
1207 print $soc->getNomUrl(1);
1208 print
'<input type="hidden" name="socid" value="'.$soc->id.
'">';
1212 print
img_picto(
'',
'company',
'class="pictofixedwidth"');
1213 print $form->select_company(
'',
'socid',
'',
'SelectThirdParty', 1, 0,
null, 0,
'minwidth300 widthcentpercentminusxx maxwidth500');
1214 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>';
1221 print
'<tr><td>'.$langs->trans(
'Discounts').
'</td><td>';
1222 if ($soc->remise_percent) {
1223 print $langs->trans(
"CompanyHasRelativeDiscount", $soc->remise_percent).
' ';
1225 print
'<span class="hideonsmartphone">'.$langs->trans(
"CompanyHasNoRelativeDiscount").
'. </span>';
1227 $absolute_discount = $soc->getAvailableDiscounts();
1228 if ($absolute_discount) {
1229 print $langs->trans(
"CompanyHasAbsoluteDiscount",
price($absolute_discount), $langs->trans(
"Currency".$conf->currency)).
'.';
1231 print
'<span class="hideonsmartphone">'.$langs->trans(
"CompanyHasNoAbsoluteDiscount").
'.</span>';
1237 print
'<tr><td class="nowrap"><span class="fieldrequired">'.$langs->trans(
"TypeContact_contrat_internal_SALESREPFOLL").
'</span></td><td>';
1238 print
img_picto(
'',
'user',
'class="pictofixedwidth"');
1239 print $form->select_dolusers(
GETPOST(
"commercial_suivi_id") ?
GETPOST(
"commercial_suivi_id") : $user->id,
'commercial_suivi_id', 1,
'');
1243 print
'<tr><td class="nowrap"><span class="fieldrequired">'.$langs->trans(
"TypeContact_contrat_internal_SALESREPSIGN").
'</span></td><td>';
1244 print
img_picto(
'',
'user',
'class="pictofixedwidth"');
1245 print $form->select_dolusers(
GETPOST(
"commercial_signature_id") ?
GETPOST(
"commercial_signature_id") : $user->id,
'commercial_signature_id', 1,
'');
1248 print
'<tr><td><span class="fieldrequired">'.$langs->trans(
"Date").
'</span></td><td>';
1249 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
1250 print $form->selectDate($datecontrat,
'', 0, 0,
'',
"contrat");
1254 if (isModEnabled(
'project')) {
1255 $langs->load(
'projects');
1259 print
'<tr><td>'.$langs->trans(
"Project").
'</td><td>';
1260 print
img_picto(
'',
'project',
'class="pictofixedwidth"');
1261 $formproject->select_projects(($soc->id > 0 ? $soc->id : -1), $projectid,
"projectid", 0, 0, 1, 1);
1262 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>';
1266 print
'<tr><td>'.$langs->trans(
"NotePublic").
'</td><td class="tdtop">';
1267 $doleditor =
new DolEditor(
'note_public', $note_public,
'',
'100',
'dolibarr_notes',
'In', 1,
true, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PUBLIC') ? 0 : 1, ROWS_3,
'90%');
1268 print $doleditor->Create(1);
1271 if (empty($user->socid)) {
1272 print
'<tr><td>'.$langs->trans(
"NotePrivate").
'</td><td class="tdtop">';
1273 $doleditor =
new DolEditor(
'note_private', $note_private,
'',
'100',
'dolibarr_notes',
'In', 1,
true, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PRIVATE') ? 0 : 1, ROWS_3,
'90%');
1274 print $doleditor->Create(1);
1279 $parameters = array(
'objectsrc' => $objectsrc,
'colspan' =>
' colspan="3"',
'cols' =>
'3');
1280 $reshook = $hookmanager->executeHooks(
'formObjectOptions', $parameters, $object, $action);
1281 print $hookmanager->resPrint;
1284 if (empty($reshook)) {
1285 print $object->showOptionals($extrafields,
'create', $parameters);
1292 print $form->buttonsSaveCancel(
"Create");
1294 if (is_object($objectsrc)) {
1295 print
'<input type="hidden" name="origin" value="'.$objectsrc->element.
'">';
1296 print
'<input type="hidden" name="originid" value="'.$objectsrc->id.
'">';
1299 print
'<br>'.$langs->trans(
"Note").
': '.$langs->trans(
"OnlyLinesWithTypeServiceAreUsed");
1308 if ($object->id > 0) {
1309 $object->fetch_thirdparty();
1311 $soc = $object->thirdparty;
1313 $result = $object->fetch_lines();
1318 $nbofservices = count($object->lines);
1320 $author =
new User($db);
1321 $author->fetch($object->user_author_id);
1323 $commercial_signature =
new User($db);
1324 $commercial_signature->fetch($object->commercial_signature_id);
1326 $commercial_suivi =
new User($db);
1327 $commercial_suivi->fetch($object->commercial_suivi_id);
1334 print
dol_get_fiche_head($head, $hselected, $langs->trans(
"Contract"), -1,
'contract');
1337 if ($action ==
'delete') {
1339 $formconfirm = $form->formconfirm($_SERVER[
'PHP_SELF'].
"?id=".$object->id, $langs->trans(
"DeleteAContract"), $langs->trans(
"ConfirmDeleteAContract"),
"confirm_delete",
'', 0, 1);
1340 } elseif ($action ==
'valid') {
1342 $ref = substr($object->ref, 1, 4);
1343 if ($ref ==
'PROV' && !empty($modCodeContract->code_auto)) {
1344 $numref = $object->getNextNumRef($object->thirdparty);
1346 $numref = $object->ref;
1348 $text = $langs->trans(
'ConfirmValidateContract', $numref);
1349 $formconfirm = $form->formconfirm($_SERVER[
'PHP_SELF'].
"?id=".$object->id, $langs->trans(
"ValidateAContract"), $text,
"confirm_valid",
'', 0, 1);
1350 } elseif ($action ==
'close') {
1352 $formconfirm = $form->formconfirm($_SERVER[
'PHP_SELF'].
"?id=".$object->id, $langs->trans(
"CloseAContract"), $langs->trans(
"ConfirmCloseContract"),
"confirm_close",
'', 0, 1);
1353 } elseif ($action ==
'activate') {
1354 $formquestion = array(
1355 array(
'type' =>
'date',
'name' =>
'd_start',
'label' => $langs->trans(
"DateServiceActivate"),
'value' =>
dol_now()),
1356 array(
'type' =>
'date',
'name' =>
'd_end',
'label' => $langs->trans(
"DateEndPlanned"),
'',
''),
1357 array(
'type' =>
'text',
'name' =>
'comment',
'label' => $langs->trans(
"Comment"),
'value' =>
'',
'',
'',
'class' =>
'minwidth300',
'moreattr'=>
'autofocus')
1359 $formconfirm = $form->formconfirm($_SERVER[
'PHP_SELF'].
"?id=".$object->id, $langs->trans(
"ActivateAllOnContract"), $langs->trans(
"ConfirmActivateAllOnContract"),
"confirm_activate", $formquestion,
'yes', 1, 280);
1360 } elseif ($action ==
'clone') {
1361 $filter =
'(s.client:IN:1,2,3)';
1363 $formquestion = array(array(
'type' =>
'other',
'name' =>
'socid',
'label' => $langs->trans(
"SelectThirdParty"),
'value' => $form->select_company(
GETPOST(
'socid',
'int'),
'socid', $filter)));
1364 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.$object->id, $langs->trans(
'ToClone'), $langs->trans(
'ConfirmCloneContract', $object->ref),
'confirm_clone', $formquestion,
'yes', 1);
1369 $parameters = array(
1370 'formConfirm' => $formconfirm,
1375 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters, $object, $action);
1376 if (empty($reshook)) {
1377 $formconfirm .= $hookmanager->resPrint;
1378 } elseif ($reshook > 0) {
1379 $formconfirm = $hookmanager->resPrint;
1387 if ($object->status == $object::STATUS_DRAFT && $user->hasRight(
'contrat',
'creer')) {
1388 print
'<form action="'.$_SERVER[
'PHP_SELF'].
'?id='.$object->id.
'" method="POST">';
1389 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1390 print
'<input type="hidden" name="action" value="setremise">';
1391 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
1396 $linkback =
'<a href="'.DOL_URL_ROOT.
'/contrat/list.php?restore_lastsearch_values=1'.(!empty($socid) ?
'&socid='.$socid :
'').
'">'.$langs->trans(
"BackToList").
'</a>';
1400 if (!empty($modCodeContract->code_auto)) {
1401 $morehtmlref .= $object->ref;
1403 $morehtmlref .= $form->editfieldkey(
"",
'ref', $object->ref, $object, $user->hasRight(
'contrat',
'creer'),
'string',
'', 0, 3);
1404 $morehtmlref .= $form->editfieldval(
"",
'ref', $object->ref, $object, $user->hasRight(
'contrat',
'creer'),
'string',
'', 0, 2);
1407 $morehtmlref .=
'<div class="refidno">';
1409 $morehtmlref .= $form->editfieldkey(
"RefCustomer",
'ref_customer', $object->ref_customer, $object, $user->hasRight(
'contrat',
'creer'),
'string',
'', 0, 1);
1410 $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');
1412 $morehtmlref .=
'<br>';
1413 $morehtmlref .= $form->editfieldkey(
"RefSupplier",
'ref_supplier', $object->ref_supplier, $object, $user->hasRight(
'contrat',
'creer'),
'string',
'', 0, 1);
1414 $morehtmlref .= $form->editfieldval(
"RefSupplier",
'ref_supplier', $object->ref_supplier, $object, $user->hasRight(
'contrat',
'creer'),
'string',
'',
null,
null,
'', 1,
'getFormatedSupplierRef');
1416 $morehtmlref .=
'<br>'.$object->thirdparty->getNomUrl(1);
1418 $morehtmlref .=
' (<a href="'.DOL_URL_ROOT.
'/contrat/list.php?socid='.$object->thirdparty->id.
'&search_name='.urlencode($object->thirdparty->name).
'">'.$langs->trans(
"OtherContracts").
'</a>)';
1421 if (isModEnabled(
'project')) {
1422 $langs->load(
"projects");
1423 $morehtmlref .=
'<br>';
1424 if ($permissiontoadd) {
1425 $morehtmlref .=
img_picto($langs->trans(
"Project"),
'project',
'class="pictofixedwidth"');
1426 if ($action !=
'classify') {
1427 $morehtmlref .=
'<a class="editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?action=classify&token='.newToken().
'&id='.$object->id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetProject')).
'</a> ';
1429 $morehtmlref .= $form->form_project($_SERVER[
'PHP_SELF'].
'?id='.$object->id, $object->socid, $object->fk_project, ($action ==
'classify' ?
'projectid' :
'none'), 0, 0, 0, 1,
'',
'maxwidth300');
1431 if (!empty($object->fk_project)) {
1433 $proj->fetch($object->fk_project);
1434 $morehtmlref .= $proj->getNomUrl(1);
1436 $morehtmlref .=
'<span class="opacitymedium"> - '.dol_escape_htmltag($proj->title).
'</span>';
1441 $morehtmlref .=
'</div>';
1444 dol_banner_tab($object,
'ref', $linkback, 1,
'ref',
'none', $morehtmlref);
1447 print
'<div class="fichecenter">';
1448 print
'<div class="underbanner clearboth"></div>';
1451 print
'<table class="border tableforfield" width="100%">';
1454 print
'<tr><td class="titlefield">'.$langs->trans(
'Discount').
'</td><td colspan="3">';
1455 if ($object->thirdparty->remise_percent) {
1456 print $langs->trans(
"CompanyHasRelativeDiscount", $object->thirdparty->remise_percent).
'. ';
1458 print
'<span class="hideonsmartphone">'.$langs->trans(
"CompanyHasNoRelativeDiscount").
'. </span>';
1460 $absolute_discount = $object->thirdparty->getAvailableDiscounts();
1461 if ($absolute_discount) {
1462 print $langs->trans(
"CompanyHasAbsoluteDiscount",
price($absolute_discount), $langs->trans(
"Currency".$conf->currency)).
'.';
1464 print
'<span class="hideonsmartphone">'.$langs->trans(
"CompanyHasNoAbsoluteDiscount").
'.</span>';
1470 print
'<td class="titlefield">';
1471 print $form->editfieldkey(
"Date",
'date_contrat', $object->date_contrat, $object, $user->hasRight(
'contrat',
'creer'));
1473 print $form->editfieldval(
"Date",
'date_contrat', $object->date_contrat, $object, $user->hasRight(
'contrat',
'creer'),
'datehourpicker');
1479 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_view.tpl.php';
1485 if ($object->status == $object::STATUS_DRAFT && $user->hasRight(
'contrat',
'creer')) {
1492 $blocname =
'contacts';
1493 $title = $langs->trans(
'ContactsAddresses');
1494 include DOL_DOCUMENT_ROOT.
'/core/tpl/bloc_showhide.tpl.php';
1498 $blocname =
'notes';
1499 $title = $langs->trans(
'Notes');
1500 include DOL_DOCUMENT_ROOT.
'/core/tpl/bloc_showhide.tpl.php';
1504 $arrayothercontracts = $object->getListOfContracts(
'others');
1512 global $inputalsopricewithtax;
1513 $inputalsopricewithtax = 1;
1515 $productstatic =
new Product($db);
1518 if (isModEnabled(
'margin') && !empty($object->element) && in_array($object->element, array(
'facture',
'propal',
'commande'))) {
1526 print
'<div id="contrat-lines-container" id="contractlines" data-contractid="'.$object->id.
'" data-element="'.$object->element.
'" >';
1527 while ($cursorline <= $nbofservices) {
1528 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.
'" >';
1529 print
'<form name="update" id="addproduct" action="'.$_SERVER[
'PHP_SELF'].
'?id='.$object->id.
'" method="post">';
1530 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1531 print
'<input type="hidden" name="action" value="updateline">';
1532 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
1533 print
'<input type="hidden" name="elrowid" value="'.$object->lines[$cursorline - 1]->id.
'">';
1534 print
'<input type="hidden" name="fournprice" value="'.(!empty($object->lines[$cursorline - 1]->fk_fournprice) ? $object->lines[$cursorline - 1]->fk_fournprice : 0).
'">';
1537 print
'<div class="div-table-responsive-no-min">';
1538 print
'<table class="notopnoleftnoright allwidth tableforservicepart1 centpercent">';
1540 $sql =
"SELECT cd.rowid, cd.statut, cd.label as label_det, cd.fk_product, cd.product_type, cd.description, cd.price_ht, cd.qty,";
1541 $sql .=
" cd.tva_tx, cd.vat_src_code, cd.remise_percent, cd.info_bits, cd.subprice, cd.multicurrency_subprice,";
1542 $sql .=
" cd.date_ouverture_prevue as date_start, cd.date_ouverture as date_start_real,";
1543 $sql .=
" cd.date_fin_validite as date_end, cd.date_cloture as date_end_real,";
1544 $sql .=
" cd.commentaire as comment, cd.fk_product_fournisseur_price as fk_fournprice, cd.buy_price_ht as pa_ht,";
1545 $sql .=
" cd.fk_unit,";
1546 $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";
1547 $sql .=
" ,cd.rang";
1548 $sql .=
" FROM ".MAIN_DB_PREFIX.
"contratdet as cd";
1549 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"product as p ON cd.fk_product = p.rowid";
1550 $sql .=
" WHERE cd.rowid = ".((int) $object->lines[$cursorline - 1]->id);
1552 $result = $db->query($sql);
1556 $objp = $db->fetch_object($result);
1559 print
'<tr class="liste_titre'.($cursorline ?
' liste_titre_add' :
'').
'">';
1560 print
'<td>'.$langs->trans(
"ServiceNb", $cursorline).
'</td>';
1561 print
'<td width="80" class="center">'.$langs->trans(
"VAT").
'</td>';
1562 print
'<td width="80" class="right">'.$langs->trans(
"PriceUHT").
'</td>';
1566 print
'<td width="30" class="center">'.$langs->trans(
"Qty").
'</td>';
1568 print
'<td width="30" class="left">'.$langs->trans(
"Unit").
'</td>';
1570 print
'<td width="50" class="right">'.$langs->trans(
"ReductionShort").
'</td>';
1572 print
'<td width="50" class="right">'.$langs->trans(
"BuyingPrice").
'</td>';
1576 if ($nbofservices > 1 && $conf->browser->layout !=
'phone' && $user->hasRight(
'contrat',
'creer')) {
1577 print
'<td width="30" class="linecolmove tdlineupdown center">';
1578 if ($cursorline > 1) {
1579 print
'<a class="lineupdown reposition" href="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=up&token='.newToken().
'&rowid='.$objp->rowid.
'">';
1580 echo
img_up(
'default', 0,
'imgupforline');
1583 if ($cursorline < $nbofservices) {
1584 print
'<a class="lineupdown reposition" href="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=down&token='.newToken().
'&rowid='.$objp->rowid.
'">';
1585 echo
img_down(
'default', 0,
'imgdownforline');
1590 print
'<td width="30"> </td>';
1598 if ($action !=
'editline' ||
GETPOST(
'rowid') != $objp->rowid) {
1600 if (
getDolGlobalString(
'CONTRACT_HIDE_CLOSED_SERVICES_BY_DEFAULT') && $objp->statut == ContratLigne::STATUS_CLOSED && $action !=
'showclosedlines') {
1601 $moreparam =
'style="display: none;"';
1604 print
'<tr class="tdtop oddeven" '.$moreparam.
'>';
1607 if ($objp->fk_product > 0) {
1608 $productstatic->id = $objp->fk_product;
1609 $productstatic->type = $objp->ptype;
1610 $productstatic->ref = $objp->pref;
1611 $productstatic->entity = $objp->pentity;
1612 $productstatic->label = $objp->plabel;
1613 $productstatic->status = $objp->tosell;
1614 $productstatic->status_buy = $objp->tobuy;
1615 $productstatic->status_batch = $objp->tobatch;
1618 $text = $productstatic->getNomUrl(1,
'', 32);
1619 if ($objp->plabel) {
1621 $text .= $objp->plabel;
1623 $description = $objp->description;
1627 $text .= (!empty($objp->description) && $objp->description != $objp->plabel) ?
'<br>'.
dol_htmlentitiesbr($objp->description) :
'';
1631 print $form->textwithtooltip($text, $description, 3,
'',
'', $cursorline, 3, (!empty($line->fk_parent_line) ?
img_picto(
'',
'rightarrow') :
''));
1635 print
'<td>'.img_object($langs->trans(
"ShowProductOrService"), ($objp->product_type ?
'service' :
'product')).
' '.
dol_htmlentitiesbr($objp->
description).
"</td>\n";
1638 print
'<td class="center">';
1639 print
vatrate($objp->tva_tx.($objp->vat_src_code ? (
' ('.$objp->vat_src_code.
')') :
''),
'%', $objp->info_bits);
1642 print
'<td class="right">'.($objp->subprice !=
'' ?
price($objp->subprice) :
'').
"</td>\n";
1648 print
'<td class="center">'.$objp->qty.
'</td>';
1651 print
'<td class="left">'.$langs->trans($object->lines[$cursorline - 1]->getLabelOfUnit()).
'</td>';
1654 if ($objp->remise_percent > 0) {
1655 print
'<td class="right">'.$objp->remise_percent.
"%</td>\n";
1657 print
'<td> </td>';
1662 print
'<td class="right nowraponall">'.price($objp->pa_ht).
'</td>';
1666 print
'<td class="nowraponall right">';
1667 if ($user->hasRight(
'contrat',
'creer') && is_array($arrayothercontracts) && count($arrayothercontracts) && ($object->statut >= 0)) {
1668 print
'<!-- link to move service line into another contract -->';
1669 print
'<a class="reposition marginrightonly" style="padding-left: 5px;" href="'.$_SERVER[
'PHP_SELF'].
'?id='.$object->id.
'&action=move&token='.newToken().
'&rowid='.$objp->rowid.
'">';
1670 print
img_picto($langs->trans(
"MoveToAnotherContract"),
'uparrow');
1673 if ($user->hasRight(
'contrat',
'creer') && ($object->statut >= 0)) {
1674 print
'<a class="reposition marginrightonly editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?id='.$object->id.
'&action=editline&token='.newToken().
'&rowid='.$objp->rowid.
'">';
1678 if ($user->hasRight(
'contrat',
'creer') && ($object->statut >= 0)) {
1679 print
'<a class="reposition marginrightonly" href="'.$_SERVER[
'PHP_SELF'].
'?id='.$object->id.
'&action=deleteline&token='.newToken().
'&rowid='.$objp->rowid.
'">';
1696 if ($objp->subprice >= 0) {
1697 print
'<tr class="oddeven" '.$moreparam.
'>';
1698 print
'<td colspan="'.$colspan.
'">';
1701 print $langs->trans(
"DateStartPlanned").
': ';
1702 if ($objp->date_start) {
1705 if ($objp->statut == 0 && $db->jdate($objp->date_start) < ($now - $conf->contrat->services->inactifs->warning_delay)) {
1706 $warning_delay = $conf->contrat->services->inactifs->warning_delay / 3600 / 24;
1707 $textlate = $langs->trans(
"Late").
' = '.$langs->trans(
"DateReference").
' > '.$langs->trans(
"DateToday").
' '.(ceil($warning_delay) >= 0 ?
'+' :
'').ceil($warning_delay).
' '.$langs->trans(
"days");
1708 print
" ".img_warning($textlate);
1711 print $langs->trans(
"Unknown");
1713 print
' - ';
1714 print $langs->trans(
"DateEndPlanned").
': ';
1715 if ($objp->date_end) {
1717 if ($objp->statut == 4 && $db->jdate($objp->date_end) < ($now - $conf->contrat->services->expires->warning_delay)) {
1718 $warning_delay = $conf->contrat->services->expires->warning_delay / 3600 / 24;
1719 $textlate = $langs->trans(
"Late").
' = '.$langs->trans(
"DateReference").
' > '.$langs->trans(
"DateToday").
' '.(ceil($warning_delay) >= 0 ?
'+' :
'').ceil($warning_delay).
' '.$langs->trans(
"days");
1720 print
" ".img_warning($textlate);
1723 print $langs->trans(
"Unknown");
1731 if (is_array($extralabelslines) && count($extralabelslines) > 0) {
1733 $line->id = $objp->rowid;
1734 $line->fetch_optionals();
1735 print $line->showOptionals($extrafields,
'view', array(
'class'=>
'oddeven',
'style'=>$moreparam,
'colspan'=>$colspan,
'tdclass' =>
'notitlefieldcreate'),
'',
'', 1);
1740 print
'<tr class="oddeven">';
1742 if ($objp->fk_product > 0) {
1743 $canchangeproduct = 1;
1744 if (empty($canchangeproduct)) {
1745 $productstatic->id = $objp->fk_product;
1746 $productstatic->type = $objp->ptype;
1747 $productstatic->ref = $objp->pref;
1748 $productstatic->entity = $objp->pentity;
1749 print $productstatic->getNomUrl(1,
'', 32);
1750 print $objp->label ?
' - '.dol_trunc($objp->label, 32) :
'';
1751 print
'<input type="hidden" name="idprod" value="'.(!empty($object->lines[$cursorline - 1]->fk_product) ? $object->lines[$cursorline - 1]->fk_product : 0).
'">';
1753 $senderissupplier = 0;
1754 if (empty($senderissupplier)) {
1755 print $form->select_produits((!empty($object->lines[$cursorline - 1]->fk_product) ? $object->lines[$cursorline - 1]->fk_product : 0),
'idprod');
1757 $form->select_produits_fournisseurs((!empty($object->lines[$cursorline - 1]->fk_product) ? $object->lines[$cursorline - 1]->fk_product : 0),
'idprod');
1762 print $objp->label ? $objp->label.
'<br>' :
'';
1763 print
'<input type="hidden" name="idprod" value="'.(!empty($object->lines[$cursorline - 1]->fk_product) ? $object->lines[$cursorline - 1]->fk_product : 0).
'">';
1767 require_once DOL_DOCUMENT_ROOT.
'/core/class/doleditor.class.php';
1770 $nbrows = $conf->global->MAIN_INPUT_DESC_HEIGHT;
1772 $enable = (isset($conf->global->FCKEDITOR_ENABLE_DETAILS) ? $conf->global->FCKEDITOR_ENABLE_DETAILS : 0);
1773 $doleditor =
new DolEditor(
'product_desc', $objp->description,
'', 92,
'dolibarr_details',
'',
false,
true, $enable, $nbrows,
'90%');
1774 $doleditor->Create();
1779 print
'<td class="right">';
1780 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);
1784 print
'<td class="right"><input size="5" type="text" name="elprice" value="'.price($objp->subprice).
'"></td>';
1792 print
'<td class="center"><input size="2" type="text" name="elqty" value="'.$objp->qty.
'"></td>';
1796 print
'<td class="left">';
1797 print $form->selectUnits($objp->fk_unit,
"unit");
1802 print
'<td class="nowrap right"><input size="1" type="text" name="elremise_percent" value="'.$objp->remise_percent.
'">%</td>';
1804 if (!empty($usemargins)) {
1805 print
'<td class="right">';
1806 if ($objp->fk_product) {
1807 print
'<select id="fournprice" name="fournprice"></select>';
1809 print
'<input id="buying_price" type="text" size="5" name="buying_price" value="'.price($objp->pa_ht, 0,
'', 0).
'"></td>';
1811 print
'<td class="center">';
1812 print
'<input type="submit" class="button margintoponly marginbottomonly" name="save" value="'.$langs->trans(
"Modify").
'">';
1813 print
'<br><input type="submit" class="button margintoponly marginbottomonly button-cancel" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
1826 print
'<tr class="oddeven">';
1827 print
'<td colspan="'.$colspan.
'">';
1828 print $langs->trans(
"DateStartPlanned").
' ';
1829 print $form->selectDate($db->jdate($objp->date_start),
"date_start_update", $usehm, $usehm, ($db->jdate($objp->date_start) > 0 ? 0 : 1),
"update");
1830 print
' '.$langs->trans(
"DateEndPlanned").
' ';
1831 print $form->selectDate($db->jdate($objp->date_end),
"date_end_update", $usehm, $usehm, ($db->jdate($objp->date_end) > 0 ? 0 : 1),
"update");
1835 if (is_array($extralabelslines) && count($extralabelslines) > 0) {
1837 $line->id = $objp->rowid;
1838 $line->fetch_optionals();
1839 print $line->showOptionals($extrafields,
'edit', array(
'style'=>
'class="oddeven"',
'colspan'=>$colspan,
'tdclass' =>
'notitlefieldcreate'),
'',
'', 1);
1848 if ($object->statut > 0) {
1850 if (
getDolGlobalString(
'CONTRACT_HIDE_CLOSED_SERVICES_BY_DEFAULT') && $object->lines[$cursorline - 1]->statut == ContratLigne::STATUS_CLOSED && $action !=
'showclosedlines') {
1851 $moreparam =
'style="display: none;"';
1862 print
'<tr class="oddeven" '.$moreparam.
'>';
1863 print
'<td class="tdhrthin" colspan="'.$colspan.
'"><hr class="opacitymedium tdhrthin"></td>';
1876 if ($action ==
'deleteline' && !$_REQUEST[
"cancel"] && $user->hasRight(
'contrat',
'creer') && $object->lines[$cursorline - 1]->id ==
GETPOST(
'rowid')) {
1877 print $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$object->id.
"&lineid=".
GETPOST(
'rowid'), $langs->trans(
"DeleteContractLine"), $langs->trans(
"ConfirmDeleteContractLine"),
"confirm_deleteline",
'', 0, 1);
1878 if ($ret ==
'html') {
1879 print
'<table class="notopnoleftnoright" width="100%"><tr class="oddeven" height="6"><td></td></tr></table>';
1886 if ($action ==
'move' && !$_REQUEST[
"cancel"] && $user->hasRight(
'contrat',
'creer') && $object->lines[$cursorline - 1]->id ==
GETPOST(
'rowid')) {
1887 $arraycontractid = array();
1888 foreach ($arrayothercontracts as $contractcursor) {
1889 $arraycontractid[$contractcursor->id] = $contractcursor->ref;
1893 $formquestion = array(
1894 'text' => $langs->trans(
"ConfirmMoveToAnotherContractQuestion"),
1895 array(
'type' =>
'select',
'name' =>
'newcid',
'values' => $arraycontractid));
1897 print $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$object->id.
"&lineid=".
GETPOST(
'rowid',
'int'), $langs->trans(
"MoveToAnotherContract"), $langs->trans(
"ConfirmMoveToAnotherContract"),
"confirm_move", $formquestion);
1898 print
'<table class="notopnoleftnoright" width="100%"><tr class="oddeven" height="6"><td></td></tr></table>';
1902 if ($object->statut > 0) {
1903 print
'<table class="notopnoleftnoright tableforservicepart2'.($cursorline < $nbofservices ?
' boxtablenobottom' :
'').
' centpercent">';
1905 print
'<tr class="oddeven" '.$moreparam.
'>';
1906 print
'<td><span class="valignmiddle hideonsmartphone">'.$langs->trans(
"ServiceStatus").
':</span> '.$object->lines[$cursorline - 1]->getLibStatut(4).
'</td>';
1907 print
'<td width="30" class="right">';
1908 if ($user->socid == 0) {
1909 if ($object->statut > 0 && $action !=
'activateline' && $action !=
'unactivateline') {
1910 $tmpaction =
'activateline';
1911 $tmpactionpicto =
'play';
1912 $tmpactiontext = $langs->trans(
"Activate");
1913 if ($objp->statut == 4) {
1914 $tmpaction =
'unactivateline';
1915 $tmpactionpicto =
'playstop';
1916 $tmpactiontext = $langs->trans(
"Disable");
1918 if (($tmpaction ==
'activateline' && $user->hasRight(
'contrat',
'activer')) || ($tmpaction ==
'unactivateline' && $user->hasRight(
'contrat',
'desactiver'))) {
1919 print
'<a class="reposition" href="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&ligne='.$object->lines[$cursorline - 1]->id.
'&action='.$tmpaction.
'">';
1920 print
img_picto($tmpactiontext, $tmpactionpicto);
1928 print
'<tr class="oddeven" '.$moreparam.
'>';
1932 if (!$objp->date_start_real) {
1933 print $langs->trans(
"DateStartReal").
': ';
1934 if ($objp->date_start_real) {
1937 print $langs->trans(
"ContractStatusNotRunning");
1941 if ($objp->date_start_real && !$objp->date_end_real) {
1942 print $langs->trans(
"DateStartReal").
': ';
1946 if ($objp->date_start_real && $objp->date_end_real) {
1947 print $langs->trans(
"DateStartReal").
': ';
1949 print
' - ';
1950 print $langs->trans(
"DateEndReal").
': ';
1953 if (!empty($objp->comment)) {
1954 print
" - ".$objp->comment;
1958 print
'<td class="center"> </td>';
1965 if ($user->hasRight(
'contrat',
'activer') && $action ==
'activateline' && $object->lines[$cursorline - 1]->id ==
GETPOST(
'ligne',
'int')) {
1966 print
'<form name="active" action="'.$_SERVER[
"PHP_SELF"].
'" method="POST">';
1967 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1968 print
'<input type="hidden" name="action" value="confirm_active">';
1969 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
1970 print
'<input type="hidden" name="id" value="'.$object->id.
'">';
1971 print
'<input type="hidden" name="ligne" value="'.GETPOST(
'ligne',
'int').
'">';
1972 print
'<input type="hidden" name="confirm" value="yes">';
1974 print
'<table class="noborder tableforservicepart2'.($cursorline < $nbofservices ?
' boxtablenobottom' :
'').
' centpercent">';
1977 $dateactstart = $objp->date_start;
1980 } elseif (!$dateactstart) {
1981 $dateactstart = time();
1984 $dateactend = $objp->date_end;
1987 } elseif (!$dateactend) {
1988 if ($objp->fk_product > 0) {
1990 $product->fetch($objp->fk_product);
1991 $dateactend =
dol_time_plus_duree(time(), $product->duration_value, $product->duration_unit);
1995 print
'<tr class="oddeven">';
1996 print
'<td class="nohover">'.$langs->trans(
"DateServiceActivate").
'</td><td class="nohover">';
1997 print $form->selectDate($dateactstart,
'start', $usehm, $usehm,
'',
"active", 1, 0);
1999 print
'<td class="nohover">'.$langs->trans(
"DateEndPlanned").
'</td><td class="nohover">';
2000 print $form->selectDate($dateactend,
"end", $usehm, $usehm,
'',
"active", 1, 0);
2002 print
'<td class="center nohover">';
2007 print
'<tr class="oddeven">';
2008 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>';
2009 print
'<td class="nohover right">';
2010 print
'<input type="submit" class="button" name="activate" value="'.$langs->trans(
"Activate").
'"> ';
2011 print
'<input type="submit" class="button button-cancel" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
2020 if ($user->hasRight(
'contrat',
'activer') && $action ==
'unactivateline' && $object->lines[$cursorline - 1]->id ==
GETPOST(
'ligne',
'int')) {
2024 print
'<!-- Form to disabled a line -->'.
"\n";
2025 print
'<form name="confirm_closeline" action="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&ligne='.$object->lines[$cursorline - 1]->id.
'" method="post">';
2026 print
'<input type="hidden" name="token" value="'.newToken().
'">';
2027 print
'<input type="hidden" name="confirm" value="yes">';
2028 print
'<input type="hidden" name="action" value="confirm_closeline">';
2029 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
2031 print
'<table class="noborder tableforservicepart2'.($cursorline < $nbofservices ?
' boxtablenobottom' :
'').
' centpercent">';
2034 $dateactstart = $objp->date_start_real;
2037 } elseif (!$dateactstart) {
2038 $dateactstart = time();
2041 $dateactend = $objp->date_end_real;
2044 } elseif (!$dateactend) {
2045 if ($objp->fk_product > 0) {
2047 $product->fetch($objp->fk_product);
2048 $dateactend =
dol_time_plus_duree(time(), $product->duration_value, $product->duration_unit);
2052 if ($dateactend > $now) {
2056 print
'<tr class="oddeven"><td colspan="2" class="nohover">';
2057 if ($objp->statut >= 4) {
2058 if ($objp->statut == 4) {
2059 print $langs->trans(
"DateEndReal").
' ';
2060 print $form->selectDate($dateactend,
"end", $usehm, $usehm, ($objp->date_end_real > 0 ? 0 : 1),
"closeline", 1, 1);
2064 print
'<td class="center nohover">';
2067 print
'<tr class="oddeven">';
2068 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>';
2069 print
'<td class="nohover right">';
2070 print
'<input type="submit" class="button" name="close" value="'.$langs->trans(
"Disable").
'"> ';
2071 print
'<input type="submit" class="button button-cancel" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
2085 if ($user->hasRight(
'contrat',
'creer') && ($object->statut == 0)) {
2089 print
' <form name="addproduct" id="addproduct" action="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.(($action !=
'editline') ?
'' :
'#line_'.
GETPOST(
'lineid',
'int')).
'" method="POST">
2090 <input type="hidden" name="token" value="'.newToken().
'">
2091 <input type="hidden" name="action" value="'.(($action !=
'editline') ?
'addline' :
'updateline').
'">
2092 <input type="hidden" name="mode" value="">
2093 <input type="hidden" name="id" value="'.$object->id.
'">
2094 <input type="hidden" name="page_y" value="">
2095 <input type="hidden" name="backtopage" value="'.$backtopage.
'">
2098 print
'<div class="div-table-responsive-no-min">';
2099 print
'<table id="tablelines" class="noborder noshadow" width="100%">';
2102 if ($action !=
'editline') {
2103 $forcetoshowtitlelines = 1;
2104 if (empty($object->multicurrency_code)) {
2105 $object->multicurrency_code = $conf->currency;
2110 $parameters = array();
2111 $reshook = $hookmanager->executeHooks(
'formAddObjectLine', $parameters, $object, $action);
2115 if (empty($reshook)) {
2116 $object->formAddObjectLine(1, $mysoc, $soc);
2128 if (
GETPOST(
'modelselected')) {
2129 $action =
'presend';
2135 if ($user->socid == 0 && $action !=
'presend' && $action !=
'editline') {
2136 print
'<div class="tabsAction">';
2138 $parameters = array();
2139 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters, $object, $action);
2141 if (empty($reshook)) {
2145 'class' =>
'classfortooltip'
2150 if (empty($user->socid)) {
2151 if ($object->status == $object::STATUS_VALIDATED) {
2152 if ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') || $user->hasRight(
'contrat',
'creer'))) {
2153 print
dolGetButtonAction(
'', $langs->trans(
'SendMail'),
'default', $_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=presend&token='.newToken().
'&mode=init#formmailbeforetitle',
'',
true, $params);
2155 print
dolGetButtonAction(
'', $langs->trans(
'SendMail'),
'default',
'#',
'',
false, $params);
2160 if ($object->status == $object::STATUS_DRAFT && $nbofservices) {
2161 if ($user->hasRight(
'contrat',
'creer')) {
2162 unset($params[
'attr'][
'title']);
2163 print
dolGetButtonAction($langs->trans(
'Validate'),
'',
'default', $_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=valid&token='.newToken(),
'',
true, $params);
2165 $params[
'attr'][
'title'] = $langs->trans(
"NotEnoughPermissions");
2166 print
dolGetButtonAction($langs->trans(
'Validate'),
'',
'default',
'#',
'',
false, $params);
2169 if ($object->status == $object::STATUS_VALIDATED) {
2170 if ($user->hasRight(
'contrat',
'creer')) {
2171 unset($params[
'attr'][
'title']);
2172 print
dolGetButtonAction($langs->trans(
'Modify'),
'',
'default', $_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=reopen&token='.newToken(),
'',
true, $params);
2174 $params[
'attr'][
'title'] = $langs->trans(
"NotEnoughPermissions");
2175 print
dolGetButtonAction($langs->trans(
'Modify'),
'',
'default',
'#',
'',
false, $params);
2180 $arrayofcreatebutton = array();
2181 if (isModEnabled(
'commande') && $object->status > 0 && $object->nbofservicesclosed < $nbofservices) {
2182 $arrayofcreatebutton[] = array(
2183 'url' =>
'/commande/card.php?action=create&token='.newToken().
'&origin='.$object->element.
'&originid='.$object->id.
'&socid='.$object->thirdparty->id,
2184 'label' => $langs->trans(
'AddOrder'),
2186 'perm' => $user->hasRight(
'commande',
'creer')
2189 if (isModEnabled(
'facture') && $object->status > 0 && $soc->client > 0) {
2190 $arrayofcreatebutton[] = array(
2191 'url' =>
'/compta/facture/card.php?action=create&origin='.$object->element.
'&originid='.$object->id.
'&socid='.$object->thirdparty->id,
2192 'label' => $langs->trans(
'CreateBill'),
2194 'perm' => $user->hasRight(
'facture',
'creer')
2197 if (isModEnabled(
'supplier_invoice') && $object->status > 0 && $soc->fournisseur == 1) {
2198 $langs->load(
"suppliers");
2199 $arrayofcreatebutton[] = array(
2200 'url' =>
'/fourn/facture/card.php?action=create&origin='.$object->element.
'&originid='.$object->id.
'&socid='.$object->thirdparty->id,
2201 'label' => $langs->trans(
'AddSupplierInvoice'),
2203 'perm' => $user->hasRight(
'fournisseur',
'facture',
'creer')
2206 if (count($arrayofcreatebutton)) {
2207 unset($params[
'attr'][
'title']);
2208 print
dolGetButtonAction(
'', $langs->trans(
"Create"),
'default', $arrayofcreatebutton,
'',
true, $params);
2211 if ($object->nbofservicesclosed > 0 || $object->nbofserviceswait > 0) {
2212 if ($user->hasRight(
'contrat',
'activer')) {
2213 unset($params[
'attr'][
'title']);
2214 print
dolGetButtonAction($langs->trans(
'ActivateAllContracts'),
'',
'default', $_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=activate&token='.newToken(),
'',
true, $params);
2216 unset($params[
'attr'][
'title']);
2217 print
dolGetButtonAction($langs->trans(
'ActivateAllContracts'),
'',
'default',
'#',
'',
false, $params);
2220 if ($object->nbofservicesclosed < $nbofservices) {
2221 if ($user->hasRight(
'contrat',
'desactiver')) {
2222 unset($params[
'attr'][
'title']);
2223 print
dolGetButtonAction($langs->trans(
'CloseAllContracts'),
'',
'default', $_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=close&token='.newToken(),
'',
true, $params);
2225 unset($params[
'attr'][
'title']);
2226 print
dolGetButtonAction($langs->trans(
'CloseAllContracts'),
'',
'default',
'#',
'',
false, $params);
2238 if (
getDolGlobalString(
'CONTRACT_HIDE_CLOSED_SERVICES_BY_DEFAULT') && $object->nbofservicesclosed > 0) {
2239 if ($action ==
'showclosedlines') {
2240 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>';
2242 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>';
2247 if ($user->hasRight(
'contrat',
'creer')) {
2248 unset($params[
'attr'][
'title']);
2249 print
dolGetButtonAction($langs->trans(
'ToClone'),
'',
'default', $_SERVER[
'PHP_SELF'].
'?id='.$object->id.
'&socid='.$object->socid.
'&action=clone&token='.newToken(),
'',
true, $params);
2253 unset($params[
'attr'][
'title']);
2254 print
dolGetButtonAction($langs->trans(
'Delete'),
'',
'delete', $_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=delete&token='.newToken(),
'', $permissiontodelete, $params);
2260 if ($action !=
'presend') {
2261 print
'<div class="fichecenter"><div class="fichehalfleft">';
2267 $filedir = $conf->contrat->multidir_output[$object->entity].
"/".
dol_sanitizeFileName($object->ref);
2268 $urlsource = $_SERVER[
"PHP_SELF"].
"?id=".$object->id;
2269 $genallowed = $user->hasRight(
'contrat',
'lire');
2270 $delallowed = $user->hasRight(
'contrat',
'creer');
2273 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);
2277 $linktoelem = $form->showLinkToObjectBlock($object,
null, array(
'contrat'));
2278 $somethingshown = $form->showLinkedObjectBlock($object, $linktoelem);
2281 if ($object->statut != Contrat::STATUS_DRAFT &&
getDolGlobalString(
'CONTRACT_ALLOW_ONLINESIGN')) {
2282 print
'<br><!-- Link to sign -->';
2283 require_once DOL_DOCUMENT_ROOT.
'/core/lib/signature.lib.php';
2285 print showOnlineSignatureUrl(
'contract', $object->ref).
'<br>';
2288 print
'</div><div class="fichehalfright">';
2292 $morehtmlcenter =
dolGetButtonTitle($langs->trans(
'SeeAll'),
'',
'fa fa-bars imgforviewmode', DOL_URL_ROOT.
'/contrat/agenda.php?id='.$object->id);
2296 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
2298 $somethingshown =
$formactions->showactions($object,
'contract', $socid, 1,
'listactions', $MAXEVENT,
'', $morehtmlcenter);
2300 print
'</div></div>';
2304 $modelmail =
'contract';
2305 $defaulttopic =
'SendContractRef';
2306 $diroutput = $conf->contrat->multidir_output[$object->entity];
2307 $trackid =
'con'.$object->id;
2309 include DOL_DOCUMENT_ROOT.
'/core/tpl/card_presend.tpl.php';
2320if (isModEnabled(
'margin') && $action ==
'editline') {
2322<script
type=
"text/javascript">
2323$(document).ready(
function() {
2324 var idprod = $(
"input[name='idprod']").val();
2325 var fournprice = $(
"input[name='fournprice']").val();
2326 var token =
'<?php echo currentToken(); ?>';
2328 $.post(
'<?php echo DOL_URL_ROOT; ?>/fourn/ajax/getSupplierPrices.php', {
2332 if (data.length > 0) {
2335 $(data).each(
function() {
2336 options +=
'<option value="'+this.
id+
'" price="'+this.
price+
'"';
2337 if (fournprice > 0) {
2338 if (this.
id == fournprice) {
2339 options +=
' selected';
2340 $(
"#buying_price").val(this.price);
2344 options +=
'>'+this.label+
'</option>';
2346 options +=
'<option value=null'+(trouve?
'':
' selected')+
'><?php echo $langs->trans("InputPrice"); ?></option>';
2347 $(
"#fournprice").html(options);
2349 $(
"#buying_price").hide();
2350 $(
"#fournprice").show();
2353 $(
"#buying_price").show();
2355 $(
"#fournprice").change(
function() {
2356 var selval = $(
this).find(
'option:selected').attr(
"price");
2358 $(
"#buying_price").val(selval).hide();
2360 $(
'#buying_price').show();
2364 $(
"#fournprice").hide();
2365 $(
'#buying_price').show();
2371 $(
"#fournprice").hide();
2372 $(
'#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.
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.
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 a 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.