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);
379 for ($i = 0; $i < $num; $i++) {
380 $product_type = ($lines[$i]->product_type ? $lines[$i]->product_type : 0);
382 if ($product_type == 1 || (
getDolGlobalString(
'CONTRACT_SUPPORT_PRODUCTS') && in_array($product_type, array(0, 1)))) {
384 if ($lines[$i]->fk_product > 0) {
385 $product_static =
new Product($db);
390 $prod->id = $lines[$i]->fk_product;
391 $prod->getMultiLangs();
393 $outputlangs = $langs;
395 if (
GETPOST(
'lang_id',
'aZ09')) {
396 $newlang =
GETPOST(
'lang_id',
'aZ09');
398 if (empty($newlang)) {
399 $newlang = $srcobject->thirdparty->default_lang;
401 if (!empty($newlang)) {
403 $outputlangs->setDefaultLang($newlang);
406 $label = (!empty($prod->multilangs[$outputlangs->defaultlang][
"libelle"])) ? $prod->multilangs[$outputlangs->defaultlang][
"libelle"] : $lines[$i]->product_label;
408 $label = $lines[$i]->product_label;
410 $desc = ($lines[$i]->desc && $lines[$i]->desc != $lines[$i]->label) ?
dol_htmlentitiesbr($lines[$i]->desc) :
'';
416 $array_options = array();
418 if (method_exists($lines[$i],
'fetch_optionals')) {
419 $lines[$i]->fetch_optionals();
420 $array_options = $lines[$i]->array_options;
423 $txtva = $lines[$i]->vat_src_code ? $lines[$i]->tva_tx.
' ('.$lines[$i]->vat_src_code.
')' : $lines[$i]->tva_tx;
431 $lines[$i]->subprice,
436 $lines[$i]->fk_product,
437 $lines[$i]->remise_percent,
438 $lines[$i]->date_start,
439 $lines[$i]->date_end,
442 $lines[$i]->info_bits,
443 $lines[$i]->fk_fournprice,
446 (
int) $lines[$i]->fk_unit,
462 $parameters = array(
'objFrom' => $srcobject);
463 $reshook = $hookmanager->executeHooks(
'createFrom', $parameters, $object, $action);
477 $result =
$object->create($user);
479 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
487 } elseif ($action ==
'classin' && $user->hasRight(
'contrat',
'creer')) {
489 } elseif ($action ==
'addline' && $user->hasRight(
'contrat',
'creer')) {
493 $line_desc = (GETPOSTISSET(
'dp_desc') ?
GETPOST(
'dp_desc',
'restricthtml') :
'');
496 $price_ht_devise =
'';
498 $price_ttc_devise =
'';
500 $rang = count(
$object->lines) + 1;
502 if (
GETPOST(
'price_ht') !==
'') {
505 if (
GETPOST(
'multicurrency_price_ht') !==
'') {
508 if (
GETPOST(
'price_ttc') !==
'') {
511 if (
GETPOST(
'multicurrency_price_ttc') !==
'') {
515 if (
GETPOST(
'prod_entry_mode',
'alpha') ==
'free') {
521 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"ProductOrService")),
null,
'errors');
526 $tva_tx =
GETPOST(
'tva_tx',
'alpha');
529 $remise_percent = (GETPOSTISSET(
'remise_percent'.$predef) ?
price2num(
GETPOST(
'remise_percent'.$predef),
'', 2) : 0);
530 if (empty($remise_percent)) {
535 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Qty")),
null,
'errors');
538 if (
GETPOST(
'prod_entry_mode',
'alpha') ==
'free' && (empty($idprod) || $idprod < 0) && empty($line_desc)) {
539 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Description")),
null,
'errors');
545 if (!empty($date_start) && !empty($date_end) && $date_start > $date_end) {
546 setEventMessages($langs->trans(
"Error").
': '.$langs->trans(
"DateStartPlanned").
' > '.$langs->trans(
"DateEndPlanned"),
null,
'errors');
551 $extralabelsline = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
552 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line, $predef);
554 if (is_array($extralabelsline)) {
556 foreach ($extralabelsline as $key => $value) {
557 unset($_POST[
"options_".$key]);
566 $price_base_type =
'';
572 $prod->fetch($idprod);
581 $price_min = $prod->price_min;
582 $price_min_ttc = $prod->price_min_ttc;
586 $price_min = $prod->multiprices_min[
$object->thirdparty->price_level];
587 $price_min_ttc = $prod->multiprices_min_ttc[
$object->thirdparty->price_level];
590 require_once DOL_DOCUMENT_ROOT.
'/product/class/productcustomerprice.class.php';
594 $filter = array(
't.fk_product' => (
string) $prod->id,
't.fk_soc' => (
string)
$object->thirdparty->id);
596 $result = $prodcustprice->fetchAll(
'',
'', 0, 0, $filter);
598 if (count($prodcustprice->lines) > 0) {
599 $date_now = (int) floor(
dol_now() / 86400) * 86400;
600 foreach ($prodcustprice->lines as $k => $custprice_line) {
601 if ($custprice_line->date_begin <= $date_now && (empty($custprice_line->date_end) || $date_now <= $custprice_line->date_end)) {
602 $price_min =
price($custprice_line->price_min);
603 $price_min_ttc =
price($custprice_line->price_min_ttc);
619 $tmpvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', $tva_tx));
620 $tmpprodvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', (
string) $prod->tva_tx));
623 if (!empty($price_ht) || $price_ht ===
'0') {
625 $pu_ttc =
price2num((
float) $pu_ht * (1 + ((
float) $tmpvat / 100)),
'MU');
626 $price_base_type =
'HT';
627 } elseif (!empty($price_ttc) || $price_ttc ===
'0') {
629 $pu_ht =
price2num((
float) $pu_ttc / (1 + ((
float) $tmpvat / 100)),
'MU');
630 $price_base_type =
'TTC';
633 $desc = $prod->description;
643 $fk_unit = $prod->fk_unit;
647 $tva_npr = (preg_match(
'/\*/', $tva_tx) ? 1 : 0);
648 if (empty($tva_tx)) {
651 $tva_tx = str_replace(
'*',
'', $tva_tx);
654 $pu_ht_devise =
price2num($price_ht_devise,
'MU');
655 $pu_ttc_devise =
price2num($price_ttc_devise,
'MU');
657 $tmpvat =
price2num(preg_replace(
'/\s*\(.*\)/',
'', $tva_tx));
660 if (!empty($price_ht) || $price_ht ===
'0') {
662 $pu_ttc =
price2num((
float) $pu_ht * (1 + ((
float) $tmpvat / 100)),
'MU');
663 $price_base_type =
'HT';
664 } elseif (!empty($price_ttc) || $price_ttc ===
'0') {
666 $pu_ht =
price2num((
float) $pu_ttc / (1 + ((
float) $tmpvat / 100)),
'MU');
667 $price_base_type =
'TTC';
675 $fk_fournprice =
GETPOST(
'fournprice');
677 $pa_ht =
GETPOST(
'buying_price');
687 if (((
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && !$user->hasRight(
'produit',
'ignore_price_min_advance'))
689 $object->error = $langs->trans(
"CantBeLessThanMinPrice",
price(
price2num($price_min,
'MU'), 0, $langs, 0, 0, -1, $conf->currency));
707 (
int) $fk_fournprice,
718 $outputlangs = $langs;
721 $newlang =
GETPOST(
'lang_id',
'aZ09');
724 $newlang =
$object->thirdparty->default_lang;
726 if (!empty($newlang)) {
728 $outputlangs->setDefaultLang($newlang);
733 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
736 unset($_POST[
'prod_entry_mode']);
738 unset($_POST[
'qty']);
739 unset($_POST[
'type']);
740 unset($_POST[
'remise_percent']);
741 unset($_POST[
'price_ht']);
742 unset($_POST[
'multicurrency_price_ht']);
743 unset($_POST[
'price_ttc']);
744 unset($_POST[
'tva_tx']);
745 unset($_POST[
'product_ref']);
746 unset($_POST[
'product_label']);
747 unset($_POST[
'product_desc']);
748 unset($_POST[
'fournprice']);
749 unset($_POST[
'buying_price']);
750 unset($_POST[
'np_marginRate']);
751 unset($_POST[
'np_markRate']);
752 unset($_POST[
'dp_desc']);
753 unset($_POST[
'idprod']);
755 unset($_POST[
'date_starthour']);
756 unset($_POST[
'date_startmin']);
757 unset($_POST[
'date_startsec']);
758 unset($_POST[
'date_startday']);
759 unset($_POST[
'date_startmonth']);
760 unset($_POST[
'date_startyear']);
761 unset($_POST[
'date_endhour']);
762 unset($_POST[
'date_endmin']);
763 unset($_POST[
'date_endsec']);
764 unset($_POST[
'date_endday']);
765 unset($_POST[
'date_endmonth']);
766 unset($_POST[
'date_endyear']);
771 } elseif ($action ==
'updateline' && $user->hasRight(
'contrat',
'creer') && !
GETPOST(
'cancel',
'alpha')) {
775 if (!empty($date_start_update) && !empty($date_end_update) && $date_start_update > $date_end_update) {
776 setEventMessages($langs->trans(
"Error").
': '.$langs->trans(
"DateStartPlanned").
' > '.$langs->trans(
"DateEndPlanned"),
null,
'errors');
777 $action =
'editline';
783 if ($objectline->fetch($idline) < 0) {
787 $objectline->fetch_optionals();
789 $objectline->oldcopy =
dol_clone($objectline, 2);
797 if ($date_start_real_update ==
'') {
798 $date_start_real_update = $objectline->date_start_real;
800 if ($date_end_real_update ==
'') {
801 $date_end_real_update = $objectline->date_end_real;
804 $vat_rate =
GETPOST(
'eltva_tx',
'alpha');
807 if (preg_match(
'/\*/', $vat_rate)) {
812 $vat_rate = str_replace(
'*',
'', $vat_rate);
821 if (preg_match(
'/\((.*)\)/', $txtva, $reg)) {
822 $vat_src_code = $reg[1];
823 $txtva = preg_replace(
'/\s*\(.*\)/',
'', $txtva);
839 $objectline->fk_product =
GETPOSTINT(
'idprod');
840 $objectline->description =
GETPOST(
'product_desc',
'restricthtml');
843 $objectline->remise_percent = $remise_percent;
844 $objectline->tva_tx = ($txtva ? $txtva : 0);
845 $objectline->vat_src_code = $vat_src_code;
846 $objectline->localtax1_tx = is_numeric($localtax1_tx) ? $localtax1_tx : 0;
847 $objectline->localtax2_tx = is_numeric($localtax2_tx) ? $localtax2_tx : 0;
848 $objectline->date_start = $date_start_update;
849 $objectline->date_start_real = $date_start_real_update;
850 $objectline->date_end = $date_end_update;
851 $objectline->date_end_real = $date_end_real_update;
852 $objectline->user_closing_id = $user->id;
854 $objectline->pa_ht = $pa_ht;
860 $objectline->fk_unit =
null;
864 $extralabelsline = $extrafields->fetch_name_optionals_label($objectline->table_element);
865 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line, $predef);
867 if (is_array($array_options) && count($array_options) > 0) {
869 foreach ($array_options as $key => $value) {
870 $objectline->array_options[$key] = $array_options[$key];
876 $result = $objectline->update($user);
879 $action =
'editline';
880 $_GET[
'rowid'] =
GETPOST(
'elrowid');
890 } elseif ($action ==
'confirm_deleteline' && $confirm ==
'yes' && $user->hasRight(
'contrat',
'creer')) {
894 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
899 } elseif ($action ==
'confirm_valid' && $confirm ==
'yes' && $user->hasRight(
'contrat',
'creer')) {
900 $result =
$object->validate($user);
905 $outputlangs = $langs;
908 $newlang =
GETPOST(
'lang_id',
'aZ09');
911 $newlang =
$object->thirdparty->default_lang;
913 if (!empty($newlang)) {
915 $outputlangs->setDefaultLang($newlang);
920 $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
925 } elseif ($action ==
'reopen' && $user->hasRight(
'contrat',
'creer')) {
926 $result =
$object->reopen($user);
930 } elseif ($action ==
'confirm_close' && $confirm ==
'yes' && $permissiontodisable) {
932 $result =
$object->closeAll($user);
936 } elseif ($action ==
'confirm_activate' && $confirm ==
'yes' && $permissiontoactivate) {
939 $comment =
GETPOST(
'comment',
'alpha');
940 $result =
$object->activateAll($user, $date_start, 0, $comment, $date_end);
944 } elseif ($action ==
'confirm_delete' && $confirm ==
'yes' && $permissiontodelete) {
945 $result =
$object->delete($user);
947 header(
"Location: list.php?restore_lastsearch_values=1");
952 } elseif ($action ==
'confirm_move' && $confirm ==
'yes' && $permissiontoedit) {
955 $result = $contractline->fetch(
GETPOSTINT(
'lineid'));
956 $contractline->fk_contrat =
GETPOSTINT(
'newcid');
957 $result = $contractline->update($user, 1);
959 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$id);
965 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentities(
"RefNewContract")),
null,
'errors');
967 } elseif ($action ==
'update_extras' && $permissiontoeditextra) {
970 $attribute =
GETPOST(
'attribute',
'aZ09');
973 $ret = $extrafields->setOptionalsFromPost(
null, $object, $attribute);
980 $result =
$object->updateExtraField($attribute,
'CONTRACT_MODIFY');
988 $action =
'edit_extras';
990 } elseif ($action ==
'setref_supplier' && $permissiontoadd) {
994 $result =
$object->setValueFrom(
'ref_supplier',
GETPOST(
'ref_supplier',
'alpha'),
'',
null,
'text',
'', $user,
'CONTRACT_MODIFY');
997 $action =
'editref_supplier';
999 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
1003 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$id);
1006 } elseif ($action ==
'setref_customer' && $permissiontoadd) {
1010 $result =
$object->setValueFrom(
'ref_customer',
GETPOST(
'ref_customer',
'alpha'),
'',
null,
'text',
'', $user,
'CONTRACT_MODIFY');
1013 $action =
'editref_customer';
1015 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
1019 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$id);
1022 } elseif ($action ==
'setref' && $permissiontoadd) {
1024 $result =
$object->fetch($id);
1031 $result =
$object->setValueFrom(
'ref',
GETPOST(
'ref',
'alpha'),
'',
null,
'text',
'', $user,
'CONTRACT_MODIFY');
1034 $action =
'editref';
1036 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
1043 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
1047 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$id);
1050 } elseif ($action ==
'setdate_contrat' && $permissiontoadd) {
1052 $result =
$object->fetch($id);
1057 $result =
$object->setValueFrom(
'date_contrat', $datacontrat,
'',
null,
'date',
'', $user,
'CONTRACT_MODIFY');
1060 $action =
'editdate_contrat';
1062 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
1066 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".$id);
1072 include DOL_DOCUMENT_ROOT.
'/core/actions_printing.inc.php';
1075 $upload_dir = $conf->contrat->multidir_output[!empty(
$object->entity) ?
$object->entity : $conf->entity];
1076 include DOL_DOCUMENT_ROOT.
'/core/actions_builddoc.inc.php';
1079 $triggersendname =
'CONTRACT_SENTBYMAIL';
1081 $mode =
'emailfromcontract';
1082 $trackid =
'con'.$object->id;
1083 include DOL_DOCUMENT_ROOT.
'/core/actions_sendmails.inc.php';
1087 if ($action ==
'addcontact' && $user->hasRight(
'contrat',
'creer')) {
1090 $result =
$object->add_contact($contactid, $typeid,
GETPOST(
"source",
'aZ09'));
1093 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
1096 if (
$object->error ==
'DB_ERROR_RECORD_ALREADY_EXISTS') {
1097 $langs->load(
"errors");
1098 setEventMessages($langs->trans(
"ErrorThisContactIsAlreadyDefinedAsThisType"),
null,
'errors');
1103 } elseif ($action ==
'swapstatut' && $user->hasRight(
'contrat',
'creer')) {
1106 } elseif ($action ==
'deletecontact' && $user->hasRight(
'contrat',
'creer')) {
1111 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
1120 if ($action ==
'confirm_clone' && $confirm ==
'yes' && $user->hasRight(
'contrat',
'creer')) {
1122 setEventMessages($langs->trans(
"NoCloneOptionsSpecified"),
null,
'errors');
1125 $result =
$object->createFromClone($user, $socid);
1127 header(
"Location: ".$_SERVER[
'PHP_SELF'].
'?id='.$result);
1130 if (count(
$object->errors) > 0) {
1145$title =
$object->ref.
" - ".$langs->trans(
'Contract');
1146if ($action ==
'create') {
1147 $title = $langs->trans(
"NewContract");
1149$help_url =
'EN:Module_Contracts|FR:Module_Contrat|ES:Contratos_de_servicio';
1151llxHeader(
'', $title, $help_url,
'', 0, 0,
'',
'',
'',
'mod-contrat page-card');
1153$form =
new Form($db);
1161if (substr($module, 0, 13) ==
'mod_contract_' && substr($module, -3) ==
'php') {
1162 $module = substr($module, 0,
dol_strlen($module) - 4);
1165$modCodeContract =
null;
1167 $modCodeContract =
new $module();
1169 '@phan-var-force ModelNumRefContracts $modCodeContract';
1173if ($action ==
'create') {
1179 $soc->fetch($socid);
1185 $element = $subelement =
GETPOST(
'origin');
1186 if (preg_match(
'/^([^_]+)_([^_]+)/i',
GETPOST(
'origin'), $regs)) {
1187 $element = $regs[1];
1188 $subelement = $regs[2];
1191 if ($element ==
'project') {
1195 if ($element ==
'order' || $element ==
'commande') {
1196 $element = $subelement =
'commande';
1198 if ($element ==
'propal') {
1199 $element =
'comm/propal';
1200 $subelement =
'propal';
1202 if ($element ==
'invoice' || $element ==
'facture') {
1203 $element =
'compta/facture';
1204 $subelement =
'facture';
1207 if ($element ==
'facturerec' || $element ==
'facture_rec') {
1208 $element =
'compta/facture';
1209 $subelement =
'facture-rec';
1210 $classname =
'FactureRec';
1212 if ($element ==
'facture_fourn_rec' || $element ==
'invoice_supplier_rec') {
1214 $subelement =
'fournisseur.facture-rec';
1215 $classname =
'FactureFournisseurRec';
1220 if (empty($classname)) {
1221 $classname = ucfirst($subelement);
1223 $objectsrc =
new $classname($db);
1224 '@phan-var-force Commande|Propal|Facture $objectsrc';
1225 $objectsrc->fetch($originid);
1226 if (empty($objectsrc->lines) && method_exists($objectsrc,
'fetch_lines')) {
1227 $objectsrc->fetch_lines();
1229 $objectsrc->fetch_thirdparty();
1232 $objectsrc->fetch_optionals();
1233 $object->array_options = $objectsrc->array_options;
1235 $projectid = (int) $objectsrc->fk_project;
1237 $soc = $objectsrc->thirdparty;
1239 $note_private = (!empty($objectsrc->note_private) ? $objectsrc->note_private :
'');
1240 $note_public = (!empty($objectsrc->note_public) ? $objectsrc->note_public :
'');
1243 $srccontactslist = $objectsrc->liste_contact(-1,
'external', 1);
1247 $note_private =
GETPOST(
"note_private",
"alpha");
1248 $note_public =
GETPOST(
"note_public",
"alpha");
1253 print
'<form name="form_contract" action="'.$_SERVER[
"PHP_SELF"].
'" method="post">';
1254 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1255 print
'<input type="hidden" name="action" value="add">';
1256 print
'<input type="hidden" name="socid" value="'.$soc->id.
'">'.
"\n";
1257 print
'<input type="hidden" name="remise_percent" value="0">';
1258 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
1262 print
'<table class="border centpercent">';
1265 print
'<tr><td class="titlefield fieldrequired">'.$langs->trans(
'Ref').
'</td><td>';
1266 if (!empty($modCodeContract->code_auto)) {
1267 $tmpcode = $langs->trans(
"Draft");
1269 $tmpcode =
'<input name="ref" class="maxwidth100" maxlength="128" value="'.dol_escape_htmltag(
GETPOST(
'ref',
'alpha')).
'">';
1275 print
'<tr><td>'.$langs->trans(
'RefCustomer').
'</td>';
1276 print
'<td><input type="text" class="maxwidth150" name="ref_customer" id="ref_customer" value="'.dol_escape_htmltag(
GETPOST(
'ref_customer',
'alpha')).
'"></td></tr>';
1279 print
'<tr><td>'.$langs->trans(
'RefSupplier').
'</td>';
1280 print
'<td><input type="text" class="maxwidth150" name="ref_supplier" id="ref_supplier" value="'.dol_escape_htmltag(
GETPOST(
'ref_supplier',
'alpha')).
'"></td></tr>';
1284 print
'<td class="fieldrequired">'.$langs->trans(
'ThirdParty').
'</td>';
1287 print $soc->getNomUrl(1);
1288 print
'<input type="hidden" name="socid" value="'.$soc->id.
'">';
1292 print
img_picto(
'',
'company',
'class="pictofixedwidth"');
1293 print $form->select_company(
'',
'socid',
'',
'SelectThirdParty', 1, 0, array(), 0,
'minwidth150 widthcentpercentminusxx maxwidth500');
1294 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>';
1301 print
'<tr><td>'.$langs->trans(
'Discounts').
'</td><td>';
1302 if ($soc->remise_percent) {
1303 print $langs->trans(
"CompanyHasRelativeDiscount", $soc->remise_percent).
' ';
1305 print
'<span class="hideonsmartphone">'.$langs->trans(
"CompanyHasNoRelativeDiscount").
'. </span>';
1307 $absolute_discount = $soc->getAvailableDiscounts();
1308 if ($absolute_discount) {
1309 print $langs->trans(
"CompanyHasAbsoluteDiscount",
price($absolute_discount), $langs->trans(
"Currency".$conf->currency)).
'.';
1311 print
'<span class="hideonsmartphone">'.$langs->trans(
"CompanyHasNoAbsoluteDiscount").
'.</span>';
1317 print
'<tr><td class="nowrap"><span class="fieldrequired">'.$langs->trans(
"TypeContact_contrat_internal_SALESREPFOLL").
'</span></td><td>';
1318 print
img_picto(
'',
'user',
'class="pictofixedwidth"');
1319 print $form->select_dolusers(
GETPOST(
"commercial_suivi_id") ?
GETPOST(
"commercial_suivi_id") : $user->id,
'commercial_suivi_id', 1, null);
1323 print
'<tr><td class="nowrap"><span class="fieldrequired">'.$langs->trans(
"TypeContact_contrat_internal_SALESREPSIGN").
'</span></td><td>';
1324 print
img_picto(
'',
'user',
'class="pictofixedwidth"');
1325 print $form->select_dolusers(
GETPOST(
"commercial_signature_id") ?
GETPOST(
"commercial_signature_id") : $user->id,
'commercial_signature_id', 1, null);
1328 print
'<tr><td><span class="fieldrequired">'.$langs->trans(
"Date").
'</span></td><td>';
1329 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
1330 print $form->selectDate($datecontrat,
'', 0, 0, 0,
"contrat");
1335 $langs->load(
'projects');
1339 print
'<tr><td>'.$langs->trans(
"Project").
'</td><td>';
1340 print
img_picto(
'',
'project',
'class="pictofixedwidth"');
1341 $formproject->select_projects(($soc->id > 0 ? $soc->id : -1), $projectid,
"projectid", 0, 0, 1, 1, 0, 0, 0,
'', 0, 0,
'minwidth150 maxwidth300 widthcentpercentminusxx');
1342 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>';
1347 print
'<tr><td>'.$langs->trans(
"NotePublic").
'</td><td class="tdtop">';
1348 $doleditor =
new DolEditor(
'note_public', (
string) $note_public,
'', 100,
'dolibarr_notes',
'In',
true,
true, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PUBLIC') ? 0 : 1, ROWS_3,
'90%');
1349 print $doleditor->Create(1);
1353 if (empty($user->socid)) {
1354 print
'<tr><td>'.$langs->trans(
"NotePrivate").
'</td><td class="tdtop">';
1355 $doleditor =
new DolEditor(
'note_private', (
string) $note_private,
'', 100,
'dolibarr_notes',
'In',
true,
true, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PRIVATE') ? 0 : 1, ROWS_3,
'90%');
1356 print $doleditor->Create(1);
1361 $parameters = array(
'objectsrc' => $objectsrc,
'colspan' =>
' colspan="3"',
'cols' =>
'3');
1362 $reshook = $hookmanager->executeHooks(
'formObjectOptions', $parameters, $object, $action);
1363 print $hookmanager->resPrint;
1366 if (empty($reshook)) {
1367 print
$object->showOptionals($extrafields,
'create', $parameters);
1374 print $form->buttonsSaveCancel(
"Create");
1376 if (is_object($objectsrc)) {
1377 print
'<input type="hidden" name="origin" value="'.$objectsrc->element.
'">';
1378 print
'<input type="hidden" name="originid" value="'.$objectsrc->id.
'">';
1381 print
'<br>'.$langs->trans(
"Note").
': '.$langs->trans(
"OnlyLinesWithTypeServiceAreUsed");
1395 $result =
$object->fetch_lines();
1400 $nbofservices = count(
$object->lines);
1402 $author =
new User($db);
1403 $author->fetch(
$object->user_author_id);
1405 $commercial_signature =
new User($db);
1406 $commercial_signature->fetch(
$object->commercial_signature_id);
1408 $commercial_suivi =
new User($db);
1409 $commercial_suivi->fetch(
$object->commercial_suivi_id);
1416 print
dol_get_fiche_head($head, $hselected, $langs->trans(
"Contract"), -1,
'contract');
1419 if ($action ==
'delete') {
1421 $formconfirm = $form->formconfirm($_SERVER[
'PHP_SELF'].
"?id=".
$object->id, $langs->trans(
"DeleteAContract"), $langs->trans(
"ConfirmDeleteAContract"),
"confirm_delete",
'', 0, 1);
1422 } elseif ($action ==
'valid') {
1424 $ref = substr(
$object->ref, 1, 4);
1425 if ($ref ==
'PROV' && !empty($modCodeContract->code_auto)) {
1428 $numref = (string)
$object->ref;
1430 $text = $langs->trans(
'ConfirmValidateContract', $numref);
1431 $formconfirm = $form->formconfirm($_SERVER[
'PHP_SELF'].
"?id=".
$object->id, $langs->trans(
"ValidateAContract"), $text,
"confirm_valid",
'', 0, 1);
1432 } elseif ($action ==
'close') {
1434 $formconfirm = $form->formconfirm($_SERVER[
'PHP_SELF'].
"?id=".
$object->id, $langs->trans(
"CloseAContract"), $langs->trans(
"ConfirmCloseContract"),
"confirm_close",
'', 0, 1);
1435 } elseif ($action ==
'activate') {
1436 $formquestion = array(
1437 array(
'type' =>
'date',
'name' =>
'd_start',
'label' => $langs->trans(
"DateServiceActivate"),
'value' =>
dol_now()),
1438 array(
'type' =>
'date',
'name' =>
'd_end',
'label' => $langs->trans(
"DateEndPlanned"), 0 =>
'', 1 =>
''),
1439 array(
'type' =>
'text',
'name' =>
'comment',
'label' => $langs->trans(
"Comment"),
'value' =>
'', 0 =>
'', 1 =>
'',
'class' =>
'minwidth300',
'moreattr' =>
'autofocus')
1441 $formconfirm = $form->formconfirm($_SERVER[
'PHP_SELF'].
"?id=".
$object->id, $langs->trans(
"ActivateAllOnContract"), $langs->trans(
"ConfirmActivateAllOnContract"),
"confirm_activate", $formquestion,
'yes', 1, 300);
1442 } elseif ($action ==
'clone') {
1443 $filter =
'(s.client:IN:1,2,3)';
1445 $formquestion = array(array(
'type' =>
'other',
'name' =>
'socid',
'label' => $langs->trans(
"SelectThirdParty"),
'value' => $form->select_company(
GETPOSTINT(
'socid'),
'socid', $filter)));
1446 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'ToClone'), $langs->trans(
'ConfirmCloneContract',
$object->ref),
'confirm_clone', $formquestion,
'yes', 1);
1447 } elseif ($action ==
'sign') {
1448 $text = $langs->trans(
'ConfirmSignContract');
1450 require_once DOL_DOCUMENT_ROOT.
'/core/class/notify.class.php';
1451 $notify =
new Notify($db);
1453 $text .= $notify->confirmMessage(
'CONTRACT_MODIFY',
$object->socid, $object);
1458 'name' =>
'signed_status',
1459 'label' =>
'<span class="fieldrequired">'.$langs->trans(
'SignStatus').
'</span>',
1460 'values' =>
$object->getSignedStatusLocalisedArray()
1462 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'SignContract'), $text,
'confirm_sign', $formquestion, 0, 1);
1463 } elseif ($action ==
'unsign') {
1464 $text = $langs->trans(
'ConfirmUnsignContract');
1466 require_once DOL_DOCUMENT_ROOT.
'/core/class/notify.class.php';
1467 $notify =
new Notify($db);
1469 $text .= $notify->confirmMessage(
'CONTRACT_MODIFY',
$object->socid, $object);
1471 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'UnsignContract'), $text,
'confirm_unsign',
'', 0, 1);
1476 $parameters = array(
1477 'formConfirm' => $formconfirm,
1482 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters, $object, $action);
1483 if (empty($reshook)) {
1484 $formconfirm .= $hookmanager->resPrint;
1485 } elseif ($reshook > 0) {
1486 $formconfirm = $hookmanager->resPrint;
1494 if (
$object->status == $object::STATUS_DRAFT && $user->hasRight(
'contrat',
'creer')) {
1495 print
'<form action="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'" method="POST">';
1496 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1497 print
'<input type="hidden" name="action" value="setremise">';
1498 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
1503 $linkback =
'<a href="'.DOL_URL_ROOT.
'/contrat/list.php?restore_lastsearch_values=1'.(!empty($socid) ?
'&socid='.$socid :
'').
'">'.$langs->trans(
"BackToList").
'</a>';
1507 if (!empty($modCodeContract->code_auto)) {
1510 $morehtmlref .= $form->editfieldkey(
"",
'ref',
$object->ref, $object, $user->hasRight(
'contrat',
'creer'),
'string',
'', 0, 3);
1511 $morehtmlref .= $form->editfieldval(
"",
'ref',
$object->ref, $object, $user->hasRight(
'contrat',
'creer'),
'string',
'',
null,
'2');
1514 $morehtmlref .=
'<div class="refidno">';
1516 $morehtmlref .= $form->editfieldkey(
"RefCustomer",
'ref_customer',
$object->ref_customer, $object, $user->hasRight(
'contrat',
'creer'),
'string',
'', 0, 1);
1517 $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');
1519 $morehtmlref .=
'<br>';
1520 $morehtmlref .= $form->editfieldkey(
"RefSupplier",
'ref_supplier',
$object->ref_supplier, $object, $user->hasRight(
'contrat',
'creer'),
'string',
'', 0, 1);
1521 $morehtmlref .= $form->editfieldval(
"RefSupplier",
'ref_supplier',
$object->ref_supplier, $object, $user->hasRight(
'contrat',
'creer'),
'string',
'',
null,
null,
'', 1,
'getFormatedSupplierRef');
1523 $morehtmlref .=
'<br>'.$object->thirdparty->getNomUrl(1);
1525 $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>';
1529 $langs->load(
"projects");
1530 $morehtmlref .=
'<br>';
1531 if ($permissiontoadd) {
1532 $morehtmlref .=
img_picto($langs->trans(
"Project"),
'project',
'class="pictofixedwidth"');
1533 if ($action !=
'classify') {
1534 $morehtmlref .=
'<a class="editfielda" href="'.dolBuildUrl($_SERVER[
'PHP_SELF'], [
'action' =>
'classify',
'id' =>
$object->id],
true).
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetProject')).
'</a> ';
1536 $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');
1538 if (!empty(
$object->fk_project)) {
1540 $proj->fetch(
$object->fk_project);
1541 $morehtmlref .= $proj->getNomUrl(1);
1543 $morehtmlref .=
'<span class="opacitymedium"> - '.dol_escape_htmltag($proj->title).
'</span>';
1548 $morehtmlref .=
'</div>';
1551 dol_banner_tab($object,
'ref', $linkback, 1,
'ref',
'none', $morehtmlref);
1554 print
'<div class="fichecenter">';
1555 print
'<div class="underbanner clearboth"></div>';
1558 print
'<table class="border tableforfield" width="100%">';
1561 print
'<tr><td class="titlefield">'.$langs->trans(
'Discount').
'</td><td colspan="3">';
1562 if (
$object->thirdparty->remise_percent) {
1563 print $langs->trans(
"CompanyHasRelativeDiscount",
$object->thirdparty->remise_percent).
'. ';
1565 print
'<span class="hideonsmartphone">'.$langs->trans(
"CompanyHasNoRelativeDiscount").
'. </span>';
1567 $absolute_discount =
$object->thirdparty->getAvailableDiscounts();
1568 if ($absolute_discount) {
1569 print $langs->trans(
"CompanyHasAbsoluteDiscount",
price($absolute_discount), $langs->trans(
"Currency".$conf->currency)).
'.';
1571 print
'<span class="hideonsmartphone">'.$langs->trans(
"CompanyHasNoAbsoluteDiscount").
'.</span>';
1577 print
'<td class="titlefield">';
1578 print $form->editfieldkey(
"Date",
'date_contrat',
$object->date_contrat, $object, $user->hasRight(
'contrat',
'creer'));
1580 print $form->editfieldval(
"Date",
'date_contrat',
$object->date_contrat, $object, $user->hasRight(
'contrat',
'creer'),
'datehourpicker');
1585 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_view.tpl.php';
1591 if (
$object->status == $object::STATUS_DRAFT && $user->hasRight(
'contrat',
'creer')) {
1598 $blocname =
'contacts';
1599 $title = $langs->trans(
'ContactsAddresses');
1600 include DOL_DOCUMENT_ROOT.
'/core/tpl/bloc_showhide.tpl.php';
1604 $blocname =
'notes';
1605 $title = $langs->trans(
'Notes');
1606 include DOL_DOCUMENT_ROOT.
'/core/tpl/bloc_showhide.tpl.php';
1610 $arrayothercontracts =
$object->getListOfContracts(
'others');
1618 global $inputalsopricewithtax;
1619 $inputalsopricewithtax = 1;
1621 $productstatic =
new Product($db);
1624 if (
isModEnabled(
'margin') && !empty(
$object->element) && in_array(
$object->element, array(
'facture',
'propal',
'commande'))) {
1628 $parameters = array(
'nbOfLines' => &$nbofservices);
1629 $reshook = $hookmanager->executeHooks(
'printObjectLinesBlock', $parameters, $object, $action);
1630 if (empty($reshook)) {
1634 print
'<div id="contrat-lines-container" id="contractlines" data-contractid="'.$object->id.
'" data-element="'.
$object->element.
'" >';
1635 while ($cursorline <= $nbofservices) {
1636 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.
'" >';
1637 print
'<form name="update" id="addproduct" action="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'" method="post">';
1638 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1639 print
'<input type="hidden" name="action" value="updateline">';
1640 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
1641 print
'<input type="hidden" name="elrowid" value="'.$object->lines[$cursorline - 1]->id.
'">';
1642 print
'<input type="hidden" name="fournprice" value="'.(!empty(
$object->lines[$cursorline - 1]->fk_fournprice) ?
$object->lines[$cursorline - 1]->fk_fournprice : 0).
'">';
1645 print
'<div class="div-table-responsive-no-min">';
1646 print
'<table class="notopnoleftnoright allwidth tableforservicepart1 centpercent">';
1648 $sql =
"SELECT cd.rowid, cd.statut, cd.label as label_det, cd.fk_product, cd.product_type, cd.description, cd.qty,";
1649 $sql .=
" cd.tva_tx, cd.vat_src_code, cd.remise_percent, cd.info_bits, cd.subprice, cd.multicurrency_subprice,";
1650 $sql .=
" cd.date_ouverture_prevue as date_start, cd.date_ouverture as date_start_real,";
1651 $sql .=
" cd.date_fin_validite as date_end, cd.date_cloture as date_end_real,";
1652 $sql .=
" cd.commentaire as comment, cd.fk_product_fournisseur_price as fk_fournprice, cd.buy_price_ht as pa_ht,";
1653 $sql .=
" cd.fk_unit,";
1654 $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";
1655 $sql .=
" ,cd.rang";
1656 $sql .=
" FROM ".MAIN_DB_PREFIX.
"contratdet as cd";
1657 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"product as p ON cd.fk_product = p.rowid";
1658 $sql .=
" WHERE cd.rowid = ".((int)
$object->lines[$cursorline - 1]->id);
1660 $result = $db->query($sql);
1665 $objp = $db->fetch_object($result);
1668 print
'<tr class="liste_titre'.($cursorline ?
' liste_titre_add' :
'').
'">';
1669 print
'<td>'.$langs->trans(
"ServiceNb", $cursorline).
'</td>';
1670 print
'<td width="80" class="center">'.$langs->trans(
"VAT").
'</td>';
1671 print
'<td width="80" class="right">'.$langs->trans(
"PriceUHT").
'</td>';
1675 print
'<td width="30" class="center">'.$langs->trans(
"Qty").
'</td>';
1677 print
'<td width="30" class="left">'.$langs->trans(
"Unit").
'</td>';
1679 print
'<td width="50" class="right">'.$langs->trans(
"ReductionShort").
'</td>';
1681 print
'<td width="50" class="right">'.$langs->trans(
"BuyingPrice").
'</td>';
1685 if ($nbofservices > 1 && $conf->browser->layout !=
'phone' && $user->hasRight(
'contrat',
'creer')) {
1686 print
'<td width="30" class="linecolmove tdlineupdown center">';
1687 if ($cursorline > 1) {
1688 print
'<a class="lineupdown reposition" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=up&token='.
newToken().
'&rowid='.$objp->rowid.
'">';
1689 echo
img_up(
'default', 0,
'imgupforline');
1692 if ($cursorline < $nbofservices) {
1693 print
'<a class="lineupdown reposition" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=down&token='.
newToken().
'&rowid='.$objp->rowid.
'">';
1694 echo
img_down(
'default', 0,
'imgdownforline');
1699 print
'<td width="30"> </td>';
1707 if ($action !=
'editline' || $idline != $objp->rowid) {
1709 if (
getDolGlobalString(
'CONTRACT_HIDE_CLOSED_SERVICES_BY_DEFAULT') && $objp->statut == ContratLigne::STATUS_CLOSED && $action !=
'showclosedlines') {
1710 $moreparam =
'style="display: none;"';
1714 $line->id = $objp->rowid;
1718 print
'<tr class="tdtop oddeven" '.$moreparam.
'>';
1721 print
'<td class="linecoldescription minwidth300imp">';
1723 print
'<div id="line_'.$line->rowid.
'"></div>';
1724 if ($objp->fk_product > 0) {
1725 $productstatic->id = $objp->fk_product;
1726 $productstatic->type = $objp->ptype;
1727 $productstatic->ref = $objp->pref;
1728 $productstatic->entity = $objp->pentity;
1729 $productstatic->label = $objp->plabel;
1730 $productstatic->status = $objp->tosell;
1731 $productstatic->status_buy = $objp->tobuy;
1732 $productstatic->status_batch = $objp->tobatch;
1734 $text = $productstatic->getNomUrl(1,
'', 32);
1735 if ($objp->plabel) {
1737 $text .= $objp->plabel;
1739 $description = $objp->description;
1742 print (!empty($line->fk_parent_line) ?
img_picto(
'',
'rightarrow.png') :
'') . $text;
1744 print $form->textwithpicto(
'', $description);
1747 print $form->textwithtooltip($text, $description, 3, 0,
'',
'', 0, (!empty($line->fk_parent_line) ?
img_picto(
'',
'rightarrow.png') :
''));
1751 if ($line->fk_product > 0 &&
getDolGlobalInt(
'PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE')) {
1752 print (!empty($line->description) && $line->description != $line->plabel) ? (($line->date_start || $line->date_end) ?
'' :
'<br>').
'<br>'.
dol_htmlentitiesbr($line->
description) :
'';
1760 print
'<td class="center">';
1761 print
vatrate($objp->tva_tx.($objp->vat_src_code ? (
' ('.$objp->vat_src_code.
')') :
''), true, $objp->info_bits);
1764 print
'<td class="right">'.($objp->subprice !=
'' ?
price($objp->subprice) :
'').
"</td>\n";
1770 print
'<td class="center">'.$objp->qty.
'</td>';
1773 print
'<td class="left">'.$object->lines[$cursorline - 1]->getLabelOfUnit(
'long', $langs).
'</td>';
1776 if ($objp->remise_percent > 0) {
1777 print
'<td class="right">'.$objp->remise_percent.
"%</td>\n";
1779 print
'<td> </td>';
1784 print
'<td class="right nowraponall">'.price($objp->pa_ht).
'</td>';
1788 print
'<td class="nowraponall right">';
1789 if ($user->hasRight(
'contrat',
'creer') && is_array($arrayothercontracts) && count($arrayothercontracts) && (
$object->status >= 0)) {
1790 print
'<!-- link to move service line into another contract -->';
1791 print
'<a class="reposition marginrightonly" style="padding-left: 5px;" href="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'&action=move&token='.
newToken().
'&elrowid='.$objp->rowid.
'">';
1792 print
img_picto($langs->trans(
"MoveToAnotherContract"),
'uparrow');
1795 if ($user->hasRight(
'contrat',
'creer') && (
$object->statut >= 0)) {
1796 print
'<a class="reposition marginrightonly editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'&action=editline&token='.
newToken().
'&elrowid='.$objp->rowid.
'">';
1800 if ($user->hasRight(
'contrat',
'creer') && (
$object->statut >= 0)) {
1801 print
'<a class="reposition marginrightonly" href="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'&action=deleteline&token='.
newToken().
'&elrowid='.$objp->rowid.
'">';
1818 if ($objp->subprice >= 0) {
1819 print
'<tr class="oddeven" '.$moreparam.
'>';
1820 print
'<td colspan="'.$colspan.
'">';
1823 print $langs->trans(
"DateStartPlanned").
': ';
1824 if ($objp->date_start) {
1827 if ($objp->statut == 0 && $db->jdate($objp->date_start) < ($now - $conf->contrat->services->inactifs->warning_delay)) {
1828 $warning_delay = $conf->contrat->services->inactifs->warning_delay / 3600 / 24;
1829 $textlate = $langs->trans(
"Late").
' = '.$langs->trans(
"DateReference").
' > '.$langs->trans(
"DateToday").
' '.(ceil($warning_delay) >= 0 ?
'+' :
'').ceil($warning_delay).
' '.$langs->trans(
"days");
1830 print
" ".img_warning($textlate);
1833 print $langs->trans(
"Unknown");
1835 print
' - ';
1836 print $langs->trans(
"DateEndPlanned").
': ';
1837 if ($objp->date_end) {
1839 if ($objp->statut == 4 && $db->jdate($objp->date_end) < ($now - $conf->contrat->services->expires->warning_delay)) {
1840 $warning_delay = $conf->contrat->services->expires->warning_delay / 3600 / 24;
1841 $textlate = $langs->trans(
"Late").
' = '.$langs->trans(
"DateReference").
' > '.$langs->trans(
"DateToday").
' '.(ceil($warning_delay) >= 0 ?
'+' :
'').ceil($warning_delay).
' '.$langs->trans(
"days");
1842 print
" ".img_warning($textlate);
1845 print $langs->trans(
"Unknown");
1853 if (is_array($extralabelslines) && count($extralabelslines) > 0) {
1855 $line->id = $objp->rowid;
1856 $line->fetch_optionals();
1857 print $line->showOptionals($extrafields,
'view', array(
'class' =>
'oddeven',
'style' => $moreparam,
'colspan' => $colspan,
'tdclass' =>
'notitlefieldcreate'),
'',
'',
'1');
1862 print
'<tr class="oddeven">';
1864 $currentLineProductId = GETPOSTISSET(
'idprod') ?
GETPOST(
'idprod') : (!empty(
$object->lines[$cursorline - 1]->fk_product) ?
$object->lines[$cursorline - 1]->fk_product : 0);
1865 if ($objp->fk_product > 0) {
1866 $canchangeproduct = 1;
1869 if (empty($canchangeproduct)) {
1870 $productstatic->id = $objp->fk_product;
1871 $productstatic->type = $objp->ptype;
1872 $productstatic->ref = $objp->pref;
1873 $productstatic->entity = $objp->pentity;
1874 print $productstatic->getNomUrl(1,
'', 32);
1875 print $objp->label ?
' - '.dol_trunc($objp->label, 32) :
'';
1876 print
'<input type="hidden" name="idprod" value="'.$currentLineProductId.
'">';
1878 $senderissupplier = 0;
1879 if (empty($senderissupplier)) {
1885 print $form->select_produits($currentLineProductId,
'idprod', $filtertype, 0, 0, 1, 2,
'', 0, array(), 0, 1, 0,
'minwidth250onall maxwidth500 widthcentpercentminusx');
1887 $form->select_produits_fournisseurs($currentLineProductId,
'idprod');
1892 print $objp->label ? $objp->label.
'<br>' :
'';
1893 print
'<input type="hidden" name="idprod" value="'.$currentLineProductId.
'">';
1897 require_once DOL_DOCUMENT_ROOT.
'/core/class/doleditor.class.php';
1902 $doleditor =
new DolEditor(
'product_desc', (GETPOSTISSET(
'product_desc') ?
GETPOST(
'product_desc') : $objp->
description),
'', 92,
'dolibarr_details',
'', false, true,
getDolGlobalInt(
'FCKEDITOR_ENABLE_DETAILS'), $nbrows,
'90%');
1903 $doleditor->Create();
1908 print
'<td class="right">';
1909 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);
1913 print
'<td class="right"><input class="width50" type="text" name="elprice" value="'.(GETPOSTISSET(
'elprice') ?
GETPOST(
'elprice') :
price($objp->subprice)).
'"></td>';
1921 print
'<td class="center"><input size="2" type="text" name="elqty" value="'.(GETPOSTISSET(
'elqty') ?
GETPOST(
'elqty') : $objp->qty).
'"></td>';
1925 print
'<td class="left">';
1926 print $form->selectUnits((GETPOSTISSET(
'unit') ?
GETPOSTINT(
'unit') : $objp->fk_unit),
"unit");
1931 print
'<td class="nowraponall right"><input size="1" type="text" name="elremise_percent" value="'.(GETPOSTISSET(
'elremise_percent') ?
GETPOST(
'elremise_percent') : $objp->remise_percent).
'">%</td>';
1933 if (!empty($usemargins)) {
1934 print
'<td class="right">';
1935 if ($objp->fk_product) {
1936 print
'<select id="fournprice" name="fournprice"></select>';
1938 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>';
1940 print
'<td class="center">';
1941 print
'<input type="submit" class="button margintoponly marginbottomonly" name="save" value="'.$langs->trans(
"Modify").
'">';
1942 print
'<br><input type="submit" class="button margintoponly marginbottomonly button-cancel" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
1955 print
'<tr class="oddeven">';
1956 print
'<td colspan="'.$colspan.
'">';
1957 print $langs->trans(
"DateStartPlanned").
' ';
1958 print $form->selectDate($db->jdate($objp->date_start),
"date_start_update", $usehm, $usehm, ($db->jdate($objp->date_start) > 0 ? 0 : 1),
"update");
1959 print
' '.$langs->trans(
"DateEndPlanned").
' ';
1960 print $form->selectDate($db->jdate($objp->date_end),
"date_end_update", $usehm, $usehm, ($db->jdate($objp->date_end) > 0 ? 0 : 1),
"update");
1964 if (is_array($extralabelslines) && count($extralabelslines) > 0) {
1966 $line->id = $objp->rowid;
1967 $line->fetch_optionals();
1969 print $line->showOptionals($extrafields,
'edit', array(
'style' =>
'class="oddeven"',
'colspan' => $colspan,
'tdclass' =>
'notitlefieldcreate'),
'',
'',
'1');
1980 if (
getDolGlobalString(
'CONTRACT_HIDE_CLOSED_SERVICES_BY_DEFAULT') &&
$object->lines[$cursorline - 1]->statut == ContratLigne::STATUS_CLOSED && $action !=
'showclosedlines') {
1981 $moreparam =
'style="display: none;"';
1992 print
'<tr class="oddeven" '.$moreparam.
'>';
1993 print
'<td class="tdhrthin" colspan="'.$colspan.
'"><hr class="opacitymedium tdhrthin"></td>';
2006 if ($action ==
'deleteline' && !$cancel && $user->hasRight(
'contrat',
'creer') &&
$object->lines[$cursorline - 1]->id == $idline) {
2007 print $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".((
int)
$object->id).
"&lineid=".((
int) $idline), $langs->trans(
"DeleteContractLine"), $langs->trans(
"ConfirmDeleteContractLine"),
"confirm_deleteline",
'', 0, 1);
2008 if ($ret ==
'html') {
2009 print
'<table class="notopnoleftnoright centpercent"><tr class="oddeven" height="6"><td></td></tr></table>';
2016 if ($action ==
'move' && !$cancel && $user->hasRight(
'contrat',
'creer') &&
$object->lines[$cursorline - 1]->id == $idline) {
2017 $arraycontractid = array();
2018 foreach ($arrayothercontracts as $contractcursor) {
2019 $arraycontractid[$contractcursor->id] = $contractcursor->ref;
2023 $formquestion = array(
2024 'text' => $langs->trans(
"ConfirmMoveToAnotherContractQuestion"),
2025 0 => array(
'type' =>
'select',
'name' =>
'newcid',
'values' => $arraycontractid));
2027 print $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".((
int)
$object->id).
"&lineid=".((
int) $idline), $langs->trans(
"MoveToAnotherContract"), $langs->trans(
"ConfirmMoveToAnotherContract"),
"confirm_move", $formquestion,
'yes');
2028 print
'<table class="notopnoleftnoright centpercent"><tr class="oddeven" height="6"><td></td></tr></table>';
2033 print
'<table class="notopnoleftnoright tableforservicepart2'.($cursorline < $nbofservices ?
' boxtablenobottom' :
'').
' centpercent">';
2035 print
'<tr class="oddeven" '.$moreparam.
'>';
2036 print
'<td><span class="valignmiddle hideonsmartphone">'.$langs->trans(
"ServiceStatus").
':</span> '.
$object->lines[$cursorline - 1]->getLibStatut(4).
'</td>';
2037 print
'<td width="30" class="right">';
2038 if ($user->socid == 0) {
2039 if (
$object->status > 0 && $action !=
'activateline' && $action !=
'unactivateline' && is_object($objp)) {
2040 $tmpaction =
'activateline';
2041 $tmpactionpicto =
'play';
2042 $tmpactiontext = $langs->trans(
"Activate");
2043 if ($objp->statut == 4) {
2044 $tmpaction =
'unactivateline';
2045 $tmpactionpicto =
'playstop.png';
2046 $tmpactiontext = $langs->trans(
"Disable");
2048 if (($tmpaction ==
'activateline' && $user->hasRight(
'contrat',
'activer')) || ($tmpaction ==
'unactivateline' && $user->hasRight(
'contrat',
'desactiver'))) {
2049 print
'<a class="reposition" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&ligne='.
$object->lines[$cursorline - 1]->id.
'&action='.$tmpaction.
'&token='.
newToken().
'">';
2050 print
img_picto($tmpactiontext, $tmpactionpicto);
2058 print
'<tr class="oddeven" '.$moreparam.
'>';
2062 if (!$objp->date_start_real) {
2063 print $langs->trans(
"DateStartReal").
': ';
2064 if ($objp->date_start_real) {
2067 print $langs->trans(
"ContractStatusNotRunning");
2071 if ($objp->date_start_real && !$objp->date_end_real) {
2072 print $langs->trans(
"DateStartReal").
': ';
2076 if ($objp->date_start_real && $objp->date_end_real) {
2077 print $langs->trans(
"DateStartReal").
': ';
2079 print
' - ';
2080 print $langs->trans(
"DateEndReal").
': ';
2083 if (!empty($objp->comment)) {
2084 print
" - ".$objp->comment;
2088 print
'<td class="center"> </td>';
2095 if ($permissiontoactivate && $action ==
'activateline' &&
$object->lines[$cursorline - 1]->id ==
GETPOSTINT(
'ligne') && is_object($objp)) {
2096 print
'<form name="active" action="'.$_SERVER[
"PHP_SELF"].
'" method="POST">';
2097 print
'<input type="hidden" name="token" value="'.newToken().
'">';
2098 print
'<input type="hidden" name="action" value="confirm_active">';
2099 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
2100 print
'<input type="hidden" name="id" value="'.$object->id.
'">';
2101 print
'<input type="hidden" name="ligne" value="'.GETPOSTINT(
'ligne').
'">';
2102 print
'<input type="hidden" name="confirm" value="yes">';
2104 print
'<table class="noborder tableforservicepart2'.($cursorline < $nbofservices ?
' boxtablenobottom' :
'').
' centpercent">';
2107 $dateactstart = $objp->date_start;
2110 } elseif (!$dateactstart) {
2111 $dateactstart = time();
2114 $dateactend = $objp->date_end;
2117 } elseif (!$dateactend) {
2118 if ($objp->fk_product > 0) {
2120 $product->fetch($objp->fk_product);
2121 if (!empty($product->duration_value) && !empty($product->duration_unit)) {
2122 $dateactend =
dol_time_plus_duree(time(), $product->duration_value, $product->duration_unit);
2127 print
'<tr class="oddeven">';
2128 print
'<td class="nohover">'.$langs->trans(
"DateServiceActivate").
'</td><td class="nohover">';
2129 print $form->selectDate($dateactstart,
'start', $usehm, $usehm, 0,
"active", 1, 0);
2131 print
'<td class="nohover">'.$langs->trans(
"DateEndPlanned").
'</td><td class="nohover">';
2132 print $form->selectDate($dateactend,
"end", $usehm, $usehm, 0,
"active", 1, 0);
2134 print
'<td class="center nohover">';
2139 print
'<tr class="oddeven">';
2140 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>';
2141 print
'<td class="nohover right">';
2142 print
'<input type="submit" class="button" name="activate" value="'.$langs->trans(
"Activate").
'"> ';
2143 print
'<input type="submit" class="button button-cancel" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
2153 if ($permissiontodisable && $action ==
'unactivateline' &&
$object->lines[$cursorline - 1]->id ==
GETPOSTINT(
'ligne') && is_object($objp)) {
2154 print
'<!-- Form to disabled a line -->'.
"\n";
2155 print
'<form name="confirm_closeline" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&ligne='.
$object->lines[$cursorline - 1]->id.
'" method="post">';
2156 print
'<input type="hidden" name="token" value="'.newToken().
'">';
2157 print
'<input type="hidden" name="confirm" value="yes">';
2158 print
'<input type="hidden" name="action" value="confirm_closeline">';
2159 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
2161 print
'<table class="noborder tableforservicepart2'.($cursorline < $nbofservices ?
' boxtablenobottom' :
'').
' centpercent">';
2164 $dateactstart = $objp->date_start_real;
2167 } elseif (!$dateactstart) {
2168 $dateactstart = time();
2171 $dateactend = $objp->date_end_real;
2174 } elseif (!$dateactend) {
2175 if ($objp->fk_product > 0) {
2177 $product->fetch($objp->fk_product);
2178 $dateactend =
dol_time_plus_duree(time(), $product->duration_value, $product->duration_unit);
2182 if ($dateactend > $now) {
2186 print
'<tr class="oddeven"><td colspan="2" class="nohover">';
2187 if ($objp->statut >= 4) {
2188 if ($objp->statut == 4) {
2189 print $langs->trans(
"DateEndReal").
' ';
2190 print $form->selectDate($dateactend,
"end", $usehm, $usehm, ($objp->date_end_real > 0 ? 0 : 1),
"closeline", 1, 1);
2194 print
'<td class="center nohover">';
2197 print
'<tr class="oddeven">';
2198 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>';
2199 print
'<td class="nohover right">';
2200 print
'<input type="submit" class="button" name="close" value="'.$langs->trans(
"Disable").
'"> ';
2201 print
'<input type="submit" class="button button-cancel" name="cancel" value="'.$langs->trans(
"Cancel").
'">';
2216 if ($user->hasRight(
'contrat',
'creer') && (
$object->status == 0)) {
2220 print
' <form name="addproduct" id="addproduct" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.(($action !=
'editline') ?
'' :
'#line_'.
GETPOSTINT(
'lineid')).
'" method="POST">
2221 <input type="hidden" name="token" value="'.
newToken().
'">
2222 <input type="hidden" name="action" value="'.(($action !=
'editline') ?
'addline' :
'updateline').
'">
2223 <input type="hidden" name="mode" value="">
2224 <input type="hidden" name="id" value="'.
$object->id.
'">
2225 <input type="hidden" name="page_y" value="">
2226 <input type="hidden" name="backtopage" value="'.$backtopage.
'">
2229 print
'<div class="div-table-responsive-no-min">';
2230 print
'<table id="tablelines" class="noborder noshadow" width="100%">';
2233 if ($action !=
'editline') {
2234 $forcetoshowtitlelines = 1;
2235 if (empty(
$object->multicurrency_code)) {
2236 $object->multicurrency_code = $conf->currency;
2241 $parameters = array();
2242 $reshook = $hookmanager->executeHooks(
'formAddObjectLine', $parameters, $object, $action);
2246 if (empty($reshook)) {
2259 if (
GETPOST(
'modelselected')) {
2260 $action =
'presend';
2266 if ($user->socid == 0 && $action !=
'presend' && $action !=
'editline') {
2267 print
'<div class="tabsAction">';
2269 $parameters = array();
2270 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters, $object, $action);
2272 if (empty($reshook)) {
2276 'class' =>
'classfortooltip'
2281 if (empty($user->socid)) {
2282 if (
$object->status == $object::STATUS_VALIDATED) {
2283 if ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') || $user->hasRight(
'contrat',
'creer'))) {
2284 print
dolGetButtonAction(
'', $langs->trans(
'SendMail'),
'email', $_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=presend&token='.
newToken().
'&mode=init#formmailbeforetitle',
'',
true, $params);
2286 print
dolGetButtonAction(
'', $langs->trans(
'SendMail'),
'email',
'#',
'',
false, $params);
2291 if (
$object->status == $object::STATUS_DRAFT && $nbofservices) {
2292 if ($user->hasRight(
'contrat',
'creer')) {
2293 unset($params[
'attr'][
'title']);
2294 print
dolGetButtonAction($langs->trans(
'Validate'),
'',
'default', $_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=valid&token='.
newToken(),
'',
true, $params);
2296 $params[
'attr'][
'title'] = $langs->trans(
"NotEnoughPermissions");
2297 print
dolGetButtonAction($langs->trans(
'Validate'),
'',
'default',
'#',
'',
false, $params);
2300 if (
$object->status == $object::STATUS_VALIDATED) {
2301 if ($user->hasRight(
'contrat',
'creer')) {
2302 unset($params[
'attr'][
'title']);
2303 print
dolGetButtonAction($langs->trans(
'Modify'),
'',
'default', $_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=reopen&token='.
newToken(),
'',
true, $params);
2305 $params[
'attr'][
'title'] = $langs->trans(
"NotEnoughPermissions");
2306 print
dolGetButtonAction($langs->trans(
'Modify'),
'',
'default',
'#',
'',
false, $params);
2311 $arrayofcreatebutton = array();
2313 $arrayofcreatebutton[] = array(
2314 'url' =>
'/comm/propal/card.php?action=create&origin='.
$object->element.
'&originid='.
$object->id.
'&socid='.
$object->thirdparty->id.
'&renewal=true',
2315 'label' => $langs->trans(
'AddProp'),
2317 'perm' => $user->hasRight(
'propale',
'creer') ?
true : false,
2323 $arrayofcreatebutton[] = array(
2324 'url' =>
'/commande/card.php?action=create&token='.
newToken().
'&origin='.
$object->element.
'&originid='.
$object->id.
'&socid='.
$object->thirdparty->id,
2325 'label' => $langs->trans(
'AddOrder'),
2327 'perm' => $user->hasRight(
'commande',
'creer') ?
true : false,
2332 $arrayofcreatebutton[] = array(
2333 'url' =>
'/compta/facture/card.php?action=create&origin='.
$object->element.
'&originid='.
$object->id.
'&socid='.
$object->thirdparty->id,
2334 'label' => $langs->trans(
'CreateBill'),
2336 'perm' => $user->hasRight(
'facture',
'creer') ?
true : false,
2341 $langs->load(
"suppliers");
2342 $arrayofcreatebutton[] = array(
2343 'url' =>
'/fourn/facture/card.php?action=create&origin='.
$object->element.
'&originid='.
$object->id.
'&socid='.
$object->thirdparty->id,
2344 'label' => $langs->trans(
'AddSupplierInvoice'),
2346 'perm' => $user->hasRight(
'fournisseur',
'facture',
'creer') ?
true : false,
2350 if (count($arrayofcreatebutton)) {
2351 unset($params[
'attr'][
'title']);
2352 print
dolGetButtonAction(
'', $langs->trans(
"Create"),
'default', $arrayofcreatebutton,
'',
true, $params);
2355 $arrayforbutaction = array();
2356 $arrayforbutaction[] = array(
2357 'url' =>
'/contrat/card.php?id='.
$object->id.
'&action=activate&token='.
newToken(),
2358 'label' => $langs->trans(
'ActivateAllContracts'),
2360 'perm' => (
$object->nbofservicesclosed > 0 ||
$object->nbofserviceswait > 0) ? $permissiontoactivate : -1,
2363 $arrayforbutaction[] = array(
2364 'url' =>
'/contrat/card.php?id='.
$object->id.
'&action=close&token='.
newToken(),
2365 'label' => $langs->trans(
'CloseAllContracts'),
2367 'perm' => (
$object->nbofservicesclosed < $nbofservices) ? $permissiontodisable : -1,
2371 if (count($arrayforbutaction)) {
2372 unset($params[
'attr'][
'title']);
2373 print
dolGetButtonAction(
'', $langs->trans(
"Enable").
" / ".$langs->trans(
"Close"),
'default', $arrayforbutaction,
'',
true, $params);
2377 if ($action ==
'showclosedlines') {
2378 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>';
2380 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>';
2385 if (
getDolGlobalString(
'CONTRACT_SHOW_SIGNATURE_STATUS_WITH_SERVICE_STATUS') &&
$object->status > Contrat::STATUS_DRAFT) {
2386 if (
$object->signed_status != Contrat::$SIGNED_STATUSES[
'STATUS_SIGNED_ALL']) {
2387 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>';
2389 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>';
2394 if ($user->hasRight(
'contrat',
'creer')) {
2395 unset($params[
'attr'][
'title']);
2400 unset($params[
'attr'][
'title']);
2401 print
dolGetButtonAction($langs->trans(
'Delete'),
'',
'delete', $_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=delete&token='.
newToken(),
'', $permissiontodelete, $params);
2407 if ($action !=
'presend') {
2408 print
'<div class="fichecenter"><div class="fichehalfleft">';
2415 $urlsource = $_SERVER[
"PHP_SELF"].
"?id=".
$object->id;
2416 $genallowed = $user->hasRight(
'contrat',
'lire');
2417 $delallowed = $user->hasRight(
'contrat',
'creer');
2420 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);
2424 $tmparray = $form->showLinkToObjectBlock($object, array(), array(
'contrat'), 1);
2425 $linktoelem = $tmparray[
'linktoelem'];
2426 $htmltoenteralink = $tmparray[
'htmltoenteralink'];
2427 print $htmltoenteralink;
2429 $somethingshown = $form->showLinkedObjectBlock($object, $linktoelem);
2433 print
'<br><!-- Link to sign -->';
2434 require_once DOL_DOCUMENT_ROOT.
'/core/lib/signature.lib.php';
2436 print showOnlineSignatureUrl(
'contract',
$object->ref, $object).
'<br>';
2439 print
'</div><div class="fichehalfright">';
2443 $morehtmlcenter =
'<div class="nowraponall">';
2444 $morehtmlcenter .=
dolGetButtonTitle($langs->trans(
'FullConversation'),
'',
'fa fa-comments imgforviewmode', DOL_URL_ROOT.
'/contrat/messaging.php?id='.
$object->id);
2445 $morehtmlcenter .=
dolGetButtonTitle($langs->trans(
'SeeAll'),
'',
'fa fa-bars imgforviewmode', DOL_URL_ROOT.
'/contrat/agenda.php?id='.
$object->id);
2446 $morehtmlcenter .=
'</div>';
2450 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
2452 $somethingshown = $formactions->showactions($object,
'contract', $socid, 1,
'listactions', $MAXEVENT,
'', $morehtmlcenter);
2454 print
'</div></div>';
2458 $modelmail =
'contract';
2459 $defaulttopic =
'SendContractRef';
2460 $diroutput = $conf->contract->multidir_output[
$object->entity ?? $conf->entity];
2461 $trackid =
'con'.$object->id;
2463 include DOL_DOCUMENT_ROOT.
'/core/tpl/card_presend.tpl.php';
2475 print
"\n".
'<script type="text/javascript">'.
"\n";
2477 $(document).ready(
function() {
2478 var idprod = $(
"input[name='idprod']").val();
2479 var fournprice = $(
"input[name='fournprice']").val();
2480 var token =
'<?php echo currentToken(); ?>';
2482 $.post(
'<?php echo DOL_URL_ROOT; ?>/fourn/ajax/getSupplierPrices.php', {
2486 if (data.length > 0) {
2489 $(data).each(
function() {
2490 options +=
'<option value="'+this.
id+
'" price="'+this.
price+
'"';
2491 if (fournprice > 0) {
2492 if (this.
id == fournprice) {
2493 options +=
' selected';
2494 $(
"#buying_price").val(this.price);
2498 options +=
'>'+this.label+
'</option>';
2500 options +=
'<option value=null'+(trouve?
'':
' selected')+
'><?php echo $langs->trans("InputPrice"); ?></option>';
2501 $(
"#fournprice").html(options);
2503 $(
"#buying_price").hide();
2504 $(
"#fournprice").show();
2507 $(
"#buying_price").show();
2509 $(
"#fournprice").change(
function() {
2510 var selval = $(
this).find(
'option:selected').attr(
"price");
2512 $(
"#buying_price").val(selval).hide();
2514 $(
'#buying_price').show();
2518 $(
"#fournprice").hide();
2519 $(
'#buying_price').show();
2525 $(
"#fournprice").hide();
2526 $(
'#buying_price').show();
2530 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.