dolibarr 23.0.3
card-rec.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2002-2003 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3 * Copyright (C) 2004-2015 Laurent Destailleur <eldy@users.sourceforge.net>
4 * Copyright (C) 2005-2012 Regis Houssin <regis.houssin@inodbox.com>
5 * Copyright (C) 2013 Florian Henry <florian.henry@open-concept.pro>
6 * Copyright (C) 2013 Juanjo Menent <jmenent@2byte.es>
7 * Copyright (C) 2015 Jean-François Ferry <jfefe@aternatik.fr>
8 * Copyright (C) 2012 Cedric Salvador <csalvador@gpcsolutions.fr>
9 * Copyright (C) 2015 Alexandre Spangaro <aspangaro@open-dsi.fr>
10 * Copyright (C) 2016-2026 Charlene Benke <charlene@patas-monkey.com>
11 * Copyright (C) 2018-2025 Frédéric France <frederic.france@free.fr>
12 * Copyright (C) 2024 William Mead <william.mead@manchenumerique.fr>
13 * Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
14 *
15 * This program is free software; you can redistribute it and/or modify
16 * it under the terms of the GNU General Public License as published by
17 * the Free Software Foundation; either version 3 of the License, or
18 * (at your option) any later version.
19 *
20 * This program is distributed in the hope that it will be useful,
21 * but WITHOUT ANY WARRANTY; without even the implied warranty of
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 * GNU General Public License for more details.
24 *
25 * You should have received a copy of the GNU General Public License
26 * along with this program. If not, see <https://www.gnu.org/licenses/>.
27 */
28
35// Load Dolibarr environment
36require '../main.inc.php';
37require_once DOL_DOCUMENT_ROOT.'/fichinter/class/fichinter.class.php';
38require_once DOL_DOCUMENT_ROOT.'/fichinter/class/fichinterrec.class.php';
39require_once DOL_DOCUMENT_ROOT.'/core/lib/fichinter.lib.php';
40
41require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
42require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
43if (isModEnabled('project')) {
44 require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
45 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formprojet.class.php';
46}
47if (isModEnabled('contract')) {
48 require_once DOL_DOCUMENT_ROOT.'/contrat/class/contrat.class.php';
49 require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcontract.class.php';
50}
51
60// Load translation files required by the page
61$langs->loadLangs(array("interventions", "admin", "compta", "bills"));
62
63// Security check
64$id = (GETPOSTINT('fichinterid') ? GETPOSTINT('fichinterid') : GETPOSTINT('id'));
65$ref = GETPOST('ref', 'alpha');
66$date_next_execution = GETPOST('date_next_execution', 'alpha');
67$action = GETPOST('action', 'aZ09');
68$cancel = GETPOST('cancel');
69$backtopage = GETPOST('backtopage', 'alpha');
70$socid = GETPOSTINT('socid');
71if ($user->socid) {
72 $socid = $user->socid;
73}
74$objecttype = 'fichinter_rec';
75if ($action == "create" || $action == "add") {
76 $objecttype = '';
77}
78
79// Load variable for pagination
80$limit = GETPOSTINT('limit') ? GETPOSTINT('limit') : $conf->liste_limit;
81$sortfield = GETPOST('sortfield', 'aZ09comma');
82$sortorder = GETPOST('sortorder', 'aZ09comma');
83$page = GETPOSTISSET('pageplusone') ? (GETPOSTINT('pageplusone') - 1) : GETPOSTINT("page");
84if (empty($page) || $page < 0 || GETPOST('button_search', 'alpha') || GETPOST('button_removefilter', 'alpha')) {
85 // If $page is not defined, or '' or -1 or if we click on clear filters
86 $page = 0;
87}
88$offset = $limit * $page;
89$pageprev = $page - 1;
90$pagenext = $page + 1;
91
92
93$sortorder = GETPOST('sortorder', 'aZ09comma');
94$sortfield = GETPOST('sortfield', 'aZ09comma');
95if ($sortorder == "") {
96 $sortorder = "DESC";
97}
98
99if ($sortfield == "") {
100 $sortfield = "f.datec";
101}
102
103$object = new FichinterRec($db);
104$extrafields = new ExtraFields($db);
105
106$arrayfields = array(
107 'f.title' => array('label' => "Ref", 'checked' => 1),
108 's.nom' => array('label' => "ThirdParty", 'checked' => 1),
109 'f.fk_contrat' => array('label' => "Contract", 'checked' => 1),
110 'f.duree' => array('label' => "Duration", 'checked' => 1),
111 'f.total_ttc' => array('label' => "AmountTTC", 'checked' => 1),
112 'f.frequency' => array('label' => "RecurringInvoiceTemplate", 'checked' => 1),
113 'f.nb_gen_done' => array('label' => "NbOfGenerationDoneShort", 'checked' => 1),
114 'f.date_last_gen' => array('label' => "DateLastGeneration", 'checked' => 1),
115 'f.date_when' => array('label' => "NextDateToExecution", 'checked' => 1),
116 'f.datec' => array('label' => "DateCreation", 'checked' => 0, 'position' => 500),
117 'f.tms' => array('label' => "DateModificationShort", 'checked' => 0, 'position' => 500),
118);
119
120$result = restrictedArea($user, 'ficheinter', $id, $objecttype);
121
122$permissiontoadd = $user->hasRight('ficheinter', 'creer');
123$permissiontodelete = $user->hasRight('ficheinter', 'supprimer');
124$objp = null;
125
126/*
127 * Actions
128 */
129$error = 0;
130
131if ($cancel) {
132 if (!empty($backtopageforcancel)) {
133 header("Location: ".$backtopageforcancel);
134 exit;
135 } elseif (!empty($backtopage)) {
136 header("Location: ".$backtopage);
137 exit;
138 }
139 $action = '';
140}
141
142// Create predefined intervention
143if ($action == 'add' && $permissiontoadd) {
144 if (!GETPOST('title')) {
145 setEventMessages($langs->transnoentities("ErrorFieldRequired", $langs->trans("Title")), null, 'errors');
146 $action = "create";
147 $error++;
148 }
149
150 if (!GETPOST('socid')) {
151 setEventMessages($langs->transnoentities("ErrorFieldRequired", $langs->trans("Customer")), null, 'errors');
152 $action = "create";
153 $error++;
154 }
155
156 // gestion des fréquences et des échéances
157 $frequency = GETPOSTINT('frequency');
158 $rec_year = GETPOST('rec_year');
159 $rec_month = GETPOST('rec_month');
160 $rec_day = GETPOST('rec_day');
161 $rec_hour = GETPOST('rec_hour');
162 $rec_min = GETPOST('rec_min');
163 $nb_gen_max = GETPOSTINT('nb_gen_max');
164 if ($frequency) {
165 if (empty($rec_year) || empty($rec_month) || empty($rec_day)) {
166 setEventMessages($langs->transnoentities("ErrorFieldRequired", $langs->trans("Date")), null, 'errors');
167 $action = "create";
168 $error++;
169 } else {
170 $date_next_execution = dol_mktime((int) $rec_hour, (int) $rec_min, 0, (int) $rec_month, (int) $rec_day, (int) $rec_year);
171 }
172 if ($nb_gen_max === 0) {
173 setEventMessages($langs->transnoentities("ErrorFieldRequired", $langs->trans("MaxPeriodNumber")), null, 'errors');
174 $action = "create";
175 $error++;
176 }
177 }
178
179 if (!$error) {
180 $object->id_origin = $id;
181 $object->title = GETPOST('title', 'alpha');
182 $object->description = GETPOST('description', 'restricthtml');
183 $object->socid = GETPOSTINT('socid');
184 $object->fk_project = GETPOSTINT('projectid');
185 $object->fk_contrat = GETPOSTINT('contractid');
186
187 $object->frequency = $frequency;
188 $object->unit_frequency = GETPOST('unit_frequency', 'alpha');
189 $object->nb_gen_max = $nb_gen_max;
190 $object->auto_validate = GETPOSTINT('auto_validate');
191
192 $object->date_when = $date_next_execution;
193
194 if ($object->create($user) > 0) {
195 $id = $object->id;
196 $action = '';
197 } else {
198 setEventMessages($object->error, $object->errors, 'errors');
199 $action = "create";
200 }
201 }
202} elseif ($action == 'createfrommodel' && $permissiontoadd) {
203 $newinter = new Fichinter($db);
204
205 // Fetch the stored data
206 $object->fetch($id);
207 $res = $object->fetch_lines();
208 // Transfer the data from one to the other
209 if ($object->socid > 0) {
210 $newinter->socid = $object->socid;
211 $newinter->fk_project = $object->fk_project;
212 $newinter->fk_contrat = $object->fk_contrat;
213 } else {
214 $newinter->socid = GETPOSTINT("socid");
215 }
216
217 $newinter->entity = $object->entity;
218 $newinter->duration = $object->duration;
219
220 $newinter->description = $object->description;
221 $newinter->note_private = $object->note_private;
222 $newinter->note_public = $object->note_public;
223
224 // on créer un nouvelle intervention
225 $extrafields->fetch_name_optionals_label($newinter->table_element);
226
227 $array_options = $extrafields->getOptionalsFromPost($newinter->table_element);
228 $newinter->array_options = $array_options;
229
230 $newfichinterid = $newinter->create($user);
231
232 if ($newfichinterid > 0) {
233 // Now we add line of details
234 foreach ($object->lines as $line) {
235 $newinter->addline($user, $newfichinterid, $line->desc, $line->datei, $line->duree, array());
236 }
237
238 // on update le nombre d'inter crée à partir du modèle
239 $object->updateNbGenDone();
240 //on redirige vers la fiche d'intervention nouvellement crée
241 header('Location: '.DOL_URL_ROOT.'/fichinter/card.php?id='.$newfichinterid);
242 exit;
243 } else {
244 setEventMessages($newinter->error, $newinter->errors, 'errors');
245 $action = '';
246 }
247} elseif ($action == 'delete' && $permissiontodelete) {
248 // delete modele
249 $object->fetch($id);
250 $object->delete($user);
251 $id = 0;
252 header('Location: '.$_SERVER["PHP_SELF"]);
253 exit;
254} elseif ($action == 'setfrequency' && $permissiontoadd) {
255 // Set frequency and unit frequency
256 $object->fetch($id);
257 $object->setFrequencyAndUnit(GETPOSTINT('frequency'), GETPOST('unit_frequency', 'alpha'));
258} elseif ($action == 'setdate_when' && $permissiontoadd) {
259 // Set next date of execution
260 $object->fetch($id);
261 $date = dol_mktime(GETPOSTINT('date_whenhour'), GETPOSTINT('date_whenmin'), 0, GETPOSTINT('date_whenmonth'), GETPOSTINT('date_whenday'), GETPOSTINT('date_whenyear'));
262 if (!empty($date)) {
263 $object->setNextDate($date);
264 }
265} elseif ($action == 'setnb_gen_max' && $permissiontoadd) {
266 // Set max period
267 $object->fetch($id);
268 $object->setMaxPeriod(GETPOSTINT('nb_gen_max'));
269}
270
271
272/*
273 * View
274 */
275
276$help_url = '';
277
278llxHeader('', $langs->trans("RepeatableIntervention"), $help_url, '', 0, 0, '', '', '', 'mod-fichinter page-card-rec');
279
280$form = new Form($db);
281$fichinterrecstatic = new FichinterRec($db);
282$companystatic = new Societe($db);
283$contratstatic = null;
284$projectstatic = null;
285if (isModEnabled('contract')) {
286 $contratstatic = new Contrat($db);
287}
288if (isModEnabled('project')) {
289 $projectstatic = new Project($db);
290}
291
292$now = dol_now();
293$tmparray = dol_getdate($now);
294$today = dol_mktime(23, 59, 59, $tmparray['mon'], $tmparray['mday'], $tmparray['year']); // Today is last second of current day
295
296
297
298// Create mode
299
300if ($action == 'create') {
301 print load_fiche_titre($langs->trans("CreateRepeatableIntervention"), '', 'intervention');
302
303 $object = new Fichinter($db); // Source invoice
304 //$object = new Managementfichinter($db); // Source invoice
305
306 if ($object->fetch($id, $ref) > 0) {
307 print '<form action="card-rec.php" method="post">';
308 print '<input type="hidden" name="token" value="'.newToken().'">';
309 print '<input type="hidden" name="action" value="add">';
310 print '<input type="hidden" name="backtopage" value="'.$backtopage.'">';
311 print '<input type="hidden" name="fichinterid" value="'.$object->id.'">';
312
313 print dol_get_fiche_head();
314
315 $rowspan = 4;
316 if (isModEnabled('project') && $object->fk_project > 0) {
317 $rowspan++;
318 }
319 if (isModEnabled('contract') && $object->fk_contrat > 0) {
320 $rowspan++;
321 }
322
323 print '<table class="border centpercent">';
324
325 $object->fetch_thirdparty();
326
327 // Third party
328 print '<tr><td>'.$langs->trans("Customer").'</td><td>';
329 print $form->select_company($object->thirdparty->id, 'socid', '', 0, 1);
330
331 //.$object->thirdparty->getNomUrl(1,'customer').
332 print '</td><td>';
333 print $langs->trans("Comment");
334 print '</td></tr>';
335
336 // Title
337 print '<tr><td class="fieldrequired">'.$langs->trans("Title").'</td><td>';
338 print '<input class="flat quatrevingtpercent" type="text" name="title" value="'.dol_escape_htmltag(GETPOST("title", "alphanohtml")).'">';
339 print '</td>';
340
341 // Note
342 print '<td rowspan="'.$rowspan.'" valign="top">';
343 print '<textarea class="flat" name="description" wrap="soft" cols="60" rows="'.ROWS_4.'">';
344 print $object->description.'</textarea>';
345 print '</td></tr>';
346
347 // Author
348 print "<tr><td>".$langs->trans("Author")."</td><td>".$user->getFullName($langs)."</td></tr>";
349
350 if (!getDolGlobalString('FICHINTER_DISABLE_DETAILS') || getDolGlobalString('FICHINTER_DISABLE_DETAILS') == '2') {
351 // Duration
352 print '<tr><td>'.$langs->trans("TotalDuration").'</td>';
353 print '<td colspan="3">'.convertSecondToTime($object->duration, 'all', $conf->global->MAIN_DURATION_OF_WORKDAY).'</td>';
354 print '</tr>';
355 }
356
357 // Project
358 if (isModEnabled('project')) {
359 $formproject = new FormProjets($db);
360 print "<tr><td>".$langs->trans("Project")."</td><td>";
361 $projectid = GETPOST('projectid') ? GETPOST('projectid') : $object->fk_project;
362
363 $numprojet = $formproject->select_projects($object->thirdparty->id, $projectid, 'projectid', 0, 0, 1, 0, 0, 0, 0, '', 0, 0, '');
364 print ' &nbsp; <a href="'.DOL_URL_ROOT.'/projet/card.php?socid='.$object->thirdparty->id;
365 print '&action=create&status=1&backtopage='.urlencode($_SERVER["PHP_SELF"]).'?action=create';
366 print '&socid='.$object->thirdparty->id.(!empty($id) ? '&id='.$id : '').'">';
367 print $langs->trans("AddProject").'</a>';
368 print "</td></tr>";
369 }
370
371 // Contrat
372 if (isModEnabled('contract')) {
373 $formcontract = new FormContract($db);
374 print "<tr><td>".$langs->trans("Contract")."</td><td>";
375 $contractid = GETPOST('contractid') ? GETPOST('contractid') : (!empty($object->fk_contrat) ? $object->fk_contrat : 0) ;
376 $numcontract = $formcontract->select_contract($object->thirdparty->id, $contractid, 'contracttid');
377 print "</td></tr>";
378 }
379 print "</table>";
380
381 print '<br><br>';
382
384 // Autogeneration
385 $title = $langs->trans("Recurrence");
386 print load_fiche_titre($title, '', 'calendar');
387
388 print '<table class="border centpercent">';
389
390 // Frequency
391 print '<tr><td class="titlefieldcreate">';
392 print $form->textwithpicto($langs->trans("Frequency"), $langs->transnoentitiesnoconv('toolTipFrequency'));
393 print "</td><td>";
394 print '<input type="text" name="frequency" value="'.GETPOSTINT('frequency').'" size="4">&nbsp;';
395 print $form->selectarray('unit_frequency', array('d' => $langs->trans('Day'), 'm' => $langs->trans('Month'), 'y' => $langs->trans('Year')), (GETPOST('unit_frequency') ? GETPOST('unit_frequency') : 'm'));
396 print "</td></tr>";
397
398 // First date of execution for cron
399 print "<tr><td>".$langs->trans('NextDateToExecution')."</td><td>";
400 if (empty($date_next_execution)) {
401 $date_next_execution = (GETPOST('rec_month') ? dol_mktime(12, 0, 0, GETPOSTINT('rec_month'), GETPOSTINT('rec_day'), GETPOSTINT('rec_year')) : -1);
402 }
403 print $form->selectDate($date_next_execution, 'rec_', 1, 1, 0, "add", 1, 1);
404 print "</td></tr>";
405
406 // Number max of generation
407 print "<tr><td>".$langs->trans("MaxPeriodNumber")."</td><td>";
408 print '<input type="text" name="nb_gen_max" value="'.GETPOSTINT('nb_gen_max').'" size="5">';
409 print "</td></tr>";
410
411 print "</table>";
412
413 print '<br>';
414
415 $title = $langs->trans("ProductsAndServices");
416 if (!isModEnabled("service")) {
417 $title = $langs->trans("Products");
418 } elseif (!isModEnabled("product")) {
419 $title = $langs->trans("Services");
420 }
421
422 print load_fiche_titre($title, '', '');
423
424 /*
425 * Fichinter lines
426 */
427 print '<table class="notopnoleftnoright" width="100%">';
428 print '<tr><td colspan="3">';
429
430 $sql = 'SELECT l.rowid, l.description, l.duree';
431 $sql .= " FROM ".MAIN_DB_PREFIX."fichinterdet as l";
432 $sql .= " WHERE l.fk_fichinter= ".((int) $object->id);
433 //$sql.= " AND l.fk_product is null ";
434 $sql .= " ORDER BY l.rang";
435
436 $result = $db->query($sql);
437 if ($result) {
438 $num = $db->num_rows($result);
439 $i = 0;
440 $total = 0;
441
442 echo '<table class="noborder centpercent">';
443 if ($num) {
444 print '<tr class="liste_titre">';
445 print '<td>'.$langs->trans("Description").'</td>';
446 print '<td class="center">'.$langs->trans("Duration").'</td>';
447 print "</tr>\n";
448 }
449 while ($i < $num) {
450 $objp = $db->fetch_object($result);
451 print '<tr class="oddeven">';
452
453 // Show product and description
454
455 print '<td>';
456 print '<a name="'.$objp->rowid.'"></a>'; // ancre pour retourner sur la ligne
457
458 $text = img_object($langs->trans('Service'), 'service');
459
460 print $text.' '.nl2br($objp->description);
461
462 // Duration
463 print '<td class="center">'.convertSecondToTime($objp->duree).'</td>';
464 print "</tr>";
465
466 $i++;
467 }
468 $db->free($result);
469 } else {
470 print $db->error();
471 }
472 print "</table>";
473
474 print '</td></tr>';
475
476 print "</table>\n";
477
478 print dol_get_fiche_end();
479
480 print $form->buttonsSaveCancel("Create");
481
482 print "</form>\n";
483 } else {
484 dol_print_error(null, "Error, no fichinter ".$object->id);
485 }
486} elseif ($action == 'selsocforcreatefrommodel') {
487 print load_fiche_titre($langs->trans("CreateRepeatableIntervention"), '', 'intervention');
488 print dol_get_fiche_head([]);
489
490 print '<form name="fichinter" action="'.$_SERVER['PHP_SELF'].'" method="POST">';
491 print '<table class="border centpercent">';
492 print '<tr><td class="fieldrequired">'.$langs->trans("ThirdParty").'</td><td>';
493 print $form->select_company('', 'socid', '', 1, 1);
494 print '</td></tr>';
495 print '</table>';
496
497 print dol_get_fiche_end();
498
499 print '<input type="hidden" name="action" value="createfrommodel">';
500 print '<input type="hidden" name="id" value="'.$id.'">';
501 print '<input type="hidden" name="token" value="'.newToken().'">';
502 print $form->buttonsSaveCancel("CreateDraftIntervention", '');
503
504 print '</form>';
505} else {
506 // View mode
507
508 if ($id > 0) {
509 if ($object->fetch($id) > 0) {
510 $object->fetch_thirdparty();
511
512 $author = new User($db);
513 $author->fetch((int) $object->user_author_id);
514
515 $head = fichinter_rec_prepare_head($object);
516
517 print dol_get_fiche_head($head, 'card', $langs->trans("PredefinedInterventional"), 0, $object->picto);
518
519 // Intervention card
520 $linkback = '<a href="card-rec.php">'.$langs->trans("BackToList").'</a>';
521
522 $morehtmlref = '<div class="refidno">';
523 // Thirdparty
524
525 $morehtmlref .= $langs->trans('ThirdParty').' : '.$object->thirdparty->getNomUrl(1);
526 // Project
527 if (isModEnabled('project')) {
528 $formproject = new FormProjets($db);
529 $langs->load("projects");
530 $morehtmlref .= '<br>'.$langs->trans('Project').' ';
531 if ($user->hasRight('ficheinter', 'creer')) {
532 if ($action != 'classify') {
533 $morehtmlref .= '<a class="editfielda" href="'.dolBuildUrl($_SERVER['PHP_SELF'], ['action' => 'classify', 'id' => $object->id], true).'">';
534 $morehtmlref .= img_edit($langs->transnoentitiesnoconv('SetProject')).'</a> : ';
535 }
536 if ($action == 'classify') {
537 $morehtmlref .= '<form method="post" action="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'">';
538 $morehtmlref .= '<input type="hidden" name="action" value="classin">';
539 $morehtmlref .= '<input type="hidden" name="token" value="'.newToken().'">';
540 $morehtmlref .= $formproject->select_projects($object->socid, (string) $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1);
541 $morehtmlref .= '<input type="submit" class="button valignmiddle" value="'.$langs->trans("Modify").'">';
542 $morehtmlref .= '</form>';
543 } else {
544 $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, (string) $object->fk_project, 'none', 0, 0, 0, 1, '', 'maxwidth300');
545 }
546 } else {
547 if (!empty($object->fk_project)) {
548 $proj = new Project($db);
549 $proj->fetch($object->fk_project);
550 $morehtmlref .= ' : '.$proj->getNomUrl(1);
551 if ($proj->title) {
552 $morehtmlref .= ' - '.$proj->title;
553 }
554 } else {
555 $morehtmlref .= '';
556 }
557 }
558 }
559 $morehtmlref .= '</div>';
560
561 dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'ref', $morehtmlref);
562
563 print '<div class="fichecenter">';
564 print '<div class="fichehalfleft">';
565 print '<div class="underbanner clearboth"></div>';
566
567 print '<table class="border centpercent">';
568
569 print "<tr><td>".$langs->trans("Author").'</td><td colspan="3">'.$author->getFullName($langs)."</td></tr>";
570
571 if (!getDolGlobalString('FICHINTER_DISABLE_DETAILS') || getDolGlobalString('FICHINTER_DISABLE_DETAILS') == '2') {
572 // Duration
573 print '<tr><td class="titlefield">'.$langs->trans("TotalDuration").'</td>';
574 print '<td colspan="3">';
575 print convertSecondToTime($object->duration, 'all', $conf->global->MAIN_DURATION_OF_WORKDAY);
576 print '</td></tr>';
577 }
578
579 print '<tr><td>'.$langs->trans("Description").'</td><td colspan="3">'.nl2br($object->description)."</td></tr>";
580
581 // Contract
582 if (isModEnabled('contract') && $contratstatic !== null) {
583 $langs->load('contracts');
584 print '<tr>';
585 print '<td>';
586
587 print '<table class="nobordernopadding" width="100%"><tr><td>';
588 print $langs->trans('Contract');
589 print '</td>';
590 if ($action != 'contrat') {
591 print '<td class="right"><a href="'.$_SERVER["PHP_SELF"].'?action=contrat&id='.$object->id.'&token='.newToken().'">';
592 print img_edit($langs->trans('SetContract'), 1);
593 print '</a></td>';
594 }
595 print '</tr></table>';
596 print '</td><td>';
597 if ($action == 'contrat') {
598 $formcontract = new FormContract($db);
599 $formcontract->formSelectContract($_SERVER["PHP_SELF"].'?id='.$object->id, $object->socid, $object->fk_contrat, 'contratid', 0, 1);
600 } else {
601 if ($object->fk_contrat) {
602 $contratstatic = new Contrat($db);
603 $contratstatic->fetch($object->fk_contrat);
604 print $contratstatic->getNomUrl(0, 0, 1);
605 } else {
606 print "&nbsp;";
607 }
608 }
609 print '</td>';
610 print '</tr>';
611 }
612 print "</table>";
613 print '</div>';
614
615 print '<div class="fichehalfright">';
616 print '<div class="underbanner clearboth"></div>';
617
618 $title = $langs->trans("Recurrence");
619 print load_fiche_titre($title, '', 'calendar');
620
621 print '<table class="border centpercent">';
622
623 // if "frequency" is empty or = 0, the recurrence is disabled
624 print '<tr><td class="titlefield">';
625 print '<table class="nobordernopadding" width="100%"><tr><td>';
626 print $langs->trans('Frequency');
627 print '</td>';
628 if ($action != 'editfrequency' && $user->hasRight('ficheinter', 'creer')) {
629 print '<td class="right"><a href="'.$_SERVER["PHP_SELF"].'?action=editfrequency&token='.newToken().'&id='.$id.'">';
630 print img_edit($langs->trans('Edit'), 1).'</a></td>';
631 }
632 print '</tr></table>';
633 print '</td><td>';
634 if ($action == 'editfrequency') {
635 print '<form method="post" action="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'">';
636 print '<input type="hidden" name="action" value="setfrequency">';
637 print '<input type="hidden" name="token" value="'.newToken().'">';
638 print '<table class="nobordernopadding">';
639 print '<tr><td>';
640 print '<input type="text" name="frequency" value="'.$object->frequency.'" size="5">&nbsp;';
641 print $form->selectarray('unit_frequency', array('d' => $langs->trans('Day'), 'm' => $langs->trans('Month'), 'y' => $langs->trans('Year')), ($object->unit_frequency ? $object->unit_frequency : 'm'));
642 print '</td>';
643 print '<td class="left"><input type="submit" class="button button-edit" value="'.$langs->trans("Modify").'"></td>';
644 print '</tr></table></form>';
645 } else {
646 if ($object->frequency > 0) {
647 print $langs->trans('FrequencyPer_'.$object->unit_frequency, $object->frequency);
648 } else {
649 print $langs->trans("NotARecurringInterventionalTemplate");
650 }
651 }
652 print '</td></tr>';
653
654 // Date when
655 print '<tr><td>';
656 if ($user->hasRight('ficheinter', 'creer') && ($action == 'date_when' || $object->frequency > 0)) {
657 print $form->editfieldkey($langs->trans("NextDateToExecution"), 'date_when', $object->date_when, $object, $user->hasRight('ficheinter', 'creer'), 'day');
658 } else {
659 print $langs->trans("NextDateToExecution");
660 }
661 print '</td><td>';
662 if ($action == 'date_when' || $object->frequency > 0) {
663 print $form->editfieldval($langs->trans("NextDateToExecution"), 'date_when', $object->date_when, $object, $user->hasRight('ficheinter', 'creer'), 'day');
664 }
665 print '</td>';
666 print '</tr>';
667
668 // Max period / Rest period
669 print '<tr><td>';
670 if ($user->hasRight('ficheinter', 'creer') && ($action == 'nb_gen_max' || $object->frequency > 0)) {
671 print $form->editfieldkey($langs->trans("MaxPeriodNumber"), 'nb_gen_max', (string) $object->nb_gen_max, $object, $user->hasRight('ficheinter', 'creer'));
672 } else {
673 print $langs->trans("MaxPeriodNumber");
674 }
675
676 print '</td><td>';
677 if ($action == 'nb_gen_max' || $object->frequency > 0) {
678 print $form->editfieldval($langs->trans("MaxPeriodNumber"), 'nb_gen_max', $object->nb_gen_max ? $object->nb_gen_max : '', $object, $user->hasRight('ficheinter', 'creer'));
679 } else {
680 print '';
681 }
682
683 print '</td>';
684 print '</tr>';
685
686 print '</table>';
687
688 // Frequencry/Recurring section
689 if ($object->frequency > 0) {
690 print '<br>';
691 if (isModEnabled('cron')) {
692 $txtinfoadmin = $langs->trans("EnableAndSetupModuleCron", $langs->transnoentitiesnoconv("Module2300Name"));
693 print info_admin($txtinfoadmin);
694 }
695 print '<div class="underbanner clearboth"></div>';
696 print '<table class="border centpercent">';
697
698 // Nb of generation already done
699 print '<tr><td class="titlefield">'.$langs->trans("NbOfGenerationOfRecordDone").'</td>';
700 print '<td>';
701 print $object->nb_gen_done ? $object->nb_gen_done : '0';
702 print '</td>';
703 print '</tr>';
704
705 // Date last
706 print '<tr><td>';
707 print $langs->trans("DateLastGeneration");
708 print '</td><td>';
709 print dol_print_date($object->date_last_gen, 'dayhour');
710 print '</td>';
711 print '</tr>';
712 print '</table>';
713 print '<br>';
714 }
715
716 print '</div>';
717 print '</div>';
718
719 print '<div class="clearboth"></div><br>';
720
721 /*
722 * Lines
723 */
724
725 $title = $langs->trans("ProductsAndServices");
726 if (!isModEnabled("service")) {
727 $title = $langs->trans("Products");
728 } elseif (!isModEnabled("product")) {
729 $title = $langs->trans("Services");
730 }
731
732 print load_fiche_titre($title);
733
734 print '<table class="noborder centpercent">';
735 print '<tr class="liste_titre">';
736 print '<td>'.$langs->trans("Description").'</td>';
737 print '<td class="center">'.$langs->trans("Duration").'</td>';
738 print '</tr>';
739
740 $num = count($object->lines);
741 $i = 0;
742 while ($i < $num) {
743 $type =0;
744 // Show product and description
745 if (isset($object->lines[$i]->product_type)) {
746 $type = $object->lines[$i]->product_type;
747 } // else { $object->lines[$i]->fk_product_type; }
748
749 // TODO: $objp is not set here, so why test?
750 if (isset($objp) && is_object($objp)) { // $objp always null @phpstan-ignore-line
751 // Try to enhance type detection using date_start and date_end for free lines when type was not saved.
752 if (!empty($objp->date_start)) {
753 $type = 1;
754 }
755 if (!empty($objp->date_end)) {
756 $type = 1;
757 }
758 }
759
760 // Show line
761 print '<tr class="oddeven">';
762 print '<td>';
763 $text = img_object($langs->trans('Service'), 'service');
764 print $text.' '.nl2br($object->lines[$i]->desc);
765 print '</td>';
766
767 print '<td class="center">'.convertSecondToTime($object->lines[$i]->duree).'</td>';
768 print "</tr>\n";
769 $i++;
770 }
771 print '</table>';
772
773 // Action bar
774 print '<div class="tabsAction">';
775
776 if ($user->hasRight('ficheinter', 'creer')) {
777 print '<div class="inline-block divButAction">';
778 print '<a class="butAction" href="'.$_SERVER['PHP_SELF'].'?action=createfrommodel&token='.newToken();
779 print '&socid='.$object->thirdparty->id.'&id='.$object->id.'">';
780 print $langs->trans("AddIntervention").'</a></div>';
781 }
782
783 // Delete
784 print dolGetButtonAction($langs->trans("Delete"), '', 'delete', $_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken(), 'delete', $user->hasRight('ficheinter', 'supprimer'));
785
786 print '</div>';
787 } else {
788 print $langs->trans("ErrorRecordNotFound");
789 }
790 } else {
791 // List mode
792
793 $sql = "SELECT f.rowid as id, s.nom as name, s.rowid as socid, f.title,";
794 $sql .= " f.duree, f.fk_contrat, f.fk_projet as fk_project, f.frequency, f.nb_gen_done, f.nb_gen_max,";
795 $sql .= " f.date_last_gen, f.date_when, f.datec, f.status";
796
797 $sql .= " FROM ".MAIN_DB_PREFIX."fichinter_rec as f";
798 $sql .= " , ".MAIN_DB_PREFIX."societe as s ";
799 if (!$user->hasRight('societe', 'client', 'voir')) {
800 $sql .= " , ".MAIN_DB_PREFIX."societe_commerciaux as sc";
801 }
802 $sql .= " WHERE f.fk_soc = s.rowid";
803 $sql .= " AND f.entity = ".$conf->entity;
804 if (!empty($socid)) {
805 $sql .= " AND s.rowid = ".((int) $socid);
806 }
807 if (!$user->hasRight('societe', 'client', 'voir')) {
808 $sql .= " AND s.rowid = sc.fk_soc AND sc.fk_user = ".((int) $user->id);
809 }
810 /*
811 if (!empty($search_ref)) {
812 $sql .= natural_search('f.title', $search_ref);
813 }
814 */
815 if (!empty($search_societe)) {
816 $sql .= natural_search('s.nom', $search_societe);
817 }
818 if (!empty($search_frequency) && $search_frequency == '1') {
819 $sql .= ' AND f.frequency > 0';
820 }
821 if (isset($search_frequency) && (string) $search_frequency == '0') {
822 $sql .= ' AND (f.frequency IS NULL or f.frequency = 0)';
823 }
824
825
826 //$sql .= " ORDER BY $sortfield $sortorder, rowid DESC ";
827 // $sql .= $db->plimit($limit + 1, $offset);
828
829 $resql = $db->query($sql);
830 if ($resql) {
831 $num = $db->num_rows($resql);
832
833 print_barre_liste($langs->trans("RepeatableIntervention"), $page, $_SERVER['PHP_SELF'], "&socid=$socid", $sortfield, $sortorder, '', $num, '', 'intervention');
834
835 print '<span class="opacitymedium">'.$langs->trans("ToCreateAPredefinedIntervention").'</span><br><br>';
836
837 $i = 0;
838 print '<table class="noborder centpercent">';
839 print '<tr class="liste_titre">';
840 print_liste_field_titre("Ref", $_SERVER['PHP_SELF'], "f.title", "", "", 'width="200px"', $sortfield, $sortorder, 'left ');
841 print_liste_field_titre("Company", $_SERVER['PHP_SELF'], "s.nom", "", "", 'width="200px"', $sortfield, $sortorder, 'left ');
842 if (isModEnabled('contract')) {
843 print_liste_field_titre("Contract", $_SERVER['PHP_SELF'], "f.fk_contrat", "", "", 'width="100px"', $sortfield, $sortorder, 'left ');
844 }
845 if (isModEnabled('project')) {
846 print_liste_field_titre("Project", $_SERVER['PHP_SELF'], "f.fk_project", "", "", 'width="100px"', $sortfield, $sortorder, 'left ');
847 }
848 print_liste_field_titre("Duration", $_SERVER['PHP_SELF'], 'f.duree', '', '', 'width="50px"', $sortfield, $sortorder, 'right ');
849 // Recurring or not
850 print_liste_field_titre("Frequency", $_SERVER['PHP_SELF'], "f.frequency", "", "", 'width="100px"', $sortfield, $sortorder, 'center ');
851 print_liste_field_titre("NbOfGenerationDoneShort", $_SERVER['PHP_SELF'], "f.nb_gen_done", "", "", 'width="100px"', $sortfield, $sortorder, 'center ');
852 print_liste_field_titre("DateLastGeneration", $_SERVER['PHP_SELF'], "f.date_last_gen", "", "", 'width="100px"', $sortfield, $sortorder, 'center ');
853 print_liste_field_titre("NextDateToIntervention", $_SERVER['PHP_SELF'], "f.date_when", "", "", 'width="100px"', $sortfield, $sortorder, 'center ');
854 print '<th width="100px"></th>';
855 print "</tr>\n";
856
857
858 // TODO filters
859
860 if ($num > 0) {
861 while ($i < min($num, $limit)) {
862 $objp = $db->fetch_object($resql);
863 $fichinterrecstatic->id = $objp->id;
864 $fichinterrecstatic->ref = $objp->title;
865 $fichinterrecstatic->title = $objp->title;
866
867 print '<tr class="oddeven">';
868 print '<td>'.$fichinterrecstatic->getNomUrl(1)."</td>\n";
869 if ($objp->socid) {
870 $companystatic->id = $objp->socid;
871 $companystatic->name = $objp->name;
872 print '<td>'.$companystatic->getNomUrl(1, 'customer').'</td>';
873 } else {
874 print '<td>'.$langs->trans("None").'</td>';
875 }
876
877 if (isModEnabled('contract') && $contratstatic !== null) {
878 print '<td>';
879 if ($objp->fk_contrat > 0) {
880 $contratstatic->fetch($objp->fk_contrat);
881 print $contratstatic->getNomUrl(1);
882 }
883 print '</td>';
884 }
885 if (isModEnabled('project') && $projectstatic !== null) {
886 print '<td>';
887 if ($objp->fk_project > 0) {
888 $projectstatic->fetch($objp->fk_project);
889 print $projectstatic->getNomUrl(1);
890 }
891 print '</td>';
892 }
893
894 print '<td class=right>'.convertSecondToTime($objp->duree).'</td>';
895
896 print '<td class="center">'.yn($objp->frequency ? 1 : 0).'</td>';
897
898 print '<td class="center">';
899 if ($objp->frequency) {
900 print $objp->nb_gen_done.($objp->nb_gen_max > 0 ? ' / '.$objp->nb_gen_max : '');
901 print '</td>';
902
903 print '<td class="center">';
904 print dol_print_date($db->jdate($objp->date_last_gen), 'day');
905 print '</td>';
906
907 print '<td class="center">';
908 print dol_print_date($db->jdate($objp->date_when), 'day');
909 print '</td>';
910 } else {
911 print '<span class="opacitymedium">'.$langs->trans('NA').'</span>';
912 print '</td>';
913 print '<td class="center">';
914 print '<span class="opacitymedium">'.$langs->trans('NA').'</span>';
915 print '</td>';
916 print '<td class="center">';
917 print '<span class="opacitymedium">'.$langs->trans('NA').'</span>';
918 print '</td>';
919 }
920
921 if ($user->hasRight('ficheinter', 'creer')) {
922 // Action column
923 print '<td class="center">';
924 if ($user->hasRight('ficheinter', 'creer')) {
925 if (empty($objp->frequency) || $db->jdate($objp->date_when) <= $today) {
926 print '<a class="butAction" href="'.$_SERVER['PHP_SELF'].'?action=createfrommodel';
927 print '&socid='.$objp->socid.'&id='.$objp->id.'&token='.newToken().'">';
928 print $langs->trans("NewIntervention").'</a>';
929 } else {
930 print $langs->trans("DateIsNotEnough");
931 }
932 } else {
933 print "&nbsp;";
934 }
935
936 print "</td>";
937
938 print "</tr>\n";
939 $i++;
940 }
941 }
942 } else {
943 print '<tr class="oddeven"><td colspan="10"><span class="opacitymedium">'.$langs->trans("None").'</span></td></tr>';
944 }
945
946 print "</table>";
947 $db->free($resql);
948 } else {
949 dol_print_error($db);
950 }
951 }
952}
953llxFooter();
954$db->close();
$id
Support class for third parties, contacts, members, users or resources.
Definition account.php:47
if(! $sortfield) if(! $sortorder) $object
Definition account.php:100
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
Definition wrapper.php:91
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.
Definition wrapper.php:73
Class to manage standard extra fields.
Class to manage recurring interventions.
Class to manage generation of HTML components for contract module.
Class to manage generation of HTML components Only common components must be here.
Class to manage building of HTML components.
Class to manage projects.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage Dolibarr users.
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:247
fichinter_rec_prepare_head($object)
Prepare array with list of tabs.
dol_now($mode='gmt')
Return date for now.
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.
print_liste_field_titre($name, $file="", $field="", $begin="", $param="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $tooltip="", $forcenowrapcolumntitle=0)
Show title line of an array.
print_barre_liste($title, $page, $file, $options='', $sortfield='', $sortorder='', $morehtmlcenter='', $num=-1, $totalnboflines='', $picto='generic', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limit=-1, $selectlimitsuffix=0, $hidenavigation=0, $pagenavastextinput=0, $morehtmlrightbeforearrow='')
Print a title with navigation controls for pagination.
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0, $morecssdiv='')
Show tabs of a record.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $allowothertags=array())
Show a picto called object_picto (generic function)
natural_search($fields, $value, $mode=0, $nofirstand=0, $sqltoadd='')
Generate natural SQL search string for a criteria (this criteria can be tested on one or several fiel...
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.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
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.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='', $picto='')
Show information in HTML for admin users or standard users.
img_edit($titlealt='default', $float=0, $other='')
Show logo edit/modify fiche.
dol_getdate($timestamp, $fast=false, $forcetimezone='')
Return an array with locale date info.
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.