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');
74$backtopageforcancel =
GETPOST(
'backtopageforcancel',
'alpha');
79$origin =
GETPOST(
'origin',
'alpha');
82$attribute =
GETPOST(
'attribute',
'aZ09');
98 $socid = $user->socid;
102$hookmanager->initHooks(array(
'contractcard',
'globalcard'));
111if ($id > 0 || !empty($ref) && $action !=
'add') {
112 $ret =
$object->fetch($id, $ref);
114 $ret =
$object->fetch_thirdparty();
122$extrafields->fetch_name_optionals_label(
$object->table_element);
125$extralabelslines = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
127$permissionnote = $user->hasRight(
'contrat',
'creer');
128$permissiondellink = $user->hasRight(
'contrat',
'creer');
129$permissiontodelete = ($user->hasRight(
'contrat',
'creer') &&
$object->status == $object::STATUS_DRAFT) || $user->hasRight(
'contrat',
'supprimer');
130$permissiontoadd = $user->hasRight(
'contrat',
'creer');
131$permissiontoedit = $permissiontoadd;
132$permissiontoactivate = $user->hasRight(
'contrat',
'activer');
133$permissiontodisable = $user->hasRight(
'contrat',
'desactiver');
134$permissiontoeditextra = $permissiontoadd;
135if (
GETPOST(
'attribute',
'aZ09') && isset($extrafields->attributes[
$object->table_element][
'perms'][
GETPOST(
'attribute',
'aZ09')])) {
137 $permissiontoeditextra =
dol_eval((
string) $extrafields->attributes[
$object->table_element][
'perms'][
GETPOST(
'attribute',
'aZ09')]);
145if (!(
$object->id > 0) && ($action ==
'view' || $action ==
'')) {
154$parameters = array(
'socid' => $socid);
155$reshook = $hookmanager->executeHooks(
'doActions', $parameters,
$object, $action);
159if (empty($reshook)) {
160 $backurlforlist = DOL_URL_ROOT.
'/contrat/list.php';
162 if (empty($backtopage) || ($cancel && empty($id))) {
163 if (empty($backtopage) || ($cancel && strpos($backtopage,
'__ID__'))) {
164 if (empty($id) && (($action !=
'add' && $action !=
'create') || $cancel)) {
165 $backtopage = $backurlforlist;
167 $backtopage = DOL_URL_ROOT.
'/contrat/card.php?id='.((!empty($id) &&
$id > 0) ? $id :
'__ID__');
173 if (!empty($backtopageforcancel)) {
174 header(
"Location: ".$backtopageforcancel);
176 } elseif (!empty($backtopage)) {
177 header(
"Location: ".$backtopage);
183 include DOL_DOCUMENT_ROOT.
'/core/actions_setnotes.inc.php';
185 include DOL_DOCUMENT_ROOT.
'/core/actions_dellink.inc.php';
187 include DOL_DOCUMENT_ROOT.
'/core/actions_lineupdown.inc.php';
189 if ($action ==
'confirm_active' && $confirm ==
'yes' && $permissiontoactivate) {
202 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
207 } elseif ($action ==
'confirm_sign' && $confirm ==
'yes' && $user->hasRight(
'contract',
'creer')) {
208 $result =
$object->setSignedStatus($user,
GETPOSTINT(
'signed_status'), 0,
'CONTRACT_MODIFY');
210 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id);
215 } elseif ($action ==
'confirm_unsign' && $confirm ==
'yes' && $user->hasRight(
'contract',
'creer')) {
216 $result =
$object->setSignedStatus($user, Contrat::$SIGNED_STATUSES[
'STATUS_NO_SIGNATURE'], 0,
'CONTRACT_MODIFY');
218 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id);
223 } elseif ($action ==
'confirm_closeline' && $confirm ==
'yes' && $permissiontodisable) {
230 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"DateEnd")),
null,
'errors');
235 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
243 if (
GETPOST(
'mode') ==
'predefined') {
255 $date_start_update =
'';
256 $date_end_update =
'';
257 $date_start_real_update =
'';
258 $date_end_real_update =
'';
259 if (
GETPOST(
'date_start_updatemonth') &&
GETPOST(
'date_start_updateday') &&
GETPOST(
'date_start_updateyear')) {
262 if (
GETPOST(
'date_end_updatemonth') &&
GETPOST(
'date_end_updateday') &&
GETPOST(
'date_end_updateyear')) {
265 if (
GETPOST(
'date_start_real_updatemonth') &&
GETPOST(
'date_start_real_updateday') &&
GETPOST(
'date_start_real_updateyear')) {
268 if (
GETPOST(
'date_end_real_updatemonth') &&
GETPOST(
'date_end_real_updateday') &&
GETPOST(
'date_end_real_updateyear')) {
276 if ($action ==
'add' && $user->hasRight(
'contrat',
'creer')) {
278 if (empty($datecontrat)) {
280 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Date")),
null,
'errors');
285 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"ThirdParty")),
null,
'errors');
291 $ret = $extrafields->setOptionalsFromPost(
null,
$object);
299 $object->date_contrat = $datecontrat;
313 if (!empty($origin) && !empty($originid)) {
315 $element = $subelement = $origin;
316 if (preg_match(
'/^([^_]+)_([^_]+)/i', $origin, $regs)) {
318 $subelement = $regs[2];
322 if ($element ==
'order') {
323 $element = $subelement =
'commande';
325 if ($element ==
'propal') {
326 $element =
'comm/propal';
327 $subelement =
'propal';
329 if ($element ==
'invoice' || $element ==
'facture') {
330 $element =
'compta/facture';
331 $subelement =
'facture';
335 $object->origin_id = $originid;
340 $object->linked_objects = array_merge(
$object->linked_objects,
GETPOST(
'other_linked_objects',
'array:int'));
347 $classname = ucfirst($subelement);
348 $srcobject =
new $classname($db);
349 '@phan-var-force Commande|Propal|Facture $srcobject';
352 $result = $srcobject->fetch(
$object->origin_id);
354 $srcobject->fetch_thirdparty();
355 $lines = $srcobject->lines;
356 if (empty($lines) && method_exists($srcobject,
'fetch_lines')) {
357 $srcobject->fetch_lines();
358 $lines = $srcobject->lines;
362 $num = count($lines);
365 for ($i = 0; $i < $num; $i++) {
366 $product_type = ($lines[$i]->product_type ? $lines[$i]->product_type : 0);
368 if ($product_type == 1 || (
getDolGlobalString(
'CONTRACT_SUPPORT_PRODUCTS') && in_array($product_type, array(0, 1)))) {
370 if ($lines[$i]->fk_product > 0) {
371 $product_static =
new Product($db);
376 $prod->id = $lines[$i]->fk_product;
377 $prod->getMultiLangs();
379 $outputlangs = $langs;
381 if (
GETPOST(
'lang_id',
'aZ09')) {
382 $newlang =
GETPOST(
'lang_id',
'aZ09');
384 if (empty($newlang)) {
385 $newlang = $srcobject->thirdparty->default_lang;
387 if (!empty($newlang)) {
389 $outputlangs->setDefaultLang($newlang);
392 $label = (!empty($prod->multilangs[$outputlangs->defaultlang][
"libelle"])) ? $prod->multilangs[$outputlangs->defaultlang][
"libelle"] : $lines[$i]->product_label;
394 $label = $lines[$i]->product_label;
396 $desc = ($lines[$i]->desc && $lines[$i]->desc != $lines[$i]->label) ?
dol_htmlentitiesbr($lines[$i]->desc) :
'';
402 $array_options = array();
404 if (method_exists($lines[$i],
'fetch_optionals')) {
405 $lines[$i]->fetch_optionals();
406 $array_options = $lines[$i]->array_options;
409 $txtva = $lines[$i]->vat_src_code ? $lines[$i]->tva_tx.
' ('.$lines[$i]->vat_src_code.
')' : $lines[$i]->tva_tx;
417 $lines[$i]->subprice,
422 $lines[$i]->fk_product,
423 $lines[$i]->remise_percent,
424 $lines[$i]->date_start,
425 $lines[$i]->date_end,
428 $lines[$i]->info_bits,
429 $lines[$i]->fk_fournprice,
432 (
int) $lines[$i]->fk_unit,
448 $parameters = array(
'objFrom' => $srcobject);
449 $reshook = $hookmanager->executeHooks(
'createFrom', $parameters,
$object, $action);
463 $result =
$object->create($user);
465 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
473 } elseif ($action ==
'classin' && $user->hasRight(
'contrat',
'creer')) {
475 } elseif ($action ==
'addline' && $user->hasRight(
'contrat',
'creer')) {
479 $line_desc = (GETPOSTISSET(
'dp_desc') ?
GETPOST(
'dp_desc',
'restricthtml') :
'');
482 $price_ht_devise =
'';
484 $price_ttc_devise =
'';
486 $rang = count(
$object->lines) + 1;
488 if (
GETPOST(
'price_ht') !==
'') {
491 if (
GETPOST(
'multicurrency_price_ht') !==
'') {
494 if (
GETPOST(
'price_ttc') !==
'') {
497 if (
GETPOST(
'multicurrency_price_ttc') !==
'') {
501 if (
GETPOST(
'prod_entry_mode',
'alpha') ==
'free') {
507 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"ProductOrService")),
null,
'errors');
512 $tva_tx =
GETPOST(
'tva_tx',
'alpha');
515 $remise_percent = (GETPOSTISSET(
'remise_percent'.$predef) ?
price2num(
GETPOST(
'remise_percent'.$predef),
'', 2) : 0);
516 if (empty($remise_percent)) {
521 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Qty")),
null,
'errors');
524 if (
GETPOST(
'prod_entry_mode',
'alpha') ==
'free' && (empty($idprod) || $idprod < 0) && empty($line_desc)) {
525 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Description")),
null,
'errors');
531 if (!empty($date_start) && !empty($date_end) && $date_start > $date_end) {
532 setEventMessages($langs->trans(
"Error").
': '.$langs->trans(
"DateStartPlanned").
' > '.$langs->trans(
"DateEndPlanned"),
null,
'errors');
537 $extralabelsline = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
538 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line, $predef);
540 if (is_array($extralabelsline)) {
542 foreach ($extralabelsline as $key => $value) {
543 unset($_POST[
"options_".$key]);
552 $price_base_type =
'';
558 $prod->fetch($idprod);
567 $price_min = $prod->price_min;
568 $price_min_ttc = $prod->price_min_ttc;
572 $price_min = $prod->multiprices_min[
$object->thirdparty->price_level];
573 $price_min_ttc = $prod->multiprices_min_ttc[
$object->thirdparty->price_level];
576 require_once DOL_DOCUMENT_ROOT.
'/product/class/productcustomerprice.class.php';
580 $filter = array(
't.fk_product' => (
string) $prod->id,
't.fk_soc' => (
string)
$object->thirdparty->id);
582 $result = $prodcustprice->fetchAll(
'',
'', 0, 0, $filter);
584 if (count($prodcustprice->lines) > 0) {
585 $date_now = (int) floor(
dol_now() / 86400) * 86400;
586 foreach ($prodcustprice->lines as $k => $custprice_line) {
587 if ($custprice_line->date_begin <= $date_now && (empty($custprice_line->date_end) || $date_now <= $custprice_line->date_end)) {
588 $price_min =
price($custprice_line->price_min);
589 $price_min_ttc =
price($custprice_line->price_min_ttc);
605 $tmpvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', $tva_tx));
606 $tmpprodvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', (
string) $prod->tva_tx));
609 if (!empty($price_ht) || $price_ht ===
'0') {
611 $pu_ttc =
price2num((
float) $pu_ht * (1 + ((
float) $tmpvat / 100)),
'MU');
612 $price_base_type =
'HT';
613 } elseif (!empty($price_ttc) || $price_ttc ===
'0') {
615 $pu_ht =
price2num((
float) $pu_ttc / (1 + ((
float) $tmpvat / 100)),
'MU');
616 $price_base_type =
'TTC';
619 $desc = $prod->description;
629 $fk_unit = $prod->fk_unit;
633 $tva_npr = (preg_match(
'/\*/', $tva_tx) ? 1 : 0);
634 if (empty($tva_tx)) {
637 $tva_tx = str_replace(
'*',
'', $tva_tx);
640 $pu_ht_devise =
price2num($price_ht_devise,
'MU');
641 $pu_ttc_devise =
price2num($price_ttc_devise,
'MU');
643 $tmpvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', $tva_tx));
646 if (!empty($price_ht) || $price_ht ===
'0') {
648 $pu_ttc =
price2num((
float) $pu_ht * (1 + ((
float) $tmpvat / 100)),
'MU');
649 $price_base_type =
'HT';
650 } elseif (!empty($price_ttc) || $price_ttc ===
'0') {
652 $pu_ht =
price2num((
float) $pu_ttc / (1 + ((
float) $tmpvat / 100)),
'MU');
653 $price_base_type =
'TTC';
661 $fk_fournprice =
GETPOST(
'fournprice');
663 $pa_ht =
GETPOST(
'buying_price');
673 if (((
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && !$user->hasRight(
'produit',
'ignore_price_min_advance'))
675 $object->error = $langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, -1,
$conf->currency));
693 (
int) $fk_fournprice,
704 $outputlangs = $langs;
707 $newlang =
GETPOST(
'lang_id',
'aZ09');
710 $newlang =
$object->thirdparty->default_lang;
712 if (!empty($newlang)) {
714 $outputlangs->setDefaultLang($newlang);
719 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
722 unset($_POST[
'prod_entry_mode']);
724 unset($_POST[
'qty']);
725 unset($_POST[
'type']);
726 unset($_POST[
'remise_percent']);
727 unset($_POST[
'price_ht']);
728 unset($_POST[
'multicurrency_price_ht']);
729 unset($_POST[
'price_ttc']);
730 unset($_POST[
'tva_tx']);
731 unset($_POST[
'product_ref']);
732 unset($_POST[
'product_label']);
733 unset($_POST[
'product_desc']);
734 unset($_POST[
'fournprice']);
735 unset($_POST[
'buying_price']);
736 unset($_POST[
'np_marginRate']);
737 unset($_POST[
'np_markRate']);
738 unset($_POST[
'dp_desc']);
739 unset($_POST[
'idprod']);
741 unset($_POST[
'date_starthour']);
742 unset($_POST[
'date_startmin']);
743 unset($_POST[
'date_startsec']);
744 unset($_POST[
'date_startday']);
745 unset($_POST[
'date_startmonth']);
746 unset($_POST[
'date_startyear']);
747 unset($_POST[
'date_endhour']);
748 unset($_POST[
'date_endmin']);
749 unset($_POST[
'date_endsec']);
750 unset($_POST[
'date_endday']);
751 unset($_POST[
'date_endmonth']);
752 unset($_POST[
'date_endyear']);
757 } elseif ($action ==
'updateline' && $user->hasRight(
'contrat',
'creer') && !
GETPOST(
'cancel',
'alpha')) {
761 if (!empty($date_start_update) && !empty($date_end_update) && $date_start_update > $date_end_update) {
762 setEventMessages($langs->trans(
"Error").
': '.$langs->trans(
"DateStartPlanned").
' > '.$langs->trans(
"DateEndPlanned"),
null,
'errors');
763 $action =
'editline';
769 if ($objectline->fetch($idline) < 0) {
773 $objectline->fetch_optionals();
775 $objectline->oldcopy =
dol_clone($objectline, 2);
783 if ($date_start_real_update ==
'') {
784 $date_start_real_update = $objectline->date_start_real;
786 if ($date_end_real_update ==
'') {
787 $date_end_real_update = $objectline->date_end_real;
790 $vat_rate =
GETPOST(
'eltva_tx',
'alpha');
793 if (preg_match(
'/\*/', $vat_rate)) {
798 $vat_rate = str_replace(
'*',
'', $vat_rate);
807 if (preg_match(
'/\((.*)\)/', $txtva, $reg)) {
808 $vat_src_code = $reg[1];
809 $txtva = preg_replace(
'/\s*\(.*\)/',
'', $txtva);
825 $objectline->fk_product =
GETPOSTINT(
'idprod');
826 $objectline->description =
GETPOST(
'product_desc',
'restricthtml');
829 $objectline->remise_percent = $remise_percent;
830 $objectline->tva_tx = ($txtva ? $txtva : 0);
831 $objectline->vat_src_code = $vat_src_code;
832 $objectline->localtax1_tx = is_numeric($localtax1_tx) ? $localtax1_tx : 0;
833 $objectline->localtax2_tx = is_numeric($localtax2_tx) ? $localtax2_tx : 0;
834 $objectline->date_start = $date_start_update;
835 $objectline->date_start_real = $date_start_real_update;
836 $objectline->date_end = $date_end_update;
837 $objectline->date_end_real = $date_end_real_update;
838 $objectline->user_closing_id = $user->id;
840 $objectline->pa_ht = $pa_ht;
846 $objectline->fk_unit =
null;
850 $extralabelsline = $extrafields->fetch_name_optionals_label($objectline->table_element);
851 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line, $predef);
853 if (is_array($array_options) && count($array_options) > 0) {
855 foreach ($array_options as $key => $value) {
856 $objectline->array_options[$key] = $array_options[$key];
862 $result = $objectline->update($user);
865 $action =
'editline';
866 $_GET[
'rowid'] =
GETPOST(
'elrowid');
876 } elseif ($action ==
'confirm_deleteline' && $confirm ==
'yes' && $user->hasRight(
'contrat',
'creer')) {
880 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
885 } elseif ($action ==
'confirm_valid' && $confirm ==
'yes' && $user->hasRight(
'contrat',
'creer')) {
886 $result =
$object->validate($user);
891 $outputlangs = $langs;
894 $newlang =
GETPOST(
'lang_id',
'aZ09');
897 $newlang =
$object->thirdparty->default_lang;
899 if (!empty($newlang)) {
901 $outputlangs->setDefaultLang($newlang);
906 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
911 } elseif ($action ==
'reopen' && $user->hasRight(
'contrat',
'creer')) {
912 $result =
$object->reopen($user);
916 } elseif ($action ==
'confirm_close' && $confirm ==
'yes' && $permissiontodisable) {
918 $result =
$object->closeAll($user);
922 } elseif ($action ==
'confirm_activate' && $confirm ==
'yes' && $permissiontoactivate) {
925 $comment =
GETPOST(
'comment',
'alpha');
926 $result =
$object->activateAll($user, $date_start, 0, $comment, $date_end);
930 } elseif ($action ==
'confirm_delete' && $confirm ==
'yes' && $permissiontodelete) {
931 $result =
$object->delete($user);
933 header(
"Location: list.php?restore_lastsearch_values=1");
938 } elseif ($action ==
'confirm_move' && $confirm ==
'yes' && $permissiontoedit) {
941 $result = $contractline->fetch(
GETPOSTINT(
'lineid'));
942 $contractline->fk_contrat =
GETPOSTINT(
'newcid');
943 $result = $contractline->update($user, 1);
945 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$id);
951 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentities(
"RefNewContract")),
null,
'errors');
953 } elseif ($action ==
'update_extras' && $permissiontoeditextra) {
956 $attribute =
GETPOST(
'attribute',
'aZ09');
959 $ret = $extrafields->setOptionalsFromPost(
null,
$object, $attribute);
966 $result =
$object->updateExtraField($attribute,
'CONTRACT_MODIFY');
974 $action =
'edit_extras';
976 } elseif ($action ==
'setref_supplier' && $permissiontoadd) {
980 $result =
$object->setValueFrom(
'ref_supplier',
GETPOST(
'ref_supplier',
'alpha'),
'',
null,
'text',
'', $user,
'CONTRACT_MODIFY');
983 $action =
'editref_supplier';
985 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
989 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$id);
992 } elseif ($action ==
'setref_customer' && $permissiontoadd) {
996 $result =
$object->setValueFrom(
'ref_customer',
GETPOST(
'ref_customer',
'alpha'),
'',
null,
'text',
'', $user,
'CONTRACT_MODIFY');
999 $action =
'editref_customer';
1001 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
1005 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$id);
1008 } elseif ($action ==
'setref' && $permissiontoadd) {
1010 $result =
$object->fetch($id);
1017 $result =
$object->setValueFrom(
'ref',
GETPOST(
'ref',
'alpha'),
'',
null,
'text',
'', $user,
'CONTRACT_MODIFY');
1020 $action =
'editref';
1022 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
1029 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
1033 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$id);
1036 } elseif ($action ==
'setdate_contrat' && $permissiontoadd) {
1038 $result =
$object->fetch($id);
1043 $result =
$object->setValueFrom(
'date_contrat', $datacontrat,
'',
null,
'date',
'', $user,
'CONTRACT_MODIFY');
1046 $action =
'editdate_contrat';
1048 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
1052 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$id);
1058 include DOL_DOCUMENT_ROOT.
'/core/actions_printing.inc.php';
1062 include DOL_DOCUMENT_ROOT.
'/core/actions_builddoc.inc.php';
1065 $triggersendname =
'CONTRACT_SENTBYMAIL';
1067 $mode =
'emailfromcontract';
1068 $trackid =
'con'.$object->id;
1069 include DOL_DOCUMENT_ROOT.
'/core/actions_sendmails.inc.php';
1073 if ($action ==
'addcontact' && $user->hasRight(
'contrat',
'creer')) {
1076 $result =
$object->add_contact($contactid, $typeid,
GETPOST(
"source",
'aZ09'));
1079 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
1082 if (
$object->error ==
'DB_ERROR_RECORD_ALREADY_EXISTS') {
1083 $langs->load(
"errors");
1084 setEventMessages($langs->trans(
"ErrorThisContactIsAlreadyDefinedAsThisType"),
null,
'errors');
1089 } elseif ($action ==
'swapstatut' && $user->hasRight(
'contrat',
'creer')) {
1092 } elseif ($action ==
'deletecontact' && $user->hasRight(
'contrat',
'creer')) {
1097 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
1106 if ($action ==
'confirm_clone' && $confirm ==
'yes' && $user->hasRight(
'contrat',
'creer')) {
1108 setEventMessages($langs->trans(
"NoCloneOptionsSpecified"),
null,
'errors');
1111 $result =
$object->createFromClone($user, $socid);
1113 header(
"Location: ".$_SERVER[
'PHP_SELF'].
'?id='.$result);
1116 if (count(
$object->errors) > 0) {
1131$title =
$object->ref.
" - ".$langs->trans(
'Contract');
1132if ($action ==
'create') {
1133 $title = $langs->trans(
"NewContract");
1135$help_url =
'EN:Module_Contracts|FR:Module_Contrat|ES:Contratos_de_servicio';
1137llxHeader(
'', $title, $help_url,
'', 0, 0,
'',
'',
'',
'mod-contrat page-card');
1139$form =
new Form($db);
1141if (isModEnabled(
'project')) {
1147if (substr($module, 0, 13) ==
'mod_contract_' && substr($module, -3) ==
'php') {
1148 $module = substr($module, 0,
dol_strlen($module) - 4);
1151$modCodeContract =
null;
1153 $modCodeContract =
new $module();
1154 '@phan-var-force ModelNumRefContracts $modCodeContract';
1158if ($action ==
'create') {
1164 $soc->fetch($socid);
1170 $element = $subelement =
GETPOST(
'origin');
1171 if (preg_match(
'/^([^_]+)_([^_]+)/i',
GETPOST(
'origin'), $regs)) {
1172 $element = $regs[1];
1173 $subelement = $regs[2];
1176 if ($element ==
'project') {
1180 if ($element ==
'order' || $element ==
'commande') {
1181 $element = $subelement =
'commande';
1183 if ($element ==
'propal') {
1184 $element =
'comm/propal';
1185 $subelement =
'propal';
1187 if ($element ==
'invoice' || $element ==
'facture') {
1188 $element =
'compta/facture';
1189 $subelement =
'facture';
1194 $classname = ucfirst($subelement);
1195 $objectsrc =
new $classname($db);
1196 '@phan-var-force Commande|Propal|Facture $objectsrc';
1197 $objectsrc->fetch($originid);
1198 if (empty($objectsrc->lines) && method_exists($objectsrc,
'fetch_lines')) {
1199 $objectsrc->fetch_lines();
1201 $objectsrc->fetch_thirdparty();
1204 $objectsrc->fetch_optionals();
1205 $object->array_options = $objectsrc->array_options;
1207 $projectid = (!empty($objectsrc->fk_project) ? $objectsrc->fk_project :
'');
1209 $soc = $objectsrc->thirdparty;
1211 $note_private = (!empty($objectsrc->note_private) ? $objectsrc->note_private :
'');
1212 $note_public = (!empty($objectsrc->note_public) ? $objectsrc->note_public :
'');
1215 $srccontactslist = $objectsrc->liste_contact(-1,
'external', 1);
1219 $note_private =
GETPOST(
"note_private",
"alpha");
1220 $note_public =
GETPOST(
"note_public",
"alpha");
1225 print
'<form name="form_contract" action="'.$_SERVER[
"PHP_SELF"].
'" method="post">';
1226 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1227 print
'<input type="hidden" name="action" value="add">';
1228 print
'<input type="hidden" name="socid" value="'.$soc->id.
'">'.
"\n";
1229 print
'<input type="hidden" name="remise_percent" value="0">';
1230 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
1234 print
'<table class="border centpercent">';
1237 print
'<tr><td class="titlefieldcreate fieldrequired">'.$langs->trans(
'Ref').
'</td><td>';
1238 if (!empty($modCodeContract->code_auto)) {
1239 $tmpcode = $langs->trans(
"Draft");
1241 $tmpcode =
'<input name="ref" class="maxwidth100" maxlength="128" value="'.dol_escape_htmltag(
GETPOST(
'ref') ?
GETPOST(
'ref') : $tmpcode).
'">';
1247 print
'<tr><td>'.$langs->trans(
'RefCustomer').
'</td>';
1248 print
'<td><input type="text" class="maxwidth150" name="ref_customer" id="ref_customer" value="'.dol_escape_htmltag(
GETPOST(
'ref_customer',
'alpha')).
'"></td></tr>';
1251 print
'<tr><td>'.$langs->trans(
'RefSupplier').
'</td>';
1252 print
'<td><input type="text" class="maxwidth150" name="ref_supplier" id="ref_supplier" value="'.dol_escape_htmltag(
GETPOST(
'ref_supplier',
'alpha')).
'"></td></tr>';
1256 print
'<td class="fieldrequired">'.$langs->trans(
'ThirdParty').
'</td>';
1259 print $soc->getNomUrl(1);
1260 print
'<input type="hidden" name="socid" value="'.$soc->id.
'">';
1264 print
img_picto(
'',
'company',
'class="pictofixedwidth"');
1265 print $form->select_company(
'',
'socid',
'',
'SelectThirdParty', 1, 0, array(), 0,
'minwidth300 widthcentpercentminusxx maxwidth500');
1266 print
' <a href="'.DOL_URL_ROOT.
'/societe/card.php?action=create&customer=3&backtopage='.urlencode($_SERVER[
"PHP_SELF"].
'?action=create').
'"><span class="fa fa-plus-circle valignmiddle paddingleft" title="'.$langs->trans(
"AddThirdParty").
'"></span></a>';
1273 print
'<tr><td>'.$langs->trans(
'Discounts').
'</td><td>';
1274 if ($soc->remise_percent) {
1275 print $langs->trans(
"CompanyHasRelativeDiscount", $soc->remise_percent).
' ';
1277 print
'<span class="hideonsmartphone">'.$langs->trans(
"CompanyHasNoRelativeDiscount").
'. </span>';
1279 $absolute_discount = $soc->getAvailableDiscounts();
1280 if ($absolute_discount) {
1281 print $langs->trans(
"CompanyHasAbsoluteDiscount",
price($absolute_discount), $langs->trans(
"Currency".$conf->currency)).
'.';
1283 print
'<span class="hideonsmartphone">'.$langs->trans(
"CompanyHasNoAbsoluteDiscount").
'.</span>';
1289 print
'<tr><td class="nowrap"><span class="fieldrequired">'.$langs->trans(
"TypeContact_contrat_internal_SALESREPFOLL").
'</span></td><td>';
1290 print
img_picto(
'',
'user',
'class="pictofixedwidth"');
1291 print $form->select_dolusers(
GETPOST(
"commercial_suivi_id") ?
GETPOST(
"commercial_suivi_id") : $user->id,
'commercial_suivi_id', 1, null);
1295 print
'<tr><td class="nowrap"><span class="fieldrequired">'.$langs->trans(
"TypeContact_contrat_internal_SALESREPSIGN").
'</span></td><td>';
1296 print
img_picto(
'',
'user',
'class="pictofixedwidth"');
1297 print $form->select_dolusers(
GETPOST(
"commercial_signature_id") ?
GETPOST(
"commercial_signature_id") : $user->id,
'commercial_signature_id', 1, null);
1300 print
'<tr><td><span class="fieldrequired">'.$langs->trans(
"Date").
'</span></td><td>';
1301 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
1302 print $form->selectDate($datecontrat,
'', 0, 0, 0,
"contrat");
1306 if (isModEnabled(
'project')) {
1307 $langs->load(
'projects');
1311 print
'<tr><td>'.$langs->trans(
"Project").
'</td><td>';
1312 print
img_picto(
'',
'project',
'class="pictofixedwidth"');
1313 $formproject->select_projects(($soc->id > 0 ? $soc->id : -1), $projectid,
"projectid", 0, 0, 1, 1);
1314 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>';
1318 print
'<tr><td>'.$langs->trans(
"NotePublic").
'</td><td class="tdtop">';
1319 $doleditor =
new DolEditor(
'note_public', (
string) $note_public,
'', 100,
'dolibarr_notes',
'In',
true,
true, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PUBLIC') ? 0 : 1, ROWS_3,
'90%');
1320 print $doleditor->Create(1);
1323 if (empty($user->socid)) {
1324 print
'<tr><td>'.$langs->trans(
"NotePrivate").
'</td><td class="tdtop">';
1325 $doleditor =
new DolEditor(
'note_private', (
string) $note_private,
'', 100,
'dolibarr_notes',
'In',
true,
true, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PRIVATE') ? 0 : 1, ROWS_3,
'90%');
1326 print $doleditor->Create(1);
1331 $parameters = array(
'objectsrc' => $objectsrc,
'colspan' =>
' colspan="3"',
'cols' =>
'3');
1332 $reshook = $hookmanager->executeHooks(
'formObjectOptions', $parameters,
$object, $action);
1333 print $hookmanager->resPrint;
1336 if (empty($reshook)) {
1337 print
$object->showOptionals($extrafields,
'create', $parameters);
1344 print $form->buttonsSaveCancel(
"Create");
1346 if (is_object($objectsrc)) {
1347 print
'<input type="hidden" name="origin" value="'.$objectsrc->element.
'">';
1348 print
'<input type="hidden" name="originid" value="'.$objectsrc->id.
'">';
1351 print
'<br>'.$langs->trans(
"Note").
': '.$langs->trans(
"OnlyLinesWithTypeServiceAreUsed");
1365 $result =
$object->fetch_lines();
1370 $nbofservices = count(
$object->lines);
1372 $author =
new User($db);
1373 $author->fetch(
$object->user_author_id);
1375 $commercial_signature =
new User($db);
1376 $commercial_signature->fetch(
$object->commercial_signature_id);
1378 $commercial_suivi =
new User($db);
1379 $commercial_suivi->fetch(
$object->commercial_suivi_id);
1386 print
dol_get_fiche_head($head, $hselected, $langs->trans(
"Contract"), -1,
'contract');
1389 if ($action ==
'delete') {
1391 $formconfirm = $form->formconfirm($_SERVER[
'PHP_SELF'].
"?id=".
$object->id, $langs->trans(
"DeleteAContract"), $langs->trans(
"ConfirmDeleteAContract"),
"confirm_delete",
'', 0, 1);
1392 } elseif ($action ==
'valid') {
1394 $ref = substr(
$object->ref, 1, 4);
1395 if ($ref ==
'PROV' && !empty($modCodeContract->code_auto)) {
1400 $text = $langs->trans(
'ConfirmValidateContract', $numref);
1401 $formconfirm = $form->formconfirm($_SERVER[
'PHP_SELF'].
"?id=".
$object->id, $langs->trans(
"ValidateAContract"), $text,
"confirm_valid",
'', 0, 1);
1402 } elseif ($action ==
'close') {
1404 $formconfirm = $form->formconfirm($_SERVER[
'PHP_SELF'].
"?id=".
$object->id, $langs->trans(
"CloseAContract"), $langs->trans(
"ConfirmCloseContract"),
"confirm_close",
'', 0, 1);
1405 } elseif ($action ==
'activate') {
1406 $formquestion = array(
1407 array(
'type' =>
'date',
'name' =>
'd_start',
'label' => $langs->trans(
"DateServiceActivate"),
'value' =>
dol_now()),
1408 array(
'type' =>
'date',
'name' =>
'd_end',
'label' => $langs->trans(
"DateEndPlanned"), 0 =>
'', 1 =>
''),
1409 array(
'type' =>
'text',
'name' =>
'comment',
'label' => $langs->trans(
"Comment"),
'value' =>
'', 0 =>
'', 1 =>
'',
'class' =>
'minwidth300',
'moreattr' =>
'autofocus')
1411 $formconfirm = $form->formconfirm($_SERVER[
'PHP_SELF'].
"?id=".
$object->id, $langs->trans(
"ActivateAllOnContract"), $langs->trans(
"ConfirmActivateAllOnContract"),
"confirm_activate", $formquestion,
'yes', 1, 280);
1412 } elseif ($action ==
'clone') {
1413 $filter =
'(s.client:IN:1,2,3)';
1415 $formquestion = array(array(
'type' =>
'other',
'name' =>
'socid',
'label' => $langs->trans(
"SelectThirdParty"),
'value' => $form->select_company(
GETPOSTINT(
'socid'),
'socid', $filter)));
1416 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'ToClone'), $langs->trans(
'ConfirmCloneContract',
$object->ref),
'confirm_clone', $formquestion,
'yes', 1);
1417 } elseif ($action ==
'sign') {
1418 $text = $langs->trans(
'ConfirmSignContract');
1419 if (isModEnabled(
'notification')) {
1420 require_once DOL_DOCUMENT_ROOT.
'/core/class/notify.class.php';
1421 $notify =
new Notify($db);
1423 $text .= $notify->confirmMessage(
'CONTRACT_MODIFY',
$object->socid,
$object);
1428 'name' =>
'signed_status',
1429 'label' =>
'<span class="fieldrequired">'.$langs->trans(
'SignStatus').
'</span>',
1430 'values' =>
$object->getSignedStatusLocalisedArray()
1432 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'SignContract'), $text,
'confirm_sign', $formquestion, 0, 1);
1433 } elseif ($action ==
'unsign') {
1434 $text = $langs->trans(
'ConfirmUnsignContract');
1435 if (isModEnabled(
'notification')) {
1436 require_once DOL_DOCUMENT_ROOT.
'/core/class/notify.class.php';
1437 $notify =
new Notify($db);
1439 $text .= $notify->confirmMessage(
'CONTRACT_MODIFY',
$object->socid,
$object);
1441 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'UnsignContract'), $text,
'confirm_unsign',
'', 0, 1);
1446 $parameters = array(
1447 'formConfirm' => $formconfirm,
1452 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters,
$object, $action);
1453 if (empty($reshook)) {
1454 $formconfirm .= $hookmanager->resPrint;
1455 } elseif ($reshook > 0) {
1456 $formconfirm = $hookmanager->resPrint;
1464 if (
$object->status == $object::STATUS_DRAFT && $user->hasRight(
'contrat',
'creer')) {
1465 print
'<form action="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'" method="POST">';
1466 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1467 print
'<input type="hidden" name="action" value="setremise">';
1468 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
1473 $linkback =
'<a href="'.DOL_URL_ROOT.
'/contrat/list.php?restore_lastsearch_values=1'.(!empty($socid) ?
'&socid='.$socid :
'').
'">'.$langs->trans(
"BackToList").
'</a>';
1477 if (!empty($modCodeContract->code_auto)) {
1480 $morehtmlref .= $form->editfieldkey(
"",
'ref',
$object->ref,
$object, $user->hasRight(
'contrat',
'creer'),
'string',
'', 0, 3);
1481 $morehtmlref .= $form->editfieldval(
"",
'ref',
$object->ref,
$object, $user->hasRight(
'contrat',
'creer'),
'string',
'',
null,
'2');
1484 $morehtmlref .=
'<div class="refidno">';
1486 $morehtmlref .= $form->editfieldkey(
"RefCustomer",
'ref_customer',
$object->ref_customer,
$object, $user->hasRight(
'contrat',
'creer'),
'string',
'', 0, 1);
1487 $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');
1489 $morehtmlref .=
'<br>';
1490 $morehtmlref .= $form->editfieldkey(
"RefSupplier",
'ref_supplier',
$object->ref_supplier,
$object, $user->hasRight(
'contrat',
'creer'),
'string',
'', 0, 1);
1491 $morehtmlref .= $form->editfieldval(
"RefSupplier",
'ref_supplier',
$object->ref_supplier,
$object, $user->hasRight(
'contrat',
'creer'),
'string',
'',
null,
null,
'', 1,
'getFormatedSupplierRef');
1493 $morehtmlref .=
'<br>'.$object->thirdparty->getNomUrl(1);
1495 $morehtmlref .=
' <span class="otherlink valignmiddle">(<a href="'.DOL_URL_ROOT.
'/contrat/list.php?socid='.
$object->thirdparty->id.
'&search_name='.urlencode(
$object->thirdparty->name).
'">'.$langs->trans(
"OtherContracts").
'</a>)</span>';
1498 if (isModEnabled(
'project')) {
1499 $langs->load(
"projects");
1500 $morehtmlref .=
'<br>';
1501 if ($permissiontoadd) {
1502 $morehtmlref .=
img_picto($langs->trans(
"Project"),
'project',
'class="pictofixedwidth"');
1503 if ($action !=
'classify') {
1504 $morehtmlref .=
'<a class="editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?action=classify&token='.
newToken().
'&id='.
$object->id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetProject')).
'</a> ';
1506 $morehtmlref .= $form->form_project($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->socid, (
string)
$object->fk_project, ($action ==
'classify' ?
'projectid' :
'none'), 0, 0, 0, 1,
'',
'maxwidth300');
1508 if (!empty(
$object->fk_project)) {
1510 $proj->fetch(
$object->fk_project);
1511 $morehtmlref .= $proj->getNomUrl(1);
1513 $morehtmlref .=
'<span class="opacitymedium"> - '.dol_escape_htmltag($proj->title).
'</span>';
1518 $morehtmlref .=
'</div>';
1521 dol_banner_tab(
$object,
'ref', $linkback, 1,
'ref',
'none', $morehtmlref);
1524 print
'<div class="fichecenter">';
1525 print
'<div class="underbanner clearboth"></div>';
1528 print
'<table class="border tableforfield" width="100%">';
1531 print
'<tr><td class="titlefield">'.$langs->trans(
'Discount').
'</td><td colspan="3">';
1532 if (
$object->thirdparty->remise_percent) {
1533 print $langs->trans(
"CompanyHasRelativeDiscount",
$object->thirdparty->remise_percent).
'. ';
1535 print
'<span class="hideonsmartphone">'.$langs->trans(
"CompanyHasNoRelativeDiscount").
'. </span>';
1537 $absolute_discount =
$object->thirdparty->getAvailableDiscounts();
1538 if ($absolute_discount) {
1539 print $langs->trans(
"CompanyHasAbsoluteDiscount",
price($absolute_discount), $langs->trans(
"Currency".$conf->currency)).
'.';
1541 print
'<span class="hideonsmartphone">'.$langs->trans(
"CompanyHasNoAbsoluteDiscount").
'.</span>';
1547 print
'<td class="titlefield">';
1548 print $form->editfieldkey(
"Date",
'date_contrat',
$object->date_contrat,
$object, $user->hasRight(
'contrat',
'creer'));
1550 print $form->editfieldval(
"Date",
'date_contrat',
$object->date_contrat,
$object, $user->hasRight(
'contrat',
'creer'),
'datehourpicker');
1555 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_view.tpl.php';
1561 if (
$object->status == $object::STATUS_DRAFT && $user->hasRight(
'contrat',
'creer')) {
1568 $blocname =
'contacts';
1569 $title = $langs->trans(
'ContactsAddresses');
1570 include DOL_DOCUMENT_ROOT.
'/core/tpl/bloc_showhide.tpl.php';
1574 $blocname =
'notes';
1575 $title = $langs->trans(
'Notes');
1576 include DOL_DOCUMENT_ROOT.
'/core/tpl/bloc_showhide.tpl.php';
1580 $arrayothercontracts =
$object->getListOfContracts(
'others');
1588 global $inputalsopricewithtax;
1589 $inputalsopricewithtax = 1;
1591 $productstatic =
new Product($db);
1594 if (isModEnabled(
'margin') && !empty(
$object->element) && in_array(
$object->element, array(
'facture',
'propal',
'commande'))) {
1598 $parameters = array(
'nbOfLines' => &$nbofservices);
1599 $reshook = $hookmanager->executeHooks(
'printObjectLinesBlock', $parameters,
$object, $action);
1600 if (empty($reshook)) {
1604 print
'<div id="contrat-lines-container" id="contractlines" data-contractid="'.$object->id.
'" data-element="'.
$object->element.
'" >';
1605 while ($cursorline <= $nbofservices) {
1606 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.
'" >';
1607 print
'<form name="update" id="addproduct" action="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'" method="post">';
1608 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1609 print
'<input type="hidden" name="action" value="updateline">';
1610 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
1611 print
'<input type="hidden" name="elrowid" value="'.$object->lines[$cursorline - 1]->id.
'">';
1612 print
'<input type="hidden" name="fournprice" value="'.(!empty(
$object->lines[$cursorline - 1]->fk_fournprice) ?
$object->lines[$cursorline - 1]->fk_fournprice : 0).
'">';
1615 print
'<div class="div-table-responsive-no-min">';
1616 print
'<table class="notopnoleftnoright allwidth tableforservicepart1 centpercent">';
1618 $sql =
"SELECT cd.rowid, cd.statut, cd.label as label_det, cd.fk_product, cd.product_type, cd.description, cd.qty,";
1619 $sql .=
" cd.tva_tx, cd.vat_src_code, cd.remise_percent, cd.info_bits, cd.subprice, cd.multicurrency_subprice,";
1620 $sql .=
" cd.date_ouverture_prevue as date_start, cd.date_ouverture as date_start_real,";
1621 $sql .=
" cd.date_fin_validite as date_end, cd.date_cloture as date_end_real,";
1622 $sql .=
" cd.commentaire as comment, cd.fk_product_fournisseur_price as fk_fournprice, cd.buy_price_ht as pa_ht,";
1623 $sql .=
" cd.fk_unit,";
1624 $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";
1625 $sql .=
" ,cd.rang";
1626 $sql .=
" FROM ".MAIN_DB_PREFIX.
"contratdet as cd";
1627 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"product as p ON cd.fk_product = p.rowid";
1628 $sql .=
" WHERE cd.rowid = ".((int)
$object->lines[$cursorline - 1]->id);
1630 $result = $db->query($sql);
1635 $objp = $db->fetch_object($result);
1638 print
'<tr class="liste_titre'.($cursorline ?
' liste_titre_add' :
'').
'">';
1639 print
'<td>'.$langs->trans(
"ServiceNb", $cursorline).
'</td>';
1640 print
'<td width="80" class="center">'.$langs->trans(
"VAT").
'</td>';
1641 print
'<td width="80" class="right">'.$langs->trans(
"PriceUHT").
'</td>';
1645 print
'<td width="30" class="center">'.$langs->trans(
"Qty").
'</td>';
1647 print
'<td width="30" class="left">'.$langs->trans(
"Unit").
'</td>';
1649 print
'<td width="50" class="right">'.$langs->trans(
"ReductionShort").
'</td>';
1651 print
'<td width="50" class="right">'.$langs->trans(
"BuyingPrice").
'</td>';
1655 if ($nbofservices > 1 &&
$conf->browser->layout !=
'phone' && $user->hasRight(
'contrat',
'creer')) {
1656 print
'<td width="30" class="linecolmove tdlineupdown center">';
1657 if ($cursorline > 1) {
1658 print
'<a class="lineupdown reposition" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=up&token='.
newToken().
'&rowid='.$objp->rowid.
'">';
1659 echo
img_up(
'default', 0,
'imgupforline');
1662 if ($cursorline < $nbofservices) {
1663 print
'<a class="lineupdown reposition" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=down&token='.
newToken().
'&rowid='.$objp->rowid.
'">';
1664 echo
img_down(
'default', 0,
'imgdownforline');
1669 print
'<td width="30"> </td>';
1677 if ($action !=
'editline' || $idline != $objp->rowid) {
1679 if (
getDolGlobalString(
'CONTRACT_HIDE_CLOSED_SERVICES_BY_DEFAULT') && $objp->statut == ContratLigne::STATUS_CLOSED && $action !=
'showclosedlines') {
1680 $moreparam =
'style="display: none;"';
1684 $line->id = $objp->rowid;
1688 print
'<tr class="tdtop oddeven" '.$moreparam.
'>';
1691 print
'<td class="linecoldescription minwidth300imp">';
1693 print
'<div id="line_'.$line->rowid.
'"></div>';
1694 if ($objp->fk_product > 0) {
1695 $productstatic->id = $objp->fk_product;
1696 $productstatic->type = $objp->ptype;
1697 $productstatic->ref = $objp->pref;
1698 $productstatic->entity = $objp->pentity;
1699 $productstatic->label = $objp->plabel;
1700 $productstatic->status = $objp->tosell;
1701 $productstatic->status_buy = $objp->tobuy;
1702 $productstatic->status_batch = $objp->tobatch;
1704 $text = $productstatic->getNomUrl(1,
'', 32);
1705 if ($objp->plabel) {
1707 $text .= $objp->plabel;
1709 $description = $objp->description;
1712 print (!empty($line->fk_parent_line) ?
img_picto(
'',
'rightarrow') :
'') . $text;
1714 print $form->textwithpicto(
'', $description);
1717 print $form->textwithtooltip($text, $description, 3, 0,
'',
'', 0, (!empty($line->fk_parent_line) ?
img_picto(
'',
'rightarrow') :
''));
1721 if ($line->fk_product > 0 &&
getDolGlobalInt(
'PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE')) {
1722 print (!empty($line->description) && $line->description != $line->plabel) ? (($line->date_start || $line->date_end) ?
'' :
'<br>').
'<br>'.
dol_htmlentitiesbr($line->
description) :
'';
1730 print
'<td class="center">';
1731 print
vatrate($objp->tva_tx.($objp->vat_src_code ? (
' ('.$objp->vat_src_code.
')') :
''), true, $objp->info_bits);
1734 print
'<td class="right">'.($objp->subprice !=
'' ?
price($objp->subprice) :
'').
"</td>\n";
1740 print
'<td class="center">'.$objp->qty.
'</td>';
1743 print
'<td class="left">'.$object->lines[$cursorline - 1]->getLabelOfUnit(
'long', $langs).
'</td>';
1746 if ($objp->remise_percent > 0) {
1747 print
'<td class="right">'.$objp->remise_percent.
"%</td>\n";
1749 print
'<td> </td>';
1754 print
'<td class="right nowraponall">'.price($objp->pa_ht).
'</td>';
1758 print
'<td class="nowraponall right">';
1759 if ($user->hasRight(
'contrat',
'creer') && is_array($arrayothercontracts) && count($arrayothercontracts) && (
$object->status >= 0)) {
1760 print
'<!-- link to move service line into another contract -->';
1761 print
'<a class="reposition marginrightonly" style="padding-left: 5px;" href="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'&action=move&token='.
newToken().
'&elrowid='.$objp->rowid.
'">';
1762 print
img_picto($langs->trans(
"MoveToAnotherContract"),
'uparrow');
1765 if ($user->hasRight(
'contrat',
'creer') && (
$object->statut >= 0)) {
1766 print
'<a class="reposition marginrightonly editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'&action=editline&token='.
newToken().
'&elrowid='.$objp->rowid.
'">';
1770 if ($user->hasRight(
'contrat',
'creer') && (
$object->statut >= 0)) {
1771 print
'<a class="reposition marginrightonly" href="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'&action=deleteline&token='.
newToken().
'&elrowid='.$objp->rowid.
'">';
1788 if ($objp->subprice >= 0) {
1789 print
'<tr class="oddeven" '.$moreparam.
'>';
1790 print
'<td colspan="'.$colspan.
'">';
1793 print $langs->trans(
"DateStartPlanned").
': ';
1794 if ($objp->date_start) {
1797 if ($objp->statut == 0 && $db->jdate($objp->date_start) < ($now -
$conf->contrat->services->inactifs->warning_delay)) {
1798 $warning_delay =
$conf->contrat->services->inactifs->warning_delay / 3600 / 24;
1799 $textlate = $langs->trans(
"Late").
' = '.$langs->trans(
"DateReference").
' > '.$langs->trans(
"DateToday").
' '.(ceil($warning_delay) >= 0 ?
'+' :
'').ceil($warning_delay).
' '.$langs->trans(
"days");
1800 print
" ".img_warning($textlate);
1803 print $langs->trans(
"Unknown");
1805 print
' - ';
1806 print $langs->trans(
"DateEndPlanned").
': ';
1807 if ($objp->date_end) {
1809 if ($objp->statut == 4 && $db->jdate($objp->date_end) < ($now -
$conf->contrat->services->expires->warning_delay)) {
1810 $warning_delay =
$conf->contrat->services->expires->warning_delay / 3600 / 24;
1811 $textlate = $langs->trans(
"Late").
' = '.$langs->trans(
"DateReference").
' > '.$langs->trans(
"DateToday").
' '.(ceil($warning_delay) >= 0 ?
'+' :
'').ceil($warning_delay).
' '.$langs->trans(
"days");
1812 print
" ".img_warning($textlate);
1815 print $langs->trans(
"Unknown");
1823 if (is_array($extralabelslines) && count($extralabelslines) > 0) {
1825 $line->id = $objp->rowid;
1826 $line->fetch_optionals();
1827 print $line->showOptionals($extrafields,
'view', array(
'class' =>
'oddeven',
'style' => $moreparam,
'colspan' => $colspan,
'tdclass' =>
'notitlefieldcreate'),
'',
'',
'1');
1832 print
'<tr class="oddeven">';
1834 $currentLineProductId = GETPOSTISSET(
'idprod') ?
GETPOST(
'idprod') : (!empty(
$object->lines[$cursorline - 1]->fk_product) ?
$object->lines[$cursorline - 1]->fk_product : 0);
1835 if ($objp->fk_product > 0) {
1836 $canchangeproduct = 1;
1839 if (empty($canchangeproduct)) {
1840 $productstatic->id = $objp->fk_product;
1841 $productstatic->type = $objp->ptype;
1842 $productstatic->ref = $objp->pref;
1843 $productstatic->entity = $objp->pentity;
1844 print $productstatic->getNomUrl(1,
'', 32);
1845 print $objp->label ?
' - '.dol_trunc($objp->label, 32) :
'';
1846 print
'<input type="hidden" name="idprod" value="'.$currentLineProductId.
'">';
1848 $senderissupplier = 0;
1849 if (empty($senderissupplier)) {
1855 print $form->select_produits($currentLineProductId,
'idprod', $filtertype, 0, 0, 1, 2,
'', 0, array(), 0, 1, 0,
'minwidth250onall maxwidth500 widthcentpercentminusx');
1857 $form->select_produits_fournisseurs($currentLineProductId,
'idprod');
1862 print $objp->label ? $objp->label.
'<br>' :
'';
1863 print
'<input type="hidden" name="idprod" value="'.$currentLineProductId.
'">';
1867 require_once DOL_DOCUMENT_ROOT.
'/core/class/doleditor.class.php';
1872 $doleditor =
new DolEditor(
'product_desc', (GETPOSTISSET(
'product_desc') ?
GETPOST(
'product_desc') : $objp->
description),
'', 92,
'dolibarr_details',
'', false, true,
getDolGlobalInt(
'FCKEDITOR_ENABLE_DETAILS'), $nbrows,
'90%');
1873 $doleditor->Create();
1878 print
'<td class="right">';
1879 print $form->load_tva(
"eltva_tx", $objp->tva_tx.($objp->vat_src_code ? (
' ('.$objp->vat_src_code.
')') :
''), $mysoc,
$object->thirdparty, $currentLineProductId, $objp->info_bits, $objp->product_type, false, 1);
1883 print
'<td class="right"><input class="width50" type="text" name="elprice" value="'.(GETPOSTISSET(
'elprice') ?
GETPOST(
'elprice') :
price($objp->subprice)).
'"></td>';
1891 print
'<td class="center"><input size="2" type="text" name="elqty" value="'.(GETPOSTISSET(
'elqty') ?
GETPOST(
'elqty') : $objp->qty).
'"></td>';
1895 print
'<td class="left">';
1896 print $form->selectUnits((GETPOSTISSET(
'unit') ?
GETPOSTINT(
'unit') : $objp->fk_unit),
"unit");
1901 print
'<td class="nowraponall right"><input size="1" type="text" name="elremise_percent" value="'.(GETPOSTISSET(
'elremise_percent') ?
GETPOST(
'elremise_percent') : $objp->remise_percent).
'">%</td>';
1903 if (!empty($usemargins)) {
1904 print
'<td class="right">';
1905 if ($objp->fk_product) {
1906 print
'<select id="fournprice" name="fournprice"></select>';
1908 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>';
1910 print
'<td class="center">';
1911 print
'<input type="submit" class="button margintoponly marginbottomonly" name="save" value="'.$langs->trans(
"Modify").
'">';
1912 print
'<br><input type="submit" class="button margintoponly marginbottomonly button-cancel" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
1925 print
'<tr class="oddeven">';
1926 print
'<td colspan="'.$colspan.
'">';
1927 print $langs->trans(
"DateStartPlanned").
' ';
1928 print $form->selectDate($db->jdate($objp->date_start),
"date_start_update", $usehm, $usehm, ($db->jdate($objp->date_start) > 0 ? 0 : 1),
"update");
1929 print
' '.$langs->trans(
"DateEndPlanned").
' ';
1930 print $form->selectDate($db->jdate($objp->date_end),
"date_end_update", $usehm, $usehm, ($db->jdate($objp->date_end) > 0 ? 0 : 1),
"update");
1934 if (is_array($extralabelslines) && count($extralabelslines) > 0) {
1936 $line->id = $objp->rowid;
1937 $line->fetch_optionals();
1939 print $line->showOptionals($extrafields,
'edit', array(
'style' =>
'class="oddeven"',
'colspan' => $colspan,
'tdclass' =>
'notitlefieldcreate'),
'',
'',
'1');
1950 if (
getDolGlobalString(
'CONTRACT_HIDE_CLOSED_SERVICES_BY_DEFAULT') &&
$object->lines[$cursorline - 1]->statut == ContratLigne::STATUS_CLOSED && $action !=
'showclosedlines') {
1951 $moreparam =
'style="display: none;"';
1962 print
'<tr class="oddeven" '.$moreparam.
'>';
1963 print
'<td class="tdhrthin" colspan="'.$colspan.
'"><hr class="opacitymedium tdhrthin"></td>';
1976 if ($action ==
'deleteline' && !$cancel && $user->hasRight(
'contrat',
'creer') &&
$object->lines[$cursorline - 1]->id == $idline) {
1977 print $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".((
int)
$object->id).
"&lineid=".((
int) $idline), $langs->trans(
"DeleteContractLine"), $langs->trans(
"ConfirmDeleteContractLine"),
"confirm_deleteline",
'', 0, 1);
1978 if ($ret ==
'html') {
1979 print
'<table class="notopnoleftnoright centpercent"><tr class="oddeven" height="6"><td></td></tr></table>';
1986 if ($action ==
'move' && !$cancel && $user->hasRight(
'contrat',
'creer') &&
$object->lines[$cursorline - 1]->id == $idline) {
1987 $arraycontractid = array();
1988 foreach ($arrayothercontracts as $contractcursor) {
1989 $arraycontractid[$contractcursor->id] = $contractcursor->ref;
1993 $formquestion = array(
1994 'text' => $langs->trans(
"ConfirmMoveToAnotherContractQuestion"),
1995 0 => array(
'type' =>
'select',
'name' =>
'newcid',
'values' => $arraycontractid));
1997 print $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".((
int)
$object->id).
"&lineid=".((
int) $idline), $langs->trans(
"MoveToAnotherContract"), $langs->trans(
"ConfirmMoveToAnotherContract"),
"confirm_move", $formquestion,
'yes');
1998 print
'<table class="notopnoleftnoright centpercent"><tr class="oddeven" height="6"><td></td></tr></table>';
2003 print
'<table class="notopnoleftnoright tableforservicepart2'.($cursorline < $nbofservices ?
' boxtablenobottom' :
'').
' centpercent">';
2005 print
'<tr class="oddeven" '.$moreparam.
'>';
2006 print
'<td><span class="valignmiddle hideonsmartphone">'.$langs->trans(
"ServiceStatus").
':</span> '.
$object->lines[$cursorline - 1]->getLibStatut(4).
'</td>';
2007 print
'<td width="30" class="right">';
2008 if ($user->socid == 0) {
2009 if (
$object->status > 0 && $action !=
'activateline' && $action !=
'unactivateline' && is_object($objp)) {
2010 $tmpaction =
'activateline';
2011 $tmpactionpicto =
'play';
2012 $tmpactiontext = $langs->trans(
"Activate");
2013 if ($objp->statut == 4) {
2014 $tmpaction =
'unactivateline';
2015 $tmpactionpicto =
'playstop';
2016 $tmpactiontext = $langs->trans(
"Disable");
2018 if (($tmpaction ==
'activateline' && $user->hasRight(
'contrat',
'activer')) || ($tmpaction ==
'unactivateline' && $user->hasRight(
'contrat',
'desactiver'))) {
2019 print
'<a class="reposition" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&ligne='.
$object->lines[$cursorline - 1]->id.
'&action='.$tmpaction.
'&token='.
newToken().
'">';
2020 print
img_picto($tmpactiontext, $tmpactionpicto);
2028 print
'<tr class="oddeven" '.$moreparam.
'>';
2032 if (!$objp->date_start_real) {
2033 print $langs->trans(
"DateStartReal").
': ';
2034 if ($objp->date_start_real) {
2037 print $langs->trans(
"ContractStatusNotRunning");
2041 if ($objp->date_start_real && !$objp->date_end_real) {
2042 print $langs->trans(
"DateStartReal").
': ';
2046 if ($objp->date_start_real && $objp->date_end_real) {
2047 print $langs->trans(
"DateStartReal").
': ';
2049 print
' - ';
2050 print $langs->trans(
"DateEndReal").
': ';
2053 if (!empty($objp->comment)) {
2054 print
" - ".$objp->comment;
2058 print
'<td class="center"> </td>';
2065 if ($permissiontoactivate && $action ==
'activateline' &&
$object->lines[$cursorline - 1]->id ==
GETPOSTINT(
'ligne') && is_object($objp)) {
2066 print
'<form name="active" action="'.$_SERVER[
"PHP_SELF"].
'" method="POST">';
2067 print
'<input type="hidden" name="token" value="'.newToken().
'">';
2068 print
'<input type="hidden" name="action" value="confirm_active">';
2069 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
2070 print
'<input type="hidden" name="id" value="'.$object->id.
'">';
2071 print
'<input type="hidden" name="ligne" value="'.GETPOSTINT(
'ligne').
'">';
2072 print
'<input type="hidden" name="confirm" value="yes">';
2074 print
'<table class="noborder tableforservicepart2'.($cursorline < $nbofservices ?
' boxtablenobottom' :
'').
' centpercent">';
2077 $dateactstart = $objp->date_start;
2080 } elseif (!$dateactstart) {
2081 $dateactstart = time();
2084 $dateactend = $objp->date_end;
2087 } elseif (!$dateactend) {
2088 if ($objp->fk_product > 0) {
2090 $product->fetch($objp->fk_product);
2091 if (!empty($product->duration_value) && !empty($product->duration_unit)) {
2092 $dateactend =
dol_time_plus_duree(time(), $product->duration_value, $product->duration_unit);
2097 print
'<tr class="oddeven">';
2098 print
'<td class="nohover">'.$langs->trans(
"DateServiceActivate").
'</td><td class="nohover">';
2099 print $form->selectDate($dateactstart,
'start', $usehm, $usehm, 0,
"active", 1, 0);
2101 print
'<td class="nohover">'.$langs->trans(
"DateEndPlanned").
'</td><td class="nohover">';
2102 print $form->selectDate($dateactend,
"end", $usehm, $usehm, 0,
"active", 1, 0);
2104 print
'<td class="center nohover">';
2109 print
'<tr class="oddeven">';
2110 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>';
2111 print
'<td class="nohover right">';
2112 print
'<input type="submit" class="button" name="activate" value="'.$langs->trans(
"Activate").
'"> ';
2113 print
'<input type="submit" class="button button-cancel" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
2123 if ($permissiontodisable && $action ==
'unactivateline' &&
$object->lines[$cursorline - 1]->id ==
GETPOSTINT(
'ligne') && is_object($objp)) {
2124 print
'<!-- Form to disabled a line -->'.
"\n";
2125 print
'<form name="confirm_closeline" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&ligne='.
$object->lines[$cursorline - 1]->id.
'" method="post">';
2126 print
'<input type="hidden" name="token" value="'.newToken().
'">';
2127 print
'<input type="hidden" name="confirm" value="yes">';
2128 print
'<input type="hidden" name="action" value="confirm_closeline">';
2129 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
2131 print
'<table class="noborder tableforservicepart2'.($cursorline < $nbofservices ?
' boxtablenobottom' :
'').
' centpercent">';
2134 $dateactstart = $objp->date_start_real;
2137 } elseif (!$dateactstart) {
2138 $dateactstart = time();
2141 $dateactend = $objp->date_end_real;
2144 } elseif (!$dateactend) {
2145 if ($objp->fk_product > 0) {
2147 $product->fetch($objp->fk_product);
2148 $dateactend =
dol_time_plus_duree(time(), $product->duration_value, $product->duration_unit);
2152 if ($dateactend > $now) {
2156 print
'<tr class="oddeven"><td colspan="2" class="nohover">';
2157 if ($objp->statut >= 4) {
2158 if ($objp->statut == 4) {
2159 print $langs->trans(
"DateEndReal").
' ';
2160 print $form->selectDate($dateactend,
"end", $usehm, $usehm, ($objp->date_end_real > 0 ? 0 : 1),
"closeline", 1, 1);
2164 print
'<td class="center nohover">';
2167 print
'<tr class="oddeven">';
2168 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>';
2169 print
'<td class="nohover right">';
2170 print
'<input type="submit" class="button" name="close" value="'.$langs->trans(
"Disable").
'"> ';
2171 print
'<input type="submit" class="button button-cancel" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
2186 if ($user->hasRight(
'contrat',
'creer') && (
$object->status == 0)) {
2190 print
' <form name="addproduct" id="addproduct" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.(($action !=
'editline') ?
'' :
'#line_'.
GETPOSTINT(
'lineid')).
'" method="POST">
2191 <input type="hidden" name="token" value="'.
newToken().
'">
2192 <input type="hidden" name="action" value="'.(($action !=
'editline') ?
'addline' :
'updateline').
'">
2193 <input type="hidden" name="mode" value="">
2194 <input type="hidden" name="id" value="'.
$object->id.
'">
2195 <input type="hidden" name="page_y" value="">
2196 <input type="hidden" name="backtopage" value="'.$backtopage.
'">
2199 print
'<div class="div-table-responsive-no-min">';
2200 print
'<table id="tablelines" class="noborder noshadow" width="100%">';
2203 if ($action !=
'editline') {
2204 $forcetoshowtitlelines = 1;
2205 if (empty(
$object->multicurrency_code)) {
2211 $parameters = array();
2212 $reshook = $hookmanager->executeHooks(
'formAddObjectLine', $parameters,
$object, $action);
2216 if (empty($reshook)) {
2217 $object->formAddObjectLine(1, $mysoc, $soc);
2229 if (
GETPOST(
'modelselected')) {
2230 $action =
'presend';
2236 if ($user->socid == 0 && $action !=
'presend' && $action !=
'editline') {
2237 print
'<div class="tabsAction">';
2239 $parameters = array();
2240 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters,
$object, $action);
2242 if (empty($reshook)) {
2246 'class' =>
'classfortooltip'
2251 if (empty($user->socid)) {
2252 if (
$object->status == $object::STATUS_VALIDATED) {
2253 if ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') || $user->hasRight(
'contrat',
'creer'))) {
2254 print
dolGetButtonAction(
'', $langs->trans(
'SendMail'),
'default', $_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=presend&token='.
newToken().
'&mode=init#formmailbeforetitle',
'',
true, $params);
2256 print
dolGetButtonAction(
'', $langs->trans(
'SendMail'),
'default',
'#',
'',
false, $params);
2261 if (
$object->status == $object::STATUS_DRAFT && $nbofservices) {
2262 if ($user->hasRight(
'contrat',
'creer')) {
2263 unset($params[
'attr'][
'title']);
2264 print
dolGetButtonAction($langs->trans(
'Validate'),
'',
'default', $_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=valid&token='.
newToken(),
'',
true, $params);
2266 $params[
'attr'][
'title'] = $langs->trans(
"NotEnoughPermissions");
2267 print
dolGetButtonAction($langs->trans(
'Validate'),
'',
'default',
'#',
'',
false, $params);
2270 if (
$object->status == $object::STATUS_VALIDATED) {
2271 if ($user->hasRight(
'contrat',
'creer')) {
2272 unset($params[
'attr'][
'title']);
2273 print
dolGetButtonAction($langs->trans(
'Modify'),
'',
'default', $_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=reopen&token='.
newToken(),
'',
true, $params);
2275 $params[
'attr'][
'title'] = $langs->trans(
"NotEnoughPermissions");
2276 print
dolGetButtonAction($langs->trans(
'Modify'),
'',
'default',
'#',
'',
false, $params);
2281 $arrayofcreatebutton = array();
2282 if (isModEnabled(
'order') &&
$object->status > 0 &&
$object->nbofservicesclosed < $nbofservices) {
2283 $arrayofcreatebutton[] = array(
2284 'url' =>
'/commande/card.php?action=create&token='.
newToken().
'&origin='.
$object->element.
'&originid='.
$object->id.
'&socid='.
$object->thirdparty->id,
2285 'label' => $langs->trans(
'AddOrder'),
2287 'perm' => $user->hasRight(
'commande',
'creer') ?
true : false,
2291 if (isModEnabled(
'invoice') &&
$object->status > 0 && $soc->client > 0) {
2292 $arrayofcreatebutton[] = array(
2293 'url' =>
'/compta/facture/card.php?action=create&origin='.
$object->element.
'&originid='.
$object->id.
'&socid='.
$object->thirdparty->id,
2294 'label' => $langs->trans(
'CreateBill'),
2296 'perm' => $user->hasRight(
'facture',
'creer') ?
true : false,
2300 if (isModEnabled(
'supplier_invoice') &&
$object->status > 0 && $soc->fournisseur == 1) {
2301 $langs->load(
"suppliers");
2302 $arrayofcreatebutton[] = array(
2303 'url' =>
'/fourn/facture/card.php?action=create&origin='.
$object->element.
'&originid='.
$object->id.
'&socid='.
$object->thirdparty->id,
2304 'label' => $langs->trans(
'AddSupplierInvoice'),
2306 'perm' => $user->hasRight(
'fournisseur',
'facture',
'creer') ?
true : false,
2310 if (count($arrayofcreatebutton)) {
2311 unset($params[
'attr'][
'title']);
2312 print
dolGetButtonAction(
'', $langs->trans(
"Create"),
'default', $arrayofcreatebutton,
'',
true, $params);
2315 $arrayforbutaction = array();
2316 $arrayforbutaction[] = array(
2317 'url' =>
'/contrat/card.php?id='.
$object->id.
'&action=activate&token='.
newToken(),
2318 'label' => $langs->trans(
'ActivateAllContracts'),
2320 'perm' => (
$object->nbofservicesclosed > 0 ||
$object->nbofserviceswait > 0) ? $permissiontoactivate : -1,
2323 $arrayforbutaction[] = array(
2324 'url' =>
'/contrat/card.php?id='.
$object->id.
'&action=close&token='.
newToken(),
2325 'label' => $langs->trans(
'CloseAllContracts'),
2327 'perm' => (
$object->nbofservicesclosed < $nbofservices) ? $permissiontodisable : -1,
2331 if (count($arrayforbutaction)) {
2332 unset($params[
'attr'][
'title']);
2333 print
dolGetButtonAction(
'', $langs->trans(
"Services"),
'default', $arrayforbutaction,
'',
true, $params);
2337 if ($action ==
'showclosedlines') {
2338 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>';
2340 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>';
2345 if (
getDolGlobalString(
'CONTRACT_SHOW_SIGNATURE_STATUS_WITH_SERVICE_STATUS') &&
$object->status > Contrat::STATUS_DRAFT) {
2346 if (
$object->signed_status != Contrat::$SIGNED_STATUSES[
'STATUS_SIGNED_ALL']) {
2347 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>';
2349 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>';
2354 if ($user->hasRight(
'contrat',
'creer')) {
2355 unset($params[
'attr'][
'title']);
2360 unset($params[
'attr'][
'title']);
2361 print
dolGetButtonAction($langs->trans(
'Delete'),
'',
'delete', $_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=delete&token='.
newToken(),
'', $permissiontodelete, $params);
2367 if ($action !=
'presend') {
2368 print
'<div class="fichecenter"><div class="fichehalfleft">';
2375 $urlsource = $_SERVER[
"PHP_SELF"].
"?id=".
$object->id;
2376 $genallowed = $user->hasRight(
'contrat',
'lire');
2377 $delallowed = $user->hasRight(
'contrat',
'creer');
2380 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);
2384 $tmparray = $form->showLinkToObjectBlock(
$object, array(), array(
'contrat'), 1);
2385 $linktoelem = $tmparray[
'linktoelem'];
2386 $htmltoenteralink = $tmparray[
'htmltoenteralink'];
2387 print $htmltoenteralink;
2389 $somethingshown = $form->showLinkedObjectBlock(
$object, $linktoelem);
2393 print
'<br><!-- Link to sign -->';
2394 require_once DOL_DOCUMENT_ROOT.
'/core/lib/signature.lib.php';
2396 print showOnlineSignatureUrl(
'contract',
$object->ref,
$object).
'<br>';
2399 print
'</div><div class="fichehalfright">';
2403 $morehtmlcenter =
'<div class="nowraponall">';
2404 $morehtmlcenter .=
dolGetButtonTitle($langs->trans(
'FullConversation'),
'',
'fa fa-comments imgforviewmode', DOL_URL_ROOT.
'/contrat/messaging.php?id='.
$object->id);
2405 $morehtmlcenter .=
dolGetButtonTitle($langs->trans(
'SeeAll'),
'',
'fa fa-bars imgforviewmode', DOL_URL_ROOT.
'/contrat/agenda.php?id='.
$object->id);
2406 $morehtmlcenter .=
'</div>';
2410 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
2412 $somethingshown = $formactions->showactions(
$object,
'contract', $socid, 1,
'listactions', $MAXEVENT,
'', $morehtmlcenter);
2414 print
'</div></div>';
2418 $modelmail =
'contract';
2419 $defaulttopic =
'SendContractRef';
2420 $diroutput =
$conf->contrat->multidir_output[
$object->entity];
2421 $trackid =
'con'.$object->id;
2423 include DOL_DOCUMENT_ROOT.
'/core/tpl/card_presend.tpl.php';
2434if (isModEnabled(
'margin') && $action ==
'editline') {
2435 print
"\n".
'<script type="text/javascript">'.
"\n";
2437 $(document).ready(
function() {
2438 var idprod = $(
"input[name='idprod']").val();
2439 var fournprice = $(
"input[name='fournprice']").val();
2440 var token =
'<?php echo currentToken(); ?>';
2442 $.post(
'<?php echo DOL_URL_ROOT; ?>/fourn/ajax/getSupplierPrices.php', {
2446 if (data.length > 0) {
2449 $(data).each(
function() {
2450 options +=
'<option value="'+this.
id+
'" price="'+this.
price+
'"';
2451 if (fournprice > 0) {
2452 if (this.
id == fournprice) {
2453 options +=
' selected';
2454 $(
"#buying_price").val(this.price);
2458 options +=
'>'+this.label+
'</option>';
2460 options +=
'<option value=null'+(trouve?
'':
' selected')+
'><?php echo $langs->trans("InputPrice"); ?></option>';
2461 $(
"#fournprice").html(options);
2463 $(
"#buying_price").hide();
2464 $(
"#fournprice").show();
2467 $(
"#buying_price").show();
2469 $(
"#fournprice").change(
function() {
2470 var selval = $(
this).find(
'option:selected').attr(
"price");
2472 $(
"#buying_price").val(selval).hide();
2474 $(
'#buying_price').show();
2478 $(
"#fournprice").hide();
2479 $(
'#buying_price').show();
2485 $(
"#fournprice").hide();
2486 $(
'#buying_price').show();
2490 print
"\n".
'<script type="text/javascript">'.
"\n";
$id
Support class for third parties, contacts, members, users or resources.
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
Class to manage lines of contracts.
Class to manage a WYSIWYG editor.
Class to manage the table of subscription to notifications.
File of class to manage predefined price products or services by customer.
Class to manage products or services.
Class to manage projects.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage translations.
Class to manage Dolibarr users.
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.
recordNotFound($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Displays an error page when a record is not found.
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed information (by default a local PHP server timestamp) Rep...
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_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)
img_delete($titlealt='default', $other='class="pictodelete"', $morecss='')
Show delete logo.
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, $morecssdiv='')
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_eval($s, $returnvalue=1, $hideerrors=1, $onlysimplestring='1')
Replace eval function to add more security.
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $allowothertags=array())
Show a picto called object_picto (generic function)
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_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...
dol_sanitizeFileName($str, $newstr='_', $unaccent=1, $includequotes=0)
Clean a string to use it as a file name.
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.