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