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';
59$langs->loadLangs(array(
"contracts",
"orders",
"companies",
"bills",
"products",
'compta',
'propal'));
61$action =
GETPOST(
'action',
'aZ09');
62$confirm =
GETPOST(
'confirm',
'alpha');
63$cancel =
GETPOST(
'cancel',
'alpha');
64$backtopage =
GETPOST(
'backtopage',
'alpha');
69$origin =
GETPOST(
'origin',
'alpha');
83$usehm = (
getDolGlobalString(
'MAIN_USE_HOURMIN_IN_DATE_RANGE') ? $conf->global->MAIN_USE_HOURMIN_IN_DATE_RANGE : 0);
87 $socid = $user->socid;
91$hookmanager->initHooks(array(
'contractcard',
'globalcard'));
100if ($id > 0 || !empty($ref) && $action !=
'add') {
101 $ret =
$object->fetch($id, $ref);
103 $ret =
$object->fetch_thirdparty();
111$extrafields->fetch_name_optionals_label(
$object->table_element);
114$extralabelslines = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
116$permissionnote = $user->hasRight(
'contrat',
'creer');
117$permissiondellink = $user->hasRight(
'contrat',
'creer');
118$permissiontodelete = ($user->hasRight(
'contrat',
'creer') &&
$object->status == $object::STATUS_DRAFT) || $user->hasRight(
'contrat',
'supprimer');
119$permissiontoadd = $user->hasRight(
'contrat',
'creer');
120$permissiontoedit = $permissiontoadd;
121$permissiontoactivate = $user->hasRight(
'contrat',
'activer');
131$parameters = array(
'socid' => $socid);
132$reshook = $hookmanager->executeHooks(
'doActions', $parameters,
$object, $action);
136if (empty($reshook)) {
137 $backurlforlist = DOL_URL_ROOT.
'/contrat/list.php';
139 if (empty($backtopage) || ($cancel && empty($id))) {
140 if (empty($backtopage) || ($cancel && strpos($backtopage,
'__ID__'))) {
141 if (empty($id) && (($action !=
'add' && $action !=
'create') || $cancel)) {
142 $backtopage = $backurlforlist;
144 $backtopage = DOL_URL_ROOT.
'/contrat/card.php?id='.((!empty($id) &&
$id > 0) ? $id :
'__ID__');
150 if (!empty($backtopageforcancel)) {
151 header(
"Location: ".$backtopageforcancel);
153 } elseif (!empty($backtopage)) {
154 header(
"Location: ".$backtopage);
160 include DOL_DOCUMENT_ROOT.
'/core/actions_setnotes.inc.php';
162 include DOL_DOCUMENT_ROOT.
'/core/actions_dellink.inc.php';
164 include DOL_DOCUMENT_ROOT.
'/core/actions_lineupdown.inc.php';
166 if ($action ==
'confirm_active' && $confirm ==
'yes' && $permissiontoactivate) {
179 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
184 } elseif ($action ==
'confirm_sign' && $confirm ==
'yes' && $user->hasRight(
'contract',
'creer')) {
185 $result =
$object->setSignedStatus($user,
GETPOSTINT(
'signed_status'), 0,
'CONTRACT_MODIFY');
187 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id);
192 } elseif ($action ==
'confirm_unsign' && $confirm ==
'yes' && $user->hasRight(
'contract',
'creer')) {
193 $result =
$object->setSignedStatus($user, Contrat::$SIGNED_STATUSES[
'STATUS_NO_SIGNATURE'], 0,
'CONTRACT_MODIFY');
195 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id);
200 } elseif ($action ==
'confirm_closeline' && $confirm ==
'yes' && $permissiontoactivate) {
207 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"DateEnd")),
null,
'errors');
212 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
220 if (
GETPOST(
'mode') ==
'predefined') {
232 $date_start_update =
'';
233 $date_end_update =
'';
234 $date_start_real_update =
'';
235 $date_end_real_update =
'';
236 if (
GETPOST(
'date_start_updatemonth') &&
GETPOST(
'date_start_updateday') &&
GETPOST(
'date_start_updateyear')) {
239 if (
GETPOST(
'date_end_updatemonth') &&
GETPOST(
'date_end_updateday') &&
GETPOST(
'date_end_updateyear')) {
242 if (
GETPOST(
'date_start_real_updatemonth') &&
GETPOST(
'date_start_real_updateday') &&
GETPOST(
'date_start_real_updateyear')) {
243 $date_start_real_update =
dol_mktime(
GETPOST(
'date_start_real_updatehour'),
GETPOST(
'date_start_real_updatemin'), 0,
GETPOST(
'date_start_real_updatemonth'),
GETPOST(
'date_start_real_updateday'),
GETPOST(
'date_start_real_updateyear'));
245 if (
GETPOST(
'date_end_real_updatemonth') &&
GETPOST(
'date_end_real_updateday') &&
GETPOST(
'date_end_real_updateyear')) {
246 $date_end_real_update =
dol_mktime(
GETPOST(
'date_end_real_updatehour'),
GETPOST(
'date_end_real_updatemin'), 0,
GETPOST(
'date_end_real_updatemonth'),
GETPOST(
'date_end_real_updateday'),
GETPOST(
'date_end_real_updateyear'));
253 if ($action ==
'add' && $user->hasRight(
'contrat',
'creer')) {
255 if (empty($datecontrat)) {
257 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Date")),
null,
'errors');
262 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"ThirdParty")),
null,
'errors');
268 $ret = $extrafields->setOptionalsFromPost(
null,
$object);
276 $object->date_contrat = $datecontrat;
290 if (!empty($origin) && !empty($originid)) {
292 $element = $subelement = $origin;
293 if (preg_match(
'/^([^_]+)_([^_]+)/i', $origin, $regs)) {
295 $subelement = $regs[2];
299 if ($element ==
'order') {
300 $element = $subelement =
'commande';
302 if ($element ==
'propal') {
303 $element =
'comm/propal';
304 $subelement =
'propal';
306 if ($element ==
'invoice' || $element ==
'facture') {
307 $element =
'compta/facture';
308 $subelement =
'facture';
312 $object->origin_id = $originid;
317 $object->linked_objects = array_merge(
$object->linked_objects,
GETPOST(
'other_linked_objects',
'array:int'));
324 $classname = ucfirst($subelement);
325 $srcobject =
new $classname($db);
326 '@phan-var-force Commande|Propal|Facture $srcobject';
329 $result = $srcobject->fetch(
$object->origin_id);
331 $srcobject->fetch_thirdparty();
332 $lines = $srcobject->lines;
333 if (empty($lines) && method_exists($srcobject,
'fetch_lines')) {
334 $srcobject->fetch_lines();
335 $lines = $srcobject->lines;
339 $num = count($lines);
341 for ($i = 0; $i < $num; $i++) {
342 $product_type = ($lines[$i]->product_type ? $lines[$i]->product_type : 0);
344 if ($product_type == 1 || (
getDolGlobalString(
'CONTRACT_SUPPORT_PRODUCTS') && in_array($product_type, array(0, 1)))) {
346 if ($lines[$i]->fk_product > 0) {
347 $product_static =
new Product($db);
352 $prod->id = $lines[$i]->fk_product;
353 $prod->getMultiLangs();
355 $outputlangs = $langs;
357 if (empty($newlang) &&
GETPOST(
'lang_id',
'aZ09')) {
358 $newlang =
GETPOST(
'lang_id',
'aZ09');
360 if (empty($newlang)) {
361 $newlang = $srcobject->thirdparty->default_lang;
363 if (!empty($newlang)) {
365 $outputlangs->setDefaultLang($newlang);
368 $label = (!empty($prod->multilangs[$outputlangs->defaultlang][
"libelle"])) ? $prod->multilangs[$outputlangs->defaultlang][
"libelle"] : $lines[$i]->product_label;
370 $label = $lines[$i]->product_label;
372 $desc = ($lines[$i]->desc && $lines[$i]->desc != $lines[$i]->label) ?
dol_htmlentitiesbr($lines[$i]->desc) :
'';
378 $array_options = array();
380 if (method_exists($lines[$i],
'fetch_optionals')) {
381 $lines[$i]->fetch_optionals();
382 $array_options = $lines[$i]->array_options;
385 $txtva = $lines[$i]->vat_src_code ? $lines[$i]->tva_tx.
' ('.$lines[$i]->vat_src_code.
')' : $lines[$i]->tva_tx;
393 $lines[$i]->subprice,
398 $lines[$i]->fk_product,
399 $lines[$i]->remise_percent,
400 $lines[$i]->date_start,
401 $lines[$i]->date_end,
404 $lines[$i]->info_bits,
405 $lines[$i]->fk_fournprice,
424 $parameters = array(
'objFrom' => $srcobject);
425 $reshook = $hookmanager->executeHooks(
'createFrom', $parameters,
$object, $action);
439 $result =
$object->create($user);
441 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
449 } elseif ($action ==
'classin' && $user->hasRight(
'contrat',
'creer')) {
451 } elseif ($action ==
'addline' && $user->hasRight(
'contrat',
'creer')) {
455 $product_desc = (GETPOSTISSET(
'dp_desc') ?
GETPOST(
'dp_desc',
'restricthtml') :
'');
458 $price_ht_devise =
'';
460 $price_ttc_devise =
'';
462 $rang = count(
$object->lines) + 1;
464 if (
GETPOST(
'price_ht') !==
'') {
467 if (
GETPOST(
'multicurrency_price_ht') !==
'') {
470 if (
GETPOST(
'price_ttc') !==
'') {
473 if (
GETPOST(
'multicurrency_price_ttc') !==
'') {
477 if (
GETPOST(
'prod_entry_mode',
'alpha') ==
'free') {
483 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"ProductOrService")),
null,
'errors');
488 $tva_tx =
GETPOST(
'tva_tx',
'alpha');
491 $remise_percent = (GETPOSTISSET(
'remise_percent'.$predef) ?
price2num(
GETPOST(
'remise_percent'.$predef),
'', 2) : 0);
492 if (empty($remise_percent)) {
497 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Qty")),
null,
'errors');
500 if (
GETPOST(
'prod_entry_mode',
'alpha') ==
'free' && (empty($idprod) || $idprod < 0) && empty($product_desc)) {
501 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Description")),
null,
'errors');
507 if (!empty($date_start) && !empty($date_end) && $date_start > $date_end) {
508 setEventMessages($langs->trans(
"Error").
': '.$langs->trans(
"DateStartPlanned").
' > '.$langs->trans(
"DateEndPlanned"),
null,
'errors');
513 $extralabelsline = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
514 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line, $predef);
516 if (is_array($extralabelsline)) {
518 foreach ($extralabelsline as $key => $value) {
519 unset($_POST[
"options_".$key]);
528 $price_base_type =
'';
534 $prod->fetch($idprod);
543 $price_min = $prod->price_min;
544 $price_min_ttc = $prod->price_min_ttc;
548 $price_min = $prod->multiprices_min[
$object->thirdparty->price_level];
549 $price_min_ttc = $prod->multiprices_min_ttc[
$object->thirdparty->price_level];
552 require_once DOL_DOCUMENT_ROOT.
'/product/class/productcustomerprice.class.php';
556 $filter = array(
't.fk_product' => $prod->id,
't.fk_soc' =>
$object->thirdparty->id);
558 $result = $prodcustprice->fetchAll(
'',
'', 0, 0, $filter);
560 if (count($prodcustprice->lines) > 0) {
561 $price_min =
price($prodcustprice->lines[0]->price_min);
562 $price_min_ttc =
price($prodcustprice->lines[0]->price_min_ttc);
575 $tmpvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', $tva_tx));
576 $tmpprodvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', (
string) $prod->tva_tx));
579 if (!empty($price_ht) || $price_ht ===
'0') {
581 $pu_ttc =
price2num((
float) $pu_ht * (1 + ((
float) $tmpvat / 100)),
'MU');
582 $price_base_type =
'HT';
583 } elseif (!empty($price_ttc) || $price_ttc ===
'0') {
585 $pu_ht =
price2num((
float) $pu_ttc / (1 + ((
float) $tmpvat / 100)),
'MU');
586 $price_base_type =
'TTC';
589 $desc = $prod->description;
597 $desc = $product_desc;
602 $fk_unit = $prod->fk_unit;
606 $tva_npr = (preg_match(
'/\*/', $tva_tx) ? 1 : 0);
607 if (empty($tva_tx)) {
610 $tva_tx = str_replace(
'*',
'', $tva_tx);
611 $desc = $product_desc;
613 $pu_ht_devise =
price2num($price_ht_devise,
'MU');
614 $pu_ttc_devise =
price2num($price_ttc_devise,
'MU');
616 $tmpvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', $tva_tx));
619 if (!empty($price_ht) || $price_ht ===
'0') {
621 $pu_ttc =
price2num((
float) $pu_ht * (1 + ((
float) $tmpvat / 100)),
'MU');
622 $price_base_type =
'HT';
623 } elseif (!empty($price_ttc) || $price_ttc ===
'0') {
625 $pu_ht =
price2num((
float) $pu_ttc / (1 + ((
float) $tmpvat / 100)),
'MU');
626 $price_base_type =
'TTC';
634 $fk_fournprice =
GETPOST(
'fournprice');
636 $pa_ht =
GETPOST(
'buying_price');
646 if (((
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && !$user->hasRight(
'produit',
'ignore_price_min_advance'))
648 $object->error = $langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, -1, $conf->currency));
677 $outputlangs = $langs;
680 $newlang =
GETPOST(
'lang_id',
'aZ09');
683 $newlang =
$object->thirdparty->default_lang;
685 if (!empty($newlang)) {
687 $outputlangs->setDefaultLang($newlang);
692 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
695 unset($_POST[
'prod_entry_mode']);
697 unset($_POST[
'qty']);
698 unset($_POST[
'type']);
699 unset($_POST[
'remise_percent']);
700 unset($_POST[
'price_ht']);
701 unset($_POST[
'multicurrency_price_ht']);
702 unset($_POST[
'price_ttc']);
703 unset($_POST[
'tva_tx']);
704 unset($_POST[
'product_ref']);
705 unset($_POST[
'product_label']);
706 unset($_POST[
'product_desc']);
707 unset($_POST[
'fournprice']);
708 unset($_POST[
'buying_price']);
709 unset($_POST[
'np_marginRate']);
710 unset($_POST[
'np_markRate']);
711 unset($_POST[
'dp_desc']);
712 unset($_POST[
'idprod']);
714 unset($_POST[
'date_starthour']);
715 unset($_POST[
'date_startmin']);
716 unset($_POST[
'date_startsec']);
717 unset($_POST[
'date_startday']);
718 unset($_POST[
'date_startmonth']);
719 unset($_POST[
'date_startyear']);
720 unset($_POST[
'date_endhour']);
721 unset($_POST[
'date_endmin']);
722 unset($_POST[
'date_endsec']);
723 unset($_POST[
'date_endday']);
724 unset($_POST[
'date_endmonth']);
725 unset($_POST[
'date_endyear']);
730 } elseif ($action ==
'updateline' && $user->hasRight(
'contrat',
'creer') && !
GETPOST(
'cancel',
'alpha')) {
734 if (!empty($date_start_update) && !empty($date_end_update) && $date_start_update > $date_end_update) {
735 setEventMessages($langs->trans(
"Error").
': '.$langs->trans(
"DateStartPlanned").
' > '.$langs->trans(
"DateEndPlanned"),
null,
'errors');
736 $action =
'editline';
742 if ($objectline->fetch($idline) < 0) {
746 $objectline->fetch_optionals();
748 $objectline->oldcopy =
dol_clone($objectline, 2);
756 if ($date_start_real_update ==
'') {
757 $date_start_real_update = $objectline->date_start_real;
759 if ($date_end_real_update ==
'') {
760 $date_end_real_update = $objectline->date_end_real;
763 $vat_rate =
GETPOST(
'eltva_tx',
'alpha');
766 if (preg_match(
'/\*/', $vat_rate)) {
771 $vat_rate = str_replace(
'*',
'', $vat_rate);
780 if (preg_match(
'/\((.*)\)/', $txtva, $reg)) {
781 $vat_src_code = $reg[1];
782 $txtva = preg_replace(
'/\s*\(.*\)/',
'', $txtva);
799 if ($remise_percent > 0) {
800 $remise = round(((
float) $price_ht * (
float) $remise_percent / 100), 2);
803 $objectline->fk_product =
GETPOSTINT(
'idprod');
804 $objectline->description =
GETPOST(
'product_desc',
'restricthtml');
805 $objectline->price_ht = $price_ht;
808 $objectline->remise_percent = $remise_percent;
809 $objectline->tva_tx = ($txtva ? $txtva : 0);
810 $objectline->vat_src_code = $vat_src_code;
811 $objectline->localtax1_tx = is_numeric($localtax1_tx) ? $localtax1_tx : 0;
812 $objectline->localtax2_tx = is_numeric($localtax2_tx) ? $localtax2_tx : 0;
813 $objectline->date_start = $date_start_update;
814 $objectline->date_start_real = $date_start_real_update;
815 $objectline->date_end = $date_end_update;
816 $objectline->date_end_real = $date_end_real_update;
817 $objectline->user_closing_id = $user->id;
819 $objectline->pa_ht = $pa_ht;
825 $objectline->fk_unit =
null;
829 $extralabelsline = $extrafields->fetch_name_optionals_label($objectline->table_element);
830 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line, $predef);
832 if (is_array($array_options) && count($array_options) > 0) {
834 foreach ($array_options as $key => $value) {
835 $objectline->array_options[$key] = $array_options[$key];
841 $result = $objectline->update($user);
844 $action =
'editline';
845 $_GET[
'rowid'] =
GETPOST(
'elrowid');
855 } elseif ($action ==
'confirm_deleteline' && $confirm ==
'yes' && $user->hasRight(
'contrat',
'creer')) {
859 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
864 } elseif ($action ==
'confirm_valid' && $confirm ==
'yes' && $user->hasRight(
'contrat',
'creer')) {
865 $result =
$object->validate($user);
870 $outputlangs = $langs;
873 $newlang =
GETPOST(
'lang_id',
'aZ09');
876 $newlang =
$object->thirdparty->default_lang;
878 if (!empty($newlang)) {
880 $outputlangs->setDefaultLang($newlang);
885 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
890 } elseif ($action ==
'reopen' && $user->hasRight(
'contrat',
'creer')) {
891 $result =
$object->reopen($user);
895 } elseif ($action ==
'confirm_close' && $confirm ==
'yes' && $user->hasRight(
'contrat',
'creer')) {
897 $result =
$object->closeAll($user);
901 } elseif ($action ==
'confirm_activate' && $confirm ==
'yes' && $user->hasRight(
'contrat',
'creer')) {
904 $comment =
GETPOST(
'comment',
'alpha');
905 $result =
$object->activateAll($user, $date_start, 0, $comment, $date_end);
909 } elseif ($action ==
'confirm_delete' && $confirm ==
'yes' && $user->hasRight(
'contrat',
'supprimer')) {
910 $result =
$object->delete($user);
912 header(
"Location: list.php?restore_lastsearch_values=1");
917 } elseif ($action ==
'confirm_move' && $confirm ==
'yes' && $user->hasRight(
'contrat',
'creer')) {
920 $result = $contractline->fetch(
GETPOSTINT(
'lineid'));
921 $contractline->fk_contrat =
GETPOSTINT(
'newcid');
922 $result = $contractline->update($user, 1);
924 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$id);
930 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentities(
"RefNewContract")),
null,
'errors');
932 } elseif ($action ==
'update_extras' && $permissiontoadd) {
935 $attribute =
GETPOST(
'attribute',
'alphanohtml');
938 $ret = $extrafields->setOptionalsFromPost(
null,
$object, $attribute);
945 $result =
$object->updateExtraField($attribute,
'CONTRACT_MODIFY');
953 $action =
'edit_extras';
955 } elseif ($action ==
'setref_supplier' && $permissiontoadd) {
959 $result =
$object->setValueFrom(
'ref_supplier',
GETPOST(
'ref_supplier',
'alpha'),
'',
null,
'text',
'', $user,
'CONTRACT_MODIFY');
962 $action =
'editref_supplier';
964 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
968 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$id);
971 } elseif ($action ==
'setref_customer' && $permissiontoadd) {
975 $result =
$object->setValueFrom(
'ref_customer',
GETPOST(
'ref_customer',
'alpha'),
'',
null,
'text',
'', $user,
'CONTRACT_MODIFY');
978 $action =
'editref_customer';
980 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
984 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$id);
987 } elseif ($action ==
'setref' && $permissiontoadd) {
996 $result =
$object->setValueFrom(
'ref',
GETPOST(
'ref',
'alpha'),
'',
null,
'text',
'', $user,
'CONTRACT_MODIFY');
1001 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
1008 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
1012 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$id);
1015 } elseif ($action ==
'setdate_contrat' && $permissiontoadd) {
1017 $result =
$object->fetch($id);
1022 $result =
$object->setValueFrom(
'date_contrat', $datacontrat,
'',
null,
'date',
'', $user,
'CONTRACT_MODIFY');
1025 $action =
'editdate_contrat';
1027 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
1031 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$id);
1037 include DOL_DOCUMENT_ROOT.
'/core/actions_printing.inc.php';
1040 $upload_dir = $conf->contrat->multidir_output[!empty(
$object->entity) ?
$object->entity : $conf->entity];
1041 include DOL_DOCUMENT_ROOT.
'/core/actions_builddoc.inc.php';
1044 $triggersendname =
'CONTRACT_SENTBYMAIL';
1046 $mode =
'emailfromcontract';
1047 $trackid =
'con'.$object->id;
1048 include DOL_DOCUMENT_ROOT.
'/core/actions_sendmails.inc.php';
1052 if ($action ==
'addcontact' && $user->hasRight(
'contrat',
'creer')) {
1055 $result =
$object->add_contact($contactid, $typeid,
GETPOST(
"source",
'aZ09'));
1058 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
1061 if (
$object->error ==
'DB_ERROR_RECORD_ALREADY_EXISTS') {
1062 $langs->load(
"errors");
1063 setEventMessages($langs->trans(
"ErrorThisContactIsAlreadyDefinedAsThisType"),
null,
'errors');
1068 } elseif ($action ==
'swapstatut' && $user->hasRight(
'contrat',
'creer')) {
1071 } elseif ($action ==
'deletecontact' && $user->hasRight(
'contrat',
'creer')) {
1076 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
1085 if ($action ==
'confirm_clone' && $confirm ==
'yes' && $user->hasRight(
'contrat',
'creer')) {
1087 setEventMessages($langs->trans(
"NoCloneOptionsSpecified"),
null,
'errors');
1090 $result =
$object->createFromClone($user, $socid);
1092 header(
"Location: ".$_SERVER[
'PHP_SELF'].
'?id='.$result);
1095 if (count(
$object->errors) > 0) {
1110$title =
$object->ref.
" - ".$langs->trans(
'Contract');
1111if ($action ==
'create') {
1112 $title = $langs->trans(
"NewContract");
1114$help_url =
'EN:Module_Contracts|FR:Module_Contrat|ES:Contratos_de_servicio';
1116llxHeader(
'', $title, $help_url,
'', 0, 0,
'',
'',
'',
'mod-contrat page-card');
1118$form =
new Form($db);
1120if (isModEnabled(
'project')) {
1125$module = (
getDolGlobalString(
'CONTRACT_ADDON') ? $conf->global->CONTRACT_ADDON :
'mod_contract_serpis');
1126if (substr($module, 0, 13) ==
'mod_contract_' && substr($module, -3) ==
'php') {
1127 $module = substr($module, 0,
dol_strlen($module) - 4);
1130$modCodeContract =
null;
1132 $modCodeContract =
new $module();
1133 '@phan-var-force ModelNumRefContracts $modCodeContract';
1137if ($action ==
'create') {
1143 $soc->fetch($socid);
1149 $element = $subelement =
GETPOST(
'origin');
1150 if (preg_match(
'/^([^_]+)_([^_]+)/i',
GETPOST(
'origin'), $regs)) {
1151 $element = $regs[1];
1152 $subelement = $regs[2];
1155 if ($element ==
'project') {
1159 if ($element ==
'order' || $element ==
'commande') {
1160 $element = $subelement =
'commande';
1162 if ($element ==
'propal') {
1163 $element =
'comm/propal';
1164 $subelement =
'propal';
1166 if ($element ==
'invoice' || $element ==
'facture') {
1167 $element =
'compta/facture';
1168 $subelement =
'facture';
1173 $classname = ucfirst($subelement);
1174 $objectsrc =
new $classname($db);
1175 '@phan-var-force Commande|Propal|Facture $objectsrc';
1176 $objectsrc->fetch($originid);
1177 if (empty($objectsrc->lines) && method_exists($objectsrc,
'fetch_lines')) {
1178 $objectsrc->fetch_lines();
1180 $objectsrc->fetch_thirdparty();
1183 $objectsrc->fetch_optionals();
1184 $object->array_options = $objectsrc->array_options;
1186 $projectid = (!empty($objectsrc->fk_project) ? $objectsrc->fk_project :
'');
1188 $soc = $objectsrc->thirdparty;
1190 $note_private = (!empty($objectsrc->note_private) ? $objectsrc->note_private :
'');
1191 $note_public = (!empty($objectsrc->note_public) ? $objectsrc->note_public :
'');
1194 $srccontactslist = $objectsrc->liste_contact(-1,
'external', 1);
1198 $note_private =
GETPOST(
"note_private",
"alpha");
1199 $note_public =
GETPOST(
"note_public",
"alpha");
1204 print
'<form name="form_contract" action="'.$_SERVER[
"PHP_SELF"].
'" method="post">';
1205 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1206 print
'<input type="hidden" name="action" value="add">';
1207 print
'<input type="hidden" name="socid" value="'.$soc->id.
'">'.
"\n";
1208 print
'<input type="hidden" name="remise_percent" value="0">';
1209 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
1213 print
'<table class="border centpercent">';
1216 print
'<tr><td class="titlefieldcreate fieldrequired">'.$langs->trans(
'Ref').
'</td><td>';
1217 if (!empty($modCodeContract->code_auto)) {
1218 $tmpcode = $langs->trans(
"Draft");
1220 $tmpcode =
'<input name="ref" class="maxwidth100" maxlength="128" value="'.dol_escape_htmltag(
GETPOST(
'ref') ?
GETPOST(
'ref') : $tmpcode).
'">';
1226 print
'<tr><td>'.$langs->trans(
'RefCustomer').
'</td>';
1227 print
'<td><input type="text" class="maxwidth150" name="ref_customer" id="ref_customer" value="'.dol_escape_htmltag(
GETPOST(
'ref_customer',
'alpha')).
'"></td></tr>';
1230 print
'<tr><td>'.$langs->trans(
'RefSupplier').
'</td>';
1231 print
'<td><input type="text" class="maxwidth150" name="ref_supplier" id="ref_supplier" value="'.dol_escape_htmltag(
GETPOST(
'ref_supplier',
'alpha')).
'"></td></tr>';
1235 print
'<td class="fieldrequired">'.$langs->trans(
'ThirdParty').
'</td>';
1238 print $soc->getNomUrl(1);
1239 print
'<input type="hidden" name="socid" value="'.$soc->id.
'">';
1243 print
img_picto(
'',
'company',
'class="pictofixedwidth"');
1244 print $form->select_company(
'',
'socid',
'',
'SelectThirdParty', 1, 0, array(), 0,
'minwidth300 widthcentpercentminusxx maxwidth500');
1245 print
' <a href="'.DOL_URL_ROOT.
'/societe/card.php?action=create&backtopage='.urlencode($_SERVER[
"PHP_SELF"].
'?action=create').
'"><span class="fa fa-plus-circle valignmiddle paddingleft" title="'.$langs->trans(
"AddThirdParty").
'"></span></a>';
1252 print
'<tr><td>'.$langs->trans(
'Discounts').
'</td><td>';
1253 if ($soc->remise_percent) {
1254 print $langs->trans(
"CompanyHasRelativeDiscount", $soc->remise_percent).
' ';
1256 print
'<span class="hideonsmartphone">'.$langs->trans(
"CompanyHasNoRelativeDiscount").
'. </span>';
1258 $absolute_discount = $soc->getAvailableDiscounts();
1259 if ($absolute_discount) {
1260 print $langs->trans(
"CompanyHasAbsoluteDiscount",
price($absolute_discount), $langs->trans(
"Currency".$conf->currency)).
'.';
1262 print
'<span class="hideonsmartphone">'.$langs->trans(
"CompanyHasNoAbsoluteDiscount").
'.</span>';
1268 print
'<tr><td class="nowrap"><span class="fieldrequired">'.$langs->trans(
"TypeContact_contrat_internal_SALESREPFOLL").
'</span></td><td>';
1269 print
img_picto(
'',
'user',
'class="pictofixedwidth"');
1270 print $form->select_dolusers(
GETPOST(
"commercial_suivi_id") ?
GETPOST(
"commercial_suivi_id") : $user->id,
'commercial_suivi_id', 1,
'');
1274 print
'<tr><td class="nowrap"><span class="fieldrequired">'.$langs->trans(
"TypeContact_contrat_internal_SALESREPSIGN").
'</span></td><td>';
1275 print
img_picto(
'',
'user',
'class="pictofixedwidth"');
1276 print $form->select_dolusers(
GETPOST(
"commercial_signature_id") ?
GETPOST(
"commercial_signature_id") : $user->id,
'commercial_signature_id', 1,
'');
1279 print
'<tr><td><span class="fieldrequired">'.$langs->trans(
"Date").
'</span></td><td>';
1280 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
1281 print $form->selectDate($datecontrat,
'', 0, 0, 0,
"contrat");
1285 if (isModEnabled(
'project')) {
1286 $langs->load(
'projects');
1290 print
'<tr><td>'.$langs->trans(
"Project").
'</td><td>';
1291 print
img_picto(
'',
'project',
'class="pictofixedwidth"');
1292 $formproject->select_projects(($soc->id > 0 ? $soc->id : -1), $projectid,
"projectid", 0, 0, 1, 1);
1293 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>';
1297 print
'<tr><td>'.$langs->trans(
"NotePublic").
'</td><td class="tdtop">';
1298 $doleditor =
new DolEditor(
'note_public', $note_public,
'', 100,
'dolibarr_notes',
'In',
true,
true, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PUBLIC') ? 0 : 1, ROWS_3,
'90%');
1299 print $doleditor->Create(1);
1302 if (empty($user->socid)) {
1303 print
'<tr><td>'.$langs->trans(
"NotePrivate").
'</td><td class="tdtop">';
1304 $doleditor =
new DolEditor(
'note_private', $note_private,
'', 100,
'dolibarr_notes',
'In',
true,
true, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PRIVATE') ? 0 : 1, ROWS_3,
'90%');
1305 print $doleditor->Create(1);
1310 $parameters = array(
'objectsrc' => $objectsrc,
'colspan' =>
' colspan="3"',
'cols' =>
'3');
1311 $reshook = $hookmanager->executeHooks(
'formObjectOptions', $parameters,
$object, $action);
1312 print $hookmanager->resPrint;
1315 if (empty($reshook)) {
1316 print
$object->showOptionals($extrafields,
'create', $parameters);
1323 print $form->buttonsSaveCancel(
"Create");
1325 if (is_object($objectsrc)) {
1326 print
'<input type="hidden" name="origin" value="'.$objectsrc->element.
'">';
1327 print
'<input type="hidden" name="originid" value="'.$objectsrc->id.
'">';
1330 print
'<br>'.$langs->trans(
"Note").
': '.$langs->trans(
"OnlyLinesWithTypeServiceAreUsed");
1344 $result =
$object->fetch_lines();
1349 $nbofservices = count(
$object->lines);
1351 $author =
new User($db);
1352 $author->fetch(
$object->user_author_id);
1354 $commercial_signature =
new User($db);
1355 $commercial_signature->fetch(
$object->commercial_signature_id);
1357 $commercial_suivi =
new User($db);
1358 $commercial_suivi->fetch(
$object->commercial_suivi_id);
1365 print
dol_get_fiche_head($head, $hselected, $langs->trans(
"Contract"), -1,
'contract');
1368 if ($action ==
'delete') {
1370 $formconfirm = $form->formconfirm($_SERVER[
'PHP_SELF'].
"?id=".
$object->id, $langs->trans(
"DeleteAContract"), $langs->trans(
"ConfirmDeleteAContract"),
"confirm_delete",
'', 0, 1);
1371 } elseif ($action ==
'valid') {
1373 $ref = substr(
$object->ref, 1, 4);
1374 if ($ref ==
'PROV' && !empty($modCodeContract->code_auto)) {
1379 $text = $langs->trans(
'ConfirmValidateContract', $numref);
1380 $formconfirm = $form->formconfirm($_SERVER[
'PHP_SELF'].
"?id=".
$object->id, $langs->trans(
"ValidateAContract"), $text,
"confirm_valid",
'', 0, 1);
1381 } elseif ($action ==
'close') {
1383 $formconfirm = $form->formconfirm($_SERVER[
'PHP_SELF'].
"?id=".
$object->id, $langs->trans(
"CloseAContract"), $langs->trans(
"ConfirmCloseContract"),
"confirm_close",
'', 0, 1);
1384 } elseif ($action ==
'activate') {
1385 $formquestion = array(
1386 array(
'type' =>
'date',
'name' =>
'd_start',
'label' => $langs->trans(
"DateServiceActivate"),
'value' =>
dol_now()),
1387 array(
'type' =>
'date',
'name' =>
'd_end',
'label' => $langs->trans(
"DateEndPlanned"), 0 =>
'', 1 =>
''),
1388 array(
'type' =>
'text',
'name' =>
'comment',
'label' => $langs->trans(
"Comment"),
'value' =>
'', 0 =>
'', 1 =>
'',
'class' =>
'minwidth300',
'moreattr' =>
'autofocus')
1390 $formconfirm = $form->formconfirm($_SERVER[
'PHP_SELF'].
"?id=".
$object->id, $langs->trans(
"ActivateAllOnContract"), $langs->trans(
"ConfirmActivateAllOnContract"),
"confirm_activate", $formquestion,
'yes', 1, 280);
1391 } elseif ($action ==
'clone') {
1392 $filter =
'(s.client:IN:1,2,3)';
1394 $formquestion = array(array(
'type' =>
'other',
'name' =>
'socid',
'label' => $langs->trans(
"SelectThirdParty"),
'value' => $form->select_company(
GETPOSTINT(
'socid'),
'socid', $filter)));
1395 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'ToClone'), $langs->trans(
'ConfirmCloneContract',
$object->ref),
'confirm_clone', $formquestion,
'yes', 1);
1396 } elseif ($action ==
'sign') {
1397 $text = $langs->trans(
'ConfirmSignContract');
1398 if (isModEnabled(
'notification')) {
1399 require_once DOL_DOCUMENT_ROOT.
'/core/class/notify.class.php';
1400 $notify =
new Notify($db);
1402 $text .= $notify->confirmMessage(
'CONTRACT_MODIFY',
$object->socid,
$object);
1407 'name' =>
'signed_status',
1408 'label' =>
'<span class="fieldrequired">'.$langs->trans(
'SignStatus').
'</span>',
1409 'values' =>
$object->getSignedStatusLocalisedArray()
1411 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'SignContract'), $text,
'confirm_sign', $formquestion, 0, 1);
1412 } elseif ($action ==
'unsign') {
1413 $text = $langs->trans(
'ConfirmUnsignContract');
1414 if (isModEnabled(
'notification')) {
1415 require_once DOL_DOCUMENT_ROOT.
'/core/class/notify.class.php';
1416 $notify =
new Notify($db);
1418 $text .= $notify->confirmMessage(
'CONTRACT_MODIFY',
$object->socid,
$object);
1420 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'UnsignContract'), $text,
'confirm_unsign',
'', 0, 1);
1425 $parameters = array(
1426 'formConfirm' => $formconfirm,
1431 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters,
$object, $action);
1432 if (empty($reshook)) {
1433 $formconfirm .= $hookmanager->resPrint;
1434 } elseif ($reshook > 0) {
1435 $formconfirm = $hookmanager->resPrint;
1443 if (
$object->status == $object::STATUS_DRAFT && $user->hasRight(
'contrat',
'creer')) {
1444 print
'<form action="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'" method="POST">';
1445 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1446 print
'<input type="hidden" name="action" value="setremise">';
1447 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
1452 $linkback =
'<a href="'.DOL_URL_ROOT.
'/contrat/list.php?restore_lastsearch_values=1'.(!empty($socid) ?
'&socid='.$socid :
'').
'">'.$langs->trans(
"BackToList").
'</a>';
1456 if (!empty($modCodeContract->code_auto)) {
1459 $morehtmlref .= $form->editfieldkey(
"",
'ref',
$object->ref,
$object, $user->hasRight(
'contrat',
'creer'),
'string',
'', 0, 3);
1460 $morehtmlref .= $form->editfieldval(
"",
'ref',
$object->ref,
$object, $user->hasRight(
'contrat',
'creer'),
'string',
'',
null, 2);
1463 $morehtmlref .=
'<div class="refidno">';
1465 $morehtmlref .= $form->editfieldkey(
"RefCustomer",
'ref_customer',
$object->ref_customer,
$object, $user->hasRight(
'contrat',
'creer'),
'string',
'', 0, 1);
1466 $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');
1468 $morehtmlref .=
'<br>';
1469 $morehtmlref .= $form->editfieldkey(
"RefSupplier",
'ref_supplier',
$object->ref_supplier,
$object, $user->hasRight(
'contrat',
'creer'),
'string',
'', 0, 1);
1470 $morehtmlref .= $form->editfieldval(
"RefSupplier",
'ref_supplier',
$object->ref_supplier,
$object, $user->hasRight(
'contrat',
'creer'),
'string',
'',
null,
null,
'', 1,
'getFormatedSupplierRef');
1472 $morehtmlref .=
'<br>'.$object->thirdparty->getNomUrl(1);
1474 $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>';
1477 if (isModEnabled(
'project')) {
1478 $langs->load(
"projects");
1479 $morehtmlref .=
'<br>';
1480 if ($permissiontoadd) {
1481 $morehtmlref .=
img_picto($langs->trans(
"Project"),
'project',
'class="pictofixedwidth"');
1482 if ($action !=
'classify') {
1483 $morehtmlref .=
'<a class="editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?action=classify&token='.
newToken().
'&id='.
$object->id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetProject')).
'</a> ';
1485 $morehtmlref .= $form->form_project($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->socid,
$object->fk_project, ($action ==
'classify' ?
'projectid' :
'none'), 0, 0, 0, 1,
'',
'maxwidth300');
1487 if (!empty(
$object->fk_project)) {
1489 $proj->fetch(
$object->fk_project);
1490 $morehtmlref .= $proj->getNomUrl(1);
1492 $morehtmlref .=
'<span class="opacitymedium"> - '.dol_escape_htmltag($proj->title).
'</span>';
1497 $morehtmlref .=
'</div>';
1500 dol_banner_tab(
$object,
'ref', $linkback, 1,
'ref',
'none', $morehtmlref);
1503 print
'<div class="fichecenter">';
1504 print
'<div class="underbanner clearboth"></div>';
1507 print
'<table class="border tableforfield" width="100%">';
1510 print
'<tr><td class="titlefield">'.$langs->trans(
'Discount').
'</td><td colspan="3">';
1511 if (
$object->thirdparty->remise_percent) {
1512 print $langs->trans(
"CompanyHasRelativeDiscount",
$object->thirdparty->remise_percent).
'. ';
1514 print
'<span class="hideonsmartphone">'.$langs->trans(
"CompanyHasNoRelativeDiscount").
'. </span>';
1516 $absolute_discount =
$object->thirdparty->getAvailableDiscounts();
1517 if ($absolute_discount) {
1518 print $langs->trans(
"CompanyHasAbsoluteDiscount",
price($absolute_discount), $langs->trans(
"Currency".$conf->currency)).
'.';
1520 print
'<span class="hideonsmartphone">'.$langs->trans(
"CompanyHasNoAbsoluteDiscount").
'.</span>';
1526 print
'<td class="titlefield">';
1527 print $form->editfieldkey(
"Date",
'date_contrat',
$object->date_contrat,
$object, $user->hasRight(
'contrat',
'creer'));
1529 print $form->editfieldval(
"Date",
'date_contrat',
$object->date_contrat,
$object, $user->hasRight(
'contrat',
'creer'),
'datehourpicker');
1535 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_view.tpl.php';
1541 if (
$object->status == $object::STATUS_DRAFT && $user->hasRight(
'contrat',
'creer')) {
1548 $blocname =
'contacts';
1549 $title = $langs->trans(
'ContactsAddresses');
1550 include DOL_DOCUMENT_ROOT.
'/core/tpl/bloc_showhide.tpl.php';
1554 $blocname =
'notes';
1555 $title = $langs->trans(
'Notes');
1556 include DOL_DOCUMENT_ROOT.
'/core/tpl/bloc_showhide.tpl.php';
1560 $arrayothercontracts =
$object->getListOfContracts(
'others');
1568 global $inputalsopricewithtax;
1569 $inputalsopricewithtax = 1;
1571 $productstatic =
new Product($db);
1574 if (isModEnabled(
'margin') && !empty(
$object->element) && in_array(
$object->element, array(
'facture',
'propal',
'commande'))) {
1582 print
'<div id="contrat-lines-container" id="contractlines" data-contractid="'.$object->id.
'" data-element="'.
$object->element.
'" >';
1583 while ($cursorline <= $nbofservices) {
1584 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.
'" >';
1585 print
'<form name="update" id="addproduct" action="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'" method="post">';
1586 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1587 print
'<input type="hidden" name="action" value="updateline">';
1588 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
1589 print
'<input type="hidden" name="elrowid" value="'.$object->lines[$cursorline - 1]->id.
'">';
1590 print
'<input type="hidden" name="fournprice" value="'.(!empty(
$object->lines[$cursorline - 1]->fk_fournprice) ?
$object->lines[$cursorline - 1]->fk_fournprice : 0).
'">';
1593 print
'<div class="div-table-responsive-no-min">';
1594 print
'<table class="notopnoleftnoright allwidth tableforservicepart1 centpercent">';
1596 $sql =
"SELECT cd.rowid, cd.statut, cd.label as label_det, cd.fk_product, cd.product_type, cd.description, cd.price_ht, cd.qty,";
1597 $sql .=
" cd.tva_tx, cd.vat_src_code, cd.remise_percent, cd.info_bits, cd.subprice, cd.multicurrency_subprice,";
1598 $sql .=
" cd.date_ouverture_prevue as date_start, cd.date_ouverture as date_start_real,";
1599 $sql .=
" cd.date_fin_validite as date_end, cd.date_cloture as date_end_real,";
1600 $sql .=
" cd.commentaire as comment, cd.fk_product_fournisseur_price as fk_fournprice, cd.buy_price_ht as pa_ht,";
1601 $sql .=
" cd.fk_unit,";
1602 $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";
1603 $sql .=
" ,cd.rang";
1604 $sql .=
" FROM ".MAIN_DB_PREFIX.
"contratdet as cd";
1605 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"product as p ON cd.fk_product = p.rowid";
1606 $sql .=
" WHERE cd.rowid = ".((int)
$object->lines[$cursorline - 1]->id);
1608 $result = $db->query($sql);
1613 $objp = $db->fetch_object($result);
1616 print
'<tr class="liste_titre'.($cursorline ?
' liste_titre_add' :
'').
'">';
1617 print
'<td>'.$langs->trans(
"ServiceNb", $cursorline).
'</td>';
1618 print
'<td width="80" class="center">'.$langs->trans(
"VAT").
'</td>';
1619 print
'<td width="80" class="right">'.$langs->trans(
"PriceUHT").
'</td>';
1623 print
'<td width="30" class="center">'.$langs->trans(
"Qty").
'</td>';
1625 print
'<td width="30" class="left">'.$langs->trans(
"Unit").
'</td>';
1627 print
'<td width="50" class="right">'.$langs->trans(
"ReductionShort").
'</td>';
1629 print
'<td width="50" class="right">'.$langs->trans(
"BuyingPrice").
'</td>';
1633 if ($nbofservices > 1 && $conf->browser->layout !=
'phone' && $user->hasRight(
'contrat',
'creer')) {
1634 print
'<td width="30" class="linecolmove tdlineupdown center">';
1635 if ($cursorline > 1) {
1636 print
'<a class="lineupdown reposition" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=up&token='.
newToken().
'&rowid='.$objp->rowid.
'">';
1637 echo
img_up(
'default', 0,
'imgupforline');
1640 if ($cursorline < $nbofservices) {
1641 print
'<a class="lineupdown reposition" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=down&token='.
newToken().
'&rowid='.$objp->rowid.
'">';
1642 echo
img_down(
'default', 0,
'imgdownforline');
1647 print
'<td width="30"> </td>';
1655 if ($action !=
'editline' || $idline != $objp->rowid) {
1657 if (
getDolGlobalString(
'CONTRACT_HIDE_CLOSED_SERVICES_BY_DEFAULT') && $objp->statut == ContratLigne::STATUS_CLOSED && $action !=
'showclosedlines') {
1658 $moreparam =
'style="display: none;"';
1661 print
'<tr class="tdtop oddeven" '.$moreparam.
'>';
1664 if ($objp->fk_product > 0) {
1665 $productstatic->id = $objp->fk_product;
1666 $productstatic->type = $objp->ptype;
1667 $productstatic->ref = $objp->pref;
1668 $productstatic->entity = $objp->pentity;
1669 $productstatic->label = $objp->plabel;
1670 $productstatic->status = $objp->tosell;
1671 $productstatic->status_buy = $objp->tobuy;
1672 $productstatic->status_batch = $objp->tobatch;
1675 $text = $productstatic->getNomUrl(1,
'', 32);
1676 if ($objp->plabel) {
1678 $text .= $objp->plabel;
1680 $description = $objp->description;
1684 $text .= (!empty($objp->description) && $objp->description != $objp->plabel) ?
'<br>'.
dol_htmlentitiesbr($objp->description) :
'';
1688 print $form->textwithtooltip($text, $description, 3, 0, 0, $cursorline, 3, (!empty($line->fk_parent_line) ?
img_picto(
'',
'rightarrow') :
''));
1692 print
'<td>'.img_object($langs->trans(
"ShowProductOrService"), ($objp->product_type ?
'service' :
'product')).
' '.
dol_htmlentitiesbr($objp->
description).
"</td>\n";
1695 print
'<td class="center">';
1696 print
vatrate($objp->tva_tx.($objp->vat_src_code ? (
' ('.$objp->vat_src_code.
')') :
''), true, $objp->info_bits);
1699 print
'<td class="right">'.($objp->subprice !=
'' ?
price($objp->subprice) :
'').
"</td>\n";
1705 print
'<td class="center">'.$objp->qty.
'</td>';
1708 print
'<td class="left">'.$langs->trans(
$object->lines[$cursorline - 1]->getLabelOfUnit()).
'</td>';
1711 if ($objp->remise_percent > 0) {
1712 print
'<td class="right">'.$objp->remise_percent.
"%</td>\n";
1714 print
'<td> </td>';
1719 print
'<td class="right nowraponall">'.price($objp->pa_ht).
'</td>';
1723 print
'<td class="nowraponall right">';
1724 if ($user->hasRight(
'contrat',
'creer') && is_array($arrayothercontracts) && count($arrayothercontracts) && (
$object->status >= 0)) {
1725 print
'<!-- link to move service line into another contract -->';
1726 print
'<a class="reposition marginrightonly" style="padding-left: 5px;" href="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'&action=move&token='.
newToken().
'&elrowid='.$objp->rowid.
'">';
1727 print
img_picto($langs->trans(
"MoveToAnotherContract"),
'uparrow');
1730 if ($user->hasRight(
'contrat',
'creer') && (
$object->statut >= 0)) {
1731 print
'<a class="reposition marginrightonly editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'&action=editline&token='.
newToken().
'&elrowid='.$objp->rowid.
'">';
1735 if ($user->hasRight(
'contrat',
'creer') && (
$object->statut >= 0)) {
1736 print
'<a class="reposition marginrightonly" href="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'&action=deleteline&token='.
newToken().
'&elrowid='.$objp->rowid.
'">';
1753 if ($objp->subprice >= 0) {
1754 print
'<tr class="oddeven" '.$moreparam.
'>';
1755 print
'<td colspan="'.$colspan.
'">';
1758 print $langs->trans(
"DateStartPlanned").
': ';
1759 if ($objp->date_start) {
1762 if ($objp->statut == 0 && $db->jdate($objp->date_start) < ($now - $conf->contrat->services->inactifs->warning_delay)) {
1763 $warning_delay = $conf->contrat->services->inactifs->warning_delay / 3600 / 24;
1764 $textlate = $langs->trans(
"Late").
' = '.$langs->trans(
"DateReference").
' > '.$langs->trans(
"DateToday").
' '.(ceil($warning_delay) >= 0 ?
'+' :
'').ceil($warning_delay).
' '.$langs->trans(
"days");
1765 print
" ".img_warning($textlate);
1768 print $langs->trans(
"Unknown");
1770 print
' - ';
1771 print $langs->trans(
"DateEndPlanned").
': ';
1772 if ($objp->date_end) {
1774 if ($objp->statut == 4 && $db->jdate($objp->date_end) < ($now - $conf->contrat->services->expires->warning_delay)) {
1775 $warning_delay = $conf->contrat->services->expires->warning_delay / 3600 / 24;
1776 $textlate = $langs->trans(
"Late").
' = '.$langs->trans(
"DateReference").
' > '.$langs->trans(
"DateToday").
' '.(ceil($warning_delay) >= 0 ?
'+' :
'').ceil($warning_delay).
' '.$langs->trans(
"days");
1777 print
" ".img_warning($textlate);
1780 print $langs->trans(
"Unknown");
1788 if (is_array($extralabelslines) && count($extralabelslines) > 0) {
1790 $line->id = $objp->rowid;
1791 $line->fetch_optionals();
1792 print $line->showOptionals($extrafields,
'view', array(
'class' =>
'oddeven',
'style' => $moreparam,
'colspan' => $colspan,
'tdclass' =>
'notitlefieldcreate'),
'',
'', 1);
1797 print
'<tr class="oddeven">';
1799 $currentLineProductId = GETPOSTISSET(
'idprod') ?
GETPOST(
'idprod') : (!empty(
$object->lines[$cursorline - 1]->fk_product) ?
$object->lines[$cursorline - 1]->fk_product : 0);
1800 if ($objp->fk_product > 0) {
1801 $canchangeproduct = 1;
1804 if (empty($canchangeproduct)) {
1805 $productstatic->id = $objp->fk_product;
1806 $productstatic->type = $objp->ptype;
1807 $productstatic->ref = $objp->pref;
1808 $productstatic->entity = $objp->pentity;
1809 print $productstatic->getNomUrl(1,
'', 32);
1810 print $objp->label ?
' - '.dol_trunc($objp->label, 32) :
'';
1811 print
'<input type="hidden" name="idprod" value="'.$currentLineProductId.
'">';
1813 $senderissupplier = 0;
1814 if (empty($senderissupplier)) {
1815 print $form->select_produits($currentLineProductId,
'idprod',
'', 0, 0, 1, 2,
'', 0, array(), 0, 1, 0,
'minwidth250onall maxwidth500 widthcentpercentminusx');
1817 $form->select_produits_fournisseurs($currentLineProductId,
'idprod');
1822 print $objp->label ? $objp->label.
'<br>' :
'';
1823 print
'<input type="hidden" name="idprod" value="'.$currentLineProductId.
'">';
1827 require_once DOL_DOCUMENT_ROOT.
'/core/class/doleditor.class.php';
1832 $doleditor =
new DolEditor(
'product_desc', (GETPOSTISSET(
'product_desc') ?
GETPOST(
'product_desc') : $objp->
description),
'', 92,
'dolibarr_details',
'', false, true,
getDolGlobalInt(
'FCKEDITOR_ENABLE_DETAILS'), $nbrows,
'90%');
1833 $doleditor->Create();
1838 print
'<td class="right">';
1839 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);
1843 print
'<td class="right"><input class="width50" type="text" name="elprice" value="'.(GETPOSTISSET(
'elprice') ?
GETPOST(
'elprice') :
price($objp->subprice)).
'"></td>';
1851 print
'<td class="center"><input size="2" type="text" name="elqty" value="'.(GETPOSTISSET(
'elqty') ?
GETPOST(
'elqty') : $objp->qty).
'"></td>';
1855 print
'<td class="left">';
1856 print $form->selectUnits((GETPOSTISSET(
'unit') ?
GETPOSTINT(
'unit') : $objp->fk_unit),
"unit");
1861 print
'<td class="nowraponall right"><input size="1" type="text" name="elremise_percent" value="'.(GETPOSTISSET(
'elremise_percent') ?
GETPOST(
'elremise_percent') : $objp->remise_percent).
'">%</td>';
1863 if (!empty($usemargins)) {
1864 print
'<td class="right">';
1865 if ($objp->fk_product) {
1866 print
'<select id="fournprice" name="fournprice"></select>';
1868 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>';
1870 print
'<td class="center">';
1871 print
'<input type="submit" class="button margintoponly marginbottomonly" name="save" value="'.$langs->trans(
"Modify").
'">';
1872 print
'<br><input type="submit" class="button margintoponly marginbottomonly button-cancel" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
1885 print
'<tr class="oddeven">';
1886 print
'<td colspan="'.$colspan.
'">';
1887 print $langs->trans(
"DateStartPlanned").
' ';
1888 print $form->selectDate($db->jdate($objp->date_start),
"date_start_update", $usehm, $usehm, ($db->jdate($objp->date_start) > 0 ? 0 : 1),
"update");
1889 print
' '.$langs->trans(
"DateEndPlanned").
' ';
1890 print $form->selectDate($db->jdate($objp->date_end),
"date_end_update", $usehm, $usehm, ($db->jdate($objp->date_end) > 0 ? 0 : 1),
"update");
1894 if (is_array($extralabelslines) && count($extralabelslines) > 0) {
1896 $line->id = $objp->rowid;
1897 $line->fetch_optionals();
1899 print $line->showOptionals($extrafields,
'edit', array(
'style' =>
'class="oddeven"',
'colspan' => $colspan,
'tdclass' =>
'notitlefieldcreate'),
'',
'', 1);
1910 if (
getDolGlobalString(
'CONTRACT_HIDE_CLOSED_SERVICES_BY_DEFAULT') &&
$object->lines[$cursorline - 1]->statut == ContratLigne::STATUS_CLOSED && $action !=
'showclosedlines') {
1911 $moreparam =
'style="display: none;"';
1922 print
'<tr class="oddeven" '.$moreparam.
'>';
1923 print
'<td class="tdhrthin" colspan="'.$colspan.
'"><hr class="opacitymedium tdhrthin"></td>';
1936 if ($action ==
'deleteline' && !$cancel && $user->hasRight(
'contrat',
'creer') &&
$object->lines[$cursorline - 1]->id == $idline) {
1937 print $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".((
int)
$object->id).
"&lineid=".((
int) $idline), $langs->trans(
"DeleteContractLine"), $langs->trans(
"ConfirmDeleteContractLine"),
"confirm_deleteline",
'', 0, 1);
1938 if ($ret ==
'html') {
1939 print
'<table class="notopnoleftnoright centpercent"><tr class="oddeven" height="6"><td></td></tr></table>';
1946 if ($action ==
'move' && !$cancel && $user->hasRight(
'contrat',
'creer') &&
$object->lines[$cursorline - 1]->id == $idline) {
1947 $arraycontractid = array();
1948 foreach ($arrayothercontracts as $contractcursor) {
1949 $arraycontractid[$contractcursor->id] = $contractcursor->ref;
1953 $formquestion = array(
1954 'text' => $langs->trans(
"ConfirmMoveToAnotherContractQuestion"),
1955 0 => array(
'type' =>
'select',
'name' =>
'newcid',
'values' => $arraycontractid));
1957 print $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".((
int)
$object->id).
"&lineid=".((
int) $idline), $langs->trans(
"MoveToAnotherContract"), $langs->trans(
"ConfirmMoveToAnotherContract"),
"confirm_move", $formquestion,
'yes');
1958 print
'<table class="notopnoleftnoright centpercent"><tr class="oddeven" height="6"><td></td></tr></table>';
1963 print
'<table class="notopnoleftnoright tableforservicepart2'.($cursorline < $nbofservices ?
' boxtablenobottom' :
'').
' centpercent">';
1965 print
'<tr class="oddeven" '.$moreparam.
'>';
1966 print
'<td><span class="valignmiddle hideonsmartphone">'.$langs->trans(
"ServiceStatus").
':</span> '.
$object->lines[$cursorline - 1]->getLibStatut(4).
'</td>';
1967 print
'<td width="30" class="right">';
1968 if ($user->socid == 0) {
1969 if (
$object->statut > 0 && $action !=
'activateline' && $action !=
'unactivateline' && is_object($objp)) {
1970 $tmpaction =
'activateline';
1971 $tmpactionpicto =
'play';
1972 $tmpactiontext = $langs->trans(
"Activate");
1973 if ($objp->statut == 4) {
1974 $tmpaction =
'unactivateline';
1975 $tmpactionpicto =
'playstop';
1976 $tmpactiontext = $langs->trans(
"Disable");
1978 if (($tmpaction ==
'activateline' && $user->hasRight(
'contrat',
'activer')) || ($tmpaction ==
'unactivateline' && $user->hasRight(
'contrat',
'desactiver'))) {
1979 print
'<a class="reposition" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&ligne='.
$object->lines[$cursorline - 1]->id.
'&action='.$tmpaction.
'&token='.
newToken().
'">';
1980 print
img_picto($tmpactiontext, $tmpactionpicto);
1988 print
'<tr class="oddeven" '.$moreparam.
'>';
1992 if (!$objp->date_start_real) {
1993 print $langs->trans(
"DateStartReal").
': ';
1994 if ($objp->date_start_real) {
1997 print $langs->trans(
"ContractStatusNotRunning");
2001 if ($objp->date_start_real && !$objp->date_end_real) {
2002 print $langs->trans(
"DateStartReal").
': ';
2006 if ($objp->date_start_real && $objp->date_end_real) {
2007 print $langs->trans(
"DateStartReal").
': ';
2009 print
' - ';
2010 print $langs->trans(
"DateEndReal").
': ';
2013 if (!empty($objp->comment)) {
2014 print
" - ".$objp->comment;
2018 print
'<td class="center"> </td>';
2025 if ($user->hasRight(
'contrat',
'activer') && $action ==
'activateline' &&
$object->lines[$cursorline - 1]->id ==
GETPOSTINT(
'ligne') && is_object($objp)) {
2026 print
'<form name="active" action="'.$_SERVER[
"PHP_SELF"].
'" method="POST">';
2027 print
'<input type="hidden" name="token" value="'.newToken().
'">';
2028 print
'<input type="hidden" name="action" value="confirm_active">';
2029 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
2030 print
'<input type="hidden" name="id" value="'.$object->id.
'">';
2031 print
'<input type="hidden" name="ligne" value="'.GETPOSTINT(
'ligne').
'">';
2032 print
'<input type="hidden" name="confirm" value="yes">';
2034 print
'<table class="noborder tableforservicepart2'.($cursorline < $nbofservices ?
' boxtablenobottom' :
'').
' centpercent">';
2037 $dateactstart = $objp->date_start;
2040 } elseif (!$dateactstart) {
2041 $dateactstart = time();
2044 $dateactend = $objp->date_end;
2047 } elseif (!$dateactend) {
2048 if ($objp->fk_product > 0) {
2050 $product->fetch($objp->fk_product);
2051 $dateactend =
dol_time_plus_duree(time(), $product->duration_value, $product->duration_unit);
2055 print
'<tr class="oddeven">';
2056 print
'<td class="nohover">'.$langs->trans(
"DateServiceActivate").
'</td><td class="nohover">';
2057 print $form->selectDate($dateactstart,
'start', $usehm, $usehm, 0,
"active", 1, 0);
2059 print
'<td class="nohover">'.$langs->trans(
"DateEndPlanned").
'</td><td class="nohover">';
2060 print $form->selectDate($dateactend,
"end", $usehm, $usehm, 0,
"active", 1, 0);
2062 print
'<td class="center nohover">';
2067 print
'<tr class="oddeven">';
2068 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>';
2069 print
'<td class="nohover right">';
2070 print
'<input type="submit" class="button" name="activate" value="'.$langs->trans(
"Activate").
'"> ';
2071 print
'<input type="submit" class="button button-cancel" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
2080 if ($user->hasRight(
'contrat',
'activer') && $action ==
'unactivateline' &&
$object->lines[$cursorline - 1]->id ==
GETPOSTINT(
'ligne') && is_object($objp)) {
2084 print
'<!-- Form to disabled a line -->'.
"\n";
2085 print
'<form name="confirm_closeline" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&ligne='.
$object->lines[$cursorline - 1]->id.
'" method="post">';
2086 print
'<input type="hidden" name="token" value="'.newToken().
'">';
2087 print
'<input type="hidden" name="confirm" value="yes">';
2088 print
'<input type="hidden" name="action" value="confirm_closeline">';
2089 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
2091 print
'<table class="noborder tableforservicepart2'.($cursorline < $nbofservices ?
' boxtablenobottom' :
'').
' centpercent">';
2094 $dateactstart = $objp->date_start_real;
2097 } elseif (!$dateactstart) {
2098 $dateactstart = time();
2101 $dateactend = $objp->date_end_real;
2104 } elseif (!$dateactend) {
2105 if ($objp->fk_product > 0) {
2107 $product->fetch($objp->fk_product);
2108 $dateactend =
dol_time_plus_duree(time(), $product->duration_value, $product->duration_unit);
2112 if ($dateactend > $now) {
2116 print
'<tr class="oddeven"><td colspan="2" class="nohover">';
2117 if ($objp->statut >= 4) {
2118 if ($objp->statut == 4) {
2119 print $langs->trans(
"DateEndReal").
' ';
2120 print $form->selectDate($dateactend,
"end", $usehm, $usehm, ($objp->date_end_real > 0 ? 0 : 1),
"closeline", 1, 1);
2124 print
'<td class="center nohover">';
2127 print
'<tr class="oddeven">';
2128 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>';
2129 print
'<td class="nohover right">';
2130 print
'<input type="submit" class="button" name="close" value="'.$langs->trans(
"Disable").
'"> ';
2131 print
'<input type="submit" class="button button-cancel" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
2145 if ($user->hasRight(
'contrat',
'creer') && (
$object->statut == 0)) {
2149 print
' <form name="addproduct" id="addproduct" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.(($action !=
'editline') ?
'' :
'#line_'.
GETPOSTINT(
'lineid')).
'" method="POST">
2150 <input type="hidden" name="token" value="'.
newToken().
'">
2151 <input type="hidden" name="action" value="'.(($action !=
'editline') ?
'addline' :
'updateline').
'">
2152 <input type="hidden" name="mode" value="">
2153 <input type="hidden" name="id" value="'.
$object->id.
'">
2154 <input type="hidden" name="page_y" value="">
2155 <input type="hidden" name="backtopage" value="'.$backtopage.
'">
2158 print
'<div class="div-table-responsive-no-min">';
2159 print
'<table id="tablelines" class="noborder noshadow" width="100%">';
2162 if ($action !=
'editline') {
2163 $forcetoshowtitlelines = 1;
2164 if (empty(
$object->multicurrency_code)) {
2165 $object->multicurrency_code = $conf->currency;
2170 $parameters = array();
2171 $reshook = $hookmanager->executeHooks(
'formAddObjectLine', $parameters,
$object, $action);
2175 if (empty($reshook)) {
2176 $object->formAddObjectLine(1, $mysoc, $soc);
2188 if (
GETPOST(
'modelselected')) {
2189 $action =
'presend';
2195 if ($user->socid == 0 && $action !=
'presend' && $action !=
'editline') {
2196 print
'<div class="tabsAction">';
2198 $parameters = array();
2199 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters,
$object, $action);
2201 if (empty($reshook)) {
2205 'class' =>
'classfortooltip'
2210 if (empty($user->socid)) {
2211 if (
$object->status == $object::STATUS_VALIDATED) {
2212 if ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') || $user->hasRight(
'contrat',
'creer'))) {
2213 print
dolGetButtonAction(
'', $langs->trans(
'SendMail'),
'default', $_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=presend&token='.
newToken().
'&mode=init#formmailbeforetitle',
'',
true, $params);
2215 print
dolGetButtonAction(
'', $langs->trans(
'SendMail'),
'default',
'#',
'',
false, $params);
2220 if (
$object->status == $object::STATUS_DRAFT && $nbofservices) {
2221 if ($user->hasRight(
'contrat',
'creer')) {
2222 unset($params[
'attr'][
'title']);
2223 print
dolGetButtonAction($langs->trans(
'Validate'),
'',
'default', $_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=valid&token='.
newToken(),
'',
true, $params);
2225 $params[
'attr'][
'title'] = $langs->trans(
"NotEnoughPermissions");
2226 print
dolGetButtonAction($langs->trans(
'Validate'),
'',
'default',
'#',
'',
false, $params);
2229 if (
$object->status == $object::STATUS_VALIDATED) {
2230 if ($user->hasRight(
'contrat',
'creer')) {
2231 unset($params[
'attr'][
'title']);
2232 print
dolGetButtonAction($langs->trans(
'Modify'),
'',
'default', $_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=reopen&token='.
newToken(),
'',
true, $params);
2234 $params[
'attr'][
'title'] = $langs->trans(
"NotEnoughPermissions");
2235 print
dolGetButtonAction($langs->trans(
'Modify'),
'',
'default',
'#',
'',
false, $params);
2240 $arrayofcreatebutton = array();
2241 if (isModEnabled(
'order') &&
$object->status > 0 &&
$object->nbofservicesclosed < $nbofservices) {
2242 $arrayofcreatebutton[] = array(
2243 'url' =>
'/commande/card.php?action=create&token='.
newToken().
'&origin='.
$object->element.
'&originid='.
$object->id.
'&socid='.
$object->thirdparty->id,
2244 'label' => $langs->trans(
'AddOrder'),
2246 'perm' => $user->hasRight(
'commande',
'creer'),
2250 if (isModEnabled(
'invoice') &&
$object->status > 0 && $soc->client > 0) {
2251 $arrayofcreatebutton[] = array(
2252 'url' =>
'/compta/facture/card.php?action=create&origin='.
$object->element.
'&originid='.
$object->id.
'&socid='.
$object->thirdparty->id,
2253 'label' => $langs->trans(
'CreateBill'),
2255 'perm' => $user->hasRight(
'facture',
'creer'),
2259 if (isModEnabled(
'supplier_invoice') &&
$object->status > 0 && $soc->fournisseur == 1) {
2260 $langs->load(
"suppliers");
2261 $arrayofcreatebutton[] = array(
2262 'url' =>
'/fourn/facture/card.php?action=create&origin='.
$object->element.
'&originid='.
$object->id.
'&socid='.
$object->thirdparty->id,
2263 'label' => $langs->trans(
'AddSupplierInvoice'),
2265 'perm' => $user->hasRight(
'fournisseur',
'facture',
'creer'),
2269 if (count($arrayofcreatebutton)) {
2270 unset($params[
'attr'][
'title']);
2271 print
dolGetButtonAction(
'', $langs->trans(
"Create"),
'default', $arrayofcreatebutton,
'',
true, $params);
2274 $arrayforbutaction = array();
2275 if (
$object->nbofservicesclosed > 0 ||
$object->nbofserviceswait > 0) {
2276 $arrayforbutaction[] = array(
2277 'url' =>
'/contrat/card.php?id='.
$object->id.
'&action=activate&token='.
newToken(),
2278 'label' => $langs->trans(
'ActivateAllContracts'),
2280 'perm' => $user->hasRight(
'contrat',
'activer'),
2284 if (
$object->nbofservicesclosed < $nbofservices) {
2285 $arrayforbutaction[] = array(
2286 'url' =>
'/contrat/card.php?id='.
$object->id.
'&action=close&token='.
newToken(),
2287 'label' => $langs->trans(
'CloseAllContracts'),
2289 'perm' => $user->hasRight(
'contrat',
'desactiver'),
2294 if (count($arrayforbutaction)) {
2295 unset($params[
'attr'][
'title']);
2296 print
dolGetButtonAction(
'', $langs->trans(
"Services"),
'default', $arrayforbutaction,
'',
true, $params);
2300 if ($action ==
'showclosedlines') {
2301 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>';
2303 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>';
2308 if (
$object->status > Contrat::STATUS_DRAFT) {
2309 if (
$object->signed_status != Contrat::$SIGNED_STATUSES[
'STATUS_SIGNED_ALL']) {
2310 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>';
2312 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>';
2317 if ($user->hasRight(
'contrat',
'creer')) {
2318 unset($params[
'attr'][
'title']);
2323 unset($params[
'attr'][
'title']);
2324 print
dolGetButtonAction($langs->trans(
'Delete'),
'',
'delete', $_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=delete&token='.
newToken(),
'', $permissiontodelete, $params);
2330 if ($action !=
'presend') {
2331 print
'<div class="fichecenter"><div class="fichehalfleft">';
2338 $urlsource = $_SERVER[
"PHP_SELF"].
"?id=".
$object->id;
2339 $genallowed = $user->hasRight(
'contrat',
'lire');
2340 $delallowed = $user->hasRight(
'contrat',
'creer');
2343 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);
2347 $tmparray = $form->showLinkToObjectBlock(
$object, array(), array(
'contrat'), 1);
2348 $linktoelem = $tmparray[
'linktoelem'];
2349 $htmltoenteralink = $tmparray[
'htmltoenteralink'];
2350 print $htmltoenteralink;
2352 $somethingshown = $form->showLinkedObjectBlock(
$object, $linktoelem);
2356 print
'<br><!-- Link to sign -->';
2357 require_once DOL_DOCUMENT_ROOT.
'/core/lib/signature.lib.php';
2359 print showOnlineSignatureUrl(
'contract',
$object->ref).
'<br>';
2362 print
'</div><div class="fichehalfright">';
2366 $morehtmlcenter =
'<div class="nowraponall">';
2367 $morehtmlcenter .=
dolGetButtonTitle($langs->trans(
'FullConversation'),
'',
'fa fa-comments imgforviewmode', DOL_URL_ROOT.
'/contrat/messaging.php?id='.
$object->id);
2368 $morehtmlcenter .=
dolGetButtonTitle($langs->trans(
'SeeAll'),
'',
'fa fa-bars imgforviewmode', DOL_URL_ROOT.
'/contrat/agenda.php?id='.
$object->id);
2369 $morehtmlcenter .=
'</div>';
2373 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
2375 $somethingshown = $formactions->showactions(
$object,
'contract', $socid, 1,
'listactions', $MAXEVENT,
'', $morehtmlcenter);
2377 print
'</div></div>';
2381 $modelmail =
'contract';
2382 $defaulttopic =
'SendContractRef';
2383 $diroutput = $conf->contrat->multidir_output[
$object->entity];
2384 $trackid =
'con'.$object->id;
2386 include DOL_DOCUMENT_ROOT.
'/core/tpl/card_presend.tpl.php';
2397if (isModEnabled(
'margin') && $action ==
'editline') {
2398 print
"\n".
'<script type="text/javascript">'.
"\n";
2400 $(document).ready(
function() {
2401 var idprod = $(
"input[name='idprod']").val();
2402 var fournprice = $(
"input[name='fournprice']").val();
2403 var token =
'<?php echo currentToken(); ?>';
2405 $.post(
'<?php echo DOL_URL_ROOT; ?>/fourn/ajax/getSupplierPrices.php', {
2409 if (data.length > 0) {
2412 $(data).each(
function() {
2413 options +=
'<option value="'+this.
id+
'" price="'+this.
price+
'"';
2414 if (fournprice > 0) {
2415 if (this.
id == fournprice) {
2416 options +=
' selected';
2417 $(
"#buying_price").val(this.price);
2421 options +=
'>'+this.label+
'</option>';
2423 options +=
'<option value=null'+(trouve?
'':
' selected')+
'><?php echo $langs->trans("InputPrice"); ?></option>';
2424 $(
"#fournprice").html(options);
2426 $(
"#buying_price").hide();
2427 $(
"#fournprice").show();
2430 $(
"#buying_price").show();
2432 $(
"#fournprice").change(
function() {
2433 var selval = $(
this).find(
'option:selected').attr(
"price");
2435 $(
"#buying_price").val(selval).hide();
2437 $(
'#buying_price').show();
2441 $(
"#fournprice").hide();
2442 $(
'#buying_price').show();
2448 $(
"#fournprice").hide();
2449 $(
'#buying_price').show();
2453 print
"\n".
'<script type="text/javascript">'.
"\n";
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
Class to manage lines of contracts.
Class to manage a WYSIWYG editor.
Class to manage the table of subscription to notifications.
File of class to manage predefined price products or services by customer.
Class to manage products or services.
Class to manage projects.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage translations.
Class to manage Dolibarr users.
contract_prepare_head(Contrat $object)
Prepare array with list of tabs.
dol_time_plus_duree($time, $duration_value, $duration_unit, $ruleforendofmonth=0)
Add a delay to a date.
print $script_file $mode $langs defaultlang(is_numeric($duration_value) ? " delay=". $duration_value :"").(is_numeric($duration_value2) ? " after cd cd cd description as description
Only used if Module[ID]Desc translation string is not found.
dol_move_dir($srcdir, $destdir, $overwriteifexists=1, $indexdatabase=1, $renamedircontent=1)
Move a directory into another name.
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed information (by default a local PHP server timestamp) Rep...
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
vatrate($rate, $addpercent=false, $info_bits=0, $usestarfornpr=0, $html=0)
Return a string with VAT rate label formatted for view output Used into pdf and HTML pages.
img_delete($titlealt='default', $other='class="pictodelete"', $morecss='')
Show delete logo.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0)
Show tabs of a record.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dolGetButtonTitle($label, $helpText='', $iconClass='fa fa-file', $url='', $id='', $status=1, $params=array())
Function dolGetButtonTitle : this kind of buttons are used in title in list.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
dol_strlen($string, $stringencoding='UTF-8')
Make a strlen call.
img_down($titlealt='default', $selected=0, $moreclass='')
Show down arrow logo.
price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code='')
Function to format a value into an amount for visual output Function used into PDF and HTML pages.
GETPOSTISARRAY($paramname, $method=0)
Return true if the parameter $paramname is submit from a POST OR GET as an array.
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
if(!function_exists( 'dol_getprefix')) dol_include_once($relpath, $classname='')
Make an include_once using default root and alternate root if it fails.
newToken()
Return the value of token currently saved into session with name 'newtoken'.
dol_clone($object, $native=0)
Create a clone of instance of object (new instance with same value for each properties) With native =...
dolGetButtonAction($label, $text='', $actionType='default', $url='', $id='', $userRight=1, $params=array())
Function dolGetButtonAction.
dol_concatdesc($text1, $text2, $forxml=false, $invert=false)
Concat 2 descriptions with a new line between them (second operand after first one with appropriate n...
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
dol_sanitizeFileName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a file name.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dol_htmlentitiesbr($stringtoencode, $nl2brmode=0, $pagecodefrom='UTF-8', $removelasteolbr=1)
This function is called to encode a string into a HTML string but differs from htmlentities because a...
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
img_edit($titlealt='default', $float=0, $other='')
Show logo edit/modify fiche.
img_up($titlealt='default', $selected=0, $moreclass='')
Show top arrow logo.
get_localtax($vatrate, $local, $thirdparty_buyer=null, $thirdparty_seller=null, $vatnpr=0)
Return localtax rate for a particular vat, when selling a product with vat $vatrate,...
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
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.