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');
771 $objectline->fk_product =
GETPOST(
'idprod',
'int');
772 $objectline->description =
GETPOST(
'product_desc',
'restricthtml');
773 $objectline->price_ht = $price_ht;
776 $objectline->remise_percent = $remise_percent;
777 $objectline->tva_tx = ($txtva ? $txtva : 0);
778 $objectline->vat_src_code = $vat_src_code;
779 $objectline->localtax1_tx = is_numeric($localtax1_tx) ? $localtax1_tx : 0;
780 $objectline->localtax2_tx = is_numeric($localtax2_tx) ? $localtax2_tx : 0;
781 $objectline->date_start = $date_start_update;
782 $objectline->date_start_real = $date_start_real_update;
783 $objectline->date_end = $date_end_update;
784 $objectline->date_end_real = $date_end_real_update;
785 $objectline->user_closing_id = $user->id;
787 $objectline->pa_ht = $pa_ht;
788 $objectline->rang = $objectline->rang;
791 $objectline->fk_unit =
GETPOST(
'unit');
793 $objectline->fk_unit =
null;
797 $extralabelsline = $extrafields->fetch_name_optionals_label($objectline->table_element);
798 $array_options = $extrafields->getOptionalsFromPost($object->table_element_line, $predef);
800 if (is_array($array_options) && count($array_options) > 0) {
802 foreach ($array_options as $key => $value) {
803 $objectline->array_options[$key] = $array_options[$key];
809 $result = $objectline->update($user);
812 $action =
'editline';
813 $_GET[
'rowid'] =
GETPOST(
'elrowid');
823 } elseif ($action ==
'confirm_deleteline' && $confirm ==
'yes' && $user->hasRight(
'contrat',
'creer')) {
824 $result = $object->deleteline(
GETPOST(
'lineid',
'int'), $user);
827 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$object->id);
832 } elseif ($action ==
'confirm_valid' && $confirm ==
'yes' && $user->hasRight(
'contrat',
'creer')) {
833 $result = $object->validate($user);
838 $outputlangs = $langs;
841 $newlang =
GETPOST(
'lang_id',
'aZ09');
844 $newlang = $object->thirdparty->default_lang;
846 if (!empty($newlang)) {
848 $outputlangs->setDefaultLang($newlang);
850 $model = $object->model_pdf;
851 $ret = $object->fetch($id);
853 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
858 } elseif ($action ==
'reopen' && $user->hasRight(
'contrat',
'creer')) {
859 $result = $object->reopen($user);
863 } elseif ($action ==
'confirm_close' && $confirm ==
'yes' && $user->hasRight(
'contrat',
'creer')) {
865 $result = $object->closeAll($user);
869 } elseif ($action ==
'confirm_activate' && $confirm ==
'yes' && $user->hasRight(
'contrat',
'creer')) {
872 $comment =
GETPOST(
'comment',
'alpha');
873 $result = $object->activateAll($user, $date_start, 0, $comment, $date_end);
877 } elseif ($action ==
'confirm_delete' && $confirm ==
'yes' && $user->hasRight(
'contrat',
'supprimer')) {
878 $result = $object->delete($user);
880 header(
"Location: list.php?restore_lastsearch_values=1");
885 } elseif ($action ==
'confirm_move' && $confirm ==
'yes' && $user->hasRight(
'contrat',
'creer')) {
888 $result = $contractline->fetch(
GETPOSTINT(
'lineid'));
889 $contractline->fk_contrat =
GETPOSTINT(
'newcid');
890 $result = $contractline->update($user, 1);
892 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$id);
898 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentities(
"RefNewContract")),
null,
'errors');
900 } elseif ($action ==
'update_extras' && $permissiontoadd) {
901 $object->oldcopy =
dol_clone($object, 2);
903 $attribute =
GETPOST(
'attribute',
'alphanohtml');
906 $ret = $extrafields->setOptionalsFromPost(
null, $object, $attribute);
913 $result = $object->updateExtraField($attribute,
'CONTRACT_MODIFY');
921 $action =
'edit_extras';
923 } elseif ($action ==
'setref_supplier' && $permissiontoadd) {
925 $object->oldcopy =
dol_clone($object, 2);
927 $result = $object->setValueFrom(
'ref_supplier',
GETPOST(
'ref_supplier',
'alpha'),
'',
null,
'text',
'', $user,
'CONTRACT_MODIFY');
930 $action =
'editref_supplier';
932 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$object->id);
936 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$id);
939 } elseif ($action ==
'setref_customer' && $permissiontoadd) {
941 $object->oldcopy =
dol_clone($object, 2);
943 $result = $object->setValueFrom(
'ref_customer',
GETPOST(
'ref_customer',
'alpha'),
'',
null,
'text',
'', $user,
'CONTRACT_MODIFY');
946 $action =
'editref_customer';
948 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$object->id);
952 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$id);
955 } elseif ($action ==
'setref' && $permissiontoadd) {
957 $result = $object->fetch($id);
962 $old_ref = $object->ref;
964 $result = $object->setValueFrom(
'ref',
GETPOST(
'ref',
'alpha'),
'',
null,
'text',
'', $user,
'CONTRACT_MODIFY');
969 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
970 $old_filedir = $conf->contrat->multidir_output[$object->entity].
'/'.
dol_sanitizeFileName($old_ref);
971 $new_filedir = $conf->contrat->multidir_output[$object->entity].
'/'.
dol_sanitizeFileName($object->ref);
976 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$object->id);
980 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$id);
983 } elseif ($action ==
'setdate_contrat' && $permissiontoadd) {
985 $result = $object->fetch($id);
990 $result = $object->setValueFrom(
'date_contrat', $datacontrat,
'',
null,
'date',
'', $user,
'CONTRACT_MODIFY');
993 $action =
'editdate_contrat';
995 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$object->id);
999 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$id);
1005 include DOL_DOCUMENT_ROOT.
'/core/actions_printing.inc.php';
1008 $upload_dir = $conf->contrat->multidir_output[!empty($object->entity) ? $object->entity : $conf->entity];
1009 include DOL_DOCUMENT_ROOT.
'/core/actions_builddoc.inc.php';
1012 $triggersendname =
'CONTRACT_SENTBYMAIL';
1014 $mode =
'emailfromcontract';
1015 $trackid =
'con'.$object->id;
1016 include DOL_DOCUMENT_ROOT.
'/core/actions_sendmails.inc.php';
1019 if (
getDolGlobalString(
'MAIN_DISABLE_CONTACTS_TAB') && $user->hasRight(
'contrat',
'creer')) {
1020 if ($action ==
'addcontact') {
1023 $result = $object->add_contact($contactid, $typeid,
GETPOST(
"source",
'aZ09'));
1026 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$object->id);
1029 if ($object->error ==
'DB_ERROR_RECORD_ALREADY_EXISTS') {
1030 $langs->load(
"errors");
1031 setEventMessages($langs->trans(
"ErrorThisContactIsAlreadyDefinedAsThisType"),
null,
'errors');
1036 } elseif ($action ==
'swapstatut') {
1038 $result = $object->swapContactStatus(
GETPOST(
'ligne',
'int'));
1039 } elseif ($action ==
'deletecontact') {
1041 $result = $object->delete_contact(
GETPOST(
'lineid',
'int'));
1044 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$object->id);
1053 if ($action ==
'confirm_clone' && $confirm ==
'yes') {
1055 setEventMessages($langs->trans(
"NoCloneOptionsSpecified"),
null,
'errors');
1057 if ($object->id > 0) {
1058 $result = $object->createFromClone($user, $socid);
1060 header(
"Location: ".$_SERVER[
'PHP_SELF'].
'?id='.$result);
1063 if (count($object->errors) > 0) {
1078$help_url =
'EN:Module_Contracts|FR:Module_Contrat';
1080$title = $object->ref.
" - ".$langs->trans(
'Contract');
1081if ($action ==
'create') {
1082 $title = $langs->trans(
"NewContract");
1087$form =
new Form($db);
1089if (isModEnabled(
'project')) {
1094$module = (
getDolGlobalString(
'CONTRACT_ADDON') ? $conf->global->CONTRACT_ADDON :
'mod_contract_serpis');
1095if (substr($module, 0, 13) ==
'mod_contract_' && substr($module, -3) ==
'php') {
1096 $module = substr($module, 0,
dol_strlen($module) - 4);
1100 $modCodeContract =
new $module();
1104if ($action ==
'create') {
1110 $soc->fetch($socid);
1116 $element = $subelement =
GETPOST(
'origin');
1117 if (preg_match(
'/^([^_]+)_([^_]+)/i',
GETPOST(
'origin'), $regs)) {
1118 $element = $regs[1];
1119 $subelement = $regs[2];
1122 if ($element ==
'project') {
1123 $projectid =
GETPOST(
'originid',
'int');
1126 if ($element ==
'order' || $element ==
'commande') {
1127 $element = $subelement =
'commande';
1129 if ($element ==
'propal') {
1130 $element =
'comm/propal';
1131 $subelement =
'propal';
1133 if ($element ==
'invoice' || $element ==
'facture') {
1134 $element =
'compta/facture';
1135 $subelement =
'facture';
1140 $classname = ucfirst($subelement);
1141 $objectsrc =
new $classname($db);
1142 $objectsrc->fetch($originid);
1143 if (empty($objectsrc->lines) && method_exists($objectsrc,
'fetch_lines')) {
1144 $objectsrc->fetch_lines();
1146 $objectsrc->fetch_thirdparty();
1149 $objectsrc->fetch_optionals();
1150 $object->array_options = $objectsrc->array_options;
1152 $projectid = (!empty($objectsrc->fk_project) ? $objectsrc->fk_project :
'');
1154 $soc = $objectsrc->thirdparty;
1156 $note_private = (!empty($objectsrc->note_private) ? $objectsrc->note_private :
'');
1157 $note_public = (!empty($objectsrc->note_public) ? $objectsrc->note_public :
'');
1160 $srccontactslist = $objectsrc->liste_contact(-1,
'external', 1);
1163 $projectid =
GETPOST(
'projectid',
'int');
1164 $note_private =
GETPOST(
"note_private");
1165 $note_public =
GETPOST(
"note_public");
1168 $object->date_contrat =
dol_now();
1170 print
'<form name="form_contract" action="'.$_SERVER[
"PHP_SELF"].
'" method="post">';
1171 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1172 print
'<input type="hidden" name="action" value="add">';
1173 print
'<input type="hidden" name="socid" value="'.$soc->id.
'">'.
"\n";
1174 print
'<input type="hidden" name="remise_percent" value="0">';
1175 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
1179 print
'<table class="border centpercent">';
1182 print
'<tr><td class="titlefieldcreate fieldrequired">'.$langs->trans(
'Ref').
'</td><td>';
1183 if (!empty($modCodeContract->code_auto)) {
1184 $tmpcode = $langs->trans(
"Draft");
1186 $tmpcode =
'<input name="ref" class="maxwidth100" maxlength="128" value="'.dol_escape_htmltag(
GETPOST(
'ref') ?
GETPOST(
'ref') : $tmpcode).
'">';
1192 print
'<tr><td>'.$langs->trans(
'RefCustomer').
'</td>';
1193 print
'<td><input type="text" class="maxwidth150" name="ref_customer" id="ref_customer" value="'.dol_escape_htmltag(
GETPOST(
'ref_customer',
'alpha')).
'"></td></tr>';
1196 print
'<tr><td>'.$langs->trans(
'RefSupplier').
'</td>';
1197 print
'<td><input type="text" class="maxwidth150" name="ref_supplier" id="ref_supplier" value="'.dol_escape_htmltag(
GETPOST(
'ref_supplier',
'alpha')).
'"></td></tr>';
1201 print
'<td class="fieldrequired">'.$langs->trans(
'ThirdParty').
'</td>';
1204 print $soc->getNomUrl(1);
1205 print
'<input type="hidden" name="socid" value="'.$soc->id.
'">';
1209 print
img_picto(
'',
'company',
'class="pictofixedwidth"');
1210 print $form->select_company(
'',
'socid',
'',
'SelectThirdParty', 1, 0,
null, 0,
'minwidth300 widthcentpercentminusxx maxwidth500');
1211 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>';
1218 print
'<tr><td>'.$langs->trans(
'Discounts').
'</td><td>';
1219 if ($soc->remise_percent) {
1220 print $langs->trans(
"CompanyHasRelativeDiscount", $soc->remise_percent).
' ';
1222 print
'<span class="hideonsmartphone">'.$langs->trans(
"CompanyHasNoRelativeDiscount").
'. </span>';
1224 $absolute_discount = $soc->getAvailableDiscounts();
1225 if ($absolute_discount) {
1226 print $langs->trans(
"CompanyHasAbsoluteDiscount",
price($absolute_discount), $langs->trans(
"Currency".$conf->currency)).
'.';
1228 print
'<span class="hideonsmartphone">'.$langs->trans(
"CompanyHasNoAbsoluteDiscount").
'.</span>';
1234 print
'<tr><td class="nowrap"><span class="fieldrequired">'.$langs->trans(
"TypeContact_contrat_internal_SALESREPFOLL").
'</span></td><td>';
1235 print
img_picto(
'',
'user',
'class="pictofixedwidth"');
1236 print $form->select_dolusers(
GETPOST(
"commercial_suivi_id") ?
GETPOST(
"commercial_suivi_id") : $user->id,
'commercial_suivi_id', 1,
'');
1240 print
'<tr><td class="nowrap"><span class="fieldrequired">'.$langs->trans(
"TypeContact_contrat_internal_SALESREPSIGN").
'</span></td><td>';
1241 print
img_picto(
'',
'user',
'class="pictofixedwidth"');
1242 print $form->select_dolusers(
GETPOST(
"commercial_signature_id") ?
GETPOST(
"commercial_signature_id") : $user->id,
'commercial_signature_id', 1,
'');
1245 print
'<tr><td><span class="fieldrequired">'.$langs->trans(
"Date").
'</span></td><td>';
1246 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
1247 print $form->selectDate($datecontrat,
'', 0, 0,
'',
"contrat");
1251 if (isModEnabled(
'project')) {
1252 $langs->load(
'projects');
1256 print
'<tr><td>'.$langs->trans(
"Project").
'</td><td>';
1257 print
img_picto(
'',
'project',
'class="pictofixedwidth"');
1258 $formproject->select_projects(($soc->id > 0 ? $soc->id : -1), $projectid,
"projectid", 0, 0, 1, 1);
1259 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>';
1263 print
'<tr><td>'.$langs->trans(
"NotePublic").
'</td><td class="tdtop">';
1264 $doleditor =
new DolEditor(
'note_public', $note_public,
'',
'100',
'dolibarr_notes',
'In', 1,
true, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PUBLIC') ? 0 : 1, ROWS_3,
'90%');
1265 print $doleditor->Create(1);
1268 if (empty($user->socid)) {
1269 print
'<tr><td>'.$langs->trans(
"NotePrivate").
'</td><td class="tdtop">';
1270 $doleditor =
new DolEditor(
'note_private', $note_private,
'',
'100',
'dolibarr_notes',
'In', 1,
true, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PRIVATE') ? 0 : 1, ROWS_3,
'90%');
1271 print $doleditor->Create(1);
1276 $parameters = array(
'objectsrc' => $objectsrc,
'colspan' =>
' colspan="3"',
'cols' =>
'3');
1277 $reshook = $hookmanager->executeHooks(
'formObjectOptions', $parameters, $object, $action);
1278 print $hookmanager->resPrint;
1281 if (empty($reshook)) {
1282 print $object->showOptionals($extrafields,
'create', $parameters);
1289 print $form->buttonsSaveCancel(
"Create");
1291 if (is_object($objectsrc)) {
1292 print
'<input type="hidden" name="origin" value="'.$objectsrc->element.
'">';
1293 print
'<input type="hidden" name="originid" value="'.$objectsrc->id.
'">';
1296 print
'<br>'.$langs->trans(
"Note").
': '.$langs->trans(
"OnlyLinesWithTypeServiceAreUsed");
1305 if ($object->id > 0) {
1306 $object->fetch_thirdparty();
1308 $soc = $object->thirdparty;
1310 $result = $object->fetch_lines();
1315 $nbofservices = count($object->lines);
1317 $author =
new User($db);
1318 $author->fetch($object->user_author_id);
1320 $commercial_signature =
new User($db);
1321 $commercial_signature->fetch($object->commercial_signature_id);
1323 $commercial_suivi =
new User($db);
1324 $commercial_suivi->fetch($object->commercial_suivi_id);
1331 print
dol_get_fiche_head($head, $hselected, $langs->trans(
"Contract"), -1,
'contract');
1334 if ($action ==
'delete') {
1336 $formconfirm = $form->formconfirm($_SERVER[
'PHP_SELF'].
"?id=".$object->id, $langs->trans(
"DeleteAContract"), $langs->trans(
"ConfirmDeleteAContract"),
"confirm_delete",
'', 0, 1);
1337 } elseif ($action ==
'valid') {
1339 $ref = substr($object->ref, 1, 4);
1340 if ($ref ==
'PROV' && !empty($modCodeContract->code_auto)) {
1341 $numref = $object->getNextNumRef($object->thirdparty);
1343 $numref = $object->ref;
1345 $text = $langs->trans(
'ConfirmValidateContract', $numref);
1346 $formconfirm = $form->formconfirm($_SERVER[
'PHP_SELF'].
"?id=".$object->id, $langs->trans(
"ValidateAContract"), $text,
"confirm_valid",
'', 0, 1);
1347 } elseif ($action ==
'close') {
1349 $formconfirm = $form->formconfirm($_SERVER[
'PHP_SELF'].
"?id=".$object->id, $langs->trans(
"CloseAContract"), $langs->trans(
"ConfirmCloseContract"),
"confirm_close",
'', 0, 1);
1350 } elseif ($action ==
'activate') {
1351 $formquestion = array(
1352 array(
'type' =>
'date',
'name' =>
'd_start',
'label' => $langs->trans(
"DateServiceActivate"),
'value' =>
dol_now()),
1353 array(
'type' =>
'date',
'name' =>
'd_end',
'label' => $langs->trans(
"DateEndPlanned"),
'',
''),
1354 array(
'type' =>
'text',
'name' =>
'comment',
'label' => $langs->trans(
"Comment"),
'value' =>
'',
'',
'',
'class' =>
'minwidth300',
'moreattr'=>
'autofocus')
1356 $formconfirm = $form->formconfirm($_SERVER[
'PHP_SELF'].
"?id=".$object->id, $langs->trans(
"ActivateAllOnContract"), $langs->trans(
"ConfirmActivateAllOnContract"),
"confirm_activate", $formquestion,
'yes', 1, 280);
1357 } elseif ($action ==
'clone') {
1358 $filter =
'(s.client:IN:1,2,3)';
1360 $formquestion = array(array(
'type' =>
'other',
'name' =>
'socid',
'label' => $langs->trans(
"SelectThirdParty"),
'value' => $form->select_company(
GETPOST(
'socid',
'int'),
'socid', $filter)));
1361 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.$object->id, $langs->trans(
'ToClone'), $langs->trans(
'ConfirmCloneContract', $object->ref),
'confirm_clone', $formquestion,
'yes', 1);
1366 $parameters = array(
1367 'formConfirm' => $formconfirm,
1372 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters, $object, $action);
1373 if (empty($reshook)) {
1374 $formconfirm .= $hookmanager->resPrint;
1375 } elseif ($reshook > 0) {
1376 $formconfirm = $hookmanager->resPrint;
1384 if ($object->status == $object::STATUS_DRAFT && $user->hasRight(
'contrat',
'creer')) {
1385 print
'<form action="'.$_SERVER[
'PHP_SELF'].
'?id='.$object->id.
'" method="POST">';
1386 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1387 print
'<input type="hidden" name="action" value="setremise">';
1388 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
1393 $linkback =
'<a href="'.DOL_URL_ROOT.
'/contrat/list.php?restore_lastsearch_values=1'.(!empty($socid) ?
'&socid='.$socid :
'').
'">'.$langs->trans(
"BackToList").
'</a>';
1397 if (!empty($modCodeContract->code_auto)) {
1398 $morehtmlref .= $object->ref;
1400 $morehtmlref .= $form->editfieldkey(
"",
'ref', $object->ref, $object, $user->hasRight(
'contrat',
'creer'),
'string',
'', 0, 3);
1401 $morehtmlref .= $form->editfieldval(
"",
'ref', $object->ref, $object, $user->hasRight(
'contrat',
'creer'),
'string',
'', 0, 2);
1404 $morehtmlref .=
'<div class="refidno">';
1406 $morehtmlref .= $form->editfieldkey(
"RefCustomer",
'ref_customer', $object->ref_customer, $object, $user->hasRight(
'contrat',
'creer'),
'string',
'', 0, 1);
1407 $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');
1409 $morehtmlref .=
'<br>';
1410 $morehtmlref .= $form->editfieldkey(
"RefSupplier",
'ref_supplier', $object->ref_supplier, $object, $user->hasRight(
'contrat',
'creer'),
'string',
'', 0, 1);
1411 $morehtmlref .= $form->editfieldval(
"RefSupplier",
'ref_supplier', $object->ref_supplier, $object, $user->hasRight(
'contrat',
'creer'),
'string',
'',
null,
null,
'', 1,
'getFormatedSupplierRef');
1413 $morehtmlref .=
'<br>'.$object->thirdparty->getNomUrl(1);
1415 $morehtmlref .=
' (<a href="'.DOL_URL_ROOT.
'/contrat/list.php?socid='.$object->thirdparty->id.
'&search_name='.urlencode($object->thirdparty->name).
'">'.$langs->trans(
"OtherContracts").
'</a>)';
1418 if (isModEnabled(
'project')) {
1419 $langs->load(
"projects");
1420 $morehtmlref .=
'<br>';
1421 if ($permissiontoadd) {
1422 $morehtmlref .=
img_picto($langs->trans(
"Project"),
'project',
'class="pictofixedwidth"');
1423 if ($action !=
'classify') {
1424 $morehtmlref .=
'<a class="editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?action=classify&token='.newToken().
'&id='.$object->id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetProject')).
'</a> ';
1426 $morehtmlref .= $form->form_project($_SERVER[
'PHP_SELF'].
'?id='.$object->id, $object->socid, $object->fk_project, ($action ==
'classify' ?
'projectid' :
'none'), 0, 0, 0, 1,
'',
'maxwidth300');
1428 if (!empty($object->fk_project)) {
1430 $proj->fetch($object->fk_project);
1431 $morehtmlref .= $proj->getNomUrl(1);
1433 $morehtmlref .=
'<span class="opacitymedium"> - '.dol_escape_htmltag($proj->title).
'</span>';
1438 $morehtmlref .=
'</div>';
1441 dol_banner_tab($object,
'ref', $linkback, 1,
'ref',
'none', $morehtmlref);
1444 print
'<div class="fichecenter">';
1445 print
'<div class="underbanner clearboth"></div>';
1448 print
'<table class="border tableforfield" width="100%">';
1451 print
'<tr><td class="titlefield">'.$langs->trans(
'Discount').
'</td><td colspan="3">';
1452 if ($object->thirdparty->remise_percent) {
1453 print $langs->trans(
"CompanyHasRelativeDiscount", $object->thirdparty->remise_percent).
'. ';
1455 print
'<span class="hideonsmartphone">'.$langs->trans(
"CompanyHasNoRelativeDiscount").
'. </span>';
1457 $absolute_discount = $object->thirdparty->getAvailableDiscounts();
1458 if ($absolute_discount) {
1459 print $langs->trans(
"CompanyHasAbsoluteDiscount",
price($absolute_discount), $langs->trans(
"Currency".$conf->currency)).
'.';
1461 print
'<span class="hideonsmartphone">'.$langs->trans(
"CompanyHasNoAbsoluteDiscount").
'.</span>';
1467 print
'<td class="titlefield">';
1468 print $form->editfieldkey(
"Date",
'date_contrat', $object->date_contrat, $object, $user->hasRight(
'contrat',
'creer'));
1470 print $form->editfieldval(
"Date",
'date_contrat', $object->date_contrat, $object, $user->hasRight(
'contrat',
'creer'),
'datehourpicker');
1476 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_view.tpl.php';
1482 if ($object->status == $object::STATUS_DRAFT && $user->hasRight(
'contrat',
'creer')) {
1489 $blocname =
'contacts';
1490 $title = $langs->trans(
'ContactsAddresses');
1491 include DOL_DOCUMENT_ROOT.
'/core/tpl/bloc_showhide.tpl.php';
1495 $blocname =
'notes';
1496 $title = $langs->trans(
'Notes');
1497 include DOL_DOCUMENT_ROOT.
'/core/tpl/bloc_showhide.tpl.php';
1501 $arrayothercontracts = $object->getListOfContracts(
'others');
1509 global $inputalsopricewithtax;
1510 $inputalsopricewithtax = 1;
1512 $productstatic =
new Product($db);
1515 if (isModEnabled(
'margin') && !empty($object->element) && in_array($object->element, array(
'facture',
'propal',
'commande'))) {
1523 print
'<div id="contrat-lines-container" id="contractlines" data-contractid="'.$object->id.
'" data-element="'.$object->element.
'" >';
1524 while ($cursorline <= $nbofservices) {
1525 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.
'" >';
1526 print
'<form name="update" id="addproduct" action="'.$_SERVER[
'PHP_SELF'].
'?id='.$object->id.
'" method="post">';
1527 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1528 print
'<input type="hidden" name="action" value="updateline">';
1529 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
1530 print
'<input type="hidden" name="elrowid" value="'.$object->lines[$cursorline - 1]->id.
'">';
1531 print
'<input type="hidden" name="fournprice" value="'.(!empty($object->lines[$cursorline - 1]->fk_fournprice) ? $object->lines[$cursorline - 1]->fk_fournprice : 0).
'">';
1534 print
'<div class="div-table-responsive-no-min">';
1535 print
'<table class="notopnoleftnoright allwidth tableforservicepart1 centpercent">';
1537 $sql =
"SELECT cd.rowid, cd.statut, cd.label as label_det, cd.fk_product, cd.product_type, cd.description, cd.price_ht, cd.qty,";
1538 $sql .=
" cd.tva_tx, cd.vat_src_code, cd.remise_percent, cd.info_bits, cd.subprice, cd.multicurrency_subprice,";
1539 $sql .=
" cd.date_ouverture_prevue as date_start, cd.date_ouverture as date_start_real,";
1540 $sql .=
" cd.date_fin_validite as date_end, cd.date_cloture as date_end_real,";
1541 $sql .=
" cd.commentaire as comment, cd.fk_product_fournisseur_price as fk_fournprice, cd.buy_price_ht as pa_ht,";
1542 $sql .=
" cd.fk_unit,";
1543 $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";
1544 $sql .=
" ,cd.rang";
1545 $sql .=
" FROM ".MAIN_DB_PREFIX.
"contratdet as cd";
1546 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"product as p ON cd.fk_product = p.rowid";
1547 $sql .=
" WHERE cd.rowid = ".((int) $object->lines[$cursorline - 1]->id);
1549 $result = $db->query($sql);
1553 $objp = $db->fetch_object($result);
1556 print
'<tr class="liste_titre'.($cursorline ?
' liste_titre_add' :
'').
'">';
1557 print
'<td>'.$langs->trans(
"ServiceNb", $cursorline).
'</td>';
1558 print
'<td width="80" class="center">'.$langs->trans(
"VAT").
'</td>';
1559 print
'<td width="80" class="right">'.$langs->trans(
"PriceUHT").
'</td>';
1563 print
'<td width="30" class="center">'.$langs->trans(
"Qty").
'</td>';
1565 print
'<td width="30" class="left">'.$langs->trans(
"Unit").
'</td>';
1567 print
'<td width="50" class="right">'.$langs->trans(
"ReductionShort").
'</td>';
1569 print
'<td width="50" class="right">'.$langs->trans(
"BuyingPrice").
'</td>';
1573 if ($nbofservices > 1 && $conf->browser->layout !=
'phone' && $user->hasRight(
'contrat',
'creer')) {
1574 print
'<td width="30" class="linecolmove tdlineupdown center">';
1575 if ($cursorline > 1) {
1576 print
'<a class="lineupdown reposition" href="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=up&token='.newToken().
'&rowid='.$objp->rowid.
'">';
1577 echo
img_up(
'default', 0,
'imgupforline');
1580 if ($cursorline < $nbofservices) {
1581 print
'<a class="lineupdown reposition" href="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=down&token='.newToken().
'&rowid='.$objp->rowid.
'">';
1582 echo
img_down(
'default', 0,
'imgdownforline');
1587 print
'<td width="30"> </td>';
1595 if ($action !=
'editline' ||
GETPOST(
'rowid') != $objp->rowid) {
1597 if (
getDolGlobalString(
'CONTRACT_HIDE_CLOSED_SERVICES_BY_DEFAULT') && $objp->statut == ContratLigne::STATUS_CLOSED && $action !=
'showclosedlines') {
1598 $moreparam =
'style="display: none;"';
1601 print
'<tr class="tdtop oddeven" '.$moreparam.
'>';
1604 if ($objp->fk_product > 0) {
1605 $productstatic->id = $objp->fk_product;
1606 $productstatic->type = $objp->ptype;
1607 $productstatic->ref = $objp->pref;
1608 $productstatic->entity = $objp->pentity;
1609 $productstatic->label = $objp->plabel;
1610 $productstatic->status = $objp->tosell;
1611 $productstatic->status_buy = $objp->tobuy;
1612 $productstatic->status_batch = $objp->tobatch;
1615 $text = $productstatic->getNomUrl(1,
'', 32);
1616 if ($objp->plabel) {
1618 $text .= $objp->plabel;
1620 $description = $objp->description;
1624 $text .= (!empty($objp->description) && $objp->description != $objp->plabel) ?
'<br>'.
dol_htmlentitiesbr($objp->description) :
'';
1628 print $form->textwithtooltip($text, $description, 3,
'',
'', $cursorline, 3, (!empty($line->fk_parent_line) ?
img_picto(
'',
'rightarrow') :
''));
1632 print
'<td>'.img_object($langs->trans(
"ShowProductOrService"), ($objp->product_type ?
'service' :
'product')).
' '.
dol_htmlentitiesbr($objp->
description).
"</td>\n";
1635 print
'<td class="center">';
1636 print
vatrate($objp->tva_tx.($objp->vat_src_code ? (
' ('.$objp->vat_src_code.
')') :
''),
'%', $objp->info_bits);
1639 print
'<td class="right">'.($objp->subprice !=
'' ?
price($objp->subprice) :
'').
"</td>\n";
1645 print
'<td class="center">'.$objp->qty.
'</td>';
1648 print
'<td class="left">'.$langs->trans($object->lines[$cursorline - 1]->getLabelOfUnit()).
'</td>';
1651 if ($objp->remise_percent > 0) {
1652 print
'<td class="right">'.$objp->remise_percent.
"%</td>\n";
1654 print
'<td> </td>';
1659 print
'<td class="right nowraponall">'.price($objp->pa_ht).
'</td>';
1663 print
'<td class="nowraponall right">';
1664 if ($user->hasRight(
'contrat',
'creer') && is_array($arrayothercontracts) && count($arrayothercontracts) && ($object->statut >= 0)) {
1665 print
'<!-- link to move service line into another contract -->';
1666 print
'<a class="reposition marginrightonly" style="padding-left: 5px;" href="'.$_SERVER[
'PHP_SELF'].
'?id='.$object->id.
'&action=move&token='.newToken().
'&rowid='.$objp->rowid.
'">';
1667 print
img_picto($langs->trans(
"MoveToAnotherContract"),
'uparrow');
1670 if ($user->hasRight(
'contrat',
'creer') && ($object->statut >= 0)) {
1671 print
'<a class="reposition marginrightonly editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?id='.$object->id.
'&action=editline&token='.newToken().
'&rowid='.$objp->rowid.
'">';
1675 if ($user->hasRight(
'contrat',
'creer') && ($object->statut >= 0)) {
1676 print
'<a class="reposition marginrightonly" href="'.$_SERVER[
'PHP_SELF'].
'?id='.$object->id.
'&action=deleteline&token='.newToken().
'&rowid='.$objp->rowid.
'">';
1693 if ($objp->subprice >= 0) {
1694 print
'<tr class="oddeven" '.$moreparam.
'>';
1695 print
'<td colspan="'.$colspan.
'">';
1698 print $langs->trans(
"DateStartPlanned").
': ';
1699 if ($objp->date_start) {
1702 if ($objp->statut == 0 && $db->jdate($objp->date_start) < ($now - $conf->contrat->services->inactifs->warning_delay)) {
1703 $warning_delay = $conf->contrat->services->inactifs->warning_delay / 3600 / 24;
1704 $textlate = $langs->trans(
"Late").
' = '.$langs->trans(
"DateReference").
' > '.$langs->trans(
"DateToday").
' '.(ceil($warning_delay) >= 0 ?
'+' :
'').ceil($warning_delay).
' '.$langs->trans(
"days");
1705 print
" ".img_warning($textlate);
1708 print $langs->trans(
"Unknown");
1710 print
' - ';
1711 print $langs->trans(
"DateEndPlanned").
': ';
1712 if ($objp->date_end) {
1714 if ($objp->statut == 4 && $db->jdate($objp->date_end) < ($now - $conf->contrat->services->expires->warning_delay)) {
1715 $warning_delay = $conf->contrat->services->expires->warning_delay / 3600 / 24;
1716 $textlate = $langs->trans(
"Late").
' = '.$langs->trans(
"DateReference").
' > '.$langs->trans(
"DateToday").
' '.(ceil($warning_delay) >= 0 ?
'+' :
'').ceil($warning_delay).
' '.$langs->trans(
"days");
1717 print
" ".img_warning($textlate);
1720 print $langs->trans(
"Unknown");
1728 if (is_array($extralabelslines) && count($extralabelslines) > 0) {
1730 $line->id = $objp->rowid;
1731 $line->fetch_optionals();
1732 print $line->showOptionals($extrafields,
'view', array(
'class'=>
'oddeven',
'style'=>$moreparam,
'colspan'=>$colspan,
'tdclass' =>
'notitlefieldcreate'),
'',
'', 1);
1737 print
'<tr class="oddeven">';
1739 if ($objp->fk_product > 0) {
1740 $canchangeproduct = 1;
1741 if (empty($canchangeproduct)) {
1742 $productstatic->id = $objp->fk_product;
1743 $productstatic->type = $objp->ptype;
1744 $productstatic->ref = $objp->pref;
1745 $productstatic->entity = $objp->pentity;
1746 print $productstatic->getNomUrl(1,
'', 32);
1747 print $objp->label ?
' - '.dol_trunc($objp->label, 32) :
'';
1748 print
'<input type="hidden" name="idprod" value="'.(!empty($object->lines[$cursorline - 1]->fk_product) ? $object->lines[$cursorline - 1]->fk_product : 0).
'">';
1750 $senderissupplier = 0;
1751 if (empty($senderissupplier)) {
1752 print $form->select_produits((!empty($object->lines[$cursorline - 1]->fk_product) ? $object->lines[$cursorline - 1]->fk_product : 0),
'idprod');
1754 $form->select_produits_fournisseurs((!empty($object->lines[$cursorline - 1]->fk_product) ? $object->lines[$cursorline - 1]->fk_product : 0),
'idprod');
1759 print $objp->label ? $objp->label.
'<br>' :
'';
1760 print
'<input type="hidden" name="idprod" value="'.(!empty($object->lines[$cursorline - 1]->fk_product) ? $object->lines[$cursorline - 1]->fk_product : 0).
'">';
1764 require_once DOL_DOCUMENT_ROOT.
'/core/class/doleditor.class.php';
1767 $nbrows = $conf->global->MAIN_INPUT_DESC_HEIGHT;
1769 $enable = (isset($conf->global->FCKEDITOR_ENABLE_DETAILS) ? $conf->global->FCKEDITOR_ENABLE_DETAILS : 0);
1770 $doleditor =
new DolEditor(
'product_desc', $objp->description,
'', 92,
'dolibarr_details',
'',
false,
true, $enable, $nbrows,
'90%');
1771 $doleditor->Create();
1776 print
'<td class="right">';
1777 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);
1781 print
'<td class="right"><input size="5" type="text" name="elprice" value="'.price($objp->subprice).
'"></td>';
1789 print
'<td class="center"><input size="2" type="text" name="elqty" value="'.$objp->qty.
'"></td>';
1793 print
'<td class="left">';
1794 print $form->selectUnits($objp->fk_unit,
"unit");
1799 print
'<td class="nowrap right"><input size="1" type="text" name="elremise_percent" value="'.$objp->remise_percent.
'">%</td>';
1801 if (!empty($usemargins)) {
1802 print
'<td class="right">';
1803 if ($objp->fk_product) {
1804 print
'<select id="fournprice" name="fournprice"></select>';
1806 print
'<input id="buying_price" type="text" size="5" name="buying_price" value="'.price($objp->pa_ht, 0,
'', 0).
'"></td>';
1808 print
'<td class="center">';
1809 print
'<input type="submit" class="button margintoponly marginbottomonly" name="save" value="'.$langs->trans(
"Modify").
'">';
1810 print
'<br><input type="submit" class="button margintoponly marginbottomonly button-cancel" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
1823 print
'<tr class="oddeven">';
1824 print
'<td colspan="'.$colspan.
'">';
1825 print $langs->trans(
"DateStartPlanned").
' ';
1826 print $form->selectDate($db->jdate($objp->date_start),
"date_start_update", $usehm, $usehm, ($db->jdate($objp->date_start) > 0 ? 0 : 1),
"update");
1827 print
' '.$langs->trans(
"DateEndPlanned").
' ';
1828 print $form->selectDate($db->jdate($objp->date_end),
"date_end_update", $usehm, $usehm, ($db->jdate($objp->date_end) > 0 ? 0 : 1),
"update");
1832 if (is_array($extralabelslines) && count($extralabelslines) > 0) {
1834 $line->id = $objp->rowid;
1835 $line->fetch_optionals();
1836 print $line->showOptionals($extrafields,
'edit', array(
'style'=>
'class="oddeven"',
'colspan'=>$colspan,
'tdclass' =>
'notitlefieldcreate'),
'',
'', 1);
1845 if ($object->statut > 0) {
1847 if (
getDolGlobalString(
'CONTRACT_HIDE_CLOSED_SERVICES_BY_DEFAULT') && $object->lines[$cursorline - 1]->statut == ContratLigne::STATUS_CLOSED && $action !=
'showclosedlines') {
1848 $moreparam =
'style="display: none;"';
1859 print
'<tr class="oddeven" '.$moreparam.
'>';
1860 print
'<td class="tdhrthin" colspan="'.$colspan.
'"><hr class="opacitymedium tdhrthin"></td>';
1873 if ($action ==
'deleteline' && !$_REQUEST[
"cancel"] && $user->hasRight(
'contrat',
'creer') && $object->lines[$cursorline - 1]->id ==
GETPOST(
'rowid')) {
1874 print $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$object->id.
"&lineid=".
GETPOST(
'rowid'), $langs->trans(
"DeleteContractLine"), $langs->trans(
"ConfirmDeleteContractLine"),
"confirm_deleteline",
'', 0, 1);
1875 if ($ret ==
'html') {
1876 print
'<table class="notopnoleftnoright" width="100%"><tr class="oddeven" height="6"><td></td></tr></table>';
1883 if ($action ==
'move' && !$_REQUEST[
"cancel"] && $user->hasRight(
'contrat',
'creer') && $object->lines[$cursorline - 1]->id ==
GETPOST(
'rowid')) {
1884 $arraycontractid = array();
1885 foreach ($arrayothercontracts as $contractcursor) {
1886 $arraycontractid[$contractcursor->id] = $contractcursor->ref;
1890 $formquestion = array(
1891 'text' => $langs->trans(
"ConfirmMoveToAnotherContractQuestion"),
1892 array(
'type' =>
'select',
'name' =>
'newcid',
'values' => $arraycontractid));
1894 print $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".$object->id.
"&lineid=".
GETPOST(
'rowid',
'int'), $langs->trans(
"MoveToAnotherContract"), $langs->trans(
"ConfirmMoveToAnotherContract"),
"confirm_move", $formquestion);
1895 print
'<table class="notopnoleftnoright" width="100%"><tr class="oddeven" height="6"><td></td></tr></table>';
1899 if ($object->statut > 0) {
1900 print
'<table class="notopnoleftnoright tableforservicepart2'.($cursorline < $nbofservices ?
' boxtablenobottom' :
'').
' centpercent">';
1902 print
'<tr class="oddeven" '.$moreparam.
'>';
1903 print
'<td><span class="valignmiddle hideonsmartphone">'.$langs->trans(
"ServiceStatus").
':</span> '.$object->lines[$cursorline - 1]->getLibStatut(4).
'</td>';
1904 print
'<td width="30" class="right">';
1905 if ($user->socid == 0) {
1906 if ($object->statut > 0 && $action !=
'activateline' && $action !=
'unactivateline') {
1907 $tmpaction =
'activateline';
1908 $tmpactionpicto =
'play';
1909 $tmpactiontext = $langs->trans(
"Activate");
1910 if ($objp->statut == 4) {
1911 $tmpaction =
'unactivateline';
1912 $tmpactionpicto =
'playstop';
1913 $tmpactiontext = $langs->trans(
"Disable");
1915 if (($tmpaction ==
'activateline' && $user->hasRight(
'contrat',
'activer')) || ($tmpaction ==
'unactivateline' && $user->hasRight(
'contrat',
'desactiver'))) {
1916 print
'<a class="reposition" href="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&ligne='.$object->lines[$cursorline - 1]->id.
'&action='.$tmpaction.
'">';
1917 print
img_picto($tmpactiontext, $tmpactionpicto);
1925 print
'<tr class="oddeven" '.$moreparam.
'>';
1929 if (!$objp->date_start_real) {
1930 print $langs->trans(
"DateStartReal").
': ';
1931 if ($objp->date_start_real) {
1934 print $langs->trans(
"ContractStatusNotRunning");
1938 if ($objp->date_start_real && !$objp->date_end_real) {
1939 print $langs->trans(
"DateStartReal").
': ';
1943 if ($objp->date_start_real && $objp->date_end_real) {
1944 print $langs->trans(
"DateStartReal").
': ';
1946 print
' - ';
1947 print $langs->trans(
"DateEndReal").
': ';
1950 if (!empty($objp->comment)) {
1951 print
" - ".$objp->comment;
1955 print
'<td class="center"> </td>';
1962 if ($user->hasRight(
'contrat',
'activer') && $action ==
'activateline' && $object->lines[$cursorline - 1]->id ==
GETPOST(
'ligne',
'int')) {
1963 print
'<form name="active" action="'.$_SERVER[
"PHP_SELF"].
'" method="POST">';
1964 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1965 print
'<input type="hidden" name="action" value="confirm_active">';
1966 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
1967 print
'<input type="hidden" name="id" value="'.$object->id.
'">';
1968 print
'<input type="hidden" name="ligne" value="'.GETPOST(
'ligne',
'int').
'">';
1969 print
'<input type="hidden" name="confirm" value="yes">';
1971 print
'<table class="noborder tableforservicepart2'.($cursorline < $nbofservices ?
' boxtablenobottom' :
'').
' centpercent">';
1974 $dateactstart = $objp->date_start;
1977 } elseif (!$dateactstart) {
1978 $dateactstart = time();
1981 $dateactend = $objp->date_end;
1984 } elseif (!$dateactend) {
1985 if ($objp->fk_product > 0) {
1987 $product->fetch($objp->fk_product);
1988 if (!empty($product->duration_value) && !empty($product->duration_unit)) {
1989 $dateactend =
dol_time_plus_duree(time(), $product->duration_value, $product->duration_unit);
1994 print
'<tr class="oddeven">';
1995 print
'<td class="nohover">'.$langs->trans(
"DateServiceActivate").
'</td><td class="nohover">';
1996 print $form->selectDate($dateactstart,
'start', $usehm, $usehm,
'',
"active", 1, 0);
1998 print
'<td class="nohover">'.$langs->trans(
"DateEndPlanned").
'</td><td class="nohover">';
1999 print $form->selectDate($dateactend,
"end", $usehm, $usehm,
'',
"active", 1, 0);
2001 print
'<td class="center nohover">';
2006 print
'<tr class="oddeven">';
2007 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>';
2008 print
'<td class="nohover right">';
2009 print
'<input type="submit" class="button" name="activate" value="'.$langs->trans(
"Activate").
'"> ';
2010 print
'<input type="submit" class="button button-cancel" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
2019 if ($user->hasRight(
'contrat',
'activer') && $action ==
'unactivateline' && $object->lines[$cursorline - 1]->id ==
GETPOST(
'ligne',
'int')) {
2023 print
'<!-- Form to disabled a line -->'.
"\n";
2024 print
'<form name="confirm_closeline" action="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&ligne='.$object->lines[$cursorline - 1]->id.
'" method="post">';
2025 print
'<input type="hidden" name="token" value="'.newToken().
'">';
2026 print
'<input type="hidden" name="confirm" value="yes">';
2027 print
'<input type="hidden" name="action" value="confirm_closeline">';
2028 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
2030 print
'<table class="noborder tableforservicepart2'.($cursorline < $nbofservices ?
' boxtablenobottom' :
'').
' centpercent">';
2033 $dateactstart = $objp->date_start_real;
2036 } elseif (!$dateactstart) {
2037 $dateactstart = time();
2040 $dateactend = $objp->date_end_real;
2043 } elseif (!$dateactend) {
2044 if ($objp->fk_product > 0) {
2046 $product->fetch($objp->fk_product);
2047 $dateactend =
dol_time_plus_duree(time(), $product->duration_value, $product->duration_unit);
2051 if ($dateactend > $now) {
2055 print
'<tr class="oddeven"><td colspan="2" class="nohover">';
2056 if ($objp->statut >= 4) {
2057 if ($objp->statut == 4) {
2058 print $langs->trans(
"DateEndReal").
' ';
2059 print $form->selectDate($dateactend,
"end", $usehm, $usehm, ($objp->date_end_real > 0 ? 0 : 1),
"closeline", 1, 1);
2063 print
'<td class="center nohover">';
2066 print
'<tr class="oddeven">';
2067 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>';
2068 print
'<td class="nohover right">';
2069 print
'<input type="submit" class="button" name="close" value="'.$langs->trans(
"Disable").
'"> ';
2070 print
'<input type="submit" class="button button-cancel" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
2084 if ($user->hasRight(
'contrat',
'creer') && ($object->statut == 0)) {
2088 print
' <form name="addproduct" id="addproduct" action="'.$_SERVER[
"PHP_SELF"].
'?id='.$object->id.(($action !=
'editline') ?
'' :
'#line_'.
GETPOST(
'lineid',
'int')).
'" method="POST">
2089 <input type="hidden" name="token" value="'.newToken().
'">
2090 <input type="hidden" name="action" value="'.(($action !=
'editline') ?
'addline' :
'updateline').
'">
2091 <input type="hidden" name="mode" value="">
2092 <input type="hidden" name="id" value="'.$object->id.
'">
2093 <input type="hidden" name="page_y" value="">
2094 <input type="hidden" name="backtopage" value="'.$backtopage.
'">
2097 print
'<div class="div-table-responsive-no-min">';
2098 print
'<table id="tablelines" class="noborder noshadow" width="100%">';
2101 if ($action !=
'editline') {
2102 $forcetoshowtitlelines = 1;
2103 if (empty($object->multicurrency_code)) {
2104 $object->multicurrency_code = $conf->currency;
2109 $parameters = array();
2110 $reshook = $hookmanager->executeHooks(
'formAddObjectLine', $parameters, $object, $action);
2114 if (empty($reshook)) {
2115 $object->formAddObjectLine(1, $mysoc, $soc);
2127 if (
GETPOST(
'modelselected')) {
2128 $action =
'presend';
2134 if ($user->socid == 0 && $action !=
'presend' && $action !=
'editline') {
2135 print
'<div class="tabsAction">';
2137 $parameters = array();
2138 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters, $object, $action);
2140 if (empty($reshook)) {
2144 'class' =>
'classfortooltip'
2149 if (empty($user->socid)) {
2150 if ($object->status == $object::STATUS_VALIDATED) {
2151 if ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') || $user->hasRight(
'contrat',
'creer'))) {
2152 print
dolGetButtonAction(
'', $langs->trans(
'SendMail'),
'default', $_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=presend&token='.newToken().
'&mode=init#formmailbeforetitle',
'',
true, $params);
2154 print
dolGetButtonAction(
'', $langs->trans(
'SendMail'),
'default',
'#',
'',
false, $params);
2159 if ($object->status == $object::STATUS_DRAFT && $nbofservices) {
2160 if ($user->hasRight(
'contrat',
'creer')) {
2161 unset($params[
'attr'][
'title']);
2162 print
dolGetButtonAction($langs->trans(
'Validate'),
'',
'default', $_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=valid&token='.newToken(),
'',
true, $params);
2164 $params[
'attr'][
'title'] = $langs->trans(
"NotEnoughPermissions");
2165 print
dolGetButtonAction($langs->trans(
'Validate'),
'',
'default',
'#',
'',
false, $params);
2168 if ($object->status == $object::STATUS_VALIDATED) {
2169 if ($user->hasRight(
'contrat',
'creer')) {
2170 unset($params[
'attr'][
'title']);
2171 print
dolGetButtonAction($langs->trans(
'Modify'),
'',
'default', $_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=reopen&token='.newToken(),
'',
true, $params);
2173 $params[
'attr'][
'title'] = $langs->trans(
"NotEnoughPermissions");
2174 print
dolGetButtonAction($langs->trans(
'Modify'),
'',
'default',
'#',
'',
false, $params);
2179 $arrayofcreatebutton = array();
2180 if (isModEnabled(
'commande') && $object->status > 0 && $object->nbofservicesclosed < $nbofservices) {
2181 $arrayofcreatebutton[] = array(
2182 'url' =>
'/commande/card.php?action=create&token='.newToken().
'&origin='.$object->element.
'&originid='.$object->id.
'&socid='.$object->thirdparty->id,
2183 'label' => $langs->trans(
'AddOrder'),
2185 'perm' => $user->hasRight(
'commande',
'creer')
2188 if (isModEnabled(
'facture') && $object->status > 0 && $soc->client > 0) {
2189 $arrayofcreatebutton[] = array(
2190 'url' =>
'/compta/facture/card.php?action=create&origin='.$object->element.
'&originid='.$object->id.
'&socid='.$object->thirdparty->id,
2191 'label' => $langs->trans(
'CreateBill'),
2193 'perm' => $user->hasRight(
'facture',
'creer')
2196 if (isModEnabled(
'supplier_invoice') && $object->status > 0 && $soc->fournisseur == 1) {
2197 $langs->load(
"suppliers");
2198 $arrayofcreatebutton[] = array(
2199 'url' =>
'/fourn/facture/card.php?action=create&origin='.$object->element.
'&originid='.$object->id.
'&socid='.$object->thirdparty->id,
2200 'label' => $langs->trans(
'AddSupplierInvoice'),
2202 'perm' => $user->hasRight(
'fournisseur',
'facture',
'creer')
2205 if (count($arrayofcreatebutton)) {
2206 unset($params[
'attr'][
'title']);
2207 print
dolGetButtonAction(
'', $langs->trans(
"Create"),
'default', $arrayofcreatebutton,
'',
true, $params);
2210 if ($object->nbofservicesclosed > 0 || $object->nbofserviceswait > 0) {
2211 if ($user->hasRight(
'contrat',
'activer')) {
2212 unset($params[
'attr'][
'title']);
2213 print
dolGetButtonAction($langs->trans(
'ActivateAllContracts'),
'',
'default', $_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=activate&token='.newToken(),
'',
true, $params);
2215 unset($params[
'attr'][
'title']);
2216 print
dolGetButtonAction($langs->trans(
'ActivateAllContracts'),
'',
'default',
'#',
'',
false, $params);
2219 if ($object->nbofservicesclosed < $nbofservices) {
2220 if ($user->hasRight(
'contrat',
'desactiver')) {
2221 unset($params[
'attr'][
'title']);
2222 print
dolGetButtonAction($langs->trans(
'CloseAllContracts'),
'',
'default', $_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=close&token='.newToken(),
'',
true, $params);
2224 unset($params[
'attr'][
'title']);
2225 print
dolGetButtonAction($langs->trans(
'CloseAllContracts'),
'',
'default',
'#',
'',
false, $params);
2237 if (
getDolGlobalString(
'CONTRACT_HIDE_CLOSED_SERVICES_BY_DEFAULT') && $object->nbofservicesclosed > 0) {
2238 if ($action ==
'showclosedlines') {
2239 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>';
2241 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>';
2246 if ($user->hasRight(
'contrat',
'creer')) {
2247 unset($params[
'attr'][
'title']);
2248 print
dolGetButtonAction($langs->trans(
'ToClone'),
'',
'default', $_SERVER[
'PHP_SELF'].
'?id='.$object->id.
'&socid='.$object->socid.
'&action=clone&token='.newToken(),
'',
true, $params);
2252 unset($params[
'attr'][
'title']);
2253 print
dolGetButtonAction($langs->trans(
'Delete'),
'',
'delete', $_SERVER[
"PHP_SELF"].
'?id='.$object->id.
'&action=delete&token='.newToken(),
'', $permissiontodelete, $params);
2259 if ($action !=
'presend') {
2260 print
'<div class="fichecenter"><div class="fichehalfleft">';
2266 $filedir = $conf->contrat->multidir_output[$object->entity].
"/".
dol_sanitizeFileName($object->ref);
2267 $urlsource = $_SERVER[
"PHP_SELF"].
"?id=".$object->id;
2268 $genallowed = $user->hasRight(
'contrat',
'lire');
2269 $delallowed = $user->hasRight(
'contrat',
'creer');
2272 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);
2276 $linktoelem = $form->showLinkToObjectBlock($object,
null, array(
'contrat'));
2277 $somethingshown = $form->showLinkedObjectBlock($object, $linktoelem);
2280 if ($object->statut != Contrat::STATUS_DRAFT &&
getDolGlobalString(
'CONTRACT_ALLOW_ONLINESIGN')) {
2281 print
'<br><!-- Link to sign -->';
2282 require_once DOL_DOCUMENT_ROOT.
'/core/lib/signature.lib.php';
2284 print showOnlineSignatureUrl(
'contract', $object->ref, $object).
'<br>';
2287 print
'</div><div class="fichehalfright">';
2291 $morehtmlcenter =
dolGetButtonTitle($langs->trans(
'SeeAll'),
'',
'fa fa-bars imgforviewmode', DOL_URL_ROOT.
'/contrat/agenda.php?id='.$object->id);
2295 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
2297 $somethingshown =
$formactions->showactions($object,
'contract', $socid, 1,
'listactions', $MAXEVENT,
'', $morehtmlcenter);
2299 print
'</div></div>';
2303 $modelmail =
'contract';
2304 $defaulttopic =
'SendContractRef';
2305 $diroutput = $conf->contrat->multidir_output[$object->entity];
2306 $trackid =
'con'.$object->id;
2308 include DOL_DOCUMENT_ROOT.
'/core/tpl/card_presend.tpl.php';
2319if (isModEnabled(
'margin') && $action ==
'editline') {
2321<script
type=
"text/javascript">
2322$(document).ready(
function() {
2323 var idprod = $(
"input[name='idprod']").val();
2324 var fournprice = $(
"input[name='fournprice']").val();
2325 var token =
'<?php echo currentToken(); ?>';
2327 $.post(
'<?php echo DOL_URL_ROOT; ?>/fourn/ajax/getSupplierPrices.php', {
2331 if (data.length > 0) {
2334 $(data).each(
function() {
2335 options +=
'<option value="'+this.
id+
'" price="'+this.
price+
'"';
2336 if (fournprice > 0) {
2337 if (this.
id == fournprice) {
2338 options +=
' selected';
2339 $(
"#buying_price").val(this.price);
2343 options +=
'>'+this.label+
'</option>';
2345 options +=
'<option value=null'+(trouve?
'':
' selected')+
'><?php echo $langs->trans("InputPrice"); ?></option>';
2346 $(
"#fournprice").html(options);
2348 $(
"#buying_price").hide();
2349 $(
"#fournprice").show();
2352 $(
"#buying_price").show();
2354 $(
"#fournprice").change(
function() {
2355 var selval = $(
this).find(
'option:selected').attr(
"price");
2357 $(
"#buying_price").val(selval).hide();
2359 $(
'#buying_price').show();
2363 $(
"#fournprice").hide();
2364 $(
'#buying_price').show();
2370 $(
"#fournprice").hide();
2371 $(
'#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.