dolibarr 20.0.0
card.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2001-2007 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3 * Copyright (c) 2004-2019 Laurent Destailleur <eldy@users.sourceforge.net>
4 * Copyright (C) 2005-2012 Regis Houssin <regis.houssin@inodbox.com>
5 * Copyright (C) 2005 Eric Seigne <eric.seigne@ryxeo.com>
6 * Copyright (C) 2013 Juanjo Menent <jmenent@2byte.es>
7 * Copyright (C) 2019 Thibault FOUCART <support@ptibogxiv.net>
8 * Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 3 of the License, or
13 * (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with this program. If not, see <https://www.gnu.org/licenses/>.
22 */
23
30// Load Dolibarr environment
31require '../../main.inc.php';
32require_once DOL_DOCUMENT_ROOT.'/core/lib/product.lib.php';
33require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
34require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
35require_once DOL_DOCUMENT_ROOT.'/core/class/dolgraph.class.php';
36require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
37require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php';
38
39$WIDTH = DolGraph::getDefaultGraphSizeForStats('width', 380);
40$HEIGHT = DolGraph::getDefaultGraphSizeForStats('height', 160);
41
42// Load translation files required by the page
43$langs->loadLangs(array('companies', 'products', 'stocks', 'bills', 'other'));
44
45$id = GETPOSTINT('id'); // For this page, id can also be 'all'
46$ref = GETPOST('ref', 'alpha');
47$mode = (GETPOST('mode', 'alpha') ? GETPOST('mode', 'alpha') : 'byunit');
48$search_year = GETPOSTINT('search_year');
49$search_categ = GETPOSTINT('search_categ');
50$notab = GETPOSTINT('notab');
51$type = GETPOST('type', 'alpha');
52
53$error = 0;
54$mesg = '';
55$graphfiles = array();
56
57$socid = GETPOSTINT('socid');
58if (!empty($user->socid)) {
59 $socid = $user->socid;
60}
61if ($socid < 0) {
62 $socid = 0;
63}
64
65// Security check
66$fieldvalue = ($id > 0 ? $id : $ref);
67$fieldtype = (!empty($ref) ? 'ref' : 'rowid');
68
69// Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context
70$hookmanager->initHooks(array('productstatscard', 'globalcard'));
71
72$tmp = dol_getdate(dol_now());
73$currentyear = $tmp['year'];
74if (empty($search_year)) {
75 $search_year = $currentyear;
76}
77$moreforfilter = "";
78
79$object = new Product($db);
80if ($id > 0 || !empty($ref)) {
81 $result = $object->fetch($id, $ref);
82}
83
84$result = restrictedArea($user, 'produit|service', $fieldvalue, 'product&product', '', '', $fieldtype);
85
86
87/*
88 * Actions
89 */
90
91// None
92
93
94/*
95 * View
96 */
97
98$form = new Form($db);
99$htmlother = new FormOther($db);
100
101if (!($id > 0) && empty($ref) || $notab) {
102 $notab = 1;
103
104 llxHeader("", $langs->trans("ProductStatistics"), '', '', 0, 0, '', '', '', 'mod-product page-stats_card_general');
105
106 $type = GETPOSTINT('type');
107
108 $helpurl = '';
109 if ($type == '0') {
110 $helpurl = 'EN:Module_Products|FR:Module_Produits|ES:M&oacute;dulo_Productos';
111 //$title=$langs->trans("StatisticsOfProducts");
112 $title = $langs->trans("Statistics");
113 } else {
114 $helpurl = 'EN:Module_Services_En|FR:Module_Services|ES:M&oacute;dulo_Servicios';
115 //$title=$langs->trans("StatisticsOfProductsOrServices");
116 $title = $langs->trans("Statistics");
117 }
118
119 $picto = 'product';
120 if ($type == 1) {
121 $picto = 'service';
122 }
123
124 print load_fiche_titre($title, $mesg, $picto);
125} else {
126 $result = $object->fetch($id, $ref);
127
128 $title = $langs->trans('ProductServiceCard');
129 $helpurl = '';
130 $shortlabel = dol_trunc($object->label, 16);
131 if (GETPOST("type") == '0' || ($object->type == Product::TYPE_PRODUCT)) {
132 $title = $langs->trans('Product')." ".$shortlabel." - ".$langs->trans('Statistics');
133 $helpurl = 'EN:Module_Products|FR:Module_Produits|ES:M&oacute;dulo_Productos';
134 }
135 if (GETPOST("type") == '1' || ($object->type == Product::TYPE_SERVICE)) {
136 $title = $langs->trans('Service')." ".$shortlabel." - ".$langs->trans('Statistics');
137 $helpurl = 'EN:Module_Services_En|FR:Module_Services|ES:M&oacute;dulo_Servicios';
138 }
139
140 //HERE
141 llxHeader('', $title, $helpurl, '', 0, 0, '', '', '', 'mod-product page-stats_card_by_product');
142}
143
144
145if ($result && ($id > 0 || !empty($ref)) && empty($notab)) {
147 $titre = $langs->trans("CardProduct".$object->type);
148 $picto = ($object->type == Product::TYPE_SERVICE ? 'service' : 'product');
149
150 print dol_get_fiche_head($head, 'stats', $titre, -1, $picto);
151
152 $linkback = '<a href="'.DOL_URL_ROOT.'/product/list.php?restore_lastsearch_values=1&type='.$object->type.'">'.$langs->trans("BackToList").'</a>';
153
154 dol_banner_tab($object, 'ref', $linkback, ($user->socid ? 0 : 1), 'ref', '', '', '', 0, '', '', 1);
155
156 print dol_get_fiche_end();
157}
158if ((!($id > 0) && empty($ref)) || $notab) {
159 $h = 0;
160 $head = array();
161
162 $head[$h][0] = DOL_URL_ROOT.'/product/stats/card.php'.($type != '' ? '?type='.((int) $type) : '');
163 $head[$h][1] = $langs->trans("Chart");
164 $head[$h][2] = 'chart';
165 $h++;
166
167 $title = $langs->trans("ListProductServiceByPopularity");
168 if ((string) $type == '0') {
169 $title = $langs->trans("ListProductByPopularity");
170 }
171 if ((string) $type == '1') {
172 $title = $langs->trans("ListServiceByPopularity");
173 }
174
175
176 $head[$h][0] = DOL_URL_ROOT.'/product/popuprop.php'.($type != '' ? '?type='.((int) $type) : '');
177 $head[$h][1] = $langs->trans("ProductsServicesPerPopularity");
178 if ((string) $type == '0') {
179 $head[$h][1] = $langs->trans("ProductsPerPopularity");
180 }
181 if ((string) $type == '1') {
182 $head[$h][1] = $langs->trans("ServicesPerPopularity");
183 }
184 $head[$h][2] = 'popularity';
185 $h++;
186
187 print dol_get_fiche_head($head, 'chart', '', -1);
188}
189
190
191if ($result || !($id > 0)) {
192 print '<form name="stats" method="POST" action="'.$_SERVER["PHP_SELF"].'">';
193 print '<input type="hidden" name="token" value="'.newToken().'">';
194 if (empty($id) || $notab) {
195 print '<input type="hidden" name="notab" value="1">';
196 }
197
198 print '<table class="noborder centpercent">';
199 print '<tr class="liste_titre"><td class="liste_titre">'.$langs->trans("Filter").'</td><td></td></tr>';
200
201 if (!($id > 0) || $notab) {
202 // Type
203 print '<tr class="nooddeven"><td class="titlefield">'.$langs->trans("Type").'</td><td>';
204 $array = array('-1' => '&nbsp;', '0' => $langs->trans('Product'), '1' => $langs->trans('Service'));
205 print $form->selectarray('type', $array, $type, 0, 0, 0, '', 0, 0, 0, '', 'minwidth100');
206 print '</td></tr>';
207
208 // Product
209 print '<tr class="nooddeven"><td class="titlefield">'.$langs->trans("ProductOrService").'</td><td>';
210 print img_picto('', 'product', 'class="pictofixedwidth"');
211 print $form->select_produits($id, 'id', '', 0, 0, 1, 2, '', ($conf->dol_optimize_smallscreen ? 1 : 0), array(), 0, '1', 0, 'widthcentpercentminusx maxwidth400');
212 print '</td></tr>';
213
214 // Tag
215 if (isModEnabled('category')) {
216 print '<tr class="nooddeven"><td class="titlefield">'.$langs->trans("Categories").'</td><td>';
217 $moreforfilter .= img_picto($langs->trans("Categories"), 'category', 'class="pictofixedwidth"');
218 $moreforfilter .= $htmlother->select_categories(Categorie::TYPE_PRODUCT, $search_categ, 'search_categ', 1, 1, 'widthcentpercentminusx maxwidth400');
219 print $moreforfilter;
220 print '</td></tr>';
221 }
222 } else {
223 print '<input type="hidden" name="id" value="'.$id.'">';
224 }
225
226 // Year
227 print '<tr class="nooddeven"><td class="titlefield">'.$langs->trans("Year").'</td><td>';
228 $arrayyears = array();
229 for ($year = $currentyear - 25; $year < $currentyear; $year++) {
230 $arrayyears[$year] = $year;
231 }
232 if (!in_array($year, $arrayyears)) {
233 $arrayyears[$year] = $year;
234 }
235 if (!in_array($currentyear, $arrayyears)) {
236 $arrayyears[$currentyear] = $currentyear;
237 }
238 arsort($arrayyears);
239 print $form->selectarray('search_year', $arrayyears, $search_year, 1, 0, 0, '', 0, 0, 0, '', 'width75');
240 print '</td></tr>';
241
242 // thirdparty
243 print '<tr class="nooddeven"><td class="titlefield">'.$langs->trans("ThirdParty").'</td><td>';
244 print img_picto('', 'company', 'class="pictofixedwidth"');
245 print $form->select_company($socid, 'socid', '', 1, 0, 0, array(), 0, 'widthcentpercentminusx maxwidth400');
246 print '</td></tr>';
247
248 print '</table>';
249 print '<div class="center"><input type="submit" name="submit" class="button small" value="'.$langs->trans("Refresh").'"></div>';
250 print '</form><br>';
251
252 print '<br>';
253
254
255 $param = '';
256 $param .= (GETPOSTISSET('id') ? '&id='.GETPOSTINT('id') : '&id='.$object->id).(($type != '' && $type != '-1') ? '&type='.((int) $type) : '').'&search_year='.((int) $search_year).($notab ? '&notab='.$notab : '');
257 if ($socid > 0) {
258 $param .= '&socid='.((int) $socid);
259 }
260
261 // Choice of stats mode (byunit or bynumber)
262
263 if (!empty($conf->dol_use_jmobile)) {
264 print "\n".'<div class="fichecenter"><div class="nowrap">'."\n";
265 }
266
267 if ($mode != 'byunit') {
268 print '<a class="a-mesure-disabled marginleftonly marginrightonly reposition" href="'.$_SERVER["PHP_SELF"].'?mode=byunit'.$param.'">';
269 } else {
270 print '<span class="a-mesure marginleftonly marginrightonly">';
271 }
272 if ($type == '0') {
273 print $langs->trans("StatsByNumberOfUnitsProducts");
274 } elseif ($type == '1') {
275 print $langs->trans("StatsByNumberOfUnitsServices");
276 } else {
277 print $langs->trans("StatsByNumberOfUnits");
278 }
279 if ($mode != 'byunit') {
280 print '</a>';
281 } else {
282 print '</span>';
283 }
284
285 if (!empty($conf->dol_use_jmobile)) {
286 print '</div>'."\n".'<div class="nowrap">'."\n";
287 }
288
289 if ($mode != 'bynumber') {
290 print '<a class="a-mesure-disabled marginleftonly marginrightonly reposition" href="'.$_SERVER["PHP_SELF"].'?mode=bynumber'.$param.'">';
291 } else {
292 print '<span class="a-mesure marginleftonly marginrightonly">';
293 }
294 print $langs->trans("StatsByNumberOfEntities");
295 if ($mode != 'bynumber') {
296 print '</a>';
297 } else {
298 print '</span>';
299 }
300
301 if (!empty($conf->dol_use_jmobile)) {
302 print '</div>'."\n".'<div class="nowrap">'."\n";
303 }
304
305 if ($mode != 'byamount') {
306 print '<a class="a-mesure-disabled marginleftonly marginrightonly reposition" href="'.$_SERVER["PHP_SELF"].'?mode=byamount'.$param.'">';
307 } else {
308 print '<span class="a-mesure marginleftonly marginrightonly">';
309 }
310 if ($type == '0') {
311 print $langs->trans("StatsByAmountProducts");
312 } elseif ($type == '1') {
313 print $langs->trans("StatsByAmountServices");
314 } else {
315 print $langs->trans("StatsByAmount");
316 }
317 if ($mode != 'byamount') {
318 print '</a>';
319 } else {
320 print '</span>';
321 }
322
323 // End of choices
324 if (!empty($conf->dol_use_jmobile)) {
325 print '</div></div>';
326 } else {
327 print '<br>';
328 }
329 print '<br>';
330
331 // Generation of graphs
332 $dir = (!empty($conf->product->multidir_temp[$conf->entity]) ? $conf->product->multidir_temp[$conf->entity] : $conf->service->multidir_temp[$conf->entity]);
333 if ($object->id > 0) { // We are on statistics for a dedicated product
334 if (!file_exists($dir.'/'.$object->id)) {
335 if (dol_mkdir($dir.'/'.$object->id) < 0) {
336 $mesg = $langs->trans("ErrorCanNotCreateDir", $dir);
337 $error++;
338 }
339 }
340 }
341
342 $arrayforlabel = array('byunit' => 'NumberOfUnits', 'bynumber' => 'NumberOf', 'byamount' => 'AmountIn');
343
344 if (isModEnabled('propal')) {
345 $graphfiles['propal'] = array('modulepart' => 'productstats_proposals',
346 'file' => $object->id.'/propal12m'.((string) $type != '' ? '_type'.$type : '').'_'.$mode.($search_year > 0 ? '_year'.$search_year : '').'.png',
347 'label' => $langs->transnoentitiesnoconv($arrayforlabel[$mode], $langs->transnoentitiesnoconv("Proposals")));
348 }
349
350 if (isModEnabled('supplier_proposal')) {
351 $langs->load("supplier_proposal");
352 $graphfiles['proposalssuppliers'] = array('modulepart' => 'productstats_proposalssuppliers',
353 'file' => $object->id.'/proposalssuppliers12m'.((string) $type != '' ? '_type'.$type : '').'_'.$mode.($search_year > 0 ? '_year'.$search_year : '').'.png',
354 'label' => $langs->transnoentitiesnoconv($arrayforlabel[$mode], $langs->transnoentitiesnoconv("SupplierProposals")));
355 }
356
357 if (isModEnabled('order')) {
358 $graphfiles['orders'] = array('modulepart' => 'productstats_orders',
359 'file' => $object->id.'/orders12m'.((string) $type != '' ? '_type'.$type : '').'_'.$mode.($search_year > 0 ? '_year'.$search_year : '').'.png',
360 'label' => $langs->transnoentitiesnoconv($arrayforlabel[$mode], $langs->transnoentitiesnoconv("Orders")));
361 }
362
363 if (isModEnabled('supplier_order')) {
364 $graphfiles['orderssuppliers'] = array('modulepart' => 'productstats_orderssuppliers',
365 'file' => $object->id.'/orderssuppliers12m'.((string) $type != '' ? '_type'.$type : '').'_'.$mode.($search_year > 0 ? '_year'.$search_year : '').'.png',
366 'label' => $langs->transnoentitiesnoconv($arrayforlabel[$mode], $langs->transnoentitiesnoconv("SuppliersOrders")));
367 }
368
369 if (isModEnabled('invoice')) {
370 $graphfiles['invoices'] = array('modulepart' => 'productstats_invoices',
371 'file' => $object->id.'/invoices12m'.((string) $type != '' ? '_type'.$type : '').'_'.$mode.($search_year > 0 ? '_year'.$search_year : '').'.png',
372 'label' => $langs->transnoentitiesnoconv($arrayforlabel[$mode], $langs->transnoentitiesnoconv("Invoices")));
373 }
374
375 if (isModEnabled('supplier_invoice')) {
376 $graphfiles['invoicessuppliers'] = array('modulepart' => 'productstats_invoicessuppliers',
377 'file' => $object->id.'/invoicessuppliers12m'.((string) $type != '' ? '_type'.$type : '').'_'.$mode.($search_year > 0 ? '_year'.$search_year : '').'.png',
378 'label' => $langs->transnoentitiesnoconv($arrayforlabel[$mode], $langs->transnoentitiesnoconv("SupplierInvoices")));
379 }
380
381 if (isModEnabled('contract')) {
382 $graphfiles['contracts'] = array('modulepart' => 'productstats_contracts',
383 'file' => $object->id.'/contracts12m'.((string) $type != '' ? '_type'.$type : '').'_'.$mode.($search_year > 0 ? '_year'.$search_year : '').'.png',
384 'label' => $langs->transnoentitiesnoconv($arrayforlabel[$mode], $langs->transnoentitiesnoconv("Contracts")));
385 }
386
387 if (isModEnabled('mrp') && $mode != 'byamount') {
388 $graphfiles['mrp'] = array('modulepart' => 'productstats_mrp',
389 'file' => $object->id.'/mos12m'.((string) $type != '' ? '_type'.$type : '').'_'.$mode.($search_year > 0 ? '_year'.$search_year : '').'.png',
390 'label' => $langs->transnoentitiesnoconv($arrayforlabel[$mode]."Mos"));
391 }
392
393 $px = new DolGraph();
394
395 if (!$error && count($graphfiles) > 0) {
396 $mesg = $px->isGraphKo();
397 if (!$mesg) {
398 foreach ($graphfiles as $key => $val) {
399 if (!$graphfiles[$key]['file']) {
400 continue;
401 }
402
403 $graph_data = array();
404
405 if (dol_is_file($dir.'/'.$graphfiles[$key]['file'])) {
406 // TODO Load cachefile $graphfiles[$key]['file']
407 } else {
408 $morefilters = '';
409 if ($search_categ > 0) {
410 $categ = new Categorie($db);
411 $categ->fetch($search_categ);
412 $listofprodids = $categ->getObjectsInCateg('product', 1);
413 $morefilters = ' AND d.fk_product IN ('.$db->sanitize((is_array($listofprodids) && count($listofprodids)) ? implode(',', $listofprodids) : '0').')';
414 }
415 if ($search_categ == -2) {
416 $morefilters = ' AND NOT EXISTS (SELECT cp.fk_product FROM '.MAIN_DB_PREFIX.'categorie_product as cp WHERE d.fk_product = cp.fk_product)';
417 }
418
419 if ($key == 'propal') {
420 $graph_data = $object->get_nb_propal($socid, $mode, ((string) $type != '' ? $type : -1), $search_year, $morefilters);
421 }
422 if ($key == 'orders') {
423 $graph_data = $object->get_nb_order($socid, $mode, ((string) $type != '' ? $type : -1), $search_year, $morefilters);
424 }
425 if ($key == 'invoices') {
426 $graph_data = $object->get_nb_vente($socid, $mode, ((string) $type != '' ? $type : -1), $search_year, $morefilters);
427 }
428 if ($key == 'proposalssuppliers') {
429 $graph_data = $object->get_nb_propalsupplier($socid, $mode, ((string) $type != '' ? $type : -1), $search_year, $morefilters);
430 }
431 if ($key == 'invoicessuppliers') {
432 $graph_data = $object->get_nb_achat($socid, $mode, ((string) $type != '' ? $type : -1), $search_year, $morefilters);
433 }
434 if ($key == 'orderssuppliers') {
435 $graph_data = $object->get_nb_ordersupplier($socid, $mode, ((string) $type != '' ? $type : -1), $search_year, $morefilters);
436 }
437 if ($key == 'contracts') {
438 $graph_data = $object->get_nb_contract($socid, $mode, ((string) $type != '' ? $type : -1), $search_year, $morefilters);
439 }
440 if ($key == 'mrp') {
441 $graph_data = $object->get_nb_mos($socid, $mode, ((string) $type != '' ? $type : -1), $search_year, $morefilters);
442 }
443
444 // TODO Save cachefile $graphfiles[$key]['file']
445 }
446
447 if (is_array($graph_data)) {
448 $px->SetData($graph_data);
449 $px->SetYLabel($graphfiles[$key]['label']);
450 $px->SetMaxValue($px->GetCeilMaxValue() < 0 ? 0 : $px->GetCeilMaxValue());
451 $px->SetMinValue($px->GetFloorMinValue() > 0 ? 0 : $px->GetFloorMinValue());
452 $px->setShowLegend(0);
453 $px->SetWidth($WIDTH);
454 $px->SetHeight($HEIGHT);
455 $px->SetHorizTickIncrement(1);
456 $px->SetShading(3);
457 //print 'x '.$key.' '.$graphfiles[$key]['file'];
458
459 $url = DOL_URL_ROOT.'/viewimage.php?modulepart='.$graphfiles[$key]['modulepart'].'&entity='.((int) $object->entity).'&file='.urlencode($graphfiles[$key]['file']).($notab ? '&notab='.$notab : '');
460 $px->draw($dir."/".$graphfiles[$key]['file'], $url);
461
462 $graphfiles[$key]['total'] = $px->total();
463 $graphfiles[$key]['output'] = $px->show();
464 } else {
465 dol_print_error($db, 'Error for calculating graph on key='.$key.' - '.$object->error);
466 }
467 }
468
469 //setEventMessages($langs->trans("ChartGenerated"), null, 'mesgs');
470 }
471 }
472
473 // Show graphs
474 $i = 0;
475 if (count($graphfiles) > 0) {
476 foreach ($graphfiles as $key => $val) {
477 if (!$graphfiles[$key]['file']) {
478 continue;
479 }
480
481 if ($graphfiles == 'propal' && !$user->hasRight('propal', 'lire')) {
482 continue;
483 }
484 if ($graphfiles == 'order' && !$user->hasRight('commande', 'lire')) {
485 continue;
486 }
487 if ($graphfiles == 'invoices' && !$user->hasRight('facture', 'lire')) {
488 continue;
489 }
490 if ($graphfiles == 'proposals_suppliers' && !$user->hasRight('supplier_proposal', 'lire')) {
491 continue;
492 }
493 if ($graphfiles == 'invoices_suppliers' && !$user->hasRight('fournisseur', 'facture', 'lire')) {
494 continue;
495 }
496 if ($graphfiles == 'orders_suppliers' && !$user->hasRight('fournisseur', 'commande', 'lire')) {
497 continue;
498 }
499 if ($graphfiles == 'mrp' && !$user->hasRight('mrp', 'read')) {
500 continue;
501 }
502
503
504 if ($i % 2 == 0) {
505 print "\n".'<div class="fichecenter"><div class="fichehalfleft">'."\n";
506 } else {
507 print "\n".'<div class="fichehalfright">'."\n";
508 }
509
510 // Date generation
511 if ($graphfiles[$key]['output'] && !$px->isGraphKo()) {
512 if (file_exists($dir."/".$graphfiles[$key]['file']) && filemtime($dir."/".$graphfiles[$key]['file'])) {
513 $dategenerated = $langs->trans("GeneratedOn", dol_print_date(filemtime($dir."/".$graphfiles[$key]['file']), "dayhour"));
514 } else {
515 $dategenerated = $langs->trans("GeneratedOn", dol_print_date(dol_now(), "dayhour"));
516 }
517 } else {
518 $dategenerated = ($mesg ? '<span class="error">'.$mesg.'</span>' : $langs->trans("ChartNotGenerated"));
519 }
520 $linktoregenerate = '<a class="reposition" href="'.$_SERVER["PHP_SELF"].'?'.(GETPOSTISSET('id') ? 'id='.GETPOSTINT('id') : 'id='.$object->id).(((string) $type != '' && $type != '-1') ? '&type='.((int) $type) : '').'&action=recalcul&mode='.urlencode($mode).'&search_year='.((int) $search_year).($search_categ > 0 ? '&search_categ='.((int) $search_categ) : '').'">';
521 $linktoregenerate .= img_picto($langs->trans("ReCalculate").' ('.$dategenerated.')', 'refresh');
522 $linktoregenerate .= '</a>';
523
524
525 // Show graph
526 print '<div class="div-table-responsive-no-min">';
527 print '<table class="noborder centpercent">';
528 // Label
529 print '<tr class="liste_titre"><td>';
530 print $graphfiles[$key]['label'];
531 print ' <span class="opacitymedium">('.$graphfiles[$key]['total'].')</span></td>';
532 print '<td align="right">'.$linktoregenerate.'</td>';
533 print '</tr>';
534 // Image
535 print '<tr><td colspan="2" class="nohover" align="center">';
536 print $graphfiles[$key]['output'];
537 print '</td></tr>';
538 print '</table>';
539 print '</div>';
540
541 if ($i % 2 == 0) {
542 print "\n".'</div>'."\n";
543 } else {
544 print "\n".'</div></div>';
545 print '<div class="clear"><div class="fichecenter"><br></div></div>'."\n";
546 }
547
548 $i++;
549 }
550 }
551 // div not closed
552 if ($i % 2 == 1) {
553 print "\n".'<div class="fichehalfright">'."\n";
554 print "\n".'</div></div>';
555 print '<div class="clear"><div class="fichecenter"><br></div></div>'."\n";
556 }
557}
558
559if (!($id > 0)) {
560 print dol_get_fiche_end();
561}
562
563// End of page
564llxFooter();
565$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 categories.
Class to build graphs.
static getDefaultGraphSizeForStats($direction, $defaultsize='')
getDefaultGraphSizeForStats
Class to manage generation of HTML components Only common components must be here.
Class permettant la generation de composants html autre Only common components are here.
Class to manage products or services.
const TYPE_PRODUCT
Regular product.
const TYPE_SERVICE
Service.
dol_is_file($pathoffile)
Return if path is a file.
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (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.
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).
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dol_trunc($string, $size=40, $trunc='right', $stringencoding='UTF-8', $nodot=0, $display=0)
Truncate a string to a particular length adding '…' if string larger than length.
dol_getdate($timestamp, $fast=false, $forcetimezone='')
Return an array with locale date info.
dol_mkdir($dir, $dataroot='', $newmask='')
Creation of a directory (this can create recursive subdir)
product_prepare_head($object)
Prepare array with list of tabs.
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.