38require
"../main.inc.php";
39require_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
40require_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
41require_once DOL_DOCUMENT_ROOT.
'/core/lib/contract.lib.php';
42require_once DOL_DOCUMENT_ROOT.
'/contrat/class/contrat.class.php';
43require_once DOL_DOCUMENT_ROOT.
'/core/modules/contract/modules_contract.php';
44require_once DOL_DOCUMENT_ROOT.
'/core/class/doleditor.class.php';
45require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formfile.class.php';
46require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
47require_once DOL_DOCUMENT_ROOT.
'/compta/facture/class/facture.class.php';
48require_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.facture.class.php';
49if (isModEnabled(
"propal")) {
50 require_once DOL_DOCUMENT_ROOT.
'/comm/propal/class/propal.class.php';
52if (isModEnabled(
'project')) {
53 require_once DOL_DOCUMENT_ROOT.
'/projet/class/project.class.php';
54 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formprojet.class.php';
56require_once DOL_DOCUMENT_ROOT.
'/core/class/extrafields.class.php';
68$langs->loadLangs(array(
"contracts",
"orders",
"companies",
"bills",
"products",
'compta',
'propal'));
70$action =
GETPOST(
'action',
'aZ09');
71$confirm =
GETPOST(
'confirm',
'alpha');
72$cancel =
GETPOST(
'cancel',
'alpha');
73$backtopage =
GETPOST(
'backtopage',
'alpha');
78$origin =
GETPOST(
'origin',
'alpha');
92$usehm = (
getDolGlobalString(
'MAIN_USE_HOURMIN_IN_DATE_RANGE') ?
$conf->global->MAIN_USE_HOURMIN_IN_DATE_RANGE : 0);
96 $socid = $user->socid;
100$hookmanager->initHooks(array(
'contractcard',
'globalcard'));
109if ($id > 0 || !empty($ref) && $action !=
'add') {
110 $ret =
$object->fetch($id, $ref);
112 $ret =
$object->fetch_thirdparty();
120$extrafields->fetch_name_optionals_label(
$object->table_element);
123$extralabelslines = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
125$permissionnote = $user->hasRight(
'contrat',
'creer');
126$permissiondellink = $user->hasRight(
'contrat',
'creer');
127$permissiontodelete = ($user->hasRight(
'contrat',
'creer') &&
$object->status == $object::STATUS_DRAFT) || $user->hasRight(
'contrat',
'supprimer');
128$permissiontoadd = $user->hasRight(
'contrat',
'creer');
129$permissiontoedit = $permissiontoadd;
130$permissiontoactivate = $user->hasRight(
'contrat',
'activer');
140$parameters = array(
'socid' => $socid);
141$reshook = $hookmanager->executeHooks(
'doActions', $parameters,
$object, $action);
145if (empty($reshook)) {
146 $backurlforlist = DOL_URL_ROOT.
'/contrat/list.php';
148 if (empty($backtopage) || ($cancel && empty($id))) {
149 if (empty($backtopage) || ($cancel && strpos($backtopage,
'__ID__'))) {
150 if (empty($id) && (($action !=
'add' && $action !=
'create') || $cancel)) {
151 $backtopage = $backurlforlist;
153 $backtopage = DOL_URL_ROOT.
'/contrat/card.php?id='.((!empty($id) &&
$id > 0) ? $id :
'__ID__');
159 if (!empty($backtopageforcancel)) {
160 header(
"Location: ".$backtopageforcancel);
162 } elseif (!empty($backtopage)) {
163 header(
"Location: ".$backtopage);
169 include DOL_DOCUMENT_ROOT.
'/core/actions_setnotes.inc.php';
171 include DOL_DOCUMENT_ROOT.
'/core/actions_dellink.inc.php';
173 include DOL_DOCUMENT_ROOT.
'/core/actions_lineupdown.inc.php';
175 if ($action ==
'confirm_active' && $confirm ==
'yes' && $permissiontoactivate) {
188 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
193 } elseif ($action ==
'confirm_sign' && $confirm ==
'yes' && $user->hasRight(
'contract',
'creer')) {
194 $result =
$object->setSignedStatus($user,
GETPOSTINT(
'signed_status'), 0,
'CONTRACT_MODIFY');
196 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id);
201 } elseif ($action ==
'confirm_unsign' && $confirm ==
'yes' && $user->hasRight(
'contract',
'creer')) {
202 $result =
$object->setSignedStatus($user, Contrat::$SIGNED_STATUSES[
'STATUS_NO_SIGNATURE'], 0,
'CONTRACT_MODIFY');
204 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id);
209 } elseif ($action ==
'confirm_closeline' && $confirm ==
'yes' && $permissiontoactivate) {
216 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"DateEnd")),
null,
'errors');
221 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
229 if (
GETPOST(
'mode') ==
'predefined') {
241 $date_start_update =
'';
242 $date_end_update =
'';
243 $date_start_real_update =
'';
244 $date_end_real_update =
'';
245 if (
GETPOST(
'date_start_updatemonth') &&
GETPOST(
'date_start_updateday') &&
GETPOST(
'date_start_updateyear')) {
248 if (
GETPOST(
'date_end_updatemonth') &&
GETPOST(
'date_end_updateday') &&
GETPOST(
'date_end_updateyear')) {
251 if (
GETPOST(
'date_start_real_updatemonth') &&
GETPOST(
'date_start_real_updateday') &&
GETPOST(
'date_start_real_updateyear')) {
254 if (
GETPOST(
'date_end_real_updatemonth') &&
GETPOST(
'date_end_real_updateday') &&
GETPOST(
'date_end_real_updateyear')) {
262 if ($action ==
'add' && $user->hasRight(
'contrat',
'creer')) {
264 if (empty($datecontrat)) {
266 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Date")),
null,
'errors');
271 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"ThirdParty")),
null,
'errors');
277 $ret = $extrafields->setOptionalsFromPost(
null,
$object);
285 $object->date_contrat = $datecontrat;
299 if (!empty($origin) && !empty($originid)) {
301 $element = $subelement = $origin;
302 if (preg_match(
'/^([^_]+)_([^_]+)/i', $origin, $regs)) {
304 $subelement = $regs[2];
308 if ($element ==
'order') {
309 $element = $subelement =
'commande';
311 if ($element ==
'propal') {
312 $element =
'comm/propal';
313 $subelement =
'propal';
315 if ($element ==
'invoice' || $element ==
'facture') {
316 $element =
'compta/facture';
317 $subelement =
'facture';
321 $object->origin_id = $originid;
326 $object->linked_objects = array_merge(
$object->linked_objects,
GETPOST(
'other_linked_objects',
'array:int'));
333 $classname = ucfirst($subelement);
334 $srcobject =
new $classname($db);
335 '@phan-var-force Commande|Propal|Facture $srcobject';
338 $result = $srcobject->fetch(
$object->origin_id);
340 $srcobject->fetch_thirdparty();
341 $lines = $srcobject->lines;
342 if (empty($lines) && method_exists($srcobject,
'fetch_lines')) {
343 $srcobject->fetch_lines();
344 $lines = $srcobject->lines;
348 $num = count($lines);
350 for ($i = 0; $i < $num; $i++) {
351 $product_type = ($lines[$i]->product_type ? $lines[$i]->product_type : 0);
353 if ($product_type == 1 || (
getDolGlobalString(
'CONTRACT_SUPPORT_PRODUCTS') && in_array($product_type, array(0, 1)))) {
355 if ($lines[$i]->fk_product > 0) {
356 $product_static =
new Product($db);
361 $prod->id = $lines[$i]->fk_product;
362 $prod->getMultiLangs();
364 $outputlangs = $langs;
366 if (empty($newlang) &&
GETPOST(
'lang_id',
'aZ09')) {
367 $newlang =
GETPOST(
'lang_id',
'aZ09');
369 if (empty($newlang)) {
370 $newlang = $srcobject->thirdparty->default_lang;
372 if (!empty($newlang)) {
374 $outputlangs->setDefaultLang($newlang);
377 $label = (!empty($prod->multilangs[$outputlangs->defaultlang][
"libelle"])) ? $prod->multilangs[$outputlangs->defaultlang][
"libelle"] : $lines[$i]->product_label;
379 $label = $lines[$i]->product_label;
381 $desc = ($lines[$i]->desc && $lines[$i]->desc != $lines[$i]->label) ?
dol_htmlentitiesbr($lines[$i]->desc) :
'';
387 $array_options = array();
389 if (method_exists($lines[$i],
'fetch_optionals')) {
390 $lines[$i]->fetch_optionals();
391 $array_options = $lines[$i]->array_options;
394 $txtva = $lines[$i]->vat_src_code ? $lines[$i]->tva_tx.
' ('.$lines[$i]->vat_src_code.
')' : $lines[$i]->tva_tx;
402 $lines[$i]->subprice,
407 $lines[$i]->fk_product,
408 $lines[$i]->remise_percent,
409 $lines[$i]->date_start,
410 $lines[$i]->date_end,
413 $lines[$i]->info_bits,
414 $lines[$i]->fk_fournprice,
433 $parameters = array(
'objFrom' => $srcobject);
434 $reshook = $hookmanager->executeHooks(
'createFrom', $parameters,
$object, $action);
448 $result =
$object->create($user);
450 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
458 } elseif ($action ==
'classin' && $user->hasRight(
'contrat',
'creer')) {
460 } elseif ($action ==
'addline' && $user->hasRight(
'contrat',
'creer')) {
464 $product_desc = (GETPOSTISSET(
'dp_desc') ?
GETPOST(
'dp_desc',
'restricthtml') :
'');
467 $price_ht_devise =
'';
469 $price_ttc_devise =
'';
471 $rang = count(
$object->lines) + 1;
473 if (
GETPOST(
'price_ht') !==
'') {
476 if (
GETPOST(
'multicurrency_price_ht') !==
'') {
479 if (
GETPOST(
'price_ttc') !==
'') {
482 if (
GETPOST(
'multicurrency_price_ttc') !==
'') {
486 if (
GETPOST(
'prod_entry_mode',
'alpha') ==
'free') {
492 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"ProductOrService")),
null,
'errors');
497 $tva_tx =
GETPOST(
'tva_tx',
'alpha');
500 $remise_percent = (GETPOSTISSET(
'remise_percent'.$predef) ?
price2num(
GETPOST(
'remise_percent'.$predef),
'', 2) : 0);
501 if (empty($remise_percent)) {
506 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Qty")),
null,
'errors');
509 if (
GETPOST(
'prod_entry_mode',
'alpha') ==
'free' && (empty($idprod) || $idprod < 0) && empty($product_desc)) {
510 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Description")),
null,
'errors');
516 if (!empty($date_start) && !empty($date_end) && $date_start > $date_end) {
517 setEventMessages($langs->trans(
"Error").
': '.$langs->trans(
"DateStartPlanned").
' > '.$langs->trans(
"DateEndPlanned"),
null,
'errors');
522 $extralabelsline = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
523 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line, $predef);
525 if (is_array($extralabelsline)) {
527 foreach ($extralabelsline as $key => $value) {
528 unset($_POST[
"options_".$key]);
537 $price_base_type =
'';
543 $prod->fetch($idprod);
552 $price_min = $prod->price_min;
553 $price_min_ttc = $prod->price_min_ttc;
557 $price_min = $prod->multiprices_min[
$object->thirdparty->price_level];
558 $price_min_ttc = $prod->multiprices_min_ttc[
$object->thirdparty->price_level];
561 require_once DOL_DOCUMENT_ROOT.
'/product/class/productcustomerprice.class.php';
565 $filter = array(
't.fk_product' => $prod->id,
't.fk_soc' =>
$object->thirdparty->id);
567 $result = $prodcustprice->fetchAll(
'',
'', 0, 0, $filter);
569 if (count($prodcustprice->lines) > 0) {
570 $price_min =
price($prodcustprice->lines[0]->price_min);
571 $price_min_ttc =
price($prodcustprice->lines[0]->price_min_ttc);
584 $tmpvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', $tva_tx));
585 $tmpprodvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', (
string) $prod->tva_tx));
588 if (!empty($price_ht) || $price_ht ===
'0') {
590 $pu_ttc =
price2num((
float) $pu_ht * (1 + ((
float) $tmpvat / 100)),
'MU');
591 $price_base_type =
'HT';
592 } elseif (!empty($price_ttc) || $price_ttc ===
'0') {
594 $pu_ht =
price2num((
float) $pu_ttc / (1 + ((
float) $tmpvat / 100)),
'MU');
595 $price_base_type =
'TTC';
598 $desc = $prod->description;
606 $desc = $product_desc;
611 $fk_unit = $prod->fk_unit;
615 $tva_npr = (preg_match(
'/\*/', $tva_tx) ? 1 : 0);
616 if (empty($tva_tx)) {
619 $tva_tx = str_replace(
'*',
'', $tva_tx);
620 $desc = $product_desc;
622 $pu_ht_devise =
price2num($price_ht_devise,
'MU');
623 $pu_ttc_devise =
price2num($price_ttc_devise,
'MU');
625 $tmpvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', $tva_tx));
628 if (!empty($price_ht) || $price_ht ===
'0') {
630 $pu_ttc =
price2num((
float) $pu_ht * (1 + ((
float) $tmpvat / 100)),
'MU');
631 $price_base_type =
'HT';
632 } elseif (!empty($price_ttc) || $price_ttc ===
'0') {
634 $pu_ht =
price2num((
float) $pu_ttc / (1 + ((
float) $tmpvat / 100)),
'MU');
635 $price_base_type =
'TTC';
643 $fk_fournprice =
GETPOST(
'fournprice');
645 $pa_ht =
GETPOST(
'buying_price');
655 if (((
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && !$user->hasRight(
'produit',
'ignore_price_min_advance'))
657 $object->error = $langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, -1,
$conf->currency));
686 $outputlangs = $langs;
689 $newlang =
GETPOST(
'lang_id',
'aZ09');
692 $newlang =
$object->thirdparty->default_lang;
694 if (!empty($newlang)) {
696 $outputlangs->setDefaultLang($newlang);
701 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
704 unset($_POST[
'prod_entry_mode']);
706 unset($_POST[
'qty']);
707 unset($_POST[
'type']);
708 unset($_POST[
'remise_percent']);
709 unset($_POST[
'price_ht']);
710 unset($_POST[
'multicurrency_price_ht']);
711 unset($_POST[
'price_ttc']);
712 unset($_POST[
'tva_tx']);
713 unset($_POST[
'product_ref']);
714 unset($_POST[
'product_label']);
715 unset($_POST[
'product_desc']);
716 unset($_POST[
'fournprice']);
717 unset($_POST[
'buying_price']);
718 unset($_POST[
'np_marginRate']);
719 unset($_POST[
'np_markRate']);
720 unset($_POST[
'dp_desc']);
721 unset($_POST[
'idprod']);
723 unset($_POST[
'date_starthour']);
724 unset($_POST[
'date_startmin']);
725 unset($_POST[
'date_startsec']);
726 unset($_POST[
'date_startday']);
727 unset($_POST[
'date_startmonth']);
728 unset($_POST[
'date_startyear']);
729 unset($_POST[
'date_endhour']);
730 unset($_POST[
'date_endmin']);
731 unset($_POST[
'date_endsec']);
732 unset($_POST[
'date_endday']);
733 unset($_POST[
'date_endmonth']);
734 unset($_POST[
'date_endyear']);
739 } elseif ($action ==
'updateline' && $user->hasRight(
'contrat',
'creer') && !
GETPOST(
'cancel',
'alpha')) {
743 if (!empty($date_start_update) && !empty($date_end_update) && $date_start_update > $date_end_update) {
744 setEventMessages($langs->trans(
"Error").
': '.$langs->trans(
"DateStartPlanned").
' > '.$langs->trans(
"DateEndPlanned"),
null,
'errors');
745 $action =
'editline';
751 if ($objectline->fetch($idline) < 0) {
755 $objectline->fetch_optionals();
757 $objectline->oldcopy =
dol_clone($objectline, 2);
765 if ($date_start_real_update ==
'') {
766 $date_start_real_update = $objectline->date_start_real;
768 if ($date_end_real_update ==
'') {
769 $date_end_real_update = $objectline->date_end_real;
772 $vat_rate =
GETPOST(
'eltva_tx',
'alpha');
775 if (preg_match(
'/\*/', $vat_rate)) {
780 $vat_rate = str_replace(
'*',
'', $vat_rate);
789 if (preg_match(
'/\((.*)\)/', $txtva, $reg)) {
790 $vat_src_code = $reg[1];
791 $txtva = preg_replace(
'/\s*\(.*\)/',
'', $txtva);
808 if ($remise_percent > 0) {
809 $remise = round(((
float) $price_ht * (
float) $remise_percent / 100), 2);
812 $objectline->fk_product =
GETPOSTINT(
'idprod');
813 $objectline->description =
GETPOST(
'product_desc',
'restricthtml');
814 $objectline->price_ht = (float) $price_ht;
817 $objectline->remise_percent = $remise_percent;
818 $objectline->tva_tx = ($txtva ? $txtva : 0);
819 $objectline->vat_src_code = $vat_src_code;
820 $objectline->localtax1_tx = is_numeric($localtax1_tx) ? $localtax1_tx : 0;
821 $objectline->localtax2_tx = is_numeric($localtax2_tx) ? $localtax2_tx : 0;
822 $objectline->date_start = $date_start_update;
823 $objectline->date_start_real = $date_start_real_update;
824 $objectline->date_end = $date_end_update;
825 $objectline->date_end_real = $date_end_real_update;
826 $objectline->user_closing_id = $user->id;
828 $objectline->pa_ht = $pa_ht;
834 $objectline->fk_unit =
null;
838 $extralabelsline = $extrafields->fetch_name_optionals_label($objectline->table_element);
839 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line, $predef);
841 if (is_array($array_options) && count($array_options) > 0) {
843 foreach ($array_options as $key => $value) {
844 $objectline->array_options[$key] = $array_options[$key];
850 $result = $objectline->update($user);
853 $action =
'editline';
854 $_GET[
'rowid'] =
GETPOST(
'elrowid');
864 } elseif ($action ==
'confirm_deleteline' && $confirm ==
'yes' && $user->hasRight(
'contrat',
'creer')) {
868 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
873 } elseif ($action ==
'confirm_valid' && $confirm ==
'yes' && $user->hasRight(
'contrat',
'creer')) {
874 $result =
$object->validate($user);
879 $outputlangs = $langs;
882 $newlang =
GETPOST(
'lang_id',
'aZ09');
885 $newlang =
$object->thirdparty->default_lang;
887 if (!empty($newlang)) {
889 $outputlangs->setDefaultLang($newlang);
894 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
899 } elseif ($action ==
'reopen' && $user->hasRight(
'contrat',
'creer')) {
900 $result =
$object->reopen($user);
904 } elseif ($action ==
'confirm_close' && $confirm ==
'yes' && $user->hasRight(
'contrat',
'creer')) {
906 $result =
$object->closeAll($user);
910 } elseif ($action ==
'confirm_activate' && $confirm ==
'yes' && $user->hasRight(
'contrat',
'creer')) {
913 $comment =
GETPOST(
'comment',
'alpha');
914 $result =
$object->activateAll($user, $date_start, 0, $comment, $date_end);
918 } elseif ($action ==
'confirm_delete' && $confirm ==
'yes' && $user->hasRight(
'contrat',
'supprimer')) {
919 $result =
$object->delete($user);
921 header(
"Location: list.php?restore_lastsearch_values=1");
926 } elseif ($action ==
'confirm_move' && $confirm ==
'yes' && $user->hasRight(
'contrat',
'creer')) {
929 $result = $contractline->fetch(
GETPOSTINT(
'lineid'));
930 $contractline->fk_contrat =
GETPOSTINT(
'newcid');
931 $result = $contractline->update($user, 1);
933 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$id);
939 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentities(
"RefNewContract")),
null,
'errors');
941 } elseif ($action ==
'update_extras' && $permissiontoadd) {
944 $attribute =
GETPOST(
'attribute',
'alphanohtml');
947 $ret = $extrafields->setOptionalsFromPost(
null,
$object, $attribute);
954 $result =
$object->updateExtraField($attribute,
'CONTRACT_MODIFY');
962 $action =
'edit_extras';
964 } elseif ($action ==
'setref_supplier' && $permissiontoadd) {
968 $result =
$object->setValueFrom(
'ref_supplier',
GETPOST(
'ref_supplier',
'alpha'),
'',
null,
'text',
'', $user,
'CONTRACT_MODIFY');
971 $action =
'editref_supplier';
973 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
977 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$id);
980 } elseif ($action ==
'setref_customer' && $permissiontoadd) {
984 $result =
$object->setValueFrom(
'ref_customer',
GETPOST(
'ref_customer',
'alpha'),
'',
null,
'text',
'', $user,
'CONTRACT_MODIFY');
987 $action =
'editref_customer';
989 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
993 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$id);
996 } elseif ($action ==
'setref' && $permissiontoadd) {
1005 $result =
$object->setValueFrom(
'ref',
GETPOST(
'ref',
'alpha'),
'',
null,
'text',
'', $user,
'CONTRACT_MODIFY');
1008 $action =
'editref';
1010 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
1017 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
1021 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$id);
1024 } elseif ($action ==
'setdate_contrat' && $permissiontoadd) {
1026 $result =
$object->fetch($id);
1031 $result =
$object->setValueFrom(
'date_contrat', $datacontrat,
'',
null,
'date',
'', $user,
'CONTRACT_MODIFY');
1034 $action =
'editdate_contrat';
1036 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
1040 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$id);
1046 include DOL_DOCUMENT_ROOT.
'/core/actions_printing.inc.php';
1050 include DOL_DOCUMENT_ROOT.
'/core/actions_builddoc.inc.php';
1053 $triggersendname =
'CONTRACT_SENTBYMAIL';
1055 $mode =
'emailfromcontract';
1056 $trackid =
'con'.$object->id;
1057 include DOL_DOCUMENT_ROOT.
'/core/actions_sendmails.inc.php';
1061 if ($action ==
'addcontact' && $user->hasRight(
'contrat',
'creer')) {
1064 $result =
$object->add_contact($contactid, $typeid,
GETPOST(
"source",
'aZ09'));
1067 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
1070 if (
$object->error ==
'DB_ERROR_RECORD_ALREADY_EXISTS') {
1071 $langs->load(
"errors");
1072 setEventMessages($langs->trans(
"ErrorThisContactIsAlreadyDefinedAsThisType"),
null,
'errors');
1077 } elseif ($action ==
'swapstatut' && $user->hasRight(
'contrat',
'creer')) {
1080 } elseif ($action ==
'deletecontact' && $user->hasRight(
'contrat',
'creer')) {
1085 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
1094 if ($action ==
'confirm_clone' && $confirm ==
'yes' && $user->hasRight(
'contrat',
'creer')) {
1096 setEventMessages($langs->trans(
"NoCloneOptionsSpecified"),
null,
'errors');
1099 $result =
$object->createFromClone($user, $socid);
1101 header(
"Location: ".$_SERVER[
'PHP_SELF'].
'?id='.$result);
1104 if (count(
$object->errors) > 0) {
1119$title =
$object->ref.
" - ".$langs->trans(
'Contract');
1120if ($action ==
'create') {
1121 $title = $langs->trans(
"NewContract");
1123$help_url =
'EN:Module_Contracts|FR:Module_Contrat|ES:Contratos_de_servicio';
1125llxHeader(
'', $title, $help_url,
'', 0, 0,
'',
'',
'',
'mod-contrat page-card');
1127$form =
new Form($db);
1129if (isModEnabled(
'project')) {
1135if (substr($module, 0, 13) ==
'mod_contract_' && substr($module, -3) ==
'php') {
1136 $module = substr($module, 0,
dol_strlen($module) - 4);
1139$modCodeContract =
null;
1141 $modCodeContract =
new $module();
1142 '@phan-var-force ModelNumRefContracts $modCodeContract';
1146if ($action ==
'create') {
1152 $soc->fetch($socid);
1158 $element = $subelement =
GETPOST(
'origin');
1159 if (preg_match(
'/^([^_]+)_([^_]+)/i',
GETPOST(
'origin'), $regs)) {
1160 $element = $regs[1];
1161 $subelement = $regs[2];
1164 if ($element ==
'project') {
1168 if ($element ==
'order' || $element ==
'commande') {
1169 $element = $subelement =
'commande';
1171 if ($element ==
'propal') {
1172 $element =
'comm/propal';
1173 $subelement =
'propal';
1175 if ($element ==
'invoice' || $element ==
'facture') {
1176 $element =
'compta/facture';
1177 $subelement =
'facture';
1182 $classname = ucfirst($subelement);
1183 $objectsrc =
new $classname($db);
1184 '@phan-var-force Commande|Propal|Facture $objectsrc';
1185 $objectsrc->fetch($originid);
1186 if (empty($objectsrc->lines) && method_exists($objectsrc,
'fetch_lines')) {
1187 $objectsrc->fetch_lines();
1189 $objectsrc->fetch_thirdparty();
1192 $objectsrc->fetch_optionals();
1193 $object->array_options = $objectsrc->array_options;
1195 $projectid = (!empty($objectsrc->fk_project) ? $objectsrc->fk_project :
'');
1197 $soc = $objectsrc->thirdparty;
1199 $note_private = (!empty($objectsrc->note_private) ? $objectsrc->note_private :
'');
1200 $note_public = (!empty($objectsrc->note_public) ? $objectsrc->note_public :
'');
1203 $srccontactslist = $objectsrc->liste_contact(-1,
'external', 1);
1207 $note_private =
GETPOST(
"note_private",
"alpha");
1208 $note_public =
GETPOST(
"note_public",
"alpha");
1213 print
'<form name="form_contract" action="'.$_SERVER[
"PHP_SELF"].
'" method="post">';
1214 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1215 print
'<input type="hidden" name="action" value="add">';
1216 print
'<input type="hidden" name="socid" value="'.$soc->id.
'">'.
"\n";
1217 print
'<input type="hidden" name="remise_percent" value="0">';
1218 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
1222 print
'<table class="border centpercent">';
1225 print
'<tr><td class="titlefieldcreate fieldrequired">'.$langs->trans(
'Ref').
'</td><td>';
1226 if (!empty($modCodeContract->code_auto)) {
1227 $tmpcode = $langs->trans(
"Draft");
1229 $tmpcode =
'<input name="ref" class="maxwidth100" maxlength="128" value="'.dol_escape_htmltag(
GETPOST(
'ref') ?
GETPOST(
'ref') : $tmpcode).
'">';
1235 print
'<tr><td>'.$langs->trans(
'RefCustomer').
'</td>';
1236 print
'<td><input type="text" class="maxwidth150" name="ref_customer" id="ref_customer" value="'.dol_escape_htmltag(
GETPOST(
'ref_customer',
'alpha')).
'"></td></tr>';
1239 print
'<tr><td>'.$langs->trans(
'RefSupplier').
'</td>';
1240 print
'<td><input type="text" class="maxwidth150" name="ref_supplier" id="ref_supplier" value="'.dol_escape_htmltag(
GETPOST(
'ref_supplier',
'alpha')).
'"></td></tr>';
1244 print
'<td class="fieldrequired">'.$langs->trans(
'ThirdParty').
'</td>';
1247 print $soc->getNomUrl(1);
1248 print
'<input type="hidden" name="socid" value="'.$soc->id.
'">';
1252 print
img_picto(
'',
'company',
'class="pictofixedwidth"');
1253 print $form->select_company(
'',
'socid',
'',
'SelectThirdParty', 1, 0, array(), 0,
'minwidth300 widthcentpercentminusxx maxwidth500');
1254 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>';
1261 print
'<tr><td>'.$langs->trans(
'Discounts').
'</td><td>';
1262 if ($soc->remise_percent) {
1263 print $langs->trans(
"CompanyHasRelativeDiscount", $soc->remise_percent).
' ';
1265 print
'<span class="hideonsmartphone">'.$langs->trans(
"CompanyHasNoRelativeDiscount").
'. </span>';
1267 $absolute_discount = $soc->getAvailableDiscounts();
1268 if ($absolute_discount) {
1269 print $langs->trans(
"CompanyHasAbsoluteDiscount",
price($absolute_discount), $langs->trans(
"Currency".$conf->currency)).
'.';
1271 print
'<span class="hideonsmartphone">'.$langs->trans(
"CompanyHasNoAbsoluteDiscount").
'.</span>';
1277 print
'<tr><td class="nowrap"><span class="fieldrequired">'.$langs->trans(
"TypeContact_contrat_internal_SALESREPFOLL").
'</span></td><td>';
1278 print
img_picto(
'',
'user',
'class="pictofixedwidth"');
1279 print $form->select_dolusers(
GETPOST(
"commercial_suivi_id") ?
GETPOST(
"commercial_suivi_id") : $user->id,
'commercial_suivi_id', 1,
'');
1283 print
'<tr><td class="nowrap"><span class="fieldrequired">'.$langs->trans(
"TypeContact_contrat_internal_SALESREPSIGN").
'</span></td><td>';
1284 print
img_picto(
'',
'user',
'class="pictofixedwidth"');
1285 print $form->select_dolusers(
GETPOST(
"commercial_signature_id") ?
GETPOST(
"commercial_signature_id") : $user->id,
'commercial_signature_id', 1,
'');
1288 print
'<tr><td><span class="fieldrequired">'.$langs->trans(
"Date").
'</span></td><td>';
1289 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
1290 print $form->selectDate($datecontrat,
'', 0, 0, 0,
"contrat");
1294 if (isModEnabled(
'project')) {
1295 $langs->load(
'projects');
1299 print
'<tr><td>'.$langs->trans(
"Project").
'</td><td>';
1300 print
img_picto(
'',
'project',
'class="pictofixedwidth"');
1301 $formproject->select_projects(($soc->id > 0 ? $soc->id : -1), $projectid,
"projectid", 0, 0, 1, 1);
1302 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>';
1306 print
'<tr><td>'.$langs->trans(
"NotePublic").
'</td><td class="tdtop">';
1307 $doleditor =
new DolEditor(
'note_public', $note_public,
'', 100,
'dolibarr_notes',
'In',
true,
true, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PUBLIC') ? 0 : 1, ROWS_3,
'90%');
1308 print $doleditor->Create(1);
1311 if (empty($user->socid)) {
1312 print
'<tr><td>'.$langs->trans(
"NotePrivate").
'</td><td class="tdtop">';
1313 $doleditor =
new DolEditor(
'note_private', $note_private,
'', 100,
'dolibarr_notes',
'In',
true,
true, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PRIVATE') ? 0 : 1, ROWS_3,
'90%');
1314 print $doleditor->Create(1);
1319 $parameters = array(
'objectsrc' => $objectsrc,
'colspan' =>
' colspan="3"',
'cols' =>
'3');
1320 $reshook = $hookmanager->executeHooks(
'formObjectOptions', $parameters,
$object, $action);
1321 print $hookmanager->resPrint;
1324 if (empty($reshook)) {
1325 print
$object->showOptionals($extrafields,
'create', $parameters);
1332 print $form->buttonsSaveCancel(
"Create");
1334 if (is_object($objectsrc)) {
1335 print
'<input type="hidden" name="origin" value="'.$objectsrc->element.
'">';
1336 print
'<input type="hidden" name="originid" value="'.$objectsrc->id.
'">';
1339 print
'<br>'.$langs->trans(
"Note").
': '.$langs->trans(
"OnlyLinesWithTypeServiceAreUsed");
1353 $result =
$object->fetch_lines();
1358 $nbofservices = count(
$object->lines);
1360 $author =
new User($db);
1361 $author->fetch(
$object->user_author_id);
1363 $commercial_signature =
new User($db);
1364 $commercial_signature->fetch(
$object->commercial_signature_id);
1366 $commercial_suivi =
new User($db);
1367 $commercial_suivi->fetch(
$object->commercial_suivi_id);
1374 print
dol_get_fiche_head($head, $hselected, $langs->trans(
"Contract"), -1,
'contract');
1377 if ($action ==
'delete') {
1379 $formconfirm = $form->formconfirm($_SERVER[
'PHP_SELF'].
"?id=".
$object->id, $langs->trans(
"DeleteAContract"), $langs->trans(
"ConfirmDeleteAContract"),
"confirm_delete",
'', 0, 1);
1380 } elseif ($action ==
'valid') {
1382 $ref = substr(
$object->ref, 1, 4);
1383 if ($ref ==
'PROV' && !empty($modCodeContract->code_auto)) {
1388 $text = $langs->trans(
'ConfirmValidateContract', $numref);
1389 $formconfirm = $form->formconfirm($_SERVER[
'PHP_SELF'].
"?id=".
$object->id, $langs->trans(
"ValidateAContract"), $text,
"confirm_valid",
'', 0, 1);
1390 } elseif ($action ==
'close') {
1392 $formconfirm = $form->formconfirm($_SERVER[
'PHP_SELF'].
"?id=".
$object->id, $langs->trans(
"CloseAContract"), $langs->trans(
"ConfirmCloseContract"),
"confirm_close",
'', 0, 1);
1393 } elseif ($action ==
'activate') {
1394 $formquestion = array(
1395 array(
'type' =>
'date',
'name' =>
'd_start',
'label' => $langs->trans(
"DateServiceActivate"),
'value' =>
dol_now()),
1396 array(
'type' =>
'date',
'name' =>
'd_end',
'label' => $langs->trans(
"DateEndPlanned"), 0 =>
'', 1 =>
''),
1397 array(
'type' =>
'text',
'name' =>
'comment',
'label' => $langs->trans(
"Comment"),
'value' =>
'', 0 =>
'', 1 =>
'',
'class' =>
'minwidth300',
'moreattr' =>
'autofocus')
1399 $formconfirm = $form->formconfirm($_SERVER[
'PHP_SELF'].
"?id=".
$object->id, $langs->trans(
"ActivateAllOnContract"), $langs->trans(
"ConfirmActivateAllOnContract"),
"confirm_activate", $formquestion,
'yes', 1, 280);
1400 } elseif ($action ==
'clone') {
1401 $filter =
'(s.client:IN:1,2,3)';
1403 $formquestion = array(array(
'type' =>
'other',
'name' =>
'socid',
'label' => $langs->trans(
"SelectThirdParty"),
'value' => $form->select_company(
GETPOSTINT(
'socid'),
'socid', $filter)));
1404 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'ToClone'), $langs->trans(
'ConfirmCloneContract',
$object->ref),
'confirm_clone', $formquestion,
'yes', 1);
1405 } elseif ($action ==
'sign') {
1406 $text = $langs->trans(
'ConfirmSignContract');
1407 if (isModEnabled(
'notification')) {
1408 require_once DOL_DOCUMENT_ROOT.
'/core/class/notify.class.php';
1409 $notify =
new Notify($db);
1411 $text .= $notify->confirmMessage(
'CONTRACT_MODIFY',
$object->socid,
$object);
1416 'name' =>
'signed_status',
1417 'label' =>
'<span class="fieldrequired">'.$langs->trans(
'SignStatus').
'</span>',
1418 'values' =>
$object->getSignedStatusLocalisedArray()
1420 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'SignContract'), $text,
'confirm_sign', $formquestion, 0, 1);
1421 } elseif ($action ==
'unsign') {
1422 $text = $langs->trans(
'ConfirmUnsignContract');
1423 if (isModEnabled(
'notification')) {
1424 require_once DOL_DOCUMENT_ROOT.
'/core/class/notify.class.php';
1425 $notify =
new Notify($db);
1427 $text .= $notify->confirmMessage(
'CONTRACT_MODIFY',
$object->socid,
$object);
1429 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'UnsignContract'), $text,
'confirm_unsign',
'', 0, 1);
1434 $parameters = array(
1435 'formConfirm' => $formconfirm,
1440 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters,
$object, $action);
1441 if (empty($reshook)) {
1442 $formconfirm .= $hookmanager->resPrint;
1443 } elseif ($reshook > 0) {
1444 $formconfirm = $hookmanager->resPrint;
1452 if (
$object->status == $object::STATUS_DRAFT && $user->hasRight(
'contrat',
'creer')) {
1453 print
'<form action="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'" method="POST">';
1454 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1455 print
'<input type="hidden" name="action" value="setremise">';
1456 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
1461 $linkback =
'<a href="'.DOL_URL_ROOT.
'/contrat/list.php?restore_lastsearch_values=1'.(!empty($socid) ?
'&socid='.$socid :
'').
'">'.$langs->trans(
"BackToList").
'</a>';
1465 if (!empty($modCodeContract->code_auto)) {
1468 $morehtmlref .= $form->editfieldkey(
"",
'ref',
$object->ref,
$object, $user->hasRight(
'contrat',
'creer'),
'string',
'', 0, 3);
1469 $morehtmlref .= $form->editfieldval(
"",
'ref',
$object->ref,
$object, $user->hasRight(
'contrat',
'creer'),
'string',
'',
null, 2);
1472 $morehtmlref .=
'<div class="refidno">';
1474 $morehtmlref .= $form->editfieldkey(
"RefCustomer",
'ref_customer',
$object->ref_customer,
$object, $user->hasRight(
'contrat',
'creer'),
'string',
'', 0, 1);
1475 $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');
1477 $morehtmlref .=
'<br>';
1478 $morehtmlref .= $form->editfieldkey(
"RefSupplier",
'ref_supplier',
$object->ref_supplier,
$object, $user->hasRight(
'contrat',
'creer'),
'string',
'', 0, 1);
1479 $morehtmlref .= $form->editfieldval(
"RefSupplier",
'ref_supplier',
$object->ref_supplier,
$object, $user->hasRight(
'contrat',
'creer'),
'string',
'',
null,
null,
'', 1,
'getFormatedSupplierRef');
1481 $morehtmlref .=
'<br>'.$object->thirdparty->getNomUrl(1);
1483 $morehtmlref .=
' <span class="otherlink">(<a href="'.DOL_URL_ROOT.
'/contrat/list.php?socid='.
$object->thirdparty->id.
'&search_name='.urlencode(
$object->thirdparty->name).
'">'.$langs->trans(
"OtherContracts").
'</a>)</span>';
1486 if (isModEnabled(
'project')) {
1487 $langs->load(
"projects");
1488 $morehtmlref .=
'<br>';
1489 if ($permissiontoadd) {
1490 $morehtmlref .=
img_picto($langs->trans(
"Project"),
'project',
'class="pictofixedwidth"');
1491 if ($action !=
'classify') {
1492 $morehtmlref .=
'<a class="editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?action=classify&token='.
newToken().
'&id='.
$object->id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetProject')).
'</a> ';
1494 $morehtmlref .= $form->form_project($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->socid,
$object->fk_project, ($action ==
'classify' ?
'projectid' :
'none'), 0, 0, 0, 1,
'',
'maxwidth300');
1496 if (!empty(
$object->fk_project)) {
1498 $proj->fetch(
$object->fk_project);
1499 $morehtmlref .= $proj->getNomUrl(1);
1501 $morehtmlref .=
'<span class="opacitymedium"> - '.dol_escape_htmltag($proj->title).
'</span>';
1506 $morehtmlref .=
'</div>';
1509 dol_banner_tab(
$object,
'ref', $linkback, 1,
'ref',
'none', $morehtmlref);
1512 print
'<div class="fichecenter">';
1513 print
'<div class="underbanner clearboth"></div>';
1516 print
'<table class="border tableforfield" width="100%">';
1519 print
'<tr><td class="titlefield">'.$langs->trans(
'Discount').
'</td><td colspan="3">';
1520 if (
$object->thirdparty->remise_percent) {
1521 print $langs->trans(
"CompanyHasRelativeDiscount",
$object->thirdparty->remise_percent).
'. ';
1523 print
'<span class="hideonsmartphone">'.$langs->trans(
"CompanyHasNoRelativeDiscount").
'. </span>';
1525 $absolute_discount =
$object->thirdparty->getAvailableDiscounts();
1526 if ($absolute_discount) {
1527 print $langs->trans(
"CompanyHasAbsoluteDiscount",
price($absolute_discount), $langs->trans(
"Currency".$conf->currency)).
'.';
1529 print
'<span class="hideonsmartphone">'.$langs->trans(
"CompanyHasNoAbsoluteDiscount").
'.</span>';
1535 print
'<td class="titlefield">';
1536 print $form->editfieldkey(
"Date",
'date_contrat',
$object->date_contrat,
$object, $user->hasRight(
'contrat',
'creer'));
1538 print $form->editfieldval(
"Date",
'date_contrat',
$object->date_contrat,
$object, $user->hasRight(
'contrat',
'creer'),
'datehourpicker');
1544 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_view.tpl.php';
1550 if (
$object->status == $object::STATUS_DRAFT && $user->hasRight(
'contrat',
'creer')) {
1557 $blocname =
'contacts';
1558 $title = $langs->trans(
'ContactsAddresses');
1559 include DOL_DOCUMENT_ROOT.
'/core/tpl/bloc_showhide.tpl.php';
1563 $blocname =
'notes';
1564 $title = $langs->trans(
'Notes');
1565 include DOL_DOCUMENT_ROOT.
'/core/tpl/bloc_showhide.tpl.php';
1569 $arrayothercontracts =
$object->getListOfContracts(
'others');
1577 global $inputalsopricewithtax;
1578 $inputalsopricewithtax = 1;
1580 $productstatic =
new Product($db);
1583 if (isModEnabled(
'margin') && !empty(
$object->element) && in_array(
$object->element, array(
'facture',
'propal',
'commande'))) {
1591 print
'<div id="contrat-lines-container" id="contractlines" data-contractid="'.$object->id.
'" data-element="'.
$object->element.
'" >';
1592 while ($cursorline <= $nbofservices) {
1593 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.
'" >';
1594 print
'<form name="update" id="addproduct" action="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'" method="post">';
1595 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1596 print
'<input type="hidden" name="action" value="updateline">';
1597 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
1598 print
'<input type="hidden" name="elrowid" value="'.$object->lines[$cursorline - 1]->id.
'">';
1599 print
'<input type="hidden" name="fournprice" value="'.(!empty(
$object->lines[$cursorline - 1]->fk_fournprice) ?
$object->lines[$cursorline - 1]->fk_fournprice : 0).
'">';
1602 print
'<div class="div-table-responsive-no-min">';
1603 print
'<table class="notopnoleftnoright allwidth tableforservicepart1 centpercent">';
1605 $sql =
"SELECT cd.rowid, cd.statut, cd.label as label_det, cd.fk_product, cd.product_type, cd.description, cd.price_ht, cd.qty,";
1606 $sql .=
" cd.tva_tx, cd.vat_src_code, cd.remise_percent, cd.info_bits, cd.subprice, cd.multicurrency_subprice,";
1607 $sql .=
" cd.date_ouverture_prevue as date_start, cd.date_ouverture as date_start_real,";
1608 $sql .=
" cd.date_fin_validite as date_end, cd.date_cloture as date_end_real,";
1609 $sql .=
" cd.commentaire as comment, cd.fk_product_fournisseur_price as fk_fournprice, cd.buy_price_ht as pa_ht,";
1610 $sql .=
" cd.fk_unit,";
1611 $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";
1612 $sql .=
" ,cd.rang";
1613 $sql .=
" FROM ".MAIN_DB_PREFIX.
"contratdet as cd";
1614 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"product as p ON cd.fk_product = p.rowid";
1615 $sql .=
" WHERE cd.rowid = ".((int)
$object->lines[$cursorline - 1]->id);
1617 $result = $db->query($sql);
1622 $objp = $db->fetch_object($result);
1625 print
'<tr class="liste_titre'.($cursorline ?
' liste_titre_add' :
'').
'">';
1626 print
'<td>'.$langs->trans(
"ServiceNb", $cursorline).
'</td>';
1627 print
'<td width="80" class="center">'.$langs->trans(
"VAT").
'</td>';
1628 print
'<td width="80" class="right">'.$langs->trans(
"PriceUHT").
'</td>';
1632 print
'<td width="30" class="center">'.$langs->trans(
"Qty").
'</td>';
1634 print
'<td width="30" class="left">'.$langs->trans(
"Unit").
'</td>';
1636 print
'<td width="50" class="right">'.$langs->trans(
"ReductionShort").
'</td>';
1638 print
'<td width="50" class="right">'.$langs->trans(
"BuyingPrice").
'</td>';
1642 if ($nbofservices > 1 &&
$conf->browser->layout !=
'phone' && $user->hasRight(
'contrat',
'creer')) {
1643 print
'<td width="30" class="linecolmove tdlineupdown center">';
1644 if ($cursorline > 1) {
1645 print
'<a class="lineupdown reposition" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=up&token='.
newToken().
'&rowid='.$objp->rowid.
'">';
1646 echo
img_up(
'default', 0,
'imgupforline');
1649 if ($cursorline < $nbofservices) {
1650 print
'<a class="lineupdown reposition" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=down&token='.
newToken().
'&rowid='.$objp->rowid.
'">';
1651 echo
img_down(
'default', 0,
'imgdownforline');
1656 print
'<td width="30"> </td>';
1664 if ($action !=
'editline' || $idline != $objp->rowid) {
1666 if (
getDolGlobalString(
'CONTRACT_HIDE_CLOSED_SERVICES_BY_DEFAULT') && $objp->statut == ContratLigne::STATUS_CLOSED && $action !=
'showclosedlines') {
1667 $moreparam =
'style="display: none;"';
1670 print
'<tr class="tdtop oddeven" '.$moreparam.
'>';
1673 if ($objp->fk_product > 0) {
1674 $productstatic->id = $objp->fk_product;
1675 $productstatic->type = $objp->ptype;
1676 $productstatic->ref = $objp->pref;
1677 $productstatic->entity = $objp->pentity;
1678 $productstatic->label = $objp->plabel;
1679 $productstatic->status = $objp->tosell;
1680 $productstatic->status_buy = $objp->tobuy;
1681 $productstatic->status_batch = $objp->tobatch;
1684 $text = $productstatic->getNomUrl(1,
'', 32);
1685 if ($objp->plabel) {
1687 $text .= $objp->plabel;
1689 $description = $objp->description;
1693 $text .= (!empty($objp->description) && $objp->description != $objp->plabel) ?
'<br>'.
dol_htmlentitiesbr($objp->description) :
'';
1697 print $form->textwithtooltip($text, $description, 3, 0, 0, $cursorline, 3, (!empty($line->fk_parent_line) ?
img_picto(
'',
'rightarrow') :
''));
1701 print
'<td>'.img_object($langs->trans(
"ShowProductOrService"), ($objp->product_type ?
'service' :
'product')).
' '.
dol_htmlentitiesbr($objp->
description).
"</td>\n";
1704 print
'<td class="center">';
1705 print
vatrate($objp->tva_tx.($objp->vat_src_code ? (
' ('.$objp->vat_src_code.
')') :
''), true, $objp->info_bits);
1708 print
'<td class="right">'.($objp->subprice !=
'' ?
price($objp->subprice) :
'').
"</td>\n";
1714 print
'<td class="center">'.$objp->qty.
'</td>';
1717 print
'<td class="left">'.$langs->trans(
$object->lines[$cursorline - 1]->getLabelOfUnit()).
'</td>';
1720 if ($objp->remise_percent > 0) {
1721 print
'<td class="right">'.$objp->remise_percent.
"%</td>\n";
1723 print
'<td> </td>';
1728 print
'<td class="right nowraponall">'.price($objp->pa_ht).
'</td>';
1732 print
'<td class="nowraponall right">';
1733 if ($user->hasRight(
'contrat',
'creer') && is_array($arrayothercontracts) && count($arrayothercontracts) && (
$object->status >= 0)) {
1734 print
'<!-- link to move service line into another contract -->';
1735 print
'<a class="reposition marginrightonly" style="padding-left: 5px;" href="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'&action=move&token='.
newToken().
'&elrowid='.$objp->rowid.
'">';
1736 print
img_picto($langs->trans(
"MoveToAnotherContract"),
'uparrow');
1739 if ($user->hasRight(
'contrat',
'creer') && (
$object->statut >= 0)) {
1740 print
'<a class="reposition marginrightonly editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'&action=editline&token='.
newToken().
'&elrowid='.$objp->rowid.
'">';
1744 if ($user->hasRight(
'contrat',
'creer') && (
$object->statut >= 0)) {
1745 print
'<a class="reposition marginrightonly" href="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'&action=deleteline&token='.
newToken().
'&elrowid='.$objp->rowid.
'">';
1762 if ($objp->subprice >= 0) {
1763 print
'<tr class="oddeven" '.$moreparam.
'>';
1764 print
'<td colspan="'.$colspan.
'">';
1767 print $langs->trans(
"DateStartPlanned").
': ';
1768 if ($objp->date_start) {
1771 if ($objp->statut == 0 && $db->jdate($objp->date_start) < ($now -
$conf->contrat->services->inactifs->warning_delay)) {
1772 $warning_delay =
$conf->contrat->services->inactifs->warning_delay / 3600 / 24;
1773 $textlate = $langs->trans(
"Late").
' = '.$langs->trans(
"DateReference").
' > '.$langs->trans(
"DateToday").
' '.(ceil($warning_delay) >= 0 ?
'+' :
'').ceil($warning_delay).
' '.$langs->trans(
"days");
1774 print
" ".img_warning($textlate);
1777 print $langs->trans(
"Unknown");
1779 print
' - ';
1780 print $langs->trans(
"DateEndPlanned").
': ';
1781 if ($objp->date_end) {
1783 if ($objp->statut == 4 && $db->jdate($objp->date_end) < ($now -
$conf->contrat->services->expires->warning_delay)) {
1784 $warning_delay =
$conf->contrat->services->expires->warning_delay / 3600 / 24;
1785 $textlate = $langs->trans(
"Late").
' = '.$langs->trans(
"DateReference").
' > '.$langs->trans(
"DateToday").
' '.(ceil($warning_delay) >= 0 ?
'+' :
'').ceil($warning_delay).
' '.$langs->trans(
"days");
1786 print
" ".img_warning($textlate);
1789 print $langs->trans(
"Unknown");
1797 if (is_array($extralabelslines) && count($extralabelslines) > 0) {
1799 $line->id = $objp->rowid;
1800 $line->fetch_optionals();
1801 print $line->showOptionals($extrafields,
'view', array(
'class' =>
'oddeven',
'style' => $moreparam,
'colspan' => $colspan,
'tdclass' =>
'notitlefieldcreate'),
'',
'', 1);
1806 print
'<tr class="oddeven">';
1808 $currentLineProductId = GETPOSTISSET(
'idprod') ?
GETPOST(
'idprod') : (!empty(
$object->lines[$cursorline - 1]->fk_product) ?
$object->lines[$cursorline - 1]->fk_product : 0);
1809 if ($objp->fk_product > 0) {
1810 $canchangeproduct = 1;
1813 if (empty($canchangeproduct)) {
1814 $productstatic->id = $objp->fk_product;
1815 $productstatic->type = $objp->ptype;
1816 $productstatic->ref = $objp->pref;
1817 $productstatic->entity = $objp->pentity;
1818 print $productstatic->getNomUrl(1,
'', 32);
1819 print $objp->label ?
' - '.dol_trunc($objp->label, 32) :
'';
1820 print
'<input type="hidden" name="idprod" value="'.$currentLineProductId.
'">';
1822 $senderissupplier = 0;
1823 if (empty($senderissupplier)) {
1829 print $form->select_produits($currentLineProductId,
'idprod', $filtertype, 0, 0, 1, 2,
'', 0, array(), 0, 1, 0,
'minwidth250onall maxwidth500 widthcentpercentminusx');
1831 $form->select_produits_fournisseurs($currentLineProductId,
'idprod');
1836 print $objp->label ? $objp->label.
'<br>' :
'';
1837 print
'<input type="hidden" name="idprod" value="'.$currentLineProductId.
'">';
1841 require_once DOL_DOCUMENT_ROOT.
'/core/class/doleditor.class.php';
1846 $doleditor =
new DolEditor(
'product_desc', (GETPOSTISSET(
'product_desc') ?
GETPOST(
'product_desc') : $objp->
description),
'', 92,
'dolibarr_details',
'', false, true,
getDolGlobalInt(
'FCKEDITOR_ENABLE_DETAILS'), $nbrows,
'90%');
1847 $doleditor->Create();
1852 print
'<td class="right">';
1853 print $form->load_tva(
"eltva_tx", $objp->tva_tx.($objp->vat_src_code ? (
' ('.$objp->vat_src_code.
')') :
''), $mysoc,
$object->thirdparty, $currentLineProductId, $objp->info_bits, $objp->product_type, 0, 1);
1857 print
'<td class="right"><input class="width50" type="text" name="elprice" value="'.(GETPOSTISSET(
'elprice') ?
GETPOST(
'elprice') :
price($objp->subprice)).
'"></td>';
1865 print
'<td class="center"><input size="2" type="text" name="elqty" value="'.(GETPOSTISSET(
'elqty') ?
GETPOST(
'elqty') : $objp->qty).
'"></td>';
1869 print
'<td class="left">';
1870 print $form->selectUnits((GETPOSTISSET(
'unit') ?
GETPOSTINT(
'unit') : $objp->fk_unit),
"unit");
1875 print
'<td class="nowraponall right"><input size="1" type="text" name="elremise_percent" value="'.(GETPOSTISSET(
'elremise_percent') ?
GETPOST(
'elremise_percent') : $objp->remise_percent).
'">%</td>';
1877 if (!empty($usemargins)) {
1878 print
'<td class="right">';
1879 if ($objp->fk_product) {
1880 print
'<select id="fournprice" name="fournprice"></select>';
1882 print
'<input id="buying_price" type="text" class="width50" name="buying_price" value="'.price((GETPOSTISSET(
'buying_price') ?
GETPOST(
'buying_price') : $objp->pa_ht), 0,
'', 0).
'"></td>';
1884 print
'<td class="center">';
1885 print
'<input type="submit" class="button margintoponly marginbottomonly" name="save" value="'.$langs->trans(
"Modify").
'">';
1886 print
'<br><input type="submit" class="button margintoponly marginbottomonly button-cancel" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
1899 print
'<tr class="oddeven">';
1900 print
'<td colspan="'.$colspan.
'">';
1901 print $langs->trans(
"DateStartPlanned").
' ';
1902 print $form->selectDate($db->jdate($objp->date_start),
"date_start_update", $usehm, $usehm, ($db->jdate($objp->date_start) > 0 ? 0 : 1),
"update");
1903 print
' '.$langs->trans(
"DateEndPlanned").
' ';
1904 print $form->selectDate($db->jdate($objp->date_end),
"date_end_update", $usehm, $usehm, ($db->jdate($objp->date_end) > 0 ? 0 : 1),
"update");
1908 if (is_array($extralabelslines) && count($extralabelslines) > 0) {
1910 $line->id = $objp->rowid;
1911 $line->fetch_optionals();
1913 print $line->showOptionals($extrafields,
'edit', array(
'style' =>
'class="oddeven"',
'colspan' => $colspan,
'tdclass' =>
'notitlefieldcreate'),
'',
'', 1);
1924 if (
getDolGlobalString(
'CONTRACT_HIDE_CLOSED_SERVICES_BY_DEFAULT') &&
$object->lines[$cursorline - 1]->statut == ContratLigne::STATUS_CLOSED && $action !=
'showclosedlines') {
1925 $moreparam =
'style="display: none;"';
1936 print
'<tr class="oddeven" '.$moreparam.
'>';
1937 print
'<td class="tdhrthin" colspan="'.$colspan.
'"><hr class="opacitymedium tdhrthin"></td>';
1950 if ($action ==
'deleteline' && !$cancel && $user->hasRight(
'contrat',
'creer') &&
$object->lines[$cursorline - 1]->id == $idline) {
1951 print $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".((
int)
$object->id).
"&lineid=".((
int) $idline), $langs->trans(
"DeleteContractLine"), $langs->trans(
"ConfirmDeleteContractLine"),
"confirm_deleteline",
'', 0, 1);
1952 if ($ret ==
'html') {
1953 print
'<table class="notopnoleftnoright centpercent"><tr class="oddeven" height="6"><td></td></tr></table>';
1960 if ($action ==
'move' && !$cancel && $user->hasRight(
'contrat',
'creer') &&
$object->lines[$cursorline - 1]->id == $idline) {
1961 $arraycontractid = array();
1962 foreach ($arrayothercontracts as $contractcursor) {
1963 $arraycontractid[$contractcursor->id] = $contractcursor->ref;
1967 $formquestion = array(
1968 'text' => $langs->trans(
"ConfirmMoveToAnotherContractQuestion"),
1969 0 => array(
'type' =>
'select',
'name' =>
'newcid',
'values' => $arraycontractid));
1971 print $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".((
int)
$object->id).
"&lineid=".((
int) $idline), $langs->trans(
"MoveToAnotherContract"), $langs->trans(
"ConfirmMoveToAnotherContract"),
"confirm_move", $formquestion,
'yes');
1972 print
'<table class="notopnoleftnoright centpercent"><tr class="oddeven" height="6"><td></td></tr></table>';
1977 print
'<table class="notopnoleftnoright tableforservicepart2'.($cursorline < $nbofservices ?
' boxtablenobottom' :
'').
' centpercent">';
1979 print
'<tr class="oddeven" '.$moreparam.
'>';
1980 print
'<td><span class="valignmiddle hideonsmartphone">'.$langs->trans(
"ServiceStatus").
':</span> '.
$object->lines[$cursorline - 1]->getLibStatut(4).
'</td>';
1981 print
'<td width="30" class="right">';
1982 if ($user->socid == 0) {
1983 if (
$object->statut > 0 && $action !=
'activateline' && $action !=
'unactivateline' && is_object($objp)) {
1984 $tmpaction =
'activateline';
1985 $tmpactionpicto =
'play';
1986 $tmpactiontext = $langs->trans(
"Activate");
1987 if ($objp->statut == 4) {
1988 $tmpaction =
'unactivateline';
1989 $tmpactionpicto =
'playstop';
1990 $tmpactiontext = $langs->trans(
"Disable");
1992 if (($tmpaction ==
'activateline' && $user->hasRight(
'contrat',
'activer')) || ($tmpaction ==
'unactivateline' && $user->hasRight(
'contrat',
'desactiver'))) {
1993 print
'<a class="reposition" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&ligne='.
$object->lines[$cursorline - 1]->id.
'&action='.$tmpaction.
'&token='.
newToken().
'">';
1994 print
img_picto($tmpactiontext, $tmpactionpicto);
2002 print
'<tr class="oddeven" '.$moreparam.
'>';
2006 if (!$objp->date_start_real) {
2007 print $langs->trans(
"DateStartReal").
': ';
2008 if ($objp->date_start_real) {
2011 print $langs->trans(
"ContractStatusNotRunning");
2015 if ($objp->date_start_real && !$objp->date_end_real) {
2016 print $langs->trans(
"DateStartReal").
': ';
2020 if ($objp->date_start_real && $objp->date_end_real) {
2021 print $langs->trans(
"DateStartReal").
': ';
2023 print
' - ';
2024 print $langs->trans(
"DateEndReal").
': ';
2027 if (!empty($objp->comment)) {
2028 print
" - ".$objp->comment;
2032 print
'<td class="center"> </td>';
2039 if ($user->hasRight(
'contrat',
'activer') && $action ==
'activateline' &&
$object->lines[$cursorline - 1]->id ==
GETPOSTINT(
'ligne') && is_object($objp)) {
2040 print
'<form name="active" action="'.$_SERVER[
"PHP_SELF"].
'" method="POST">';
2041 print
'<input type="hidden" name="token" value="'.newToken().
'">';
2042 print
'<input type="hidden" name="action" value="confirm_active">';
2043 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
2044 print
'<input type="hidden" name="id" value="'.$object->id.
'">';
2045 print
'<input type="hidden" name="ligne" value="'.GETPOSTINT(
'ligne').
'">';
2046 print
'<input type="hidden" name="confirm" value="yes">';
2048 print
'<table class="noborder tableforservicepart2'.($cursorline < $nbofservices ?
' boxtablenobottom' :
'').
' centpercent">';
2051 $dateactstart = $objp->date_start;
2054 } elseif (!$dateactstart) {
2055 $dateactstart = time();
2058 $dateactend = $objp->date_end;
2061 } elseif (!$dateactend) {
2062 if ($objp->fk_product > 0) {
2064 $product->fetch($objp->fk_product);
2065 $dateactend =
dol_time_plus_duree(time(), $product->duration_value, $product->duration_unit);
2069 print
'<tr class="oddeven">';
2070 print
'<td class="nohover">'.$langs->trans(
"DateServiceActivate").
'</td><td class="nohover">';
2071 print $form->selectDate($dateactstart,
'start', $usehm, $usehm, 0,
"active", 1, 0);
2073 print
'<td class="nohover">'.$langs->trans(
"DateEndPlanned").
'</td><td class="nohover">';
2074 print $form->selectDate($dateactend,
"end", $usehm, $usehm, 0,
"active", 1, 0);
2076 print
'<td class="center nohover">';
2081 print
'<tr class="oddeven">';
2082 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>';
2083 print
'<td class="nohover right">';
2084 print
'<input type="submit" class="button" name="activate" value="'.$langs->trans(
"Activate").
'"> ';
2085 print
'<input type="submit" class="button button-cancel" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
2094 if ($user->hasRight(
'contrat',
'activer') && $action ==
'unactivateline' &&
$object->lines[$cursorline - 1]->id ==
GETPOSTINT(
'ligne') && is_object($objp)) {
2098 print
'<!-- Form to disabled a line -->'.
"\n";
2099 print
'<form name="confirm_closeline" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&ligne='.
$object->lines[$cursorline - 1]->id.
'" method="post">';
2100 print
'<input type="hidden" name="token" value="'.newToken().
'">';
2101 print
'<input type="hidden" name="confirm" value="yes">';
2102 print
'<input type="hidden" name="action" value="confirm_closeline">';
2103 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
2105 print
'<table class="noborder tableforservicepart2'.($cursorline < $nbofservices ?
' boxtablenobottom' :
'').
' centpercent">';
2108 $dateactstart = $objp->date_start_real;
2111 } elseif (!$dateactstart) {
2112 $dateactstart = time();
2115 $dateactend = $objp->date_end_real;
2118 } elseif (!$dateactend) {
2119 if ($objp->fk_product > 0) {
2121 $product->fetch($objp->fk_product);
2122 $dateactend =
dol_time_plus_duree(time(), $product->duration_value, $product->duration_unit);
2126 if ($dateactend > $now) {
2130 print
'<tr class="oddeven"><td colspan="2" class="nohover">';
2131 if ($objp->statut >= 4) {
2132 if ($objp->statut == 4) {
2133 print $langs->trans(
"DateEndReal").
' ';
2134 print $form->selectDate($dateactend,
"end", $usehm, $usehm, ($objp->date_end_real > 0 ? 0 : 1),
"closeline", 1, 1);
2138 print
'<td class="center nohover">';
2141 print
'<tr class="oddeven">';
2142 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>';
2143 print
'<td class="nohover right">';
2144 print
'<input type="submit" class="button" name="close" value="'.$langs->trans(
"Disable").
'"> ';
2145 print
'<input type="submit" class="button button-cancel" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
2159 if ($user->hasRight(
'contrat',
'creer') && (
$object->statut == 0)) {
2163 print
' <form name="addproduct" id="addproduct" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.(($action !=
'editline') ?
'' :
'#line_'.
GETPOSTINT(
'lineid')).
'" method="POST">
2164 <input type="hidden" name="token" value="'.
newToken().
'">
2165 <input type="hidden" name="action" value="'.(($action !=
'editline') ?
'addline' :
'updateline').
'">
2166 <input type="hidden" name="mode" value="">
2167 <input type="hidden" name="id" value="'.
$object->id.
'">
2168 <input type="hidden" name="page_y" value="">
2169 <input type="hidden" name="backtopage" value="'.$backtopage.
'">
2172 print
'<div class="div-table-responsive-no-min">';
2173 print
'<table id="tablelines" class="noborder noshadow" width="100%">';
2176 if ($action !=
'editline') {
2177 $forcetoshowtitlelines = 1;
2178 if (empty(
$object->multicurrency_code)) {
2184 $parameters = array();
2185 $reshook = $hookmanager->executeHooks(
'formAddObjectLine', $parameters,
$object, $action);
2189 if (empty($reshook)) {
2190 $object->formAddObjectLine(1, $mysoc, $soc);
2202 if (
GETPOST(
'modelselected')) {
2203 $action =
'presend';
2209 if ($user->socid == 0 && $action !=
'presend' && $action !=
'editline') {
2210 print
'<div class="tabsAction">';
2212 $parameters = array();
2213 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters,
$object, $action);
2215 if (empty($reshook)) {
2219 'class' =>
'classfortooltip'
2224 if (empty($user->socid)) {
2225 if (
$object->status == $object::STATUS_VALIDATED) {
2226 if ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') || $user->hasRight(
'contrat',
'creer'))) {
2227 print
dolGetButtonAction(
'', $langs->trans(
'SendMail'),
'default', $_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=presend&token='.
newToken().
'&mode=init#formmailbeforetitle',
'',
true, $params);
2229 print
dolGetButtonAction(
'', $langs->trans(
'SendMail'),
'default',
'#',
'',
false, $params);
2234 if (
$object->status == $object::STATUS_DRAFT && $nbofservices) {
2235 if ($user->hasRight(
'contrat',
'creer')) {
2236 unset($params[
'attr'][
'title']);
2237 print
dolGetButtonAction($langs->trans(
'Validate'),
'',
'default', $_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=valid&token='.
newToken(),
'',
true, $params);
2239 $params[
'attr'][
'title'] = $langs->trans(
"NotEnoughPermissions");
2240 print
dolGetButtonAction($langs->trans(
'Validate'),
'',
'default',
'#',
'',
false, $params);
2243 if (
$object->status == $object::STATUS_VALIDATED) {
2244 if ($user->hasRight(
'contrat',
'creer')) {
2245 unset($params[
'attr'][
'title']);
2246 print
dolGetButtonAction($langs->trans(
'Modify'),
'',
'default', $_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=reopen&token='.
newToken(),
'',
true, $params);
2248 $params[
'attr'][
'title'] = $langs->trans(
"NotEnoughPermissions");
2249 print
dolGetButtonAction($langs->trans(
'Modify'),
'',
'default',
'#',
'',
false, $params);
2254 $arrayofcreatebutton = array();
2255 if (isModEnabled(
'order') &&
$object->status > 0 &&
$object->nbofservicesclosed < $nbofservices) {
2256 $arrayofcreatebutton[] = array(
2257 'url' =>
'/commande/card.php?action=create&token='.
newToken().
'&origin='.
$object->element.
'&originid='.
$object->id.
'&socid='.
$object->thirdparty->id,
2258 'label' => $langs->trans(
'AddOrder'),
2260 'perm' => $user->hasRight(
'commande',
'creer') ?
true : false,
2264 if (isModEnabled(
'invoice') &&
$object->status > 0 && $soc->client > 0) {
2265 $arrayofcreatebutton[] = array(
2266 'url' =>
'/compta/facture/card.php?action=create&origin='.
$object->element.
'&originid='.
$object->id.
'&socid='.
$object->thirdparty->id,
2267 'label' => $langs->trans(
'CreateBill'),
2269 'perm' => $user->hasRight(
'facture',
'creer') ?
true : false,
2273 if (isModEnabled(
'supplier_invoice') &&
$object->status > 0 && $soc->fournisseur == 1) {
2274 $langs->load(
"suppliers");
2275 $arrayofcreatebutton[] = array(
2276 'url' =>
'/fourn/facture/card.php?action=create&origin='.
$object->element.
'&originid='.
$object->id.
'&socid='.
$object->thirdparty->id,
2277 'label' => $langs->trans(
'AddSupplierInvoice'),
2279 'perm' => $user->hasRight(
'fournisseur',
'facture',
'creer') ?
true : false,
2283 if (count($arrayofcreatebutton)) {
2284 unset($params[
'attr'][
'title']);
2285 print
dolGetButtonAction(
'', $langs->trans(
"Create"),
'default', $arrayofcreatebutton,
'',
true, $params);
2288 $arrayforbutaction = array();
2289 if (
$object->nbofservicesclosed > 0 ||
$object->nbofserviceswait > 0) {
2290 $arrayforbutaction[] = array(
2291 'url' =>
'/contrat/card.php?id='.
$object->id.
'&action=activate&token='.
newToken(),
2292 'label' => $langs->trans(
'ActivateAllContracts'),
2294 'perm' => $user->hasRight(
'contrat',
'activer'),
2298 if (
$object->nbofservicesclosed < $nbofservices) {
2299 $arrayforbutaction[] = array(
2300 'url' =>
'/contrat/card.php?id='.
$object->id.
'&action=close&token='.
newToken(),
2301 'label' => $langs->trans(
'CloseAllContracts'),
2303 'perm' => $user->hasRight(
'contrat',
'desactiver') ?
true : false,
2308 if (count($arrayforbutaction)) {
2309 unset($params[
'attr'][
'title']);
2310 print
dolGetButtonAction(
'', $langs->trans(
"Services"),
'default', $arrayforbutaction,
'',
true, $params);
2314 if ($action ==
'showclosedlines') {
2315 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>';
2317 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>';
2322 if (
$object->status > Contrat::STATUS_DRAFT) {
2323 if (
$object->signed_status != Contrat::$SIGNED_STATUSES[
'STATUS_SIGNED_ALL']) {
2324 print
'<div class="inline-block divButAction"><a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=sign&token=' .
newToken() .
'">' . $langs->trans(
"ContractSign") .
'</a></div>';
2326 print
'<div class="inline-block divButAction"><a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=unsign&token=' .
newToken() .
'">' . $langs->trans(
"ContractUnsign") .
'</a></div>';
2331 if ($user->hasRight(
'contrat',
'creer')) {
2332 unset($params[
'attr'][
'title']);
2337 unset($params[
'attr'][
'title']);
2338 print
dolGetButtonAction($langs->trans(
'Delete'),
'',
'delete', $_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=delete&token='.
newToken(),
'', $permissiontodelete, $params);
2344 if ($action !=
'presend') {
2345 print
'<div class="fichecenter"><div class="fichehalfleft">';
2352 $urlsource = $_SERVER[
"PHP_SELF"].
"?id=".
$object->id;
2353 $genallowed = $user->hasRight(
'contrat',
'lire');
2354 $delallowed = $user->hasRight(
'contrat',
'creer');
2357 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);
2361 $tmparray = $form->showLinkToObjectBlock(
$object, array(), array(
'contrat'), 1);
2362 $linktoelem = $tmparray[
'linktoelem'];
2363 $htmltoenteralink = $tmparray[
'htmltoenteralink'];
2364 print $htmltoenteralink;
2366 $somethingshown = $form->showLinkedObjectBlock(
$object, $linktoelem);
2370 print
'<br><!-- Link to sign -->';
2371 require_once DOL_DOCUMENT_ROOT.
'/core/lib/signature.lib.php';
2373 print showOnlineSignatureUrl(
'contract',
$object->ref).
'<br>';
2376 print
'</div><div class="fichehalfright">';
2380 $morehtmlcenter =
'<div class="nowraponall">';
2381 $morehtmlcenter .=
dolGetButtonTitle($langs->trans(
'FullConversation'),
'',
'fa fa-comments imgforviewmode', DOL_URL_ROOT.
'/contrat/messaging.php?id='.
$object->id);
2382 $morehtmlcenter .=
dolGetButtonTitle($langs->trans(
'SeeAll'),
'',
'fa fa-bars imgforviewmode', DOL_URL_ROOT.
'/contrat/agenda.php?id='.
$object->id);
2383 $morehtmlcenter .=
'</div>';
2387 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
2389 $somethingshown = $formactions->showactions(
$object,
'contract', $socid, 1,
'listactions', $MAXEVENT,
'', $morehtmlcenter);
2391 print
'</div></div>';
2395 $modelmail =
'contract';
2396 $defaulttopic =
'SendContractRef';
2397 $diroutput =
$conf->contrat->multidir_output[
$object->entity];
2398 $trackid =
'con'.$object->id;
2400 include DOL_DOCUMENT_ROOT.
'/core/tpl/card_presend.tpl.php';
2411if (isModEnabled(
'margin') && $action ==
'editline') {
2412 print
"\n".
'<script type="text/javascript">'.
"\n";
2414 $(document).ready(
function() {
2415 var idprod = $(
"input[name='idprod']").val();
2416 var fournprice = $(
"input[name='fournprice']").val();
2417 var token =
'<?php echo currentToken(); ?>';
2419 $.post(
'<?php echo DOL_URL_ROOT; ?>/fourn/ajax/getSupplierPrices.php', {
2423 if (data.length > 0) {
2426 $(data).each(
function() {
2427 options +=
'<option value="'+this.
id+
'" price="'+this.
price+
'"';
2428 if (fournprice > 0) {
2429 if (this.
id == fournprice) {
2430 options +=
' selected';
2431 $(
"#buying_price").val(this.price);
2435 options +=
'>'+this.label+
'</option>';
2437 options +=
'<option value=null'+(trouve?
'':
' selected')+
'><?php echo $langs->trans("InputPrice"); ?></option>';
2438 $(
"#fournprice").html(options);
2440 $(
"#buying_price").hide();
2441 $(
"#fournprice").show();
2444 $(
"#buying_price").show();
2446 $(
"#fournprice").change(
function() {
2447 var selval = $(
this).find(
'option:selected').attr(
"price");
2449 $(
"#buying_price").val(selval).hide();
2451 $(
'#buying_price').show();
2455 $(
"#fournprice").hide();
2456 $(
'#buying_price').show();
2462 $(
"#fournprice").hide();
2463 $(
'#buying_price').show();
2467 print
"\n".
'<script type="text/javascript">'.
"\n";
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
Class to manage lines of contracts.
Class to manage a WYSIWYG editor.
Class to manage the table of subscription to notifications.
File of class to manage predefined price products or services by customer.
Class to manage products or services.
Class to manage projects.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage translations.
Class to manage Dolibarr users.
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_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed information (by default a local PHP server timestamp) Rep...
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
vatrate($rate, $addpercent=false, $info_bits=0, $usestarfornpr=0, $html=0)
Return a string with VAT rate label formatted for view output Used into pdf and HTML pages.
img_delete($titlealt='default', $other='class="pictodelete"', $morecss='')
Show delete logo.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
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 '.
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.
GETPOSTISARRAY($paramname, $method=0)
Return true if the parameter $paramname is submit from a POST OR GET as an array.
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
if(!function_exists( 'dol_getprefix')) dol_include_once($relpath, $classname='')
Make an include_once using default root and alternate root if it fails.
newToken()
Return the value of token currently saved into session with name 'newtoken'.
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.
dol_clone($object, $native=2)
Create a clone of instance of object (new instance with same value for each properties) With native =...
dol_sanitizeFileName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a file name.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dol_htmlentitiesbr($stringtoencode, $nl2brmode=0, $pagecodefrom='UTF-8', $removelasteolbr=1)
This function is called to encode a string into a HTML string but differs from htmlentities because a...
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
img_edit($titlealt='default', $float=0, $other='')
Show logo edit/modify fiche.
img_up($titlealt='default', $selected=0, $moreclass='')
Show top arrow logo.
get_localtax($vatrate, $local, $thirdparty_buyer=null, $thirdparty_seller=null, $vatnpr=0)
Return localtax rate for a particular vat, when selling a product with vat $vatrate,...
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
dol_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...
global $conf
The following vars must be defined: $type2label $form $conf, $lang, The following vars may also be de...
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.