38require
"../main.inc.php";
48require_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
49require_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
50require_once DOL_DOCUMENT_ROOT.
'/core/lib/contract.lib.php';
51require_once DOL_DOCUMENT_ROOT.
'/contrat/class/contrat.class.php';
52require_once DOL_DOCUMENT_ROOT.
'/core/modules/contract/modules_contract.php';
53require_once DOL_DOCUMENT_ROOT.
'/core/class/doleditor.class.php';
54require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formfile.class.php';
55require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
56require_once DOL_DOCUMENT_ROOT.
'/compta/facture/class/facture.class.php';
57require_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.facture.class.php';
59 require_once DOL_DOCUMENT_ROOT.
'/comm/propal/class/propal.class.php';
62 require_once DOL_DOCUMENT_ROOT.
'/projet/class/project.class.php';
63 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formprojet.class.php';
65require_once DOL_DOCUMENT_ROOT.
'/core/class/extrafields.class.php';
68$langs->loadLangs(array(
"contracts",
"orders",
"companies",
"bills",
"products",
'compta',
'propal'));
70$action =
GETPOST(
'action',
'aZ09');
71$confirm =
GETPOST(
'confirm',
'alpha');
72$cancel =
GETPOST(
'cancel',
'alpha');
73$backtopage =
GETPOST(
'backtopage',
'alpha');
74$backtopageforcancel =
GETPOST(
'backtopageforcancel',
'alpha');
79$origin =
GETPOST(
'origin',
'alpha');
82$attribute =
GETPOST(
'attribute',
'aZ09');
98 $socid = $user->socid;
102$hookmanager->initHooks(array(
'contractcard',
'globalcard'));
111if ($id > 0 || !empty($ref) && $action !=
'add') {
112 $ret =
$object->fetch($id, $ref);
114 $ret =
$object->fetch_thirdparty();
122$extrafields->fetch_name_optionals_label(
$object->table_element);
125$extralabelslines = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
127$permissionnote = $user->hasRight(
'contrat',
'creer');
128$permissiondellink = $user->hasRight(
'contrat',
'creer');
129$permissiontodelete = ($user->hasRight(
'contrat',
'creer') &&
$object->status == $object::STATUS_DRAFT) || $user->hasRight(
'contrat',
'supprimer');
130$permissiontoadd = $user->hasRight(
'contrat',
'creer');
131$permissiontoedit = $permissiontoadd;
132$permissiontoactivate = $user->hasRight(
'contrat',
'activer');
133$permissiontodisable = $user->hasRight(
'contrat',
'desactiver');
134$permissiontoeditextra = $permissiontoadd;
135if (
GETPOST(
'attribute',
'aZ09') && isset($extrafields->attributes[
$object->table_element][
'perms'][
GETPOST(
'attribute',
'aZ09')])) {
137 $permissiontoeditextra =
dol_eval((
string) $extrafields->attributes[
$object->table_element][
'perms'][
GETPOST(
'attribute',
'aZ09')]);
145if (!(
$object->id > 0) && ($action ==
'view' || $action ==
'')) {
154$parameters = array(
'socid' => $socid);
155$reshook = $hookmanager->executeHooks(
'doActions', $parameters, $object, $action);
159if (empty($reshook)) {
160 $backurlforlist =
dolBuildUrl(DOL_URL_ROOT .
'/contrat/list.php');
162 if (empty($backtopage) || ($cancel && empty($id))) {
163 if (empty($backtopage) || ($cancel && strpos($backtopage,
'__ID__'))) {
164 if (empty($id) && (($action !=
'add' && $action !=
'create') || $cancel)) {
165 $backtopage = $backurlforlist;
167 $backtopage =
dolBuildUrl(DOL_URL_ROOT .
'/contrat/card.php', [
'id'=> ((!empty($id) && $id > 0) ? $id :
'__ID__')]);
173 if (!empty($backtopageforcancel)) {
174 header(
"Location: ".$backtopageforcancel);
176 } elseif (!empty($backtopage)) {
177 header(
"Location: ".$backtopage);
183 include DOL_DOCUMENT_ROOT.
'/core/actions_setnotes.inc.php';
185 include DOL_DOCUMENT_ROOT.
'/core/actions_dellink.inc.php';
187 include DOL_DOCUMENT_ROOT.
'/core/actions_lineupdown.inc.php';
189 if ($action ==
'confirm_active' && $confirm ==
'yes' && $permissiontoactivate) {
202 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
207 } elseif ($action ==
'confirm_sign' && $confirm ==
'yes' && $user->hasRight(
'contract',
'creer')) {
208 $result =
$object->setSignedStatus($user,
GETPOSTINT(
'signed_status'), 0,
'CONTRACT_MODIFY');
210 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id);
215 } elseif ($action ==
'confirm_unsign' && $confirm ==
'yes' && $user->hasRight(
'contract',
'creer')) {
216 $result =
$object->setSignedStatus($user, Contrat::$SIGNED_STATUSES[
'STATUS_NO_SIGNATURE'], 0,
'CONTRACT_MODIFY');
218 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id);
223 } elseif ($action ==
'confirm_closeline' && $confirm ==
'yes' && $permissiontodisable) {
230 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"DateEnd")),
null,
'errors');
235 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
243 if (
GETPOST(
'mode') ==
'predefined') {
255 $date_start_update =
'';
256 $date_end_update =
'';
257 $date_start_real_update =
'';
258 $date_end_real_update =
'';
259 if (
GETPOST(
'date_start_updatemonth') &&
GETPOST(
'date_start_updateday') &&
GETPOST(
'date_start_updateyear')) {
262 if (
GETPOST(
'date_end_updatemonth') &&
GETPOST(
'date_end_updateday') &&
GETPOST(
'date_end_updateyear')) {
265 if (
GETPOST(
'date_start_real_updatemonth') &&
GETPOST(
'date_start_real_updateday') &&
GETPOST(
'date_start_real_updateyear')) {
268 if (
GETPOST(
'date_end_real_updatemonth') &&
GETPOST(
'date_end_real_updateday') &&
GETPOST(
'date_end_real_updateyear')) {
276 if ($action ==
'add' && $user->hasRight(
'contrat',
'creer')) {
278 if (empty($datecontrat)) {
280 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Date")),
null,
'errors');
285 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"ThirdParty")),
null,
'errors');
291 $ret = $extrafields->setOptionalsFromPost(
null, $object);
299 $object->date_contrat = $datecontrat;
313 if (!empty($origin) && !empty($originid)) {
315 $element = $subelement = $origin;
316 if (preg_match(
'/^([^_]+)_([^_]+)/i', $origin, $regs)) {
318 $subelement = $regs[2];
323 if ($element ==
'order') {
324 $element = $subelement =
'commande';
326 if ($element ==
'propal') {
327 $element =
'comm/propal';
328 $subelement =
'propal';
330 if ($element ==
'invoice' || $element ==
'facture') {
331 $element =
'compta/facture';
332 $subelement =
'facture';
334 if ($element ==
'facturerec' || $element ==
'facture_rec') {
336 $element =
'compta/facture';
337 $subelement =
'facture-rec';
338 $classname =
'FactureRec';
340 if ($element ==
'facture_fourn_rec' || $element ==
'invoice_supplier_rec') {
342 $subelement =
'fournisseur.facture-rec';
343 $classname =
'FactureFournisseurRec';
347 $object->origin_id = $originid;
352 $object->linked_objects = array_merge(
$object->linked_objects,
GETPOST(
'other_linked_objects',
'array:int'));
359 if (empty($classname)) {
360 $classname = ucfirst($subelement);
362 $srcobject =
new $classname($db);
363 '@phan-var-force Commande|Propal|Facture $srcobject';
366 $result = $srcobject->fetch(
$object->origin_id);
368 $srcobject->fetch_thirdparty();
369 $lines = $srcobject->lines;
370 if (empty($lines) && method_exists($srcobject,
'fetch_lines')) {
371 $srcobject->fetch_lines();
372 $lines = $srcobject->lines;
376 $num = count($lines);
378 for ($i = 0; $i < $num; $i++) {
379 $product_type = ($lines[$i]->product_type ? $lines[$i]->product_type : 0);
381 if ($product_type == 1 || (
getDolGlobalString(
'CONTRACT_SUPPORT_PRODUCTS') && in_array($product_type, array(0, 1)))) {
383 if ($lines[$i]->fk_product > 0) {
384 $product_static =
new Product($db);
389 $prod->id = $lines[$i]->fk_product;
390 $prod->getMultiLangs();
392 $outputlangs = $langs;
394 if (
GETPOST(
'lang_id',
'aZ09')) {
395 $newlang =
GETPOST(
'lang_id',
'aZ09');
397 if (empty($newlang)) {
398 $newlang = $srcobject->thirdparty->default_lang;
400 if (!empty($newlang)) {
402 $outputlangs->setDefaultLang($newlang);
405 $label = (!empty($prod->multilangs[$outputlangs->defaultlang][
"libelle"])) ? $prod->multilangs[$outputlangs->defaultlang][
"libelle"] : $lines[$i]->product_label;
407 $label = $lines[$i]->product_label;
409 $desc = ($lines[$i]->desc && $lines[$i]->desc != $lines[$i]->label) ?
dol_htmlentitiesbr($lines[$i]->desc) :
'';
415 $array_options = array();
417 if (method_exists($lines[$i],
'fetch_optionals')) {
418 $lines[$i]->fetch_optionals();
419 $array_options = $lines[$i]->array_options;
422 $txtva = $lines[$i]->vat_src_code ? $lines[$i]->tva_tx.
' ('.$lines[$i]->vat_src_code.
')' : $lines[$i]->tva_tx;
430 $lines[$i]->subprice,
435 $lines[$i]->fk_product,
436 $lines[$i]->remise_percent,
437 $lines[$i]->date_start,
438 $lines[$i]->date_end,
441 $lines[$i]->info_bits,
442 $lines[$i]->fk_fournprice,
445 (
int) $lines[$i]->fk_unit,
461 $parameters = array(
'objFrom' => $srcobject);
462 $reshook = $hookmanager->executeHooks(
'createFrom', $parameters, $object, $action);
476 $result =
$object->create($user);
478 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
486 } elseif ($action ==
'classin' && $user->hasRight(
'contrat',
'creer')) {
488 } elseif ($action ==
'addline' && $user->hasRight(
'contrat',
'creer')) {
492 $line_desc = (GETPOSTISSET(
'dp_desc') ?
GETPOST(
'dp_desc',
'restricthtml') :
'');
495 $price_ht_devise =
'';
497 $price_ttc_devise =
'';
499 $rang = count(
$object->lines) + 1;
501 if (
GETPOST(
'price_ht') !==
'') {
504 if (
GETPOST(
'multicurrency_price_ht') !==
'') {
507 if (
GETPOST(
'price_ttc') !==
'') {
510 if (
GETPOST(
'multicurrency_price_ttc') !==
'') {
514 if (
GETPOST(
'prod_entry_mode',
'alpha') ==
'free') {
520 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"ProductOrService")),
null,
'errors');
525 $tva_tx =
GETPOST(
'tva_tx',
'alpha');
528 $remise_percent = (GETPOSTISSET(
'remise_percent'.$predef) ?
price2num(
GETPOST(
'remise_percent'.$predef),
'', 2) : 0);
529 if (empty($remise_percent)) {
534 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Qty")),
null,
'errors');
537 if (
GETPOST(
'prod_entry_mode',
'alpha') ==
'free' && (empty($idprod) || $idprod < 0) && empty($line_desc)) {
538 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Description")),
null,
'errors');
544 if (!empty($date_start) && !empty($date_end) && $date_start > $date_end) {
545 setEventMessages($langs->trans(
"Error").
': '.$langs->trans(
"DateStartPlanned").
' > '.$langs->trans(
"DateEndPlanned"),
null,
'errors');
550 $extralabelsline = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
551 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line, $predef);
553 if (is_array($extralabelsline)) {
555 foreach ($extralabelsline as $key => $value) {
556 unset($_POST[
"options_".$key]);
565 $price_base_type =
'';
571 $prod->fetch($idprod);
580 $price_min = $prod->price_min;
581 $price_min_ttc = $prod->price_min_ttc;
585 $price_min = $prod->multiprices_min[
$object->thirdparty->price_level];
586 $price_min_ttc = $prod->multiprices_min_ttc[
$object->thirdparty->price_level];
589 require_once DOL_DOCUMENT_ROOT.
'/product/class/productcustomerprice.class.php';
593 $filter = array(
't.fk_product' => (
string) $prod->id,
't.fk_soc' => (
string)
$object->thirdparty->id);
595 $result = $prodcustprice->fetchAll(
'',
'', 0, 0, $filter);
597 if (count($prodcustprice->lines) > 0) {
598 $date_now = (int) floor(
dol_now() / 86400) * 86400;
599 foreach ($prodcustprice->lines as $k => $custprice_line) {
600 if ($custprice_line->date_begin <= $date_now && (empty($custprice_line->date_end) || $date_now <= $custprice_line->date_end)) {
601 $price_min =
price($custprice_line->price_min);
602 $price_min_ttc =
price($custprice_line->price_min_ttc);
618 $tmpvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', $tva_tx));
619 $tmpprodvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', (
string) $prod->tva_tx));
622 if (!empty($price_ht) || $price_ht ===
'0') {
624 $pu_ttc =
price2num((
float) $pu_ht * (1 + ((
float) $tmpvat / 100)),
'MU');
625 $price_base_type =
'HT';
626 } elseif (!empty($price_ttc) || $price_ttc ===
'0') {
628 $pu_ht =
price2num((
float) $pu_ttc / (1 + ((
float) $tmpvat / 100)),
'MU');
629 $price_base_type =
'TTC';
632 $desc = $prod->description;
642 $fk_unit = $prod->fk_unit;
646 $tva_npr = (preg_match(
'/\*/', $tva_tx) ? 1 : 0);
647 if (empty($tva_tx)) {
650 $tva_tx = str_replace(
'*',
'', $tva_tx);
653 $pu_ht_devise =
price2num($price_ht_devise,
'MU');
654 $pu_ttc_devise =
price2num($price_ttc_devise,
'MU');
656 $tmpvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', $tva_tx));
659 if (!empty($price_ht) || $price_ht ===
'0') {
661 $pu_ttc =
price2num((
float) $pu_ht * (1 + ((
float) $tmpvat / 100)),
'MU');
662 $price_base_type =
'HT';
663 } elseif (!empty($price_ttc) || $price_ttc ===
'0') {
665 $pu_ht =
price2num((
float) $pu_ttc / (1 + ((
float) $tmpvat / 100)),
'MU');
666 $price_base_type =
'TTC';
674 $fk_fournprice =
GETPOST(
'fournprice');
676 $pa_ht =
GETPOST(
'buying_price');
686 if (((
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && !$user->hasRight(
'produit',
'ignore_price_min_advance'))
688 $object->error = $langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, -1, $conf->currency));
706 (
int) $fk_fournprice,
717 $outputlangs = $langs;
720 $newlang =
GETPOST(
'lang_id',
'aZ09');
723 $newlang =
$object->thirdparty->default_lang;
725 if (!empty($newlang)) {
727 $outputlangs->setDefaultLang($newlang);
732 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
735 unset($_POST[
'prod_entry_mode']);
737 unset($_POST[
'qty']);
738 unset($_POST[
'type']);
739 unset($_POST[
'remise_percent']);
740 unset($_POST[
'price_ht']);
741 unset($_POST[
'multicurrency_price_ht']);
742 unset($_POST[
'price_ttc']);
743 unset($_POST[
'tva_tx']);
744 unset($_POST[
'product_ref']);
745 unset($_POST[
'product_label']);
746 unset($_POST[
'product_desc']);
747 unset($_POST[
'fournprice']);
748 unset($_POST[
'buying_price']);
749 unset($_POST[
'np_marginRate']);
750 unset($_POST[
'np_markRate']);
751 unset($_POST[
'dp_desc']);
752 unset($_POST[
'idprod']);
754 unset($_POST[
'date_starthour']);
755 unset($_POST[
'date_startmin']);
756 unset($_POST[
'date_startsec']);
757 unset($_POST[
'date_startday']);
758 unset($_POST[
'date_startmonth']);
759 unset($_POST[
'date_startyear']);
760 unset($_POST[
'date_endhour']);
761 unset($_POST[
'date_endmin']);
762 unset($_POST[
'date_endsec']);
763 unset($_POST[
'date_endday']);
764 unset($_POST[
'date_endmonth']);
765 unset($_POST[
'date_endyear']);
770 } elseif ($action ==
'updateline' && $user->hasRight(
'contrat',
'creer') && !
GETPOST(
'cancel',
'alpha')) {
774 if (!empty($date_start_update) && !empty($date_end_update) && $date_start_update > $date_end_update) {
775 setEventMessages($langs->trans(
"Error").
': '.$langs->trans(
"DateStartPlanned").
' > '.$langs->trans(
"DateEndPlanned"),
null,
'errors');
776 $action =
'editline';
782 if ($objectline->fetch($idline) < 0) {
786 $objectline->fetch_optionals();
788 $objectline->oldcopy =
dol_clone($objectline, 2);
796 if ($date_start_real_update ==
'') {
797 $date_start_real_update = $objectline->date_start_real;
799 if ($date_end_real_update ==
'') {
800 $date_end_real_update = $objectline->date_end_real;
803 $vat_rate =
GETPOST(
'eltva_tx',
'alpha');
806 if (preg_match(
'/\*/', $vat_rate)) {
811 $vat_rate = str_replace(
'*',
'', $vat_rate);
820 if (preg_match(
'/\((.*)\)/', $txtva, $reg)) {
821 $vat_src_code = $reg[1];
822 $txtva = preg_replace(
'/\s*\(.*\)/',
'', $txtva);
838 $objectline->fk_product =
GETPOSTINT(
'idprod');
839 $objectline->description =
GETPOST(
'product_desc',
'restricthtml');
842 $objectline->remise_percent = $remise_percent;
843 $objectline->tva_tx = ($txtva ? $txtva : 0);
844 $objectline->vat_src_code = $vat_src_code;
845 $objectline->localtax1_tx = is_numeric($localtax1_tx) ? $localtax1_tx : 0;
846 $objectline->localtax2_tx = is_numeric($localtax2_tx) ? $localtax2_tx : 0;
847 $objectline->date_start = $date_start_update;
848 $objectline->date_start_real = $date_start_real_update;
849 $objectline->date_end = $date_end_update;
850 $objectline->date_end_real = $date_end_real_update;
851 $objectline->user_closing_id = $user->id;
853 $objectline->pa_ht = $pa_ht;
859 $objectline->fk_unit =
null;
863 $extralabelsline = $extrafields->fetch_name_optionals_label($objectline->table_element);
864 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line, $predef);
866 if (is_array($array_options) && count($array_options) > 0) {
868 foreach ($array_options as $key => $value) {
869 $objectline->array_options[$key] = $array_options[$key];
875 $result = $objectline->update($user);
878 $action =
'editline';
879 $_GET[
'rowid'] =
GETPOST(
'elrowid');
889 } elseif ($action ==
'confirm_deleteline' && $confirm ==
'yes' && $user->hasRight(
'contrat',
'creer')) {
893 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
898 } elseif ($action ==
'confirm_valid' && $confirm ==
'yes' && $user->hasRight(
'contrat',
'creer')) {
899 $result =
$object->validate($user);
904 $outputlangs = $langs;
907 $newlang =
GETPOST(
'lang_id',
'aZ09');
910 $newlang =
$object->thirdparty->default_lang;
912 if (!empty($newlang)) {
914 $outputlangs->setDefaultLang($newlang);
919 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
924 } elseif ($action ==
'reopen' && $user->hasRight(
'contrat',
'creer')) {
925 $result =
$object->reopen($user);
929 } elseif ($action ==
'confirm_close' && $confirm ==
'yes' && $permissiontodisable) {
931 $result =
$object->closeAll($user);
935 } elseif ($action ==
'confirm_activate' && $confirm ==
'yes' && $permissiontoactivate) {
938 $comment =
GETPOST(
'comment',
'alpha');
939 $result =
$object->activateAll($user, $date_start, 0, $comment, $date_end);
943 } elseif ($action ==
'confirm_delete' && $confirm ==
'yes' && $permissiontodelete) {
944 $result =
$object->delete($user);
946 header(
"Location: list.php?restore_lastsearch_values=1");
951 } elseif ($action ==
'confirm_move' && $confirm ==
'yes' && $permissiontoedit) {
954 $result = $contractline->fetch(
GETPOSTINT(
'lineid'));
955 $contractline->fk_contrat =
GETPOSTINT(
'newcid');
956 $result = $contractline->update($user, 1);
958 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$id);
964 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentities(
"RefNewContract")),
null,
'errors');
966 } elseif ($action ==
'update_extras' && $permissiontoeditextra) {
969 $attribute =
GETPOST(
'attribute',
'aZ09');
972 $ret = $extrafields->setOptionalsFromPost(
null, $object, $attribute);
979 $result =
$object->updateExtraField($attribute,
'CONTRACT_MODIFY');
987 $action =
'edit_extras';
989 } elseif ($action ==
'setref_supplier' && $permissiontoadd) {
993 $result =
$object->setValueFrom(
'ref_supplier',
GETPOST(
'ref_supplier',
'alpha'),
'',
null,
'text',
'', $user,
'CONTRACT_MODIFY');
996 $action =
'editref_supplier';
998 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
1002 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$id);
1005 } elseif ($action ==
'setref_customer' && $permissiontoadd) {
1009 $result =
$object->setValueFrom(
'ref_customer',
GETPOST(
'ref_customer',
'alpha'),
'',
null,
'text',
'', $user,
'CONTRACT_MODIFY');
1012 $action =
'editref_customer';
1014 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
1018 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$id);
1021 } elseif ($action ==
'setref' && $permissiontoadd) {
1023 $result =
$object->fetch($id);
1030 $result =
$object->setValueFrom(
'ref',
GETPOST(
'ref',
'alpha'),
'',
null,
'text',
'', $user,
'CONTRACT_MODIFY');
1033 $action =
'editref';
1035 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
1042 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
1046 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$id);
1049 } elseif ($action ==
'setdate_contrat' && $permissiontoadd) {
1051 $result =
$object->fetch($id);
1056 $result =
$object->setValueFrom(
'date_contrat', $datacontrat,
'',
null,
'date',
'', $user,
'CONTRACT_MODIFY');
1059 $action =
'editdate_contrat';
1061 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
1065 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$id);
1071 include DOL_DOCUMENT_ROOT.
'/core/actions_printing.inc.php';
1074 $upload_dir = $conf->contrat->multidir_output[!empty(
$object->entity) ?
$object->entity : $conf->entity];
1075 include DOL_DOCUMENT_ROOT.
'/core/actions_builddoc.inc.php';
1078 $triggersendname =
'CONTRACT_SENTBYMAIL';
1080 $mode =
'emailfromcontract';
1081 $trackid =
'con'.$object->id;
1082 include DOL_DOCUMENT_ROOT.
'/core/actions_sendmails.inc.php';
1086 if ($action ==
'addcontact' && $user->hasRight(
'contrat',
'creer')) {
1089 $result =
$object->add_contact($contactid, $typeid,
GETPOST(
"source",
'aZ09'));
1092 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
1095 if (
$object->error ==
'DB_ERROR_RECORD_ALREADY_EXISTS') {
1096 $langs->load(
"errors");
1097 setEventMessages($langs->trans(
"ErrorThisContactIsAlreadyDefinedAsThisType"),
null,
'errors');
1102 } elseif ($action ==
'swapstatut' && $user->hasRight(
'contrat',
'creer')) {
1105 } elseif ($action ==
'deletecontact' && $user->hasRight(
'contrat',
'creer')) {
1110 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
1119 if ($action ==
'confirm_clone' && $confirm ==
'yes' && $user->hasRight(
'contrat',
'creer')) {
1121 setEventMessages($langs->trans(
"NoCloneOptionsSpecified"),
null,
'errors');
1124 $result =
$object->createFromClone($user, $socid);
1126 header(
"Location: ".$_SERVER[
'PHP_SELF'].
'?id='.$result);
1129 if (count(
$object->errors) > 0) {
1144$title =
$object->ref.
" - ".$langs->trans(
'Contract');
1145if ($action ==
'create') {
1146 $title = $langs->trans(
"NewContract");
1148$help_url =
'EN:Module_Contracts|FR:Module_Contrat|ES:Contratos_de_servicio';
1150llxHeader(
'', $title, $help_url,
'', 0, 0,
'',
'',
'',
'mod-contrat page-card');
1152$form =
new Form($db);
1160if (substr($module, 0, 13) ==
'mod_contract_' && substr($module, -3) ==
'php') {
1161 $module = substr($module, 0,
dol_strlen($module) - 4);
1164$modCodeContract =
null;
1166 $modCodeContract =
new $module();
1168 '@phan-var-force ModelNumRefContracts $modCodeContract';
1172if ($action ==
'create') {
1178 $soc->fetch($socid);
1184 $element = $subelement =
GETPOST(
'origin');
1185 if (preg_match(
'/^([^_]+)_([^_]+)/i',
GETPOST(
'origin'), $regs)) {
1186 $element = $regs[1];
1187 $subelement = $regs[2];
1190 if ($element ==
'project') {
1194 if ($element ==
'order' || $element ==
'commande') {
1195 $element = $subelement =
'commande';
1197 if ($element ==
'propal') {
1198 $element =
'comm/propal';
1199 $subelement =
'propal';
1201 if ($element ==
'invoice' || $element ==
'facture') {
1202 $element =
'compta/facture';
1203 $subelement =
'facture';
1206 if ($element ==
'facturerec' || $element ==
'facture_rec') {
1207 $element =
'compta/facture';
1208 $subelement =
'facture-rec';
1209 $classname =
'FactureRec';
1211 if ($element ==
'facture_fourn_rec' || $element ==
'invoice_supplier_rec') {
1213 $subelement =
'fournisseur.facture-rec';
1214 $classname =
'FactureFournisseurRec';
1219 if (empty($classname)) {
1220 $classname = ucfirst($subelement);
1222 $objectsrc =
new $classname($db);
1223 '@phan-var-force Commande|Propal|Facture $objectsrc';
1224 $objectsrc->fetch($originid);
1225 if (empty($objectsrc->lines) && method_exists($objectsrc,
'fetch_lines')) {
1226 $objectsrc->fetch_lines();
1228 $objectsrc->fetch_thirdparty();
1231 $objectsrc->fetch_optionals();
1232 $object->array_options = $objectsrc->array_options;
1234 $projectid = (int) $objectsrc->fk_project;
1236 $soc = $objectsrc->thirdparty;
1238 $note_private = (!empty($objectsrc->note_private) ? $objectsrc->note_private :
'');
1239 $note_public = (!empty($objectsrc->note_public) ? $objectsrc->note_public :
'');
1242 $srccontactslist = $objectsrc->liste_contact(-1,
'external', 1);
1246 $note_private =
GETPOST(
"note_private",
"alpha");
1247 $note_public =
GETPOST(
"note_public",
"alpha");
1252 print
'<form name="form_contract" action="'.$_SERVER[
"PHP_SELF"].
'" method="post">';
1253 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1254 print
'<input type="hidden" name="action" value="add">';
1255 print
'<input type="hidden" name="socid" value="'.$soc->id.
'">'.
"\n";
1256 print
'<input type="hidden" name="remise_percent" value="0">';
1257 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
1261 print
'<table class="border centpercent">';
1264 print
'<tr><td class="titlefield fieldrequired">'.$langs->trans(
'Ref').
'</td><td>';
1265 if (!empty($modCodeContract->code_auto)) {
1266 $tmpcode = $langs->trans(
"Draft");
1268 $tmpcode =
'<input name="ref" class="maxwidth100" maxlength="128" value="'.dol_escape_htmltag(
GETPOST(
'ref',
'alpha')).
'">';
1274 print
'<tr><td>'.$langs->trans(
'RefCustomer').
'</td>';
1275 print
'<td><input type="text" class="maxwidth150" name="ref_customer" id="ref_customer" value="'.dol_escape_htmltag(
GETPOST(
'ref_customer',
'alpha')).
'"></td></tr>';
1278 print
'<tr><td>'.$langs->trans(
'RefSupplier').
'</td>';
1279 print
'<td><input type="text" class="maxwidth150" name="ref_supplier" id="ref_supplier" value="'.dol_escape_htmltag(
GETPOST(
'ref_supplier',
'alpha')).
'"></td></tr>';
1283 print
'<td class="fieldrequired">'.$langs->trans(
'ThirdParty').
'</td>';
1286 print $soc->getNomUrl(1);
1287 print
'<input type="hidden" name="socid" value="'.$soc->id.
'">';
1291 print
img_picto(
'',
'company',
'class="pictofixedwidth"');
1292 print $form->select_company(
'',
'socid',
'',
'SelectThirdParty', 1, 0, array(), 0,
'minwidth150 widthcentpercentminusxx maxwidth500');
1293 print
' <a href="'.dolBuildUrl(DOL_URL_ROOT .
'/societe/card.php', [
'action' =>
'create',
'customer' => 3,
'backtopage' =>
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'action' =>
'create'])]).
'"><span class="fa fa-plus-circle valignmiddle paddingleft" title="'.$langs->trans(
"AddThirdParty").
'"></span></a>';
1300 print
'<tr><td>'.$langs->trans(
'Discounts').
'</td><td>';
1301 if ($soc->remise_percent) {
1302 print $langs->trans(
"CompanyHasRelativeDiscount", $soc->remise_percent).
' ';
1304 print
'<span class="hideonsmartphone">'.$langs->trans(
"CompanyHasNoRelativeDiscount").
'. </span>';
1306 $absolute_discount = $soc->getAvailableDiscounts();
1307 if ($absolute_discount) {
1308 print $langs->trans(
"CompanyHasAbsoluteDiscount",
price($absolute_discount), $langs->trans(
"Currency".$conf->currency)).
'.';
1310 print
'<span class="hideonsmartphone">'.$langs->trans(
"CompanyHasNoAbsoluteDiscount").
'.</span>';
1316 print
'<tr><td class="nowrap"><span class="fieldrequired">'.$langs->trans(
"TypeContact_contrat_internal_SALESREPFOLL").
'</span></td><td>';
1317 print
img_picto(
'',
'user',
'class="pictofixedwidth"');
1318 print $form->select_dolusers(
GETPOST(
"commercial_suivi_id") ?
GETPOST(
"commercial_suivi_id") : $user->id,
'commercial_suivi_id', 1, null);
1322 print
'<tr><td class="nowrap"><span class="fieldrequired">'.$langs->trans(
"TypeContact_contrat_internal_SALESREPSIGN").
'</span></td><td>';
1323 print
img_picto(
'',
'user',
'class="pictofixedwidth"');
1324 print $form->select_dolusers(
GETPOST(
"commercial_signature_id") ?
GETPOST(
"commercial_signature_id") : $user->id,
'commercial_signature_id', 1, null);
1327 print
'<tr><td><span class="fieldrequired">'.$langs->trans(
"Date").
'</span></td><td>';
1328 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
1329 print $form->selectDate($datecontrat,
'', 0, 0, 0,
"contrat");
1334 $langs->load(
'projects');
1338 print
'<tr><td>'.$langs->trans(
"Project").
'</td><td>';
1339 print
img_picto(
'',
'project',
'class="pictofixedwidth"');
1340 $formproject->select_projects(($soc->id > 0 ? $soc->id : -1), $projectid,
"projectid", 0, 0, 1, 1, 0, 0, 0,
'', 0, 0,
'minwidth150 maxwidth300 widthcentpercentminusxx');
1341 print
' <a href="' .
dolBuildUrl(DOL_URL_ROOT .
'/projet/card.php', [
'socid' => $soc->id,
'action' =>
'create',
'status' => 1,
'backtopage' =>
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'action' =>
'create',
'socid' => $soc->id])]) .
'"><span class="fa fa-plus-circle valignmiddle" title="'.$langs->trans(
"AddProject").
'"></span></a>';
1346 print
'<tr><td>'.$langs->trans(
"NotePublic").
'</td><td class="tdtop">';
1347 $doleditor =
new DolEditor(
'note_public', (
string) $note_public,
'', 100,
'dolibarr_notes',
'In',
true,
true, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PUBLIC') ? 0 : 1, ROWS_3,
'90%');
1348 print $doleditor->Create(1);
1352 if (empty($user->socid)) {
1353 print
'<tr><td>'.$langs->trans(
"NotePrivate").
'</td><td class="tdtop">';
1354 $doleditor =
new DolEditor(
'note_private', (
string) $note_private,
'', 100,
'dolibarr_notes',
'In',
true,
true, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PRIVATE') ? 0 : 1, ROWS_3,
'90%');
1355 print $doleditor->Create(1);
1360 $parameters = array(
'objectsrc' => $objectsrc,
'colspan' =>
' colspan="3"',
'cols' =>
'3');
1361 $reshook = $hookmanager->executeHooks(
'formObjectOptions', $parameters, $object, $action);
1362 print $hookmanager->resPrint;
1365 if (empty($reshook)) {
1366 print
$object->showOptionals($extrafields,
'create', $parameters);
1373 print $form->buttonsSaveCancel(
"Create");
1375 if (is_object($objectsrc)) {
1376 print
'<input type="hidden" name="origin" value="'.$objectsrc->element.
'">';
1377 print
'<input type="hidden" name="originid" value="'.$objectsrc->id.
'">';
1380 print
'<br>'.$langs->trans(
"Note").
': '.$langs->trans(
"OnlyLinesWithTypeServiceAreUsed");
1394 $result =
$object->fetch_lines();
1399 $nbofservices = count(
$object->lines);
1401 $author =
new User($db);
1402 $author->fetch(
$object->user_author_id);
1404 $commercial_signature =
new User($db);
1405 $commercial_signature->fetch(
$object->commercial_signature_id);
1407 $commercial_suivi =
new User($db);
1408 $commercial_suivi->fetch(
$object->commercial_suivi_id);
1415 print
dol_get_fiche_head($head, $hselected, $langs->trans(
"Contract"), -1,
'contract');
1418 if ($action ==
'delete') {
1420 $formconfirm = $form->formconfirm($_SERVER[
'PHP_SELF'].
"?id=".
$object->id, $langs->trans(
"DeleteAContract"), $langs->trans(
"ConfirmDeleteAContract"),
"confirm_delete",
'', 0, 1);
1421 } elseif ($action ==
'valid') {
1423 $ref = substr(
$object->ref, 1, 4);
1424 if ($ref ==
'PROV' && !empty($modCodeContract->code_auto)) {
1427 $numref = (string)
$object->ref;
1429 $text = $langs->trans(
'ConfirmValidateContract', $numref);
1430 $formconfirm = $form->formconfirm($_SERVER[
'PHP_SELF'].
"?id=".
$object->id, $langs->trans(
"ValidateAContract"), $text,
"confirm_valid",
'', 0, 1);
1431 } elseif ($action ==
'close') {
1433 $formconfirm = $form->formconfirm($_SERVER[
'PHP_SELF'].
"?id=".
$object->id, $langs->trans(
"CloseAContract"), $langs->trans(
"ConfirmCloseContract"),
"confirm_close",
'', 0, 1);
1434 } elseif ($action ==
'activate') {
1435 $formquestion = array(
1436 array(
'type' =>
'date',
'name' =>
'd_start',
'label' => $langs->trans(
"DateServiceActivate"),
'value' =>
dol_now()),
1437 array(
'type' =>
'date',
'name' =>
'd_end',
'label' => $langs->trans(
"DateEndPlanned"), 0 =>
'', 1 =>
''),
1438 array(
'type' =>
'text',
'name' =>
'comment',
'label' => $langs->trans(
"Comment"),
'value' =>
'', 0 =>
'', 1 =>
'',
'class' =>
'minwidth300',
'moreattr' =>
'autofocus')
1440 $formconfirm = $form->formconfirm($_SERVER[
'PHP_SELF'].
"?id=".
$object->id, $langs->trans(
"ActivateAllOnContract"), $langs->trans(
"ConfirmActivateAllOnContract"),
"confirm_activate", $formquestion,
'yes', 1, 300);
1441 } elseif ($action ==
'clone') {
1442 $filter =
'(s.client:IN:1,2,3)';
1444 $formquestion = array(array(
'type' =>
'other',
'name' =>
'socid',
'label' => $langs->trans(
"SelectThirdParty"),
'value' => $form->select_company(
GETPOSTINT(
'socid'),
'socid', $filter)));
1445 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'ToClone'), $langs->trans(
'ConfirmCloneContract',
$object->ref),
'confirm_clone', $formquestion,
'yes', 1);
1446 } elseif ($action ==
'sign') {
1447 $text = $langs->trans(
'ConfirmSignContract');
1449 require_once DOL_DOCUMENT_ROOT.
'/core/class/notify.class.php';
1450 $notify =
new Notify($db);
1452 $text .= $notify->confirmMessage(
'CONTRACT_MODIFY',
$object->socid, $object);
1457 'name' =>
'signed_status',
1458 'label' =>
'<span class="fieldrequired">'.$langs->trans(
'SignStatus').
'</span>',
1459 'values' =>
$object->getSignedStatusLocalisedArray()
1461 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'SignContract'), $text,
'confirm_sign', $formquestion, 0, 1);
1462 } elseif ($action ==
'unsign') {
1463 $text = $langs->trans(
'ConfirmUnsignContract');
1465 require_once DOL_DOCUMENT_ROOT.
'/core/class/notify.class.php';
1466 $notify =
new Notify($db);
1468 $text .= $notify->confirmMessage(
'CONTRACT_MODIFY',
$object->socid, $object);
1470 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'UnsignContract'), $text,
'confirm_unsign',
'', 0, 1);
1475 $parameters = array(
1476 'formConfirm' => $formconfirm,
1481 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters, $object, $action);
1482 if (empty($reshook)) {
1483 $formconfirm .= $hookmanager->resPrint;
1484 } elseif ($reshook > 0) {
1485 $formconfirm = $hookmanager->resPrint;
1493 if (
$object->status == $object::STATUS_DRAFT && $user->hasRight(
'contrat',
'creer')) {
1494 print
'<form action="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'" method="POST">';
1495 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1496 print
'<input type="hidden" name="action" value="setremise">';
1497 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
1502 $linkback =
'<a href="'.DOL_URL_ROOT.
'/contrat/list.php?restore_lastsearch_values=1'.(!empty($socid) ?
'&socid='.$socid :
'').
'">'.$langs->trans(
"BackToList").
'</a>';
1506 if (!empty($modCodeContract->code_auto)) {
1509 $morehtmlref .= $form->editfieldkey(
"",
'ref',
$object->ref, $object, $user->hasRight(
'contrat',
'creer'),
'string',
'', 0, 3);
1510 $morehtmlref .= $form->editfieldval(
"",
'ref',
$object->ref, $object, $user->hasRight(
'contrat',
'creer'),
'string',
'',
null,
'2');
1513 $morehtmlref .=
'<div class="refidno">';
1515 $morehtmlref .= $form->editfieldkey(
"RefCustomer",
'ref_customer',
$object->ref_customer, $object, $user->hasRight(
'contrat',
'creer'),
'string',
'', 0, 1);
1516 $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');
1518 $morehtmlref .=
'<br>';
1519 $morehtmlref .= $form->editfieldkey(
"RefSupplier",
'ref_supplier',
$object->ref_supplier, $object, $user->hasRight(
'contrat',
'creer'),
'string',
'', 0, 1);
1520 $morehtmlref .= $form->editfieldval(
"RefSupplier",
'ref_supplier',
$object->ref_supplier, $object, $user->hasRight(
'contrat',
'creer'),
'string',
'',
null,
null,
'', 1,
'getFormatedSupplierRef');
1522 $morehtmlref .=
'<br>'.$object->thirdparty->getNomUrl(1);
1524 $morehtmlref .=
' <span class="otherlink valignmiddle">(<a href="'.DOL_URL_ROOT.
'/contrat/list.php?socid='.
$object->thirdparty->id.
'&search_name='.urlencode(
$object->thirdparty->name).
'">'.$langs->trans(
"OtherContracts").
'</a>)</span>';
1528 $langs->load(
"projects");
1529 $morehtmlref .=
'<br>';
1530 if ($permissiontoadd) {
1531 $morehtmlref .=
img_picto($langs->trans(
"Project"),
'project',
'class="pictofixedwidth"');
1532 if ($action !=
'classify') {
1533 $morehtmlref .=
'<a class="editfielda" href="'.dolBuildUrl($_SERVER[
'PHP_SELF'], [
'action' =>
'classify',
'id' =>
$object->id],
true).
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetProject')).
'</a> ';
1535 $morehtmlref .= $form->form_project($_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
$object->socid, (
string)
$object->fk_project, ($action ==
'classify' ?
'projectid' :
'none'), 0, 0, 0, 1,
'',
'maxwidth300');
1537 if (!empty(
$object->fk_project)) {
1539 $proj->fetch(
$object->fk_project);
1540 $morehtmlref .= $proj->getNomUrl(1);
1542 $morehtmlref .=
'<span class="opacitymedium"> - '.dol_escape_htmltag($proj->title).
'</span>';
1547 $morehtmlref .=
'</div>';
1550 dol_banner_tab($object,
'ref', $linkback, 1,
'ref',
'none', $morehtmlref);
1553 print
'<div class="fichecenter">';
1554 print
'<div class="underbanner clearboth"></div>';
1557 print
'<table class="border tableforfield" width="100%">';
1560 print
'<tr><td class="titlefield">'.$langs->trans(
'Discount').
'</td><td colspan="3">';
1561 if (
$object->thirdparty->remise_percent) {
1562 print $langs->trans(
"CompanyHasRelativeDiscount",
$object->thirdparty->remise_percent).
'. ';
1564 print
'<span class="hideonsmartphone">'.$langs->trans(
"CompanyHasNoRelativeDiscount").
'. </span>';
1566 $absolute_discount =
$object->thirdparty->getAvailableDiscounts();
1567 if ($absolute_discount) {
1568 print $langs->trans(
"CompanyHasAbsoluteDiscount",
price($absolute_discount), $langs->trans(
"Currency".$conf->currency)).
'.';
1570 print
'<span class="hideonsmartphone">'.$langs->trans(
"CompanyHasNoAbsoluteDiscount").
'.</span>';
1576 print
'<td class="titlefield">';
1577 print $form->editfieldkey(
"Date",
'date_contrat',
$object->date_contrat, $object, $user->hasRight(
'contrat',
'creer'));
1579 print $form->editfieldval(
"Date",
'date_contrat',
$object->date_contrat, $object, $user->hasRight(
'contrat',
'creer'),
'datehourpicker');
1584 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_view.tpl.php';
1590 if (
$object->status == $object::STATUS_DRAFT && $user->hasRight(
'contrat',
'creer')) {
1597 $blocname =
'contacts';
1598 $title = $langs->trans(
'ContactsAddresses');
1599 include DOL_DOCUMENT_ROOT.
'/core/tpl/bloc_showhide.tpl.php';
1603 $blocname =
'notes';
1604 $title = $langs->trans(
'Notes');
1605 include DOL_DOCUMENT_ROOT.
'/core/tpl/bloc_showhide.tpl.php';
1609 $arrayothercontracts =
$object->getListOfContracts(
'others');
1617 global $inputalsopricewithtax;
1618 $inputalsopricewithtax = 1;
1620 $productstatic =
new Product($db);
1623 if (
isModEnabled(
'margin') && !empty(
$object->element) && in_array(
$object->element, array(
'facture',
'propal',
'commande'))) {
1627 $parameters = array(
'nbOfLines' => &$nbofservices);
1628 $reshook = $hookmanager->executeHooks(
'printObjectLinesBlock', $parameters, $object, $action);
1629 if (empty($reshook)) {
1633 print
'<div id="contrat-lines-container" id="contractlines" data-contractid="'.$object->id.
'" data-element="'.
$object->element.
'" >';
1634 while ($cursorline <= $nbofservices) {
1635 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.
'" >';
1636 print
'<form name="update" id="addproduct" action="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'" method="post">';
1637 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1638 print
'<input type="hidden" name="action" value="updateline">';
1639 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
1640 print
'<input type="hidden" name="elrowid" value="'.$object->lines[$cursorline - 1]->id.
'">';
1641 print
'<input type="hidden" name="fournprice" value="'.(!empty(
$object->lines[$cursorline - 1]->fk_fournprice) ?
$object->lines[$cursorline - 1]->fk_fournprice : 0).
'">';
1644 print
'<div class="div-table-responsive-no-min">';
1645 print
'<table class="notopnoleftnoright allwidth tableforservicepart1 centpercent">';
1647 $sql =
"SELECT cd.rowid, cd.statut, cd.label as label_det, cd.fk_product, cd.product_type, cd.description, cd.qty,";
1648 $sql .=
" cd.tva_tx, cd.vat_src_code, cd.remise_percent, cd.info_bits, cd.subprice, cd.multicurrency_subprice,";
1649 $sql .=
" cd.date_ouverture_prevue as date_start, cd.date_ouverture as date_start_real,";
1650 $sql .=
" cd.date_fin_validite as date_end, cd.date_cloture as date_end_real,";
1651 $sql .=
" cd.commentaire as comment, cd.fk_product_fournisseur_price as fk_fournprice, cd.buy_price_ht as pa_ht,";
1652 $sql .=
" cd.fk_unit,";
1653 $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";
1654 $sql .=
" ,cd.rang";
1655 $sql .=
" FROM ".MAIN_DB_PREFIX.
"contratdet as cd";
1656 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"product as p ON cd.fk_product = p.rowid";
1657 $sql .=
" WHERE cd.rowid = ".((int)
$object->lines[$cursorline - 1]->id);
1659 $result = $db->query($sql);
1664 $objp = $db->fetch_object($result);
1667 print
'<tr class="liste_titre'.($cursorline ?
' liste_titre_add' :
'').
'">';
1668 print
'<td>'.$langs->trans(
"ServiceNb", $cursorline).
'</td>';
1669 print
'<td width="80" class="center">'.$langs->trans(
"VAT").
'</td>';
1670 print
'<td width="80" class="right">'.$langs->trans(
"PriceUHT").
'</td>';
1674 print
'<td width="30" class="center">'.$langs->trans(
"Qty").
'</td>';
1676 print
'<td width="30" class="left">'.$langs->trans(
"Unit").
'</td>';
1678 print
'<td width="50" class="right">'.$langs->trans(
"ReductionShort").
'</td>';
1680 print
'<td width="50" class="right">'.$langs->trans(
"BuyingPrice").
'</td>';
1684 if ($nbofservices > 1 && $conf->browser->layout !=
'phone' && $user->hasRight(
'contrat',
'creer')) {
1685 print
'<td width="30" class="linecolmove tdlineupdown center">';
1686 if ($cursorline > 1) {
1687 print
'<a class="lineupdown reposition" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=up&token='.
newToken().
'&rowid='.$objp->rowid.
'">';
1688 echo
img_up(
'default', 0,
'imgupforline');
1691 if ($cursorline < $nbofservices) {
1692 print
'<a class="lineupdown reposition" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=down&token='.
newToken().
'&rowid='.$objp->rowid.
'">';
1693 echo
img_down(
'default', 0,
'imgdownforline');
1698 print
'<td width="30"> </td>';
1706 if ($action !=
'editline' || $idline != $objp->rowid) {
1708 if (
getDolGlobalString(
'CONTRACT_HIDE_CLOSED_SERVICES_BY_DEFAULT') && $objp->statut == ContratLigne::STATUS_CLOSED && $action !=
'showclosedlines') {
1709 $moreparam =
'style="display: none;"';
1713 $line->id = $objp->rowid;
1717 print
'<tr class="tdtop oddeven" '.$moreparam.
'>';
1720 print
'<td class="linecoldescription minwidth300imp">';
1722 print
'<div id="line_'.$line->rowid.
'"></div>';
1723 if ($objp->fk_product > 0) {
1724 $productstatic->id = $objp->fk_product;
1725 $productstatic->type = $objp->ptype;
1726 $productstatic->ref = $objp->pref;
1727 $productstatic->entity = $objp->pentity;
1728 $productstatic->label = $objp->plabel;
1729 $productstatic->status = $objp->tosell;
1730 $productstatic->status_buy = $objp->tobuy;
1731 $productstatic->status_batch = $objp->tobatch;
1733 $text = $productstatic->getNomUrl(1,
'', 32);
1734 if ($objp->plabel) {
1736 $text .= $objp->plabel;
1738 $description = $objp->description;
1741 print (!empty($line->fk_parent_line) ?
img_picto(
'',
'rightarrow.png') :
'') . $text;
1743 print $form->textwithpicto(
'', $description);
1746 print $form->textwithtooltip($text, $description, 3, 0,
'',
'', 0, (!empty($line->fk_parent_line) ?
img_picto(
'',
'rightarrow.png') :
''));
1750 if ($line->fk_product > 0 &&
getDolGlobalInt(
'PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE')) {
1751 print (!empty($line->description) && $line->description != $line->plabel) ? (($line->date_start || $line->date_end) ?
'' :
'<br>').
'<br>'.
dol_htmlentitiesbr($line->
description) :
'';
1759 print
'<td class="center">';
1760 print
vatrate($objp->tva_tx.($objp->vat_src_code ? (
' ('.$objp->vat_src_code.
')') :
''), true, $objp->info_bits);
1763 print
'<td class="right">'.($objp->subprice !=
'' ?
price($objp->subprice) :
'').
"</td>\n";
1769 print
'<td class="center">'.$objp->qty.
'</td>';
1772 print
'<td class="left">'.$object->lines[$cursorline - 1]->getLabelOfUnit(
'long', $langs).
'</td>';
1775 if ($objp->remise_percent > 0) {
1776 print
'<td class="right">'.$objp->remise_percent.
"%</td>\n";
1778 print
'<td> </td>';
1783 print
'<td class="right nowraponall">'.price($objp->pa_ht).
'</td>';
1787 print
'<td class="nowraponall right">';
1788 if ($user->hasRight(
'contrat',
'creer') && is_array($arrayothercontracts) && count($arrayothercontracts) && (
$object->status >= 0)) {
1789 print
'<!-- link to move service line into another contract -->';
1790 print
'<a class="reposition marginrightonly" style="padding-left: 5px;" href="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'&action=move&token='.
newToken().
'&elrowid='.$objp->rowid.
'">';
1791 print
img_picto($langs->trans(
"MoveToAnotherContract"),
'uparrow');
1794 if ($user->hasRight(
'contrat',
'creer') && (
$object->statut >= 0)) {
1795 print
'<a class="reposition marginrightonly editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'&action=editline&token='.
newToken().
'&elrowid='.$objp->rowid.
'">';
1799 if ($user->hasRight(
'contrat',
'creer') && (
$object->statut >= 0)) {
1800 print
'<a class="reposition marginrightonly" href="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'&action=deleteline&token='.
newToken().
'&elrowid='.$objp->rowid.
'">';
1817 if ($objp->subprice >= 0) {
1818 print
'<tr class="oddeven" '.$moreparam.
'>';
1819 print
'<td colspan="'.$colspan.
'">';
1822 print $langs->trans(
"DateStartPlanned").
': ';
1823 if ($objp->date_start) {
1826 if ($objp->statut == 0 && $db->jdate($objp->date_start) < ($now - $conf->contrat->services->inactifs->warning_delay)) {
1827 $warning_delay = $conf->contrat->services->inactifs->warning_delay / 3600 / 24;
1828 $textlate = $langs->trans(
"Late").
' = '.$langs->trans(
"DateReference").
' > '.$langs->trans(
"DateToday").
' '.(ceil($warning_delay) >= 0 ?
'+' :
'').ceil($warning_delay).
' '.$langs->trans(
"days");
1829 print
" ".img_warning($textlate);
1832 print $langs->trans(
"Unknown");
1834 print
' - ';
1835 print $langs->trans(
"DateEndPlanned").
': ';
1836 if ($objp->date_end) {
1838 if ($objp->statut == 4 && $db->jdate($objp->date_end) < ($now - $conf->contrat->services->expires->warning_delay)) {
1839 $warning_delay = $conf->contrat->services->expires->warning_delay / 3600 / 24;
1840 $textlate = $langs->trans(
"Late").
' = '.$langs->trans(
"DateReference").
' > '.$langs->trans(
"DateToday").
' '.(ceil($warning_delay) >= 0 ?
'+' :
'').ceil($warning_delay).
' '.$langs->trans(
"days");
1841 print
" ".img_warning($textlate);
1844 print $langs->trans(
"Unknown");
1852 if (is_array($extralabelslines) && count($extralabelslines) > 0) {
1854 $line->id = $objp->rowid;
1855 $line->fetch_optionals();
1856 print $line->showOptionals($extrafields,
'view', array(
'class' =>
'oddeven',
'style' => $moreparam,
'colspan' => $colspan,
'tdclass' =>
'notitlefieldcreate'),
'',
'',
'1');
1861 print
'<tr class="oddeven">';
1863 $currentLineProductId = GETPOSTISSET(
'idprod') ?
GETPOST(
'idprod') : (!empty(
$object->lines[$cursorline - 1]->fk_product) ?
$object->lines[$cursorline - 1]->fk_product : 0);
1864 if ($objp->fk_product > 0) {
1865 $canchangeproduct = 1;
1868 if (empty($canchangeproduct)) {
1869 $productstatic->id = $objp->fk_product;
1870 $productstatic->type = $objp->ptype;
1871 $productstatic->ref = $objp->pref;
1872 $productstatic->entity = $objp->pentity;
1873 print $productstatic->getNomUrl(1,
'', 32);
1874 print $objp->label ?
' - '.dol_trunc($objp->label, 32) :
'';
1875 print
'<input type="hidden" name="idprod" value="'.$currentLineProductId.
'">';
1877 $senderissupplier = 0;
1878 if (empty($senderissupplier)) {
1884 print $form->select_produits($currentLineProductId,
'idprod', $filtertype, 0, 0, 1, 2,
'', 0, array(), 0, 1, 0,
'minwidth250onall maxwidth500 widthcentpercentminusx');
1886 $form->select_produits_fournisseurs($currentLineProductId,
'idprod');
1891 print $objp->label ? $objp->label.
'<br>' :
'';
1892 print
'<input type="hidden" name="idprod" value="'.$currentLineProductId.
'">';
1896 require_once DOL_DOCUMENT_ROOT.
'/core/class/doleditor.class.php';
1901 $doleditor =
new DolEditor(
'product_desc', (GETPOSTISSET(
'product_desc') ?
GETPOST(
'product_desc') : $objp->
description),
'', 92,
'dolibarr_details',
'', false, true,
getDolGlobalInt(
'FCKEDITOR_ENABLE_DETAILS'), $nbrows,
'90%');
1902 $doleditor->Create();
1907 print
'<td class="right">';
1908 print $form->load_tva(
"eltva_tx", $objp->tva_tx.($objp->vat_src_code ? (
' ('.$objp->vat_src_code.
')') :
''),
$mysoc,
$object->thirdparty, $currentLineProductId, $objp->info_bits, $objp->product_type, false, 1);
1912 print
'<td class="right"><input class="width50" type="text" name="elprice" value="'.(GETPOSTISSET(
'elprice') ?
GETPOST(
'elprice') :
price($objp->subprice)).
'"></td>';
1920 print
'<td class="center"><input size="2" type="text" name="elqty" value="'.(GETPOSTISSET(
'elqty') ?
GETPOST(
'elqty') : $objp->qty).
'"></td>';
1924 print
'<td class="left">';
1925 print $form->selectUnits((GETPOSTISSET(
'unit') ?
GETPOSTINT(
'unit') : $objp->fk_unit),
"unit");
1930 print
'<td class="nowraponall right"><input size="1" type="text" name="elremise_percent" value="'.(GETPOSTISSET(
'elremise_percent') ?
GETPOST(
'elremise_percent') : $objp->remise_percent).
'">%</td>';
1932 if (!empty($usemargins)) {
1933 print
'<td class="right">';
1934 if ($objp->fk_product) {
1935 print
'<select id="fournprice" name="fournprice"></select>';
1937 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>';
1939 print
'<td class="center">';
1940 print
'<input type="submit" class="button margintoponly marginbottomonly" name="save" value="'.$langs->trans(
"Modify").
'">';
1941 print
'<br><input type="submit" class="button margintoponly marginbottomonly button-cancel" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
1954 print
'<tr class="oddeven">';
1955 print
'<td colspan="'.$colspan.
'">';
1956 print $langs->trans(
"DateStartPlanned").
' ';
1957 print $form->selectDate($db->jdate($objp->date_start),
"date_start_update", $usehm, $usehm, ($db->jdate($objp->date_start) > 0 ? 0 : 1),
"update");
1958 print
' '.$langs->trans(
"DateEndPlanned").
' ';
1959 print $form->selectDate($db->jdate($objp->date_end),
"date_end_update", $usehm, $usehm, ($db->jdate($objp->date_end) > 0 ? 0 : 1),
"update");
1963 if (is_array($extralabelslines) && count($extralabelslines) > 0) {
1965 $line->id = $objp->rowid;
1966 $line->fetch_optionals();
1968 print $line->showOptionals($extrafields,
'edit', array(
'style' =>
'class="oddeven"',
'colspan' => $colspan,
'tdclass' =>
'notitlefieldcreate'),
'',
'',
'1');
1979 if (
getDolGlobalString(
'CONTRACT_HIDE_CLOSED_SERVICES_BY_DEFAULT') &&
$object->lines[$cursorline - 1]->statut == ContratLigne::STATUS_CLOSED && $action !=
'showclosedlines') {
1980 $moreparam =
'style="display: none;"';
1991 print
'<tr class="oddeven" '.$moreparam.
'>';
1992 print
'<td class="tdhrthin" colspan="'.$colspan.
'"><hr class="opacitymedium tdhrthin"></td>';
2005 if ($action ==
'deleteline' && !$cancel && $user->hasRight(
'contrat',
'creer') &&
$object->lines[$cursorline - 1]->id == $idline) {
2006 print $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".((
int)
$object->id).
"&lineid=".((
int) $idline), $langs->trans(
"DeleteContractLine"), $langs->trans(
"ConfirmDeleteContractLine"),
"confirm_deleteline",
'', 0, 1);
2007 if ($ret ==
'html') {
2008 print
'<table class="notopnoleftnoright centpercent"><tr class="oddeven" height="6"><td></td></tr></table>';
2015 if ($action ==
'move' && !$cancel && $user->hasRight(
'contrat',
'creer') &&
$object->lines[$cursorline - 1]->id == $idline) {
2016 $arraycontractid = array();
2017 foreach ($arrayothercontracts as $contractcursor) {
2018 $arraycontractid[$contractcursor->id] = $contractcursor->ref;
2022 $formquestion = array(
2023 'text' => $langs->trans(
"ConfirmMoveToAnotherContractQuestion"),
2024 0 => array(
'type' =>
'select',
'name' =>
'newcid',
'values' => $arraycontractid));
2026 print $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".((
int)
$object->id).
"&lineid=".((
int) $idline), $langs->trans(
"MoveToAnotherContract"), $langs->trans(
"ConfirmMoveToAnotherContract"),
"confirm_move", $formquestion,
'yes');
2027 print
'<table class="notopnoleftnoright centpercent"><tr class="oddeven" height="6"><td></td></tr></table>';
2032 print
'<table class="notopnoleftnoright tableforservicepart2'.($cursorline < $nbofservices ?
' boxtablenobottom' :
'').
' centpercent">';
2034 print
'<tr class="oddeven" '.$moreparam.
'>';
2035 print
'<td><span class="valignmiddle hideonsmartphone">'.$langs->trans(
"ServiceStatus").
':</span> '.
$object->lines[$cursorline - 1]->getLibStatut(4).
'</td>';
2036 print
'<td width="30" class="right">';
2037 if ($user->socid == 0) {
2038 if (
$object->status > 0 && $action !=
'activateline' && $action !=
'unactivateline' && is_object($objp)) {
2039 $tmpaction =
'activateline';
2040 $tmpactionpicto =
'play';
2041 $tmpactiontext = $langs->trans(
"Activate");
2042 if ($objp->statut == 4) {
2043 $tmpaction =
'unactivateline';
2044 $tmpactionpicto =
'playstop.png';
2045 $tmpactiontext = $langs->trans(
"Disable");
2047 if (($tmpaction ==
'activateline' && $user->hasRight(
'contrat',
'activer')) || ($tmpaction ==
'unactivateline' && $user->hasRight(
'contrat',
'desactiver'))) {
2048 print
'<a class="reposition" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&ligne='.
$object->lines[$cursorline - 1]->id.
'&action='.$tmpaction.
'&token='.
newToken().
'">';
2049 print
img_picto($tmpactiontext, $tmpactionpicto);
2057 print
'<tr class="oddeven" '.$moreparam.
'>';
2061 if (!$objp->date_start_real) {
2062 print $langs->trans(
"DateStartReal").
': ';
2063 if ($objp->date_start_real) {
2066 print $langs->trans(
"ContractStatusNotRunning");
2070 if ($objp->date_start_real && !$objp->date_end_real) {
2071 print $langs->trans(
"DateStartReal").
': ';
2075 if ($objp->date_start_real && $objp->date_end_real) {
2076 print $langs->trans(
"DateStartReal").
': ';
2078 print
' - ';
2079 print $langs->trans(
"DateEndReal").
': ';
2082 if (!empty($objp->comment)) {
2083 print
" - ".$objp->comment;
2087 print
'<td class="center"> </td>';
2094 if ($permissiontoactivate && $action ==
'activateline' &&
$object->lines[$cursorline - 1]->id ==
GETPOSTINT(
'ligne') && is_object($objp)) {
2095 print
'<form name="active" action="'.$_SERVER[
"PHP_SELF"].
'" method="POST">';
2096 print
'<input type="hidden" name="token" value="'.newToken().
'">';
2097 print
'<input type="hidden" name="action" value="confirm_active">';
2098 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
2099 print
'<input type="hidden" name="id" value="'.$object->id.
'">';
2100 print
'<input type="hidden" name="ligne" value="'.GETPOSTINT(
'ligne').
'">';
2101 print
'<input type="hidden" name="confirm" value="yes">';
2103 print
'<table class="noborder tableforservicepart2'.($cursorline < $nbofservices ?
' boxtablenobottom' :
'').
' centpercent">';
2106 $dateactstart = $objp->date_start;
2109 } elseif (!$dateactstart) {
2110 $dateactstart = time();
2113 $dateactend = $objp->date_end;
2116 } elseif (!$dateactend) {
2117 if ($objp->fk_product > 0) {
2119 $product->fetch($objp->fk_product);
2120 if (!empty($product->duration_value) && !empty($product->duration_unit)) {
2121 $dateactend =
dol_time_plus_duree(time(), $product->duration_value, $product->duration_unit);
2126 print
'<tr class="oddeven">';
2127 print
'<td class="nohover">'.$langs->trans(
"DateServiceActivate").
'</td><td class="nohover">';
2128 print $form->selectDate($dateactstart,
'start', $usehm, $usehm, 0,
"active", 1, 0);
2130 print
'<td class="nohover">'.$langs->trans(
"DateEndPlanned").
'</td><td class="nohover">';
2131 print $form->selectDate($dateactend,
"end", $usehm, $usehm, 0,
"active", 1, 0);
2133 print
'<td class="center nohover">';
2138 print
'<tr class="oddeven">';
2139 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>';
2140 print
'<td class="nohover right">';
2141 print
'<input type="submit" class="button" name="activate" value="'.$langs->trans(
"Activate").
'"> ';
2142 print
'<input type="submit" class="button button-cancel" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
2152 if ($permissiontodisable && $action ==
'unactivateline' &&
$object->lines[$cursorline - 1]->id ==
GETPOSTINT(
'ligne') && is_object($objp)) {
2153 print
'<!-- Form to disabled a line -->'.
"\n";
2154 print
'<form name="confirm_closeline" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&ligne='.
$object->lines[$cursorline - 1]->id.
'" method="post">';
2155 print
'<input type="hidden" name="token" value="'.newToken().
'">';
2156 print
'<input type="hidden" name="confirm" value="yes">';
2157 print
'<input type="hidden" name="action" value="confirm_closeline">';
2158 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
2160 print
'<table class="noborder tableforservicepart2'.($cursorline < $nbofservices ?
' boxtablenobottom' :
'').
' centpercent">';
2163 $dateactstart = $objp->date_start_real;
2166 } elseif (!$dateactstart) {
2167 $dateactstart = time();
2170 $dateactend = $objp->date_end_real;
2173 } elseif (!$dateactend) {
2174 if ($objp->fk_product > 0) {
2176 $product->fetch($objp->fk_product);
2177 $dateactend =
dol_time_plus_duree(time(), $product->duration_value, $product->duration_unit);
2181 if ($dateactend > $now) {
2185 print
'<tr class="oddeven"><td colspan="2" class="nohover">';
2186 if ($objp->statut >= 4) {
2187 if ($objp->statut == 4) {
2188 print $langs->trans(
"DateEndReal").
' ';
2189 print $form->selectDate($dateactend,
"end", $usehm, $usehm, ($objp->date_end_real > 0 ? 0 : 1),
"closeline", 1, 1);
2193 print
'<td class="center nohover">';
2196 print
'<tr class="oddeven">';
2197 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>';
2198 print
'<td class="nohover right">';
2199 print
'<input type="submit" class="button" name="close" value="'.$langs->trans(
"Disable").
'"> ';
2200 print
'<input type="submit" class="button button-cancel" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
2215 if ($user->hasRight(
'contrat',
'creer') && (
$object->status == 0)) {
2219 print
' <form name="addproduct" id="addproduct" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.(($action !=
'editline') ?
'' :
'#line_'.
GETPOSTINT(
'lineid')).
'" method="POST">
2220 <input type="hidden" name="token" value="'.
newToken().
'">
2221 <input type="hidden" name="action" value="'.(($action !=
'editline') ?
'addline' :
'updateline').
'">
2222 <input type="hidden" name="mode" value="">
2223 <input type="hidden" name="id" value="'.
$object->id.
'">
2224 <input type="hidden" name="page_y" value="">
2225 <input type="hidden" name="backtopage" value="'.$backtopage.
'">
2228 print
'<div class="div-table-responsive-no-min">';
2229 print
'<table id="tablelines" class="noborder noshadow" width="100%">';
2232 if ($action !=
'editline') {
2233 $forcetoshowtitlelines = 1;
2234 if (empty(
$object->multicurrency_code)) {
2235 $object->multicurrency_code = $conf->currency;
2240 $parameters = array();
2241 $reshook = $hookmanager->executeHooks(
'formAddObjectLine', $parameters, $object, $action);
2245 if (empty($reshook)) {
2258 if (
GETPOST(
'modelselected')) {
2259 $action =
'presend';
2265 if ($user->socid == 0 && $action !=
'presend' && $action !=
'editline') {
2266 print
'<div class="tabsAction">';
2268 $parameters = array();
2269 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters, $object, $action);
2271 if (empty($reshook)) {
2275 'class' =>
'classfortooltip'
2280 if (empty($user->socid)) {
2281 if (
$object->status == $object::STATUS_VALIDATED) {
2282 if ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') || $user->hasRight(
'contrat',
'creer'))) {
2283 print
dolGetButtonAction(
'', $langs->trans(
'SendMail'),
'email', $_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=presend&token='.
newToken().
'&mode=init#formmailbeforetitle',
'',
true, $params);
2285 print
dolGetButtonAction(
'', $langs->trans(
'SendMail'),
'email',
'#',
'',
false, $params);
2290 if (
$object->status == $object::STATUS_DRAFT && $nbofservices) {
2291 if ($user->hasRight(
'contrat',
'creer')) {
2292 unset($params[
'attr'][
'title']);
2293 print
dolGetButtonAction($langs->trans(
'Validate'),
'',
'default', $_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=valid&token='.
newToken(),
'',
true, $params);
2295 $params[
'attr'][
'title'] = $langs->trans(
"NotEnoughPermissions");
2296 print
dolGetButtonAction($langs->trans(
'Validate'),
'',
'default',
'#',
'',
false, $params);
2299 if (
$object->status == $object::STATUS_VALIDATED) {
2300 if ($user->hasRight(
'contrat',
'creer')) {
2301 unset($params[
'attr'][
'title']);
2302 print
dolGetButtonAction($langs->trans(
'Modify'),
'',
'default', $_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=reopen&token='.
newToken(),
'',
true, $params);
2304 $params[
'attr'][
'title'] = $langs->trans(
"NotEnoughPermissions");
2305 print
dolGetButtonAction($langs->trans(
'Modify'),
'',
'default',
'#',
'',
false, $params);
2310 $arrayofcreatebutton = array();
2312 $arrayofcreatebutton[] = array(
2313 'url' =>
'/comm/propal/card.php?action=create&origin='.
$object->element.
'&originid='.
$object->id.
'&socid='.
$object->thirdparty->id.
'&renewal=true',
2314 'label' => $langs->trans(
'AddProp'),
2316 'perm' => $user->hasRight(
'propale',
'creer') ?
true : false,
2322 $arrayofcreatebutton[] = array(
2323 'url' =>
'/commande/card.php?action=create&token='.
newToken().
'&origin='.
$object->element.
'&originid='.
$object->id.
'&socid='.
$object->thirdparty->id,
2324 'label' => $langs->trans(
'AddOrder'),
2326 'perm' => $user->hasRight(
'commande',
'creer') ?
true : false,
2331 $arrayofcreatebutton[] = array(
2332 'url' =>
'/compta/facture/card.php?action=create&origin='.
$object->element.
'&originid='.
$object->id.
'&socid='.
$object->thirdparty->id,
2333 'label' => $langs->trans(
'CreateBill'),
2335 'perm' => $user->hasRight(
'facture',
'creer') ?
true : false,
2340 $langs->load(
"suppliers");
2341 $arrayofcreatebutton[] = array(
2342 'url' =>
'/fourn/facture/card.php?action=create&origin='.
$object->element.
'&originid='.
$object->id.
'&socid='.
$object->thirdparty->id,
2343 'label' => $langs->trans(
'AddSupplierInvoice'),
2345 'perm' => $user->hasRight(
'fournisseur',
'facture',
'creer') ?
true : false,
2349 if (count($arrayofcreatebutton)) {
2350 unset($params[
'attr'][
'title']);
2351 print
dolGetButtonAction(
'', $langs->trans(
"Create"),
'default', $arrayofcreatebutton,
'',
true, $params);
2354 $arrayforbutaction = array();
2355 $arrayforbutaction[] = array(
2356 'url' =>
'/contrat/card.php?id='.
$object->id.
'&action=activate&token='.
newToken(),
2357 'label' => $langs->trans(
'ActivateAllContracts'),
2359 'perm' => (
$object->nbofservicesclosed > 0 ||
$object->nbofserviceswait > 0) ? $permissiontoactivate : -1,
2362 $arrayforbutaction[] = array(
2363 'url' =>
'/contrat/card.php?id='.
$object->id.
'&action=close&token='.
newToken(),
2364 'label' => $langs->trans(
'CloseAllContracts'),
2366 'perm' => (
$object->nbofservicesclosed < $nbofservices) ? $permissiontodisable : -1,
2370 if (count($arrayforbutaction)) {
2371 unset($params[
'attr'][
'title']);
2372 print
dolGetButtonAction(
'', $langs->trans(
"Enable").
" / ".$langs->trans(
"Close"),
'default', $arrayforbutaction,
'',
true, $params);
2376 if ($action ==
'showclosedlines') {
2377 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>';
2379 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>';
2384 if (
getDolGlobalString(
'CONTRACT_SHOW_SIGNATURE_STATUS_WITH_SERVICE_STATUS') &&
$object->status > Contrat::STATUS_DRAFT) {
2385 if (
$object->signed_status != Contrat::$SIGNED_STATUSES[
'STATUS_SIGNED_ALL']) {
2386 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>';
2388 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>';
2393 if ($user->hasRight(
'contrat',
'creer')) {
2394 unset($params[
'attr'][
'title']);
2399 unset($params[
'attr'][
'title']);
2400 print
dolGetButtonAction($langs->trans(
'Delete'),
'',
'delete', $_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=delete&token='.
newToken(),
'', $permissiontodelete, $params);
2406 if ($action !=
'presend') {
2407 print
'<div class="fichecenter"><div class="fichehalfleft">';
2414 $urlsource = $_SERVER[
"PHP_SELF"].
"?id=".
$object->id;
2415 $genallowed = $user->hasRight(
'contrat',
'lire');
2416 $delallowed = $user->hasRight(
'contrat',
'creer');
2419 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);
2423 $tmparray = $form->showLinkToObjectBlock($object, array(), array(
'contrat'), 1);
2424 $linktoelem = $tmparray[
'linktoelem'];
2425 $htmltoenteralink = $tmparray[
'htmltoenteralink'];
2426 print $htmltoenteralink;
2428 $somethingshown = $form->showLinkedObjectBlock($object, $linktoelem);
2432 print
'<br><!-- Link to sign -->';
2433 require_once DOL_DOCUMENT_ROOT.
'/core/lib/signature.lib.php';
2435 print showOnlineSignatureUrl(
'contract',
$object->ref, $object).
'<br>';
2438 print
'</div><div class="fichehalfright">';
2442 $morehtmlcenter =
'<div class="nowraponall">';
2443 $morehtmlcenter .=
dolGetButtonTitle($langs->trans(
'FullConversation'),
'',
'fa fa-comments imgforviewmode', DOL_URL_ROOT.
'/contrat/messaging.php?id='.
$object->id);
2444 $morehtmlcenter .=
dolGetButtonTitle($langs->trans(
'SeeAll'),
'',
'fa fa-bars imgforviewmode', DOL_URL_ROOT.
'/contrat/agenda.php?id='.
$object->id);
2445 $morehtmlcenter .=
'</div>';
2449 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
2451 $somethingshown = $formactions->showactions($object,
'contract', $socid, 1,
'listactions', $MAXEVENT,
'', $morehtmlcenter);
2453 print
'</div></div>';
2457 $modelmail =
'contract';
2458 $defaulttopic =
'SendContractRef';
2459 $diroutput = $conf->contract->multidir_output[
$object->entity ?? $conf->entity];
2460 $trackid =
'con'.$object->id;
2462 include DOL_DOCUMENT_ROOT.
'/core/tpl/card_presend.tpl.php';
2474 print
"\n".
'<script type="text/javascript">'.
"\n";
2476 $(document).ready(
function() {
2477 var idprod = $(
"input[name='idprod']").val();
2478 var fournprice = $(
"input[name='fournprice']").val();
2479 var token =
'<?php echo currentToken(); ?>';
2481 $.post(
'<?php echo DOL_URL_ROOT; ?>/fourn/ajax/getSupplierPrices.php', {
2485 if (data.length > 0) {
2488 $(data).each(
function() {
2489 options +=
'<option value="'+this.
id+
'" price="'+this.
price+
'"';
2490 if (fournprice > 0) {
2491 if (this.
id == fournprice) {
2492 options +=
' selected';
2493 $(
"#buying_price").val(this.price);
2497 options +=
'>'+this.label+
'</option>';
2499 options +=
'<option value=null'+(trouve?
'':
' selected')+
'><?php echo $langs->trans("InputPrice"); ?></option>';
2500 $(
"#fournprice").html(options);
2502 $(
"#buying_price").hide();
2503 $(
"#fournprice").show();
2506 $(
"#buying_price").show();
2508 $(
"#fournprice").change(
function() {
2509 var selval = $(
this).find(
'option:selected').attr(
"price");
2511 $(
"#buying_price").val(selval).hide();
2513 $(
'#buying_price').show();
2517 $(
"#fournprice").hide();
2518 $(
'#buying_price').show();
2524 $(
"#fournprice").hide();
2525 $(
'#buying_price').show();
2529 print
"\n".
'<script type="text/javascript">'.
"\n";
$id
Support class for third parties, contacts, members, users or resources.
if(! $sortfield) if(! $sortorder) $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.
dol_now($mode='gmt')
Return date for now.
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...
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.
dolBuildUrl($url, $params=[], $addtoken=false)
Return path of url.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0, $morecssdiv='')
Show tabs of a record.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dolGetButtonTitle($label, $helpText='', $iconClass='fa fa-file', $url='', $id='', $status=1, $params=array())
Function dolGetButtonTitle : this kind of buttons are used in title in list.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
dol_eval($s, $returnvalue=1, $hideerrors=1, $onlysimplestring='1')
Replace eval function to add more security.
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $allowothertags=array())
Show a picto called object_picto (generic function)
dol_sanitizeFileName($str, $newstr='_', $unaccent=1, $includequotes=0, $allowdash=0)
Clean a string to use it as a file name.
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.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
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($srcobject, $native=2)
Create a clone of instance of object (new instance with same value for each properties) With native =...
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false, $decorate=0)
Output date in a string format according to outputlangs (or langs if not defined).
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='', $morecssonpicto='widthpictotitle')
Load a title with picto.
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.
isModEnabled($module)
Is Dolibarr module enabled.
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 rate, 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.