dolibarr  x.y.z
card.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (C) 2002-2007 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3  * Copyright (C) 2004-2016 Laurent Destailleur <eldy@users.sourceforge.net>
4  * Copyright (C) 2005-2018 Regis Houssin <regis.houssin@inodbox.com>
5  * Copyright (C) 2011-2020 Juanjo Menent <jmenent@2byte.es>
6  * Copyright (C) 2013 Florian Henry <florian.henry@open-concept.pro>
7  * Copyright (C) 2014-2018 Ferran Marcet <fmarcet@2byte.es>
8  * Copyright (C) 2014-2022 Charlene Benke <charlene@patas-monkey.com>
9  * Copyright (C) 2015-2016 Abbes Bahfir <bafbes@gmail.com>
10  * Copyright (C) 2018-2022 Philippe Grand <philippe.grand@atoo-net.com>
11  * Copyright (C) 2020 Frédéric France <frederic.france@netlogic.fr>
12  *
13  * This program is free software; you can redistribute it and/or modify
14  * it under the terms of the GNU General Public License as published by
15  * the Free Software Foundation; either version 3 of the License, or
16  * (at your option) any later version.
17  *
18  * This program is distributed in the hope that it will be useful,
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21  * GNU General Public License for more details.
22  *
23  * You should have received a copy of the GNU General Public License
24  * along with this program. If not, see <https://www.gnu.org/licenses/>.
25  */
26 
33 // Load Dolibarr environment
34 require '../main.inc.php';
35 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
36 require_once DOL_DOCUMENT_ROOT.'/fichinter/class/fichinter.class.php';
37 require_once DOL_DOCUMENT_ROOT.'/core/modules/fichinter/modules_fichinter.php';
38 require_once DOL_DOCUMENT_ROOT.'/core/lib/fichinter.lib.php';
39 require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
40 if (isModEnabled('project')) {
41  require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
42  require_once DOL_DOCUMENT_ROOT.'/core/class/html.formprojet.class.php';
43 }
44 if (isModEnabled('contrat')) {
45  require_once DOL_DOCUMENT_ROOT."/core/class/html.formcontract.class.php";
46  require_once DOL_DOCUMENT_ROOT."/contrat/class/contrat.class.php";
47 }
48 if (!empty($conf->global->FICHEINTER_ADDON) && is_readable(DOL_DOCUMENT_ROOT."/core/modules/fichinter/mod_".$conf->global->FICHEINTER_ADDON.".php")) {
49  require_once DOL_DOCUMENT_ROOT."/core/modules/fichinter/mod_".$conf->global->FICHEINTER_ADDON.'.php';
50 }
51 require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
52 require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
53 
54 // Load translation files required by the page
55 $langs->loadLangs(array('bills', 'companies', 'interventions', 'stocks'));
56 
57 $id = GETPOST('id', 'int');
58 $ref = GETPOST('ref', 'alpha');
59 $ref_client = GETPOST('ref_client', 'alpha');
60 $socid = (int) GETPOST('socid', 'int');
61 $contratid = (int) GETPOST('contratid', 'int');
62 $action = GETPOST('action', 'alpha');
63 $cancel = GETPOST('cancel', 'alpha');
64 $confirm = GETPOST('confirm', 'alpha');
65 $mesg = GETPOST('msg', 'alpha');
66 $origin = GETPOST('origin', 'alpha');
67 $originid = (GETPOST('originid', 'int') ?GETPOST('originid', 'int') : GETPOST('origin_id', 'int')); // For backward compatibility
68 $note_public = GETPOST('note_public', 'restricthtml');
69 $note_private = GETPOST('note_private', 'restricthtml');
70 $lineid = GETPOST('line_id', 'int');
71 
72 $error = 0;
73 
74 //PDF
75 $hidedetails = (GETPOST('hidedetails', 'int') ? GETPOST('hidedetails', 'int') : (!empty($conf->global->MAIN_GENERATE_DOCUMENTS_HIDE_DETAILS) ? 1 : 0));
76 $hidedesc = (GETPOST('hidedesc', 'int') ? GETPOST('hidedesc', 'int') : (!empty($conf->global->MAIN_GENERATE_DOCUMENTS_HIDE_DESC) ? 1 : 0));
77 $hideref = (GETPOST('hideref', 'int') ? GETPOST('hideref', 'int') : (!empty($conf->global->MAIN_GENERATE_DOCUMENTS_HIDE_REF) ? 1 : 0));
78 
79 // Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context
80 $hookmanager->initHooks(array('interventioncard', 'globalcard'));
81 
82 $object = new Fichinter($db);
83 $extrafields = new ExtraFields($db);
84 $objectsrc = null;
85 
86 $extrafields->fetch_name_optionals_label($object->table_element);
87 
88 // Load object
89 if ($id > 0 || !empty($ref)) {
90  $ret = $object->fetch($id, $ref);
91  if ($ret > 0) {
92  $ret = $object->fetch_thirdparty();
93  }
94  if ($ret < 0) {
95  dol_print_error('', $object->error);
96  }
97 }
98 
99 // Security check
100 if ($user->socid) {
101  $socid = $user->socid;
102 }
103 $result = restrictedArea($user, 'ficheinter', $id, 'fichinter');
104 
105 $permissionnote = $user->rights->ficheinter->creer; // Used by the include of actions_setnotes.inc.php
106 $permissiondellink = $user->rights->ficheinter->creer; // Used by the include of actions_dellink.inc.php
107 $permissiontodelete = (($object->statut == Fichinter::STATUS_DRAFT && $user->rights->ficheinter->creer) || $user->rights->ficheinter->supprimer);
108 
109 
110 /*
111  * Actions
112  */
113 
114 $parameters = array('socid'=>$socid);
115 $reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
116 if ($reshook < 0) {
117  setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
118 }
119 
120 if (empty($reshook)) {
121  $backurlforlist = DOL_URL_ROOT.'/fichinter/list.php';
122 
123  if (empty($backtopage) || ($cancel && empty($id))) {
124  if (empty($backtopage) || ($cancel && strpos($backtopage, '__ID__'))) {
125  if (empty($id) && (($action != 'add' && $action != 'create') || $cancel)) {
126  $backtopage = $backurlforlist;
127  } else {
128  $backtopage = DOL_URL_ROOT.'/fichinter/card.php?id='.((!empty($id) && $id > 0) ? $id : '__ID__');
129  }
130  }
131  }
132 
133  if ($cancel) {
134  if (!empty($backtopageforcancel)) {
135  header("Location: ".$backtopageforcancel);
136  exit;
137  } elseif (!empty($backtopage)) {
138  header("Location: ".$backtopage);
139  exit;
140  }
141  $action = '';
142  }
143 
144  include DOL_DOCUMENT_ROOT.'/core/actions_setnotes.inc.php'; // Must be include, not include_once
145 
146  include DOL_DOCUMENT_ROOT.'/core/actions_dellink.inc.php'; // Must be include, not include_once
147 
148  // Action clone object
149  if ($action == 'confirm_clone' && $confirm == 'yes' && $user->rights->ficheinter->creer) {
150  if (1 == 0 && !GETPOST('clone_content') && !GETPOST('clone_receivers')) {
151  setEventMessages($langs->trans("NoCloneOptionsSpecified"), null, 'errors');
152  } else {
153  if ($object->id > 0) {
154  // Because createFromClone modifies the object, we must clone it so that we can restore it later
155  $orig = clone $object;
156 
157  $result = $object->createFromClone($user, $socid);
158  if ($result > 0) {
159  header("Location: ".$_SERVER['PHP_SELF'].'?id='.$result);
160  exit;
161  } else {
162  setEventMessages($object->error, $object->errors, 'errors');
163  $object = $orig;
164  $action = '';
165  }
166  }
167  }
168  }
169 
170  if ($action == 'confirm_validate' && $confirm == 'yes' && $user->rights->ficheinter->creer) {
171  $result = $object->setValid($user);
172 
173  if ($result >= 0) {
174  if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) {
175  // Define output language
176  $outputlangs = $langs;
177  $newlang = '';
178  if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang) && GETPOST('lang_id', 'aZ09')) {
179  $newlang = GETPOST('lang_id', 'aZ09');
180  }
181  if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang)) {
182  $newlang = $object->thirdparty->default_lang;
183  }
184  if (!empty($newlang)) {
185  $outputlangs = new Translate("", $conf);
186  $outputlangs->setDefaultLang($newlang);
187  }
188  $result = fichinter_create($db, $object, (!GETPOST('model', 'alpha')) ? $object->model_pdf : GETPOST('model', 'alpha'), $outputlangs);
189  }
190 
191  header('Location: '.$_SERVER["PHP_SELF"].'?id='.$object->id);
192  exit;
193  } else {
194  $mesg = $object->error;
195  }
196  } elseif ($action == 'confirm_modify' && $confirm == 'yes' && $user->rights->ficheinter->creer) {
197  $result = $object->setDraft($user);
198  if ($result >= 0) {
199  if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) {
200  // Define output language
201  $outputlangs = $langs;
202  $newlang = '';
203  if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang) && GETPOST('lang_id', 'aZ09')) {
204  $newlang = GETPOST('lang_id', 'aZ09');
205  }
206  if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang)) {
207  $newlang = $object->thirdparty->default_lang;
208  }
209  if (!empty($newlang)) {
210  $outputlangs = new Translate("", $conf);
211  $outputlangs->setDefaultLang($newlang);
212  }
213  $result = fichinter_create($db, $object, (!GETPOST('model', 'alpha')) ? $object->model_pdf : GETPOST('model', 'alpha'), $outputlangs);
214  }
215 
216  header('Location: '.$_SERVER["PHP_SELF"].'?id='.$object->id);
217  exit;
218  } else {
219  $mesg = $object->error;
220  }
221  } elseif ($action == 'add' && $user->rights->ficheinter->creer) {
222  $selectedLines = GETPOST('toselect', 'array');
223  $object->socid = $socid;
224  $object->duration = (int) GETPOST('duration', 'int');
225  $object->fk_project = (int) GETPOST('projectid', 'int');
226  $object->fk_contrat = (int) GETPOST('contratid', 'int');
227  $object->author = $user->id;
228  $object->description = GETPOST('description', 'restricthtml');
229  $object->ref = $ref;
230  $object->ref_client = $ref_client;
231  $object->model_pdf = GETPOST('model', 'alpha');
232  $object->note_private = GETPOST('note_private', 'restricthtml');
233  $object->note_public = GETPOST('note_public', 'restricthtml');
234 
235  if ($object->socid > 0) {
236  // If creation from another object of another module (Example: origin=propal, originid=1)
237  if (!empty($origin) && !empty($originid)) {
238  // Parse element/subelement (ex: project_task)
239  $regs = array();
240  $element = $subelement = GETPOST('origin', 'alphanohtml');
241  if (preg_match('/^([^_]+)_([^_]+)/i', GETPOST('origin', 'alphanohtml'), $regs)) {
242  $element = $regs[1];
243  $subelement = $regs[2];
244  }
245 
246  // For compatibility
247  if ($element == 'order') {
248  $element = $subelement = 'commande';
249  }
250  if ($element == 'propal') {
251  $element = 'comm/propal'; $subelement = 'propal';
252  }
253  if ($element == 'contract') {
254  $element = $subelement = 'contrat';
255  }
256 
257  $object->origin = $origin;
258  $object->origin_id = $originid;
259 
260  // Possibility to add external linked objects with hooks
261  $object->linked_objects[$object->origin] = $object->origin_id;
262  if (is_array($_POST['other_linked_objects']) && !empty($_POST['other_linked_objects'])) {
263  $object->linked_objects = array_merge($object->linked_objects, $_POST['other_linked_objects']);
264  }
265 
266  // Extrafields
267 
268  // Fill array 'array_options' with data from add form
269  $ret = $extrafields->setOptionalsFromPost(null, $object);
270  if ($ret < 0) {
271  $error++;
272  $action = 'create';
273  }
274  //$array_options = $extrafields->getOptionalsFromPost($object->table_element);
275 
276  //$object->array_options = $array_options;
277 
278  $id = $object->create($user);
279 
280  if ($id > 0) {
281  dol_include_once('/'.$element.'/class/'.$subelement.'.class.php');
282 
283  $classname = ucfirst($subelement);
284  $srcobject = new $classname($db);
285 
286  dol_syslog("Try to find source object origin=".$object->origin." originid=".$object->origin_id." to add lines");
287  $result = $srcobject->fetch($object->origin_id);
288  if ($result > 0) {
289  $srcobject->fetch_thirdparty();
290  $lines = $srcobject->lines;
291  if (empty($lines) && method_exists($srcobject, 'fetch_lines')) {
292  $srcobject->fetch_lines();
293  $lines = $srcobject->lines;
294  }
295 
296  if (is_array($lines)) {
297  $num = count($lines);
298 
299  for ($i = 0; $i < $num; $i++) {
300  if (!in_array($lines[$i]->id, $selectedLines)) {
301  continue; // Skip unselected lines
302  }
303 
304  $product_type = ($lines[$i]->product_type ? $lines[$i]->product_type : Product::TYPE_PRODUCT);
305 
306  if ($product_type == Product::TYPE_SERVICE || !empty($conf->global->FICHINTER_PRINT_PRODUCTS)) { //only services except if config includes products
307  $duration = 3600; // Default to one hour
308 
309  // Predefined products & services
310  if ($lines[$i]->fk_product > 0) {
311  $prod = new Product($db);
312  $prod->id = $lines[$i]->fk_product;
313 
314  // Define output language
315  if (getDolGlobalInt('MAIN_MULTILANGS') && !empty($conf->global->PRODUIT_TEXTS_IN_THIRDPARTY_LANGUAGE)) {
316  $prod->getMultiLangs();
317  // We show if duration is present on service (so we get it)
318  $prod->fetch($lines[$i]->fk_product);
319  $outputlangs = $langs;
320  $newlang = '';
321  if (empty($newlang) && GETPOST('lang_id', 'aZ09')) {
322  $newlang = GETPOST('lang_id', 'aZ09');
323  }
324  if (empty($newlang)) {
325  $newlang = $srcobject->thirdparty->default_lang;
326  }
327  if (!empty($newlang)) {
328  $outputlangs = new Translate("", $conf);
329  $outputlangs->setDefaultLang($newlang);
330  }
331  $label = (!empty($prod->multilangs[$outputlangs->defaultlang]["libelle"])) ? $prod->multilangs[$outputlangs->defaultlang]["libelle"] : $lines[$i]->product_label;
332  } else {
333  $prod->fetch($lines[$i]->fk_product);
334  $label = $lines[$i]->product_label;
335  }
336 
337  if ($prod->duration_value && $conf->global->FICHINTER_USE_SERVICE_DURATION) {
338  switch ($prod->duration_unit) {
339  default:
340  case 'h':
341  $mult = 3600;
342  break;
343  case 'd':
344  $mult = 3600 * 24;
345  break;
346  case 'w':
347  $mult = 3600 * 24 * 7;
348  break;
349  case 'm':
350  $mult = (int) 3600 * 24 * (365 / 12); // Average month duration
351  break;
352  case 'y':
353  $mult = 3600 * 24 * 365;
354  break;
355  }
356  $duration = $prod->duration_value * $mult * $lines[$i]->qty;
357  }
358 
359  $desc = $lines[$i]->product_ref;
360  $desc .= ' - ';
361  $desc .= $label;
362  $desc .= '<br>';
363  }
364  // Common part (predefined or free line)
365  $desc .= dol_htmlentitiesbr($lines[$i]->desc);
366  $desc .= '<br>';
367  $desc .= ' ('.$langs->trans('Quantity').': '.$lines[$i]->qty.')';
368 
369  $timearray = dol_getdate(dol_now());
370  $date_intervention = dol_mktime(0, 0, 0, $timearray['mon'], $timearray['mday'], $timearray['year']);
371 
372  if ($product_type == Product::TYPE_PRODUCT) {
373  $duration = 0;
374  }
375 
376  $predef = '';
377 
378  // Extrafields
379  $extrafields->fetch_name_optionals_label($object->table_element_line);
380  $array_options = $extrafields->getOptionalsFromPost($object->table_element_line, $predef);
381 
382  $result = $object->addline(
383  $user,
384  $id,
385  $desc,
386  $date_intervention,
387  $duration,
388  $array_options
389  );
390 
391  if ($result < 0) {
392  $error++;
393  break;
394  }
395  }
396  }
397  }
398  } else {
399  $langs->load("errors");
400  setEventMessages($srcobject->error, $srcobject->errors, 'errors');
401  $action = 'create';
402  $error++;
403  }
404  } else {
405  $langs->load("errors");
406  setEventMessages($object->error, $object->errors, 'errors');
407  $action = 'create';
408  $error++;
409  }
410  } else {
411  // Fill array 'array_options' with data from add form
412  $ret = $extrafields->setOptionalsFromPost(null, $object);
413  if ($ret < 0) {
414  $error++;
415  $action = 'create';
416  }
417 
418  if (!$error) {
419  // Extrafields
420  $array_options = $extrafields->getOptionalsFromPost($object->table_element);
421 
422  $object->array_options = $array_options;
423 
424  $result = $object->create($user);
425  if ($result > 0) {
426  $id = $result; // Force raffraichissement sur fiche venant d'etre cree
427  } else {
428  $langs->load("errors");
429  setEventMessages($object->error, $object->errors, 'errors');
430  $action = 'create';
431  $error++;
432  }
433  }
434  }
435  } else {
436  $mesg = $langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("ThirdParty"));
437  $action = 'create';
438  $error++;
439  }
440  } elseif ($action == 'update' && $user->rights->ficheinter->creer) {
441  $object->socid = $socid;
442  $object->fk_project = (int) GETPOST('projectid', 'int');
443  $object->fk_contrat = (int) GETPOST('contratid', 'int');
444  $object->author = $user->id;
445  $object->description = GETPOST('description', 'restricthtml');
446  $object->ref = $ref;
447  $object->ref_client = $ref_client;
448 
449  $result = $object->update($user);
450  if ($result < 0) {
451  setEventMessages($object->error, $object->errors, 'errors');
452  }
453  } elseif ($action == 'classin' && $user->rights->ficheinter->creer) {
454  // Set into a project
455  $result = $object->setProject(GETPOST('projectid', 'int'));
456  if ($result < 0) {
457  dol_print_error($db, $object->error);
458  }
459  } elseif ($action == 'setcontract' && $user->rights->contrat->creer) {
460  // Set into a contract
461  $result = $object->set_contrat($user, GETPOST('contratid', 'int'));
462  if ($result < 0) {
463  dol_print_error($db, $object->error);
464  }
465  } elseif ($action == 'setref_client' && $user->rights->ficheinter->creer) {
466  // Positionne ref client
467  $result = $object->setRefClient($user, GETPOST('ref_client', 'alpha'));
468  if ($result < 0) {
469  setEventMessages($object->error, $object->errors, 'errors');
470  }
471  } elseif ($action == 'confirm_delete' && $confirm == 'yes' && $user->rights->ficheinter->supprimer) {
472  $result = $object->delete($user);
473  if ($result < 0) {
474  setEventMessages($object->error, $object->errors, 'errors');
475  }
476 
477  header('Location: '.DOL_URL_ROOT.'/fichinter/list.php?leftmenu=ficheinter&restore_lastsearch_values=1');
478  exit;
479  } elseif ($action == 'setdescription' && $user->rights->ficheinter->creer) {
480  $result = $object->set_description($user, GETPOST('description'));
481  if ($result < 0) {
482  dol_print_error($db, $object->error);
483  }
484  } elseif ($action == "addline" && $user->rights->ficheinter->creer) {
485  // Add line
486  if (!GETPOST('np_desc', 'restricthtml') && empty($conf->global->FICHINTER_EMPTY_LINE_DESC)) {
487  $mesg = $langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Description"));
488  $error++;
489  }
490  if (empty($conf->global->FICHINTER_WITHOUT_DURATION) && !GETPOST('durationhour', 'int') && !GETPOST('durationmin', 'int')) {
491  $mesg = $langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Duration"));
492  $error++;
493  }
494  if (empty($conf->global->FICHINTER_WITHOUT_DURATION) && GETPOST('durationhour', 'int') >= 24 && GETPOST('durationmin', 'int') > 0) {
495  $mesg = $langs->trans("ErrorValueTooHigh");
496  $error++;
497  }
498  if (!$error) {
499  $db->begin();
500 
501  $desc = GETPOST('np_desc', 'restricthtml');
502  $date_intervention = dol_mktime(GETPOST('dihour', 'int'), GETPOST('dimin', 'int'), 0, GETPOST('dimonth', 'int'), GETPOST('diday', 'int'), GETPOST('diyear', 'int'));
503  $duration = empty($conf->global->FICHINTER_WITHOUT_DURATION) ? convertTime2Seconds(GETPOST('durationhour', 'int'), GETPOST('durationmin', 'int')) : 0;
504 
505  // Extrafields
506  $extrafields->fetch_name_optionals_label($object->table_element_line);
507  $array_options = $extrafields->getOptionalsFromPost($object->table_element_line);
508 
509  $result = $object->addline(
510  $user,
511  $id,
512  $desc,
513  $date_intervention,
514  $duration,
515  $array_options
516  );
517 
518  // Define output language
519  $outputlangs = $langs;
520  $newlang = '';
521  if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang) && GETPOST('lang_id', 'aZ09')) {
522  $newlang = GETPOST('lang_id', 'aZ09');
523  }
524  if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang)) {
525  $newlang = $object->thirdparty->default_lang;
526  }
527  if (!empty($newlang)) {
528  $outputlangs = new Translate("", $conf);
529  $outputlangs->setDefaultLang($newlang);
530  }
531 
532  if ($result >= 0) {
533  $db->commit();
534 
535  if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) {
536  fichinter_create($db, $object, $object->model_pdf, $outputlangs);
537  }
538  header('Location: '.$_SERVER["PHP_SELF"].'?id='.$object->id);
539  exit;
540  } else {
541  $mesg = $object->error;
542  $db->rollback();
543  }
544  }
545  } elseif ($action == 'classifybilled' && $user->rights->ficheinter->creer) {
546  // Classify Billed
547  $result = $object->setStatut(Fichinter::STATUS_BILLED);
548  if ($result > 0) {
549  header('Location: '.$_SERVER["PHP_SELF"].'?id='.$object->id);
550  exit;
551  } else {
552  setEventMessages($object->error, $object->errors, 'errors');
553  }
554  } elseif ($action == 'classifyunbilled' && $user->rights->ficheinter->creer) {
555  // Classify unbilled
556  $result = $object->setStatut(Fichinter::STATUS_VALIDATED);
557  if ($result > 0) {
558  header('Location: '.$_SERVER["PHP_SELF"].'?id='.$object->id);
559  exit;
560  } else {
561  $mesg = $object->error;
562  }
563  } elseif ($action == 'classifydone' && $user->rights->ficheinter->creer) {
564  // Classify Done
565  $result = $object->setStatut(Fichinter::STATUS_CLOSED);
566  if ($result > 0) {
567  header('Location: '.$_SERVER["PHP_SELF"].'?id='.$object->id);
568  exit;
569  } else {
570  setEventMessages($object->error, $object->errors, 'errors');
571  }
572  } elseif ($action == 'confirm_reopen' && $user->rights->ficheinter->creer) {
573  // Reopen
574  $result = $object->setStatut(Fichinter::STATUS_VALIDATED);
575  if ($result > 0) {
576  header('Location: '.$_SERVER["PHP_SELF"].'?id='.$object->id);
577  exit;
578  } else {
579  $mesg = $object->error;
580  }
581  } elseif ($action == 'updateline' && $user->rights->ficheinter->creer && GETPOST('save', 'alpha') == $langs->trans("Save")) {
582  // Mise a jour d'une ligne d'intervention
583  $objectline = new FichinterLigne($db);
584  if ($objectline->fetch($lineid) <= 0) {
585  dol_print_error($db);
586  exit;
587  }
588 
589  if ($object->fetch($objectline->fk_fichinter) <= 0) {
590  dol_print_error($db);
591  exit;
592  }
593  $object->fetch_thirdparty();
594 
595  $desc = GETPOST('np_desc', 'restricthtml');
596  $date_inter = dol_mktime(GETPOST('dihour', 'int'), GETPOST('dimin', 'int'), 0, GETPOST('dimonth', 'int'), GETPOST('diday', 'int'), GETPOST('diyear', 'int'));
597  $duration = convertTime2Seconds(GETPOST('durationhour', 'int'), GETPOST('durationmin', 'int'));
598 
599  $objectline->datei = $date_inter;
600  $objectline->desc = $desc;
601  $objectline->duration = $duration;
602 
603  // Extrafields
604  $extrafields->fetch_name_optionals_label($object->table_element_line);
605  $array_options = $extrafields->getOptionalsFromPost($object->table_element_line);
606  $objectline->array_options = $array_options;
607 
608  $result = $objectline->update($user);
609  if ($result < 0) {
610  dol_print_error($db);
611  exit;
612  }
613 
614  // Define output language
615  $outputlangs = $langs;
616  $newlang = '';
617  if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang) && GETPOST('lang_id', 'aZ09')) {
618  $newlang = GETPOST('lang_id', 'aZ09');
619  }
620  if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang)) {
621  $newlang = $object->thirdparty->default_lang;
622  }
623  if (!empty($newlang)) {
624  $outputlangs = new Translate("", $conf);
625  $outputlangs->setDefaultLang($newlang);
626  }
627  if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) {
628  fichinter_create($db, $object, $object->model_pdf, $outputlangs);
629  }
630 
631  header('Location: '.$_SERVER["PHP_SELF"].'?id='.$object->id);
632  exit;
633  } elseif ($action == 'confirm_deleteline' && $confirm == 'yes' && $user->rights->ficheinter->creer) {
634  // Supprime une ligne d'intervention AVEC confirmation
635  $objectline = new FichinterLigne($db);
636  if ($objectline->fetch($lineid) <= 0) {
637  dol_print_error($db);
638  exit;
639  }
640  $result = $objectline->deleteline($user);
641 
642  if ($object->fetch($objectline->fk_fichinter) <= 0) {
643  dol_print_error($db);
644  exit;
645  }
646 
647  // Define output language
648  $outputlangs = $langs;
649  $newlang = '';
650  if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang) && GETPOST('lang_id', 'aZ09')) {
651  $newlang = GETPOST('lang_id', 'aZ09');
652  }
653  if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang)) {
654  $newlang = $object->thirdparty->default_lang;
655  }
656  if (!empty($newlang)) {
657  $outputlangs = new Translate("", $conf);
658  $outputlangs->setDefaultLang($newlang);
659  }
660  if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) {
661  fichinter_create($db, $object, $object->model_pdf, $outputlangs);
662  }
663  } elseif ($action == 'up' && $user->rights->ficheinter->creer) {
664  // Set position of lines
665  $object->line_up($lineid);
666 
667  // Define output language
668  $outputlangs = $langs;
669  $newlang = '';
670  if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang) && GETPOST('lang_id', 'aZ09')) {
671  $newlang = GETPOST('lang_id', 'aZ09');
672  }
673  if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang)) {
674  $newlang = $object->thirdparty->default_lang;
675  }
676  if (!empty($newlang)) {
677  $outputlangs = new Translate("", $conf);
678  $outputlangs->setDefaultLang($newlang);
679  }
680  if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) {
681  fichinter_create($db, $object, $object->model_pdf, $outputlangs);
682  }
683 
684  header('Location: '.$_SERVER["PHP_SELF"].'?id='.$object->id.'#'.$lineid);
685  exit;
686  } elseif ($action == 'down' && $user->rights->ficheinter->creer) {
687  $object->line_down($lineid);
688 
689  // Define output language
690  $outputlangs = $langs;
691  $newlang = '';
692  if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang) && GETPOST('lang_id', 'aZ09')) {
693  $newlang = GETPOST('lang_id', 'aZ09');
694  }
695  if (getDolGlobalInt('MAIN_MULTILANGS') && empty($newlang)) {
696  $newlang = $object->thirdparty->default_lang;
697  }
698  if (!empty($newlang)) {
699  $outputlangs = new Translate("", $conf);
700  $outputlangs->setDefaultLang($newlang);
701  }
702  if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) {
703  fichinter_create($db, $object, $object->model_pdf, $outputlangs);
704  }
705 
706  header('Location: '.$_SERVER["PHP_SELF"].'?id='.$object->id.'#'.$lineid);
707  exit;
708  }
709 
710  // Actions when printing a doc from card
711  include DOL_DOCUMENT_ROOT.'/core/actions_printing.inc.php';
712 
713  // Actions to send emails
714  $triggersendname = 'FICHINTER_SENTBYMAIL';
715  $autocopy = 'MAIN_MAIL_AUTOCOPY_FICHINTER_TO';
716  $trackid = 'int'.$object->id;
717  include DOL_DOCUMENT_ROOT.'/core/actions_sendmails.inc.php';
718 
719  // Actions to build doc
720  $upload_dir = $conf->ficheinter->dir_output;
721  $permissiontoadd = $user->rights->ficheinter->creer;
722  include DOL_DOCUMENT_ROOT.'/core/actions_builddoc.inc.php';
723 
724  if ($action == 'update_extras') {
725  $object->oldcopy = dol_clone($object);
726 
727  // Fill array 'array_options' with data from update form
728  $ret = $extrafields->setOptionalsFromPost(null, $object, GETPOST('attribute', 'restricthtml'));
729  if ($ret < 0) {
730  $error++;
731  }
732 
733  if (!$error) {
734  // Actions on extra fields
735  $result = $object->insertExtraFields('INTERVENTION_MODIFY');
736  if ($result < 0) {
737  $error++;
738  }
739  }
740 
741  if ($error) {
742  $action = 'edit_extras';
743  }
744  }
745 
746  if (!empty($conf->global->MAIN_DISABLE_CONTACTS_TAB) && $user->rights->ficheinter->creer) {
747  if ($action == 'addcontact') {
748  if ($result > 0 && $id > 0) {
749  $contactid = (GETPOST('userid', 'int') ? GETPOST('userid', 'int') : GETPOST('contactid', 'int'));
750  $typeid = (GETPOST('typecontact') ? GETPOST('typecontact') : GETPOST('type'));
751  $result = $object->add_contact($contactid, $typeid, GETPOST("source", 'aZ09'));
752  }
753 
754  if ($result >= 0) {
755  header("Location: ".$_SERVER['PHP_SELF']."?id=".$object->id);
756  exit;
757  } else {
758  if ($object->error == 'DB_ERROR_RECORD_ALREADY_EXISTS') {
759  $langs->load("errors");
760  $mesg = $langs->trans("ErrorThisContactIsAlreadyDefinedAsThisType");
761  } else {
762  $mesg = $object->error;
763  }
764  }
765  } elseif ($action == 'swapstatut') {
766  // bascule du statut d'un contact
767  $result = $object->swapContactStatus(GETPOST('ligne', 'int'));
768  } elseif ($action == 'deletecontact') {
769  // Efface un contact
770  $result = $object->delete_contact(GETPOST('lineid', 'int'));
771 
772  if ($result >= 0) {
773  header("Location: ".$_SERVER['PHP_SELF']."?id=".$object->id);
774  exit;
775  } else {
776  dol_print_error($db);
777  }
778  }
779  }
780 }
781 
782 
783 /*
784  * View
785  */
786 
787 $form = new Form($db);
788 $formfile = new FormFile($db);
789 if (isModEnabled('contrat')) {
790  $formcontract = new FormContract($db);
791 }
792 if (isModEnabled('project')) {
793  $formproject = new FormProjets($db);
794 }
795 
796 
797 $help_url = 'EN:Module_Interventions';
798 
799 llxHeader('', $langs->trans("Intervention"), $help_url);
800 
801 if ($action == 'create') {
802  // Create new intervention
803 
804  $soc = new Societe($db);
805 
806  print load_fiche_titre($langs->trans("AddIntervention"), '', 'intervention');
807 
808  if ($error > 0) {
809  dol_htmloutput_errors($mesg);
810  } else {
811  dol_htmloutput_mesg($mesg);
812  }
813 
814  if ($socid) {
815  $res = $soc->fetch($socid);
816  }
817 
818  if (GETPOST('origin', 'alphanohtml') && GETPOST('originid', 'int')) {
819  // Parse element/subelement (ex: project_task)
820  $regs = array();
821  $element = $subelement = GETPOST('origin', 'alphanohtml');
822  if (preg_match('/^([^_]+)_([^_]+)/i', GETPOST('origin', 'alphanohtml'), $regs)) {
823  $element = $regs[1];
824  $subelement = $regs[2];
825  }
826 
827  if ($element == 'project') {
828  $projectid = GETPOST('originid', 'int');
829  } else {
830  // For compatibility
831  if ($element == 'order' || $element == 'commande') {
832  $element = $subelement = 'commande';
833  }
834  if ($element == 'propal') {
835  $element = 'comm/propal'; $subelement = 'propal';
836  }
837  if ($element == 'contract') {
838  $element = $subelement = 'contrat';
839  }
840 
841  dol_include_once('/'.$element.'/class/'.$subelement.'.class.php');
842 
843  $classname = ucfirst($subelement);
844  $objectsrc = new $classname($db);
845  $objectsrc->fetch(GETPOST('originid'));
846  if (empty($objectsrc->lines) && method_exists($objectsrc, 'fetch_lines')) {
847  $objectsrc->fetch_lines();
848  $lines = $objectsrc->lines;
849  }
850  $objectsrc->fetch_thirdparty();
851 
852  $projectid = (!empty($objectsrc->fk_project) ? $objectsrc->fk_project : '');
853 
854  $soc = $objectsrc->thirdparty;
855 
856  $note_private = (!empty($objectsrc->note) ? $objectsrc->note : (!empty($objectsrc->note_private) ? $objectsrc->note_private : GETPOST('note_private', 'restricthtml')));
857  $note_public = (!empty($objectsrc->note_public) ? $objectsrc->note_public : GETPOST('note_public', 'restricthtml'));
858 
859  // Replicate extrafields
860  $objectsrc->fetch_optionals();
861  $object->array_options = $objectsrc->array_options;
862 
863  // Object source contacts list
864  $srccontactslist = $objectsrc->liste_contact(-1, 'external', 1);
865  }
866  } else {
867  $projectid = GETPOST('projectid', 'int');
868  }
869 
870  if (!$conf->global->FICHEINTER_ADDON) {
871  dol_print_error($db, $langs->trans("Error")." ".$langs->trans("Error_FICHEINTER_ADDON_NotDefined"));
872  exit;
873  }
874 
875  $object->date = dol_now();
876 
877  $obj = $conf->global->FICHEINTER_ADDON;
878  $obj = "mod_".$obj;
879 
880  //$modFicheinter = new $obj;
881  //$numpr = $modFicheinter->getNextValue($soc, $object);
882 
883  if ($socid > 0) {
884  $soc = new Societe($db);
885  $soc->fetch($socid);
886 
887  print '<form name="fichinter" action="'.$_SERVER['PHP_SELF'].'" method="POST">';
888  print '<input type="hidden" name="token" value="'.newToken().'">';
889  print '<input type="hidden" name="socid" value='.$soc->id.'>';
890  print '<input type="hidden" name="action" value="add">';
891 
892  print dol_get_fiche_head('');
893 
894  print '<table class="border centpercent">';
895 
896  print '<tr><td class="fieldrequired titlefieldcreate">'.$langs->trans("ThirdParty").'</td><td>'.$soc->getNomUrl(1).'</td></tr>';
897 
898  // Ref
899  print '<tr><td class="fieldrequired">'.$langs->trans('Ref').'</td><td>'.$langs->trans("Draft").'</td></tr>';
900 
901  // Ref customer
902  print '<tr class="field_ref_client"><td class="titlefieldcreate">'.$langs->trans('RefCustomer').'</td><td class="valuefieldcreate">';
903  print '<input type="text" name="ref_client" value="'.GETPOST('ref_client').'"></td>';
904  print '</tr>';
905 
906  // Description (must be a textarea and not html must be allowed (used in list view)
907  print '<tr><td class="tdtop">'.$langs->trans("Description").'</td>';
908  print '<td>';
909  print '<textarea name="description" class="quatrevingtpercent" rows="'.ROWS_3.'">'.GETPOST('description').'</textarea>';
910  print '</td></tr>';
911 
912  // Project
913  if (isModEnabled('project')) {
914  $formproject = new FormProjets($db);
915 
916  $langs->load("project");
917 
918  print '<tr><td>'.$langs->trans("Project").'</td><td>';
919  /* Fix: If a project must be linked to any companies (suppliers or not), project must be not be set as limited to customer but must be not linked to any particular thirdparty
920  if ($societe->fournisseur==1)
921  $numprojet=select_projects(-1, GETPOST("projectid", 'int'), 'projectid');
922  else
923  $numprojet=select_projects($societe->id, GETPOST("projectid", 'int'), 'projectid');
924  */
925  $numprojet = $formproject->select_projects($soc->id, $projectid, 'projectid');
926  if ($numprojet == 0) {
927  print ' &nbsp; <a href="'.DOL_URL_ROOT.'/projet/card.php?socid='.$soc->id.'&action=create"><span class="fa fa-plus-circle valignmiddle paddingleft" title="'.$langs->trans("AddProject").'"></span></a>';
928  }
929  print '</td></tr>';
930  }
931 
932  // Contract
933  if (isModEnabled('contrat')) {
934  $langs->load("contracts");
935  print '<tr><td>'.$langs->trans("Contract").'</td><td>';
936  $numcontrat = $formcontract->select_contract($soc->id, GETPOST('contratid', 'int'), 'contratid', 0, 1, 1);
937  if ($numcontrat == 0) {
938  print ' &nbsp; <a href="'.DOL_URL_ROOT.'/contrat/card.php?socid='.$soc->id.'&action=create"><span class="fa fa-plus-circle valignmiddle paddingleft" title="'.$langs->trans("AddContract").'"></span></a>';
939  }
940  print '</td></tr>';
941  }
942 
943  // Model
944  print '<tr>';
945  print '<td>'.$langs->trans("DefaultModel").'</td>';
946  print '<td>';
948  print $form->selectarray('model', $liste, $conf->global->FICHEINTER_ADDON_PDF);
949  print "</td></tr>";
950 
951  // Public note
952  print '<tr>';
953  print '<td class="tdtop">'.$langs->trans('NotePublic').'</td>';
954  print '<td>';
955  $doleditor = new DolEditor('note_public', $note_public, '', 80, 'dolibarr_notes', 'In', 0, false, empty($conf->global->FCKEDITOR_ENABLE_NOTE_PUBLIC) ? 0 : 1, ROWS_3, '90%');
956  print $doleditor->Create(1);
957  //print '<textarea name="note_public" cols="80" rows="'.ROWS_3.'">'.$note_public.'</textarea>';
958  print '</td></tr>';
959 
960  // Private note
961  if (empty($user->socid)) {
962  print '<tr>';
963  print '<td class="tdtop">'.$langs->trans('NotePrivate').'</td>';
964  print '<td>';
965  $doleditor = new DolEditor('note_private', $note_private, '', 80, 'dolibarr_notes', 'In', 0, false, empty($conf->global->FCKEDITOR_ENABLE_NOTE_PRIVATE) ? 0 : 1, ROWS_3, '90%');
966  print $doleditor->Create(1);
967  //print '<textarea name="note_private" cols="80" rows="'.ROWS_3.'">'.$note_private.'</textarea>';
968  print '</td></tr>';
969  }
970 
971  // Other attributes
972  $parameters = array();
973  $reshook = $hookmanager->executeHooks('formObjectOptions', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
974  print $hookmanager->resPrint;
975  if (empty($reshook)) {
976  print $object->showOptionals($extrafields, 'create');
977  }
978 
979  // Show link to origin object
980  if (!empty($origin) && !empty($originid) && is_object($objectsrc)) {
981  $newclassname = $classname;
982  if ($newclassname == 'Propal') {
983  $newclassname = 'CommercialProposal';
984  }
985  print '<tr><td>'.$langs->trans($newclassname).'</td><td colspan="2">'.$objectsrc->getNomUrl(1).'</td></tr>';
986 
987  // Amount
988  /* Hide amount because we only copy services so amount may differ than source
989  print '<tr><td>' . $langs->trans('AmountHT') . '</td><td>' . price($objectsrc->total_ht) . '</td></tr>';
990  print '<tr><td>' . $langs->trans('AmountVAT') . '</td><td>' . price($objectsrc->total_tva) . "</td></tr>";
991  if ($mysoc->localtax1_assuj == "1" || $objectsrc->total_localtax1 != 0) // Localtax1 RE
992  {
993  print '<tr><td>' . $langs->transcountry("AmountLT1", $mysoc->country_code) . '</td><td>' . price($objectsrc->total_localtax1) . "</td></tr>";
994  }
995 
996  if ($mysoc->localtax2_assuj == "1" || $objectsrc->total_localtax2 != 0) // Localtax2 IRPF
997  {
998  print '<tr><td>' . $langs->transcountry("AmountLT2", $mysoc->country_code) . '</td><td>' . price($objectsrc->total_localtax2) . "</td></tr>";
999  }
1000 
1001  print '<tr><td>' . $langs->trans('AmountTTC') . '</td><td>' . price($objectsrc->total_ttc) . "</td></tr>";
1002 
1003  if (isModEnabled("multicurrency"))
1004  {
1005  print '<tr><td>' . $langs->trans('MulticurrencyAmountHT') . '</td><td>' . price($objectsrc->multicurrency_total_ht) . '</td></tr>';
1006  print '<tr><td>' . $langs->trans('MulticurrencyAmountVAT') . '</td><td>' . price($objectsrc->multicurrency_total_tva) . "</td></tr>";
1007  print '<tr><td>' . $langs->trans('MulticurrencyAmountTTC') . '</td><td>' . price($objectsrc->multicurrency_total_ttc) . "</td></tr>";
1008  }
1009  */
1010  }
1011 
1012  print '</table>';
1013 
1014  if (is_object($objectsrc)) {
1015  print '<input type="hidden" name="origin" value="'.$objectsrc->element.'">';
1016  print '<input type="hidden" name="originid" value="'.$objectsrc->id.'">';
1017  } elseif ($origin == 'project' && !empty($projectid)) {
1018  print '<input type="hidden" name="projectid" value="'.$projectid.'">';
1019  }
1020 
1021  print dol_get_fiche_end();
1022 
1023  print $form->buttonsSaveCancel("CreateDraftIntervention");
1024 
1025  // Show origin lines
1026  if (!empty($origin) && !empty($originid) && is_object($objectsrc)) {
1027  $title = $langs->trans('Services');
1028  print load_fiche_titre($title);
1029 
1030  print '<div class="div-table-responsive-no-min">';
1031  print '<table class="noborder centpercent">';
1032 
1033  $objectsrc->printOriginLinesList(empty($conf->global->FICHINTER_PRINT_PRODUCTS) ? 'services' : ''); // Show only service, except if option FICHINTER_PRINT_PRODUCTS is on
1034 
1035  print '</table>';
1036  print '</div>';
1037  }
1038 
1039  print '</form>';
1040  } else {
1041  print '<form name="fichinter" action="'.$_SERVER['PHP_SELF'].'" method="POST">';
1042  print '<input type="hidden" name="token" value="'.newToken().'">';
1043  print '<input type="hidden" name="action" value="create">'; // We go back to create action
1044 
1045  print dol_get_fiche_head('');
1046 
1047  if (is_object($objectsrc)) {
1048  print '<input type="hidden" name="origin" value="'.$objectsrc->element.'">';
1049  print '<input type="hidden" name="originid" value="'.$objectsrc->id.'">';
1050  } elseif ($origin == 'project' && !empty($projectid)) {
1051  print '<input type="hidden" name="projectid" value="'.$projectid.'">';
1052  }
1053  print '<table class="border centpercent">';
1054  print '<tr><td class="fieldrequired">'.$langs->trans("ThirdParty").'</td><td>';
1055  print $form->select_company('', 'socid', '', 'SelectThirdParty', 1, 0, null, 0, 'minwidth300');
1056  print ' <a href="'.DOL_URL_ROOT.'/societe/card.php?action=create&backtopage='.urlencode($_SERVER["PHP_SELF"].'?action=create').'"><span class="fa fa-plus-circle valignmiddle paddingleft" title="'.$langs->trans("AddThirdParty").'"></span></a>';
1057  print '</td></tr>';
1058  print '</table>';
1059 
1060  print dol_get_fiche_end();
1061 
1062  print $form->buttonsSaveCancel("CreateDraftIntervention");
1063 
1064  print '</form>';
1065  }
1066 } elseif ($id > 0 || !empty($ref)) {
1067  // View mode
1068 
1069  $object->fetch($id, $ref);
1070  $object->fetch_thirdparty();
1071 
1072  $soc = new Societe($db);
1073  $soc->fetch($object->socid);
1074 
1075  if ($error > 0) {
1076  dol_htmloutput_errors($mesg);
1077  } else {
1078  dol_htmloutput_mesg($mesg);
1079  }
1080 
1081  $head = fichinter_prepare_head($object);
1082 
1083  print dol_get_fiche_head($head, 'card', $langs->trans("InterventionCard"), -1, 'intervention');
1084 
1085  $formconfirm = '';
1086 
1087  // Confirm deletion of intervention
1088  if ($action == 'delete') {
1089  $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('DeleteIntervention'), $langs->trans('ConfirmDeleteIntervention'), 'confirm_delete', '', 0, 1);
1090  }
1091 
1092  // Confirm validation
1093  if ($action == 'validate') {
1094  // on verifie si l'objet est en numerotation provisoire
1095  $ref = substr($object->ref, 1, 4);
1096  if ($ref == 'PROV') {
1097  $numref = $object->getNextNumRef($soc);
1098  if (empty($numref)) {
1099  $error++;
1100  setEventMessages($object->error, $object->errors, 'errors');
1101  }
1102  } else {
1103  $numref = $object->ref;
1104  }
1105  $text = $langs->trans('ConfirmValidateIntervention', $numref);
1106 
1107  $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('ValidateIntervention'), $text, 'confirm_validate', '', 1, 1);
1108  }
1109 
1110  // Confirm back to draft
1111  if ($action == 'modify') {
1112  $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('ModifyIntervention'), $langs->trans('ConfirmModifyIntervention'), 'confirm_modify', '', 0, 1);
1113  }
1114 
1115  // Confirm back to open
1116  if ($action == 'reopen') {
1117  $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('ReOpen'), $langs->trans('ConfirmReopenIntervention', $object->ref), 'confirm_reopen', '', 0, 1);
1118  }
1119 
1120  // Confirm deletion of line
1121  if ($action == 'ask_deleteline') {
1122  $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id.'&line_id='.$lineid, $langs->trans('DeleteInterventionLine'), $langs->trans('ConfirmDeleteInterventionLine'), 'confirm_deleteline', '', 0, 1);
1123  }
1124 
1125  // Clone confirmation
1126  if ($action == 'clone') {
1127  // Create an array for form
1128  $formquestion = array(
1129  // 'text' => $langs->trans("ConfirmClone"),
1130  // array('type' => 'checkbox', 'name' => 'clone_content', 'label' => $langs->trans("CloneMainAttributes"), 'value' =>
1131  // 1),
1132  // array('type' => 'checkbox', 'name' => 'update_prices', 'label' => $langs->trans("PuttingPricesUpToDate"), 'value'
1133  // => 1),
1134  array('type' => 'other', 'name' => 'socid', 'label' => $langs->trans("SelectThirdParty"), 'value' => $form->select_company(GETPOST('socid', 'int'), 'socid', '', '', 0, 0, null, 0, 'minwidth200')));
1135  // Paiement incomplet. On demande si motif = escompte ou autre
1136  $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('ToClone'), $langs->trans('ConfirmCloneIntervention', $object->ref), 'confirm_clone', $formquestion, 'yes', 1);
1137  }
1138 
1139  if (!$formconfirm) {
1140  $parameters = array('formConfirm' => $formconfirm, 'lineid'=>$lineid);
1141  $reshook = $hookmanager->executeHooks('formConfirm', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1142  if (empty($reshook)) {
1143  $formconfirm .= $hookmanager->resPrint;
1144  } elseif ($reshook > 0) {
1145  $formconfirm = $hookmanager->resPrint;
1146  }
1147  }
1148 
1149  // Print form confirm
1150  print $formconfirm;
1151 
1152 
1153  // Intervention card
1154  $linkback = '<a href="'.DOL_URL_ROOT.'/fichinter/list.php?restore_lastsearch_values=1'.(!empty($socid) ? '&socid='.$socid : '').'">'.$langs->trans("BackToList").'</a>';
1155 
1156 
1157  $morehtmlref = '<div class="refidno">';
1158  // Ref customer
1159  $morehtmlref.=$form->editfieldkey("RefCustomer", 'ref_client', $object->ref_client, $object, $user->rights->ficheinter->creer, 'string', '', 0, 1);
1160  $morehtmlref.=$form->editfieldval("RefCustomer", 'ref_client', $object->ref_client, $object, $user->rights->ficheinter->creer, 'string', '', null, null, '', 1);
1161  // Thirdparty
1162  $morehtmlref .= '<br>'.$object->thirdparty->getNomUrl(1, 'customer');
1163  // Project
1164  if (isModEnabled('project')) {
1165  $langs->load("projects");
1166  $morehtmlref .= '<br>'.$langs->trans('Project').' ';
1167  if ($user->rights->ficheinter->creer) {
1168  if ($action != 'classify') {
1169  $morehtmlref .= '<a class="editfielda" href="'.$_SERVER['PHP_SELF'].'?action=classify&token='.newToken().'&id='.$object->id.'">'.img_edit($langs->transnoentitiesnoconv('SetProject')).'</a> : ';
1170  }
1171  if ($action == 'classify') {
1172  //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1);
1173  $morehtmlref .= '<form method="post" action="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'">';
1174  $morehtmlref .= '<input type="hidden" name="action" value="classin">';
1175  $morehtmlref .= '<input type="hidden" name="token" value="'.newToken().'">';
1176  $morehtmlref .= $formproject->select_projects($object->socid, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1);
1177  $morehtmlref .= '<input type="submit" class="button button-edit valignmiddle" value="'.$langs->trans("Modify").'">';
1178  $morehtmlref .= '</form>';
1179  } else {
1180  $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1);
1181  }
1182  } else {
1183  if (!empty($object->fk_project)) {
1184  $proj = new Project($db);
1185  $proj->fetch($object->fk_project);
1186  $morehtmlref .= ' : '.$proj->getNomUrl(1);
1187  if ($proj->title) {
1188  $morehtmlref .= ' - '.$proj->title;
1189  }
1190  } else {
1191  $morehtmlref .= '';
1192  }
1193  }
1194  }
1195  $morehtmlref .= '</div>';
1196 
1197  dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'ref', $morehtmlref);
1198 
1199 
1200  print '<div class="fichecenter">';
1201  print '<div class="fichehalfleft">';
1202  print '<div class="underbanner clearboth"></div>';
1203 
1204  print '<table class="border tableforfield centpercent">';
1205 
1206  if (!empty($conf->global->FICHINTER_USE_PLANNED_AND_DONE_DATES)) {
1207  // Date Start
1208  print '<tr><td class="titlefield">'.$langs->trans("Dateo").'</td>';
1209  print '<td>';
1210  print $object->dateo ? dol_print_date($object->dateo, 'daytext') : '&nbsp;';
1211  print '</td>';
1212  print '</tr>';
1213 
1214  // Date End
1215  print '<tr><td>'.$langs->trans("Datee").'</td>';
1216  print '<td>';
1217  print $object->datee ? dol_print_date($object->datee, 'daytext') : '&nbsp;';
1218  print '</td>';
1219  print '</tr>';
1220 
1221  // Date Terminate/close
1222  print '<tr><td>'.$langs->trans("Datet").'</td>';
1223  print '<td>';
1224  print $object->datet ? dol_print_date($object->datet, 'daytext') : '&nbsp;';
1225  print '</td>';
1226  print '</tr>';
1227  }
1228 
1229  // Description (must be a textarea and not html must be allowed (used in list view)
1230  print '<tr><td class="titlefield">';
1231  print $form->editfieldkey("Description", 'description', $object->description, $object, $user->rights->ficheinter->creer, 'textarea');
1232  print '</td><td>';
1233  print $form->editfieldval("Description", 'description', $object->description, $object, $user->rights->ficheinter->creer, 'textarea:8');
1234  print '</td>';
1235  print '</tr>';
1236 
1237  // Contract
1238  if (isModEnabled('contrat')) {
1239  $langs->load('contracts');
1240  print '<tr>';
1241  print '<td>';
1242 
1243  print '<table class="nobordernopadding centpercent"><tr><td>';
1244  print $langs->trans('Contract');
1245  print '</td>';
1246  if ($action != 'contrat') {
1247  print '<td class="right"><a class="editfielda" href="'.$_SERVER["PHP_SELF"].'?action=contrat&amp;id='.$object->id.'">';
1248  print img_edit($langs->trans('SetContract'), 1);
1249  print '</a></td>';
1250  }
1251  print '</tr></table>';
1252  print '</td><td>';
1253  if ($action == 'contrat') {
1254  $formcontract = new Formcontract($db);
1255  $formcontract->formSelectContract($_SERVER["PHP_SELF"].'?id='.$object->id, $object->socid, $object->fk_contrat, 'contratid', 0, 1, 1);
1256  } else {
1257  if ($object->fk_contrat) {
1258  $contratstatic = new Contrat($db);
1259  $contratstatic->fetch($object->fk_contrat);
1260  //print '<a href="'.DOL_URL_ROOT.'/projet/card.php?id='.$selected.'">'.$projet->title.'</a>';
1261  print $contratstatic->getNomUrl(0, '', 1);
1262  } else {
1263  print "&nbsp;";
1264  }
1265  }
1266  print '</td>';
1267  print '</tr>';
1268  }
1269 
1270  // Other attributes
1271  $cols = 2;
1272  include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_view.tpl.php';
1273 
1274  print '</table>';
1275 
1276  print '</div>';
1277  print '<div class="fichehalfright">';
1278  print '<div class="underbanner clearboth"></div>';
1279 
1280  print '<table class="border tableforfield centpercent">';
1281 
1282  if (empty($conf->global->FICHINTER_DISABLE_DETAILS)) {
1283  // Duration
1284  print '<tr><td class="titlefield">'.$langs->trans("TotalDuration").'</td>';
1285  print '<td>'.convertSecondToTime($object->duration, 'all', $conf->global->MAIN_DURATION_OF_WORKDAY).'</td>';
1286  print '</tr>';
1287  }
1288 
1289  print "</table>";
1290 
1291  print '</div>';
1292  print '</div>';
1293 
1294  print '<div class="clearboth"></div><br>';
1295 
1296 
1297  if (!empty($conf->global->MAIN_DISABLE_CONTACTS_TAB)) {
1298  $blocname = 'contacts';
1299  $title = $langs->trans('ContactsAddresses');
1300  include DOL_DOCUMENT_ROOT.'/core/tpl/bloc_showhide.tpl.php';
1301  }
1302 
1303  if (!empty($conf->global->MAIN_DISABLE_NOTES_TAB)) {
1304  $blocname = 'notes';
1305  $title = $langs->trans('Notes');
1306  include DOL_DOCUMENT_ROOT.'/core/tpl/bloc_showhide.tpl.php';
1307  }
1308 
1309  // Line of interventions
1310  if (empty($conf->global->FICHINTER_DISABLE_DETAILS)) {
1311  print '<form action="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'" name="addinter" method="post">';
1312  print '<input type="hidden" name="token" value="'.newToken().'">';
1313  print '<input type="hidden" name="id" value="'.$object->id.'">';
1314  if ($action == 'editline') {
1315  print '<input type="hidden" name="action" value="updateline">';
1316  print '<input type="hidden" name="line_id" value="'.GETPOST('line_id', 'int').'">';
1317  } else {
1318  print '<input type="hidden" name="action" value="addline">';
1319  }
1320 
1321  // Intervention lines
1322  $sql = 'SELECT ft.rowid, ft.description, ft.fk_fichinter, ft.duree, ft.rang,';
1323  $sql .= ' ft.date as date_intervention';
1324  $sql .= ' FROM '.MAIN_DB_PREFIX.'fichinterdet as ft';
1325  $sql .= ' WHERE ft.fk_fichinter = '.((int) $object->id);
1326  if (!empty($conf->global->FICHINTER_HIDE_EMPTY_DURATION)) {
1327  $sql .= ' AND ft.duree <> 0';
1328  }
1329  $sql .= ' ORDER BY ft.rang ASC, ft.date ASC, ft.rowid';
1330 
1331  $resql = $db->query($sql);
1332  if ($resql) {
1333  $num = $db->num_rows($resql);
1334  $i = 0;
1335 
1336  if ($num) {
1337  print '<br>';
1338  print '<table class="noborder centpercent">';
1339  print '<tr class="liste_titre">';
1340 
1341  // No.
1342  if (!empty($conf->global->MAIN_VIEW_LINE_NUMBER)) {
1343  print '<td width="5" class="center linecolnum"></td>';
1344  }
1345 
1346  print '<td class="liste_titre">'.$langs->trans('Description').'</td>';
1347  print '<td class="liste_titre center">'.$langs->trans('Date').'</td>';
1348  print '<td class="liste_titre right">'.(empty($conf->global->FICHINTER_WITHOUT_DURATION) ? $langs->trans('Duration') : '').'</td>';
1349  print '<td class="liste_titre">&nbsp;</td>';
1350  print '<td class="liste_titre">&nbsp;</td>';
1351  print "</tr>\n";
1352  }
1353  while ($i < $num) {
1354  $objp = $db->fetch_object($resql);
1355 
1356  // Ligne en mode visu
1357  if ($action != 'editline' || GETPOST('line_id', 'int') != $objp->rowid) {
1358  print '<tr class="oddeven">';
1359 
1360  // No.
1361  if (!empty($conf->global->MAIN_VIEW_LINE_NUMBER)) {
1362  print '<td class="center linecolnum">'.($i + 1).'</td>';
1363  }
1364 
1365  print '<td>';
1366  print '<a name="'.$objp->rowid.'"></a>'; // ancre pour retourner sur la ligne
1367  print dol_htmlentitiesbr($objp->description);
1368 
1369  $objectline = new FichinterLigne($db);
1370  $objectline->fetch($objp->rowid);
1371  $objectline->fetch_optionals();
1372 
1373  $extrafields->fetch_name_optionals_label($objectline->table_element);
1374 
1375  if (!empty($extrafields)) {
1376  $temps = $objectline->showOptionals($extrafields, 'view', array(), '', '', 1, 'line');
1377  if (!empty($temps)) {
1378  print '<div style="padding-top: 10px" id="extrafield_lines_area_'.$line->id.'" name="extrafield_lines_area_'.$line->id.'">';
1379  print $temps;
1380  print '</div>';
1381  }
1382  }
1383 
1384  print '</td>';
1385 
1386  // Date
1387  print '<td class="center" width="150">'.(empty($conf->global->FICHINTER_DATE_WITHOUT_HOUR) ?dol_print_date($db->jdate($objp->date_intervention), 'dayhour') : dol_print_date($db->jdate($objp->date_intervention), 'day')).'</td>';
1388 
1389  // Duration
1390  print '<td class="right" width="150">'.(empty($conf->global->FICHINTER_WITHOUT_DURATION) ?convertSecondToTime($objp->duree) : '').'</td>';
1391 
1392  print "</td>\n";
1393 
1394  // Icon to edit and delete
1395  if ($object->statut == 0 && $user->rights->ficheinter->creer) {
1396  print '<td class="center">';
1397  print '<a class="editfielda marginrightonly" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=editline&token='.newToken().'&line_id='.$objp->rowid.'#'.$objp->rowid.'">';
1398  print img_edit();
1399  print '</a>';
1400  print '<a class="marginleftonly" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=ask_deleteline&token='.newToken().'&line_id='.$objp->rowid.'">';
1401  print img_delete();
1402  print '</a></td>';
1403  print '<td class="center">';
1404  if ($num > 1) {
1405  if ($i > 0) {
1406  print '<a class="marginleftonly" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=up&token='.newToken().'&line_id='.$objp->rowid.'">';
1407  print img_up();
1408  print '</a>';
1409  }
1410  if ($i < $num - 1) {
1411  print '<a class="marginleftonly" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=down&token='.newToken().'&line_id='.$objp->rowid.'">';
1412  print img_down();
1413  print '</a>';
1414  }
1415  }
1416  print '</td>';
1417  } else {
1418  print '<td colspan="2">&nbsp;</td>';
1419  }
1420 
1421  print '</tr>';
1422  }
1423 
1424  // Line in update mode
1425  if ($object->statut == 0 && $action == 'editline' && $user->rights->ficheinter->creer && GETPOST('line_id', 'int') == $objp->rowid) {
1426  print '<tr class="oddeven nohover">';
1427 
1428  // No.
1429  if (!empty($conf->global->MAIN_VIEW_LINE_NUMBER)) {
1430  print '<td class="center linecolnum">'.($i + 1).'</td>';
1431  }
1432 
1433  print '<td>';
1434  print '<a name="'.$objp->rowid.'"></a>'; // ancre pour retourner sur la ligne
1435 
1436  // Editeur wysiwyg
1437  require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
1438  $doleditor = new DolEditor('np_desc', $objp->description, '', 164, 'dolibarr_details', '', false, true, getDolGlobalInt('FCKEDITOR_ENABLE_DETAILS'), ROWS_2, '90%');
1439  $doleditor->Create();
1440 
1441  $objectline = new FichinterLigne($db);
1442  $objectline->fetch($objp->rowid);
1443  $objectline->fetch_optionals();
1444 
1445  $extrafields->fetch_name_optionals_label($objectline->table_element);
1446 
1447  if (!empty($extrafields)) {
1448  $temps = $objectline->showOptionals($extrafields, 'edit', array(), '', '', 1, 'line');
1449  if (!empty($temps)) {
1450  print '<div style="padding-top: 10px" id="extrafield_lines_area_'.$line->id.'" name="extrafield_lines_area_'.$line->id.'">';
1451  print $temps;
1452  print '</div>';
1453  }
1454  }
1455 
1456  print '</td>';
1457 
1458  // Date d'intervention
1459  print '<td class="center nowrap">';
1460  if (!empty($conf->global->FICHINTER_DATE_WITHOUT_HOUR)) {
1461  print $form->selectDate($db->jdate($objp->date_intervention), 'di', 0, 0, 0, "date_intervention");
1462  } else {
1463  print $form->selectDate($db->jdate($objp->date_intervention), 'di', 1, 1, 0, "date_intervention");
1464  }
1465  print '</td>';
1466 
1467  // Duration
1468  print '<td class="right">';
1469  if (empty($conf->global->FICHINTER_WITHOUT_DURATION)) {
1470  $selectmode = 'select';
1471  if (!empty($conf->global->INTERVENTION_ADDLINE_FREEDUREATION)) {
1472  $selectmode = 'text';
1473  }
1474  $form->select_duration('duration', $objp->duree, 0, $selectmode);
1475  }
1476  print '</td>';
1477 
1478  print '<td class="center" colspan="5" valign="center">';
1479  print '<input type="submit" class="button buttongen marginbottomonly button-save" name="save" value="'.$langs->trans("Save").'">';
1480  print '<input type="submit" class="button buttongen marginbottomonly button-cancel" name="cancel" value="'.$langs->trans("Cancel").'"></td>';
1481  print '</tr>'."\n";
1482  }
1483 
1484  $i++;
1485  }
1486 
1487  $db->free($resql);
1488 
1489  // Add new line
1490  if ($object->statut == 0 && $user->rights->ficheinter->creer && $action <> 'editline' && empty($conf->global->FICHINTER_DISABLE_DETAILS)) {
1491  if (!$num) {
1492  print '<br>';
1493  print '<table class="noborder centpercent">';
1494  print '<tr class="liste_titre">';
1495 
1496  // No.
1497  if (!empty($conf->global->MAIN_VIEW_LINE_NUMBER)) {
1498  print '<td width="5" class="center linecolnum"></td>';
1499  }
1500 
1501  print '<td>';
1502  print '<a name="add"></a>'; // ancre
1503  print $langs->trans('Description').'</td>';
1504  print '<td class="center">'.$langs->trans('Date').'</td>';
1505  print '<td class="right">'.(empty($conf->global->FICHINTER_WITHOUT_DURATION) ? $langs->trans('Duration') : '').'</td>';
1506  print '<td colspan="3">&nbsp;</td>';
1507  print "</tr>\n";
1508  }
1509 
1510  print '<tr class="oddeven nohover">'."\n";
1511 
1512  // No.
1513  if (!empty($conf->global->MAIN_VIEW_LINE_NUMBER)) {
1514  print '<td class="center linecolnum">'.($i + 1).'</td>';
1515  }
1516 
1517  print '<td>';
1518  // editeur wysiwyg
1519  if (empty($conf->global->FICHINTER_EMPTY_LINE_DESC)) {
1520  require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
1521  $doleditor = new DolEditor('np_desc', GETPOST('np_desc', 'restricthtml'), '', 100, 'dolibarr_details', '', false, true, !empty($conf->global->FCKEDITOR_ENABLE_DETAILS), ROWS_2, '90%');
1522  $doleditor->Create();
1523  }
1524 
1525  $objectline = new FichinterLigne($db);
1526  $extrafields->fetch_name_optionals_label($objectline->table_element);
1527 
1528  if (is_object($objectline)) {
1529  $temps = $objectline->showOptionals($extrafields, 'create', array(), '', '', 1, 'line');
1530 
1531  if (!empty($temps)) {
1532  print '<div style="padding-top: 10px" id="extrafield_lines_area_create" name="extrafield_lines_area_create">';
1533  print $temps;
1534  print '</div>';
1535  }
1536  }
1537 
1538  print '</td>';
1539 
1540  // Date intervention
1541  print '<td class="center nowrap">';
1542  $now = dol_now();
1543  $timearray = dol_getdate($now);
1544  if (!GETPOST('diday', 'int')) {
1545  $timewithnohour = dol_mktime(0, 0, 0, $timearray['mon'], $timearray['mday'], $timearray['year']);
1546  } else {
1547  $timewithnohour = dol_mktime(GETPOST('dihour', 'int'), GETPOST('dimin', 'int'), 0, GETPOST('dimonth', 'int'), GETPOST('diday', 'int'), GETPOST('diyear', 'int'));
1548  }
1549  if (!empty($conf->global->FICHINTER_DATE_WITHOUT_HOUR)) {
1550  print $form->selectDate($timewithnohour, 'di', 0, 0, 0, "addinter");
1551  } else {
1552  print $form->selectDate($timewithnohour, 'di', 1, 1, 0, "addinter");
1553  }
1554  print '</td>';
1555 
1556  // Duration
1557  print '<td class="right">';
1558  if (empty($conf->global->FICHINTER_WITHOUT_DURATION)) {
1559  $selectmode = 'select';
1560  if (!empty($conf->global->INTERVENTION_ADDLINE_FREEDUREATION)) {
1561  $selectmode = 'text';
1562  }
1563  $form->select_duration('duration', (!GETPOST('durationhour', 'int') && !GETPOST('durationmin', 'int')) ? 3600 : (60 * 60 * GETPOST('durationhour', 'int') + 60 * GETPOST('durationmin', 'int')), 0, $selectmode);
1564  }
1565  print '</td>';
1566 
1567  print '<td class="center" valign="middle" colspan="3"><input type="submit" class="button button-add" value="'.$langs->trans('Add').'" name="addline"></td>';
1568  print '</tr>';
1569 
1570  if (!$num) {
1571  print '</table>';
1572  }
1573  }
1574 
1575  if ($num) {
1576  print '</table>';
1577  }
1578  } else {
1579  dol_print_error($db);
1580  }
1581 
1582  print '</form>'."\n";
1583  }
1584 
1585  print dol_get_fiche_end();
1586 
1587  print "\n";
1588 
1589 
1590  /*
1591  * Actions buttons
1592  */
1593 
1594  print '<div class="tabsAction">';
1595 
1596  $parameters = array();
1597  $reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action); // Note that $action and $object may have been
1598  // modified by hook
1599  if (empty($reshook)) {
1600  if ($user->socid == 0) {
1601  if ($action != 'editdescription' && ($action != 'presend')) {
1602  // Validate
1603  if ($object->statut == Fichinter::STATUS_DRAFT && (count($object->lines) > 0 || !empty($conf->global->FICHINTER_DISABLE_DETAILS))) {
1604  if ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && $user->rights->ficheinter->creer) || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && $user->rights->ficheinter->ficheinter_advance->validate)) {
1605  print '<div class="inline-block divButAction"><a class="butAction" href="card.php?id='.$object->id.'&action=validate">'.$langs->trans("Validate").'</a></div>';
1606  } else {
1607  print '<div class="inline-block divButActionRefused"><span class="butActionRefused" href="#" title="'.dol_escape_htmltag($langs->trans("NotEnoughPermissions")).'">'.$langs->trans("Validate").'</span></div>';
1608  }
1609  }
1610 
1611  // Modify
1612  if ($object->statut == Fichinter::STATUS_VALIDATED && ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && $user->rights->ficheinter->creer) || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && $user->rights->ficheinter->ficheinter_advance->unvalidate))) {
1613  print '<div class="inline-block divButAction"><a class="butAction" href="card.php?id='.$object->id.'&action=modify">';
1614  if (empty($conf->global->FICHINTER_DISABLE_DETAILS)) {
1615  print $langs->trans("Modify");
1616  } else {
1617  print $langs->trans("SetToDraft");
1618  }
1619  print '</a></div>';
1620  }
1621 
1622  // Reopen
1623  if ($object->statut >= Fichinter::STATUS_CLOSED) {
1624  if ($user->rights->ficheinter->creer) {
1625  print '<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=reopen&token='.newToken().'">'.$langs->trans('Reopen').'</a></div>';
1626  } else {
1627  print '<div class="inline-block divButAction"><a class="butActionRefused classfortooltip" href="#">'.$langs->trans('Reopen').'</a></div>';
1628  }
1629  }
1630 
1631  // Send
1632  if (empty($user->socid)) {
1633  if ($object->statut > Fichinter::STATUS_DRAFT) {
1634  if (empty($conf->global->MAIN_USE_ADVANCED_PERMS) || $user->rights->ficheinter->ficheinter_advance->send) {
1635  print '<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=presend&token='.newToken().'&mode=init#formmailbeforetitle">'.$langs->trans('SendMail').'</a></div>';
1636  } else {
1637  print '<div class="inline-block divButAction"><a class="butActionRefused classfortooltip" href="#">'.$langs->trans('SendMail').'</a></div>';
1638  }
1639  }
1640  }
1641 
1642  // Create intervention model
1643  if ($conf->global->MAIN_FEATURES_LEVEL >= 1 && $object->statut == Fichinter::STATUS_DRAFT && $user->rights->ficheinter->creer && (count($object->lines) > 0)) {
1644  print '<div class="inline-block divButAction">';
1645  print '<a class="butAction" href="'.DOL_URL_ROOT.'/fichinter/card-rec.php?id='.$object->id.'&action=create&backtopage='.urlencode($_SERVER['PHP_SELF'].'?id='.$object->id).'">'.$langs->trans("ChangeIntoRepeatableIntervention").'</a>';
1646  print '</div>';
1647  }
1648 
1649  // Proposal
1650  if ($conf->service->enabled && isModEnabled("propal") && $object->statut > Fichinter::STATUS_DRAFT) {
1651  $langs->load("propal");
1652  if ($object->statut < Fichinter::STATUS_BILLED) {
1653  if ($user->rights->propal->creer) {
1654  print '<div class="inline-block divButAction"><a class="butAction" href="'.DOL_URL_ROOT.'/comm/propal/card.php?action=create&amp;origin='.$object->element.'&amp;originid='.$object->id.'&amp;socid='.$object->socid.'">'.$langs->trans("AddProp").'</a></div>';
1655  } else {
1656  print '<div class="inline-block divButAction"><a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans("NotEnoughPermissions").'">'.$langs->trans("AddProp").'</a></div>';
1657  }
1658  }
1659  }
1660 
1661  // Invoicing
1662  if (isModEnabled('facture') && $object->statut > Fichinter::STATUS_DRAFT) {
1663  $langs->load("bills");
1664  if ($object->statut < Fichinter::STATUS_BILLED) {
1665  if ($user->rights->facture->creer) {
1666  print '<div class="inline-block divButAction"><a class="butAction" href="'.DOL_URL_ROOT.'/compta/facture/card.php?action=create&amp;origin='.$object->element.'&amp;originid='.$object->id.'&amp;socid='.$object->socid.'">'.$langs->trans("AddBill").'</a></div>';
1667  } else {
1668  print '<div class="inline-block divButAction"><a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans("NotEnoughPermissions").'">'.$langs->trans("AddBill").'</a></div>';
1669  }
1670  }
1671 
1672  if (!empty($conf->global->FICHINTER_CLASSIFY_BILLED)) { // Option deprecated. In a future, billed must be managed with a dedicated field to 0 or 1
1673  if ($object->statut != Fichinter::STATUS_BILLED) {
1674  print '<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=classifybilled&token='.newToken().'">'.$langs->trans("InterventionClassifyBilled").'</a></div>';
1675  } else {
1676  print '<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=classifyunbilled&token='.newToken().'">'.$langs->trans("InterventionClassifyUnBilled").'</a></div>';
1677  }
1678  }
1679  }
1680 
1681  // Done
1682  if (empty($conf->global->FICHINTER_CLASSIFY_BILLED) && $object->statut > Fichinter::STATUS_DRAFT && $object->statut < Fichinter::STATUS_CLOSED) {
1683  print '<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=classifydone&token='.newToken().'">'.$langs->trans("InterventionClassifyDone").'</a></div>';
1684  }
1685 
1686  // Clone
1687  if ($user->rights->ficheinter->creer) {
1688  print '<div class="inline-block divButAction"><a class="butAction" href="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'&socid='.$object->socid.'&action=clone&token='.newToken().'&object=ficheinter">'.$langs->trans("ToClone").'</a></div>';
1689  }
1690 
1691  // Delete
1692  print dolGetButtonAction($langs->trans("Delete"), '', 'delete', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken(), 'delete', $permissiontodelete);
1693  }
1694  }
1695  }
1696 
1697  print '</div>';
1698 
1699  if ($action != 'presend') {
1700  print '<div class="fichecenter"><div class="fichehalfleft">';
1701 
1702  /*
1703  * Built documents
1704  */
1705  $filename = dol_sanitizeFileName($object->ref);
1706  $filedir = $conf->ficheinter->dir_output."/".$filename;
1707  $urlsource = $_SERVER["PHP_SELF"]."?id=".$object->id;
1708  $genallowed = $user->rights->ficheinter->lire;
1709  $delallowed = $user->rights->ficheinter->creer;
1710  print $formfile->showdocuments('ficheinter', $filename, $filedir, $urlsource, $genallowed, $delallowed, $object->model_pdf, 1, 0, 0, 28, 0, '', '', '', $soc->default_lang);
1711 
1712  // Show links to link elements
1713  $linktoelem = $form->showLinkToObjectBlock($object, null, array('fichinter'));
1714  $somethingshown = $form->showLinkedObjectBlock($object, $linktoelem);
1715 
1716  // Show direct download link
1717  if ($object->statut != Fichinter::STATUS_DRAFT && !empty($conf->global->FICHINTER_ALLOW_EXTERNAL_DOWNLOAD)) {
1718  print '<br><!-- Link to download main doc -->'."\n";
1719  print showDirectDownloadLink($object).'<br>';
1720  }
1721 
1722  // Show online signature link
1723  if ($object->statut != Fichinter::STATUS_DRAFT && !empty($conf->global->FICHINTER_ALLOW_ONLINE_SIGN)) {
1724  print '<br><!-- Link to sign -->';
1725  require_once DOL_DOCUMENT_ROOT.'/core/lib/signature.lib.php';
1726 
1727  print showOnlineSignatureUrl('fichinter', $object->ref).'<br>';
1728  }
1729 
1730  print '</div><div class="fichehalfright">';
1731 
1732  // List of actions on element
1733  include_once DOL_DOCUMENT_ROOT.'/core/class/html.formactions.class.php';
1734  $formactions = new FormActions($db);
1735  $somethingshown = $formactions->showactions($object, 'fichinter', $socid, 1);
1736 
1737  print '</div></div>';
1738  }
1739 
1740 
1741  // Select mail models is same action as presend
1742  if (GETPOST('modelselected')) {
1743  $action = 'presend';
1744  }
1745 
1746  // Presend form
1747  $modelmail = 'fichinter_send';
1748  $defaulttopic = 'SendInterventionRef';
1749  $diroutput = $conf->ficheinter->dir_output;
1750  $trackid = 'int'.$object->id;
1751 
1752  include DOL_DOCUMENT_ROOT.'/core/tpl/card_presend.tpl.php';
1753 }
1754 
1755 
1756 llxFooter();
1757 
1758 $db->close();
if(GETPOST('button_removefilter_x', 'alpha')||GETPOST('button_removefilter.x', 'alpha')||GETPOST('button_removefilter', 'alpha')) if(GETPOST('button_search_x', 'alpha')||GETPOST('button_search.x', 'alpha')||GETPOST('button_search', 'alpha')) if($action=="save" &&empty($cancel)) $help_url
View.
Definition: agenda.php:118
if(preg_match('/set_([a-z0-9_\-]+)/i', $action, $reg)) if(preg_match('/del_([a-z0-9_\-]+)/i', $action, $reg)) if($action=='set') elseif($action=='specimen') elseif($action=='setmodel') elseif($action=='del') elseif($action=='setdoc') $formactions
View.
if(!defined('NOREQUIRESOC')) if(!defined('NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined('NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined('NOREQUIREAJAX')) llxHeader()
Empty header.
Definition: wrapper.php:56
llxFooter()
Empty footer.
Definition: wrapper.php:70
Class to manage contracts.
Class to manage a WYSIWYG editor.
Class to manage standard extra fields.
Class to manage interventions.
const STATUS_BILLED
Billed.
const STATUS_DRAFT
Draft status.
const STATUS_VALIDATED
Validated status.
const STATUS_CLOSED
Closed.
Class to manage intervention lines.
Class to manage building of HTML components.
Class to manage generation of HTML components for contract module.
Class to offer components to list and upload files.
Class to manage generation of HTML components Only common components must be here.
Class to manage building of HTML components.
static liste_modeles($db, $maxfilenamelength=0)
Return list of active generation modules.
Class to manage products or services.
const TYPE_PRODUCT
Regular product.
const TYPE_SERVICE
Service.
Class to manage projects.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage translations.
$parameters
Actions.
Definition: card.php:79
if(isModEnabled('facture') &&!empty($user->rights->facture->lire)) if((isModEnabled('fournisseur') &&empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD) && $user->hasRight("fournisseur", "facture", "lire"))||(isModEnabled('supplier_invoice') && $user->hasRight("supplier_invoice", "lire"))) if(isModEnabled('don') &&!empty($user->rights->don->lire)) if(isModEnabled('tax') &&!empty($user->rights->tax->charges->lire)) if(isModEnabled('facture') &&isModEnabled('commande') && $user->hasRight("commande", "lire") &&empty($conf->global->WORKFLOW_DISABLE_CREATE_INVOICE_FROM_ORDER)) $resql
Social contributions to pay.
Definition: index.php:745
if($cancel &&! $id) if($action=='add' &&! $cancel) if($action=='delete') if($id) $form
Actions.
Definition: card.php:143
convertTime2Seconds($iHours=0, $iMinutes=0, $iSeconds=0)
Convert hours and minutes into seconds.
Definition: date.lib.php:210
convertSecondToTime($iSecond, $format='all', $lengthOfDay=86400, $lengthOfWeek=7)
Return, in clear text, value of a number of seconds in days, hours and minutes.
Definition: date.lib.php:238
fichinter_prepare_head($object)
Prepare array with list of tabs.
dol_banner_tab($object, $paramid, $morehtml='', $shownav=1, $fieldid='rowid', $fieldref='ref', $morehtmlref='', $moreparam='', $nodbprefix=0, $morehtmlleft='', $morehtmlstatus='', $onlybanner=0, $morehtmlright='')
Show tab footer of a card.
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed informations (by default a local PHP server timestamp) Re...
load_fiche_titre($titre, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='')
Show tabs of a record.
img_delete($titlealt='default', $other='class="pictodelete"', $morecss='')
Show delete logo.
dol_print_error($db='', $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dol_get_fiche_end($notab=0)
Return tab footer of a card.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='')
Set event messages in dol_events session object.
img_down($titlealt='default', $selected=0, $moreclass='')
Show down arrow logo.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs='', $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
if(!function_exists('dol_getprefix')) dol_include_once($relpath, $classname='')
Make an include_once using default root and alternate root if it fails.
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return dolibarr global constant int value.
newToken()
Return the value of token currently saved into session with name 'newtoken'.
dol_clone($object, $native=0)
Create a clone of instance of object (new instance with same value for each properties) With native =...
dolGetButtonAction($label, $text='', $actionType='default', $url='', $id='', $userRight=1, $params=array())
Function dolGetButtonAction.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
showDirectDownloadLink($object)
Return string with full Url.
dol_htmloutput_mesg($mesgstring='', $mesgarray=array(), $style='ok', $keepembedded=0)
Print formated messages to output (Used to show messages on html output).
dol_sanitizeFileName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a file name.
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...
isModEnabled($module)
Is Dolibarr module enabled.
img_edit($titlealt='default', $float=0, $other='')
Show logo editer/modifier fiche.
img_up($titlealt='default', $selected=0, $moreclass='')
Show top arrow logo.
dol_htmloutput_errors($mesgstring='', $mesgarray=array(), $keepembedded=0)
Print formated error messages to output (Used to show messages on html output).
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
dol_getdate($timestamp, $fast=false, $forcetimezone='')
Return an array with locale date info.
$formconfirm
if ($action == 'delbookkeepingyear') {
fichinter_create($db, $object, $modele, $outputlangs, $hidedetails=0, $hidedesc=0, $hideref=0)
Create an intervention document on disk using template defined into FICHEINTER_ADDON_PDF.
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.