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');
136if (!(
$object->id > 0) && ($action ==
'view' || $action ==
'')) {
145$parameters = array(
'socid' => $socid);
146$reshook = $hookmanager->executeHooks(
'doActions', $parameters,
$object, $action);
150if (empty($reshook)) {
151 $backurlforlist = DOL_URL_ROOT.
'/contrat/list.php';
153 if (empty($backtopage) || ($cancel && empty($id))) {
154 if (empty($backtopage) || ($cancel && strpos($backtopage,
'__ID__'))) {
155 if (empty($id) && (($action !=
'add' && $action !=
'create') || $cancel)) {
156 $backtopage = $backurlforlist;
158 $backtopage = DOL_URL_ROOT.
'/contrat/card.php?id='.((!empty($id) &&
$id > 0) ? $id :
'__ID__');
164 if (!empty($backtopageforcancel)) {
165 header(
"Location: ".$backtopageforcancel);
167 } elseif (!empty($backtopage)) {
168 header(
"Location: ".$backtopage);
174 include DOL_DOCUMENT_ROOT.
'/core/actions_setnotes.inc.php';
176 include DOL_DOCUMENT_ROOT.
'/core/actions_dellink.inc.php';
178 include DOL_DOCUMENT_ROOT.
'/core/actions_lineupdown.inc.php';
180 if ($action ==
'confirm_active' && $confirm ==
'yes' && $permissiontoactivate) {
193 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
198 } elseif ($action ==
'confirm_sign' && $confirm ==
'yes' && $user->hasRight(
'contract',
'creer')) {
199 $result =
$object->setSignedStatus($user,
GETPOSTINT(
'signed_status'), 0,
'CONTRACT_MODIFY');
201 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id);
206 } elseif ($action ==
'confirm_unsign' && $confirm ==
'yes' && $user->hasRight(
'contract',
'creer')) {
207 $result =
$object->setSignedStatus($user, Contrat::$SIGNED_STATUSES[
'STATUS_NO_SIGNATURE'], 0,
'CONTRACT_MODIFY');
209 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id);
214 } elseif ($action ==
'confirm_closeline' && $confirm ==
'yes' && $permissiontoactivate) {
221 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"DateEnd")),
null,
'errors');
226 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
234 if (
GETPOST(
'mode') ==
'predefined') {
246 $date_start_update =
'';
247 $date_end_update =
'';
248 $date_start_real_update =
'';
249 $date_end_real_update =
'';
250 if (
GETPOST(
'date_start_updatemonth') &&
GETPOST(
'date_start_updateday') &&
GETPOST(
'date_start_updateyear')) {
253 if (
GETPOST(
'date_end_updatemonth') &&
GETPOST(
'date_end_updateday') &&
GETPOST(
'date_end_updateyear')) {
256 if (
GETPOST(
'date_start_real_updatemonth') &&
GETPOST(
'date_start_real_updateday') &&
GETPOST(
'date_start_real_updateyear')) {
259 if (
GETPOST(
'date_end_real_updatemonth') &&
GETPOST(
'date_end_real_updateday') &&
GETPOST(
'date_end_real_updateyear')) {
267 if ($action ==
'add' && $user->hasRight(
'contrat',
'creer')) {
269 if (empty($datecontrat)) {
271 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Date")),
null,
'errors');
276 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"ThirdParty")),
null,
'errors');
282 $ret = $extrafields->setOptionalsFromPost(
null,
$object);
290 $object->date_contrat = $datecontrat;
304 if (!empty($origin) && !empty($originid)) {
306 $element = $subelement = $origin;
307 if (preg_match(
'/^([^_]+)_([^_]+)/i', $origin, $regs)) {
309 $subelement = $regs[2];
313 if ($element ==
'order') {
314 $element = $subelement =
'commande';
316 if ($element ==
'propal') {
317 $element =
'comm/propal';
318 $subelement =
'propal';
320 if ($element ==
'invoice' || $element ==
'facture') {
321 $element =
'compta/facture';
322 $subelement =
'facture';
326 $object->origin_id = $originid;
331 $object->linked_objects = array_merge(
$object->linked_objects,
GETPOST(
'other_linked_objects',
'array:int'));
338 $classname = ucfirst($subelement);
339 $srcobject =
new $classname($db);
340 '@phan-var-force Commande|Propal|Facture $srcobject';
343 $result = $srcobject->fetch(
$object->origin_id);
345 $srcobject->fetch_thirdparty();
346 $lines = $srcobject->lines;
347 if (empty($lines) && method_exists($srcobject,
'fetch_lines')) {
348 $srcobject->fetch_lines();
349 $lines = $srcobject->lines;
353 $num = count($lines);
355 for ($i = 0; $i < $num; $i++) {
356 $product_type = ($lines[$i]->product_type ? $lines[$i]->product_type : 0);
358 if ($product_type == 1 || (
getDolGlobalString(
'CONTRACT_SUPPORT_PRODUCTS') && in_array($product_type, array(0, 1)))) {
360 if ($lines[$i]->fk_product > 0) {
361 $product_static =
new Product($db);
366 $prod->id = $lines[$i]->fk_product;
367 $prod->getMultiLangs();
369 $outputlangs = $langs;
371 if (empty($newlang) &&
GETPOST(
'lang_id',
'aZ09')) {
372 $newlang =
GETPOST(
'lang_id',
'aZ09');
374 if (empty($newlang)) {
375 $newlang = $srcobject->thirdparty->default_lang;
377 if (!empty($newlang)) {
379 $outputlangs->setDefaultLang($newlang);
382 $label = (!empty($prod->multilangs[$outputlangs->defaultlang][
"libelle"])) ? $prod->multilangs[$outputlangs->defaultlang][
"libelle"] : $lines[$i]->product_label;
384 $label = $lines[$i]->product_label;
386 $desc = ($lines[$i]->desc && $lines[$i]->desc != $lines[$i]->label) ?
dol_htmlentitiesbr($lines[$i]->desc) :
'';
392 $array_options = array();
394 if (method_exists($lines[$i],
'fetch_optionals')) {
395 $lines[$i]->fetch_optionals();
396 $array_options = $lines[$i]->array_options;
399 $txtva = $lines[$i]->vat_src_code ? $lines[$i]->tva_tx.
' ('.$lines[$i]->vat_src_code.
')' : $lines[$i]->tva_tx;
407 $lines[$i]->subprice,
412 $lines[$i]->fk_product,
413 $lines[$i]->remise_percent,
414 $lines[$i]->date_start,
415 $lines[$i]->date_end,
418 $lines[$i]->info_bits,
419 $lines[$i]->fk_fournprice,
438 $parameters = array(
'objFrom' => $srcobject);
439 $reshook = $hookmanager->executeHooks(
'createFrom', $parameters,
$object, $action);
453 $result =
$object->create($user);
455 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
463 } elseif ($action ==
'classin' && $user->hasRight(
'contrat',
'creer')) {
465 } elseif ($action ==
'addline' && $user->hasRight(
'contrat',
'creer')) {
469 $product_desc = (GETPOSTISSET(
'dp_desc') ?
GETPOST(
'dp_desc',
'restricthtml') :
'');
472 $price_ht_devise =
'';
474 $price_ttc_devise =
'';
476 $rang = count(
$object->lines) + 1;
478 if (
GETPOST(
'price_ht') !==
'') {
481 if (
GETPOST(
'multicurrency_price_ht') !==
'') {
484 if (
GETPOST(
'price_ttc') !==
'') {
487 if (
GETPOST(
'multicurrency_price_ttc') !==
'') {
491 if (
GETPOST(
'prod_entry_mode',
'alpha') ==
'free') {
497 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"ProductOrService")),
null,
'errors');
502 $tva_tx =
GETPOST(
'tva_tx',
'alpha');
505 $remise_percent = (GETPOSTISSET(
'remise_percent'.$predef) ?
price2num(
GETPOST(
'remise_percent'.$predef),
'', 2) : 0);
506 if (empty($remise_percent)) {
511 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Qty")),
null,
'errors');
514 if (
GETPOST(
'prod_entry_mode',
'alpha') ==
'free' && (empty($idprod) || $idprod < 0) && empty($product_desc)) {
515 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Description")),
null,
'errors');
521 if (!empty($date_start) && !empty($date_end) && $date_start > $date_end) {
522 setEventMessages($langs->trans(
"Error").
': '.$langs->trans(
"DateStartPlanned").
' > '.$langs->trans(
"DateEndPlanned"),
null,
'errors');
527 $extralabelsline = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
528 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line, $predef);
530 if (is_array($extralabelsline)) {
532 foreach ($extralabelsline as $key => $value) {
533 unset($_POST[
"options_".$key]);
542 $price_base_type =
'';
548 $prod->fetch($idprod);
557 $price_min = $prod->price_min;
558 $price_min_ttc = $prod->price_min_ttc;
562 $price_min = $prod->multiprices_min[
$object->thirdparty->price_level];
563 $price_min_ttc = $prod->multiprices_min_ttc[
$object->thirdparty->price_level];
566 require_once DOL_DOCUMENT_ROOT.
'/product/class/productcustomerprice.class.php';
570 $filter = array(
't.fk_product' => $prod->id,
't.fk_soc' =>
$object->thirdparty->id);
572 $result = $prodcustprice->fetchAll(
'',
'', 0, 0, $filter);
574 if (count($prodcustprice->lines) > 0) {
575 $price_min =
price($prodcustprice->lines[0]->price_min);
576 $price_min_ttc =
price($prodcustprice->lines[0]->price_min_ttc);
589 $tmpvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', $tva_tx));
590 $tmpprodvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', (
string) $prod->tva_tx));
593 if (!empty($price_ht) || $price_ht ===
'0') {
595 $pu_ttc =
price2num((
float) $pu_ht * (1 + ((
float) $tmpvat / 100)),
'MU');
596 $price_base_type =
'HT';
597 } elseif (!empty($price_ttc) || $price_ttc ===
'0') {
599 $pu_ht =
price2num((
float) $pu_ttc / (1 + ((
float) $tmpvat / 100)),
'MU');
600 $price_base_type =
'TTC';
603 $desc = $prod->description;
611 $desc = $product_desc;
616 $fk_unit = $prod->fk_unit;
620 $tva_npr = (preg_match(
'/\*/', $tva_tx) ? 1 : 0);
621 if (empty($tva_tx)) {
624 $tva_tx = str_replace(
'*',
'', $tva_tx);
625 $desc = $product_desc;
627 $pu_ht_devise =
price2num($price_ht_devise,
'MU');
628 $pu_ttc_devise =
price2num($price_ttc_devise,
'MU');
630 $tmpvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', $tva_tx));
633 if (!empty($price_ht) || $price_ht ===
'0') {
635 $pu_ttc =
price2num((
float) $pu_ht * (1 + ((
float) $tmpvat / 100)),
'MU');
636 $price_base_type =
'HT';
637 } elseif (!empty($price_ttc) || $price_ttc ===
'0') {
639 $pu_ht =
price2num((
float) $pu_ttc / (1 + ((
float) $tmpvat / 100)),
'MU');
640 $price_base_type =
'TTC';
648 $fk_fournprice =
GETPOST(
'fournprice');
650 $pa_ht =
GETPOST(
'buying_price');
660 if (((
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && !$user->hasRight(
'produit',
'ignore_price_min_advance'))
662 $object->error = $langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, -1,
$conf->currency));
691 $outputlangs = $langs;
694 $newlang =
GETPOST(
'lang_id',
'aZ09');
697 $newlang =
$object->thirdparty->default_lang;
699 if (!empty($newlang)) {
701 $outputlangs->setDefaultLang($newlang);
706 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
709 unset($_POST[
'prod_entry_mode']);
711 unset($_POST[
'qty']);
712 unset($_POST[
'type']);
713 unset($_POST[
'remise_percent']);
714 unset($_POST[
'price_ht']);
715 unset($_POST[
'multicurrency_price_ht']);
716 unset($_POST[
'price_ttc']);
717 unset($_POST[
'tva_tx']);
718 unset($_POST[
'product_ref']);
719 unset($_POST[
'product_label']);
720 unset($_POST[
'product_desc']);
721 unset($_POST[
'fournprice']);
722 unset($_POST[
'buying_price']);
723 unset($_POST[
'np_marginRate']);
724 unset($_POST[
'np_markRate']);
725 unset($_POST[
'dp_desc']);
726 unset($_POST[
'idprod']);
728 unset($_POST[
'date_starthour']);
729 unset($_POST[
'date_startmin']);
730 unset($_POST[
'date_startsec']);
731 unset($_POST[
'date_startday']);
732 unset($_POST[
'date_startmonth']);
733 unset($_POST[
'date_startyear']);
734 unset($_POST[
'date_endhour']);
735 unset($_POST[
'date_endmin']);
736 unset($_POST[
'date_endsec']);
737 unset($_POST[
'date_endday']);
738 unset($_POST[
'date_endmonth']);
739 unset($_POST[
'date_endyear']);
744 } elseif ($action ==
'updateline' && $user->hasRight(
'contrat',
'creer') && !
GETPOST(
'cancel',
'alpha')) {
748 if (!empty($date_start_update) && !empty($date_end_update) && $date_start_update > $date_end_update) {
749 setEventMessages($langs->trans(
"Error").
': '.$langs->trans(
"DateStartPlanned").
' > '.$langs->trans(
"DateEndPlanned"),
null,
'errors');
750 $action =
'editline';
756 if ($objectline->fetch($idline) < 0) {
760 $objectline->fetch_optionals();
762 $objectline->oldcopy =
dol_clone($objectline, 2);
770 if ($date_start_real_update ==
'') {
771 $date_start_real_update = $objectline->date_start_real;
773 if ($date_end_real_update ==
'') {
774 $date_end_real_update = $objectline->date_end_real;
777 $vat_rate =
GETPOST(
'eltva_tx',
'alpha');
780 if (preg_match(
'/\*/', $vat_rate)) {
785 $vat_rate = str_replace(
'*',
'', $vat_rate);
794 if (preg_match(
'/\((.*)\)/', $txtva, $reg)) {
795 $vat_src_code = $reg[1];
796 $txtva = preg_replace(
'/\s*\(.*\)/',
'', $txtva);
814 $objectline->fk_product =
GETPOSTINT(
'idprod');
815 $objectline->description =
GETPOST(
'product_desc',
'restricthtml');
816 $objectline->price_ht = (float) $price_ht;
819 $objectline->remise_percent = $remise_percent;
820 $objectline->tva_tx = ($txtva ? $txtva : 0);
821 $objectline->vat_src_code = $vat_src_code;
822 $objectline->localtax1_tx = is_numeric($localtax1_tx) ? $localtax1_tx : 0;
823 $objectline->localtax2_tx = is_numeric($localtax2_tx) ? $localtax2_tx : 0;
824 $objectline->date_start = $date_start_update;
825 $objectline->date_start_real = $date_start_real_update;
826 $objectline->date_end = $date_end_update;
827 $objectline->date_end_real = $date_end_real_update;
828 $objectline->user_closing_id = $user->id;
830 $objectline->pa_ht = $pa_ht;
836 $objectline->fk_unit =
null;
840 $extralabelsline = $extrafields->fetch_name_optionals_label($objectline->table_element);
841 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line, $predef);
843 if (is_array($array_options) && count($array_options) > 0) {
845 foreach ($array_options as $key => $value) {
846 $objectline->array_options[$key] = $array_options[$key];
852 $result = $objectline->update($user);
855 $action =
'editline';
856 $_GET[
'rowid'] =
GETPOST(
'elrowid');
866 } elseif ($action ==
'confirm_deleteline' && $confirm ==
'yes' && $user->hasRight(
'contrat',
'creer')) {
870 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
875 } elseif ($action ==
'confirm_valid' && $confirm ==
'yes' && $user->hasRight(
'contrat',
'creer')) {
876 $result =
$object->validate($user);
881 $outputlangs = $langs;
884 $newlang =
GETPOST(
'lang_id',
'aZ09');
887 $newlang =
$object->thirdparty->default_lang;
889 if (!empty($newlang)) {
891 $outputlangs->setDefaultLang($newlang);
896 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
901 } elseif ($action ==
'reopen' && $user->hasRight(
'contrat',
'creer')) {
902 $result =
$object->reopen($user);
906 } elseif ($action ==
'confirm_close' && $confirm ==
'yes' && $user->hasRight(
'contrat',
'creer')) {
908 $result =
$object->closeAll($user);
912 } elseif ($action ==
'confirm_activate' && $confirm ==
'yes' && $user->hasRight(
'contrat',
'creer')) {
915 $comment =
GETPOST(
'comment',
'alpha');
916 $result =
$object->activateAll($user, $date_start, 0, $comment, $date_end);
920 } elseif ($action ==
'confirm_delete' && $confirm ==
'yes' && $user->hasRight(
'contrat',
'supprimer')) {
921 $result =
$object->delete($user);
923 header(
"Location: list.php?restore_lastsearch_values=1");
928 } elseif ($action ==
'confirm_move' && $confirm ==
'yes' && $user->hasRight(
'contrat',
'creer')) {
931 $result = $contractline->fetch(
GETPOSTINT(
'lineid'));
932 $contractline->fk_contrat =
GETPOSTINT(
'newcid');
933 $result = $contractline->update($user, 1);
935 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$id);
941 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentities(
"RefNewContract")),
null,
'errors');
943 } elseif ($action ==
'update_extras' && $permissiontoadd) {
946 $attribute =
GETPOST(
'attribute',
'alphanohtml');
949 $ret = $extrafields->setOptionalsFromPost(
null,
$object, $attribute);
956 $result =
$object->updateExtraField($attribute,
'CONTRACT_MODIFY');
964 $action =
'edit_extras';
966 } elseif ($action ==
'setref_supplier' && $permissiontoadd) {
970 $result =
$object->setValueFrom(
'ref_supplier',
GETPOST(
'ref_supplier',
'alpha'),
'',
null,
'text',
'', $user,
'CONTRACT_MODIFY');
973 $action =
'editref_supplier';
975 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
979 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$id);
982 } elseif ($action ==
'setref_customer' && $permissiontoadd) {
986 $result =
$object->setValueFrom(
'ref_customer',
GETPOST(
'ref_customer',
'alpha'),
'',
null,
'text',
'', $user,
'CONTRACT_MODIFY');
989 $action =
'editref_customer';
991 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
995 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$id);
998 } elseif ($action ==
'setref' && $permissiontoadd) {
1000 $result =
$object->fetch($id);
1007 $result =
$object->setValueFrom(
'ref',
GETPOST(
'ref',
'alpha'),
'',
null,
'text',
'', $user,
'CONTRACT_MODIFY');
1010 $action =
'editref';
1012 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
1019 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
1023 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$id);
1026 } elseif ($action ==
'setdate_contrat' && $permissiontoadd) {
1028 $result =
$object->fetch($id);
1033 $result =
$object->setValueFrom(
'date_contrat', $datacontrat,
'',
null,
'date',
'', $user,
'CONTRACT_MODIFY');
1036 $action =
'editdate_contrat';
1038 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
1042 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$id);
1048 include DOL_DOCUMENT_ROOT.
'/core/actions_printing.inc.php';
1052 include DOL_DOCUMENT_ROOT.
'/core/actions_builddoc.inc.php';
1055 $triggersendname =
'CONTRACT_SENTBYMAIL';
1057 $mode =
'emailfromcontract';
1058 $trackid =
'con'.$object->id;
1059 include DOL_DOCUMENT_ROOT.
'/core/actions_sendmails.inc.php';
1063 if ($action ==
'addcontact' && $user->hasRight(
'contrat',
'creer')) {
1066 $result =
$object->add_contact($contactid, $typeid,
GETPOST(
"source",
'aZ09'));
1069 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
1072 if (
$object->error ==
'DB_ERROR_RECORD_ALREADY_EXISTS') {
1073 $langs->load(
"errors");
1074 setEventMessages($langs->trans(
"ErrorThisContactIsAlreadyDefinedAsThisType"),
null,
'errors');
1079 } elseif ($action ==
'swapstatut' && $user->hasRight(
'contrat',
'creer')) {
1082 } elseif ($action ==
'deletecontact' && $user->hasRight(
'contrat',
'creer')) {
1087 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
1096 if ($action ==
'confirm_clone' && $confirm ==
'yes' && $user->hasRight(
'contrat',
'creer')) {
1098 setEventMessages($langs->trans(
"NoCloneOptionsSpecified"),
null,
'errors');
1101 $result =
$object->createFromClone($user, $socid);
1103 header(
"Location: ".$_SERVER[
'PHP_SELF'].
'?id='.$result);
1106 if (count(
$object->errors) > 0) {
1121$title =
$object->ref.
" - ".$langs->trans(
'Contract');
1122if ($action ==
'create') {
1123 $title = $langs->trans(
"NewContract");
1125$help_url =
'EN:Module_Contracts|FR:Module_Contrat|ES:Contratos_de_servicio';
1127llxHeader(
'', $title, $help_url,
'', 0, 0,
'',
'',
'',
'mod-contrat page-card');
1129$form =
new Form($db);
1131if (isModEnabled(
'project')) {
1137if (substr($module, 0, 13) ==
'mod_contract_' && substr($module, -3) ==
'php') {
1138 $module = substr($module, 0,
dol_strlen($module) - 4);
1141$modCodeContract =
null;
1143 $modCodeContract =
new $module();
1144 '@phan-var-force ModelNumRefContracts $modCodeContract';
1148if ($action ==
'create') {
1154 $soc->fetch($socid);
1160 $element = $subelement =
GETPOST(
'origin');
1161 if (preg_match(
'/^([^_]+)_([^_]+)/i',
GETPOST(
'origin'), $regs)) {
1162 $element = $regs[1];
1163 $subelement = $regs[2];
1166 if ($element ==
'project') {
1170 if ($element ==
'order' || $element ==
'commande') {
1171 $element = $subelement =
'commande';
1173 if ($element ==
'propal') {
1174 $element =
'comm/propal';
1175 $subelement =
'propal';
1177 if ($element ==
'invoice' || $element ==
'facture') {
1178 $element =
'compta/facture';
1179 $subelement =
'facture';
1184 $classname = ucfirst($subelement);
1185 $objectsrc =
new $classname($db);
1186 '@phan-var-force Commande|Propal|Facture $objectsrc';
1187 $objectsrc->fetch($originid);
1188 if (empty($objectsrc->lines) && method_exists($objectsrc,
'fetch_lines')) {
1189 $objectsrc->fetch_lines();
1191 $objectsrc->fetch_thirdparty();
1194 $objectsrc->fetch_optionals();
1195 $object->array_options = $objectsrc->array_options;
1197 $projectid = (!empty($objectsrc->fk_project) ? $objectsrc->fk_project :
'');
1199 $soc = $objectsrc->thirdparty;
1201 $note_private = (!empty($objectsrc->note_private) ? $objectsrc->note_private :
'');
1202 $note_public = (!empty($objectsrc->note_public) ? $objectsrc->note_public :
'');
1205 $srccontactslist = $objectsrc->liste_contact(-1,
'external', 1);
1209 $note_private =
GETPOST(
"note_private",
"alpha");
1210 $note_public =
GETPOST(
"note_public",
"alpha");
1215 print
'<form name="form_contract" action="'.$_SERVER[
"PHP_SELF"].
'" method="post">';
1216 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1217 print
'<input type="hidden" name="action" value="add">';
1218 print
'<input type="hidden" name="socid" value="'.$soc->id.
'">'.
"\n";
1219 print
'<input type="hidden" name="remise_percent" value="0">';
1220 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
1224 print
'<table class="border centpercent">';
1227 print
'<tr><td class="titlefieldcreate fieldrequired">'.$langs->trans(
'Ref').
'</td><td>';
1228 if (!empty($modCodeContract->code_auto)) {
1229 $tmpcode = $langs->trans(
"Draft");
1231 $tmpcode =
'<input name="ref" class="maxwidth100" maxlength="128" value="'.dol_escape_htmltag(
GETPOST(
'ref') ?
GETPOST(
'ref') : $tmpcode).
'">';
1237 print
'<tr><td>'.$langs->trans(
'RefCustomer').
'</td>';
1238 print
'<td><input type="text" class="maxwidth150" name="ref_customer" id="ref_customer" value="'.dol_escape_htmltag(
GETPOST(
'ref_customer',
'alpha')).
'"></td></tr>';
1241 print
'<tr><td>'.$langs->trans(
'RefSupplier').
'</td>';
1242 print
'<td><input type="text" class="maxwidth150" name="ref_supplier" id="ref_supplier" value="'.dol_escape_htmltag(
GETPOST(
'ref_supplier',
'alpha')).
'"></td></tr>';
1246 print
'<td class="fieldrequired">'.$langs->trans(
'ThirdParty').
'</td>';
1249 print $soc->getNomUrl(1);
1250 print
'<input type="hidden" name="socid" value="'.$soc->id.
'">';
1254 print
img_picto(
'',
'company',
'class="pictofixedwidth"');
1255 print $form->select_company(
'',
'socid',
'',
'SelectThirdParty', 1, 0, array(), 0,
'minwidth300 widthcentpercentminusxx maxwidth500');
1256 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>';
1263 print
'<tr><td>'.$langs->trans(
'Discounts').
'</td><td>';
1264 if ($soc->remise_percent) {
1265 print $langs->trans(
"CompanyHasRelativeDiscount", $soc->remise_percent).
' ';
1267 print
'<span class="hideonsmartphone">'.$langs->trans(
"CompanyHasNoRelativeDiscount").
'. </span>';
1269 $absolute_discount = $soc->getAvailableDiscounts();
1270 if ($absolute_discount) {
1271 print $langs->trans(
"CompanyHasAbsoluteDiscount",
price($absolute_discount), $langs->trans(
"Currency".$conf->currency)).
'.';
1273 print
'<span class="hideonsmartphone">'.$langs->trans(
"CompanyHasNoAbsoluteDiscount").
'.</span>';
1279 print
'<tr><td class="nowrap"><span class="fieldrequired">'.$langs->trans(
"TypeContact_contrat_internal_SALESREPFOLL").
'</span></td><td>';
1280 print
img_picto(
'',
'user',
'class="pictofixedwidth"');
1281 print $form->select_dolusers(
GETPOST(
"commercial_suivi_id") ?
GETPOST(
"commercial_suivi_id") : $user->id,
'commercial_suivi_id', 1,
'');
1285 print
'<tr><td class="nowrap"><span class="fieldrequired">'.$langs->trans(
"TypeContact_contrat_internal_SALESREPSIGN").
'</span></td><td>';
1286 print
img_picto(
'',
'user',
'class="pictofixedwidth"');
1287 print $form->select_dolusers(
GETPOST(
"commercial_signature_id") ?
GETPOST(
"commercial_signature_id") : $user->id,
'commercial_signature_id', 1,
'');
1290 print
'<tr><td><span class="fieldrequired">'.$langs->trans(
"Date").
'</span></td><td>';
1291 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
1292 print $form->selectDate($datecontrat,
'', 0, 0, 0,
"contrat");
1296 if (isModEnabled(
'project')) {
1297 $langs->load(
'projects');
1301 print
'<tr><td>'.$langs->trans(
"Project").
'</td><td>';
1302 print
img_picto(
'',
'project',
'class="pictofixedwidth"');
1303 $formproject->select_projects(($soc->id > 0 ? $soc->id : -1), $projectid,
"projectid", 0, 0, 1, 1);
1304 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>';
1308 print
'<tr><td>'.$langs->trans(
"NotePublic").
'</td><td class="tdtop">';
1309 $doleditor =
new DolEditor(
'note_public', $note_public,
'', 100,
'dolibarr_notes',
'In',
true,
true, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PUBLIC') ? 0 : 1, ROWS_3,
'90%');
1310 print $doleditor->Create(1);
1313 if (empty($user->socid)) {
1314 print
'<tr><td>'.$langs->trans(
"NotePrivate").
'</td><td class="tdtop">';
1315 $doleditor =
new DolEditor(
'note_private', $note_private,
'', 100,
'dolibarr_notes',
'In',
true,
true, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PRIVATE') ? 0 : 1, ROWS_3,
'90%');
1316 print $doleditor->Create(1);
1321 $parameters = array(
'objectsrc' => $objectsrc,
'colspan' =>
' colspan="3"',
'cols' =>
'3');
1322 $reshook = $hookmanager->executeHooks(
'formObjectOptions', $parameters,
$object, $action);
1323 print $hookmanager->resPrint;
1326 if (empty($reshook)) {
1327 print
$object->showOptionals($extrafields,
'create', $parameters);
1334 print $form->buttonsSaveCancel(
"Create");
1336 if (is_object($objectsrc)) {
1337 print
'<input type="hidden" name="origin" value="'.$objectsrc->element.
'">';
1338 print
'<input type="hidden" name="originid" value="'.$objectsrc->id.
'">';
1341 print
'<br>'.$langs->trans(
"Note").
': '.$langs->trans(
"OnlyLinesWithTypeServiceAreUsed");
1355 $result =
$object->fetch_lines();
1360 $nbofservices = count(
$object->lines);
1362 $author =
new User($db);
1363 $author->fetch(
$object->user_author_id);
1365 $commercial_signature =
new User($db);
1366 $commercial_signature->fetch(
$object->commercial_signature_id);
1368 $commercial_suivi =
new User($db);
1369 $commercial_suivi->fetch(
$object->commercial_suivi_id);
1376 print
dol_get_fiche_head($head, $hselected, $langs->trans(
"Contract"), -1,
'contract');
1379 if ($action ==
'delete') {
1381 $formconfirm = $form->formconfirm($_SERVER[
'PHP_SELF'].
"?id=".
$object->id, $langs->trans(
"DeleteAContract"), $langs->trans(
"ConfirmDeleteAContract"),
"confirm_delete",
'', 0, 1);
1382 } elseif ($action ==
'valid') {
1384 $ref = substr(
$object->ref, 1, 4);
1385 if ($ref ==
'PROV' && !empty($modCodeContract->code_auto)) {
1390 $text = $langs->trans(
'ConfirmValidateContract', $numref);
1391 $formconfirm = $form->formconfirm($_SERVER[
'PHP_SELF'].
"?id=".
$object->id, $langs->trans(
"ValidateAContract"), $text,
"confirm_valid",
'', 0, 1);
1392 } elseif ($action ==
'close') {
1394 $formconfirm = $form->formconfirm($_SERVER[
'PHP_SELF'].
"?id=".
$object->id, $langs->trans(
"CloseAContract"), $langs->trans(
"ConfirmCloseContract"),
"confirm_close",
'', 0, 1);
1395 } elseif ($action ==
'activate') {
1396 $formquestion = array(
1397 array(
'type' =>
'date',
'name' =>
'd_start',
'label' => $langs->trans(
"DateServiceActivate"),
'value' =>
dol_now()),
1398 array(
'type' =>
'date',
'name' =>
'd_end',
'label' => $langs->trans(
"DateEndPlanned"), 0 =>
'', 1 =>
''),
1399 array(
'type' =>
'text',
'name' =>
'comment',
'label' => $langs->trans(
"Comment"),
'value' =>
'', 0 =>
'', 1 =>
'',
'class' =>
'minwidth300',
'moreattr' =>
'autofocus')
1401 $formconfirm = $form->formconfirm($_SERVER[
'PHP_SELF'].
"?id=".
$object->id, $langs->trans(
"ActivateAllOnContract"), $langs->trans(
"ConfirmActivateAllOnContract"),
"confirm_activate", $formquestion,
'yes', 1, 280);
1402 } elseif ($action ==
'clone') {
1403 $filter =
'(s.client:IN:1,2,3)';
1405 $formquestion = array(array(
'type' =>
'other',
'name' =>
'socid',
'label' => $langs->trans(
"SelectThirdParty"),
'value' => $form->select_company(
GETPOSTINT(
'socid'),
'socid', $filter)));
1406 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'ToClone'), $langs->trans(
'ConfirmCloneContract',
$object->ref),
'confirm_clone', $formquestion,
'yes', 1);
1407 } elseif ($action ==
'sign') {
1408 $text = $langs->trans(
'ConfirmSignContract');
1409 if (isModEnabled(
'notification')) {
1410 require_once DOL_DOCUMENT_ROOT.
'/core/class/notify.class.php';
1411 $notify =
new Notify($db);
1413 $text .= $notify->confirmMessage(
'CONTRACT_MODIFY',
$object->socid,
$object);
1418 'name' =>
'signed_status',
1419 'label' =>
'<span class="fieldrequired">'.$langs->trans(
'SignStatus').
'</span>',
1420 'values' =>
$object->getSignedStatusLocalisedArray()
1422 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'SignContract'), $text,
'confirm_sign', $formquestion, 0, 1);
1423 } elseif ($action ==
'unsign') {
1424 $text = $langs->trans(
'ConfirmUnsignContract');
1425 if (isModEnabled(
'notification')) {
1426 require_once DOL_DOCUMENT_ROOT.
'/core/class/notify.class.php';
1427 $notify =
new Notify($db);
1429 $text .= $notify->confirmMessage(
'CONTRACT_MODIFY',
$object->socid,
$object);
1431 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'UnsignContract'), $text,
'confirm_unsign',
'', 0, 1);
1436 $parameters = array(
1437 'formConfirm' => $formconfirm,
1442 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters,
$object, $action);
1443 if (empty($reshook)) {
1444 $formconfirm .= $hookmanager->resPrint;
1445 } elseif ($reshook > 0) {
1446 $formconfirm = $hookmanager->resPrint;
1454 if (
$object->status == $object::STATUS_DRAFT && $user->hasRight(
'contrat',
'creer')) {
1455 print
'<form action="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'" method="POST">';
1456 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1457 print
'<input type="hidden" name="action" value="setremise">';
1458 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
1463 $linkback =
'<a href="'.DOL_URL_ROOT.
'/contrat/list.php?restore_lastsearch_values=1'.(!empty($socid) ?
'&socid='.$socid :
'').
'">'.$langs->trans(
"BackToList").
'</a>';
1467 if (!empty($modCodeContract->code_auto)) {
1470 $morehtmlref .= $form->editfieldkey(
"",
'ref',
$object->ref,
$object, $user->hasRight(
'contrat',
'creer'),
'string',
'', 0, 3);
1471 $morehtmlref .= $form->editfieldval(
"",
'ref',
$object->ref,
$object, $user->hasRight(
'contrat',
'creer'),
'string',
'',
null, 2);
1474 $morehtmlref .=
'<div class="refidno">';
1476 $morehtmlref .= $form->editfieldkey(
"RefCustomer",
'ref_customer',
$object->ref_customer,
$object, $user->hasRight(
'contrat',
'creer'),
'string',
'', 0, 1);
1477 $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');
1479 $morehtmlref .=
'<br>';
1480 $morehtmlref .= $form->editfieldkey(
"RefSupplier",
'ref_supplier',
$object->ref_supplier,
$object, $user->hasRight(
'contrat',
'creer'),
'string',
'', 0, 1);
1481 $morehtmlref .= $form->editfieldval(
"RefSupplier",
'ref_supplier',
$object->ref_supplier,
$object, $user->hasRight(
'contrat',
'creer'),
'string',
'',
null,
null,
'', 1,
'getFormatedSupplierRef');
1483 $morehtmlref .=
'<br>'.$object->thirdparty->getNomUrl(1);
1485 $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>';
1488 if (isModEnabled(
'project')) {
1489 $langs->load(
"projects");
1490 $morehtmlref .=
'<br>';
1491 if ($permissiontoadd) {
1492 $morehtmlref .=
img_picto($langs->trans(
"Project"),
'project',
'class="pictofixedwidth"');
1493 if ($action !=
'classify') {
1494 $morehtmlref .=
'<a class="editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?action=classify&token='.
newToken().
'&id='.
$object->id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetProject')).
'</a> ';
1496 $morehtmlref .= $form->form_project($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->socid,
$object->fk_project, ($action ==
'classify' ?
'projectid' :
'none'), 0, 0, 0, 1,
'',
'maxwidth300');
1498 if (!empty(
$object->fk_project)) {
1500 $proj->fetch(
$object->fk_project);
1501 $morehtmlref .= $proj->getNomUrl(1);
1503 $morehtmlref .=
'<span class="opacitymedium"> - '.dol_escape_htmltag($proj->title).
'</span>';
1508 $morehtmlref .=
'</div>';
1511 dol_banner_tab(
$object,
'ref', $linkback, 1,
'ref',
'none', $morehtmlref);
1514 print
'<div class="fichecenter">';
1515 print
'<div class="underbanner clearboth"></div>';
1518 print
'<table class="border tableforfield" width="100%">';
1521 print
'<tr><td class="titlefield">'.$langs->trans(
'Discount').
'</td><td colspan="3">';
1522 if (
$object->thirdparty->remise_percent) {
1523 print $langs->trans(
"CompanyHasRelativeDiscount",
$object->thirdparty->remise_percent).
'. ';
1525 print
'<span class="hideonsmartphone">'.$langs->trans(
"CompanyHasNoRelativeDiscount").
'. </span>';
1527 $absolute_discount =
$object->thirdparty->getAvailableDiscounts();
1528 if ($absolute_discount) {
1529 print $langs->trans(
"CompanyHasAbsoluteDiscount",
price($absolute_discount), $langs->trans(
"Currency".$conf->currency)).
'.';
1531 print
'<span class="hideonsmartphone">'.$langs->trans(
"CompanyHasNoAbsoluteDiscount").
'.</span>';
1537 print
'<td class="titlefield">';
1538 print $form->editfieldkey(
"Date",
'date_contrat',
$object->date_contrat,
$object, $user->hasRight(
'contrat',
'creer'));
1540 print $form->editfieldval(
"Date",
'date_contrat',
$object->date_contrat,
$object, $user->hasRight(
'contrat',
'creer'),
'datehourpicker');
1546 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_view.tpl.php';
1552 if (
$object->status == $object::STATUS_DRAFT && $user->hasRight(
'contrat',
'creer')) {
1559 $blocname =
'contacts';
1560 $title = $langs->trans(
'ContactsAddresses');
1561 include DOL_DOCUMENT_ROOT.
'/core/tpl/bloc_showhide.tpl.php';
1565 $blocname =
'notes';
1566 $title = $langs->trans(
'Notes');
1567 include DOL_DOCUMENT_ROOT.
'/core/tpl/bloc_showhide.tpl.php';
1571 $arrayothercontracts =
$object->getListOfContracts(
'others');
1579 global $inputalsopricewithtax;
1580 $inputalsopricewithtax = 1;
1582 $productstatic =
new Product($db);
1585 if (isModEnabled(
'margin') && !empty(
$object->element) && in_array(
$object->element, array(
'facture',
'propal',
'commande'))) {
1593 print
'<div id="contrat-lines-container" id="contractlines" data-contractid="'.$object->id.
'" data-element="'.
$object->element.
'" >';
1594 while ($cursorline <= $nbofservices) {
1595 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.
'" >';
1596 print
'<form name="update" id="addproduct" action="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'" method="post">';
1597 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1598 print
'<input type="hidden" name="action" value="updateline">';
1599 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
1600 print
'<input type="hidden" name="elrowid" value="'.$object->lines[$cursorline - 1]->id.
'">';
1601 print
'<input type="hidden" name="fournprice" value="'.(!empty(
$object->lines[$cursorline - 1]->fk_fournprice) ?
$object->lines[$cursorline - 1]->fk_fournprice : 0).
'">';
1604 print
'<div class="div-table-responsive-no-min">';
1605 print
'<table class="notopnoleftnoright allwidth tableforservicepart1 centpercent">';
1607 $sql =
"SELECT cd.rowid, cd.statut, cd.label as label_det, cd.fk_product, cd.product_type, cd.description, cd.price_ht, cd.qty,";
1608 $sql .=
" cd.tva_tx, cd.vat_src_code, cd.remise_percent, cd.info_bits, cd.subprice, cd.multicurrency_subprice,";
1609 $sql .=
" cd.date_ouverture_prevue as date_start, cd.date_ouverture as date_start_real,";
1610 $sql .=
" cd.date_fin_validite as date_end, cd.date_cloture as date_end_real,";
1611 $sql .=
" cd.commentaire as comment, cd.fk_product_fournisseur_price as fk_fournprice, cd.buy_price_ht as pa_ht,";
1612 $sql .=
" cd.fk_unit,";
1613 $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";
1614 $sql .=
" ,cd.rang";
1615 $sql .=
" FROM ".MAIN_DB_PREFIX.
"contratdet as cd";
1616 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"product as p ON cd.fk_product = p.rowid";
1617 $sql .=
" WHERE cd.rowid = ".((int)
$object->lines[$cursorline - 1]->id);
1619 $result = $db->query($sql);
1624 $objp = $db->fetch_object($result);
1627 print
'<tr class="liste_titre'.($cursorline ?
' liste_titre_add' :
'').
'">';
1628 print
'<td>'.$langs->trans(
"ServiceNb", $cursorline).
'</td>';
1629 print
'<td width="80" class="center">'.$langs->trans(
"VAT").
'</td>';
1630 print
'<td width="80" class="right">'.$langs->trans(
"PriceUHT").
'</td>';
1634 print
'<td width="30" class="center">'.$langs->trans(
"Qty").
'</td>';
1636 print
'<td width="30" class="left">'.$langs->trans(
"Unit").
'</td>';
1638 print
'<td width="50" class="right">'.$langs->trans(
"ReductionShort").
'</td>';
1640 print
'<td width="50" class="right">'.$langs->trans(
"BuyingPrice").
'</td>';
1644 if ($nbofservices > 1 &&
$conf->browser->layout !=
'phone' && $user->hasRight(
'contrat',
'creer')) {
1645 print
'<td width="30" class="linecolmove tdlineupdown center">';
1646 if ($cursorline > 1) {
1647 print
'<a class="lineupdown reposition" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=up&token='.
newToken().
'&rowid='.$objp->rowid.
'">';
1648 echo
img_up(
'default', 0,
'imgupforline');
1651 if ($cursorline < $nbofservices) {
1652 print
'<a class="lineupdown reposition" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=down&token='.
newToken().
'&rowid='.$objp->rowid.
'">';
1653 echo
img_down(
'default', 0,
'imgdownforline');
1658 print
'<td width="30"> </td>';
1666 if ($action !=
'editline' || $idline != $objp->rowid) {
1668 if (
getDolGlobalString(
'CONTRACT_HIDE_CLOSED_SERVICES_BY_DEFAULT') && $objp->statut == ContratLigne::STATUS_CLOSED && $action !=
'showclosedlines') {
1669 $moreparam =
'style="display: none;"';
1672 print
'<tr class="tdtop oddeven" '.$moreparam.
'>';
1675 if ($objp->fk_product > 0) {
1676 $productstatic->id = $objp->fk_product;
1677 $productstatic->type = $objp->ptype;
1678 $productstatic->ref = $objp->pref;
1679 $productstatic->entity = $objp->pentity;
1680 $productstatic->label = $objp->plabel;
1681 $productstatic->status = $objp->tosell;
1682 $productstatic->status_buy = $objp->tobuy;
1683 $productstatic->status_batch = $objp->tobatch;
1686 $text = $productstatic->getNomUrl(1,
'', 32);
1687 if ($objp->plabel) {
1689 $text .= $objp->plabel;
1691 $description = $objp->description;
1695 $text .= (!empty($objp->description) && $objp->description != $objp->plabel) ?
'<br>'.
dol_htmlentitiesbr($objp->description) :
'';
1699 print $form->textwithtooltip($text, $description, 3, 0, 0, $cursorline, 3, (!empty($line->fk_parent_line) ?
img_picto(
'',
'rightarrow') :
''));
1703 print
'<td>'.img_object($langs->trans(
"ShowProductOrService"), ($objp->product_type ?
'service' :
'product')).
' '.
dol_htmlentitiesbr($objp->
description).
"</td>\n";
1706 print
'<td class="center">';
1707 print
vatrate($objp->tva_tx.($objp->vat_src_code ? (
' ('.$objp->vat_src_code.
')') :
''), true, $objp->info_bits);
1710 print
'<td class="right">'.($objp->subprice !=
'' ?
price($objp->subprice) :
'').
"</td>\n";
1716 print
'<td class="center">'.$objp->qty.
'</td>';
1719 print
'<td class="left">'.$object->lines[$cursorline - 1]->getLabelOfUnit(
'long', $langs).
'</td>';
1722 if ($objp->remise_percent > 0) {
1723 print
'<td class="right">'.$objp->remise_percent.
"%</td>\n";
1725 print
'<td> </td>';
1730 print
'<td class="right nowraponall">'.price($objp->pa_ht).
'</td>';
1734 print
'<td class="nowraponall right">';
1735 if ($user->hasRight(
'contrat',
'creer') && is_array($arrayothercontracts) && count($arrayothercontracts) && (
$object->status >= 0)) {
1736 print
'<!-- link to move service line into another contract -->';
1737 print
'<a class="reposition marginrightonly" style="padding-left: 5px;" href="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'&action=move&token='.
newToken().
'&elrowid='.$objp->rowid.
'">';
1738 print
img_picto($langs->trans(
"MoveToAnotherContract"),
'uparrow');
1741 if ($user->hasRight(
'contrat',
'creer') && (
$object->statut >= 0)) {
1742 print
'<a class="reposition marginrightonly editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'&action=editline&token='.
newToken().
'&elrowid='.$objp->rowid.
'">';
1746 if ($user->hasRight(
'contrat',
'creer') && (
$object->statut >= 0)) {
1747 print
'<a class="reposition marginrightonly" href="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'&action=deleteline&token='.
newToken().
'&elrowid='.$objp->rowid.
'">';
1764 if ($objp->subprice >= 0) {
1765 print
'<tr class="oddeven" '.$moreparam.
'>';
1766 print
'<td colspan="'.$colspan.
'">';
1769 print $langs->trans(
"DateStartPlanned").
': ';
1770 if ($objp->date_start) {
1773 if ($objp->statut == 0 && $db->jdate($objp->date_start) < ($now -
$conf->contrat->services->inactifs->warning_delay)) {
1774 $warning_delay =
$conf->contrat->services->inactifs->warning_delay / 3600 / 24;
1775 $textlate = $langs->trans(
"Late").
' = '.$langs->trans(
"DateReference").
' > '.$langs->trans(
"DateToday").
' '.(ceil($warning_delay) >= 0 ?
'+' :
'').ceil($warning_delay).
' '.$langs->trans(
"days");
1776 print
" ".img_warning($textlate);
1779 print $langs->trans(
"Unknown");
1781 print
' - ';
1782 print $langs->trans(
"DateEndPlanned").
': ';
1783 if ($objp->date_end) {
1785 if ($objp->statut == 4 && $db->jdate($objp->date_end) < ($now -
$conf->contrat->services->expires->warning_delay)) {
1786 $warning_delay =
$conf->contrat->services->expires->warning_delay / 3600 / 24;
1787 $textlate = $langs->trans(
"Late").
' = '.$langs->trans(
"DateReference").
' > '.$langs->trans(
"DateToday").
' '.(ceil($warning_delay) >= 0 ?
'+' :
'').ceil($warning_delay).
' '.$langs->trans(
"days");
1788 print
" ".img_warning($textlate);
1791 print $langs->trans(
"Unknown");
1799 if (is_array($extralabelslines) && count($extralabelslines) > 0) {
1801 $line->id = $objp->rowid;
1802 $line->fetch_optionals();
1803 print $line->showOptionals($extrafields,
'view', array(
'class' =>
'oddeven',
'style' => $moreparam,
'colspan' => $colspan,
'tdclass' =>
'notitlefieldcreate'),
'',
'', 1);
1808 print
'<tr class="oddeven">';
1810 $currentLineProductId = GETPOSTISSET(
'idprod') ?
GETPOST(
'idprod') : (!empty(
$object->lines[$cursorline - 1]->fk_product) ?
$object->lines[$cursorline - 1]->fk_product : 0);
1811 if ($objp->fk_product > 0) {
1812 $canchangeproduct = 1;
1815 if (empty($canchangeproduct)) {
1816 $productstatic->id = $objp->fk_product;
1817 $productstatic->type = $objp->ptype;
1818 $productstatic->ref = $objp->pref;
1819 $productstatic->entity = $objp->pentity;
1820 print $productstatic->getNomUrl(1,
'', 32);
1821 print $objp->label ?
' - '.dol_trunc($objp->label, 32) :
'';
1822 print
'<input type="hidden" name="idprod" value="'.$currentLineProductId.
'">';
1824 $senderissupplier = 0;
1825 if (empty($senderissupplier)) {
1831 print $form->select_produits($currentLineProductId,
'idprod', $filtertype, 0, 0, 1, 2,
'', 0, array(), 0, 1, 0,
'minwidth250onall maxwidth500 widthcentpercentminusx');
1833 $form->select_produits_fournisseurs($currentLineProductId,
'idprod');
1838 print $objp->label ? $objp->label.
'<br>' :
'';
1839 print
'<input type="hidden" name="idprod" value="'.$currentLineProductId.
'">';
1843 require_once DOL_DOCUMENT_ROOT.
'/core/class/doleditor.class.php';
1848 $doleditor =
new DolEditor(
'product_desc', (GETPOSTISSET(
'product_desc') ?
GETPOST(
'product_desc') : $objp->
description),
'', 92,
'dolibarr_details',
'', false, true,
getDolGlobalInt(
'FCKEDITOR_ENABLE_DETAILS'), $nbrows,
'90%');
1849 $doleditor->Create();
1854 print
'<td class="right">';
1855 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);
1859 print
'<td class="right"><input class="width50" type="text" name="elprice" value="'.(GETPOSTISSET(
'elprice') ?
GETPOST(
'elprice') :
price($objp->subprice)).
'"></td>';
1867 print
'<td class="center"><input size="2" type="text" name="elqty" value="'.(GETPOSTISSET(
'elqty') ?
GETPOST(
'elqty') : $objp->qty).
'"></td>';
1871 print
'<td class="left">';
1872 print $form->selectUnits((GETPOSTISSET(
'unit') ?
GETPOSTINT(
'unit') : $objp->fk_unit),
"unit");
1877 print
'<td class="nowraponall right"><input size="1" type="text" name="elremise_percent" value="'.(GETPOSTISSET(
'elremise_percent') ?
GETPOST(
'elremise_percent') : $objp->remise_percent).
'">%</td>';
1879 if (!empty($usemargins)) {
1880 print
'<td class="right">';
1881 if ($objp->fk_product) {
1882 print
'<select id="fournprice" name="fournprice"></select>';
1884 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>';
1886 print
'<td class="center">';
1887 print
'<input type="submit" class="button margintoponly marginbottomonly" name="save" value="'.$langs->trans(
"Modify").
'">';
1888 print
'<br><input type="submit" class="button margintoponly marginbottomonly button-cancel" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
1901 print
'<tr class="oddeven">';
1902 print
'<td colspan="'.$colspan.
'">';
1903 print $langs->trans(
"DateStartPlanned").
' ';
1904 print $form->selectDate($db->jdate($objp->date_start),
"date_start_update", $usehm, $usehm, ($db->jdate($objp->date_start) > 0 ? 0 : 1),
"update");
1905 print
' '.$langs->trans(
"DateEndPlanned").
' ';
1906 print $form->selectDate($db->jdate($objp->date_end),
"date_end_update", $usehm, $usehm, ($db->jdate($objp->date_end) > 0 ? 0 : 1),
"update");
1910 if (is_array($extralabelslines) && count($extralabelslines) > 0) {
1912 $line->id = $objp->rowid;
1913 $line->fetch_optionals();
1915 print $line->showOptionals($extrafields,
'edit', array(
'style' =>
'class="oddeven"',
'colspan' => $colspan,
'tdclass' =>
'notitlefieldcreate'),
'',
'', 1);
1926 if (
getDolGlobalString(
'CONTRACT_HIDE_CLOSED_SERVICES_BY_DEFAULT') &&
$object->lines[$cursorline - 1]->statut == ContratLigne::STATUS_CLOSED && $action !=
'showclosedlines') {
1927 $moreparam =
'style="display: none;"';
1938 print
'<tr class="oddeven" '.$moreparam.
'>';
1939 print
'<td class="tdhrthin" colspan="'.$colspan.
'"><hr class="opacitymedium tdhrthin"></td>';
1952 if ($action ==
'deleteline' && !$cancel && $user->hasRight(
'contrat',
'creer') &&
$object->lines[$cursorline - 1]->id == $idline) {
1953 print $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".((
int)
$object->id).
"&lineid=".((
int) $idline), $langs->trans(
"DeleteContractLine"), $langs->trans(
"ConfirmDeleteContractLine"),
"confirm_deleteline",
'', 0, 1);
1954 if ($ret ==
'html') {
1955 print
'<table class="notopnoleftnoright centpercent"><tr class="oddeven" height="6"><td></td></tr></table>';
1962 if ($action ==
'move' && !$cancel && $user->hasRight(
'contrat',
'creer') &&
$object->lines[$cursorline - 1]->id == $idline) {
1963 $arraycontractid = array();
1964 foreach ($arrayothercontracts as $contractcursor) {
1965 $arraycontractid[$contractcursor->id] = $contractcursor->ref;
1969 $formquestion = array(
1970 'text' => $langs->trans(
"ConfirmMoveToAnotherContractQuestion"),
1971 0 => array(
'type' =>
'select',
'name' =>
'newcid',
'values' => $arraycontractid));
1973 print $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".((
int)
$object->id).
"&lineid=".((
int) $idline), $langs->trans(
"MoveToAnotherContract"), $langs->trans(
"ConfirmMoveToAnotherContract"),
"confirm_move", $formquestion,
'yes');
1974 print
'<table class="notopnoleftnoright centpercent"><tr class="oddeven" height="6"><td></td></tr></table>';
1979 print
'<table class="notopnoleftnoright tableforservicepart2'.($cursorline < $nbofservices ?
' boxtablenobottom' :
'').
' centpercent">';
1981 print
'<tr class="oddeven" '.$moreparam.
'>';
1982 print
'<td><span class="valignmiddle hideonsmartphone">'.$langs->trans(
"ServiceStatus").
':</span> '.
$object->lines[$cursorline - 1]->getLibStatut(4).
'</td>';
1983 print
'<td width="30" class="right">';
1984 if ($user->socid == 0) {
1985 if (
$object->statut > 0 && $action !=
'activateline' && $action !=
'unactivateline' && is_object($objp)) {
1986 $tmpaction =
'activateline';
1987 $tmpactionpicto =
'play';
1988 $tmpactiontext = $langs->trans(
"Activate");
1989 if ($objp->statut == 4) {
1990 $tmpaction =
'unactivateline';
1991 $tmpactionpicto =
'playstop';
1992 $tmpactiontext = $langs->trans(
"Disable");
1994 if (($tmpaction ==
'activateline' && $user->hasRight(
'contrat',
'activer')) || ($tmpaction ==
'unactivateline' && $user->hasRight(
'contrat',
'desactiver'))) {
1995 print
'<a class="reposition" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&ligne='.
$object->lines[$cursorline - 1]->id.
'&action='.$tmpaction.
'&token='.
newToken().
'">';
1996 print
img_picto($tmpactiontext, $tmpactionpicto);
2004 print
'<tr class="oddeven" '.$moreparam.
'>';
2008 if (!$objp->date_start_real) {
2009 print $langs->trans(
"DateStartReal").
': ';
2010 if ($objp->date_start_real) {
2013 print $langs->trans(
"ContractStatusNotRunning");
2017 if ($objp->date_start_real && !$objp->date_end_real) {
2018 print $langs->trans(
"DateStartReal").
': ';
2022 if ($objp->date_start_real && $objp->date_end_real) {
2023 print $langs->trans(
"DateStartReal").
': ';
2025 print
' - ';
2026 print $langs->trans(
"DateEndReal").
': ';
2029 if (!empty($objp->comment)) {
2030 print
" - ".$objp->comment;
2034 print
'<td class="center"> </td>';
2041 if ($user->hasRight(
'contrat',
'activer') && $action ==
'activateline' &&
$object->lines[$cursorline - 1]->id ==
GETPOSTINT(
'ligne') && is_object($objp)) {
2042 print
'<form name="active" action="'.$_SERVER[
"PHP_SELF"].
'" method="POST">';
2043 print
'<input type="hidden" name="token" value="'.newToken().
'">';
2044 print
'<input type="hidden" name="action" value="confirm_active">';
2045 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
2046 print
'<input type="hidden" name="id" value="'.$object->id.
'">';
2047 print
'<input type="hidden" name="ligne" value="'.GETPOSTINT(
'ligne').
'">';
2048 print
'<input type="hidden" name="confirm" value="yes">';
2050 print
'<table class="noborder tableforservicepart2'.($cursorline < $nbofservices ?
' boxtablenobottom' :
'').
' centpercent">';
2053 $dateactstart = $objp->date_start;
2056 } elseif (!$dateactstart) {
2057 $dateactstart = time();
2060 $dateactend = $objp->date_end;
2063 } elseif (!$dateactend) {
2064 if ($objp->fk_product > 0) {
2066 $product->fetch($objp->fk_product);
2067 if (!empty($product->duration_value) && !empty($product->duration_unit)) {
2068 $dateactend =
dol_time_plus_duree(time(), $product->duration_value, $product->duration_unit);
2073 print
'<tr class="oddeven">';
2074 print
'<td class="nohover">'.$langs->trans(
"DateServiceActivate").
'</td><td class="nohover">';
2075 print $form->selectDate($dateactstart,
'start', $usehm, $usehm, 0,
"active", 1, 0);
2077 print
'<td class="nohover">'.$langs->trans(
"DateEndPlanned").
'</td><td class="nohover">';
2078 print $form->selectDate($dateactend,
"end", $usehm, $usehm, 0,
"active", 1, 0);
2080 print
'<td class="center nohover">';
2085 print
'<tr class="oddeven">';
2086 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>';
2087 print
'<td class="nohover right">';
2088 print
'<input type="submit" class="button" name="activate" value="'.$langs->trans(
"Activate").
'"> ';
2089 print
'<input type="submit" class="button button-cancel" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
2098 if ($user->hasRight(
'contrat',
'activer') && $action ==
'unactivateline' &&
$object->lines[$cursorline - 1]->id ==
GETPOSTINT(
'ligne') && is_object($objp)) {
2102 print
'<!-- Form to disabled a line -->'.
"\n";
2103 print
'<form name="confirm_closeline" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&ligne='.
$object->lines[$cursorline - 1]->id.
'" method="post">';
2104 print
'<input type="hidden" name="token" value="'.newToken().
'">';
2105 print
'<input type="hidden" name="confirm" value="yes">';
2106 print
'<input type="hidden" name="action" value="confirm_closeline">';
2107 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
2109 print
'<table class="noborder tableforservicepart2'.($cursorline < $nbofservices ?
' boxtablenobottom' :
'').
' centpercent">';
2112 $dateactstart = $objp->date_start_real;
2115 } elseif (!$dateactstart) {
2116 $dateactstart = time();
2119 $dateactend = $objp->date_end_real;
2122 } elseif (!$dateactend) {
2123 if ($objp->fk_product > 0) {
2125 $product->fetch($objp->fk_product);
2126 $dateactend =
dol_time_plus_duree(time(), $product->duration_value, $product->duration_unit);
2130 if ($dateactend > $now) {
2134 print
'<tr class="oddeven"><td colspan="2" class="nohover">';
2135 if ($objp->statut >= 4) {
2136 if ($objp->statut == 4) {
2137 print $langs->trans(
"DateEndReal").
' ';
2138 print $form->selectDate($dateactend,
"end", $usehm, $usehm, ($objp->date_end_real > 0 ? 0 : 1),
"closeline", 1, 1);
2142 print
'<td class="center nohover">';
2145 print
'<tr class="oddeven">';
2146 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>';
2147 print
'<td class="nohover right">';
2148 print
'<input type="submit" class="button" name="close" value="'.$langs->trans(
"Disable").
'"> ';
2149 print
'<input type="submit" class="button button-cancel" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
2163 if ($user->hasRight(
'contrat',
'creer') && (
$object->statut == 0)) {
2167 print
' <form name="addproduct" id="addproduct" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.(($action !=
'editline') ?
'' :
'#line_'.
GETPOSTINT(
'lineid')).
'" method="POST">
2168 <input type="hidden" name="token" value="'.
newToken().
'">
2169 <input type="hidden" name="action" value="'.(($action !=
'editline') ?
'addline' :
'updateline').
'">
2170 <input type="hidden" name="mode" value="">
2171 <input type="hidden" name="id" value="'.
$object->id.
'">
2172 <input type="hidden" name="page_y" value="">
2173 <input type="hidden" name="backtopage" value="'.$backtopage.
'">
2176 print
'<div class="div-table-responsive-no-min">';
2177 print
'<table id="tablelines" class="noborder noshadow" width="100%">';
2180 if ($action !=
'editline') {
2181 $forcetoshowtitlelines = 1;
2182 if (empty(
$object->multicurrency_code)) {
2188 $parameters = array();
2189 $reshook = $hookmanager->executeHooks(
'formAddObjectLine', $parameters,
$object, $action);
2193 if (empty($reshook)) {
2194 $object->formAddObjectLine(1, $mysoc, $soc);
2206 if (
GETPOST(
'modelselected')) {
2207 $action =
'presend';
2213 if ($user->socid == 0 && $action !=
'presend' && $action !=
'editline') {
2214 print
'<div class="tabsAction">';
2216 $parameters = array();
2217 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters,
$object, $action);
2219 if (empty($reshook)) {
2223 'class' =>
'classfortooltip'
2228 if (empty($user->socid)) {
2229 if (
$object->status == $object::STATUS_VALIDATED) {
2230 if ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') || $user->hasRight(
'contrat',
'creer'))) {
2231 print
dolGetButtonAction(
'', $langs->trans(
'SendMail'),
'default', $_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=presend&token='.
newToken().
'&mode=init#formmailbeforetitle',
'',
true, $params);
2233 print
dolGetButtonAction(
'', $langs->trans(
'SendMail'),
'default',
'#',
'',
false, $params);
2238 if (
$object->status == $object::STATUS_DRAFT && $nbofservices) {
2239 if ($user->hasRight(
'contrat',
'creer')) {
2240 unset($params[
'attr'][
'title']);
2241 print
dolGetButtonAction($langs->trans(
'Validate'),
'',
'default', $_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=valid&token='.
newToken(),
'',
true, $params);
2243 $params[
'attr'][
'title'] = $langs->trans(
"NotEnoughPermissions");
2244 print
dolGetButtonAction($langs->trans(
'Validate'),
'',
'default',
'#',
'',
false, $params);
2247 if (
$object->status == $object::STATUS_VALIDATED) {
2248 if ($user->hasRight(
'contrat',
'creer')) {
2249 unset($params[
'attr'][
'title']);
2250 print
dolGetButtonAction($langs->trans(
'Modify'),
'',
'default', $_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=reopen&token='.
newToken(),
'',
true, $params);
2252 $params[
'attr'][
'title'] = $langs->trans(
"NotEnoughPermissions");
2253 print
dolGetButtonAction($langs->trans(
'Modify'),
'',
'default',
'#',
'',
false, $params);
2258 $arrayofcreatebutton = array();
2259 if (isModEnabled(
'order') &&
$object->status > 0 &&
$object->nbofservicesclosed < $nbofservices) {
2260 $arrayofcreatebutton[] = array(
2261 'url' =>
'/commande/card.php?action=create&token='.
newToken().
'&origin='.
$object->element.
'&originid='.
$object->id.
'&socid='.
$object->thirdparty->id,
2262 'label' => $langs->trans(
'AddOrder'),
2264 'perm' => $user->hasRight(
'commande',
'creer') ?
true : false,
2268 if (isModEnabled(
'invoice') &&
$object->status > 0 && $soc->client > 0) {
2269 $arrayofcreatebutton[] = array(
2270 'url' =>
'/compta/facture/card.php?action=create&origin='.
$object->element.
'&originid='.
$object->id.
'&socid='.
$object->thirdparty->id,
2271 'label' => $langs->trans(
'CreateBill'),
2273 'perm' => $user->hasRight(
'facture',
'creer') ?
true : false,
2277 if (isModEnabled(
'supplier_invoice') &&
$object->status > 0 && $soc->fournisseur == 1) {
2278 $langs->load(
"suppliers");
2279 $arrayofcreatebutton[] = array(
2280 'url' =>
'/fourn/facture/card.php?action=create&origin='.
$object->element.
'&originid='.
$object->id.
'&socid='.
$object->thirdparty->id,
2281 'label' => $langs->trans(
'AddSupplierInvoice'),
2283 'perm' => $user->hasRight(
'fournisseur',
'facture',
'creer') ?
true : false,
2287 if (count($arrayofcreatebutton)) {
2288 unset($params[
'attr'][
'title']);
2289 print
dolGetButtonAction(
'', $langs->trans(
"Create"),
'default', $arrayofcreatebutton,
'',
true, $params);
2292 $arrayforbutaction = array();
2293 if (
$object->nbofservicesclosed > 0 ||
$object->nbofserviceswait > 0) {
2294 $arrayforbutaction[] = array(
2295 'url' =>
'/contrat/card.php?id='.
$object->id.
'&action=activate&token='.
newToken(),
2296 'label' => $langs->trans(
'ActivateAllContracts'),
2298 'perm' => $user->hasRight(
'contrat',
'activer'),
2302 if (
$object->nbofservicesclosed < $nbofservices) {
2303 $arrayforbutaction[] = array(
2304 'url' =>
'/contrat/card.php?id='.
$object->id.
'&action=close&token='.
newToken(),
2305 'label' => $langs->trans(
'CloseAllContracts'),
2307 'perm' => $user->hasRight(
'contrat',
'desactiver') ?
true : false,
2312 if (count($arrayforbutaction)) {
2313 unset($params[
'attr'][
'title']);
2314 print
dolGetButtonAction(
'', $langs->trans(
"Services"),
'default', $arrayforbutaction,
'',
true, $params);
2318 if ($action ==
'showclosedlines') {
2319 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>';
2321 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>';
2326 if (
$object->status > Contrat::STATUS_DRAFT) {
2327 if (
$object->signed_status != Contrat::$SIGNED_STATUSES[
'STATUS_SIGNED_ALL']) {
2328 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>';
2330 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>';
2335 if ($user->hasRight(
'contrat',
'creer')) {
2336 unset($params[
'attr'][
'title']);
2341 unset($params[
'attr'][
'title']);
2342 print
dolGetButtonAction($langs->trans(
'Delete'),
'',
'delete', $_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=delete&token='.
newToken(),
'', $permissiontodelete, $params);
2348 if ($action !=
'presend') {
2349 print
'<div class="fichecenter"><div class="fichehalfleft">';
2356 $urlsource = $_SERVER[
"PHP_SELF"].
"?id=".
$object->id;
2357 $genallowed = $user->hasRight(
'contrat',
'lire');
2358 $delallowed = $user->hasRight(
'contrat',
'creer');
2361 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);
2365 $tmparray = $form->showLinkToObjectBlock(
$object, array(), array(
'contrat'), 1);
2366 $linktoelem = $tmparray[
'linktoelem'];
2367 $htmltoenteralink = $tmparray[
'htmltoenteralink'];
2368 print $htmltoenteralink;
2370 $somethingshown = $form->showLinkedObjectBlock(
$object, $linktoelem);
2374 print
'<br><!-- Link to sign -->';
2375 require_once DOL_DOCUMENT_ROOT.
'/core/lib/signature.lib.php';
2377 print showOnlineSignatureUrl(
'contract',
$object->ref,
$object).
'<br>';
2380 print
'</div><div class="fichehalfright">';
2384 $morehtmlcenter =
'<div class="nowraponall">';
2385 $morehtmlcenter .=
dolGetButtonTitle($langs->trans(
'FullConversation'),
'',
'fa fa-comments imgforviewmode', DOL_URL_ROOT.
'/contrat/messaging.php?id='.
$object->id);
2386 $morehtmlcenter .=
dolGetButtonTitle($langs->trans(
'SeeAll'),
'',
'fa fa-bars imgforviewmode', DOL_URL_ROOT.
'/contrat/agenda.php?id='.
$object->id);
2387 $morehtmlcenter .=
'</div>';
2391 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
2393 $somethingshown = $formactions->showactions(
$object,
'contract', $socid, 1,
'listactions', $MAXEVENT,
'', $morehtmlcenter);
2395 print
'</div></div>';
2399 $modelmail =
'contract';
2400 $defaulttopic =
'SendContractRef';
2401 $diroutput =
$conf->contrat->multidir_output[
$object->entity];
2402 $trackid =
'con'.$object->id;
2404 include DOL_DOCUMENT_ROOT.
'/core/tpl/card_presend.tpl.php';
2415if (isModEnabled(
'margin') && $action ==
'editline') {
2416 print
"\n".
'<script type="text/javascript">'.
"\n";
2418 $(document).ready(
function() {
2419 var idprod = $(
"input[name='idprod']").val();
2420 var fournprice = $(
"input[name='fournprice']").val();
2421 var token =
'<?php echo currentToken(); ?>';
2423 $.post(
'<?php echo DOL_URL_ROOT; ?>/fourn/ajax/getSupplierPrices.php', {
2427 if (data.length > 0) {
2430 $(data).each(
function() {
2431 options +=
'<option value="'+this.
id+
'" price="'+this.
price+
'"';
2432 if (fournprice > 0) {
2433 if (this.
id == fournprice) {
2434 options +=
' selected';
2435 $(
"#buying_price").val(this.price);
2439 options +=
'>'+this.label+
'</option>';
2441 options +=
'<option value=null'+(trouve?
'':
' selected')+
'><?php echo $langs->trans("InputPrice"); ?></option>';
2442 $(
"#fournprice").html(options);
2444 $(
"#buying_price").hide();
2445 $(
"#fournprice").show();
2448 $(
"#buying_price").show();
2450 $(
"#fournprice").change(
function() {
2451 var selval = $(
this).find(
'option:selected').attr(
"price");
2453 $(
"#buying_price").val(selval).hide();
2455 $(
'#buying_price').show();
2459 $(
"#fournprice").hide();
2460 $(
'#buying_price').show();
2466 $(
"#fournprice").hide();
2467 $(
'#buying_price').show();
2471 print
"\n".
'<script type="text/javascript">'.
"\n";
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)
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_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.