From 46c3b1eb1f166e70ee96a91bc6bd8974fe2a6cd9 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 2 Jul 2013 01:26:52 +0200 Subject: [PATCH 01/48] Missing vat rate --- htdocs/install/mysql/data/llx_c_tva.sql | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/htdocs/install/mysql/data/llx_c_tva.sql b/htdocs/install/mysql/data/llx_c_tva.sql index b198db78fe2..df651bdb6f7 100644 --- a/htdocs/install/mysql/data/llx_c_tva.sql +++ b/htdocs/install/mysql/data/llx_c_tva.sql @@ -267,7 +267,11 @@ insert into llx_c_tva(rowid,fk_pays,taux,recuperableonly,note,active) values (19 insert into llx_c_tva(rowid,fk_pays,taux,recuperableonly,note,active) values (2461,246, '0','0','VAT Rate 0',1); --- MAURITIUS (id country=15) +-- MAURITANIA (id country=151) +insert into llx_c_tva(rowid,fk_pays,taux,recuperableonly,note,active) values (1511,151, '0','0','VAT Rate 0',1); +insert into llx_c_tva(rowid,fk_pays,taux,recuperableonly,note,active) values (1512,151, '14','0','VAT Rate 14',1); + +-- MAURITIUS (id country=152) insert into llx_c_tva(rowid,fk_pays,taux,recuperableonly,note,active) values (1521,152, '0','0','VAT Rate 0',1); insert into llx_c_tva(rowid,fk_pays,taux,recuperableonly,note,active) values (1522,152, '15','0','VAT Rate 15',1); From 3a8287ba61b80fae7fee5a6caeac095e8b894636 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 2 Jul 2013 01:43:25 +0200 Subject: [PATCH 02/48] Update doc --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 257d19e60fb..c5cf2ecf7e9 100644 --- a/README.md +++ b/README.md @@ -128,7 +128,6 @@ This is features that Dolibarr does not support completely yet: - No double party accountancy (only bank management). - Dolibarr manage one currency at once (mono-currency). - Dolibarr manage one master company/foundation (mono-company). If you want to manage several companies or foundations, you must install several time the software (on same server or not). Another solution is to extend Dolibarr with the addon Module MultiCompany that allows to manage several companies in one Dolibarr instance (one database but with a logical isolation of datas). -- Does not support double VAT (Federal / provincial) for Canada. - Dolibarr does not contains Payroll module. - Tasks on module project can't have dependencies between each other. - Dolibarr does not include any Webmail. From 1beb50e870ff6e3c2435e76b6e55b88ed69c96d2 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 2 Jul 2013 09:58:09 +0200 Subject: [PATCH 03/48] Fix: State for turkey --- htdocs/core/lib/functions.lib.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index ae1b934c928..13ef5aad17e 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -698,7 +698,7 @@ function dol_bc($var,$moreclass='') function dol_format_address($object,$withcountry=0,$sep="\n") { $ret=''; - $countriesusingstate=array('AU','US','IN','GB','ES','UK'); + $countriesusingstate=array('AU','US','IN','GB','ES','UK','TR'); // Address $ret .= $object->address; @@ -721,7 +721,7 @@ function dol_format_address($object,$withcountry=0,$sep="\n") } if ($object->zip) $ret .= ($ret ? $sep : '' ).$object->zip; } - else if (in_array($object->country_code,array('ES'))) // ES: title firstname name \n address lines \n zip town \n state \n country + else if (in_array($object->country_code,array('ES','TR'))) // ES: title firstname name \n address lines \n zip town \n state \n country { $ret .= ($ret ? $sep : '' ).$object->zip; $ret .= ' '.$object->town; @@ -2812,9 +2812,9 @@ function get_localtax($tva, $local, $thirdparty_buyer="", $thirdparty_seller="") } } - if ($local == 2) + if ($local == 2) { - + if ($thirdparty_seller->id==$mysoc->id) { if (! $thirdparty_buyer->localtax2_assuj) return 0; From c9fd070bbaa156e1296b2e8df942e78befd77a33 Mon Sep 17 00:00:00 2001 From: simnandez Date: Tue, 2 Jul 2013 18:53:42 +0200 Subject: [PATCH 04/48] Fix: Amarok Tab visu. --- htdocs/theme/amarok/style.css.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/theme/amarok/style.css.php b/htdocs/theme/amarok/style.css.php index 5057f18731c..b09a3f13b39 100755 --- a/htdocs/theme/amarok/style.css.php +++ b/htdocs/theme/amarok/style.css.php @@ -957,7 +957,7 @@ a.tabTitle img { } a.tab { - padding: 5px 12px 5px; + padding: 5px 12px 2px; margin: 0em 0.2em; background-color:rgba(0,0,0,.2); color:#666666; From 6f5a91837368f7977121a0c3506116c7327b5d58 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 2 Jul 2013 21:53:34 +0200 Subject: [PATCH 05/48] New: Add option MAIN_MOTD_SETUPPAGE to add a content onto setup page. Also content for MAIN_MOTD_SETUPPAGE, MAIN_MOTD_SETUPPAGE, MAIN_HOME now accept "|langfile" into translation key to use a specific language file. --- ChangeLog | 3 +++ htdocs/admin/index.php | 25 ++++++++++++++++++++++--- htdocs/core/lib/security2.lib.php | 7 ++++--- htdocs/index.php | 9 +++++++++ 4 files changed, 38 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index def026d92ef..4a2e7625cd2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -39,6 +39,9 @@ For developers: - New: Upgrade lib of TCPDF to 6.0 - New: Add property "hidden" into module descriptors to allow to hide a module according to some dynamic conditions. +- New: Add option MAIN_MOTD_SETUPPAGE to add a content onto setup page. Also content for + MAIN_MOTD_SETUPPAGE, MAIN_MOTD_SETUPPAGE, MAIN_HOME now accept "|langfile" into translation + key to use a specific language file. ***** ChangeLog for 3.4 compared to 3.3.2 ***** diff --git a/htdocs/admin/index.php b/htdocs/admin/index.php index 940396718b9..23dcacf4f1d 100644 --- a/htdocs/admin/index.php +++ b/htdocs/admin/index.php @@ -28,8 +28,6 @@ $langs->load("companies"); if (!$user->admin) accessforbidden(); -$mesg=''; - /* * View @@ -43,7 +41,28 @@ $form = new Form($db); print_fiche_titre($langs->trans("SetupArea"),'','setup'); -if ($mesg) print $mesg.'
'; + +if (! empty($conf->global->MAIN_MOTD_SETUPPAGE)) +{ + $conf->global->MAIN_MOTD_SETUPPAGE=preg_replace('//i','
',$conf->global->MAIN_MOTD_SETUPPAGE); + if (! empty($conf->global->MAIN_MOTD_SETUPPAGE)) + { + $i=0; + while (preg_match('/__\(([a-zA-Z|@]+)\)__/i',$conf->global->MAIN_MOTD_SETUPPAGE,$reg) && $i < 100) + { + $tmp=explode('|',$reg[1]); + if (! empty($tmp[1])) $langs->load($tmp[1]); + $conf->global->MAIN_MOTD_SETUPPAGE=preg_replace('/__\('.preg_quote($reg[1]).'\)__/i',$langs->trans($tmp[0]),$conf->global->MAIN_MOTD_SETUPPAGE); + $i++; + } + + print "\n\n"; + print '
'; + print dol_htmlentitiesbr($conf->global->MAIN_MOTD_SETUPPAGE); + print '

'; + print "\n\n"; + } +} print $langs->trans("SetupDescription1").' '; print $langs->trans("AreaForAdminOnly").' '; diff --git a/htdocs/core/lib/security2.lib.php b/htdocs/core/lib/security2.lib.php index 556007967f4..05f352043ec 100644 --- a/htdocs/core/lib/security2.lib.php +++ b/htdocs/core/lib/security2.lib.php @@ -270,12 +270,13 @@ function dol_loginfunction($langs,$conf,$mysoc) if (! empty($conf->global->MAIN_HOME)) { $i=0; - while (preg_match('/__\(([a-zA-Z]+)\)__/i',$conf->global->MAIN_HOME,$reg) && $i < 100) + while (preg_match('/__\(([a-zA-Z|@]+)\)__/i',$conf->global->MAIN_HOME,$reg) && $i < 100) { - $conf->global->MAIN_HOME=preg_replace('/__\('.$reg[1].'\)__/i',$langs->trans($reg[1]),$conf->global->MAIN_HOME); + $tmp=explode('|',$reg[1]); + if (! empty($tmp[1])) $langs->load($tmp[1]); + $conf->global->MAIN_HOME=preg_replace('/__\('.preg_quote($reg[1]).'\)__/i',$langs->trans($tmp[0]),$conf->global->MAIN_HOME); $i++; } - $main_home=dol_htmlcleanlastbr($conf->global->MAIN_HOME); } diff --git a/htdocs/index.php b/htdocs/index.php index 5d423b18921..26a13b9d20c 100644 --- a/htdocs/index.php +++ b/htdocs/index.php @@ -61,6 +61,15 @@ if (! empty($conf->global->MAIN_MOTD)) $conf->global->MAIN_MOTD=preg_replace('//i','
',$conf->global->MAIN_MOTD); if (! empty($conf->global->MAIN_MOTD)) { + $i=0; + while (preg_match('/__\(([a-zA-Z|@]+)\)__/i',$conf->global->MAIN_MOTD,$reg) && $i < 100) + { + $tmp=explode('|',$reg[1]); + if (! empty($tmp[1])) $langs->load($tmp[1]); + $conf->global->MAIN_MOTD=preg_replace('/__\('.preg_quote($reg[1]).'\)__/i',$langs->trans($tmp[0]),$conf->global->MAIN_MOTD); + $i++; + } + print "\n\n"; print ''); @@ -2190,16 +2686,15 @@ rowStarted = true; } - if (lf) - label = lf(label, s); - fragments.push( - '' + - ''); + '' + + '' + ); } + if (rowStarted) fragments.push(''); - + if (fragments.length == 0) return; @@ -2243,43 +2738,43 @@ // interactive features - + var highlights = [], redrawTimeout = null; - + // returns the data item the mouse is over, or null if none is found function findNearbyItem(mouseX, mouseY, seriesFilter) { var maxDistance = options.grid.mouseActiveRadius, smallestDistance = maxDistance * maxDistance + 1, - item = null, foundPoint = false, i, j; + item = null, foundPoint = false, i, j, ps; for (i = series.length - 1; i >= 0; --i) { if (!seriesFilter(series[i])) continue; - + var s = series[i], axisx = s.xaxis, axisy = s.yaxis, points = s.datapoints.points, - ps = s.datapoints.pointsize, mx = axisx.c2p(mouseX), // precompute some stuff to make the loop faster my = axisy.c2p(mouseY), maxx = maxDistance / axisx.scale, maxy = maxDistance / axisy.scale; + ps = s.datapoints.pointsize; // with inverse transforms, we can't use the maxx/maxy // optimization, sadly if (axisx.options.inverseTransform) maxx = Number.MAX_VALUE; if (axisy.options.inverseTransform) maxy = Number.MAX_VALUE; - + if (s.lines.show || s.points.show) { for (j = 0; j < points.length; j += ps) { var x = points[j], y = points[j + 1]; if (x == null) continue; - + // For points and lines, the cursor must be within a // certain distance to the data point if (x - mx > maxx || x - mx < -maxx || @@ -2300,19 +2795,19 @@ } } } - + if (s.bars.show && !item) { // no other point can be nearby var barLeft = s.bars.align == "left" ? 0 : -s.bars.barWidth/2, barRight = barLeft + s.bars.barWidth; - + for (j = 0; j < points.length; j += ps) { var x = points[j], y = points[j + 1], b = points[j + 2]; if (x == null) continue; - + // for a bar graph, the cursor must be inside the bar - if (series[i].bars.horizontal ? - (mx <= Math.max(b, x) && mx >= Math.min(b, x) && + if (series[i].bars.horizontal ? + (mx <= Math.max(b, x) && mx >= Math.min(b, x) && my >= y + barLeft && my <= y + barRight) : (mx >= x + barLeft && mx <= x + barRight && my >= Math.min(b, y) && my <= Math.max(b, y))) @@ -2325,13 +2820,13 @@ i = item[0]; j = item[1]; ps = series[i].datapoints.pointsize; - + return { datapoint: series[i].datapoints.points.slice(j * ps, (j + 1) * ps), dataIndex: j, series: series[i], seriesIndex: i }; } - + return null; } @@ -2367,8 +2862,8 @@ if (item) { // fill in mouse pos for any listeners out there - item.pageX = parseInt(item.series.xaxis.p2c(item.datapoint[0]) + offset.left + plotOffset.left); - item.pageY = parseInt(item.series.yaxis.p2c(item.datapoint[1]) + offset.top + plotOffset.top); + item.pageX = parseInt(item.series.xaxis.p2c(item.datapoint[0]) + offset.left + plotOffset.left, 10); + item.pageY = parseInt(item.series.yaxis.p2c(item.datapoint[1]) + offset.top + plotOffset.top, 10); } if (options.grid.autoHighlight) { @@ -2381,17 +2876,23 @@ h.point[1] == item.datapoint[1])) unhighlight(h.series, h.point); } - + if (item) highlight(item.series, item.datapoint, eventname); } - + placeholder.trigger(eventname, [ pos, item ]); } function triggerRedrawOverlay() { + var t = options.interaction.redrawOverlayInterval; + if (t == -1) { // skip event queue + drawOverlay(); + return; + } + if (!redrawTimeout) - redrawTimeout = setTimeout(drawOverlay, 30); + redrawTimeout = setTimeout(drawOverlay, t); } function drawOverlay() { @@ -2399,9 +2900,9 @@ // draw highlights octx.save(); - octx.clearRect(0, 0, canvasWidth, canvasHeight); + overlay.clear(); octx.translate(plotOffset.left, plotOffset.top); - + var i, hi; for (i = 0; i < highlights.length; ++i) { hi = highlights[i]; @@ -2412,10 +2913,10 @@ drawPointHighlight(hi.series, hi.point); } octx.restore(); - + executeHooks(hooks.drawOverlay, [octx]); } - + function highlight(s, point, auto) { if (typeof s == "number") s = series[s]; @@ -2434,18 +2935,21 @@ else if (!auto) highlights[i].auto = false; } - + function unhighlight(s, point) { if (s == null && point == null) { highlights = []; triggerRedrawOverlay(); + return; } - + if (typeof s == "number") s = series[s]; - if (typeof point == "number") - point = s.data[point]; + if (typeof point == "number") { + var ps = s.datapoints.pointsize; + point = s.datapoints.points.slice(ps * point, ps * (point + 1)); + } var i = indexOfHighlight(s, point); if (i != -1) { @@ -2454,7 +2958,7 @@ triggerRedrawOverlay(); } } - + function indexOfHighlight(s, p) { for (var i = 0; i < highlights.length; ++i) { var h = highlights[i]; @@ -2464,21 +2968,22 @@ } return -1; } - + function drawPointHighlight(series, point) { var x = point[0], y = point[1], - axisx = series.xaxis, axisy = series.yaxis; - + axisx = series.xaxis, axisy = series.yaxis, + highlightColor = (typeof series.highlightColor === "string") ? series.highlightColor : $.color.parse(series.color).scale('a', 0.5).toString(); + if (x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max) return; - + var pointRadius = series.points.radius + series.points.lineWidth / 2; octx.lineWidth = pointRadius; - octx.strokeStyle = $.color.parse(series.color).scale('a', 0.5).toString(); - var radius = 1.5 * pointRadius, - x = axisx.p2c(x), - y = axisy.p2c(y); - + octx.strokeStyle = highlightColor; + var radius = 1.5 * pointRadius; + x = axisx.p2c(x); + y = axisy.p2c(y); + octx.beginPath(); if (series.points.symbol == "circle") octx.arc(x, y, radius, 0, 2 * Math.PI, false); @@ -2489,10 +2994,13 @@ } function drawBarHighlight(series, point) { + var highlightColor = (typeof series.highlightColor === "string") ? series.highlightColor : $.color.parse(series.color).scale('a', 0.5).toString(), + fillStyle = highlightColor, + barLeft = series.bars.align == "left" ? 0 : -series.bars.barWidth/2; + octx.lineWidth = series.bars.lineWidth; - octx.strokeStyle = $.color.parse(series.color).scale('a', 0.5).toString(); - var fillStyle = $.color.parse(series.color).scale('a', 0.5).toString(); - var barLeft = series.bars.align == "left" ? 0 : -series.bars.barWidth/2; + octx.strokeStyle = highlightColor; + drawBar(point[0], point[1], point[2] || 0, barLeft, barLeft + series.bars.barWidth, 0, function () { return fillStyle; }, series.xaxis, series.yaxis, octx, series.bars.horizontal, series.bars.lineWidth); } @@ -2505,25 +3013,27 @@ // supports a simple vertical gradient properly, so that's // what we support too var gradient = ctx.createLinearGradient(0, top, 0, bottom); - + for (var i = 0, l = spec.colors.length; i < l; ++i) { var c = spec.colors[i]; if (typeof c != "string") { var co = $.color.parse(defaultColor); if (c.brightness != null) - co = co.scale('rgb', c.brightness) + co = co.scale('rgb', c.brightness); if (c.opacity != null) co.a *= c.opacity; c = co.toString(); } gradient.addColorStop(i / (l - 1), c); } - + return gradient; } } } + // Add the plot function to the top level of the jQuery object + $.plot = function(placeholder, data, options) { //var t0 = new Date(); var plot = new Plot($(placeholder), data, options, $.plot.plugins); @@ -2531,69 +3041,21 @@ return plot; }; - $.plot.version = "0.7"; - + $.plot.version = "0.8.1"; + $.plot.plugins = []; - // returns a string with the date d formatted according to fmt - $.plot.formatDate = function(d, fmt, monthNames) { - var leftPad = function(n) { - n = "" + n; - return n.length == 1 ? "0" + n : n; - }; - - var r = []; - var escape = false, padNext = false; - var hours = d.getUTCHours(); - var isAM = hours < 12; - if (monthNames == null) - monthNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; + // Also add the plot function as a chainable property - if (fmt.search(/%p|%P/) != -1) { - if (hours > 12) { - hours = hours - 12; - } else if (hours == 0) { - hours = 12; - } - } - for (var i = 0; i < fmt.length; ++i) { - var c = fmt.charAt(i); - - if (escape) { - switch (c) { - case 'h': c = "" + hours; break; - case 'H': c = leftPad(hours); break; - case 'M': c = leftPad(d.getUTCMinutes()); break; - case 'S': c = leftPad(d.getUTCSeconds()); break; - case 'd': c = "" + d.getUTCDate(); break; - case 'm': c = "" + (d.getUTCMonth() + 1); break; - case 'y': c = "" + d.getUTCFullYear(); break; - case 'b': c = "" + monthNames[d.getUTCMonth()]; break; - case 'p': c = (isAM) ? ("" + "am") : ("" + "pm"); break; - case 'P': c = (isAM) ? ("" + "AM") : ("" + "PM"); break; - case '0': c = ""; padNext = true; break; - } - if (c && padNext) { - c = leftPad(c); - padNext = false; - } - r.push(c); - if (!padNext) - escape = false; - } - else { - if (c == "%") - escape = true; - else - r.push(c); - } - } - return r.join(""); + $.fn.plot = function(data, options) { + return this.each(function() { + $.plot(this, data, options); + }); }; - + // round to nearby lower multiple of base function floorInBase(n, base) { return base * Math.floor(n / base); } - + })(jQuery); diff --git a/htdocs/includes/jquery/plugins/flot/jquery.flot.min.js b/htdocs/includes/jquery/plugins/flot/jquery.flot.min.js old mode 100755 new mode 100644 index 4467fc5d8cd..3706512c482 --- a/htdocs/includes/jquery/plugins/flot/jquery.flot.min.js +++ b/htdocs/includes/jquery/plugins/flot/jquery.flot.min.js @@ -1,6 +1,29 @@ -/* Javascript plotting library for jQuery, v. 0.7. +/* Javascript plotting library for jQuery, version 0.8.1. + +Copyright (c) 2007-2013 IOLA and Ole Laursen. +Licensed under the MIT license. + +*/// first an inline dependency, jquery.colorhelpers.js, we inline it here +// for convenience +/* Plugin for jQuery for working with colors. * - * Released under the MIT license by IOLA, December 2007. + * Version 1.1. * - */ -(function(b){b.color={};b.color.make=function(d,e,g,f){var c={};c.r=d||0;c.g=e||0;c.b=g||0;c.a=f!=null?f:1;c.add=function(h,j){for(var k=0;k=1){return"rgb("+[c.r,c.g,c.b].join(",")+")"}else{return"rgba("+[c.r,c.g,c.b,c.a].join(",")+")"}};c.normalize=function(){function h(k,j,l){return jl?l:j)}c.r=h(0,parseInt(c.r),255);c.g=h(0,parseInt(c.g),255);c.b=h(0,parseInt(c.b),255);c.a=h(0,c.a,1);return c};c.clone=function(){return b.color.make(c.r,c.b,c.g,c.a)};return c.normalize()};b.color.extract=function(d,e){var c;do{c=d.css(e).toLowerCase();if(c!=""&&c!="transparent"){break}d=d.parent()}while(!b.nodeName(d.get(0),"body"));if(c=="rgba(0, 0, 0, 0)"){c="transparent"}return b.color.parse(c)};b.color.parse=function(c){var d,f=b.color.make;if(d=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(c)){return f(parseInt(d[1],10),parseInt(d[2],10),parseInt(d[3],10))}if(d=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(c)){return f(parseInt(d[1],10),parseInt(d[2],10),parseInt(d[3],10),parseFloat(d[4]))}if(d=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(c)){return f(parseFloat(d[1])*2.55,parseFloat(d[2])*2.55,parseFloat(d[3])*2.55)}if(d=/rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(c)){return f(parseFloat(d[1])*2.55,parseFloat(d[2])*2.55,parseFloat(d[3])*2.55,parseFloat(d[4]))}if(d=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(c)){return f(parseInt(d[1],16),parseInt(d[2],16),parseInt(d[3],16))}if(d=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(c)){return f(parseInt(d[1]+d[1],16),parseInt(d[2]+d[2],16),parseInt(d[3]+d[3],16))}var e=b.trim(c).toLowerCase();if(e=="transparent"){return f(255,255,255,0)}else{d=a[e]||[0,0,0];return f(d[0],d[1],d[2])}};var a={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]}})(jQuery);(function(c){function b(av,ai,J,af){var Q=[],O={colors:["#edc240","#afd8f8","#cb4b4b","#4da74d","#9440ed"],legend:{show:true,noColumns:1,labelFormatter:null,labelBoxBorderColor:"#ccc",container:null,position:"ne",margin:5,backgroundColor:null,backgroundOpacity:0.85},xaxis:{show:null,position:"bottom",mode:null,color:null,tickColor:null,transform:null,inverseTransform:null,min:null,max:null,autoscaleMargin:null,ticks:null,tickFormatter:null,labelWidth:null,labelHeight:null,reserveSpace:null,tickLength:null,alignTicksWithAxis:null,tickDecimals:null,tickSize:null,minTickSize:null,monthNames:null,timeformat:null,twelveHourClock:false},yaxis:{autoscaleMargin:0.02,position:"left"},xaxes:[],yaxes:[],series:{points:{show:false,radius:3,lineWidth:2,fill:true,fillColor:"#ffffff",symbol:"circle"},lines:{lineWidth:2,fill:false,fillColor:null,steps:false},bars:{show:false,lineWidth:2,barWidth:1,fill:true,fillColor:null,align:"left",horizontal:false},shadowSize:3},grid:{show:true,aboveData:false,color:"#545454",backgroundColor:null,borderColor:null,tickColor:null,labelMargin:5,axisMargin:8,borderWidth:2,minBorderMargin:null,markings:null,markingsColor:"#f4f4f4",markingsLineWidth:2,clickable:false,hoverable:false,autoHighlight:true,mouseActiveRadius:10},hooks:{}},az=null,ad=null,y=null,H=null,A=null,p=[],aw=[],q={left:0,right:0,top:0,bottom:0},G=0,I=0,h=0,w=0,ak={processOptions:[],processRawData:[],processDatapoints:[],drawSeries:[],draw:[],bindEvents:[],drawOverlay:[],shutdown:[]},aq=this;aq.setData=aj;aq.setupGrid=t;aq.draw=W;aq.getPlaceholder=function(){return av};aq.getCanvas=function(){return az};aq.getPlotOffset=function(){return q};aq.width=function(){return h};aq.height=function(){return w};aq.offset=function(){var aB=y.offset();aB.left+=q.left;aB.top+=q.top;return aB};aq.getData=function(){return Q};aq.getAxes=function(){var aC={},aB;c.each(p.concat(aw),function(aD,aE){if(aE){aC[aE.direction+(aE.n!=1?aE.n:"")+"axis"]=aE}});return aC};aq.getXAxes=function(){return p};aq.getYAxes=function(){return aw};aq.c2p=C;aq.p2c=ar;aq.getOptions=function(){return O};aq.highlight=x;aq.unhighlight=T;aq.triggerRedrawOverlay=f;aq.pointOffset=function(aB){return{left:parseInt(p[aA(aB,"x")-1].p2c(+aB.x)+q.left),top:parseInt(aw[aA(aB,"y")-1].p2c(+aB.y)+q.top)}};aq.shutdown=ag;aq.resize=function(){B();g(az);g(ad)};aq.hooks=ak;F(aq);Z(J);X();aj(ai);t();W();ah();function an(aD,aB){aB=[aq].concat(aB);for(var aC=0;aC=O.colors.length){aG=0;++aF}}var aH=0,aN;for(aG=0;aGa3.datamax&&a1!=aB){a3.datamax=a1}}c.each(m(),function(a1,a2){a2.datamin=aO;a2.datamax=aI;a2.used=false});for(aU=0;aU0&&aT[aR-aP]!=null&&aT[aR-aP]!=aT[aR]&&aT[aR-aP+1]!=aT[aR+1]){for(aN=0;aNaM){aM=a0}}if(aX.y){if(a0aV){aV=a0}}}}if(aJ.bars.show){var aY=aJ.bars.align=="left"?0:-aJ.bars.barWidth/2;if(aJ.bars.horizontal){aQ+=aY;aV+=aY+aJ.bars.barWidth}else{aK+=aY;aM+=aY+aJ.bars.barWidth}}aF(aJ.xaxis,aK,aM);aF(aJ.yaxis,aQ,aV)}c.each(m(),function(a1,a2){if(a2.datamin==aO){a2.datamin=null}if(a2.datamax==aI){a2.datamax=null}})}function j(aB,aC){var aD=document.createElement("canvas");aD.className=aC;aD.width=G;aD.height=I;if(!aB){c(aD).css({position:"absolute",left:0,top:0})}c(aD).appendTo(av);if(!aD.getContext){aD=window.G_vmlCanvasManager.initElement(aD)}aD.getContext("2d").save();return aD}function B(){G=av.width();I=av.height();if(G<=0||I<=0){throw"Invalid dimensions for plot, width = "+G+", height = "+I}}function g(aC){if(aC.width!=G){aC.width=G}if(aC.height!=I){aC.height=I}var aB=aC.getContext("2d");aB.restore();aB.save()}function X(){var aC,aB=av.children("canvas.base"),aD=av.children("canvas.overlay");if(aB.length==0||aD==0){av.html("");av.css({padding:0});if(av.css("position")=="static"){av.css("position","relative")}B();az=j(true,"base");ad=j(false,"overlay");aC=false}else{az=aB.get(0);ad=aD.get(0);aC=true}H=az.getContext("2d");A=ad.getContext("2d");y=c([ad,az]);if(aC){av.data("plot").shutdown();aq.resize();A.clearRect(0,0,G,I);y.unbind();av.children().not([az,ad]).remove()}av.data("plot",aq)}function ah(){if(O.grid.hoverable){y.mousemove(aa);y.mouseleave(l)}if(O.grid.clickable){y.click(R)}an(ak.bindEvents,[y])}function ag(){if(M){clearTimeout(M)}y.unbind("mousemove",aa);y.unbind("mouseleave",l);y.unbind("click",R);an(ak.shutdown,[y])}function r(aG){function aC(aH){return aH}var aF,aB,aD=aG.options.transform||aC,aE=aG.options.inverseTransform;if(aG.direction=="x"){aF=aG.scale=h/Math.abs(aD(aG.max)-aD(aG.min));aB=Math.min(aD(aG.max),aD(aG.min))}else{aF=aG.scale=w/Math.abs(aD(aG.max)-aD(aG.min));aF=-aF;aB=Math.max(aD(aG.max),aD(aG.min))}if(aD==aC){aG.p2c=function(aH){return(aH-aB)*aF}}else{aG.p2c=function(aH){return(aD(aH)-aB)*aF}}if(!aE){aG.c2p=function(aH){return aB+aH/aF}}else{aG.c2p=function(aH){return aE(aB+aH/aF)}}}function L(aD){var aB=aD.options,aF,aJ=aD.ticks||[],aI=[],aE,aK=aB.labelWidth,aG=aB.labelHeight,aC;function aH(aM,aL){return c('
'+aM.join("")+"
").appendTo(av)}if(aD.direction=="x"){if(aK==null){aK=Math.floor(G/(aJ.length>0?aJ.length:1))}if(aG==null){aI=[];for(aF=0;aF'+aE+"")}}if(aI.length>0){aI.push('
');aC=aH(aI,"width:10000px;");aG=aC.height();aC.remove()}}}else{if(aK==null||aG==null){for(aF=0;aF'+aE+"")}}if(aI.length>0){aC=aH(aI,"");if(aK==null){aK=aC.children().width()}if(aG==null){aG=aC.find("div.tickLabel").height()}aC.remove()}}}if(aK==null){aK=0}if(aG==null){aG=0}aD.labelWidth=aK;aD.labelHeight=aG}function au(aD){var aC=aD.labelWidth,aL=aD.labelHeight,aH=aD.options.position,aF=aD.options.tickLength,aG=O.grid.axisMargin,aJ=O.grid.labelMargin,aK=aD.direction=="x"?p:aw,aE;var aB=c.grep(aK,function(aN){return aN&&aN.options.position==aH&&aN.reserveSpace});if(c.inArray(aD,aB)==aB.length-1){aG=0}if(aF==null){aF="full"}var aI=c.grep(aK,function(aN){return aN&&aN.reserveSpace});var aM=c.inArray(aD,aI)==0;if(!aM&&aF=="full"){aF=5}if(!isNaN(+aF)){aJ+=+aF}if(aD.direction=="x"){aL+=aJ;if(aH=="bottom"){q.bottom+=aL+aG;aD.box={top:I-q.bottom,height:aL}}else{aD.box={top:q.top+aG,height:aL};q.top+=aL+aG}}else{aC+=aJ;if(aH=="left"){aD.box={left:q.left+aG,width:aC};q.left+=aC+aG}else{q.right+=aC+aG;aD.box={left:G-q.right,width:aC}}}aD.position=aH;aD.tickLength=aF;aD.box.padding=aJ;aD.innermost=aM}function U(aB){if(aB.direction=="x"){aB.box.left=q.left;aB.box.width=h}else{aB.box.top=q.top;aB.box.height=w}}function t(){var aC,aE=m();c.each(aE,function(aF,aG){aG.show=aG.options.show;if(aG.show==null){aG.show=aG.used}aG.reserveSpace=aG.show||aG.options.reserveSpace;n(aG)});allocatedAxes=c.grep(aE,function(aF){return aF.reserveSpace});q.left=q.right=q.top=q.bottom=0;if(O.grid.show){c.each(allocatedAxes,function(aF,aG){S(aG);P(aG);ap(aG,aG.ticks);L(aG)});for(aC=allocatedAxes.length-1;aC>=0;--aC){au(allocatedAxes[aC])}var aD=O.grid.minBorderMargin;if(aD==null){aD=0;for(aC=0;aC=0){aD=0}}if(aF.max==null){aB+=aH*aG;if(aB>0&&aE.datamax!=null&&aE.datamax<=0){aB=0}}}}aE.min=aD;aE.max=aB}function S(aG){var aM=aG.options;var aH;if(typeof aM.ticks=="number"&&aM.ticks>0){aH=aM.ticks}else{aH=0.3*Math.sqrt(aG.direction=="x"?G:I)}var aT=(aG.max-aG.min)/aH,aO,aB,aN,aR,aS,aQ,aI;if(aM.mode=="time"){var aJ={second:1000,minute:60*1000,hour:60*60*1000,day:24*60*60*1000,month:30*24*60*60*1000,year:365.2425*24*60*60*1000};var aK=[[1,"second"],[2,"second"],[5,"second"],[10,"second"],[30,"second"],[1,"minute"],[2,"minute"],[5,"minute"],[10,"minute"],[30,"minute"],[1,"hour"],[2,"hour"],[4,"hour"],[8,"hour"],[12,"hour"],[1,"day"],[2,"day"],[3,"day"],[0.25,"month"],[0.5,"month"],[1,"month"],[2,"month"],[3,"month"],[6,"month"],[1,"year"]];var aC=0;if(aM.minTickSize!=null){if(typeof aM.tickSize=="number"){aC=aM.tickSize}else{aC=aM.minTickSize[0]*aJ[aM.minTickSize[1]]}}for(var aS=0;aS=aC){break}}aO=aK[aS][0];aN=aK[aS][1];if(aN=="year"){aQ=Math.pow(10,Math.floor(Math.log(aT/aJ.year)/Math.LN10));aI=(aT/aJ.year)/aQ;if(aI<1.5){aO=1}else{if(aI<3){aO=2}else{if(aI<7.5){aO=5}else{aO=10}}}aO*=aQ}aG.tickSize=aM.tickSize||[aO,aN];aB=function(aX){var a2=[],a0=aX.tickSize[0],a3=aX.tickSize[1],a1=new Date(aX.min);var aW=a0*aJ[a3];if(a3=="second"){a1.setUTCSeconds(a(a1.getUTCSeconds(),a0))}if(a3=="minute"){a1.setUTCMinutes(a(a1.getUTCMinutes(),a0))}if(a3=="hour"){a1.setUTCHours(a(a1.getUTCHours(),a0))}if(a3=="month"){a1.setUTCMonth(a(a1.getUTCMonth(),a0))}if(a3=="year"){a1.setUTCFullYear(a(a1.getUTCFullYear(),a0))}a1.setUTCMilliseconds(0);if(aW>=aJ.minute){a1.setUTCSeconds(0)}if(aW>=aJ.hour){a1.setUTCMinutes(0)}if(aW>=aJ.day){a1.setUTCHours(0)}if(aW>=aJ.day*4){a1.setUTCDate(1)}if(aW>=aJ.year){a1.setUTCMonth(0)}var a5=0,a4=Number.NaN,aY;do{aY=a4;a4=a1.getTime();a2.push(a4);if(a3=="month"){if(a0<1){a1.setUTCDate(1);var aV=a1.getTime();a1.setUTCMonth(a1.getUTCMonth()+1);var aZ=a1.getTime();a1.setTime(a4+a5*aJ.hour+(aZ-aV)*a0);a5=a1.getUTCHours();a1.setUTCHours(0)}else{a1.setUTCMonth(a1.getUTCMonth()+a0)}}else{if(a3=="year"){a1.setUTCFullYear(a1.getUTCFullYear()+a0)}else{a1.setTime(a4+aW)}}}while(a4aU){aP=aU}aQ=Math.pow(10,-aP);aI=aT/aQ;if(aI<1.5){aO=1}else{if(aI<3){aO=2;if(aI>2.25&&(aU==null||aP+1<=aU)){aO=2.5;++aP}}else{if(aI<7.5){aO=5}else{aO=10}}}aO*=aQ;if(aM.minTickSize!=null&&aO0){if(aM.min==null){aG.min=Math.min(aG.min,aL[0])}if(aM.max==null&&aL.length>1){aG.max=Math.max(aG.max,aL[aL.length-1])}}aB=function(aX){var aY=[],aV,aW;for(aW=0;aW1&&/\..*0$/.test((aD[1]-aD[0]).toFixed(aE)))){aG.tickDecimals=aE}}}}aG.tickGenerator=aB;if(c.isFunction(aM.tickFormatter)){aG.tickFormatter=function(aV,aW){return""+aM.tickFormatter(aV,aW)}}else{aG.tickFormatter=aR}}function P(aF){var aH=aF.options.ticks,aG=[];if(aH==null||(typeof aH=="number"&&aH>0)){aG=aF.tickGenerator(aF)}else{if(aH){if(c.isFunction(aH)){aG=aH({min:aF.min,max:aF.max})}else{aG=aH}}}var aE,aB;aF.ticks=[];for(aE=0;aE1){aC=aD[1]}}else{aB=+aD}if(aC==null){aC=aF.tickFormatter(aB,aF)}if(!isNaN(aB)){aF.ticks.push({v:aB,label:aC})}}}function ap(aB,aC){if(aB.options.autoscaleMargin&&aC.length>0){if(aB.options.min==null){aB.min=Math.min(aB.min,aC[0].v)}if(aB.options.max==null&&aC.length>1){aB.max=Math.max(aB.max,aC[aC.length-1].v)}}}function W(){H.clearRect(0,0,G,I);var aC=O.grid;if(aC.show&&aC.backgroundColor){N()}if(aC.show&&!aC.aboveData){ac()}for(var aB=0;aBaG){var aC=aH;aH=aG;aG=aC}return{from:aH,to:aG,axis:aE}}function N(){H.save();H.translate(q.left,q.top);H.fillStyle=am(O.grid.backgroundColor,w,0,"rgba(255, 255, 255, 0)");H.fillRect(0,0,h,w);H.restore()}function ac(){var aF;H.save();H.translate(q.left,q.top);var aH=O.grid.markings;if(aH){if(c.isFunction(aH)){var aK=aq.getAxes();aK.xmin=aK.xaxis.min;aK.xmax=aK.xaxis.max;aK.ymin=aK.yaxis.min;aK.ymax=aK.yaxis.max;aH=aH(aK)}for(aF=0;aFaC.axis.max||aI.toaI.axis.max){continue}aC.from=Math.max(aC.from,aC.axis.min);aC.to=Math.min(aC.to,aC.axis.max);aI.from=Math.max(aI.from,aI.axis.min);aI.to=Math.min(aI.to,aI.axis.max);if(aC.from==aC.to&&aI.from==aI.to){continue}aC.from=aC.axis.p2c(aC.from);aC.to=aC.axis.p2c(aC.to);aI.from=aI.axis.p2c(aI.from);aI.to=aI.axis.p2c(aI.to);if(aC.from==aC.to||aI.from==aI.to){H.beginPath();H.strokeStyle=aD.color||O.grid.markingsColor;H.lineWidth=aD.lineWidth||O.grid.markingsLineWidth;H.moveTo(aC.from,aI.from);H.lineTo(aC.to,aI.to);H.stroke()}else{H.fillStyle=aD.color||O.grid.markingsColor;H.fillRect(aC.from,aI.to,aC.to-aC.from,aI.from-aI.to)}}}var aK=m(),aM=O.grid.borderWidth;for(var aE=0;aEaB.max||(aQ=="full"&&aM>0&&(aO==aB.min||aO==aB.max))){continue}if(aB.direction=="x"){aN=aB.p2c(aO);aJ=aQ=="full"?-w:aQ;if(aB.position=="top"){aJ=-aJ}}else{aL=aB.p2c(aO);aP=aQ=="full"?-h:aQ;if(aB.position=="left"){aP=-aP}}if(H.lineWidth==1){if(aB.direction=="x"){aN=Math.floor(aN)+0.5}else{aL=Math.floor(aL)+0.5}}H.moveTo(aN,aL);H.lineTo(aN+aP,aL+aJ)}H.stroke()}if(aM){H.lineWidth=aM;H.strokeStyle=O.grid.borderColor;H.strokeRect(-aM/2,-aM/2,h+aM,w+aM)}H.restore()}function k(){av.find(".tickLabels").remove();var aG=['
'];var aJ=m();for(var aD=0;aD');for(var aE=0;aEaC.max){continue}var aK={},aI;if(aC.direction=="x"){aI="center";aK.left=Math.round(q.left+aC.p2c(aH.v)-aC.labelWidth/2);if(aC.position=="bottom"){aK.top=aF.top+aF.padding}else{aK.bottom=I-(aF.top+aF.height-aF.padding)}}else{aK.top=Math.round(q.top+aC.p2c(aH.v)-aC.labelHeight/2);if(aC.position=="left"){aK.right=G-(aF.left+aF.width-aF.padding);aI="right"}else{aK.left=aF.left+aF.padding;aI="left"}}aK.width=aC.labelWidth;var aB=["position:absolute","text-align:"+aI];for(var aL in aK){aB.push(aL+":"+aK[aL]+"px")}aG.push('
'+aH.label+"
")}aG.push("
")}aG.push("");av.append(aG.join(""))}function d(aB){if(aB.lines.show){at(aB)}if(aB.bars.show){e(aB)}if(aB.points.show){ao(aB)}}function at(aE){function aD(aP,aQ,aI,aU,aT){var aV=aP.points,aJ=aP.pointsize,aN=null,aM=null;H.beginPath();for(var aO=aJ;aO=aR&&aS>aT.max){if(aR>aT.max){continue}aL=(aT.max-aS)/(aR-aS)*(aK-aL)+aL;aS=aT.max}else{if(aR>=aS&&aR>aT.max){if(aS>aT.max){continue}aK=(aT.max-aS)/(aR-aS)*(aK-aL)+aL;aR=aT.max}}if(aL<=aK&&aL=aK&&aL>aU.max){if(aK>aU.max){continue}aS=(aU.max-aL)/(aK-aL)*(aR-aS)+aS;aL=aU.max}else{if(aK>=aL&&aK>aU.max){if(aL>aU.max){continue}aR=(aU.max-aL)/(aK-aL)*(aR-aS)+aS;aK=aU.max}}if(aL!=aN||aS!=aM){H.moveTo(aU.p2c(aL)+aQ,aT.p2c(aS)+aI)}aN=aK;aM=aR;H.lineTo(aU.p2c(aK)+aQ,aT.p2c(aR)+aI)}H.stroke()}function aF(aI,aQ,aP){var aW=aI.points,aV=aI.pointsize,aN=Math.min(Math.max(0,aP.min),aP.max),aX=0,aU,aT=false,aM=1,aL=0,aR=0;while(true){if(aV>0&&aX>aW.length+aV){break}aX+=aV;var aZ=aW[aX-aV],aK=aW[aX-aV+aM],aY=aW[aX],aJ=aW[aX+aM];if(aT){if(aV>0&&aZ!=null&&aY==null){aR=aX;aV=-aV;aM=2;continue}if(aV<0&&aX==aL+aV){H.fill();aT=false;aV=-aV;aM=1;aX=aL=aR+aV;continue}}if(aZ==null||aY==null){continue}if(aZ<=aY&&aZ=aY&&aZ>aQ.max){if(aY>aQ.max){continue}aK=(aQ.max-aZ)/(aY-aZ)*(aJ-aK)+aK;aZ=aQ.max}else{if(aY>=aZ&&aY>aQ.max){if(aZ>aQ.max){continue}aJ=(aQ.max-aZ)/(aY-aZ)*(aJ-aK)+aK;aY=aQ.max}}if(!aT){H.beginPath();H.moveTo(aQ.p2c(aZ),aP.p2c(aN));aT=true}if(aK>=aP.max&&aJ>=aP.max){H.lineTo(aQ.p2c(aZ),aP.p2c(aP.max));H.lineTo(aQ.p2c(aY),aP.p2c(aP.max));continue}else{if(aK<=aP.min&&aJ<=aP.min){H.lineTo(aQ.p2c(aZ),aP.p2c(aP.min));H.lineTo(aQ.p2c(aY),aP.p2c(aP.min));continue}}var aO=aZ,aS=aY;if(aK<=aJ&&aK=aP.min){aZ=(aP.min-aK)/(aJ-aK)*(aY-aZ)+aZ;aK=aP.min}else{if(aJ<=aK&&aJ=aP.min){aY=(aP.min-aK)/(aJ-aK)*(aY-aZ)+aZ;aJ=aP.min}}if(aK>=aJ&&aK>aP.max&&aJ<=aP.max){aZ=(aP.max-aK)/(aJ-aK)*(aY-aZ)+aZ;aK=aP.max}else{if(aJ>=aK&&aJ>aP.max&&aK<=aP.max){aY=(aP.max-aK)/(aJ-aK)*(aY-aZ)+aZ;aJ=aP.max}}if(aZ!=aO){H.lineTo(aQ.p2c(aO),aP.p2c(aK))}H.lineTo(aQ.p2c(aZ),aP.p2c(aK));H.lineTo(aQ.p2c(aY),aP.p2c(aJ));if(aY!=aS){H.lineTo(aQ.p2c(aY),aP.p2c(aJ));H.lineTo(aQ.p2c(aS),aP.p2c(aJ))}}}H.save();H.translate(q.left,q.top);H.lineJoin="round";var aG=aE.lines.lineWidth,aB=aE.shadowSize;if(aG>0&&aB>0){H.lineWidth=aB;H.strokeStyle="rgba(0,0,0,0.1)";var aH=Math.PI/18;aD(aE.datapoints,Math.sin(aH)*(aG/2+aB/2),Math.cos(aH)*(aG/2+aB/2),aE.xaxis,aE.yaxis);H.lineWidth=aB/2;aD(aE.datapoints,Math.sin(aH)*(aG/2+aB/4),Math.cos(aH)*(aG/2+aB/4),aE.xaxis,aE.yaxis)}H.lineWidth=aG;H.strokeStyle=aE.color;var aC=ae(aE.lines,aE.color,0,w);if(aC){H.fillStyle=aC;aF(aE.datapoints,aE.xaxis,aE.yaxis)}if(aG>0){aD(aE.datapoints,0,0,aE.xaxis,aE.yaxis)}H.restore()}function ao(aE){function aH(aN,aM,aU,aK,aS,aT,aQ,aJ){var aR=aN.points,aI=aN.pointsize;for(var aL=0;aLaT.max||aOaQ.max){continue}H.beginPath();aP=aT.p2c(aP);aO=aQ.p2c(aO)+aK;if(aJ=="circle"){H.arc(aP,aO,aM,0,aS?Math.PI:Math.PI*2,false)}else{aJ(H,aP,aO,aM,aS)}H.closePath();if(aU){H.fillStyle=aU;H.fill()}H.stroke()}}H.save();H.translate(q.left,q.top);var aG=aE.points.lineWidth,aC=aE.shadowSize,aB=aE.points.radius,aF=aE.points.symbol;if(aG>0&&aC>0){var aD=aC/2;H.lineWidth=aD;H.strokeStyle="rgba(0,0,0,0.1)";aH(aE.datapoints,aB,null,aD+aD/2,true,aE.xaxis,aE.yaxis,aF);H.strokeStyle="rgba(0,0,0,0.2)";aH(aE.datapoints,aB,null,aD/2,true,aE.xaxis,aE.yaxis,aF)}H.lineWidth=aG;H.strokeStyle=aE.color;aH(aE.datapoints,aB,ae(aE.points,aE.color),0,false,aE.xaxis,aE.yaxis,aF);H.restore()}function E(aN,aM,aV,aI,aQ,aF,aD,aL,aK,aU,aR,aC){var aE,aT,aJ,aP,aG,aB,aO,aH,aS;if(aR){aH=aB=aO=true;aG=false;aE=aV;aT=aN;aP=aM+aI;aJ=aM+aQ;if(aTaL.max||aPaK.max){return}if(aEaL.max){aT=aL.max;aB=false}if(aJaK.max){aP=aK.max;aO=false}aE=aL.p2c(aE);aJ=aK.p2c(aJ);aT=aL.p2c(aT);aP=aK.p2c(aP);if(aD){aU.beginPath();aU.moveTo(aE,aJ);aU.lineTo(aE,aP);aU.lineTo(aT,aP);aU.lineTo(aT,aJ);aU.fillStyle=aD(aJ,aP);aU.fill()}if(aC>0&&(aG||aB||aO||aH)){aU.beginPath();aU.moveTo(aE,aJ+aF);if(aG){aU.lineTo(aE,aP+aF)}else{aU.moveTo(aE,aP+aF)}if(aO){aU.lineTo(aT,aP+aF)}else{aU.moveTo(aT,aP+aF)}if(aB){aU.lineTo(aT,aJ+aF)}else{aU.moveTo(aT,aJ+aF)}if(aH){aU.lineTo(aE,aJ+aF)}else{aU.moveTo(aE,aJ+aF)}aU.stroke()}}function e(aD){function aC(aJ,aI,aL,aG,aK,aN,aM){var aO=aJ.points,aF=aJ.pointsize;for(var aH=0;aH")}aH.push("
");aF=true}if(aN){aJ=aN(aJ,aM)}aH.push('")}if(aF){aH.push("")}if(aH.length==0){return}var aL='
'; print dol_htmlentitiesbr($conf->global->MAIN_MOTD); From 33ed654745bbd829a47047f2a84bdc576402b2a9 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 3 Jul 2013 03:40:59 +0200 Subject: [PATCH 06/48] New: Upgrade jquery flot library to 0.8.1 --- ChangeLog | 1 + .../jquery/plugins/flot/{API.txt => API.md} | 935 +++++--- .../jquery/plugins/flot/CONTRIBUTING.md | 99 + .../jquery/plugins/flot/{FAQ.txt => FAQ.md} | 43 +- .../includes/jquery/plugins/flot/LICENSE.txt | 2 +- htdocs/includes/jquery/plugins/flot/Makefile | 21 +- htdocs/includes/jquery/plugins/flot/NEWS.md | 893 ++++++++ htdocs/includes/jquery/plugins/flot/NEWS.txt | 508 ----- .../plugins/flot/{PLUGINS.txt => PLUGINS.md} | 90 +- htdocs/includes/jquery/plugins/flot/README.md | 110 + .../includes/jquery/plugins/flot/README.txt | 90 - .../includes/jquery/plugins/flot/excanvas.js | 131 +- .../jquery/plugins/flot/excanvas.min.js | 2 +- .../plugins/flot/jquery.colorhelpers.js | 0 .../plugins/flot/jquery.colorhelpers.min.js | 22 +- .../jquery/plugins/flot/jquery.flot.canvas.js | 345 +++ .../plugins/flot/jquery.flot.canvas.min.js | 28 + .../plugins/flot/jquery.flot.categories.js | 190 ++ .../flot/jquery.flot.categories.min.js | 44 + .../plugins/flot/jquery.flot.crosshair.js | 89 +- .../plugins/flot/jquery.flot.crosshair.min.js | 60 +- .../plugins/flot/jquery.flot.errorbars.js | 353 +++ .../plugins/flot/jquery.flot.errorbars.min.js | 63 + .../plugins/flot/jquery.flot.fillbetween.js | 365 +-- .../flot/jquery.flot.fillbetween.min.js | 31 +- .../jquery/plugins/flot/jquery.flot.image.js | 79 +- .../plugins/flot/jquery.flot.image.min.js | 54 +- .../jquery/plugins/flot/jquery.flot.js | 1986 ++++++++++------- .../jquery/plugins/flot/jquery.flot.min.js | 31 +- .../plugins/flot/jquery.flot.navigate.js | 168 +- .../plugins/flot/jquery.flot.navigate.min.js | 87 +- .../jquery/plugins/flot/jquery.flot.pie.js | 1091 ++++----- .../plugins/flot/jquery.flot.pie.min.js | 57 +- .../jquery/plugins/flot/jquery.flot.resize.js | 24 +- .../plugins/flot/jquery.flot.resize.min.js | 20 +- .../plugins/flot/jquery.flot.selection.js | 122 +- .../plugins/flot/jquery.flot.selection.min.js | 80 +- .../jquery/plugins/flot/jquery.flot.stack.js | 60 +- .../plugins/flot/jquery.flot.stack.min.js | 37 +- .../jquery/plugins/flot/jquery.flot.symbol.js | 21 +- .../plugins/flot/jquery.flot.symbol.min.js | 15 +- .../plugins/flot/jquery.flot.threshold.js | 109 +- .../plugins/flot/jquery.flot.threshold.min.js | 44 +- .../jquery/plugins/flot/jquery.flot.time.js | 431 ++++ .../plugins/flot/jquery.flot.time.min.js | 9 + 45 files changed, 6221 insertions(+), 2819 deletions(-) rename htdocs/includes/jquery/plugins/flot/{API.txt => API.md} (62%) mode change 100755 => 100644 create mode 100644 htdocs/includes/jquery/plugins/flot/CONTRIBUTING.md rename htdocs/includes/jquery/plugins/flot/{FAQ.txt => FAQ.md} (62%) mode change 100755 => 100644 mode change 100755 => 100644 htdocs/includes/jquery/plugins/flot/LICENSE.txt mode change 100755 => 100644 htdocs/includes/jquery/plugins/flot/Makefile create mode 100644 htdocs/includes/jquery/plugins/flot/NEWS.md delete mode 100755 htdocs/includes/jquery/plugins/flot/NEWS.txt rename htdocs/includes/jquery/plugins/flot/{PLUGINS.txt => PLUGINS.md} (74%) mode change 100755 => 100644 create mode 100644 htdocs/includes/jquery/plugins/flot/README.md delete mode 100755 htdocs/includes/jquery/plugins/flot/README.txt mode change 100755 => 100644 htdocs/includes/jquery/plugins/flot/excanvas.js mode change 100755 => 100644 htdocs/includes/jquery/plugins/flot/excanvas.min.js mode change 100755 => 100644 htdocs/includes/jquery/plugins/flot/jquery.colorhelpers.js mode change 100755 => 100644 htdocs/includes/jquery/plugins/flot/jquery.colorhelpers.min.js create mode 100644 htdocs/includes/jquery/plugins/flot/jquery.flot.canvas.js create mode 100644 htdocs/includes/jquery/plugins/flot/jquery.flot.canvas.min.js create mode 100644 htdocs/includes/jquery/plugins/flot/jquery.flot.categories.js create mode 100644 htdocs/includes/jquery/plugins/flot/jquery.flot.categories.min.js mode change 100755 => 100644 htdocs/includes/jquery/plugins/flot/jquery.flot.crosshair.js mode change 100755 => 100644 htdocs/includes/jquery/plugins/flot/jquery.flot.crosshair.min.js create mode 100644 htdocs/includes/jquery/plugins/flot/jquery.flot.errorbars.js create mode 100644 htdocs/includes/jquery/plugins/flot/jquery.flot.errorbars.min.js mode change 100755 => 100644 htdocs/includes/jquery/plugins/flot/jquery.flot.fillbetween.js mode change 100755 => 100644 htdocs/includes/jquery/plugins/flot/jquery.flot.fillbetween.min.js mode change 100755 => 100644 htdocs/includes/jquery/plugins/flot/jquery.flot.image.js mode change 100755 => 100644 htdocs/includes/jquery/plugins/flot/jquery.flot.image.min.js mode change 100755 => 100644 htdocs/includes/jquery/plugins/flot/jquery.flot.js mode change 100755 => 100644 htdocs/includes/jquery/plugins/flot/jquery.flot.min.js mode change 100755 => 100644 htdocs/includes/jquery/plugins/flot/jquery.flot.navigate.js mode change 100755 => 100644 htdocs/includes/jquery/plugins/flot/jquery.flot.navigate.min.js mode change 100755 => 100644 htdocs/includes/jquery/plugins/flot/jquery.flot.pie.js mode change 100755 => 100644 htdocs/includes/jquery/plugins/flot/jquery.flot.pie.min.js mode change 100755 => 100644 htdocs/includes/jquery/plugins/flot/jquery.flot.resize.js mode change 100755 => 100644 htdocs/includes/jquery/plugins/flot/jquery.flot.resize.min.js mode change 100755 => 100644 htdocs/includes/jquery/plugins/flot/jquery.flot.selection.js mode change 100755 => 100644 htdocs/includes/jquery/plugins/flot/jquery.flot.selection.min.js mode change 100755 => 100644 htdocs/includes/jquery/plugins/flot/jquery.flot.stack.js mode change 100755 => 100644 htdocs/includes/jquery/plugins/flot/jquery.flot.stack.min.js mode change 100755 => 100644 htdocs/includes/jquery/plugins/flot/jquery.flot.symbol.js mode change 100755 => 100644 htdocs/includes/jquery/plugins/flot/jquery.flot.symbol.min.js mode change 100755 => 100644 htdocs/includes/jquery/plugins/flot/jquery.flot.threshold.js mode change 100755 => 100644 htdocs/includes/jquery/plugins/flot/jquery.flot.threshold.min.js create mode 100644 htdocs/includes/jquery/plugins/flot/jquery.flot.time.js create mode 100644 htdocs/includes/jquery/plugins/flot/jquery.flot.time.min.js diff --git a/ChangeLog b/ChangeLog index 4a2e7625cd2..30c741222d4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -37,6 +37,7 @@ For developers: - New: Show version of client lib used by mysql drivers. - New: Add function to get content of an url (using all dolibarr setup like timeout, proxies...) - New: Upgrade lib of TCPDF to 6.0 +- New: Upgrade jquery flot library to 0.8.1 - New: Add property "hidden" into module descriptors to allow to hide a module according to some dynamic conditions. - New: Add option MAIN_MOTD_SETUPPAGE to add a content onto setup page. Also content for diff --git a/htdocs/includes/jquery/plugins/flot/API.txt b/htdocs/includes/jquery/plugins/flot/API.md old mode 100755 new mode 100644 similarity index 62% rename from htdocs/includes/jquery/plugins/flot/API.txt rename to htdocs/includes/jquery/plugins/flot/API.md index 8a8dbc23d22..5027b518ff3 --- a/htdocs/includes/jquery/plugins/flot/API.txt +++ b/htdocs/includes/jquery/plugins/flot/API.md @@ -1,19 +1,28 @@ -Flot Reference --------------- +# Flot Reference # Consider a call to the plot function: - var plot = $.plot(placeholder, data, options) +```js +var plot = $.plot(placeholder, data, options) +``` The placeholder is a jQuery object or DOM element or jQuery expression that the plot will be put into. This placeholder needs to have its -width and height set as explained in the README (go read that now if +width and height set as explained in the [README](README.md) (go read that now if you haven't, it's short). The plot will modify some properties of the placeholder so it's recommended you simply pass in a div that you don't use for anything else. Make sure you check any fancy styling you apply to the div, e.g. background images have been reported to be a problem on IE 7. +The plot function can also be used as a jQuery chainable property. This form +naturally can't return the plot object directly, but you can still access it +via the 'plot' data key, like this: + +```js +var plot = $("#placeholder").plot(data, options).data("plot"); +``` + The format of the data is documented below, as is the available options. The plot object returned from the call has some methods you can call. These are documented separately below. @@ -23,21 +32,26 @@ objects you pass in to the plot function or get out of it since they're not necessarily deep-copied. -Data Format ------------ +## Data Format ## The data is an array of data series: - [ series1, series2, ... ] +```js +[ series1, series2, ... ] +``` A series can either be raw data or an object with properties. The raw data format is an array of points: - [ [x1, y1], [x2, y2], ... ] +```js +[ [x1, y1], [x2, y2], ... ] +``` E.g. - [ [1, 3], [2, 14.01], [3.5, 3.14] ] +```js +[ [1, 3], [2, 14.01], [3.5, 3.14] ] +``` Note that to simplify the internal logic in Flot both the x and y values must be numbers (even if specifying time series, see below for @@ -58,7 +72,8 @@ area/bar (defaults to 0). The format of a single series object is as follows: - { +```js +{ color: color or number data: rawdata label: string @@ -70,16 +85,20 @@ The format of a single series object is as follows: clickable: boolean hoverable: boolean shadowSize: number - } + highlightColor: color or number +} +``` You don't have to specify any of them except the data, the rest are options that will get default values. Typically you'd only specify label and data, like this: - { +```js +{ label: "y = 3", data: [[0, 3], [10, 3]] - } +} +``` The label is used for the legend, if you don't specify one, the series will not show up in the legend. @@ -108,30 +127,34 @@ override the default options for the plot for that data series. Here's a complete example of a simple data specification: - [ { label: "Foo", data: [ [10, 1], [17, -14], [30, 5] ] }, - { label: "Bar", data: [ [11, 13], [19, 11], [30, -7] ] } ] +```js +[ { label: "Foo", data: [ [10, 1], [17, -14], [30, 5] ] }, + { label: "Bar", data: [ [11, 13], [19, 11], [30, -7] ] } +] +``` -Plot Options ------------- +## Plot Options ## All options are completely optional. They are documented individually below, to change them you just specify them in an object, e.g. - var options = { +```js +var options = { series: { - lines: { show: true }, - points: { show: true } + lines: { show: true }, + points: { show: true } } - }; - - $.plot(placeholder, data, options); +}; + +$.plot(placeholder, data, options); +``` -Customizing the legend -====================== +## Customizing the legend ## - legend: { +```js +legend: { show: boolean labelFormatter: null or (fn: string, series object -> string) labelBoxBorderColor: color @@ -141,7 +164,9 @@ Customizing the legend backgroundColor: null or color backgroundOpacity: number between 0 and 1 container: null or jQuery object/DOM element/jQuery expression - } + sorted: null/false, true, "ascending", "descending", "reverse", or a comparator +} +``` The legend is generated as a table with the data series labels and small label boxes with the color of the series. If you want to format @@ -149,10 +174,15 @@ the labels in some way, e.g. make them to links, you can pass in a function for "labelFormatter". Here's an example that makes them clickable: - labelFormatter: function(label, series) { +```js +labelFormatter: function(label, series) { // series is the series object for the label return '' + label + ''; - } +} +``` + +To prevent a series from showing up in the legend, simply have the function +return null. "noColumns" is the number of columns to divide the legend table into. "position" specifies the overall placement of the legend within the @@ -167,18 +197,39 @@ specify "container" as a jQuery object/expression to put the legend table into. The "position" and "margin" etc. options will then be ignored. Note that Flot will overwrite the contents of the container. +Legend entries appear in the same order as their series by default. If "sorted" +is "reverse" then they appear in the opposite order from their series. To sort +them alphabetically, you can specify true, "ascending" or "descending", where +true and "ascending" are equivalent. -Customizing the axes -==================== +You can also provide your own comparator function that accepts two +objects with "label" and "color" properties, and returns zero if they +are equal, a positive value if the first is greater than the second, +and a negative value if the first is less than the second. - xaxis, yaxis: { +```js +sorted: function(a, b) { + // sort alphabetically in ascending order + return a.label == b.label ? 0 : ( + a.label > b.label ? 1 : -1 + ) +} +``` + + +## Customizing the axes ## + +```js +xaxis, yaxis: { show: null or true/false position: "bottom" or "top" or "left" or "right" - mode: null or "time" + mode: null or "time" ("time" requires jquery.flot.time.js plugin) + timezone: null, "browser" or timezone (only makes sense for mode: "time") color: null or color spec tickColor: null or color spec - + font: null or font spec object + min: null or number max: null or number autoscaleMargin: null or number @@ -186,7 +237,7 @@ Customizing the axes transform: null or fn: number -> number inverseTransform: null or fn: number -> number - ticks: null or number or ticks array or (fn: range -> ticks array) + ticks: null or number or ticks array or (fn: axis -> ticks array) tickSize: number or array minTickSize: number or array tickFormatter: (fn: number, object -> string) or string @@ -199,7 +250,8 @@ Customizing the axes tickLength: null or number alignTicksWithAxis: null or number - } +} +``` All axes have the same kind of options. The following describes how to configure one axis, see below for what to do if you've got more than @@ -213,14 +265,50 @@ false. The "position" option specifies where the axis is placed, bottom or top for x axes, left or right for y axes. The "mode" option determines how the data is interpreted, the default of null means as decimal -numbers. Use "time" for time series data, see the time series data -section. +numbers. Use "time" for time series data; see the time series data +section. The time plugin (jquery.flot.time.js) is required for time +series support. -The "color" option determines the color of the labels and ticks for -the axis (default is the grid color). For more fine-grained control -you can also set the color of the ticks separately with "tickColor" -(otherwise it's autogenerated as the base color with some -transparency). +The "color" option determines the color of the line and ticks for the axis, and +defaults to the grid color with transparency. For more fine-grained control you +can also set the color of the ticks separately with "tickColor". + +You can customize the font and color used to draw the axis tick labels with CSS +or directly via the "font" option. When "font" is null - the default - each +tick label is given the 'flot-tick-label' class. For compatibility with Flot +0.7 and earlier the labels are also given the 'tickLabel' class, but this is +deprecated and scheduled to be removed with the release of version 1.0.0. + +To enable more granular control over styles, labels are divided between a set +of text containers, with each holding the labels for one axis. These containers +are given the classes 'flot-[x|y]-axis', and 'flot-[x|y]#-axis', where '#' is +the number of the axis when there are multiple axes. For example, the x-axis +labels for a simple plot with only a single x-axis might look like this: + +```html +
+
January 2013
+ ... +
+``` + +For direct control over label styles you can also provide "font" as an object +with this format: + +```js +{ + size: 11, + lineHeight: 13, + style: "italic", + weight: "bold", + family: "sans-serif", + variant: "small-caps", + color: "#545454" +} +``` + +The size and lineHeight must be expressed in pixels; CSS units such as 'em' +or 'smaller' are not allowed. The options "min"/"max" are the precise minimum/maximum value on the scale. If you don't specify either of them, a value will automatically @@ -245,18 +333,22 @@ other means. When Flot draws the plot, each value is first put through the transform function. Here's an example, the x axis can be turned into a natural logarithm axis with the following code: - xaxis: { +```js +xaxis: { transform: function (v) { return Math.log(v); }, inverseTransform: function (v) { return Math.exp(v); } - } +} +``` Similarly, for reversing the y axis so the values appear in inverse order: - - yaxis: { + +```js +yaxis: { transform: function (v) { return -v; }, inverseTransform: function (v) { return -v; } - } +} +``` Note that for finding extrema, Flot assumes that the transform function does not reorder values (it should be monotone). @@ -291,11 +383,15 @@ see the next section. If you want to completely override the tick algorithm, you can specify an array for "ticks", either like this: - ticks: [0, 1.2, 2.4] +```js +ticks: [0, 1.2, 2.4] +``` Or like this where the labels are also customized: - ticks: [[0, "zero"], [1.2, "one mark"], [2.4, "two marks"]] +```js +ticks: [[0, "zero"], [1.2, "one mark"], [2.4, "two marks"]] +``` You can mix the two if you like. @@ -305,16 +401,17 @@ min and max and should return a ticks array. Here's a simplistic tick generator that spits out intervals of pi, suitable for use on the x axis for trigonometric functions: - function piTickGenerator(axis) { +```js +function piTickGenerator(axis) { var res = [], i = Math.floor(axis.min / Math.PI); do { - var v = i * Math.PI; - res.push([v, i + "\u03c0"]); - ++i; + var v = i * Math.PI; + res.push([v, i + "\u03c0"]); + ++i; } while (v < axis.max); - return res; - } +} +``` You can control how the ticks look like with "tickDecimals", the number of decimals to display (default is auto-detected). @@ -324,9 +421,11 @@ provide a function to "tickFormatter". The function is passed two parameters, the tick value and an axis object with information, and should return a string. The default formatter looks like this: - function formatter(val, axis) { +```js +function formatter(val, axis) { return val.toFixed(axis.tickDecimals); - } +} +``` The axis object has "min" and "max" with the range of the axis, "tickDecimals" with the number of decimals to round the value to and @@ -334,14 +433,16 @@ The axis object has "min" and "max" with the range of the axis, by the automatic axis scaling algorithm (or specified by you). Here's an example of a custom formatter: - function suffixFormatter(val, axis) { +```js +function suffixFormatter(val, axis) { if (val > 1000000) - return (val / 1000000).toFixed(axis.tickDecimals) + " MB"; + return (val / 1000000).toFixed(axis.tickDecimals) + " MB"; else if (val > 1000) - return (val / 1000).toFixed(axis.tickDecimals) + " kB"; + return (val / 1000).toFixed(axis.tickDecimals) + " kB"; else - return val.toFixed(axis.tickDecimals) + " B"; - } + return val.toFixed(axis.tickDecimals) + " B"; +} +``` "labelWidth" and "labelHeight" specifies a fixed size of the tick labels in pixels. They're useful in case you need to align several @@ -364,8 +465,7 @@ ends. The trade-off is that the forced ticks won't necessarily be at natural places. -Multiple axes -============= +## Multiple axes ## If you need more than one x axis or y axis, you need to specify for each data series which axis they are to use, as described under the @@ -375,16 +475,20 @@ that a series should be plotted against the second y axis. To actually configure that axis, you can't use the xaxis/yaxis options directly - instead there are two arrays in the options: - xaxes: [] - yaxes: [] +```js +xaxes: [] +yaxes: [] +``` Here's an example of configuring a single x axis and two y axes (we can leave options of the first y axis empty as the defaults are fine): - { +```js +{ xaxes: [ { position: "top" } ], yaxes: [ { }, { position: "right", min: 20 } ] - } +} +``` The arrays get their default values from the xaxis/yaxis settings, so say you want to have all y axes start at zero, you can simply specify @@ -395,9 +499,11 @@ either accept an xaxis/yaxis parameter to specify which axis number to use (starting from 1), or lets you specify the coordinate directly as x2/x3/... or x2axis/x3axis/... instead of "x" or "xaxis". - -Time series data -================ + +## Time series data ## + +Please note that it is now required to include the time plugin, +jquery.flot.time.js, for time series support. Time series are a bit more difficult than scalar data because calendars don't follow a simple base 10 system. For many cases, Flot @@ -413,35 +519,51 @@ in milliseconds, so remember to multiply by 1000! You can see a timestamp like this - alert((new Date()).getTime()) +```js +alert((new Date()).getTime()) +``` -Normally you want the timestamps to be displayed according to a -certain time zone, usually the time zone in which the data has been -produced. However, Flot always displays timestamps according to UTC. -It has to as the only alternative with core Javascript is to interpret -the timestamps according to the time zone that the visitor is in, -which means that the ticks will shift unpredictably with the time zone -and daylight savings of each visitor. +There are different schools of thought when it comes to diplay of +timestamps. Many will want the timestamps to be displayed according to +a certain time zone, usually the time zone in which the data has been +produced. Some want the localized experience, where the timestamps are +displayed according to the local time of the visitor. Flot supports +both. Optionally you can include a third-party library to get +additional timezone support. -So given that there's no good support for custom time zones in -Javascript, you'll have to take care of this server-side. +Default behavior is that Flot always displays timestamps according to +UTC. The reason being that the core Javascript Date object does not +support other fixed time zones. Often your data is at another time +zone, so it may take a little bit of tweaking to work around this +limitation. The easiest way to think about it is to pretend that the data production time zone is UTC, even if it isn't. So if you have a datapoint at 2002-02-20 08:00, you can generate a timestamp for eight o'clock UTC even if it really happened eight o'clock UTC+0200. -In PHP you can get an appropriate timestamp with -'strtotime("2002-02-20 UTC") * 1000', in Python with -'calendar.timegm(datetime_object.timetuple()) * 1000', in .NET with -something like: +In PHP you can get an appropriate timestamp with: - public static int GetJavascriptTimestamp(System.DateTime input) - { +```php +strtotime("2002-02-20 UTC") * 1000 +``` + +In Python you can get it with something like: + +```python +calendar.timegm(datetime_object.timetuple()) * 1000 +``` + +In .NET you can get it with something like: + +```aspx +public static int GetJavascriptTimestamp(System.DateTime input) +{ System.TimeSpan span = new System.TimeSpan(System.DateTime.Parse("1/1/1970").Ticks); System.DateTime time = input.Subtract(span); return (long)(time.Ticks / 10000); - } +} +``` Javascript also has some support for parsing date strings, so it is possible to generate the timestamps manually client-side. @@ -454,6 +576,18 @@ programming environments have some means of getting the timezone offset for a specific date (note that you need to get the offset for each individual timestamp to account for daylight savings). +The alternative with core Javascript is to interpret the timestamps +according to the time zone that the visitor is in, which means that +the ticks will shift with the time zone and daylight savings of each +visitor. This behavior is enabled by setting the axis option +"timezone" to the value "browser". + +If you need more time zone functionality than this, there is still +another option. If you include the "timezone-js" library + in the page and set axis.timezone +to a value recognized by said library, Flot will use timezone-js to +interpret the timestamps according to that time zone. + Once you've gotten the timestamps into the data and specified "time" as the axis mode, Flot will automatically generate relevant ticks and format them. As always, you can tweak the ticks via the "ticks" option @@ -463,104 +597,135 @@ Date objects. Tick generation and formatting can also be controlled separately through the following axis options: - minTickSize: array - timeformat: null or format string - monthNames: null or array of size 12 of strings - twelveHourClock: boolean +```js +minTickSize: array +timeformat: null or format string +monthNames: null or array of size 12 of strings +dayNames: null or array of size 7 of strings +twelveHourClock: boolean +``` Here "timeformat" is a format string to use. You might use it like this: - xaxis: { - mode: "time" - timeformat: "%y/%m/%d" - } - -This will result in tick labels like "2000/12/24". The following -specifiers are supported +```js +xaxis: { + mode: "time", + timeformat: "%Y/%m/%d" +} +``` - %h: hours - %H: hours (left-padded with a zero) - %M: minutes (left-padded with a zero) - %S: seconds (left-padded with a zero) - %d: day of month (1-31), use %0d for zero-padding - %m: month (1-12), use %0m for zero-padding - %y: year (four digits) - %b: month name (customizable) - %p: am/pm, additionally switches %h/%H to 12 hour instead of 24 - %P: AM/PM (uppercase version of %p) +This will result in tick labels like "2000/12/24". A subset of the +standard strftime specifiers are supported (plus the nonstandard %q): -Inserting a zero like %0m or %0d means that the specifier will be -left-padded with a zero if it's only single-digit. So %y-%0m-%0d -results in unambigious ISO timestamps like 2007-05-10 (for May 10th). +```js +%a: weekday name (customizable) +%b: month name (customizable) +%d: day of month, zero-padded (01-31) +%e: day of month, space-padded ( 1-31) +%H: hours, 24-hour time, zero-padded (00-23) +%I: hours, 12-hour time, zero-padded (01-12) +%m: month, zero-padded (01-12) +%M: minutes, zero-padded (00-59) +%q: quarter (1-4) +%S: seconds, zero-padded (00-59) +%y: year (two digits) +%Y: year (four digits) +%p: am/pm +%P: AM/PM (uppercase version of %p) +%w: weekday as number (0-6, 0 being Sunday) +``` + +Flot 0.8 switched from %h to the standard %H hours specifier. The %h specifier +is still available, for backwards-compatibility, but is deprecated and +scheduled to be removed permanently with the release of version 1.0. You can customize the month names with the "monthNames" option. For instance, for Danish you might specify: - monthNames: ["jan", "feb", "mar", "apr", "maj", "jun", "jul", "aug", "sep", "okt", "nov", "dec"] +```js +monthNames: ["jan", "feb", "mar", "apr", "maj", "jun", "jul", "aug", "sep", "okt", "nov", "dec"] +``` + +Similarly you can customize the weekday names with the "dayNames" +option. An example in French: + +```js +dayNames: ["dim", "lun", "mar", "mer", "jeu", "ven", "sam"] +``` If you set "twelveHourClock" to true, the autogenerated timestamps -will use 12 hour AM/PM timestamps instead of 24 hour. - -The format string and month names are used by a very simple built-in -format function that takes a date object, a format string (and -optionally an array of month names) and returns the formatted string. -If needed, you can access it as $.plot.formatDate(date, formatstring, -monthNames) or even replace it with another more advanced function -from a date library if you're feeling adventurous. +will use 12 hour AM/PM timestamps instead of 24 hour. This only +applies if you have not set "timeformat". Use the "%I" and "%p" or +"%P" options if you want to build your own format string with 12-hour +times. + +If the Date object has a strftime property (and it is a function), it +will be used instead of the built-in formatter. Thus you can include +a strftime library such as http://hacks.bluesmoon.info/strftime/ for +more powerful date/time formatting. If everything else fails, you can control the formatting by specifying a custom tick formatter function as usual. Here's a simple example which will format December 24 as 24/12: - tickFormatter: function (val, axis) { +```js +tickFormatter: function (val, axis) { var d = new Date(val); return d.getUTCDate() + "/" + (d.getUTCMonth() + 1); - } +} +``` Note that for the time mode "tickSize" and "minTickSize" are a bit special in that they are arrays on the form "[value, unit]" where unit is one of "second", "minute", "hour", "day", "month" and "year". So you can specify - minTickSize: [1, "month"] +```js +minTickSize: [1, "month"] +``` to get a tick interval size of at least 1 month and correspondingly, if axis.tickSize is [2, "day"] in the tick formatter, the ticks have been produced with two days in-between. +## Customizing the data series ## -Customizing the data series -=========================== - - series: { +```js +series: { lines, points, bars: { - show: boolean - lineWidth: number - fill: boolean or number - fillColor: null or color/gradient + show: boolean + lineWidth: number + fill: boolean or number + fillColor: null or color/gradient + } + + lines, bars: { + zero: boolean } points: { - radius: number - symbol: "circle" or function + radius: number + symbol: "circle" or function } bars: { - barWidth: number - align: "left" or "center" - horizontal: boolean + barWidth: number + align: "left", "right" or "center" + horizontal: boolean } lines: { - steps: boolean + steps: boolean } shadowSize: number - } - - colors: [ color1, color2, ... ] + highlightColor: color or number +} + +colors: [ color1, color2, ... ] +``` The options inside "series: {}" are copied to each of the series. So you can specify that all series should have bars by putting it in the @@ -575,12 +740,14 @@ lines: { show: false }). You can specify the various types independently of each other, and Flot will happily draw each of them in turn (this is probably only useful for lines and points), e.g. - var options = { +```js +var options = { series: { - lines: { show: true, fill: true, fillColor: "rgba(255, 255, 255, 0.8)" }, - points: { show: true, fill: false } + lines: { show: true, fill: true, fillColor: "rgba(255, 255, 255, 0.8)" }, + points: { show: true, fill: false } } - }; +}; +``` "lineWidth" is the thickness of the line or outline in pixels. You can set it to 0 to prevent a line or outline from being drawn; this will @@ -600,12 +767,19 @@ the y axis if "horizontal" is true), contrary to most other measures that are specified in pixels. For instance, for time series the unit is milliseconds so 24 * 60 * 60 * 1000 produces bars with the width of a day. "align" specifies whether a bar should be left-aligned -(default) or centered on top of the value it represents. When -"horizontal" is on, the bars are drawn horizontally, i.e. from the y -axis instead of the x axis; note that the bar end points are still +(default), right-aligned or centered on top of the value it represents. +When "horizontal" is on, the bars are drawn horizontally, i.e. from the +y axis instead of the x axis; note that the bar end points are still defined in the same way so you'll probably want to swap the coordinates if you've been plotting vertical bars first. +Area and bar charts normally start from zero, regardless of the data's range. +This is because they convey information through size, and starting from a +different value would distort their meaning. In cases where the fill is purely +for decorative purposes, however, "zero" allows you to override this behavior. +It defaults to true for filled lines and bars; setting it to false tells the +series to use the same automatic scaling as an un-filled line. + For lines, "steps" specifies whether two adjacent data points are connected with a straight (possibly diagonal) line or with first a horizontal and then a vertical line. Note that this transforms the @@ -615,13 +789,15 @@ For points, you can specify the radius and the symbol. The only built-in symbol type is circles, for other types you can use a plugin or define them yourself by specifying a callback: - function cross(ctx, x, y, radius, shadow) { - var size = radius * Math.sqrt(Math.PI) / 2; - ctx.moveTo(x - size, y - size); - ctx.lineTo(x + size, y + size); - ctx.moveTo(x - size, y + size); - ctx.lineTo(x + size, y - size); - } +```js +function cross(ctx, x, y, radius, shadow) { + var size = radius * Math.sqrt(Math.PI) / 2; + ctx.moveTo(x - size, y - size); + ctx.lineTo(x + size, y + size); + ctx.moveTo(x - size, y + size); + ctx.lineTo(x + size, y - size); +} +``` The parameters are the drawing context, x and y coordinates of the center of the point, a radius which corresponds to what the circle @@ -634,35 +810,46 @@ ensures that all symbols have approximately the same visual weight. "shadowSize" is the default size of shadows in pixels. Set it to 0 to remove shadows. +"highlightColor" is the default color of the translucent overlay used +to highlight the series when the mouse hovers over it. + The "colors" array specifies a default color theme to get colors for the data series from. You can specify as many colors as you like, like this: - colors: ["#d18b2c", "#dba255", "#919733"] +```js +colors: ["#d18b2c", "#dba255", "#919733"] +``` If there are more data series than colors, Flot will try to generate extra colors by lightening and darkening colors in the theme. -Customizing the grid -==================== +## Customizing the grid ## - grid: { +```js +grid: { show: boolean aboveData: boolean color: color backgroundColor: color/gradient or null + margin: number or margin object labelMargin: number axisMargin: number markings: array of markings or (fn: axes -> array of markings) - borderWidth: number - borderColor: color or null + borderWidth: number or object with "top", "right", "bottom" and "left" properties with different widths + borderColor: color or null or object with "top", "right", "bottom" and "left" properties with different colors minBorderMargin: number or null clickable: boolean hoverable: boolean autoHighlight: boolean mouseActiveRadius: number - } +} + +interaction: { + redrawOverlayInterval: number or -1 +} +``` The grid is the thing with the axes and a number of ticks. Many of the things in the grid are configured under the individual axes, but not @@ -675,18 +862,32 @@ You can turn off the whole grid including tick labels by setting "show" to false. "aboveData" determines whether the grid is drawn above the data or below (below is default). +"margin" is the space in pixels between the canvas edge and the grid, +which can be either a number or an object with individual margins for +each side, in the form: + +```js +margin: { + top: top margin in pixels + left: left margin in pixels + bottom: bottom margin in pixels + right: right margin in pixels +} +``` + "labelMargin" is the space in pixels between tick labels and axis line, and "axisMargin" is the space in pixels between axes when there -are two next to each other. Note that you can style the tick labels -with CSS, e.g. to change the color. They have class "tickLabel". +are two next to each other. "borderWidth" is the width of the border around the plot. Set it to 0 -to disable the border. You can also set "borderColor" if you want the -border to have a different color than the grid lines. -"minBorderMargin" controls the default minimum margin around the -border - it's used to make sure that points aren't accidentally -clipped by the canvas edge so by default the value is computed from -the point radius. +to disable the border. Set it to an object with "top", "right", +"bottom" and "left" properties to use different widths. You can +also set "borderColor" if you want the border to have a different color +than the grid lines. Set it to an object with "top", "right", "bottom" +and "left" properties to use different colors. "minBorderMargin" controls +the default minimum margin around the border - it's used to make sure +that points aren't accidentally clipped by the canvas edge so by default +the value is computed from the point radius. "markings" is used to draw simple lines and rectangular areas in the background of the plot. You can either specify an array of ranges on @@ -698,7 +899,9 @@ the axes for the plot in an object as the first parameter. You can set the color of markings by specifying "color" in the ranges object. Here's an example array: - markings: [ { xaxis: { from: 0, to: 2 }, yaxis: { from: 10, to: 10 }, color: "#bb0000" }, ... ] +```js +markings: [ { xaxis: { from: 0, to: 2 }, yaxis: { from: 10, to: 10 }, color: "#bb0000" }, ... ] +``` If you leave out one of the values, that value is assumed to go to the border of the plot. So for example if you only specify { xaxis: { @@ -707,20 +910,23 @@ bottom of the plot in the x range 0-2. A line is drawn if from and to are the same, e.g. - markings: [ { yaxis: { from: 1, to: 1 } }, ... ] +```js +markings: [ { yaxis: { from: 1, to: 1 } }, ... ] +``` would draw a line parallel to the x axis at y = 1. You can control the line width with "lineWidth" in the range object. An example function that makes vertical stripes might look like this: - markings: function (axes) { +```js +markings: function (axes) { var markings = []; for (var x = Math.floor(axes.xaxis.min); x < axes.xaxis.max; x += 2) - markings.push({ xaxis: { from: x, to: x + 1 } }); + markings.push({ xaxis: { from: x, to: x + 1 } }); return markings; - } - +} +``` If you set "clickable" to true, the plot will listen for click events on the plot area and fire a "plotclick" event on the placeholder with @@ -737,32 +943,38 @@ the highlight/unhighlight plot methods described elsewhere. You can use "plotclick" and "plothover" events like this: - $.plot($("#placeholder"), [ d ], { grid: { clickable: true } }); +```js +$.plot($("#placeholder"), [ d ], { grid: { clickable: true } }); - $("#placeholder").bind("plotclick", function (event, pos, item) { - alert("You clicked at " + pos.x + ", " + pos.y); - // axis coordinates for other axes, if present, are in pos.x2, pos.x3, ... - // if you need global screen coordinates, they are pos.pageX, pos.pageY +$("#placeholder").bind("plotclick", function (event, pos, item) { + alert("You clicked at " + pos.x + ", " + pos.y); + // axis coordinates for other axes, if present, are in pos.x2, pos.x3, ... + // if you need global screen coordinates, they are pos.pageX, pos.pageY - if (item) { - highlight(item.series, item.datapoint); - alert("You clicked a point!"); - } - }); + if (item) { + highlight(item.series, item.datapoint); + alert("You clicked a point!"); + } +}); +``` The item object in this example is either null or a nearby object on the form: - item: { - datapoint: the point, e.g. [0, 2] - dataIndex: the index of the point in the data array - series: the series object - seriesIndex: the index of the series - pageX, pageY: the global screen coordinates of the point - } +```js +item: { + datapoint: the point, e.g. [0, 2] + dataIndex: the index of the point in the data array + series: the series object + seriesIndex: the index of the series + pageX, pageY: the global screen coordinates of the point +} +``` For instance, if you have specified the data like this - $.plot($("#placeholder"), [ { label: "Foo", data: [[0, 10], [7, 3]] } ], ...); +```js +$.plot($("#placeholder"), [ { label: "Foo", data: [[0, 10], [7, 3]] } ], ...); +``` and the mouse is near the point (7, 3), "datapoint" is [7, 3], "dataIndex" will be 1, "series" is a normalized series object with @@ -782,51 +994,66 @@ radius, Flot chooses the closest item. For bars, the top-most bar If you want to disable interactivity for a specific data series, you can set "hoverable" and "clickable" to false in the options for that -series, like this { data: [...], label: "Foo", clickable: false }. +series, like this: + +```js +{ data: [...], label: "Foo", clickable: false } +``` + +"redrawOverlayInterval" specifies the maximum time to delay a redraw +of interactive things (this works as a rate limiting device). The +default is capped to 60 frames per second. You can set it to -1 to +disable the rate limiting. -Specifying gradients -==================== +## Specifying gradients ## A gradient is specified like this: - { colors: [ color1, color2, ... ] } +```js +{ colors: [ color1, color2, ... ] } +``` For instance, you might specify a background on the grid going from black to gray like this: - grid: { +```js +grid: { backgroundColor: { colors: ["#000", "#999"] } - } +} +``` For the series you can specify the gradient as an object that specifies the scaling of the brightness and the opacity of the series color, e.g. - { colors: [{ opacity: 0.8 }, { brightness: 0.6, opacity: 0.8 } ] } +```js +{ colors: [{ opacity: 0.8 }, { brightness: 0.6, opacity: 0.8 } ] } +``` where the first color simply has its alpha scaled, whereas the second is also darkened. For instance, for bars the following makes the bars gradually disappear, without outline: - bars: { - show: true, - lineWidth: 0, - fill: true, - fillColor: { colors: [ { opacity: 0.8 }, { opacity: 0.1 } ] } - } - +```js +bars: { + show: true, + lineWidth: 0, + fill: true, + fillColor: { colors: [ { opacity: 0.8 }, { opacity: 0.1 } ] } +} +``` + Flot currently only supports vertical gradients drawn from top to bottom because that's what works with IE. -Plot Methods ------------- +## Plot Methods ## The Plot object returned from the plot function has some methods you can call: - - highlight(series, datapoint) + - highlight(series, datapoint) Highlight a specific datapoint in the data series. You can either specify the actual objects, e.g. if you got them from a @@ -834,8 +1061,7 @@ can call: highlight(1, 3) to highlight the fourth point in the second series (remember, zero-based indexing). - - - unhighlight(series, datapoint) or unhighlight() + - unhighlight(series, datapoint) or unhighlight() Remove the highlighting of the point, same parameters as highlight. @@ -843,8 +1069,7 @@ can call: If you call unhighlight with no parameters, e.g. as plot.unhighlight(), all current highlights are removed. - - - setData(data) + - setData(data) You can use this to reset the data used. Note that axis scaling, ticks, legend etc. will not be recomputed (use setupGrid() to do @@ -856,8 +1081,7 @@ can call: for large datasets, almost all the time is consumed in draw() plotting the data so in this case don't bother. - - - setupGrid() + - setupGrid() Recalculate and set axis scaling, ticks, legend etc. @@ -866,12 +1090,12 @@ can call: the labels and the legend, but not the actual tick lines because they're drawn on the canvas. You need to call draw() to get the canvas redrawn. - - - draw() + + - draw() Redraws the plot canvas. - - triggerRedrawOverlay() + - triggerRedrawOverlay() Schedules an update of an overlay canvas used for drawing interactive things like a selection and point highlights. This @@ -880,41 +1104,42 @@ can call: redraws (e.g. from a mousemove). You can get to the overlay by setting up a drawOverlay hook. - - width()/height() + - width()/height() Gets the width and height of the plotting area inside the grid. This is smaller than the canvas or placeholder dimensions as some extra space is needed (e.g. for labels). - - offset() + - offset() Returns the offset of the plotting area inside the grid relative to the document, useful for instance for calculating mouse positions (event.pageX/Y minus this offset is the pixel position inside the plot). - - pointOffset({ x: xpos, y: ypos }) + - pointOffset({ x: xpos, y: ypos }) Returns the calculated offset of the data point at (x, y) in data - space within the placeholder div. If you are working with multiple axes, you - can specify the x and y axis references, e.g. + space within the placeholder div. If you are working with multiple + axes, you can specify the x and y axis references, e.g. + ```js o = pointOffset({ x: xpos, y: ypos, xaxis: 2, yaxis: 3 }) // o.left and o.top now contains the offset within the div + ```` - - resize() + - resize() Tells Flot to resize the drawing canvas to the size of the placeholder. You need to run setupGrid() and draw() afterwards as canvas resizing is a destructive operation. This is used internally by the resize plugin. - - shutdown() + - shutdown() Cleans up any event handlers Flot has currently registered. This is used internally. - There are also some members that let you peek inside the internal workings of Flot which is useful in some cases. Note that if you change something in the objects returned, you're changing the objects used by @@ -927,9 +1152,11 @@ Flot to keep track of its state, so be careful. options. So for instance to find out what color Flot has assigned to the data series, you could do this: - var series = plot.getData(); - for (var i = 0; i < series.length; ++i) + ```js + var series = plot.getData(); + for (var i = 0; i < series.length; ++i) alert(series[i].color); + ``` A notable other interesting field besides color is datapoints which has a field "points" with the normalized data points in a @@ -983,8 +1210,7 @@ Flot to keep track of its state, so be careful. setupGrid() or triggerRedrawOverlay() to see the change. -Hooks -===== +## Hooks ## In addition to the public methods, the Plot object also has some hooks that can be used to modify the plotting process. You can install a @@ -1017,6 +1243,7 @@ You can add them through the "hooks" option, and they are also available after the plot is constructed as the "hooks" attribute on the returned plot object, e.g. +```js // define a simple draw hook function hellohook(plot, canvascontext) { alert("hello!"); }; @@ -1025,6 +1252,7 @@ plot object, e.g. // we can now find it again in plot.hooks.draw[0] unless a plugin // has added other hooks +``` The available hooks are described below. All hook callbacks get the plot object as first parameter. You can find some examples of defined @@ -1032,147 +1260,183 @@ hooks in the plugins bundled with Flot. - processOptions [phase 1] - function(plot, options) + ```function(plot, options)``` - Called after Flot has parsed and merged options. Useful in the - instance where customizations beyond simple merging of default - values is needed. A plugin might use it to detect that it has been - enabled and then turn on or off other options. + Called after Flot has parsed and merged options. Useful in the + instance where customizations beyond simple merging of default + values is needed. A plugin might use it to detect that it has been + enabled and then turn on or off other options. - processRawData [phase 3] - function(plot, series, data, datapoints) + ```function(plot, series, data, datapoints)``` - Called before Flot copies and normalizes the raw data for the given - series. If the function fills in datapoints.points with normalized - points and sets datapoints.pointsize to the size of the points, - Flot will skip the copying/normalization step for this series. + Called before Flot copies and normalizes the raw data for the given + series. If the function fills in datapoints.points with normalized + points and sets datapoints.pointsize to the size of the points, + Flot will skip the copying/normalization step for this series. - In any case, you might be interested in setting datapoints.format, - an array of objects for specifying how a point is normalized and - how it interferes with axis scaling. + In any case, you might be interested in setting datapoints.format, + an array of objects for specifying how a point is normalized and + how it interferes with axis scaling. It accepts the following options: - The default format array for points is something along the lines of: + ```js + { + x, y: boolean, + number: boolean, + required: boolean, + defaultValue: value, + autoscale: boolean + } + ``` - [ - { x: true, number: true, required: true }, - { y: true, number: true, required: true } - ] + "x" and "y" specify whether the value is plotted against the x or y axis, + and is currently used only to calculate axis min-max ranges. The default + format array, for example, looks like this: - The first object means that for the first coordinate it should be - taken into account when scaling the x axis, that it must be a - number, and that it is required - so if it is null or cannot be - converted to a number, the whole point will be zeroed out with - nulls. Beyond these you can also specify "defaultValue", a value to - use if the coordinate is null. This is for instance handy for bars - where one can omit the third coordinate (the bottom of the bar) - which then defaults to 0. + ```js + [ + { x: true, number: true, required: true }, + { y: true, number: true, required: true } + ] + ``` + This indicates that a point, i.e. [0, 25], consists of two values, with the + first being plotted on the x axis and the second on the y axis. + + If "number" is true, then the value must be numeric, and is set to null if + it cannot be converted to a number. + + "defaultValue" provides a fallback in case the original value is null. This + is for instance handy for bars, where one can omit the third coordinate + (the bottom of the bar), which then defaults to zero. + + If "required" is true, then the value must exist (be non-null) for the + point as a whole to be valid. If no value is provided, then the entire + point is cleared out with nulls, turning it into a gap in the series. + + "autoscale" determines whether the value is considered when calculating an + automatic min-max range for the axes that the value is plotted against. - processDatapoints [phase 3] - function(plot, series, datapoints) - - Called after normalization of the given series but before finding - min/max of the data points. This hook is useful for implementing data - transformations. "datapoints" contains the normalized data points in - a flat array as datapoints.points with the size of a single point - given in datapoints.pointsize. Here's a simple transform that - multiplies all y coordinates by 2: + ```function(plot, series, datapoints)``` - function multiply(plot, series, datapoints) { - var points = datapoints.points, ps = datapoints.pointsize; - for (var i = 0; i < points.length; i += ps) - points[i + 1] *= 2; - } + Called after normalization of the given series but before finding + min/max of the data points. This hook is useful for implementing data + transformations. "datapoints" contains the normalized data points in + a flat array as datapoints.points with the size of a single point + given in datapoints.pointsize. Here's a simple transform that + multiplies all y coordinates by 2: - Note that you must leave datapoints in a good condition as Flot - doesn't check it or do any normalization on it afterwards. + ```js + function multiply(plot, series, datapoints) { + var points = datapoints.points, ps = datapoints.pointsize; + for (var i = 0; i < points.length; i += ps) + points[i + 1] *= 2; + } + ``` + Note that you must leave datapoints in a good condition as Flot + doesn't check it or do any normalization on it afterwards. + + - processOffset [phase 4] + + ```function(plot, offset)``` + + Called after Flot has initialized the plot's offset, but before it + draws any axes or plot elements. This hook is useful for customizing + the margins between the grid and the edge of the canvas. "offset" is + an object with attributes "top", "bottom", "left" and "right", + corresponding to the margins on the four sides of the plot. + + - drawBackground [phase 5] + + ```function(plot, canvascontext)``` + + Called before all other drawing operations. Used to draw backgrounds + or other custom elements before the plot or axes have been drawn. - drawSeries [phase 5] - function(plot, canvascontext, series) + ```function(plot, canvascontext, series)``` + + Hook for custom drawing of a single series. Called just before the + standard drawing routine has been called in the loop that draws + each series. - Hook for custom drawing of a single series. Called just before the - standard drawing routine has been called in the loop that draws - each series. - - - draw [phase 5] - function(plot, canvascontext) - - Hook for drawing on the canvas. Called after the grid is drawn - (unless it's disabled or grid.aboveData is set) and the series have - been plotted (in case any points, lines or bars have been turned - on). For examples of how to draw things, look at the source code. - - + ```function(plot, canvascontext)``` + + Hook for drawing on the canvas. Called after the grid is drawn + (unless it's disabled or grid.aboveData is set) and the series have + been plotted (in case any points, lines or bars have been turned + on). For examples of how to draw things, look at the source code. + - bindEvents [phase 6] - function(plot, eventHolder) + ```function(plot, eventHolder)``` - Called after Flot has setup its event handlers. Should set any - necessary event handlers on eventHolder, a jQuery object with the - canvas, e.g. + Called after Flot has setup its event handlers. Should set any + necessary event handlers on eventHolder, a jQuery object with the + canvas, e.g. - function (plot, eventHolder) { - eventHolder.mousedown(function (e) { - alert("You pressed the mouse at " + e.pageX + " " + e.pageY); - }); - } + ```js + function (plot, eventHolder) { + eventHolder.mousedown(function (e) { + alert("You pressed the mouse at " + e.pageX + " " + e.pageY); + }); + } + ``` - Interesting events include click, mousemove, mouseup/down. You can - use all jQuery events. Usually, the event handlers will update the - state by drawing something (add a drawOverlay hook and call - triggerRedrawOverlay) or firing an externally visible event for - user code. See the crosshair plugin for an example. + Interesting events include click, mousemove, mouseup/down. You can + use all jQuery events. Usually, the event handlers will update the + state by drawing something (add a drawOverlay hook and call + triggerRedrawOverlay) or firing an externally visible event for + user code. See the crosshair plugin for an example. - Currently, eventHolder actually contains both the static canvas - used for the plot itself and the overlay canvas used for - interactive features because some versions of IE get the stacking - order wrong. The hook only gets one event, though (either for the - overlay or for the static canvas). - - Note that custom plot events generated by Flot are not generated on - eventHolder, but on the div placeholder supplied as the first - argument to the plot call. You can get that with - plot.getPlaceholder() - that's probably also the one you should use - if you need to fire a custom event. + Currently, eventHolder actually contains both the static canvas + used for the plot itself and the overlay canvas used for + interactive features because some versions of IE get the stacking + order wrong. The hook only gets one event, though (either for the + overlay or for the static canvas). + Note that custom plot events generated by Flot are not generated on + eventHolder, but on the div placeholder supplied as the first + argument to the plot call. You can get that with + plot.getPlaceholder() - that's probably also the one you should use + if you need to fire a custom event. - drawOverlay [phase 7] - function (plot, canvascontext) + ```function (plot, canvascontext)``` - The drawOverlay hook is used for interactive things that need a - canvas to draw on. The model currently used by Flot works the way - that an extra overlay canvas is positioned on top of the static - canvas. This overlay is cleared and then completely redrawn - whenever something interesting happens. This hook is called when - the overlay canvas is to be redrawn. - - "canvascontext" is the 2D context of the overlay canvas. You can - use this to draw things. You'll most likely need some of the - metrics computed by Flot, e.g. plot.width()/plot.height(). See the - crosshair plugin for an example. + The drawOverlay hook is used for interactive things that need a + canvas to draw on. The model currently used by Flot works the way + that an extra overlay canvas is positioned on top of the static + canvas. This overlay is cleared and then completely redrawn + whenever something interesting happens. This hook is called when + the overlay canvas is to be redrawn. + "canvascontext" is the 2D context of the overlay canvas. You can + use this to draw things. You'll most likely need some of the + metrics computed by Flot, e.g. plot.width()/plot.height(). See the + crosshair plugin for an example. - shutdown [phase 8] - function (plot, eventHolder) + ```function (plot, eventHolder)``` - Run when plot.shutdown() is called, which usually only happens in - case a plot is overwritten by a new plot. If you're writing a - plugin that adds extra DOM elements or event handlers, you should - add a callback to clean up after you. Take a look at the section in - PLUGINS.txt for more info. + Run when plot.shutdown() is called, which usually only happens in + case a plot is overwritten by a new plot. If you're writing a + plugin that adds extra DOM elements or event handlers, you should + add a callback to clean up after you. Take a look at the section in + PLUGINS.txt for more info. -Plugins -------- +## Plugins ## Plugins extend the functionality of Flot. To use a plugin, simply include its Javascript file after Flot in the HTML page. @@ -1195,7 +1459,6 @@ See the PLUGINS.txt file for details on how to write a plugin. As the above description hints, it's actually pretty easy. -Version number --------------- +## Version number ## -The version number of Flot is available in $.plot.version. +The version number of Flot is available in ```$.plot.version```. diff --git a/htdocs/includes/jquery/plugins/flot/CONTRIBUTING.md b/htdocs/includes/jquery/plugins/flot/CONTRIBUTING.md new file mode 100644 index 00000000000..eef971bfb89 --- /dev/null +++ b/htdocs/includes/jquery/plugins/flot/CONTRIBUTING.md @@ -0,0 +1,99 @@ +## Contributing to Flot ## + +We welcome all contributions, but following these guidelines results in less +work for us, and a faster and better response. + +### Issues ### + +Issues are not a way to ask general questions about Flot. If you see unexpected +behavior but are not 100% certain that it is a bug, please try posting to the +[forum](http://groups.google.com/group/flot-graphs) first, and confirm that +what you see is really a Flot problem before creating a new issue for it. + +When reporting a bug, please include a working demonstration of the problem, if +possible, or at least a clear description of the options you're using and the +environment (browser and version, jQuery version, other libraries) that you're +running under. + +If you have suggestions for new features, or changes to existing ones, we'd +love to hear them! Please submit each suggestion as a separate new issue. + +If you would like to work on an existing issue, please make sure it is not +already assigned to someone else. If an issue is assigned to someone, that +person has already started working on it. So, pick unassigned issues to prevent +duplicated efforts. + +### Pull Requests ### + +To make merging as easy as possible, please keep these rules in mind: + + 1. Divide larger changes into a series of small, logical commits with + descriptive messages. + + 2. Format your code according to the style guidelines below. + + 3. Submit new features or architectural changes to the -work branch + for the next major release. Submit bug fixes to the master branch. + + 4. Rebase, if necessary, before submitting your pull request, to reduce the + work we need to do to merge it. + +### Flot Style Guidelines ### + +Flot follows the [jQuery Core Style Guidelines](http://docs.jquery.com/JQuery_Core_Style_Guidelines), +with the following updates and exceptions: + +#### Spacing #### + +Do not add horizontal space around parameter lists, loop definitions, or +array/object indices. For example: + +```js + for ( var i = 0; i < data.length; i++ ) { // This block is wrong! + if ( data[ i ] > 1 ) { + data[ i ] = 2; + } + } + + for (var i = 0; i < data.length; i++) { // This block is correct! + if (data[i] > 1) { + data[i] = 2; + } + } +``` + +#### Comments #### + +Use // for all comments except the header at the top of a file or inline +include. + +All // comment blocks should have an empty line above *and* below them. For +example: + +```js + var a = 5; + + // We're going to loop here + // TODO: Make this loop faster, better, stronger! + + for (var x = 0; x < 10; x++) {} +``` + +#### Wrapping #### + +Block comments should be wrapped at 80 characters. + +Code should attempt to wrap at 80 characters, but may run longer if wrapping +would hurt readability more than having to scroll horizontally. This is a +judgement call made on a situational basis. + +Statements containing complex logic should not be wrapped arbitrarily if they +do not exceed 80 characters. For example: + +```js + if (a == 1 && // This block is wrong! + b == 2 && + c == 3) {} + + if (a == 1 && b == 2 && c == 3) {} // This block is correct! +``` diff --git a/htdocs/includes/jquery/plugins/flot/FAQ.txt b/htdocs/includes/jquery/plugins/flot/FAQ.md old mode 100755 new mode 100644 similarity index 62% rename from htdocs/includes/jquery/plugins/flot/FAQ.txt rename to htdocs/includes/jquery/plugins/flot/FAQ.md index e02b7618881..9131e043985 --- a/htdocs/includes/jquery/plugins/flot/FAQ.txt +++ b/htdocs/includes/jquery/plugins/flot/FAQ.md @@ -1,12 +1,12 @@ -Frequently asked questions --------------------------- +## Frequently asked questions ## -Q: How much data can Flot cope with? +#### How much data can Flot cope with? #### -A: Flot will happily draw everything you send to it so the answer +Flot will happily draw everything you send to it so the answer depends on the browser. The excanvas emulation used for IE (built with VML) makes IE by far the slowest browser so be sure to test with that -if IE users are in your target group. +if IE users are in your target group (for large plots in IE, you can +also check out Flashcanvas which may be faster). 1000 points is not a problem, but as soon as you start having more points than the pixel width, you should probably start thinking about @@ -14,35 +14,36 @@ downsampling/aggregation as this is near the resolution limit of the chart anyway. If you downsample server-side, you also save bandwidth. -Q: Flot isn't working when I'm using JSON data as source! +#### Flot isn't working when I'm using JSON data as source! #### -A: Actually, Flot loves JSON data, you just got the format wrong. +Actually, Flot loves JSON data, you just got the format wrong. Double check that you're not inputting strings instead of numbers, like [["0", "-2.13"], ["5", "4.3"]]. This is most common mistake, and the error might not show up immediately because Javascript can do some conversion automatically. -Q: Can I export the graph? +#### Can I export the graph? #### -A: This is a limitation of the canvas technology. There's a hook in -the canvas object for getting an image out, but you won't get the tick -labels. And it's not likely to be supported by IE. At this point, your -best bet is probably taking a screenshot, e.g. with PrtScn. +You can grab the image rendered by the canvas element used by Flot +as a PNG or JPEG (remember to set a background). Note that it won't +include anything not drawn in the canvas (such as the legend). And it +doesn't work with excanvas which uses VML, but you could try +Flashcanvas. -Q: The bars are all tiny in time mode? +#### The bars are all tiny in time mode? #### -A: It's not really possible to determine the bar width automatically. +It's not really possible to determine the bar width automatically. So you have to set the width with the barWidth option which is NOT in pixels, but in the units of the x axis (or the y axis for horizontal bars). For time mode that's milliseconds so the default value of 1 makes the bars 1 millisecond wide. -Q: Can I use Flot with libraries like Mootools or Prototype? +#### Can I use Flot with libraries like Mootools or Prototype? #### -A: Yes, Flot supports it out of the box and it's easy! Just use jQuery +Yes, Flot supports it out of the box and it's easy! Just use jQuery instead of $, e.g. call jQuery.plot instead of $.plot and use jQuery(something) instead of $(something). As a convenience, you can put in a DOM element for the graph placeholder where the examples and @@ -54,13 +55,11 @@ libraries, see the documentation in jQuery ("Using jQuery with other libraries") for details. -Q: Flot doesn't work with [insert name of Javascript UI framework]! +#### Flot doesn't work with [insert name of Javascript UI framework]! #### -A: The only non-standard thing used by Flot is the canvas tag; -otherwise it is simply a series of absolute positioned divs within the -placeholder tag you put in. If this is not working, it's probably -because the framework you're using is doing something weird with the -DOM, or you're using it the wrong way. +Flot is using standard HTML to make charts. If this is not working, +it's probably because the framework you're using is doing something +weird with the DOM or with the CSS that is interfering with Flot. A common problem is that there's display:none on a container until the user does something. Many tab widgets work this way, and there's diff --git a/htdocs/includes/jquery/plugins/flot/LICENSE.txt b/htdocs/includes/jquery/plugins/flot/LICENSE.txt old mode 100755 new mode 100644 index 07d5b2094d1..67f46256079 --- a/htdocs/includes/jquery/plugins/flot/LICENSE.txt +++ b/htdocs/includes/jquery/plugins/flot/LICENSE.txt @@ -1,4 +1,4 @@ -Copyright (c) 2007-2009 IOLA and Ole Laursen +Copyright (c) 2007-2013 IOLA and Ole Laursen Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation diff --git a/htdocs/includes/jquery/plugins/flot/Makefile b/htdocs/includes/jquery/plugins/flot/Makefile old mode 100755 new mode 100644 index b300f1a476a..c3aba861c50 --- a/htdocs/includes/jquery/plugins/flot/Makefile +++ b/htdocs/includes/jquery/plugins/flot/Makefile @@ -1,9 +1,12 @@ -# Makefile for generating minified files - -.PHONY: all - -# we cheat and process all .js files instead of an exhaustive list -all: $(patsubst %.js,%.min.js,$(filter-out %.min.js,$(wildcard *.js))) - -%.min.js: %.js - yui-compressor $< -o $@ +# Makefile for generating minified files + +.PHONY: all + +# we cheat and process all .js files instead of an exhaustive list +all: $(patsubst %.js,%.min.js,$(filter-out %.min.js,$(wildcard *.js))) + +%.min.js: %.js + yui-compressor $< -o $@ + +test: + ./node_modules/.bin/jshint *jquery.flot.js diff --git a/htdocs/includes/jquery/plugins/flot/NEWS.md b/htdocs/includes/jquery/plugins/flot/NEWS.md new file mode 100644 index 00000000000..da6ecb4df2b --- /dev/null +++ b/htdocs/includes/jquery/plugins/flot/NEWS.md @@ -0,0 +1,893 @@ +## Flot 0.8.1 ## + +### Bug fixes ### + + - Fixed a regression in the time plugin, introduced in 0.8, that caused dates + to align to the minute rather than to the highest appropriate unit. This + caused many x-axes in 0.8 to have different ticks than they did in 0.7. + (reported by Tom Sheppard, patch by Daniel Shapiro, issue #1017, pull + request #1023) + + - Fixed a regression in text rendering, introduced in 0.8, that caused axis + labels with the same text as another label on the same axis to disappear. + More generally, it's again possible to have the same text in two locations. + (issue #1032) + + - Fixed a regression in text rendering, introduced in 0.8, where axis labels + were no longer assigned an explicit width, and their text could not wrap. + (reported by sabregreen, issue #1019) + + - Fixed a regression in the pie plugin, introduced in 0.8, that prevented it + from accepting data in the format '[[x, y]]'. + (patch by Nicolas Morel, pull request #1024) + + - The 'zero' series option and 'autoscale' format option are no longer + ignored when the series contains a null value. + (reported by Daniel Shapiro, issue #1033) + + - Avoid triggering the time-mode plugin exception when there are zero series. + (reported by Daniel Rothig, patch by Mark Raymond, issue #1016) + + - When a custom color palette has fewer colors than the default palette, Flot + no longer fills out the colors with the remainder of the default. + (patch by goorpy, issue #1031, pull request #1034) + + - Fixed missing update for bar highlights after a zoom or other redraw. + (reported by Paolo Valleri, issue #1030) + + - Fixed compatibility with jQuery versions earlier than 1.7. + (patch by Lee Willis, issue #1027, pull request #1027) + + - The mouse wheel no longer scrolls the page when using the navigate plugin. + (patch by vird, pull request #1020) + + - Fixed missing semicolons in the core library. + (reported by Michal Zglinski) + + +## Flot 0.8.0 ## + +### API changes ### + +Support for time series has been moved into a plugin, jquery.flot.time.js. +This results in less code if time series are not used. The functionality +remains the same (plus timezone support, as described below); however, the +plugin must be included if axis.mode is set to "time". + +When the axis mode is "time", the axis option "timezone" can be set to null, +"browser", or a particular timezone (e.g. "America/New_York") to control how +the dates are displayed. If null, the dates are displayed as UTC. If +"browser", the dates are displayed in the time zone of the user's browser. + +Date/time formatting has changed and now follows a proper subset of the +standard strftime specifiers, plus one nonstandard specifier for quarters. +Additionally, if a strftime function is found in the Date object's prototype, +it will be used instead of the built-in formatter. + +Axis tick labels now use the class 'flot-tick-label' instead of 'tickLabel'. +The text containers for each axis now use the classes 'flot-[x|y]-axis' and +'flot-[x|y]#-axis' instead of '[x|y]Axis' and '[x|y]#Axis'. For compatibility +with Flot 0.7 and earlier text will continue to use the old classes as well, +but they are considered deprecated and will be removed in a future version. + +In previous versions the axis 'color' option was used to set the color of tick +marks and their label text. It now controls the color of the axis line, which +previously could not be changed separately, and continues to act as a default +for the tick-mark color. The color of tick label text is now set either by +overriding the 'flot-tick-label' CSS rule or via the axis 'font' option. + +A new plugin, jquery.flot.canvas.js, allows axis tick labels to be rendered +directly to the canvas, rather than using HTML elements. This feature can be +toggled with a simple option, making it easy to create interactive plots in the +browser using HTML, then re-render them to canvas for export as an image. + +The plugin tries to remain as faithful as possible to the original HTML render, +and goes so far as to automatically extract styles from CSS, to avoid having to +provide a separate set of styles when rendering to canvas. Due to limitations +of the canvas text API, the plugin cannot reproduce certain features, including +HTML markup embedded in labels, and advanced text styles such as 'em' units. + +The plugin requires support for canvas text, which may not be present in some +older browsers, even if they support the canvas tag itself. To use the plugin +with these browsers try using a shim such as canvas-text or FlashCanvas. + +The base and overlay canvas are now using the CSS classes "flot-base" and +"flot-overlay" to prevent accidental clashes (issue 540). + +### Changes ### + + - Addition of nonstandard %q specifier to date/time formatting. (patch + by risicle, issue 49) + + - Date/time formatting follows proper subset of strftime specifiers, and + support added for Date.prototype.strftime, if found. (patch by Mark Cote, + issues 419 and 558) + + - Fixed display of year ticks. (patch by Mark Cote, issue 195) + + - Support for time series moved to plugin. (patch by Mark Cote) + + - Display time series in different time zones. (patch by Knut Forkalsrud, + issue 141) + + - Added a canvas plugin to enable rendering axis tick labels to the canvas. + (sponsored by YCharts.com, implementation by Ole Laursen and David Schnur) + + - Support for setting the interval between redraws of the overlay canvas with + redrawOverlayInterval. (suggested in issue 185) + + - Support for multiple thresholds in thresholds plugin. (patch by Arnaud + Bellec, issue 523) + + - Support for plotting categories/textual data directly with new categories + plugin. + + - Tick generators now get the whole axis rather than just min/max. + + - Added processOffset and drawBackground hooks. (suggested in issue 639) + + - Added a grid "margin" option to set the space between the canvas edge and + the grid. + + - Prevent the pie example page from generating single-slice pies. (patch by + Shane Reustle) + + - In addition to "left" and "center", bars now recognize "right" as an + alignment option. (patch by Michael Mayer, issue 520) + + - Switched from toFixed to a much faster default tickFormatter. (patch by + Clemens Stolle) + + - Added to a more helpful error when using a time-mode axis without including + the flot.time plugin. (patch by Yael Elmatad) + + - Added a legend "sorted" option to control sorting of legend entries + independent of their series order. (patch by Tom Cleaveland) + + - Added a series "highlightColor" option to control the color of the + translucent overlay that identifies the dataset when the mouse hovers over + it. (patch by Eric Wendelin and Nate Abele, issues 168 and 299) + + - Added a plugin jquery.flot.errorbars, with an accompanying example, that + adds the ability to plot error bars, commonly used in many kinds of + statistical data visualizations. (patch by Rui Pereira, issue 215) + + - The legend now omits entries whose labelFormatter returns null. (patch by + Tom Cleaveland, Christopher Lambert, and Simon Strandgaard) + + - Added support for high pixel density (retina) displays, resulting in much + crisper charts on such devices. (patch by Olivier Guerriat, additional + fixes by Julien Thomas, maimairel, and Lau Bech Lauritzen) + + - Added the ability to control pie shadow position and alpha via a new pie + 'shadow' option. (patch by Julien Thomas, pull request #78) + + - Added the ability to set width and color for individual sides of the grid. + (patch by Ara Anjargolian, additional fixes by Karl Swedberg, pull requests #855 + and #880) + + - The selection plugin's getSelection now returns null when the selection + has been cleared. (patch by Nick Campbell, pull request #852) + + - Added a new option called 'zero' to bars and filled lines series, to control + whether the y-axis minimum is scaled to fit the data or set to zero. + (patch by David Schnur, issues #316, #529, and #856, pull request #911) + + - The plot function is now also a jQuery chainable property. + (patch by David Schnur, issues #734 and #816, pull request #953) + + - When only a single pie slice is beneath the combine threshold it is no longer + replaced by an 'other' slice. (suggested by Devin Bayer, issue #638) + + - Added lineJoin and minSize options to the selection plugin to control the + corner style and minimum size of the selection, respectively. + (patch by Ruth Linehan, pull request #963) + +### Bug fixes ### + + - Fix problem with null values and pie plugin. (patch by gcruxifix, + issue 500) + + - Fix problem with threshold plugin and bars. (based on patch by + kaarlenkaski, issue 348) + + - Fix axis box calculations so the boxes include the outermost part of the + labels too. + + - Fix problem with event clicking and hovering in IE 8 by updating Excanvas + and removing previous work-around. (test case by Ara Anjargolian) + + - Fix issues with blurry 1px border when some measures aren't integer. + (reported by Ara Anjargolian) + + - Fix bug with formats in the data processor. (reported by Peter Hull, + issue 534) + + - Prevent i from being declared global in extractRange. (reported by + Alexander Obukhov, issue 627) + + - Throw errors in a more cross-browser-compatible manner. (patch by + Eddie Kay) + + - Prevent pie slice outlines from being drawn when the stroke width is zero. + (reported by Chris Minett, issue 585) + + - Updated the navigate plugin's inline copy of jquery.mousewheel to fix + Webkit zoom problems. (reported by Hau Nguyen, issue 685) + + - Axis labels no longer appear as decimals rather than integers in certain + cases. (patch by Clemens Stolle, issue 541) + + - Automatic color generation no longer produces only whites and blacks when + there are many series. (patch by David Schnur and Tom Cleaveland) + + - Fixed an error when custom tick labels weren't provided as strings. (patch + by Shad Downey) + + - Prevented the local insertSteps and fmt variables from becoming global. + (first reported by Marc Bennewitz and Szymon Barglowski, patch by Nick + Campbell, issues #825 and #831, pull request #851) + + - Prevented several threshold plugin variables from becoming global. (patch + by Lasse Dahl Ebert) + + - Fixed various jQuery 1.8 compatibility issues. (issues #814 and #819, + pull request #877) + + - Pie charts with a slice equal to or approaching 100% of the pie no longer + appear invisible. (patch by David Schnur, issues #444, #658, #726, #824 + and #850, pull request #879) + + - Prevented several local variables from becoming global. (patch by aaa707) + + - Ensure that the overlay and primary canvases remain aligned. (issue #670, + pull request #901) + + - Added support for jQuery 1.9 by removing and replacing uses of $.browser. + (analysis and patch by Anthony Ryan, pull request #905) + + - Pie charts no longer disappear when redrawn during a resize or update. + (reported by Julien Bec, issue #656, pull request #910) + + - Avoided floating-point precision errors when calculating pie percentages. + (patch by James Ward, pull request #918) + + - Fixed compatibility with jQuery 1.2.6, which has no 'mouseleave' shortcut. + (reported by Bevan, original pull request #920, replaced by direct patch) + + - Fixed sub-pixel rendering issues with crosshair and selection lines. + (patches by alanayoub and Daniel Shapiro, pull requests #17 and #925) + + - Fixed rendering issues when using the threshold plugin with several series. + (patch by Ivan Novikov, pull request #934) + + - Pie charts no longer disappear when redrawn after calling setData(). + (reported by zengge1984 and pareeohnos, issues #810 and #945) + + - Added a work-around for the problem where points with a lineWidth of zero + still showed up with a visible line. (reported by SalvoSav, issue #842, + patch by Jamie Hamel-Smith, pull request #937) + + - Pie charts now accept values in string form, like other plot types. + (reported by laerdal.no, issue #534) + + - Avoid rounding errors in the threshold plugin. + (reported by jerikojerk, issue #895) + + - Fixed an error when using the navigate plugin with jQuery 1.9.x or later. + (reported by Paolo Valleri, issue #964) + + - Fixed inconsistencies between the highlight and unhighlight functions. + (reported by djamshed, issue #987) + + - Fixed recalculation of tickSize and tickDecimals on calls to setupGrid. + (patch by thecountofzero, pull request #861, issues #860, #1000) + + +## Flot 0.7 ## + +### API changes ### + +Multiple axes support. Code using dual axes should be changed from using +x2axis/y2axis in the options to using an array (although backwards- +compatibility hooks are in place). For instance, + +```js +{ + xaxis: { ... }, x2axis: { ... }, + yaxis: { ... }, y2axis: { ... } +} +``` + +becomes + +```js +{ + xaxes: [ { ... }, { ... } ], + yaxes: [ { ... }, { ... } ] +} +``` + +Note that if you're just using one axis, continue to use the xaxis/yaxis +directly (it now sets the default settings for the arrays). Plugins touching +the axes must be ported to take the extra axes into account, check the source +to see some examples. + +A related change is that the visibility of axes is now auto-detected. So if +you were relying on an axis to show up even without any data in the chart, you +now need to set the axis "show" option explicitly. + +"tickColor" on the grid options is now deprecated in favour of a corresponding +option on the axes, so: + +```js +{ grid: { tickColor: "#000" }} +``` + +becomes + +```js +{ xaxis: { tickColor: "#000"}, yaxis: { tickColor: "#000"} } +``` + +But if you just configure a base color Flot will now autogenerate a tick color +by adding transparency. Backwards-compatibility hooks are in place. + +Final note: now that IE 9 is coming out with canvas support, you may want to +adapt the excanvas include to skip loading it in IE 9 (the examples have been +adapted thanks to Ryley Breiddal). An alternative to excanvas using Flash has +also surfaced, if your graphs are slow in IE, you may want to give it a spin: + + http://code.google.com/p/flashcanvas/ + +### Changes ### + + - Support for specifying a bottom for each point for line charts when filling + them, this means that an arbitrary bottom can be used instead of just the x + axis. (based on patches patiently provided by Roman V. Prikhodchenko) + + - New fillbetween plugin that can compute a bottom for a series from another + series, useful for filling areas between lines. + + See new example percentiles.html for a use case. + + - More predictable handling of gaps for the stacking plugin, now all + undefined ranges are skipped. + + - Stacking plugin can stack horizontal bar charts. + + - Navigate plugin now redraws the plot while panning instead of only after + the fact. (raised by lastthemy, issue 235) + + Can be disabled by setting the pan.frameRate option to null. + + - Date formatter now accepts %0m and %0d to get a zero-padded month or day. + (issue raised by Maximillian Dornseif) + + - Revamped internals to support an unlimited number of axes, not just dual. + (sponsored by Flight Data Services, www.flightdataservices.com) + + - New setting on axes, "tickLength", to control the size of ticks or turn + them off without turning off the labels. + + - Axis labels are now put in container divs with classes, for instance labels + in the x axes can be reached via ".xAxis .tickLabel". + + - Support for setting the color of an axis. (sponsored by Flight Data + Services, www.flightdataservices.com) + + - Tick color is now auto-generated as the base color with some transparency, + unless you override it. + + - Support for aligning ticks in the axes with "alignTicksWithAxis" to ensure + that they appear next to each other rather than in between, at the expense + of possibly awkward tick steps. (sponsored by Flight Data Services, + www.flightdataservices.com) + + - Support for customizing the point type through a callback when plotting + points and new symbol plugin with some predefined point types. (sponsored + by Utility Data Corporation) + + - Resize plugin for automatically redrawing when the placeholder changes + size, e.g. on window resizes. (sponsored by Novus Partners) + + A resize() method has been added to plot object facilitate this. + + - Support Infinity/-Infinity for plotting asymptotes by hacking it into + +/-Number.MAX_VALUE. (reported by rabaea.mircea) + + - Support for restricting navigate plugin to not pan/zoom an axis. (based on + patch by kkaefer) + + - Support for providing the drag cursor for the navigate plugin as an option. + (based on patch by Kelly T. Moore) + + - Options for controlling whether an axis is shown or not (suggestion by Timo + Tuominen) and whether to reserve space for it even if it isn't shown. + + - New attribute $.plot.version with the Flot version as a string. + + - The version comment is now included in the minified jquery.flot.min.js. + + - New options.grid.minBorderMargin for adjusting the minimum margin provided + around the border (based on patch by corani, issue 188). + + - Refactor replot behaviour so Flot tries to reuse the existing canvas, + adding shutdown() methods to the plot. (based on patch by Ryley Breiddal, + issue 269) + + This prevents a memory leak in Chrome and hopefully makes replotting faster + for those who are using $.plot instead of .setData()/.draw(). Also update + jQuery to 1.5.1 to prevent IE leaks fixed in jQuery. + + - New real-time line chart example. + + - New hooks: drawSeries, shutdown. + +### Bug fixes ### + + - Fixed problem with findNearbyItem and bars on top of each other. (reported + by ragingchikn, issue 242) + + - Fixed problem with ticks and the border. (based on patch from + ultimatehustler69, issue 236) + + - Fixed problem with plugins adding options to the series objects. + + - Fixed a problem introduced in 0.6 with specifying a gradient with: + + ```{brightness: x, opacity: y }``` + + - Don't use $.browser.msie, check for getContext on the created canvas element + instead and try to use excanvas if it's not found. + + Fixes IE 9 compatibility. + + - highlight(s, index) was looking up the point in the original s.data instead + of in the computed datapoints array, which breaks with plugins that modify + the datapoints, such as the stacking plugin. (reported by curlypaul924, + issue 316) + + - More robust handling of axis from data passed in from getData(). (reported) + by Morgan) + + - Fixed problem with turning off bar outline. (fix by Jordi Castells, + issue 253) + + - Check the selection passed into setSelection in the selection + plugin, to guard against errors when synchronizing plots (fix by Lau + Bech Lauritzen). + + - Fix bug in crosshair code with mouseout resetting the crosshair even + if it is locked (fix by Lau Bech Lauritzen and Banko Adam). + + - Fix bug with points plotting using line width from lines rather than + points. + + - Fix bug with passing non-array 0 data (for plugins that don't expect + arrays, patch by vpapp1). + + - Fix errors in JSON in examples so they work with jQuery 1.4.2 + (fix reported by honestbleeps, issue 357). + + - Fix bug with tooltip in interacting.html, this makes the tooltip + much smoother (fix by bdkahn). Fix related bug inside highlighting + handler in Flot. + + - Use closure trick to make inline colorhelpers plugin respect + jQuery.noConflict(true), renaming the global jQuery object (reported + by Nick Stielau). + + - Listen for mouseleave events and fire a plothover event with empty + item when it occurs to drop highlights when the mouse leaves the + plot (reported by by outspirit). + + - Fix bug with using aboveData with a background (reported by + amitayd). + + - Fix possible excanvas leak (report and suggested fix by tom9729). + + - Fix bug with backwards compatibility for shadowSize = 0 (report and + suggested fix by aspinak). + + - Adapt examples to skip loading excanvas (fix by Ryley Breiddal). + + - Fix bug that prevent a simple f(x) = -x transform from working + correctly (fix by Mike, issue 263). + + - Fix bug in restoring cursor in navigate plugin (reported by Matteo + Gattanini, issue 395). + + - Fix bug in picking items when transform/inverseTransform is in use + (reported by Ofri Raviv, and patches and analysis by Jan and Tom + Paton, issue 334 and 467). + + - Fix problem with unaligned ticks and hover/click events caused by + padding on the placeholder by hardcoding the placeholder padding to + 0 (reported by adityadineshsaxena, Matt Sommer, Daniel Atos and some + other people, issue 301). + + - Update colorhelpers plugin to avoid dying when trying to parse an + invalid string (reported by cadavor, issue 483). + + + +## Flot 0.6 ## + +### API changes ### + +Selection support has been moved to a plugin. Thus if you're passing +selection: { mode: something }, you MUST include the file +jquery.flot.selection.js after jquery.flot.js. This reduces the size of +base Flot and makes it easier to customize the selection as well as +improving code clarity. The change is based on a patch from andershol. + +In the global options specified in the $.plot command, "lines", "points", +"bars" and "shadowSize" have been moved to a sub-object called "series": + +```js +$.plot(placeholder, data, { lines: { show: true }}) +``` + +should be changed to + +```js + $.plot(placeholder, data, { series: { lines: { show: true }}}) +``` + +All future series-specific options will go into this sub-object to +simplify plugin writing. Backward-compatibility code is in place, so +old code should not break. + +"plothover" no longer provides the original data point, but instead a +normalized one, since there may be no corresponding original point. + +Due to a bug in previous versions of jQuery, you now need at least +jQuery 1.2.6. But if you can, try jQuery 1.3.2 as it got some improvements +in event handling speed. + +## Changes ## + + - Added support for disabling interactivity for specific data series. + (request from Ronald Schouten and Steve Upton) + + - Flot now calls $() on the placeholder and optional legend container passed + in so you can specify DOM elements or CSS expressions to make it easier to + use Flot with libraries like Prototype or Mootools or through raw JSON from + Ajax responses. + + - A new "plotselecting" event is now emitted while the user is making a + selection. + + - The "plothover" event is now emitted immediately instead of at most 10 + times per second, you'll have to put in a setTimeout yourself if you're + doing something really expensive on this event. + + - The built-in date formatter can now be accessed as $.plot.formatDate(...) + (suggestion by Matt Manela) and even replaced. + + - Added "borderColor" option to the grid. (patches from Amaury Chamayou and + Mike R. Williamson) + + - Added support for gradient backgrounds for the grid. (based on patch from + Amaury Chamayou, issue 90) + + The "setting options" example provides a demonstration. + + - Gradient bars. (suggestion by stefpet) + + - Added a "plotunselected" event which is triggered when the selection is + removed, see "selection" example. (suggestion by Meda Ugo) + + - The option legend.margin can now specify horizontal and vertical margins + independently. (suggestion by someone who's annoyed) + + - Data passed into Flot is now copied to a new canonical format to enable + further processing before it hits the drawing routines. As a side-effect, + this should make Flot more robust in the face of bad data. (issue 112) + + - Step-wise charting: line charts have a new option "steps" that when set to + true connects the points with horizontal/vertical steps instead of diagonal + lines. + + - The legend labelFormatter now passes the series in addition to just the + label. (suggestion by Vincent Lemeltier) + + - Horizontal bars (based on patch by Jason LeBrun). + + - Support for partial bars by specifying a third coordinate, i.e. they don't + have to start from the axis. This can be used to make stacked bars. + + - New option to disable the (grid.show). + + - Added pointOffset method for converting a point in data space to an offset + within the placeholder. + + - Plugin system: register an init method in the $.flot.plugins array to get + started, see PLUGINS.txt for details on how to write plugins (it's easy). + There are also some extra methods to enable access to internal state. + + - Hooks: you can register functions that are called while Flot is crunching + the data and doing the plot. This can be used to modify Flot without + changing the source, useful for writing plugins. Some hooks are defined, + more are likely to come. + + - Threshold plugin: you can set a threshold and a color, and the data points + below that threshold will then get the color. Useful for marking data + below 0, for instance. + + - Stack plugin: you can specify a stack key for each series to have them + summed. This is useful for drawing additive/cumulative graphs with bars and + (currently unfilled) lines. + + - Crosshairs plugin: trace the mouse position on the axes, enable with + crosshair: { mode: "x"} (see the new tracking example for a use). + + - Image plugin: plot prerendered images. + + - Navigation plugin for panning and zooming a plot. + + - More configurable grid. + + - Axis transformation support, useful for non-linear plots, e.g. log axes and + compressed time axes (like omitting weekends). + + - Support for twelve-hour date formatting (patch by Forrest Aldridge). + + - The color parsing code in Flot has been cleaned up and split out so it's + now available as a separate jQuery plugin. It's included inline in the Flot + source to make dependency managing easier. This also makes it really easy + to use the color helpers in Flot plugins. + +## Bug fixes ## + + - Fixed two corner-case bugs when drawing filled curves. (report and analysis + by Joshua Varner) + + - Fix auto-adjustment code when setting min to 0 for an axis where the + dataset is completely flat on that axis. (report by chovy) + + - Fixed a bug with passing in data from getData to setData when the secondary + axes are used. (reported by nperelman, issue 65) + + - Fixed so that it is possible to turn lines off when no other chart type is + shown (based on problem reported by Glenn Vanderburg), and fixed so that + setting lineWidth to 0 also hides the shadow. (based on problem reported by + Sergio Nunes) + + - Updated mousemove position expression to the latest from jQuery. (reported + by meyuchas) + + - Use CSS borders instead of background in legend. (issues 25 and 45) + + - Explicitly convert axis min/max to numbers. + + - Fixed a bug with drawing marking lines with different colors. (reported by + Khurram) + + - Fixed a bug with returning y2 values in the selection event. (fix by + exists, issue 75) + + - Only set position relative on placeholder if it hasn't already a position + different from static. (reported by kyberneticist, issue 95) + + - Don't round markings to prevent sub-pixel problems. (reported by + Dan Lipsitt) + + - Make the grid border act similarly to a regular CSS border, i.e. prevent + it from overlapping the plot itself. This also fixes a problem with anti- + aliasing when the width is 1 pixel. (reported by Anthony Ettinger) + + - Imported version 3 of excanvas and fixed two issues with the newer version. + Hopefully, this will make Flot work with IE8. (nudge by Fabien Menager, + further analysis by Booink, issue 133) + + - Changed the shadow code for lines to hopefully look a bit better with + vertical lines. + + - Round tick positions to avoid possible problems with fractions. (suggestion + by Fred, issue 130) + + - Made the heuristic for determining how many ticks to aim for a bit smarter. + + - Fix for uneven axis margins (report and patch by Paul Kienzle) and snapping + to ticks. (report and patch by lifthrasiir) + + - Fixed bug with slicing in findNearbyItems. (patch by zollman) + + - Make heuristic for x axis label widths more dynamic. (patch by + rickinhethuis) + + - Make sure points on top take precedence when finding nearby points when + hovering. (reported by didroe, issue 224) + + + +## Flot 0.5 ## + +Timestamps are now in UTC. Also "selected" event -> becomes "plotselected" +with new data, the parameters for setSelection are now different (but +backwards compatibility hooks are in place), coloredAreas becomes markings +with a new interface (but backwards compatibility hooks are in place). + +### API changes ### + +Timestamps in time mode are now displayed according to UTC instead of the time +zone of the visitor. This affects the way the timestamps should be input; +you'll probably have to offset the timestamps according to your local time +zone. It also affects any custom date handling code (which basically now +should use the equivalent UTC date mehods, e.g. .setUTCMonth() instead of +.setMonth(). + +Markings, previously coloredAreas, are now specified as ranges on the axes, +like ```{ xaxis: { from: 0, to: 10 }}```. Furthermore with markings you can +now draw horizontal/vertical lines by setting from and to to the same +coordinate. (idea from line support patch by by Ryan Funduk) + +Interactivity: added a new "plothover" event and this and the "plotclick" +event now returns the closest data item (based on patch by /david, patch by +Mark Byers for bar support). See the revamped "interacting with the data" +example for some hints on what you can do. + +Highlighting: you can now highlight points and datapoints are autohighlighted +when you hover over them (if hovering is turned on). + +Support for dual axis has been added (based on patch by someone who's annoyed +and /david). For each data series you can specify which axes it belongs to, +and there are two more axes, x2axis and y2axis, to customize. This affects the +"selected" event which has been renamed to "plotselected" and spews out +```{ xaxis: { from: -10, to: 20 } ... },``` setSelection in which the +parameters are on a new form (backwards compatible hooks are in place so old +code shouldn't break) and markings (formerly coloredAreas). + +## Changes ## + + - Added support for specifying the size of tick labels (axis.labelWidth, + axis.labelHeight). Useful for specifying a max label size to keep multiple + plots aligned. + + - The "fill" option can now be a number that specifies the opacity of the + fill. + + - You can now specify a coordinate as null (like [2, null]) and Flot will + take the other coordinate into account when scaling the axes. (based on + patch by joebno) + + - New option for bars "align". Set it to "center" to center the bars on the + value they represent. + + - setSelection now takes a second parameter which you can use to prevent the + method from firing the "plotselected" handler. + + - Improved the handling of axis auto-scaling with bars. + +## Bug fixes ## + + - Fixed a bug in calculating spacing around the plot. (reported by + timothytoe) + + - Fixed a bug in finding max values for all-negative data sets. + + - Prevent the possibility of eternal looping in tick calculations. + + - Fixed a bug when borderWidth is set to 0. (reported by Rob/sanchothefat) + + - Fixed a bug with drawing bars extending below 0. (reported by James Hewitt, + patch by Ryan Funduk). + + - Fixed a bug with line widths of bars. (reported by MikeM) + + - Fixed a bug with 'nw' and 'sw' legend positions. + + - Fixed a bug with multi-line x-axis tick labels. (reported by Luca Ciano, + IE-fix help by Savage Zhang) + + - Using the "container" option in legend now overwrites the container element + instead of just appending to it, fixing the infinite legend bug. (reported + by several people, fix by Brad Dewey) + + + +## Flot 0.4 ## + +### API changes ### + +Deprecated axis.noTicks in favor of just specifying the number as axis.ticks. +So ```xaxis: { noTicks: 10 }``` becomes ```xaxis: { ticks: 10 }```. + +Time series support. Specify axis.mode: "time", put in Javascript timestamps +as data, and Flot will automatically spit out sensible ticks. Take a look at +the two new examples. The format can be customized with axis.timeformat and +axis.monthNames, or if that fails with axis.tickFormatter. + +Support for colored background areas via grid.coloredAreas. Specify an array +of { x1, y1, x2, y2 } objects or a function that returns these given +{ xmin, xmax, ymin, ymax }. + +More members on the plot object (report by Chris Davies and others). +"getData" for inspecting the assigned settings on data series (e.g. color) and +"setData", "setupGrid" and "draw" for updating the contents without a total +replot. + +The default number of ticks to aim for is now dependent on the size of the +plot in pixels. Support for customizing tick interval sizes directly with +axis.minTickSize and axis.tickSize. + +Cleaned up the automatic axis scaling algorithm and fixed how it interacts +with ticks. Also fixed a couple of tick-related corner case bugs (one reported +by mainstreetmark, another reported by timothytoe). + +The option axis.tickFormatter now takes a function with two parameters, the +second parameter is an optional object with information about the axis. It has +min, max, tickDecimals, tickSize. + +## Changes ## + + - Added support for segmented lines. (based on patch from Michael MacDonald) + + - Added support for ignoring null and bad values. (suggestion from Nick + Konidaris and joshwaihi) + + - Added support for changing the border width. (thanks to joebno and safoo) + + - Label colors can be changed via CSS by selecting the tickLabel class. + +## Bug fixes ## + + - Fixed a bug in handling single-item bar series. (reported by Emil Filipov) + + - Fixed erratic behaviour when interacting with the plot with IE 7. (reported + by Lau Bech Lauritzen). + + - Prevent IE/Safari text selection when selecting stuff on the canvas. + + + +## Flot 0.3 ## + +This is mostly a quick-fix release because jquery.js wasn't included in the +previous zip/tarball. + +## Changes ## + + - Include jquery.js in the zip/tarball. + + - Support clicking on the plot. Turn it on with grid: { clickable: true }, + then you get a "plotclick" event on the graph placeholder with the position + in units of the plot. + +## Bug fixes ## + + - Fixed a bug in dealing with data where min = max. (thanks to Michael + Messinides) + + + +## Flot 0.2 ## + +The API should now be fully documented. + +### API changes ### + +Moved labelMargin option to grid from x/yaxis. + +## Changes ## + + - Added support for putting a background behind the default legend. The + default is the partly transparent background color. Added backgroundColor + and backgroundOpacity to the legend options to control this. + + - The ticks options can now be a callback function that takes one parameter, + an object with the attributes min and max. The function should return a + ticks array. + + - Added labelFormatter option in legend, useful for turning the legend + labels into links. + + - Reduced the size of the code. (patch by Guy Fraser) + + + +## Flot 0.1 ## + +First public release. diff --git a/htdocs/includes/jquery/plugins/flot/NEWS.txt b/htdocs/includes/jquery/plugins/flot/NEWS.txt deleted file mode 100755 index 5f8e1a0c053..00000000000 --- a/htdocs/includes/jquery/plugins/flot/NEWS.txt +++ /dev/null @@ -1,508 +0,0 @@ -Flot 0.7 --------- - -API changes: - -Multiple axes support. Code using dual axes should be changed from -using x2axis/y2axis in the options to using an array (although -backwards-compatibility hooks are in place). For instance, - - { - xaxis: { ... }, x2axis: { ... }, - yaxis: { ... }, y2axis: { ... } - } - -becomes - - { - xaxes: [ { ... }, { ... } ], - yaxes: [ { ... }, { ... } ] - } - -Note that if you're just using one axis, continue to use the -xaxis/yaxis directly (it now sets the default settings for the -arrays). Plugins touching the axes must be ported to take the extra -axes into account, check the source to see some examples. - -A related change is that the visibility of axes is now auto-detected. -So if you were relying on an axis to show up even without any data in -the chart, you now need to set the axis "show" option explicitly. - -"tickColor" on the grid options is now deprecated in favour of a -corresponding option on the axes, so { grid: { tickColor: "#000" }} -becomes { xaxis: { tickColor: "#000"}, yaxis: { tickColor: "#000"} }, -but if you just configure a base color Flot will now autogenerate a -tick color by adding transparency. Backwards-compatibility hooks are -in place. - -Final note: now that IE 9 is coming out with canvas support, you may -want to adapt the excanvas include to skip loading it in IE 9 (the -examples have been adapted thanks to Ryley Breiddal). An alternative -to excanvas using Flash has also surfaced, if your graphs are slow in -IE, you may want to give it a spin: - - http://code.google.com/p/flashcanvas/ - - -Changes: - -- Support for specifying a bottom for each point for line charts when - filling them, this means that an arbitrary bottom can be used - instead of just the x axis (based on patches patiently provided by - Roman V. Prikhodchenko). -- New fillbetween plugin that can compute a bottom for a series from - another series, useful for filling areas between lines (see new - example percentiles.html for a use case). -- More predictable handling of gaps for the stacking plugin, now all - undefined ranges are skipped. -- Stacking plugin can stack horizontal bar charts. -- Navigate plugin now redraws the plot while panning instead of only - after the fact (can be disabled by setting the pan.frameRate option - to null), raised by lastthemy (issue 235). -- Date formatter now accepts %0m and %0d to get a zero-padded month or - day (issue raised by Maximillian Dornseif). -- Revamped internals to support an unlimited number of axes, not just - dual (sponsored by Flight Data Services, - www.flightdataservices.com). -- New setting on axes, "tickLength", to control the size of ticks or - turn them off without turning off the labels. -- Axis labels are now put in container divs with classes, for instance - labels in the x axes can be reached via ".xAxis .tickLabel". -- Support for setting the color of an axis (sponsored by Flight Data - Services, www.flightdataservices.com). -- Tick color is now auto-generated as the base color with some - transparency (unless you override it). -- Support for aligning ticks in the axes with "alignTicksWithAxis" to - ensure that they appear next to each other rather than in between, - at the expense of possibly awkward tick steps (sponsored by Flight - Data Services, www.flightdataservices.com). -- Support for customizing the point type through a callback when - plotting points and new symbol plugin with some predefined point - types (sponsored by Utility Data Corporation). -- Resize plugin for automatically redrawing when the placeholder - changes size, e.g. on window resizes (sponsored by Novus Partners). - A resize() method has been added to plot object facilitate this. -- Support Infinity/-Infinity for plotting asymptotes by hacking it - into +/-Number.MAX_VALUE (reported by rabaea.mircea). -- Support for restricting navigate plugin to not pan/zoom an axis (based - on patch by kkaefer). -- Support for providing the drag cursor for the navigate plugin as an - option (based on patch by Kelly T. Moore). -- Options for controlling whether an axis is shown or not (suggestion - by Timo Tuominen) and whether to reserve space for it even if it - isn't shown. -- New attribute $.plot.version with the Flot version as a string. -- The version comment is now included in the minified jquery.flot.min.js. -- New options.grid.minBorderMargin for adjusting the minimum margin - provided around the border (based on patch by corani, issue 188). -- Refactor replot behaviour so Flot tries to reuse the existing - canvas, adding shutdown() methods to the plot (based on patch by - Ryley Breiddal, issue 269). This prevents a memory leak in Chrome - and hopefully makes replotting faster for those who are using $.plot - instead of .setData()/.draw(). Also update jQuery to 1.5.1 to - prevent IE leaks fixed in jQuery. -- New real-time line chart example. - -- New hooks: drawSeries, shutdown - -Bug fixes: - -- Fixed problem with findNearbyItem and bars on top of each other - (reported by ragingchikn, issue 242). -- Fixed problem with ticks and the border (based on patch from - ultimatehustler69, issue 236). -- Fixed problem with plugins adding options to the series objects. -- Fixed a problem introduced in 0.6 with specifying a gradient with { - brightness: x, opacity: y }. -- Don't use $.browser.msie, check for getContext on the created canvas - element instead and try to use excanvas if it's not found (fixes IE - 9 compatibility). -- highlight(s, index) was looking up the point in the original s.data - instead of in the computed datapoints array, which breaks with - plugins that modify the datapoints (such as the stacking plugin). - Issue 316 reported by curlypaul924. -- More robust handling of axis from data passed in from getData() - (problem reported by Morgan). -- Fixed problem with turning off bar outline (issue 253, fix by Jordi - Castells). -- Check the selection passed into setSelection in the selection - plugin, to guard against errors when synchronizing plots (fix by Lau - Bech Lauritzen). -- Fix bug in crosshair code with mouseout resetting the crosshair even - if it is locked (fix by Lau Bech Lauritzen and Banko Adam). -- Fix bug with points plotting using line width from lines rather than - points. -- Fix bug with passing non-array 0 data (for plugins that don't expect - arrays, patch by vpapp1). -- Fix errors in JSON in examples so they work with jQuery 1.4.2 - (fix reported by honestbleeps, issue 357). -- Fix bug with tooltip in interacting.html, this makes the tooltip - much smoother (fix by bdkahn). Fix related bug inside highlighting - handler in Flot. -- Use closure trick to make inline colorhelpers plugin respect - jQuery.noConflict(true), renaming the global jQuery object (reported - by Nick Stielau). -- Listen for mouseleave events and fire a plothover event with empty - item when it occurs to drop highlights when the mouse leaves the - plot (reported by by outspirit). -- Fix bug with using aboveData with a background (reported by - amitayd). -- Fix possible excanvas leak (report and suggested fix by tom9729). -- Fix bug with backwards compatibility for shadowSize = 0 (report and - suggested fix by aspinak). -- Adapt examples to skip loading excanvas (fix by Ryley Breiddal). -- Fix bug that prevent a simple f(x) = -x transform from working - correctly (fix by Mike, issue 263). -- Fix bug in restoring cursor in navigate plugin (reported by Matteo - Gattanini, issue 395). -- Fix bug in picking items when transform/inverseTransform is in use - (reported by Ofri Raviv, and patches and analysis by Jan and Tom - Paton, issue 334 and 467). -- Fix problem with unaligned ticks and hover/click events caused by - padding on the placeholder by hardcoding the placeholder padding to - 0 (reported by adityadineshsaxena, Matt Sommer, Daniel Atos and some - other people, issue 301). -- Update colorhelpers plugin to avoid dying when trying to parse an - invalid string (reported by cadavor, issue 483). - - -Flot 0.6 --------- - -API changes: - -1. Selection support has been moved to a plugin. Thus if you're -passing selection: { mode: something }, you MUST include the file -jquery.flot.selection.js after jquery.flot.js. This reduces the size -of base Flot and makes it easier to customize the selection as well as -improving code clarity. The change is based on a patch from andershol. - -2. In the global options specified in the $.plot command, -"lines", "points", "bars" and "shadowSize" have been moved to a -sub-object called "series", i.e. - - $.plot(placeholder, data, { lines: { show: true }}) - -should be changed to - - $.plot(placeholder, data, { series: { lines: { show: true }}}) - -All future series-specific options will go into this sub-object to -simplify plugin writing. Backward-compatibility code is in place, so -old code should not break. - -3. "plothover" no longer provides the original data point, but instead -a normalized one, since there may be no corresponding original point. - -4. Due to a bug in previous versions of jQuery, you now need at least -jQuery 1.2.6. But if you can, try jQuery 1.3.2 as it got some -improvements in event handling speed. - - -Changes: - -- Added support for disabling interactivity for specific data series - (request from Ronald Schouten and Steve Upton). - -- Flot now calls $() on the placeholder and optional legend container - passed in so you can specify DOM elements or CSS expressions to make - it easier to use Flot with libraries like Prototype or Mootools or - through raw JSON from Ajax responses. - -- A new "plotselecting" event is now emitted while the user is making - a selection. - -- The "plothover" event is now emitted immediately instead of at most - 10 times per second, you'll have to put in a setTimeout yourself if - you're doing something really expensive on this event. - -- The built-in date formatter can now be accessed as - $.plot.formatDate(...) (suggestion by Matt Manela) and even - replaced. - -- Added "borderColor" option to the grid (patch from Amaury Chamayou - and patch from Mike R. Williamson). - -- Added support for gradient backgrounds for the grid, take a look at - the "setting options" example (based on patch from Amaury Chamayou, - issue 90). - -- Gradient bars (suggestion by stefpet). - -- Added a "plotunselected" event which is triggered when the selection - is removed, see "selection" example (suggestion by Meda Ugo); - -- The option legend.margin can now specify horizontal and vertical - margins independently (suggestion by someone who's annoyed). - -- Data passed into Flot is now copied to a new canonical format to - enable further processing before it hits the drawing routines. As a - side-effect, this should make Flot more robust in the face of bad - data (and fixes issue 112). - -- Step-wise charting: line charts have a new option "steps" that when - set to true connects the points with horizontal/vertical steps - instead of diagonal lines. - -- The legend labelFormatter now passes the series in addition to just - the label (suggestion by Vincent Lemeltier). - -- Horizontal bars (based on patch by Jason LeBrun). - -- Support for partial bars by specifying a third coordinate, i.e. they - don't have to start from the axis. This can be used to make stacked - bars. - -- New option to disable the (grid.show). - -- Added pointOffset method for converting a point in data space to an - offset within the placeholder. - -- Plugin system: register an init method in the $.flot.plugins array - to get started, see PLUGINS.txt for details on how to write plugins - (it's easy). There are also some extra methods to enable access to - internal state. - -- Hooks: you can register functions that are called while Flot is - crunching the data and doing the plot. This can be used to modify - Flot without changing the source, useful for writing plugins. Some - hooks are defined, more are likely to come. - -- Threshold plugin: you can set a threshold and a color, and the data - points below that threshold will then get the color. Useful for - marking data below 0, for instance. - -- Stack plugin: you can specify a stack key for each series to have - them summed. This is useful for drawing additive/cumulative graphs - with bars and (currently unfilled) lines. - -- Crosshairs plugin: trace the mouse position on the axes, enable with - crosshair: { mode: "x"} (see the new tracking example for a use). - -- Image plugin: plot prerendered images. - -- Navigation plugin for panning and zooming a plot. - -- More configurable grid. - -- Axis transformation support, useful for non-linear plots, e.g. log - axes and compressed time axes (like omitting weekends). - -- Support for twelve-hour date formatting (patch by Forrest Aldridge). - -- The color parsing code in Flot has been cleaned up and split out so - it's now available as a separate jQuery plugin. It's included inline - in the Flot source to make dependency managing easier. This also - makes it really easy to use the color helpers in Flot plugins. - -Bug fixes: - -- Fixed two corner-case bugs when drawing filled curves (report and - analysis by Joshua Varner). -- Fix auto-adjustment code when setting min to 0 for an axis where the - dataset is completely flat on that axis (report by chovy). -- Fixed a bug with passing in data from getData to setData when the - secondary axes are used (issue 65, reported by nperelman). -- Fixed so that it is possible to turn lines off when no other chart - type is shown (based on problem reported by Glenn Vanderburg), and - fixed so that setting lineWidth to 0 also hides the shadow (based on - problem reported by Sergio Nunes). -- Updated mousemove position expression to the latest from jQuery (bug - reported by meyuchas). -- Use CSS borders instead of background in legend (fix printing issue 25 - and 45). -- Explicitly convert axis min/max to numbers. -- Fixed a bug with drawing marking lines with different colors - (reported by Khurram). -- Fixed a bug with returning y2 values in the selection event (fix - by exists, issue 75). -- Only set position relative on placeholder if it hasn't already a - position different from static (reported by kyberneticist, issue 95). -- Don't round markings to prevent sub-pixel problems (reported by Dan - Lipsitt). -- Make the grid border act similarly to a regular CSS border, i.e. - prevent it from overlapping the plot itself. This also fixes a - problem with anti-aliasing when the width is 1 pixel (reported by - Anthony Ettinger). -- Imported version 3 of excanvas and fixed two issues with the newer - version. Hopefully, this will make Flot work with IE8 (nudge by - Fabien Menager, further analysis by Booink, issue 133). -- Changed the shadow code for lines to hopefully look a bit better - with vertical lines. -- Round tick positions to avoid possible problems with fractions - (suggestion by Fred, issue 130). -- Made the heuristic for determining how many ticks to aim for a bit - smarter. -- Fix for uneven axis margins (report and patch by Paul Kienzle) and - snapping to ticks (concurrent report and patch by lifthrasiir). -- Fixed bug with slicing in findNearbyItems (patch by zollman). -- Make heuristic for x axis label widths more dynamic (patch by - rickinhethuis). -- Make sure points on top take precedence when finding nearby points - when hovering (reported by didroe, issue 224). - -Flot 0.5 --------- - -Backwards API change summary: Timestamps are now in UTC. Also -"selected" event -> becomes "plotselected" with new data, the -parameters for setSelection are now different (but backwards -compatibility hooks are in place), coloredAreas becomes markings with -a new interface (but backwards compatibility hooks are in place). - - -Interactivity: added a new "plothover" event and this and the -"plotclick" event now returns the closest data item (based on patch by -/david, patch by Mark Byers for bar support). See the revamped -"interacting with the data" example for some hints on what you can do. - -Highlighting: you can now highlight points and datapoints are -autohighlighted when you hover over them (if hovering is turned on). - -Support for dual axis has been added (based on patch by someone who's -annoyed and /david). For each data series you can specify which axes -it belongs to, and there are two more axes, x2axis and y2axis, to -customize. This affects the "selected" event which has been renamed to -"plotselected" and spews out { xaxis: { from: -10, to: 20 } ... }, -setSelection in which the parameters are on a new form (backwards -compatible hooks are in place so old code shouldn't break) and -markings (formerly coloredAreas). - -Timestamps in time mode are now displayed according to -UTC instead of the time zone of the visitor. This affects the way the -timestamps should be input; you'll probably have to offset the -timestamps according to your local time zone. It also affects any -custom date handling code (which basically now should use the -equivalent UTC date mehods, e.g. .setUTCMonth() instead of -.setMonth(). - -Added support for specifying the size of tick labels (axis.labelWidth, -axis.labelHeight). Useful for specifying a max label size to keep -multiple plots aligned. - -Markings, previously coloredAreas, are now specified as ranges on the -axes, like { xaxis: { from: 0, to: 10 }}. Furthermore with markings -you can now draw horizontal/vertical lines by setting from and to to -the same coordinate (idea from line support patch by by Ryan Funduk). - -The "fill" option can now be a number that specifies the opacity of -the fill. - -You can now specify a coordinate as null (like [2, null]) and Flot -will take the other coordinate into account when scaling the axes -(based on patch by joebno). - -New option for bars "align". Set it to "center" to center the bars on -the value they represent. - -setSelection now takes a second parameter which you can use to prevent -the method from firing the "plotselected" handler. - -Using the "container" option in legend now overwrites the container -element instead of just appending to it (fixes infinite legend bug, -reported by several people, fix by Brad Dewey). - -Fixed a bug in calculating spacing around the plot (reported by -timothytoe). Fixed a bug in finding max values for all-negative data -sets. Prevent the possibility of eternal looping in tick calculations. -Fixed a bug when borderWidth is set to 0 (reported by -Rob/sanchothefat). Fixed a bug with drawing bars extending below 0 -(reported by James Hewitt, patch by Ryan Funduk). Fixed a -bug with line widths of bars (reported by MikeM). Fixed a bug with -'nw' and 'sw' legend positions. Improved the handling of axis -auto-scaling with bars. Fixed a bug with multi-line x-axis tick -labels (reported by Luca Ciano). IE-fix help by Savage Zhang. - - -Flot 0.4 --------- - -API changes: deprecated axis.noTicks in favor of just specifying the -number as axis.ticks. So "xaxis: { noTicks: 10 }" becomes -"xaxis: { ticks: 10 }" - -Time series support. Specify axis.mode: "time", put in Javascript -timestamps as data, and Flot will automatically spit out sensible -ticks. Take a look at the two new examples. The format can be -customized with axis.timeformat and axis.monthNames, or if that fails -with axis.tickFormatter. - -Support for colored background areas via grid.coloredAreas. Specify an -array of { x1, y1, x2, y2 } objects or a function that returns these -given { xmin, xmax, ymin, ymax }. - -More members on the plot object (report by Chris Davies and others). -"getData" for inspecting the assigned settings on data series (e.g. -color) and "setData", "setupGrid" and "draw" for updating the contents -without a total replot. - -The default number of ticks to aim for is now dependent on the size of -the plot in pixels. Support for customizing tick interval sizes -directly with axis.minTickSize and axis.tickSize. - -Cleaned up the automatic axis scaling algorithm and fixed how it -interacts with ticks. Also fixed a couple of tick-related corner case -bugs (one reported by mainstreetmark, another reported by timothytoe). - -The option axis.tickFormatter now takes a function with two -parameters, the second parameter is an optional object with -information about the axis. It has min, max, tickDecimals, tickSize. - -Added support for segmented lines (based on patch from Michael -MacDonald) and for ignoring null and bad values (suggestion from Nick -Konidaris and joshwaihi). - -Added support for changing the border width (joebno and safoo). -Label colors can be changed via CSS by selecting the tickLabel class. - -Fixed a bug in handling single-item bar series (reported by Emil -Filipov). Fixed erratic behaviour when interacting with the plot -with IE 7 (reported by Lau Bech Lauritzen). Prevent IE/Safari text -selection when selecting stuff on the canvas. - - - -Flot 0.3 --------- - -This is mostly a quick-fix release because jquery.js wasn't included -in the previous zip/tarball. - -Support clicking on the plot. Turn it on with grid: { clickable: true }, -then you get a "plotclick" event on the graph placeholder with the -position in units of the plot. - -Fixed a bug in dealing with data where min = max, thanks to Michael -Messinides. - -Include jquery.js in the zip/tarball. - - -Flot 0.2 --------- - -Added support for putting a background behind the default legend. The -default is the partly transparent background color. Added -backgroundColor and backgroundOpacity to the legend options to control -this. - -The ticks options can now be a callback function that takes one -parameter, an object with the attributes min and max. The function -should return a ticks array. - -Added labelFormatter option in legend, useful for turning the legend -labels into links. - -Fixed a couple of bugs. - -The API should now be fully documented. - -Patch from Guy Fraser to make parts of the code smaller. - -API changes: Moved labelMargin option to grid from x/yaxis. - - -Flot 0.1 --------- - -First public release. diff --git a/htdocs/includes/jquery/plugins/flot/PLUGINS.txt b/htdocs/includes/jquery/plugins/flot/PLUGINS.md old mode 100755 new mode 100644 similarity index 74% rename from htdocs/includes/jquery/plugins/flot/PLUGINS.txt rename to htdocs/includes/jquery/plugins/flot/PLUGINS.md index af3d90be58e..b5bf3002033 --- a/htdocs/includes/jquery/plugins/flot/PLUGINS.txt +++ b/htdocs/includes/jquery/plugins/flot/PLUGINS.md @@ -1,18 +1,19 @@ -Writing plugins ---------------- +## Writing plugins ## All you need to do to make a new plugin is creating an init function and a set of options (if needed), stuffing it into an object and putting it in the $.plot.plugins array. For example: - function myCoolPluginInit(plot) { +```js +function myCoolPluginInit(plot) { plot.coolstring = "Hello!"; - }; +}; - $.plot.plugins.push({ init: myCoolPluginInit, options: { ... } }); +$.plot.plugins.push({ init: myCoolPluginInit, options: { ... } }); - // if $.plot is called, it will return a plot object with the - // attribute "coolstring" +// if $.plot is called, it will return a plot object with the +// attribute "coolstring" +``` Now, given that the plugin might run in many different places, it's a good idea to avoid leaking names. The usual trick here is wrap the @@ -21,53 +22,56 @@ this: (function () { inner code ... })(). To make it even more robust in case $ is not bound to jQuery but some other Javascript library, we can write it as - (function ($) { +```js +(function ($) { // plugin definition // ... - })(jQuery); +})(jQuery); +``` There's a complete example below, but you should also check out the plugins bundled with Flot. -Complete example ----------------- +## Complete example ## Here is a simple debug plugin which alerts each of the series in the plot. It has a single option that control whether it is enabled and how much info to output: - (function ($) { +```js +(function ($) { function init(plot) { - var debugLevel = 1; - - function checkDebugEnabled(plot, options) { - if (options.debug) { - debugLevel = options.debug; - - plot.hooks.processDatapoints.push(alertSeries); - } - } + var debugLevel = 1; - function alertSeries(plot, series, datapoints) { - var msg = "series " + series.label; - if (debugLevel > 1) - msg += " with " + series.data.length + " points"; - alert(msg); - } - - plot.hooks.processOptions.push(checkDebugEnabled); + function checkDebugEnabled(plot, options) { + if (options.debug) { + debugLevel = options.debug; + plot.hooks.processDatapoints.push(alertSeries); + } + } + + function alertSeries(plot, series, datapoints) { + var msg = "series " + series.label; + if (debugLevel > 1) { + msg += " with " + series.data.length + " points"; + alert(msg); + } + } + + plot.hooks.processOptions.push(checkDebugEnabled); } var options = { debug: 0 }; - + $.plot.plugins.push({ init: init, options: options, name: "simpledebug", version: "0.1" }); - })(jQuery); +})(jQuery); +``` We also define "name" and "version". It's not used by Flot, but might be helpful for other plugins in resolving dependencies. @@ -75,7 +79,9 @@ be helpful for other plugins in resolving dependencies. Put the above in a file named "jquery.flot.debug.js", include it in an HTML page and then it can be used with: - $.plot($("#placeholder"), [...], { debug: 2 }); +```js + $.plot($("#placeholder"), [...], { debug: 2 }); +``` This simple plugin illustrates a couple of points: @@ -88,8 +94,7 @@ The two last points are important because there may be multiple plots on the same page, and you'd want to make sure they are not mixed up. -Shutting down a plugin ----------------------- +## Shutting down a plugin ## Each plot object has a shutdown hook which is run when plot.shutdown() is called. This usually mostly happens in case another plot is made on @@ -107,8 +112,7 @@ garbage collected yet, and worse, if your handler eventually runs, it may overwrite stuff on a completely different plot. -Some hints on the options -------------------------- +## Some hints on the options ## Plugins should always support appropriate options to enable/disable them because the plugin user may have several plots on the same page @@ -120,14 +124,16 @@ If the plugin needs options that are specific to each series, like the points or lines options in core Flot, you can put them in "series" in the options object, e.g. - var options = { +```js +var options = { series: { - downsample: { - algorithm: null, - maxpoints: 1000 - } + downsample: { + algorithm: null, + maxpoints: 1000 + } } - } +} +``` Then they will be copied by Flot into each series, providing default values in case none are specified. diff --git a/htdocs/includes/jquery/plugins/flot/README.md b/htdocs/includes/jquery/plugins/flot/README.md new file mode 100644 index 00000000000..4de7bdef59c --- /dev/null +++ b/htdocs/includes/jquery/plugins/flot/README.md @@ -0,0 +1,110 @@ +# Flot [![Build status](https://travis-ci.org/flot/flot.png)](https://travis-ci.org/flot/flot) + +## About ## + +Flot is a Javascript plotting library for jQuery. +Read more at the website: + +Take a look at the the examples in examples/index.html; they should give a good +impression of what Flot can do, and the source code of the examples is probably +the fastest way to learn how to use Flot. + + +## Installation ## + +Just include the Javascript file after you've included jQuery. + +Generally, all browsers that support the HTML5 canvas tag are +supported. + +For support for Internet Explorer < 9, you can use [Excanvas] +[excanvas], a canvas emulator; this is used in the examples bundled +with Flot. You just include the excanvas script like this: + +```html + +``` + +If it's not working on your development IE 6.0, check that it has +support for VML which Excanvas is relying on. It appears that some +stripped down versions used for test environments on virtual machines +lack the VML support. + +You can also try using [Flashcanvas][flashcanvas], which uses Flash to +do the emulation. Although Flash can be a bit slower to load than VML, +if you've got a lot of points, the Flash version can be much faster +overall. Flot contains some wrapper code for activating Excanvas which +Flashcanvas is compatible with. + +You need at least jQuery 1.2.6, but try at least 1.3.2 for interactive +charts because of performance improvements in event handling. + + +## Basic usage ## + +Create a placeholder div to put the graph in: + +```html +
+``` + +You need to set the width and height of this div, otherwise the plot +library doesn't know how to scale the graph. You can do it inline like +this: + +```html +
+``` + +You can also do it with an external stylesheet. Make sure that the +placeholder isn't within something with a display:none CSS property - +in that case, Flot has trouble measuring label dimensions which +results in garbled looks and might have trouble measuring the +placeholder dimensions which is fatal (it'll throw an exception). + +Then when the div is ready in the DOM, which is usually on document +ready, run the plot function: + +```js +$.plot($("#placeholder"), data, options); +``` + +Here, data is an array of data series and options is an object with +settings if you want to customize the plot. Take a look at the +examples for some ideas of what to put in or look at the +[API reference](API.md). Here's a quick example that'll draw a line +from (0, 0) to (1, 1): + +```js +$.plot($("#placeholder"), [ [[0, 0], [1, 1]] ], { yaxis: { max: 1 } }); +``` + +The plot function immediately draws the chart and then returns a plot +object with a couple of methods. + + +## What's with the name? ## + +First: it's pronounced with a short o, like "plot". Not like "flawed". + +So "Flot" rhymes with "plot". + +And if you look up "flot" in a Danish-to-English dictionary, some of +the words that come up are "good-looking", "attractive", "stylish", +"smart", "impressive", "extravagant". One of the main goals with Flot +is pretty looks. + + +## Notes about the examples ## + +In order to have a useful, functional example of time-series plots using time +zones, date.js from [timezone-js][timezone-js] (released under the Apache 2.0 +license) and the [Olson][olson] time zone database (released to the public +domain) have been included in the examples directory. They are used in +examples/axes-time-zones/index.html. + + +[excanvas]: http://code.google.com/p/explorercanvas/ +[flashcanvas]: http://code.google.com/p/flashcanvas/ +[timezone-js]: https://github.com/mde/timezone-js +[olson]: ftp://ftp.iana.org/tz/ diff --git a/htdocs/includes/jquery/plugins/flot/README.txt b/htdocs/includes/jquery/plugins/flot/README.txt deleted file mode 100755 index 1e49787a058..00000000000 --- a/htdocs/includes/jquery/plugins/flot/README.txt +++ /dev/null @@ -1,90 +0,0 @@ -About ------ - -Flot is a Javascript plotting library for jQuery. Read more at the -website: - - http://code.google.com/p/flot/ - -Take a look at the examples linked from above, they should give a good -impression of what Flot can do and the source code of the examples is -probably the fastest way to learn how to use Flot. - - -Installation ------------- - -Just include the Javascript file after you've included jQuery. - -Generally, all browsers that support the HTML5 canvas tag are -supported. - -For support for Internet Explorer < 9, you can use Excanvas, a canvas -emulator; this is used in the examples bundled with Flot. You just -include the excanvas script like this: - - - -If it's not working on your development IE 6.0, check that it has -support for VML which Excanvas is relying on. It appears that some -stripped down versions used for test environments on virtual machines -lack the VML support. - -You can also try using Flashcanvas (see -http://code.google.com/p/flashcanvas/), which uses Flash to do the -emulation. Although Flash can be a bit slower to load than VML, if -you've got a lot of points, the Flash version can be much faster -overall. Flot contains some wrapper code for activating Excanvas which -Flashcanvas is compatible with. - -You need at least jQuery 1.2.6, but try at least 1.3.2 for interactive -charts because of performance improvements in event handling. - - -Basic usage ------------ - -Create a placeholder div to put the graph in: - -
- -You need to set the width and height of this div, otherwise the plot -library doesn't know how to scale the graph. You can do it inline like -this: - -
- -You can also do it with an external stylesheet. Make sure that the -placeholder isn't within something with a display:none CSS property - -in that case, Flot has trouble measuring label dimensions which -results in garbled looks and might have trouble measuring the -placeholder dimensions which is fatal (it'll throw an exception). - -Then when the div is ready in the DOM, which is usually on document -ready, run the plot function: - - $.plot($("#placeholder"), data, options); - -Here, data is an array of data series and options is an object with -settings if you want to customize the plot. Take a look at the -examples for some ideas of what to put in or look at the reference -in the file "API.txt". Here's a quick example that'll draw a line from -(0, 0) to (1, 1): - - $.plot($("#placeholder"), [ [[0, 0], [1, 1]] ], { yaxis: { max: 1 } }); - -The plot function immediately draws the chart and then returns a plot -object with a couple of methods. - - -What's with the name? ---------------------- - -First: it's pronounced with a short o, like "plot". Not like "flawed". - -So "Flot" rhymes with "plot". - -And if you look up "flot" in a Danish-to-English dictionary, some up -the words that come up are "good-looking", "attractive", "stylish", -"smart", "impressive", "extravagant". One of the main goals with Flot -is pretty looks. diff --git a/htdocs/includes/jquery/plugins/flot/excanvas.js b/htdocs/includes/jquery/plugins/flot/excanvas.js old mode 100755 new mode 100644 index c40d6f7014d..70a8f25ca86 --- a/htdocs/includes/jquery/plugins/flot/excanvas.js +++ b/htdocs/includes/jquery/plugins/flot/excanvas.js @@ -49,6 +49,8 @@ if (!document.createElement('canvas').getContext) { var Z = 10; var Z2 = Z / 2; + var IE_VERSION = +navigator.userAgent.match(/MSIE ([\d.]+)?/)[1]; + /** * This funtion is assigned to the elements as element.getContext(). * @this {HTMLElement} @@ -88,17 +90,15 @@ if (!document.createElement('canvas').getContext) { return String(s).replace(/&/g, '&').replace(/"/g, '"'); } - function addNamespacesAndStylesheet(doc) { - // create xmlns - if (!doc.namespaces['g_vml_']) { - doc.namespaces.add('g_vml_', 'urn:schemas-microsoft-com:vml', - '#default#VML'); + function addNamespace(doc, prefix, urn) { + if (!doc.namespaces[prefix]) { + doc.namespaces.add(prefix, urn, '#default#VML'); + } + } - } - if (!doc.namespaces['g_o_']) { - doc.namespaces.add('g_o_', 'urn:schemas-microsoft-com:office:office', - '#default#VML'); - } + function addNamespacesAndStylesheet(doc) { + addNamespace(doc, 'g_vml_', 'urn:schemas-microsoft-com:vml'); + addNamespace(doc, 'g_o_', 'urn:schemas-microsoft-com:office:office'); // Setup default CSS. Only add one style sheet per document if (!doc.styleSheets['ex_canvas_']) { @@ -115,13 +115,11 @@ if (!document.createElement('canvas').getContext) { var G_vmlCanvasManager_ = { init: function(opt_doc) { - if (/MSIE/.test(navigator.userAgent) && !window.opera) { - var doc = opt_doc || document; - // Create a dummy element so that IE will allow canvas elements to be - // recognized. - doc.createElement('canvas'); - doc.attachEvent('onreadystatechange', bind(this.init_, this, doc)); - } + var doc = opt_doc || document; + // Create a dummy element so that IE will allow canvas elements to be + // recognized. + doc.createElement('canvas'); + doc.attachEvent('onreadystatechange', bind(this.init_, this, doc)); }, init_: function(doc) { @@ -398,9 +396,7 @@ if (!document.createElement('canvas').getContext) { var end = styleString.indexOf(')', start + 1); var parts = styleString.substring(start + 1, end).split(','); // add alpha if needed - if (parts.length == 4 && styleString.substr(3, 1) == 'a') { - alpha = Number(parts[3]); - } else { + if (parts.length != 4 || styleString.charAt(3) != 'a') { parts[3] = 1; } return parts; @@ -415,7 +411,7 @@ if (!document.createElement('canvas').getContext) { } function hslToRgb(parts){ - var r, g, b; + var r, g, b, h, s, l; h = parseFloat(parts[0]) / 360 % 360; if (h < 0) h++; @@ -452,7 +448,13 @@ if (!document.createElement('canvas').getContext) { return m1; } + var processStyleCache = {}; + function processStyle(styleString) { + if (styleString in processStyleCache) { + return processStyleCache[styleString]; + } + var str, alpha = 1; styleString = String(styleString); @@ -465,11 +467,11 @@ if (!document.createElement('canvas').getContext) { if (parts[i].indexOf('%') != -1) { n = Math.floor(percent(parts[i]) * 255); } else { - n = Number(parts[i]); + n = +parts[i]; } str += decToHex[clamp(n, 0, 255)]; } - alpha = parts[3]; + alpha = +parts[3]; } else if (/^hsl/.test(styleString)) { var parts = getRgbHslContent(styleString); str = hslToRgb(parts); @@ -477,7 +479,7 @@ if (!document.createElement('canvas').getContext) { } else { str = colorData[styleString] || styleString; } - return {color: str, alpha: alpha}; + return processStyleCache[styleString] = {color: str, alpha: alpha}; } var DEFAULT_STYLE = { @@ -550,25 +552,22 @@ if (!document.createElement('canvas').getContext) { style.size + 'px ' + style.family; } + var lineCapMap = { + 'butt': 'flat', + 'round': 'round' + }; + function processLineCap(lineCap) { - switch (lineCap) { - case 'butt': - return 'flat'; - case 'round': - return 'round'; - case 'square': - default: - return 'square'; - } + return lineCapMap[lineCap] || 'square'; } /** * This class implements CanvasRenderingContext2D interface as described by * the WHATWG. - * @param {HTMLElement} surfaceElement The element that the 2D context should + * @param {HTMLElement} canvasElement The element that the 2D context should * be associated with */ - function CanvasRenderingContext2D_(surfaceElement) { + function CanvasRenderingContext2D_(canvasElement) { this.m_ = createMatrixIdentity(); this.mStack_ = []; @@ -587,14 +586,19 @@ if (!document.createElement('canvas').getContext) { this.font = '10px sans-serif'; this.textAlign = 'left'; this.textBaseline = 'alphabetic'; - this.canvas = surfaceElement; + this.canvas = canvasElement; - var el = surfaceElement.ownerDocument.createElement('div'); - el.style.width = surfaceElement.clientWidth + 'px'; - el.style.height = surfaceElement.clientHeight + 'px'; - el.style.overflow = 'hidden'; - el.style.position = 'absolute'; - surfaceElement.appendChild(el); + var cssText = 'width:' + canvasElement.clientWidth + 'px;height:' + + canvasElement.clientHeight + 'px;overflow:hidden;position:absolute'; + var el = canvasElement.ownerDocument.createElement('div'); + el.style.cssText = cssText; + canvasElement.appendChild(el); + + var overlayEl = el.cloneNode(false); + // Use a non transparent background. + overlayEl.style.backgroundColor = 'red'; + overlayEl.style.filter = 'alpha(opacity=0)'; + canvasElement.appendChild(overlayEl); this.element_ = el; this.arcScaleX_ = 1; @@ -618,14 +622,14 @@ if (!document.createElement('canvas').getContext) { }; contextPrototype.moveTo = function(aX, aY) { - var p = this.getCoords_(aX, aY); + var p = getCoords(this, aX, aY); this.currentPath_.push({type: 'moveTo', x: p.x, y: p.y}); this.currentX_ = p.x; this.currentY_ = p.y; }; contextPrototype.lineTo = function(aX, aY) { - var p = this.getCoords_(aX, aY); + var p = getCoords(this, aX, aY); this.currentPath_.push({type: 'lineTo', x: p.x, y: p.y}); this.currentX_ = p.x; @@ -635,9 +639,9 @@ if (!document.createElement('canvas').getContext) { contextPrototype.bezierCurveTo = function(aCP1x, aCP1y, aCP2x, aCP2y, aX, aY) { - var p = this.getCoords_(aX, aY); - var cp1 = this.getCoords_(aCP1x, aCP1y); - var cp2 = this.getCoords_(aCP2x, aCP2y); + var p = getCoords(this, aX, aY); + var cp1 = getCoords(this, aCP1x, aCP1y); + var cp2 = getCoords(this, aCP2x, aCP2y); bezierCurveTo(this, cp1, cp2, p); }; @@ -660,8 +664,8 @@ if (!document.createElement('canvas').getContext) { // the following is lifted almost directly from // http://developer.mozilla.org/en/docs/Canvas_tutorial:Drawing_shapes - var cp = this.getCoords_(aCPx, aCPy); - var p = this.getCoords_(aX, aY); + var cp = getCoords(this, aCPx, aCPy); + var p = getCoords(this, aX, aY); var cp1 = { x: this.currentX_ + 2.0 / 3.0 * (cp.x - this.currentX_), @@ -692,9 +696,9 @@ if (!document.createElement('canvas').getContext) { // that can be represented in binary } - var p = this.getCoords_(aX, aY); - var pStart = this.getCoords_(xStart, yStart); - var pEnd = this.getCoords_(xEnd, yEnd); + var p = getCoords(this, aX, aY); + var pStart = getCoords(this, xStart, yStart); + var pEnd = getCoords(this, xEnd, yEnd); this.currentPath_.push({type: arcType, x: p.x, @@ -808,7 +812,7 @@ if (!document.createElement('canvas').getContext) { throw Error('Invalid number of arguments'); } - var d = this.getCoords_(dx, dy); + var d = getCoords(this, dx, dy); var w2 = sw / 2; var h2 = sh / 2; @@ -844,9 +848,9 @@ if (!document.createElement('canvas').getContext) { // Bounding box calculation (need to minimize displayed area so that // filters don't waste time on unused pixels. var max = d; - var c2 = this.getCoords_(dx + dw, dy); - var c3 = this.getCoords_(dx, dy + dh); - var c4 = this.getCoords_(dx + dw, dy + dh); + var c2 = getCoords(this, dx + dw, dy); + var c3 = getCoords(this, dx, dy + dh); + var c4 = getCoords(this, dx + dw, dy + dh); max.x = m.max(max.x, c2.x, c3.x, c4.x); max.y = m.max(max.y, c2.y, c3.y, c4.y); @@ -1015,8 +1019,8 @@ if (!document.createElement('canvas').getContext) { var y0 = fillStyle.y0_ / arcScaleY; var x1 = fillStyle.x1_ / arcScaleX; var y1 = fillStyle.y1_ / arcScaleY; - var p0 = ctx.getCoords_(x0, y0); - var p1 = ctx.getCoords_(x1, y1); + var p0 = getCoords(ctx, x0, y0); + var p1 = getCoords(ctx, x1, y1); var dx = p1.x - p0.x; var dy = p1.y - p0.y; angle = Math.atan2(dx, dy) * 180 / Math.PI; @@ -1032,7 +1036,7 @@ if (!document.createElement('canvas').getContext) { angle = 0; } } else { - var p0 = ctx.getCoords_(fillStyle.x0_, fillStyle.y0_); + var p0 = getCoords(ctx, fillStyle.x0_, fillStyle.y0_); focus = { x: (p0.x - min.x) / width, y: (p0.y - min.y) / height @@ -1105,11 +1109,8 @@ if (!document.createElement('canvas').getContext) { this.currentPath_.push({type: 'close'}); }; - /** - * @private - */ - contextPrototype.getCoords_ = function(aX, aY) { - var m = this.m_; + function getCoords(ctx, aX, aY) { + var m = ctx.m_; return { x: Z * (aX * m[0][0] + aY * m[1][0] + m[2][0]) - Z2, y: Z * (aX * m[0][1] + aY * m[1][1] + m[2][1]) - Z2 @@ -1270,7 +1271,7 @@ if (!document.createElement('canvas').getContext) { break; } - var d = this.getCoords_(x + offset.x, y + offset.y); + var d = getCoords(this, x + offset.x, y + offset.y); lineStr.push('1){j--}if(6*j<1){return i+(Z-i)*6*j}else{if(2*j<1){return Z}else{if(3*j<2){return i+(Z-i)*(2/3-j)*6}else{return i}}}}function Y(Z){var AE,p=1;Z=String(Z);if(Z.charAt(0)=="#"){AE=Z}else{if(/^rgb/.test(Z)){var m=g(Z);var AE="#",AF;for(var j=0;j<3;j++){if(m[j].indexOf("%")!=-1){AF=Math.floor(C(m[j])*255)}else{AF=Number(m[j])}AE+=I[N(AF,0,255)]}p=m[3]}else{if(/^hsl/.test(Z)){var m=g(Z);AE=c(m);p=m[3]}else{AE=B[Z]||Z}}}return{color:AE,alpha:p}}var L={style:"normal",variant:"normal",weight:"normal",size:10,family:"sans-serif"};var f={};function X(Z){if(f[Z]){return f[Z]}var m=document.createElement("div");var j=m.style;try{j.font=Z}catch(i){}return f[Z]={style:j.fontStyle||L.style,variant:j.fontVariant||L.variant,weight:j.fontWeight||L.weight,size:j.fontSize||L.size,family:j.fontFamily||L.family}}function P(j,i){var Z={};for(var AF in j){Z[AF]=j[AF]}var AE=parseFloat(i.currentStyle.fontSize),m=parseFloat(j.size);if(typeof j.size=="number"){Z.size=j.size}else{if(j.size.indexOf("px")!=-1){Z.size=m}else{if(j.size.indexOf("em")!=-1){Z.size=AE*m}else{if(j.size.indexOf("%")!=-1){Z.size=(AE/100)*m}else{if(j.size.indexOf("pt")!=-1){Z.size=m/0.75}else{Z.size=AE}}}}}Z.size*=0.981;return Z}function AA(Z){return Z.style+" "+Z.variant+" "+Z.weight+" "+Z.size+"px "+Z.family}function t(Z){switch(Z){case"butt":return"flat";case"round":return"round";case"square":default:return"square"}}function W(i){this.m_=V();this.mStack_=[];this.aStack_=[];this.currentPath_=[];this.strokeStyle="#000";this.fillStyle="#000";this.lineWidth=1;this.lineJoin="miter";this.lineCap="butt";this.miterLimit=D*1;this.globalAlpha=1;this.font="10px sans-serif";this.textAlign="left";this.textBaseline="alphabetic";this.canvas=i;var Z=i.ownerDocument.createElement("div");Z.style.width=i.clientWidth+"px";Z.style.height=i.clientHeight+"px";Z.style.overflow="hidden";Z.style.position="absolute";i.appendChild(Z);this.element_=Z;this.arcScaleX_=1;this.arcScaleY_=1;this.lineScale_=1}var M=W.prototype;M.clearRect=function(){if(this.textMeasureEl_){this.textMeasureEl_.removeNode(true);this.textMeasureEl_=null}this.element_.innerHTML=""};M.beginPath=function(){this.currentPath_=[]};M.moveTo=function(i,Z){var j=this.getCoords_(i,Z);this.currentPath_.push({type:"moveTo",x:j.x,y:j.y});this.currentX_=j.x;this.currentY_=j.y};M.lineTo=function(i,Z){var j=this.getCoords_(i,Z);this.currentPath_.push({type:"lineTo",x:j.x,y:j.y});this.currentX_=j.x;this.currentY_=j.y};M.bezierCurveTo=function(j,i,AI,AH,AG,AE){var Z=this.getCoords_(AG,AE);var AF=this.getCoords_(j,i);var m=this.getCoords_(AI,AH);e(this,AF,m,Z)};function e(Z,m,j,i){Z.currentPath_.push({type:"bezierCurveTo",cp1x:m.x,cp1y:m.y,cp2x:j.x,cp2y:j.y,x:i.x,y:i.y});Z.currentX_=i.x;Z.currentY_=i.y}M.quadraticCurveTo=function(AG,j,i,Z){var AF=this.getCoords_(AG,j);var AE=this.getCoords_(i,Z);var AH={x:this.currentX_+2/3*(AF.x-this.currentX_),y:this.currentY_+2/3*(AF.y-this.currentY_)};var m={x:AH.x+(AE.x-this.currentX_)/3,y:AH.y+(AE.y-this.currentY_)/3};e(this,AH,m,AE)};M.arc=function(AJ,AH,AI,AE,i,j){AI*=D;var AN=j?"at":"wa";var AK=AJ+U(AE)*AI-F;var AM=AH+J(AE)*AI-F;var Z=AJ+U(i)*AI-F;var AL=AH+J(i)*AI-F;if(AK==Z&&!j){AK+=0.125}var m=this.getCoords_(AJ,AH);var AG=this.getCoords_(AK,AM);var AF=this.getCoords_(Z,AL);this.currentPath_.push({type:AN,x:m.x,y:m.y,radius:AI,xStart:AG.x,yStart:AG.y,xEnd:AF.x,yEnd:AF.y})};M.rect=function(j,i,Z,m){this.moveTo(j,i);this.lineTo(j+Z,i);this.lineTo(j+Z,i+m);this.lineTo(j,i+m);this.closePath()};M.strokeRect=function(j,i,Z,m){var p=this.currentPath_;this.beginPath();this.moveTo(j,i);this.lineTo(j+Z,i);this.lineTo(j+Z,i+m);this.lineTo(j,i+m);this.closePath();this.stroke();this.currentPath_=p};M.fillRect=function(j,i,Z,m){var p=this.currentPath_;this.beginPath();this.moveTo(j,i);this.lineTo(j+Z,i);this.lineTo(j+Z,i+m);this.lineTo(j,i+m);this.closePath();this.fill();this.currentPath_=p};M.createLinearGradient=function(i,m,Z,j){var p=new v("gradient");p.x0_=i;p.y0_=m;p.x1_=Z;p.y1_=j;return p};M.createRadialGradient=function(m,AE,j,i,p,Z){var AF=new v("gradientradial");AF.x0_=m;AF.y0_=AE;AF.r0_=j;AF.x1_=i;AF.y1_=p;AF.r1_=Z;return AF};M.drawImage=function(AO,j){var AH,AF,AJ,AV,AM,AK,AQ,AX;var AI=AO.runtimeStyle.width;var AN=AO.runtimeStyle.height;AO.runtimeStyle.width="auto";AO.runtimeStyle.height="auto";var AG=AO.width;var AT=AO.height;AO.runtimeStyle.width=AI;AO.runtimeStyle.height=AN;if(arguments.length==3){AH=arguments[1];AF=arguments[2];AM=AK=0;AQ=AJ=AG;AX=AV=AT}else{if(arguments.length==5){AH=arguments[1];AF=arguments[2];AJ=arguments[3];AV=arguments[4];AM=AK=0;AQ=AG;AX=AT}else{if(arguments.length==9){AM=arguments[1];AK=arguments[2];AQ=arguments[3];AX=arguments[4];AH=arguments[5];AF=arguments[6];AJ=arguments[7];AV=arguments[8]}else{throw Error("Invalid number of arguments")}}}var AW=this.getCoords_(AH,AF);var m=AQ/2;var i=AX/2;var AU=[];var Z=10;var AE=10;AU.push(" ','","");this.element_.insertAdjacentHTML("BeforeEnd",AU.join(""))};M.stroke=function(AM){var m=10;var AN=10;var AE=5000;var AG={x:null,y:null};var AL={x:null,y:null};for(var AH=0;AHAL.x){AL.x=Z.x}if(AG.y==null||Z.yAL.y){AL.y=Z.y}}}AK.push(' ">');if(!AM){R(this,AK)}else{a(this,AK,AG,AL)}AK.push("");this.element_.insertAdjacentHTML("beforeEnd",AK.join(""))}};function R(j,AE){var i=Y(j.strokeStyle);var m=i.color;var p=i.alpha*j.globalAlpha;var Z=j.lineScale_*j.lineWidth;if(Z<1){p*=Z}AE.push("')}function a(AO,AG,Ah,AP){var AH=AO.fillStyle;var AY=AO.arcScaleX_;var AX=AO.arcScaleY_;var Z=AP.x-Ah.x;var m=AP.y-Ah.y;if(AH instanceof v){var AL=0;var Ac={x:0,y:0};var AU=0;var AK=1;if(AH.type_=="gradient"){var AJ=AH.x0_/AY;var j=AH.y0_/AX;var AI=AH.x1_/AY;var Aj=AH.y1_/AX;var Ag=AO.getCoords_(AJ,j);var Af=AO.getCoords_(AI,Aj);var AE=Af.x-Ag.x;var p=Af.y-Ag.y;AL=Math.atan2(AE,p)*180/Math.PI;if(AL<0){AL+=360}if(AL<0.000001){AL=0}}else{var Ag=AO.getCoords_(AH.x0_,AH.y0_);Ac={x:(Ag.x-Ah.x)/Z,y:(Ag.y-Ah.y)/m};Z/=AY*D;m/=AX*D;var Aa=z.max(Z,m);AU=2*AH.r0_/Aa;AK=2*AH.r1_/Aa-AU}var AS=AH.colors_;AS.sort(function(Ak,i){return Ak.offset-i.offset});var AN=AS.length;var AR=AS[0].color;var AQ=AS[AN-1].color;var AW=AS[0].alpha*AO.globalAlpha;var AV=AS[AN-1].alpha*AO.globalAlpha;var Ab=[];for(var Ae=0;Ae')}else{if(AH instanceof u){if(Z&&m){var AF=-Ah.x;var AZ=-Ah.y;AG.push("')}}else{var Ai=Y(AO.fillStyle);var AT=Ai.color;var Ad=Ai.alpha*AO.globalAlpha;AG.push('')}}}M.fill=function(){this.stroke(true)};M.closePath=function(){this.currentPath_.push({type:"close"})};M.getCoords_=function(j,i){var Z=this.m_;return{x:D*(j*Z[0][0]+i*Z[1][0]+Z[2][0])-F,y:D*(j*Z[0][1]+i*Z[1][1]+Z[2][1])-F}};M.save=function(){var Z={};Q(this,Z);this.aStack_.push(Z);this.mStack_.push(this.m_);this.m_=d(V(),this.m_)};M.restore=function(){if(this.aStack_.length){Q(this.aStack_.pop(),this);this.m_=this.mStack_.pop()}};function H(Z){return isFinite(Z[0][0])&&isFinite(Z[0][1])&&isFinite(Z[1][0])&&isFinite(Z[1][1])&&isFinite(Z[2][0])&&isFinite(Z[2][1])}function y(i,Z,j){if(!H(Z)){return }i.m_=Z;if(j){var p=Z[0][0]*Z[1][1]-Z[0][1]*Z[1][0];i.lineScale_=k(b(p))}}M.translate=function(j,i){var Z=[[1,0,0],[0,1,0],[j,i,1]];y(this,d(Z,this.m_),false)};M.rotate=function(i){var m=U(i);var j=J(i);var Z=[[m,j,0],[-j,m,0],[0,0,1]];y(this,d(Z,this.m_),false)};M.scale=function(j,i){this.arcScaleX_*=j;this.arcScaleY_*=i;var Z=[[j,0,0],[0,i,0],[0,0,1]];y(this,d(Z,this.m_),true)};M.transform=function(p,m,AF,AE,i,Z){var j=[[p,m,0],[AF,AE,0],[i,Z,1]];y(this,d(j,this.m_),true)};M.setTransform=function(AE,p,AG,AF,j,i){var Z=[[AE,p,0],[AG,AF,0],[j,i,1]];y(this,Z,true)};M.drawText_=function(AK,AI,AH,AN,AG){var AM=this.m_,AQ=1000,i=0,AP=AQ,AF={x:0,y:0},AE=[];var Z=P(X(this.font),this.element_);var j=AA(Z);var AR=this.element_.currentStyle;var p=this.textAlign.toLowerCase();switch(p){case"left":case"center":case"right":break;case"end":p=AR.direction=="ltr"?"right":"left";break;case"start":p=AR.direction=="rtl"?"right":"left";break;default:p="left"}switch(this.textBaseline){case"hanging":case"top":AF.y=Z.size/1.75;break;case"middle":break;default:case null:case"alphabetic":case"ideographic":case"bottom":AF.y=-Z.size/2.25;break}switch(p){case"right":i=AQ;AP=0.05;break;case"center":i=AP=AQ/2;break}var AO=this.getCoords_(AI+AF.x,AH+AF.y);AE.push('');if(AG){R(this,AE)}else{a(this,AE,{x:-i,y:0},{x:AP,y:Z.size})}var AL=AM[0][0].toFixed(3)+","+AM[1][0].toFixed(3)+","+AM[0][1].toFixed(3)+","+AM[1][1].toFixed(3)+",0,0";var AJ=K(AO.x/D)+","+K(AO.y/D);AE.push('','','');this.element_.insertAdjacentHTML("beforeEnd",AE.join(""))};M.fillText=function(j,Z,m,i){this.drawText_(j,Z,m,i,false)};M.strokeText=function(j,Z,m,i){this.drawText_(j,Z,m,i,true)};M.measureText=function(j){if(!this.textMeasureEl_){var Z='';this.element_.insertAdjacentHTML("beforeEnd",Z);this.textMeasureEl_=this.element_.lastChild}var i=this.element_.ownerDocument;this.textMeasureEl_.innerHTML="";this.textMeasureEl_.style.font=this.font;this.textMeasureEl_.appendChild(i.createTextNode(j));return{width:this.textMeasureEl_.offsetWidth}};M.clip=function(){};M.arcTo=function(){};M.createPattern=function(i,Z){return new u(i,Z)};function v(Z){this.type_=Z;this.x0_=0;this.y0_=0;this.r0_=0;this.x1_=0;this.y1_=0;this.r1_=0;this.colors_=[]}v.prototype.addColorStop=function(i,Z){Z=Y(Z);this.colors_.push({offset:i,color:Z.color,alpha:Z.alpha})};function u(i,Z){q(i);switch(Z){case"repeat":case null:case"":this.repetition_="repeat";break;case"repeat-x":case"repeat-y":case"no-repeat":this.repetition_=Z;break;default:n("SYNTAX_ERR")}this.src_=i.src;this.width_=i.width;this.height_=i.height}function n(Z){throw new o(Z)}function q(Z){if(!Z||Z.nodeType!=1||Z.tagName!="IMG"){n("TYPE_MISMATCH_ERR")}if(Z.readyState!="complete"){n("INVALID_STATE_ERR")}}function o(Z){this.code=this[Z];this.message=Z+": DOM Exception "+this.code}var x=o.prototype=new Error;x.INDEX_SIZE_ERR=1;x.DOMSTRING_SIZE_ERR=2;x.HIERARCHY_REQUEST_ERR=3;x.WRONG_DOCUMENT_ERR=4;x.INVALID_CHARACTER_ERR=5;x.NO_DATA_ALLOWED_ERR=6;x.NO_MODIFICATION_ALLOWED_ERR=7;x.NOT_FOUND_ERR=8;x.NOT_SUPPORTED_ERR=9;x.INUSE_ATTRIBUTE_ERR=10;x.INVALID_STATE_ERR=11;x.SYNTAX_ERR=12;x.INVALID_MODIFICATION_ERR=13;x.NAMESPACE_ERR=14;x.INVALID_ACCESS_ERR=15;x.VALIDATION_ERR=16;x.TYPE_MISMATCH_ERR=17;G_vmlCanvasManager=E;CanvasRenderingContext2D=W;CanvasGradient=v;CanvasPattern=u;DOMException=o})()}; \ No newline at end of file +if(!document.createElement("canvas").getContext){(function(){var ab=Math;var n=ab.round;var l=ab.sin;var A=ab.cos;var H=ab.abs;var N=ab.sqrt;var d=10;var f=d/2;var z=+navigator.userAgent.match(/MSIE ([\d.]+)?/)[1];function y(){return this.context_||(this.context_=new D(this))}var t=Array.prototype.slice;function g(j,m,p){var i=t.call(arguments,2);return function(){return j.apply(m,i.concat(t.call(arguments)))}}function af(i){return String(i).replace(/&/g,"&").replace(/"/g,""")}function Y(m,j,i){if(!m.namespaces[j]){m.namespaces.add(j,i,"#default#VML")}}function R(j){Y(j,"g_vml_","urn:schemas-microsoft-com:vml");Y(j,"g_o_","urn:schemas-microsoft-com:office:office");if(!j.styleSheets.ex_canvas_){var i=j.createStyleSheet();i.owningElement.id="ex_canvas_";i.cssText="canvas{display:inline-block;overflow:hidden;text-align:left;width:300px;height:150px}"}}R(document);var e={init:function(i){var j=i||document;j.createElement("canvas");j.attachEvent("onreadystatechange",g(this.init_,this,j))},init_:function(p){var m=p.getElementsByTagName("canvas");for(var j=0;j1){m--}if(6*m<1){return j+(i-j)*6*m}else{if(2*m<1){return i}else{if(3*m<2){return j+(i-j)*(2/3-m)*6}else{return j}}}}var C={};function F(j){if(j in C){return C[j]}var ag,Z=1;j=String(j);if(j.charAt(0)=="#"){ag=j}else{if(/^rgb/.test(j)){var p=M(j);var ag="#",ah;for(var m=0;m<3;m++){if(p[m].indexOf("%")!=-1){ah=Math.floor(c(p[m])*255)}else{ah=+p[m]}ag+=k[r(ah,0,255)]}Z=+p[3]}else{if(/^hsl/.test(j)){var p=M(j);ag=I(p);Z=p[3]}else{ag=b[j]||j}}}return C[j]={color:ag,alpha:Z}}var o={style:"normal",variant:"normal",weight:"normal",size:10,family:"sans-serif"};var L={};function E(i){if(L[i]){return L[i]}var p=document.createElement("div");var m=p.style;try{m.font=i}catch(j){}return L[i]={style:m.fontStyle||o.style,variant:m.fontVariant||o.variant,weight:m.fontWeight||o.weight,size:m.fontSize||o.size,family:m.fontFamily||o.family}}function u(m,j){var i={};for(var ah in m){i[ah]=m[ah]}var ag=parseFloat(j.currentStyle.fontSize),Z=parseFloat(m.size);if(typeof m.size=="number"){i.size=m.size}else{if(m.size.indexOf("px")!=-1){i.size=Z}else{if(m.size.indexOf("em")!=-1){i.size=ag*Z}else{if(m.size.indexOf("%")!=-1){i.size=(ag/100)*Z}else{if(m.size.indexOf("pt")!=-1){i.size=Z/0.75}else{i.size=ag}}}}}i.size*=0.981;return i}function ac(i){return i.style+" "+i.variant+" "+i.weight+" "+i.size+"px "+i.family}var s={butt:"flat",round:"round"};function S(i){return s[i]||"square"}function D(i){this.m_=B();this.mStack_=[];this.aStack_=[];this.currentPath_=[];this.strokeStyle="#000";this.fillStyle="#000";this.lineWidth=1;this.lineJoin="miter";this.lineCap="butt";this.miterLimit=d*1;this.globalAlpha=1;this.font="10px sans-serif";this.textAlign="left";this.textBaseline="alphabetic";this.canvas=i;var m="width:"+i.clientWidth+"px;height:"+i.clientHeight+"px;overflow:hidden;position:absolute";var j=i.ownerDocument.createElement("div");j.style.cssText=m;i.appendChild(j);var p=j.cloneNode(false);p.style.backgroundColor="red";p.style.filter="alpha(opacity=0)";i.appendChild(p);this.element_=j;this.arcScaleX_=1;this.arcScaleY_=1;this.lineScale_=1}var q=D.prototype;q.clearRect=function(){if(this.textMeasureEl_){this.textMeasureEl_.removeNode(true);this.textMeasureEl_=null}this.element_.innerHTML=""};q.beginPath=function(){this.currentPath_=[]};q.moveTo=function(j,i){var m=V(this,j,i);this.currentPath_.push({type:"moveTo",x:m.x,y:m.y});this.currentX_=m.x;this.currentY_=m.y};q.lineTo=function(j,i){var m=V(this,j,i);this.currentPath_.push({type:"lineTo",x:m.x,y:m.y});this.currentX_=m.x;this.currentY_=m.y};q.bezierCurveTo=function(m,j,ak,aj,ai,ag){var i=V(this,ai,ag);var ah=V(this,m,j);var Z=V(this,ak,aj);K(this,ah,Z,i)};function K(i,Z,m,j){i.currentPath_.push({type:"bezierCurveTo",cp1x:Z.x,cp1y:Z.y,cp2x:m.x,cp2y:m.y,x:j.x,y:j.y});i.currentX_=j.x;i.currentY_=j.y}q.quadraticCurveTo=function(ai,m,j,i){var ah=V(this,ai,m);var ag=V(this,j,i);var aj={x:this.currentX_+2/3*(ah.x-this.currentX_),y:this.currentY_+2/3*(ah.y-this.currentY_)};var Z={x:aj.x+(ag.x-this.currentX_)/3,y:aj.y+(ag.y-this.currentY_)/3};K(this,aj,Z,ag)};q.arc=function(al,aj,ak,ag,j,m){ak*=d;var ap=m?"at":"wa";var am=al+A(ag)*ak-f;var ao=aj+l(ag)*ak-f;var i=al+A(j)*ak-f;var an=aj+l(j)*ak-f;if(am==i&&!m){am+=0.125}var Z=V(this,al,aj);var ai=V(this,am,ao);var ah=V(this,i,an);this.currentPath_.push({type:ap,x:Z.x,y:Z.y,radius:ak,xStart:ai.x,yStart:ai.y,xEnd:ah.x,yEnd:ah.y})};q.rect=function(m,j,i,p){this.moveTo(m,j);this.lineTo(m+i,j);this.lineTo(m+i,j+p);this.lineTo(m,j+p);this.closePath()};q.strokeRect=function(m,j,i,p){var Z=this.currentPath_;this.beginPath();this.moveTo(m,j);this.lineTo(m+i,j);this.lineTo(m+i,j+p);this.lineTo(m,j+p);this.closePath();this.stroke();this.currentPath_=Z};q.fillRect=function(m,j,i,p){var Z=this.currentPath_;this.beginPath();this.moveTo(m,j);this.lineTo(m+i,j);this.lineTo(m+i,j+p);this.lineTo(m,j+p);this.closePath();this.fill();this.currentPath_=Z};q.createLinearGradient=function(j,p,i,m){var Z=new U("gradient");Z.x0_=j;Z.y0_=p;Z.x1_=i;Z.y1_=m;return Z};q.createRadialGradient=function(p,ag,m,j,Z,i){var ah=new U("gradientradial");ah.x0_=p;ah.y0_=ag;ah.r0_=m;ah.x1_=j;ah.y1_=Z;ah.r1_=i;return ah};q.drawImage=function(aq,m){var aj,ah,al,ay,ao,am,at,aA;var ak=aq.runtimeStyle.width;var ap=aq.runtimeStyle.height;aq.runtimeStyle.width="auto";aq.runtimeStyle.height="auto";var ai=aq.width;var aw=aq.height;aq.runtimeStyle.width=ak;aq.runtimeStyle.height=ap;if(arguments.length==3){aj=arguments[1];ah=arguments[2];ao=am=0;at=al=ai;aA=ay=aw}else{if(arguments.length==5){aj=arguments[1];ah=arguments[2];al=arguments[3];ay=arguments[4];ao=am=0;at=ai;aA=aw}else{if(arguments.length==9){ao=arguments[1];am=arguments[2];at=arguments[3];aA=arguments[4];aj=arguments[5];ah=arguments[6];al=arguments[7];ay=arguments[8]}else{throw Error("Invalid number of arguments")}}}var az=V(this,aj,ah);var p=at/2;var j=aA/2;var ax=[];var i=10;var ag=10;ax.push(" ','","");this.element_.insertAdjacentHTML("BeforeEnd",ax.join(""))};q.stroke=function(ao){var Z=10;var ap=10;var ag=5000;var ai={x:null,y:null};var an={x:null,y:null};for(var aj=0;ajan.x){an.x=m.x}if(ai.y==null||m.yan.y){an.y=m.y}}}am.push(' ">');if(!ao){w(this,am)}else{G(this,am,ai,an)}am.push("");this.element_.insertAdjacentHTML("beforeEnd",am.join(""))}};function w(m,ag){var j=F(m.strokeStyle);var p=j.color;var Z=j.alpha*m.globalAlpha;var i=m.lineScale_*m.lineWidth;if(i<1){Z*=i}ag.push("')}function G(aq,ai,aK,ar){var aj=aq.fillStyle;var aB=aq.arcScaleX_;var aA=aq.arcScaleY_;var j=ar.x-aK.x;var p=ar.y-aK.y;if(aj instanceof U){var an=0;var aF={x:0,y:0};var ax=0;var am=1;if(aj.type_=="gradient"){var al=aj.x0_/aB;var m=aj.y0_/aA;var ak=aj.x1_/aB;var aM=aj.y1_/aA;var aJ=V(aq,al,m);var aI=V(aq,ak,aM);var ag=aI.x-aJ.x;var Z=aI.y-aJ.y;an=Math.atan2(ag,Z)*180/Math.PI;if(an<0){an+=360}if(an<0.000001){an=0}}else{var aJ=V(aq,aj.x0_,aj.y0_);aF={x:(aJ.x-aK.x)/j,y:(aJ.y-aK.y)/p};j/=aB*d;p/=aA*d;var aD=ab.max(j,p);ax=2*aj.r0_/aD;am=2*aj.r1_/aD-ax}var av=aj.colors_;av.sort(function(aN,i){return aN.offset-i.offset});var ap=av.length;var au=av[0].color;var at=av[ap-1].color;var az=av[0].alpha*aq.globalAlpha;var ay=av[ap-1].alpha*aq.globalAlpha;var aE=[];for(var aH=0;aH')}else{if(aj instanceof T){if(j&&p){var ah=-aK.x;var aC=-aK.y;ai.push("')}}else{var aL=F(aq.fillStyle);var aw=aL.color;var aG=aL.alpha*aq.globalAlpha;ai.push('')}}}q.fill=function(){this.stroke(true)};q.closePath=function(){this.currentPath_.push({type:"close"})};function V(j,Z,p){var i=j.m_;return{x:d*(Z*i[0][0]+p*i[1][0]+i[2][0])-f,y:d*(Z*i[0][1]+p*i[1][1]+i[2][1])-f}}q.save=function(){var i={};v(this,i);this.aStack_.push(i);this.mStack_.push(this.m_);this.m_=J(B(),this.m_)};q.restore=function(){if(this.aStack_.length){v(this.aStack_.pop(),this);this.m_=this.mStack_.pop()}};function h(i){return isFinite(i[0][0])&&isFinite(i[0][1])&&isFinite(i[1][0])&&isFinite(i[1][1])&&isFinite(i[2][0])&&isFinite(i[2][1])}function aa(j,i,p){if(!h(i)){return}j.m_=i;if(p){var Z=i[0][0]*i[1][1]-i[0][1]*i[1][0];j.lineScale_=N(H(Z))}}q.translate=function(m,j){var i=[[1,0,0],[0,1,0],[m,j,1]];aa(this,J(i,this.m_),false)};q.rotate=function(j){var p=A(j);var m=l(j);var i=[[p,m,0],[-m,p,0],[0,0,1]];aa(this,J(i,this.m_),false)};q.scale=function(m,j){this.arcScaleX_*=m;this.arcScaleY_*=j;var i=[[m,0,0],[0,j,0],[0,0,1]];aa(this,J(i,this.m_),true)};q.transform=function(Z,p,ah,ag,j,i){var m=[[Z,p,0],[ah,ag,0],[j,i,1]];aa(this,J(m,this.m_),true)};q.setTransform=function(ag,Z,ai,ah,p,j){var i=[[ag,Z,0],[ai,ah,0],[p,j,1]];aa(this,i,true)};q.drawText_=function(am,ak,aj,ap,ai){var ao=this.m_,at=1000,j=0,ar=at,ah={x:0,y:0},ag=[];var i=u(E(this.font),this.element_);var p=ac(i);var au=this.element_.currentStyle;var Z=this.textAlign.toLowerCase();switch(Z){case"left":case"center":case"right":break;case"end":Z=au.direction=="ltr"?"right":"left";break;case"start":Z=au.direction=="rtl"?"right":"left";break;default:Z="left"}switch(this.textBaseline){case"hanging":case"top":ah.y=i.size/1.75;break;case"middle":break;default:case null:case"alphabetic":case"ideographic":case"bottom":ah.y=-i.size/2.25;break}switch(Z){case"right":j=at;ar=0.05;break;case"center":j=ar=at/2;break}var aq=V(this,ak+ah.x,aj+ah.y);ag.push('');if(ai){w(this,ag)}else{G(this,ag,{x:-j,y:0},{x:ar,y:i.size})}var an=ao[0][0].toFixed(3)+","+ao[1][0].toFixed(3)+","+ao[0][1].toFixed(3)+","+ao[1][1].toFixed(3)+",0,0";var al=n(aq.x/d)+","+n(aq.y/d);ag.push('','','');this.element_.insertAdjacentHTML("beforeEnd",ag.join(""))};q.fillText=function(m,i,p,j){this.drawText_(m,i,p,j,false)};q.strokeText=function(m,i,p,j){this.drawText_(m,i,p,j,true)};q.measureText=function(m){if(!this.textMeasureEl_){var i='';this.element_.insertAdjacentHTML("beforeEnd",i);this.textMeasureEl_=this.element_.lastChild}var j=this.element_.ownerDocument;this.textMeasureEl_.innerHTML="";this.textMeasureEl_.style.font=this.font;this.textMeasureEl_.appendChild(j.createTextNode(m));return{width:this.textMeasureEl_.offsetWidth}};q.clip=function(){};q.arcTo=function(){};q.createPattern=function(j,i){return new T(j,i)};function U(i){this.type_=i;this.x0_=0;this.y0_=0;this.r0_=0;this.x1_=0;this.y1_=0;this.r1_=0;this.colors_=[]}U.prototype.addColorStop=function(j,i){i=F(i);this.colors_.push({offset:j,color:i.color,alpha:i.alpha})};function T(j,i){Q(j);switch(i){case"repeat":case null:case"":this.repetition_="repeat";break;case"repeat-x":case"repeat-y":case"no-repeat":this.repetition_=i;break;default:O("SYNTAX_ERR")}this.src_=j.src;this.width_=j.width;this.height_=j.height}function O(i){throw new P(i)}function Q(i){if(!i||i.nodeType!=1||i.tagName!="IMG"){O("TYPE_MISMATCH_ERR")}if(i.readyState!="complete"){O("INVALID_STATE_ERR")}}function P(i){this.code=this[i];this.message=i+": DOM Exception "+this.code}var X=P.prototype=new Error;X.INDEX_SIZE_ERR=1;X.DOMSTRING_SIZE_ERR=2;X.HIERARCHY_REQUEST_ERR=3;X.WRONG_DOCUMENT_ERR=4;X.INVALID_CHARACTER_ERR=5;X.NO_DATA_ALLOWED_ERR=6;X.NO_MODIFICATION_ALLOWED_ERR=7;X.NOT_FOUND_ERR=8;X.NOT_SUPPORTED_ERR=9;X.INUSE_ATTRIBUTE_ERR=10;X.INVALID_STATE_ERR=11;X.SYNTAX_ERR=12;X.INVALID_MODIFICATION_ERR=13;X.NAMESPACE_ERR=14;X.INVALID_ACCESS_ERR=15;X.VALIDATION_ERR=16;X.TYPE_MISMATCH_ERR=17;G_vmlCanvasManager=e;CanvasRenderingContext2D=D;CanvasGradient=U;CanvasPattern=T;DOMException=P})()}; \ No newline at end of file diff --git a/htdocs/includes/jquery/plugins/flot/jquery.colorhelpers.js b/htdocs/includes/jquery/plugins/flot/jquery.colorhelpers.js old mode 100755 new mode 100644 diff --git a/htdocs/includes/jquery/plugins/flot/jquery.colorhelpers.min.js b/htdocs/includes/jquery/plugins/flot/jquery.colorhelpers.min.js old mode 100755 new mode 100644 index 7f44c57b560..844cef6708c --- a/htdocs/includes/jquery/plugins/flot/jquery.colorhelpers.min.js +++ b/htdocs/includes/jquery/plugins/flot/jquery.colorhelpers.min.js @@ -1 +1,21 @@ -(function(b){b.color={};b.color.make=function(f,e,c,d){var h={};h.r=f||0;h.g=e||0;h.b=c||0;h.a=d!=null?d:1;h.add=function(k,j){for(var g=0;g=1){return"rgb("+[h.r,h.g,h.b].join(",")+")"}else{return"rgba("+[h.r,h.g,h.b,h.a].join(",")+")"}};h.normalize=function(){function g(j,k,i){return ki?i:k)}h.r=g(0,parseInt(h.r),255);h.g=g(0,parseInt(h.g),255);h.b=g(0,parseInt(h.b),255);h.a=g(0,h.a,1);return h};h.clone=function(){return b.color.make(h.r,h.b,h.g,h.a)};return h.normalize()};b.color.extract=function(e,d){var f;do{f=e.css(d).toLowerCase();if(f!=""&&f!="transparent"){break}e=e.parent()}while(!b.nodeName(e.get(0),"body"));if(f=="rgba(0, 0, 0, 0)"){f="transparent"}return b.color.parse(f)};b.color.parse=function(f){var e,c=b.color.make;if(e=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(f)){return c(parseInt(e[1],10),parseInt(e[2],10),parseInt(e[3],10))}if(e=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(f)){return c(parseInt(e[1],10),parseInt(e[2],10),parseInt(e[3],10),parseFloat(e[4]))}if(e=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(f)){return c(parseFloat(e[1])*2.55,parseFloat(e[2])*2.55,parseFloat(e[3])*2.55)}if(e=/rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(f)){return c(parseFloat(e[1])*2.55,parseFloat(e[2])*2.55,parseFloat(e[3])*2.55,parseFloat(e[4]))}if(e=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(f)){return c(parseInt(e[1],16),parseInt(e[2],16),parseInt(e[3],16))}if(e=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(f)){return c(parseInt(e[1]+e[1],16),parseInt(e[2]+e[2],16),parseInt(e[3]+e[3],16))}var d=b.trim(f).toLowerCase();if(d=="transparent"){return c(255,255,255,0)}else{e=a[d]||[0,0,0];return c(e[0],e[1],e[2])}};var a={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]}})(jQuery); \ No newline at end of file +/* Plugin for jQuery for working with colors. + * + * Version 1.1. + * + * Inspiration from jQuery color animation plugin by John Resig. + * + * Released under the MIT license by Ole Laursen, October 2009. + * + * Examples: + * + * $.color.parse("#fff").scale('rgb', 0.25).add('a', -0.5).toString() + * var c = $.color.extract($("#mydiv"), 'background-color'); + * console.log(c.r, c.g, c.b, c.a); + * $.color.make(100, 50, 25, 0.4).toString() // returns "rgba(100,50,25,0.4)" + * + * Note that .scale() and .add() return the same modified object + * instead of making a new one. + * + * V. 1.1: Fix error handling so e.g. parsing an empty string does + * produce a color rather than just crashing. + */(function(e){e.color={},e.color.make=function(t,n,r,i){var s={};return s.r=t||0,s.g=n||0,s.b=r||0,s.a=i!=null?i:1,s.add=function(e,t){for(var n=0;n=1?"rgb("+[s.r,s.g,s.b].join(",")+")":"rgba("+[s.r,s.g,s.b,s.a].join(",")+")"},s.normalize=function(){function e(e,t,n){return tn?n:t}return s.r=e(0,parseInt(s.r),255),s.g=e(0,parseInt(s.g),255),s.b=e(0,parseInt(s.b),255),s.a=e(0,s.a,1),s},s.clone=function(){return e.color.make(s.r,s.b,s.g,s.a)},s.normalize()},e.color.extract=function(t,n){var r;do{r=t.css(n).toLowerCase();if(r!=""&&r!="transparent")break;t=t.parent()}while(!e.nodeName(t.get(0),"body"));return r=="rgba(0, 0, 0, 0)"&&(r="transparent"),e.color.parse(r)},e.color.parse=function(n){var r,i=e.color.make;if(r=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(n))return i(parseInt(r[1],10),parseInt(r[2],10),parseInt(r[3],10));if(r=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(n))return i(parseInt(r[1],10),parseInt(r[2],10),parseInt(r[3],10),parseFloat(r[4]));if(r=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(n))return i(parseFloat(r[1])*2.55,parseFloat(r[2])*2.55,parseFloat(r[3])*2.55);if(r=/rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(n))return i(parseFloat(r[1])*2.55,parseFloat(r[2])*2.55,parseFloat(r[3])*2.55,parseFloat(r[4]));if(r=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(n))return i(parseInt(r[1],16),parseInt(r[2],16),parseInt(r[3],16));if(r=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(n))return i(parseInt(r[1]+r[1],16),parseInt(r[2]+r[2],16),parseInt(r[3]+r[3],16));var s=e.trim(n).toLowerCase();return s=="transparent"?i(255,255,255,0):(r=t[s]||[0,0,0],i(r[0],r[1],r[2]))};var t={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]}})(jQuery); \ No newline at end of file diff --git a/htdocs/includes/jquery/plugins/flot/jquery.flot.canvas.js b/htdocs/includes/jquery/plugins/flot/jquery.flot.canvas.js new file mode 100644 index 00000000000..d94b9611a01 --- /dev/null +++ b/htdocs/includes/jquery/plugins/flot/jquery.flot.canvas.js @@ -0,0 +1,345 @@ +/* Flot plugin for drawing all elements of a plot on the canvas. + +Copyright (c) 2007-2013 IOLA and Ole Laursen. +Licensed under the MIT license. + +Flot normally produces certain elements, like axis labels and the legend, using +HTML elements. This permits greater interactivity and customization, and often +looks better, due to cross-browser canvas text inconsistencies and limitations. + +It can also be desirable to render the plot entirely in canvas, particularly +if the goal is to save it as an image, or if Flot is being used in a context +where the HTML DOM does not exist, as is the case within Node.js. This plugin +switches out Flot's standard drawing operations for canvas-only replacements. + +Currently the plugin supports only axis labels, but it will eventually allow +every element of the plot to be rendered directly to canvas. + +The plugin supports these options: + +{ + canvas: boolean +} + +The "canvas" option controls whether full canvas drawing is enabled, making it +possible to toggle on and off. This is useful when a plot uses HTML text in the +browser, but needs to redraw with canvas text when exporting as an image. + +*/ + +(function($) { + + var options = { + canvas: true + }; + + var render, getTextInfo, addText; + + // Cache the prototype hasOwnProperty for faster access + + var hasOwnProperty = Object.prototype.hasOwnProperty; + + function init(plot, classes) { + + var Canvas = classes.Canvas; + + // We only want to replace the functions once; the second time around + // we would just get our new function back. This whole replacing of + // prototype functions is a disaster, and needs to be changed ASAP. + + if (render == null) { + getTextInfo = Canvas.prototype.getTextInfo, + addText = Canvas.prototype.addText, + render = Canvas.prototype.render; + } + + // Finishes rendering the canvas, including overlaid text + + Canvas.prototype.render = function() { + + if (!plot.getOptions().canvas) { + return render.call(this); + } + + var context = this.context, + cache = this._textCache; + + // For each text layer, render elements marked as active + + context.save(); + context.textBaseline = "middle"; + + for (var layerKey in cache) { + if (hasOwnProperty.call(cache, layerKey)) { + var layerCache = cache[layerKey]; + for (var styleKey in layerCache) { + if (hasOwnProperty.call(layerCache, styleKey)) { + var styleCache = layerCache[styleKey], + updateStyles = true; + for (var key in styleCache) { + if (hasOwnProperty.call(styleCache, key)) { + + var info = styleCache[key], + positions = info.positions, + lines = info.lines; + + // Since every element at this level of the cache have the + // same font and fill styles, we can just change them once + // using the values from the first element. + + if (updateStyles) { + context.fillStyle = info.font.color; + context.font = info.font.definition; + updateStyles = false; + } + + for (var i = 0, position; position = positions[i]; i++) { + if (position.active) { + for (var j = 0, line; line = position.lines[j]; j++) { + context.fillText(lines[j].text, line[0], line[1]); + } + } else { + positions.splice(i--, 1); + } + } + + if (positions.length == 0) { + delete styleCache[key]; + } + } + } + } + } + } + } + + context.restore(); + }; + + // Creates (if necessary) and returns a text info object. + // + // When the canvas option is set, the object looks like this: + // + // { + // width: Width of the text's bounding box. + // height: Height of the text's bounding box. + // positions: Array of positions at which this text is drawn. + // lines: [{ + // height: Height of this line. + // widths: Width of this line. + // text: Text on this line. + // }], + // font: { + // definition: Canvas font property string. + // color: Color of the text. + // }, + // } + // + // The positions array contains objects that look like this: + // + // { + // active: Flag indicating whether the text should be visible. + // lines: Array of [x, y] coordinates at which to draw the line. + // x: X coordinate at which to draw the text. + // y: Y coordinate at which to draw the text. + // } + + Canvas.prototype.getTextInfo = function(layer, text, font, angle, width) { + + if (!plot.getOptions().canvas) { + return getTextInfo.call(this, layer, text, font, angle, width); + } + + var textStyle, layerCache, styleCache, info; + + // Cast the value to a string, in case we were given a number + + text = "" + text; + + // If the font is a font-spec object, generate a CSS definition + + if (typeof font === "object") { + textStyle = font.style + " " + font.variant + " " + font.weight + " " + font.size + "px " + font.family; + } else { + textStyle = font; + } + + // Retrieve (or create) the cache for the text's layer and styles + + layerCache = this._textCache[layer]; + + if (layerCache == null) { + layerCache = this._textCache[layer] = {}; + } + + styleCache = layerCache[textStyle]; + + if (styleCache == null) { + styleCache = layerCache[textStyle] = {}; + } + + info = styleCache[text]; + + if (info == null) { + + var context = this.context; + + // If the font was provided as CSS, create a div with those + // classes and examine it to generate a canvas font spec. + + if (typeof font !== "object") { + + var element = $("
 
") + .css("position", "absolute") + .addClass(typeof font === "string" ? font : null) + .appendTo(this.getTextLayer(layer)); + + font = { + lineHeight: element.height(), + style: element.css("font-style"), + variant: element.css("font-variant"), + weight: element.css("font-weight"), + family: element.css("font-family"), + color: element.css("color") + }; + + // Setting line-height to 1, without units, sets it equal + // to the font-size, even if the font-size is abstract, + // like 'smaller'. This enables us to read the real size + // via the element's height, working around browsers that + // return the literal 'smaller' value. + + font.size = element.css("line-height", 1).height(); + + element.remove(); + } + + textStyle = font.style + " " + font.variant + " " + font.weight + " " + font.size + "px " + font.family; + + // Create a new info object, initializing the dimensions to + // zero so we can count them up line-by-line. + + info = styleCache[text] = { + width: 0, + height: 0, + positions: [], + lines: [], + font: { + definition: textStyle, + color: font.color + } + }; + + context.save(); + context.font = textStyle; + + // Canvas can't handle multi-line strings; break on various + // newlines, including HTML brs, to build a list of lines. + // Note that we could split directly on regexps, but IE < 9 is + // broken; revisit when we drop IE 7/8 support. + + var lines = (text + "").replace(/
|\r\n|\r/g, "\n").split("\n"); + + for (var i = 0; i < lines.length; ++i) { + + var lineText = lines[i], + measured = context.measureText(lineText); + + info.width = Math.max(measured.width, info.width); + info.height += font.lineHeight; + + info.lines.push({ + text: lineText, + width: measured.width, + height: font.lineHeight + }); + } + + context.restore(); + } + + return info; + }; + + // Adds a text string to the canvas text overlay. + + Canvas.prototype.addText = function(layer, x, y, text, font, angle, width, halign, valign) { + + if (!plot.getOptions().canvas) { + return addText.call(this, layer, x, y, text, font, angle, width, halign, valign); + } + + var info = this.getTextInfo(layer, text, font, angle, width), + positions = info.positions, + lines = info.lines; + + // Text is drawn with baseline 'middle', which we need to account + // for by adding half a line's height to the y position. + + y += info.height / lines.length / 2; + + // Tweak the initial y-position to match vertical alignment + + if (valign == "middle") { + y = Math.round(y - info.height / 2); + } else if (valign == "bottom") { + y = Math.round(y - info.height); + } else { + y = Math.round(y); + } + + // FIXME: LEGACY BROWSER FIX + // AFFECTS: Opera < 12.00 + + // Offset the y coordinate, since Opera is off pretty + // consistently compared to the other browsers. + + if (!!(window.opera && window.opera.version().split(".")[0] < 12)) { + y -= 2; + } + + // Determine whether this text already exists at this position. + // If so, mark it for inclusion in the next render pass. + + for (var i = 0, position; position = positions[i]; i++) { + if (position.x == x && position.y == y) { + position.active = true; + return; + } + } + + // If the text doesn't exist at this position, create a new entry + + position = { + active: true, + lines: [], + x: x, + y: y + }; + + positions.push(position); + + // Fill in the x & y positions of each line, adjusting them + // individually for horizontal alignment. + + for (var i = 0, line; line = lines[i]; i++) { + if (halign == "center") { + position.lines.push([Math.round(x - line.width / 2), y]); + } else if (halign == "right") { + position.lines.push([Math.round(x - line.width), y]); + } else { + position.lines.push([Math.round(x), y]); + } + y += line.height; + } + }; + } + + $.plot.plugins.push({ + init: init, + options: options, + name: "canvas", + version: "1.0" + }); + +})(jQuery); diff --git a/htdocs/includes/jquery/plugins/flot/jquery.flot.canvas.min.js b/htdocs/includes/jquery/plugins/flot/jquery.flot.canvas.min.js new file mode 100644 index 00000000000..ac70b537a6c --- /dev/null +++ b/htdocs/includes/jquery/plugins/flot/jquery.flot.canvas.min.js @@ -0,0 +1,28 @@ +/* Flot plugin for drawing all elements of a plot on the canvas. + +Copyright (c) 2007-2013 IOLA and Ole Laursen. +Licensed under the MIT license. + +Flot normally produces certain elements, like axis labels and the legend, using +HTML elements. This permits greater interactivity and customization, and often +looks better, due to cross-browser canvas text inconsistencies and limitations. + +It can also be desirable to render the plot entirely in canvas, particularly +if the goal is to save it as an image, or if Flot is being used in a context +where the HTML DOM does not exist, as is the case within Node.js. This plugin +switches out Flot's standard drawing operations for canvas-only replacements. + +Currently the plugin supports only axis labels, but it will eventually allow +every element of the plot to be rendered directly to canvas. + +The plugin supports these options: + +{ + canvas: boolean +} + +The "canvas" option controls whether full canvas drawing is enabled, making it +possible to toggle on and off. This is useful when a plot uses HTML text in the +browser, but needs to redraw with canvas text when exporting as an image. + +*/(function(e){function o(t,o){var u=o.Canvas;n==null&&(r=u.prototype.getTextInfo,i=u.prototype.addText,n=u.prototype.render),u.prototype.render=function(){if(!t.getOptions().canvas)return n.call(this);var e=this.context,r=this._textCache;e.save(),e.textBaseline="middle";for(var i in r)if(s.call(r,i)){var o=r[i];for(var u in o)if(s.call(o,u)){var a=o[u],f=!0;for(var l in a)if(s.call(a,l)){var c=a[l],h=c.positions,p=c.lines;f&&(e.fillStyle=c.font.color,e.font=c.font.definition,f=!1);for(var d=0,v;v=h[d];d++)if(v.active)for(var m=0,g;g=v.lines[m];m++)e.fillText(p[m].text,g[0],g[1]);else h.splice(d--,1);h.length==0&&delete a[l]}}}e.restore()},u.prototype.getTextInfo=function(n,i,s,o,u){if(!t.getOptions().canvas)return r.call(this,n,i,s,o,u);var a,f,l,c;i=""+i,typeof s=="object"?a=s.style+" "+s.variant+" "+s.weight+" "+s.size+"px "+s.family:a=s,f=this._textCache[n],f==null&&(f=this._textCache[n]={}),l=f[a],l==null&&(l=f[a]={}),c=l[i];if(c==null){var h=this.context;if(typeof s!="object"){var p=e("
 
").css("position","absolute").addClass(typeof s=="string"?s:null).appendTo(this.getTextLayer(n));s={lineHeight:p.height(),style:p.css("font-style"),variant:p.css("font-variant"),weight:p.css("font-weight"),family:p.css("font-family"),color:p.css("color")},s.size=p.css("line-height",1).height(),p.remove()}a=s.style+" "+s.variant+" "+s.weight+" "+s.size+"px "+s.family,c=l[i]={width:0,height:0,positions:[],lines:[],font:{definition:a,color:s.color}},h.save(),h.font=a;var d=(i+"").replace(/
|\r\n|\r/g,"\n").split("\n");for(var v=0;v index) + index = categories[v]; + + return index + 1; + } + + function categoriesTickGenerator(axis) { + var res = []; + for (var label in axis.categories) { + var v = axis.categories[label]; + if (v >= axis.min && v <= axis.max) + res.push([v, label]); + } + + res.sort(function (a, b) { return a[0] - b[0]; }); + + return res; + } + + function setupCategoriesForAxis(series, axis, datapoints) { + if (series[axis].options.mode != "categories") + return; + + if (!series[axis].categories) { + // parse options + var c = {}, o = series[axis].options.categories || {}; + if ($.isArray(o)) { + for (var i = 0; i < o.length; ++i) + c[o[i]] = i; + } + else { + for (var v in o) + c[v] = o[v]; + } + + series[axis].categories = c; + } + + // fix ticks + if (!series[axis].options.ticks) + series[axis].options.ticks = categoriesTickGenerator; + + transformPointsOnAxis(datapoints, axis, series[axis].categories); + } + + function transformPointsOnAxis(datapoints, axis, categories) { + // go through the points, transforming them + var points = datapoints.points, + ps = datapoints.pointsize, + format = datapoints.format, + formatColumn = axis.charAt(0), + index = getNextIndex(categories); + + for (var i = 0; i < points.length; i += ps) { + if (points[i] == null) + continue; + + for (var m = 0; m < ps; ++m) { + var val = points[i + m]; + + if (val == null || !format[m][formatColumn]) + continue; + + if (!(val in categories)) { + categories[val] = index; + ++index; + } + + points[i + m] = categories[val]; + } + } + } + + function processDatapoints(plot, series, datapoints) { + setupCategoriesForAxis(series, "xaxis", datapoints); + setupCategoriesForAxis(series, "yaxis", datapoints); + } + + function init(plot) { + plot.hooks.processRawData.push(processRawData); + plot.hooks.processDatapoints.push(processDatapoints); + } + + $.plot.plugins.push({ + init: init, + options: options, + name: 'categories', + version: '1.0' + }); +})(jQuery); diff --git a/htdocs/includes/jquery/plugins/flot/jquery.flot.categories.min.js b/htdocs/includes/jquery/plugins/flot/jquery.flot.categories.min.js new file mode 100644 index 00000000000..ca86594fe34 --- /dev/null +++ b/htdocs/includes/jquery/plugins/flot/jquery.flot.categories.min.js @@ -0,0 +1,44 @@ +/* Flot plugin for plotting textual data or categories. + +Copyright (c) 2007-2013 IOLA and Ole Laursen. +Licensed under the MIT license. + +Consider a dataset like [["February", 34], ["March", 20], ...]. This plugin +allows you to plot such a dataset directly. + +To enable it, you must specify mode: "categories" on the axis with the textual +labels, e.g. + + $.plot("#placeholder", data, { xaxis: { mode: "categories" } }); + +By default, the labels are ordered as they are met in the data series. If you +need a different ordering, you can specify "categories" on the axis options +and list the categories there: + + xaxis: { + mode: "categories", + categories: ["February", "March", "April"] + } + +If you need to customize the distances between the categories, you can specify +"categories" as an object mapping labels to values + + xaxis: { + mode: "categories", + categories: { "February": 1, "March": 3, "April": 4 } + } + +If you don't specify all categories, the remaining categories will be numbered +from the max value plus 1 (with a spacing of 1 between each). + +Internally, the plugin works by transforming the input data through an auto- +generated mapping where the first category becomes 0, the second 1, etc. +Hence, a point like ["February", 34] becomes [0, 34] internally in Flot (this +is visible in hover and click events that return numbers rather than the +category labels). The plugin also overrides the tick generator to spit out the +categories as ticks instead of the values. + +If you need to map a value back to its label, the mapping is always accessible +as "categories" on the axis object, e.g. plot.getAxes().xaxis.categories. + +*/(function(e){function n(e,t,n,r){var i=t.xaxis.options.mode=="categories",s=t.yaxis.options.mode=="categories";if(!i&&!s)return;var o=r.format;if(!o){var u=t;o=[],o.push({x:!0,number:!0,required:!0}),o.push({y:!0,number:!0,required:!0});if(u.bars.show||u.lines.show&&u.lines.fill){var a=!!(u.bars.show&&u.bars.zero||u.lines.show&&u.lines.zero);o.push({y:!0,number:!0,required:!1,defaultValue:0,autoscale:a}),u.bars.horizontal&&(delete o[o.length-1].y,o[o.length-1].x=!0)}r.format=o}for(var f=0;ft&&(t=e[n]);return t+1}function i(e){var t=[];for(var n in e.categories){var r=e.categories[n];r>=e.min&&r<=e.max&&t.push([r,n])}return t.sort(function(e,t){return e[0]-t[0]}),t}function s(t,n,r){if(t[n].options.mode!="categories")return;if(!t[n].categories){var s={},u=t[n].options.categories||{};if(e.isArray(u))for(var a=0;a ax[1].max || y < ax[1].min || upper < ax[0].min || lower > ax[0].max) + continue; + if (err[e].err == 'y') + if (x > ax[0].max || x < ax[0].min || upper < ax[1].min || lower > ax[1].max) + continue; + + // prevent errorbars getting out of the canvas + var drawUpper = true, + drawLower = true; + + if (upper > minmax[1]) { + drawUpper = false; + upper = minmax[1]; + } + if (lower < minmax[0]) { + drawLower = false; + lower = minmax[0]; + } + + //sanity check, in case some inverted axis hack is applied to flot + if ((err[e].err == 'x' && invertX) || (err[e].err == 'y' && invertY)) { + //swap coordinates + var tmp = lower; + lower = upper; + upper = tmp; + tmp = drawLower; + drawLower = drawUpper; + drawUpper = tmp; + tmp = minmax[0]; + minmax[0] = minmax[1]; + minmax[1] = tmp; + } + + // convert to pixels + x = ax[0].p2c(x), + y = ax[1].p2c(y), + upper = ax[e].p2c(upper); + lower = ax[e].p2c(lower); + minmax[0] = ax[e].p2c(minmax[0]); + minmax[1] = ax[e].p2c(minmax[1]); + + //same style as points by default + var lw = err[e].lineWidth ? err[e].lineWidth : s.points.lineWidth, + sw = s.points.shadowSize != null ? s.points.shadowSize : s.shadowSize; + + //shadow as for points + if (lw > 0 && sw > 0) { + var w = sw / 2; + ctx.lineWidth = w; + ctx.strokeStyle = "rgba(0,0,0,0.1)"; + drawError(ctx, err[e], x, y, upper, lower, drawUpper, drawLower, radius, w + w/2, minmax); + + ctx.strokeStyle = "rgba(0,0,0,0.2)"; + drawError(ctx, err[e], x, y, upper, lower, drawUpper, drawLower, radius, w/2, minmax); + } + + ctx.strokeStyle = err[e].color? err[e].color: s.color; + ctx.lineWidth = lw; + //draw it + drawError(ctx, err[e], x, y, upper, lower, drawUpper, drawLower, radius, 0, minmax); + } + } + } + } + + function drawError(ctx,err,x,y,upper,lower,drawUpper,drawLower,radius,offset,minmax){ + + //shadow offset + y += offset; + upper += offset; + lower += offset; + + // error bar - avoid plotting over circles + if (err.err == 'x'){ + if (upper > x + radius) drawPath(ctx, [[upper,y],[Math.max(x + radius,minmax[0]),y]]); + else drawUpper = false; + if (lower < x - radius) drawPath(ctx, [[Math.min(x - radius,minmax[1]),y],[lower,y]] ); + else drawLower = false; + } + else { + if (upper < y - radius) drawPath(ctx, [[x,upper],[x,Math.min(y - radius,minmax[0])]] ); + else drawUpper = false; + if (lower > y + radius) drawPath(ctx, [[x,Math.max(y + radius,minmax[1])],[x,lower]] ); + else drawLower = false; + } + + //internal radius value in errorbar, allows to plot radius 0 points and still keep proper sized caps + //this is a way to get errorbars on lines without visible connecting dots + radius = err.radius != null? err.radius: radius; + + // upper cap + if (drawUpper) { + if (err.upperCap == '-'){ + if (err.err=='x') drawPath(ctx, [[upper,y - radius],[upper,y + radius]] ); + else drawPath(ctx, [[x - radius,upper],[x + radius,upper]] ); + } else if ($.isFunction(err.upperCap)){ + if (err.err=='x') err.upperCap(ctx, upper, y, radius); + else err.upperCap(ctx, x, upper, radius); + } + } + // lower cap + if (drawLower) { + if (err.lowerCap == '-'){ + if (err.err=='x') drawPath(ctx, [[lower,y - radius],[lower,y + radius]] ); + else drawPath(ctx, [[x - radius,lower],[x + radius,lower]] ); + } else if ($.isFunction(err.lowerCap)){ + if (err.err=='x') err.lowerCap(ctx, lower, y, radius); + else err.lowerCap(ctx, x, lower, radius); + } + } + } + + function drawPath(ctx, pts){ + ctx.beginPath(); + ctx.moveTo(pts[0][0], pts[0][1]); + for (var p=1; p < pts.length; p++) + ctx.lineTo(pts[p][0], pts[p][1]); + ctx.stroke(); + } + + function draw(plot, ctx){ + var plotOffset = plot.getPlotOffset(); + + ctx.save(); + ctx.translate(plotOffset.left, plotOffset.top); + $.each(plot.getData(), function (i, s) { + if (s.points.errorbars && (s.points.xerr.show || s.points.yerr.show)) + drawSeriesErrors(plot, ctx, s); + }); + ctx.restore(); + } + + function init(plot) { + plot.hooks.processRawData.push(processRawData); + plot.hooks.draw.push(draw); + } + + $.plot.plugins.push({ + init: init, + options: options, + name: 'errorbars', + version: '1.0' + }); +})(jQuery); diff --git a/htdocs/includes/jquery/plugins/flot/jquery.flot.errorbars.min.js b/htdocs/includes/jquery/plugins/flot/jquery.flot.errorbars.min.js new file mode 100644 index 00000000000..72d7e3dc7b2 --- /dev/null +++ b/htdocs/includes/jquery/plugins/flot/jquery.flot.errorbars.min.js @@ -0,0 +1,63 @@ +/* Flot plugin for plotting error bars. + +Copyright (c) 2007-2013 IOLA and Ole Laursen. +Licensed under the MIT license. + +Error bars are used to show standard deviation and other statistical +properties in a plot. + +* Created by Rui Pereira - rui (dot) pereira (at) gmail (dot) com + +This plugin allows you to plot error-bars over points. Set "errorbars" inside +the points series to the axis name over which there will be error values in +your data array (*even* if you do not intend to plot them later, by setting +"show: null" on xerr/yerr). + +The plugin supports these options: + + series: { + points: { + errorbars: "x" or "y" or "xy", + xerr: { + show: null/false or true, + asymmetric: null/false or true, + upperCap: null or "-" or function, + lowerCap: null or "-" or function, + color: null or color, + radius: null or number + }, + yerr: { same options as xerr } + } + } + +Each data point array is expected to be of the type: + + "x" [ x, y, xerr ] + "y" [ x, y, yerr ] + "xy" [ x, y, xerr, yerr ] + +Where xerr becomes xerr_lower,xerr_upper for the asymmetric error case, and +equivalently for yerr. Eg., a datapoint for the "xy" case with symmetric +error-bars on X and asymmetric on Y would be: + + [ x, y, xerr, yerr_lower, yerr_upper ] + +By default no end caps are drawn. Setting upperCap and/or lowerCap to "-" will +draw a small cap perpendicular to the error bar. They can also be set to a +user-defined drawing function, with (ctx, x, y, radius) as parameters, as eg. + + function drawSemiCircle( ctx, x, y, radius ) { + ctx.beginPath(); + ctx.arc( x, y, radius, 0, Math.PI, false ); + ctx.moveTo( x - radius, y ); + ctx.lineTo( x + radius, y ); + ctx.stroke(); + } + +Color and radius both default to the same ones of the points series if not +set. The independent radius parameter on xerr/yerr is useful for the case when +we may want to add error-bars to a line, without showing the interconnecting +points (with radius: 0), and still showing end caps on the error-bars. +shadowSize and lineWidth are derived as well from the points series. + +*/(function(e){function n(e,t,n,r){if(!t.points.errorbars)return;var i=[{x:!0,number:!0,required:!0},{y:!0,number:!0,required:!0}],s=t.points.errorbars;if(s=="x"||s=="xy")t.points.xerr.asymmetric?(i.push({x:!0,number:!0,required:!0}),i.push({x:!0,number:!0,required:!0})):i.push({x:!0,number:!0,required:!0});if(s=="y"||s=="xy")t.points.yerr.asymmetric?(i.push({y:!0,number:!0,required:!0}),i.push({y:!0,number:!0,required:!0})):i.push({y:!0,number:!0,required:!0});r.format=i}function r(e,t){var n=e.datapoints.points,r=null,i=null,s=null,o=null,u=e.points.xerr,a=e.points.yerr,f=e.points.errorbars;f=="x"||f=="xy"?u.asymmetric?(r=n[t+2],i=n[t+3],f=="xy"&&(a.asymmetric?(s=n[t+4],o=n[t+5]):s=n[t+4])):(r=n[t+2],f=="xy"&&(a.asymmetric?(s=n[t+3],o=n[t+4]):s=n[t+3])):f=="y"&&(a.asymmetric?(s=n[t+2],o=n[t+3]):s=n[t+2]),i==null&&(i=r),o==null&&(o=s);var l=[r,i,s,o];return u.show||(l[0]=null,l[1]=null),a.show||(l[2]=null,l[3]=null),l}function i(e,t,n){var i=n.datapoints.points,o=n.datapoints.pointsize,u=[n.xaxis,n.yaxis],a=n.points.radius,f=[n.points.xerr,n.points.yerr],l=!1;if(u[0].p2c(u[0].max)u[1].max||yu[0].max)continue;if(f[v].err=="y")if(g>u[0].max||gu[1].max)continue;var E=!0,S=!0;b>m[1]&&(E=!1,b=m[1]),w0&&T>0){var N=T/2;t.lineWidth=N,t.strokeStyle="rgba(0,0,0,0.1)",s(t,f[v],g,y,b,w,E,S,a,N+N/2,m),t.strokeStyle="rgba(0,0,0,0.2)",s(t,f[v],g,y,b,w,E,S,a,N/2,m)}t.strokeStyle=f[v].color?f[v].color:n.color,t.lineWidth=x,s(t,f[v],g,y,b,w,E,S,a,0,m)}}}}function s(t,n,r,i,s,u,a,f,l,c,h){i+=c,s+=c,u+=c,n.err=="x"?(s>r+l?o(t,[[s,i],[Math.max(r+l,h[0]),i]]):a=!1,ui+l?o(t,[[r,Math.max(i+l,h[1])],[r,u]]):f=!1),l=n.radius!=null?n.radius:l,a&&(n.upperCap=="-"?n.err=="x"?o(t,[[s,i-l],[s,i+l]]):o(t,[[r-l,s],[r+l,s]]):e.isFunction(n.upperCap)&&(n.err=="x"?n.upperCap(t,s,i,l):n.upperCap(t,r,s,l))),f&&(n.lowerCap=="-"?n.err=="x"?o(t,[[u,i-l],[u,i+l]]):o(t,[[r-l,u],[r+l,u]]):e.isFunction(n.lowerCap)&&(n.err=="x"?n.lowerCap(t,u,i,l):n.lowerCap(t,r,u,l)))}function o(e,t){e.beginPath(),e.moveTo(t[0][0],t[0][1]);for(var n=1;n= allseries.length) - return null; + var options = { + series: { + fillBetween: null // or number + } + }; - return allseries[i]; - } - - return null; - } - - function computeFillBottoms(plot, s, datapoints) { - if (s.fillBetween == null) - return; + function init( plot ) { - var other = findBottomSeries(s, plot.getData()); - if (!other) - return; + function findBottomSeries( s, allseries ) { - var ps = datapoints.pointsize, - points = datapoints.points, - otherps = other.datapoints.pointsize, - otherpoints = other.datapoints.points, - newpoints = [], - px, py, intery, qx, qy, bottom, - withlines = s.lines.show, - withbottom = ps > 2 && datapoints.format[2].y, - withsteps = withlines && s.lines.steps, - fromgap = true, - i = 0, j = 0, l; + var i; - while (true) { - if (i >= points.length) - break; + for ( i = 0; i < allseries.length; ++i ) { + if ( allseries[ i ].id === s.fillBetween ) { + return allseries[ i ]; + } + } - l = newpoints.length; + if ( typeof s.fillBetween === "number" ) { + if ( s.fillBetween < 0 || s.fillBetween >= allseries.length ) { + return null; + } + return allseries[ s.fillBetween ]; + } - if (points[i] == null) { - // copy gaps - for (m = 0; m < ps; ++m) - newpoints.push(points[i + m]); - i += ps; - } - else if (j >= otherpoints.length) { - // for lines, we can't use the rest of the points - if (!withlines) { - for (m = 0; m < ps; ++m) - newpoints.push(points[i + m]); - } - i += ps; - } - else if (otherpoints[j] == null) { - // oops, got a gap - for (m = 0; m < ps; ++m) - newpoints.push(null); - fromgap = true; - j += otherps; - } - else { - // cases where we actually got two points - px = points[i]; - py = points[i + 1]; - qx = otherpoints[j]; - qy = otherpoints[j + 1]; - bottom = 0; + return null; + } - if (px == qx) { - for (m = 0; m < ps; ++m) - newpoints.push(points[i + m]); + function computeFillBottoms( plot, s, datapoints ) { - //newpoints[l + 1] += qy; - bottom = qy; - - i += ps; - j += otherps; - } - else if (px > qx) { - // we got past point below, might need to - // insert interpolated extra point - if (withlines && i > 0 && points[i - ps] != null) { - intery = py + (points[i - ps + 1] - py) * (qx - px) / (points[i - ps] - px); - newpoints.push(qx); - newpoints.push(intery) - for (m = 2; m < ps; ++m) - newpoints.push(points[i + m]); - bottom = qy; - } + if ( s.fillBetween == null ) { + return; + } - j += otherps; - } - else { // px < qx - if (fromgap && withlines) { - // if we come from a gap, we just skip this point - i += ps; - continue; - } - - for (m = 0; m < ps; ++m) - newpoints.push(points[i + m]); - - // we might be able to interpolate a point below, - // this can give us a better y - if (withlines && j > 0 && otherpoints[j - otherps] != null) - bottom = qy + (otherpoints[j - otherps + 1] - qy) * (px - qx) / (otherpoints[j - otherps] - qx); + var other = findBottomSeries( s, plot.getData() ); - //newpoints[l + 1] += bottom; - - i += ps; - } + if ( !other ) { + return; + } - fromgap = false; - - if (l != newpoints.length && withbottom) - newpoints[l + 2] = bottom; - } + var ps = datapoints.pointsize, + points = datapoints.points, + otherps = other.datapoints.pointsize, + otherpoints = other.datapoints.points, + newpoints = [], + px, py, intery, qx, qy, bottom, + withlines = s.lines.show, + withbottom = ps > 2 && datapoints.format[2].y, + withsteps = withlines && s.lines.steps, + fromgap = true, + i = 0, + j = 0, + l, m; - // maintain the line steps invariant - if (withsteps && l != newpoints.length && l > 0 - && newpoints[l] != null - && newpoints[l] != newpoints[l - ps] - && newpoints[l + 1] != newpoints[l - ps + 1]) { - for (m = 0; m < ps; ++m) - newpoints[l + ps + m] = newpoints[l + m]; - newpoints[l + 1] = newpoints[l - ps + 1]; - } - } + while ( true ) { + + if ( i >= points.length ) { + break; + } + + l = newpoints.length; + + if ( points[ i ] == null ) { + + // copy gaps + + for ( m = 0; m < ps; ++m ) { + newpoints.push( points[ i + m ] ); + } + + i += ps; + + } else if ( j >= otherpoints.length ) { + + // for lines, we can't use the rest of the points + + if ( !withlines ) { + for ( m = 0; m < ps; ++m ) { + newpoints.push( points[ i + m ] ); + } + } + + i += ps; + + } else if ( otherpoints[ j ] == null ) { + + // oops, got a gap + + for ( m = 0; m < ps; ++m ) { + newpoints.push( null ); + } + + fromgap = true; + j += otherps; + + } else { + + // cases where we actually got two points + + px = points[ i ]; + py = points[ i + 1 ]; + qx = otherpoints[ j ]; + qy = otherpoints[ j + 1 ]; + bottom = 0; + + if ( px === qx ) { + + for ( m = 0; m < ps; ++m ) { + newpoints.push( points[ i + m ] ); + } + + //newpoints[ l + 1 ] += qy; + bottom = qy; + + i += ps; + j += otherps; + + } else if ( px > qx ) { + + // we got past point below, might need to + // insert interpolated extra point + + if ( withlines && i > 0 && points[ i - ps ] != null ) { + intery = py + ( points[ i - ps + 1 ] - py ) * ( qx - px ) / ( points[ i - ps ] - px ); + newpoints.push( qx ); + newpoints.push( intery ); + for ( m = 2; m < ps; ++m ) { + newpoints.push( points[ i + m ] ); + } + bottom = qy; + } + + j += otherps; + + } else { // px < qx + + // if we come from a gap, we just skip this point + + if ( fromgap && withlines ) { + i += ps; + continue; + } + + for ( m = 0; m < ps; ++m ) { + newpoints.push( points[ i + m ] ); + } + + // we might be able to interpolate a point below, + // this can give us a better y + + if ( withlines && j > 0 && otherpoints[ j - otherps ] != null ) { + bottom = qy + ( otherpoints[ j - otherps + 1 ] - qy ) * ( px - qx ) / ( otherpoints[ j - otherps ] - qx ); + } + + //newpoints[l + 1] += bottom; + + i += ps; + } + + fromgap = false; + + if ( l !== newpoints.length && withbottom ) { + newpoints[ l + 2 ] = bottom; + } + } + + // maintain the line steps invariant + + if ( withsteps && l !== newpoints.length && l > 0 && + newpoints[ l ] !== null && + newpoints[ l ] !== newpoints[ l - ps ] && + newpoints[ l + 1 ] !== newpoints[ l - ps + 1 ] ) { + for (m = 0; m < ps; ++m) { + newpoints[ l + ps + m ] = newpoints[ l + m ]; + } + newpoints[ l + 1 ] = newpoints[ l - ps + 1 ]; + } + } + + datapoints.points = newpoints; + } + + plot.hooks.processDatapoints.push( computeFillBottoms ); + } + + $.plot.plugins.push({ + init: init, + options: options, + name: "fillbetween", + version: "1.0" + }); - datapoints.points = newpoints; - } - - plot.hooks.processDatapoints.push(computeFillBottoms); - } - - $.plot.plugins.push({ - init: init, - options: options, - name: 'fillbetween', - version: '1.0' - }); })(jQuery); diff --git a/htdocs/includes/jquery/plugins/flot/jquery.flot.fillbetween.min.js b/htdocs/includes/jquery/plugins/flot/jquery.flot.fillbetween.min.js old mode 100755 new mode 100644 index 47f3dfb6de0..e94efb7e740 --- a/htdocs/includes/jquery/plugins/flot/jquery.flot.fillbetween.min.js +++ b/htdocs/includes/jquery/plugins/flot/jquery.flot.fillbetween.min.js @@ -1 +1,30 @@ -(function(b){var a={series:{fillBetween:null}};function c(f){function d(j,h){var g;for(g=0;g=h.length){return null}return h[g]}return null}function e(B,u,g){if(u.fillBetween==null){return}var p=d(u,B.getData());if(!p){return}var y=g.pointsize,E=g.points,h=p.datapoints.pointsize,x=p.datapoints.points,r=[],w,v,k,G,F,q,t=u.lines.show,o=y>2&&g.format[2].y,n=t&&u.lines.steps,D=true,C=0,A=0,z;while(true){if(C>=E.length){break}z=r.length;if(E[C]==null){for(m=0;m=x.length){if(!t){for(m=0;mG){if(t&&C>0&&E[C-y]!=null){k=v+(E[C-y+1]-v)*(G-w)/(E[C-y]-w);r.push(G);r.push(k);for(m=2;m0&&x[A-h]!=null){q=F+(x[A-h+1]-F)*(w-G)/(x[A-h]-G)}C+=y}}D=false;if(z!=r.length&&o){r[z+2]=q}}}}if(n&&z!=r.length&&z>0&&r[z]!=null&&r[z]!=r[z-y]&&r[z+1]!=r[z-y+1]){for(m=0;m=t.length?null:t[e.fillBetween]:null}function n(e,n,r){if(n.fillBetween==null)return;var i=t(n,e.getData());if(!i)return;var s=r.pointsize,o=r.points,u=i.datapoints.pointsize,a=i.datapoints.points,f=[],l,c,h,p,d,v,m=n.lines.show,g=s>2&&r.format[2].y,y=m&&n.lines.steps,b=!0,w=0,E=0,S,x;for(;;){if(w>=o.length)break;S=f.length;if(o[w]==null){for(x=0;x=a.length){if(!m)for(x=0;xp){if(m&&w>0&&o[w-s]!=null){h=c+(o[w-s+1]-c)*(p-l)/(o[w-s]-l),f.push(p),f.push(h);for(x=2;x0&&a[E-u]!=null&&(v=d+(a[E-u+1]-d)*(l-p)/(a[E-u]-p)),w+=s}b=!1,S!==f.length&&g&&(f[S+2]=v)}if(y&&S!==f.length&&S>0&&f[S]!==null&&f[S]!==f[S-s]&&f[S+1]!==f[S-s+1]){for(x=0;x').load(handler).error(handler).attr('src', url); }); - } + }; function drawSeries(plot, ctx, series) { var plotOffset = plot.getPlotOffset(); diff --git a/htdocs/includes/jquery/plugins/flot/jquery.flot.image.min.js b/htdocs/includes/jquery/plugins/flot/jquery.flot.image.min.js old mode 100755 new mode 100644 index 9480c1e7a31..b128d30336d --- a/htdocs/includes/jquery/plugins/flot/jquery.flot.image.min.js +++ b/htdocs/includes/jquery/plugins/flot/jquery.flot.image.min.js @@ -1 +1,53 @@ -(function(c){var a={series:{images:{show:false,alpha:1,anchor:"corner"}}};c.plot.image={};c.plot.image.loadDataImages=function(g,f,k){var j=[],h=[];var i=f.series.images.show;c.each(g,function(l,m){if(!(i||m.images.show)){return}if(m.data){m=m.data}c.each(m,function(n,o){if(typeof o[0]=="string"){j.push(o[0]);h.push(o)}})});c.plot.image.load(j,function(l){c.each(h,function(n,o){var m=o[0];if(l[m]){o[0]=l[m]}});k()})};c.plot.image.load=function(h,i){var g=h.length,f={};if(g==0){i({})}c.each(h,function(k,j){var l=function(){--g;f[j]=this;if(g==0){i(f)}};c("").load(l).error(l).attr("src",j)})};function d(q,o,l){var m=q.getPlotOffset();if(!l.images||!l.images.show){return}var r=l.datapoints.points,n=l.datapoints.pointsize;for(var t=0;tv){x=v;v=w;w=x}if(g>f){x=f;f=g;g=x}if(l.images.anchor=="center"){x=0.5*(v-w)/(y.width-1);w-=x;v+=x;x=0.5*(f-g)/(y.height-1);g-=x;f+=x}if(w==v||g==f||w>=h.max||v<=h.min||g>=u.max||f<=u.min){continue}var k=0,s=0,j=y.width,p=y.height;if(wh.max){j+=(j-k)*(h.max-v)/(v-w);v=h.max}if(gu.max){s+=(s-p)*(u.max-f)/(f-g);f=u.max}w=h.p2c(w);v=h.p2c(v);g=u.p2c(g);f=u.p2c(f);if(w>v){x=v;v=w;w=x}if(g>f){x=f;f=g;g=x}x=o.globalAlpha;o.globalAlpha*=l.images.alpha;o.drawImage(y,k,s,j-k,p-s,w+m.left,g+m.top,v-w,f-g);o.globalAlpha=x}}function b(i,f,g,h){if(!f.images.show){return}h.format=[{required:true},{x:true,number:true,required:true},{y:true,number:true,required:true},{x:true,number:true,required:true},{y:true,number:true,required:true}]}function e(f){f.hooks.processRawData.push(b);f.hooks.drawSeries.push(d)}c.plot.plugins.push({init:e,options:a,name:"image",version:"1.1"})})(jQuery); \ No newline at end of file +/* Flot plugin for plotting images. + +Copyright (c) 2007-2013 IOLA and Ole Laursen. +Licensed under the MIT license. + +The data syntax is [ [ image, x1, y1, x2, y2 ], ... ] where (x1, y1) and +(x2, y2) are where you intend the two opposite corners of the image to end up +in the plot. Image must be a fully loaded Javascript image (you can make one +with new Image()). If the image is not complete, it's skipped when plotting. + +There are two helpers included for retrieving images. The easiest work the way +that you put in URLs instead of images in the data, like this: + + [ "myimage.png", 0, 0, 10, 10 ] + +Then call $.plot.image.loadData( data, options, callback ) where data and +options are the same as you pass in to $.plot. This loads the images, replaces +the URLs in the data with the corresponding images and calls "callback" when +all images are loaded (or failed loading). In the callback, you can then call +$.plot with the data set. See the included example. + +A more low-level helper, $.plot.image.load(urls, callback) is also included. +Given a list of URLs, it calls callback with an object mapping from URL to +Image object when all images are loaded or have failed loading. + +The plugin supports these options: + + series: { + images: { + show: boolean + anchor: "corner" or "center" + alpha: [ 0, 1 ] + } + } + +They can be specified for a specific series: + + $.plot( $("#placeholder"), [{ + data: [ ... ], + images: { ... } + ]) + +Note that because the data format is different from usual data points, you +can't use images with anything else in a specific data series. + +Setting "anchor" to "center" causes the pixels in the image to be anchored at +the corner pixel centers inside of at the pixel corners, effectively letting +half a pixel stick out to each side in the plot. + +A possible future direction could be support for tiling for large images (like +Google Maps). + +*/(function(e){function n(e,t,n){var r=e.getPlotOffset();if(!n.images||!n.images.show)return;var i=n.datapoints.points,s=n.datapoints.pointsize;for(var o=0;ol&&(d=l,l=a,a=d),f>c&&(d=c,c=f,f=d),n.images.anchor=="center"&&(d=.5*(l-a)/(u.width-1),a-=d,l+=d,d=.5*(c-f)/(u.height-1),f-=d,c+=d);if(a==l||f==c||a>=h.max||l<=h.min||f>=p.max||c<=p.min)continue;var v=0,m=0,g=u.width,y=u.height;ah.max&&(g+=(g-v)*(h.max-l)/(l-a),l=h.max),fp.max&&(m+=(m-y)*(p.max-c)/(c-f),c=p.max),a=h.p2c(a),l=h.p2c(l),f=p.p2c(f),c=p.p2c(c),a>l&&(d=l,l=a,a=d),f>c&&(d=c,c=f,f=d),d=t.globalAlpha,t.globalAlpha*=n.images.alpha,t.drawImage(u,v,m,g-v,y-m,a+r.left,f+r.top,l-a,c-f),t.globalAlpha=d}}function r(e,t,n,r){if(!t.images.show)return;r.format=[{required:!0},{x:!0,number:!0,required:!0},{y:!0,number:!0,required:!0},{x:!0,number:!0,required:!0},{y:!0,number:!0,required:!0}]}function i(e){e.hooks.processRawData.push(r),e.hooks.drawSeries.push(n)}var t={series:{images:{show:!1,alpha:1,anchor:"corner"}}};e.plot.image={},e.plot.image.loadDataImages=function(t,n,r){var i=[],s=[],o=n.series.images.show;e.each(t,function(t,n){if(!o&&!n.images.show)return;n.data&&(n=n.data),e.each(n,function(e,t){typeof t[0]=="string"&&(i.push(t[0]),s.push(t))})}),e.plot.image.load(i,function(t){e.each(s,function(e,n){var r=n[0];t[r]&&(n[0]=t[r])}),r()})},e.plot.image.load=function(t,n){var r=t.length,i={};r==0&&n({}),e.each(t,function(t,s){var o=function(){--r,i[s]=this,r==0&&n(i)};e("").load(o).error(o).attr("src",s)})},e.plot.plugins.push({init:i,options:t,name:"image",version:"1.1"})})(jQuery); \ No newline at end of file diff --git a/htdocs/includes/jquery/plugins/flot/jquery.flot.js b/htdocs/includes/jquery/plugins/flot/jquery.flot.js old mode 100755 new mode 100644 index aabc544e9a9..aa7e362ae1e --- a/htdocs/includes/jquery/plugins/flot/jquery.flot.js +++ b/htdocs/includes/jquery/plugins/flot/jquery.flot.js @@ -1,16 +1,17 @@ -/*! Javascript plotting library for jQuery, v. 0.7. - * - * Released under the MIT license by IOLA, December 2007. - * - */ +/* Javascript plotting library for jQuery, version 0.8.1. + +Copyright (c) 2007-2013 IOLA and Ole Laursen. +Licensed under the MIT license. + +*/ // first an inline dependency, jquery.colorhelpers.js, we inline it here // for convenience /* Plugin for jQuery for working with colors. - * + * * Version 1.1. - * + * * Inspiration from jQuery color animation plugin by John Resig. * * Released under the MIT license by Ole Laursen, October 2009. @@ -27,17 +28,473 @@ * * V. 1.1: Fix error handling so e.g. parsing an empty string does * produce a color rather than just crashing. - */ + */ (function(B){B.color={};B.color.make=function(F,E,C,D){var G={};G.r=F||0;G.g=E||0;G.b=C||0;G.a=D!=null?D:1;G.add=function(J,I){for(var H=0;H=1){return"rgb("+[G.r,G.g,G.b].join(",")+")"}else{return"rgba("+[G.r,G.g,G.b,G.a].join(",")+")"}};G.normalize=function(){function H(J,K,I){return KI?I:K)}G.r=H(0,parseInt(G.r),255);G.g=H(0,parseInt(G.g),255);G.b=H(0,parseInt(G.b),255);G.a=H(0,G.a,1);return G};G.clone=function(){return B.color.make(G.r,G.b,G.g,G.a)};return G.normalize()};B.color.extract=function(D,C){var E;do{E=D.css(C).toLowerCase();if(E!=""&&E!="transparent"){break}D=D.parent()}while(!B.nodeName(D.get(0),"body"));if(E=="rgba(0, 0, 0, 0)"){E="transparent"}return B.color.parse(E)};B.color.parse=function(F){var E,C=B.color.make;if(E=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(F)){return C(parseInt(E[1],10),parseInt(E[2],10),parseInt(E[3],10))}if(E=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(F)){return C(parseInt(E[1],10),parseInt(E[2],10),parseInt(E[3],10),parseFloat(E[4]))}if(E=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(F)){return C(parseFloat(E[1])*2.55,parseFloat(E[2])*2.55,parseFloat(E[3])*2.55)}if(E=/rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(F)){return C(parseFloat(E[1])*2.55,parseFloat(E[2])*2.55,parseFloat(E[3])*2.55,parseFloat(E[4]))}if(E=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(F)){return C(parseInt(E[1],16),parseInt(E[2],16),parseInt(E[3],16))}if(E=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(F)){return C(parseInt(E[1]+E[1],16),parseInt(E[2]+E[2],16),parseInt(E[3]+E[3],16))}var D=B.trim(F).toLowerCase();if(D=="transparent"){return C(255,255,255,0)}else{E=A[D]||[0,0,0];return C(E[0],E[1],E[2])}};var A={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]}})(jQuery); // the actual Flot code (function($) { + + // Cache the prototype hasOwnProperty for faster access + + var hasOwnProperty = Object.prototype.hasOwnProperty; + + /////////////////////////////////////////////////////////////////////////// + // The Canvas object is a wrapper around an HTML5 tag. + // + // @constructor + // @param {string} cls List of classes to apply to the canvas. + // @param {element} container Element onto which to append the canvas. + // + // Requiring a container is a little iffy, but unfortunately canvas + // operations don't work unless the canvas is attached to the DOM. + + function Canvas(cls, container) { + + var element = container.children("." + cls)[0]; + + if (element == null) { + + element = document.createElement("canvas"); + element.className = cls; + + $(element).css({ direction: "ltr", position: "absolute", left: 0, top: 0 }) + .appendTo(container); + + // If HTML5 Canvas isn't available, fall back to [Ex|Flash]canvas + + if (!element.getContext) { + if (window.G_vmlCanvasManager) { + element = window.G_vmlCanvasManager.initElement(element); + } else { + throw new Error("Canvas is not available. If you're using IE with a fall-back such as Excanvas, then there's either a mistake in your conditional include, or the page has no DOCTYPE and is rendering in Quirks Mode."); + } + } + } + + this.element = element; + + var context = this.context = element.getContext("2d"); + + // Determine the screen's ratio of physical to device-independent + // pixels. This is the ratio between the canvas width that the browser + // advertises and the number of pixels actually present in that space. + + // The iPhone 4, for example, has a device-independent width of 320px, + // but its screen is actually 640px wide. It therefore has a pixel + // ratio of 2, while most normal devices have a ratio of 1. + + var devicePixelRatio = window.devicePixelRatio || 1, + backingStoreRatio = + context.webkitBackingStorePixelRatio || + context.mozBackingStorePixelRatio || + context.msBackingStorePixelRatio || + context.oBackingStorePixelRatio || + context.backingStorePixelRatio || 1; + + this.pixelRatio = devicePixelRatio / backingStoreRatio; + + // Size the canvas to match the internal dimensions of its container + + this.resize(container.width(), container.height()); + + // Collection of HTML div layers for text overlaid onto the canvas + + this.textContainer = null; + this.text = {}; + + // Cache of text fragments and metrics, so we can avoid expensively + // re-calculating them when the plot is re-rendered in a loop. + + this._textCache = {}; + } + + // Resizes the canvas to the given dimensions. + // + // @param {number} width New width of the canvas, in pixels. + // @param {number} width New height of the canvas, in pixels. + + Canvas.prototype.resize = function(width, height) { + + if (width <= 0 || height <= 0) { + throw new Error("Invalid dimensions for plot, width = " + width + ", height = " + height); + } + + var element = this.element, + context = this.context, + pixelRatio = this.pixelRatio; + + // Resize the canvas, increasing its density based on the display's + // pixel ratio; basically giving it more pixels without increasing the + // size of its element, to take advantage of the fact that retina + // displays have that many more pixels in the same advertised space. + + // Resizing should reset the state (excanvas seems to be buggy though) + + if (this.width != width) { + element.width = width * pixelRatio; + element.style.width = width + "px"; + this.width = width; + } + + if (this.height != height) { + element.height = height * pixelRatio; + element.style.height = height + "px"; + this.height = height; + } + + // Save the context, so we can reset in case we get replotted. The + // restore ensure that we're really back at the initial state, and + // should be safe even if we haven't saved the initial state yet. + + context.restore(); + context.save(); + + // Scale the coordinate space to match the display density; so even though we + // may have twice as many pixels, we still want lines and other drawing to + // appear at the same size; the extra pixels will just make them crisper. + + context.scale(pixelRatio, pixelRatio); + }; + + // Clears the entire canvas area, not including any overlaid HTML text + + Canvas.prototype.clear = function() { + this.context.clearRect(0, 0, this.width, this.height); + }; + + // Finishes rendering the canvas, including managing the text overlay. + + Canvas.prototype.render = function() { + + var cache = this._textCache; + + // For each text layer, add elements marked as active that haven't + // already been rendered, and remove those that are no longer active. + + for (var layerKey in cache) { + if (hasOwnProperty.call(cache, layerKey)) { + + var layer = this.getTextLayer(layerKey), + layerCache = cache[layerKey]; + + layer.hide(); + + for (var styleKey in layerCache) { + if (hasOwnProperty.call(layerCache, styleKey)) { + var styleCache = layerCache[styleKey]; + for (var key in styleCache) { + if (hasOwnProperty.call(styleCache, key)) { + + var positions = styleCache[key].positions; + + for (var i = 0, position; position = positions[i]; i++) { + if (position.active) { + if (!position.rendered) { + layer.append(position.element); + position.rendered = true; + } + } else { + positions.splice(i--, 1); + if (position.rendered) { + position.element.detach(); + } + } + } + + if (positions.length == 0) { + delete styleCache[key]; + } + } + } + } + } + + layer.show(); + } + } + }; + + // Creates (if necessary) and returns the text overlay container. + // + // @param {string} classes String of space-separated CSS classes used to + // uniquely identify the text layer. + // @return {object} The jQuery-wrapped text-layer div. + + Canvas.prototype.getTextLayer = function(classes) { + + var layer = this.text[classes]; + + // Create the text layer if it doesn't exist + + if (layer == null) { + + // Create the text layer container, if it doesn't exist + + if (this.textContainer == null) { + this.textContainer = $("
") + .css({ + position: "absolute", + top: 0, + left: 0, + bottom: 0, + right: 0, + 'font-size': "smaller", + color: "#545454" + }) + .insertAfter(this.element); + } + + layer = this.text[classes] = $("
") + .addClass(classes) + .css({ + position: "absolute", + top: 0, + left: 0, + bottom: 0, + right: 0 + }) + .appendTo(this.textContainer); + } + + return layer; + }; + + // Creates (if necessary) and returns a text info object. + // + // The object looks like this: + // + // { + // width: Width of the text's wrapper div. + // height: Height of the text's wrapper div. + // element: The jQuery-wrapped HTML div containing the text. + // positions: Array of positions at which this text is drawn. + // } + // + // The positions array contains objects that look like this: + // + // { + // active: Flag indicating whether the text should be visible. + // rendered: Flag indicating whether the text is currently visible. + // element: The jQuery-wrapped HTML div containing the text. + // x: X coordinate at which to draw the text. + // y: Y coordinate at which to draw the text. + // } + // + // Each position after the first receives a clone of the original element. + // + // The idea is that that the width, height, and general 'identity' of the + // text is constant no matter where it is placed; the placements are a + // secondary property. + // + // Canvas maintains a cache of recently-used text info objects; getTextInfo + // either returns the cached element or creates a new entry. + // + // @param {string} layer A string of space-separated CSS classes uniquely + // identifying the layer containing this text. + // @param {string} text Text string to retrieve info for. + // @param {(string|object)=} font Either a string of space-separated CSS + // classes or a font-spec object, defining the text's font and style. + // @param {number=} angle Angle at which to rotate the text, in degrees. + // Angle is currently unused, it will be implemented in the future. + // @param {number=} width Maximum width of the text before it wraps. + // @return {object} a text info object. + + Canvas.prototype.getTextInfo = function(layer, text, font, angle, width) { + + var textStyle, layerCache, styleCache, info; + + // Cast the value to a string, in case we were given a number or such + + text = "" + text; + + // If the font is a font-spec object, generate a CSS font definition + + if (typeof font === "object") { + textStyle = font.style + " " + font.variant + " " + font.weight + " " + font.size + "px/" + font.lineHeight + "px " + font.family; + } else { + textStyle = font; + } + + // Retrieve (or create) the cache for the text's layer and styles + + layerCache = this._textCache[layer]; + + if (layerCache == null) { + layerCache = this._textCache[layer] = {}; + } + + styleCache = layerCache[textStyle]; + + if (styleCache == null) { + styleCache = layerCache[textStyle] = {}; + } + + info = styleCache[text]; + + // If we can't find a matching element in our cache, create a new one + + if (info == null) { + + var element = $("
").html(text) + .css({ + position: "absolute", + 'max-width': width, + top: -9999 + }) + .appendTo(this.getTextLayer(layer)); + + if (typeof font === "object") { + element.css({ + font: textStyle, + color: font.color + }); + } else if (typeof font === "string") { + element.addClass(font); + } + + info = styleCache[text] = { + width: element.outerWidth(true), + height: element.outerHeight(true), + element: element, + positions: [] + }; + + element.detach(); + } + + return info; + }; + + // Adds a text string to the canvas text overlay. + // + // The text isn't drawn immediately; it is marked as rendering, which will + // result in its addition to the canvas on the next render pass. + // + // @param {string} layer A string of space-separated CSS classes uniquely + // identifying the layer containing this text. + // @param {number} x X coordinate at which to draw the text. + // @param {number} y Y coordinate at which to draw the text. + // @param {string} text Text string to draw. + // @param {(string|object)=} font Either a string of space-separated CSS + // classes or a font-spec object, defining the text's font and style. + // @param {number=} angle Angle at which to rotate the text, in degrees. + // Angle is currently unused, it will be implemented in the future. + // @param {number=} width Maximum width of the text before it wraps. + // @param {string=} halign Horizontal alignment of the text; either "left", + // "center" or "right". + // @param {string=} valign Vertical alignment of the text; either "top", + // "middle" or "bottom". + + Canvas.prototype.addText = function(layer, x, y, text, font, angle, width, halign, valign) { + + var info = this.getTextInfo(layer, text, font, angle, width), + positions = info.positions; + + // Tweak the div's position to match the text's alignment + + if (halign == "center") { + x -= info.width / 2; + } else if (halign == "right") { + x -= info.width; + } + + if (valign == "middle") { + y -= info.height / 2; + } else if (valign == "bottom") { + y -= info.height; + } + + // Determine whether this text already exists at this position. + // If so, mark it for inclusion in the next render pass. + + for (var i = 0, position; position = positions[i]; i++) { + if (position.x == x && position.y == y) { + position.active = true; + return; + } + } + + // If the text doesn't exist at this position, create a new entry + + // For the very first position we'll re-use the original element, + // while for subsequent ones we'll clone it. + + position = { + active: true, + rendered: false, + element: positions.length ? info.element.clone() : info.element, + x: x, + y: y + } + + positions.push(position); + + // Move the element to its final position within the container + + position.element.css({ + top: Math.round(y), + left: Math.round(x), + 'text-align': halign // In case the text wraps + }); + }; + + // Removes one or more text strings from the canvas text overlay. + // + // If no parameters are given, all text within the layer is removed. + // + // Note that the text is not immediately removed; it is simply marked as + // inactive, which will result in its removal on the next render pass. + // This avoids the performance penalty for 'clear and redraw' behavior, + // where we potentially get rid of all text on a layer, but will likely + // add back most or all of it later, as when redrawing axes, for example. + // + // @param {string} layer A string of space-separated CSS classes uniquely + // identifying the layer containing this text. + // @param {number=} x X coordinate of the text. + // @param {number=} y Y coordinate of the text. + // @param {string=} text Text string to remove. + // @param {(string|object)=} font Either a string of space-separated CSS + // classes or a font-spec object, defining the text's font and style. + // @param {number=} angle Angle at which the text is rotated, in degrees. + // Angle is currently unused, it will be implemented in the future. + + Canvas.prototype.removeText = function(layer, x, y, text, font, angle) { + if (text == null) { + var layerCache = this._textCache[layer]; + if (layerCache != null) { + for (var styleKey in layerCache) { + if (hasOwnProperty.call(layerCache, styleKey)) { + var styleCache = layerCache[styleKey]; + for (var key in styleCache) { + if (hasOwnProperty.call(styleCache, key)) { + var positions = styleCache[key].positions; + for (var i = 0, position; position = positions[i]; i++) { + position.active = false; + } + } + } + } + } + } + } else { + var positions = this.getTextInfo(layer, text, font, angle).positions; + for (var i = 0, position; position = positions[i]; i++) { + if (position.x == x && position.y == y) { + position.active = false; + } + } + } + }; + + /////////////////////////////////////////////////////////////////////////// + // The top-level container for the entire plot. + function Plot(placeholder, data_, options_, plugins) { // data is on the form: // [ series1, series2 ... ] // where series is either just the data as [ [x1, y1], [x2, y2], ... ] // or { data: [ [x1, y1], [x2, y2], ... ], label: "some label", ... } - + var series = [], options = { // the color theme used for graphs @@ -51,12 +508,14 @@ position: "ne", // position of default legend container within plot margin: 5, // distance from grid edge to default legend container within plot backgroundColor: null, // null means auto-detect - backgroundOpacity: 0.85 // set to 0 to avoid background + backgroundOpacity: 0.85, // set to 0 to avoid background + sorted: null // default to no legend sorting }, xaxis: { show: null, // null = auto-detect, true = always, false = never position: "bottom", // or "top" mode: null, // null or "time" + font: null, // null (derived from CSS in placeholder) or object like { size: 11, lineHeight: 13, style: "italic", weight: "bold", family: "sans-serif", variant: "small-caps" } color: null, // base color, labels, ticks tickColor: null, // possibly different color of ticks, e.g. "rgba(0,0,0,0.15)" transform: null, // null or f: number -> number to transform axis @@ -71,14 +530,9 @@ reserveSpace: null, // whether to reserve space even if axis isn't shown tickLength: null, // size in pixels of ticks, or "full" for whole line alignTicksWithAxis: null, // axis number or null for no sync - - // mode specific options tickDecimals: null, // no. of decimals, null means auto tickSize: null, // number or [number, "unit"] - minTickSize: null, // number or [number, "unit"] - monthNames: null, // list of names of months - timeformat: null, // format string to use - twelveHourClock: false // 12 or 24 time in time mode + minTickSize: null // number or [number, "unit"] }, yaxis: { autoscaleMargin: 0.02, @@ -97,11 +551,13 @@ }, lines: { // we don't put in show: false so we can see - // whether lines were actively disabled + // whether lines were actively disabled lineWidth: 2, // in pixels fill: false, fillColor: null, steps: false + // Omit 'zero', so we can later default its value to + // match that of the 'fill' option. }, bars: { show: false, @@ -109,10 +565,12 @@ barWidth: 1, // in units of the x axis fill: true, fillColor: null, - align: "left", // or "center" - horizontal: false + align: "left", // "left", "right", or "center" + horizontal: false, + zero: true }, - shadowSize: 3 + shadowSize: 3, + highlightColor: null }, grid: { show: true, @@ -121,6 +579,7 @@ backgroundColor: null, // null for transparent, else color borderColor: null, // set if different from the grid color tickColor: null, // color for the ticks, e.g. "rgba(0,0,0,0.15)" + margin: 0, // distance from the canvas edge to the grid labelMargin: 5, // in pixels axisMargin: 8, // in pixels borderWidth: 2, // in pixels @@ -134,20 +593,24 @@ autoHighlight: true, // highlight in case mouse is near mouseActiveRadius: 10 // how far the mouse can be away to activate an item }, + interaction: { + redrawOverlayInterval: 1000/60 // time between updates, -1 means in same flow + }, hooks: {} }, - canvas = null, // the canvas for the plot itself + surface = null, // the canvas for the plot itself overlay = null, // canvas for interactive stuff on top of plot eventHolder = null, // jQuery object that events should be bound to ctx = null, octx = null, xaxes = [], yaxes = [], plotOffset = { left: 0, right: 0, top: 0, bottom: 0}, - canvasWidth = 0, canvasHeight = 0, plotWidth = 0, plotHeight = 0, hooks = { processOptions: [], processRawData: [], processDatapoints: [], + processOffset: [], + drawBackground: [], drawSeries: [], draw: [], bindEvents: [], @@ -161,7 +624,7 @@ plot.setupGrid = setupGrid; plot.draw = draw; plot.getPlaceholder = function() { return placeholder; }; - plot.getCanvas = function() { return canvas; }; + plot.getCanvas = function() { return surface.element; }; plot.getPlotOffset = function() { return plotOffset; }; plot.width = function () { return plotWidth; }; plot.height = function () { return plotHeight; }; @@ -190,20 +653,21 @@ plot.triggerRedrawOverlay = triggerRedrawOverlay; plot.pointOffset = function(point) { return { - left: parseInt(xaxes[axisNumber(point, "x") - 1].p2c(+point.x) + plotOffset.left), - top: parseInt(yaxes[axisNumber(point, "y") - 1].p2c(+point.y) + plotOffset.top) + left: parseInt(xaxes[axisNumber(point, "x") - 1].p2c(+point.x) + plotOffset.left, 10), + top: parseInt(yaxes[axisNumber(point, "y") - 1].p2c(+point.y) + plotOffset.top, 10) }; }; plot.shutdown = shutdown; plot.resize = function () { - getCanvasDimensions(); - resizeCanvas(canvas); - resizeCanvas(overlay); + var width = placeholder.width(), + height = placeholder.height(); + surface.resize(width, height); + overlay.resize(width, height); }; // public attributes plot.hooks = hooks; - + // initialize initPlugins(plot); parseOptions(options_); @@ -221,40 +685,103 @@ } function initPlugins() { + + // References to key classes, allowing plugins to modify them + + var classes = { + Canvas: Canvas + }; + for (var i = 0; i < plugins.length; ++i) { var p = plugins[i]; - p.init(plot); + p.init(plot, classes); if (p.options) $.extend(true, options, p.options); } } - + function parseOptions(opts) { - var i; - + $.extend(true, options, opts); - + + // $.extend merges arrays, rather than replacing them. When less + // colors are provided than the size of the default palette, we + // end up with those colors plus the remaining defaults, which is + // not expected behavior; avoid it by replacing them here. + + if (opts && opts.colors) { + options.colors = opts.colors; + } + if (options.xaxis.color == null) - options.xaxis.color = options.grid.color; + options.xaxis.color = $.color.parse(options.grid.color).scale('a', 0.22).toString(); if (options.yaxis.color == null) - options.yaxis.color = options.grid.color; - - if (options.xaxis.tickColor == null) // backwards-compatibility - options.xaxis.tickColor = options.grid.tickColor; - if (options.yaxis.tickColor == null) // backwards-compatibility - options.yaxis.tickColor = options.grid.tickColor; + options.yaxis.color = $.color.parse(options.grid.color).scale('a', 0.22).toString(); + + if (options.xaxis.tickColor == null) // grid.tickColor for back-compatibility + options.xaxis.tickColor = options.grid.tickColor || options.xaxis.color; + if (options.yaxis.tickColor == null) // grid.tickColor for back-compatibility + options.yaxis.tickColor = options.grid.tickColor || options.yaxis.color; if (options.grid.borderColor == null) options.grid.borderColor = options.grid.color; if (options.grid.tickColor == null) options.grid.tickColor = $.color.parse(options.grid.color).scale('a', 0.22).toString(); - - // fill in defaults in axes, copy at least always the - // first as the rest of the code assumes it'll be there - for (i = 0; i < Math.max(1, options.xaxes.length); ++i) - options.xaxes[i] = $.extend(true, {}, options.xaxis, options.xaxes[i]); - for (i = 0; i < Math.max(1, options.yaxes.length); ++i) - options.yaxes[i] = $.extend(true, {}, options.yaxis, options.yaxes[i]); + + // Fill in defaults for axis options, including any unspecified + // font-spec fields, if a font-spec was provided. + + // If no x/y axis options were provided, create one of each anyway, + // since the rest of the code assumes that they exist. + + var i, axisOptions, axisCount, + fontDefaults = { + style: placeholder.css("font-style"), + size: Math.round(0.8 * (+placeholder.css("font-size").replace("px", "") || 13)), + variant: placeholder.css("font-variant"), + weight: placeholder.css("font-weight"), + family: placeholder.css("font-family") + }; + + fontDefaults.lineHeight = fontDefaults.size * 1.15; + + axisCount = options.xaxes.length || 1; + for (i = 0; i < axisCount; ++i) { + + axisOptions = options.xaxes[i]; + if (axisOptions && !axisOptions.tickColor) { + axisOptions.tickColor = axisOptions.color; + } + + axisOptions = $.extend(true, {}, options.xaxis, axisOptions); + options.xaxes[i] = axisOptions; + + if (axisOptions.font) { + axisOptions.font = $.extend({}, fontDefaults, axisOptions.font); + if (!axisOptions.font.color) { + axisOptions.font.color = axisOptions.color; + } + } + } + + axisCount = options.yaxes.length || 1; + for (i = 0; i < axisCount; ++i) { + + axisOptions = options.yaxes[i]; + if (axisOptions && !axisOptions.tickColor) { + axisOptions.tickColor = axisOptions.color; + } + + axisOptions = $.extend(true, {}, options.yaxis, axisOptions); + options.yaxes[i] = axisOptions; + + if (axisOptions.font) { + axisOptions.font = $.extend({}, fontDefaults, axisOptions.font); + if (!axisOptions.font.color) { + axisOptions.font.color = axisOptions.color; + } + } + } // backwards compatibility, to be removed in future if (options.xaxis.noTicks && options.xaxis.ticks == null) @@ -281,6 +808,8 @@ $.extend(true, options.series.bars, options.bars); if (options.shadowSize != null) options.series.shadowSize = options.shadowSize; + if (options.highlightColor != null) + options.series.highlightColor = options.highlightColor; // save options on axes for future reference for (i = 0; i < options.xaxes.length; ++i) @@ -301,7 +830,7 @@ fillInSeriesOptions(); processData(); } - + function parseData(d) { var res = []; for (var i = 0; i < d.length; ++i) { @@ -322,7 +851,7 @@ return res; } - + function axisNumber(obj, coord) { var a = obj[coord + "axis"]; if (typeof a == "object") // if we got a real axis, extract number @@ -336,9 +865,9 @@ // return flat array without annoying null entries return $.grep(xaxes.concat(yaxes), function (a) { return a; }); } - + function canvasToAxisCoords(pos) { - // return an object with x/y corresponding to all used axes + // return an object with x/y corresponding to all used axes var res = {}, i, axis; for (i = 0; i < xaxes.length; ++i) { axis = xaxes[i]; @@ -351,7 +880,7 @@ if (axis && axis.used) res["y" + axis.n] = axis.c2p(pos.top); } - + if (res.x1 !== undefined) res.x = res.x1; if (res.y1 !== undefined) @@ -359,7 +888,7 @@ return res; } - + function axisToCanvasCoords(pos) { // get canvas coords from the first pair of x/y found in pos var res = {}, i, axis, key; @@ -377,7 +906,7 @@ } } } - + for (i = 0; i < yaxes.length; ++i) { axis = yaxes[i]; if (axis && axis.used) { @@ -391,10 +920,10 @@ } } } - + return res; } - + function getOrCreateAxis(axes, number) { if (!axes[number - 1]) axes[number - 1] = { @@ -402,64 +931,69 @@ direction: axes == xaxes ? "x" : "y", options: $.extend(true, {}, axes == xaxes ? options.xaxis : options.yaxis) }; - + return axes[number - 1]; } function fillInSeriesOptions() { - var i; - - // collect what we already got of colors - var neededColors = series.length, - usedColors = [], - assignedColors = []; + + var neededColors = series.length, maxIndex = -1, i; + + // Subtract the number of series that already have fixed colors or + // color indexes from the number that we still need to generate. + for (i = 0; i < series.length; ++i) { var sc = series[i].color; if (sc != null) { - --neededColors; - if (typeof sc == "number") - assignedColors.push(sc); - else - usedColors.push($.color.parse(series[i].color)); - } - } - - // we might need to generate more colors if higher indices - // are assigned - for (i = 0; i < assignedColors.length; ++i) { - neededColors = Math.max(neededColors, assignedColors[i] + 1); - } - - // produce colors as needed - var colors = [], variation = 0; - i = 0; - while (colors.length < neededColors) { - var c; - if (options.colors.length == i) // check degenerate case - c = $.color.make(100, 100, 100); - else - c = $.color.parse(options.colors[i]); - - // vary color if needed - var sign = variation % 2 == 1 ? -1 : 1; - c.scale('rgb', 1 + sign * Math.ceil(variation / 2) * 0.2) - - // FIXME: if we're getting to close to something else, - // we should probably skip this one - colors.push(c); - - ++i; - if (i >= options.colors.length) { - i = 0; - ++variation; + neededColors--; + if (typeof sc == "number" && sc > maxIndex) { + maxIndex = sc; + } } } - // fill in the options + // If any of the series have fixed color indexes, then we need to + // generate at least as many colors as the highest index. + + if (neededColors <= maxIndex) { + neededColors = maxIndex + 1; + } + + // Generate all the colors, using first the option colors and then + // variations on those colors once they're exhausted. + + var c, colors = [], colorPool = options.colors, + colorPoolSize = colorPool.length, variation = 0; + + for (i = 0; i < neededColors; i++) { + + c = $.color.parse(colorPool[i % colorPoolSize] || "#666"); + + // Each time we exhaust the colors in the pool we adjust + // a scaling factor used to produce more variations on + // those colors. The factor alternates negative/positive + // to produce lighter/darker colors. + + // Reset the variation after every few cycles, or else + // it will end up producing only white or black colors. + + if (i % colorPoolSize == 0 && i) { + if (variation >= 0) { + if (variation < 0.5) { + variation = -variation - 0.2; + } else variation = 0; + } else variation = -variation; + } + + colors[i] = c.scale('rgb', 1 + variation); + } + + // Finalize the series options, filling in their colors + var colori = 0, s; for (i = 0; i < series.length; ++i) { s = series[i]; - + // assign colors if (s.color == null) { s.color = colors[colori].toString(); @@ -480,18 +1014,26 @@ s.lines.show = true; } + // If nothing was provided for lines.zero, default it to match + // lines.fill, since areas by default should extend to zero. + + if (s.lines.zero == null) { + s.lines.zero = !!s.lines.fill; + } + // setup axes s.xaxis = getOrCreateAxis(xaxes, axisNumber(s, "x")); s.yaxis = getOrCreateAxis(yaxes, axisNumber(s, "y")); } } - + function processData() { var topSentry = Number.POSITIVE_INFINITY, bottomSentry = Number.NEGATIVE_INFINITY, fakeInfinity = Number.MAX_VALUE, i, j, k, m, length, - s, points, ps, x, y, axis, val, f, p; + s, points, ps, x, y, axis, val, f, p, + data, format; function updateAxis(axis, min, max) { if (min < axis.datamin && min != -fakeInfinity) @@ -506,19 +1048,20 @@ axis.datamax = bottomSentry; axis.used = false; }); - + for (i = 0; i < series.length; ++i) { s = series[i]; s.datapoints = { points: [] }; - + executeHooks(hooks.processRawData, [ s, s.data, s.datapoints ]); } - + // first pass: clean and copy data for (i = 0; i < series.length; ++i) { s = series[i]; - var data = s.data, format = s.datapoints.format; + data = s.data; + format = s.datapoints.format; if (!format) { format = []; @@ -527,13 +1070,14 @@ format.push({ y: true, number: true, required: true }); if (s.bars.show || (s.lines.show && s.lines.fill)) { - format.push({ y: true, number: true, required: false, defaultValue: 0 }); + var autoscale = !!((s.bars.show && s.bars.zero) || (s.lines.show && s.lines.zero)); + format.push({ y: true, number: true, required: false, defaultValue: 0, autoscale: autoscale }); if (s.bars.horizontal) { delete format[format.length - 1].y; format[format.length - 1].x = true; } } - + s.datapoints.format = format; } @@ -541,13 +1085,13 @@ continue; // already filled in s.datapoints.pointsize = format.length; - + ps = s.datapoints.pointsize; points = s.datapoints.points; - insertSteps = s.lines.show && s.lines.steps; + var insertSteps = s.lines.show && s.lines.steps; s.xaxis.used = s.yaxis.used = true; - + for (j = k = 0; j < data.length; ++j, k += ps) { p = data[j]; @@ -571,26 +1115,30 @@ if (val == null) { if (f.required) nullify = true; - + if (f.defaultValue != null) val = f.defaultValue; } } - + points[k + m] = val; } } - + if (nullify) { for (m = 0; m < ps; ++m) { val = points[k + m]; if (val != null) { f = format[m]; // extract min/max info - if (f.x) - updateAxis(s.xaxis, val, val); - if (f.y) - updateAxis(s.yaxis, val, val); + if (f.autoscale) { + if (f.x) { + updateAxis(s.xaxis, val, val); + } + if (f.y) { + updateAxis(s.yaxis, val, val); + } + } } points[k + m] = null; } @@ -620,19 +1168,20 @@ // give the hooks a chance to run for (i = 0; i < series.length; ++i) { s = series[i]; - + executeHooks(hooks.processDatapoints, [ s, s.datapoints]); } // second pass: find datamax/datamin for auto-scaling for (i = 0; i < series.length; ++i) { s = series[i]; - points = s.datapoints.points, + points = s.datapoints.points; ps = s.datapoints.pointsize; + format = s.datapoints.format; var xmin = topSentry, ymin = topSentry, xmax = bottomSentry, ymax = bottomSentry; - + for (j = 0; j < points.length; j += ps) { if (points[j] == null) continue; @@ -640,9 +1189,9 @@ for (m = 0; m < ps; ++m) { val = points[j + m]; f = format[m]; - if (!f || val == fakeInfinity || val == -fakeInfinity) + if (!f || f.autoscale === false || val == fakeInfinity || val == -fakeInfinity) continue; - + if (f.x) { if (val < xmin) xmin = val; @@ -657,10 +1206,25 @@ } } } - + if (s.bars.show) { // make sure we got room for the bar on the dancing floor - var delta = s.bars.align == "left" ? 0 : -s.bars.barWidth/2; + var delta; + + switch (s.bars.align) { + case "left": + delta = 0; + break; + case "right": + delta = -s.bars.barWidth; + break; + case "center": + delta = -s.bars.barWidth / 2; + break; + default: + throw new Error("Invalid bar alignment: " + s.bars.align); + } + if (s.bars.horizontal) { ymin += delta; ymax += delta + s.bars.barWidth; @@ -670,7 +1234,7 @@ xmax += delta + s.bars.barWidth; } } - + updateAxis(s.xaxis, xmin, xmax); updateAxis(s.yaxis, ymin, ymax); } @@ -683,103 +1247,33 @@ }); } - function makeCanvas(skipPositioning, cls) { - var c = document.createElement('canvas'); - c.className = cls; - c.width = canvasWidth; - c.height = canvasHeight; - - if (!skipPositioning) - $(c).css({ position: 'absolute', left: 0, top: 0 }); - - $(c).appendTo(placeholder); - - if (!c.getContext) // excanvas hack - c = window.G_vmlCanvasManager.initElement(c); - - // used for resetting in case we get replotted - c.getContext("2d").save(); - - return c; - } - - function getCanvasDimensions() { - canvasWidth = placeholder.width(); - canvasHeight = placeholder.height(); - - if (canvasWidth <= 0 || canvasHeight <= 0) - throw "Invalid dimensions for plot, width = " + canvasWidth + ", height = " + canvasHeight; - } - - function resizeCanvas(c) { - // resizing should reset the state (excanvas seems to be - // buggy though) - if (c.width != canvasWidth) - c.width = canvasWidth; - - if (c.height != canvasHeight) - c.height = canvasHeight; - - // so try to get back to the initial state (even if it's - // gone now, this should be safe according to the spec) - var cctx = c.getContext("2d"); - cctx.restore(); - - // and save again - cctx.save(); - } - function setupCanvases() { - var reused, - existingCanvas = placeholder.children("canvas.base"), - existingOverlay = placeholder.children("canvas.overlay"); - if (existingCanvas.length == 0 || existingOverlay == 0) { - // init everything - - placeholder.html(""); // make sure placeholder is clear - - placeholder.css({ padding: 0 }); // padding messes up the positioning - - if (placeholder.css("position") == 'static') - placeholder.css("position", "relative"); // for positioning labels and overlay + // Make sure the placeholder is clear of everything except canvases + // from a previous plot in this container that we'll try to re-use. - getCanvasDimensions(); - - canvas = makeCanvas(true, "base"); - overlay = makeCanvas(false, "overlay"); // overlay canvas for interactive features + placeholder.css("padding", 0) // padding messes up the positioning + .children(":not(.flot-base,.flot-overlay)").remove(); - reused = false; - } - else { - // reuse existing elements + if (placeholder.css("position") == 'static') + placeholder.css("position", "relative"); // for positioning labels and overlay - canvas = existingCanvas.get(0); - overlay = existingOverlay.get(0); + surface = new Canvas("flot-base", placeholder); + overlay = new Canvas("flot-overlay", placeholder); // overlay canvas for interactive features - reused = true; - } + ctx = surface.context; + octx = overlay.context; - ctx = canvas.getContext("2d"); - octx = overlay.getContext("2d"); + // define which element we're listening for events on + eventHolder = $(overlay.element).unbind(); - // we include the canvas in the event holder too, because IE 7 - // sometimes has trouble with the stacking order - eventHolder = $([overlay, canvas]); + // If we're re-using a plot object, shut down the old one - if (reused) { - // run shutdown in the old plot object - placeholder.data("plot").shutdown(); + var existing = placeholder.data("plot"); - // reset reused canvases - plot.resize(); - - // make sure overlay pixels are cleared (canvas is cleared when we redraw) - octx.clearRect(0, 0, canvasWidth, canvasHeight); - - // then whack any remaining obvious garbage left - eventHolder.unbind(); - placeholder.children().not([canvas, overlay]).remove(); + if (existing) { + existing.shutdown(); + overlay.clear(); } // save in case we get replotted @@ -790,7 +1284,14 @@ // bind events if (options.grid.hoverable) { eventHolder.mousemove(onMouseMove); - eventHolder.mouseleave(onMouseLeave); + + // Use bind, rather than .mouseleave, because we officially + // still support jQuery 1.2.6, which doesn't define a shortcut + // for mouseenter or mouseleave. This was a bug/oversight that + // was fixed somewhere around 1.3.x. We can return to using + // .mouseleave when we drop support for 1.2.6. + + eventHolder.bind("mouseleave", onMouseLeave); } if (options.grid.clickable) @@ -802,23 +1303,23 @@ function shutdown() { if (redrawTimeout) clearTimeout(redrawTimeout); - + eventHolder.unbind("mousemove", onMouseMove); eventHolder.unbind("mouseleave", onMouseLeave); eventHolder.unbind("click", onClick); - + executeHooks(hooks.shutdown, [eventHolder]); } function setTransformationHelpers(axis) { // set helper functions on the axis, assumes plot area // has been computed already - + function identity(x) { return x; } - + var s, m, t = axis.options.transform || identity, it = axis.options.inverseTransform; - + // precompute how much the axis is scaling a point // in canvas space if (axis.direction == "x") { @@ -844,129 +1345,95 @@ } function measureTickLabels(axis) { - var opts = axis.options, i, ticks = axis.ticks || [], labels = [], - l, w = opts.labelWidth, h = opts.labelHeight, dummyDiv; - function makeDummyDiv(labels, width) { - return $('
' + - '
' - + labels.join("") + '
') - .appendTo(placeholder); - } - - if (axis.direction == "x") { - // to avoid measuring the widths of the labels (it's slow), we - // construct fixed-size boxes and put the labels inside - // them, we don't need the exact figures and the - // fixed-size box content is easy to center - if (w == null) - w = Math.floor(canvasWidth / (ticks.length > 0 ? ticks.length : 1)); + var opts = axis.options, + ticks = axis.ticks || [], + labelWidth = opts.labelWidth || 0, + labelHeight = opts.labelHeight || 0, + maxWidth = labelWidth || axis.direction == "x" ? Math.floor(surface.width / (ticks.length || 1)) : null; + legacyStyles = axis.direction + "Axis " + axis.direction + axis.n + "Axis", + layer = "flot-" + axis.direction + "-axis flot-" + axis.direction + axis.n + "-axis " + legacyStyles, + font = opts.font || "flot-tick-label tickLabel"; - // measure x label heights - if (h == null) { - labels = []; - for (i = 0; i < ticks.length; ++i) { - l = ticks[i].label; - if (l) - labels.push('
' + l + '
'); - } + for (var i = 0; i < ticks.length; ++i) { - if (labels.length > 0) { - // stick them all in the same div and measure - // collective height - labels.push('
'); - dummyDiv = makeDummyDiv(labels, "width:10000px;"); - h = dummyDiv.height(); - dummyDiv.remove(); - } - } - } - else if (w == null || h == null) { - // calculate y label dimensions - for (i = 0; i < ticks.length; ++i) { - l = ticks[i].label; - if (l) - labels.push('
' + l + '
'); - } - - if (labels.length > 0) { - dummyDiv = makeDummyDiv(labels, ""); - if (w == null) - w = dummyDiv.children().width(); - if (h == null) - h = dummyDiv.find("div.tickLabel").height(); - dummyDiv.remove(); - } + var t = ticks[i]; + + if (!t.label) + continue; + + var info = surface.getTextInfo(layer, t.label, font, null, maxWidth); + + labelWidth = Math.max(labelWidth, info.width); + labelHeight = Math.max(labelHeight, info.height); } - if (w == null) - w = 0; - if (h == null) - h = 0; - - axis.labelWidth = w; - axis.labelHeight = h; + axis.labelWidth = opts.labelWidth || labelWidth; + axis.labelHeight = opts.labelHeight || labelHeight; } function allocateAxisBoxFirstPhase(axis) { // find the bounding box of the axis by looking at label // widths/heights and ticks, make room by diminishing the - // plotOffset + // plotOffset; this first phase only looks at one + // dimension per axis, the other dimension depends on the + // other axes so will have to wait var lw = axis.labelWidth, lh = axis.labelHeight, pos = axis.options.position, tickLength = axis.options.tickLength, - axismargin = options.grid.axisMargin, + axisMargin = options.grid.axisMargin, padding = options.grid.labelMargin, all = axis.direction == "x" ? xaxes : yaxes, - index; + index, innermost; // determine axis margin var samePosition = $.grep(all, function (a) { return a && a.options.position == pos && a.reserveSpace; }); if ($.inArray(axis, samePosition) == samePosition.length - 1) - axismargin = 0; // outermost + axisMargin = 0; // outermost // determine tick length - if we're innermost, we can use "full" - if (tickLength == null) - tickLength = "full"; + if (tickLength == null) { + var sameDirection = $.grep(all, function (a) { + return a && a.reserveSpace; + }); - var sameDirection = $.grep(all, function (a) { - return a && a.reserveSpace; - }); + innermost = $.inArray(axis, sameDirection) == 0; + if (innermost) + tickLength = "full"; + else + tickLength = 5; + } - var innermost = $.inArray(axis, sameDirection) == 0; - if (!innermost && tickLength == "full") - tickLength = 5; - if (!isNaN(+tickLength)) padding += +tickLength; // compute box if (axis.direction == "x") { lh += padding; - + if (pos == "bottom") { - plotOffset.bottom += lh + axismargin; - axis.box = { top: canvasHeight - plotOffset.bottom, height: lh }; + plotOffset.bottom += lh + axisMargin; + axis.box = { top: surface.height - plotOffset.bottom, height: lh }; } else { - axis.box = { top: plotOffset.top + axismargin, height: lh }; - plotOffset.top += lh + axismargin; + axis.box = { top: plotOffset.top + axisMargin, height: lh }; + plotOffset.top += lh + axisMargin; } } else { lw += padding; - + if (pos == "left") { - axis.box = { left: plotOffset.left + axismargin, width: lw }; - plotOffset.left += lw + axismargin; + axis.box = { left: plotOffset.left + axisMargin, width: lw }; + plotOffset.left += lw + axisMargin; } else { - plotOffset.right += lw + axismargin; - axis.box = { left: canvasWidth - plotOffset.right, width: lw }; + plotOffset.right += lw + axisMargin; + axis.box = { left: surface.width - plotOffset.right, width: lw }; } } @@ -978,85 +1445,128 @@ } function allocateAxisBoxSecondPhase(axis) { - // set remaining bounding box coordinates + // now that all axis boxes have been placed in one + // dimension, we can set the remaining dimension coordinates if (axis.direction == "x") { - axis.box.left = plotOffset.left; - axis.box.width = plotWidth; + axis.box.left = plotOffset.left - axis.labelWidth / 2; + axis.box.width = surface.width - plotOffset.left - plotOffset.right + axis.labelWidth; } else { - axis.box.top = plotOffset.top; - axis.box.height = plotHeight; + axis.box.top = plotOffset.top - axis.labelHeight / 2; + axis.box.height = surface.height - plotOffset.bottom - plotOffset.top + axis.labelHeight; } } - + + function adjustLayoutForThingsStickingOut() { + // possibly adjust plot offset to ensure everything stays + // inside the canvas and isn't clipped off + + var minMargin = options.grid.minBorderMargin, + margins = { x: 0, y: 0 }, i, axis; + + // check stuff from the plot (FIXME: this should just read + // a value from the series, otherwise it's impossible to + // customize) + if (minMargin == null) { + minMargin = 0; + for (i = 0; i < series.length; ++i) + minMargin = Math.max(minMargin, 2 * (series[i].points.radius + series[i].points.lineWidth/2)); + } + + margins.x = margins.y = Math.ceil(minMargin); + + // check axis labels, note we don't check the actual + // labels but instead use the overall width/height to not + // jump as much around with replots + $.each(allAxes(), function (_, axis) { + var dir = axis.direction; + if (axis.reserveSpace) + margins[dir] = Math.ceil(Math.max(margins[dir], (dir == "x" ? axis.labelWidth : axis.labelHeight) / 2)); + }); + + plotOffset.left = Math.max(margins.x, plotOffset.left); + plotOffset.right = Math.max(margins.x, plotOffset.right); + plotOffset.top = Math.max(margins.y, plotOffset.top); + plotOffset.bottom = Math.max(margins.y, plotOffset.bottom); + } + function setupGrid() { - var i, axes = allAxes(); + var i, axes = allAxes(), showGrid = options.grid.show; - // first calculate the plot and axis box dimensions + // Initialize the plot's offset from the edge of the canvas + for (var a in plotOffset) { + var margin = options.grid.margin || 0; + plotOffset[a] = typeof margin == "number" ? margin : margin[a] || 0; + } + + executeHooks(hooks.processOffset, [plotOffset]); + + // If the grid is visible, add its border width to the offset + + for (var a in plotOffset) { + if(typeof(options.grid.borderWidth) == "object") { + plotOffset[a] += showGrid ? options.grid.borderWidth[a] : 0; + } + else { + plotOffset[a] += showGrid ? options.grid.borderWidth : 0; + } + } + + // init axes $.each(axes, function (_, axis) { axis.show = axis.options.show; if (axis.show == null) axis.show = axis.used; // by default an axis is visible if it's got data - + axis.reserveSpace = axis.show || axis.options.reserveSpace; setRange(axis); }); - allocatedAxes = $.grep(axes, function (axis) { return axis.reserveSpace; }); + if (showGrid) { + + var allocatedAxes = $.grep(axes, function (axis) { return axis.reserveSpace; }); - plotOffset.left = plotOffset.right = plotOffset.top = plotOffset.bottom = 0; - if (options.grid.show) { $.each(allocatedAxes, function (_, axis) { // make the ticks setupTickGeneration(axis); setTicks(axis); snapRangeToTicks(axis, axis.ticks); - // find labelWidth/Height for axis measureTickLabels(axis); }); - // with all dimensions in house, we can compute the - // axis boxes, start from the outside (reverse order) + // with all dimensions calculated, we can compute the + // axis bounding boxes, start from the outside + // (reverse order) for (i = allocatedAxes.length - 1; i >= 0; --i) allocateAxisBoxFirstPhase(allocatedAxes[i]); // make sure we've got enough space for things that // might stick out - var minMargin = options.grid.minBorderMargin; - if (minMargin == null) { - minMargin = 0; - for (i = 0; i < series.length; ++i) - minMargin = Math.max(minMargin, series[i].points.radius + series[i].points.lineWidth/2); - } - - for (var a in plotOffset) { - plotOffset[a] += options.grid.borderWidth; - plotOffset[a] = Math.max(minMargin, plotOffset[a]); - } - } - - plotWidth = canvasWidth - plotOffset.left - plotOffset.right; - plotHeight = canvasHeight - plotOffset.bottom - plotOffset.top; + adjustLayoutForThingsStickingOut(); - // now we got the proper plotWidth/Height, we can compute the scaling + $.each(allocatedAxes, function (_, axis) { + allocateAxisBoxSecondPhase(axis); + }); + } + + plotWidth = surface.width - plotOffset.left - plotOffset.right; + plotHeight = surface.height - plotOffset.bottom - plotOffset.top; + + // now we got the proper plot dimensions, we can compute the scaling $.each(axes, function (_, axis) { setTransformationHelpers(axis); }); - if (options.grid.show) { - $.each(allocatedAxes, function (_, axis) { - allocateAxisBoxSecondPhase(axis); - }); - - insertAxisLabels(); + if (showGrid) { + drawAxisLabels(); } - + insertLegend(); } - + function setRange(axis) { var opts = axis.options, min = +(opts.min != null ? opts.min : axis.datamin), @@ -1098,7 +1608,7 @@ function setupTickGeneration(axis) { var opts = axis.options; - + // estimate number of ticks var noTicks; if (typeof opts.ticks == "number" && opts.ticks > 0) @@ -1106,209 +1616,65 @@ else // heuristic based on the model a*sqrt(x) fitted to // some data points that seemed reasonable - noTicks = 0.3 * Math.sqrt(axis.direction == "x" ? canvasWidth : canvasHeight); + noTicks = 0.3 * Math.sqrt(axis.direction == "x" ? surface.width : surface.height); var delta = (axis.max - axis.min) / noTicks, - size, generator, unit, formatter, i, magn, norm; + dec = -Math.floor(Math.log(delta) / Math.LN10), + maxDec = opts.tickDecimals; - if (opts.mode == "time") { - // pretty handling of time - - // map of app. size of time units in milliseconds - var timeUnitSize = { - "second": 1000, - "minute": 60 * 1000, - "hour": 60 * 60 * 1000, - "day": 24 * 60 * 60 * 1000, - "month": 30 * 24 * 60 * 60 * 1000, - "year": 365.2425 * 24 * 60 * 60 * 1000 - }; - - - // the allowed tick sizes, after 1 year we use - // an integer algorithm - var spec = [ - [1, "second"], [2, "second"], [5, "second"], [10, "second"], - [30, "second"], - [1, "minute"], [2, "minute"], [5, "minute"], [10, "minute"], - [30, "minute"], - [1, "hour"], [2, "hour"], [4, "hour"], - [8, "hour"], [12, "hour"], - [1, "day"], [2, "day"], [3, "day"], - [0.25, "month"], [0.5, "month"], [1, "month"], - [2, "month"], [3, "month"], [6, "month"], - [1, "year"] - ]; - - var minSize = 0; - if (opts.minTickSize != null) { - if (typeof opts.tickSize == "number") - minSize = opts.tickSize; - else - minSize = opts.minTickSize[0] * timeUnitSize[opts.minTickSize[1]]; - } - - for (var i = 0; i < spec.length - 1; ++i) - if (delta < (spec[i][0] * timeUnitSize[spec[i][1]] - + spec[i + 1][0] * timeUnitSize[spec[i + 1][1]]) / 2 - && spec[i][0] * timeUnitSize[spec[i][1]] >= minSize) - break; - size = spec[i][0]; - unit = spec[i][1]; - - // special-case the possibility of several years - if (unit == "year") { - magn = Math.pow(10, Math.floor(Math.log(delta / timeUnitSize.year) / Math.LN10)); - norm = (delta / timeUnitSize.year) / magn; - if (norm < 1.5) - size = 1; - else if (norm < 3) - size = 2; - else if (norm < 7.5) - size = 5; - else - size = 10; - - size *= magn; - } - - axis.tickSize = opts.tickSize || [size, unit]; - - generator = function(axis) { - var ticks = [], - tickSize = axis.tickSize[0], unit = axis.tickSize[1], - d = new Date(axis.min); - - var step = tickSize * timeUnitSize[unit]; - - if (unit == "second") - d.setUTCSeconds(floorInBase(d.getUTCSeconds(), tickSize)); - if (unit == "minute") - d.setUTCMinutes(floorInBase(d.getUTCMinutes(), tickSize)); - if (unit == "hour") - d.setUTCHours(floorInBase(d.getUTCHours(), tickSize)); - if (unit == "month") - d.setUTCMonth(floorInBase(d.getUTCMonth(), tickSize)); - if (unit == "year") - d.setUTCFullYear(floorInBase(d.getUTCFullYear(), tickSize)); - - // reset smaller components - d.setUTCMilliseconds(0); - if (step >= timeUnitSize.minute) - d.setUTCSeconds(0); - if (step >= timeUnitSize.hour) - d.setUTCMinutes(0); - if (step >= timeUnitSize.day) - d.setUTCHours(0); - if (step >= timeUnitSize.day * 4) - d.setUTCDate(1); - if (step >= timeUnitSize.year) - d.setUTCMonth(0); - - - var carry = 0, v = Number.NaN, prev; - do { - prev = v; - v = d.getTime(); - ticks.push(v); - if (unit == "month") { - if (tickSize < 1) { - // a bit complicated - we'll divide the month - // up but we need to take care of fractions - // so we don't end up in the middle of a day - d.setUTCDate(1); - var start = d.getTime(); - d.setUTCMonth(d.getUTCMonth() + 1); - var end = d.getTime(); - d.setTime(v + carry * timeUnitSize.hour + (end - start) * tickSize); - carry = d.getUTCHours(); - d.setUTCHours(0); - } - else - d.setUTCMonth(d.getUTCMonth() + tickSize); - } - else if (unit == "year") { - d.setUTCFullYear(d.getUTCFullYear() + tickSize); - } - else - d.setTime(v + step); - } while (v < axis.max && v != prev); - - return ticks; - }; - - formatter = function (v, axis) { - var d = new Date(v); - - // first check global format - if (opts.timeformat != null) - return $.plot.formatDate(d, opts.timeformat, opts.monthNames); - - var t = axis.tickSize[0] * timeUnitSize[axis.tickSize[1]]; - var span = axis.max - axis.min; - var suffix = (opts.twelveHourClock) ? " %p" : ""; - - if (t < timeUnitSize.minute) - fmt = "%h:%M:%S" + suffix; - else if (t < timeUnitSize.day) { - if (span < 2 * timeUnitSize.day) - fmt = "%h:%M" + suffix; - else - fmt = "%b %d %h:%M" + suffix; - } - else if (t < timeUnitSize.month) - fmt = "%b %d"; - else if (t < timeUnitSize.year) { - if (span < timeUnitSize.year) - fmt = "%b"; - else - fmt = "%b %y"; - } - else - fmt = "%y"; - - return $.plot.formatDate(d, fmt, opts.monthNames); - }; + if (maxDec != null && dec > maxDec) { + dec = maxDec; } - else { - // pretty rounding of base-10 numbers - var maxDec = opts.tickDecimals; - var dec = -Math.floor(Math.log(delta) / Math.LN10); - if (maxDec != null && dec > maxDec) - dec = maxDec; - magn = Math.pow(10, -dec); - norm = delta / magn; // norm is between 1.0 and 10.0 - - if (norm < 1.5) - size = 1; - else if (norm < 3) { - size = 2; - // special case for 2.5, requires an extra decimal - if (norm > 2.25 && (maxDec == null || dec + 1 <= maxDec)) { - size = 2.5; - ++dec; - } + var magn = Math.pow(10, -dec), + norm = delta / magn, // norm is between 1.0 and 10.0 + size; + + if (norm < 1.5) { + size = 1; + } else if (norm < 3) { + size = 2; + // special case for 2.5, requires an extra decimal + if (norm > 2.25 && (maxDec == null || dec + 1 <= maxDec)) { + size = 2.5; + ++dec; } - else if (norm < 7.5) - size = 5; - else - size = 10; + } else if (norm < 7.5) { + size = 5; + } else { + size = 10; + } - size *= magn; - - if (opts.minTickSize != null && size < opts.minTickSize) - size = opts.minTickSize; + size *= magn; - axis.tickDecimals = Math.max(0, maxDec != null ? maxDec : dec); - axis.tickSize = opts.tickSize || size; + if (opts.minTickSize != null && size < opts.minTickSize) { + size = opts.minTickSize; + } - generator = function (axis) { - var ticks = []; + axis.delta = delta; + axis.tickDecimals = Math.max(0, maxDec != null ? maxDec : dec); + axis.tickSize = opts.tickSize || size; + + // Time mode was moved to a plug-in in 0.8, but since so many people use this + // we'll add an especially friendly make sure they remembered to include it. + + if (opts.mode == "time" && !axis.tickGenerator) { + throw new Error("Time mode requires the flot.time plugin."); + } + + // Flot supports base-10 axes; any other mode else is handled by a plug-in, + // like flot.time.js. + + if (!axis.tickGenerator) { + + axis.tickGenerator = function (axis) { + + var ticks = [], + start = floorInBase(axis.min, axis.tickSize), + i = 0, + v = Number.NaN, + prev; - // spew out all possible ticks - var start = floorInBase(axis.min, axis.tickSize), - i = 0, v = Number.NaN, prev; do { prev = v; v = start + i * axis.tickSize; @@ -1318,24 +1684,42 @@ return ticks; }; - formatter = function (v, axis) { - return v.toFixed(axis.tickDecimals); + axis.tickFormatter = function (value, axis) { + + var factor = axis.tickDecimals ? Math.pow(10, axis.tickDecimals) : 1; + var formatted = "" + Math.round(value * factor) / factor; + + // If tickDecimals was specified, ensure that we have exactly that + // much precision; otherwise default to the value's own precision. + + if (axis.tickDecimals != null) { + var decimal = formatted.indexOf("."); + var precision = decimal == -1 ? 0 : formatted.length - decimal - 1; + if (precision < axis.tickDecimals) { + return (precision ? formatted : formatted + ".") + ("" + factor).substr(1, axis.tickDecimals - precision); + } + } + + return formatted; }; } + if ($.isFunction(opts.tickFormatter)) + axis.tickFormatter = function (v, axis) { return "" + opts.tickFormatter(v, axis); }; + if (opts.alignTicksWithAxis != null) { var otherAxis = (axis.direction == "x" ? xaxes : yaxes)[opts.alignTicksWithAxis - 1]; if (otherAxis && otherAxis.used && otherAxis != axis) { // consider snapping min/max to outermost nice ticks - var niceTicks = generator(axis); + var niceTicks = axis.tickGenerator(axis); if (niceTicks.length > 0) { if (opts.min == null) axis.min = Math.min(axis.min, niceTicks[0]); if (opts.max == null && niceTicks.length > 1) axis.max = Math.max(axis.max, niceTicks[niceTicks.length - 1]); } - - generator = function (axis) { + + axis.tickGenerator = function (axis) { // copy ticks, scaled to this axis var ticks = [], v, i; for (i = 0; i < otherAxis.ticks.length; ++i) { @@ -1345,12 +1729,12 @@ } return ticks; }; - + // we might need an extra decimal since forced // ticks don't necessarily fit naturally - if (axis.mode != "time" && opts.tickDecimals == null) { - var extraDec = Math.max(0, -Math.floor(Math.log(delta) / Math.LN10) + 1), - ts = generator(axis); + if (!axis.mode && opts.tickDecimals == null) { + var extraDec = Math.max(0, -Math.floor(Math.log(axis.delta) / Math.LN10) + 1), + ts = axis.tickGenerator(axis); // only proceed if the tick interval rounded // with an extra decimal doesn't give us a @@ -1360,14 +1744,8 @@ } } } - - axis.tickGenerator = generator; - if ($.isFunction(opts.tickFormatter)) - axis.tickFormatter = function (v, axis) { return "" + opts.tickFormatter(v, axis); }; - else - axis.tickFormatter = formatter; } - + function setTicks(axis) { var oticks = axis.options.ticks, ticks = []; if (oticks == null || (typeof oticks == "number" && oticks > 0)) @@ -1375,7 +1753,7 @@ else if (oticks) { if ($.isFunction(oticks)) // generate the ticks - ticks = oticks({ min: axis.min, max: axis.max }); + ticks = oticks(axis); else ticks = oticks; } @@ -1409,18 +1787,22 @@ axis.max = Math.max(axis.max, ticks[ticks.length - 1].v); } } - + function draw() { - ctx.clearRect(0, 0, canvasWidth, canvasHeight); + + surface.clear(); + + executeHooks(hooks.drawBackground, [ctx]); var grid = options.grid; // draw background, if any if (grid.show && grid.backgroundColor) drawBackground(); - - if (grid.show && !grid.aboveData) + + if (grid.show && !grid.aboveData) { drawGrid(); + } for (var i = 0; i < series.length; ++i) { executeHooks(hooks.drawSeries, [ctx, series[i]]); @@ -1428,15 +1810,23 @@ } executeHooks(hooks.draw, [ctx]); - - if (grid.show && grid.aboveData) + + if (grid.show && grid.aboveData) { drawGrid(); + } + + surface.render(); + + // A draw implies that either the axes or data have changed, so we + // should probably update the overlay highlights as well. + + triggerRedrawOverlay(); } function extractRange(ranges, coord) { var axis, from, to, key, axes = allAxes(); - for (i = 0; i < axes.length; ++i) { + for (var i = 0; i < axes.length; ++i) { axis = axes[i]; if (axis.direction == coord) { key = coord + axis.n + "axis"; @@ -1463,10 +1853,10 @@ from = to; to = tmp; } - + return { from: from, to: to, axis: axis }; } - + function drawBackground() { ctx.save(); ctx.translate(plotOffset.left, plotOffset.top); @@ -1477,8 +1867,8 @@ } function drawGrid() { - var i; - + var i, axes, bw, bc; + ctx.save(); ctx.translate(plotOffset.left, plotOffset.top); @@ -1486,14 +1876,14 @@ var markings = options.grid.markings; if (markings) { if ($.isFunction(markings)) { - var axes = plot.getAxes(); + axes = plot.getAxes(); // xmin etc. is backwards compatibility, to be // removed in the future axes.xmin = axes.xaxis.min; axes.xmax = axes.xaxis.max; axes.ymin = axes.yaxis.min; axes.ymax = axes.yaxis.max; - + markings = markings(axes); } @@ -1530,7 +1920,7 @@ xrange.to = xrange.axis.p2c(xrange.to); yrange.from = yrange.axis.p2c(yrange.from); yrange.to = yrange.axis.p2c(yrange.to); - + if (xrange.from == xrange.to || yrange.from == yrange.to) { // draw line ctx.beginPath(); @@ -1549,17 +1939,17 @@ } } } - + // draw the ticks - var axes = allAxes(), bw = options.grid.borderWidth; + axes = allAxes(); + bw = options.grid.borderWidth; for (var j = 0; j < axes.length; ++j) { var axis = axes[j], box = axis.box, t = axis.tickLength, x, y, xoff, yoff; if (!axis.show || axis.ticks.length == 0) - continue - - ctx.strokeStyle = axis.options.tickColor || $.color.parse(axis.options.color).scale('a', 0.22).toString(); + continue; + ctx.lineWidth = 1; // find the edges @@ -1577,19 +1967,23 @@ else x = box.left - plotOffset.left + (axis.position == "left" ? box.width : 0); } - + // draw tick bar if (!axis.innermost) { + ctx.strokeStyle = axis.options.color; ctx.beginPath(); xoff = yoff = 0; if (axis.direction == "x") - xoff = plotWidth; + xoff = plotWidth + 1; else - yoff = plotHeight; - + yoff = plotHeight + 1; + if (ctx.lineWidth == 1) { - x = Math.floor(x) + 0.5; - y = Math.floor(y) + 0.5; + if (axis.direction == "x") { + y = Math.floor(y) + 0.5; + } else { + x = Math.floor(x) + 0.5; + } } ctx.moveTo(x, y); @@ -1598,29 +1992,33 @@ } // draw ticks + + ctx.strokeStyle = axis.options.tickColor; + ctx.beginPath(); for (i = 0; i < axis.ticks.length; ++i) { var v = axis.ticks[i].v; - + xoff = yoff = 0; - if (v < axis.min || v > axis.max + if (isNaN(v) || v < axis.min || v > axis.max // skip those lying on the axes if we got a border - || (t == "full" && bw > 0 + || (t == "full" + && ((typeof bw == "object" && bw[axis.position] > 0) || bw > 0) && (v == axis.min || v == axis.max))) continue; if (axis.direction == "x") { x = axis.p2c(v); yoff = t == "full" ? -plotHeight : t; - + if (axis.position == "top") yoff = -yoff; } else { y = axis.p2c(v); xoff = t == "full" ? -plotWidth : t; - + if (axis.position == "left") xoff = -xoff; } @@ -1635,74 +2033,113 @@ ctx.moveTo(x, y); ctx.lineTo(x + xoff, y + yoff); } - + ctx.stroke(); } - - + + // draw border if (bw) { - ctx.lineWidth = bw; - ctx.strokeStyle = options.grid.borderColor; - ctx.strokeRect(-bw/2, -bw/2, plotWidth + bw, plotHeight + bw); + // If either borderWidth or borderColor is an object, then draw the border + // line by line instead of as one rectangle + bc = options.grid.borderColor; + if(typeof bw == "object" || typeof bc == "object") { + if (typeof bw !== "object") { + bw = {top: bw, right: bw, bottom: bw, left: bw}; + } + if (typeof bc !== "object") { + bc = {top: bc, right: bc, bottom: bc, left: bc}; + } + + if (bw.top > 0) { + ctx.strokeStyle = bc.top; + ctx.lineWidth = bw.top; + ctx.beginPath(); + ctx.moveTo(0 - bw.left, 0 - bw.top/2); + ctx.lineTo(plotWidth, 0 - bw.top/2); + ctx.stroke(); + } + + if (bw.right > 0) { + ctx.strokeStyle = bc.right; + ctx.lineWidth = bw.right; + ctx.beginPath(); + ctx.moveTo(plotWidth + bw.right / 2, 0 - bw.top); + ctx.lineTo(plotWidth + bw.right / 2, plotHeight); + ctx.stroke(); + } + + if (bw.bottom > 0) { + ctx.strokeStyle = bc.bottom; + ctx.lineWidth = bw.bottom; + ctx.beginPath(); + ctx.moveTo(plotWidth + bw.right, plotHeight + bw.bottom / 2); + ctx.lineTo(0, plotHeight + bw.bottom / 2); + ctx.stroke(); + } + + if (bw.left > 0) { + ctx.strokeStyle = bc.left; + ctx.lineWidth = bw.left; + ctx.beginPath(); + ctx.moveTo(0 - bw.left/2, plotHeight + bw.bottom); + ctx.lineTo(0- bw.left/2, 0); + ctx.stroke(); + } + } + else { + ctx.lineWidth = bw; + ctx.strokeStyle = options.grid.borderColor; + ctx.strokeRect(-bw/2, -bw/2, plotWidth + bw, plotHeight + bw); + } } ctx.restore(); } - function insertAxisLabels() { - placeholder.find(".tickLabels").remove(); - - var html = ['
']; + function drawAxisLabels() { + + $.each(allAxes(), function (_, axis) { + if (!axis.show || axis.ticks.length == 0) + return; + + var box = axis.box, + legacyStyles = axis.direction + "Axis " + axis.direction + axis.n + "Axis", + layer = "flot-" + axis.direction + "-axis flot-" + axis.direction + axis.n + "-axis " + legacyStyles, + font = axis.options.font || "flot-tick-label tickLabel", + tick, x, y, halign, valign; + + surface.removeText(layer); - var axes = allAxes(); - for (var j = 0; j < axes.length; ++j) { - var axis = axes[j], box = axis.box; - if (!axis.show) - continue; - //debug: html.push('
') - html.push('
'); for (var i = 0; i < axis.ticks.length; ++i) { - var tick = axis.ticks[i]; + + tick = axis.ticks[i]; if (!tick.label || tick.v < axis.min || tick.v > axis.max) continue; - var pos = {}, align; - if (axis.direction == "x") { - align = "center"; - pos.left = Math.round(plotOffset.left + axis.p2c(tick.v) - axis.labelWidth/2); - if (axis.position == "bottom") - pos.top = box.top + box.padding; - else - pos.bottom = canvasHeight - (box.top + box.height - box.padding); - } - else { - pos.top = Math.round(plotOffset.top + axis.p2c(tick.v) - axis.labelHeight/2); + halign = "center"; + x = plotOffset.left + axis.p2c(tick.v); + if (axis.position == "bottom") { + y = box.top + box.padding; + } else { + y = box.top + box.height - box.padding; + valign = "bottom"; + } + } else { + valign = "middle"; + y = plotOffset.top + axis.p2c(tick.v); if (axis.position == "left") { - pos.right = canvasWidth - (box.left + box.width - box.padding) - align = "right"; - } - else { - pos.left = box.left + box.padding; - align = "left"; + x = box.left + box.width - box.padding; + halign = "right"; + } else { + x = box.left + box.padding; } } - pos.width = axis.labelWidth; - - var style = ["position:absolute", "text-align:" + align ]; - for (var a in pos) - style.push(a + ":" + pos[a] + "px") - - html.push('
' + tick.label + '
'); + surface.addText(layer, x, y, tick.label, font, null, null, halign, valign); } - html.push('
'); - } - - html.push('
'); - - placeholder.append(html.join("")); + }); } function drawSeries(series) { @@ -1713,18 +2150,18 @@ if (series.points.show) drawSeriesPoints(series); } - + function drawSeriesLines(series) { function plotLine(datapoints, xoffset, yoffset, axisx, axisy) { var points = datapoints.points, ps = datapoints.pointsize, prevx = null, prevy = null; - + ctx.beginPath(); for (var i = ps; i < points.length; i += ps) { var x1 = points[i - ps], y1 = points[i - ps + 1], x2 = points[i], y2 = points[i + 1]; - + if (x1 == null || x2 == null) continue; @@ -1787,7 +2224,7 @@ if (x1 != prevx || y1 != prevy) ctx.moveTo(axisx.p2c(x1) + xoffset, axisy.p2c(y1) + yoffset); - + prevx = x2; prevy = y2; ctx.lineTo(axisx.p2c(x2) + xoffset, axisy.p2c(y2) + yoffset); @@ -1839,7 +2276,7 @@ continue; // clip x values - + // clip with xmin if (x1 <= x2 && x1 < axisx.min) { if (x2 < axisx.min) @@ -1874,7 +2311,7 @@ ctx.moveTo(axisx.p2c(x1), axisy.p2c(bottom)); areaOpen = true; } - + // now first check the case where both is outside if (y1 >= axisy.max && y2 >= axisy.max) { ctx.lineTo(axisx.p2c(x1), axisy.p2c(axisy.max)); @@ -1886,7 +2323,7 @@ ctx.lineTo(axisx.p2c(x2), axisy.p2c(axisy.min)); continue; } - + // else it's a bit more complicated, there might // be a flat maxed out rectangle first, then a // triangular cutout or reverse; to find these @@ -1895,7 +2332,7 @@ // clip the y values, without shortcutting, we // go through all cases in turn - + // clip with ymin if (y1 <= y2 && y1 < axisy.min && y2 >= axisy.min) { x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1; @@ -1922,7 +2359,7 @@ ctx.lineTo(axisx.p2c(x1old), axisy.p2c(y1)); // it goes to (x1, y1), but we fill that below } - + // fill triangular section, this sometimes result // in redundant points if (x1, y1) hasn't changed // from previous line to, but we just ignore that @@ -1976,7 +2413,7 @@ var x = points[i], y = points[i + 1]; if (x == null || x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max) continue; - + ctx.beginPath(); x = axisx.p2c(x); y = axisy.p2c(y) + offset; @@ -1985,7 +2422,7 @@ else symbol(ctx, x, y, radius, shadow); ctx.closePath(); - + if (fillStyle) { ctx.fillStyle = fillStyle; ctx.fill(); @@ -1993,7 +2430,7 @@ ctx.stroke(); } } - + ctx.save(); ctx.translate(plotOffset.left, plotOffset.top); @@ -2001,6 +2438,15 @@ sw = series.shadowSize, radius = series.points.radius, symbol = series.points.symbol; + + // If the user sets the line width to 0, we change it to a very + // small value. A line width of 0 seems to force the default of 1. + // Doing the conditional here allows the shadow setting to still be + // optional even with a lineWidth of 0. + + if( lw == 0 ) + lw = 0.0001; + if (lw > 0 && sw > 0) { // draw shadow in two steps var w = sw / 2; @@ -2064,12 +2510,12 @@ drawTop = false; } } - + // clip if (right < axisx.min || left > axisx.max || top < axisy.min || bottom > axisy.max) return; - + if (left < axisx.min) { left = axisx.min; drawLeft = false; @@ -2084,7 +2530,7 @@ bottom = axisy.min; drawBottom = false; } - + if (top > axisy.max) { top = axisy.max; drawTop = false; @@ -2094,7 +2540,7 @@ bottom = axisy.p2c(bottom); right = axisx.p2c(right); top = axisy.p2c(top); - + // fill the bar if (fillStyleCallback) { c.beginPath(); @@ -2131,11 +2577,11 @@ c.stroke(); } } - + function drawSeriesBars(series) { function plotBars(datapoints, barLeft, barRight, offset, fillStyleCallback, axisx, axisy) { var points = datapoints.points, ps = datapoints.pointsize; - + for (var i = 0; i < points.length; i += ps) { if (points[i] == null) continue; @@ -2149,7 +2595,23 @@ // FIXME: figure out a way to add shadows (for instance along the right edge) ctx.lineWidth = series.bars.lineWidth; ctx.strokeStyle = series.color; - var barLeft = series.bars.align == "left" ? 0 : -series.bars.barWidth/2; + + var barLeft; + + switch (series.bars.align) { + case "left": + barLeft = 0; + break; + case "right": + barLeft = -series.bars.barWidth; + break; + case "center": + barLeft = -series.bars.barWidth / 2; + break; + default: + throw new Error("Invalid bar alignment: " + series.bars.align); + } + var fillStyleCallback = series.bars.fill ? function (bottom, top) { return getFillStyle(series.bars, series.color, bottom, top); } : null; plotBars(series.datapoints, barLeft, barLeft + series.bars.barWidth, 0, fillStyleCallback, series.xaxis, series.yaxis); ctx.restore(); @@ -2162,27 +2624,61 @@ if (filloptions.fillColor) return getColorOrGradient(filloptions.fillColor, bottom, top, seriesColor); - + var c = $.color.parse(seriesColor); c.a = typeof fill == "number" ? fill : 0.4; c.normalize(); return c.toString(); } - + function insertLegend() { + placeholder.find(".legend").remove(); if (!options.legend.show) return; - - var fragments = [], rowStarted = false, + + var fragments = [], entries = [], rowStarted = false, lf = options.legend.labelFormatter, s, label; + + // Build a list of legend entries, with each having a label and a color + for (var i = 0; i < series.length; ++i) { s = series[i]; - label = s.label; - if (!label) - continue; - + if (s.label) { + label = lf ? lf(s.label, s) : s.label; + if (label) { + entries.push({ + label: label, + color: s.color + }); + } + } + } + + // Sort the legend using either the default or a custom comparator + + if (options.legend.sorted) { + if ($.isFunction(options.legend.sorted)) { + entries.sort(options.legend.sorted); + } else if (options.legend.sorted == "reverse") { + entries.reverse(); + } else { + var ascending = options.legend.sorted != "descending"; + entries.sort(function(a, b) { + return a.label == b.label ? 0 : ( + (a.label < b.label) != ascending ? 1 : -1 // Logical XOR + ); + }); + } + } + + // Generate markup for the list of entries, in their final order + + for (var i = 0; i < entries.length; ++i) { + + var entry = entries[i]; + if (i % options.legend.noColumns == 0) { if (rowStarted) fragments.push('
' + label + '
' + entry.label + '
'+aJ+"
'+aH.join("")+"
";if(O.legend.container!=null){c(O.legend.container).html(aL)}else{var aI="",aC=O.legend.position,aD=O.legend.margin;if(aD[0]==null){aD=[aD,aD]}if(aC.charAt(0)=="n"){aI+="top:"+(aD[1]+q.top)+"px;"}else{if(aC.charAt(0)=="s"){aI+="bottom:"+(aD[1]+q.bottom)+"px;"}}if(aC.charAt(1)=="e"){aI+="right:"+(aD[0]+q.right)+"px;"}else{if(aC.charAt(1)=="w"){aI+="left:"+(aD[0]+q.left)+"px;"}}var aK=c('
'+aL.replace('style="','style="position:absolute;'+aI+";")+"
").appendTo(av);if(O.legend.backgroundOpacity!=0){var aG=O.legend.backgroundColor;if(aG==null){aG=O.grid.backgroundColor;if(aG&&typeof aG=="string"){aG=c.color.parse(aG)}else{aG=c.color.extract(aK,"background-color")}aG.a=1;aG=aG.toString()}var aB=aK.children();c('
').prependTo(aK).css("opacity",O.legend.backgroundOpacity)}}}var ab=[],M=null;function K(aI,aG,aD){var aO=O.grid.mouseActiveRadius,a0=aO*aO+1,aY=null,aR=false,aW,aU;for(aW=Q.length-1;aW>=0;--aW){if(!aD(Q[aW])){continue}var aP=Q[aW],aH=aP.xaxis,aF=aP.yaxis,aV=aP.datapoints.points,aT=aP.datapoints.pointsize,aQ=aH.c2p(aI),aN=aF.c2p(aG),aC=aO/aH.scale,aB=aO/aF.scale;if(aH.options.inverseTransform){aC=Number.MAX_VALUE}if(aF.options.inverseTransform){aB=Number.MAX_VALUE}if(aP.lines.show||aP.points.show){for(aU=0;aUaC||aK-aQ<-aC||aJ-aN>aB||aJ-aN<-aB){continue}var aM=Math.abs(aH.p2c(aK)-aI),aL=Math.abs(aF.p2c(aJ)-aG),aS=aM*aM+aL*aL;if(aS=Math.min(aZ,aK)&&aN>=aJ+aE&&aN<=aJ+aX):(aQ>=aK+aE&&aQ<=aK+aX&&aN>=Math.min(aZ,aJ)&&aN<=Math.max(aZ,aJ))){aY=[aW,aU/aT]}}}}if(aY){aW=aY[0];aU=aY[1];aT=Q[aW].datapoints.pointsize;return{datapoint:Q[aW].datapoints.points.slice(aU*aT,(aU+1)*aT),dataIndex:aU,series:Q[aW],seriesIndex:aW}}return null}function aa(aB){if(O.grid.hoverable){u("plothover",aB,function(aC){return aC.hoverable!=false})}}function l(aB){if(O.grid.hoverable){u("plothover",aB,function(aC){return false})}}function R(aB){u("plotclick",aB,function(aC){return aC.clickable!=false})}function u(aC,aB,aD){var aE=y.offset(),aH=aB.pageX-aE.left-q.left,aF=aB.pageY-aE.top-q.top,aJ=C({left:aH,top:aF});aJ.pageX=aB.pageX;aJ.pageY=aB.pageY;var aK=K(aH,aF,aD);if(aK){aK.pageX=parseInt(aK.series.xaxis.p2c(aK.datapoint[0])+aE.left+q.left);aK.pageY=parseInt(aK.series.yaxis.p2c(aK.datapoint[1])+aE.top+q.top)}if(O.grid.autoHighlight){for(var aG=0;aGaH.max||aIaG.max){return}var aF=aE.points.radius+aE.points.lineWidth/2;A.lineWidth=aF;A.strokeStyle=c.color.parse(aE.color).scale("a",0.5).toString();var aB=1.5*aF,aC=aH.p2c(aC),aI=aG.p2c(aI);A.beginPath();if(aE.points.symbol=="circle"){A.arc(aC,aI,aB,0,2*Math.PI,false)}else{aE.points.symbol(A,aC,aI,aB,false)}A.closePath();A.stroke()}function v(aE,aB){A.lineWidth=aE.bars.lineWidth;A.strokeStyle=c.color.parse(aE.color).scale("a",0.5).toString();var aD=c.color.parse(aE.color).scale("a",0.5).toString();var aC=aE.bars.align=="left"?0:-aE.bars.barWidth/2;E(aB[0],aB[1],aB[2]||0,aC,aC+aE.bars.barWidth,0,function(){return aD},aE.xaxis,aE.yaxis,A,aE.bars.horizontal,aE.bars.lineWidth)}function am(aJ,aB,aH,aC){if(typeof aJ=="string"){return aJ}else{var aI=H.createLinearGradient(0,aH,0,aB);for(var aE=0,aD=aJ.colors.length;aE12){n=n-12}else{if(n==0){n=12}}}for(var g=0;g=1?"rgb("+[s.r,s.g,s.b].join(",")+")":"rgba("+[s.r,s.g,s.b,s.a].join(",")+")"},s.normalize=function(){function e(e,t,n){return tn?n:t}return s.r=e(0,parseInt(s.r),255),s.g=e(0,parseInt(s.g),255),s.b=e(0,parseInt(s.b),255),s.a=e(0,s.a,1),s},s.clone=function(){return e.color.make(s.r,s.b,s.g,s.a)},s.normalize()},e.color.extract=function(t,n){var r;do{r=t.css(n).toLowerCase();if(r!=""&&r!="transparent")break;t=t.parent()}while(!e.nodeName(t.get(0),"body"));return r=="rgba(0, 0, 0, 0)"&&(r="transparent"),e.color.parse(r)},e.color.parse=function(n){var r,i=e.color.make;if(r=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(n))return i(parseInt(r[1],10),parseInt(r[2],10),parseInt(r[3],10));if(r=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(n))return i(parseInt(r[1],10),parseInt(r[2],10),parseInt(r[3],10),parseFloat(r[4]));if(r=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(n))return i(parseFloat(r[1])*2.55,parseFloat(r[2])*2.55,parseFloat(r[3])*2.55);if(r=/rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(n))return i(parseFloat(r[1])*2.55,parseFloat(r[2])*2.55,parseFloat(r[3])*2.55,parseFloat(r[4]));if(r=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(n))return i(parseInt(r[1],16),parseInt(r[2],16),parseInt(r[3],16));if(r=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(n))return i(parseInt(r[1]+r[1],16),parseInt(r[2]+r[2],16),parseInt(r[3]+r[3],16));var s=e.trim(n).toLowerCase();return s=="transparent"?i(255,255,255,0):(r=t[s]||[0,0,0],i(r[0],r[1],r[2]))};var t={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]}})(jQuery),function(e){function n(t,n){var r=n.children("."+t)[0];if(r==null){r=document.createElement("canvas"),r.className=t,e(r).css({direction:"ltr",position:"absolute",left:0,top:0}).appendTo(n);if(!r.getContext){if(!window.G_vmlCanvasManager)throw new Error("Canvas is not available. If you're using IE with a fall-back such as Excanvas, then there's either a mistake in your conditional include, or the page has no DOCTYPE and is rendering in Quirks Mode.");r=window.G_vmlCanvasManager.initElement(r)}}this.element=r;var i=this.context=r.getContext("2d"),s=window.devicePixelRatio||1,o=i.webkitBackingStorePixelRatio||i.mozBackingStorePixelRatio||i.msBackingStorePixelRatio||i.oBackingStorePixelRatio||i.backingStorePixelRatio||1;this.pixelRatio=s/o,this.resize(n.width(),n.height()),this.textContainer=null,this.text={},this._textCache={}}function r(t,r,s,o){function E(e,t){t=[w].concat(t);for(var n=0;nn&&(n=i))}t<=n&&(t=n+1);var s,o=[],f=a.colors,l=f.length,c=0;for(r=0;r=0?c<.5?c=-c-.2:c=0:c=-c),o[r]=s.scale("rgb",1+c);var h=0,p;for(r=0;re.datamax&&n!=r&&(e.datamax=n)}var t=Number.POSITIVE_INFINITY,n=Number.NEGATIVE_INFINITY,r=Number.MAX_VALUE,i,s,o,a,f,l,c,h,p,d,v,m,g,y,w,S;e.each(k(),function(e,r){r.datamin=t,r.datamax=n,r.used=!1});for(i=0;i0&&c[o-h]!=null&&c[o-h]!=c[o]&&c[o-h+1]!=c[o+1]){for(a=0;aO&&(O=m)),g.y&&(mM&&(M=m))}}if(l.bars.show){var _;switch(l.bars.align){case"left":_=0;break;case"right":_=-l.bars.barWidth;break;case"center":_=-l.bars.barWidth/2;break;default:throw new Error("Invalid bar alignment: "+l.bars.align)}l.bars.horizontal?(A+=_,M+=_+l.bars.barWidth):(L+=_,O+=_+l.bars.barWidth)}x(l.xaxis,L,O),x(l.yaxis,A,M)}e.each(k(),function(e,r){r.datamin==t&&(r.datamin=null),r.datamax==n&&(r.datamax=null)})}function D(){t.css("padding",0).children(":not(.flot-base,.flot-overlay)").remove(),t.css("position")=="static"&&t.css("position","relative"),f=new n("flot-base",t),l=new n("flot-overlay",t),h=f.context,p=l.context,c=e(l.element).unbind();var r=t.data("plot");r&&(r.shutdown(),l.clear()),t.data("plot",w)}function P(){a.grid.hoverable&&(c.mousemove(at),c.bind("mouseleave",ft)),a.grid.clickable&&c.click(lt),E(b.bindEvents,[c])}function H(){ot&&clearTimeout(ot),c.unbind("mousemove",at),c.unbind("mouseleave",ft),c.unbind("click",lt),E(b.shutdown,[c])}function B(e){function t(e){return e}var n,r,i=e.options.transform||t,s=e.options.inverseTransform;e.direction=="x"?(n=e.scale=g/Math.abs(i(e.max)-i(e.min)),r=Math.min(i(e.max),i(e.min))):(n=e.scale=y/Math.abs(i(e.max)-i(e.min)),n=-n,r=Math.max(i(e.max),i(e.min))),i==t?e.p2c=function(e){return(e-r)*n}:e.p2c=function(e){return(i(e)-r)*n},s?e.c2p=function(e){return s(r+e/n)}:e.c2p=function(e){return r+e/n}}function j(e){var t=e.options,n=e.ticks||[],r=t.labelWidth||0,i=t.labelHeight||0,s=r||e.direction=="x"?Math.floor(f.width/(n.length||1)):null;legacyStyles=e.direction+"Axis "+e.direction+e.n+"Axis",layer="flot-"+e.direction+"-axis flot-"+e.direction+e.n+"-axis "+legacyStyles,font=t.font||"flot-tick-label tickLabel";for(var o=0;o=0;--t)F(o[t]);q(),e.each(o,function(e,t){I(t)})}g=f.width-m.left-m.right,y=f.height-m.bottom-m.top,e.each(n,function(e,t){B(t)}),r&&G(),it()}function U(e){var t=e.options,n=+(t.min!=null?t.min:e.datamin),r=+(t.max!=null?t.max:e.datamax),i=r-n;if(i==0){var s=r==0?1:.01;t.min==null&&(n-=s);if(t.max==null||t.min!=null)r+=s}else{var o=t.autoscaleMargin;o!=null&&(t.min==null&&(n-=i*o,n<0&&e.datamin!=null&&e.datamin>=0&&(n=0)),t.max==null&&(r+=i*o,r>0&&e.datamax!=null&&e.datamax<=0&&(r=0)))}e.min=n,e.max=r}function z(t){var n=t.options,r;typeof n.ticks=="number"&&n.ticks>0?r=n.ticks:r=.3*Math.sqrt(t.direction=="x"?f.width:f.height);var s=(t.max-t.min)/r,o=-Math.floor(Math.log(s)/Math.LN10),u=n.tickDecimals;u!=null&&o>u&&(o=u);var a=Math.pow(10,-o),l=s/a,c;l<1.5?c=1:l<3?(c=2,l>2.25&&(u==null||o+1<=u)&&(c=2.5,++o)):l<7.5?c=5:c=10,c*=a,n.minTickSize!=null&&c0&&(n.min==null&&(t.min=Math.min(t.min,p[0])),n.max==null&&p.length>1&&(t.max=Math.max(t.max,p[p.length-1]))),t.tickGenerator=function(e){var t=[],n,r;for(r=0;r1&&/\..*0$/.test((g[1]-g[0]).toFixed(m))||(t.tickDecimals=m)}}}}function W(t){var n=t.options.ticks,r=[];n==null||typeof n=="number"&&n>0?r=t.tickGenerator(t):n&&(e.isFunction(n)?r=n(t):r=n);var i,s;t.ticks=[];for(i=0;i1&&(o=u[1])):s=+u,o==null&&(o=t.tickFormatter(s,t)),isNaN(s)||t.ticks.push({v:s,label:o})}}function X(e,t){e.options.autoscaleMargin&&t.length>0&&(e.options.min==null&&(e.min=Math.min(e.min,t[0].v)),e.options.max==null&&t.length>1&&(e.max=Math.max(e.max,t[t.length-1].v)))}function V(){f.clear(),E(b.drawBackground,[h]);var e=a.grid;e.show&&e.backgroundColor&&K(),e.show&&!e.aboveData&&Q();for(var t=0;ti){var a=r;r=i,i=a}return{from:r,to:i,axis:n}}function K(){h.save(),h.translate(m.left,m.top),h.fillStyle=bt(a.grid.backgroundColor,y,0,"rgba(255, 255, 255, 0)"),h.fillRect(0,0,g,y),h.restore()}function Q(){var t,n,r,i;h.save(),h.translate(m.left,m.top);var s=a.grid.markings;if(s){e.isFunction(s)&&(n=w.getAxes(),n.xmin=n.xaxis.min,n.xmax=n.xaxis.max,n.ymin=n.yaxis.min,n.ymax=n.yaxis.max,s=s(n));for(t=0;tu.axis.max||f.tof.axis.max)continue;u.from=Math.max(u.from,u.axis.min),u.to=Math.min(u.to,u.axis.max),f.from=Math.max(f.from,f.axis.min),f.to=Math.min(f.to,f.axis.max);if(u.from==u.to&&f.from==f.to)continue;u.from=u.axis.p2c(u.from),u.to=u.axis.p2c(u.to),f.from=f.axis.p2c(f.from),f.to=f.axis.p2c(f.to),u.from==u.to||f.from==f.to?(h.beginPath(),h.strokeStyle=o.color||a.grid.markingsColor,h.lineWidth=o.lineWidth||a.grid.markingsLineWidth,h.moveTo(u.from,f.from),h.lineTo(u.to,f.to),h.stroke()):(h.fillStyle=o.color||a.grid.markingsColor,h.fillRect(u.from,f.to,u.to-u.from,f.from-f.to))}}n=k(),r=a.grid.borderWidth;for(var l=0;lc.max||d=="full"&&(typeof r=="object"&&r[c.position]>0||r>0)&&(x==c.min||x==c.max))continue;c.direction=="x"?(v=c.p2c(x),S=d=="full"?-y:d,c.position=="top"&&(S=-S)):(b=c.p2c(x),E=d=="full"?-g:d,c.position=="left"&&(E=-E)),h.lineWidth==1&&(c.direction=="x"?v=Math.floor(v)+.5:b=Math.floor(b)+.5),h.moveTo(v,b),h.lineTo(v+E,b+S)}h.stroke()}r&&(i=a.grid.borderColor,typeof r=="object"||typeof i=="object"?(typeof r!="object"&&(r={top:r,right:r,bottom:r,left:r}),typeof i!="object"&&(i={top:i,right:i,bottom:i,left:i}),r.top>0&&(h.strokeStyle=i.top,h.lineWidth=r.top,h.beginPath(),h.moveTo(0-r.left,0-r.top/2),h.lineTo(g,0-r.top/2),h.stroke()),r.right>0&&(h.strokeStyle=i.right,h.lineWidth=r.right,h.beginPath(),h.moveTo(g+r.right/2,0-r.top),h.lineTo(g+r.right/2,y),h.stroke()),r.bottom>0&&(h.strokeStyle=i.bottom,h.lineWidth=r.bottom,h.beginPath(),h.moveTo(g+r.right,y+r.bottom/2),h.lineTo(0,y+r.bottom/2),h.stroke()),r.left>0&&(h.strokeStyle=i.left,h.lineWidth=r.left,h.beginPath(),h.moveTo(0-r.left/2,y+r.bottom),h.lineTo(0-r.left/2,0),h.stroke())):(h.lineWidth=r,h.strokeStyle=a.grid.borderColor,h.strokeRect(-r/2,-r/2,g+r,y+r))),h.restore()}function G(){e.each(k(),function(e,t){if(!t.show||t.ticks.length==0)return;var n=t.box,r=t.direction+"Axis "+t.direction+t.n+"Axis",i="flot-"+t.direction+"-axis flot-"+t.direction+t.n+"-axis "+r,s=t.options.font||"flot-tick-label tickLabel",o,u,a,l,c;f.removeText(i);for(var h=0;ht.max)continue;t.direction=="x"?(l="center",u=m.left+t.p2c(o.v),t.position=="bottom"?a=n.top+n.padding:(a=n.top+n.height-n.padding,c="bottom")):(c="middle",a=m.top+t.p2c(o.v),t.position=="left"?(u=n.left+n.width-n.padding,l="right"):u=n.left+n.padding),f.addText(i,u,a,o.label,s,null,null,l,c)}})}function Y(e){e.lines.show&&Z(e),e.bars.show&&nt(e),e.points.show&&et(e)}function Z(e){function t(e,t,n,r,i){var s=e.points,o=e.pointsize,u=null,a=null;h.beginPath();for(var f=o;f=d&&c>i.max){if(d>i.max)continue;l=(i.max-c)/(d-c)*(p-l)+l,c=i.max}else if(d>=c&&d>i.max){if(c>i.max)continue;p=(i.max-c)/(d-c)*(p-l)+l,d=i.max}if(l<=p&&l=p&&l>r.max){if(p>r.max)continue;c=(r.max-l)/(p-l)*(d-c)+c,l=r.max}else if(p>=l&&p>r.max){if(l>r.max)continue;d=(r.max-l)/(p-l)*(d-c)+c,p=r.max}(l!=u||c!=a)&&h.moveTo(r.p2c(l)+t,i.p2c(c)+n),u=p,a=d,h.lineTo(r.p2c(p)+t,i.p2c(d)+n)}h.stroke()}function n(e,t,n){var r=e.points,i=e.pointsize,s=Math.min(Math.max(0,n.min),n.max),o=0,u,a=!1,f=1,l=0,c=0;for(;;){if(i>0&&o>r.length+i)break;o+=i;var p=r[o-i],d=r[o-i+f],v=r[o],m=r[o+f];if(a){if(i>0&&p!=null&&v==null){c=o,i=-i,f=2;continue}if(i<0&&o==l+i){h.fill(),a=!1,i=-i,f=1,o=l=c+i;continue}}if(p==null||v==null)continue;if(p<=v&&p=v&&p>t.max){if(v>t.max)continue;d=(t.max-p)/(v-p)*(m-d)+d,p=t.max}else if(v>=p&&v>t.max){if(p>t.max)continue;m=(t.max-p)/(v-p)*(m-d)+d,v=t.max}a||(h.beginPath(),h.moveTo(t.p2c(p),n.p2c(s)),a=!0);if(d>=n.max&&m>=n.max){h.lineTo(t.p2c(p),n.p2c(n.max)),h.lineTo(t.p2c(v),n.p2c(n.max));continue}if(d<=n.min&&m<=n.min){h.lineTo(t.p2c(p),n.p2c(n.min)),h.lineTo(t.p2c(v),n.p2c(n.min));continue}var g=p,y=v;d<=m&&d=n.min?(p=(n.min-d)/(m-d)*(v-p)+p,d=n.min):m<=d&&m=n.min&&(v=(n.min-d)/(m-d)*(v-p)+p,m=n.min),d>=m&&d>n.max&&m<=n.max?(p=(n.max-d)/(m-d)*(v-p)+p,d=n.max):m>=d&&m>n.max&&d<=n.max&&(v=(n.max-d)/(m-d)*(v-p)+p,m=n.max),p!=g&&h.lineTo(t.p2c(g),n.p2c(d)),h.lineTo(t.p2c(p),n.p2c(d)),h.lineTo(t.p2c(v),n.p2c(m)),v!=y&&(h.lineTo(t.p2c(v),n.p2c(m)),h.lineTo(t.p2c(y),n.p2c(m)))}}h.save(),h.translate(m.left,m.top),h.lineJoin="round";var r=e.lines.lineWidth,i=e.shadowSize;if(r>0&&i>0){h.lineWidth=i,h.strokeStyle="rgba(0,0,0,0.1)";var s=Math.PI/18;t(e.datapoints,Math.sin(s)*(r/2+i/2),Math.cos(s)*(r/2+i/2),e.xaxis,e.yaxis),h.lineWidth=i/2,t(e.datapoints,Math.sin(s)*(r/2+i/4),Math.cos(s)*(r/2+i/4),e.xaxis,e.yaxis)}h.lineWidth=r,h.strokeStyle=e.color;var o=rt(e.lines,e.color,0,y);o&&(h.fillStyle=o,n(e.datapoints,e.xaxis,e.yaxis)),r>0&&t(e.datapoints,0,0,e.xaxis,e.yaxis),h.restore()}function et(e){function t(e,t,n,r,i,s,o,u){var a=e.points,f=e.pointsize;for(var l=0;ls.max||po.max)continue;h.beginPath(),c=s.p2c(c),p=o.p2c(p)+r,u=="circle"?h.arc(c,p,t,0,i?Math.PI:Math.PI*2,!1):u(h,c,p,t,i),h.closePath(),n&&(h.fillStyle=n,h.fill()),h.stroke()}}h.save(),h.translate(m.left,m.top);var n=e.points.lineWidth,r=e.shadowSize,i=e.points.radius,s=e.points.symbol;n==0&&(n=1e-4);if(n>0&&r>0){var o=r/2;h.lineWidth=o,h.strokeStyle="rgba(0,0,0,0.1)",t(e.datapoints,i,null,o+o/2,!0,e.xaxis,e.yaxis,s),h.strokeStyle="rgba(0,0,0,0.2)",t(e.datapoints,i,null,o/2,!0,e.xaxis,e.yaxis,s)}h.lineWidth=n,h.strokeStyle=e.color,t(e.datapoints,i,rt(e.points,e.color),0,!1,e.xaxis,e.yaxis,s),h.restore()}function tt(e,t,n,r,i,s,o,u,a,f,l,c){var h,p,d,v,m,g,y,b,w;l?(b=g=y=!0,m=!1,h=n,p=e,v=t+r,d=t+i,pu.max||va.max)return;hu.max&&(p=u.max,g=!1),da.max&&(v=a.max,y=!1),h=u.p2c(h),d=a.p2c(d),p=u.p2c(p),v=a.p2c(v),o&&(f.beginPath(),f.moveTo(h,d),f.lineTo(h,v),f.lineTo(p,v),f.lineTo(p,d),f.fillStyle=o(d,v),f.fill()),c>0&&(m||g||y||b)&&(f.beginPath(),f.moveTo(h,d+s),m?f.lineTo(h,v+s):f.moveTo(h,v+s),y?f.lineTo(p,v+s):f.moveTo(p,v+s),g?f.lineTo(p,d+s):f.moveTo(p,d+s),b?f.lineTo(h,d+s):f.moveTo(h,d+s),f.stroke())}function nt(e){function t(t,n,r,i,s,o,u){var a=t.points,f=t.pointsize;for(var l=0;l"),n.push(""),i=!0),n.push('
'+''+h.label+"")}i&&n.push("");if(n.length==0)return;var p=''+n.join("")+"
";if(a.legend.container!=null)e(a.legend.container).html(p);else{var d="",v=a.legend.position,g=a.legend.margin;g[0]==null&&(g=[g,g]),v.charAt(0)=="n"?d+="top:"+(g[1]+m.top)+"px;":v.charAt(0)=="s"&&(d+="bottom:"+(g[1]+m.bottom)+"px;"),v.charAt(1)=="e"?d+="right:"+(g[0]+m.right)+"px;":v.charAt(1)=="w"&&(d+="left:"+(g[0]+m.left)+"px;");var y=e('
'+p.replace('style="','style="position:absolute;'+d+";")+"
").appendTo(t);if(a.legend.backgroundOpacity!=0){var b=a.legend.backgroundColor;b==null&&(b=a.grid.backgroundColor,b&&typeof b=="string"?b=e.color.parse(b):b=e.color.extract(y,"background-color"),b.a=1,b=b.toString());var w=y.children();e('
').prependTo(y).css("opacity",a.legend.backgroundOpacity)}}}function ut(e,t,n){var r=a.grid.mouseActiveRadius,i=r*r+1,s=null,o=!1,f,l,c;for(f=u.length-1;f>=0;--f){if(!n(u[f]))continue;var h=u[f],p=h.xaxis,d=h.yaxis,v=h.datapoints.points,m=p.c2p(e),g=d.c2p(t),y=r/p.scale,b=r/d.scale;c=h.datapoints.pointsize,p.options.inverseTransform&&(y=Number.MAX_VALUE),d.options.inverseTransform&&(b=Number.MAX_VALUE);if(h.lines.show||h.points.show)for(l=0;ly||w-m<-y||E-g>b||E-g<-b)continue;var S=Math.abs(p.p2c(w)-e),x=Math.abs(d.p2c(E)-t),T=S*S+x*x;T=Math.min(k,w)&&g>=E+N&&g<=E+C:m>=w+N&&m<=w+C&&g>=Math.min(k,E)&&g<=Math.max(k,E))s=[f,l/c]}}}return s?(f=s[0],l=s[1],c=u[f].datapoints.pointsize,{datapoint:u[f].datapoints.points.slice(l*c,(l+1)*c),dataIndex:l,series:u[f],seriesIndex:f}):null}function at(e){a.grid.hoverable&&ct("plothover",e,function(e){return e["hoverable"]!=0})}function ft(e){a.grid.hoverable&&ct("plothover",e,function(e){return!1})}function lt(e){ct("plotclick",e,function(e){return e["clickable"]!=0})}function ct(e,n,r){var i=c.offset(),s=n.pageX-i.left-m.left,o=n.pageY-i.top-m.top,u=L({left:s,top:o});u.pageX=n.pageX,u.pageY=n.pageY;var f=ut(s,o,r);f&&(f.pageX=parseInt(f.series.xaxis.p2c(f.datapoint[0])+i.left+m.left,10),f.pageY=parseInt(f.series.yaxis.p2c(f.datapoint[1])+i.top+m.top,10));if(a.grid.autoHighlight){for(var l=0;ls.max||io.max)return;var a=t.points.radius+t.points.lineWidth/2;p.lineWidth=a,p.strokeStyle=u;var f=1.5*a;r=s.p2c(r),i=o.p2c(i),p.beginPath(),t.points.symbol=="circle"?p.arc(r,i,f,0,2*Math.PI,!1):t.points.symbol(p,r,i,f,!1),p.closePath(),p.stroke()}function yt(t,n){var r=typeof t.highlightColor=="string"?t.highlightColor:e.color.parse(t.color).scale("a",.5).toString(),i=r,s=t.bars.align=="left"?0:-t.bars.barWidth/2;p.lineWidth=t.bars.lineWidth,p.strokeStyle=r,tt(n[0],n[1],n[2]||0,s,s+t.bars.barWidth,0,function(){return i},t.xaxis,t.yaxis,p,t.bars.horizontal,t.bars.lineWidth)}function bt(t,n,r,i){if(typeof t=="string")return t;var s=h.createLinearGradient(0,r,0,n);for(var o=0,u=t.colors.length;o").css({position:"absolute",top:0,left:0,bottom:0,right:0,"font-size":"smaller",color:"#545454"}).insertAfter(this.element)),n=this.text[t]=e("
").addClass(t).css({position:"absolute",top:0,left:0,bottom:0,right:0}).appendTo(this.textContainer)),n},n.prototype.getTextInfo=function(t,n,r,i,s){var o,u,a,f;n=""+n,typeof r=="object"?o=r.style+" "+r.variant+" "+r.weight+" "+r.size+"px/"+r.lineHeight+"px "+r.family:o=r,u=this._textCache[t],u==null&&(u=this._textCache[t]={}),a=u[o],a==null&&(a=u[o]={}),f=a[n];if(f==null){var l=e("
").html(n).css({position:"absolute","max-width":s,top:-9999}).appendTo(this.getTextLayer(t));typeof r=="object"?l.css({font:o,color:r.color}):typeof r=="string"&&l.addClass(r),f=a[n]={width:l.outerWidth(!0),height:l.outerHeight(!0),element:l,positions:[]},l.detach()}return f},n.prototype.addText=function(e,t,n,r,i,s,o,u,a){var f=this.getTextInfo(e,r,i,s,o),l=f.positions;u=="center"?t-=f.width/2:u=="right"&&(t-=f.width),a=="middle"?n-=f.height/2:a=="bottom"&&(n-=f.height);for(var c=0,h;h=l[c];c++)if(h.x==t&&h.y==n){h.active=!0;return}h={active:!0,rendered:!1,element:l.length?f.element.clone():f.element,x:t,y:n},l.push(h),h.element.css({top:Math.round(n),left:Math.round(t),"text-align":u})},n.prototype.removeText=function(e,n,r,i,s,o){if(i==null){var u=this._textCache[e];if(u!=null)for(var a in u)if(t.call(u,a)){var f=u[a];for(var l in f)if(t.call(f,l)){var c=f[l].positions;for(var h=0,p;p=c[h];h++)p.active=!1}}}else{var c=this.getTextInfo(e,i,s,o).positions;for(var h=0,p;p=c[h];h++)p.x==n&&p.y==r&&(p.active=!1)}},e.plot=function(t,n,i){var s=new r(e(t),n,i,e.plot.plugins);return s},e.plot.version="0.8.1",e.plot.plugins=[],e.fn.plot=function(t,n){return this.each(function(){e.plot(this,t,n)})}}(jQuery); \ No newline at end of file diff --git a/htdocs/includes/jquery/plugins/flot/jquery.flot.navigate.js b/htdocs/includes/jquery/plugins/flot/jquery.flot.navigate.js old mode 100755 new mode 100644 index f2b97603c32..10256b83ac6 --- a/htdocs/includes/jquery/plugins/flot/jquery.flot.navigate.js +++ b/htdocs/includes/jquery/plugins/flot/jquery.flot.navigate.js @@ -1,108 +1,106 @@ -/* -Flot plugin for adding panning and zooming capabilities to a plot. +/* Flot plugin for adding the ability to pan and zoom the plot. -The default behaviour is double click and scrollwheel up/down to zoom -in, drag to pan. The plugin defines plot.zoom({ center }), -plot.zoomOut() and plot.pan(offset) so you easily can add custom -controls. It also fires a "plotpan" and "plotzoom" event when -something happens, useful for synchronizing plots. +Copyright (c) 2007-2013 IOLA and Ole Laursen. +Licensed under the MIT license. -Options: +The default behaviour is double click and scrollwheel up/down to zoom in, drag +to pan. The plugin defines plot.zoom({ center }), plot.zoomOut() and +plot.pan( offset ) so you easily can add custom controls. It also fires +"plotpan" and "plotzoom" events, useful for synchronizing plots. - zoom: { - interactive: false - trigger: "dblclick" // or "click" for single click - amount: 1.5 // 2 = 200% (zoom in), 0.5 = 50% (zoom out) - } - - pan: { - interactive: false - cursor: "move" // CSS mouse cursor value used when dragging, e.g. "pointer" - frameRate: 20 - } +The plugin supports these options: + + zoom: { + interactive: false + trigger: "dblclick" // or "click" for single click + amount: 1.5 // 2 = 200% (zoom in), 0.5 = 50% (zoom out) + } + + pan: { + interactive: false + cursor: "move" // CSS mouse cursor value used when dragging, e.g. "pointer" + frameRate: 20 + } + + xaxis, yaxis, x2axis, y2axis: { + zoomRange: null // or [ number, number ] (min range, max range) or false + panRange: null // or [ number, number ] (min, max) or false + } - xaxis, yaxis, x2axis, y2axis: { - zoomRange: null // or [number, number] (min range, max range) or false - panRange: null // or [number, number] (min, max) or false - } - "interactive" enables the built-in drag/click behaviour. If you enable -interactive for pan, then you'll have a basic plot that supports -moving around; the same for zoom. +interactive for pan, then you'll have a basic plot that supports moving +around; the same for zoom. -"amount" specifies the default amount to zoom in (so 1.5 = 150%) -relative to the current viewport. +"amount" specifies the default amount to zoom in (so 1.5 = 150%) relative to +the current viewport. -"cursor" is a standard CSS mouse cursor string used for visual -feedback to the user when dragging. +"cursor" is a standard CSS mouse cursor string used for visual feedback to the +user when dragging. -"frameRate" specifies the maximum number of times per second the plot -will update itself while the user is panning around on it (set to null -to disable intermediate pans, the plot will then not update until the -mouse button is released). +"frameRate" specifies the maximum number of times per second the plot will +update itself while the user is panning around on it (set to null to disable +intermediate pans, the plot will then not update until the mouse button is +released). -"zoomRange" is the interval in which zooming can happen, e.g. with -zoomRange: [1, 100] the zoom will never scale the axis so that the -difference between min and max is smaller than 1 or larger than 100. -You can set either end to null to ignore, e.g. [1, null]. If you set -zoomRange to false, zooming on that axis will be disabled. +"zoomRange" is the interval in which zooming can happen, e.g. with zoomRange: +[1, 100] the zoom will never scale the axis so that the difference between min +and max is smaller than 1 or larger than 100. You can set either end to null +to ignore, e.g. [1, null]. If you set zoomRange to false, zooming on that axis +will be disabled. -"panRange" confines the panning to stay within a range, e.g. with -panRange: [-10, 20] panning stops at -10 in one end and at 20 in the -other. Either can be null, e.g. [-10, null]. If you set -panRange to false, panning on that axis will be disabled. +"panRange" confines the panning to stay within a range, e.g. with panRange: +[-10, 20] panning stops at -10 in one end and at 20 in the other. Either can +be null, e.g. [-10, null]. If you set panRange to false, panning on that axis +will be disabled. Example API usage: - plot = $.plot(...); - - // zoom default amount in on the pixel (10, 20) - plot.zoom({ center: { left: 10, top: 20 } }); + plot = $.plot(...); - // zoom out again - plot.zoomOut({ center: { left: 10, top: 20 } }); + // zoom default amount in on the pixel ( 10, 20 ) + plot.zoom({ center: { left: 10, top: 20 } }); - // zoom 200% in on the pixel (10, 20) - plot.zoom({ amount: 2, center: { left: 10, top: 20 } }); - - // pan 100 pixels to the left and 20 down - plot.pan({ left: -100, top: 20 }) + // zoom out again + plot.zoomOut({ center: { left: 10, top: 20 } }); -Here, "center" specifies where the center of the zooming should -happen. Note that this is defined in pixel space, not the space of the -data points (you can use the p2c helpers on the axes in Flot to help -you convert between these). + // zoom 200% in on the pixel (10, 20) + plot.zoom({ amount: 2, center: { left: 10, top: 20 } }); + + // pan 100 pixels to the left and 20 down + plot.pan({ left: -100, top: 20 }) + +Here, "center" specifies where the center of the zooming should happen. Note +that this is defined in pixel space, not the space of the data points (you can +use the p2c helpers on the axes in Flot to help you convert between these). + +"amount" is the amount to zoom the viewport relative to the current range, so +1 is 100% (i.e. no change), 1.5 is 150% (zoom in), 0.7 is 70% (zoom out). You +can set the default in the options. -"amount" is the amount to zoom the viewport relative to the current -range, so 1 is 100% (i.e. no change), 1.5 is 150% (zoom in), 0.7 is -70% (zoom out). You can set the default in the options. - */ - // First two dependencies, jquery.event.drag.js and // jquery.mousewheel.js, we put them inline here to save people the // effort of downloading them. /* -jquery.event.drag.js ~ v1.5 ~ Copyright (c) 2008, Three Dub Media (http://threedubmedia.com) +jquery.event.drag.js ~ v1.5 ~ Copyright (c) 2008, Three Dub Media (http://threedubmedia.com) Licensed under the MIT License ~ http://threedubmedia.googlecode.com/files/MIT-LICENSE.txt */ -(function(E){E.fn.drag=function(L,K,J){if(K){this.bind("dragstart",L)}if(J){this.bind("dragend",J)}return !L?this.trigger("drag"):this.bind("drag",K?K:L)};var A=E.event,B=A.special,F=B.drag={not:":input",distance:0,which:1,dragging:false,setup:function(J){J=E.extend({distance:F.distance,which:F.which,not:F.not},J||{});J.distance=I(J.distance);A.add(this,"mousedown",H,J);if(this.attachEvent){this.attachEvent("ondragstart",D)}},teardown:function(){A.remove(this,"mousedown",H);if(this===F.dragging){F.dragging=F.proxy=false}G(this,true);if(this.detachEvent){this.detachEvent("ondragstart",D)}}};B.dragstart=B.dragend={setup:function(){},teardown:function(){}};function H(L){var K=this,J,M=L.data||{};if(M.elem){K=L.dragTarget=M.elem;L.dragProxy=F.proxy||K;L.cursorOffsetX=M.pageX-M.left;L.cursorOffsetY=M.pageY-M.top;L.offsetX=L.pageX-L.cursorOffsetX;L.offsetY=L.pageY-L.cursorOffsetY}else{if(F.dragging||(M.which>0&&L.which!=M.which)||E(L.target).is(M.not)){return }}switch(L.type){case"mousedown":E.extend(M,E(K).offset(),{elem:K,target:L.target,pageX:L.pageX,pageY:L.pageY});A.add(document,"mousemove mouseup",H,M);G(K,false);F.dragging=null;return false;case !F.dragging&&"mousemove":if(I(L.pageX-M.pageX)+I(L.pageY-M.pageY)0&&h.which!=l.which||a(h.target).is(l.not))return;switch(h.type){case"mousedown":return a.extend(l,a(j).offset(),{elem:j,target:h.target,pageX:h.pageX,pageY:h.pageY}),b.add(document,"mousemove mouseup",e,l),i(j,!1),d.dragging=null,!1;case!d.dragging&&"mousemove":if(g(h.pageX-l.pageX)+g(h.pageY-l.pageY) pr[1]) { + max = pr[1]; + } + } + var range = max - min; if (zr && ((zr[0] != null && range < zr[0]) || @@ -262,8 +272,8 @@ Licensed under the MIT License ~ http://threedubmedia.googlecode.com/files/MIT-L plot.draw(); if (!args.preventEvent) - plot.getPlaceholder().trigger("plotzoom", [ plot ]); - } + plot.getPlaceholder().trigger("plotzoom", [ plot, args ]); + }; plot.pan = function (args) { var delta = { @@ -310,8 +320,8 @@ Licensed under the MIT License ~ http://threedubmedia.googlecode.com/files/MIT-L plot.draw(); if (!args.preventEvent) - plot.getPlaceholder().trigger("plotpan", [ plot ]); - } + plot.getPlaceholder().trigger("plotpan", [ plot, args ]); + }; function shutdown(plot, eventHolder) { eventHolder.unbind(plot.getOptions().zoom.trigger, onZoomClick); diff --git a/htdocs/includes/jquery/plugins/flot/jquery.flot.navigate.min.js b/htdocs/includes/jquery/plugins/flot/jquery.flot.navigate.min.js old mode 100755 new mode 100644 index ecf63c93ba5..0420f160fc8 --- a/htdocs/includes/jquery/plugins/flot/jquery.flot.navigate.min.js +++ b/htdocs/includes/jquery/plugins/flot/jquery.flot.navigate.min.js @@ -1 +1,86 @@ -(function(i){i.fn.drag=function(j,k,l){if(k){this.bind("dragstart",j)}if(l){this.bind("dragend",l)}return !j?this.trigger("drag"):this.bind("drag",k?k:j)};var d=i.event,c=d.special,h=c.drag={not:":input",distance:0,which:1,dragging:false,setup:function(j){j=i.extend({distance:h.distance,which:h.which,not:h.not},j||{});j.distance=e(j.distance);d.add(this,"mousedown",f,j);if(this.attachEvent){this.attachEvent("ondragstart",a)}},teardown:function(){d.remove(this,"mousedown",f);if(this===h.dragging){h.dragging=h.proxy=false}g(this,true);if(this.detachEvent){this.detachEvent("ondragstart",a)}}};c.dragstart=c.dragend={setup:function(){},teardown:function(){}};function f(j){var k=this,l,m=j.data||{};if(m.elem){k=j.dragTarget=m.elem;j.dragProxy=h.proxy||k;j.cursorOffsetX=m.pageX-m.left;j.cursorOffsetY=m.pageY-m.top;j.offsetX=j.pageX-j.cursorOffsetX;j.offsetY=j.pageY-j.cursorOffsetY}else{if(h.dragging||(m.which>0&&j.which!=m.which)||i(j.target).is(m.not)){return}}switch(j.type){case"mousedown":i.extend(m,i(k).offset(),{elem:k,target:j.target,pageX:j.pageX,pageY:j.pageY});d.add(document,"mousemove mouseup",f,m);g(k,false);h.dragging=null;return false;case !h.dragging&&"mousemove":if(e(j.pageX-m.pageX)+e(j.pageY-m.pageY)w){var A=B;B=w;w=A}var y=w-B;if(E&&((E[0]!=null&&yE[1]))){return}D.min=B;D.max=w});o.setupGrid();o.draw();if(!q.preventEvent){o.getPlaceholder().trigger("plotzoom",[o])}};o.pan=function(p){var q={x:+p.left,y:+p.top};if(isNaN(q.x)){q.x=0}if(isNaN(q.y)){q.y=0}b.each(o.getAxes(),function(s,u){var v=u.options,t,r,w=q[u.direction];t=u.c2p(u.p2c(u.min)+w),r=u.c2p(u.p2c(u.max)+w);var x=v.panRange;if(x===false){return}if(x){if(x[0]!=null&&x[0]>t){w=x[0]-t;t+=w;r+=w}if(x[1]!=null&&x[1]0&&i.which!=p.which||e(i.target).is(p.not))return;switch(i.type){case"mousedown":return e.extend(p,e(h).offset(),{elem:h,target:i.target,pageX:i.pageX,pageY:i.pageY}),o.add(document,"mousemove mouseup",t,p),s(h,!1),a.dragging=null,!1;case!a.dragging&&"mousemove":if(r(i.pageX-p.pageX)+r(i.pageY-p.pageY)i){var u=r;r=i,i=u}o&&(o[0]!=null&&ro[1]&&(i=o[1]));var a=i-r;if(s&&(s[0]!=null&&as[1]))return;n.min=r,n.max=i}),t.setupGrid(),t.draw(),n.preventEvent||t.getPlaceholder().trigger("plotzoom",[t,n])},t.pan=function(n){var r={x:+n.left,y:+n.top};isNaN(r.x)&&(r.x=0),isNaN(r.y)&&(r.y=0),e.each(t.getAxes(),function(e,t){var n=t.options,i,s,o=r[t.direction];i=t.c2p(t.p2c(t.min)+o),s=t.c2p(t.p2c(t.max)+o);var u=n.panRange;if(u===!1)return;u&&(u[0]!=null&&u[0]>i&&(o=u[0]-i,i+=o,s+=o),u[1]!=null&&u[1]1) - options.series.pie.tilt=1; - if (options.series.pie.tilt<0) - options.series.pie.tilt=0; - - // add processData hook to do transformations on the data - plot.hooks.processDatapoints.push(processDatapoints); - plot.hooks.drawOverlay.push(drawOverlay); - - // add draw hook - plot.hooks.draw.push(draw); - } - } - - // bind hoverable events - function bindEvents(plot, eventHolder) - { - var options = plot.getOptions(); - - if (options.series.pie.show && options.grid.hoverable) - eventHolder.unbind('mousemove').mousemove(onMouseMove); - - if (options.series.pie.show && options.grid.clickable) - eventHolder.unbind('click').click(onClick); - } - - // debugging function that prints out an object - function alertObject(obj) - { - var msg = ''; - function traverse(obj, depth) - { - if (!depth) - depth = 0; - for (var i = 0; i < obj.length; ++i) - { - for (var j=0; j 1) { + options.series.pie.tilt = 1; + } else if (options.series.pie.tilt < 0) { + options.series.pie.tilt = 0; + } } - traverse(obj); - alert(msg); - } - - function calcTotal(data) - { - for (var i = 0; i < data.length; ++i) - { - var item = parseFloat(data[i].data[0][1]); - if (item) - total += item; + }); + + plot.hooks.bindEvents.push(function(plot, eventHolder) { + var options = plot.getOptions(); + if (options.series.pie.show) { + if (options.grid.hoverable) { + eventHolder.unbind("mousemove").mousemove(onMouseMove); + } + if (options.grid.clickable) { + eventHolder.unbind("click").click(onClick); + } } - } - - function processDatapoints(plot, series, data, datapoints) - { - if (!processed) - { + }); + + plot.hooks.processDatapoints.push(function(plot, series, data, datapoints) { + var options = plot.getOptions(); + if (options.series.pie.show) { + processDatapoints(plot, series, data, datapoints); + } + }); + + plot.hooks.drawOverlay.push(function(plot, octx) { + var options = plot.getOptions(); + if (options.series.pie.show) { + drawOverlay(plot, octx); + } + }); + + plot.hooks.draw.push(function(plot, newCtx) { + var options = plot.getOptions(); + if (options.series.pie.show) { + draw(plot, newCtx); + } + }); + + function processDatapoints(plot, series, datapoints) { + if (!processed) { processed = true; - canvas = plot.getCanvas(); target = $(canvas).parent(); options = plot.getOptions(); - plot.setData(combine(plot.getData())); } } - - function setupPie() - { - legendWidth = target.children().filter('.legend').children().width(); - - // calculate maximum radius and center point - maxRadius = Math.min(canvas.width,(canvas.height/options.series.pie.tilt))/2; - centerTop = (canvas.height/2)+options.series.pie.offset.top; - centerLeft = (canvas.width/2); - - if (options.series.pie.offset.left=='auto') - if (options.legend.position.match('w')) - centerLeft += legendWidth/2; - else - centerLeft -= legendWidth/2; - else - centerLeft += options.series.pie.offset.left; - - if (centerLeftcanvas.width-maxRadius) - centerLeft = canvas.width-maxRadius; - } - - function fixData(data) - { - for (var i = 0; i < data.length; ++i) - { - if (typeof(data[i].data)=='number') - data[i].data = [[1,data[i].data]]; - else if (typeof(data[i].data)=='undefined' || typeof(data[i].data[0])=='undefined') - { - if (typeof(data[i].data)!='undefined' && typeof(data[i].data.label)!='undefined') - data[i].label = data[i].data.label; // fix weirdness coming from flot - data[i].data = [[1,0]]; - + + function combine(data) { + + var total = 0, + combined = 0, + numCombined = 0, + color = options.series.pie.combine.color, + newdata = []; + + // Fix up the raw data from Flot, ensuring the data is numeric + + for (var i = 0; i < data.length; ++i) { + + var value = data[i].data; + + // If the data is an array, we'll assume that it's a standard + // Flot x-y pair, and are concerned only with the second value. + + // Note how we use the original array, rather than creating a + // new one; this is more efficient and preserves any extra data + // that the user may have stored in higher indexes. + + if ($.isArray(value) && value.length == 1) { + value = value[0]; + } + + if ($.isArray(value)) { + // Equivalent to $.isNumeric() but compatible with jQuery < 1.7 + if (!isNaN(parseFloat(value[1])) && isFinite(value[1])) { + value[1] = +value[1]; + } else { + value[1] = 0; + } + } else if (!isNaN(parseFloat(value)) && isFinite(value)) { + value = [1, +value]; + } else { + value = [1, 0]; + } + + data[i].data = [value]; + } + + // Sum up all the slices, so we can calculate percentages for each + + for (var i = 0; i < data.length; ++i) { + total += data[i].data[0][1]; + } + + // Count the number of slices with percentages below the combine + // threshold; if it turns out to be just one, we won't combine. + + for (var i = 0; i < data.length; ++i) { + var value = data[i].data[0][1]; + if (value / total <= options.series.pie.combine.threshold) { + combined += value; + numCombined++; + if (!color) { + color = data[i].color; + } } } - return data; - } - - function combine(data) - { - data = fixData(data); - calcTotal(data); - var combined = 0; - var numCombined = 0; - var color = options.series.pie.combine.color; - - var newdata = []; - for (var i = 0; i < data.length; ++i) - { - // make sure its a number - data[i].data[0][1] = parseFloat(data[i].data[0][1]); - if (!data[i].data[0][1]) - data[i].data[0][1] = 0; - - if (data[i].data[0][1]/total<=options.series.pie.combine.threshold) - { - combined += data[i].data[0][1]; - numCombined++; - if (!color) - color = data[i].color; - } - else - { + + for (var i = 0; i < data.length; ++i) { + var value = data[i].data[0][1]; + if (numCombined < 2 || value / total > options.series.pie.combine.threshold) { newdata.push({ - data: [[1,data[i].data[0][1]]], - color: data[i].color, + data: [[1, value]], + color: data[i].color, label: data[i].label, - angle: (data[i].data[0][1]*(Math.PI*2))/total, - percent: (data[i].data[0][1]/total*100) + angle: value * Math.PI * 2 / total, + percent: value / (total / 100) }); } } - if (numCombined>0) + + if (numCombined > 1) { newdata.push({ - data: [[1,combined]], - color: color, + data: [[1, combined]], + color: color, label: options.series.pie.combine.label, - angle: (combined*(Math.PI*2))/total, - percent: (combined/total*100) + angle: combined * Math.PI * 2 / total, + percent: combined / (total / 100) }); + } + return newdata; - } - - function draw(plot, newCtx) - { - if (!target) return; // if no series were passed + } + + function draw(plot, newCtx) { + + if (!target) { + return; // if no series were passed + } + + var canvasWidth = plot.getPlaceholder().width(), + canvasHeight = plot.getPlaceholder().height(), + legendWidth = target.children().filter(".legend").children().width() || 0; + ctx = newCtx; - - setupPie(); - var slices = plot.getData(); - - var attempts = 0; - while (redraw && attempts0) - maxRadius *= shrink; + + // WARNING: HACK! REWRITE THIS CODE AS SOON AS POSSIBLE! + + // When combining smaller slices into an 'other' slice, we need to + // add a new series. Since Flot gives plugins no way to modify the + // list of series, the pie plugin uses a hack where the first call + // to processDatapoints results in a call to setData with the new + // list of series, then subsequent processDatapoints do nothing. + + // The plugin-global 'processed' flag is used to control this hack; + // it starts out false, and is set to true after the first call to + // processDatapoints. + + // Unfortunately this turns future setData calls into no-ops; they + // call processDatapoints, the flag is true, and nothing happens. + + // To fix this we'll set the flag back to false here in draw, when + // all series have been processed, so the next sequence of calls to + // processDatapoints once again starts out with a slice-combine. + // This is really a hack; in 0.9 we need to give plugins a proper + // way to modify series before any processing begins. + + processed = false; + + // calculate maximum radius and center point + + maxRadius = Math.min(canvasWidth, canvasHeight / options.series.pie.tilt) / 2; + centerTop = canvasHeight / 2 + options.series.pie.offset.top; + centerLeft = canvasWidth / 2; + + if (options.series.pie.offset.left == "auto") { + if (options.legend.position.match("w")) { + centerLeft += legendWidth / 2; + } else { + centerLeft -= legendWidth / 2; + } + } else { + centerLeft += options.series.pie.offset.left; + } + + if (centerLeft < maxRadius) { + centerLeft = maxRadius; + } else if (centerLeft > canvasWidth - maxRadius) { + centerLeft = canvasWidth - maxRadius; + } + + var slices = plot.getData(), + attempts = 0; + + // Keep shrinking the pie's radius until drawPie returns true, + // indicating that all the labels fit, or we try too many times. + + do { + if (attempts > 0) { + maxRadius *= REDRAW_SHRINK; + } attempts += 1; clear(); - if (options.series.pie.tilt<=0.8) + if (options.series.pie.tilt <= 0.8) { drawShadow(); - drawPie(); - } - if (attempts >= redrawAttempts) { + } + } while (!drawPie() && attempts < REDRAW_ATTEMPTS) + + if (attempts >= REDRAW_ATTEMPTS) { clear(); - target.prepend('
Could not draw pie with labels contained inside canvas
'); + target.prepend("
Could not draw pie with labels contained inside canvas
"); } - - if ( plot.setSeries && plot.insertLegend ) - { + + if (plot.setSeries && plot.insertLegend) { plot.setSeries(slices); plot.insertLegend(); } - + // we're actually done at this point, just defining internal functions at this point - - function clear() - { - ctx.clearRect(0,0,canvas.width,canvas.height); - target.children().filter('.pieLabel, .pieLabelBackground').remove(); + + function clear() { + ctx.clearRect(0, 0, canvasWidth, canvasHeight); + target.children().filter(".pieLabel, .pieLabelBackground").remove(); } - - function drawShadow() - { - var shadowLeft = 5; - var shadowTop = 15; + + function drawShadow() { + + var shadowLeft = options.series.pie.shadow.left; + var shadowTop = options.series.pie.shadow.top; var edge = 10; - var alpha = 0.02; - - // set radius - if (options.series.pie.radius>1) - var radius = options.series.pie.radius; - else - var radius = maxRadius * options.series.pie.radius; - - if (radius>=(canvas.width/2)-shadowLeft || radius*options.series.pie.tilt>=(canvas.height/2)-shadowTop || radius<=edge) + var alpha = options.series.pie.shadow.alpha; + var radius = options.series.pie.radius > 1 ? options.series.pie.radius : maxRadius * options.series.pie.radius; + + if (radius >= canvasWidth / 2 - shadowLeft || radius * options.series.pie.tilt >= canvasHeight / 2 - shadowTop || radius <= edge) { return; // shadow would be outside canvas, so don't draw it - + } + ctx.save(); ctx.translate(shadowLeft,shadowTop); ctx.globalAlpha = alpha; - ctx.fillStyle = '#000'; + ctx.fillStyle = "#000"; // center and rotate to starting position + ctx.translate(centerLeft,centerTop); ctx.scale(1, options.series.pie.tilt); - + //radius -= edge; - for (var i=1; i<=edge; i++) - { + + for (var i = 1; i <= edge; i++) { ctx.beginPath(); - ctx.arc(0,0,radius,0,Math.PI*2,false); + ctx.arc(0, 0, radius, 0, Math.PI * 2, false); ctx.fill(); radius -= i; - } - + } + ctx.restore(); } - - function drawPie() - { - startAngle = Math.PI*options.series.pie.startAngle; - - // set radius - if (options.series.pie.radius>1) - var radius = options.series.pie.radius; - else - var radius = maxRadius * options.series.pie.radius; - + + function drawPie() { + + var startAngle = Math.PI * options.series.pie.startAngle; + var radius = options.series.pie.radius > 1 ? options.series.pie.radius : maxRadius * options.series.pie.radius; + // center and rotate to starting position + ctx.save(); ctx.translate(centerLeft,centerTop); ctx.scale(1, options.series.pie.tilt); //ctx.rotate(startAngle); // start at top; -- This doesn't work properly in Opera - + // draw slices + ctx.save(); var currentAngle = startAngle; - for (var i = 0; i < slices.length; ++i) - { + for (var i = 0; i < slices.length; ++i) { slices[i].startAngle = currentAngle; drawSlice(slices[i].angle, slices[i].color, true); } ctx.restore(); - + // draw slice outlines - ctx.save(); - ctx.lineWidth = options.series.pie.stroke.width; - currentAngle = startAngle; - for (var i = 0; i < slices.length; ++i) - drawSlice(slices[i].angle, options.series.pie.stroke.color, false); - ctx.restore(); - - // draw donut hole - drawDonutHole(ctx); - - // draw labels - if (options.series.pie.label.show) - drawLabels(); - - // restore to original state - ctx.restore(); - - function drawSlice(angle, color, fill) - { - if (angle<=0) - return; - - if (fill) - ctx.fillStyle = color; - else - { - ctx.strokeStyle = color; - ctx.lineJoin = 'round'; + + if (options.series.pie.stroke.width > 0) { + ctx.save(); + ctx.lineWidth = options.series.pie.stroke.width; + currentAngle = startAngle; + for (var i = 0; i < slices.length; ++i) { + drawSlice(slices[i].angle, options.series.pie.stroke.color, false); } - + ctx.restore(); + } + + // draw donut hole + + drawDonutHole(ctx); + + ctx.restore(); + + // Draw the labels, returning true if they fit within the plot + + if (options.series.pie.label.show) { + return drawLabels(); + } else return true; + + function drawSlice(angle, color, fill) { + + if (angle <= 0 || isNaN(angle)) { + return; + } + + if (fill) { + ctx.fillStyle = color; + } else { + ctx.strokeStyle = color; + ctx.lineJoin = "round"; + } + ctx.beginPath(); - if (Math.abs(angle - Math.PI*2) > 0.000000001) - ctx.moveTo(0,0); // Center of the pie - else if ($.browser.msie) - angle -= 0.0001; - //ctx.arc(0,0,radius,0,angle,false); // This doesn't work properly in Opera - ctx.arc(0,0,radius,currentAngle,currentAngle+angle,false); + if (Math.abs(angle - Math.PI * 2) > 0.000000001) { + ctx.moveTo(0, 0); // Center of the pie + } + + //ctx.arc(0, 0, radius, 0, angle, false); // This doesn't work properly in Opera + ctx.arc(0, 0, radius,currentAngle, currentAngle + angle / 2, false); + ctx.arc(0, 0, radius,currentAngle + angle / 2, currentAngle + angle, false); ctx.closePath(); //ctx.rotate(angle); // This doesn't work properly in Opera currentAngle += angle; - - if (fill) + + if (fill) { ctx.fill(); - else + } else { ctx.stroke(); + } } - - function drawLabels() - { + + function drawLabels() { + var currentAngle = startAngle; - - // set radius - if (options.series.pie.label.radius>1) - var radius = options.series.pie.label.radius; - else - var radius = maxRadius * options.series.pie.label.radius; - - for (var i = 0; i < slices.length; ++i) - { - if (slices[i].percent >= options.series.pie.label.threshold*100) - drawLabel(slices[i], currentAngle, i); + var radius = options.series.pie.label.radius > 1 ? options.series.pie.label.radius : maxRadius * options.series.pie.label.radius; + + for (var i = 0; i < slices.length; ++i) { + if (slices[i].percent >= options.series.pie.label.threshold * 100) { + if (!drawLabel(slices[i], currentAngle, i)) { + return false; + } + } currentAngle += slices[i].angle; } - - function drawLabel(slice, startAngle, index) - { - if (slice.data[0][1]==0) - return; - + + return true; + + function drawLabel(slice, startAngle, index) { + + if (slice.data[0][1] == 0) { + return true; + } + // format label text + var lf = options.legend.labelFormatter, text, plf = options.series.pie.label.formatter; - if (lf) + + if (lf) { text = lf(slice.label, slice); - else + } else { text = slice.label; - if (plf) + } + + if (plf) { text = plf(text, slice); - - var halfAngle = ((startAngle+slice.angle) + startAngle)/2; + } + + var halfAngle = ((startAngle + slice.angle) + startAngle) / 2; var x = centerLeft + Math.round(Math.cos(halfAngle) * radius); var y = centerTop + Math.round(Math.sin(halfAngle) * radius) * options.series.pie.tilt; - - var html = '' + text + ""; + + var html = "" + text + ""; target.append(html); - var label = target.children('#pieLabel'+index); - var labelTop = (y - label.height()/2); - var labelLeft = (x - label.width()/2); - label.css('top', labelTop); - label.css('left', labelLeft); - + + var label = target.children("#pieLabel" + index); + var labelTop = (y - label.height() / 2); + var labelLeft = (x - label.width() / 2); + + label.css("top", labelTop); + label.css("left", labelLeft); + // check to make sure that the label is not outside the canvas - if (0-labelTop>0 || 0-labelLeft>0 || canvas.height-(labelTop+label.height())<0 || canvas.width-(labelLeft+label.width())<0) - redraw = true; - + + if (0 - labelTop > 0 || 0 - labelLeft > 0 || canvasHeight - (labelTop + label.height()) < 0 || canvasWidth - (labelLeft + label.width()) < 0) { + return false; + } + if (options.series.pie.label.background.opacity != 0) { + // put in the transparent background separately to avoid blended labels and label boxes + var c = options.series.pie.label.background.color; + if (c == null) { c = slice.color; } - var pos = 'top:'+labelTop+'px;left:'+labelLeft+'px;'; - $('
').insertBefore(label).css('opacity', options.series.pie.label.background.opacity); + + var pos = "top:" + labelTop + "px;left:" + labelLeft + "px;"; + $("
") + .css("opacity", options.series.pie.label.background.opacity) + .insertBefore(label); } + + return true; } // end individual label function } // end drawLabels function } // end drawPie function } // end draw function - - // Placed here because it needs to be accessed from multiple locations - function drawDonutHole(layer) - { - // draw donut hole - if(options.series.pie.innerRadius > 0) - { + + // Placed here because it needs to be accessed from multiple locations + + function drawDonutHole(layer) { + if (options.series.pie.innerRadius > 0) { + // subtract the center + layer.save(); - innerRadius = options.series.pie.innerRadius > 1 ? options.series.pie.innerRadius : maxRadius * options.series.pie.innerRadius; - layer.globalCompositeOperation = 'destination-out'; // this does not work with excanvas, but it will fall back to using the stroke color + var innerRadius = options.series.pie.innerRadius > 1 ? options.series.pie.innerRadius : maxRadius * options.series.pie.innerRadius; + layer.globalCompositeOperation = "destination-out"; // this does not work with excanvas, but it will fall back to using the stroke color layer.beginPath(); layer.fillStyle = options.series.pie.stroke.color; - layer.arc(0,0,innerRadius,0,Math.PI*2,false); + layer.arc(0, 0, innerRadius, 0, Math.PI * 2, false); layer.fill(); layer.closePath(); layer.restore(); - + // add inner stroke + layer.save(); layer.beginPath(); layer.strokeStyle = options.series.pie.stroke.color; - layer.arc(0,0,innerRadius,0,Math.PI*2,false); + layer.arc(0, 0, innerRadius, 0, Math.PI * 2, false); layer.stroke(); layer.closePath(); layer.restore(); + // TODO: add extra shadow inside hole (with a mask) if the pie is tilted. } } - + //-- Additional Interactive related functions -- - - function isPointInPoly(poly, pt) - { + + function isPointInPoly(poly, pt) { for(var c = false, i = -1, l = poly.length, j = l - 1; ++i < l; j = i) ((poly[i][1] <= pt[1] && pt[1] < poly[j][1]) || (poly[j][1] <= pt[1] && pt[1]< poly[i][1])) && (pt[0] < (poly[j][0] - poly[i][0]) * (pt[1] - poly[i][1]) / (poly[j][1] - poly[i][1]) + poly[i][0]) && (c = !c); return c; } - - function findNearbySlice(mouseX, mouseY) - { + + function findNearbySlice(mouseX, mouseY) { + var slices = plot.getData(), options = plot.getOptions(), - radius = options.series.pie.radius > 1 ? options.series.pie.radius : maxRadius * options.series.pie.radius; - - for (var i = 0; i < slices.length; ++i) - { - var s = slices[i]; - - if(s.pie.show) - { + radius = options.series.pie.radius > 1 ? options.series.pie.radius : maxRadius * options.series.pie.radius, + x, y; + + for (var i = 0; i < slices.length; ++i) { + + var s = slices[i]; + + if (s.pie.show) { + ctx.save(); ctx.beginPath(); - ctx.moveTo(0,0); // Center of the pie + ctx.moveTo(0, 0); // Center of the pie //ctx.scale(1, options.series.pie.tilt); // this actually seems to break everything when here. - ctx.arc(0,0,radius,s.startAngle,s.startAngle+s.angle,false); + ctx.arc(0, 0, radius, s.startAngle, s.startAngle + s.angle / 2, false); + ctx.arc(0, 0, radius, s.startAngle + s.angle / 2, s.startAngle + s.angle, false); ctx.closePath(); - x = mouseX-centerLeft; - y = mouseY-centerTop; - if(ctx.isPointInPath) - { - if (ctx.isPointInPath(mouseX-centerLeft, mouseY-centerTop)) - { - //alert('found slice!'); + x = mouseX - centerLeft; + y = mouseY - centerTop; + + if (ctx.isPointInPath) { + if (ctx.isPointInPath(mouseX - centerLeft, mouseY - centerTop)) { ctx.restore(); - return {datapoint: [s.percent, s.data], dataIndex: 0, series: s, seriesIndex: i}; + return { + datapoint: [s.percent, s.data], + dataIndex: 0, + series: s, + seriesIndex: i + }; + } + } else { + + // excanvas for IE doesn;t support isPointInPath, this is a workaround. + + var p1X = radius * Math.cos(s.startAngle), + p1Y = radius * Math.sin(s.startAngle), + p2X = radius * Math.cos(s.startAngle + s.angle / 4), + p2Y = radius * Math.sin(s.startAngle + s.angle / 4), + p3X = radius * Math.cos(s.startAngle + s.angle / 2), + p3Y = radius * Math.sin(s.startAngle + s.angle / 2), + p4X = radius * Math.cos(s.startAngle + s.angle / 1.5), + p4Y = radius * Math.sin(s.startAngle + s.angle / 1.5), + p5X = radius * Math.cos(s.startAngle + s.angle), + p5Y = radius * Math.sin(s.startAngle + s.angle), + arrPoly = [[0, 0], [p1X, p1Y], [p2X, p2Y], [p3X, p3Y], [p4X, p4Y], [p5X, p5Y]], + arrPoint = [x, y]; + + // TODO: perhaps do some mathmatical trickery here with the Y-coordinate to compensate for pie tilt? + + if (isPointInPoly(arrPoly, arrPoint)) { + ctx.restore(); + return { + datapoint: [s.percent, s.data], + dataIndex: 0, + series: s, + seriesIndex: i + }; } } - else - { - // excanvas for IE doesn;t support isPointInPath, this is a workaround. - p1X = (radius * Math.cos(s.startAngle)); - p1Y = (radius * Math.sin(s.startAngle)); - p2X = (radius * Math.cos(s.startAngle+(s.angle/4))); - p2Y = (radius * Math.sin(s.startAngle+(s.angle/4))); - p3X = (radius * Math.cos(s.startAngle+(s.angle/2))); - p3Y = (radius * Math.sin(s.startAngle+(s.angle/2))); - p4X = (radius * Math.cos(s.startAngle+(s.angle/1.5))); - p4Y = (radius * Math.sin(s.startAngle+(s.angle/1.5))); - p5X = (radius * Math.cos(s.startAngle+s.angle)); - p5Y = (radius * Math.sin(s.startAngle+s.angle)); - arrPoly = [[0,0],[p1X,p1Y],[p2X,p2Y],[p3X,p3Y],[p4X,p4Y],[p5X,p5Y]]; - arrPoint = [x,y]; - // TODO: perhaps do some mathmatical trickery here with the Y-coordinate to compensate for pie tilt? - if(isPointInPoly(arrPoly, arrPoint)) - { - ctx.restore(); - return {datapoint: [s.percent, s.data], dataIndex: 0, series: s, seriesIndex: i}; - } - } + ctx.restore(); } } - + return null; } - function onMouseMove(e) - { - triggerClickHoverEvent('plothover', e); + function onMouseMove(e) { + triggerClickHoverEvent("plothover", e); + } + + function onClick(e) { + triggerClickHoverEvent("plotclick", e); } - - function onClick(e) - { - triggerClickHoverEvent('plotclick', e); - } // trigger click or hover event (they send the same parameters so we share their code) - function triggerClickHoverEvent(eventname, e) - { - var offset = plot.offset(), - canvasX = parseInt(e.pageX - offset.left), - canvasY = parseInt(e.pageY - offset.top), - item = findNearbySlice(canvasX, canvasY); - - if (options.grid.autoHighlight) - { + + function triggerClickHoverEvent(eventname, e) { + + var offset = plot.offset(); + var canvasX = parseInt(e.pageX - offset.left); + var canvasY = parseInt(e.pageY - offset.top); + var item = findNearbySlice(canvasX, canvasY); + + if (options.grid.autoHighlight) { + // clear auto-highlights - for (var i = 0; i < highlights.length; ++i) - { + + for (var i = 0; i < highlights.length; ++i) { var h = highlights[i]; - if (h.auto == eventname && !(item && h.series == item.series)) + if (h.auto == eventname && !(item && h.series == item.series)) { unhighlight(h.series); + } } } - + // highlight the slice - if (item) - highlight(item.series, eventname); - + + if (item) { + highlight(item.series, eventname); + } + // trigger any hover bind events + var pos = { pageX: e.pageX, pageY: e.pageY }; - target.trigger(eventname, [ pos, item ]); + target.trigger(eventname, [pos, item]); } - function highlight(s, auto) - { - if (typeof s == "number") - s = series[s]; + function highlight(s, auto) { + //if (typeof s == "number") { + // s = series[s]; + //} var i = indexOfHighlight(s); - if (i == -1) - { + + if (i == -1) { highlights.push({ series: s, auto: auto }); plot.triggerRedrawOverlay(); - } - else if (!auto) + } else if (!auto) { highlights[i].auto = false; + } } - function unhighlight(s) - { - if (s == null) - { + function unhighlight(s) { + if (s == null) { highlights = []; plot.triggerRedrawOverlay(); } - - if (typeof s == "number") - s = series[s]; + + //if (typeof s == "number") { + // s = series[s]; + //} var i = indexOfHighlight(s); - if (i != -1) - { + + if (i != -1) { highlights.splice(i, 1); plot.triggerRedrawOverlay(); } } - function indexOfHighlight(s) - { - for (var i = 0; i < highlights.length; ++i) - { + function indexOfHighlight(s) { + for (var i = 0; i < highlights.length; ++i) { var h = highlights[i]; if (h.series == s) return i; @@ -661,65 +721,71 @@ More detail and specific examples can be found in the included HTML file. return -1; } - function drawOverlay(plot, octx) - { - //alert(options.series.pie.radius); + function drawOverlay(plot, octx) { + var options = plot.getOptions(); - //alert(options.series.pie.radius); - + var radius = options.series.pie.radius > 1 ? options.series.pie.radius : maxRadius * options.series.pie.radius; octx.save(); octx.translate(centerLeft, centerTop); octx.scale(1, options.series.pie.tilt); - - for (i = 0; i < highlights.length; ++i) + + for (var i = 0; i < highlights.length; ++i) { drawHighlight(highlights[i].series); - + } + drawDonutHole(octx); octx.restore(); - function drawHighlight(series) - { - if (series.angle < 0) return; - + function drawHighlight(series) { + + if (series.angle <= 0 || isNaN(series.angle)) { + return; + } + //octx.fillStyle = parseColor(options.series.pie.highlight.color).scale(null, null, null, options.series.pie.highlight.opacity).toString(); - octx.fillStyle = "rgba(255, 255, 255, "+options.series.pie.highlight.opacity+")"; // this is temporary until we have access to parseColor - + octx.fillStyle = "rgba(255, 255, 255, " + options.series.pie.highlight.opacity + ")"; // this is temporary until we have access to parseColor octx.beginPath(); - if (Math.abs(series.angle - Math.PI*2) > 0.000000001) - octx.moveTo(0,0); // Center of the pie - octx.arc(0,0,radius,series.startAngle,series.startAngle+series.angle,false); + if (Math.abs(series.angle - Math.PI * 2) > 0.000000001) { + octx.moveTo(0, 0); // Center of the pie + } + octx.arc(0, 0, radius, series.startAngle, series.startAngle + series.angle / 2, false); + octx.arc(0, 0, radius, series.startAngle + series.angle / 2, series.startAngle + series.angle, false); octx.closePath(); octx.fill(); } - - } - + } } // end init (plugin body) - + // define pie specific options and their default values + var options = { series: { pie: { show: false, - radius: 'auto', // actual radius of the visible pie (based on full calculated radius if <=1, or hard pixel value) - innerRadius:0, /* for donut */ + radius: "auto", // actual radius of the visible pie (based on full calculated radius if <=1, or hard pixel value) + innerRadius: 0, /* for donut */ startAngle: 3/2, tilt: 1, + shadow: { + left: 5, // shadow left offset + top: 15, // shadow top offset + alpha: 0.02 // shadow alpha + }, offset: { top: 0, - left: 'auto' + left: "auto" }, stroke: { - color: '#FFF', + color: "#fff", width: 1 }, label: { - show: 'auto', - formatter: function(label, slice){ - return '
'+label+'
'+Math.round(slice.percent)+'%
'; + show: "auto", + formatter: function(label, slice) { + return "
" + label + "
" + Math.round(slice.percent) + "%
"; }, // formatter function radius: 1, // radius at which to place the labels (based on full calculated radius if <=1, or hard pixel value) background: { @@ -731,20 +797,21 @@ More detail and specific examples can be found in the included HTML file. combine: { threshold: -1, // percentage at which to combine little slices into one larger slice color: null, // color to give the new slice (auto-generated if null) - label: 'Other' // label to give the new slice + label: "Other" // label to give the new slice }, highlight: { - //color: '#FFF', // will add this functionality once parseColor is available + //color: "#fff", // will add this functionality once parseColor is available opacity: 0.5 } } } }; - + $.plot.plugins.push({ init: init, options: options, name: "pie", - version: "1.0" + version: "1.1" }); + })(jQuery); diff --git a/htdocs/includes/jquery/plugins/flot/jquery.flot.pie.min.js b/htdocs/includes/jquery/plugins/flot/jquery.flot.pie.min.js old mode 100755 new mode 100644 index b7bf870d759..3de8f44c5d0 --- a/htdocs/includes/jquery/plugins/flot/jquery.flot.pie.min.js +++ b/htdocs/includes/jquery/plugins/flot/jquery.flot.pie.min.js @@ -1 +1,56 @@ -(function(b){function c(D){var h=null;var L=null;var n=null;var B=null;var p=null;var M=0;var F=true;var o=10;var w=0.95;var A=0;var d=false;var z=false;var j=[];D.hooks.processOptions.push(g);D.hooks.bindEvents.push(e);function g(O,N){if(N.series.pie.show){N.grid.show=false;if(N.series.pie.label.show=="auto"){if(N.legend.show){N.series.pie.label.show=false}else{N.series.pie.label.show=true}}if(N.series.pie.radius=="auto"){if(N.series.pie.label.show){N.series.pie.radius=3/4}else{N.series.pie.radius=1}}if(N.series.pie.tilt>1){N.series.pie.tilt=1}if(N.series.pie.tilt<0){N.series.pie.tilt=0}O.hooks.processDatapoints.push(E);O.hooks.drawOverlay.push(H);O.hooks.draw.push(r)}}function e(P,N){var O=P.getOptions();if(O.series.pie.show&&O.grid.hoverable){N.unbind("mousemove").mousemove(t)}if(O.series.pie.show&&O.grid.clickable){N.unbind("click").click(l)}}function G(O){var P="";function N(S,T){if(!T){T=0}for(var R=0;Rh.width-n){B=h.width-n}}}function v(O){for(var N=0;N0){R.push({data:[[1,P]],color:N,label:a.series.pie.combine.label,angle:(P*(Math.PI*2))/M,percent:(P/M*100)})}return R}function r(S,Q){if(!L){return}ctx=Q;I();var T=S.getData();var P=0;while(F&&P0){n*=w}P+=1;N();if(a.series.pie.tilt<=0.8){O()}R()}if(P>=o){N();L.prepend('
Could not draw pie with labels contained inside canvas
')}if(S.setSeries&&S.insertLegend){S.setSeries(T);S.insertLegend()}function N(){ctx.clearRect(0,0,h.width,h.height);L.children().filter(".pieLabel, .pieLabelBackground").remove()}function O(){var Z=5;var Y=15;var W=10;var X=0.02;if(a.series.pie.radius>1){var U=a.series.pie.radius}else{var U=n*a.series.pie.radius}if(U>=(h.width/2)-Z||U*a.series.pie.tilt>=(h.height/2)-Y||U<=W){return}ctx.save();ctx.translate(Z,Y);ctx.globalAlpha=X;ctx.fillStyle="#000";ctx.translate(B,p);ctx.scale(1,a.series.pie.tilt);for(var V=1;V<=W;V++){ctx.beginPath();ctx.arc(0,0,U,0,Math.PI*2,false);ctx.fill();U-=V}ctx.restore()}function R(){startAngle=Math.PI*a.series.pie.startAngle;if(a.series.pie.radius>1){var U=a.series.pie.radius}else{var U=n*a.series.pie.radius}ctx.save();ctx.translate(B,p);ctx.scale(1,a.series.pie.tilt);ctx.save();var Y=startAngle;for(var W=0;W1e-9){ctx.moveTo(0,0)}else{if(b.browser.msie){ab-=0.0001}}ctx.arc(0,0,U,Y,Y+ab,false);ctx.closePath();Y+=ab;if(aa){ctx.fill()}else{ctx.stroke()}}function V(){var ac=startAngle;if(a.series.pie.label.radius>1){var Z=a.series.pie.label.radius}else{var Z=n*a.series.pie.label.radius}for(var ab=0;ab=a.series.pie.label.threshold*100){aa(T[ab],ac,ab)}ac+=T[ab].angle}function aa(ap,ai,ag){if(ap.data[0][1]==0){return}var ar=a.legend.labelFormatter,aq,ae=a.series.pie.label.formatter;if(ar){aq=ar(ap.label,ap)}else{aq=ap.label}if(ae){aq=ae(aq,ap)}var aj=((ai+ap.angle)+ai)/2;var ao=B+Math.round(Math.cos(aj)*Z);var am=p+Math.round(Math.sin(aj)*Z)*a.series.pie.tilt;var af=''+aq+"";L.append(af);var an=L.children("#pieLabel"+ag);var ad=(am-an.height()/2);var ah=(ao-an.width()/2);an.css("top",ad);an.css("left",ah);if(0-ad>0||0-ah>0||h.height-(ad+an.height())<0||h.width-(ah+an.width())<0){F=true}if(a.series.pie.label.background.opacity!=0){var ak=a.series.pie.label.background.color;if(ak==null){ak=ap.color}var al="top:"+ad+"px;left:"+ah+"px;";b('
').insertBefore(an).css("opacity",a.series.pie.label.background.opacity)}}}}}function J(N){if(a.series.pie.innerRadius>0){N.save();innerRadius=a.series.pie.innerRadius>1?a.series.pie.innerRadius:n*a.series.pie.innerRadius;N.globalCompositeOperation="destination-out";N.beginPath();N.fillStyle=a.series.pie.stroke.color;N.arc(0,0,innerRadius,0,Math.PI*2,false);N.fill();N.closePath();N.restore();N.save();N.beginPath();N.strokeStyle=a.series.pie.stroke.color;N.arc(0,0,innerRadius,0,Math.PI*2,false);N.stroke();N.closePath();N.restore()}}function s(Q,R){for(var S=false,P=-1,N=Q.length,O=N-1;++P1?O.series.pie.radius:n*O.series.pie.radius;for(var Q=0;Q1?P.series.pie.radius:n*P.series.pie.radius;R.save();R.translate(B,p);R.scale(1,P.series.pie.tilt);for(i=0;i1e-9){R.moveTo(0,0)}R.arc(0,0,N,S.startAngle,S.startAngle+S.angle,false);R.closePath();R.fill()}}}var a={series:{pie:{show:false,radius:"auto",innerRadius:0,startAngle:3/2,tilt:1,offset:{top:0,left:"auto"},stroke:{color:"#FFF",width:1},label:{show:"auto",formatter:function(d,e){return'
'+d+"
"+Math.round(e.percent)+"%
"},radius:1,background:{color:null,opacity:0},threshold:0},combine:{threshold:-1,color:null,label:"Other"},highlight:{opacity:0.5}}}};b.plot.plugins.push({init:c,options:a,name:"pie",version:"1.0"})})(jQuery); \ No newline at end of file +/* Flot plugin for rendering pie charts. + +Copyright (c) 2007-2013 IOLA and Ole Laursen. +Licensed under the MIT license. + +The plugin assumes that each series has a single data value, and that each +value is a positive integer or zero. Negative numbers don't make sense for a +pie chart, and have unpredictable results. The values do NOT need to be +passed in as percentages; the plugin will calculate the total and per-slice +percentages internally. + +* Created by Brian Medendorp + +* Updated with contributions from btburnett3, Anthony Aragues and Xavi Ivars + +The plugin supports these options: + + series: { + pie: { + show: true/false + radius: 0-1 for percentage of fullsize, or a specified pixel length, or 'auto' + innerRadius: 0-1 for percentage of fullsize or a specified pixel length, for creating a donut effect + startAngle: 0-2 factor of PI used for starting angle (in radians) i.e 3/2 starts at the top, 0 and 2 have the same result + tilt: 0-1 for percentage to tilt the pie, where 1 is no tilt, and 0 is completely flat (nothing will show) + offset: { + top: integer value to move the pie up or down + left: integer value to move the pie left or right, or 'auto' + }, + stroke: { + color: any hexidecimal color value (other formats may or may not work, so best to stick with something like '#FFF') + width: integer pixel width of the stroke + }, + label: { + show: true/false, or 'auto' + formatter: a user-defined function that modifies the text/style of the label text + radius: 0-1 for percentage of fullsize, or a specified pixel length + background: { + color: any hexidecimal color value (other formats may or may not work, so best to stick with something like '#000') + opacity: 0-1 + }, + threshold: 0-1 for the percentage value at which to hide labels (if they're too small) + }, + combine: { + threshold: 0-1 for the percentage value at which to combine slices (if they're too small) + color: any hexidecimal color value (other formats may or may not work, so best to stick with something like '#CCC'), if null, the plugin will automatically use the color of the first slice to be combined + label: any text value of what the combined slice should be labeled + } + highlight: { + opacity: 0-1 + } + } + } + +More detail and specific examples can be found in the included HTML file. + +*/(function(e){function r(r){function p(t,n,r){l||(l=!0,s=t.getCanvas(),o=e(s).parent(),i=t.getOptions(),t.setData(d(t.getData())))}function d(t){var n=0,r=0,s=0,o=i.series.pie.combine.color,u=[];for(var a=0;ai.series.pie.combine.threshold)&&u.push({data:[[1,f]],color:t[a].color,label:t[a].label,angle:f*Math.PI*2/n,percent:f/(n/100)})}return s>1&&u.push({data:[[1,r]],color:o,label:i.series.pie.combine.label,angle:r*Math.PI*2/n,percent:r/(n/100)}),u}function v(r,s){function y(){c.clearRect(0,0,h,p),o.children().filter(".pieLabel, .pieLabelBackground").remove()}function b(){var e=i.series.pie.shadow.left,t=i.series.pie.shadow.top,n=10,r=i.series.pie.shadow.alpha,s=i.series.pie.radius>1?i.series.pie.radius:u*i.series.pie.radius;if(s>=h/2-e||s*i.series.pie.tilt>=p/2-t||s<=n)return;c.save(),c.translate(e,t),c.globalAlpha=r,c.fillStyle="#000",c.translate(a,f),c.scale(1,i.series.pie.tilt);for(var o=1;o<=n;o++)c.beginPath(),c.arc(0,0,s,0,Math.PI*2,!1),c.fill(),s-=o;c.restore()}function w(){function l(e,t,i){if(e<=0||isNaN(e))return;i?c.fillStyle=t:(c.strokeStyle=t,c.lineJoin="round"),c.beginPath(),Math.abs(e-Math.PI*2)>1e-9&&c.moveTo(0,0),c.arc(0,0,n,r,r+e/2,!1),c.arc(0,0,n,r+e/2,r+e,!1),c.closePath(),r+=e,i?c.fill():c.stroke()}function d(){function l(t,n,s){if(t.data[0][1]==0)return!0;var u=i.legend.labelFormatter,l,c=i.series.pie.label.formatter;u?l=u(t.label,t):l=t.label,c&&(l=c(l,t));var d=(n+t.angle+n)/2,v=a+Math.round(Math.cos(d)*r),m=f+Math.round(Math.sin(d)*r)*i.series.pie.tilt,g=""+l+"";o.append(g);var y=o.children("#pieLabel"+s),b=m-y.height()/2,w=v-y.width()/2;y.css("top",b),y.css("left",w);if(0-b>0||0-w>0||p-(b+y.height())<0||h-(w+y.width())<0)return!1;if(i.series.pie.label.background.opacity!=0){var E=i.series.pie.label.background.color;E==null&&(E=t.color);var S="top:"+b+"px;left:"+w+"px;";e("
").css("opacity",i.series.pie.label.background.opacity).insertBefore(y)}return!0}var n=t,r=i.series.pie.label.radius>1?i.series.pie.label.radius:u*i.series.pie.label.radius;for(var s=0;s=i.series.pie.label.threshold*100&&!l(v[s],n,s))return!1;n+=v[s].angle}return!0}var t=Math.PI*i.series.pie.startAngle,n=i.series.pie.radius>1?i.series.pie.radius:u*i.series.pie.radius;c.save(),c.translate(a,f),c.scale(1,i.series.pie.tilt),c.save();var r=t;for(var s=0;s0){c.save(),c.lineWidth=i.series.pie.stroke.width,r=t;for(var s=0;sh-u&&(a=h-u);var v=r.getData(),g=0;do g>0&&(u*=n),g+=1,y(),i.series.pie.tilt<=.8&&b();while(!w()&&g=t&&(y(),o.prepend("
Could not draw pie with labels contained inside canvas
")),r.setSeries&&r.insertLegend&&(r.setSeries(v),r.insertLegend())}function m(e){if(i.series.pie.innerRadius>0){e.save();var t=i.series.pie.innerRadius>1?i.series.pie.innerRadius:u*i.series.pie.innerRadius;e.globalCompositeOperation="destination-out",e.beginPath(),e.fillStyle=i.series.pie.stroke.color,e.arc(0,0,t,0,Math.PI*2,!1),e.fill(),e.closePath(),e.restore(),e.save(),e.beginPath(),e.strokeStyle=i.series.pie.stroke.color,e.arc(0,0,t,0,Math.PI*2,!1),e.stroke(),e.closePath(),e.restore()}}function g(e,t){for(var n=!1,r=-1,i=e.length,s=i-1;++r1?i.series.pie.radius:u*i.series.pie.radius,o,l;for(var h=0;h1e-9&&t.moveTo(0,0),t.arc(0,0,r,e.startAngle,e.startAngle+e.angle/2,!1),t.arc(0,0,r,e.startAngle+e.angle/2,e.startAngle+e.angle,!1),t.closePath(),t.fill()}var n=e.getOptions(),r=n.series.pie.radius>1?n.series.pie.radius:u*n.series.pie.radius;t.save(),t.translate(a,f),t.scale(1,n.series.pie.tilt);for(var i=0;i1?t.series.pie.tilt=1:t.series.pie.tilt<0&&(t.series.pie.tilt=0))}),r.hooks.bindEvents.push(function(e,t){var n=e.getOptions();n.series.pie.show&&(n.grid.hoverable&&t.unbind("mousemove").mousemove(b),n.grid.clickable&&t.unbind("click").click(w))}),r.hooks.processDatapoints.push(function(e,t,n,r){var i=e.getOptions();i.series.pie.show&&p(e,t,n,r)}),r.hooks.drawOverlay.push(function(e,t){var n=e.getOptions();n.series.pie.show&&N(e,t)}),r.hooks.draw.push(function(e,t){var n=e.getOptions();n.series.pie.show&&v(e,t)})}var t=10,n=.95,i={series:{pie:{show:!1,radius:"auto",innerRadius:0,startAngle:1.5,tilt:1,shadow:{left:5,top:15,alpha:.02},offset:{top:0,left:"auto"},stroke:{color:"#fff",width:1},label:{show:"auto",formatter:function(e,t){return"
"+e+"
"+Math.round(t.percent)+"%
"},radius:1,background:{color:null,opacity:0},threshold:0},combine:{threshold:-1,color:null,label:"Other"},highlight:{opacity:.5}}}};e.plot.plugins.push({init:r,options:i,name:"pie",version:"1.1"})})(jQuery); \ No newline at end of file diff --git a/htdocs/includes/jquery/plugins/flot/jquery.flot.resize.js b/htdocs/includes/jquery/plugins/flot/jquery.flot.resize.js old mode 100755 new mode 100644 index 69dfb24f38e..6b2c5d402b1 --- a/htdocs/includes/jquery/plugins/flot/jquery.flot.resize.js +++ b/htdocs/includes/jquery/plugins/flot/jquery.flot.resize.js @@ -1,26 +1,26 @@ -/* -Flot plugin for automatically redrawing plots when the placeholder -size changes, e.g. on window resizes. +/* Flot plugin for automatically redrawing plots as the placeholder resizes. -It works by listening for changes on the placeholder div (through the -jQuery resize event plugin) - if the size changes, it will redraw the -plot. +Copyright (c) 2007-2013 IOLA and Ole Laursen. +Licensed under the MIT license. + +It works by listening for changes on the placeholder div (through the jQuery +resize event plugin) - if the size changes, it will redraw the plot. + +There are no options. If you need to disable the plugin for some plots, you +can just fix the size of their placeholders. -There are no options. If you need to disable the plugin for some -plots, you can just fix the size of their placeholders. */ - -/* Inline dependency: +/* Inline dependency: * jQuery resize event - v1.1 - 3/14/2010 * http://benalman.com/projects/jquery-resize-plugin/ - * + * * Copyright (c) 2010 "Cowboy" Ben Alman * Dual licensed under the MIT and GPL licenses. * http://benalman.com/about/license/ */ -(function($,h,c){var a=$([]),e=$.resize=$.extend($.resize,{}),i,k="setTimeout",j="resize",d=j+"-special-event",b="delay",f="throttleWindow";e[b]=250;e[f]=true;$.event.special[j]={setup:function(){if(!e[f]&&this[k]){return false}var l=$(this);a=a.add(l);$.data(this,d,{w:l.width(),h:l.height()});if(a.length===1){g()}},teardown:function(){if(!e[f]&&this[k]){return false}var l=$(this);a=a.not(l);l.removeData(d);if(!a.length){clearTimeout(i)}},add:function(l){if(!e[f]&&this[k]){return false}var n;function m(s,o,p){var q=$(this),r=$.data(this,d);r.w=o!==c?o:q.width();r.h=p!==c?p:q.height();n.apply(this,arguments)}if($.isFunction(l)){n=l;return m}else{n=l.handler;l.handler=m}}};function g(){i=h[k](function(){a.each(function(){var n=$(this),m=n.width(),l=n.height(),o=$.data(this,d);if(m!==o.w||l!==o.h){n.trigger(j,[o.w=m,o.h=l])}});g()},e[b])}})(jQuery,this); +(function($,h,c){var a=$([]),e=$.resize=$.extend($.resize,{}),i,k="setTimeout",j="resize",d=j+"-special-event",b="delay",f="throttleWindow";e[b]=250;e[f]=true;$.event.special[j]={setup:function(){if(!e[f]&&this[k]){return false}var l=$(this);a=a.add(l);$.data(this,d,{w:l.width(),h:l.height()});if(a.length===1){g()}},teardown:function(){if(!e[f]&&this[k]){return false}var l=$(this);a=a.not(l);l.removeData(d);if(!a.length){clearTimeout(i)}},add:function(l){if(!e[f]&&this[k]){return false}var n;function m(s,o,p){var q=$(this),r=$.data(this,d);r.w=o!==c?o:q.width();r.h=p!==c?p:q.height();n.apply(this,arguments)}if($.isFunction(l)){n=l;return m}else{n=l.handler;l.handler=m}}};function g(){i=h[k](function(){a.each(function(){var n=$(this),m=n.width(),l=n.height(),o=$.data(this,d);if(m!==o.w||l!==o.h){n.trigger(j,[o.w=m,o.h=l])}});g()},e[b])}})(jQuery,this); (function ($) { var options = { }; // no options diff --git a/htdocs/includes/jquery/plugins/flot/jquery.flot.resize.min.js b/htdocs/includes/jquery/plugins/flot/jquery.flot.resize.min.js old mode 100755 new mode 100644 index 1fa0771f570..b2ddec10cc7 --- a/htdocs/includes/jquery/plugins/flot/jquery.flot.resize.min.js +++ b/htdocs/includes/jquery/plugins/flot/jquery.flot.resize.min.js @@ -1 +1,19 @@ -(function(n,p,u){var w=n([]),s=n.resize=n.extend(n.resize,{}),o,l="setTimeout",m="resize",t=m+"-special-event",v="delay",r="throttleWindow";s[v]=250;s[r]=true;n.event.special[m]={setup:function(){if(!s[r]&&this[l]){return false}var a=n(this);w=w.add(a);n.data(this,t,{w:a.width(),h:a.height()});if(w.length===1){q()}},teardown:function(){if(!s[r]&&this[l]){return false}var a=n(this);w=w.not(a);a.removeData(t);if(!w.length){clearTimeout(o)}},add:function(b){if(!s[r]&&this[l]){return false}var c;function a(d,h,g){var f=n(this),e=n.data(this,t);e.w=h!==u?h:f.width();e.h=g!==u?g:f.height();c.apply(this,arguments)}if(n.isFunction(b)){c=b;return a}else{c=b.handler;b.handler=a}}};function q(){o=p[l](function(){w.each(function(){var d=n(this),a=d.width(),b=d.height(),c=n.data(this,t);if(a!==c.w||b!==c.h){d.trigger(m,[c.w=a,c.h=b])}});q()},s[v])}})(jQuery,this);(function(b){var a={};function c(f){function e(){var h=f.getPlaceholder();if(h.width()==0||h.height()==0){return}f.resize();f.setupGrid();f.draw()}function g(i,h){i.getPlaceholder().resize(e)}function d(i,h){i.getPlaceholder().unbind("resize",e)}f.hooks.bindEvents.push(g);f.hooks.shutdown.push(d)}b.plot.plugins.push({init:c,options:a,name:"resize",version:"1.0"})})(jQuery); \ No newline at end of file +/* Flot plugin for automatically redrawing plots as the placeholder resizes. + +Copyright (c) 2007-2013 IOLA and Ole Laursen. +Licensed under the MIT license. + +It works by listening for changes on the placeholder div (through the jQuery +resize event plugin) - if the size changes, it will redraw the plot. + +There are no options. If you need to disable the plugin for some plots, you +can just fix the size of their placeholders. + +*//* Inline dependency: + * jQuery resize event - v1.1 - 3/14/2010 + * http://benalman.com/projects/jquery-resize-plugin/ + * + * Copyright (c) 2010 "Cowboy" Ben Alman + * Dual licensed under the MIT and GPL licenses. + * http://benalman.com/about/license/ + */(function(e,t,n){function c(){s=t[o](function(){r.each(function(){var t=e(this),n=t.width(),r=t.height(),i=e.data(this,a);(n!==i.w||r!==i.h)&&t.trigger(u,[i.w=n,i.h=r])}),c()},i[f])}var r=e([]),i=e.resize=e.extend(e.resize,{}),s,o="setTimeout",u="resize",a=u+"-special-event",f="delay",l="throttleWindow";i[f]=250,i[l]=!0,e.event.special[u]={setup:function(){if(!i[l]&&this[o])return!1;var t=e(this);r=r.add(t),e.data(this,a,{w:t.width(),h:t.height()}),r.length===1&&c()},teardown:function(){if(!i[l]&&this[o])return!1;var t=e(this);r=r.not(t),t.removeData(a),r.length||clearTimeout(s)},add:function(t){function s(t,i,s){var o=e(this),u=e.data(this,a);u.w=i!==n?i:o.width(),u.h=s!==n?s:o.height(),r.apply(this,arguments)}if(!i[l]&&this[o])return!1;var r;if(e.isFunction(t))return r=t,s;r=t.handler,t.handler=s}}})(jQuery,this),function(e){function n(e){function t(){var t=e.getPlaceholder();if(t.width()==0||t.height()==0)return;e.resize(),e.setupGrid(),e.draw()}function n(e,n){e.getPlaceholder().resize(t)}function r(e,n){e.getPlaceholder().unbind("resize",t)}e.hooks.bindEvents.push(n),e.hooks.shutdown.push(r)}var t={};e.plot.plugins.push({init:n,options:t,name:"resize",version:"1.0"})}(jQuery); \ No newline at end of file diff --git a/htdocs/includes/jquery/plugins/flot/jquery.flot.selection.js b/htdocs/includes/jquery/plugins/flot/jquery.flot.selection.js old mode 100755 new mode 100644 index 7f7b32694bd..f8fa668ff4f --- a/htdocs/includes/jquery/plugins/flot/jquery.flot.selection.js +++ b/htdocs/includes/jquery/plugins/flot/jquery.flot.selection.js @@ -1,68 +1,80 @@ -/* -Flot plugin for selecting regions. +/* Flot plugin for selecting regions of a plot. -The plugin defines the following options: +Copyright (c) 2007-2013 IOLA and Ole Laursen. +Licensed under the MIT license. - selection: { - mode: null or "x" or "y" or "xy", - color: color - } +The plugin supports these options: -Selection support is enabled by setting the mode to one of "x", "y" or -"xy". In "x" mode, the user will only be able to specify the x range, -similarly for "y" mode. For "xy", the selection becomes a rectangle -where both ranges can be specified. "color" is color of the selection -(if you need to change the color later on, you can get to it with -plot.getOptions().selection.color). +selection: { + mode: null or "x" or "y" or "xy", + color: color, + shape: "round" or "miter" or "bevel", + minSize: number of pixels +} -When selection support is enabled, a "plotselected" event will be -emitted on the DOM element you passed into the plot function. The -event handler gets a parameter with the ranges selected on the axes, -like this: +Selection support is enabled by setting the mode to one of "x", "y" or "xy". +In "x" mode, the user will only be able to specify the x range, similarly for +"y" mode. For "xy", the selection becomes a rectangle where both ranges can be +specified. "color" is color of the selection (if you need to change the color +later on, you can get to it with plot.getOptions().selection.color). "shape" +is the shape of the corners of the selection. - placeholder.bind("plotselected", function(event, ranges) { - alert("You selected " + ranges.xaxis.from + " to " + ranges.xaxis.to) - // similar for yaxis - with multiple axes, the extra ones are in - // x2axis, x3axis, ... - }); +"minSize" is the minimum size a selection can be in pixels. This value can +be customized to determine the smallest size a selection can be and still +have the selection rectangle be displayed. When customizing this value, the +fact that it refers to pixels, not axis units must be taken into account. +Thus, for example, if there is a bar graph in time mode with BarWidth set to 1 +minute, setting "minSize" to 1 will not make the minimum selection size 1 +minute, but rather 1 pixel. Note also that setting "minSize" to 0 will prevent +"plotunselected" events from being fired when the user clicks the mouse without +dragging. -The "plotselected" event is only fired when the user has finished -making the selection. A "plotselecting" event is fired during the -process with the same parameters as the "plotselected" event, in case -you want to know what's happening while it's happening, +When selection support is enabled, a "plotselected" event will be emitted on +the DOM element you passed into the plot function. The event handler gets a +parameter with the ranges selected on the axes, like this: -A "plotunselected" event with no arguments is emitted when the user -clicks the mouse to remove the selection. + placeholder.bind( "plotselected", function( event, ranges ) { + alert("You selected " + ranges.xaxis.from + " to " + ranges.xaxis.to) + // similar for yaxis - with multiple axes, the extra ones are in + // x2axis, x3axis, ... + }); + +The "plotselected" event is only fired when the user has finished making the +selection. A "plotselecting" event is fired during the process with the same +parameters as the "plotselected" event, in case you want to know what's +happening while it's happening, + +A "plotunselected" event with no arguments is emitted when the user clicks the +mouse to remove the selection. As stated above, setting "minSize" to 0 will +destroy this behavior. The plugin allso adds the following methods to the plot object: -- setSelection(ranges, preventEvent) +- setSelection( ranges, preventEvent ) - Set the selection rectangle. The passed in ranges is on the same - form as returned in the "plotselected" event. If the selection mode - is "x", you should put in either an xaxis range, if the mode is "y" - you need to put in an yaxis range and both xaxis and yaxis if the - selection mode is "xy", like this: + Set the selection rectangle. The passed in ranges is on the same form as + returned in the "plotselected" event. If the selection mode is "x", you + should put in either an xaxis range, if the mode is "y" you need to put in + an yaxis range and both xaxis and yaxis if the selection mode is "xy", like + this: - setSelection({ xaxis: { from: 0, to: 10 }, yaxis: { from: 40, to: 60 } }); + setSelection({ xaxis: { from: 0, to: 10 }, yaxis: { from: 40, to: 60 } }); - setSelection will trigger the "plotselected" event when called. If - you don't want that to happen, e.g. if you're inside a - "plotselected" handler, pass true as the second parameter. If you - are using multiple axes, you can specify the ranges on any of those, - e.g. as x2axis/x3axis/... instead of xaxis, the plugin picks the - first one it sees. - -- clearSelection(preventEvent) + setSelection will trigger the "plotselected" event when called. If you don't + want that to happen, e.g. if you're inside a "plotselected" handler, pass + true as the second parameter. If you are using multiple axes, you can + specify the ranges on any of those, e.g. as x2axis/x3axis/... instead of + xaxis, the plugin picks the first one it sees. + +- clearSelection( preventEvent ) Clear the selection rectangle. Pass in true to avoid getting a "plotunselected" event. - getSelection() - Returns the current selection in the same format as the - "plotselected" event. If there's currently no selection, the - function returns null. + Returns the current selection in the same format as the "plotselected" + event. If there's currently no selection, the function returns null. */ @@ -146,6 +158,8 @@ The plugin allso adds the following methods to the plot object: function getSelection() { if (!selectionIsSane()) return null; + + if (!selection.show) return null; var r = {}, c1 = selection.first, c2 = selection.second; $.each(plot.getAxes(), function (name, axis) { @@ -274,7 +288,7 @@ The plugin allso adds the following methods to the plot object: } function selectionIsSane() { - var minSize = 5; + var minSize = plot.getOptions().selection.minSize; return Math.abs(selection.second.x - selection.first.x) >= minSize && Math.abs(selection.second.y - selection.first.y) >= minSize; } @@ -305,13 +319,13 @@ The plugin allso adds the following methods to the plot object: ctx.strokeStyle = c.scale('a', 0.8).toString(); ctx.lineWidth = 1; - ctx.lineJoin = "round"; + ctx.lineJoin = o.selection.shape; ctx.fillStyle = c.scale('a', 0.4).toString(); - var x = Math.min(selection.first.x, selection.second.x), - y = Math.min(selection.first.y, selection.second.y), - w = Math.abs(selection.second.x - selection.first.x), - h = Math.abs(selection.second.y - selection.first.y); + var x = Math.min(selection.first.x, selection.second.x) + 0.5, + y = Math.min(selection.first.y, selection.second.y) + 0.5, + w = Math.abs(selection.second.x - selection.first.x) - 1, + h = Math.abs(selection.second.y - selection.first.y) - 1; ctx.fillRect(x, y, w, h); ctx.strokeRect(x, y, w, h); @@ -335,7 +349,9 @@ The plugin allso adds the following methods to the plot object: options: { selection: { mode: null, // one of null, "x", "y" or "xy" - color: "#e8cfac" + color: "#e8cfac", + shape: "round", // one of "round", "miter", or "bevel" + minSize: 5 // minimum number of pixels } }, name: 'selection', diff --git a/htdocs/includes/jquery/plugins/flot/jquery.flot.selection.min.js b/htdocs/includes/jquery/plugins/flot/jquery.flot.selection.min.js old mode 100755 new mode 100644 index badc0052dbe..bbfb975f432 --- a/htdocs/includes/jquery/plugins/flot/jquery.flot.selection.min.js +++ b/htdocs/includes/jquery/plugins/flot/jquery.flot.selection.min.js @@ -1 +1,79 @@ -(function(a){function b(k){var p={first:{x:-1,y:-1},second:{x:-1,y:-1},show:false,active:false};var m={};var r=null;function e(s){if(p.active){l(s);k.getPlaceholder().trigger("plotselecting",[g()])}}function n(s){if(s.which!=1){return}document.body.focus();if(document.onselectstart!==undefined&&m.onselectstart==null){m.onselectstart=document.onselectstart;document.onselectstart=function(){return false}}if(document.ondrag!==undefined&&m.ondrag==null){m.ondrag=document.ondrag;document.ondrag=function(){return false}}d(p.first,s);p.active=true;r=function(t){j(t)};a(document).one("mouseup",r)}function j(s){r=null;if(document.onselectstart!==undefined){document.onselectstart=m.onselectstart}if(document.ondrag!==undefined){document.ondrag=m.ondrag}p.active=false;l(s);if(f()){i()}else{k.getPlaceholder().trigger("plotunselected",[]);k.getPlaceholder().trigger("plotselecting",[null])}return false}function g(){if(!f()){return null}var u={},t=p.first,s=p.second;a.each(k.getAxes(),function(v,w){if(w.used){var y=w.c2p(t[w.direction]),x=w.c2p(s[w.direction]);u[v]={from:Math.min(y,x),to:Math.max(y,x)}}});return u}function i(){var s=g();k.getPlaceholder().trigger("plotselected",[s]);if(s.xaxis&&s.yaxis){k.getPlaceholder().trigger("selected",[{x1:s.xaxis.from,y1:s.yaxis.from,x2:s.xaxis.to,y2:s.yaxis.to}])}}function h(t,u,s){return us?s:u)}function d(w,t){var v=k.getOptions();var u=k.getPlaceholder().offset();var s=k.getPlotOffset();w.x=h(0,t.pageX-u.left-s.left,k.width());w.y=h(0,t.pageY-u.top-s.top,k.height());if(v.selection.mode=="y"){w.x=w==p.first?0:k.width()}if(v.selection.mode=="x"){w.y=w==p.first?0:k.height()}}function l(s){if(s.pageX==null){return}d(p.second,s);if(f()){p.show=true;k.triggerRedrawOverlay()}else{q(true)}}function q(s){if(p.show){p.show=false;k.triggerRedrawOverlay();if(!s){k.getPlaceholder().trigger("plotunselected",[])}}}function c(s,w){var t,y,z,A,x=k.getAxes();for(var u in x){t=x[u];if(t.direction==w){A=w+t.n+"axis";if(!s[A]&&t.n==1){A=w+"axis"}if(s[A]){y=s[A].from;z=s[A].to;break}}}if(!s[A]){t=w=="x"?k.getXAxes()[0]:k.getYAxes()[0];y=s[w+"1"];z=s[w+"2"]}if(y!=null&&z!=null&&y>z){var v=y;y=z;z=v}return{from:y,to:z,axis:t}}function o(t,s){var v,u,w=k.getOptions();if(w.selection.mode=="y"){p.first.x=0;p.second.x=k.width()}else{u=c(t,"x");p.first.x=u.axis.p2c(u.from);p.second.x=u.axis.p2c(u.to)}if(w.selection.mode=="x"){p.first.y=0;p.second.y=k.height()}else{u=c(t,"y");p.first.y=u.axis.p2c(u.from);p.second.y=u.axis.p2c(u.to)}p.show=true;k.triggerRedrawOverlay();if(!s&&f()){i()}}function f(){var s=5;return Math.abs(p.second.x-p.first.x)>=s&&Math.abs(p.second.y-p.first.y)>=s}k.clearSelection=q;k.setSelection=o;k.getSelection=g;k.hooks.bindEvents.push(function(t,s){var u=t.getOptions();if(u.selection.mode!=null){s.mousemove(e);s.mousedown(n)}});k.hooks.drawOverlay.push(function(v,D){if(p.show&&f()){var t=v.getPlotOffset();var s=v.getOptions();D.save();D.translate(t.left,t.top);var z=a.color.parse(s.selection.color);D.strokeStyle=z.scale("a",0.8).toString();D.lineWidth=1;D.lineJoin="round";D.fillStyle=z.scale("a",0.4).toString();var B=Math.min(p.first.x,p.second.x),A=Math.min(p.first.y,p.second.y),C=Math.abs(p.second.x-p.first.x),u=Math.abs(p.second.y-p.first.y);D.fillRect(B,A,C,u);D.strokeRect(B,A,C,u);D.restore()}});k.hooks.shutdown.push(function(t,s){s.unbind("mousemove",e);s.unbind("mousedown",n);if(r){a(document).unbind("mouseup",r)}})}a.plot.plugins.push({init:b,options:{selection:{mode:null,color:"#e8cfac"}},name:"selection",version:"1.1"})})(jQuery); \ No newline at end of file +/* Flot plugin for selecting regions of a plot. + +Copyright (c) 2007-2013 IOLA and Ole Laursen. +Licensed under the MIT license. + +The plugin supports these options: + +selection: { + mode: null or "x" or "y" or "xy", + color: color, + shape: "round" or "miter" or "bevel", + minSize: number of pixels +} + +Selection support is enabled by setting the mode to one of "x", "y" or "xy". +In "x" mode, the user will only be able to specify the x range, similarly for +"y" mode. For "xy", the selection becomes a rectangle where both ranges can be +specified. "color" is color of the selection (if you need to change the color +later on, you can get to it with plot.getOptions().selection.color). "shape" +is the shape of the corners of the selection. + +"minSize" is the minimum size a selection can be in pixels. This value can +be customized to determine the smallest size a selection can be and still +have the selection rectangle be displayed. When customizing this value, the +fact that it refers to pixels, not axis units must be taken into account. +Thus, for example, if there is a bar graph in time mode with BarWidth set to 1 +minute, setting "minSize" to 1 will not make the minimum selection size 1 +minute, but rather 1 pixel. Note also that setting "minSize" to 0 will prevent +"plotunselected" events from being fired when the user clicks the mouse without +dragging. + +When selection support is enabled, a "plotselected" event will be emitted on +the DOM element you passed into the plot function. The event handler gets a +parameter with the ranges selected on the axes, like this: + + placeholder.bind( "plotselected", function( event, ranges ) { + alert("You selected " + ranges.xaxis.from + " to " + ranges.xaxis.to) + // similar for yaxis - with multiple axes, the extra ones are in + // x2axis, x3axis, ... + }); + +The "plotselected" event is only fired when the user has finished making the +selection. A "plotselecting" event is fired during the process with the same +parameters as the "plotselected" event, in case you want to know what's +happening while it's happening, + +A "plotunselected" event with no arguments is emitted when the user clicks the +mouse to remove the selection. As stated above, setting "minSize" to 0 will +destroy this behavior. + +The plugin allso adds the following methods to the plot object: + +- setSelection( ranges, preventEvent ) + + Set the selection rectangle. The passed in ranges is on the same form as + returned in the "plotselected" event. If the selection mode is "x", you + should put in either an xaxis range, if the mode is "y" you need to put in + an yaxis range and both xaxis and yaxis if the selection mode is "xy", like + this: + + setSelection({ xaxis: { from: 0, to: 10 }, yaxis: { from: 40, to: 60 } }); + + setSelection will trigger the "plotselected" event when called. If you don't + want that to happen, e.g. if you're inside a "plotselected" handler, pass + true as the second parameter. If you are using multiple axes, you can + specify the ranges on any of those, e.g. as x2axis/x3axis/... instead of + xaxis, the plugin picks the first one it sees. + +- clearSelection( preventEvent ) + + Clear the selection rectangle. Pass in true to avoid getting a + "plotunselected" event. + +- getSelection() + + Returns the current selection in the same format as the "plotselected" + event. If there's currently no selection, the function returns null. + +*/(function(e){function t(t){function s(e){n.active&&(h(e),t.getPlaceholder().trigger("plotselecting",[a()]))}function o(t){if(t.which!=1)return;document.body.focus(),document.onselectstart!==undefined&&r.onselectstart==null&&(r.onselectstart=document.onselectstart,document.onselectstart=function(){return!1}),document.ondrag!==undefined&&r.ondrag==null&&(r.ondrag=document.ondrag,document.ondrag=function(){return!1}),c(n.first,t),n.active=!0,i=function(e){u(e)},e(document).one("mouseup",i)}function u(e){return i=null,document.onselectstart!==undefined&&(document.onselectstart=r.onselectstart),document.ondrag!==undefined&&(document.ondrag=r.ondrag),n.active=!1,h(e),m()?f():(t.getPlaceholder().trigger("plotunselected",[]),t.getPlaceholder().trigger("plotselecting",[null])),!1}function a(){if(!m())return null;if(!n.show)return null;var r={},i=n.first,s=n.second;return e.each(t.getAxes(),function(e,t){if(t.used){var n=t.c2p(i[t.direction]),o=t.c2p(s[t.direction]);r[e]={from:Math.min(n,o),to:Math.max(n,o)}}}),r}function f(){var e=a();t.getPlaceholder().trigger("plotselected",[e]),e.xaxis&&e.yaxis&&t.getPlaceholder().trigger("selected",[{x1:e.xaxis.from,y1:e.yaxis.from,x2:e.xaxis.to,y2:e.yaxis.to}])}function l(e,t,n){return tn?n:t}function c(e,r){var i=t.getOptions(),s=t.getPlaceholder().offset(),o=t.getPlotOffset();e.x=l(0,r.pageX-s.left-o.left,t.width()),e.y=l(0,r.pageY-s.top-o.top,t.height()),i.selection.mode=="y"&&(e.x=e==n.first?0:t.width()),i.selection.mode=="x"&&(e.y=e==n.first?0:t.height())}function h(e){if(e.pageX==null)return;c(n.second,e),m()?(n.show=!0,t.triggerRedrawOverlay()):p(!0)}function p(e){n.show&&(n.show=!1,t.triggerRedrawOverlay(),e||t.getPlaceholder().trigger("plotunselected",[]))}function d(e,n){var r,i,s,o,u=t.getAxes();for(var a in u){r=u[a];if(r.direction==n){o=n+r.n+"axis",!e[o]&&r.n==1&&(o=n+"axis");if(e[o]){i=e[o].from,s=e[o].to;break}}}e[o]||(r=n=="x"?t.getXAxes()[0]:t.getYAxes()[0],i=e[n+"1"],s=e[n+"2"]);if(i!=null&&s!=null&&i>s){var f=i;i=s,s=f}return{from:i,to:s,axis:r}}function v(e,r){var i,s,o=t.getOptions();o.selection.mode=="y"?(n.first.x=0,n.second.x=t.width()):(s=d(e,"x"),n.first.x=s.axis.p2c(s.from),n.second.x=s.axis.p2c(s.to)),o.selection.mode=="x"?(n.first.y=0,n.second.y=t.height()):(s=d(e,"y"),n.first.y=s.axis.p2c(s.from),n.second.y=s.axis.p2c(s.to)),n.show=!0,t.triggerRedrawOverlay(),!r&&m()&&f()}function m(){var e=t.getOptions().selection.minSize;return Math.abs(n.second.x-n.first.x)>=e&&Math.abs(n.second.y-n.first.y)>=e}var n={first:{x:-1,y:-1},second:{x:-1,y:-1},show:!1,active:!1},r={},i=null;t.clearSelection=p,t.setSelection=v,t.getSelection=a,t.hooks.bindEvents.push(function(e,t){var n=e.getOptions();n.selection.mode!=null&&(t.mousemove(s),t.mousedown(o))}),t.hooks.drawOverlay.push(function(t,r){if(n.show&&m()){var i=t.getPlotOffset(),s=t.getOptions();r.save(),r.translate(i.left,i.top);var o=e.color.parse(s.selection.color);r.strokeStyle=o.scale("a",.8).toString(),r.lineWidth=1,r.lineJoin=s.selection.shape,r.fillStyle=o.scale("a",.4).toString();var u=Math.min(n.first.x,n.second.x)+.5,a=Math.min(n.first.y,n.second.y)+.5,f=Math.abs(n.second.x-n.first.x)-1,l=Math.abs(n.second.y-n.first.y)-1;r.fillRect(u,a,f,l),r.strokeRect(u,a,f,l),r.restore()}}),t.hooks.shutdown.push(function(t,n){n.unbind("mousemove",s),n.unbind("mousedown",o),i&&e(document).unbind("mouseup",i)})}e.plot.plugins.push({init:t,options:{selection:{mode:null,color:"#e8cfac",shape:"round",minSize:5}},name:"selection",version:"1.1"})})(jQuery); \ No newline at end of file diff --git a/htdocs/includes/jquery/plugins/flot/jquery.flot.stack.js b/htdocs/includes/jquery/plugins/flot/jquery.flot.stack.js old mode 100755 new mode 100644 index a31d5dc9b58..c01de67da1e --- a/htdocs/includes/jquery/plugins/flot/jquery.flot.stack.js +++ b/htdocs/includes/jquery/plugins/flot/jquery.flot.stack.js @@ -1,34 +1,38 @@ -/* -Flot plugin for stacking data sets, i.e. putting them on top of each -other, for accumulative graphs. +/* Flot plugin for stacking data sets rather than overlyaing them. -The plugin assumes the data is sorted on x (or y if stacking -horizontally). For line charts, it is assumed that if a line has an -undefined gap (from a null point), then the line above it should have -the same gap - insert zeros instead of "null" if you want another -behaviour. This also holds for the start and end of the chart. Note -that stacking a mix of positive and negative values in most instances -doesn't make sense (so it looks weird). +Copyright (c) 2007-2013 IOLA and Ole Laursen. +Licensed under the MIT license. -Two or more series are stacked when their "stack" attribute is set to -the same key (which can be any number or string or just "true"). To -specify the default stack, you can set +The plugin assumes the data is sorted on x (or y if stacking horizontally). +For line charts, it is assumed that if a line has an undefined gap (from a +null point), then the line above it should have the same gap - insert zeros +instead of "null" if you want another behaviour. This also holds for the start +and end of the chart. Note that stacking a mix of positive and negative values +in most instances doesn't make sense (so it looks weird). - series: { - stack: null or true or key (number/string) - } +Two or more series are stacked when their "stack" attribute is set to the same +key (which can be any number or string or just "true"). To specify the default +stack, you can set the stack option like this: -or specify it for a specific series + series: { + stack: null/false, true, or a key (number/string) + } - $.plot($("#placeholder"), [{ data: [ ... ], stack: true }]) - -The stacking order is determined by the order of the data series in -the array (later series end up on top of the previous). +You can also specify it for a single series, like this: + + $.plot( $("#placeholder"), [{ + data: [ ... ], + stack: true + }]) + +The stacking order is determined by the order of the data series in the array +(later series end up on top of the previous). + +Internally, the plugin modifies the datapoints in each series, adding an +offset to the y value. For line series, extra data points are inserted through +interpolation. If there's a second y value, it's also adjusted (e.g for bar +charts or filled areas). -Internally, the plugin modifies the datapoints in each series, adding -an offset to the y value. For line series, extra data points are -inserted through interpolation. If there's a second y value, it's also -adjusted (e.g for bar charts or filled areas). */ (function ($) { @@ -38,7 +42,7 @@ adjusted (e.g for bar charts or filled areas). function init(plot) { function findMatchingSeries(s, allseries) { - var res = null + var res = null; for (var i = 0; i < allseries.length; ++i) { if (s == allseries[i]) break; @@ -51,7 +55,7 @@ adjusted (e.g for bar charts or filled areas). } function stackData(plot, s, datapoints) { - if (s.stack == null) + if (s.stack == null || s.stack === false) return; var other = findMatchingSeries(s, plot.getData()); @@ -71,7 +75,7 @@ adjusted (e.g for bar charts or filled areas). fromgap = true, keyOffset = horizontal ? 1 : 0, accumulateOffset = horizontal ? 0 : 1, - i = 0, j = 0, l; + i = 0, j = 0, l, m; while (true) { if (i >= points.length) diff --git a/htdocs/includes/jquery/plugins/flot/jquery.flot.stack.min.js b/htdocs/includes/jquery/plugins/flot/jquery.flot.stack.min.js old mode 100755 new mode 100644 index bba2a0e5ff7..14e9931fe70 --- a/htdocs/includes/jquery/plugins/flot/jquery.flot.stack.min.js +++ b/htdocs/includes/jquery/plugins/flot/jquery.flot.stack.min.js @@ -1 +1,36 @@ -(function(b){var a={series:{stack:null}};function c(f){function d(k,j){var h=null;for(var g=0;g2&&(G?g.format[2].x:g.format[2].y),n=u&&v.lines.steps,E=true,q=G?1:0,H=G?0:1,D=0,B=0,A;while(true){if(D>=F.length){break}A=t.length;if(F[D]==null){for(m=0;m=y.length){if(!u){for(m=0;mJ){if(u&&D>0&&F[D-z]!=null){k=w+(F[D-z+H]-w)*(J-x)/(F[D-z+q]-x);t.push(J);t.push(k+I);for(m=2;m0&&y[B-h]!=null){r=I+(y[B-h+H]-I)*(x-J)/(y[B-h+q]-J)}t[A+H]+=r;D+=z}}E=false;if(A!=t.length&&o){t[A+2]+=r}}}}if(n&&A!=t.length&&A>0&&t[A]!=null&&t[A]!=t[A-z]&&t[A+1]!=t[A-z+1]){for(m=0;m2&&(g?r.format[2].x:r.format[2].y),b=m&&n.lines.steps,w=!0,E=g?1:0,S=g?0:1,x=0,T=0,N,C;for(;;){if(x>=o.length)break;N=f.length;if(o[x]==null){for(C=0;C=a.length){if(!m)for(C=0;Cp){if(m&&x>0&&o[x-s]!=null){h=c+(o[x-s+S]-c)*(p-l)/(o[x-s+E]-l),f.push(p),f.push(h+d);for(C=2;C0&&a[T-u]!=null&&(v=d+(a[T-u+S]-d)*(l-p)/(a[T-u+E]-p)),f[N+S]+=v,x+=s}w=!1,N!=f.length&&y&&(f[N+2]+=v)}if(b&&N!=f.length&&N>0&&f[N]!=null&&f[N]!=f[N-s]&&f[N+1]!=f[N-s+1]){for(C=0;C 0 && origpoints[i - ps] != null) { - var interx = (x - origpoints[i - ps]) / (y - origpoints[i - ps + 1]) * (below - y) + x; + var interx = x + (below - y) * (x - origpoints[i - ps]) / (y - origpoints[i - ps + 1]); prevp.push(interx); prevp.push(below); for (m = 2; m < ps; ++m) @@ -80,24 +96,47 @@ events. p.push(x); p.push(y); + for (m = 2; m < ps; ++m) + p.push(origpoints[i + m]); } datapoints.points = newpoints; thresholded.datapoints.points = threspoints; - if (thresholded.datapoints.points.length > 0) - plot.getData().push(thresholded); + if (thresholded.datapoints.points.length > 0) { + var origIndex = $.inArray(s, plot.getData()); + // Insert newly-generated series right after original one (to prevent it from becoming top-most) + plot.getData().splice(origIndex + 1, 0, thresholded); + } // FIXME: there are probably some edge cases left in bars } - plot.hooks.processDatapoints.push(thresholdData); + function processThresholds(plot, s, datapoints) { + if (!s.threshold) + return; + + if (s.threshold instanceof Array) { + s.threshold.sort(function(a, b) { + return a.below - b.below; + }); + + $(s.threshold).each(function(i, th) { + thresholdData(plot, s, datapoints, th.below, th.color); + }); + } + else { + thresholdData(plot, s, datapoints, s.threshold.below, s.threshold.color); + } + } + + plot.hooks.processDatapoints.push(processThresholds); } $.plot.plugins.push({ init: init, options: options, name: 'threshold', - version: '1.0' + version: '1.2' }); })(jQuery); diff --git a/htdocs/includes/jquery/plugins/flot/jquery.flot.threshold.min.js b/htdocs/includes/jquery/plugins/flot/jquery.flot.threshold.min.js old mode 100755 new mode 100644 index d8b79dfc93c..1ca88a6ce9b --- a/htdocs/includes/jquery/plugins/flot/jquery.flot.threshold.min.js +++ b/htdocs/includes/jquery/plugins/flot/jquery.flot.threshold.min.js @@ -1 +1,43 @@ -(function(B){var A={series:{threshold:null}};function C(D){function E(L,S,M){if(!S.threshold){return }var F=M.pointsize,I,O,N,G,K,H=B.extend({},S);H.datapoints={points:[],pointsize:F};H.label=null;H.color=S.threshold.color;H.threshold=null;H.originSeries=S;H.data=[];var P=S.threshold.below,Q=M.points,R=S.lines.show;threspoints=[];newpoints=[];for(I=0;I0&&Q[I-F]!=null){var J=(O-Q[I-F])/(N-Q[I-F+1])*(P-N)+O;K.push(J);K.push(P);for(m=2;m0){L.getData().push(H)}}D.hooks.processDatapoints.push(E)}B.plot.plugins.push({init:C,options:A,name:"threshold",version:"1.0"})})(jQuery); \ No newline at end of file +/* Flot plugin for thresholding data. + +Copyright (c) 2007-2013 IOLA and Ole Laursen. +Licensed under the MIT license. + +The plugin supports these options: + + series: { + threshold: { + below: number + color: colorspec + } + } + +It can also be applied to a single series, like this: + + $.plot( $("#placeholder"), [{ + data: [ ... ], + threshold: { ... } + }]) + +An array can be passed for multiple thresholding, like this: + + threshold: [{ + below: number1 + color: color1 + },{ + below: number2 + color: color2 + }] + +These multiple threshold objects can be passed in any order since they are +sorted by the processing function. + +The data points below "below" are drawn with the specified color. This makes +it easy to mark points below 0, e.g. for budget data. + +Internally, the plugin works by splitting the data into two series, above and +below the threshold. The extra series below the threshold will have its label +cleared and the special "originSeries" attribute set to the original series. +You may need to check for this in hover events. + +*/(function(e){function n(t){function n(t,n,r,i,s){var o=r.pointsize,u,a,f,l,c,h=e.extend({},n);h.datapoints={points:[],pointsize:o,format:r.format},h.label=null,h.color=s,h.threshold=null,h.originSeries=n,h.data=[];var p=r.points,d=n.lines.show,v=[],m=[],g;for(u=0;u0&&p[u-o]!=null){var y=a+(i-f)*(a-p[u-o])/(f-p[u-o+1]);c.push(y),c.push(i);for(g=2;g0){var b=e.inArray(n,t.getData());t.getData().splice(b+1,0,h)}}function r(t,r,i){if(!r.threshold)return;r.threshold instanceof Array?(r.threshold.sort(function(e,t){return e.below-t.below}),e(r.threshold).each(function(e,o){n(t,r,i,o.below,o.color)})):n(t,r,i,r.threshold.below,r.threshold.color)}t.hooks.processDatapoints.push(r)}var t={series:{threshold:null}};e.plot.plugins.push({init:n,options:t,name:"threshold",version:"1.2"})})(jQuery); \ No newline at end of file diff --git a/htdocs/includes/jquery/plugins/flot/jquery.flot.time.js b/htdocs/includes/jquery/plugins/flot/jquery.flot.time.js new file mode 100644 index 00000000000..15f52815fee --- /dev/null +++ b/htdocs/includes/jquery/plugins/flot/jquery.flot.time.js @@ -0,0 +1,431 @@ +/* Pretty handling of time axes. + +Copyright (c) 2007-2013 IOLA and Ole Laursen. +Licensed under the MIT license. + +Set axis.mode to "time" to enable. See the section "Time series data" in +API.txt for details. + +*/ + +(function($) { + + var options = { + xaxis: { + timezone: null, // "browser" for local to the client or timezone for timezone-js + timeformat: null, // format string to use + twelveHourClock: false, // 12 or 24 time in time mode + monthNames: null // list of names of months + } + }; + + // round to nearby lower multiple of base + + function floorInBase(n, base) { + return base * Math.floor(n / base); + } + + // Returns a string with the date d formatted according to fmt. + // A subset of the Open Group's strftime format is supported. + + function formatDate(d, fmt, monthNames, dayNames) { + + if (typeof d.strftime == "function") { + return d.strftime(fmt); + } + + var leftPad = function(n, pad) { + n = "" + n; + pad = "" + (pad == null ? "0" : pad); + return n.length == 1 ? pad + n : n; + }; + + var r = []; + var escape = false; + var hours = d.getHours(); + var isAM = hours < 12; + + if (monthNames == null) { + monthNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; + } + + if (dayNames == null) { + dayNames = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]; + } + + var hours12; + + if (hours > 12) { + hours12 = hours - 12; + } else if (hours == 0) { + hours12 = 12; + } else { + hours12 = hours; + } + + for (var i = 0; i < fmt.length; ++i) { + + var c = fmt.charAt(i); + + if (escape) { + switch (c) { + case 'a': c = "" + dayNames[d.getDay()]; break; + case 'b': c = "" + monthNames[d.getMonth()]; break; + case 'd': c = leftPad(d.getDate()); break; + case 'e': c = leftPad(d.getDate(), " "); break; + case 'h': // For back-compat with 0.7; remove in 1.0 + case 'H': c = leftPad(hours); break; + case 'I': c = leftPad(hours12); break; + case 'l': c = leftPad(hours12, " "); break; + case 'm': c = leftPad(d.getMonth() + 1); break; + case 'M': c = leftPad(d.getMinutes()); break; + // quarters not in Open Group's strftime specification + case 'q': + c = "" + (Math.floor(d.getMonth() / 3) + 1); break; + case 'S': c = leftPad(d.getSeconds()); break; + case 'y': c = leftPad(d.getFullYear() % 100); break; + case 'Y': c = "" + d.getFullYear(); break; + case 'p': c = (isAM) ? ("" + "am") : ("" + "pm"); break; + case 'P': c = (isAM) ? ("" + "AM") : ("" + "PM"); break; + case 'w': c = "" + d.getDay(); break; + } + r.push(c); + escape = false; + } else { + if (c == "%") { + escape = true; + } else { + r.push(c); + } + } + } + + return r.join(""); + } + + // To have a consistent view of time-based data independent of which time + // zone the client happens to be in we need a date-like object independent + // of time zones. This is done through a wrapper that only calls the UTC + // versions of the accessor methods. + + function makeUtcWrapper(d) { + + function addProxyMethod(sourceObj, sourceMethod, targetObj, targetMethod) { + sourceObj[sourceMethod] = function() { + return targetObj[targetMethod].apply(targetObj, arguments); + }; + }; + + var utc = { + date: d + }; + + // support strftime, if found + + if (d.strftime != undefined) { + addProxyMethod(utc, "strftime", d, "strftime"); + } + + addProxyMethod(utc, "getTime", d, "getTime"); + addProxyMethod(utc, "setTime", d, "setTime"); + + var props = ["Date", "Day", "FullYear", "Hours", "Milliseconds", "Minutes", "Month", "Seconds"]; + + for (var p = 0; p < props.length; p++) { + addProxyMethod(utc, "get" + props[p], d, "getUTC" + props[p]); + addProxyMethod(utc, "set" + props[p], d, "setUTC" + props[p]); + } + + return utc; + }; + + // select time zone strategy. This returns a date-like object tied to the + // desired timezone + + function dateGenerator(ts, opts) { + if (opts.timezone == "browser") { + return new Date(ts); + } else if (!opts.timezone || opts.timezone == "utc") { + return makeUtcWrapper(new Date(ts)); + } else if (typeof timezoneJS != "undefined" && typeof timezoneJS.Date != "undefined") { + var d = new timezoneJS.Date(); + // timezone-js is fickle, so be sure to set the time zone before + // setting the time. + d.setTimezone(opts.timezone); + d.setTime(ts); + return d; + } else { + return makeUtcWrapper(new Date(ts)); + } + } + + // map of app. size of time units in milliseconds + + var timeUnitSize = { + "second": 1000, + "minute": 60 * 1000, + "hour": 60 * 60 * 1000, + "day": 24 * 60 * 60 * 1000, + "month": 30 * 24 * 60 * 60 * 1000, + "quarter": 3 * 30 * 24 * 60 * 60 * 1000, + "year": 365.2425 * 24 * 60 * 60 * 1000 + }; + + // the allowed tick sizes, after 1 year we use + // an integer algorithm + + var baseSpec = [ + [1, "second"], [2, "second"], [5, "second"], [10, "second"], + [30, "second"], + [1, "minute"], [2, "minute"], [5, "minute"], [10, "minute"], + [30, "minute"], + [1, "hour"], [2, "hour"], [4, "hour"], + [8, "hour"], [12, "hour"], + [1, "day"], [2, "day"], [3, "day"], + [0.25, "month"], [0.5, "month"], [1, "month"], + [2, "month"] + ]; + + // we don't know which variant(s) we'll need yet, but generating both is + // cheap + + var specMonths = baseSpec.concat([[3, "month"], [6, "month"], + [1, "year"]]); + var specQuarters = baseSpec.concat([[1, "quarter"], [2, "quarter"], + [1, "year"]]); + + function init(plot) { + plot.hooks.processOptions.push(function (plot, options) { + $.each(plot.getAxes(), function(axisName, axis) { + + var opts = axis.options; + + if (opts.mode == "time") { + axis.tickGenerator = function(axis) { + + var ticks = []; + var d = dateGenerator(axis.min, opts); + var minSize = 0; + + // make quarter use a possibility if quarters are + // mentioned in either of these options + + var spec = (opts.tickSize && opts.tickSize[1] === + "quarter") || + (opts.minTickSize && opts.minTickSize[1] === + "quarter") ? specQuarters : specMonths; + + if (opts.minTickSize != null) { + if (typeof opts.tickSize == "number") { + minSize = opts.tickSize; + } else { + minSize = opts.minTickSize[0] * timeUnitSize[opts.minTickSize[1]]; + } + } + + for (var i = 0; i < spec.length - 1; ++i) { + if (axis.delta < (spec[i][0] * timeUnitSize[spec[i][1]] + + spec[i + 1][0] * timeUnitSize[spec[i + 1][1]]) / 2 + && spec[i][0] * timeUnitSize[spec[i][1]] >= minSize) { + break; + } + } + + var size = spec[i][0]; + var unit = spec[i][1]; + + // special-case the possibility of several years + + if (unit == "year") { + + // if given a minTickSize in years, just use it, + // ensuring that it's an integer + + if (opts.minTickSize != null && opts.minTickSize[1] == "year") { + size = Math.floor(opts.minTickSize[0]); + } else { + + var magn = Math.pow(10, Math.floor(Math.log(axis.delta / timeUnitSize.year) / Math.LN10)); + var norm = (axis.delta / timeUnitSize.year) / magn; + + if (norm < 1.5) { + size = 1; + } else if (norm < 3) { + size = 2; + } else if (norm < 7.5) { + size = 5; + } else { + size = 10; + } + + size *= magn; + } + + // minimum size for years is 1 + + if (size < 1) { + size = 1; + } + } + + axis.tickSize = opts.tickSize || [size, unit]; + var tickSize = axis.tickSize[0]; + unit = axis.tickSize[1]; + + var step = tickSize * timeUnitSize[unit]; + + if (unit == "second") { + d.setSeconds(floorInBase(d.getSeconds(), tickSize)); + } else if (unit == "minute") { + d.setMinutes(floorInBase(d.getMinutes(), tickSize)); + } else if (unit == "hour") { + d.setHours(floorInBase(d.getHours(), tickSize)); + } else if (unit == "month") { + d.setMonth(floorInBase(d.getMonth(), tickSize)); + } else if (unit == "quarter") { + d.setMonth(3 * floorInBase(d.getMonth() / 3, + tickSize)); + } else if (unit == "year") { + d.setFullYear(floorInBase(d.getFullYear(), tickSize)); + } + + // reset smaller components + + d.setMilliseconds(0); + + if (step >= timeUnitSize.minute) { + d.setSeconds(0); + } + if (step >= timeUnitSize.hour) { + d.setMinutes(0); + } + if (step >= timeUnitSize.day) { + d.setHours(0); + } + if (step >= timeUnitSize.day * 4) { + d.setDate(1); + } + if (step >= timeUnitSize.month * 2) { + d.setMonth(floorInBase(d.getMonth(), 3)); + } + if (step >= timeUnitSize.quarter * 2) { + d.setMonth(floorInBase(d.getMonth(), 6)); + } + if (step >= timeUnitSize.year) { + d.setMonth(0); + } + + var carry = 0; + var v = Number.NaN; + var prev; + + do { + + prev = v; + v = d.getTime(); + ticks.push(v); + + if (unit == "month" || unit == "quarter") { + if (tickSize < 1) { + + // a bit complicated - we'll divide the + // month/quarter up but we need to take + // care of fractions so we don't end up in + // the middle of a day + + d.setDate(1); + var start = d.getTime(); + d.setMonth(d.getMonth() + + (unit == "quarter" ? 3 : 1)); + var end = d.getTime(); + d.setTime(v + carry * timeUnitSize.hour + (end - start) * tickSize); + carry = d.getHours(); + d.setHours(0); + } else { + d.setMonth(d.getMonth() + + tickSize * (unit == "quarter" ? 3 : 1)); + } + } else if (unit == "year") { + d.setFullYear(d.getFullYear() + tickSize); + } else { + d.setTime(v + step); + } + } while (v < axis.max && v != prev); + + return ticks; + }; + + axis.tickFormatter = function (v, axis) { + + var d = dateGenerator(v, axis.options); + + // first check global format + + if (opts.timeformat != null) { + return formatDate(d, opts.timeformat, opts.monthNames, opts.dayNames); + } + + // possibly use quarters if quarters are mentioned in + // any of these places + + var useQuarters = (axis.options.tickSize && + axis.options.tickSize[1] == "quarter") || + (axis.options.minTickSize && + axis.options.minTickSize[1] == "quarter"); + + var t = axis.tickSize[0] * timeUnitSize[axis.tickSize[1]]; + var span = axis.max - axis.min; + var suffix = (opts.twelveHourClock) ? " %p" : ""; + var hourCode = (opts.twelveHourClock) ? "%I" : "%H"; + var fmt; + + if (t < timeUnitSize.minute) { + fmt = hourCode + ":%M:%S" + suffix; + } else if (t < timeUnitSize.day) { + if (span < 2 * timeUnitSize.day) { + fmt = hourCode + ":%M" + suffix; + } else { + fmt = "%b %d " + hourCode + ":%M" + suffix; + } + } else if (t < timeUnitSize.month) { + fmt = "%b %d"; + } else if ((useQuarters && t < timeUnitSize.quarter) || + (!useQuarters && t < timeUnitSize.year)) { + if (span < timeUnitSize.year) { + fmt = "%b"; + } else { + fmt = "%b %Y"; + } + } else if (useQuarters && t < timeUnitSize.year) { + if (span < timeUnitSize.year) { + fmt = "Q%q"; + } else { + fmt = "Q%q %Y"; + } + } else { + fmt = "%Y"; + } + + var rt = formatDate(d, fmt, opts.monthNames, opts.dayNames); + + return rt; + }; + } + }); + }); + } + + $.plot.plugins.push({ + init: init, + options: options, + name: 'time', + version: '1.0' + }); + + // Time-axis support used to be in Flot core, which exposed the + // formatDate function on the plot object. Various plugins depend + // on the function, so we need to re-expose it here. + + $.plot.formatDate = formatDate; + +})(jQuery); diff --git a/htdocs/includes/jquery/plugins/flot/jquery.flot.time.min.js b/htdocs/includes/jquery/plugins/flot/jquery.flot.time.min.js new file mode 100644 index 00000000000..21d84772388 --- /dev/null +++ b/htdocs/includes/jquery/plugins/flot/jquery.flot.time.min.js @@ -0,0 +1,9 @@ +/* Pretty handling of time axes. + +Copyright (c) 2007-2013 IOLA and Ole Laursen. +Licensed under the MIT license. + +Set axis.mode to "time" to enable. See the section "Time series data" in +API.txt for details. + +*/(function(e){function n(e,t){return t*Math.floor(e/t)}function r(e,t,n,r){if(typeof e.strftime=="function")return e.strftime(t);var i=function(e,t){return e=""+e,t=""+(t==null?"0":t),e.length==1?t+e:e},s=[],o=!1,u=e.getHours(),a=u<12;n==null&&(n=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]),r==null&&(r=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"]);var f;u>12?f=u-12:u==0?f=12:f=u;for(var l=0;l=u)break;var h=l[c][0],p=l[c][1];if(p=="year"){if(i.minTickSize!=null&&i.minTickSize[1]=="year")h=Math.floor(i.minTickSize[0]);else{var d=Math.pow(10,Math.floor(Math.log(e.delta/o.year)/Math.LN10)),v=e.delta/o.year/d;v<1.5?h=1:v<3?h=2:v<7.5?h=5:h=10,h*=d}h<1&&(h=1)}e.tickSize=i.tickSize||[h,p];var m=e.tickSize[0];p=e.tickSize[1];var g=m*o[p];p=="second"?r.setSeconds(n(r.getSeconds(),m)):p=="minute"?r.setMinutes(n(r.getMinutes(),m)):p=="hour"?r.setHours(n(r.getHours(),m)):p=="month"?r.setMonth(n(r.getMonth(),m)):p=="quarter"?r.setMonth(3*n(r.getMonth()/3,m)):p=="year"&&r.setFullYear(n(r.getFullYear(),m)),r.setMilliseconds(0),g>=o.minute&&r.setSeconds(0),g>=o.hour&&r.setMinutes(0),g>=o.day&&r.setHours(0),g>=o.day*4&&r.setDate(1),g>=o.month*2&&r.setMonth(n(r.getMonth(),3)),g>=o.quarter*2&&r.setMonth(n(r.getMonth(),6)),g>=o.year&&r.setMonth(0);var y=0,b=Number.NaN,w;do{w=b,b=r.getTime(),t.push(b);if(p=="month"||p=="quarter")if(m<1){r.setDate(1);var E=r.getTime();r.setMonth(r.getMonth()+(p=="quarter"?3:1));var S=r.getTime();r.setTime(b+y*o.hour+(S-E)*m),y=r.getHours(),r.setHours(0)}else r.setMonth(r.getMonth()+m*(p=="quarter"?3:1));else p=="year"?r.setFullYear(r.getFullYear()+m):r.setTime(b+g)}while(b Date: Wed, 3 Jul 2013 12:14:37 +0200 Subject: [PATCH 07/48] Trad: Add missing trans before 3.4 final release --- htdocs/langs/ca_ES/admin.lang | 1 + htdocs/langs/ca_ES/bills.lang | 2 + htdocs/langs/ca_ES/boxes.lang | 8 +- htdocs/langs/ca_ES/cashdesk.lang | 4 +- htdocs/langs/ca_ES/errors.lang | 6 + htdocs/langs/ca_ES/install.lang | 24 +- htdocs/langs/ca_ES/mailmanspip.lang | 4 +- htdocs/langs/ca_ES/mails.lang | 12 +- htdocs/langs/ca_ES/main.lang | 7 +- htdocs/langs/ca_ES/margins.lang | 15 +- htdocs/langs/ca_ES/opensurvey.lang | 70 + htdocs/langs/ca_ES/paybox.lang | 5 +- htdocs/langs/ca_ES/paypal.lang | 5 +- htdocs/langs/ca_ES/products.lang | 17 +- htdocs/langs/ca_ES/projects.lang | 3 + htdocs/langs/es_ES/admin.lang | 2789 +++++++++++++-------------- htdocs/langs/es_ES/bills.lang | 2 + htdocs/langs/es_ES/boxes.lang | 8 +- htdocs/langs/es_ES/cashdesk.lang | 4 +- htdocs/langs/es_ES/cron.lang | 1 + htdocs/langs/es_ES/errors.lang | 3 + htdocs/langs/es_ES/install.lang | 24 +- htdocs/langs/es_ES/mailmanspip.lang | 7 +- htdocs/langs/es_ES/mails.lang | 20 +- htdocs/langs/es_ES/main.lang | 5 +- htdocs/langs/es_ES/margins.lang | 14 +- htdocs/langs/es_ES/opensurvey.lang | 6 +- htdocs/langs/es_ES/paybox.lang | 3 + htdocs/langs/es_ES/paypal.lang | 5 +- htdocs/langs/es_ES/products.lang | 15 +- htdocs/langs/es_ES/projects.lang | 3 + 31 files changed, 1591 insertions(+), 1501 deletions(-) create mode 100644 htdocs/langs/ca_ES/opensurvey.lang diff --git a/htdocs/langs/ca_ES/admin.lang b/htdocs/langs/ca_ES/admin.lang index 1843cd985f2..c73fc2e4f26 100644 --- a/htdocs/langs/ca_ES/admin.lang +++ b/htdocs/langs/ca_ES/admin.lang @@ -50,6 +50,7 @@ ConfirmAjax=Utilitzar els popups de confirmació Ajax UseSearchToSelectCompany=Utilitzar un formulari de cerca per buscar tercers (en comptes de llista desplegable)

Tingueu en compte que si té un gran nombre de productes o serveis (> 100 000), pot millorar el rendiment mitjançant la constant SOCIETE_DONOTSEARCH_ANYWHERE a 1 a Configuració-> Varis. La recerca es limitarà llavors a l'inici de la cadena. ActivityStateToSelectCompany=Afegir un filtre en la recerca per mostrar/ocultar els tercers en actiu o que hagin deixat d'exercir UseSearchToSelectContact=Utilitzar un formulari de cerca (en lloc d'una llista desplegable).
Tingueu en compte que si té un gran nombre de contactes (> 100 000), pot millorar el rendiment mitjançant la constant CONTACT_DONOTSEARCH_ANYWHERE a 1 a Configuració-> Diversos. La recerca es limitarà llavors a l'inici de la cadena. +HideClosedThirdpartyComboBox=No mostrar els clients amb estat "Tancat" en els desplegables (o formulari autocompletat) SearchFilter=Opcions filtres de cerca NumberOfKeyToSearch=Nombre de caràcters per a desencadenar la cerca: %s ViewFullDateActions=Veure les dades de les accions en la seva totalitat en la fitxa de tercer diff --git a/htdocs/langs/ca_ES/bills.lang b/htdocs/langs/ca_ES/bills.lang index 3f923cb917d..478da4f90c8 100644 --- a/htdocs/langs/ca_ES/bills.lang +++ b/htdocs/langs/ca_ES/bills.lang @@ -386,6 +386,8 @@ AllCompletelyPayedInvoiceWillBeClosed=Totes les factures amb una resta a pagar 0 ToMakePayment=Pagar ToMakePaymentBack=Reemborsar ListOfYourUnpaidInvoices=Llistat de factures impagades +NoteListOfYourUnpaidInvoices=Nota: Aquest llistat inclou només els tercers dels que vostè és comercial. +RevenueStamp=Timbre fiscal ##### Types de contacts ##### TypeContact_facture_internal_SALESREPFOLL=Responsable seguiment factura a client TypeContact_facture_external_BILLING=Contacte client facturació diff --git a/htdocs/langs/ca_ES/boxes.lang b/htdocs/langs/ca_ES/boxes.lang index 029fcb2a189..b3bf6593a99 100644 --- a/htdocs/langs/ca_ES/boxes.lang +++ b/htdocs/langs/ca_ES/boxes.lang @@ -2,8 +2,8 @@ CHARSET=UTF-8 BoxLastRssInfos=Fils d'informació RSS BoxLastProducts=Els %s últims productes/serveis -BoxLastProductsInContract=Els %s últims productes/serveis contractats BoxProductsAlertStock=Productes en alerta d'estoc +BoxLastProductsInContract=Els %s últims productes/serveis contractats BoxLastSupplierBills=Últimes factures de proveïdors BoxLastCustomerBills=Últimes factures a clients BoxOldestUnpaidCustomerBills=Factures a clients més antigues pendents de pagament @@ -56,7 +56,6 @@ BoxTitleLastActionsToDo=Les %s últims esdeveniments a realitzar BoxTitleLastContracts=Els %s últims contractes BoxTitleLastModifiedDonations=Les %s últimes donacions modificades BoxTitleLastModifiedExpenses=Els %s últims honoraris modificats -BoxTitleLatestSupplierOrders=Les %s últimes comandes a proveïdors BoxGlobalActivity=Activitat global FailedToRefreshDataInfoNotUpToDate=Error en el refresc del flux RSS. Data de l'últim refresc :%s LastRefreshDate=Data darrera actualització @@ -77,4 +76,9 @@ NoRecordedProspects=Sense clients potencials registrats NoContractedProducts=Sense productes/serveis contractats NoRecordedContracts=Sense contractes registrats BoxLatestSupplierOrders=Últimes comandes a proveïdors +BoxTitleLatestSupplierOrders=Les %s últimes comandes a proveïdors NoSupplierOrder=Sense comandes a proveïdors +BoxInvoicesPerMonth=Factures per mes +BoxOrdersPerMonth=Comandes per mes +BoxProposalsPerMonth=Pressupostos per mes +NoTooLowStockProducts=Sense productes per sota de l'estoc mínim diff --git a/htdocs/langs/ca_ES/cashdesk.lang b/htdocs/langs/ca_ES/cashdesk.lang index 88f76b3b8cf..01d38e29878 100644 --- a/htdocs/langs/ca_ES/cashdesk.lang +++ b/htdocs/langs/ca_ES/cashdesk.lang @@ -13,6 +13,7 @@ CashDeskProducts=Productes CashDeskStock=Estoc CashDeskOn=de CashDeskThirdParty=Tercer +CashdeskDashboard=Accés Punt de venda ShoppingCart=Cistella NewSell=Nova venda BackOffice=Back office @@ -35,4 +36,5 @@ CashDeskSetupStock=La configuració decrementa l'estoc en la creació de facture BankToPay=Compte de cobrament ShowCompany=Veure empresa ShowStock=Veure magatzem -DeleteArticle=Feu clic per treure aquest article \ No newline at end of file +DeleteArticle=Feu clic per treure aquest article +FilterRefOrLabelOrBC=Cerca (Ref/Etiq.) \ No newline at end of file diff --git a/htdocs/langs/ca_ES/errors.lang b/htdocs/langs/ca_ES/errors.lang index 74411ee6a34..2e7c33f59b9 100644 --- a/htdocs/langs/ca_ES/errors.lang +++ b/htdocs/langs/ca_ES/errors.lang @@ -60,6 +60,9 @@ ErrorFileSizeTooLarge=La mida del fitxer és massa gran. ErrorSizeTooLongForIntType=Longitud del camp massa llarg per al tipus int (màxim %s xifres) ErrorSizeTooLongForVarcharType=Longitud del camp massa llarg per al tipus cadena (màxim %s xifres) ErrorNoValueForSelectType=Els valors de la llista han de ser indicats +ErrorNoValueForCheckBoxType=Els valors de la llista han de ser indicats +ErrorNoValueForRadioType=Els valors de la llista han de ser indicats +ErrorBadFormatValueList=Els valors de la llista no peudo contenir més d'una coma: %s , però necessita una: clau, valors ErrorFieldCanNotContainSpecialCharacters=El camp %s no ha de contenir caràcters especials ErrorNoAccountancyModuleLoaded=Mòdul de comptabilitat no activat ErrorExportDuplicateProfil=El nom del perfil ja existeix per a aquest lot d'exportació @@ -119,6 +122,8 @@ ErrorFailedToAddToMailmanList=S'ha produït un error en intentar afegir un regis ErrorFailedToRemoveToMailmanList=Error en l'eliminació de %s de la llista Mailmain %s o base SPIP ErrorNewValueCantMatchOldValue=El Nou valor no pot ser igual al antic ErrorFailedToValidatePasswordReset=No s'ha pogut restablir la contrasenya. És possible que aquest enllaç ja s'hagi utilitzat (aquest enllaç només es pot utilitzar una vegada). Si no és el cas prova de reiniciar el procés de restabliment de contrasenya des del principi. +ErrorToConnectToMysqlCheckInstance=Error de connexió amb el servidor de la base de dades. Comprovi que MySQL està funcionant (en la majoria dels casos, pot executar des de la línia d'ordres utilitzant el comandament 'etc sudo /etc/ init.d/mysql start). +ErrorFailedToAddContact=Error en l'addició del contacte ErrorDateMustBeBeforeToday=La data no pot ser superior a avui # Warnings @@ -136,3 +141,4 @@ WarningUntilDirRemoved=Aquesta alerta seguirà activa mentre la carpeta existeix WarningCloseAlways=Avís, el tancament és realitzat encara que la quantitat total difereixi entre els elements d'origen i destí. Activi aquesta funcionalitat amb precaució. WarningUsingThisBoxSlowDown=Atenció, l'ús d'aquest panell provoca serioses alentiments en les pàgines que mostren aquest panell. WarningClickToDialUserSetupNotComplete=La configuració de ClickToDial per al compte d'usuari no està completa (vegeu la pestanya ClickToDial en la seva fitxa d'usuari) +WarningNotRelevant=Operació irrellevant per a aquest conjunt de dades diff --git a/htdocs/langs/ca_ES/install.lang b/htdocs/langs/ca_ES/install.lang index 6cc42fd7674..5da2f4da625 100644 --- a/htdocs/langs/ca_ES/install.lang +++ b/htdocs/langs/ca_ES/install.lang @@ -160,8 +160,9 @@ LinkedElementsInvalidDeleted=han estat eliminats %s enllaços invàlids NothingToDelete=No s'ha trobat enllaços invàlids SourceType=Origen TargetType=Destí -######### -# upgrade= +ShowEditTechnicalParameters=Premi aquí per veure/editar els paràmetres tècnics (mode expert) +#########=undefined= +# upgrade=undefined= MigrationFixData=Correcció de dades desnormalitzades MigrationOrder=Migració de dades de les comandes clients MigrationSupplierOrder=Migració de dades de les comandes a proveïdors @@ -171,58 +172,43 @@ MigrationContract=Migració de dades dels contractes MigrationSuccessfullUpdate=Actualització finalitzada MigrationUpdateFailed=L'actualització ha fallat MigrationRelationshipTables=Migració de les taules de relació (%s) -# Payments Update MigrationPaymentsUpdate=Actualització dels pagaments (vincle nn pagaments-factures) MigrationPaymentsNumberToUpdate=%s pagament(s) a actualitzar MigrationProcessPaymentUpdate=Actualització pagament(s) %s MigrationPaymentsNothingToUpdate=No hi ha més pagaments orfes que hagin de corregir. MigrationPaymentsNothingUpdatable=Cap pagament orfe de correcció. -# Contracts Update MigrationContractsUpdate=Actualització dels contractes sense detalls (gestió del contracte + detall de contracte) MigrationContractsNumberToUpdate=%s contracte(s) a actualitzar MigrationContractsLineCreation=Creació linia contracte per contracte Ref. %s MigrationContractsNothingToUpdate=No hi ha més contractes (vinculats a un producte) sense línies de detalls que hagin de corregir. MigrationContractsFieldDontExist=Els camps fk_facture no existeixen ja. No hi ha operació pendent. -# Contracts Empty Dates Update MigrationContractsEmptyDatesUpdate=Actualització de les dades de contractes no indicades MigrationContractsEmptyDatesUpdateSuccess=Ok per data de contracte MigrationContractsEmptyDatesNothingToUpdate=No hi ha més properes dates de contractes. MigrationContractsEmptyCreationDatesUpdateSuccess=Ok per la data de creació MigrationContractsEmptyCreationDatesNothingToUpdate=No hi ha més properes dates de creació. -# Contracts Invalid Dates Update MigrationContractsInvalidDatesUpdate=Actualització dades contracte incorrectes (per contractes amb detall en servei) MigrationContractsInvalidDateFix=Corregir contracte %s (data contracte=%s, Data posada en servei min=%s) MigrationContractsInvalidDatesNumber=%s contractes modificats MigrationContractsInvalidDatesNothingToUpdate=No hi ha més de contractes que hagin de corregir-se. -# Contracts Incoherent Dates Update MigrationContractsIncoherentCreationDateUpdate=Actualització de les dades de creació de contracte que tenen un valor incoherent MigrationContractsIncoherentCreationDateUpdateSuccess=Ok MigrationContractsIncoherentCreationDateNothingToUpdate=No hi ha més dades de contractes. -# Reopening Contracts MigrationReopeningContracts=Reobertura dels contractes que tenen almenys un servei actiu no tancat MigrationReopenThisContract=Reobertura contracte %s MigrationReopenedContractsNumber=%s contractes modificats MigrationReopeningContractsNothingToUpdate=No hi ha més contractes que hagin de reobrirse. -# Migration transfert MigrationBankTransfertsUpdate=Actualització dels vincles entre registres bancaris i una transferència entre compte MigrationBankTransfertsNothingToUpdate=Cap vincle desfasat -# Migration delivery MigrationShipmentOrderMatching=Actualitzar notes d'expedició MigrationDeliveryOrderMatching=Actualitzar recepcions MigrationDeliveryDetail=Actualitzar recepcions -# Migration stock MigrationStockDetail=Actualitzar valor en stock dels productes -# Migration menus MigrationMenusDetail=Actualització de la taula de menús dinàmics -# Migration delivery address MigrationDeliveryAddress=Actualització de les adreces d'enviament en les notes de lliurament -# Migration project task actors MigrationProjectTaskActors=Migració de la taula llx_projet_task_actors -# Migration project user resp MigrationProjectUserResp=Migració del camp fk_user_resp de llx_projet a llx_element_contact -# Migration project task time MigrationProjectTaskTime=Actualització de temps dedicat en segons -# Migration Acctioncom MigrationActioncommElement=Actualització de les dades de accions sobre elements -# Migration payment mode -MigrationPaymentMode=Actualització de les formes de pagament \ No newline at end of file +MigrationPaymentMode=Actualització de les formes de pagament +MigrationCategorieAssociation=Actualització de les categories diff --git a/htdocs/langs/ca_ES/mailmanspip.lang b/htdocs/langs/ca_ES/mailmanspip.lang index 11d442ca66e..307e4070b7e 100644 --- a/htdocs/langs/ca_ES/mailmanspip.lang +++ b/htdocs/langs/ca_ES/mailmanspip.lang @@ -16,4 +16,6 @@ SPIPTitle=Sistema de gestió de continguts SPIP DescADHERENT_SPIP_SERVEUR=Servidor SPIP DescADHERENT_SPIP_DB=Nom de la base de dades d'SPIP DescADHERENT_SPIP_USER=Usuari de la base de dades d'SPIP -DescADHERENT_SPIP_PASS=Contrasenya de la base de dades d'SPIP \ No newline at end of file +DescADHERENT_SPIP_PASS=Contrasenya de la base de dades d'SPIP +SuccessToAddToMailmanList=Addició de %s a la llista Mailman %s o base SPIP realitzada +SuccessToRemoveToMailmanList=Eliminació de %s de la llista Mailman %s o base SPIP realitzada \ No newline at end of file diff --git a/htdocs/langs/ca_ES/mails.lang b/htdocs/langs/ca_ES/mails.lang index 5a767a07608..5cce34e010a 100644 --- a/htdocs/langs/ca_ES/mails.lang +++ b/htdocs/langs/ca_ES/mails.lang @@ -1,4 +1,4 @@ -# Dolibarr language file - ca_ES - mails +# Dolibarr language file - ca_ES - mails CHARSET=UTF-8 Mailing=E-Mailing EMailing=E-Mailing @@ -44,8 +44,10 @@ MailingStatusSentCompletely=Enviat completament MailingStatusError=Error MailingStatusNotSent=No enviat MailSuccessfulySent=E-mail enviat correctament (de %s a %s) +MailingSuccessfullyValidated=E-mailing validat correctament MailUnsubcribe=Desubscriure Unsuscribe=Desubscriure +MailingStatusNotContact=No contactar ErrorMailRecipientIsEmpty=L'adreça del destinatari és buida WarningNoEMailsAdded=Cap nou e-mail a afegir a la llista destinataris. ConfirmValidMailing=Confirmeu la validació del E-Mailing? @@ -78,12 +80,12 @@ MailtoEMail=mailto email (hyperlink) ActivateCheckRead=Activar confirmació de lectura i opció de Desubscripció ActivateCheckReadKey=Clau usada per xifrar la URL de la confirmació de lectura i la funció de desubscripció EMailSentToNRecipients=E-Mail enviat a %s destinataris. - # Libelle des modules de liste de destinataires mailing== MailingModuleDescContactCompanies=Contactes de tercers (clients potencials, clients, proveïdors ...) MailingModuleDescDolibarrUsers=Usuaris de Dolibarr MailingModuleDescFundationMembers=Membres MailingModuleDescEmailsFromFile=E-Mails d'un arxiu (e-mail;nom;varis) +MailingModuleDescEmailsFromUser=E-mails introduïts per l'usuari (email, cognoms, nom, altres) MailingModuleDescContactsCategories=Tercers (per categoria) MailingModuleDescDolibarrContractsLinesExpired=Tercers amb línies de contractes de serveis expirats MailingModuleDescContactsByCompanyCategory=Contactes de tercers (per categoria de tercers) @@ -112,7 +114,11 @@ NbOfEMailingsReceived=E-Mailings en massa rebuts IdRecord=ID registre DeliveryReceipt=Justificant de recepció YouCanUseCommaSeparatorForSeveralRecipients=Podeu usar el caràcter de separació coma per especificar múltiples destinataris. -# Module Notifications== +TagCheckMail=Seguiment de l'obertura del email +TagUnsubscribe=Link de Desubscripció +TagSignature=Signatura de l'usuari remitent +TagMailtoEmail=Email del destinatario +# Module Notifications Notifications=Notificacions NoNotificationsWillBeSent=Cap notificació per e-mail està prevista per a aquest esdeveniment i empresa ANotificationsWillBeSent=1 notificació serà enviada per e-mail diff --git a/htdocs/langs/ca_ES/main.lang b/htdocs/langs/ca_ES/main.lang index 8459becff3e..2e7d2439208 100644 --- a/htdocs/langs/ca_ES/main.lang +++ b/htdocs/langs/ca_ES/main.lang @@ -1,4 +1,4 @@ -# Dolibarr language file - ca_ES - main +# Dolibarr language file - ca_ES - main CHARSET=UTF-8 DIRECTION=ltr SeparatorDecimal=, @@ -478,6 +478,8 @@ Report=Informe Keyword=Clau Legend=Llegenda FillTownFromZip=Indicar població +Fill=Omplir +Reset=Buidar ShowLog=Veure històric File=Arxiu Files=Arxius @@ -646,8 +648,9 @@ ModulesSystemTools=Mòduls utilitats View=Veure Test=Prova Element=Element +NoPhotoYet=No hi ha fotografia disponible +HomeDashboard=Resum Deductible=Deduïble - # Week day Monday=Dilluns Tuesday=Dimarts diff --git a/htdocs/langs/ca_ES/margins.lang b/htdocs/langs/ca_ES/margins.lang index 7f80518f2ff..1ffa32be402 100644 --- a/htdocs/langs/ca_ES/margins.lang +++ b/htdocs/langs/ca_ES/margins.lang @@ -1,6 +1,5 @@ # Dolibarr language file - ca_ES - margins CHARSET=UTF-8 - Margin=Marge Margins=Marges TotalMargin=Marge total @@ -11,25 +10,19 @@ MarkRate=Marge sobre venda DisplayMarginRates=Mostrar els marges sobre cost DisplayMarkRates=Mostrar els marges sobre venda InputPrice=Introduir un preu - margin=Gestió de marges margesSetup=Configuració de la gestió de marges - MarginDetails=Detalls de marges realitzats - ProductMargins=Marges per producte CustomerMargins=Marges per client AgentMargins=Marges per comercial - ProductService=Producte o servei AllProducts=Tots els productes i serveis ChooseProduct/Service=Trieu el producte o servei CommercialAgent=Agent comercial - StartDate=Data d'inici EndDate=Data de fi Launch=Començar - ForceBuyingPriceIfNull=Forçar el preu de compra si no s'ha indicat ForceBuyingPriceIfNullDetails=Amb "ON", la línia es considera un marge nul (es forçarà el preu de compra amb el preu de venda), amb ("OFF") el marge és igual al preu de venda (preu de compra a 0). MARGIN_METHODE_FOR_DISCOUNT=Mètode de gestió de descomptes globals @@ -37,15 +30,13 @@ UseDiscountAsProduct=Com un producte UseDiscountAsService=Com un servei UseDiscountOnTotal=Sobre el total MARGIN_METHODE_FOR_DISCOUNT_DETAILS=Indica si un descompte global es pren en compte com un producte, servei o només en el total a l'hora de calcular els marges. - MARGIN_TYPE=Tipus de marge gestionat MargeBrute=Marge brut MargeNette=Marge net MARGIN_TYPE_DETAILS=Marge brut: Preu de venda sense IVA - Preu de compra sense IVA
Marge net: Preu de venda sense IVA - Costos - -BuyingCost=Costos +BuyingPrice=Preu de compra +CostPrice=Preu de compra UnitCharges=Càrrega unitària Charges=Càrreges - AgentContactType=Tipus de contacte comissionat -AgentContactTypeDetails=Indica el tipus de contacte enllaçat a les factures que seran associats als agents comercials \ No newline at end of file +AgentContactTypeDetails=Indica el tipus de contacte enllaçat a les factures que seran associats als agents comercials diff --git a/htdocs/langs/ca_ES/opensurvey.lang b/htdocs/langs/ca_ES/opensurvey.lang new file mode 100644 index 00000000000..6353db511fe --- /dev/null +++ b/htdocs/langs/ca_ES/opensurvey.lang @@ -0,0 +1,70 @@ +# Dolibarr language file - ca_ES - opensurvey +CHARSET=UTF-8 +Survey=Enquesta +Surveys=Enquestes +OrganizeYourMeetingEasily=Organitzi les seves reunions i enquestes de forma fàcil. Primer, seleccioneu el tipus d'enquesta ... +NewSurvey=Nova enquesta +NoSurveysInDatabase=%s enquesta(es) a la base de dades. +OpenSurveyArea=Àrea d'enquestes +AddACommentForPoll=Podeu afegir un comentari a l'enquesta... +AddComment=Afegir comentari +CreatePoll=Crear enquesta +PollTitle=Títol de l'enquesta +OpenSurveyYourName=El seu nom +OpenSurveyYourEMail=La seva adreça de correu electrònic +VotersCanModify=Els votants poden modificar el vot d'altres +ToReceiveEMailForEachVote=Per rebre un email per cada vot +TypeDate=Tipus de data +TypeClassic=Tipus estándar +YouAreInPollCreateArea=Està a la secció de creació d'enquestes +FieldMandatory=Camp obligatori +OpenSurveyDesc=Servei online per planificar una cita o elaborar una enquesta de forma fàcil i ràpida +OpenSurveyNoRegistration=SSense registre requerit. +OpenSurveyStep2=Seleccioneu les dates entre els dies lliures (verds). Els dies seleccionats són de color blau. Pot seleccionar un dia prèviament seleccionat fent clic de nou en ell +RemoveAllDays=Eliminar tots els dies +CopyHoursOfFirstDay=Copia hores del primer dia +RemoveAllHours=Eliminar totes les hores +SelectedDays=Dies seleccionats +TheBestChoice=Actualment la millor opció és +TheBestChoices=Actualment les millors opcions són +with=amb +OpenSurveyHowTo=Si està d'acord amb votar en aquesta enquesta, ha de proporcionar el seu nom, triar els valors que més s'adeqüen a vostè (sense prestar atenció a les opcions dels altres votants) i validar amb el botó "més" al final de la línia. +InitiatorOfPoll=Impulsor de l'enquesta +CommentsOfVoters=Comentaris dels votants +ConfirmRemovalOfPoll=Està segur que desitja eliminar aquesta enquesta (i tots els vots) +RemovePoll=Eliminar enquesta +PollManagement=Administració de les enquestes +BackToHoursSetup=Tornar a la configuració d'hores +UrlForSurvey=URL per tenir accés directe a l'enquesta +PollOnChoice=Està creant una enquesta per fer una multiselecció per a una enquesta. Primer doneu tots els possibles per la seva enquesta: +CreateSurveyDate=Crear una enquesta +CreateSurveyStandard=Crear una enquesta estàndard +CheckBox=Checkbox simple +YesNoList=Llista (buit/sí/no) +PourContreList=Llista (buit/a favor/en contra) +AddNewColumn=Afegir nova columna +TitleChoice=Títol de l'opció +InfoAfterCreate=Un cop hagi confirmat la creació de la seva enquesta, passareu automàticament a la pàgina de la seva enquesta.
També rebrà un email amb un enllaç a la seva enquesta per enviar als votants. +ExportSpreadsheet=Exportar resultats a un full de càlcul +ExpireDate=Data límit +NbOfVoters=Núm. de votants +SurveyResults=Resultats +PollAdminDesc=Està autoritzat per canviar totes les línies de l'enquesta amb el botó "Editar". Pot, també, eliminar una columna o una línia amb %s. També podeu afegir una nova columna amb %s. +5MoreChoices=5 opcions més +Abstention=Abstenció +Against=En contra +YouAreInivitedToVote=Està convidat a votar en aquesta enquesta +VoteNameAlreadyExists=Aquest nom ja havia estat usat per a aquesta enquesta +ErrorPollDoesNotExists=Error, l'enquesta %s no existeix. +OpenSurveyNothingToSetup=No hi ha una configuració específica que fer. +PollWillExpire=La seva enquesta expirarà automàticament %s dies després de l'última data de la seva enquesta. +RemovalDate=Data d'eliminació +AddADate=Afegir una data +AddStartHour=Afegir hora d'inici +AddEndHour=Afegir hora de fi +votes=vot(s) +NoCommentYet=Cap comentari ha estat publicat per a aquesta enquesta +CanEditVotes=Podeu canviar el vot d'altres +SelectDayDesc=Per a cada dia seleccionat, pot triar, o no, les hores de reunió en el següent format:
- buit,
- "8h", "8H" o "8:00" per proporcionar una hora d'inici de la reunió,
- "8-11", "8h-11h", "8H-11H" o "8:00-11:00" per proporcionar una hora d'inici i de fi de la reunió,
- "8h15-11h15", "8H15-11H15" or "8:15-11:15" per el mateix però amb minuts. +BackToCurrentMonth=Tornar al mes actual +PublicLinkToCreateSurvey=Enllaç públic que permet a qualsevol crear una enquesta \ No newline at end of file diff --git a/htdocs/langs/ca_ES/paybox.lang b/htdocs/langs/ca_ES/paybox.lang index 4ce699c3e39..1d9c0ab194d 100644 --- a/htdocs/langs/ca_ES/paybox.lang +++ b/htdocs/langs/ca_ES/paybox.lang @@ -32,4 +32,7 @@ PAYBOX_CGI_URL_V2=Url del mòdul CGI Paybox de pagament VendorName=Nom del venedor CSSUrlForPaymentForm=Url del full d'estil CSS per al formulari de pagament MessageOK=Missatge a la pàgina de retorn de pagament confirmat -MessageKO=Missatge a la pàgina de retorn de pagament cancel·lat \ No newline at end of file +MessageKO=Missatge a la pàgina de retorn de pagament cancel·lat +NewPayboxPaymentReceived=Nou pagament Paybox rebut +NewPayboxPaymentFailed=Nou intent de pagament Paybox sense èxit +PAYBOX_PAYONLINE_SENDEMAIL=E-Mail a avisar en cas de pagament (amb èxit o no) \ No newline at end of file diff --git a/htdocs/langs/ca_ES/paypal.lang b/htdocs/langs/ca_ES/paypal.lang index 04932078d79..fb87c383e98 100644 --- a/htdocs/langs/ca_ES/paypal.lang +++ b/htdocs/langs/ca_ES/paypal.lang @@ -15,4 +15,7 @@ ThisIsTransactionId=Identificador de la transacció: %s PAYPAL_ADD_PAYMENT_URL=Afegir la url del pagament Paypal en enviar un document per e-mail PAYPAL_IPN_MAIL_ADDRESS=Adreça e-mail per les notificacions instantànies de pagament (IPN) PredefinedMailContentLink=Podeu fer clic a l'enllaç assegurança de sota per realitzar el seu pagament a través de PayPal\n\n%s\n\n -YouAreCurrentlyInSandboxMode=Actualment es troba en mode "sandbox" \ No newline at end of file +YouAreCurrentlyInSandboxMode=Actualment es troba en mode "sandbox" +NewPaypalPaymentReceived=Nou pagament Paypal rebut +NewPaypalPaymentFailed=Nou intent de pagament Paypal sense èxit +PAYPAL_PAYONLINE_SENDEMAIL=E-Mail a avisar en cas de pagament (amb èxit o no) \ No newline at end of file diff --git a/htdocs/langs/ca_ES/products.lang b/htdocs/langs/ca_ES/products.lang index 7211f09d610..29a9cbf97a7 100644 --- a/htdocs/langs/ca_ES/products.lang +++ b/htdocs/langs/ca_ES/products.lang @@ -91,14 +91,12 @@ AddToOtherBills=Adjuntar a altres factures CorrectStock=Corregir stock AddPhoto=Adjuntar una foto ListOfStockMovements=Llistat de moviments de stock -NoPhotoYet=No hi ha fotografia disponible per el moment BuyingPrice=Preu de compra SupplierCard=Fitxa proveïdor CommercialCard=Fitxa comercial AllWays=Ruta per trobar el seu producte en el stock NoCat=El seu producte no pertany a cap categoria PrimaryWay=Ruta Primaria: -DeleteFromCat=Eliminar de la categoria PriceRemoved=Preu eliminat BarCode=Codi de barra BarcodeType=Tipus de codi de barres @@ -114,6 +112,8 @@ AssociatedProductsAbility=Activar productes compostos AssociatedProducts=Productes compostos AssociatedProductsNumber=Nº de productes que composen aquest producte ParentProductsNumber=Nº de productes que aquest producte compon +IfZeroItIsNotAVirtualProduct=Si 0, aquest producte no és un producte virtual +IfZeroItIsNotUsedByVirtualProduct=Si 0, aquest producte no està sent utilitzat per cap producte virtual EditAssociate=Compondre Translation=Traducció KeywordFilter=Filtre per clau @@ -180,4 +180,15 @@ AddThisServiceCard=Crear fitxa servei HelpAddThisServiceCard=Aquesta opció permet crear o clonar una fitxa de servei en cas que no hi hagi CurrentProductPrice=Preu actual AlwaysUseNewPrice=Utilitzar sempre el preu actual -AlwaysUseFixedPrice=Utilitzar el preu fixat \ No newline at end of file +AlwaysUseFixedPrice=Utilitzar el preu fixat +PriceByQuantity=Preu per quantitat +PriceByQuantityRange=Rang de quantitats +ProductsDashboard=Resum productes/serveis +### composition fabrication +Building=Fabricació +Build=Fabricar +BuildIt=Llançar la fabricació +BuildindListInfo=Nombre de productes manufacturables en magatzem, si s'indica zero no es fabriquen +QtyNeed=Afectat +UnitPmp=Preu Compra Unitari +CostPmpHT=Cost de compra diff --git a/htdocs/langs/ca_ES/projects.lang b/htdocs/langs/ca_ES/projects.lang index 0f6ce75309d..9ee470365a5 100644 --- a/htdocs/langs/ca_ES/projects.lang +++ b/htdocs/langs/ca_ES/projects.lang @@ -106,3 +106,6 @@ TypeContact_project_task_internal_CONTRIBUTOR=Participant TypeContact_project_task_external_CONTRIBUTOR=Participant # Documents models DocumentModelBaleine=Model d'informe de projecte complet (logo...) +SelectElement=Elements vinculables al projecte : +AddElement=Vincular +ProjectReferers=Objectes vinculats diff --git a/htdocs/langs/es_ES/admin.lang b/htdocs/langs/es_ES/admin.lang index 968ca417a49..3a9f4613267 100644 --- a/htdocs/langs/es_ES/admin.lang +++ b/htdocs/langs/es_ES/admin.lang @@ -1,1438 +1,1435 @@ # Dolibarr language file - es_ES - admin -CHARSET=UTF-8 -Version=Versión -VersionProgram=Versión programa -VersionLastInstall=Versión instalación inicial -VersionLastUpgrade=Versión última actualización -VersionExperimental=Experimental -VersionDevelopment=Desarrollo -VersionUnknown=Desconocida -VersionRecommanded=Recomendada -SessionId=Sesión ID -SessionSaveHandler=Modalidad de salvaguardado de sesiones -SessionSavePath=Localización salvaguardado de sesiones -PurgeSessions=Purga de sesiones -ConfirmPurgeSessions=¿Quiere purgar las sesiones? Esto desconectará a todos los usuarios (salvo a usted mismo). -NoSessionListWithThisHandler=El gestor de período de sesiones configurado en su PHP no enumera las sesiones en curso -LockNewSessions=Bloquear conexiones nuevas -ConfirmLockNewSessions=¿Está seguro de querer restringir el acceso a Dolibarr a su usuario? Solamente el login %s podrá conectarse si confirma. -UnlockNewSessions=Eliminar bloqueo de conexiones -YourSession=Su sesión -Sessions=Sesiones de usuarios -WebUserGroup=Servidor web usuario/grupo -NoSessionFound=Parece que su PHP no puede listar las sesiones activas. El directorio de salvaguardado de sesiones (%s) puede estar protegido (por ejemplo, por los permisos del sistema operativo o por la directiva open_basedir de su PHP). -HTMLCharset=Charset de las páginas HTML -DBStoringCharset=Charset base de datos para almacenamiento de datos -DBSortingCharset=Charset base de datos para clasificar los datos -WarningModuleNotActive=Módulo %s no activo -WarningOnlyPermissionOfActivatedModules=Atención, solamente los permisos relacionados con los módulos activados se indican aquí. Puede activar los otros módulos en la página Configuración->Módulos -DolibarrSetup=Instalación/Actualización de Dolibarr -DolibarrUser=Usuario Dolibarr -InternalUser=Usuario interno -ExternalUser=Usuario externo -InternalUsers=Usuarios internos -ExternalUsers=Usuarios externos -GlobalSetup=General -GUISetup=Entorno -SetupArea=Área configuración -FormToTestFileUploadForm=Formulario de prueba de subida de archivo (según opciones elegidas) -IfModuleEnabled=Nota: sólo es eficaz si el módulo %s está activado -RemoveLock=Elimine el archivo %s, si existe, para permitir la utilidad de actualización. -RestoreLock=Sustituir un archivo %s, dándole sólo derechos de lectura a este archivo con el fin de prohibir nuevas actualizaciones. -SecuritySetup=Configuración de la seguridad -ErrorModuleRequirePHPVersion=Error, este módulo requiere una versión %s o superior de PHP -ErrorModuleRequireDolibarrVersion=Error, este módulo requiere una versión %s o superior de Dolibarr -ErrorDecimalLargerThanAreForbidden=Error, las precisiones superiores a %s no están soportadas. -DictionnarySetup=Diccionarios -Dictionnary=Diccionarios -ErrorReservedTypeSystemSystemAuto=El uso del tipo 'system' y 'systemauto' está reservado. Puede utilizar 'user' como valor para añadir su propio registro -ErrorCodeCantContainZero=El código no puede contener el valor 0 -DisableJavascript=Desactivar las funciones Javascript -ConfirmAjax=Utilizar los popups de confirmación Ajax -UseSearchToSelectCompany=Utilizar un formulario de búsqueda para buscar terceros (en vez de lista desplegable)

Tenga en cuenta que si tiene un gran número de productos o servicios (>100 000), puede mejorar el rendimiento mediante la constante SOCIETE_DONOTSEARCH_ANYWHERE a 1 en Configuración->Varios. La búsqueda se limitará entonces al inicio de la cadena. -ActivityStateToSelectCompany=Agregar un filtro en la búsqueda para mostrar/ocultar los terceros en activo o que hayan dejado de ejercer -UseSearchToSelectContact=Utilizar un formulario de búsqueda para buscar contactos (en vez de una lista desplegable).
Tenga en cuenta que si tiene un gran número de contactos (>100 000), puede mejorar el rendimiento mediante la constante CONTACT_DONOTSEARCH_ANYWHERE a 1 en Configuración->Varios. La búsqueda se limitará entonces al inicio de la cadena. -SearchFilter=Opciones filtros de búsqueda -NumberOfKeyToSearch=Nº de caracteres para desencadenar la búsqueda: %s -ViewFullDateActions=Ver las fechas de las acciones en su totalidad en la ficha de tercero -NotAvailableWhenAjaxDisabled=No disponible cuando Ajax esté desactivado -JavascriptDisabled=Javascript desactivado -UsePopupCalendar=Utilizar popups para la introducción de las fechas -UsePreviewTabs=Ver fichas "vista previa" -ShowPreview=Ver vista previa -PreviewNotAvailable=Vista previa no disponible -ThemeCurrentlyActive=Tema actualmente activo -CurrentTimeZone=Zona horaria PHP (Servidor) -Space=Área -Fields=Campos -Mask=Máscara -NextValue=Próximo valor -NextValueForInvoices=Próximo valor (facturas) -NextValueForCreditNotes=Próximo valor (notas de entrega) -MustBeLowerThanPHPLimit=Observación: Su PHP limita el tamaño a %s %s de máximo, cualquiera que sea el valor de este parámetro -NoMaxSizeByPHPLimit=Ninguna limitación interna en su servidor PHP -MaxSizeForUploadedFiles=Tamaño máximo de los documentos a subir (0 para prohibir la subida) -UseCaptchaCode=Utilización de código gráfico (CAPTCHA) en el login -UseAvToScanUploadedFiles=Utilización de un antivirus para escanear los archivos subidos -AntiVirusCommand=Ruta completa hacia el comando antivirus -AntiVirusCommandExample=Ejemplo para ClamWin: c:\Program Files (x86)\ClamWin\bin\clamscan.exe
Ejemplo para ClamAv: /usr/bin/clamscan -AntiVirusParam=Parámetros complementarios en la línea de comandos -AntiVirusParamExample=Ejemplo para ClamWin: --database="C:\Program Files (x86)\ClamWin\lib" -ComptaSetup=Configuración del módulo Contabilidad -UserSetup=Configuración gestión de los usuarios -MenuSetup=Administración de los menús por base de datos -MenuLimits=Límites y precisión -MenuIdParent=Id del menú padre -DetailMenuIdParent=ID del menú padre (vacío para un menú superior) -DetailPosition=Número de orden para la posición del menú -PersonalizedMenusNotSupported=Menús personalizados no generados -AllMenus=Todos -NotConfigured=No configurado -Setup=Configuración -Activation=Activación -Active=Activo -SetupShort=Config. -OtherOptions=Otras opciones -OtherSetup=Varios -CurrentValueSeparatorDecimal=Separador decimal -CurrentValueSeparatorThousand=Separador miles -Modules=Módulos -ModulesCommon=Módulos principales -ModulesOther=Módulos complementarios -ModulesInterfaces=Módulos interfaz -ModulesSpecial=Módulos específicos -ParameterInDolibarr=Variable %s -LanguageParameter=Variable idioma %s -LanguageBrowserParameter=Variable %s -LocalisationDolibarrParameters=Parámetros de localización -ClientTZ=Zona horaria Cliente (usuario) -ClientHour=Hora cliente (usuario) -OSTZ=Zona horaria -PHPTZ=Zona horaria PHP -PHPServerOffsetWithGreenwich=Offset servidor con Greenwich (segundos) -ClientOffsetWithGreenwich=Offset cliente/navegador con Greenwich (segundos) -DaylingSavingTime=Horario de verano (usuario) -CurrentHour=Hora PHP (servidor) -CompanyTZ=Zona Horaria empresa (sede central) -CompanyHour=Hora empresa (sede central) -CurrentSessionTimeOut=Timeout sesión actual -OSEnv=Entorno SO -Box=Panel -Boxes=Paneles -MaxNbOfLinesForBoxes=Nº de líneas máximo para los paneles -PositionByDefault=Posición por defecto -Position=Orden -MenusDesc=Los gestores de menú definen el contenido de las 2 barras de menús (la barra horizontal y la barra vertical). Es posible asignar gestores diferentes según el usuario sea interno o externo. -MenusEditorDesc=El editor de menús permite definir entradas personalizadas en los menús. Debe utilizarse con prudencia so pena de poner a Dolibarr en una situación inestable siendo necesaria una reinstalación para encontrar un menú coherente. -MenuForUsers=Menú para los usuarios -LangFile=Archivo .lang -System=Sistema -SystemInfo=Info. sistema -SystemTools=Utilidades sistema -SystemToolsArea=Área utilidades del sistema -SystemToolsAreaDesc=Esta área ofrece distintas funciones de administración. Utilice la menú para elegir la funcionalidad buscada. -PurgeAreaDesc=Esta página le permite eliminar todos los archivos creados o guardados por Dolibarr (archivos temporales o todos los archivos del directorio %s). El uso de esta función no es necesaria. Se proporciona para los usuarios que albergan a Dolibarr en un servidor que no ofrece los permisos de eliminación de archivos salvaguardados por el servidor Web. -PurgeDeleteLogFile=Borrar el archivo log %s definido por el módulo Syslog (no hay riesgo de pérdida de datos) -PurgeDeleteTemporaryFiles=Eliminar todos los archivos temporales (sin riesgo de perdida de datos) -PurgeDeleteAllFilesInDocumentsDir=Eliminar todos los archivos del directorio %s. Archivos temporales y archivos adjuntados a elementos (terceros, facturas, etc.) serán eliminados. -PurgeRunNow=Purgar -PurgeNothingToDelete=Ningún directorio a eliminar -PurgeNDirectoriesDeleted=%s archivos o directorios eliminados -PurgeAuditEvents=Purgar los eventos de seguridad -ConfirmPurgeAuditEvents=¿Está seguro de querer purgar la lista de los eventos de auditoría de seguridad (Se borrará toda la lista, pero esto no afecta a sus datos)? -NewBackup=Nueva copia de seguridad -GenerateBackup=Generar copia de seguridad -Backup=Copia de seguridad -Restore=Restauración -RunCommandSummary=La copia será realizada por el comando siguiente -RunCommandSummaryToLaunch=La copia puede ser realizada por el comando siguiente -WebServerMustHavePermissionForCommand=Su servidor Web debe tener los derechos de ejecutar tal orden -BackupResult=Resultado de la copia -BackupFileSuccessfullyCreated=Archivo de copia generado correctamente -YouCanDownloadBackupFile=Los archivos generados pueden ahora descargarse -NoBackupFileAvailable=Ninguna copia disponible -ExportMethod=Método de exportación -ImportMethod=Método de importación -ToBuildBackupFileClickHere=Para crear una copia, haga click aquí. -ImportMySqlDesc=Para importar una copia, hay que utilizar el comando mysql en linea siguiente: -ImportPostgreSqlDesc=Para importar una copia de seguridad, debe usar el comando pg_restore desde la línea de comandos: -ImportMySqlCommand=%s %s < miarchivobackup.sql -ImportPostgreSqlCommand=%s %s miarchivobackup.sql -FileNameToGenerate=Nombre del archivo a generar -CommandsToDisableForeignKeysForImport=Comando para desactivar las claves excluyentes a la importación -CommandsToDisableForeignKeysForImportWarning=Obligatorio si quiere poder restaurar más tarde el dump SQL -ExportCompatibility=Compatibilidad del archivo de exportación generado -MySqlExportParameters=Parámetros de la exportación MySql -PostgreSqlExportParameters=Parámetros de la exportación PostgreSQL -UseTransactionnalMode=Utilizar el modo transaccional -FullPathToMysqldumpCommand=Ruta completa del comando mysqldump -FullPathToPostgreSQLdumpCommand=ruta completa hacia el comando pg_dump -ExportOptions=Opciones de exportación -AddDropDatabase=Añadir órdenes DROP DATABASE -AddDropTable=Añadir órdenes DROP TABLE -ExportStructure=Estructura -Datas=Datos -NameColumn=Nombre las columnas -ExtendedInsert=Instrucciones INSERT extendidas -NoLockBeforeInsert=Sin instrucción LOCK antes del INSERT -DelayedInsert=Inserciones con retraso -EncodeBinariesInHexa=Codificar los campos binarios en hexadecimal -IgnoreDuplicateRecords=Ignorar los errores de duplicación (INSERT IGNORE) -Yes=Sí -No=No -AutoDetectLang=Autodetección (navegador) -FeatureDisabledInDemo=Opción deshabilitada en demo -Rights=Permisos -BoxesDesc=Los paneles son pequeñas zonas de información que se muestran en algunas páginas. Puede elegir activar o desactivar un panel haciendo clic en 'Activar', o haciendo click en el cubo de basura para desactivarlo. Solo se muestran los paneles relacionados con un módulo activo. -OnlyActiveElementsAreShown=Sólo los elementos de módulos activados son mostrados. -ModulesDesc=Los módulos Dolibarr definen las funcionalidades disponibles en la aplicación. Algunos módulos requieren permisos que deberán indicarse a los usuarios para que puedan acceder a sus funcionalidades. -ModulesInterfaceDesc=Los módulos de interfaz son módulos que permiten vincular a Dolibarr con sistemas, aplicaciones o servicios externos. -ModulesSpecialDesc=Los módulos complementarios son módulos de uso muy específico o menos corriente que los módulos normales. -ModulesJobDesc=Los módulos específicos permiten una preconfiguración simplificada de Dolibarr para un negocio en concreto. -ModulesMarketPlaceDesc=Hay disponibles para su descarga en sitios externos otros módulos/extensiones... -ModulesMarketPlaces=Más módulos... -DoliStoreDesc=DoliStore, el sitio oficial de módulos complementarios y para Dolibarr ERP/CRM -WebSiteDesc=Sitios proveedores a consultar para encontrar más módulos -URL=Enlace -BoxesAvailable=Paneles disponibles -BoxesActivated=Paneles activados -ActivateOn=Activar en -ActiveOn=Activo en -SourceFile=Archivo origen -AutomaticIfJavascriptDisabled=Automático si Javascript está desactivado -AvailableOnlyIfJavascriptNotDisabled=Disponible solamente si Javascript esta activado -AvailableOnlyIfJavascriptAndAjaxNotDisabled=Disponible solamente si Javascript y Ajax están activados -Required=Requerido -Security=Seguridad -Passwords=Contraseñas -DoNotStoreClearPassword=No almacenar la contraseña sin cifrar en la base -MainDbPasswordFileConfEncrypted=Encriptar la contraseña de la base en el archivo conf.php -InstrucToEncodePass=Para tener la contraseña de la base de datos codificada en el archivo de configuración conf.php, reemplazar en ese fichero la línea
$dolibarr_main_db_pass="..."
por
$dolibarr_main_db_pass="crypted:%s" -InstrucToClearPass=Para tener la contraseña de la base de datos descodificada en el archivo de configuración b>conf.php, reemplazar en ese fichero la línea
$dolibarr_main_db_pass="crypted:..."
por
$dolibarr_main_db_pass="%s" -ProtectAndEncryptPdfFiles=Protección y encriptación de los pdf generados -ProtectAndEncryptPdfFilesDesc=La protección de un documento pdf deja el documento libre a la lectura y a la impresión a cualquier lector de PDF. Por el contrario, la modificación y la copia resultan imposibles. -Feature=Función -DolibarrLicense=Licencia -DolibarrProjectLeader=jefe de proyecto -Developpers=Desarrolladores/contribuidores -OtherDeveloppers=Otros desarrolladores/contribuidores -OfficialWebSite=Sitio web oficial internacional -OfficialWebSiteFr=sitio web oficial habla francesa -OfficialWiki=Wiki documentación Dolibarr -OfficialDemo=Demo en línea Dolibarr -OfficialMarketPlace=Sitio oficial de módulos complementarios y extensiones -OfficialWebHostingService=Servicio oficial de alojamiento (SaaS) -ForDocumentationSeeWiki=Para la documentación de usuario, desarrollador o Preguntas Frecuentes (FAQ), consulte el wiki Dolibarr:
%s -ForAnswersSeeForum=Para otras cuestiones o realizar sus propias consultas, puede utilizar el foro Dolibarr:
%s -HelpCenterDesc1=Esta aplicación, independiente de Dolibarr, le permite ayudarle a obtener un servicio de soporte de Dolibarr. -HelpCenterDesc2=Algunos de estos servicios sólo están disponibles en inglés. -CurrentTopMenuHandler=Gestor de menú superior -CurrentLeftMenuHandler=Gestor de menú izquierdo -CurrentMenuHandler=Gestor de menú -CurrentSmartphoneMenuHandler=Gestor menú smartphone actual -MeasuringUnit=Unidad de medida -Emails=E-Mails -EMailsSetup=Configuración E-Mails -EMailsDesc=Esta página permite sustituir los parámetros PHP relacionados con el envío de correos electrónicos. En la mayoría de los casos en SO como UNIX/Linux, los parámetros PHP son ya correctos y esta página es inútil. -MAIN_MAIL_SMTP_PORT=Puerto del servidor SMTP (Por defecto en php.ini: %s) -MAIN_MAIL_SMTP_SERVER=Nombre host o ip del servidor SMTP (Por defecto en php.ini: %s) -MAIN_MAIL_SMTP_PORT_NotAvailableOnLinuxLike=Puerto del servidor SMTP (No definido en PHP en sistemas de tipo Unix) -MAIN_MAIL_SMTP_SERVER_NotAvailableOnLinuxLike=Nombre servidor o ip del servidor SMTP (No definido en PHP en sistemas de tipo Unix) -MAIN_MAIL_EMAIL_FROM=E-Mail del emisor para envíos E-Mail automáticos (Por defecto en php.ini: %s) -MAIN_MAIL_ERRORS_TO=E-Mail usado para los retornos de error de los e-mails enviados -MAIN_MAIL_AUTOCOPY_TO=Enviar automáticamente copia oculta de los e-mails enviados a -MAIN_DISABLE_ALL_MAILS=Desactivar globalmente todo envío de correos electrónicos (para modo de pruebas o demo) -MAIN_MAIL_SENDMODE=Método de envío de e-mails -MAIN_MAIL_SMTPS_ID=ID de autentificación SMTP si se requiere autenticación SMTP -MAIN_MAIL_SMTPS_PW=Contraseña autentificación SMTP si se requiere autentificación SMTP -MAIN_MAIL_EMAIL_TLS=Uso de encriptación TLS (SSL) -MAIN_DISABLE_ALL_SMS=Desactivar globalmente todo envío de SMS (para modo de pruebas o demo) -MAIN_SMS_SENDMODE=Método de envío de SMS -MAIN_MAIL_SMS_FROM=Número de teléfono por defecto para los envíos SMS -FeatureNotAvailableOnLinux=Funcionalidad no disponible en sistemas Unix. Pruebe su sendmail localmente. -SubmitTranslation=Si la traducción de este idioma es incompleta o si encuentra errores, puede corregirlos mediante la edición de los archivos en el directorio langs/%s y envíe los cambios al foro www.dolibarr.es. -ModuleSetup=Configuración del módulo -ModulesSetup=Configuración de los módulos -ModuleFamilyBase=Sistema -ModuleFamilyCrm=Gestión cliente (CRM) -ModuleFamilyProducts=Gestión productos -ModuleFamilyHr=Recursos Humanos -ModuleFamilyProjects=Proyectos/Trabajo cooperativo -ModuleFamilyOther=Otro -ModuleFamilyTechnic=Módulos herramientas o Sistema -ModuleFamilyExperimental=Módulos experimentales -ModuleFamilyFinancial=Módulos financieros (Contabilidad/tesorería) -ModuleFamilyECM=Gestión Electrónica de Documentos (GED) -MenuHandlers=Gestores menú -MenuAdmin=Editor menú -DoNotUseInProduction=No usar en producción -ThisIsProcessToFollow=He aquí el procedimiento a seguir: -StepNb=Paso %s -FindPackageFromWebSite=Buscar el paquete que responde a su necesidad (por ejemplo en el sitio web %s) -DownloadPackageFromWebSite=Descargar el paquete desde el sitio %s. -UnpackPackageInDolibarrRoot=Descomprimir el paquete en el directorio raíz de Dolibarr %s sobre los archivos existentes (sin desplazar o borrar los existentes, so pena de perder su configuración o los módulos no oficiales instalados) -SetupIsReadyForUse=La instalación ha finalizado y Dolibarr está disponible con el nuevo componente. -NotExistsDirect=No existe el directorio alternativo.
-InfDirAlt=Desde la versión 3 es posible definir un directorio root alternativo, esto le permite almacenar en el mismo lugar módulos y temas personalizados.
Basta con crear un directorio en el raíz de Dolibarr (por ejemplo: custom).
-InfDirExample=
Seguidamente se declara en el archivo conf.php:
$dolibarr_main_url_root_alt='http://miservidor/custom'
$dolibarr_main_document_root_alt='/directorio/de/dolibarr/htdocs/custom'
*Estas lineas vienen comentadas con un "#", para descomentarlas solo hay que retirar el caracter. -YouCanSubmitFile=Seleccione paquete: -CurrentVersion=Versión actual de Dolibarr -CallUpdatePage=Llamar a la página de actualización de la estructura y datos de la base de datos %s. -LastStableVersion=Última versión estable disponible -GenericMaskCodes=Puede introducir cualquier máscara numérica. En esta máscara, puede utilizar las siguientes etiquetas:
{000000} corresponde a un número que se incrementa en cada uno de %s. Introduzca tantos ceros como longitud desee mostrar. El contador se completará a partir de ceros por la izquierda con el fin de tener tantos ceros como la máscara.
{000000+000} Igual que el anterior, con una compensación correspondiente al número a la derecha del signo + se aplica a partir del primer %s.
{000000@x} igual que el anterior, pero el contador se restablece a cero cuando se llega a x meses (x entre 1 y 12). Si esta opción se utiliza y x es de 2 o superior, entonces la secuencia {yy}{mm} o {yyyy}{mm} también es necesaria.
{dd} días (01 a 31).
{mm} mes (01 a 12).
{yy}, {yyyy} ou {y} año en 2, 4 ó 1 cifra.
-GenericMaskCodes2={cccc} el código de cliente en n caracteres
{cccc000} el código de cliente en n caracteres es seguido por un contador propio al cliente sin offset, completado con ceros hasta completar la máscara, y volviendo a cero al mismo tiempo que el contador global.
{tttt}El código del tipo de la empresa en n caracteres (ver diccionarios-tipos de empresas).
-GenericMaskCodes3=Cualquier otro carácter en la máscara se quedará sin cambios.
No se permiten espacios
-GenericMaskCodes4a=Ejemplo en la 99 ª %s del tercero La Empresa realizada el 31/03/2007:
-GenericMaskCodes4b=Ejemplo sobre un tercero creado el 31/03/2007:
-GenericMaskCodes4c=Ejemplo en un producto/servicio creado el 31/03/2007:
-GenericMaskCodes5=ABC{yy}{mm}-{000000} dará ABC0703-000099
{0000+100@1}-XXX/{dd}/YYY daráa 0199-XXX/31/YYY -GenericNumRefModelDesc=Devuelve un número creado acorde a una máscara definida. -ServerAvailableOnIPOrPort=Servidor disponible en la dirección %s en el puerto %s -ServerNotAvailableOnIPOrPort=Servidor no disponible en la dirección %s en el puerto %s -DoTestServerAvailability=Probar conectividad con el servidor -DoTestSend=Probar envío -DoTestSendHTML=Probar envío HTML -ErrorCantUseRazInStartedYearIfNoYearMonthInMask=Error, no se puede usar la opción @ si la secuencia {yy}{mm} o {yyyy}{mm} no se encuentra en la máscara. -UMask=Parámetro UMask de nuevos archivos en Unix/Linux/BSD. -UMaskExplanation=Este parámetro determina los derechos de los archivos creados en el servidor Dolibarr (durante la subida, por ejemplo).
Este debe ser el valor octal (por ejemplo, 0666 significa lectura / escritura para todos).
Este parámetro no tiene ningún efecto sobre un servidor Windows. -SeeWikiForAllTeam=Vea el wiki para más detalles de todos los actores y de su organización -UseACacheDelay=Demora en caché de la exportación en segundos (0 o vacio sin caché) -DisableLinkToHelpCenter=Ocultar el enlace "¿Necesita soporte o ayuda?" en la página de login -DisableLinkToHelp=Ocultar el enlace "%s Ayuda en línea" del menú izquierdo -AddCRIfTooLong=No hay líneas de corte automático, de modo que si el texto es demasiado largo en los documentos, debe agregar sus propios retornos de carro en el texto mecanografiado. -ModuleDisabled=Módulo desactivado -ModuleDisabledSoNoEvent=Módulo desactivado, por lo que evento nunca se crea -ConfirmPurge=¿Está seguro de querer realizar esta purga?
Esto borrará definitivamente todos los datos de sus archivos (área GED, archivos adjuntos etc.). -MinLength=Longuitud mínima -LanguageFilesCachedIntoShmopSharedMemory=archivos .lang en memoria compartida -ExamplesWithCurrentSetup=Ejemplos con la configuración activa actual -ListOfDirectories=Listado de directorios de plantillas OpenDocument -ListOfDirectoriesForModelGenODT=Listado de directorios con plantillas de documentos OpenDocument.

Indicar la ruta completa del directorio.
Añadir un retorno a la línea entre cada directorio.Para indicar un directorio del módulo GED, indicar DOL_DATA_ROOT/ecm/nombredeldirectorio.

Los archivos de plantilla de estos directorios deben terminar con .odt -NumberOfModelFilesFound=Número de archivos de plantillas ODT encontrados en este/estos directorio(s) -ExampleOfDirectoriesForModelGen=Ejemplos de sintaxis:
c:\mydir
/home/mydir
DOL_DATA_ROOT/ecm/ecmdir -FollowingSubstitutionKeysCanBeUsed=Colocando los siguientes tags en la plantilla, obtendrá una sustitución con el valor personalizado al generar el documento: -FullListOnOnlineDocumentation=http://wiki.dolibarr.org/index.php/Crear_un_modelo_de_documento_ODT -FirstnameNamePosition=Orden visualización nombre/apellidos -DescWeather=Los siguientes gráficos se mostrarán en el panel si el número de elementos llegan a estos valores: -KeyForWebServicesAccess=Clave para usar los Web Services (parámetro "dolibarrkey" en webservices) -TestSubmitForm=Formulario de pruebas -ThisForceAlsoTheme=Usar este gestor de menús predetermina también el tema, sea cual sea la elección del usuario. Además, este gestor de menús, especial para smartphones, solamente funciona en algunos teléfonos. Use otro gestor si observa cualquier problema. -ThemeDir=Directorio de los temas -ConnectionTimeout=Timeout de conexión -ResponseTimeout=Timeout de respuesta -SmsTestMessage=Mensaje de prueba de __PHONEFROM__ para __PHONETO__ -ModuleMustBeEnabledFirst=Para usar esta función debe estar activado el módulo %s. -SecurityToken=Clave para encriptar urls -NoSmsEngine=No hay disponible ningún gestor de envío de SMS. Los gestores de envío de SMS no se instalan por defecto ya que dependen de cada proveedor, sin embargo puede encontrarlos en la plataforma %s. -PDF=PDF -PDFDesc=Puede definir aquí las opciones globales para la generación de los PDF -PDFAddressForging=Reglas de visualización de direcciones -HideAnyVATInformationOnPDF=Ocultar toda la información relacionada con el IVA en la generación de los PDF -HideDescOnPDF=Ocultar descripción de los productos en la generación de los PDF -HideRefOnPDF=Ocultar referencia de los productos en la generación de los PDF -HideDetailsOnPDF=Ocultar detalles de las líneas de productos en la generación de los PDF -Library=Librería -UrlGenerationParameters=Seguridad de las URLs -SecurityTokenIsUnique=¿Usar un parámetro securekey único para cada URL? -EnterRefToBuildUrl=Introduzca la referencia del objeto %s -GetSecuredUrl=Obtener la URL calculada -ButtonHideUnauthorized=Ocultar los botones de acciones no autorizadas en vez de mostrarlos atenuados -TotalNumberOfActivatedModules=Número total de módulos activados: %s -YouMustEnableOneModule=Debe activar al menos un módulo. -ProductVatMassChange=Modificar IVA en masa -ProductVatMassChangeDesc=Esta página le permite cambiar el tipo de IVA definido en los productos o servicios de un valor a otro. Tenga en cuenta que el cambio se lleva a cabo en masa sobre toda la base de datos. -OldVATRates=Tasa de IVA antigua -NewVATRates=Tasa de IVA nueva -PriceBaseTypeToChange=Cambiar el precio cuya referencia de base es -MassConvert=Convertir masivamente -String=Cadena de texto -TextLong=Texto largo -Int=Numérico entero -Float=Decimal -DateAndTime=Fecha y hora -Unique=Único -Boolean=Boleano (Casilla de verificación) -ExtrafieldPhone=Teléfono -ExtrafieldPrice=Precio -ExtrafieldMail=Correo -ExtrafieldSelect=Lista de selección -ExtrafieldSelectList=Lista de selección de tabla -ExtrafieldSeparator=Separador -ExtrafieldCheckBox=Casilla de verificación -ExtrafieldRadio=Botón de selección excluyente -ExtrafieldParamHelpselect=La lista ha de ser en forma llave, valor

por ejemplo :
1,text1
2,text2
3,text3
... -ExtrafieldParamHelpcheckbox=La lista ha de ser en forma llave, valor

por ejemplo :
1,text1
2,text2
3,text3
... -ExtrafieldParamHelpradio=La lista ha de ser en forma llave, valor

por ejemplo :
1,text1
2,text2
3,text3
... -ExtrafieldParamHelpsellist=La lista ha de ser de la tabl

por ejemplo:
table:label:(code)
-LibraryToBuildPDF=Librería usada para la creación de archivos PDF -WarningUsingFPDF=Atención: Su archivo conf.php contiene la directiva dolibarr_pdf_force_fpdf=1. Esto hace que se use la librería FPDF para generar sus archivos PDF. Esta librería es antigua y no cubre algunas funcionalidades (Unicode, transparencia de imágenes, idiomas cirílicos, árabes o asiáticos, etc.), por lo que puede tener problemas en la generación de los PDF.
Para resolverlo, y disponer de un soporte completo de PDF, puede descargar la librería TCPDF , y a continuación comentar o eliminar la línea $dolibarr_pdf_force_fpdf=1, y añadir en su lugar $dolibarr_lib_TCPDF_PATH='ruta_a_TCPDF' -LocalTaxDesc=Algunos países aplican 2 o 3 tasas a cada línea de factura. Si es el caso, escoja el tipo de la segunda y tercera tasa y su valor. Los posibles tipos son:
1 : tasa local aplicable a productos y servicios sin IVA (IVA no se aplica en la tasa local)
2 : tasa local se aplica a productos y servicios antes del IVA (IVA se calcula sobre importe+tasa local)
3 : tasa local se aplica a productos sin IVA (IVA no se aplica en la tasa local)
4 : tasa local se aplica a productos antes del IVA (IVA se calcula sobre el importe+tasa local)
5 : tasa local se aplica a servicios sin IVA (IVA no se aplica a la tasa local)
6 : tasa local se aplica a servicios antes del IVA (IVA se calcula sobre importe + tasa local) -SuhosinSessionEncrypt=Almacenamiento de sesiones cifradas por Suhosin -SMS=SMS -LinkToTestClickToDial=Introduzca un número de teléfono al que llamar para probar el enlace de llamada ClickToDial para el usuario %s -RefreshPhoneLink=Refrescar enlace -LinkToTest=Enlace seleccionable para el usuario %s (haga clic en el número para probar) -KeepEmptyToUseDefault=Deje este campo vacío para usar el valor por defecto -DefaultLink=Enlace por defecto -ValueOverwrittenByUserSetup=Atención: Este valor puede ser sobreescrito por un valor específico de la configuración del usuario (cada usuario puede tener su propia url clicktodial) -# Modules= undefined= -Module0Name=Usuarios y grupos -Module0Desc=Gestión de usuarios y grupos -Module1Name=Terceros -Module1Desc=Gestión de terceros (empresas, particulares) y contactos -Module2Name=Comercial -Module2Desc=Gestión comercial -Module10Name=Contabilidad -Module10Desc=Activación de informes simples de contabilidad (diarios, ventas) basados en el contenido de la base de datos. Sin desgloses. -Module20Name=Presupuestos -Module20Desc=Gestión de presupuestos/propuestas comerciales -Module22Name=E-Mailings -Module22Desc=Administración y envío de E-Mails masivos -Module23Name=Energía -Module23Desc=Realiza el seguimiento del consumo de energías -Module25Name=Pedidos de clientes -Module25Desc=Gestión de pedidos de clientes -Module30Name=Facturas y abonos -Module30Desc=Gestión de facturas y abonos a clientes. Gestión facturas de proveedores -Module40Name=Proveedores -Module40Desc=Gestión de proveedores -Module42Name=Syslog -Module42Desc=Generación de logs (archivos, syslog,...) -Module49Name=Editores -Module49Desc=Gestión de editores -Module50Name=Productos -Module50Desc=Gestión de productos -Module51Name=Publipostage -Module51Desc=Administración y envío de correo de papel en masa -Module52Name=Stocks de productos -Module52Desc=Gestión de stocks de productos -Module53Name=Servicios -Module53Desc=Gestión de servicios -Module54Name=Contratos -Module54Desc=Gestión de contratos -Module55Name=Códigos de barras -Module55Desc=Gestión de los códigos de barras -Module56Name=Telefonía -Module56Desc=Gestión de la telefonía -Module57Name=Domiciliaciones -Module57Desc=Gestión de domiciliaciones y reintegros bancarios -Module58Name=ClickToDial -Module58Desc=Integración con ClickToDial -Module59Name=Bookmark4u -Module59Desc=Añade función para generar una cuenta Bookmark4u desde una cuenta Dolibarr -Module70Name=Intervenciones -Module70Desc=Gestión de las intervenciones a terceros -Module75Name=Notas de gasto y desplazamientos -Module75Desc=Gestión de las notas de gasto y desplazamientos -Module80Name=Expediciones -Module80Desc=Gestión de expediciones y recepciones -Module85Name=Bancos y cajas -Module85Desc=Gestión de las cuentas financieras de tipo cuentas bancarias, postales o efectivo -Module100Name=Sitio web externo -Module100Desc=Incluye cualquier sitio web externo en los menús de Dolibarr, viéndolo en un frame -Module105Name=Mailman y SPIP -Module105Desc=Interfaz con Mailman o SPIP para el módulo Miembros -Module200Name=LDAP -Module200Desc=Sincronización con un directorio LDAP -Module210Name=PostNuke -Module210Desc=Integración con PostNuke -Module240Name=Exportaciones de datos -Module240Desc=Herramienta de exportación de datos Dolibarr (con asistente) -Module250Name=Importación de datos -Module250Desc=Herramienta de importación de datos a Dolibarr (con asistente) -Module310Name=Miembros -Module310Desc=Gestión de miembros de una asociación -Module320Name=Hilos RSS -Module320Desc=Adición de hilos de información RSS en las pantallas Dolibarr -Module330Name=Marcadores -Module330Desc=Gestión de marcadores -Module400Name=Proyectos -Module400Desc=Gestión de los proyectos en los otros módulos -Module410Name=Webcalendar -Module410Desc=Interfaz con el calendario Webcalendar -Module500Name=Impuestos, cargas sociales y dividendos -Module500Desc=Gestión de impuestos y cargas sociales -Module600Name=Notificaciones -Module600Desc=Envío de notificaciones (por correo electrónico) sobre los eventos de trabajo Dolibarr -Module700Name=Donaciones -Module700Desc=Gestión de donaciones -Module800Name=OSCommerce 1 -Module800Desc=Interfaz de visualización de una tienda OSCommerce mediante acceso directo a su base de datos -Module900Name=OSCommerce 2 -Module900Desc=Interfaz de visualización de una tienda OSCommerce mediante Web services. Este módulo requiere instalar los archivos de /oscommerce_ws/ws_server en OSCommerce. Lea el archivo README del directorio /oscommerce_ws/ws_server. -Module1200Name=Mantis -Module1200Desc=Interfaz con el sistema de seguimiento de incidencias Mantis -Module1400Name=Contabilidad experta -Module1400Desc=Gestión experta de la contabilidad (doble partida) -Module1780Name=Categorías -Module1780Desc=Gestión de categorías (productos, proveedores y clientes) -Module2000Name=Editor WYSIWYG -Module2000Desc=Permite la edición de ciertas zonas de texto mediante un editor avanzado -Module2300Name=Programador -Module2300Desc=Tareas programadas -Module2400Name=Agenda -Module2400Desc=Gestión de la agenda y de las acciones -Module2500Name=Gestión Electrónica de Documentos -Module2500Desc=Permite administrar una base de documentos -Module2600Name=WebServices -Module2600Desc=Activa los servicios de servidor web services de Dolibarr -Module2650Name=Ultimatepdf -Module2650Desc=Gestión de la presentación de las plantillas pdf (presupuestos, facturas, pedidos, etc.) -Module2700Name=Gravatar -Module2700Desc=Utiliza el servicio en línea de Gravatar (www.gravatar.com) para mostrar fotos de los usuarios/miembros (que se encuentran en sus mensajes de correo electrónico). Necesita un acceso a Internet -Module2800Name=FTP -Module2800Desc=Cliente FTP -Module2900Name=GeoIPMaxmind -Module2900Desc=Capacidades de conversión GeoIP Maxmind -Module5000Name=Multi-empresa -Module5000Desc=Permite gestionar varias empresas -Module6000Name=Workflow -Module6000Desc=Gestión de flujos de trabajo -Module20000Name=Días libres -Module20000Desc=Gestión de los días libres de los empleados -Module50000Name=PayBox -Module50000Desc=Módulo para proporcionar un pago en línea con tarjeta de crédito mediante Paybox -Module50100Name=TPV -Module50100Desc=Terminal Punto de Venta para la venta en mostrador -Module50200Name=Paypal -Module50200Desc=Módulo para proporcionar un pago en línea con tarjeta de crédito mediante Paypal -Module59000Name=Márgenes -Module59000Desc=Módulo para gestionar los márgenes de beneficio -Module60000Name=Comisiones -Module60000Desc=Módulo para gestionar las comisiones de venta -Permission11=Consultar facturas -Permission12=Crear/Modificar facturas -Permission13=De-validar facturas -Permission14=Validar facturas -Permission15=Enviar facturas por correo -Permission16=Emitir pagos de facturas -Permission19=Eliminar facturas -Permission21=Consultar presupuestos -Permission22=Crear/modificar presupuestos -Permission24=Validar presupuestos -Permission25=Enviar los presupuestos -Permission26=Cerrar presupuestos -Permission27=Eliminar presupuestos -Permission28=Exportar los presupuestos -Permission31=Consultar productos -Permission32=Crear/modificar productos -Permission34=Eliminar productos -Permission36=Ver/gestionar los productos ocultos -Permission38=Exportar productos -Permission41=Consultar proyectos y tareas (compartidos o soy contacto) -Permission42=Crear/modificar proyectos y tareas (compartidos o soy contacto) -Permission44=Eliminar proyectos y tareas (compartidos o soy contacto) -Permission61=Consultar intervenciones -Permission62=Crear/modificar intervenciones -Permission64=Eliminar intervenciones -Permission67=Exportar intervenciones -Permission71=Consultar miembros -Permission72=Crear/modificar miembros -Permission74=Eliminar miembros -Permission75=Configurar tipos y atributos de los miembros -Permission76=Exportar miembros -Permission78=Consultar cotizaciones -Permission79=Crear/modificar cotizaciones -Permission81=Consultar pedidos de clientes -Permission82=Crear/modificar pedidos de clientes -Permission84=Validar pedidos de clientes -Permission86=Enviar pedidos de clientes -Permission87=Cerrar pedidos de clientes -Permission88=Anular pedidos de clientes -Permission89=Eliminar pedidos de clientes -Permission91=Consultar impuestos e IVA -Permission92=Crear/modificar impuestos e IVA -Permission93=Eliminar impuestos e IVA -Permission94=Exportar impuestos -Permission95=Consultar balances y resultados -Permission96=Parametrizar desglose -Permission97=Leer líneas de facturas -Permission98=Desglosar líneas de facturas -Permission101=Consultar expediciones -Permission102=Crear/modificar expediciones -Permission104=Validar expediciones -Permission106=Exportar expediciones -Permission109=Eliminar expediciones -Permission111=Consultar cuentas financieras (cuentas bancarias, cajas) -Permission112=Crear/modificar cantidad/eliminar registros bancarios -Permission113=Configurar cuentas financieras (crear, controlar las categorías) -Permission114=Exportar transacciones y registros bancarios -Permission115=Exportar transacciones y extractos -Permission116=Captar transferencias entre cuentas -Permission117=Gestionar envío de cheques -Permission121=Consultar empresas -Permission122=Crear/modificar empresas -Permission125=Eliminar empresas -Permission126=Exportar las empresas -Permission141=Consultar todos los proyectos y tareas (incluyendo los privados de los que no sea contacto) -Permission142=Crear/modificar todos los proyectos y tareas (incluyendo los privados de los que no sea contacto) -Permission144=Eliminar todos los proyectos y tareas (incluyendo los privados de los que no sea contacto) -Permission146=Consultar proveedores -Permission147=Consultar estadísticas -Permission151=Consultar domiciliaciones -Permission152=Crear/modificar domiciliaciones -Permission153=Enviar domiciliaciones -Permission154=Abonar/devolver domiciliaciones -Permission161=Consultar contratos de servicio -Permission162=Crear/modificar contratos de servicio -Permission163=Activar los servicios de un contrato -Permission164=Desactivar los servicios de un contrato -Permission165=Eliminar contratos -Permission171=Leer los desplazamientos -Permission172=Crear/modificar los desplazamientos -Permission173=Eliminar desplazamientos -Permission178=Exportar desplazamientos -Permission180=Consultar proveedores -Permission181=Consultar pedidos a proveedores -Permission182=Crear/modificar pedidos a proveedores -Permission183=Validar pedidos a proveedores -Permission184=Aprobar pedidos a proveedores -Permission185=Enviar pedidos a proveedores -Permission186=Recibir pedidos de proveedores -Permission187=Cerrar pedidos a proveedores -Permission188=Anular pedidos a proveedores -Permission192=Crear líneas -Permission193=Cancelar líneas -Permission194=Consultar el ancho de banda de líneas -Permission202=Crear conexiones ADSL -Permission203=Realizar pedido de conexiones -Permission204=Pedir conexiones -Permission205=Gestionar conexiones -Permission206=Consultar conexiones -Permission211=Consultar telefonía -Permission212=Pedir líneas -Permission213=Activar una línea -Permission214=Configurar la telefonía -Permission215=Configurar proveedores -Permission221=Consultar E-Mails -Permission222=Crear/modificar E-Mails (asunto, destinatarios, etc.) -Permission223=Validar E-Mails (permite el envío) -Permission229=Eliminar E-Mails -Permission237=Ver los destinatarios y la información -Permission238=Enviar los e-mails manualmente -Permission239=Eliminar los e-mails después de su validación o su envío -Permission241=Consultar categorías -Permission242=Crear/modificar categorías -Permission243=Eliminar categorías -Permission244=Ver contenido de categorías ocultas -Permission251=Consultar otros usuarios -PermissionAdvanced251=Consultar otros usuarios -Permission252=Consultar los permisos de otros usuarios -Permission253=Crear/modificar otros usuarios y sus permisos -PermissionAdvanced253=Crear/modificar usuarios internos/externos y sus permisos -Permission254=Modificar la contraseña de otros usuarios -Permission255=Eliminar o desactivar otros usuarios -Permission256=Consultar sus permisos -Permission262=Consultar todas las empresas (Solamente usuarios internos. Los externos están limitados a ellos mismos) -Permission271=Consultar el CA -Permission272=Consultar las facturas -Permission273=Emitir las facturas -Permission281=Consultar contactos -Permission282=Crear/modificar contactos -Permission283=Eliminar contactos -Permission286=Exportar contactos -Permission291=Consultar tarifas -Permission292=Definir permisos sobre las tarifas -Permission293=Modificar tarifas de clientes -Permission300=Consultar códigos de barras -Permission301=Crear/modificar códigos de barras -Permission302=Eliminar código de barras -Permission311=Consultar servicios -Permission312=Asignar servicios a un contrato -Permission331=Consultar marcadores -Permission332=Crear/modificar marcadores -Permission333=Eliminar marcadores -Permission341=Consultar sus propios permisos -Permission342=Crear/modificar su propia info de usuario -Permission343=Modificar su propia contraseña -Permission344=Modificar sus propios permisos -Permission351=Consultar los grupos -Permission352=Consultar los permisos de grupos -Permission353=Crear/modificar los grupos y sus permisos -Permission354=Eliminar o desactivar grupos -Permission358=Exportar usuarios -Permission401=Consultar haberes -Permission402=Crear/modificar haberes -Permission403=Validar haberes -Permission404=Eliminar haberes -Permission531=Consultar servicios -Permission532=Crear/modificar servicios -Permission534=Eliminar servicios -Permission536=Ver/gestionar los servicios ocultos -Permission538=Exportar servicios -Permission701=Consultar donaciones -Permission702=Crear/modificar donaciones -Permission703=Eliminar donaciones -Permission1001=Consultar stocks -Permission1002=Crear/modificar stocks -Permission1003=Eliminar stocks -Permission1004=Consultar movimientos de stock -Permission1005=Crear/modificar movimientos de stock -Permission1101=Consultar órdenes de envío -Permission1102=Crear/modificar órdenes de envío -Permission1104=Validar orden de envío -Permission1109=Eliminar orden de envío -Permission1181=Consultar proveedores -Permission1182=Consultar pedidos a proveedores -Permission1183=Crear pedidos a proveedores -Permission1184=Validar pedidos a proveedores -Permission1185=Aprobar pedidos a proveedores -Permission1186=Enviar pedidos a proveedores -Permission1187=Recibir pedidos de proveedores -Permission1188=Cerrar pedidos a proveedores -Permission1201=Obtener resultado de una exportación -Permission1202=Crear/codificar exportaciones -Permission1231=Consultar facturas de proveedores -Permission1232=Crear facturas de proveedores -Permission1233=Validar facturas de proveedores -Permission1234=Eliminar facturas de proveedores -Permission1235=Enviar facturas de proveedores por correo -Permission1236=Exportar facturas de proveedores, atributos y pagos -Permission1237=Exportar pedidos de proveedores junto con sus detalles -Permission1251=Lanzar las importaciones en masa a la base de datos (carga de datos) -Permission1321=Exportar facturas a clientes, atributos y cobros -Permission1401=Leer el plan contable -Permission1402=Crear/Modificar un plan contable -Permission1403=Cerrar un plan contable -Permission1411=Leer los movimientos contables -Permission1412=Crear/modificar/anular movimientos contables -Permission1415=Leer Balances, informes, diarios, libros maestros -Permission1421=Exportar pedidos de clientes y atributos -Permission23001 = Ver tareas programadas -Permission23002 = Crear/actualizar tareas programadas -Permission23003 = Borrar tareas programadas -Permission23004 = Ejecutar tareas programadas -Permission2401=Leer acciones (eventos o tareas) vinculadas a su cuenta -Permission2402=Crear/eliminar acciones (eventos o tareas) vinculadas a su cuenta -Permission2403=Modificar acciones (eventos o tareas) vinculadas a su cuenta -Permission2411=Leer acciones (eventos o tareas) de otros -Permission2412=Crear/modificar acciones (eventos o tareas) de otros -Permission2413=Eliminar acciones (eventos o tareas) de otros -Permission2501=Consultar/Recuperar documentos -Permission2502=Recuperar documentos -Permission2503=Enviar o eliminar documentos -Permission2515=Configuración directorios de documentos -Permission2801=Utilizar el cliente FTP en modo lectura (sólo explorar y descargar) -Permission2802=Utilizar el cliente FTP en modo escritura (borrar o subir archivos) -Permission50101=Usar TPV -Permission50201=Consultar las transacciones -Permission50202=Importar las transacciones -DictionnaryCompanyType=Tipos de empresa -DictionnaryCompanyJuridicalType=Formas jurídicas -DictionnaryProspectLevel=Perspectiva nivel cliente potencial -DictionnaryCanton=Departamentos/Provincias/Zonas -DictionnaryRegion=Regiones -DictionnaryCountry=Países -DictionnaryCurrency=Monedas -DictionnaryCivility=Títulos de cortesía -DictionnaryActions=Tipos de eventos de la agenda -DictionnarySocialContributions=Tipos de cargas sociales -DictionnaryVAT=Tasa de IVA (Impuesto sobre ventas en EEUU) -DictionnaryRevenueStamp=Importes de sellos fiscales -DictionnaryPaymentConditions=Condiciones de pago -DictionnaryPaymentModes=Modos de pago -DictionnaryTypeContact=Tipos de contactos/direcciones -DictionnaryEcotaxe=Baremos CEcoParticipación (DEEE) -DictionnaryPaperFormat=Formatos de papel -DictionnaryFees=Tipos de desplazamientos y honorarios -DictionnarySendingMethods=Métodos de expedición -DictionnaryStaff=Empleados -DictionnaryAvailability=Tiempos de entrega -DictionnaryOrderMethods=Métodos de pedido -DictionnarySource=Orígenes de presupuestos/pedidos -DictionnaryAccountancyplan=Plan contable -DictionnaryAccountancysystem=Modelos de planes contables -SetupSaved=Configuración guardada -BackToModuleList=Volver a la lista de módulos -BackToDictionnaryList=Volver a la lista de diccionarios -VATReceivedOnly=Impuestos especiales no facturables -VATManagement=Gestión IVA -VATIsUsedDesc=El tipo de IVA propuesto por defecto en las creaciones de presupuestos, facturas, pedidos, etc. Responde a la siguiente regla:
Si el vendedor no está sujeto a IVA, IVA por defecto=0. Final de regla.
Si el país del vendedor= país del comprador entonces IVA por defecto=IVA del producto vendido. Final de regla.
Si vendedor y comprador residen en la Comunidad Europea y el bien vendido= nuevo medio de transportes (auto, barco, avión), IVA por defecto=0 (el IVA debe ser pagado por comprador a la hacienda pública de su país y no al vendedor). Final de regla
Si vendedor y comprador residen en la Comunidad Europea y comprador= particular o empresa sin NIF intracomunitario entonces IVA por defecto=IVA del producto vendido. Final de regla.
Si vendedor y comprador residen en la Comunidad Europea y comprador= empresa con NIF intracomunitario entonces IVA por defecto=0. Final de regla.
Si no, IVA propuesto por defecto=0. Final de regla.
-VATIsNotUsedDesc=El tipo de IVA propuesto por defecto es 0. Este es el caso de asociaciones, particulares o algunas pequeñas sociedades. -VATIsUsedExampleFR=En Francia, se trata de las sociedades u organismos que eligen un régimen fiscal general (General simplificado o General normal), régimen en el cual se declara el IVA. -VATIsNotUsedExampleFR=En Francia, se trata de asociaciones exentas de IVA o sociedades, organismos o profesiones liberales que han elegido el régimen fiscal de módulos (IVA en franquicia), pagando un IVA en franquicia sin hacer declaración de IVA. Esta elección hace aparecer la anotación "IVA no aplicable - art-293B del CGI" en las facturas. +CHARSETUTF-8 +VersionVersión +VersionProgramVersión programa +VersionLastInstallVersión instalación inicial +VersionLastUpgradeVersión última actualización +VersionExperimentalExperimental +VersionDevelopmentDesarrollo +VersionUnknownDesconocida +VersionRecommandedRecomendada +SessionIdSesión ID +SessionSaveHandlerModalidad de salvaguardado de sesiones +SessionSavePathLocalización salvaguardado de sesiones +PurgeSessionsPurga de sesiones +ConfirmPurgeSessions¿Quiere purgar las sesiones? Esto desconectará a todos los usuarios (salvo a usted mismo). +NoSessionListWithThisHandlerEl gestor de período de sesiones configurado en su PHP no enumera las sesiones en curso +LockNewSessionsBloquear conexiones nuevas +ConfirmLockNewSessions¿Está seguro de querer restringir el acceso a Dolibarr a su usuario? Solamente el login %s podrá conectarse si confirma. +UnlockNewSessionsEliminar bloqueo de conexiones +YourSessionSu sesión +SessionsSesiones de usuarios +WebUserGroupServidor web usuario/grupo +NoSessionFoundParece que su PHP no puede listar las sesiones activas. El directorio de salvaguardado de sesiones (%s) puede estar protegido (por ejemplo, por los permisos del sistema operativo o por la directiva open_basedir de su PHP). +HTMLCharsetCharset de las páginas HTML +DBStoringCharsetCharset base de datos para almacenamiento de datos +DBSortingCharsetCharset base de datos para clasificar los datos +WarningModuleNotActiveMódulo %s no activo +WarningOnlyPermissionOfActivatedModulesAtención, solamente los permisos relacionados con los módulos activados se indican aquí. Puede activar los otros módulos en la página Configuración->Módulos +DolibarrSetupInstalación/Actualización de Dolibarr +DolibarrUserUsuario Dolibarr +InternalUserUsuario interno +ExternalUserUsuario externo +InternalUsersUsuarios internos +ExternalUsersUsuarios externos +GlobalSetupGeneral +GUISetupEntorno +SetupAreaÁrea configuración +FormToTestFileUploadFormFormulario de prueba de subida de archivo (según opciones elegidas) +IfModuleEnabledNota: sólo es eficaz si el módulo %s está activado +RemoveLockElimine el archivo %s, si existe, para permitir la utilidad de actualización. +RestoreLockSustituir un archivo %s, dándole sólo derechos de lectura a este archivo con el fin de prohibir nuevas actualizaciones. +SecuritySetupConfiguración de la seguridad +ErrorModuleRequirePHPVersionError, este módulo requiere una versión %s o superior de PHP +ErrorModuleRequireDolibarrVersionError, este módulo requiere una versión %s o superior de Dolibarr +ErrorDecimalLargerThanAreForbiddenError, las precisiones superiores a %s no están soportadas. +DictionnarySetupDiccionarios +DictionnaryDiccionarios +ErrorReservedTypeSystemSystemAutoEl uso del tipo 'system' y 'systemauto' está reservado. Puede utilizar 'user' como valor para añadir su propio registro +ErrorCodeCantContainZeroEl código no puede contener el valor 0 +DisableJavascriptDesactivar las funciones Javascript +ConfirmAjaxUtilizar los popups de confirmación Ajax +UseSearchToSelectCompanyUtilizar un formulario de búsqueda para buscar terceros (en vez de lista desplegable)

Tenga en cuenta que si tiene un gran número de productos o servicios (>100 000), puede mejorar el rendimiento mediante la constante SOCIETE_DONOTSEARCH_ANYWHERE a 1 en Configuración->Varios. La búsqueda se limitará entonces al inicio de la cadena. +ActivityStateToSelectCompanyAgregar un filtro en la búsqueda para mostrar/ocultar los terceros en activo o que hayan dejado de ejercer +UseSearchToSelectContactUtilizar un formulario de búsqueda para buscar contactos (en vez de una lista desplegable).
Tenga en cuenta que si tiene un gran número de contactos (>100 000), puede mejorar el rendimiento mediante la constante CONTACT_DONOTSEARCH_ANYWHERE a 1 en Configuración->Varios. La búsqueda se limitará entonces al inicio de la cadena. +SearchFilterOpciones filtros de búsqueda +NumberOfKeyToSearchNº de caracteres para desencadenar la búsqueda: %s +ViewFullDateActionsVer las fechas de las acciones en su totalidad en la ficha de tercero +NotAvailableWhenAjaxDisabledNo disponible cuando Ajax esté desactivado +JavascriptDisabledJavascript desactivado +UsePopupCalendarUtilizar popups para la introducción de las fechas +UsePreviewTabsVer fichas "vista previa" +ShowPreviewVer vista previa +PreviewNotAvailableVista previa no disponible +ThemeCurrentlyActiveTema actualmente activo +CurrentTimeZoneZona horaria PHP (Servidor) +SpaceÁrea +FieldsCampos +MaskMáscara +NextValuePróximo valor +NextValueForInvoicesPróximo valor (facturas) +NextValueForCreditNotesPróximo valor (notas de entrega) +MustBeLowerThanPHPLimitObservación: Su PHP limita el tamaño a %s %s de máximo, cualquiera que sea el valor de este parámetro +NoMaxSizeByPHPLimitNinguna limitación interna en su servidor PHP +MaxSizeForUploadedFilesTamaño máximo de los documentos a subir (0 para prohibir la subida) +UseCaptchaCodeUtilización de código gráfico (CAPTCHA) en el login +UseAvToScanUploadedFilesUtilización de un antivirus para escanear los archivos subidos +AntiVirusCommandRuta completa hacia el comando antivirus +AntiVirusCommandExampleEjemplo para ClamWin: c:\Program Files (x86)\ClamWin\bin\clamscan.exe
Ejemplo para ClamAv: /usr/bin/clamscan +AntiVirusParamParámetros complementarios en la línea de comandos +AntiVirusParamExampleEjemplo para ClamWin: --database="C:\Program Files (x86)\ClamWin\lib" +ComptaSetupConfiguración del módulo Contabilidad +UserSetupConfiguración gestión de los usuarios +MenuSetupAdministración de los menús por base de datos +MenuLimitsLímites y precisión +MenuIdParentId del menú padre +DetailMenuIdParentID del menú padre (vacío para un menú superior) +DetailPositionNúmero de orden para la posición del menú +PersonalizedMenusNotSupportedMenús personalizados no generados +AllMenusTodos +NotConfiguredNo configurado +SetupConfiguración +ActivationActivación +ActiveActivo +SetupShortConfig. +OtherOptionsOtras opciones +OtherSetupVarios +CurrentValueSeparatorDecimalSeparador decimal +CurrentValueSeparatorThousandSeparador miles +ModulesMódulos +ModulesCommonMódulos principales +ModulesOtherMódulos complementarios +ModulesInterfacesMódulos interfaz +ModulesSpecialMódulos específicos +ParameterInDolibarrVariable %s +LanguageParameterVariable idioma %s +LanguageBrowserParameterVariable %s +LocalisationDolibarrParametersParámetros de localización +ClientTZZona horaria Cliente (usuario) +ClientHourHora cliente (usuario) +OSTZZona horaria +PHPTZZona horaria PHP +PHPServerOffsetWithGreenwichOffset servidor con Greenwich (segundos) +ClientOffsetWithGreenwichOffset cliente/navegador con Greenwich (segundos) +DaylingSavingTimeHorario de verano (usuario) +CurrentHourHora PHP (servidor) +CompanyTZZona Horaria empresa (sede central) +CompanyHourHora empresa (sede central) +CurrentSessionTimeOutTimeout sesión actual +OSEnvEntorno SO +BoxPanel +BoxesPaneles +MaxNbOfLinesForBoxesNº de líneas máximo para los paneles +PositionByDefaultPosición por defecto +PositionOrden +MenusDescLos gestores de menú definen el contenido de las 2 barras de menús (la barra horizontal y la barra vertical). Es posible asignar gestores diferentes según el usuario sea interno o externo. +MenusEditorDescEl editor de menús permite definir entradas personalizadas en los menús. Debe utilizarse con prudencia so pena de poner a Dolibarr en una situación inestable siendo necesaria una reinstalación para encontrar un menú coherente. +MenuForUsersMenú para los usuarios +LangFileArchivo .lang +SystemSistema +SystemInfoInfo. sistema +SystemToolsUtilidades sistema +SystemToolsAreaÁrea utilidades del sistema +SystemToolsAreaDescEsta área ofrece distintas funciones de administración. Utilice la menú para elegir la funcionalidad buscada. +PurgeAreaDescEsta página le permite eliminar todos los archivos creados o guardados por Dolibarr (archivos temporales o todos los archivos del directorio %s). El uso de esta función no es necesaria. Se proporciona para los usuarios que albergan a Dolibarr en un servidor que no ofrece los permisos de eliminación de archivos salvaguardados por el servidor Web. +PurgeDeleteLogFileBorrar el archivo log %s definido por el módulo Syslog (no hay riesgo de pérdida de datos) +PurgeDeleteTemporaryFilesEliminar todos los archivos temporales (sin riesgo de perdida de datos) +PurgeDeleteAllFilesInDocumentsDirEliminar todos los archivos del directorio %s. Archivos temporales y archivos adjuntados a elementos (terceros, facturas, etc.) serán eliminados. +PurgeRunNowPurgar +PurgeNothingToDeleteNingún directorio a eliminar +PurgeNDirectoriesDeleted%s archivos o directorios eliminados +PurgeAuditEventsPurgar los eventos de seguridad +ConfirmPurgeAuditEvents¿Está seguro de querer purgar la lista de los eventos de auditoría de seguridad (Se borrará toda la lista, pero esto no afecta a sus datos)? +NewBackupNueva copia de seguridad +GenerateBackupGenerar copia de seguridad +BackupCopia de seguridad +RestoreRestauración +RunCommandSummaryLa copia será realizada por el comando siguiente +RunCommandSummaryToLaunchLa copia puede ser realizada por el comando siguiente +WebServerMustHavePermissionForCommandSu servidor Web debe tener los derechos de ejecutar tal orden +BackupResultResultado de la copia +BackupFileSuccessfullyCreatedArchivo de copia generado correctamente +YouCanDownloadBackupFileLos archivos generados pueden ahora descargarse +NoBackupFileAvailableNinguna copia disponible +ExportMethodMétodo de exportación +ImportMethodMétodo de importación +ToBuildBackupFileClickHerePara crear una copia, haga click aquí. +ImportMySqlDescPara importar una copia, hay que utilizar el comando mysql en linea siguiente: +ImportPostgreSqlDescPara importar una copia de seguridad, debe usar el comando pg_restore desde la línea de comandos: +ImportMySqlCommand%s %s < miarchivobackup.sql +ImportPostgreSqlCommand%s %s miarchivobackup.sql +FileNameToGenerateNombre del archivo a generar +CommandsToDisableForeignKeysForImportComando para desactivar las claves excluyentes a la importación +CommandsToDisableForeignKeysForImportWarningObligatorio si quiere poder restaurar más tarde el dump SQL +ExportCompatibilityCompatibilidad del archivo de exportación generado +MySqlExportParametersParámetros de la exportación MySql +PostgreSqlExportParametersParámetros de la exportación PostgreSQL +UseTransactionnalModeUtilizar el modo transaccional +FullPathToMysqldumpCommandRuta completa del comando mysqldump +FullPathToPostgreSQLdumpCommandruta completa hacia el comando pg_dump +ExportOptionsOpciones de exportación +AddDropDatabaseAñadir órdenes DROP DATABASE +AddDropTableAñadir órdenes DROP TABLE +ExportStructureEstructura +DatasDatos +NameColumnNombre las columnas +ExtendedInsertInstrucciones INSERT extendidas +NoLockBeforeInsertSin instrucción LOCK antes del INSERT +DelayedInsertInserciones con retraso +EncodeBinariesInHexaCodificar los campos binarios en hexadecimal +IgnoreDuplicateRecordsIgnorar los errores de duplicación (INSERT IGNORE) +YesSí +NoNo +AutoDetectLangAutodetección (navegador) +FeatureDisabledInDemoOpción deshabilitada en demo +RightsPermisos +BoxesDescLos paneles son pequeñas zonas de información que se muestran en algunas páginas. Puede elegir activar o desactivar un panel haciendo clic en 'Activar', o haciendo click en el cubo de basura para desactivarlo. Solo se muestran los paneles relacionados con un módulo activo. +OnlyActiveElementsAreShownSólo los elementos de módulos activados son mostrados. +ModulesDescLos módulos Dolibarr definen las funcionalidades disponibles en la aplicación. Algunos módulos requieren permisos que deberán indicarse a los usuarios para que puedan acceder a sus funcionalidades. +ModulesInterfaceDescLos módulos de interfaz son módulos que permiten vincular a Dolibarr con sistemas, aplicaciones o servicios externos. +ModulesSpecialDescLos módulos complementarios son módulos de uso muy específico o menos corriente que los módulos normales. +ModulesJobDescLos módulos específicos permiten una preconfiguración simplificada de Dolibarr para un negocio en concreto. +ModulesMarketPlaceDescHay disponibles para su descarga en sitios externos otros módulos/extensiones... +ModulesMarketPlacesMás módulos... +DoliStoreDescDoliStore, el sitio oficial de módulos complementarios y para Dolibarr ERP/CRM +WebSiteDescSitios proveedores a consultar para encontrar más módulos +URLEnlace +BoxesAvailablePaneles disponibles +BoxesActivatedPaneles activados +ActivateOnActivar en +ActiveOnActivo en +SourceFileArchivo origen +AutomaticIfJavascriptDisabledAutomático si Javascript está desactivado +AvailableOnlyIfJavascriptNotDisabledDisponible solamente si Javascript esta activado +AvailableOnlyIfJavascriptAndAjaxNotDisabledDisponible solamente si Javascript y Ajax están activados +RequiredRequerido +SecuritySeguridad +PasswordsContraseñas +DoNotStoreClearPasswordNo almacenar la contraseña sin cifrar en la base +MainDbPasswordFileConfEncryptedEncriptar la contraseña de la base en el archivo conf.php +InstrucToEncodePassPara tener la contraseña de la base de datos codificada en el archivo de configuración conf.php, reemplazar en ese fichero la línea
$dolibarr_main_db_pass="..."
por
$dolibarr_main_db_pass="crypted:%s" +InstrucToClearPassPara tener la contraseña de la base de datos descodificada en el archivo de configuración b>conf.php
, reemplazar en ese fichero la línea
$dolibarr_main_db_pass="crypted:..."
por
$dolibarr_main_db_pass="%s" +ProtectAndEncryptPdfFilesProtección y encriptación de los pdf generados +ProtectAndEncryptPdfFilesDescLa protección de un documento pdf deja el documento libre a la lectura y a la impresión a cualquier lector de PDF. Por el contrario, la modificación y la copia resultan imposibles. +FeatureFunción +DolibarrLicenseLicencia +DolibarrProjectLeaderjefe de proyecto +DeveloppersDesarrolladores/contribuidores +OtherDeveloppersOtros desarrolladores/contribuidores +OfficialWebSiteSitio web oficial internacional +OfficialWebSiteFrsitio web oficial habla francesa +OfficialWikiWiki documentación Dolibarr +OfficialDemoDemo en línea Dolibarr +OfficialMarketPlaceSitio oficial de módulos complementarios y extensiones +OfficialWebHostingServiceServicio oficial de alojamiento (SaaS) +ForDocumentationSeeWikiPara la documentación de usuario, desarrollador o Preguntas Frecuentes (FAQ), consulte el wiki Dolibarr:
%s +ForAnswersSeeForumPara otras cuestiones o realizar sus propias consultas, puede utilizar el foro Dolibarr:
%s +HelpCenterDesc1Esta aplicación, independiente de Dolibarr, le permite ayudarle a obtener un servicio de soporte de Dolibarr. +HelpCenterDesc2Algunos de estos servicios sólo están disponibles en inglés. +CurrentTopMenuHandlerGestor de menú superior +CurrentLeftMenuHandlerGestor de menú izquierdo +CurrentMenuHandlerGestor de menú +CurrentSmartphoneMenuHandlerGestor menú smartphone actual +MeasuringUnitUnidad de medida +EmailsE-Mails +EMailsSetupConfiguración E-Mails +EMailsDescEsta página permite sustituir los parámetros PHP relacionados con el envío de correos electrónicos. En la mayoría de los casos en SO como UNIX/Linux, los parámetros PHP son ya correctos y esta página es inútil. +MAIN_MAIL_SMTP_PORTPuerto del servidor SMTP (Por defecto en php.ini: %s) +MAIN_MAIL_SMTP_SERVERNombre host o ip del servidor SMTP (Por defecto en php.ini: %s) +MAIN_MAIL_SMTP_PORT_NotAvailableOnLinuxLikePuerto del servidor SMTP (No definido en PHP en sistemas de tipo Unix) +MAIN_MAIL_SMTP_SERVER_NotAvailableOnLinuxLikeNombre servidor o ip del servidor SMTP (No definido en PHP en sistemas de tipo Unix) +MAIN_MAIL_EMAIL_FROME-Mail del emisor para envíos E-Mail automáticos (Por defecto en php.ini: %s) +MAIN_MAIL_ERRORS_TOE-Mail usado para los retornos de error de los e-mails enviados +MAIN_MAIL_AUTOCOPY_TOEnviar automáticamente copia oculta de los e-mails enviados a +MAIN_DISABLE_ALL_MAILSDesactivar globalmente todo envío de correos electrónicos (para modo de pruebas o demo) +MAIN_MAIL_SENDMODEMétodo de envío de e-mails +MAIN_MAIL_SMTPS_IDID de autentificación SMTP si se requiere autenticación SMTP +MAIN_MAIL_SMTPS_PWContraseña autentificación SMTP si se requiere autentificación SMTP +MAIN_MAIL_EMAIL_TLSUso de encriptación TLS (SSL) +MAIN_DISABLE_ALL_SMSDesactivar globalmente todo envío de SMS (para modo de pruebas o demo) +MAIN_SMS_SENDMODEMétodo de envío de SMS +MAIN_MAIL_SMS_FROMNúmero de teléfono por defecto para los envíos SMS +FeatureNotAvailableOnLinuxFuncionalidad no disponible en sistemas Unix. Pruebe su sendmail localmente. +SubmitTranslationSi la traducción de este idioma es incompleta o si encuentra errores, puede corregirlos mediante la edición de los archivos en el directorio langs/%s y envíe los cambios al foro www.dolibarr.es. +ModuleSetupConfiguración del módulo +ModulesSetupConfiguración de los módulos +ModuleFamilyBaseSistema +ModuleFamilyCrmGestión cliente (CRM) +ModuleFamilyProductsGestión productos +ModuleFamilyHrRecursos Humanos +ModuleFamilyProjectsProyectos/Trabajo cooperativo +ModuleFamilyOtherOtro +ModuleFamilyTechnicMódulos herramientas o Sistema +ModuleFamilyExperimentalMódulos experimentales +ModuleFamilyFinancialMódulos financieros (Contabilidad/tesorería) +ModuleFamilyECMGestión Electrónica de Documentos (GED) +MenuHandlersGestores menú +MenuAdminEditor menú +DoNotUseInProductionNo usar en producción +ThisIsProcessToFollowHe aquí el procedimiento a seguir: +StepNbPaso %s +FindPackageFromWebSiteBuscar el paquete que responde a su necesidad (por ejemplo en el sitio web %s) +DownloadPackageFromWebSiteDescargar el paquete desde el sitio %s. +UnpackPackageInDolibarrRootDescomprimir el paquete en el directorio raíz de Dolibarr %s sobre los archivos existentes (sin desplazar o borrar los existentes, so pena de perder su configuración o los módulos no oficiales instalados) +SetupIsReadyForUseLa instalación ha finalizado y Dolibarr está disponible con el nuevo componente. +NotExistsDirectNo existe el directorio alternativo.
+InfDirAltDesde la versión 3 es posible definir un directorio root alternativo, esto le permite almacenar en el mismo lugar módulos y temas personalizados.
Basta con crear un directorio en el raíz de Dolibarr (por ejemplo: custom).
+InfDirExample
Seguidamente se declara en el archivo conf.php:
$dolibarr_main_url_root_alt='http://miservidor/custom'
$dolibarr_main_document_root_alt='/directorio/de/dolibarr/htdocs/custom'
*Estas lineas vienen comentadas con un "#", para descomentarlas solo hay que retirar el caracter. +YouCanSubmitFileSeleccione paquete: +CurrentVersionVersión actual de Dolibarr +CallUpdatePageLlamar a la página de actualización de la estructura y datos de la base de datos %s. +LastStableVersionÚltima versión estable disponible +GenericMaskCodesPuede introducir cualquier máscara numérica. En esta máscara, puede utilizar las siguientes etiquetas:
{000000} corresponde a un número que se incrementa en cada uno de %s. Introduzca tantos ceros como longitud desee mostrar. El contador se completará a partir de ceros por la izquierda con el fin de tener tantos ceros como la máscara.
{000000+000} Igual que el anterior, con una compensación correspondiente al número a la derecha del signo + se aplica a partir del primer %s.
{000000@x} igual que el anterior, pero el contador se restablece a cero cuando se llega a x meses (x entre 1 y 12). Si esta opción se utiliza y x es de 2 o superior, entonces la secuencia {yy}{mm} o {yyyy}{mm} también es necesaria.
{dd} días (01 a 31).
{mm} mes (01 a 12).
{yy}, {yyyy} ou {y} año en 2, 4 ó 1 cifra.
+GenericMaskCodes2{cccc} el código de cliente en n caracteres
{cccc000} el código de cliente en n caracteres es seguido por un contador propio al cliente sin offset, completado con ceros hasta completar la máscara, y volviendo a cero al mismo tiempo que el contador global.
{tttt}El código del tipo de la empresa en n caracteres (ver diccionarios-tipos de empresas).
+GenericMaskCodes3Cualquier otro carácter en la máscara se quedará sin cambios.
No se permiten espacios
+GenericMaskCodes4aEjemplo en la 99 ª %s del tercero La Empresa realizada el 31/03/2007:
+GenericMaskCodes4bEjemplo sobre un tercero creado el 31/03/2007:
+GenericMaskCodes4cEjemplo en un producto/servicio creado el 31/03/2007:
+GenericMaskCodes5ABC{yy}{mm}-{000000} dará ABC0703-000099
{0000+100@1}-XXX/{dd}/YYY daráa 0199-XXX/31/YYY +GenericNumRefModelDescDevuelve un número creado acorde a una máscara definida. +ServerAvailableOnIPOrPortServidor disponible en la dirección %s en el puerto %s +ServerNotAvailableOnIPOrPortServidor no disponible en la dirección %s en el puerto %s +DoTestServerAvailabilityProbar conectividad con el servidor +DoTestSendProbar envío +DoTestSendHTMLProbar envío HTML +ErrorCantUseRazInStartedYearIfNoYearMonthInMaskError, no se puede usar la opción @ si la secuencia {yy}{mm} o {yyyy}{mm} no se encuentra en la máscara. +UMaskParámetro UMask de nuevos archivos en Unix/Linux/BSD. +UMaskExplanationEste parámetro determina los derechos de los archivos creados en el servidor Dolibarr (durante la subida, por ejemplo).
Este debe ser el valor octal (por ejemplo, 0666 significa lectura / escritura para todos).
Este parámetro no tiene ningún efecto sobre un servidor Windows. +SeeWikiForAllTeamVea el wiki para más detalles de todos los actores y de su organización +UseACacheDelayDemora en caché de la exportación en segundos (0 o vacio sin caché) +DisableLinkToHelpCenterOcultar el enlace "¿Necesita soporte o ayuda?" en la página de login +DisableLinkToHelpOcultar el enlace "%s Ayuda en línea" del menú izquierdo +AddCRIfTooLongNo hay líneas de corte automático, de modo que si el texto es demasiado largo en los documentos, debe agregar sus propios retornos de carro en el texto mecanografiado. +ModuleDisabledMódulo desactivado +ModuleDisabledSoNoEventMódulo desactivado, por lo que evento nunca se crea +ConfirmPurge¿Está seguro de querer realizar esta purga?
Esto borrará definitivamente todos los datos de sus archivos (área GED, archivos adjuntos etc.). +MinLengthLonguitud mínima +LanguageFilesCachedIntoShmopSharedMemoryarchivos .lang en memoria compartida +ExamplesWithCurrentSetupEjemplos con la configuración activa actual +ListOfDirectoriesListado de directorios de plantillas OpenDocument +ListOfDirectoriesForModelGenODTListado de directorios con plantillas de documentos OpenDocument.

Indicar la ruta completa del directorio.
Añadir un retorno a la línea entre cada directorio.Para indicar un directorio del módulo GED, indicar DOL_DATA_ROOT/ecm/nombredeldirectorio.

Los archivos de plantilla de estos directorios deben terminar con .odt +NumberOfModelFilesFoundNúmero de archivos de plantillas ODT encontrados en este/estos directorio(s) +ExampleOfDirectoriesForModelGenEjemplos de sintaxis:
c:\mydir
/home/mydir
DOL_DATA_ROOT/ecm/ecmdir +FollowingSubstitutionKeysCanBeUsedColocando los siguientes tags en la plantilla, obtendrá una sustitución con el valor personalizado al generar el documento: +FullListOnOnlineDocumentationhttp://wiki.dolibarr.org/index.php/Crear_un_modelo_de_documento_ODT +FirstnameNamePositionOrden visualización nombre/apellidos +DescWeatherLos siguientes gráficos se mostrarán en el panel si el número de elementos llegan a estos valores: +KeyForWebServicesAccessClave para usar los Web Services (parámetro "dolibarrkey" en webservices) +TestSubmitFormFormulario de pruebas +ThisForceAlsoThemeUsar este gestor de menús predetermina también el tema, sea cual sea la elección del usuario. Además, este gestor de menús, especial para smartphones, solamente funciona en algunos teléfonos. Use otro gestor si observa cualquier problema. +ThemeDirDirectorio de los temas +ConnectionTimeoutTimeout de conexión +ResponseTimeoutTimeout de respuesta +SmsTestMessageMensaje de prueba de __PHONEFROM__ para __PHONETO__ +ModuleMustBeEnabledFirstPara usar esta función debe estar activado el módulo %s. +SecurityTokenClave para encriptar urls +NoSmsEngineNo hay disponible ningún gestor de envío de SMS. Los gestores de envío de SMS no se instalan por defecto ya que dependen de cada proveedor, sin embargo puede encontrarlos en la plataforma %s. +PDFPDF +PDFDescPuede definir aquí las opciones globales para la generación de los PDF +PDFAddressForgingReglas de visualización de direcciones +HideAnyVATInformationOnPDFOcultar toda la información relacionada con el IVA en la generación de los PDF +HideDescOnPDFOcultar descripción de los productos en la generación de los PDF +HideRefOnPDFOcultar referencia de los productos en la generación de los PDF +HideDetailsOnPDFOcultar detalles de las líneas de productos en la generación de los PDF +LibraryLibrería +UrlGenerationParametersSeguridad de las URLs +SecurityTokenIsUnique¿Usar un parámetro securekey único para cada URL? +EnterRefToBuildUrlIntroduzca la referencia del objeto %s +GetSecuredUrlObtener la URL calculada +ButtonHideUnauthorizedOcultar los botones de acciones no autorizadas en vez de mostrarlos atenuados +TotalNumberOfActivatedModulesNúmero total de módulos activados: %s +YouMustEnableOneModuleDebe activar al menos un módulo. +ProductVatMassChangeModificar IVA en masa +ProductVatMassChangeDescEsta página le permite cambiar el tipo de IVA definido en los productos o servicios de un valor a otro. Tenga en cuenta que el cambio se lleva a cabo en masa sobre toda la base de datos. +OldVATRatesTasa de IVA antigua +NewVATRatesTasa de IVA nueva +PriceBaseTypeToChangeCambiar el precio cuya referencia de base es +MassConvertConvertir masivamente +StringCadena de texto +TextLongTexto largo +IntNumérico entero +FloatDecimal +DateAndTimeFecha y hora +UniqueÚnico +BooleanBoleano (Casilla de verificación) +ExtrafieldPhoneTeléfono +ExtrafieldPricePrecio +ExtrafieldMailCorreo +ExtrafieldSelectLista de selección +ExtrafieldSelectListLista de selección de tabla +ExtrafieldSeparatorSeparador +ExtrafieldCheckBoxCasilla de verificación +ExtrafieldRadioBotón de selección excluyente +ExtrafieldParamHelpselectLa lista ha de ser en forma llave, valor

por ejemplo :
1,text1
2,text2
3,text3
... +ExtrafieldParamHelpcheckboxLa lista ha de ser en forma llave, valor

por ejemplo :
1,text1
2,text2
3,text3
... +ExtrafieldParamHelpradioLa lista ha de ser en forma llave, valor

por ejemplo :
1,text1
2,text2
3,text3
... +ExtrafieldParamHelpsellistLa lista ha de ser de la tabl

por ejemplo:
table:label:(code)
+LibraryToBuildPDFLibrería usada para la creación de archivos PDF +WarningUsingFPDFAtención: Su archivo conf.php contiene la directiva dolibarr_pdf_force_fpdf=1. Esto hace que se use la librería FPDF para generar sus archivos PDF. Esta librería es antigua y no cubre algunas funcionalidades (Unicode, transparencia de imágenes, idiomas cirílicos, árabes o asiáticos, etc.), por lo que puede tener problemas en la generación de los PDF.
Para resolverlo, y disponer de un soporte completo de PDF, puede descargar la librería TCPDF , y a continuación comentar o eliminar la línea $dolibarr_pdf_force_fpdf=1, y añadir en su lugar $dolibarr_lib_TCPDF_PATH='ruta_a_TCPDF' +LocalTaxDescAlgunos países aplican 2 o 3 tasas a cada línea de factura. Si es el caso, escoja el tipo de la segunda y tercera tasa y su valor. Los posibles tipos son:
1 : tasa local aplicable a productos y servicios sin IVA (IVA no se aplica en la tasa local)
2 : tasa local se aplica a productos y servicios antes del IVA (IVA se calcula sobre importe+tasa local)
3 : tasa local se aplica a productos sin IVA (IVA no se aplica en la tasa local)
4 : tasa local se aplica a productos antes del IVA (IVA se calcula sobre el importe+tasa local)
5 : tasa local se aplica a servicios sin IVA (IVA no se aplica a la tasa local)
6 : tasa local se aplica a servicios antes del IVA (IVA se calcula sobre importe + tasa local) +SuhosinSessionEncryptAlmacenamiento de sesiones cifradas por Suhosin +SMSSMS +LinkToTestClickToDialIntroduzca un número de teléfono al que llamar para probar el enlace de llamada ClickToDial para el usuario %s +RefreshPhoneLinkRefrescar enlace +LinkToTestEnlace seleccionable para el usuario %s (haga clic en el número para probar) +KeepEmptyToUseDefaultDeje este campo vacío para usar el valor por defecto +DefaultLinkEnlace por defecto +ValueOverwrittenByUserSetupAtención: Este valor puede ser sobreescrito por un valor específico de la configuración del usuario (cada usuario puede tener su propia url clicktodial) +# Modules= undefined +Module0NameUsuarios y grupos +Module0DescGestión de usuarios y grupos +Module1NameTerceros +Module1DescGestión de terceros (empresas, particulares) y contactos +Module2NameComercial +Module2DescGestión comercial +Module10NameContabilidad +Module10DescActivación de informes simples de contabilidad (diarios, ventas) basados en el contenido de la base de datos. Sin desgloses. +Module20NamePresupuestos +Module20DescGestión de presupuestos/propuestas comerciales +Module22NameE-Mailings +Module22DescAdministración y envío de E-Mails masivos +Module23NameEnergía +Module23DescRealiza el seguimiento del consumo de energías +Module25NamePedidos de clientes +Module25DescGestión de pedidos de clientes +Module30NameFacturas y abonos +Module30DescGestión de facturas y abonos a clientes. Gestión facturas de proveedores +Module40NameProveedores +Module40DescGestión de proveedores +Module42NameSyslog +Module42DescGeneración de logs (archivos, syslog,...) +Module49NameEditores +Module49DescGestión de editores +Module50NameProductos +Module50DescGestión de productos +Module51NamePublipostage +Module51DescAdministración y envío de correo de papel en masa +Module52NameStocks de productos +Module52DescGestión de stocks de productos +Module53NameServicios +Module53DescGestión de servicios +Module54NameContratos +Module54DescGestión de contratos +Module55NameCódigos de barras +Module55DescGestión de los códigos de barras +Module56NameTelefonía +Module56DescGestión de la telefonía +Module57NameDomiciliaciones +Module57DescGestión de domiciliaciones y reintegros bancarios +Module58NameClickToDial +Module58DescIntegración con ClickToDial +Module59NameBookmark4u +Module59DescAñade función para generar una cuenta Bookmark4u desde una cuenta Dolibarr +Module70NameIntervenciones +Module70DescGestión de las intervenciones a terceros +Module75NameNotas de gasto y desplazamientos +Module75DescGestión de las notas de gasto y desplazamientos +Module80NameExpediciones +Module80DescGestión de expediciones y recepciones +Module85NameBancos y cajas +Module85DescGestión de las cuentas financieras de tipo cuentas bancarias, postales o efectivo +Module100NameSitio web externo +Module100DescIncluye cualquier sitio web externo en los menús de Dolibarr, viéndolo en un frame +Module105NameMailman y SPIP +Module105DescInterfaz con Mailman o SPIP para el módulo Miembros +Module200NameLDAP +Module200DescSincronización con un directorio LDAP +Module210NamePostNuke +Module210DescIntegración con PostNuke +Module240NameExportaciones de datos +Module240DescHerramienta de exportación de datos Dolibarr (con asistente) +Module250NameImportación de datos +Module250DescHerramienta de importación de datos a Dolibarr (con asistente) +Module310NameMiembros +Module310DescGestión de miembros de una asociación +Module320NameHilos RSS +Module320DescAdición de hilos de información RSS en las pantallas Dolibarr +Module330NameMarcadores +Module330DescGestión de marcadores +Module400NameProyectos +Module400DescGestión de los proyectos en los otros módulos +Module410NameWebcalendar +Module410DescInterfaz con el calendario Webcalendar +Module500NameImpuestos, cargas sociales y dividendos +Module500DescGestión de impuestos y cargas sociales +Module600NameNotificaciones +Module600DescEnvío de notificaciones (por correo electrónico) sobre los eventos de trabajo Dolibarr +Module700NameDonaciones +Module700DescGestión de donaciones +Module800NameOSCommerce 1 +Module800DescInterfaz de visualización de una tienda OSCommerce mediante acceso directo a su base de datos +Module900NameOSCommerce 2 +Module900DescInterfaz de visualización de una tienda OSCommerce mediante Web services. Este módulo requiere instalar los archivos de /oscommerce_ws/ws_server en OSCommerce. Lea el archivo README del directorio /oscommerce_ws/ws_server. +Module1200NameMantis +Module1200DescInterfaz con el sistema de seguimiento de incidencias Mantis +Module1400NameContabilidad experta +Module1400DescGestión experta de la contabilidad (doble partida) +Module1780NameCategorías +Module1780DescGestión de categorías (productos, proveedores y clientes) +Module2000NameEditor WYSIWYG +Module2000DescPermite la edición de ciertas zonas de texto mediante un editor avanzado +Module2300NameProgramador +Module2300DescTareas programadas +Module2400NameAgenda +Module2400DescGestión de la agenda y de las acciones +Module2500NameGestión Electrónica de Documentos +Module2500DescPermite administrar una base de documentos +Module2600NameWebServices +Module2600DescActiva los servicios de servidor web services de Dolibarr +Module2650NameUltimatepdf +Module2650DescGestión de la presentación de las plantillas pdf (presupuestos, facturas, pedidos, etc.) +Module2700NameGravatar +Module2700DescUtiliza el servicio en línea de Gravatar (www.gravatar.com) para mostrar fotos de los usuarios/miembros (que se encuentran en sus mensajes de correo electrónico). Necesita un acceso a Internet +Module2900NameGeoIPMaxmind +Module2900DescCapacidades de conversión GeoIP Maxmind +Module5000NameMulti-empresa +Module5000DescPermite gestionar varias empresas +Module20000NameDías libres +Module20000DescGestión de los días libres de los empleados +Module50000NamePayBox +Module50000DescMódulo para proporcionar un pago en línea con tarjeta de crédito mediante Paybox +Module50100NameTPV +Module50100DescTerminal Punto de Venta para la venta en mostrador +Module50200NamePaypal +Module50200DescMódulo para proporcionar un pago en línea con tarjeta de crédito mediante Paypal +Module59000NameMárgenes +Module59000DescMódulo para gestionar los márgenes de beneficio +Module60000NameComisiones +Module60000DescMódulo para gestionar las comisiones de venta +Permission11Consultar facturas +Permission12Crear/Modificar facturas +Permission13De-validar facturas +Permission14Validar facturas +Permission15Enviar facturas por correo +Permission16Emitir pagos de facturas +Permission19Eliminar facturas +Permission21Consultar presupuestos +Permission22Crear/modificar presupuestos +Permission24Validar presupuestos +Permission25Enviar los presupuestos +Permission26Cerrar presupuestos +Permission27Eliminar presupuestos +Permission28Exportar los presupuestos +Permission31Consultar productos +Permission32Crear/modificar productos +Permission34Eliminar productos +Permission36Ver/gestionar los productos ocultos +Permission38Exportar productos +Permission41Consultar proyectos y tareas (compartidos o soy contacto) +Permission42Crear/modificar proyectos y tareas (compartidos o soy contacto) +Permission44Eliminar proyectos y tareas (compartidos o soy contacto) +Permission61Consultar intervenciones +Permission62Crear/modificar intervenciones +Permission64Eliminar intervenciones +Permission67Exportar intervenciones +Permission71Consultar miembros +Permission72Crear/modificar miembros +Permission74Eliminar miembros +Permission75Configurar tipos y atributos de los miembros +Permission76Exportar miembros +Permission78Consultar cotizaciones +Permission79Crear/modificar cotizaciones +Permission81Consultar pedidos de clientes +Permission82Crear/modificar pedidos de clientes +Permission84Validar pedidos de clientes +Permission86Enviar pedidos de clientes +Permission87Cerrar pedidos de clientes +Permission88Anular pedidos de clientes +Permission89Eliminar pedidos de clientes +Permission91Consultar impuestos e IVA +Permission92Crear/modificar impuestos e IVA +Permission93Eliminar impuestos e IVA +Permission94Exportar impuestos +Permission95Consultar balances y resultados +Permission96Parametrizar desglose +Permission97Leer líneas de facturas +Permission98Desglosar líneas de facturas +Permission101Consultar expediciones +Permission102Crear/modificar expediciones +Permission104Validar expediciones +Permission106Exportar expediciones +Permission109Eliminar expediciones +Permission111Consultar cuentas financieras (cuentas bancarias, cajas) +Permission112Crear/modificar cantidad/eliminar registros bancarios +Permission113Configurar cuentas financieras (crear, controlar las categorías) +Permission114Exportar transacciones y registros bancarios +Permission115Exportar transacciones y extractos +Permission116Captar transferencias entre cuentas +Permission117Gestionar els dipòsits en banc dels xecs rebuts +Permission121Consultar empresas +Permission122Crear/modificar empresas +Permission125Eliminar empresas +Permission126Exportar las empresas +Permission141Consultar todos los proyectos y tareas (incluyendo los privados de los que no sea contacto) +Permission142Crear/modificar todos los proyectos y tareas (incluyendo los privados de los que no sea contacto) +Permission144Eliminar todos los proyectos y tareas (incluyendo los privados de los que no sea contacto) +Permission146Consultar proveedores +Permission147Consultar estadísticas +Permission151Consultar domiciliaciones +Permission152Crear/modificar domiciliaciones +Permission153Enviar domiciliaciones +Permission154Abonar/devolver domiciliaciones +Permission161Consultar contratos de servicio +Permission162Crear/modificar contratos de servicio +Permission163Activar los servicios de un contrato +Permission164Desactivar los servicios de un contrato +Permission165Eliminar contratos +Permission171Leer los desplazamientos +Permission172Crear/modificar los desplazamientos +Permission173Eliminar desplazamientos +Permission178Exportar desplazamientos +Permission180Consultar proveedores +Permission181Consultar pedidos a proveedores +Permission182Crear/modificar pedidos a proveedores +Permission183Validar pedidos a proveedores +Permission184Aprobar pedidos a proveedores +Permission185Enviar pedidos a proveedores +Permission186Recibir pedidos de proveedores +Permission187Cerrar pedidos a proveedores +Permission188Anular pedidos a proveedores +Permission192Crear líneas +Permission193Cancelar líneas +Permission194Consultar el ancho de banda de líneas +Permission202Crear conexiones ADSL +Permission203Realizar pedido de conexiones +Permission204Pedir conexiones +Permission205Gestionar conexiones +Permission206Consultar conexiones +Permission211Consultar telefonía +Permission212Pedir líneas +Permission213Activar una línea +Permission214Configurar la telefonía +Permission215Configurar proveedores +Permission221Consultar E-Mails +Permission222Crear/modificar E-Mails (asunto, destinatarios, etc.) +Permission223Validar E-Mails (permite el envío) +Permission229Eliminar E-Mails +Permission237Ver los destinatarios y la información +Permission238Enviar los e-mails manualmente +Permission239Eliminar los e-mails después de su validación o su envío +Permission241Consultar categorías +Permission242Crear/modificar categorías +Permission243Eliminar categorías +Permission244Ver contenido de categorías ocultas +Permission251Consultar otros usuarios +PermissionAdvanced251Consultar otros usuarios +Permission252Consultar los permisos de otros usuarios +Permission253Crear/modificar otros usuarios y sus permisos +PermissionAdvanced253Crear/modificar usuarios internos/externos y sus permisos +Permission254Modificar la contraseña de otros usuarios +Permission255Eliminar o desactivar otros usuarios +Permission256Consultar sus permisos +Permission262Consultar todas las empresas (Solamente usuarios internos. Los externos están limitados a ellos mismos) +Permission271Consultar el CA +Permission272Consultar las facturas +Permission273Emitir las facturas +Permission281Consultar contactos +Permission282Crear/modificar contactos +Permission283Eliminar contactos +Permission286Exportar contactos +Permission291Consultar tarifas +Permission292Definir permisos sobre las tarifas +Permission293Modificar tarifas de clientes +Permission300Consultar códigos de barras +Permission301Crear/modificar códigos de barras +Permission302Eliminar código de barras +Permission311Consultar servicios +Permission312Asignar servicios a un contrato +Permission331Consultar marcadores +Permission332Crear/modificar marcadores +Permission333Eliminar marcadores +Permission341Consultar sus propios permisos +Permission342Crear/modificar su propia info de usuario +Permission343Modificar su propia contraseña +Permission344Modificar sus propios permisos +Permission351Consultar los grupos +Permission352Consultar los permisos de grupos +Permission353Crear/modificar los grupos y sus permisos +Permission354Eliminar o desactivar grupos +Permission358Exportar usuarios +Permission401Consultar haberes +Permission402Crear/modificar haberes +Permission403Validar haberes +Permission404Eliminar haberes +Permission531Consultar servicios +Permission532Crear/modificar servicios +Permission534Eliminar servicios +Permission536Ver/gestionar los servicios ocultos +Permission538Exportar servicios +Permission701Consultar donaciones +Permission702Crear/modificar donaciones +Permission703Eliminar donaciones +Permission1001Consultar stocks +Permission1002Crear/modificar stocks +Permission1003Eliminar stocks +Permission1004Consultar movimientos de stock +Permission1005Crear/modificar movimientos de stock +Permission1101Consultar órdenes de envío +Permission1102Crear/modificar órdenes de envío +Permission1104Validar orden de envío +Permission1109Eliminar orden de envío +Permission1181Consultar proveedores +Permission1182Consultar pedidos a proveedores +Permission1183Crear pedidos a proveedores +Permission1184Validar pedidos a proveedores +Permission1185Aprobar pedidos a proveedores +Permission1186Enviar pedidos a proveedores +Permission1187Recibir pedidos de proveedores +Permission1188Cerrar pedidos a proveedores +Permission1201Obtener resultado de una exportación +Permission1202Crear/codificar exportaciones +Permission1231Consultar facturas de proveedores +Permission1232Crear facturas de proveedores +Permission1233Validar facturas de proveedores +Permission1234Eliminar facturas de proveedores +Permission1235Enviar facturas de proveedores por correo +Permission1236Exportar facturas de proveedores, atributos y pagos +Permission1237Exportar pedidos de proveedores junto con sus detalles +Permission1251Lanzar las importaciones en masa a la base de datos (carga de datos) +Permission1321Exportar facturas a clientes, atributos y cobros +Permission1401Leer el plan contable +Permission1402Crear/Modificar un plan contable +Permission1403Cerrar un plan contable +Permission1411Leer los movimientos contables +Permission1412Crear/modificar/anular movimientos contables +Permission1415Leer Balances, informes, diarios, libros maestros +Permission1421Exportar pedidos de clientes y atributos +Permission23001Ver tareas programadas +Permission23002Crear/actualizar tareas programadas +Permission23003Borrar tareas programadas +Permission23004Ejecutar tareas programadas +Permission2401Leer acciones (eventos o tareas) vinculadas a su cuenta +Permission2402Crear/eliminar acciones (eventos o tareas) vinculadas a su cuenta +Permission2403Modificar acciones (eventos o tareas) vinculadas a su cuenta +Permission2411Leer acciones (eventos o tareas) de otros +Permission2412Crear/modificar acciones (eventos o tareas) de otros +Permission2413Eliminar acciones (eventos o tareas) de otros +Permission2501Consultar/Recuperar documentos +Permission2502Recuperar documentos +Permission2503Enviar o eliminar documentos +Permission2515Configuración directorios de documentos +Permission2801Utilizar el cliente FTP en modo lectura (sólo explorar y descargar) +Permission2802Utilizar el cliente FTP en modo escritura (borrar o subir archivos) +Permission50101Usar TPV +Permission50201Consultar las transacciones +Permission50202Importar las transacciones +DictionnaryCompanyTypeTipos de empresa +DictionnaryCompanyJuridicalTypeFormas jurídicas +DictionnaryProspectLevelPerspectiva nivel cliente potencial +DictionnaryCantonDepartamentos/Provincias/Zonas +DictionnaryRegionRegiones +DictionnaryCountryPaíses +DictionnaryCurrencyMonedas +DictionnaryCivilityTítulos de cortesía +DictionnaryActionsTipos de eventos de la agenda +DictionnarySocialContributionsTipos de cargas sociales +DictionnaryVATTasa de IVA (Impuesto sobre ventas en EEUU) +DictionnaryRevenueStampImportes de sellos fiscales +DictionnaryPaymentConditionsCondiciones de pago +DictionnaryPaymentModesModos de pago +DictionnaryTypeContactTipos de contactos/direcciones +DictionnaryEcotaxeBaremos CEcoParticipación (DEEE) +DictionnaryPaperFormatFormatos de papel +DictionnaryFeesTipos de desplazamientos y honorarios +DictionnarySendingMethodsMétodos de expedición +DictionnaryStaffEmpleados +DictionnaryAvailabilityTiempos de entrega +DictionnaryOrderMethodsMétodos de pedido +DictionnarySourceOrígenes de presupuestos/pedidos +DictionnaryAccountancyplanPlan contable +DictionnaryAccountancysystemModelos de planes contables +SetupSavedConfiguración guardada +BackToModuleListVolver a la lista de módulos +BackToDictionnaryListVolver a la lista de diccionarios +VATReceivedOnlyImpuestos especiales no facturables +VATManagementGestión IVA +VATIsUsedDescEl tipo de IVA propuesto por defecto en las creaciones de presupuestos, facturas, pedidos, etc. Responde a la siguiente regla:
Si el vendedor no está sujeto a IVA, IVA por defecto=0. Final de regla.
Si el país del vendedor= país del comprador entonces IVA por defecto=IVA del producto vendido. Final de regla.
Si vendedor y comprador residen en la Comunidad Europea y el bien vendido= nuevo medio de transportes (auto, barco, avión), IVA por defecto=0 (el IVA debe ser pagado por comprador a la hacienda pública de su país y no al vendedor). Final de regla
Si vendedor y comprador residen en la Comunidad Europea y comprador= particular o empresa sin NIF intracomunitario entonces IVA por defecto=IVA del producto vendido. Final de regla.
Si vendedor y comprador residen en la Comunidad Europea y comprador= empresa con NIF intracomunitario entonces IVA por defecto=0. Final de regla.
Si no, IVA propuesto por defecto=0. Final de regla.
+VATIsNotUsedDescEl tipo de IVA propuesto por defecto es 0. Este es el caso de asociaciones, particulares o algunas pequeñas sociedades. +VATIsUsedExampleFREn Francia, se trata de las sociedades u organismos que eligen un régimen fiscal general (General simplificado o General normal), régimen en el cual se declara el IVA. +VATIsNotUsedExampleFREn Francia, se trata de asociaciones exentas de IVA o sociedades, organismos o profesiones liberales que han elegido el régimen fiscal de módulos (IVA en franquicia), pagando un IVA en franquicia sin hacer declaración de IVA. Esta elección hace aparecer la anotación "IVA no aplicable - art-293B del CGI" en las facturas. ##### Local Taxes ##### -LocalTax1IsUsed=Sujeto -LocalTax1IsNotUsed=No sujeto -LocalTax1IsUsedDesc=Uso de un 2º tipo de impuesto (Distinto del IVA) -LocalTax1IsNotUsedDesc=No usar un 2º tipo de impuesto (Distinto del IVA) -LocalTax1Management=Gestión 2º tipo de impuesto -LocalTax1IsUsedExample= -LocalTax1IsNotUsedExample= -LocalTax2IsUsed=Sujeto -LocalTax2IsNotUsed=No sujeto -LocalTax2IsUsedDesc=Uso de un 3er. tipo de impuesto (Distinto del IVA) -LocalTax2IsNotUsedDesc=No usar un 3er. tipo de impuesto (Distinto del IVA) -LocalTax2Management=Gestión 3er. tipo de impuesto -LocalTax2IsUsedExample= -LocalTax2IsNotUsedExample= -LocalTax1ManagementES=Gestión RE -LocalTax1IsUsedDescES=El tipo de RE propuesto por defecto en las creaciones de presupuestos, facturas, pedidos, etc. Responde a la siguiente regla:
Si el comprador no está sujeto a RE, RE por defecto=0. Final de regla.
Si el comprador está sujeto a RE entonces se aplica valor de RE por defecto. Final de regla.
-LocalTax1IsNotUsedDescES=El tipo de RE propuesto por defecto es 0. Final de regla. -LocalTax1IsUsedExampleES=En España, se trata de personas físicas: autónomos sujetos a unos epígrafes concretos del IAE. -LocalTax1IsNotUsedExampleES=En España, se trata de empresas jurídicas: Sociedades limitadas, anónimas, etc. y personas físicas (autónomos) sujetos a ciertos epígrafes del IAE. -LocalTax2ManagementES=Gestión IRPF -LocalTax2IsUsedDescES=El tipo de IRPF propuesto por defecto en las creaciones de presupuestos, facturas, pedidos, etc. Responde a la siguiente regla:
Si el vendedor no está sujeto a IRPF, IRPF por defecto=0. Final de regla.
Si el vendedor está sujeto a IRPF entonces se aplica valor de IRPF por defecto. Final de regla.
-LocalTax2IsNotUsedDescES=El tipo de IRPF propuesto por defecto es 0. Final de regla. -LocalTax2IsUsedExampleES=En España, se trata de personas físicas: autónomos y profesionales independientes que prestan servicios y empresas que han elegido el régimen fiscal de módulos. -LocalTax2IsNotUsedExampleES=En España, se trata de empresas no sujetas al régimen fiscal de módulos. -LabelUsedByDefault=Etiqueta que se utilizará si no se encuentra traducción para este código -LabelOnDocuments=Etiqueta sobre documentos -NbOfDays=Nº de días -AtEndOfMonth=A fin de mes -Offset=Decálogo -AlwaysActive=Siempre activo -UpdateRequired=Su sistema necesita una actualización. Para actualizar haga clic en Actualizar. -Upgrade=Actualización -MenuUpgrade=Actualización / Extensión -AddExtensionThemeModuleOrOther=Añadir extensión (tema, módulo, etc.) -WebServer=Servidor web -DocumentRootServer=Directorio raíz de las páginas web -DataRootServer=Directorio raíz de los archivos de datos -IP=IP -Port=Puerto -VirtualServerName=Nombre del servidor virtual -AllParameters=Todos los parámetros -OS=SO -PhpEnv=Env -PhpModules=Módulos -PhpConf=Conf -PhpWebLink=Vínculo Web-PHP -Pear=Pear -PearPackages=Paquetes Pear -Database=Base de datos -DatabaseServer=Host de la base de datos -DatabaseName=Nombre de la base de datos -DatabasePort=Puerto de la base de datos -DatabaseUser=Login de la base de datos -DatabasePassword=Contraseña de la base de datos -DatabaseConfiguration=Configuración de la base de datos -Tables=Tablas -TableName=Nombre de la tabla -TableLineFormat=Formato líneas -NbOfRecord=Nº Reg. -Constraints=Constraints -ConstraintsType=Tipo de constraint -ConstraintsToShowOrNotEntry=Constraint para mostrar o no la entrada de menú -AllMustBeOk=Todos deben ser controlados -Host=Servidor -DriverType=Tipo de driver -SummarySystem=Resumen de la información de sistemas Dolibarr -SummaryConst=Lista de todos los parámetros de configuración Dolibarr -SystemUpdate=Actualización del sistema -SystemSuccessfulyUpdate=Su sistema se actualizó correctamente -MenuCompanySetup=Empresa/Institución -MenuNewUser=Nuevo usuario -MenuTopManager=Gestor del menú superior -MenuLeftManager=Gestor del menú izquierdo -MenuManager=Gestor del menú estándar -MenuSmartphoneManager=Gestor de menú smartphone -DefaultMenuTopManager=Gestor del menú superior -DefaultMenuLeftManager=Gestor del menú izquierdo -DefaultMenuManager=Gestor del menú estándar -DefaultMenuSmartphoneManager=Gestor de menú smartphone -Skin=Tema visual -DefaultSkin=Tema visual por defecto -MaxSizeList=Longitud máxima de listados -DefaultMaxSizeList=Longitud máxima de listados por defecto -MessageOfDay=Mensaje del día -MessageLogin=Mensaje del login -PermanentLeftSearchForm=Zona de búsqueda permanente del menú izquierdo -DefaultLanguage=Idioma por defecto a utilizar (código idioma) -EnableMultilangInterface=Activar interfaz multi-idioma -EnableShowLogo=Mostrar el logotipo en el menú de la izquierda -SystemSuccessfulyUpdated=Su sistema está actualizado -CompanyInfo=Información de la empresa/institución -CompanyIds=Identificación reglamentaria -CompanyName=Nombre/Razón social -CompanyAddress=Dirección -CompanyZip=Código postal -CompanyTown=Población -CompanyCountry=País -CompanyCurrency=Divisa principal -DoNotShow=No mostrar -DoNotSuggestPaymentMode=No sugerir -NoActiveBankAccountDefined=Ninguna cuenta bancaria activa definida -OwnerOfBankAccount=Titular de la cuenta %s -BankModuleNotActive=Módulo cuentas bancarias no activado -ShowBugTrackLink=Mostrar vínculo "Señalar un bug" -ShowWorkBoard=Mostrar panel de información en la página principal -Alerts=Alertas -Delays=Plazos -DelayBeforeWarning=Plazo antes de alerta -DelaysBeforeWarning=Plazos antes de alerta -DelaysOfToleranceBeforeWarning=Plazos de tolerancia antes de alerta -DelaysOfToleranceDesc=Esta pantalla permite configura los plazos de tolerancia antes de que se alerte con el símbolo %s, sobre cada elemento en retraso. -Delays_MAIN_DELAY_ACTIONS_TODO=Tolerancia de retraso antes de la alerta (en días) sobre acciones planificadas no realizadas -Delays_MAIN_DELAY_ORDERS_TO_PROCESS=Tolerancia de retraso antes de la alerta (en días) sobre pedidos de clientes no procesados -Delays_MAIN_DELAY_SUPPLIER_ORDERS_TO_PROCESS=Tolerancia de retraso antes de la alerta (en días) sobre pedidos a proveedores no procesados -Delays_MAIN_DELAY_PROPALS_TO_CLOSE=Tolerancia de retraso antes de la alerta (en días) sobre presupuestos a cerrar -Delays_MAIN_DELAY_PROPALS_TO_BILL=Tolerancia de retraso antes de la alerta (en días) sobre presupuestos no facturados -Delays_MAIN_DELAY_NOT_ACTIVATED_SERVICES=Tolerancia de retraso antes de la alerta (en días) sobre servicios a activar -Delays_MAIN_DELAY_RUNNING_SERVICES=Tolerancia de retraso antes de la alerta (en días) sobre servicios expirados -Delays_MAIN_DELAY_SUPPLIER_BILLS_TO_PAY=Tolerancia de retraso antes de la alerta (en días) sobre facturas de proveedor impagadas -Delays_MAIN_DELAY_CUSTOMER_BILLS_UNPAYED=Tolerancia de retraso antes de la alerta (en días) sobre facturas a cliente impagadas -Delays_MAIN_DELAY_TRANSACTIONS_TO_CONCILIATE=Tolerancia de retraso antes de la alerta (en días) sobre conciliaciones bancarias pendientes -Delays_MAIN_DELAY_MEMBERS=Tolerancia de retraso entes de la alerta (en días) sobre cotizaciones adherentes en retraso -Delays_MAIN_DELAY_CHEQUES_TO_DEPOSIT=Tolerancia de retraso entes de la alerta (en días) sobre cheques a ingresar -SetupDescription1=Todas las opciones del área de configuración son opciones que permiten configurar a Dolibarr antes de empezar su utilización. -SetupDescription2=Los 2 pasos indispensables de la configuración son las 2 primeras en el menú izquierdo: la configuración de la empresa/institución y la configuración de los módulos: -SetupDescription3=La configuración Empresa/institución a administrar es requerida ya que se utiliza la información para la introducción de datos en la mayoría de las pantallas, en inserciones, o para modificar el comportamiento de Dolibarr (como, por ejemplo, de las funciones que dependen de su país). -SetupDescription4=La configuración Módulos es indispensable ya que Dolibarr no es un ERP/CRM monolítico, es un conjunto de módulos más o menos independiente. Después de activar los módulos que le interesen comprobará sus funcionalidades en los menús de Dolibarr. -SetupDescription5=Las otras entradas de configuración gestionan parámetros opcionales. -EventsSetup=Configuración del registro de eventos -LogEvents=Auditoría de la seguridad de eventos -Audit=Auditoría -InfoDolibarr=Info. Dolibarr -InfoOS=Info. SO -InfoWebServer=Info. servidor -InfoDatabase=Info. base de datos -InfoPHP=Info. PHP -ListEvents=Auditoría de eventos -ListOfSecurityEvents=Listado de eventos de seguridad Dolibarr -SecurityEventsPurged=Eventos de seguridad purgados -LogEventDesc=Puede habilitar el registro de eventos de seguridad Dolibarr aquí. Los administradores pueden ver su contenido a través de menú Herramientas del sistema - Auditoría.Atención, esta característica puede consumir una gran cantidad de datos en la base de datos. -AreaForAdminOnly=Estas funciones solo son accesibles a un usuario administrador. -SystemInfoDesc=La información del sistema es información técnica accesible solamente en solo lectura a los administradores. -SystemAreaForAdminOnly=Esta área solo es accesible a los usuarios de tipo administradores. Ningún permiso Dolibarr permite extender el círculo de usuarios autorizados a esta área. -CompanyFundationDesc=Modifique en esta página toda la información conocida sobre la empresa o asociación a administrar (para ello haga clic en el botón "Modificar" a pie de página) -DisplayDesc=Puede encontrar aquí todos los parámetros relacionados con la apariencia de Dolibarr -AvailableModules=Módulos disponibles -ToActivateModule=Para activar los módulos, vaya al área de Configuración (Inicio->Configuración->Módulos). -SessionTimeOut=Timeout de sesiones -SessionExplanation=Asegura que el período de sesiones no expirará antes de este momento. Sin embargo, la gestión del período de sesiones de PHP no garantiza que el período de sesiones expira después de este período: Este será el caso si un sistema de limpieza del caché de sesiones es activo.
Nota: Sin mecanismo especial, el mecanismo interno para limpiar el período de sesiones de PHP todos los accesos %s/%s, pero sólo en torno al acceso de otros períodos de sesiones. -TriggersAvailable=Triggers disponibles -TriggersDesc=Los triggers son archivos que, une vez depositados en el directorio htdocs/core/triggers, modifican el comportamiento del workflow de Dolibarr. Realizan acciones suplementarias, desencadenadas por los eventos Dolibarr (creación de empresa, validación factura, cierre contrato, etc). -TriggerDisabledByName=Triggers de este archivo desactivados por el sufijo -NORUN en el nombre del archivo. -TriggerDisabledAsModuleDisabled=Triggers de este archivo desactivados ya que el módulo %s no está activado. -TriggerAlwaysActive=Triggers de este archivo siempre activos, ya que los módulos Dolibarr relacionados están activados -TriggerActiveAsModuleActive=Triggers de este archivo activos ya que el módulo %s está activado -GeneratedPasswordDesc=Indique aquí que norma quiere utilizar para generar las contraseñas cuando quiera generar una nueva contraseña -DictionnaryDesc=Indique aquí los datos de referencia. Puede completar/modificar los datos predefinidos con los suyos. -ConstDesc=Cualquier otro parámetro no editable en las páginas anteriores -OnceSetupFinishedCreateUsers=Atención, está bajo una cuenta de administrador de Dolibarr. Los administradores se utilizan para configurar a Dolibarr. Para un uso corriente de Dolibarr, se recomienda utilizar una cuenta no administrador creada desde el menú "Usuarios y grupos" -MiscellaneousDesc=Defina aquí los otros parámetros relacionados con la seguridad. -LimitsSetup=Configuración de límites y precisiones -LimitsDesc=Puede definir aquí los límites y precisiones utilizados por Dolibarr -MAIN_MAX_DECIMALS_UNIT=Decimales máximos para los precios unitarios -MAIN_MAX_DECIMALS_TOT=Decimales máximos para los precios totales -MAIN_MAX_DECIMALS_SHOWN=Decimales máximos para los importes mostrados en pantalla (Poner ... después del máximo si quiere ver ... cuando el número se trunque al mostrarlo en pantalla) -MAIN_DISABLE_PDF_COMPRESSION=Utilizar la compresión PDF para los archivos PDF generados -MAIN_ROUNDING_RULE_TOT=Tamaño rango para el redondeo (para algunos países que redondean sobre otra base que no sea base 10) -UnitPriceOfProduct=Precio unitario sin IVA de un producto -TotalPriceAfterRounding=Precio total después del redondeo -ParameterActiveForNextInputOnly=Parámetro efectivo solamente a partir de las próximas sesiones -NoEventOrNoAuditSetup=No se han registrado eventos de seguridad. Esto puede ser normal si la auditoría no ha sido habilitada en la página "configuración->seguridad->auditoría". -NoEventFoundWithCriteria=No se han encontrado eventos de seguridad para tales criterios de búsqueda. -SeeLocalSendMailSetup=Ver la configuración local de sendmail -BackupDesc=Para realizar una copia de seguridad completa de Dolibarr, usted debe: -BackupDesc2=* Guardar el contenido del directorio de documentos (%s) que contiene todos los archivos subidos o generados (comprimiendo el directorio, por ejemplo). -BackupDesc3=* Guardar el contenido de su base de datos en un archivo de volcado. Para ello puede utilizar el asistente a continuación. -BackupDescX=El directorio archivado deberá guardarse en un lugar seguro. -BackupDescY=El archivo de volcado generado deberá guardarse en un lugar seguro. -BackupPHPWarning=La copia de seguridad no puede ser garantizada con este método. Es preferible utilizar el anterior -RestoreDesc=Para restaurar una copia de seguridad de Dolibarr, usted debe: -RestoreDesc2=* Tomar el archivo (archivo zip, por ejemplo) del directorio de los documentos y descomprimirlo en el directorio de los documentos de una nueva instalación de Dolibarr directorio o en la carpeta de los documentos de esta instalación (%s). -RestoreDesc3=* Recargar el archivo de volcado guardado en la base de datos de una nueva instalación de Dolibarr o de esta instalación. Atención, una vez realizada la restauración, deberá utilizar un login/contraseña de administrador existente en el momento de la copia de seguridad para conectarse. Para restaurar la base de datos en la instalación actual, puede utilizar el asistente a continuación. -RestoreMySQL=Importación MySQL -ForcedToByAModule=Esta regla está forzada a %s por uno de los módulos activados -PreviousDumpFiles=Archivos de copia de seguridad de la base de datos disponibles -WeekStartOnDay=Primer día de la semana -RunningUpdateProcessMayBeRequired=Parece necesario realizar el proceso de actualización (la versión del programa %s difiere de la versión de la base de datos %s) -YouMustRunCommandFromCommandLineAfterLoginToUser=Debe ejecutar el comando desde un shell después de haber iniciado sesión con la cuenta %s. -YourPHPDoesNotHaveSSLSupport=Funciones SSL no disponibles en su PHP -DownloadMoreSkins=Más temas para descargar -SimpleNumRefModelDesc=Devuelve el número bajo el formato %syymm-nnnn donde yy es el año, mm el mes y nnnn un contador secuencial sin ruptura y sin volver a 0 -ShowProfIdInAddress=Mostrar el identificador profesional en las direcciones de los documentos -ShowVATIntaInAddress=Ocultar el IVA identificador en las direcciones de los documentos -TranslationUncomplete=Traducción parcial -SomeTranslationAreUncomplete=Algunos idiomas están traducidos en parte o pueden contener errores. Si lo encuentra, puede corregir los archivos de texto .lang del directorio htdocs/langs y enviarlos al foro http://www.dolibarr.fr. -MenuUseLayout=Hacer el menú izquierdo ocultable (la opción javascript no debería deshabilitarse) -MAIN_DISABLE_METEO=Deshabilitar la vista meteorológica -TestLoginToAPI=Comprobar conexión a la API -ProxyDesc=Algunas de las características de Dolibarr requieren que el servidor tenga acceso a Internet. Defina aqui los parámetros para dicho acceso. Si el servidor está detrás de un proxy, estos parámetros indican a Dolibarr cómo pasarlo. -ExternalAccess=Acceso externo -MAIN_PROXY_USE=Usar un servidor proxy (si no acceso directo a Internet) -MAIN_PROXY_HOST=Nombre/Dirección del servidor proxy -MAIN_PROXY_PORT=Puerto del servidor proxy -MAIN_PROXY_USER=Login del servidor proxy -MAIN_PROXY_PASS=Contraseña del servidor proxy -DefineHereComplementaryAttributes=Defina aquí la lista de atributos adicionales, no disponibles por defecto, y que desea gestionar para %s. -ExtraFields=Atributos adicionales -ExtraFieldsThirdParties=Atributos adicionales (terceros) -ExtraFieldsContacts=Atributos adicionales (contactos/direcciones) -ExtraFieldsMember=Atributos complementarios (miembros) -ExtraFieldsMemberType=Atributos complementarios (tipos de miembros) -ExtraFieldsCustomerInvoices=Atributos complementarios (facturas a clientes) -ExtraFieldsSupplierOrders=Atributos complementarios (pedidos) -ExtraFieldsSupplierInvoices=Atributos complementarios (facturas) -ExtraFieldsProject=Atributos complementarios (proyectos) -ExtraFieldsProjectTask=Atributos complementarios (tareas) -ExtraFieldHasWrongValue=El atributo %s tiene un valor incorrecto. -AlphaNumOnlyCharsAndNoSpace=solamente caracteres alfanuméricos sin espacios -SendingMailSetup=Configuración del envío por mail -SendmailOptionNotComplete=Atención, en algunos sistemas Linux, con este método de envio, para poder enviar mails en su nombre, la configuración de sendmail debe contener la opción -ba (parámetro mail.force_extra_parameters en el archivo php.ini). Si algunos de sus destinatarios no reciben sus mensajes, pruebe a modificar este parámetro PHP con mail.force_extra_parameters=-ba. -PathToDocuments=Rutas de acceso a documentos -PathDirectory=Directorio -SendmailOptionMayHurtBuggedMTA=La funcionalidad de enviar correo electrónico a través del "correo directo PHP" genera una solicitud que puede ser mal interpretado por algunos servidores de correo. Esto se traduce en mensajes de correo electrónico ilegibles para las personas alojadas en estas plataformas. Este es el caso de clientes en ciertos proveedores de servicios de Internet (Ej: Orange). Esto no es un problema ni de Dolibarr ni de PHP, pero sí del servidor de correo. Sin embargo, puede agregar la opción MAIN_FIX_FOR_BUGGED_MTA con valor 1 en configuración-varios para tratar que Dolibarr evite el error. Otra solución (recomendada) es utilizar el método de envío por SMTP que no tiene este inconveniente. -TranslationSetup=Configuración traducción -TranslationDesc=La elección del idioma mostrado en pantalla se modifica:
* A nivel global desde el menú Inicio - Configuración - Entorno
* De manera específica al usuario desde la pestaña Interfaz usuario de su ficha de usuario (hacer clic en su login en la parte superior izquierda de la pantalla). -ClassNotFoundIntoPathWarning=No se ha encontrado la clase %s en su path PHP -YesInSummer=Sí en verano -OnlyFollowingModulesAreOpenedToExternalUsers=Tenga en cuenta que sólo los módulos siguientes están abiertos a usuarios externos (sean cuales sean los permisos de los usuarios): -##### Module password generation= undefined= -PasswordGenerationStandard=Devuelve una contraseña generada por el algoritmo interno Dolibarr: 8 caracteres, números y caracteres en minúsculas mezcladas. -PasswordGenerationNone=No ofrece contraseñas. La contraseña se introduce manualmente. +LocalTax1IsUsedSujeto +LocalTax1IsNotUsedNo sujeto +LocalTax1IsUsedDescUso de un 2º tipo de impuesto (Distinto del IVA) +LocalTax1IsNotUsedDescNo usar un 2º tipo de impuesto (Distinto del IVA) +LocalTax1ManagementGestión 2º tipo de impuesto +LocalTax1IsUsedExample +LocalTax1IsNotUsedExample +LocalTax2IsUsedSujeto +LocalTax2IsNotUsedNo sujeto +LocalTax2IsUsedDescUso de un 3er. tipo de impuesto (Distinto del IVA) +LocalTax2IsNotUsedDescNo usar un 3er. tipo de impuesto (Distinto del IVA) +LocalTax2ManagementGestión 3er. tipo de impuesto +LocalTax2IsUsedExample +LocalTax2IsNotUsedExample +LocalTax1ManagementESGestión RE +LocalTax1IsUsedDescESEl tipo de RE propuesto por defecto en las creaciones de presupuestos, facturas, pedidos, etc. Responde a la siguiente regla:
Si el comprador no está sujeto a RE, RE por defecto=0. Final de regla.
Si el comprador está sujeto a RE entonces se aplica valor de RE por defecto. Final de regla.
+LocalTax1IsNotUsedDescESEl tipo de RE propuesto por defecto es 0. Final de regla. +LocalTax1IsUsedExampleESEn España, se trata de personas físicas: autónomos sujetos a unos epígrafes concretos del IAE. +LocalTax1IsNotUsedExampleESEn España, se trata de empresas jurídicas: Sociedades limitadas, anónimas, etc. y personas físicas (autónomos) sujetos a ciertos epígrafes del IAE. +LocalTax2ManagementESGestión IRPF +LocalTax2IsUsedDescESEl tipo de IRPF propuesto por defecto en las creaciones de presupuestos, facturas, pedidos, etc. Responde a la siguiente regla:
Si el vendedor no está sujeto a IRPF, IRPF por defecto=0. Final de regla.
Si el vendedor está sujeto a IRPF entonces se aplica valor de IRPF por defecto. Final de regla.
+LocalTax2IsNotUsedDescESEl tipo de IRPF propuesto por defecto es 0. Final de regla. +LocalTax2IsUsedExampleESEn España, se trata de personas físicas: autónomos y profesionales independientes que prestan servicios y empresas que han elegido el régimen fiscal de módulos. +LocalTax2IsNotUsedExampleESEn España, se trata de empresas no sujetas al régimen fiscal de módulos. +LabelUsedByDefaultEtiqueta que se utilizará si no se encuentra traducción para este código +LabelOnDocumentsEtiqueta sobre documentos +NbOfDaysNº de días +AtEndOfMonthA fin de mes +OffsetDecálogo +AlwaysActiveSiempre activo +UpdateRequiredSu sistema necesita una actualización. Para actualizar haga clic en Actualizar. +UpgradeActualización +MenuUpgradeActualización / Extensión +AddExtensionThemeModuleOrOtherAñadir extensión (tema, módulo, etc.) +WebServerServidor web +DocumentRootServerDirectorio raíz de las páginas web +DataRootServerDirectorio raíz de los archivos de datos +IPIP +PortPuerto +VirtualServerNameNombre del servidor virtual +AllParametersTodos los parámetros +OSSO +PhpEnvEnv +PhpModulesMódulos +PhpConfConf +PhpWebLinkVínculo Web-PHP +PearPear +PearPackagesPaquetes Pear +DatabaseBase de datos +DatabaseServerHost de la base de datos +DatabaseNameNombre de la base de datos +DatabasePortPuerto de la base de datos +DatabaseUserLogin de la base de datos +DatabasePasswordContraseña de la base de datos +DatabaseConfigurationConfiguración de la base de datos +TablesTablas +TableNameNombre de la tabla +TableLineFormatFormato líneas +NbOfRecordNº Reg. +ConstraintsConstraints +ConstraintsTypeTipo de constraint +ConstraintsToShowOrNotEntryConstraint para mostrar o no la entrada de menú +AllMustBeOkTodos deben ser controlados +HostServidor +DriverTypeTipo de driver +SummarySystemResumen de la información de sistemas Dolibarr +SummaryConstLista de todos los parámetros de configuración Dolibarr +SystemUpdateActualización del sistema +SystemSuccessfulyUpdateSu sistema se actualizó correctamente +MenuCompanySetupEmpresa/Institución +MenuNewUserNuevo usuario +MenuTopManagerGestor del menú superior +MenuLeftManagerGestor del menú izquierdo +MenuManagerGestor del menú estándar +MenuSmartphoneManagerGestor de menú smartphone +DefaultMenuTopManagerGestor del menú superior +DefaultMenuLeftManagerGestor del menú izquierdo +DefaultMenuManagerGestor del menú estándar +DefaultMenuSmartphoneManagerGestor de menú smartphone +SkinTema visual +DefaultSkinTema visual por defecto +MaxSizeListLongitud máxima de listados +DefaultMaxSizeListLongitud máxima de listados por defecto +MessageOfDayMensaje del día +MessageLoginMensaje del login +PermanentLeftSearchFormZona de búsqueda permanente del menú izquierdo +DefaultLanguageIdioma por defecto a utilizar (código idioma) +EnableMultilangInterfaceActivar interfaz multi-idioma +EnableShowLogoMostrar el logotipo en el menú de la izquierda +SystemSuccessfulyUpdatedSu sistema está actualizado +CompanyInfoInformación de la empresa/institución +CompanyIdsIdentificación reglamentaria +CompanyNameNombre/Razón social +CompanyAddressDirección +CompanyZipCódigo postal +CompanyTownPoblación +CompanyCountryPaís +CompanyCurrencyDivisa principal +DoNotShowNo mostrar +DoNotSuggestPaymentModeNo sugerir +NoActiveBankAccountDefinedNinguna cuenta bancaria activa definida +OwnerOfBankAccountTitular de la cuenta %s +BankModuleNotActiveMódulo cuentas bancarias no activado +ShowBugTrackLinkMostrar vínculo "Señalar un bug" +ShowWorkBoardMostrar panel de información en la página principal +AlertsAlertas +DelaysPlazos +DelayBeforeWarningPlazo antes de alerta +DelaysBeforeWarningPlazos antes de alerta +DelaysOfToleranceBeforeWarningPlazos de tolerancia antes de alerta +DelaysOfToleranceDescEsta pantalla permite configura los plazos de tolerancia antes de que se alerte con el símbolo %s, sobre cada elemento en retraso. +Delays_MAIN_DELAY_ACTIONS_TODOTolerancia de retraso antes de la alerta (en días) sobre acciones planificadas no realizadas +Delays_MAIN_DELAY_ORDERS_TO_PROCESSTolerancia de retraso antes de la alerta (en días) sobre pedidos de clientes no procesados +Delays_MAIN_DELAY_SUPPLIER_ORDERS_TO_PROCESSTolerancia de retraso antes de la alerta (en días) sobre pedidos a proveedores no procesados +Delays_MAIN_DELAY_PROPALS_TO_CLOSETolerancia de retraso antes de la alerta (en días) sobre presupuestos a cerrar +Delays_MAIN_DELAY_PROPALS_TO_BILLTolerancia de retraso antes de la alerta (en días) sobre presupuestos no facturados +Delays_MAIN_DELAY_NOT_ACTIVATED_SERVICESTolerancia de retraso antes de la alerta (en días) sobre servicios a activar +Delays_MAIN_DELAY_RUNNING_SERVICESTolerancia de retraso antes de la alerta (en días) sobre servicios expirados +Delays_MAIN_DELAY_SUPPLIER_BILLS_TO_PAYTolerancia de retraso antes de la alerta (en días) sobre facturas de proveedor impagadas +Delays_MAIN_DELAY_CUSTOMER_BILLS_UNPAYEDTolerancia de retraso antes de la alerta (en días) sobre facturas a cliente impagadas +Delays_MAIN_DELAY_TRANSACTIONS_TO_CONCILIATETolerancia de retraso antes de la alerta (en días) sobre conciliaciones bancarias pendientes +Delays_MAIN_DELAY_MEMBERSTolerancia de retraso entes de la alerta (en días) sobre cotizaciones adherentes en retraso +Delays_MAIN_DELAY_CHEQUES_TO_DEPOSITTolerancia de retraso entes de la alerta (en días) sobre cheques a ingresar +SetupDescription1Todas las opciones del área de configuración son opciones que permiten configurar a Dolibarr antes de empezar su utilización. +SetupDescription2Los 2 pasos indispensables de la configuración son las 2 primeras en el menú izquierdo: la configuración de la empresa/institución y la configuración de los módulos: +SetupDescription3La configuración Empresa/institución a administrar es requerida ya que se utiliza la información para la introducción de datos en la mayoría de las pantallas, en inserciones, o para modificar el comportamiento de Dolibarr (como, por ejemplo, de las funciones que dependen de su país). +SetupDescription4La configuración Módulos es indispensable ya que Dolibarr no es un ERP/CRM monolítico, es un conjunto de módulos más o menos independiente. Después de activar los módulos que le interesen comprobará sus funcionalidades en los menús de Dolibarr. +SetupDescription5Las otras entradas de configuración gestionan parámetros opcionales. +EventsSetupConfiguración del registro de eventos +LogEventsAuditoría de la seguridad de eventos +AuditAuditoría +InfoDolibarrInfo. Dolibarr +InfoOSInfo. SO +InfoWebServerInfo. servidor +InfoDatabaseInfo. base de datos +InfoPHPInfo. PHP +ListEventsAuditoría de eventos +ListOfSecurityEventsListado de eventos de seguridad Dolibarr +SecurityEventsPurgedEventos de seguridad purgados +LogEventDescPuede habilitar el registro de eventos de seguridad Dolibarr aquí. Los administradores pueden ver su contenido a través de menú Herramientas del sistema - Auditoría.Atención, esta característica puede consumir una gran cantidad de datos en la base de datos. +AreaForAdminOnlyEstas funciones solo son accesibles a un usuario administrador. +SystemInfoDescLa información del sistema es información técnica accesible solamente en solo lectura a los administradores. +SystemAreaForAdminOnlyEsta área solo es accesible a los usuarios de tipo administradores. Ningún permiso Dolibarr permite extender el círculo de usuarios autorizados a esta área. +CompanyFundationDescModifique en esta página toda la información conocida sobre la empresa o asociación a administrar (para ello haga clic en el botón "Modificar" a pie de página) +DisplayDescPuede encontrar aquí todos los parámetros relacionados con la apariencia de Dolibarr +AvailableModulesMódulos disponibles +ToActivateModulePara activar los módulos, vaya al área de Configuración (Inicio->Configuración->Módulos). +SessionTimeOutTimeout de sesiones +SessionExplanationAsegura que el período de sesiones no expirará antes de este momento. Sin embargo, la gestión del período de sesiones de PHP no garantiza que el período de sesiones expira después de este período: Este será el caso si un sistema de limpieza del caché de sesiones es activo.
Nota: Sin mecanismo especial, el mecanismo interno para limpiar el período de sesiones de PHP todos los accesos %s/%s, pero sólo en torno al acceso de otros períodos de sesiones. +TriggersAvailableTriggers disponibles +TriggersDescLos triggers son archivos que, une vez depositados en el directorio htdocs/core/triggers, modifican el comportamiento del workflow de Dolibarr. Realizan acciones suplementarias, desencadenadas por los eventos Dolibarr (creación de empresa, validación factura, cierre contrato, etc). +TriggerDisabledByNameTriggers de este archivo desactivados por el sufijo -NORUN en el nombre del archivo. +TriggerDisabledAsModuleDisabledTriggers de este archivo desactivados ya que el módulo %s no está activado. +TriggerAlwaysActiveTriggers de este archivo siempre activos, ya que los módulos Dolibarr relacionados están activados +TriggerActiveAsModuleActiveTriggers de este archivo activos ya que el módulo %s está activado +GeneratedPasswordDescIndique aquí que norma quiere utilizar para generar las contraseñas cuando quiera generar una nueva contraseña +DictionnaryDescIndique aquí los datos de referencia. Puede completar/modificar los datos predefinidos con los suyos. +ConstDescCualquier otro parámetro no editable en las páginas anteriores +OnceSetupFinishedCreateUsersAtención, está bajo una cuenta de administrador de Dolibarr. Los administradores se utilizan para configurar a Dolibarr. Para un uso corriente de Dolibarr, se recomienda utilizar una cuenta no administrador creada desde el menú "Usuarios y grupos" +MiscellaneousDescDefina aquí los otros parámetros relacionados con la seguridad. +LimitsSetupConfiguración de límites y precisiones +LimitsDescPuede definir aquí los límites y precisiones utilizados por Dolibarr +MAIN_MAX_DECIMALS_UNITDecimales máximos para los precios unitarios +MAIN_MAX_DECIMALS_TOTDecimales máximos para los precios totales +MAIN_MAX_DECIMALS_SHOWNDecimales máximos para los importes mostrados en pantalla (Poner ... después del máximo si quiere ver ... cuando el número se trunque al mostrarlo en pantalla) +MAIN_DISABLE_PDF_COMPRESSIONUtilizar la compresión PDF para los archivos PDF generados +MAIN_ROUNDING_RULE_TOTTamaño rango para el redondeo (para algunos países que redondean sobre otra base que no sea base 10) +UnitPriceOfProductPrecio unitario sin IVA de un producto +TotalPriceAfterRoundingPrecio total después del redondeo +ParameterActiveForNextInputOnlyParámetro efectivo solamente a partir de las próximas sesiones +NoEventOrNoAuditSetupNo se han registrado eventos de seguridad. Esto puede ser normal si la auditoría no ha sido habilitada en la página "configuración->seguridad->auditoría". +NoEventFoundWithCriteriaNo se han encontrado eventos de seguridad para tales criterios de búsqueda. +SeeLocalSendMailSetupVer la configuración local de sendmail +BackupDescPara realizar una copia de seguridad completa de Dolibarr, usted debe: +BackupDesc2* Guardar el contenido del directorio de documentos (%s) que contiene todos los archivos subidos o generados (comprimiendo el directorio, por ejemplo). +BackupDesc3* Guardar el contenido de su base de datos en un archivo de volcado. Para ello puede utilizar el asistente a continuación. +BackupDescXEl directorio archivado deberá guardarse en un lugar seguro. +BackupDescYEl archivo de volcado generado deberá guardarse en un lugar seguro. +BackupPHPWarningLa copia de seguridad no puede ser garantizada con este método. Es preferible utilizar el anterior +RestoreDescPara restaurar una copia de seguridad de Dolibarr, usted debe: +RestoreDesc2* Tomar el archivo (archivo zip, por ejemplo) del directorio de los documentos y descomprimirlo en el directorio de los documentos de una nueva instalación de Dolibarr directorio o en la carpeta de los documentos de esta instalación (%s). +RestoreDesc3* Recargar el archivo de volcado guardado en la base de datos de una nueva instalación de Dolibarr o de esta instalación. Atención, una vez realizada la restauración, deberá utilizar un login/contraseña de administrador existente en el momento de la copia de seguridad para conectarse. Para restaurar la base de datos en la instalación actual, puede utilizar el asistente a continuación. +RestoreMySQLImportación MySQL +ForcedToByAModuleEsta regla está forzada a %s por uno de los módulos activados +PreviousDumpFilesArchivos de copia de seguridad de la base de datos disponibles +WeekStartOnDayPrimer día de la semana +RunningUpdateProcessMayBeRequiredParece necesario realizar el proceso de actualización (la versión del programa %s difiere de la versión de la base de datos %s) +YouMustRunCommandFromCommandLineAfterLoginToUserDebe ejecutar el comando desde un shell después de haber iniciado sesión con la cuenta %s. +YourPHPDoesNotHaveSSLSupportFunciones SSL no disponibles en su PHP +DownloadMoreSkinsMás temas para descargar +SimpleNumRefModelDescDevuelve el número bajo el formato %syymm-nnnn donde yy es el año, mm el mes y nnnn un contador secuencial sin ruptura y sin volver a 0 +ShowProfIdInAddressMostrar el identificador profesional en las direcciones de los documentos +ShowVATIntaInAddressOcultar el IVA identificador en las direcciones de los documentos +TranslationUncompleteTraducción parcial +SomeTranslationAreUncompleteAlgunos idiomas están traducidos en parte o pueden contener errores. Si lo encuentra, puede corregir los archivos de texto .lang del directorio htdocs/langs y enviarlos al foro http://www.dolibarr.fr. +MenuUseLayoutHacer el menú izquierdo ocultable (la opción javascript no debería deshabilitarse) +MAIN_DISABLE_METEODeshabilitar la vista meteorológica +TestLoginToAPIComprobar conexión a la API +ProxyDescAlgunas de las características de Dolibarr requieren que el servidor tenga acceso a Internet. Defina aqui los parámetros para dicho acceso. Si el servidor está detrás de un proxy, estos parámetros indican a Dolibarr cómo pasarlo. +ExternalAccessAcceso externo +MAIN_PROXY_USEUsar un servidor proxy (si no acceso directo a Internet) +MAIN_PROXY_HOSTNombre/Dirección del servidor proxy +MAIN_PROXY_PORTPuerto del servidor proxy +MAIN_PROXY_USERLogin del servidor proxy +MAIN_PROXY_PASSContraseña del servidor proxy +DefineHereComplementaryAttributesDefina aquí la lista de atributos adicionales, no disponibles por defecto, y que desea gestionar para %s. +ExtraFieldsAtributos adicionales +ExtraFieldsThirdPartiesAtributos adicionales (terceros) +ExtraFieldsContactsAtributos adicionales (contactos/direcciones) +ExtraFieldsMemberAtributos complementarios (miembros) +ExtraFieldsMemberTypeAtributos complementarios (tipos de miembros) +ExtraFieldsCustomerInvoicesAtributos complementarios (facturas a clientes) +ExtraFieldsSupplierOrdersAtributos complementarios (pedidos) +ExtraFieldsSupplierInvoicesAtributos complementarios (facturas) +ExtraFieldsProjectAtributos complementarios (proyectos) +ExtraFieldsProjectTaskAtributos complementarios (tareas) +ExtraFieldHasWrongValueEl atributo %s tiene un valor incorrecto. +AlphaNumOnlyCharsAndNoSpacesolamente caracteres alfanuméricos sin espacios +SendingMailSetupConfiguración del envío por mail +SendmailOptionNotCompleteAtención, en algunos sistemas Linux, con este método de envio, para poder enviar mails en su nombre, la configuración de sendmail debe contener la opción -ba (parámetro mail.force_extra_parameters en el archivo php.ini). Si algunos de sus destinatarios no reciben sus mensajes, pruebe a modificar este parámetro PHP con mail.force_extra_parameters=-ba. +PathToDocumentsRutas de acceso a documentos +PathDirectoryDirectorio +SendmailOptionMayHurtBuggedMTALa funcionalidad de enviar correo electrónico a través del "correo directo PHP" genera una solicitud que puede ser mal interpretado por algunos servidores de correo. Esto se traduce en mensajes de correo electrónico ilegibles para las personas alojadas en estas plataformas. Este es el caso de clientes en ciertos proveedores de servicios de Internet (Ej: Orange). Esto no es un problema ni de Dolibarr ni de PHP, pero sí del servidor de correo. Sin embargo, puede agregar la opción MAIN_FIX_FOR_BUGGED_MTA con valor 1 en configuración-varios para tratar que Dolibarr evite el error. Otra solución (recomendada) es utilizar el método de envío por SMTP que no tiene este inconveniente. +TranslationSetupConfiguración traducción +TranslationDescLa elección del idioma mostrado en pantalla se modifica:
* A nivel global desde el menú Inicio - Configuración - Entorno
* De manera específica al usuario desde la pestaña Interfaz usuario de su ficha de usuario (hacer clic en su login en la parte superior izquierda de la pantalla). +ClassNotFoundIntoPathWarningNo se ha encontrado la clase %s en su path PHP +YesInSummerSí en verano +OnlyFollowingModulesAreOpenedToExternalUsersTenga en cuenta que sólo los módulos siguientes están abiertos a usuarios externos (sean cuales sean los permisos de los usuarios): +ConditionIsCurrentlyActualmente la condición es %s +##### Module password generation= undefined +PasswordGenerationStandardDevuelve una contraseña generada por el algoritmo interno Dolibarr: 8 caracteres, números y caracteres en minúsculas mezcladas. +PasswordGenerationNoneNo ofrece contraseñas. La contraseña se introduce manualmente. ##### Users setup ##### -UserGroupSetup=Configuración módulo usuarios y grupos -GeneratePassword=Proponer una contraseña generada -RuleForGeneratedPasswords=Norma para la generación de las contraseñas propuestas -DoNotSuggest=No proponer -EncryptedPasswordInDatabase=Permitir encriptación de las contraseñas en la base de datos -DisableForgetPasswordLinkOnLogonPage=No mostrar el vínculo "Contraseña olvidada" en la página de login -UsersSetup=Configuración del módulo usuarios -UserMailRequired=E-Mail necesario para crear un usuario nuevo +UserGroupSetupConfiguración módulo usuarios y grupos +GeneratePasswordProponer una contraseña generada +RuleForGeneratedPasswordsNorma para la generación de las contraseñas propuestas +DoNotSuggestNo proponer +EncryptedPasswordInDatabasePermitir encriptación de las contraseñas en la base de datos +DisableForgetPasswordLinkOnLogonPageNo mostrar el vínculo "Contraseña olvidada" en la página de login +UsersSetupConfiguración del módulo usuarios +UserMailRequiredE-Mail necesario para crear un usuario nuevo ##### Company setup ##### -CompanySetup=Configuración del módulo terceros -CompanyCodeChecker=Módulo de generación y control de los códigos de terceros (clientes/proveedores) -AccountCodeManager=Módulo de generación de los códigos contables (clientes/proveedores) -ModuleCompanyCodeAquarium=Devuelve un código contable compuesto de
%s seguido del código tercero de proveedor para el código contable de proveedor,
%s seguido del código tercero de cliente para el código contable de cliente. -ModuleCompanyCodePanicum=Devuelve un código contable vacío. -ModuleCompanyCodeDigitaria=Devuelve un código contable compuesto siguiendo el código de tercero. El código está formado por carácter ' C ' en primera posición seguido de los 5 primeros caracteres del código tercero. -UseNotifications=Usar notificaciones -NotificationsDesc=La función de las notificaciones permite enviar automáticamente un correo electrónico para un determinado evento Dolibarr en las empresas configuradas para ello -ModelModules=Modelos de documentos -DocumentModelOdt=Generación desde los documentos OpenDocument (Archivo .ODT OpenOffice, KOffice, TextEdit,...) -WatermarkOnDraft=Marca de agua en los documentos borrador -CompanyIdProfChecker=Reglas sobre los ID profesionales -MustBeUnique=¿Debe ser único? -MustBeMandatory=¿Debe ser obligatorio para crear terceros? -MustBeInvoiceMandatory=¿Debe ser obligatorio para validar facturas? -Miscellaneous=Miscelánea +CompanySetupConfiguración del módulo terceros +CompanyCodeCheckerMódulo de generación y control de los códigos de terceros (clientes/proveedores) +AccountCodeManagerMódulo de generación de los códigos contables (clientes/proveedores) +ModuleCompanyCodeAquariumDevuelve un código contable compuesto de
%s seguido del código tercero de proveedor para el código contable de proveedor,
%s seguido del código tercero de cliente para el código contable de cliente. +ModuleCompanyCodePanicumDevuelve un código contable vacío. +ModuleCompanyCodeDigitariaDevuelve un código contable compuesto siguiendo el código de tercero. El código está formado por carácter ' C ' en primera posición seguido de los 5 primeros caracteres del código tercero. +UseNotificationsUsar notificaciones +NotificationsDescLa función de las notificaciones permite enviar automáticamente un correo electrónico para un determinado evento Dolibarr en las empresas configuradas para ello +ModelModulesModelos de documentos +DocumentModelOdtGeneración desde los documentos OpenDocument (Archivo .ODT OpenOffice, KOffice, TextEdit,...) +WatermarkOnDraftMarca de agua en los documentos borrador +CompanyIdProfCheckerReglas sobre los ID profesionales +MustBeUnique¿Debe ser único? +MustBeMandatory¿Debe ser obligatorio para crear terceros? +MustBeInvoiceMandatory¿Debe ser obligatorio para validar facturas? +MiscellaneousMiscelánea ##### Webcal setup ##### -WebCalSetup=Configuración de enlace con el calendario Webcalendar -WebCalSyncro=Integrar los eventos Dolibarr en WebCalendar -WebCalAllways=Siempre, sin consultar -WebCalYesByDefault=Consultar (Si por defecto) -WebCalNoByDefault=Consultar (No por defecto) -WebCalNever=Nunca -WebCalURL=Dirección (URL) de acceso al calendario -WebCalServer=Servidor de la base de datos del calendario -WebCalDatabaseName=Nombre de la base de datos -WebCalUser=Usuario con acceso a la base -WebCalSetupSaved=Los datos de enlace se han guardado correctamente. -WebCalTestOk=La conexión al servidor '%s' en la base '%s' por el usuario '%s' ha sido satisfactoria. -WebCalTestKo1=La conexión al servidor '%s' ha sido satisfactoria, pero la base '%s' no se ha podido comprobar. -WebCalTestKo2=La conexión al servidor '%s' por el usuario '%s' ha fallado. -WebCalErrorConnectOkButWrongDatabase=La conexión salió bien pero la base no parece ser una base Webcalendar. -WebCalAddEventOnCreateActions=Añadir evento en el calendario en las creaciones de acciones -WebCalAddEventOnCreateCompany=Añadir evento en el calendario en la creación de empresas -WebCalAddEventOnStatusPropal=Añadir evento en el calendario en el cambio de estado de los presupuestos -WebCalAddEventOnStatusContract=Añadir evento en el calendario en el cambio de estado de los contratos -WebCalAddEventOnStatusBill=Añadir evento en el calendario en el cambio de estado de las facturas -WebCalAddEventOnStatusMember=Añadir evento en el calendario en el cambio de estado de los miembros -WebCalUrlForVCalExport=Un vínculo de exportación del calendario en formato %s estará disponible en la url: %s -WebCalCheckWebcalSetup=La configuración del módulo Webcal puede ser incorrecta +WebCalSetupConfiguración de enlace con el calendario Webcalendar +WebCalSyncroIntegrar los eventos Dolibarr en WebCalendar +WebCalAllwaysSiempre, sin consultar +WebCalYesByDefaultConsultar (Si por defecto) +WebCalNoByDefaultConsultar (No por defecto) +WebCalNeverNunca +WebCalURLDirección (URL) de acceso al calendario +WebCalServerServidor de la base de datos del calendario +WebCalDatabaseNameNombre de la base de datos +WebCalUserUsuario con acceso a la base +WebCalSetupSavedLos datos de enlace se han guardado correctamente. +WebCalTestOkLa conexión al servidor '%s' en la base '%s' por el usuario '%s' ha sido satisfactoria. +WebCalTestKo1La conexión al servidor '%s' ha sido satisfactoria, pero la base '%s' no se ha podido comprobar. +WebCalTestKo2La conexión al servidor '%s' por el usuario '%s' ha fallado. +WebCalErrorConnectOkButWrongDatabaseLa conexión salió bien pero la base no parece ser una base Webcalendar. +WebCalAddEventOnCreateActionsAñadir evento en el calendario en las creaciones de acciones +WebCalAddEventOnCreateCompanyAñadir evento en el calendario en la creación de empresas +WebCalAddEventOnStatusPropalAñadir evento en el calendario en el cambio de estado de los presupuestos +WebCalAddEventOnStatusContractAñadir evento en el calendario en el cambio de estado de los contratos +WebCalAddEventOnStatusBillAñadir evento en el calendario en el cambio de estado de las facturas +WebCalAddEventOnStatusMemberAñadir evento en el calendario en el cambio de estado de los miembros +WebCalUrlForVCalExportUn vínculo de exportación del calendario en formato %s estará disponible en la url: %s +WebCalCheckWebcalSetupLa configuración del módulo Webcal puede ser incorrecta ##### Invoices ##### -BillsSetup=Configuración del módulo Facturas -BillsDate=Fecha de las facturas -BillsNumberingModule=Módulo de numeración de facturas y abonos -BillsPDFModules=Modelo de documento de facturas -CreditNoteSetup=Configuración del módulo abonos -CreditNotePDFModules=Modelo de documento de abonos -CreditNote=Abono -CreditNotes=Abonos -ForceInvoiceDate=Forzar la fecha de factura a la fecha de validación -DisableRepeatable=Desactivar las facturas recurrentes -SuggestedPaymentModesIfNotDefinedInInvoice=Formas de pago sugeridas para las facturas si no están definidas explícitamente -EnableEditDeleteValidInvoice=Activar la posibilidad de editar/eliminar una factura validada sin pago -SuggestPaymentByRIBOnAccount=Sugerir el pago por abono en cuenta -SuggestPaymentByChequeToAddress=Sugerir el pago por cheque a -FreeLegalTextOnInvoices=Texto libre en facturas -WatermarkOnDraftInvoices=Marca de agua en las facturas borrador (en caso de estar vacío) +BillsSetupConfiguración del módulo Facturas +BillsDateFecha de las facturas +BillsNumberingModuleMódulo de numeración de facturas y abonos +BillsPDFModulesModelo de documento de facturas +CreditNoteSetupConfiguración del módulo abonos +CreditNotePDFModulesModelo de documento de abonos +CreditNoteAbono +CreditNotesAbonos +ForceInvoiceDateForzar la fecha de factura a la fecha de validación +DisableRepeatableDesactivar las facturas recurrentes +SuggestedPaymentModesIfNotDefinedInInvoiceFormas de pago sugeridas para las facturas si no están definidas explícitamente +EnableEditDeleteValidInvoiceActivar la posibilidad de editar/eliminar una factura validada sin pago +SuggestPaymentByRIBOnAccountSugerir el pago por abono en cuenta +SuggestPaymentByChequeToAddressSugerir el pago por cheque a +FreeLegalTextOnInvoicesTexto libre en facturas +WatermarkOnDraftInvoicesMarca de agua en las facturas borrador (en caso de estar vacío) ##### Proposals ##### -PropalSetup=Configuración del módulo Presupuestos -CreateForm=Creación formulario -NumberOfProductLines=Numero de líneas de productos -ProposalsNumberingModules=Módulos de numeración de presupuestos -ProposalsPDFModules=Modelos de documentos de presupuestos -ClassifiedInvoiced=Clasificar facturado -HideTreadedPropal=Ocultar los presupuestos procesados del listado -AddShippingDateAbility=Posibilidad de determinar una fecha de entrega -AddDeliveryAddressAbility=Posibilidad de seleccionar una dirección de envío -UseOptionLineIfNoQuantity=Una línea de producto/servicio que tiene una cantidad nula se considera como una opción -FreeLegalTextOnProposal=Texto libre en presupuestos -WatermarkOnDraftProposal=Marca de agua en presupuestos borrador (en caso de estar vacío) +PropalSetupConfiguración del módulo Presupuestos +CreateFormCreación formulario +NumberOfProductLinesNumero de líneas de productos +ProposalsNumberingModulesMódulos de numeración de presupuestos +ProposalsPDFModulesModelos de documentos de presupuestos +ClassifiedInvoicedClasificar facturado +HideTreadedPropalOcultar los presupuestos procesados del listado +AddShippingDateAbilityPosibilidad de determinar una fecha de entrega +AddDeliveryAddressAbilityPosibilidad de seleccionar una dirección de envío +UseOptionLineIfNoQuantityUna línea de producto/servicio que tiene una cantidad nula se considera como una opción +FreeLegalTextOnProposalTexto libre en presupuestos +WatermarkOnDraftProposalMarca de agua en presupuestos borrador (en caso de estar vacío) ##### Orders ##### -OrdersSetup=Configuración del módulo pedidos -OrdersNumberingModules=Módulos de numeración de los pedidos -OrdersModelModule=Modelos de documentos de pedidos -HideTreadedOrders=Ocultar los pedidos procesados o anulados del listado -ValidOrderAfterPropalClosed=Validar el pedido después del cierre del presupuesto, permite no pasar por el pedido provisional -FreeLegalTextOnOrders=Texto libre en pedidos -WatermarkOnDraftOrders=Marca de agua en pedidos borrador (en caso de estar vacío) +OrdersSetupConfiguración del módulo pedidos +OrdersNumberingModulesMódulos de numeración de los pedidos +OrdersModelModuleModelos de documentos de pedidos +HideTreadedOrdersOcultar los pedidos procesados o anulados del listado +ValidOrderAfterPropalClosedValidar el pedido después del cierre del presupuesto, permite no pasar por el pedido provisional +FreeLegalTextOnOrdersTexto libre en pedidos +WatermarkOnDraftOrdersMarca de agua en pedidos borrador (en caso de estar vacío) ##### Clicktodial ##### -ClickToDialSetup=Configuración del módulo Click To Dial -ClickToDialUrlDesc=URL de llamada haciendo click en el icono teléfono.
La URL completa de llamada será: URL?login=...&password=...&caller=...&called=telellamada +ClickToDialSetupConfiguración del módulo Click To Dial +ClickToDialUrlDescURL de llamada haciendo click en el icono teléfono.
La URL completa de llamada será: URL?login=...&password=...&caller=...&called=telellamada ##### Bookmark4u ##### -Bookmark4uSetup=Configuración del módulo Bookmark4u +Bookmark4uSetupConfiguración del módulo Bookmark4u ##### Interventions ##### -InterventionsSetup=Configuración del módulo intervenciones -FreeLegalTextOnInterventions=Texto adicional en las fichas de intervención -FicheinterNumberingModules=Módulos de numeración de las fichas de intervención -TemplatePDFInterventions=Modelo de documentos de las fichas de intervención -WatermarkOnDraftInterventionCards=Marca de agua en fichas de intervención (en caso de estar vacío) +InterventionsSetupConfiguración del módulo intervenciones +FreeLegalTextOnInterventionsTexto adicional en las fichas de intervención +FicheinterNumberingModulesMódulos de numeración de las fichas de intervención +TemplatePDFInterventionsModelo de documentos de las fichas de intervención +WatermarkOnDraftInterventionCardsMarca de agua en fichas de intervención (en caso de estar vacío) ##### Contracts ##### -ContractsSetup=Configuración del módulo contratos -ContractsNumberingModules=Módulos de numeración de los contratos +ContractsSetupConfiguración del módulo contratos +ContractsNumberingModulesMódulos de numeración de los contratos ##### Members ##### -MembersSetup=Configuración del módulo Asociaciones -MemberMainOptions=Opciones principales -AddSubscriptionIntoAccount=Proponer por defecto la creación de un movimiento, en el módulo bancos, en el registro de un pago de cotización -AdherentLoginRequired=Gestionar un login para cada miembro -AdherentMailRequired=E-Mail obligatorio para crear un miembro nuevo -MemberSendInformationByMailByDefault=Casilla de verificación para enviar el correo de confirmación (validación ó nueva cotización) a los miembros es por defecto "sí" +MembersSetupConfiguración del módulo Asociaciones +MemberMainOptionsOpciones principales +AddSubscriptionIntoAccountProponer por defecto la creación de un movimiento, en el módulo bancos, en el registro de un pago de cotización +AdherentLoginRequiredGestionar un login para cada miembro +AdherentMailRequiredE-Mail obligatorio para crear un miembro nuevo +MemberSendInformationByMailByDefaultCasilla de verificación para enviar el correo de confirmación (validación ó nueva cotización) a los miembros es por defecto "sí" ##### LDAP setup ##### -LDAPSetup=Configuración del módulo LDAP -LDAPGlobalParameters=Parámetros globales -LDAPUsersSynchro=Usuarios -LDAPGroupsSynchro=Grupos -LDAPContactsSynchro=Contactos -LDAPMembersSynchro=Miembros -LDAPSynchronization=Sincronización LDAP -LDAPFunctionsNotAvailableOnPHP=Las funciones LDAP no están disponibles en su PHP -LDAPToDolibarr=LDAP -> Dolibarr -DolibarrToLDAP=Dolibarr -> LDAP -LDAPNamingAttribute=Clave en LDAP -LDAPSynchronizeUsers=Organización de los usuarios en LDAP -LDAPSynchronizeGroups=Organización de los grupos en LDAP -LDAPSynchronizeContacts=Organización de los contactos en LDAP -LDAPSynchronizeMembers=Organización de los miembros en LDAP -LDAPTypeExample=OpenLdap, Egroupware o Active Directory -LDAPPrimaryServer=Servidor primario -LDAPSecondaryServer=Servidor secundario -LDAPServerPort=Puerto del servidor -LDAPServerPortExample=Puerto por defecto : 389 -LDAPServerProtocolVersion=Versión de protocolo -LDAPServerUseTLS=Usuario TLS -LDAPServerUseTLSExample=Su servidor utiliza TLS -LDAPServerDn=DN del servidor -LDAPAdminDn=DN del administrador -LDAPAdminDnExample=DN completo (ej: cn=adminldap,dc=example,dc=com) -LDAPPassword=Contraseña del administrador -LDAPUserDn=DN de los usuarios -LDAPUserDnExample=DN completo (ej: ou=users,dc=example,dc=com) -LDAPGroupDn=DN de los grupos -LDAPGroupDnExample=DN completo (ej: ou=groups,dc=example,dc=com) -LDAPServerExample=Dirección del servidor (ej: localhost, 192.168.0.2, ldaps://ldap.example.com/) -LDAPServerDnExample=DN completo (ej: dc=my-domain,dc=com) -LDAPPasswordExample=Contraseña del administrador -LDAPDnSynchroActive=Sincronización de usuarios y grupos -LDAPDnSynchroActiveExample=Sincronización LDAP hacia Dolibarr o Dolibarr hacia LDAP -LDAPDnContactActive=Sincronización de contactos -LDAPDnContactActiveYes=Sincronización activada -LDAPDnContactActiveExample=Sincronización activada/desactivada -LDAPDnMemberActive=Sincronización de los miembros -LDAPDnMemberActiveExample=Sincronización activada/desactivada -LDAPContactDn=DN de los contactos Dolibarr -LDAPContactDnExample=DN completo (ej: ou=contacts,dc=example,dc=com) -LDAPMemberDn=DN de los miembros -LDAPMemberDnExample=DN completo (ex: ou=members,dc=society,dc=com) -LDAPMemberObjectClassList=Lista de objectClass -LDAPMemberObjectClassListExample=Lista de ObjectClass que definen los atributos de un registro (ej: top,inetOrgPerson o top,user for active directory) -LDAPUserObjectClassList=Lista de objectClass -LDAPUserObjectClassListExample=Lista de ObjectClass que definen los atributos de un registro (ej: top,inetOrgPerson o top,user for active directory) -LDAPGroupObjectClassList=Lista de objectClass -LDAPGroupObjectClassListExample=Lista de ObjectClass que definen los atributos de un registro (ej: top,groupOfUniqueNames) -LDAPContactObjectClassList=Lista de objectClass -LDAPContactObjectClassListExample=Lista de objectClass que definen los atributos de un registro (ej: top,inetOrgPerson o top,user for active directory) -LDAPMemberTypeDn=DN de los tipos de miembros -LDAPMemberTypeDnExample=DN complet (ej: ou=type_members,dc=example,dc=com) -LDAPTestConnect=Probar la conexión LDAP -LDAPTestSynchroContact=Probar la sincronización de contactos -LDAPTestSynchroUser=Probar la sincronización de usuarios -LDAPTestSynchroGroup=Probar la sincronización de grupos -LDAPTestSynchroMember=Probar la sincronización de miembros -LDAPTestSearch=Probar una búsqueda LDAP -LDAPSynchroOK=Prueba de sincronización realizada correctamente -LDAPSynchroKO=Prueba de sincronización erronea -LDAPSynchroKOMayBePermissions=Error de la prueba de sincronización. Compruebe que la conexión al servidor sea correcta y que permite las actualizaciones LDAP -LDAPTCPConnectOK=Conexión TCP al servidor LDAP efectuada (Servidor=%s, Puerto=%s) -LDAPTCPConnectKO=Fallo de conexión TCP al servidor LDAP (Servidor=%s, Puerto=%s) -LDAPBindOK=Conexión/Autenticación al servidor LDAP conseguida (Servidor=%s, Puerto=%s, Admin=%s, Password=%s) -LDAPBindKO=Fallo de conexión/autentificación al servidor LDAP (Servidor=%s, Puerto=%s, Admin=%s, Password=%s) -LDAPUnbindSuccessfull=Desconexión realizada -LDAPUnbindFailed=Desconexión fallada -LDAPConnectToDNSuccessfull=Conexión a DN (%s) realizada -LDAPConnectToDNFailed=Connexión a DN (%s) fallada -LDAPSetupForVersion3=Servidor LDAP configurado en versión 3 -LDAPSetupForVersion2=Servidor LDAP configurado en versión 2 -LDAPDolibarrMapping=Mapping Dolibarr -LDAPLdapMapping=Mapping LDAP -LDAPFieldLoginUnix=Login (unix) -LDAPFieldLoginExample=Ejemplo : uid -LDAPFilterConnection=Filtro de búsqueda -LDAPFilterConnectionExample=Ejemplo : &(objectClass=inetOrgPerson) -LDAPFieldLoginSamba=Login (samba, activedirectory) -LDAPFieldLoginSambaExample=Ejemplo : samaccountname -LDAPFieldFullname=Nombre completo -LDAPFieldFullnameExample=Ejemplo : cn -LDAPFieldPassword=Contraseña -LDAPFieldPasswordNotCrypted=Contraseña no encriptada -LDAPFieldPasswordCrypted=Contraseña encriptada -LDAPFieldPasswordExample=Ejemplo : userPassword -LDAPFieldCommonName=Nombre comun -LDAPFieldCommonNameExample=Ejemplo : cn -LDAPFieldName=Nombre -LDAPFieldNameExample=Ejemplo : sn -LDAPFieldFirstName=Nombre -LDAPFieldFirstNameExample=Ejemplo : givenName -LDAPFieldMail=E-Mail -LDAPFieldMailExample=Ejemplo : mail -LDAPFieldPhone=Teléfono trabajo -LDAPFieldPhoneExample=Ejemplo : telephonenumber -LDAPFieldHomePhone=Teléfono personal -LDAPFieldHomePhoneExample=Ejemplo : homephone -LDAPFieldMobile=Teléfono móvil -LDAPFieldMobileExample=Ejemplo : mobile -LDAPFieldFax=Fax -LDAPFieldFaxExample=Ejemplo : facsimiletelephonenumber -LDAPFieldAddress=Dirección -LDAPFieldAddressExample=Ejemplo : street -LDAPFieldZip=Código postal -LDAPFieldZipExample=Ejemplo : postalcode -LDAPFieldTown=Población -LDAPFieldTownExample=Ejemplo : l -LDAPFieldCountry=País -LDAPFieldCountryExample=Ejemplo : c -LDAPFieldDescription=Descripción -LDAPFieldDescriptionExample=Ejemplo : description -LDAPFieldGroupMembers=Miembros del grupo -LDAPFieldGroupMembersExample=Ejemplo: uniqueMember -LDAPFieldBirthdate=Fecha de nacimiento -LDAPFieldBirthdateExample=Ejemplo : -LDAPFieldCompany=Empresa -LDAPFieldCompanyExample=Ejemplo : o -LDAPFieldSid=SID -LDAPFieldSidExample=Ejemplo : objectsid -LDAPFieldEndLastSubscription=Fecha finalización como miembro -LDAPFieldTitle=Puesto/Función -LDAPFieldTitleExample=Ejemplo:titulo -LDAPParametersAreStillHardCoded=Los parámetros LDAP son codificados en duro (en la clase contact) -LDAPSetupNotComplete=Configuración LDAP incompleta (a completar en las otras pestañas) -LDAPNoUserOrPasswordProvidedAccessIsReadOnly=Administrador o contraseña no indicados. Los accesos LDAP serán anónimos y en solo lectura. -LDAPDescContact=Esta página permite definir el nombre de los atributos del árbol LDAP para cada información de los contactos Dolibarr. -LDAPDescUsers=Esta página permite definir el nombre de los atributos del árbol LDAP para cada información de los usuarios Dolibarr. -LDAPDescGroups=Esta página permite definir el nombre de los atributos del árbol LDAP para cada información de los grupos usuarios Dolibarr. -LDAPDescMembers=Esta página permite definir el nombre de los atributos del árbol LDAP para cada información de los miembros del módulo Asociaciones Dolibarr. -LDAPDescValues=Los valores de ejemplos se adaptan a OpenLDAP con los schemas cargados: core.schema, cosine.schema, inetorgperson.schema). Si usted utiliza los a valores sugeridos y OpenLDAP, modifique su archivo de configuración LDAP slapd.conf para tener todos estos schemas activos. -ForANonAnonymousAccess=Para un acceso autentificado +LDAPSetupConfiguración del módulo LDAP +LDAPGlobalParametersParámetros globales +LDAPUsersSynchroUsuarios +LDAPGroupsSynchroGrupos +LDAPContactsSynchroContactos +LDAPMembersSynchroMiembros +LDAPSynchronizationSincronización LDAP +LDAPFunctionsNotAvailableOnPHPLas funciones LDAP no están disponibles en su PHP +LDAPToDolibarrLDAP -> Dolibarr +DolibarrToLDAPDolibarr -> LDAP +LDAPNamingAttributeClave en LDAP +LDAPSynchronizeUsersOrganización de los usuarios en LDAP +LDAPSynchronizeGroupsOrganización de los grupos en LDAP +LDAPSynchronizeContactsOrganización de los contactos en LDAP +LDAPSynchronizeMembersOrganización de los miembros en LDAP +LDAPTypeExampleOpenLdap, Egroupware o Active Directory +LDAPPrimaryServerServidor primario +LDAPSecondaryServerServidor secundario +LDAPServerPortPuerto del servidor +LDAPServerPortExamplePuerto por defecto : 389 +LDAPServerProtocolVersionVersión de protocolo +LDAPServerUseTLSUsuario TLS +LDAPServerUseTLSExampleSu servidor utiliza TLS +LDAPServerDnDN del servidor +LDAPAdminDnDN del administrador +LDAPAdminDnExampleDN completo (ej: cn=adminldap,dc=example,dc=com) +LDAPPasswordContraseña del administrador +LDAPUserDnDN de los usuarios +LDAPUserDnExampleDN completo (ej: ou=users,dc=example,dc=com) +LDAPGroupDnDN de los grupos +LDAPGroupDnExampleDN completo (ej: ou=groups,dc=example,dc=com) +LDAPServerExampleDirección del servidor (ej: localhost, 192.168.0.2, ldaps://ldap.example.com/) +LDAPServerDnExampleDN completo (ej: dc=my-domain,dc=com) +LDAPPasswordExampleContraseña del administrador +LDAPDnSynchroActiveSincronización de usuarios y grupos +LDAPDnSynchroActiveExampleSincronización LDAP hacia Dolibarr o Dolibarr hacia LDAP +LDAPDnContactActiveSincronización de contactos +LDAPDnContactActiveYesSincronización activada +LDAPDnContactActiveExampleSincronización activada/desactivada +LDAPDnMemberActiveSincronización de los miembros +LDAPDnMemberActiveExampleSincronización activada/desactivada +LDAPContactDnDN de los contactos Dolibarr +LDAPContactDnExampleDN completo (ej: ou=contacts,dc=example,dc=com) +LDAPMemberDnDN de los miembros +LDAPMemberDnExampleDN completo (ex: ou=members,dc=society,dc=com) +LDAPMemberObjectClassListLista de objectClass +LDAPMemberObjectClassListExampleLista de ObjectClass que definen los atributos de un registro (ej: top,inetOrgPerson o top,user for active directory) +LDAPUserObjectClassListLista de objectClass +LDAPUserObjectClassListExampleLista de ObjectClass que definen los atributos de un registro (ej: top,inetOrgPerson o top,user for active directory) +LDAPGroupObjectClassListLista de objectClass +LDAPGroupObjectClassListExampleLista de ObjectClass que definen los atributos de un registro (ej: top,groupOfUniqueNames) +LDAPContactObjectClassListLista de objectClass +LDAPContactObjectClassListExampleLista de objectClass que definen los atributos de un registro (ej: top,inetOrgPerson o top,user for active directory) +LDAPMemberTypeDnDN de los tipos de miembros +LDAPMemberTypeDnExampleDN complet (ej: ou=type_members,dc=example,dc=com) +LDAPTestConnectProbar la conexión LDAP +LDAPTestSynchroContactProbar la sincronización de contactos +LDAPTestSynchroUserProbar la sincronización de usuarios +LDAPTestSynchroGroupProbar la sincronización de grupos +LDAPTestSynchroMemberProbar la sincronización de miembros +LDAPTestSearchProbar una búsqueda LDAP +LDAPSynchroOKPrueba de sincronización realizada correctamente +LDAPSynchroKOPrueba de sincronización erronea +LDAPSynchroKOMayBePermissionsError de la prueba de sincronización. Compruebe que la conexión al servidor sea correcta y que permite las actualizaciones LDAP +LDAPTCPConnectOKConexión TCP al servidor LDAP efectuada (Servidor=%s, Puerto=%s) +LDAPTCPConnectKOFallo de conexión TCP al servidor LDAP (Servidor=%s, Puerto=%s) +LDAPBindOKConexión/Autenticación al servidor LDAP conseguida (Servidor=%s, Puerto=%s, Admin=%s, Password=%s) +LDAPBindKOFallo de conexión/autentificación al servidor LDAP (Servidor=%s, Puerto=%s, Admin=%s, Password=%s) +LDAPUnbindSuccessfullDesconexión realizada +LDAPUnbindFailedDesconexión fallada +LDAPConnectToDNSuccessfullConexión a DN (%s) realizada +LDAPConnectToDNFailedConnexión a DN (%s) fallada +LDAPSetupForVersion3Servidor LDAP configurado en versión 3 +LDAPSetupForVersion2Servidor LDAP configurado en versión 2 +LDAPDolibarrMappingMapping Dolibarr +LDAPLdapMappingMapping LDAP +LDAPFieldLoginUnixLogin (unix) +LDAPFieldLoginExampleEjemplo : uid +LDAPFilterConnectionFiltro de búsqueda +LDAPFilterConnectionExampleEjemplo : &(objectClass=inetOrgPerson) +LDAPFieldLoginSambaLogin (samba, activedirectory) +LDAPFieldLoginSambaExampleEjemplo : samaccountname +LDAPFieldFullnameNombre completo +LDAPFieldFullnameExampleEjemplo : cn +LDAPFieldPasswordContraseña +LDAPFieldPasswordNotCryptedContraseña no encriptada +LDAPFieldPasswordCryptedContraseña encriptada +LDAPFieldPasswordExampleEjemplo : userPassword +LDAPFieldCommonNameNombre comun +LDAPFieldCommonNameExampleEjemplo : cn +LDAPFieldNameNombre +LDAPFieldNameExampleEjemplo : sn +LDAPFieldFirstNameNombre +LDAPFieldFirstNameExampleEjemplo : givenName +LDAPFieldMailE-Mail +LDAPFieldMailExampleEjemplo : mail +LDAPFieldPhoneTeléfono trabajo +LDAPFieldPhoneExampleEjemplo : telephonenumber +LDAPFieldHomePhoneTeléfono personal +LDAPFieldHomePhoneExampleEjemplo : homephone +LDAPFieldMobileTeléfono móvil +LDAPFieldMobileExampleEjemplo : mobile +LDAPFieldFaxFax +LDAPFieldFaxExampleEjemplo : facsimiletelephonenumber +LDAPFieldAddressDirección +LDAPFieldAddressExampleEjemplo : street +LDAPFieldZipCódigo postal +LDAPFieldZipExampleEjemplo : postalcode +LDAPFieldTownPoblación +LDAPFieldTownExampleEjemplo : l +LDAPFieldCountryPaís +LDAPFieldCountryExampleEjemplo : c +LDAPFieldDescriptionDescripción +LDAPFieldDescriptionExampleEjemplo : description +LDAPFieldGroupMembersMiembros del grupo +LDAPFieldGroupMembersExampleEjemplo: uniqueMember +LDAPFieldBirthdateFecha de nacimiento +LDAPFieldBirthdateExampleEjemplo : +LDAPFieldCompanyEmpresa +LDAPFieldCompanyExampleEjemplo : o +LDAPFieldSidSID +LDAPFieldSidExampleEjemplo : objectsid +LDAPFieldEndLastSubscriptionFecha finalización como miembro +LDAPFieldTitlePuesto/Función +LDAPFieldTitleExampleEjemplo:titulo +LDAPParametersAreStillHardCodedLos parámetros LDAP son codificados en duro (en la clase contact) +LDAPSetupNotCompleteConfiguración LDAP incompleta (a completar en las otras pestañas) +LDAPNoUserOrPasswordProvidedAccessIsReadOnlyAdministrador o contraseña no indicados. Los accesos LDAP serán anónimos y en solo lectura. +LDAPDescContactEsta página permite definir el nombre de los atributos del árbol LDAP para cada información de los contactos Dolibarr. +LDAPDescUsersEsta página permite definir el nombre de los atributos del árbol LDAP para cada información de los usuarios Dolibarr. +LDAPDescGroupsEsta página permite definir el nombre de los atributos del árbol LDAP para cada información de los grupos usuarios Dolibarr. +LDAPDescMembersEsta página permite definir el nombre de los atributos del árbol LDAP para cada información de los miembros del módulo Asociaciones Dolibarr. +LDAPDescValuesLos valores de ejemplos se adaptan a OpenLDAP con los schemas cargados: core.schema, cosine.schema, inetorgperson.schema). Si usted utiliza los a valores sugeridos y OpenLDAP, modifique su archivo de configuración LDAP slapd.conf para tener todos estos schemas activos. +ForANonAnonymousAccessPara un acceso autentificado ##### Products/Services ##### -ProductSetup=Configuración del módulo Productos -ServiceSetup=Configuración del módulo Servicios -ProductServiceSetup=Configuración de los módulos Productos y Servicios -NumberOfProductShowInSelect=Nº de productos máx. en las listas (0=sin límite) -ConfirmDeleteProductLineAbility=Confirmación de eliminación de una línea de producido en los formularios -ModifyProductDescAbility=Personalización de las descripciones de los productos en los formularios -ViewProductDescInFormAbility=Visualización de las descripciones de los productos en los formularios -ViewProductDescInThirdpartyLanguageAbility=Visualización de las descripciones de productos en el idioma del tercero -UseSearchToSelectProduct=Utilizar un formulario de búsqueda para la selección de un producto (en vez de la lista desplegable). Tenga en cuenta que si tiene un número importante de productos o servicios (> 100 000), puede mejorar el rendimiento definiendo la constante PRODUCT_DONOTSEARCH_ANYWHERE a 1 en Configuración->Varios. La búsqueda quedará limitada al inicio de la cadena. -UseEcoTaxeAbility=Asumir ecotasa (DEEE) -SetDefaultBarcodeTypeProducts=Tipo de código de barras utilizado por defecto para los productos -SetDefaultBarcodeTypeThirdParties=Tipo de código de barras utilizado por defecto para los terceros -ProductCodeChecker=Módulo para la generación y comprobación del código de un producto o servicio -ProductOtherConf=Configuración de productos/servicios +ProductSetupConfiguración del módulo Productos +ServiceSetupConfiguración del módulo Servicios +ProductServiceSetupConfiguración de los módulos Productos y Servicios +NumberOfProductShowInSelectNº de productos máx. en las listas (0=sin límite) +ConfirmDeleteProductLineAbilityConfirmación de eliminación de una línea de producido en los formularios +ModifyProductDescAbilityPersonalización de las descripciones de los productos en los formularios +ViewProductDescInFormAbilityVisualización de las descripciones de los productos en los formularios +ViewProductDescInThirdpartyLanguageAbilityVisualización de las descripciones de productos en el idioma del tercero +UseSearchToSelectProductUtilizar un formulario de búsqueda para la selección de un producto (en vez de la lista desplegable). Tenga en cuenta que si tiene un número importante de productos o servicios (> 100 000), puede mejorar el rendimiento definiendo la constante PRODUCT_DONOTSEARCH_ANYWHERE a 1 en Configuración->Varios. La búsqueda quedará limitada al inicio de la cadena. +UseEcoTaxeAbilityAsumir ecotasa (DEEE) +SetDefaultBarcodeTypeProductsTipo de código de barras utilizado por defecto para los productos +SetDefaultBarcodeTypeThirdPartiesTipo de código de barras utilizado por defecto para los terceros +ProductCodeCheckerMódulo para la generación y comprobación del código de un producto o servicio +ProductOtherConfConfiguración de productos/servicios ##### Syslog ##### -SyslogSetup=Configuración del módulo Syslog -SyslogOutput=Salida del log -SyslogSyslog=Syslog -SyslogFacility=Facilidad -SyslogLevel=Nivel -SyslogSimpleFile=Archivo -SyslogFilename=Nombre y ruta del archivo -YouCanUseDOL_DATA_ROOT=Puede utilizar DOL_DATA_ROOT/dolibarr.log para un registro en el directorio "documentos" de Dolibarr. Sin embargo, puede establecer un directorio diferente para guardar este archivo. -ErrorUnknownSyslogConstant=La constante %s no es una constante syslog conocida -OnlyWindowsLOG_USER=Windows sólo soporta LOG_USER +SyslogSetupConfiguración del módulo Syslog +SyslogOutputSalida del log +SyslogSyslogSyslog +SyslogFacilityFacilidad +SyslogLevelNivel +SyslogSimpleFileArchivo +SyslogFilenameNombre y ruta del archivo +YouCanUseDOL_DATA_ROOTPuede utilizar DOL_DATA_ROOT/dolibarr.log para un registro en el directorio "documentos" de Dolibarr. Sin embargo, puede establecer un directorio diferente para guardar este archivo. +ErrorUnknownSyslogConstantLa constante %s no es una constante syslog conocida +OnlyWindowsLOG_USERWindows sólo soporta LOG_USER ##### Donations ##### -DonationsSetup=Configuración del módulo donaciones -DonationsReceiptModel=Modelo recepción de donaciones +DonationsSetupConfiguración del módulo donaciones +DonationsReceiptModelModelo recepción de donaciones ##### Barcode ##### -BarcodeSetup=Configuración de los códigos de barras -PaperFormatModule=Módulos de formatos de impresión -BarcodeEncodeModule=Módulos de codificación de los códigos de barras -UseBarcodeInProductModule=Utilizar los códigos de barras en los productos -CodeBarGenerator=Generador del código -ChooseABarCode=Ningún generador seleccionado -FormatNotSupportedByGenerator=Formato no generado por este generador -BarcodeDescEAN8=Códigos de barras tipo EAN8 -BarcodeDescEAN13=Códigos de barras tipo EAN13 -BarcodeDescUPC=Códigos de barras tipo UPC -BarcodeDescISBN=Códigos de barras tipo ISBN -BarcodeDescC39=Códigos de barras tipo C39 -BarcodeDescC128=Códigos de barras tipo C128 -GenbarcodeLocation=Herramienta de generación de códigos de barras en líneas de pedidos (utilizado por el motor phpbar para determinados tipos de códigos de barras) -BarcodeInternalEngine=Motor interno +BarcodeSetupConfiguración de los códigos de barras +PaperFormatModuleMódulos de formatos de impresión +BarcodeEncodeModuleMódulos de codificación de los códigos de barras +UseBarcodeInProductModuleUtilizar los códigos de barras en los productos +CodeBarGeneratorGenerador del código +ChooseABarCodeNingún generador seleccionado +FormatNotSupportedByGeneratorFormato no generado por este generador +BarcodeDescEAN8Códigos de barras tipo EAN8 +BarcodeDescEAN13Códigos de barras tipo EAN13 +BarcodeDescUPCCódigos de barras tipo UPC +BarcodeDescISBNCódigos de barras tipo ISBN +BarcodeDescC39Códigos de barras tipo C39 +BarcodeDescC128Códigos de barras tipo C128 +GenbarcodeLocationHerramienta de generación de códigos de barras en líneas de pedidos (utilizado por el motor phpbar para determinados tipos de códigos de barras) +BarcodeInternalEngineMotor interno ##### Prelevements ##### -WithdrawalsSetup=Configuración del módulo domiciliaciones +WithdrawalsSetupConfiguración del módulo domiciliaciones ##### ExternalRSS ##### -ExternalRSSSetup=Configuración de las importaciones del flujo RSS -NewRSS=Sindicación de un nuevo flujo RSS -RSSUrl=URL del RSS -RSSUrlExample=Un flujo RSS interesante +ExternalRSSSetupConfiguración de las importaciones del flujo RSS +NewRSSSindicación de un nuevo flujo RSS +RSSUrlURL del RSS +RSSUrlExampleUn flujo RSS interesante ##### Mailing ##### -MailingSetup=Configuración del módulo E-Mailing -MailingEMailFrom=E-Mail emisor (From) de los correos enviados por E-Mailing -MailingEMailError=E-Mail de respuesta (Errors-to) para las respuestas acerca de envíos por e-mailing con error. +MailingSetupConfiguración del módulo E-Mailing +MailingEMailFromE-Mail emisor (From) de los correos enviados por E-Mailing +MailingEMailErrorE-Mail de respuesta (Errors-to) para las respuestas acerca de envíos por e-mailing con error. ##### Notification ##### -NotificationSetup=Configuración del módulo notificaciones -NotificationEMailFrom=E-Mail emisor (From) de los correos enviados a través de notificaciones -ListOfAvailableNotifications=Listado de notificaciones disponibles (depende de los módulos activados) +NotificationSetupConfiguración del módulo notificaciones +NotificationEMailFromE-Mail emisor (From) de los correos enviados a través de notificaciones +ListOfAvailableNotificationsListado de notificaciones disponibles (depende de los módulos activados) ##### Sendings ##### -SendingsSetup=Configuración del módulo Expediciones -SendingsReceiptModel=Modelo de notas de entrega -SendingsNumberingModules=Módulos de numeración de notas de entrega -SendingsAbility=Uso de notas de entrega para los envíos a clientes -NoNeedForDeliveryReceipts=En la mayoría de los casos, las notas de entrega (lista de productos enviados) también actúan como notas de recepción y son firmadas por el cliente. La gestión de las notas de recepción es por lo tanto redundante y rara vez se activará. -FreeLegalTextOnShippings=Mención complementaria en las notas de entrega +SendingsSetupConfiguración del módulo Expediciones +SendingsReceiptModelModelo de notas de entrega +SendingsNumberingModulesMódulos de numeración de notas de entrega +SendingsAbilityUso de notas de entrega para los envíos a clientes +NoNeedForDeliveryReceiptsEn la mayoría de los casos, las notas de entrega (lista de productos enviados) también actúan como notas de recepción y son firmadas por el cliente. La gestión de las notas de recepción es por lo tanto redundante y rara vez se activará. +FreeLegalTextOnShippingsMención complementaria en las notas de entrega ##### Deliveries ##### -DeliveryOrderNumberingModules=Módulo de numeración de las notas de entraga -DeliveryOrderModel=Modelo de notas de recepción -DeliveriesOrderAbility=Uso de notas de recepción -FreeLegalTextOnDeliveryReceipts=Texto libre en las notas de recepción +DeliveryOrderNumberingModulesMódulo de numeración de las notas de entraga +DeliveryOrderModelModelo de notas de recepción +DeliveriesOrderAbilityUso de notas de recepción +FreeLegalTextOnDeliveryReceiptsTexto libre en las notas de recepción ##### FCKeditor ##### -AdvancedEditor=Editor avanzado -ActivateFCKeditor=Activar editor avanzado para : -FCKeditorForCompany=Creación/edición WYSIWIG de la descripción y notas de los terceros -FCKeditorForProduct=Creación/edición WYSIWIG de la descripción y notas de los productos/servicios -FCKeditorForProductDetails=Creación/edición WYSIWIG de las líneas de detalle de los productos (en pedidos, presupuestos, facturas, etc.) -FCKeditorForMailing=Creación/edición WYSIWIG de los E-Mails (Utilidades->E-Mailings) -FCKeditorForUserSignature=Creación/edición WYSIWIG de la firma de usuarios -FCKeditorForMail=Creación/edición WYSIWIG de todos los E-Mails (excepto Utilidades->E-Mailings) +AdvancedEditorEditor avanzado +ActivateFCKeditorActivar editor avanzado para : +FCKeditorForCompanyCreación/edición WYSIWIG de la descripción y notas de los terceros +FCKeditorForProductCreación/edición WYSIWIG de la descripción y notas de los productos/servicios +FCKeditorForProductDetailsCreación/edición WYSIWIG de las líneas de detalle de los productos (en pedidos, presupuestos, facturas, etc.) +FCKeditorForMailingCreación/edición WYSIWIG de los E-Mails (Utilidades->E-Mailings) +FCKeditorForUserSignatureCreación/edición WYSIWIG de la firma de usuarios +FCKeditorForMailCreación/edición WYSIWIG de todos los E-Mails (excepto Utilidades->E-Mailings) ##### OSCommerce 1 ##### -OSCommerceErrorConnectOkButWrongDatabase=La conexión se ha establecido, pero la base de datos no parece de OSCommerce. -OSCommerceTestOk=La conexión al servidor '%s' sobre la base '%s' por el usuario '%s' es correcta. -OSCommerceTestKo1=La conexión al servidor '%s' sobre la base '%s' por el usuario '%s' no se pudo efectuar. -OSCommerceTestKo2=La conexión al servidor '%s' por el usuario '%s' ha fallado. +OSCommerceErrorConnectOkButWrongDatabaseLa conexión se ha establecido, pero la base de datos no parece de OSCommerce. +OSCommerceTestOkLa conexión al servidor '%s' sobre la base '%s' por el usuario '%s' es correcta. +OSCommerceTestKo1La conexión al servidor '%s' sobre la base '%s' por el usuario '%s' no se pudo efectuar. +OSCommerceTestKo2La conexión al servidor '%s' por el usuario '%s' ha fallado. ##### Mantis ##### -MantisSetup=Configuración del enlace con el sistema de seguimiento Mantis -MantisURL=Dirección (URL) de acceso a Mantis -MantisServer=Servidor de la base de datos Mantis -MantisDatabaseName=Nombre de la base de datos Mantis -MantisUser=Identificador de acceso a la base -MantisSetupSaved=Los identificadores Mantis se han guardado correctamente -MantisTestOk=La conexión al servidor '%s' sobre la base de datos '%s' por el usuario '%s' es correcta. -MantisTestKo1=La conexión al servidor '%s' es correcta pero la base de datos' %s ' no pudo comprobarse. -MantisTestKo2=La conexión al servidor '%s' por el usuario '%s' a fallado. -MantisErrorConnectOkButWrongDatabase=La conexión es correcta pero la base de datos no parece ser una base de datos Mantis. +MantisSetupConfiguración del enlace con el sistema de seguimiento Mantis +MantisURLDirección (URL) de acceso a Mantis +MantisServerServidor de la base de datos Mantis +MantisDatabaseNameNombre de la base de datos Mantis +MantisUserIdentificador de acceso a la base +MantisSetupSavedLos identificadores Mantis se han guardado correctamente +MantisTestOkLa conexión al servidor '%s' sobre la base de datos '%s' por el usuario '%s' es correcta. +MantisTestKo1La conexión al servidor '%s' es correcta pero la base de datos' %s ' no pudo comprobarse. +MantisTestKo2La conexión al servidor '%s' por el usuario '%s' a fallado. +MantisErrorConnectOkButWrongDatabaseLa conexión es correcta pero la base de datos no parece ser una base de datos Mantis. ##### Stock ##### -StockSetup=Configuración del módulo Stocks -UserWarehouse=Utilizar los stocks personales de usuarios +StockSetupConfiguración del módulo Stocks +UserWarehouseUtilizar los stocks personales de usuarios ##### Menu ##### -MenuDeleted=Menú eliminado -TreeMenu=Estructura de los menús -Menus=Menús -TreeMenuPersonalized=Menús personalizados -NewMenu=Nuevo menú -MenuConf=Configuración de los menús -Menu=Selección de los menús -MenuHandler=Gestor de menús -MenuModule=Módulo origen -HideUnauthorizedMenu=Ocultar también los menús no autorizados a usuarios internos (si no sólo atenuados) -DetailId=Identificador del menú -DetailMenuHandler=Nombre del gestor de menús -DetailMenuModule=Nombre del módulo si la entrada del menú es resultante de un módulo -DetailType=Tipo de menú (superior o izquierdo) -DetailTitre=Etiqueta de menú -DetailMainmenu=Grupo al cual pertenece (obsoleto) -DetailUrl=URL de la página hacia la cual el menú apunta -DetailLeftmenu=Condición de visualización o no (obsoleto) -DetailEnabled=Condición de mostrar o no -DetailRight=Condición de visualización completa o restringida -DetailLangs=Archivo .lang para la traducción del título -DetailUser=Interno / Externo / Todos -Target=Objetivo -DetailTarget=Comportamiento del enlace (_blank para abrir una nueva ventana) -DetailLevel=Nivel (-1:menú superior, 0:principal, >0 menú y submenú) -ModifMenu=Modificación del menú -DeleteMenu=Eliminar entrada de menú -ConfirmDeleteMenu=Está seguro de querer eliminar la entrada de menú %s ? -DeleteLine=Eliminación de línea -ConfirmDeleteLine=¿Está seguro de querer eliminar esta línea? +MenuDeletedMenú eliminado +TreeMenuEstructura de los menús +MenusMenús +TreeMenuPersonalizedMenús personalizados +NewMenuNuevo menú +MenuConfConfiguración de los menús +MenuSelección de los menús +MenuHandlerGestor de menús +MenuModuleMódulo origen +HideUnauthorizedMenuOcultar también los menús no autorizados a usuarios internos (si no sólo atenuados) +DetailIdIdentificador del menú +DetailMenuHandlerNombre del gestor de menús +DetailMenuModuleNombre del módulo si la entrada del menú es resultante de un módulo +DetailTypeTipo de menú (superior o izquierdo) +DetailTitreEtiqueta de menú +DetailMainmenuGrupo al cual pertenece (obsoleto) +DetailUrlURL de la página hacia la cual el menú apunta +DetailLeftmenuCondición de visualización o no (obsoleto) +DetailEnabledCondición de mostrar o no +DetailRightCondición de visualización completa o restringida +DetailLangsArchivo .lang para la traducción del título +DetailUserInterno / Externo / Todos +TargetObjetivo +DetailTargetComportamiento del enlace (_blank para abrir una nueva ventana) +DetailLevelNivel (-1:menú superior, 0:principal, >0 menú y submenú) +ModifMenuModificación del menú +DeleteMenuEliminar entrada de menú +ConfirmDeleteMenuEstá seguro de querer eliminar la entrada de menú %s ? +DeleteLineEliminación de línea +ConfirmDeleteLine¿Está seguro de querer eliminar esta línea? ##### Tax ##### -TaxSetup=Configuración del módulo Impuestos, cargas sociales y dividendos -OptionVatMode=Opción de carga de IVA -OptionVATDefault=Estándar -OptionVATDebitOption=Opción servicios a débito -OptionVatDefaultDesc=La carga del IVA es:
-en el envío de los bienes (en la práctica se usa la fecha de la factura)
-sobre el pago por los servicios -OptionVatDebitOptionDesc=La carga del IVA es:
-en el envío de los bienes (en la práctica se usa la fecha de la factura)
-sobre la facturación de los servicios -SummaryOfVatExigibilityUsedByDefault=Momento de exigibilidad por defecto el IVA para la opción escogida: -OnDelivery=En la entrega -OnPayment=En el pago -OnInvoice=En la factura -SupposedToBePaymentDate=Fecha de pago usada -SupposedToBeInvoiceDate=Fecha de factura usada -Buy=Compra -Sell=Venta -InvoiceDateUsed=Fecha usada de factura -YourCompanyDoesNotUseVAT=Su empresa está configurada como no sujeta al IVA (Inicio - Configuración - Empresa/Institución), por lo que no hay opción para la paremetrización del IVA. -AccountancyCode=Código contable -AccountancyCodeSell=Código contable ventas -AccountancyCodeBuy=Código contable compras +TaxSetupConfiguración del módulo Impuestos, cargas sociales y dividendos +OptionVatModeOpción de carga de IVA +OptionVATDefaultEstándar +OptionVATDebitOptionOpción servicios a débito +OptionVatDefaultDescLa carga del IVA es:
-en el envío de los bienes (en la práctica se usa la fecha de la factura)
-sobre el pago por los servicios +OptionVatDebitOptionDescLa carga del IVA es:
-en el envío de los bienes (en la práctica se usa la fecha de la factura)
-sobre la facturación de los servicios +SummaryOfVatExigibilityUsedByDefaultMomento de exigibilidad por defecto el IVA para la opción escogida: +OnDeliveryEn la entrega +OnPaymentEn el pago +OnInvoiceEn la factura +SupposedToBePaymentDateFecha de pago usada +SupposedToBeInvoiceDateFecha de factura usada +BuyCompra +SellVenta +InvoiceDateUsedFecha usada de factura +YourCompanyDoesNotUseVATSu empresa está configurada como no sujeta al IVA (Inicio - Configuración - Empresa/Institución), por lo que no hay opción para la paremetrización del IVA. +AccountancyCodeCódigo contable +AccountancyCodeSellCódigo contable ventas +AccountancyCodeBuyCódigo contable compras ##### Agenda ##### -AgendaSetup=Módulo configuración de acciones y agenda -PasswordTogetVCalExport=Clave de autorización vcal export link -PastDelayVCalExport=No exportar los eventos de más de -AGENDA_USE_EVENT_TYPE=Usar los tipos de eventos (administrables desde Configuración->Diccionarios->llx_c_actioncomm) +AgendaSetupMódulo configuración de acciones y agenda +PasswordTogetVCalExportClave de autorización vcal export link +PastDelayVCalExportNo exportar los eventos de más de +AGENDA_USE_EVENT_TYPEUsar los tipos de eventos (administrables desde Configuración->Diccionarios->llx_c_actioncomm) ##### ClickToDial ##### -ClickToDialDesc=Este módulo permite agregar un icono después del número de teléfono de contactos Dolibarr. Un clic en este icono, Llama a un servidor con una URL que se indica a continuación. Esto puede ser usado para llamar al sistema call center de Dolibarr que puede llamar al número de teléfono en un sistema SIP, por ejemplo. +ClickToDialDescEste módulo permite agregar un icono después del número de teléfono de contactos Dolibarr. Un clic en este icono, Llama a un servidor con una URL que se indica a continuación. Esto puede ser usado para llamar al sistema call center de Dolibarr que puede llamar al número de teléfono en un sistema SIP, por ejemplo. ##### Point Of Sales (CashDesk) ##### -CashDesk=TPV -CashDeskSetup=Configuración del módulo Terminal Punto de Venta -CashDeskThirdPartyForSell=Tercero genérico a usar para la venta -CashDeskBankAccountForSell=Cuenta por defecto a utilizar para los cobros en efectivo (caja) -CashDeskBankAccountForCheque=Cuenta por defecto a utilizar para los cobros con cheques -CashDeskBankAccountForCB=Cuenta por defecto a utilizar para los cobros con tarjeta de crédito -CashDeskIdWareHouse=Almacén a utilizar para las ventas +CashDeskTPV +CashDeskSetupConfiguración del módulo Terminal Punto de Venta +CashDeskThirdPartyForSellTercero genérico a usar para la venta +CashDeskBankAccountForSellCuenta por defecto a utilizar para los cobros en efectivo (caja) +CashDeskBankAccountForChequeCuenta por defecto a utilizar para los cobros con cheques +CashDeskBankAccountForCBCuenta por defecto a utilizar para los cobros con tarjeta de crédito +CashDeskIdWareHouseAlmacén a utilizar para las ventas ##### Bookmark ##### -BookmarkSetup=Configuración del módulo Marcadores -BookmarkDesc=Este módulo le permite gestionar los enlaces y accesos directos. También permite añadir cualquier página de Dolibarr o enlace web en el menú de acceso rápido de la izquierda. -NbOfBoomarkToShow=Número máximo de marcadores que se mostrará en el menú +BookmarkSetupConfiguración del módulo Marcadores +BookmarkDescEste módulo le permite gestionar los enlaces y accesos directos. También permite añadir cualquier página de Dolibarr o enlace web en el menú de acceso rápido de la izquierda. +NbOfBoomarkToShowNúmero máximo de marcadores que se mostrará en el menú ##### WebServices ##### -WebServicesSetup=Configuración del módulo Web services -WebServicesDesc=Mediante la activación de este módulo, Dolibarr se convierte en servidor de servicios web ofreciendo diversos servicios web. -WSDLCanBeDownloadedHere=La descripción WSDL de los servicios prestados se pueden recuperar aquí -EndPointIs=Los clientes SOAP deberán enviar sus solicitudes al punto final en la URL Dolibarr +WebServicesSetupConfiguración del módulo Web services +WebServicesDescMediante la activación de este módulo, Dolibarr se convierte en servidor de servicios web ofreciendo diversos servicios web. +WSDLCanBeDownloadedHereLa descripción WSDL de los servicios prestados se pueden recuperar aquí +EndPointIsLos clientes SOAP deberán enviar sus solicitudes al punto final en la URL Dolibarr ##### Bank ##### -BankSetupModule=Configuración del módulo Banco -FreeLegalTextOnChequeReceipts=Mención complementaria en las remesas de cheques -BankOrderShow=Orden de visualización de la información bancaria al usar la "cuenta bancaria detallada" -BankOrderGlobal=General -BankOrderGlobalDesc=Orden de visualización general -BankOrderES=Español -BankOrderESDesc=Orden de visualización español +BankSetupModuleConfiguración del módulo Banco +FreeLegalTextOnChequeReceiptsMención complementaria en las remesas de cheques +BankOrderShowOrden de visualización de la información bancaria al usar la "cuenta bancaria detallada" +BankOrderGlobalGeneral +BankOrderGlobalDescOrden de visualización general +BankOrderESEspañol +BankOrderESDescOrden de visualización español ##### Multicompany ##### -MultiCompanySetup=Configuración del módulo Multi-empresa +MultiCompanySetupConfiguración del módulo Multi-empresa ##### Suppliers ##### -SuppliersSetup=Configuración del módulo Proveedores -SuppliersCommandModel=Modelo de pedidos a proveedores completo (logo...) -SuppliersInvoiceModel=Modelo de facturas de proveedores completo (logo...) -SuppliersInvoiceNumberingModel=Modelos de numeración de facturas de proveedor +SuppliersSetupConfiguración del módulo Proveedores +SuppliersCommandModelModelo de pedidos a proveedores completo (logo...) +SuppliersInvoiceModelModelo de facturas de proveedores completo (logo...) +SuppliersInvoiceNumberingModelModelos de numeración de facturas de proveedor ##### GeoIPMaxmind ##### -GeoIPMaxmindSetup=Configuración del módulo GeoIP Maxmind -PathToGeoIPMaxmindCountryDataFile=Ruta del archivo Maxmind que contiene las conversiones IP->País.
Ejemplo: /usr/local/share/GeoIP/GeoIP.dat -NoteOnPathLocation=Tenga en cuenta que este archivo debe estar en un directorio accesible desde su PHP (Compruebe la configuración de open_basedir de su PHP y los permisos de archivo/directorios). -YouCanDownloadFreeDatFileTo=Puede descargarse una versión demo gratuita del archivo de países Maxmind GeoIP en la dirección %s. -YouCanDownloadAdvancedDatFileTo=También puede descargarse una versión más completa del archivo de países Maxmind GeoIP en la dirección %s. -TestGeoIPResult=Test de conversión IP -> País +GeoIPMaxmindSetupConfiguración del módulo GeoIP Maxmind +PathToGeoIPMaxmindCountryDataFileRuta del archivo Maxmind que contiene las conversiones IP->País.
Ejemplo: /usr/local/share/GeoIP/GeoIP.dat +NoteOnPathLocationTenga en cuenta que este archivo debe estar en un directorio accesible desde su PHP (Compruebe la configuración de open_basedir de su PHP y los permisos de archivo/directorios). +YouCanDownloadFreeDatFileToPuede descargarse una versión demo gratuita del archivo de países Maxmind GeoIP en la dirección %s. +YouCanDownloadAdvancedDatFileToTambién puede descargarse una versión más completa del archivo de países Maxmind GeoIP en la dirección %s. +TestGeoIPResultTest de conversión IP -> País ##### Projects ##### -ProjectsNumberingModules=Módulo de numeración para las referencias de los proyectos -ProjectsSetup=Configuración del módulo Proyectos -ProjectsModelModule=Modelo de documento para informes de proyectos +ProjectsNumberingModulesMódulo de numeración para las referencias de los proyectos +ProjectsSetupConfiguración del módulo Proyectos +ProjectsModelModuleModelo de documento para informes de proyectos #### Accountancy #### -Chartofaccounts=Plan contable -Definechartofaccounts=Definir un plan contable -Selectchartofaccounts=Selección de un plan contable -DoNotSuggestChart=No sugerir un plan contable +ChartofaccountsPlan contable +DefinechartofaccountsDefinir un plan contable +SelectchartofaccountsSelección de un plan contable +DoNotSuggestChartNo sugerir un plan contable ##### ECM (GED) ##### -ECMSetup=Configuración del módulo GED -ECMAutoTree=El árbol automático está disponible +ECMSetupConfiguración del módulo GED +ECMAutoTreeEl árbol automático está disponible diff --git a/htdocs/langs/es_ES/bills.lang b/htdocs/langs/es_ES/bills.lang index e4a414b8fed..f8093cfe158 100644 --- a/htdocs/langs/es_ES/bills.lang +++ b/htdocs/langs/es_ES/bills.lang @@ -389,6 +389,8 @@ AllCompletelyPayedInvoiceWillBeClosed=Todas las facturas con un resto a pagar 0 ToMakePayment=Pagar ToMakePaymentBack=Reembolsar ListOfYourUnpaidInvoices=Listado de facturas impagadas +NoteListOfYourUnpaidInvoices=Nota: Este listado incluye solamente los terceros de los que usted es comercial. +RevenueStamp=Timbre fiscal ##### Types de contacts ##### TypeContact_facture_internal_SALESREPFOLL=Responsable seguimiento factura a cliente TypeContact_facture_external_BILLING=Contacto cliente facturación diff --git a/htdocs/langs/es_ES/boxes.lang b/htdocs/langs/es_ES/boxes.lang index 368cdfc2323..d61aa5e023e 100644 --- a/htdocs/langs/es_ES/boxes.lang +++ b/htdocs/langs/es_ES/boxes.lang @@ -1,9 +1,9 @@ -# Dolibarr language file - es_ES - boxes +# Dolibarr language file - es_ES - boxes CHARSET=UTF-8 BoxLastRssInfos=Hilos de información RSS BoxLastProducts=Los %s últimos productos/servicios -BoxLastProductsInContract=Los %s últimos productos/servicios contratados BoxProductsAlertStock=Productos en alerta de stock +BoxLastProductsInContract=Los %s últimos productos/servicios contratados BoxLastSupplierBills=Últimas facturas de proveedores BoxLastCustomerBills=Últimas facturas a clientes BoxOldestUnpaidCustomerBills=Facturas a clientes más antiguas pendientes de pago @@ -56,7 +56,6 @@ BoxTitleLastActionsToDo=Los %s últimos eventos a realizar BoxTitleLastContracts=Los %s últimos contratos BoxTitleLastModifiedDonations=Las %s últimas donaciones modificadas BoxTitleLastModifiedExpenses=Los %s últimos honorarios modificados -BoxTitleLatestSupplierOrders=Los %s últimos pedidos a proveedores BoxGlobalActivity=Actividad global FailedToRefreshDataInfoNotUpToDate=Error en el refresco del flujo RSS. Fecha del último refresco: %s LastRefreshDate=Fecha última actualización @@ -77,8 +76,9 @@ NoRecordedProspects=Sin clientes potenciales registrados NoContractedProducts=Sin productos/servicios contratados NoRecordedContracts=Sin contratos registrados BoxLatestSupplierOrders=Últimos pedidos a proveedores +BoxTitleLatestSupplierOrders=Los %s últimos pedidos a proveedores NoSupplierOrder=Sin pedidos a proveedores BoxInvoicesPerMonth=Facturas por mes BoxOrdersPerMonth=Pedidos por mes BoxProposalsPerMonth=Presupuestos por mes -NoTooLowStockProducts=Sin productos por debajo del stock mínimo \ No newline at end of file +NoTooLowStockProducts=Sin productos por debajo del stock mínimo diff --git a/htdocs/langs/es_ES/cashdesk.lang b/htdocs/langs/es_ES/cashdesk.lang index 469e85577c9..4545169ea30 100644 --- a/htdocs/langs/es_ES/cashdesk.lang +++ b/htdocs/langs/es_ES/cashdesk.lang @@ -13,6 +13,7 @@ CashDeskProducts=Productos CashDeskStock=Stock CashDeskOn=de CashDeskThirdParty=Tercero +CashdeskDashboard=Acceso Punto de venta ShoppingCart=Cesta NewSell=Nueva venta BackOffice=Back office @@ -35,4 +36,5 @@ CashDeskSetupStock=La configuración decrementa el stock en la creación de fact BankToPay=Cuenta de cobro ShowCompany=Ver empresa ShowStock=Ver almacén -DeleteArticle=Haga clic para quitar este artículo \ No newline at end of file +DeleteArticle=Haga clic para quitar este artículo +FilterRefOrLabelOrBC=Búsqueda (Ref/Etiq.) \ No newline at end of file diff --git a/htdocs/langs/es_ES/cron.lang b/htdocs/langs/es_ES/cron.lang index 4020f586e49..e32a27a24c9 100644 --- a/htdocs/langs/es_ES/cron.lang +++ b/htdocs/langs/es_ES/cron.lang @@ -41,6 +41,7 @@ CronAction=Accion CronStatus=Status CronStatusActive=Activo CronStatusInactive=Inactivo +CronEach=Toda(s) CronNoJobs=Sin trabajos registrados CronPriority=Prioridad CronLabel=Descripcion diff --git a/htdocs/langs/es_ES/errors.lang b/htdocs/langs/es_ES/errors.lang index 2b9b4d09f11..c985f433877 100644 --- a/htdocs/langs/es_ES/errors.lang +++ b/htdocs/langs/es_ES/errors.lang @@ -122,6 +122,8 @@ ErrorFailedToAddToMailmanList=Ha ocurrido un error al intentar añadir un regist ErrorFailedToRemoveToMailmanList=Error en la eliminación de %s de la lista Mailmain %s o base SPIP ErrorNewValueCantMatchOldValue=El nuevo valor no puede ser igual al antiguo ErrorFailedToValidatePasswordReset=No se ha podido restablecer la contraseña. Es posible que este enlace ya se haya utilizado (este enlace sólo puede usarse una vez). Si no es el caso, trate de reiniciar el proceso de restablecimiento de contraseña desde el principio. +ErrorToConnectToMysqlCheckInstance=Error de conexión con el servidor de la base de datos. Compruebe que MySQL está funcionando (en la mayoría de los casos, puede ejecutarlo desde la línea de comandos utilizando el comando 'etc sudo /etc/init.d/mysql start. +ErrorFailedToAddContact=Error en la adición del contacto ErrorDateMustBeBeforeToday=La fecha no puede ser superior a hoy # Warnings @@ -139,3 +141,4 @@ WarningUntilDirRemoved=Las alertas de seguridad sólo son visibles a los adminis WarningCloseAlways=Aviso, el cierre es realizado aunque la cantidad total difiera entre los elementos de origen y destino. Active esta funcionalidad con precaución. WarningUsingThisBoxSlowDown=Atención, el uso de este panel provoca serias ralentizaciones en las páginas que muestran este panel. WarningClickToDialUserSetupNotComplete=La configuración de ClickToDial para su cuenta de usuario no está completa (vea la pestaña ClickToDial en su ficha de usuario) +WarningNotRelevant=Operación irrelevante para este conjunto de datos diff --git a/htdocs/langs/es_ES/install.lang b/htdocs/langs/es_ES/install.lang index 1883391fb5a..44a0d41929d 100644 --- a/htdocs/langs/es_ES/install.lang +++ b/htdocs/langs/es_ES/install.lang @@ -1,4 +1,4 @@ -# Dolibarr language file - es_ES - install +# Dolibarr language file - es_ES - install CHARSET=UTF-8 InstallEasy=Hemos procurado que la instalación sea lo más simple posible, usted sólo tiene que seguir los pasos uno a uno. MiscellaneousChecks=Comprobación de los prerrequisitos @@ -160,8 +160,9 @@ LinkedElementsInvalidDeleted=han sido eliminados %s enlaces inválidos NothingToDelete=No se han encontrado enlaces inválidos SourceType=Origen TargetType=Destino -######### -# upgrade +ShowEditTechnicalParameters=Pulse aquí para ver/editar los parámetros técnicos (modo experto) +#########=undefined +# upgrade=undefined MigrationFixData=Corrección de datos desnormalizados MigrationOrder=Migración de datos de los pedidos clientes MigrationSupplierOrder=Migración de datos de los pedidos a proveedores @@ -171,60 +172,43 @@ MigrationContract=Migración de datos de los contratos MigrationSuccessfullUpdate=Actualización finalizada MigrationUpdateFailed=La actualización ha fallado MigrationRelationshipTables=Migración de las tablas de relación (%s) -# Payments Update MigrationPaymentsUpdate=Actualización de los pagos (vínculo n-n pagos-facturas) MigrationPaymentsNumberToUpdate=%s pago(s) a actualizar MigrationProcessPaymentUpdate=Actualización pago(s) %s MigrationPaymentsNothingToUpdate=No hay más pagos huérfanos que deban corregirse. MigrationPaymentsNothingUpdatable=Ningún pago huérfano corregible. -# Contracts Update MigrationContractsUpdate=Actualización de los contratos sin detalles (gestión del contrato + detalle de contrato) MigrationContractsNumberToUpdate=%s contrato(s) a actualizar MigrationContractsLineCreation=Creación linea contrato para contrato Ref. %s MigrationContractsNothingToUpdate=No hay más contratos (vinculados a un producto) sin líneas de detalles que deban corregirse. MigrationContractsFieldDontExist=Los campos fk_facture no existen ya. No hay operación pendiente. -# Contracts Empty Dates Update MigrationContractsEmptyDatesUpdate=Actualización de las fechas de contratos no indicadas MigrationContractsEmptyDatesUpdateSuccess=Ok para fecha de contrato MigrationContractsEmptyDatesNothingToUpdate=No hay más próximas fechas de contratos. MigrationContractsEmptyCreationDatesUpdateSuccess=Ok para la fecha de creación MigrationContractsEmptyCreationDatesNothingToUpdate=No hay más próximas fechas de creación. -# Contracts Invalid Dates Update MigrationContractsInvalidDatesUpdate=Actualización fechas contrato incorrectas (para contratos con detalle en servicio) MigrationContractsInvalidDateFix=Corregir contrato %s (fecha contrato=%s, Fecha puesta en servicio min=%s) MigrationContractsInvalidDatesNumber=%s contratos modificados MigrationContractsInvalidDatesNothingToUpdate=No hay más de contratos que deban corregirse. -# Contracts Incoherent Dates Update MigrationContractsIncoherentCreationDateUpdate=Actualización de las fechas de creación de contrato que tienen un valor incoherente MigrationContractsIncoherentCreationDateUpdateSuccess=Ok MigrationContractsIncoherentCreationDateNothingToUpdate=No hay más fechas de contratos. -# Reopening Contracts MigrationReopeningContracts=Reapertura de los contratos que tienen al menos un servicio activo no cerrado MigrationReopenThisContract=Reapertura contrato %s MigrationReopenedContractsNumber=%s contratos modificados MigrationReopeningContractsNothingToUpdate=No hay más contratos que deban reabrirse. -# Migration transfert MigrationBankTransfertsUpdate=Actualización de los vínculos entre registros bancarios y una transferencia entre cuenta MigrationBankTransfertsNothingToUpdate=Ningún vínculo desfasado -# Migration delivery MigrationShipmentOrderMatching=Actualizar notas de expedición MigrationDeliveryOrderMatching=Actualizar recepciones MigrationDeliveryDetail=Actualizar recepciones -# Migration stock MigrationStockDetail=Actualizar valor en stock de los productos -# Migration menus MigrationMenusDetail=Actualización de la tabla de menús dinámicos -# Migration delivery address MigrationDeliveryAddress=Actualización de las direcciones de envío en las notas de entrega -# Migration project task actors MigrationProjectTaskActors=Migración de la tabla llx_projet_task_actors -# Migration project user resp MigrationProjectUserResp=Migración del campo fk_user_resp de llx_projet a llx_element_contact -# Migration project task time MigrationProjectTaskTime=Actualización de tiempo dedicado en segundos -# Migration Acctioncom MigrationActioncommElement=Actualización de los datos de acciones sobre elementos -# Migration payment mode MigrationPaymentMode=Actualización de los modos de pago -# Migration categories MigrationCategorieAssociation=Actualización de las categorías diff --git a/htdocs/langs/es_ES/mailmanspip.lang b/htdocs/langs/es_ES/mailmanspip.lang index c6a14bd5fe9..15049e446ac 100644 --- a/htdocs/langs/es_ES/mailmanspip.lang +++ b/htdocs/langs/es_ES/mailmanspip.lang @@ -1,8 +1,7 @@ # Dolibarr language file - es_ES - mailmanspip CHARSET=UTF-8 -MailmanSpipSetup=Configuración del módulo Mailman y SPIP MailmanTitle=Sistema de listas de correo Mailman -DescADHERENT_MAILMAN_LISTS=Lista(s) para la suscripción automática de los nuevos miembros (separados por comas) +MailmanSpipSetup=Configuración del módulo Mailman y SPIP TestSubscribe=Para comprobar la suscripción a listas Mailman TestUnSubscribe=Para comprobar la cancelación de suscripciones a listas Mailman MailmanCreationSuccess=La prueba de suscripción ha sido realizada con éxito @@ -23,4 +22,6 @@ AddIntoSpipError=Ha ocurrido un error al añadir el miembro a SPIP DeleteIntoSpip=Borrar de SPIP DeleteIntoSpipConfirmation=¿Está seguro de querer borrar este miembro de SPIP? DeleteIntoSpipError=Ha ocurrido un error al borrar el miembro de SPIP -SPIPConnectionFailed=Error al conectar con SPIP \ No newline at end of file +SPIPConnectionFailed=Error al conectar con SPIP +SuccessToAddToMailmanList=Adición de %s a la lista Mailman %s o base SPIP realizada +SuccessToRemoveToMailmanList=Eliminación de %s de la lista Mailman %s o base SPIP realizada diff --git a/htdocs/langs/es_ES/mails.lang b/htdocs/langs/es_ES/mails.lang index d9a1761148c..61ff5d42bfa 100644 --- a/htdocs/langs/es_ES/mails.lang +++ b/htdocs/langs/es_ES/mails.lang @@ -47,6 +47,7 @@ MailSuccessfulySent=E-Mail enviado correctamente (de %s a %s) MailingSuccessfullyValidated=E-mailing validado correctamente MailUnsubcribe=Desuscribe Unsuscribe=Desuscribe +MailingStatusNotContact=No contactar ErrorMailRecipientIsEmpty=La dirección del destinatario está vacía WarningNoEMailsAdded=Ningún nuevo E-Mailing a añadir a la lista destinatarios. ConfirmValidMailing=¿Confirma la validación del E-Mailing? @@ -79,18 +80,17 @@ MailtoEMail=mailto email (hyperlink) ActivateCheckRead=Activar confirmación de lectura y opción de desuscripción ActivateCheckReadKey=Clave usada para encriptar la URL de la confirmación de lectura y la función de desuscripción EMailSentToNRecipients=E-Mail enviado a %s destinatarios. - # Libelle des modules de liste de destinataires mailing= MailingModuleDescContactCompanies=Contactos de terceros (clientes potenciales, clientes, proveedores...) MailingModuleDescDolibarrUsers=Usuarios de Dolibarr MailingModuleDescFundationMembers=Miembros MailingModuleDescEmailsFromFile=E-Mails de un archivo (e-mail;nombre;varios) +MailingModuleDescEmailsFromUser=E-mails introducidos por el usuario (email;apellidos;nombre;otros) MailingModuleDescContactsCategories=Terceros (por categoría) MailingModuleDescDolibarrContractsLinesExpired=Terceros con líneas de contratos de servicios expirados MailingModuleDescContactsByCompanyCategory=Contactos de terceros (por categoría de terceros) MailingModuleDescMembersCategories=Miembros (por categoría) MailingModuleDescContactsByFunction=Contactos de terceros (por puesto/función) -MailingModuleDescEmailsFromUser=E-mails introducidos por el usuario (email;apellidos;nombre;otros) LineInFile=Línea %s en archivo RecipientSelectionModules=Módulos de selección de los destinatarios MailSelectedRecipients=Destinatarios seleccionados @@ -114,21 +114,15 @@ NbOfEMailingsReceived=E-Mailings en masa recibidos IdRecord=ID registro DeliveryReceipt=Acuse de recibo YouCanUseCommaSeparatorForSeveralRecipients=Puede usar el carácter de separación coma para especificar múltiples destinatarios. -TagMailtoEmail=Email del destinatario -TagSignature=Firma del usuario remitente -TagUnsubscribe=Link de desuscripción TagCheckMail=Seguimiento de la apertura del email -Other1=Otros1 -Other2=Otros2 -Other3=Otros3 -Other4=Otros4 -Other5=Otros5 - -# Module Notifications= +TagUnsubscribe=Link de desuscripción +TagSignature=Firma del usuario remitente +TagMailtoEmail=Email del destinatario +# Module Notifications Notifications=Notificaciones NoNotificationsWillBeSent=Ninguna notificación por e-mail está prevista para este evento y empresa ANotificationsWillBeSent=1 notificación va a ser enviada por e-mail SomeNotificationsWillBeSent=%s notificaciones van a ser enviadas por e-mail AddNewNotification=Activar una nueva solicitud de notificación ListOfActiveNotifications=Lista de las solicitudes de notificaciones activas -ListOfNotificationsDone=Lista de notificaciones de e-mails enviadas \ No newline at end of file +ListOfNotificationsDone=Lista de notificaciones de e-mails enviadas diff --git a/htdocs/langs/es_ES/main.lang b/htdocs/langs/es_ES/main.lang index a428c94d615..17fed445d1b 100644 --- a/htdocs/langs/es_ES/main.lang +++ b/htdocs/langs/es_ES/main.lang @@ -478,6 +478,8 @@ Report=Informe Keyword=Clave Legend=Leyenda FillTownFromZip=Indicar población +Fill=Rellenar +Reset=Vaciar ShowLog=Ver histórico File=Archivo Files=Archivos @@ -646,8 +648,9 @@ ModulesSystemTools=Módulos utilidades View=Ver Test=Prueba Element=Elemento +NoPhotoYet=No hay fotografía disponible +HomeDashboard=Resumen Deductible=Deducible - # Week day Monday=Lunes Tuesday=Martes diff --git a/htdocs/langs/es_ES/margins.lang b/htdocs/langs/es_ES/margins.lang index 11505132287..55c7351f3b8 100644 --- a/htdocs/langs/es_ES/margins.lang +++ b/htdocs/langs/es_ES/margins.lang @@ -1,6 +1,5 @@ # Dolibarr language file - es_ES - margins CHARSET=UTF-8 - Margin=Margen Margins=Márgenes TotalMargin=Margen total @@ -11,25 +10,19 @@ MarkRate=Margen sobre venta DisplayMarginRates=Mostrar el margen sobre costes DisplayMarkRates=Mostrar el margen sobre ventas InputPrice=Introducir un precio - margin=Gestión de márgenes margesSetup=Configuración de la gestión de márgenes - MarginDetails=Detalles de márgenes realizados - ProductMargins=Márgenes por producto CustomerMargins=Márgenes por cliente AgentMargins=Márgenes por comercial - ProductService=Producto o servicio AllProducts=Todos los productos y servicios ChooseProduct/Service=Elija el producto o servicio CommercialAgent=Agente comercial - StartDate=Fecha de inicio EndDate=Fecha de fin Launch=Comenzar - ForceBuyingPriceIfNull=Forzar el precio de compra si no se ha indicado ForceBuyingPriceIfNullDetails=Con "ON", la línea se considerará como un margen nulo (se forzará el precio de compra con el precio de venta) , con ("OFF") el margen será igual al precio de venta (precio de compra a 0). MARGIN_METHODE_FOR_DISCOUNT=Método de gestión de descuentos globales @@ -37,16 +30,13 @@ UseDiscountAsProduct=Como un producto UseDiscountAsService=Como un servicio UseDiscountOnTotal=Sobre el total MARGIN_METHODE_FOR_DISCOUNT_DETAILS=Indica si un descuento global se toma en cuenta como un producto, servicio o sólo en el total a la hora de calcular los márgenes. - MARGIN_TYPE=Tipo de margen gestionado MargeBrute=Margen bruto MargeNette=Margen neto MARGIN_TYPE_DETAILS=Margen bruto: Precio de venta sin IVA - Precio de compra sin IVA
Margen neto: Precio de venta sin IVA - Costos - +BuyingPrice=Precio de compra CostPrice=Precio de compra -BuyingCost=Costos UnitCharges=Carga unitaria Charges=Cargas - AgentContactType=Tipo de contacto comisionado -AgentContactTypeDetails=Indica el tipo de contacto enlazado a las facturas que serán asociados a los agentes comerciales \ No newline at end of file +AgentContactTypeDetails=Indica el tipo de contacto enlazado a las facturas que serán asociados a los agentes comerciales diff --git a/htdocs/langs/es_ES/opensurvey.lang b/htdocs/langs/es_ES/opensurvey.lang index 839a752f7d5..883b37916ec 100644 --- a/htdocs/langs/es_ES/opensurvey.lang +++ b/htdocs/langs/es_ES/opensurvey.lang @@ -20,7 +20,7 @@ YouAreInPollCreateArea=Está en la sección de creación de encuestas FieldMandatory=Campo obligatorio OpenSurveyDesc=Servicio online para planificar una cita o elaborar una encuesta de forma fácil y rápida. OpenSurveyNoRegistration=Sin registro requerido. -OpenSurveyStep2=Select your dates amoung the free days (green). Los días seleccionados son de color azul. Puede seleccionar un día previamente seleccionado haciendo click de nuevo en él +OpenSurveyStep2=Seleccione sus fechas de entre los días libres (verdes). Los días seleccionados son de color azul. Puede seleccionar un día previamente seleccionado haciendo click de nuevo en él RemoveAllDays=Eliminar todos los días CopyHoursOfFirstDay=Copiar horas del primer día RemoveAllHours=Eliminar todas las horas @@ -37,9 +37,11 @@ PollManagement=Administración de las encuestas BackToHoursSetup=Volver a la configuración de horas UrlForSurvey=URL para tener acceso directo a la encuesta PollOnChoice=Está creando una encuesta para hacer una multiselección para una encuesta. Primero introduzca todas las posibilidades posibles para su encuesta: +CreateSurveyDate=Crear una encuesta +CreateSurveyStandard=Crear una encuesta estandard CheckBox=Checkbox simple YesNoList=Lista (vacío/sí/no) -PourContreList=Lista (empty/for/en contra) +PourContreList=Lista (vacío/a favor/en contra) AddNewColumn=Añadir nueva columna TitleChoice=Título de la opción InfoAfterCreate=Una vez haya confirmado la creación de su encuesta, será redirigido automáticamente a la página de su encuesta.
También recibirá un email con un enlace a su encuesta para enviárselo a los votantes. diff --git a/htdocs/langs/es_ES/paybox.lang b/htdocs/langs/es_ES/paybox.lang index 44fe9d6fd51..89d8e2aa0c5 100644 --- a/htdocs/langs/es_ES/paybox.lang +++ b/htdocs/langs/es_ES/paybox.lang @@ -33,3 +33,6 @@ VendorName=Nombre del vendedor CSSUrlForPaymentForm=Url de la hoja de estilo CSS para el formulario de pago MessageOK=Mensaje en la página de retorno de pago confirmado MessageKO=Mensaje en la página de retorno de pago cancelado +NewPayboxPaymentReceived=Nuevo pago Paybox recibido +NewPayboxPaymentFailed=Nuevo intento de pago Paybox sin éxito +PAYBOX_PAYONLINE_SENDEMAIL=E-Mail a avisar en caso de pago (con éxito o no) \ No newline at end of file diff --git a/htdocs/langs/es_ES/paypal.lang b/htdocs/langs/es_ES/paypal.lang index 9a4cb77ee55..9243f6b1c4e 100644 --- a/htdocs/langs/es_ES/paypal.lang +++ b/htdocs/langs/es_ES/paypal.lang @@ -17,4 +17,7 @@ ThisIsTransactionId=Identificador de la transacción: %s PAYPAL_ADD_PAYMENT_URL=Añadir la url del pago Paypal al enviar un documento por e-mail PAYPAL_IPN_MAIL_ADDRESS=Dirección e-mail para las notificaciones instantáneas de pago (IPN) PredefinedMailContentLink=Puede hacer clic en el enlace seguro de abajo para realizar su pago a través de PayPal\n\n%s\n\n -YouAreCurrentlyInSandboxMode=Actualmente se encuentra en modo "sandbox" \ No newline at end of file +YouAreCurrentlyInSandboxMode=Actualmente se encuentra en modo "sandbox" +NewPaypalPaymentReceived=Nuevo pago Paypal recibido +NewPaypalPaymentFailed=Nuevo intento de pago Paypal sin éxito +PAYPAL_PAYONLINE_SENDEMAIL=E-Mail a avisar en caso de pago (con éxito o no) \ No newline at end of file diff --git a/htdocs/langs/es_ES/products.lang b/htdocs/langs/es_ES/products.lang index fc9a1fb1d3c..8a49c3a6a3e 100644 --- a/htdocs/langs/es_ES/products.lang +++ b/htdocs/langs/es_ES/products.lang @@ -91,14 +91,12 @@ AddToOtherBills=Añadir a otras facturas CorrectStock=Corregir stock AddPhoto=Adjuntar una foto ListOfStockMovements=Listado de movimientos de stock -NoPhotoYet=No hay fotografías disponibles por el momento BuyingPrice=Precio de compra SupplierCard=Ficha proveedor CommercialCard=Ficha comercial AllWays=Ruta para encontrar su producto en el stock NoCat=Su producto no pertenece a ninguna categoría PrimaryWay=Ruta Primaria: -DeleteFromCat=Eliminar de la categoría PriceRemoved=Precio eliminado BarCode=Código de barras BarcodeType=Tipo de código de barras @@ -182,4 +180,15 @@ AddThisServiceCard=Crear ficha servicio HelpAddThisServiceCard=Esta opción permite crear o clonar una ficha de servicio en caso de que no exista CurrentProductPrice=Precio actual AlwaysUseNewPrice=Usar siempre el precio actual -AlwaysUseFixedPrice=Usar el precio fijado \ No newline at end of file +AlwaysUseFixedPrice=Usar el precio fijado +PriceByQuantity=Precio por cantidad +PriceByQuantityRange=Rango de cantidades +ProductsDashboard=Resumen productos/servicios +### composition fabrication +Building=Fabricación +Build=Fabricar +BuildIt=Lanzar la fabricación +BuildindListInfo=Número de producto manufacturables en almacén, si se indica cero no se fabrican +QtyNeed=Afectado +UnitPmp=Precio Compra Unitario +CostPmpHT=Coste de compra diff --git a/htdocs/langs/es_ES/projects.lang b/htdocs/langs/es_ES/projects.lang index 0ee3925cdda..eb0fbcde266 100644 --- a/htdocs/langs/es_ES/projects.lang +++ b/htdocs/langs/es_ES/projects.lang @@ -105,3 +105,6 @@ TypeContact_project_task_internal_CONTRIBUTOR=Participante TypeContact_project_task_external_CONTRIBUTOR=Participante # Documents models DocumentModelBaleine=Modelo de informe de proyecto completo (logo...) +SelectElement=Elementos vinculables al proyecto : +AddElement=Vincular +ProjectReferers=Objetos vinculados From 6180b6c0a65f53fbab855bad44a39276a2aa0086 Mon Sep 17 00:00:00 2001 From: simnandez Date: Tue, 2 Jul 2013 18:53:42 +0200 Subject: [PATCH 08/48] Fix: Amarok Tab visu. --- htdocs/theme/amarok/style.css.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/theme/amarok/style.css.php b/htdocs/theme/amarok/style.css.php index 195fed98fac..2866da54411 100755 --- a/htdocs/theme/amarok/style.css.php +++ b/htdocs/theme/amarok/style.css.php @@ -957,7 +957,7 @@ a.tabTitle img { } a.tab { - padding: 5px 12px 5px; + padding: 5px 12px 2px; margin: 0em 0.2em; background-color:rgba(0,0,0,.2); color:#666666; From 94772dbe30b2201b6f641e68d0dcd6b5e74c2292 Mon Sep 17 00:00:00 2001 From: BENKE Charles Date: Wed, 3 Jul 2013 15:25:22 +0200 Subject: [PATCH 09/48] Update fiche.php change restricted area, too much agressive --- htdocs/comm/action/fiche.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/htdocs/comm/action/fiche.php b/htdocs/comm/action/fiche.php index f9edbb47c05..59b2e6c0a80 100644 --- a/htdocs/comm/action/fiche.php +++ b/htdocs/comm/action/fiche.php @@ -56,7 +56,8 @@ $contactid=GETPOST('contactid','int'); $socid = GETPOST('socid','int'); $id = GETPOST('id','int'); if ($user->societe_id) $socid=$user->societe_id; -$result = restrictedArea($user, 'agenda', $id, 'actioncomm&societe', 'myactions&allactions', '', 'id'); +$result = restrictedArea($user,'societe',$id,'&societe'); +//$result = restrictedArea($user, 'agenda', $id, 'actioncomm&societe', 'myactions&allactions', '', 'id'); $error=GETPOST("error"); $mesg=''; From a9198e66ebb5fb9b76bda78444319cce6986862f Mon Sep 17 00:00:00 2001 From: Regis Houssin Date: Wed, 3 Jul 2013 16:06:42 +0200 Subject: [PATCH 10/48] Fix: change for use url of image --- htdocs/core/lib/images.lib.php | 11 ++++++++--- htdocs/core/lib/pdf.lib.php | 5 +++-- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/htdocs/core/lib/images.lib.php b/htdocs/core/lib/images.lib.php index 9df392a66eb..7dea7357535 100644 --- a/htdocs/core/lib/images.lib.php +++ b/htdocs/core/lib/images.lib.php @@ -65,16 +65,21 @@ function image_format_supported($file) * Return size of image file on disk (Supported extensions are gif, jpg, png and bmp) * * @param string $file Full path name of file + * @param bool $url Image with url (true or false) * @return array array('width'=>width, 'height'=>height) */ -function dol_getImageSize($file) +function dol_getImageSize($file, $url = false) { $ret=array(); if (image_format_supported($file) < 0) return $ret; - $fichier = realpath($file); // Chemin canonique absolu de l'image - $dir = dirname($file); // Chemin du dossier contenant l'image + $fichier = $file; + if (!$url) + { + $fichier = realpath($file); // Chemin canonique absolu de l'image + $dir = dirname($file); // Chemin du dossier contenant l'image + } $infoImg = getimagesize($fichier); // Recuperation des infos de l'image $ret['width']=$infoImg[0]; // Largeur de l'image diff --git a/htdocs/core/lib/pdf.lib.php b/htdocs/core/lib/pdf.lib.php index 104114ed10a..d6d135edc4a 100644 --- a/htdocs/core/lib/pdf.lib.php +++ b/htdocs/core/lib/pdf.lib.php @@ -261,13 +261,14 @@ function pdf_getPDFFontSize($outputlangs) * Return height to use for Logo onot PDF * * @param string $logo Full path to logo file to use + * @param bool $url Image with url (true or false) * @return number */ -function pdf_getHeightForLogo($logo) +function pdf_getHeightForLogo($logo, $url = false) { $height=22; $maxwidth=130; include_once DOL_DOCUMENT_ROOT.'/core/lib/images.lib.php'; - $tmp=dol_getImageSize($logo); + $tmp=dol_getImageSize($logo, $url); if ($tmp['height']) { $width=round($height*$tmp['width']/$tmp['height']); From 7e70d935b6567f91edc9dbdbcdc7ad1f39788c51 Mon Sep 17 00:00:00 2001 From: Regis Houssin Date: Wed, 3 Jul 2013 16:06:42 +0200 Subject: [PATCH 11/48] Fix: change for use url of image --- htdocs/core/lib/images.lib.php | 11 ++++++++--- htdocs/core/lib/pdf.lib.php | 5 +++-- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/htdocs/core/lib/images.lib.php b/htdocs/core/lib/images.lib.php index 9df392a66eb..7dea7357535 100644 --- a/htdocs/core/lib/images.lib.php +++ b/htdocs/core/lib/images.lib.php @@ -65,16 +65,21 @@ function image_format_supported($file) * Return size of image file on disk (Supported extensions are gif, jpg, png and bmp) * * @param string $file Full path name of file + * @param bool $url Image with url (true or false) * @return array array('width'=>width, 'height'=>height) */ -function dol_getImageSize($file) +function dol_getImageSize($file, $url = false) { $ret=array(); if (image_format_supported($file) < 0) return $ret; - $fichier = realpath($file); // Chemin canonique absolu de l'image - $dir = dirname($file); // Chemin du dossier contenant l'image + $fichier = $file; + if (!$url) + { + $fichier = realpath($file); // Chemin canonique absolu de l'image + $dir = dirname($file); // Chemin du dossier contenant l'image + } $infoImg = getimagesize($fichier); // Recuperation des infos de l'image $ret['width']=$infoImg[0]; // Largeur de l'image diff --git a/htdocs/core/lib/pdf.lib.php b/htdocs/core/lib/pdf.lib.php index 0a4842ec0fd..bc57083718a 100644 --- a/htdocs/core/lib/pdf.lib.php +++ b/htdocs/core/lib/pdf.lib.php @@ -227,13 +227,14 @@ function pdf_getPDFFontSize($outputlangs) * Return height to use for Logo onot PDF * * @param string $logo Full path to logo file to use + * @param bool $url Image with url (true or false) * @return number */ -function pdf_getHeightForLogo($logo) +function pdf_getHeightForLogo($logo, $url = false) { $height=22; $maxwidth=130; include_once DOL_DOCUMENT_ROOT.'/core/lib/images.lib.php'; - $tmp=dol_getImageSize($logo); + $tmp=dol_getImageSize($logo, $url); if ($tmp['height']) { $width=round($height*$tmp['width']/$tmp['height']); From c1abd26a60efa0531e2d112bf3f998cff093e8ef Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 3 Jul 2013 16:12:17 +0200 Subject: [PATCH 12/48] Fix: Package name for wheezy --- build/debian/control | 1 + 1 file changed, 1 insertion(+) diff --git a/build/debian/control b/build/debian/control index 9f0a0fb2ef5..d88e31cbc3f 100755 --- a/build/debian/control +++ b/build/debian/control @@ -13,6 +13,7 @@ Depends: libapache2-mod-php5 | libapache2-mod-php5filter | php5-cgi | php5-fpm | libphp-adodb, libnusoap-php, libphp-pclzip, + libfpdi-php, libfpdf-tpl-php, php-fpdf libjs-jquery, libjs-jquery-ui, libjs-flot, ckeditor, ttf-dejavu-core, xdg-utils, From 66ce0582a1e0ea6081b2b0ad8c738c3e84fd8e48 Mon Sep 17 00:00:00 2001 From: simnandez Date: Wed, 3 Jul 2013 16:42:53 +0200 Subject: [PATCH 13/48] Trad: Fix missing = into es_ES admin.lang --- htdocs/langs/es_ES/admin.lang | 2786 ++++++++++++++++----------------- 1 file changed, 1393 insertions(+), 1393 deletions(-) diff --git a/htdocs/langs/es_ES/admin.lang b/htdocs/langs/es_ES/admin.lang index 3a9f4613267..0109f223f0b 100644 --- a/htdocs/langs/es_ES/admin.lang +++ b/htdocs/langs/es_ES/admin.lang @@ -1,1435 +1,1435 @@ # Dolibarr language file - es_ES - admin -CHARSETUTF-8 -VersionVersión -VersionProgramVersión programa -VersionLastInstallVersión instalación inicial -VersionLastUpgradeVersión última actualización -VersionExperimentalExperimental -VersionDevelopmentDesarrollo -VersionUnknownDesconocida -VersionRecommandedRecomendada -SessionIdSesión ID -SessionSaveHandlerModalidad de salvaguardado de sesiones -SessionSavePathLocalización salvaguardado de sesiones -PurgeSessionsPurga de sesiones -ConfirmPurgeSessions¿Quiere purgar las sesiones? Esto desconectará a todos los usuarios (salvo a usted mismo). -NoSessionListWithThisHandlerEl gestor de período de sesiones configurado en su PHP no enumera las sesiones en curso -LockNewSessionsBloquear conexiones nuevas -ConfirmLockNewSessions¿Está seguro de querer restringir el acceso a Dolibarr a su usuario? Solamente el login %s podrá conectarse si confirma. -UnlockNewSessionsEliminar bloqueo de conexiones -YourSessionSu sesión -SessionsSesiones de usuarios -WebUserGroupServidor web usuario/grupo -NoSessionFoundParece que su PHP no puede listar las sesiones activas. El directorio de salvaguardado de sesiones (%s) puede estar protegido (por ejemplo, por los permisos del sistema operativo o por la directiva open_basedir de su PHP). -HTMLCharsetCharset de las páginas HTML -DBStoringCharsetCharset base de datos para almacenamiento de datos -DBSortingCharsetCharset base de datos para clasificar los datos -WarningModuleNotActiveMódulo %s no activo -WarningOnlyPermissionOfActivatedModulesAtención, solamente los permisos relacionados con los módulos activados se indican aquí. Puede activar los otros módulos en la página Configuración->Módulos -DolibarrSetupInstalación/Actualización de Dolibarr -DolibarrUserUsuario Dolibarr -InternalUserUsuario interno -ExternalUserUsuario externo -InternalUsersUsuarios internos -ExternalUsersUsuarios externos -GlobalSetupGeneral -GUISetupEntorno -SetupAreaÁrea configuración -FormToTestFileUploadFormFormulario de prueba de subida de archivo (según opciones elegidas) -IfModuleEnabledNota: sólo es eficaz si el módulo %s está activado -RemoveLockElimine el archivo %s, si existe, para permitir la utilidad de actualización. -RestoreLockSustituir un archivo %s, dándole sólo derechos de lectura a este archivo con el fin de prohibir nuevas actualizaciones. -SecuritySetupConfiguración de la seguridad -ErrorModuleRequirePHPVersionError, este módulo requiere una versión %s o superior de PHP -ErrorModuleRequireDolibarrVersionError, este módulo requiere una versión %s o superior de Dolibarr -ErrorDecimalLargerThanAreForbiddenError, las precisiones superiores a %s no están soportadas. -DictionnarySetupDiccionarios -DictionnaryDiccionarios -ErrorReservedTypeSystemSystemAutoEl uso del tipo 'system' y 'systemauto' está reservado. Puede utilizar 'user' como valor para añadir su propio registro -ErrorCodeCantContainZeroEl código no puede contener el valor 0 -DisableJavascriptDesactivar las funciones Javascript -ConfirmAjaxUtilizar los popups de confirmación Ajax -UseSearchToSelectCompanyUtilizar un formulario de búsqueda para buscar terceros (en vez de lista desplegable)

Tenga en cuenta que si tiene un gran número de productos o servicios (>100 000), puede mejorar el rendimiento mediante la constante SOCIETE_DONOTSEARCH_ANYWHERE a 1 en Configuración->Varios. La búsqueda se limitará entonces al inicio de la cadena. -ActivityStateToSelectCompanyAgregar un filtro en la búsqueda para mostrar/ocultar los terceros en activo o que hayan dejado de ejercer -UseSearchToSelectContactUtilizar un formulario de búsqueda para buscar contactos (en vez de una lista desplegable).
Tenga en cuenta que si tiene un gran número de contactos (>100 000), puede mejorar el rendimiento mediante la constante CONTACT_DONOTSEARCH_ANYWHERE a 1 en Configuración->Varios. La búsqueda se limitará entonces al inicio de la cadena. -SearchFilterOpciones filtros de búsqueda -NumberOfKeyToSearchNº de caracteres para desencadenar la búsqueda: %s -ViewFullDateActionsVer las fechas de las acciones en su totalidad en la ficha de tercero -NotAvailableWhenAjaxDisabledNo disponible cuando Ajax esté desactivado -JavascriptDisabledJavascript desactivado -UsePopupCalendarUtilizar popups para la introducción de las fechas -UsePreviewTabsVer fichas "vista previa" -ShowPreviewVer vista previa -PreviewNotAvailableVista previa no disponible -ThemeCurrentlyActiveTema actualmente activo -CurrentTimeZoneZona horaria PHP (Servidor) -SpaceÁrea -FieldsCampos -MaskMáscara -NextValuePróximo valor -NextValueForInvoicesPróximo valor (facturas) -NextValueForCreditNotesPróximo valor (notas de entrega) -MustBeLowerThanPHPLimitObservación: Su PHP limita el tamaño a %s %s de máximo, cualquiera que sea el valor de este parámetro -NoMaxSizeByPHPLimitNinguna limitación interna en su servidor PHP -MaxSizeForUploadedFilesTamaño máximo de los documentos a subir (0 para prohibir la subida) -UseCaptchaCodeUtilización de código gráfico (CAPTCHA) en el login -UseAvToScanUploadedFilesUtilización de un antivirus para escanear los archivos subidos -AntiVirusCommandRuta completa hacia el comando antivirus -AntiVirusCommandExampleEjemplo para ClamWin: c:\Program Files (x86)\ClamWin\bin\clamscan.exe
Ejemplo para ClamAv: /usr/bin/clamscan -AntiVirusParamParámetros complementarios en la línea de comandos -AntiVirusParamExampleEjemplo para ClamWin: --database="C:\Program Files (x86)\ClamWin\lib" -ComptaSetupConfiguración del módulo Contabilidad -UserSetupConfiguración gestión de los usuarios -MenuSetupAdministración de los menús por base de datos -MenuLimitsLímites y precisión -MenuIdParentId del menú padre -DetailMenuIdParentID del menú padre (vacío para un menú superior) -DetailPositionNúmero de orden para la posición del menú -PersonalizedMenusNotSupportedMenús personalizados no generados -AllMenusTodos -NotConfiguredNo configurado -SetupConfiguración -ActivationActivación -ActiveActivo -SetupShortConfig. -OtherOptionsOtras opciones -OtherSetupVarios -CurrentValueSeparatorDecimalSeparador decimal -CurrentValueSeparatorThousandSeparador miles -ModulesMódulos -ModulesCommonMódulos principales -ModulesOtherMódulos complementarios -ModulesInterfacesMódulos interfaz -ModulesSpecialMódulos específicos -ParameterInDolibarrVariable %s -LanguageParameterVariable idioma %s -LanguageBrowserParameterVariable %s -LocalisationDolibarrParametersParámetros de localización -ClientTZZona horaria Cliente (usuario) -ClientHourHora cliente (usuario) -OSTZZona horaria -PHPTZZona horaria PHP -PHPServerOffsetWithGreenwichOffset servidor con Greenwich (segundos) -ClientOffsetWithGreenwichOffset cliente/navegador con Greenwich (segundos) -DaylingSavingTimeHorario de verano (usuario) -CurrentHourHora PHP (servidor) -CompanyTZZona Horaria empresa (sede central) -CompanyHourHora empresa (sede central) -CurrentSessionTimeOutTimeout sesión actual -OSEnvEntorno SO -BoxPanel -BoxesPaneles -MaxNbOfLinesForBoxesNº de líneas máximo para los paneles -PositionByDefaultPosición por defecto -PositionOrden -MenusDescLos gestores de menú definen el contenido de las 2 barras de menús (la barra horizontal y la barra vertical). Es posible asignar gestores diferentes según el usuario sea interno o externo. -MenusEditorDescEl editor de menús permite definir entradas personalizadas en los menús. Debe utilizarse con prudencia so pena de poner a Dolibarr en una situación inestable siendo necesaria una reinstalación para encontrar un menú coherente. -MenuForUsersMenú para los usuarios -LangFileArchivo .lang -SystemSistema -SystemInfoInfo. sistema -SystemToolsUtilidades sistema -SystemToolsAreaÁrea utilidades del sistema -SystemToolsAreaDescEsta área ofrece distintas funciones de administración. Utilice la menú para elegir la funcionalidad buscada. -PurgeAreaDescEsta página le permite eliminar todos los archivos creados o guardados por Dolibarr (archivos temporales o todos los archivos del directorio %s). El uso de esta función no es necesaria. Se proporciona para los usuarios que albergan a Dolibarr en un servidor que no ofrece los permisos de eliminación de archivos salvaguardados por el servidor Web. -PurgeDeleteLogFileBorrar el archivo log %s definido por el módulo Syslog (no hay riesgo de pérdida de datos) -PurgeDeleteTemporaryFilesEliminar todos los archivos temporales (sin riesgo de perdida de datos) -PurgeDeleteAllFilesInDocumentsDirEliminar todos los archivos del directorio %s. Archivos temporales y archivos adjuntados a elementos (terceros, facturas, etc.) serán eliminados. -PurgeRunNowPurgar -PurgeNothingToDeleteNingún directorio a eliminar -PurgeNDirectoriesDeleted%s archivos o directorios eliminados -PurgeAuditEventsPurgar los eventos de seguridad -ConfirmPurgeAuditEvents¿Está seguro de querer purgar la lista de los eventos de auditoría de seguridad (Se borrará toda la lista, pero esto no afecta a sus datos)? -NewBackupNueva copia de seguridad -GenerateBackupGenerar copia de seguridad -BackupCopia de seguridad -RestoreRestauración -RunCommandSummaryLa copia será realizada por el comando siguiente -RunCommandSummaryToLaunchLa copia puede ser realizada por el comando siguiente -WebServerMustHavePermissionForCommandSu servidor Web debe tener los derechos de ejecutar tal orden -BackupResultResultado de la copia -BackupFileSuccessfullyCreatedArchivo de copia generado correctamente -YouCanDownloadBackupFileLos archivos generados pueden ahora descargarse -NoBackupFileAvailableNinguna copia disponible -ExportMethodMétodo de exportación -ImportMethodMétodo de importación -ToBuildBackupFileClickHerePara crear una copia, haga click aquí. -ImportMySqlDescPara importar una copia, hay que utilizar el comando mysql en linea siguiente: -ImportPostgreSqlDescPara importar una copia de seguridad, debe usar el comando pg_restore desde la línea de comandos: -ImportMySqlCommand%s %s < miarchivobackup.sql -ImportPostgreSqlCommand%s %s miarchivobackup.sql -FileNameToGenerateNombre del archivo a generar -CommandsToDisableForeignKeysForImportComando para desactivar las claves excluyentes a la importación -CommandsToDisableForeignKeysForImportWarningObligatorio si quiere poder restaurar más tarde el dump SQL -ExportCompatibilityCompatibilidad del archivo de exportación generado -MySqlExportParametersParámetros de la exportación MySql -PostgreSqlExportParametersParámetros de la exportación PostgreSQL -UseTransactionnalModeUtilizar el modo transaccional -FullPathToMysqldumpCommandRuta completa del comando mysqldump -FullPathToPostgreSQLdumpCommandruta completa hacia el comando pg_dump -ExportOptionsOpciones de exportación -AddDropDatabaseAñadir órdenes DROP DATABASE -AddDropTableAñadir órdenes DROP TABLE -ExportStructureEstructura -DatasDatos -NameColumnNombre las columnas -ExtendedInsertInstrucciones INSERT extendidas -NoLockBeforeInsertSin instrucción LOCK antes del INSERT -DelayedInsertInserciones con retraso -EncodeBinariesInHexaCodificar los campos binarios en hexadecimal -IgnoreDuplicateRecordsIgnorar los errores de duplicación (INSERT IGNORE) -YesSí -NoNo -AutoDetectLangAutodetección (navegador) -FeatureDisabledInDemoOpción deshabilitada en demo -RightsPermisos -BoxesDescLos paneles son pequeñas zonas de información que se muestran en algunas páginas. Puede elegir activar o desactivar un panel haciendo clic en 'Activar', o haciendo click en el cubo de basura para desactivarlo. Solo se muestran los paneles relacionados con un módulo activo. -OnlyActiveElementsAreShownSólo los elementos de módulos activados son mostrados. -ModulesDescLos módulos Dolibarr definen las funcionalidades disponibles en la aplicación. Algunos módulos requieren permisos que deberán indicarse a los usuarios para que puedan acceder a sus funcionalidades. -ModulesInterfaceDescLos módulos de interfaz son módulos que permiten vincular a Dolibarr con sistemas, aplicaciones o servicios externos. -ModulesSpecialDescLos módulos complementarios son módulos de uso muy específico o menos corriente que los módulos normales. -ModulesJobDescLos módulos específicos permiten una preconfiguración simplificada de Dolibarr para un negocio en concreto. -ModulesMarketPlaceDescHay disponibles para su descarga en sitios externos otros módulos/extensiones... -ModulesMarketPlacesMás módulos... -DoliStoreDescDoliStore, el sitio oficial de módulos complementarios y para Dolibarr ERP/CRM -WebSiteDescSitios proveedores a consultar para encontrar más módulos -URLEnlace -BoxesAvailablePaneles disponibles -BoxesActivatedPaneles activados -ActivateOnActivar en -ActiveOnActivo en -SourceFileArchivo origen -AutomaticIfJavascriptDisabledAutomático si Javascript está desactivado -AvailableOnlyIfJavascriptNotDisabledDisponible solamente si Javascript esta activado -AvailableOnlyIfJavascriptAndAjaxNotDisabledDisponible solamente si Javascript y Ajax están activados -RequiredRequerido -SecuritySeguridad -PasswordsContraseñas -DoNotStoreClearPasswordNo almacenar la contraseña sin cifrar en la base -MainDbPasswordFileConfEncryptedEncriptar la contraseña de la base en el archivo conf.php -InstrucToEncodePassPara tener la contraseña de la base de datos codificada en el archivo de configuración conf.php, reemplazar en ese fichero la línea
$dolibarr_main_db_pass="..."
por
$dolibarr_main_db_pass="crypted:%s" -InstrucToClearPassPara tener la contraseña de la base de datos descodificada en el archivo de configuración b>conf.php
, reemplazar en ese fichero la línea
$dolibarr_main_db_pass="crypted:..."
por
$dolibarr_main_db_pass="%s" -ProtectAndEncryptPdfFilesProtección y encriptación de los pdf generados -ProtectAndEncryptPdfFilesDescLa protección de un documento pdf deja el documento libre a la lectura y a la impresión a cualquier lector de PDF. Por el contrario, la modificación y la copia resultan imposibles. -FeatureFunción -DolibarrLicenseLicencia -DolibarrProjectLeaderjefe de proyecto -DeveloppersDesarrolladores/contribuidores -OtherDeveloppersOtros desarrolladores/contribuidores -OfficialWebSiteSitio web oficial internacional -OfficialWebSiteFrsitio web oficial habla francesa -OfficialWikiWiki documentación Dolibarr -OfficialDemoDemo en línea Dolibarr -OfficialMarketPlaceSitio oficial de módulos complementarios y extensiones -OfficialWebHostingServiceServicio oficial de alojamiento (SaaS) -ForDocumentationSeeWikiPara la documentación de usuario, desarrollador o Preguntas Frecuentes (FAQ), consulte el wiki Dolibarr:
%s -ForAnswersSeeForumPara otras cuestiones o realizar sus propias consultas, puede utilizar el foro Dolibarr:
%s -HelpCenterDesc1Esta aplicación, independiente de Dolibarr, le permite ayudarle a obtener un servicio de soporte de Dolibarr. -HelpCenterDesc2Algunos de estos servicios sólo están disponibles en inglés. -CurrentTopMenuHandlerGestor de menú superior -CurrentLeftMenuHandlerGestor de menú izquierdo -CurrentMenuHandlerGestor de menú -CurrentSmartphoneMenuHandlerGestor menú smartphone actual -MeasuringUnitUnidad de medida -EmailsE-Mails -EMailsSetupConfiguración E-Mails -EMailsDescEsta página permite sustituir los parámetros PHP relacionados con el envío de correos electrónicos. En la mayoría de los casos en SO como UNIX/Linux, los parámetros PHP son ya correctos y esta página es inútil. -MAIN_MAIL_SMTP_PORTPuerto del servidor SMTP (Por defecto en php.ini: %s) -MAIN_MAIL_SMTP_SERVERNombre host o ip del servidor SMTP (Por defecto en php.ini: %s) -MAIN_MAIL_SMTP_PORT_NotAvailableOnLinuxLikePuerto del servidor SMTP (No definido en PHP en sistemas de tipo Unix) -MAIN_MAIL_SMTP_SERVER_NotAvailableOnLinuxLikeNombre servidor o ip del servidor SMTP (No definido en PHP en sistemas de tipo Unix) -MAIN_MAIL_EMAIL_FROME-Mail del emisor para envíos E-Mail automáticos (Por defecto en php.ini: %s) -MAIN_MAIL_ERRORS_TOE-Mail usado para los retornos de error de los e-mails enviados -MAIN_MAIL_AUTOCOPY_TOEnviar automáticamente copia oculta de los e-mails enviados a -MAIN_DISABLE_ALL_MAILSDesactivar globalmente todo envío de correos electrónicos (para modo de pruebas o demo) -MAIN_MAIL_SENDMODEMétodo de envío de e-mails -MAIN_MAIL_SMTPS_IDID de autentificación SMTP si se requiere autenticación SMTP -MAIN_MAIL_SMTPS_PWContraseña autentificación SMTP si se requiere autentificación SMTP -MAIN_MAIL_EMAIL_TLSUso de encriptación TLS (SSL) -MAIN_DISABLE_ALL_SMSDesactivar globalmente todo envío de SMS (para modo de pruebas o demo) -MAIN_SMS_SENDMODEMétodo de envío de SMS -MAIN_MAIL_SMS_FROMNúmero de teléfono por defecto para los envíos SMS -FeatureNotAvailableOnLinuxFuncionalidad no disponible en sistemas Unix. Pruebe su sendmail localmente. -SubmitTranslationSi la traducción de este idioma es incompleta o si encuentra errores, puede corregirlos mediante la edición de los archivos en el directorio langs/%s y envíe los cambios al foro www.dolibarr.es. -ModuleSetupConfiguración del módulo -ModulesSetupConfiguración de los módulos -ModuleFamilyBaseSistema -ModuleFamilyCrmGestión cliente (CRM) -ModuleFamilyProductsGestión productos -ModuleFamilyHrRecursos Humanos -ModuleFamilyProjectsProyectos/Trabajo cooperativo -ModuleFamilyOtherOtro -ModuleFamilyTechnicMódulos herramientas o Sistema -ModuleFamilyExperimentalMódulos experimentales -ModuleFamilyFinancialMódulos financieros (Contabilidad/tesorería) -ModuleFamilyECMGestión Electrónica de Documentos (GED) -MenuHandlersGestores menú -MenuAdminEditor menú -DoNotUseInProductionNo usar en producción -ThisIsProcessToFollowHe aquí el procedimiento a seguir: -StepNbPaso %s -FindPackageFromWebSiteBuscar el paquete que responde a su necesidad (por ejemplo en el sitio web %s) -DownloadPackageFromWebSiteDescargar el paquete desde el sitio %s. -UnpackPackageInDolibarrRootDescomprimir el paquete en el directorio raíz de Dolibarr %s sobre los archivos existentes (sin desplazar o borrar los existentes, so pena de perder su configuración o los módulos no oficiales instalados) -SetupIsReadyForUseLa instalación ha finalizado y Dolibarr está disponible con el nuevo componente. -NotExistsDirectNo existe el directorio alternativo.
-InfDirAltDesde la versión 3 es posible definir un directorio root alternativo, esto le permite almacenar en el mismo lugar módulos y temas personalizados.
Basta con crear un directorio en el raíz de Dolibarr (por ejemplo: custom).
-InfDirExample
Seguidamente se declara en el archivo conf.php:
$dolibarr_main_url_root_alt='http://miservidor/custom'
$dolibarr_main_document_root_alt='/directorio/de/dolibarr/htdocs/custom'
*Estas lineas vienen comentadas con un "#", para descomentarlas solo hay que retirar el caracter. -YouCanSubmitFileSeleccione paquete: -CurrentVersionVersión actual de Dolibarr -CallUpdatePageLlamar a la página de actualización de la estructura y datos de la base de datos %s. -LastStableVersionÚltima versión estable disponible -GenericMaskCodesPuede introducir cualquier máscara numérica. En esta máscara, puede utilizar las siguientes etiquetas:
{000000} corresponde a un número que se incrementa en cada uno de %s. Introduzca tantos ceros como longitud desee mostrar. El contador se completará a partir de ceros por la izquierda con el fin de tener tantos ceros como la máscara.
{000000+000} Igual que el anterior, con una compensación correspondiente al número a la derecha del signo + se aplica a partir del primer %s.
{000000@x} igual que el anterior, pero el contador se restablece a cero cuando se llega a x meses (x entre 1 y 12). Si esta opción se utiliza y x es de 2 o superior, entonces la secuencia {yy}{mm} o {yyyy}{mm} también es necesaria.
{dd} días (01 a 31).
{mm} mes (01 a 12).
{yy}, {yyyy} ou {y} año en 2, 4 ó 1 cifra.
-GenericMaskCodes2{cccc} el código de cliente en n caracteres
{cccc000} el código de cliente en n caracteres es seguido por un contador propio al cliente sin offset, completado con ceros hasta completar la máscara, y volviendo a cero al mismo tiempo que el contador global.
{tttt}El código del tipo de la empresa en n caracteres (ver diccionarios-tipos de empresas).
-GenericMaskCodes3Cualquier otro carácter en la máscara se quedará sin cambios.
No se permiten espacios
-GenericMaskCodes4aEjemplo en la 99 ª %s del tercero La Empresa realizada el 31/03/2007:
-GenericMaskCodes4bEjemplo sobre un tercero creado el 31/03/2007:
-GenericMaskCodes4cEjemplo en un producto/servicio creado el 31/03/2007:
-GenericMaskCodes5ABC{yy}{mm}-{000000} dará ABC0703-000099
{0000+100@1}-XXX/{dd}/YYY daráa 0199-XXX/31/YYY -GenericNumRefModelDescDevuelve un número creado acorde a una máscara definida. -ServerAvailableOnIPOrPortServidor disponible en la dirección %s en el puerto %s -ServerNotAvailableOnIPOrPortServidor no disponible en la dirección %s en el puerto %s -DoTestServerAvailabilityProbar conectividad con el servidor -DoTestSendProbar envío -DoTestSendHTMLProbar envío HTML -ErrorCantUseRazInStartedYearIfNoYearMonthInMaskError, no se puede usar la opción @ si la secuencia {yy}{mm} o {yyyy}{mm} no se encuentra en la máscara. -UMaskParámetro UMask de nuevos archivos en Unix/Linux/BSD. -UMaskExplanationEste parámetro determina los derechos de los archivos creados en el servidor Dolibarr (durante la subida, por ejemplo).
Este debe ser el valor octal (por ejemplo, 0666 significa lectura / escritura para todos).
Este parámetro no tiene ningún efecto sobre un servidor Windows. -SeeWikiForAllTeamVea el wiki para más detalles de todos los actores y de su organización -UseACacheDelayDemora en caché de la exportación en segundos (0 o vacio sin caché) -DisableLinkToHelpCenterOcultar el enlace "¿Necesita soporte o ayuda?" en la página de login -DisableLinkToHelpOcultar el enlace "%s Ayuda en línea" del menú izquierdo -AddCRIfTooLongNo hay líneas de corte automático, de modo que si el texto es demasiado largo en los documentos, debe agregar sus propios retornos de carro en el texto mecanografiado. -ModuleDisabledMódulo desactivado -ModuleDisabledSoNoEventMódulo desactivado, por lo que evento nunca se crea -ConfirmPurge¿Está seguro de querer realizar esta purga?
Esto borrará definitivamente todos los datos de sus archivos (área GED, archivos adjuntos etc.). -MinLengthLonguitud mínima -LanguageFilesCachedIntoShmopSharedMemoryarchivos .lang en memoria compartida -ExamplesWithCurrentSetupEjemplos con la configuración activa actual -ListOfDirectoriesListado de directorios de plantillas OpenDocument -ListOfDirectoriesForModelGenODTListado de directorios con plantillas de documentos OpenDocument.

Indicar la ruta completa del directorio.
Añadir un retorno a la línea entre cada directorio.Para indicar un directorio del módulo GED, indicar DOL_DATA_ROOT/ecm/nombredeldirectorio.

Los archivos de plantilla de estos directorios deben terminar con .odt -NumberOfModelFilesFoundNúmero de archivos de plantillas ODT encontrados en este/estos directorio(s) -ExampleOfDirectoriesForModelGenEjemplos de sintaxis:
c:\mydir
/home/mydir
DOL_DATA_ROOT/ecm/ecmdir -FollowingSubstitutionKeysCanBeUsedColocando los siguientes tags en la plantilla, obtendrá una sustitución con el valor personalizado al generar el documento: -FullListOnOnlineDocumentationhttp://wiki.dolibarr.org/index.php/Crear_un_modelo_de_documento_ODT -FirstnameNamePositionOrden visualización nombre/apellidos -DescWeatherLos siguientes gráficos se mostrarán en el panel si el número de elementos llegan a estos valores: -KeyForWebServicesAccessClave para usar los Web Services (parámetro "dolibarrkey" en webservices) -TestSubmitFormFormulario de pruebas -ThisForceAlsoThemeUsar este gestor de menús predetermina también el tema, sea cual sea la elección del usuario. Además, este gestor de menús, especial para smartphones, solamente funciona en algunos teléfonos. Use otro gestor si observa cualquier problema. -ThemeDirDirectorio de los temas -ConnectionTimeoutTimeout de conexión -ResponseTimeoutTimeout de respuesta -SmsTestMessageMensaje de prueba de __PHONEFROM__ para __PHONETO__ -ModuleMustBeEnabledFirstPara usar esta función debe estar activado el módulo %s. -SecurityTokenClave para encriptar urls -NoSmsEngineNo hay disponible ningún gestor de envío de SMS. Los gestores de envío de SMS no se instalan por defecto ya que dependen de cada proveedor, sin embargo puede encontrarlos en la plataforma %s. -PDFPDF -PDFDescPuede definir aquí las opciones globales para la generación de los PDF -PDFAddressForgingReglas de visualización de direcciones -HideAnyVATInformationOnPDFOcultar toda la información relacionada con el IVA en la generación de los PDF -HideDescOnPDFOcultar descripción de los productos en la generación de los PDF -HideRefOnPDFOcultar referencia de los productos en la generación de los PDF -HideDetailsOnPDFOcultar detalles de las líneas de productos en la generación de los PDF -LibraryLibrería -UrlGenerationParametersSeguridad de las URLs -SecurityTokenIsUnique¿Usar un parámetro securekey único para cada URL? -EnterRefToBuildUrlIntroduzca la referencia del objeto %s -GetSecuredUrlObtener la URL calculada -ButtonHideUnauthorizedOcultar los botones de acciones no autorizadas en vez de mostrarlos atenuados -TotalNumberOfActivatedModulesNúmero total de módulos activados: %s -YouMustEnableOneModuleDebe activar al menos un módulo. -ProductVatMassChangeModificar IVA en masa -ProductVatMassChangeDescEsta página le permite cambiar el tipo de IVA definido en los productos o servicios de un valor a otro. Tenga en cuenta que el cambio se lleva a cabo en masa sobre toda la base de datos. -OldVATRatesTasa de IVA antigua -NewVATRatesTasa de IVA nueva -PriceBaseTypeToChangeCambiar el precio cuya referencia de base es -MassConvertConvertir masivamente -StringCadena de texto -TextLongTexto largo -IntNumérico entero -FloatDecimal -DateAndTimeFecha y hora -UniqueÚnico -BooleanBoleano (Casilla de verificación) -ExtrafieldPhoneTeléfono -ExtrafieldPricePrecio -ExtrafieldMailCorreo -ExtrafieldSelectLista de selección -ExtrafieldSelectListLista de selección de tabla -ExtrafieldSeparatorSeparador -ExtrafieldCheckBoxCasilla de verificación -ExtrafieldRadioBotón de selección excluyente -ExtrafieldParamHelpselectLa lista ha de ser en forma llave, valor

por ejemplo :
1,text1
2,text2
3,text3
... -ExtrafieldParamHelpcheckboxLa lista ha de ser en forma llave, valor

por ejemplo :
1,text1
2,text2
3,text3
... -ExtrafieldParamHelpradioLa lista ha de ser en forma llave, valor

por ejemplo :
1,text1
2,text2
3,text3
... -ExtrafieldParamHelpsellistLa lista ha de ser de la tabl

por ejemplo:
table:label:(code)
-LibraryToBuildPDFLibrería usada para la creación de archivos PDF -WarningUsingFPDFAtención: Su archivo conf.php contiene la directiva dolibarr_pdf_force_fpdf=1. Esto hace que se use la librería FPDF para generar sus archivos PDF. Esta librería es antigua y no cubre algunas funcionalidades (Unicode, transparencia de imágenes, idiomas cirílicos, árabes o asiáticos, etc.), por lo que puede tener problemas en la generación de los PDF.
Para resolverlo, y disponer de un soporte completo de PDF, puede descargar la librería TCPDF , y a continuación comentar o eliminar la línea $dolibarr_pdf_force_fpdf=1, y añadir en su lugar $dolibarr_lib_TCPDF_PATH='ruta_a_TCPDF' -LocalTaxDescAlgunos países aplican 2 o 3 tasas a cada línea de factura. Si es el caso, escoja el tipo de la segunda y tercera tasa y su valor. Los posibles tipos son:
1 : tasa local aplicable a productos y servicios sin IVA (IVA no se aplica en la tasa local)
2 : tasa local se aplica a productos y servicios antes del IVA (IVA se calcula sobre importe+tasa local)
3 : tasa local se aplica a productos sin IVA (IVA no se aplica en la tasa local)
4 : tasa local se aplica a productos antes del IVA (IVA se calcula sobre el importe+tasa local)
5 : tasa local se aplica a servicios sin IVA (IVA no se aplica a la tasa local)
6 : tasa local se aplica a servicios antes del IVA (IVA se calcula sobre importe + tasa local) -SuhosinSessionEncryptAlmacenamiento de sesiones cifradas por Suhosin -SMSSMS -LinkToTestClickToDialIntroduzca un número de teléfono al que llamar para probar el enlace de llamada ClickToDial para el usuario %s -RefreshPhoneLinkRefrescar enlace -LinkToTestEnlace seleccionable para el usuario %s (haga clic en el número para probar) -KeepEmptyToUseDefaultDeje este campo vacío para usar el valor por defecto -DefaultLinkEnlace por defecto -ValueOverwrittenByUserSetupAtención: Este valor puede ser sobreescrito por un valor específico de la configuración del usuario (cada usuario puede tener su propia url clicktodial) -# Modules= undefined -Module0NameUsuarios y grupos -Module0DescGestión de usuarios y grupos -Module1NameTerceros -Module1DescGestión de terceros (empresas, particulares) y contactos -Module2NameComercial -Module2DescGestión comercial -Module10NameContabilidad -Module10DescActivación de informes simples de contabilidad (diarios, ventas) basados en el contenido de la base de datos. Sin desgloses. -Module20NamePresupuestos -Module20DescGestión de presupuestos/propuestas comerciales -Module22NameE-Mailings -Module22DescAdministración y envío de E-Mails masivos -Module23NameEnergía -Module23DescRealiza el seguimiento del consumo de energías -Module25NamePedidos de clientes -Module25DescGestión de pedidos de clientes -Module30NameFacturas y abonos -Module30DescGestión de facturas y abonos a clientes. Gestión facturas de proveedores -Module40NameProveedores -Module40DescGestión de proveedores -Module42NameSyslog -Module42DescGeneración de logs (archivos, syslog,...) -Module49NameEditores -Module49DescGestión de editores -Module50NameProductos -Module50DescGestión de productos -Module51NamePublipostage -Module51DescAdministración y envío de correo de papel en masa -Module52NameStocks de productos -Module52DescGestión de stocks de productos -Module53NameServicios -Module53DescGestión de servicios -Module54NameContratos -Module54DescGestión de contratos -Module55NameCódigos de barras -Module55DescGestión de los códigos de barras -Module56NameTelefonía -Module56DescGestión de la telefonía -Module57NameDomiciliaciones -Module57DescGestión de domiciliaciones y reintegros bancarios -Module58NameClickToDial -Module58DescIntegración con ClickToDial -Module59NameBookmark4u -Module59DescAñade función para generar una cuenta Bookmark4u desde una cuenta Dolibarr -Module70NameIntervenciones -Module70DescGestión de las intervenciones a terceros -Module75NameNotas de gasto y desplazamientos -Module75DescGestión de las notas de gasto y desplazamientos -Module80NameExpediciones -Module80DescGestión de expediciones y recepciones -Module85NameBancos y cajas -Module85DescGestión de las cuentas financieras de tipo cuentas bancarias, postales o efectivo -Module100NameSitio web externo -Module100DescIncluye cualquier sitio web externo en los menús de Dolibarr, viéndolo en un frame -Module105NameMailman y SPIP -Module105DescInterfaz con Mailman o SPIP para el módulo Miembros -Module200NameLDAP -Module200DescSincronización con un directorio LDAP -Module210NamePostNuke -Module210DescIntegración con PostNuke -Module240NameExportaciones de datos -Module240DescHerramienta de exportación de datos Dolibarr (con asistente) -Module250NameImportación de datos -Module250DescHerramienta de importación de datos a Dolibarr (con asistente) -Module310NameMiembros -Module310DescGestión de miembros de una asociación -Module320NameHilos RSS -Module320DescAdición de hilos de información RSS en las pantallas Dolibarr -Module330NameMarcadores -Module330DescGestión de marcadores -Module400NameProyectos -Module400DescGestión de los proyectos en los otros módulos -Module410NameWebcalendar -Module410DescInterfaz con el calendario Webcalendar -Module500NameImpuestos, cargas sociales y dividendos -Module500DescGestión de impuestos y cargas sociales -Module600NameNotificaciones -Module600DescEnvío de notificaciones (por correo electrónico) sobre los eventos de trabajo Dolibarr -Module700NameDonaciones -Module700DescGestión de donaciones -Module800NameOSCommerce 1 -Module800DescInterfaz de visualización de una tienda OSCommerce mediante acceso directo a su base de datos -Module900NameOSCommerce 2 -Module900DescInterfaz de visualización de una tienda OSCommerce mediante Web services. Este módulo requiere instalar los archivos de /oscommerce_ws/ws_server en OSCommerce. Lea el archivo README del directorio /oscommerce_ws/ws_server. -Module1200NameMantis -Module1200DescInterfaz con el sistema de seguimiento de incidencias Mantis -Module1400NameContabilidad experta -Module1400DescGestión experta de la contabilidad (doble partida) -Module1780NameCategorías -Module1780DescGestión de categorías (productos, proveedores y clientes) -Module2000NameEditor WYSIWYG -Module2000DescPermite la edición de ciertas zonas de texto mediante un editor avanzado -Module2300NameProgramador -Module2300DescTareas programadas -Module2400NameAgenda -Module2400DescGestión de la agenda y de las acciones -Module2500NameGestión Electrónica de Documentos -Module2500DescPermite administrar una base de documentos -Module2600NameWebServices -Module2600DescActiva los servicios de servidor web services de Dolibarr -Module2650NameUltimatepdf -Module2650DescGestión de la presentación de las plantillas pdf (presupuestos, facturas, pedidos, etc.) -Module2700NameGravatar -Module2700DescUtiliza el servicio en línea de Gravatar (www.gravatar.com) para mostrar fotos de los usuarios/miembros (que se encuentran en sus mensajes de correo electrónico). Necesita un acceso a Internet -Module2900NameGeoIPMaxmind -Module2900DescCapacidades de conversión GeoIP Maxmind -Module5000NameMulti-empresa -Module5000DescPermite gestionar varias empresas -Module20000NameDías libres -Module20000DescGestión de los días libres de los empleados -Module50000NamePayBox -Module50000DescMódulo para proporcionar un pago en línea con tarjeta de crédito mediante Paybox -Module50100NameTPV -Module50100DescTerminal Punto de Venta para la venta en mostrador -Module50200NamePaypal -Module50200DescMódulo para proporcionar un pago en línea con tarjeta de crédito mediante Paypal -Module59000NameMárgenes -Module59000DescMódulo para gestionar los márgenes de beneficio -Module60000NameComisiones -Module60000DescMódulo para gestionar las comisiones de venta -Permission11Consultar facturas -Permission12Crear/Modificar facturas -Permission13De-validar facturas -Permission14Validar facturas -Permission15Enviar facturas por correo -Permission16Emitir pagos de facturas -Permission19Eliminar facturas -Permission21Consultar presupuestos -Permission22Crear/modificar presupuestos -Permission24Validar presupuestos -Permission25Enviar los presupuestos -Permission26Cerrar presupuestos -Permission27Eliminar presupuestos -Permission28Exportar los presupuestos -Permission31Consultar productos -Permission32Crear/modificar productos -Permission34Eliminar productos -Permission36Ver/gestionar los productos ocultos -Permission38Exportar productos -Permission41Consultar proyectos y tareas (compartidos o soy contacto) -Permission42Crear/modificar proyectos y tareas (compartidos o soy contacto) -Permission44Eliminar proyectos y tareas (compartidos o soy contacto) -Permission61Consultar intervenciones -Permission62Crear/modificar intervenciones -Permission64Eliminar intervenciones -Permission67Exportar intervenciones -Permission71Consultar miembros -Permission72Crear/modificar miembros -Permission74Eliminar miembros -Permission75Configurar tipos y atributos de los miembros -Permission76Exportar miembros -Permission78Consultar cotizaciones -Permission79Crear/modificar cotizaciones -Permission81Consultar pedidos de clientes -Permission82Crear/modificar pedidos de clientes -Permission84Validar pedidos de clientes -Permission86Enviar pedidos de clientes -Permission87Cerrar pedidos de clientes -Permission88Anular pedidos de clientes -Permission89Eliminar pedidos de clientes -Permission91Consultar impuestos e IVA -Permission92Crear/modificar impuestos e IVA -Permission93Eliminar impuestos e IVA -Permission94Exportar impuestos -Permission95Consultar balances y resultados -Permission96Parametrizar desglose -Permission97Leer líneas de facturas -Permission98Desglosar líneas de facturas -Permission101Consultar expediciones -Permission102Crear/modificar expediciones -Permission104Validar expediciones -Permission106Exportar expediciones -Permission109Eliminar expediciones -Permission111Consultar cuentas financieras (cuentas bancarias, cajas) -Permission112Crear/modificar cantidad/eliminar registros bancarios -Permission113Configurar cuentas financieras (crear, controlar las categorías) -Permission114Exportar transacciones y registros bancarios -Permission115Exportar transacciones y extractos -Permission116Captar transferencias entre cuentas -Permission117Gestionar els dipòsits en banc dels xecs rebuts -Permission121Consultar empresas -Permission122Crear/modificar empresas -Permission125Eliminar empresas -Permission126Exportar las empresas -Permission141Consultar todos los proyectos y tareas (incluyendo los privados de los que no sea contacto) -Permission142Crear/modificar todos los proyectos y tareas (incluyendo los privados de los que no sea contacto) -Permission144Eliminar todos los proyectos y tareas (incluyendo los privados de los que no sea contacto) -Permission146Consultar proveedores -Permission147Consultar estadísticas -Permission151Consultar domiciliaciones -Permission152Crear/modificar domiciliaciones -Permission153Enviar domiciliaciones -Permission154Abonar/devolver domiciliaciones -Permission161Consultar contratos de servicio -Permission162Crear/modificar contratos de servicio -Permission163Activar los servicios de un contrato -Permission164Desactivar los servicios de un contrato -Permission165Eliminar contratos -Permission171Leer los desplazamientos -Permission172Crear/modificar los desplazamientos -Permission173Eliminar desplazamientos -Permission178Exportar desplazamientos -Permission180Consultar proveedores -Permission181Consultar pedidos a proveedores -Permission182Crear/modificar pedidos a proveedores -Permission183Validar pedidos a proveedores -Permission184Aprobar pedidos a proveedores -Permission185Enviar pedidos a proveedores -Permission186Recibir pedidos de proveedores -Permission187Cerrar pedidos a proveedores -Permission188Anular pedidos a proveedores -Permission192Crear líneas -Permission193Cancelar líneas -Permission194Consultar el ancho de banda de líneas -Permission202Crear conexiones ADSL -Permission203Realizar pedido de conexiones -Permission204Pedir conexiones -Permission205Gestionar conexiones -Permission206Consultar conexiones -Permission211Consultar telefonía -Permission212Pedir líneas -Permission213Activar una línea -Permission214Configurar la telefonía -Permission215Configurar proveedores -Permission221Consultar E-Mails -Permission222Crear/modificar E-Mails (asunto, destinatarios, etc.) -Permission223Validar E-Mails (permite el envío) -Permission229Eliminar E-Mails -Permission237Ver los destinatarios y la información -Permission238Enviar los e-mails manualmente -Permission239Eliminar los e-mails después de su validación o su envío -Permission241Consultar categorías -Permission242Crear/modificar categorías -Permission243Eliminar categorías -Permission244Ver contenido de categorías ocultas -Permission251Consultar otros usuarios -PermissionAdvanced251Consultar otros usuarios -Permission252Consultar los permisos de otros usuarios -Permission253Crear/modificar otros usuarios y sus permisos -PermissionAdvanced253Crear/modificar usuarios internos/externos y sus permisos -Permission254Modificar la contraseña de otros usuarios -Permission255Eliminar o desactivar otros usuarios -Permission256Consultar sus permisos -Permission262Consultar todas las empresas (Solamente usuarios internos. Los externos están limitados a ellos mismos) -Permission271Consultar el CA -Permission272Consultar las facturas -Permission273Emitir las facturas -Permission281Consultar contactos -Permission282Crear/modificar contactos -Permission283Eliminar contactos -Permission286Exportar contactos -Permission291Consultar tarifas -Permission292Definir permisos sobre las tarifas -Permission293Modificar tarifas de clientes -Permission300Consultar códigos de barras -Permission301Crear/modificar códigos de barras -Permission302Eliminar código de barras -Permission311Consultar servicios -Permission312Asignar servicios a un contrato -Permission331Consultar marcadores -Permission332Crear/modificar marcadores -Permission333Eliminar marcadores -Permission341Consultar sus propios permisos -Permission342Crear/modificar su propia info de usuario -Permission343Modificar su propia contraseña -Permission344Modificar sus propios permisos -Permission351Consultar los grupos -Permission352Consultar los permisos de grupos -Permission353Crear/modificar los grupos y sus permisos -Permission354Eliminar o desactivar grupos -Permission358Exportar usuarios -Permission401Consultar haberes -Permission402Crear/modificar haberes -Permission403Validar haberes -Permission404Eliminar haberes -Permission531Consultar servicios -Permission532Crear/modificar servicios -Permission534Eliminar servicios -Permission536Ver/gestionar los servicios ocultos -Permission538Exportar servicios -Permission701Consultar donaciones -Permission702Crear/modificar donaciones -Permission703Eliminar donaciones -Permission1001Consultar stocks -Permission1002Crear/modificar stocks -Permission1003Eliminar stocks -Permission1004Consultar movimientos de stock -Permission1005Crear/modificar movimientos de stock -Permission1101Consultar órdenes de envío -Permission1102Crear/modificar órdenes de envío -Permission1104Validar orden de envío -Permission1109Eliminar orden de envío -Permission1181Consultar proveedores -Permission1182Consultar pedidos a proveedores -Permission1183Crear pedidos a proveedores -Permission1184Validar pedidos a proveedores -Permission1185Aprobar pedidos a proveedores -Permission1186Enviar pedidos a proveedores -Permission1187Recibir pedidos de proveedores -Permission1188Cerrar pedidos a proveedores -Permission1201Obtener resultado de una exportación -Permission1202Crear/codificar exportaciones -Permission1231Consultar facturas de proveedores -Permission1232Crear facturas de proveedores -Permission1233Validar facturas de proveedores -Permission1234Eliminar facturas de proveedores -Permission1235Enviar facturas de proveedores por correo -Permission1236Exportar facturas de proveedores, atributos y pagos -Permission1237Exportar pedidos de proveedores junto con sus detalles -Permission1251Lanzar las importaciones en masa a la base de datos (carga de datos) -Permission1321Exportar facturas a clientes, atributos y cobros -Permission1401Leer el plan contable -Permission1402Crear/Modificar un plan contable -Permission1403Cerrar un plan contable -Permission1411Leer los movimientos contables -Permission1412Crear/modificar/anular movimientos contables -Permission1415Leer Balances, informes, diarios, libros maestros -Permission1421Exportar pedidos de clientes y atributos -Permission23001Ver tareas programadas -Permission23002Crear/actualizar tareas programadas -Permission23003Borrar tareas programadas -Permission23004Ejecutar tareas programadas -Permission2401Leer acciones (eventos o tareas) vinculadas a su cuenta -Permission2402Crear/eliminar acciones (eventos o tareas) vinculadas a su cuenta -Permission2403Modificar acciones (eventos o tareas) vinculadas a su cuenta -Permission2411Leer acciones (eventos o tareas) de otros -Permission2412Crear/modificar acciones (eventos o tareas) de otros -Permission2413Eliminar acciones (eventos o tareas) de otros -Permission2501Consultar/Recuperar documentos -Permission2502Recuperar documentos -Permission2503Enviar o eliminar documentos -Permission2515Configuración directorios de documentos -Permission2801Utilizar el cliente FTP en modo lectura (sólo explorar y descargar) -Permission2802Utilizar el cliente FTP en modo escritura (borrar o subir archivos) -Permission50101Usar TPV -Permission50201Consultar las transacciones -Permission50202Importar las transacciones -DictionnaryCompanyTypeTipos de empresa -DictionnaryCompanyJuridicalTypeFormas jurídicas -DictionnaryProspectLevelPerspectiva nivel cliente potencial -DictionnaryCantonDepartamentos/Provincias/Zonas -DictionnaryRegionRegiones -DictionnaryCountryPaíses -DictionnaryCurrencyMonedas -DictionnaryCivilityTítulos de cortesía -DictionnaryActionsTipos de eventos de la agenda -DictionnarySocialContributionsTipos de cargas sociales -DictionnaryVATTasa de IVA (Impuesto sobre ventas en EEUU) -DictionnaryRevenueStampImportes de sellos fiscales -DictionnaryPaymentConditionsCondiciones de pago -DictionnaryPaymentModesModos de pago -DictionnaryTypeContactTipos de contactos/direcciones -DictionnaryEcotaxeBaremos CEcoParticipación (DEEE) -DictionnaryPaperFormatFormatos de papel -DictionnaryFeesTipos de desplazamientos y honorarios -DictionnarySendingMethodsMétodos de expedición -DictionnaryStaffEmpleados -DictionnaryAvailabilityTiempos de entrega -DictionnaryOrderMethodsMétodos de pedido -DictionnarySourceOrígenes de presupuestos/pedidos -DictionnaryAccountancyplanPlan contable -DictionnaryAccountancysystemModelos de planes contables -SetupSavedConfiguración guardada -BackToModuleListVolver a la lista de módulos -BackToDictionnaryListVolver a la lista de diccionarios -VATReceivedOnlyImpuestos especiales no facturables -VATManagementGestión IVA -VATIsUsedDescEl tipo de IVA propuesto por defecto en las creaciones de presupuestos, facturas, pedidos, etc. Responde a la siguiente regla:
Si el vendedor no está sujeto a IVA, IVA por defecto=0. Final de regla.
Si el país del vendedor= país del comprador entonces IVA por defecto=IVA del producto vendido. Final de regla.
Si vendedor y comprador residen en la Comunidad Europea y el bien vendido= nuevo medio de transportes (auto, barco, avión), IVA por defecto=0 (el IVA debe ser pagado por comprador a la hacienda pública de su país y no al vendedor). Final de regla
Si vendedor y comprador residen en la Comunidad Europea y comprador= particular o empresa sin NIF intracomunitario entonces IVA por defecto=IVA del producto vendido. Final de regla.
Si vendedor y comprador residen en la Comunidad Europea y comprador= empresa con NIF intracomunitario entonces IVA por defecto=0. Final de regla.
Si no, IVA propuesto por defecto=0. Final de regla.
-VATIsNotUsedDescEl tipo de IVA propuesto por defecto es 0. Este es el caso de asociaciones, particulares o algunas pequeñas sociedades. -VATIsUsedExampleFREn Francia, se trata de las sociedades u organismos que eligen un régimen fiscal general (General simplificado o General normal), régimen en el cual se declara el IVA. -VATIsNotUsedExampleFREn Francia, se trata de asociaciones exentas de IVA o sociedades, organismos o profesiones liberales que han elegido el régimen fiscal de módulos (IVA en franquicia), pagando un IVA en franquicia sin hacer declaración de IVA. Esta elección hace aparecer la anotación "IVA no aplicable - art-293B del CGI" en las facturas. +CHARSET=UTF-8 +Version=Versión +VersionProgram=Versión programa +VersionLastInstall=Versión instalación inicial +VersionLastUpgrade=Versión última actualización +VersionExperimental=Experimental +VersionDevelopment=Desarrollo +VersionUnknown=Desconocida +VersionRecommanded=Recomendada +SessionId=Sesión ID +SessionSaveHandler=Modalidad de salvaguardado de sesiones +SessionSavePath=Localización salvaguardado de sesiones +PurgeSessions=Purga de sesiones +ConfirmPurgeSessions=¿Quiere purgar las sesiones? Esto desconectará a todos los usuarios (salvo a usted mismo). +NoSessionListWithThisHandler=El gestor de período de sesiones configurado en su PHP no enumera las sesiones en curso +LockNewSessions=Bloquear conexiones nuevas +ConfirmLockNewSessions=¿Está seguro de querer restringir el acceso a Dolibarr a su usuario? Solamente el login %s podrá conectarse si confirma. +UnlockNewSessions=Eliminar bloqueo de conexiones +YourSession=Su sesión +Sessions=Sesiones de usuarios +WebUserGroup=Servidor web usuario/grupo +NoSessionFound=Parece que su PHP no puede listar las sesiones activas. El directorio de salvaguardado de sesiones (%s) puede estar protegido (por ejemplo, por los permisos del sistema operativo o por la directiva open_basedir de su PHP). +HTMLCharset=Charset de las páginas HTML +DBStoringCharset=Charset base de datos para almacenamiento de datos +DBSortingCharset=Charset base de datos para clasificar los datos +WarningModuleNotActive=Módulo %s no activo +WarningOnlyPermissionOfActivatedModules=Atención, solamente los permisos relacionados con los módulos activados se indican aquí. Puede activar los otros módulos en la página Configuración->Módulos +DolibarrSetup=Instalación/Actualización de Dolibarr +DolibarrUser=Usuario Dolibarr +InternalUser=Usuario interno +ExternalUser=Usuario externo +InternalUsers=Usuarios internos +ExternalUsers=Usuarios externos +GlobalSetup=General +GUISetup=Entorno +SetupArea=Área configuración +FormToTestFileUploadForm=Formulario de prueba de subida de archivo (según opciones elegidas) +IfModuleEnabled=Nota: sólo es eficaz si el módulo %s está activado +RemoveLock=Elimine el archivo %s, si existe, para permitir la utilidad de actualización. +RestoreLock=Sustituir un archivo %s, dándole sólo derechos de lectura a este archivo con el fin de prohibir nuevas actualizaciones. +SecuritySetup=Configuración de la seguridad +ErrorModuleRequirePHPVersion=Error, este módulo requiere una versión %s o superior de PHP +ErrorModuleRequireDolibarrVersion=Error, este módulo requiere una versión %s o superior de Dolibarr +ErrorDecimalLargerThanAreForbidden=Error, las precisiones superiores a %s no están soportadas. +DictionnarySetup=Diccionarios +Dictionnary=Diccionarios +ErrorReservedTypeSystemSystemAuto=El uso del tipo 'system' y 'systemauto' está reservado. Puede utilizar 'user' como valor para añadir su propio registro +ErrorCodeCantContainZero=El código no puede contener el valor 0 +DisableJavascript=Desactivar las funciones Javascript +ConfirmAjax=Utilizar los popups de confirmación Ajax +UseSearchToSelectCompany=Utilizar un formulario de búsqueda para buscar terceros (en vez de lista desplegable)

Tenga en cuenta que si tiene un gran número de productos o servicios (>100 000), puede mejorar el rendimiento mediante la constante SOCIETE_DONOTSEARCH_ANYWHERE a 1 en Configuración->Varios. La búsqueda se limitará entonces al inicio de la cadena. +ActivityStateToSelectCompany=Agregar un filtro en la búsqueda para mostrar/ocultar los terceros en activo o que hayan dejado de ejercer +UseSearchToSelectContact=Utilizar un formulario de búsqueda para buscar contactos (en vez de una lista desplegable).
Tenga en cuenta que si tiene un gran número de contactos (>100 000), puede mejorar el rendimiento mediante la constante CONTACT_DONOTSEARCH_ANYWHERE a 1 en Configuración->Varios. La búsqueda se limitará entonces al inicio de la cadena. +SearchFilter=Opciones filtros de búsqueda +NumberOfKeyToSearch=Nº de caracteres para desencadenar la búsqueda: %s +ViewFullDateActions=Ver las fechas de las acciones en su totalidad en la ficha de tercero +NotAvailableWhenAjaxDisabled=No disponible cuando Ajax esté desactivado +JavascriptDisabled=Javascript desactivado +UsePopupCalendar=Utilizar popups para la introducción de las fechas +UsePreviewTabs=Ver fichas "vista previa" +ShowPreview=Ver vista previa +PreviewNotAvailable=Vista previa no disponible +ThemeCurrentlyActive=Tema actualmente activo +CurrentTimeZone=Zona horaria PHP (Servidor) +Space=Área +Fields=Campos +Mask=Máscara +NextValue=Próximo valor +NextValueForInvoices=Próximo valor (facturas) +NextValueForCreditNotes=Próximo valor (notas de entrega) +MustBeLowerThanPHPLimit=Observación: Su PHP limita el tamaño a %s %s de máximo, cualquiera que sea el valor de este parámetro +NoMaxSizeByPHPLimit=Ninguna limitación interna en su servidor PHP +MaxSizeForUploadedFiles=Tamaño máximo de los documentos a subir (0 para prohibir la subida) +UseCaptchaCode=Utilización de código gráfico (CAPTCHA) en el login +UseAvToScanUploadedFiles=Utilización de un antivirus para escanear los archivos subidos +AntiVirusCommand=Ruta completa hacia el comando antivirus +AntiVirusCommandExample=Ejemplo para ClamWin: c:\Program Files (x86)\ClamWin\bin\clamscan.exe
Ejemplo para ClamAv: /usr/bin/clamscan +AntiVirusParam=Parámetros complementarios en la línea de comandos +AntiVirusParamExample=Ejemplo para ClamWin: --database="C:\Program Files (x86)\ClamWin\lib" +ComptaSetup=Configuración del módulo Contabilidad +UserSetup=Configuración gestión de los usuarios +MenuSetup=Administración de los menús por base de datos +MenuLimits=Límites y precisión +MenuIdParent=Id del menú padre +DetailMenuIdParent=ID del menú padre (vacío para un menú superior) +DetailPosition=Número de orden para la posición del menú +PersonalizedMenusNotSupported=Menús personalizados no generados +AllMenus=Todos +NotConfigured=No configurado +Setup=Configuración +Activation=Activación +Active=Activo +SetupShort=Config. +OtherOptions=Otras opciones +OtherSetup=Varios +CurrentValueSeparatorDecimal=Separador decimal +CurrentValueSeparatorThousand=Separador miles +Modules=Módulos +ModulesCommon=Módulos principales +ModulesOther=Módulos complementarios +ModulesInterfaces=Módulos interfaz +ModulesSpecial=Módulos específicos +ParameterInDolibarr=Variable %s +LanguageParameter=Variable idioma %s +LanguageBrowserParameter=Variable %s +LocalisationDolibarrParameters=Parámetros de localización +ClientTZ=Zona horaria Cliente (usuario) +ClientHour=Hora cliente (usuario) +OSTZ=Zona horaria +PHPTZ=Zona horaria PHP +PHPServerOffsetWithGreenwich=Offset servidor con Greenwich (segundos) +ClientOffsetWithGreenwich=Offset cliente/navegador con Greenwich (segundos) +DaylingSavingTime=Horario de verano (usuario) +CurrentHour=Hora PHP (servidor) +CompanyTZ=Zona Horaria empresa (sede central) +CompanyHour=Hora empresa (sede central) +CurrentSessionTimeOut=Timeout sesión actual +OSEnv=Entorno SO +Box=Panel +Boxes=Paneles +MaxNbOfLinesForBoxes=Nº de líneas máximo para los paneles +PositionByDefault=Posición por defecto +Position=Orden +MenusDesc=Los gestores de menú definen el contenido de las 2 barras de menús (la barra horizontal y la barra vertical). Es posible asignar gestores diferentes según el usuario sea interno o externo. +MenusEditorDesc=El editor de menús permite definir entradas personalizadas en los menús. Debe utilizarse con prudencia so pena de poner a Dolibarr en una situación inestable siendo necesaria una reinstalación para encontrar un menú coherente. +MenuForUsers=Menú para los usuarios +LangFile=Archivo .lang +System=Sistema +SystemInfo=Info. sistema +SystemTools=Utilidades sistema +SystemToolsArea=Área utilidades del sistema +SystemToolsAreaDesc=Esta área ofrece distintas funciones de administración. Utilice la menú para elegir la funcionalidad buscada. +PurgeAreaDesc=Esta página le permite eliminar todos los archivos creados o guardados por Dolibarr (archivos temporales o todos los archivos del directorio %s). El uso de esta función no es necesaria. Se proporciona para los usuarios que albergan a Dolibarr en un servidor que no ofrece los permisos de eliminación de archivos salvaguardados por el servidor Web. +PurgeDeleteLogFile=Borrar el archivo log %s definido por el módulo Syslog (no hay riesgo de pérdida de datos) +PurgeDeleteTemporaryFiles=Eliminar todos los archivos temporales (sin riesgo de perdida de datos) +PurgeDeleteAllFilesInDocumentsDir=Eliminar todos los archivos del directorio %s. Archivos temporales y archivos adjuntados a elementos (terceros, facturas, etc.) serán eliminados. +PurgeRunNow=Purgar +PurgeNothingToDelete=Ningún directorio a eliminar +PurgeNDirectoriesDeleted=%s archivos o directorios eliminados +PurgeAuditEvents=Purgar los eventos de seguridad +ConfirmPurgeAuditEvents=¿Está seguro de querer purgar la lista de los eventos de auditoría de seguridad (Se borrará toda la lista, pero esto no afecta a sus datos)? +NewBackup=Nueva copia de seguridad +GenerateBackup=Generar copia de seguridad +Backup=Copia de seguridad +Restore=Restauración +RunCommandSummary=La copia será realizada por el comando siguiente +RunCommandSummaryToLaunch=La copia puede ser realizada por el comando siguiente +WebServerMustHavePermissionForCommand=Su servidor Web debe tener los derechos de ejecutar tal orden +BackupResult=Resultado de la copia +BackupFileSuccessfullyCreated=Archivo de copia generado correctamente +YouCanDownloadBackupFile=Los archivos generados pueden ahora descargarse +NoBackupFileAvailable=Ninguna copia disponible +ExportMethod=Método de exportación +ImportMethod=Método de importación +ToBuildBackupFileClickHere=Para crear una copia, haga click aquí. +ImportMySqlDesc=Para importar una copia, hay que utilizar el comando mysql en linea siguiente: +ImportPostgreSqlDesc=Para importar una copia de seguridad, debe usar el comando pg_restore desde la línea de comandos: +ImportMySqlCommand=%s %s < miarchivobackup.sql +ImportPostgreSqlCommand=%s %s miarchivobackup.sql +FileNameToGenerate=Nombre del archivo a generar +CommandsToDisableForeignKeysForImport=Comando para desactivar las claves excluyentes a la importación +CommandsToDisableForeignKeysForImportWarning=Obligatorio si quiere poder restaurar más tarde el dump SQL +ExportCompatibility=Compatibilidad del archivo de exportación generado +MySqlExportParameters=Parámetros de la exportación MySql +PostgreSqlExportParameters=Parámetros de la exportación PostgreSQL +UseTransactionnalMode=Utilizar el modo transaccional +FullPathToMysqldumpCommand=Ruta completa del comando mysqldump +FullPathToPostgreSQLdumpCommand=ruta completa hacia el comando pg_dump +ExportOptions=Opciones de exportación +AddDropDatabase=Añadir órdenes DROP DATABASE +AddDropTable=Añadir órdenes DROP TABLE +ExportStructure=Estructura +Datas=Datos +NameColumn=Nombre las columnas +ExtendedInsert=Instrucciones INSERT extendidas +NoLockBeforeInsert=Sin instrucción LOCK antes del INSERT +DelayedInsert=Inserciones con retraso +EncodeBinariesInHexa=Codificar los campos binarios en hexadecimal +IgnoreDuplicateRecords=Ignorar los errores de duplicación (INSERT IGNORE) +Yes=Sí +No=No +AutoDetectLang=Autodetección (navegador) +FeatureDisabledInDemo=Opción deshabilitada en demo +Rights=Permisos +BoxesDesc=Los paneles son pequeñas zonas de información que se muestran en algunas páginas. Puede elegir activar o desactivar un panel haciendo clic en 'Activar', o haciendo click en el cubo de basura para desactivarlo. Solo se muestran los paneles relacionados con un módulo activo. +OnlyActiveElementsAreShown=Sólo los elementos de módulos activados son mostrados. +ModulesDesc=Los módulos Dolibarr definen las funcionalidades disponibles en la aplicación. Algunos módulos requieren permisos que deberán indicarse a los usuarios para que puedan acceder a sus funcionalidades. +ModulesInterfaceDesc=Los módulos de interfaz son módulos que permiten vincular a Dolibarr con sistemas, aplicaciones o servicios externos. +ModulesSpecialDesc=Los módulos complementarios son módulos de uso muy específico o menos corriente que los módulos normales. +ModulesJobDesc=Los módulos específicos permiten una preconfiguración simplificada de Dolibarr para un negocio en concreto. +ModulesMarketPlaceDesc=Hay disponibles para su descarga en sitios externos otros módulos/extensiones... +ModulesMarketPlaces=Más módulos... +DoliStoreDesc=DoliStore, el sitio oficial de módulos complementarios y para Dolibarr ERP/CRM +WebSiteDesc=Sitios proveedores a consultar para encontrar más módulos +URL=Enlace +BoxesAvailable=Paneles disponibles +BoxesActivated=Paneles activados +ActivateOn=Activar en +ActiveOn=Activo en +SourceFile=Archivo origen +AutomaticIfJavascriptDisabled=Automático si Javascript está desactivado +AvailableOnlyIfJavascriptNotDisabled=Disponible solamente si Javascript esta activado +AvailableOnlyIfJavascriptAndAjaxNotDisabled=Disponible solamente si Javascript y Ajax están activados +Required=Requerido +Security=Seguridad +Passwords=Contraseñas +DoNotStoreClearPassword=No almacenar la contraseña sin cifrar en la base +MainDbPasswordFileConfEncrypted=Encriptar la contraseña de la base en el archivo conf.php +InstrucToEncodePass=Para tener la contraseña de la base de datos codificada en el archivo de configuración conf.php, reemplazar en ese fichero la línea
$dolibarr_main_db_pass="..."
por
$dolibarr_main_db_pass="crypted:%s" +InstrucToClearPass=Para tener la contraseña de la base de datos descodificada en el archivo de configuración b>conf.php
, reemplazar en ese fichero la línea
$dolibarr_main_db_pass="crypted:..."
por
$dolibarr_main_db_pass="%s" +ProtectAndEncryptPdfFiles=Protección y encriptación de los pdf generados +ProtectAndEncryptPdfFilesDesc=La protección de un documento pdf deja el documento libre a la lectura y a la impresión a cualquier lector de PDF. Por el contrario, la modificación y la copia resultan imposibles. +Feature=Función +DolibarrLicense=Licencia +DolibarrProjectLeader=jefe de proyecto +Developpers=Desarrolladores/contribuidores +OtherDeveloppers=Otros desarrolladores/contribuidores +OfficialWebSite=Sitio web oficial internacional +OfficialWebSiteFr=sitio web oficial habla francesa +OfficialWiki=Wiki documentación Dolibarr +OfficialDemo=Demo en línea Dolibarr +OfficialMarketPlace=Sitio oficial de módulos complementarios y extensiones +OfficialWebHostingService=Servicio oficial de alojamiento (SaaS) +ForDocumentationSeeWiki=Para la documentación de usuario, desarrollador o Preguntas Frecuentes (FAQ), consulte el wiki Dolibarr:
%s +ForAnswersSeeForum=Para otras cuestiones o realizar sus propias consultas, puede utilizar el foro Dolibarr:
%s +HelpCenterDesc1=Esta aplicación, independiente de Dolibarr, le permite ayudarle a obtener un servicio de soporte de Dolibarr. +HelpCenterDesc2=Algunos de estos servicios sólo están disponibles en inglés. +CurrentTopMenuHandler=Gestor de menú superior +CurrentLeftMenuHandler=Gestor de menú izquierdo +CurrentMenuHandler=Gestor de menú +CurrentSmartphoneMenuHandler=Gestor menú smartphone actual +MeasuringUnit=Unidad de medida +Emails=E-Mails +EMailsSetup=Configuración E-Mails +EMailsDesc=Esta página permite sustituir los parámetros PHP relacionados con el envío de correos electrónicos. En la mayoría de los casos en SO como UNIX/Linux, los parámetros PHP son ya correctos y esta página es inútil. +MAIN_MAIL_SMTP_PORT=Puerto del servidor SMTP (Por defecto en php.ini: %s) +MAIN_MAIL_SMTP_SERVER=Nombre host o ip del servidor SMTP (Por defecto en php.ini: %s) +MAIN_MAIL_SMTP_PORT_NotAvailableOnLinuxLike=Puerto del servidor SMTP (No definido en PHP en sistemas de tipo Unix) +MAIN_MAIL_SMTP_SERVER_NotAvailableOnLinuxLike=Nombre servidor o ip del servidor SMTP (No definido en PHP en sistemas de tipo Unix) +MAIN_MAIL_EMAIL_FROM=E-Mail del emisor para envíos E-Mail automáticos (Por defecto en php.ini: %s) +MAIN_MAIL_ERRORS_TO=E-Mail usado para los retornos de error de los e-mails enviados +MAIN_MAIL_AUTOCOPY_TO=Enviar automáticamente copia oculta de los e-mails enviados a +MAIN_DISABLE_ALL_MAILS=Desactivar globalmente todo envío de correos electrónicos (para modo de pruebas o demo) +MAIN_MAIL_SENDMODE=Método de envío de e-mails +MAIN_MAIL_SMTPS_ID=ID de autentificación SMTP si se requiere autenticación SMTP +MAIN_MAIL_SMTPS_PW=Contraseña autentificación SMTP si se requiere autentificación SMTP +MAIN_MAIL_EMAIL_TLS=Uso de encriptación TLS (SSL) +MAIN_DISABLE_ALL_SMS=Desactivar globalmente todo envío de SMS (para modo de pruebas o demo) +MAIN_SMS_SENDMODE=Método de envío de SMS +MAIN_MAIL_SMS_FROM=Número de teléfono por defecto para los envíos SMS +FeatureNotAvailableOnLinux=Funcionalidad no disponible en sistemas Unix. Pruebe su sendmail localmente. +SubmitTranslation=Si la traducción de este idioma es incompleta o si encuentra errores, puede corregirlos mediante la edición de los archivos en el directorio langs/%s y envíe los cambios al foro www.dolibarr.es. +ModuleSetup=Configuración del módulo +ModulesSetup=Configuración de los módulos +ModuleFamilyBase=Sistema +ModuleFamilyCrm=Gestión cliente (CRM) +ModuleFamilyProducts=Gestión productos +ModuleFamilyHr=Recursos Humanos +ModuleFamilyProjects=Proyectos/Trabajo cooperativo +ModuleFamilyOther=Otro +ModuleFamilyTechnic=Módulos herramientas o Sistema +ModuleFamilyExperimental=Módulos experimentales +ModuleFamilyFinancial=Módulos financieros (Contabilidad/tesorería) +ModuleFamilyECM=Gestión Electrónica de Documentos (GED) +MenuHandlers=Gestores menú +MenuAdmin=Editor menú +DoNotUseInProduction=No usar en producción +ThisIsProcessToFollow=He aquí el procedimiento a seguir: +StepNb=Paso %s +FindPackageFromWebSite=Buscar el paquete que responde a su necesidad (por ejemplo en el sitio web %s) +DownloadPackageFromWebSite=Descargar el paquete desde el sitio %s. +UnpackPackageInDolibarrRoot=Descomprimir el paquete en el directorio raíz de Dolibarr %s sobre los archivos existentes (sin desplazar o borrar los existentes, so pena de perder su configuración o los módulos no oficiales instalados) +SetupIsReadyForUse=La instalación ha finalizado y Dolibarr está disponible con el nuevo componente. +NotExistsDirect=No existe el directorio alternativo.
+InfDirAlt=Desde la versión 3 es posible definir un directorio root alternativo, esto le permite almacenar en el mismo lugar módulos y temas personalizados.
Basta con crear un directorio en el raíz de Dolibarr (por ejemplo: custom).
+InfDirExample=
Seguidamente se declara en el archivo conf.php:
$dolibarr_main_url_root_alt='http://miservidor/custom'
$dolibarr_main_document_root_alt='/directorio/de/dolibarr/htdocs/custom'
*Estas lineas vienen comentadas con un "#", para descomentarlas solo hay que retirar el caracter. +YouCanSubmitFile=Seleccione paquete: +CurrentVersion=Versión actual de Dolibarr +CallUpdatePage=Llamar a la página de actualización de la estructura y datos de la base de datos %s. +LastStableVersion=Última versión estable disponible +GenericMaskCodes=Puede introducir cualquier máscara numérica. En esta máscara, puede utilizar las siguientes etiquetas:
{000000} corresponde a un número que se incrementa en cada uno de %s. Introduzca tantos ceros como longitud desee mostrar. El contador se completará a partir de ceros por la izquierda con el fin de tener tantos ceros como la máscara.
{000000+000} Igual que el anterior, con una compensación correspondiente al número a la derecha del signo + se aplica a partir del primer %s.
{000000@x} igual que el anterior, pero el contador se restablece a cero cuando se llega a x meses (x entre 1 y 12). Si esta opción se utiliza y x es de 2 o superior, entonces la secuencia {yy}{mm} o {yyyy}{mm} también es necesaria.
{dd} días (01 a 31).
{mm} mes (01 a 12).
{yy}, {yyyy} ou {y} año en 2, 4 ó 1 cifra.
+GenericMaskCodes2={cccc} el código de cliente en n caracteres
{cccc000} el código de cliente en n caracteres es seguido por un contador propio al cliente sin offset, completado con ceros hasta completar la máscara, y volviendo a cero al mismo tiempo que el contador global.
{tttt}El código del tipo de la empresa en n caracteres (ver diccionarios-tipos de empresas).
+GenericMaskCodes3=Cualquier otro carácter en la máscara se quedará sin cambios.
No se permiten espacios
+GenericMaskCodes4a=Ejemplo en la 99 ª %s del tercero La Empresa realizada el 31/03/2007:
+GenericMaskCodes4b=Ejemplo sobre un tercero creado el 31/03/2007:
+GenericMaskCodes4c=Ejemplo en un producto/servicio creado el 31/03/2007:
+GenericMaskCodes5=ABC{yy}{mm}-{000000} dará ABC0703-000099
{0000+100@1}-XXX/{dd}/YYY daráa 0199-XXX/31/YYY +GenericNumRefModelDesc=Devuelve un número creado acorde a una máscara definida. +ServerAvailableOnIPOrPort=Servidor disponible en la dirección %s en el puerto %s +ServerNotAvailableOnIPOrPort=Servidor no disponible en la dirección %s en el puerto %s +DoTestServerAvailability=Probar conectividad con el servidor +DoTestSend=Probar envío +DoTestSendHTML=Probar envío HTML +ErrorCantUseRazInStartedYearIfNoYearMonthInMask=Error, no se puede usar la opción @ si la secuencia {yy}{mm} o {yyyy}{mm} no se encuentra en la máscara. +UMask=Parámetro UMask de nuevos archivos en Unix/Linux/BSD. +UMaskExplanation=Este parámetro determina los derechos de los archivos creados en el servidor Dolibarr (durante la subida, por ejemplo).
Este debe ser el valor octal (por ejemplo, 0666 significa lectura / escritura para todos).
Este parámetro no tiene ningún efecto sobre un servidor Windows. +SeeWikiForAllTeam=Vea el wiki para más detalles de todos los actores y de su organización +UseACacheDelay=Demora en caché de la exportación en segundos (0 o vacio sin caché) +DisableLinkToHelpCenter=Ocultar el enlace "¿Necesita soporte o ayuda?" en la página de login +DisableLinkToHelp=Ocultar el enlace "%s Ayuda en línea" del menú izquierdo +AddCRIfTooLong=No hay líneas de corte automático, de modo que si el texto es demasiado largo en los documentos, debe agregar sus propios retornos de carro en el texto mecanografiado. +ModuleDisabled=Módulo desactivado +ModuleDisabledSoNoEvent=Módulo desactivado, por lo que evento nunca se crea +ConfirmPurge=¿Está seguro de querer realizar esta purga?
Esto borrará definitivamente todos los datos de sus archivos (área GED, archivos adjuntos etc.). +MinLength=Longuitud mínima +LanguageFilesCachedIntoShmopSharedMemory=archivos .lang en memoria compartida +ExamplesWithCurrentSetup=Ejemplos con la configuración activa actual +ListOfDirectories=Listado de directorios de plantillas OpenDocument +ListOfDirectoriesForModelGenODT=Listado de directorios con plantillas de documentos OpenDocument.

Indicar la ruta completa del directorio.
Añadir un retorno a la línea entre cada directorio.Para indicar un directorio del módulo GED, indicar DOL_DATA_ROOT/ecm/nombredeldirectorio.

Los archivos de plantilla de estos directorios deben terminar con .odt +NumberOfModelFilesFound=Número de archivos de plantillas ODT encontrados en este/estos directorio(s) +ExampleOfDirectoriesForModelGen=Ejemplos de sintaxis:
c:\mydir
/home/mydir
DOL_DATA_ROOT/ecm/ecmdir +FollowingSubstitutionKeysCanBeUsed=Colocando los siguientes tags en la plantilla, obtendrá una sustitución con el valor personalizado al generar el documento: +FullListOnOnlineDocumentation=http://wiki.dolibarr.org/index.php/Crear_un_modelo_de_documento_ODT +FirstnameNamePosition=Orden visualización nombre/apellidos +DescWeather=Los siguientes gráficos se mostrarán en el panel si el número de elementos llegan a estos valores: +KeyForWebServicesAccess=Clave para usar los Web Services (parámetro "dolibarrkey" en webservices) +TestSubmitForm=Formulario de pruebas +ThisForceAlsoTheme=Usar este gestor de menús predetermina también el tema, sea cual sea la elección del usuario. Además, este gestor de menús, especial para smartphones, solamente funciona en algunos teléfonos. Use otro gestor si observa cualquier problema. +ThemeDir=Directorio de los temas +ConnectionTimeout=Timeout de conexión +ResponseTimeout=Timeout de respuesta +SmsTestMessage=Mensaje de prueba de __PHONEFROM__ para __PHONETO__ +ModuleMustBeEnabledFirst=Para usar esta función debe estar activado el módulo %s. +SecurityToken=Clave para encriptar urls +NoSmsEngine=No hay disponible ningún gestor de envío de SMS. Los gestores de envío de SMS no se instalan por defecto ya que dependen de cada proveedor, sin embargo puede encontrarlos en la plataforma %s. +PDF=PDF +PDFDesc=Puede definir aquí las opciones globales para la generación de los PDF +PDFAddressForging=Reglas de visualización de direcciones +HideAnyVATInformationOnPDF=Ocultar toda la información relacionada con el IVA en la generación de los PDF +HideDescOnPDF=Ocultar descripción de los productos en la generación de los PDF +HideRefOnPDF=Ocultar referencia de los productos en la generación de los PDF +HideDetailsOnPDF=Ocultar detalles de las líneas de productos en la generación de los PDF +Library=Librería +UrlGenerationParameters=Seguridad de las URLs +SecurityTokenIsUnique=¿Usar un parámetro securekey único para cada URL? +EnterRefToBuildUrl=Introduzca la referencia del objeto %s +GetSecuredUrl=Obtener la URL calculada +ButtonHideUnauthorized=Ocultar los botones de acciones no autorizadas en vez de mostrarlos atenuados +TotalNumberOfActivatedModules=Número total de módulos activados: %s +YouMustEnableOneModule=Debe activar al menos un módulo. +ProductVatMassChange=Modificar IVA en masa +ProductVatMassChangeDesc=Esta página le permite cambiar el tipo de IVA definido en los productos o servicios de un valor a otro. Tenga en cuenta que el cambio se lleva a cabo en masa sobre toda la base de datos. +OldVATRates=Tasa de IVA antigua +NewVATRates=Tasa de IVA nueva +PriceBaseTypeToChange=Cambiar el precio cuya referencia de base es +MassConvert=Convertir masivamente +String=Cadena de texto +TextLong=Texto largo +Int=Numérico entero +Float=Decimal +DateAndTime=Fecha y hora +Unique=Único +Boolean=Boleano (Casilla de verificación) +ExtrafieldPhone=Teléfono +ExtrafieldPrice=Precio +ExtrafieldMail=Correo +ExtrafieldSelect=Lista de selección +ExtrafieldSelectList=Lista de selección de tabla +ExtrafieldSeparator=Separador +ExtrafieldCheckBox=Casilla de verificación +ExtrafieldRadio=Botón de selección excluyente +ExtrafieldParamHelpselect=La lista ha de ser en forma llave, valor

por ejemplo :
1,text1
2,text2
3,text3
... +ExtrafieldParamHelpcheckbox=La lista ha de ser en forma llave, valor

por ejemplo :
1,text1
2,text2
3,text3
... +ExtrafieldParamHelpradio=La lista ha de ser en forma llave, valor

por ejemplo :
1,text1
2,text2
3,text3
... +ExtrafieldParamHelpsellist=La lista ha de ser de la tabl

por ejemplo:
table:label:(code)
+LibraryToBuildPDF=Librería usada para la creación de archivos PDF +WarningUsingFPDF=Atención: Su archivo conf.php contiene la directiva dolibarr_pdf_force_fpdf=1. Esto hace que se use la librería FPDF para generar sus archivos PDF. Esta librería es antigua y no cubre algunas funcionalidades (Unicode, transparencia de imágenes, idiomas cirílicos, árabes o asiáticos, etc.), por lo que puede tener problemas en la generación de los PDF.
Para resolverlo, y disponer de un soporte completo de PDF, puede descargar la librería TCPDF , y a continuación comentar o eliminar la línea $dolibarr_pdf_force_fpdf=1, y añadir en su lugar $dolibarr_lib_TCPDF_PATH='ruta_a_TCPDF' +LocalTaxDesc=Algunos países aplican 2 o 3 tasas a cada línea de factura. Si es el caso, escoja el tipo de la segunda y tercera tasa y su valor. Los posibles tipos son:
1 : tasa local aplicable a productos y servicios sin IVA (IVA no se aplica en la tasa local)
2 : tasa local se aplica a productos y servicios antes del IVA (IVA se calcula sobre importe+tasa local)
3 : tasa local se aplica a productos sin IVA (IVA no se aplica en la tasa local)
4 : tasa local se aplica a productos antes del IVA (IVA se calcula sobre el importe+tasa local)
5 : tasa local se aplica a servicios sin IVA (IVA no se aplica a la tasa local)
6 : tasa local se aplica a servicios antes del IVA (IVA se calcula sobre importe + tasa local) +SuhosinSessionEncrypt=Almacenamiento de sesiones cifradas por Suhosin +SMS=SMS +LinkToTestClickToDial=Introduzca un número de teléfono al que llamar para probar el enlace de llamada ClickToDial para el usuario %s +RefreshPhoneLink=Refrescar enlace +LinkToTest=Enlace seleccionable para el usuario %s (haga clic en el número para probar) +KeepEmptyToUseDefault=Deje este campo vacío para usar el valor por defecto +DefaultLink=Enlace por defecto +ValueOverwrittenByUserSetup=Atención: Este valor puede ser sobreescrito por un valor específico de la configuración del usuario (cada usuario puede tener su propia url clicktodial) +# Modules= undefined= +Module0Name=Usuarios y grupos +Module0Desc=Gestión de usuarios y grupos +Module1Name=Terceros +Module1Desc=Gestión de terceros (empresas, particulares) y contactos +Module2Name=Comercial +Module2Desc=Gestión comercial +Module10Name=Contabilidad +Module10Desc=Activación de informes simples de contabilidad (diarios, ventas) basados en el contenido de la base de datos. Sin desgloses. +Module20Name=Presupuestos +Module20Desc=Gestión de presupuestos/propuestas comerciales +Module22Name=E-Mailings +Module22Desc=Administración y envío de E-Mails masivos +Module23Name=Energía +Module23Desc=Realiza el seguimiento del consumo de energías +Module25Name=Pedidos de clientes +Module25Desc=Gestión de pedidos de clientes +Module30Name=Facturas y abonos +Module30Desc=Gestión de facturas y abonos a clientes. Gestión facturas de proveedores +Module40Name=Proveedores +Module40Desc=Gestión de proveedores +Module42Name=Syslog +Module42Desc=Generación de logs (archivos, syslog,...) +Module49Name=Editores +Module49Desc=Gestión de editores +Module50Name=Productos +Module50Desc=Gestión de productos +Module51Name=Publipostage +Module51Desc=Administración y envío de correo de papel en masa +Module52Name=Stocks de productos +Module52Desc=Gestión de stocks de productos +Module53Name=Servicios +Module53Desc=Gestión de servicios +Module54Name=Contratos +Module54Desc=Gestión de contratos +Module55Name=Códigos de barras +Module55Desc=Gestión de los códigos de barras +Module56Name=Telefonía +Module56Desc=Gestión de la telefonía +Module57Name=Domiciliaciones +Module57Desc=Gestión de domiciliaciones y reintegros bancarios +Module58Name=ClickToDial +Module58Desc=Integración con ClickToDial +Module59Name=Bookmark4u +Module59Desc=Añade función para generar una cuenta Bookmark4u desde una cuenta Dolibarr +Module70Name=Intervenciones +Module70Desc=Gestión de las intervenciones a terceros +Module75Name=Notas de gasto y desplazamientos +Module75Desc=Gestión de las notas de gasto y desplazamientos +Module80Name=Expediciones +Module80Desc=Gestión de expediciones y recepciones +Module85Name=Bancos y cajas +Module85Desc=Gestión de las cuentas financieras de tipo cuentas bancarias, postales o efectivo +Module100Name=Sitio web externo +Module100Desc=Incluye cualquier sitio web externo en los menús de Dolibarr, viéndolo en un frame +Module105Name=Mailman y SPIP +Module105Desc=Interfaz con Mailman o SPIP para el módulo Miembros +Module200Name=LDAP +Module200Desc=Sincronización con un directorio LDAP +Module210Name=PostNuke +Module210Desc=Integración con PostNuke +Module240Name=Exportaciones de datos +Module240Desc=Herramienta de exportación de datos Dolibarr (con asistente) +Module250Name=Importación de datos +Module250Desc=Herramienta de importación de datos a Dolibarr (con asistente) +Module310Name=Miembros +Module310Desc=Gestión de miembros de una asociación +Module320Name=Hilos RSS +Module320Desc=Adición de hilos de información RSS en las pantallas Dolibarr +Module330Name=Marcadores +Module330Desc=Gestión de marcadores +Module400Name=Proyectos +Module400Desc=Gestión de los proyectos en los otros módulos +Module410Name=Webcalendar +Module410Desc=Interfaz con el calendario Webcalendar +Module500Name=Impuestos, cargas sociales y dividendos +Module500Desc=Gestión de impuestos y cargas sociales +Module600Name=Notificaciones +Module600Desc=Envío de notificaciones (por correo electrónico) sobre los eventos de trabajo Dolibarr +Module700Name=Donaciones +Module700Desc=Gestión de donaciones +Module800Name=OSCommerce 1 +Module800Desc=Interfaz de visualización de una tienda OSCommerce mediante acceso directo a su base de datos +Module900Name=OSCommerce 2 +Module900Desc=Interfaz de visualización de una tienda OSCommerce mediante Web services. Este módulo requiere instalar los archivos de /oscommerce_ws/ws_server en OSCommerce. Lea el archivo README del directorio /oscommerce_ws/ws_server. +Module1200Name=Mantis +Module1200Desc=Interfaz con el sistema de seguimiento de incidencias Mantis +Module1400Name=Contabilidad experta +Module1400Desc=Gestión experta de la contabilidad (doble partida) +Module1780Name=Categorías +Module1780Desc=Gestión de categorías (productos, proveedores y clientes) +Module2000Name=Editor WYSIWYG +Module2000Desc=Permite la edición de ciertas zonas de texto mediante un editor avanzado +Module2300Name=Programador +Module2300Desc=Tareas programadas +Module2400Name=Agenda +Module2400Desc=Gestión de la agenda y de las acciones +Module2500Name=Gestión Electrónica de Documentos +Module2500Desc=Permite administrar una base de documentos +Module2600Name=WebServices +Module2600Desc=Activa los servicios de servidor web services de Dolibarr +Module2650Name=Ultimatepdf +Module2650Desc=Gestión de la presentación de las plantillas pdf (presupuestos, facturas, pedidos, etc.) +Module2700Name=Gravatar +Module2700Desc=Utiliza el servicio en línea de Gravatar (www.gravatar.com) para mostrar fotos de los usuarios/miembros (que se encuentran en sus mensajes de correo electrónico). Necesita un acceso a Internet +Module2900Name=GeoIPMaxmind +Module2900Desc=Capacidades de conversión GeoIP Maxmind +Module5000Name=Multi-empresa +Module5000Desc=Permite gestionar varias empresas +Module20000Name=Días libres +Module20000Desc=Gestión de los días libres de los empleados +Module50000Name=PayBox +Module50000Desc=Módulo para proporcionar un pago en línea con tarjeta de crédito mediante Paybox +Module50100Name=TPV +Module50100Desc=Terminal Punto de Venta para la venta en mostrador +Module50200Name=Paypal +Module50200Desc=Módulo para proporcionar un pago en línea con tarjeta de crédito mediante Paypal +Module59000Name=Márgenes +Module59000Desc=Módulo para gestionar los márgenes de beneficio +Module60000Name=Comisiones +Module60000Desc=Módulo para gestionar las comisiones de venta +Permission11=Consultar facturas +Permission12=Crear/Modificar facturas +Permission13=De-validar facturas +Permission14=Validar facturas +Permission15=Enviar facturas por correo +Permission16=Emitir pagos de facturas +Permission19=Eliminar facturas +Permission21=Consultar presupuestos +Permission22=Crear/modificar presupuestos +Permission24=Validar presupuestos +Permission25=Enviar los presupuestos +Permission26=Cerrar presupuestos +Permission27=Eliminar presupuestos +Permission28=Exportar los presupuestos +Permission31=Consultar productos +Permission32=Crear/modificar productos +Permission34=Eliminar productos +Permission36=Ver/gestionar los productos ocultos +Permission38=Exportar productos +Permission41=Consultar proyectos y tareas (compartidos o soy contacto) +Permission42=Crear/modificar proyectos y tareas (compartidos o soy contacto) +Permission44=Eliminar proyectos y tareas (compartidos o soy contacto) +Permission61=Consultar intervenciones +Permission62=Crear/modificar intervenciones +Permission64=Eliminar intervenciones +Permission67=Exportar intervenciones +Permission71=Consultar miembros +Permission72=Crear/modificar miembros +Permission74=Eliminar miembros +Permission75=Configurar tipos y atributos de los miembros +Permission76=Exportar miembros +Permission78=Consultar cotizaciones +Permission79=Crear/modificar cotizaciones +Permission81=Consultar pedidos de clientes +Permission82=Crear/modificar pedidos de clientes +Permission84=Validar pedidos de clientes +Permission86=Enviar pedidos de clientes +Permission87=Cerrar pedidos de clientes +Permission88=Anular pedidos de clientes +Permission89=Eliminar pedidos de clientes +Permission91=Consultar impuestos e IVA +Permission92=Crear/modificar impuestos e IVA +Permission93=Eliminar impuestos e IVA +Permission94=Exportar impuestos +Permission95=Consultar balances y resultados +Permission96=Parametrizar desglose +Permission97=Leer líneas de facturas +Permission98=Desglosar líneas de facturas +Permission101=Consultar expediciones +Permission102=Crear/modificar expediciones +Permission104=Validar expediciones +Permission106=Exportar expediciones +Permission109=Eliminar expediciones +Permission111=Consultar cuentas financieras (cuentas bancarias, cajas) +Permission112=Crear/modificar cantidad/eliminar registros bancarios +Permission113=Configurar cuentas financieras (crear, controlar las categorías) +Permission114=Exportar transacciones y registros bancarios +Permission115=Exportar transacciones y extractos +Permission116=Captar transferencias entre cuentas +Permission117=Gestionar envío de cheques +Permission121=Consultar empresas +Permission122=Crear/modificar empresas +Permission125=Eliminar empresas +Permission126=Exportar las empresas +Permission141=Consultar todos los proyectos y tareas (incluyendo los privados de los que no sea contacto) +Permission142=Crear/modificar todos los proyectos y tareas (incluyendo los privados de los que no sea contacto) +Permission144=Eliminar todos los proyectos y tareas (incluyendo los privados de los que no sea contacto) +Permission146=Consultar proveedores +Permission147=Consultar estadísticas +Permission151=Consultar domiciliaciones +Permission152=Crear/modificar domiciliaciones +Permission153=Enviar domiciliaciones +Permission154=Abonar/devolver domiciliaciones +Permission161=Consultar contratos de servicio +Permission162=Crear/modificar contratos de servicio +Permission163=Activar los servicios de un contrato +Permission164=Desactivar los servicios de un contrato +Permission165=Eliminar contratos +Permission171=Leer los desplazamientos +Permission172=Crear/modificar los desplazamientos +Permission173=Eliminar desplazamientos +Permission178=Exportar desplazamientos +Permission180=Consultar proveedores +Permission181=Consultar pedidos a proveedores +Permission182=Crear/modificar pedidos a proveedores +Permission183=Validar pedidos a proveedores +Permission184=Aprobar pedidos a proveedores +Permission185=Enviar pedidos a proveedores +Permission186=Recibir pedidos de proveedores +Permission187=Cerrar pedidos a proveedores +Permission188=Anular pedidos a proveedores +Permission192=Crear líneas +Permission193=Cancelar líneas +Permission194=Consultar el ancho de banda de líneas +Permission202=Crear conexiones ADSL +Permission203=Realizar pedido de conexiones +Permission204=Pedir conexiones +Permission205=Gestionar conexiones +Permission206=Consultar conexiones +Permission211=Consultar telefonía +Permission212=Pedir líneas +Permission213=Activar una línea +Permission214=Configurar la telefonía +Permission215=Configurar proveedores +Permission221=Consultar E-Mails +Permission222=Crear/modificar E-Mails (asunto, destinatarios, etc.) +Permission223=Validar E-Mails (permite el envío) +Permission229=Eliminar E-Mails +Permission237=Ver los destinatarios y la información +Permission238=Enviar los e-mails manualmente +Permission239=Eliminar los e-mails después de su validación o su envío +Permission241=Consultar categorías +Permission242=Crear/modificar categorías +Permission243=Eliminar categorías +Permission244=Ver contenido de categorías ocultas +Permission251=Consultar otros usuarios +PermissionAdvanced251=Consultar otros usuarios +Permission252=Consultar los permisos de otros usuarios +Permission253=Crear/modificar otros usuarios y sus permisos +PermissionAdvanced253=Crear/modificar usuarios internos/externos y sus permisos +Permission254=Modificar la contraseña de otros usuarios +Permission255=Eliminar o desactivar otros usuarios +Permission256=Consultar sus permisos +Permission262=Consultar todas las empresas (Solamente usuarios internos. Los externos están limitados a ellos mismos) +Permission271=Consultar el CA +Permission272=Consultar las facturas +Permission273=Emitir las facturas +Permission281=Consultar contactos +Permission282=Crear/modificar contactos +Permission283=Eliminar contactos +Permission286=Exportar contactos +Permission291=Consultar tarifas +Permission292=Definir permisos sobre las tarifas +Permission293=Modificar tarifas de clientes +Permission300=Consultar códigos de barras +Permission301=Crear/modificar códigos de barras +Permission302=Eliminar código de barras +Permission311=Consultar servicios +Permission312=Asignar servicios a un contrato +Permission331=Consultar marcadores +Permission332=Crear/modificar marcadores +Permission333=Eliminar marcadores +Permission341=Consultar sus propios permisos +Permission342=Crear/modificar su propia info de usuario +Permission343=Modificar su propia contraseña +Permission344=Modificar sus propios permisos +Permission351=Consultar los grupos +Permission352=Consultar los permisos de grupos +Permission353=Crear/modificar los grupos y sus permisos +Permission354=Eliminar o desactivar grupos +Permission358=Exportar usuarios +Permission401=Consultar haberes +Permission402=Crear/modificar haberes +Permission403=Validar haberes +Permission404=Eliminar haberes +Permission531=Consultar servicios +Permission532=Crear/modificar servicios +Permission534=Eliminar servicios +Permission536=Ver/gestionar los servicios ocultos +Permission538=Exportar servicios +Permission701=Consultar donaciones +Permission702=Crear/modificar donaciones +Permission703=Eliminar donaciones +Permission1001=Consultar stocks +Permission1002=Crear/modificar stocks +Permission1003=Eliminar stocks +Permission1004=Consultar movimientos de stock +Permission1005=Crear/modificar movimientos de stock +Permission1101=Consultar órdenes de envío +Permission1102=Crear/modificar órdenes de envío +Permission1104=Validar orden de envío +Permission1109=Eliminar orden de envío +Permission1181=Consultar proveedores +Permission1182=Consultar pedidos a proveedores +Permission1183=Crear pedidos a proveedores +Permission1184=Validar pedidos a proveedores +Permission1185=Aprobar pedidos a proveedores +Permission1186=Enviar pedidos a proveedores +Permission1187=Recibir pedidos de proveedores +Permission1188=Cerrar pedidos a proveedores +Permission1201=Obtener resultado de una exportación +Permission1202=Crear/codificar exportaciones +Permission1231=Consultar facturas de proveedores +Permission1232=Crear facturas de proveedores +Permission1233=Validar facturas de proveedores +Permission1234=Eliminar facturas de proveedores +Permission1235=Enviar facturas de proveedores por correo +Permission1236=Exportar facturas de proveedores, atributos y pagos +Permission1237=Exportar pedidos de proveedores junto con sus detalles +Permission1251=Lanzar las importaciones en masa a la base de datos (carga de datos) +Permission1321=Exportar facturas a clientes, atributos y cobros +Permission1401=Leer el plan contable +Permission1402=Crear/Modificar un plan contable +Permission1403=Cerrar un plan contable +Permission1411=Leer los movimientos contables +Permission1412=Crear/modificar/anular movimientos contables +Permission1415=Leer Balances, informes, diarios, libros maestros +Permission1421=Exportar pedidos de clientes y atributos +Permission23001=Ver tareas programadas +Permission23002=Crear/actualizar tareas programadas +Permission23003=Borrar tareas programadas +Permission23004=Ejecutar tareas programadas +Permission2401=Leer acciones (eventos o tareas) vinculadas a su cuenta +Permission2402=Crear/eliminar acciones (eventos o tareas) vinculadas a su cuenta +Permission2403=Modificar acciones (eventos o tareas) vinculadas a su cuenta +Permission2411=Leer acciones (eventos o tareas) de otros +Permission2412=Crear/modificar acciones (eventos o tareas) de otros +Permission2413=Eliminar acciones (eventos o tareas) de otros +Permission2501=Consultar/Recuperar documentos +Permission2502=Recuperar documentos +Permission2503=Enviar o eliminar documentos +Permission2515=Configuración directorios de documentos +Permission2801=Utilizar el cliente FTP en modo lectura (sólo explorar y descargar) +Permission2802=Utilizar el cliente FTP en modo escritura (borrar o subir archivos) +Permission50101=Usar TPV +Permission50201=Consultar las transacciones +Permission50202=Importar las transacciones +DictionnaryCompanyType=Tipos de empresa +DictionnaryCompanyJuridicalType=Formas jurídicas +DictionnaryProspectLevel=Perspectiva nivel cliente potencial +DictionnaryCanton=Departamentos/Provincias/Zonas +DictionnaryRegion=Regiones +DictionnaryCountry=Países +DictionnaryCurrency=Monedas +DictionnaryCivility=Títulos de cortesía +DictionnaryActions=Tipos de eventos de la agenda +DictionnarySocialContributions=Tipos de cargas sociales +DictionnaryVAT=Tasa de IVA (Impuesto sobre ventas en EEUU) +DictionnaryRevenueStamp=Importes de sellos fiscales +DictionnaryPaymentConditions=Condiciones de pago +DictionnaryPaymentModes=Modos de pago +DictionnaryTypeContact=Tipos de contactos/direcciones +DictionnaryEcotaxe=Baremos CEcoParticipación (DEEE) +DictionnaryPaperFormat=Formatos de papel +DictionnaryFees=Tipos de desplazamientos y honorarios +DictionnarySendingMethods=Métodos de expedición +DictionnaryStaff=Empleados +DictionnaryAvailability=Tiempos de entrega +DictionnaryOrderMethods=Métodos de pedido +DictionnarySource=Orígenes de presupuestos/pedidos +DictionnaryAccountancyplan=Plan contable +DictionnaryAccountancysystem=Modelos de planes contables +SetupSaved=Configuración guardada +BackToModuleList=Volver a la lista de módulos +BackToDictionnaryList=Volver a la lista de diccionarios +VATReceivedOnly=Impuestos especiales no facturables +VATManagement=Gestión IVA +VATIsUsedDesc=El tipo de IVA propuesto por defecto en las creaciones de presupuestos, facturas, pedidos, etc. Responde a la siguiente regla:
Si el vendedor no está sujeto a IVA, IVA por defecto=0. Final de regla.
Si el país del vendedor= país del comprador entonces IVA por defecto=IVA del producto vendido. Final de regla.
Si vendedor y comprador residen en la Comunidad Europea y el bien vendido= nuevo medio de transportes (auto, barco, avión), IVA por defecto=0 (el IVA debe ser pagado por comprador a la hacienda pública de su país y no al vendedor). Final de regla
Si vendedor y comprador residen en la Comunidad Europea y comprador= particular o empresa sin NIF intracomunitario entonces IVA por defecto=IVA del producto vendido. Final de regla.
Si vendedor y comprador residen en la Comunidad Europea y comprador= empresa con NIF intracomunitario entonces IVA por defecto=0. Final de regla.
Si no, IVA propuesto por defecto=0. Final de regla.
+VATIsNotUsedDesc=El tipo de IVA propuesto por defecto es 0. Este es el caso de asociaciones, particulares o algunas pequeñas sociedades. +VATIsUsedExampleFR=En Francia, se trata de las sociedades u organismos que eligen un régimen fiscal general (General simplificado o General normal), régimen en el cual se declara el IVA. +VATIsNotUsedExampleFR=En Francia, se trata de asociaciones exentas de IVA o sociedades, organismos o profesiones liberales que han elegido el régimen fiscal de módulos (IVA en franquicia), pagando un IVA en franquicia sin hacer declaración de IVA. Esta elección hace aparecer la anotación "IVA no aplicable - art-293B del CGI" en las facturas. ##### Local Taxes ##### -LocalTax1IsUsedSujeto -LocalTax1IsNotUsedNo sujeto -LocalTax1IsUsedDescUso de un 2º tipo de impuesto (Distinto del IVA) -LocalTax1IsNotUsedDescNo usar un 2º tipo de impuesto (Distinto del IVA) -LocalTax1ManagementGestión 2º tipo de impuesto -LocalTax1IsUsedExample -LocalTax1IsNotUsedExample -LocalTax2IsUsedSujeto -LocalTax2IsNotUsedNo sujeto -LocalTax2IsUsedDescUso de un 3er. tipo de impuesto (Distinto del IVA) -LocalTax2IsNotUsedDescNo usar un 3er. tipo de impuesto (Distinto del IVA) -LocalTax2ManagementGestión 3er. tipo de impuesto -LocalTax2IsUsedExample -LocalTax2IsNotUsedExample -LocalTax1ManagementESGestión RE -LocalTax1IsUsedDescESEl tipo de RE propuesto por defecto en las creaciones de presupuestos, facturas, pedidos, etc. Responde a la siguiente regla:
Si el comprador no está sujeto a RE, RE por defecto=0. Final de regla.
Si el comprador está sujeto a RE entonces se aplica valor de RE por defecto. Final de regla.
-LocalTax1IsNotUsedDescESEl tipo de RE propuesto por defecto es 0. Final de regla. -LocalTax1IsUsedExampleESEn España, se trata de personas físicas: autónomos sujetos a unos epígrafes concretos del IAE. -LocalTax1IsNotUsedExampleESEn España, se trata de empresas jurídicas: Sociedades limitadas, anónimas, etc. y personas físicas (autónomos) sujetos a ciertos epígrafes del IAE. -LocalTax2ManagementESGestión IRPF -LocalTax2IsUsedDescESEl tipo de IRPF propuesto por defecto en las creaciones de presupuestos, facturas, pedidos, etc. Responde a la siguiente regla:
Si el vendedor no está sujeto a IRPF, IRPF por defecto=0. Final de regla.
Si el vendedor está sujeto a IRPF entonces se aplica valor de IRPF por defecto. Final de regla.
-LocalTax2IsNotUsedDescESEl tipo de IRPF propuesto por defecto es 0. Final de regla. -LocalTax2IsUsedExampleESEn España, se trata de personas físicas: autónomos y profesionales independientes que prestan servicios y empresas que han elegido el régimen fiscal de módulos. -LocalTax2IsNotUsedExampleESEn España, se trata de empresas no sujetas al régimen fiscal de módulos. -LabelUsedByDefaultEtiqueta que se utilizará si no se encuentra traducción para este código -LabelOnDocumentsEtiqueta sobre documentos -NbOfDaysNº de días -AtEndOfMonthA fin de mes -OffsetDecálogo -AlwaysActiveSiempre activo -UpdateRequiredSu sistema necesita una actualización. Para actualizar haga clic en Actualizar. -UpgradeActualización -MenuUpgradeActualización / Extensión -AddExtensionThemeModuleOrOtherAñadir extensión (tema, módulo, etc.) -WebServerServidor web -DocumentRootServerDirectorio raíz de las páginas web -DataRootServerDirectorio raíz de los archivos de datos -IPIP -PortPuerto -VirtualServerNameNombre del servidor virtual -AllParametersTodos los parámetros -OSSO -PhpEnvEnv -PhpModulesMódulos -PhpConfConf -PhpWebLinkVínculo Web-PHP -PearPear -PearPackagesPaquetes Pear -DatabaseBase de datos -DatabaseServerHost de la base de datos -DatabaseNameNombre de la base de datos -DatabasePortPuerto de la base de datos -DatabaseUserLogin de la base de datos -DatabasePasswordContraseña de la base de datos -DatabaseConfigurationConfiguración de la base de datos -TablesTablas -TableNameNombre de la tabla -TableLineFormatFormato líneas -NbOfRecordNº Reg. -ConstraintsConstraints -ConstraintsTypeTipo de constraint -ConstraintsToShowOrNotEntryConstraint para mostrar o no la entrada de menú -AllMustBeOkTodos deben ser controlados -HostServidor -DriverTypeTipo de driver -SummarySystemResumen de la información de sistemas Dolibarr -SummaryConstLista de todos los parámetros de configuración Dolibarr -SystemUpdateActualización del sistema -SystemSuccessfulyUpdateSu sistema se actualizó correctamente -MenuCompanySetupEmpresa/Institución -MenuNewUserNuevo usuario -MenuTopManagerGestor del menú superior -MenuLeftManagerGestor del menú izquierdo -MenuManagerGestor del menú estándar -MenuSmartphoneManagerGestor de menú smartphone -DefaultMenuTopManagerGestor del menú superior -DefaultMenuLeftManagerGestor del menú izquierdo -DefaultMenuManagerGestor del menú estándar -DefaultMenuSmartphoneManagerGestor de menú smartphone -SkinTema visual -DefaultSkinTema visual por defecto -MaxSizeListLongitud máxima de listados -DefaultMaxSizeListLongitud máxima de listados por defecto -MessageOfDayMensaje del día -MessageLoginMensaje del login -PermanentLeftSearchFormZona de búsqueda permanente del menú izquierdo -DefaultLanguageIdioma por defecto a utilizar (código idioma) -EnableMultilangInterfaceActivar interfaz multi-idioma -EnableShowLogoMostrar el logotipo en el menú de la izquierda -SystemSuccessfulyUpdatedSu sistema está actualizado -CompanyInfoInformación de la empresa/institución -CompanyIdsIdentificación reglamentaria -CompanyNameNombre/Razón social -CompanyAddressDirección -CompanyZipCódigo postal -CompanyTownPoblación -CompanyCountryPaís -CompanyCurrencyDivisa principal -DoNotShowNo mostrar -DoNotSuggestPaymentModeNo sugerir -NoActiveBankAccountDefinedNinguna cuenta bancaria activa definida -OwnerOfBankAccountTitular de la cuenta %s -BankModuleNotActiveMódulo cuentas bancarias no activado -ShowBugTrackLinkMostrar vínculo "Señalar un bug" -ShowWorkBoardMostrar panel de información en la página principal -AlertsAlertas -DelaysPlazos -DelayBeforeWarningPlazo antes de alerta -DelaysBeforeWarningPlazos antes de alerta -DelaysOfToleranceBeforeWarningPlazos de tolerancia antes de alerta -DelaysOfToleranceDescEsta pantalla permite configura los plazos de tolerancia antes de que se alerte con el símbolo %s, sobre cada elemento en retraso. -Delays_MAIN_DELAY_ACTIONS_TODOTolerancia de retraso antes de la alerta (en días) sobre acciones planificadas no realizadas -Delays_MAIN_DELAY_ORDERS_TO_PROCESSTolerancia de retraso antes de la alerta (en días) sobre pedidos de clientes no procesados -Delays_MAIN_DELAY_SUPPLIER_ORDERS_TO_PROCESSTolerancia de retraso antes de la alerta (en días) sobre pedidos a proveedores no procesados -Delays_MAIN_DELAY_PROPALS_TO_CLOSETolerancia de retraso antes de la alerta (en días) sobre presupuestos a cerrar -Delays_MAIN_DELAY_PROPALS_TO_BILLTolerancia de retraso antes de la alerta (en días) sobre presupuestos no facturados -Delays_MAIN_DELAY_NOT_ACTIVATED_SERVICESTolerancia de retraso antes de la alerta (en días) sobre servicios a activar -Delays_MAIN_DELAY_RUNNING_SERVICESTolerancia de retraso antes de la alerta (en días) sobre servicios expirados -Delays_MAIN_DELAY_SUPPLIER_BILLS_TO_PAYTolerancia de retraso antes de la alerta (en días) sobre facturas de proveedor impagadas -Delays_MAIN_DELAY_CUSTOMER_BILLS_UNPAYEDTolerancia de retraso antes de la alerta (en días) sobre facturas a cliente impagadas -Delays_MAIN_DELAY_TRANSACTIONS_TO_CONCILIATETolerancia de retraso antes de la alerta (en días) sobre conciliaciones bancarias pendientes -Delays_MAIN_DELAY_MEMBERSTolerancia de retraso entes de la alerta (en días) sobre cotizaciones adherentes en retraso -Delays_MAIN_DELAY_CHEQUES_TO_DEPOSITTolerancia de retraso entes de la alerta (en días) sobre cheques a ingresar -SetupDescription1Todas las opciones del área de configuración son opciones que permiten configurar a Dolibarr antes de empezar su utilización. -SetupDescription2Los 2 pasos indispensables de la configuración son las 2 primeras en el menú izquierdo: la configuración de la empresa/institución y la configuración de los módulos: -SetupDescription3La configuración Empresa/institución a administrar es requerida ya que se utiliza la información para la introducción de datos en la mayoría de las pantallas, en inserciones, o para modificar el comportamiento de Dolibarr (como, por ejemplo, de las funciones que dependen de su país). -SetupDescription4La configuración Módulos es indispensable ya que Dolibarr no es un ERP/CRM monolítico, es un conjunto de módulos más o menos independiente. Después de activar los módulos que le interesen comprobará sus funcionalidades en los menús de Dolibarr. -SetupDescription5Las otras entradas de configuración gestionan parámetros opcionales. -EventsSetupConfiguración del registro de eventos -LogEventsAuditoría de la seguridad de eventos -AuditAuditoría -InfoDolibarrInfo. Dolibarr -InfoOSInfo. SO -InfoWebServerInfo. servidor -InfoDatabaseInfo. base de datos -InfoPHPInfo. PHP -ListEventsAuditoría de eventos -ListOfSecurityEventsListado de eventos de seguridad Dolibarr -SecurityEventsPurgedEventos de seguridad purgados -LogEventDescPuede habilitar el registro de eventos de seguridad Dolibarr aquí. Los administradores pueden ver su contenido a través de menú Herramientas del sistema - Auditoría.Atención, esta característica puede consumir una gran cantidad de datos en la base de datos. -AreaForAdminOnlyEstas funciones solo son accesibles a un usuario administrador. -SystemInfoDescLa información del sistema es información técnica accesible solamente en solo lectura a los administradores. -SystemAreaForAdminOnlyEsta área solo es accesible a los usuarios de tipo administradores. Ningún permiso Dolibarr permite extender el círculo de usuarios autorizados a esta área. -CompanyFundationDescModifique en esta página toda la información conocida sobre la empresa o asociación a administrar (para ello haga clic en el botón "Modificar" a pie de página) -DisplayDescPuede encontrar aquí todos los parámetros relacionados con la apariencia de Dolibarr -AvailableModulesMódulos disponibles -ToActivateModulePara activar los módulos, vaya al área de Configuración (Inicio->Configuración->Módulos). -SessionTimeOutTimeout de sesiones -SessionExplanationAsegura que el período de sesiones no expirará antes de este momento. Sin embargo, la gestión del período de sesiones de PHP no garantiza que el período de sesiones expira después de este período: Este será el caso si un sistema de limpieza del caché de sesiones es activo.
Nota: Sin mecanismo especial, el mecanismo interno para limpiar el período de sesiones de PHP todos los accesos %s/%s, pero sólo en torno al acceso de otros períodos de sesiones. -TriggersAvailableTriggers disponibles -TriggersDescLos triggers son archivos que, une vez depositados en el directorio htdocs/core/triggers, modifican el comportamiento del workflow de Dolibarr. Realizan acciones suplementarias, desencadenadas por los eventos Dolibarr (creación de empresa, validación factura, cierre contrato, etc). -TriggerDisabledByNameTriggers de este archivo desactivados por el sufijo -NORUN en el nombre del archivo. -TriggerDisabledAsModuleDisabledTriggers de este archivo desactivados ya que el módulo %s no está activado. -TriggerAlwaysActiveTriggers de este archivo siempre activos, ya que los módulos Dolibarr relacionados están activados -TriggerActiveAsModuleActiveTriggers de este archivo activos ya que el módulo %s está activado -GeneratedPasswordDescIndique aquí que norma quiere utilizar para generar las contraseñas cuando quiera generar una nueva contraseña -DictionnaryDescIndique aquí los datos de referencia. Puede completar/modificar los datos predefinidos con los suyos. -ConstDescCualquier otro parámetro no editable en las páginas anteriores -OnceSetupFinishedCreateUsersAtención, está bajo una cuenta de administrador de Dolibarr. Los administradores se utilizan para configurar a Dolibarr. Para un uso corriente de Dolibarr, se recomienda utilizar una cuenta no administrador creada desde el menú "Usuarios y grupos" -MiscellaneousDescDefina aquí los otros parámetros relacionados con la seguridad. -LimitsSetupConfiguración de límites y precisiones -LimitsDescPuede definir aquí los límites y precisiones utilizados por Dolibarr -MAIN_MAX_DECIMALS_UNITDecimales máximos para los precios unitarios -MAIN_MAX_DECIMALS_TOTDecimales máximos para los precios totales -MAIN_MAX_DECIMALS_SHOWNDecimales máximos para los importes mostrados en pantalla (Poner ... después del máximo si quiere ver ... cuando el número se trunque al mostrarlo en pantalla) -MAIN_DISABLE_PDF_COMPRESSIONUtilizar la compresión PDF para los archivos PDF generados -MAIN_ROUNDING_RULE_TOTTamaño rango para el redondeo (para algunos países que redondean sobre otra base que no sea base 10) -UnitPriceOfProductPrecio unitario sin IVA de un producto -TotalPriceAfterRoundingPrecio total después del redondeo -ParameterActiveForNextInputOnlyParámetro efectivo solamente a partir de las próximas sesiones -NoEventOrNoAuditSetupNo se han registrado eventos de seguridad. Esto puede ser normal si la auditoría no ha sido habilitada en la página "configuración->seguridad->auditoría". -NoEventFoundWithCriteriaNo se han encontrado eventos de seguridad para tales criterios de búsqueda. -SeeLocalSendMailSetupVer la configuración local de sendmail -BackupDescPara realizar una copia de seguridad completa de Dolibarr, usted debe: -BackupDesc2* Guardar el contenido del directorio de documentos (%s) que contiene todos los archivos subidos o generados (comprimiendo el directorio, por ejemplo). -BackupDesc3* Guardar el contenido de su base de datos en un archivo de volcado. Para ello puede utilizar el asistente a continuación. -BackupDescXEl directorio archivado deberá guardarse en un lugar seguro. -BackupDescYEl archivo de volcado generado deberá guardarse en un lugar seguro. -BackupPHPWarningLa copia de seguridad no puede ser garantizada con este método. Es preferible utilizar el anterior -RestoreDescPara restaurar una copia de seguridad de Dolibarr, usted debe: -RestoreDesc2* Tomar el archivo (archivo zip, por ejemplo) del directorio de los documentos y descomprimirlo en el directorio de los documentos de una nueva instalación de Dolibarr directorio o en la carpeta de los documentos de esta instalación (%s). -RestoreDesc3* Recargar el archivo de volcado guardado en la base de datos de una nueva instalación de Dolibarr o de esta instalación. Atención, una vez realizada la restauración, deberá utilizar un login/contraseña de administrador existente en el momento de la copia de seguridad para conectarse. Para restaurar la base de datos en la instalación actual, puede utilizar el asistente a continuación. -RestoreMySQLImportación MySQL -ForcedToByAModuleEsta regla está forzada a %s por uno de los módulos activados -PreviousDumpFilesArchivos de copia de seguridad de la base de datos disponibles -WeekStartOnDayPrimer día de la semana -RunningUpdateProcessMayBeRequiredParece necesario realizar el proceso de actualización (la versión del programa %s difiere de la versión de la base de datos %s) -YouMustRunCommandFromCommandLineAfterLoginToUserDebe ejecutar el comando desde un shell después de haber iniciado sesión con la cuenta %s. -YourPHPDoesNotHaveSSLSupportFunciones SSL no disponibles en su PHP -DownloadMoreSkinsMás temas para descargar -SimpleNumRefModelDescDevuelve el número bajo el formato %syymm-nnnn donde yy es el año, mm el mes y nnnn un contador secuencial sin ruptura y sin volver a 0 -ShowProfIdInAddressMostrar el identificador profesional en las direcciones de los documentos -ShowVATIntaInAddressOcultar el IVA identificador en las direcciones de los documentos -TranslationUncompleteTraducción parcial -SomeTranslationAreUncompleteAlgunos idiomas están traducidos en parte o pueden contener errores. Si lo encuentra, puede corregir los archivos de texto .lang del directorio htdocs/langs y enviarlos al foro http://www.dolibarr.fr. -MenuUseLayoutHacer el menú izquierdo ocultable (la opción javascript no debería deshabilitarse) -MAIN_DISABLE_METEODeshabilitar la vista meteorológica -TestLoginToAPIComprobar conexión a la API -ProxyDescAlgunas de las características de Dolibarr requieren que el servidor tenga acceso a Internet. Defina aqui los parámetros para dicho acceso. Si el servidor está detrás de un proxy, estos parámetros indican a Dolibarr cómo pasarlo. -ExternalAccessAcceso externo -MAIN_PROXY_USEUsar un servidor proxy (si no acceso directo a Internet) -MAIN_PROXY_HOSTNombre/Dirección del servidor proxy -MAIN_PROXY_PORTPuerto del servidor proxy -MAIN_PROXY_USERLogin del servidor proxy -MAIN_PROXY_PASSContraseña del servidor proxy -DefineHereComplementaryAttributesDefina aquí la lista de atributos adicionales, no disponibles por defecto, y que desea gestionar para %s. -ExtraFieldsAtributos adicionales -ExtraFieldsThirdPartiesAtributos adicionales (terceros) -ExtraFieldsContactsAtributos adicionales (contactos/direcciones) -ExtraFieldsMemberAtributos complementarios (miembros) -ExtraFieldsMemberTypeAtributos complementarios (tipos de miembros) -ExtraFieldsCustomerInvoicesAtributos complementarios (facturas a clientes) -ExtraFieldsSupplierOrdersAtributos complementarios (pedidos) -ExtraFieldsSupplierInvoicesAtributos complementarios (facturas) -ExtraFieldsProjectAtributos complementarios (proyectos) -ExtraFieldsProjectTaskAtributos complementarios (tareas) -ExtraFieldHasWrongValueEl atributo %s tiene un valor incorrecto. -AlphaNumOnlyCharsAndNoSpacesolamente caracteres alfanuméricos sin espacios -SendingMailSetupConfiguración del envío por mail -SendmailOptionNotCompleteAtención, en algunos sistemas Linux, con este método de envio, para poder enviar mails en su nombre, la configuración de sendmail debe contener la opción -ba (parámetro mail.force_extra_parameters en el archivo php.ini). Si algunos de sus destinatarios no reciben sus mensajes, pruebe a modificar este parámetro PHP con mail.force_extra_parameters=-ba. -PathToDocumentsRutas de acceso a documentos -PathDirectoryDirectorio -SendmailOptionMayHurtBuggedMTALa funcionalidad de enviar correo electrónico a través del "correo directo PHP" genera una solicitud que puede ser mal interpretado por algunos servidores de correo. Esto se traduce en mensajes de correo electrónico ilegibles para las personas alojadas en estas plataformas. Este es el caso de clientes en ciertos proveedores de servicios de Internet (Ej: Orange). Esto no es un problema ni de Dolibarr ni de PHP, pero sí del servidor de correo. Sin embargo, puede agregar la opción MAIN_FIX_FOR_BUGGED_MTA con valor 1 en configuración-varios para tratar que Dolibarr evite el error. Otra solución (recomendada) es utilizar el método de envío por SMTP que no tiene este inconveniente. -TranslationSetupConfiguración traducción -TranslationDescLa elección del idioma mostrado en pantalla se modifica:
* A nivel global desde el menú Inicio - Configuración - Entorno
* De manera específica al usuario desde la pestaña Interfaz usuario de su ficha de usuario (hacer clic en su login en la parte superior izquierda de la pantalla). -ClassNotFoundIntoPathWarningNo se ha encontrado la clase %s en su path PHP -YesInSummerSí en verano -OnlyFollowingModulesAreOpenedToExternalUsersTenga en cuenta que sólo los módulos siguientes están abiertos a usuarios externos (sean cuales sean los permisos de los usuarios): -ConditionIsCurrentlyActualmente la condición es %s -##### Module password generation= undefined -PasswordGenerationStandardDevuelve una contraseña generada por el algoritmo interno Dolibarr: 8 caracteres, números y caracteres en minúsculas mezcladas. -PasswordGenerationNoneNo ofrece contraseñas. La contraseña se introduce manualmente. +LocalTax1IsUsed=Sujeto +LocalTax1IsNotUsed=No sujeto +LocalTax1IsUsedDesc=Uso de un 2º tipo de impuesto (Distinto del IVA) +LocalTax1IsNotUsedDesc=No usar un 2º tipo de impuesto (Distinto del IVA) +LocalTax1Management=Gestión 2º tipo de impuesto +LocalTax1IsUsedExample= +LocalTax1IsNotUsedExample= +LocalTax2IsUsed=Sujeto +LocalTax2IsNotUsed=No sujeto +LocalTax2IsUsedDesc=Uso de un 3er. tipo de impuesto (Distinto del IVA) +LocalTax2IsNotUsedDesc=No usar un 3er. tipo de impuesto (Distinto del IVA) +LocalTax2Management=Gestión 3er. tipo de impuesto +LocalTax2IsUsedExample= +LocalTax2IsNotUsedExample= +LocalTax1ManagementES=Gestión RE +LocalTax1IsUsedDescES=El tipo de RE propuesto por defecto en las creaciones de presupuestos, facturas, pedidos, etc. Responde a la siguiente regla:
Si el comprador no está sujeto a RE, RE por defecto=0. Final de regla.
Si el comprador está sujeto a RE entonces se aplica valor de RE por defecto. Final de regla.
+LocalTax1IsNotUsedDescES=El tipo de RE propuesto por defecto es 0. Final de regla. +LocalTax1IsUsedExampleES=En España, se trata de personas físicas: autónomos sujetos a unos epígrafes concretos del IAE. +LocalTax1IsNotUsedExampleES=En España, se trata de empresas jurídicas: Sociedades limitadas, anónimas, etc. y personas físicas (autónomos) sujetos a ciertos epígrafes del IAE. +LocalTax2ManagementES=Gestión IRPF +LocalTax2IsUsedDescES=El tipo de IRPF propuesto por defecto en las creaciones de presupuestos, facturas, pedidos, etc. Responde a la siguiente regla:
Si el vendedor no está sujeto a IRPF, IRPF por defecto=0. Final de regla.
Si el vendedor está sujeto a IRPF entonces se aplica valor de IRPF por defecto. Final de regla.
+LocalTax2IsNotUsedDescES=El tipo de IRPF propuesto por defecto es 0. Final de regla. +LocalTax2IsUsedExampleES=En España, se trata de personas físicas: autónomos y profesionales independientes que prestan servicios y empresas que han elegido el régimen fiscal de módulos. +LocalTax2IsNotUsedExampleES=En España, se trata de empresas no sujetas al régimen fiscal de módulos. +LabelUsedByDefault=Etiqueta que se utilizará si no se encuentra traducción para este código +LabelOnDocuments=Etiqueta sobre documentos +NbOfDays=Nº de días +AtEndOfMonth=A fin de mes +Offset=Decálogo +AlwaysActive=Siempre activo +UpdateRequired=Su sistema necesita una actualización. Para actualizar haga clic en Actualizar. +Upgrade=Actualización +MenuUpgrade=Actualización / Extensión +AddExtensionThemeModuleOrOther=Añadir extensión (tema, módulo, etc.) +WebServer=Servidor web +DocumentRootServer=Directorio raíz de las páginas web +DataRootServer=Directorio raíz de los archivos de datos +IP=IP +Port=Puerto +VirtualServerName=Nombre del servidor virtual +AllParameters=Todos los parámetros +OS=SO +PhpEnv=Env +PhpModules=Módulos +PhpConf=Conf +PhpWebLink=Vínculo Web-PHP +Pear=Pear +PearPackages=Paquetes Pear +Database=Base de datos +DatabaseServer=Host de la base de datos +DatabaseName=Nombre de la base de datos +DatabasePort=Puerto de la base de datos +DatabaseUser=Login de la base de datos +DatabasePassword=Contraseña de la base de datos +DatabaseConfiguration=Configuración de la base de datos +Tables=Tablas +TableName=Nombre de la tabla +TableLineFormat=Formato líneas +NbOfRecord=Nº Reg. +Constraints=Constraints +ConstraintsType=Tipo de constraint +ConstraintsToShowOrNotEntry=Constraint para mostrar o no la entrada de menú +AllMustBeOk=Todos deben ser controlados +Host=Servidor +DriverType=Tipo de driver +SummarySystem=Resumen de la información de sistemas Dolibarr +SummaryConst=Lista de todos los parámetros de configuración Dolibarr +SystemUpdate=Actualización del sistema +SystemSuccessfulyUpdate=Su sistema se actualizó correctamente +MenuCompanySetup=Empresa/Institución +MenuNewUser=Nuevo usuario +MenuTopManager=Gestor del menú superior +MenuLeftManager=Gestor del menú izquierdo +MenuManager=Gestor del menú estándar +MenuSmartphoneManager=Gestor de menú smartphone +DefaultMenuTopManager=Gestor del menú superior +DefaultMenuLeftManager=Gestor del menú izquierdo +DefaultMenuManager=Gestor del menú estándar +DefaultMenuSmartphoneManager=Gestor de menú smartphone +Skin=Tema visual +DefaultSkin=Tema visual por defecto +MaxSizeList=Longitud máxima de listados +DefaultMaxSizeList=Longitud máxima de listados por defecto +MessageOfDay=Mensaje del día +MessageLogin=Mensaje del login +PermanentLeftSearchForm=Zona de búsqueda permanente del menú izquierdo +DefaultLanguage=Idioma por defecto a utilizar (código idioma) +EnableMultilangInterface=Activar interfaz multi-idioma +EnableShowLogo=Mostrar el logotipo en el menú de la izquierda +SystemSuccessfulyUpdated=Su sistema está actualizado +CompanyInfo=Información de la empresa/institución +CompanyIds=Identificación reglamentaria +CompanyName=Nombre/Razón social +CompanyAddress=Dirección +CompanyZip=Código postal +CompanyTown=Población +CompanyCountry=País +CompanyCurrency=Divisa principal +DoNotShow=No mostrar +DoNotSuggestPaymentMode=No sugerir +NoActiveBankAccountDefined=Ninguna cuenta bancaria activa definida +OwnerOfBankAccount=Titular de la cuenta %s +BankModuleNotActive=Módulo cuentas bancarias no activado +ShowBugTrackLink=Mostrar vínculo "Señalar un bug" +ShowWorkBoard=Mostrar panel de información en la página principal +Alerts=Alertas +Delays=Plazos +DelayBeforeWarning=Plazo antes de alerta +DelaysBeforeWarning=Plazos antes de alerta +DelaysOfToleranceBeforeWarning=Plazos de tolerancia antes de alerta +DelaysOfToleranceDesc=Esta pantalla permite configura los plazos de tolerancia antes de que se alerte con el símbolo %s, sobre cada elemento en retraso. +Delays_MAIN_DELAY_ACTIONS_TODO=Tolerancia de retraso antes de la alerta (en días) sobre acciones planificadas no realizadas +Delays_MAIN_DELAY_ORDERS_TO_PROCESS=Tolerancia de retraso antes de la alerta (en días) sobre pedidos de clientes no procesados +Delays_MAIN_DELAY_SUPPLIER_ORDERS_TO_PROCESS=Tolerancia de retraso antes de la alerta (en días) sobre pedidos a proveedores no procesados +Delays_MAIN_DELAY_PROPALS_TO_CLOSE=Tolerancia de retraso antes de la alerta (en días) sobre presupuestos a cerrar +Delays_MAIN_DELAY_PROPALS_TO_BILL=Tolerancia de retraso antes de la alerta (en días) sobre presupuestos no facturados +Delays_MAIN_DELAY_NOT_ACTIVATED_SERVICES=Tolerancia de retraso antes de la alerta (en días) sobre servicios a activar +Delays_MAIN_DELAY_RUNNING_SERVICES=Tolerancia de retraso antes de la alerta (en días) sobre servicios expirados +Delays_MAIN_DELAY_SUPPLIER_BILLS_TO_PAY=Tolerancia de retraso antes de la alerta (en días) sobre facturas de proveedor impagadas +Delays_MAIN_DELAY_CUSTOMER_BILLS_UNPAYED=Tolerancia de retraso antes de la alerta (en días) sobre facturas a cliente impagadas +Delays_MAIN_DELAY_TRANSACTIONS_TO_CONCILIATE=Tolerancia de retraso antes de la alerta (en días) sobre conciliaciones bancarias pendientes +Delays_MAIN_DELAY_MEMBERS=Tolerancia de retraso entes de la alerta (en días) sobre cotizaciones adherentes en retraso +Delays_MAIN_DELAY_CHEQUES_TO_DEPOSIT=Tolerancia de retraso entes de la alerta (en días) sobre cheques a ingresar +SetupDescription1=Todas las opciones del área de configuración son opciones que permiten configurar a Dolibarr antes de empezar su utilización. +SetupDescription2=Los 2 pasos indispensables de la configuración son las 2 primeras en el menú izquierdo: la configuración de la empresa/institución y la configuración de los módulos: +SetupDescription3=La configuración Empresa/institución a administrar es requerida ya que se utiliza la información para la introducción de datos en la mayoría de las pantallas, en inserciones, o para modificar el comportamiento de Dolibarr (como, por ejemplo, de las funciones que dependen de su país). +SetupDescription4=La configuración Módulos es indispensable ya que Dolibarr no es un ERP/CRM monolítico, es un conjunto de módulos más o menos independiente. Después de activar los módulos que le interesen comprobará sus funcionalidades en los menús de Dolibarr. +SetupDescription5=Las otras entradas de configuración gestionan parámetros opcionales. +EventsSetup=Configuración del registro de eventos +LogEvents=Auditoría de la seguridad de eventos +Audit=Auditoría +InfoDolibarr=Info. Dolibarr +InfoOS=Info. SO +InfoWebServer=Info. servidor +InfoDatabase=Info. base de datos +InfoPHP=Info. PHP +ListEvents=Auditoría de eventos +ListOfSecurityEvents=Listado de eventos de seguridad Dolibarr +SecurityEventsPurged=Eventos de seguridad purgados +LogEventDesc=Puede habilitar el registro de eventos de seguridad Dolibarr aquí. Los administradores pueden ver su contenido a través de menú Herramientas del sistema - Auditoría.Atención, esta característica puede consumir una gran cantidad de datos en la base de datos. +AreaForAdminOnly=Estas funciones solo son accesibles a un usuario administrador. +SystemInfoDesc=La información del sistema es información técnica accesible solamente en solo lectura a los administradores. +SystemAreaForAdminOnly=Esta área solo es accesible a los usuarios de tipo administradores. Ningún permiso Dolibarr permite extender el círculo de usuarios autorizados a esta área. +CompanyFundationDesc=Modifique en esta página toda la información conocida sobre la empresa o asociación a administrar (para ello haga clic en el botón "Modificar" a pie de página) +DisplayDesc=Puede encontrar aquí todos los parámetros relacionados con la apariencia de Dolibarr +AvailableModules=Módulos disponibles +ToActivateModule=Para activar los módulos, vaya al área de Configuración (Inicio->Configuración->Módulos). +SessionTimeOut=Timeout de sesiones +SessionExplanation=Asegura que el período de sesiones no expirará antes de este momento. Sin embargo, la gestión del período de sesiones de PHP no garantiza que el período de sesiones expira después de este período: Este será el caso si un sistema de limpieza del caché de sesiones es activo.
Nota: Sin mecanismo especial, el mecanismo interno para limpiar el período de sesiones de PHP todos los accesos %s/%s, pero sólo en torno al acceso de otros períodos de sesiones. +TriggersAvailable=Triggers disponibles +TriggersDesc=Los triggers son archivos que, une vez depositados en el directorio htdocs/core/triggers, modifican el comportamiento del workflow de Dolibarr. Realizan acciones suplementarias, desencadenadas por los eventos Dolibarr (creación de empresa, validación factura, cierre contrato, etc). +TriggerDisabledByName=Triggers de este archivo desactivados por el sufijo -NORUN en el nombre del archivo. +TriggerDisabledAsModuleDisabled=Triggers de este archivo desactivados ya que el módulo %s no está activado. +TriggerAlwaysActive=Triggers de este archivo siempre activos, ya que los módulos Dolibarr relacionados están activados +TriggerActiveAsModuleActive=Triggers de este archivo activos ya que el módulo %s está activado +GeneratedPasswordDesc=Indique aquí que norma quiere utilizar para generar las contraseñas cuando quiera generar una nueva contraseña +DictionnaryDesc=Indique aquí los datos de referencia. Puede completar/modificar los datos predefinidos con los suyos. +ConstDesc=Cualquier otro parámetro no editable en las páginas anteriores +OnceSetupFinishedCreateUsers=Atención, está bajo una cuenta de administrador de Dolibarr. Los administradores se utilizan para configurar a Dolibarr. Para un uso corriente de Dolibarr, se recomienda utilizar una cuenta no administrador creada desde el menú "Usuarios y grupos" +MiscellaneousDesc=Defina aquí los otros parámetros relacionados con la seguridad. +LimitsSetup=Configuración de límites y precisiones +LimitsDesc=Puede definir aquí los límites y precisiones utilizados por Dolibarr +MAIN_MAX_DECIMALS_UNIT=Decimales máximos para los precios unitarios +MAIN_MAX_DECIMALS_TOT=Decimales máximos para los precios totales +MAIN_MAX_DECIMALS_SHOWN=Decimales máximos para los importes mostrados en pantalla (Poner ... después del máximo si quiere ver ... cuando el número se trunque al mostrarlo en pantalla) +MAIN_DISABLE_PDF_COMPRESSION=Utilizar la compresión PDF para los archivos PDF generados +MAIN_ROUNDING_RULE_TOT=Tamaño rango para el redondeo (para algunos países que redondean sobre otra base que no sea base 10) +UnitPriceOfProduct=Precio unitario sin IVA de un producto +TotalPriceAfterRounding=Precio total después del redondeo +ParameterActiveForNextInputOnly=Parámetro efectivo solamente a partir de las próximas sesiones +NoEventOrNoAuditSetup=No se han registrado eventos de seguridad. Esto puede ser normal si la auditoría no ha sido habilitada en la página "configuración->seguridad->auditoría". +NoEventFoundWithCriteria=No se han encontrado eventos de seguridad para tales criterios de búsqueda. +SeeLocalSendMailSetup=Ver la configuración local de sendmail +BackupDesc=Para realizar una copia de seguridad completa de Dolibarr, usted debe: +BackupDesc2=* Guardar el contenido del directorio de documentos (%s) que contiene todos los archivos subidos o generados (comprimiendo el directorio, por ejemplo). +BackupDesc3=* Guardar el contenido de su base de datos en un archivo de volcado. Para ello puede utilizar el asistente a continuación. +BackupDescX=El directorio archivado deberá guardarse en un lugar seguro. +BackupDescY=El archivo de volcado generado deberá guardarse en un lugar seguro. +BackupPHPWarning=La copia de seguridad no puede ser garantizada con este método. Es preferible utilizar el anterior +RestoreDesc=Para restaurar una copia de seguridad de Dolibarr, usted debe: +RestoreDesc2=* Tomar el archivo (archivo zip, por ejemplo) del directorio de los documentos y descomprimirlo en el directorio de los documentos de una nueva instalación de Dolibarr directorio o en la carpeta de los documentos de esta instalación (%s). +RestoreDesc3=* Recargar el archivo de volcado guardado en la base de datos de una nueva instalación de Dolibarr o de esta instalación. Atención, una vez realizada la restauración, deberá utilizar un login/contraseña de administrador existente en el momento de la copia de seguridad para conectarse. Para restaurar la base de datos en la instalación actual, puede utilizar el asistente a continuación. +RestoreMySQL=Importación MySQL +ForcedToByAModule=Esta regla está forzada a %s por uno de los módulos activados +PreviousDumpFiles=Archivos de copia de seguridad de la base de datos disponibles +WeekStartOnDay=Primer día de la semana +RunningUpdateProcessMayBeRequired=Parece necesario realizar el proceso de actualización (la versión del programa %s difiere de la versión de la base de datos %s) +YouMustRunCommandFromCommandLineAfterLoginToUser=Debe ejecutar el comando desde un shell después de haber iniciado sesión con la cuenta %s. +YourPHPDoesNotHaveSSLSupport=Funciones SSL no disponibles en su PHP +DownloadMoreSkins=Más temas para descargar +SimpleNumRefModelDesc=Devuelve el número bajo el formato %syymm-nnnn donde yy es el año, mm el mes y nnnn un contador secuencial sin ruptura y sin volver a 0 +ShowProfIdInAddress=Mostrar el identificador profesional en las direcciones de los documentos +ShowVATIntaInAddress=Ocultar el IVA identificador en las direcciones de los documentos +TranslationUncomplete=Traducción parcial +SomeTranslationAreUncomplete=Algunos idiomas están traducidos en parte o pueden contener errores. Si lo encuentra, puede corregir los archivos de texto .lang del directorio htdocs/langs y enviarlos al foro http://www.dolibarr.fr. +MenuUseLayout=Hacer el menú izquierdo ocultable (la opción javascript no debería deshabilitarse) +MAIN_DISABLE_METEO=Deshabilitar la vista meteorológica +TestLoginToAPI=Comprobar conexión a la API +ProxyDesc=Algunas de las características de Dolibarr requieren que el servidor tenga acceso a Internet. Defina aqui los parámetros para dicho acceso. Si el servidor está detrás de un proxy, estos parámetros indican a Dolibarr cómo pasarlo. +ExternalAccess=Acceso externo +MAIN_PROXY_USE=Usar un servidor proxy (si no acceso directo a Internet) +MAIN_PROXY_HOST=Nombre/Dirección del servidor proxy +MAIN_PROXY_PORT=Puerto del servidor proxy +MAIN_PROXY_USER=Login del servidor proxy +MAIN_PROXY_PASS=Contraseña del servidor proxy +DefineHereComplementaryAttributes=Defina aquí la lista de atributos adicionales, no disponibles por defecto, y que desea gestionar para %s. +ExtraFields=Atributos adicionales +ExtraFieldsThirdParties=Atributos adicionales (terceros) +ExtraFieldsContacts=Atributos adicionales (contactos/direcciones) +ExtraFieldsMember=Atributos complementarios (miembros) +ExtraFieldsMemberType=Atributos complementarios (tipos de miembros) +ExtraFieldsCustomerInvoices=Atributos complementarios (facturas a clientes) +ExtraFieldsSupplierOrders=Atributos complementarios (pedidos) +ExtraFieldsSupplierInvoices=Atributos complementarios (facturas) +ExtraFieldsProject=Atributos complementarios (proyectos) +ExtraFieldsProjectTask=Atributos complementarios (tareas) +ExtraFieldHasWrongValue=El atributo %s tiene un valor incorrecto. +AlphaNumOnlyCharsAndNoSpace=solamente caracteres alfanuméricos sin espacios +SendingMailSetup=Configuración del envío por mail +SendmailOptionNotComplete=Atención, en algunos sistemas Linux, con este método de envio, para poder enviar mails en su nombre, la configuración de sendmail debe contener la opción -ba (parámetro mail.force_extra_parameters en el archivo php.ini). Si algunos de sus destinatarios no reciben sus mensajes, pruebe a modificar este parámetro PHP con mail.force_extra_parameters=-ba. +PathToDocuments=Rutas de acceso a documentos +PathDirectory=Directorio +SendmailOptionMayHurtBuggedMTA=La funcionalidad de enviar correo electrónico a través del "correo directo PHP" genera una solicitud que puede ser mal interpretado por algunos servidores de correo. Esto se traduce en mensajes de correo electrónico ilegibles para las personas alojadas en estas plataformas. Este es el caso de clientes en ciertos proveedores de servicios de Internet (Ej: Orange). Esto no es un problema ni de Dolibarr ni de PHP, pero sí del servidor de correo. Sin embargo, puede agregar la opción MAIN_FIX_FOR_BUGGED_MTA con valor 1 en configuración-varios para tratar que Dolibarr evite el error. Otra solución (recomendada) es utilizar el método de envío por SMTP que no tiene este inconveniente. +TranslationSetup=Configuración traducción +TranslationDesc=La elección del idioma mostrado en pantalla se modifica:
* A nivel global desde el menú Inicio - Configuración - Entorno
* De manera específica al usuario desde la pestaña Interfaz usuario de su ficha de usuario (hacer clic en su login en la parte superior izquierda de la pantalla). +ClassNotFoundIntoPathWarning=No se ha encontrado la clase %s en su path PHP +YesInSummer=Sí en verano +OnlyFollowingModulesAreOpenedToExternalUsers=Tenga en cuenta que sólo los módulos siguientes están abiertos a usuarios externos (sean cuales sean los permisos de los usuarios): +ConditionIsCurrently=Actualmente la condición es %s +##### Module password generation= undefined= +PasswordGenerationStandard=Devuelve una contraseña generada por el algoritmo interno Dolibarr: 8 caracteres, números y caracteres en minúsculas mezcladas. +PasswordGenerationNone=No ofrece contraseñas. La contraseña se introduce manualmente. ##### Users setup ##### -UserGroupSetupConfiguración módulo usuarios y grupos -GeneratePasswordProponer una contraseña generada -RuleForGeneratedPasswordsNorma para la generación de las contraseñas propuestas -DoNotSuggestNo proponer -EncryptedPasswordInDatabasePermitir encriptación de las contraseñas en la base de datos -DisableForgetPasswordLinkOnLogonPageNo mostrar el vínculo "Contraseña olvidada" en la página de login -UsersSetupConfiguración del módulo usuarios -UserMailRequiredE-Mail necesario para crear un usuario nuevo +UserGroupSetup=Configuración módulo usuarios y grupos +GeneratePassword=Proponer una contraseña generada +RuleForGeneratedPasswords=Norma para la generación de las contraseñas propuestas +DoNotSuggest=No proponer +EncryptedPasswordInDatabase=Permitir encriptación de las contraseñas en la base de datos +DisableForgetPasswordLinkOnLogonPage=No mostrar el vínculo "Contraseña olvidada" en la página de login +UsersSetup=Configuración del módulo usuarios +UserMailRequired=E-Mail necesario para crear un usuario nuevo ##### Company setup ##### -CompanySetupConfiguración del módulo terceros -CompanyCodeCheckerMódulo de generación y control de los códigos de terceros (clientes/proveedores) -AccountCodeManagerMódulo de generación de los códigos contables (clientes/proveedores) -ModuleCompanyCodeAquariumDevuelve un código contable compuesto de
%s seguido del código tercero de proveedor para el código contable de proveedor,
%s seguido del código tercero de cliente para el código contable de cliente. -ModuleCompanyCodePanicumDevuelve un código contable vacío. -ModuleCompanyCodeDigitariaDevuelve un código contable compuesto siguiendo el código de tercero. El código está formado por carácter ' C ' en primera posición seguido de los 5 primeros caracteres del código tercero. -UseNotificationsUsar notificaciones -NotificationsDescLa función de las notificaciones permite enviar automáticamente un correo electrónico para un determinado evento Dolibarr en las empresas configuradas para ello -ModelModulesModelos de documentos -DocumentModelOdtGeneración desde los documentos OpenDocument (Archivo .ODT OpenOffice, KOffice, TextEdit,...) -WatermarkOnDraftMarca de agua en los documentos borrador -CompanyIdProfCheckerReglas sobre los ID profesionales -MustBeUnique¿Debe ser único? -MustBeMandatory¿Debe ser obligatorio para crear terceros? -MustBeInvoiceMandatory¿Debe ser obligatorio para validar facturas? -MiscellaneousMiscelánea +CompanySetup=Configuración del módulo terceros +CompanyCodeChecker=Módulo de generación y control de los códigos de terceros (clientes/proveedores) +AccountCodeManager=Módulo de generación de los códigos contables (clientes/proveedores) +ModuleCompanyCodeAquarium=Devuelve un código contable compuesto de
%s seguido del código tercero de proveedor para el código contable de proveedor,
%s seguido del código tercero de cliente para el código contable de cliente. +ModuleCompanyCodePanicum=Devuelve un código contable vacío. +ModuleCompanyCodeDigitaria=Devuelve un código contable compuesto siguiendo el código de tercero. El código está formado por carácter ' C ' en primera posición seguido de los 5 primeros caracteres del código tercero. +UseNotifications=Usar notificaciones +NotificationsDesc=La función de las notificaciones permite enviar automáticamente un correo electrónico para un determinado evento Dolibarr en las empresas configuradas para ello +ModelModules=Modelos de documentos +DocumentModelOdt=Generación desde los documentos OpenDocument (Archivo .ODT OpenOffice, KOffice, TextEdit,...) +WatermarkOnDraft=Marca de agua en los documentos borrador +CompanyIdProfChecker=Reglas sobre los ID profesionales +MustBeUnique=¿Debe ser único? +MustBeMandatory=¿Debe ser obligatorio para crear terceros? +MustBeInvoiceMandatory=¿Debe ser obligatorio para validar facturas? +Miscellaneous=Miscelánea ##### Webcal setup ##### -WebCalSetupConfiguración de enlace con el calendario Webcalendar -WebCalSyncroIntegrar los eventos Dolibarr en WebCalendar -WebCalAllwaysSiempre, sin consultar -WebCalYesByDefaultConsultar (Si por defecto) -WebCalNoByDefaultConsultar (No por defecto) -WebCalNeverNunca -WebCalURLDirección (URL) de acceso al calendario -WebCalServerServidor de la base de datos del calendario -WebCalDatabaseNameNombre de la base de datos -WebCalUserUsuario con acceso a la base -WebCalSetupSavedLos datos de enlace se han guardado correctamente. -WebCalTestOkLa conexión al servidor '%s' en la base '%s' por el usuario '%s' ha sido satisfactoria. -WebCalTestKo1La conexión al servidor '%s' ha sido satisfactoria, pero la base '%s' no se ha podido comprobar. -WebCalTestKo2La conexión al servidor '%s' por el usuario '%s' ha fallado. -WebCalErrorConnectOkButWrongDatabaseLa conexión salió bien pero la base no parece ser una base Webcalendar. -WebCalAddEventOnCreateActionsAñadir evento en el calendario en las creaciones de acciones -WebCalAddEventOnCreateCompanyAñadir evento en el calendario en la creación de empresas -WebCalAddEventOnStatusPropalAñadir evento en el calendario en el cambio de estado de los presupuestos -WebCalAddEventOnStatusContractAñadir evento en el calendario en el cambio de estado de los contratos -WebCalAddEventOnStatusBillAñadir evento en el calendario en el cambio de estado de las facturas -WebCalAddEventOnStatusMemberAñadir evento en el calendario en el cambio de estado de los miembros -WebCalUrlForVCalExportUn vínculo de exportación del calendario en formato %s estará disponible en la url: %s -WebCalCheckWebcalSetupLa configuración del módulo Webcal puede ser incorrecta +WebCalSetup=Configuración de enlace con el calendario Webcalendar +WebCalSyncro=Integrar los eventos Dolibarr en WebCalendar +WebCalAllways=Siempre, sin consultar +WebCalYesByDefault=Consultar (Si por defecto) +WebCalNoByDefault=Consultar (No por defecto) +WebCalNever=Nunca +WebCalURL=Dirección (URL) de acceso al calendario +WebCalServer=Servidor de la base de datos del calendario +WebCalDatabaseName=Nombre de la base de datos +WebCalUser=Usuario con acceso a la base +WebCalSetupSaved=Los datos de enlace se han guardado correctamente. +WebCalTestOk=La conexión al servidor '%s' en la base '%s' por el usuario '%s' ha sido satisfactoria. +WebCalTestKo1=La conexión al servidor '%s' ha sido satisfactoria, pero la base '%s' no se ha podido comprobar. +WebCalTestKo2=La conexión al servidor '%s' por el usuario '%s' ha fallado. +WebCalErrorConnectOkButWrongDatabase=La conexión salió bien pero la base no parece ser una base Webcalendar. +WebCalAddEventOnCreateActions=Añadir evento en el calendario en las creaciones de acciones +WebCalAddEventOnCreateCompany=Añadir evento en el calendario en la creación de empresas +WebCalAddEventOnStatusPropal=Añadir evento en el calendario en el cambio de estado de los presupuestos +WebCalAddEventOnStatusContract=Añadir evento en el calendario en el cambio de estado de los contratos +WebCalAddEventOnStatusBill=Añadir evento en el calendario en el cambio de estado de las facturas +WebCalAddEventOnStatusMember=Añadir evento en el calendario en el cambio de estado de los miembros +WebCalUrlForVCalExport=Un vínculo de exportación del calendario en formato %s estará disponible en la url: %s +WebCalCheckWebcalSetup=La configuración del módulo Webcal puede ser incorrecta ##### Invoices ##### -BillsSetupConfiguración del módulo Facturas -BillsDateFecha de las facturas -BillsNumberingModuleMódulo de numeración de facturas y abonos -BillsPDFModulesModelo de documento de facturas -CreditNoteSetupConfiguración del módulo abonos -CreditNotePDFModulesModelo de documento de abonos -CreditNoteAbono -CreditNotesAbonos -ForceInvoiceDateForzar la fecha de factura a la fecha de validación -DisableRepeatableDesactivar las facturas recurrentes -SuggestedPaymentModesIfNotDefinedInInvoiceFormas de pago sugeridas para las facturas si no están definidas explícitamente -EnableEditDeleteValidInvoiceActivar la posibilidad de editar/eliminar una factura validada sin pago -SuggestPaymentByRIBOnAccountSugerir el pago por abono en cuenta -SuggestPaymentByChequeToAddressSugerir el pago por cheque a -FreeLegalTextOnInvoicesTexto libre en facturas -WatermarkOnDraftInvoicesMarca de agua en las facturas borrador (en caso de estar vacío) +BillsSetup=Configuración del módulo Facturas +BillsDate=Fecha de las facturas +BillsNumberingModule=Módulo de numeración de facturas y abonos +BillsPDFModules=Modelo de documento de facturas +CreditNoteSetup=Configuración del módulo abonos +CreditNotePDFModules=Modelo de documento de abonos +CreditNote=Abono +CreditNotes=Abonos +ForceInvoiceDate=Forzar la fecha de factura a la fecha de validación +DisableRepeatable=Desactivar las facturas recurrentes +SuggestedPaymentModesIfNotDefinedInInvoice=Formas de pago sugeridas para las facturas si no están definidas explícitamente +EnableEditDeleteValidInvoice=Activar la posibilidad de editar/eliminar una factura validada sin pago +SuggestPaymentByRIBOnAccount=Sugerir el pago por abono en cuenta +SuggestPaymentByChequeToAddress=Sugerir el pago por cheque a +FreeLegalTextOnInvoices=Texto libre en facturas +WatermarkOnDraftInvoices=Marca de agua en las facturas borrador (en caso de estar vacío) ##### Proposals ##### -PropalSetupConfiguración del módulo Presupuestos -CreateFormCreación formulario -NumberOfProductLinesNumero de líneas de productos -ProposalsNumberingModulesMódulos de numeración de presupuestos -ProposalsPDFModulesModelos de documentos de presupuestos -ClassifiedInvoicedClasificar facturado -HideTreadedPropalOcultar los presupuestos procesados del listado -AddShippingDateAbilityPosibilidad de determinar una fecha de entrega -AddDeliveryAddressAbilityPosibilidad de seleccionar una dirección de envío -UseOptionLineIfNoQuantityUna línea de producto/servicio que tiene una cantidad nula se considera como una opción -FreeLegalTextOnProposalTexto libre en presupuestos -WatermarkOnDraftProposalMarca de agua en presupuestos borrador (en caso de estar vacío) +PropalSetup=Configuración del módulo Presupuestos +CreateForm=Creación formulario +NumberOfProductLines=Numero de líneas de productos +ProposalsNumberingModules=Módulos de numeración de presupuestos +ProposalsPDFModules=Modelos de documentos de presupuestos +ClassifiedInvoiced=Clasificar facturado +HideTreadedPropal=Ocultar los presupuestos procesados del listado +AddShippingDateAbility=Posibilidad de determinar una fecha de entrega +AddDeliveryAddressAbility=Posibilidad de seleccionar una dirección de envío +UseOptionLineIfNoQuantity=Una línea de producto/servicio que tiene una cantidad nula se considera como una opción +FreeLegalTextOnProposal=Texto libre en presupuestos +WatermarkOnDraftProposal=Marca de agua en presupuestos borrador (en caso de estar vacío) ##### Orders ##### -OrdersSetupConfiguración del módulo pedidos -OrdersNumberingModulesMódulos de numeración de los pedidos -OrdersModelModuleModelos de documentos de pedidos -HideTreadedOrdersOcultar los pedidos procesados o anulados del listado -ValidOrderAfterPropalClosedValidar el pedido después del cierre del presupuesto, permite no pasar por el pedido provisional -FreeLegalTextOnOrdersTexto libre en pedidos -WatermarkOnDraftOrdersMarca de agua en pedidos borrador (en caso de estar vacío) +OrdersSetup=Configuración del módulo pedidos +OrdersNumberingModules=Módulos de numeración de los pedidos +OrdersModelModule=Modelos de documentos de pedidos +HideTreadedOrders=Ocultar los pedidos procesados o anulados del listado +ValidOrderAfterPropalClosed=Validar el pedido después del cierre del presupuesto, permite no pasar por el pedido provisional +FreeLegalTextOnOrders=Texto libre en pedidos +WatermarkOnDraftOrders=Marca de agua en pedidos borrador (en caso de estar vacío) ##### Clicktodial ##### -ClickToDialSetupConfiguración del módulo Click To Dial -ClickToDialUrlDescURL de llamada haciendo click en el icono teléfono.
La URL completa de llamada será: URL?login=...&password=...&caller=...&called=telellamada +ClickToDialSetup=Configuración del módulo Click To Dial +ClickToDialUrlDesc=URL de llamada haciendo click en el icono teléfono.
La URL completa de llamada será: URL?login=...&password=...&caller=...&called=telellamada ##### Bookmark4u ##### -Bookmark4uSetupConfiguración del módulo Bookmark4u +Bookmark4uSetup=Configuración del módulo Bookmark4u ##### Interventions ##### -InterventionsSetupConfiguración del módulo intervenciones -FreeLegalTextOnInterventionsTexto adicional en las fichas de intervención -FicheinterNumberingModulesMódulos de numeración de las fichas de intervención -TemplatePDFInterventionsModelo de documentos de las fichas de intervención -WatermarkOnDraftInterventionCardsMarca de agua en fichas de intervención (en caso de estar vacío) +InterventionsSetup=Configuración del módulo intervenciones +FreeLegalTextOnInterventions=Texto adicional en las fichas de intervención +FicheinterNumberingModules=Módulos de numeración de las fichas de intervención +TemplatePDFInterventions=Modelo de documentos de las fichas de intervención +WatermarkOnDraftInterventionCards=Marca de agua en fichas de intervención (en caso de estar vacío) ##### Contracts ##### -ContractsSetupConfiguración del módulo contratos -ContractsNumberingModulesMódulos de numeración de los contratos +ContractsSetup=Configuración del módulo contratos +ContractsNumberingModules=Módulos de numeración de los contratos ##### Members ##### -MembersSetupConfiguración del módulo Asociaciones -MemberMainOptionsOpciones principales -AddSubscriptionIntoAccountProponer por defecto la creación de un movimiento, en el módulo bancos, en el registro de un pago de cotización -AdherentLoginRequiredGestionar un login para cada miembro -AdherentMailRequiredE-Mail obligatorio para crear un miembro nuevo -MemberSendInformationByMailByDefaultCasilla de verificación para enviar el correo de confirmación (validación ó nueva cotización) a los miembros es por defecto "sí" +MembersSetup=Configuración del módulo Asociaciones +MemberMainOptions=Opciones principales +AddSubscriptionIntoAccount=Proponer por defecto la creación de un movimiento, en el módulo bancos, en el registro de un pago de cotización +AdherentLoginRequired=Gestionar un login para cada miembro +AdherentMailRequired=E-Mail obligatorio para crear un miembro nuevo +MemberSendInformationByMailByDefault=Casilla de verificación para enviar el correo de confirmación (validación ó nueva cotización) a los miembros es por defecto "sí" ##### LDAP setup ##### -LDAPSetupConfiguración del módulo LDAP -LDAPGlobalParametersParámetros globales -LDAPUsersSynchroUsuarios -LDAPGroupsSynchroGrupos -LDAPContactsSynchroContactos -LDAPMembersSynchroMiembros -LDAPSynchronizationSincronización LDAP -LDAPFunctionsNotAvailableOnPHPLas funciones LDAP no están disponibles en su PHP -LDAPToDolibarrLDAP -> Dolibarr -DolibarrToLDAPDolibarr -> LDAP -LDAPNamingAttributeClave en LDAP -LDAPSynchronizeUsersOrganización de los usuarios en LDAP -LDAPSynchronizeGroupsOrganización de los grupos en LDAP -LDAPSynchronizeContactsOrganización de los contactos en LDAP -LDAPSynchronizeMembersOrganización de los miembros en LDAP -LDAPTypeExampleOpenLdap, Egroupware o Active Directory -LDAPPrimaryServerServidor primario -LDAPSecondaryServerServidor secundario -LDAPServerPortPuerto del servidor -LDAPServerPortExamplePuerto por defecto : 389 -LDAPServerProtocolVersionVersión de protocolo -LDAPServerUseTLSUsuario TLS -LDAPServerUseTLSExampleSu servidor utiliza TLS -LDAPServerDnDN del servidor -LDAPAdminDnDN del administrador -LDAPAdminDnExampleDN completo (ej: cn=adminldap,dc=example,dc=com) -LDAPPasswordContraseña del administrador -LDAPUserDnDN de los usuarios -LDAPUserDnExampleDN completo (ej: ou=users,dc=example,dc=com) -LDAPGroupDnDN de los grupos -LDAPGroupDnExampleDN completo (ej: ou=groups,dc=example,dc=com) -LDAPServerExampleDirección del servidor (ej: localhost, 192.168.0.2, ldaps://ldap.example.com/) -LDAPServerDnExampleDN completo (ej: dc=my-domain,dc=com) -LDAPPasswordExampleContraseña del administrador -LDAPDnSynchroActiveSincronización de usuarios y grupos -LDAPDnSynchroActiveExampleSincronización LDAP hacia Dolibarr o Dolibarr hacia LDAP -LDAPDnContactActiveSincronización de contactos -LDAPDnContactActiveYesSincronización activada -LDAPDnContactActiveExampleSincronización activada/desactivada -LDAPDnMemberActiveSincronización de los miembros -LDAPDnMemberActiveExampleSincronización activada/desactivada -LDAPContactDnDN de los contactos Dolibarr -LDAPContactDnExampleDN completo (ej: ou=contacts,dc=example,dc=com) -LDAPMemberDnDN de los miembros -LDAPMemberDnExampleDN completo (ex: ou=members,dc=society,dc=com) -LDAPMemberObjectClassListLista de objectClass -LDAPMemberObjectClassListExampleLista de ObjectClass que definen los atributos de un registro (ej: top,inetOrgPerson o top,user for active directory) -LDAPUserObjectClassListLista de objectClass -LDAPUserObjectClassListExampleLista de ObjectClass que definen los atributos de un registro (ej: top,inetOrgPerson o top,user for active directory) -LDAPGroupObjectClassListLista de objectClass -LDAPGroupObjectClassListExampleLista de ObjectClass que definen los atributos de un registro (ej: top,groupOfUniqueNames) -LDAPContactObjectClassListLista de objectClass -LDAPContactObjectClassListExampleLista de objectClass que definen los atributos de un registro (ej: top,inetOrgPerson o top,user for active directory) -LDAPMemberTypeDnDN de los tipos de miembros -LDAPMemberTypeDnExampleDN complet (ej: ou=type_members,dc=example,dc=com) -LDAPTestConnectProbar la conexión LDAP -LDAPTestSynchroContactProbar la sincronización de contactos -LDAPTestSynchroUserProbar la sincronización de usuarios -LDAPTestSynchroGroupProbar la sincronización de grupos -LDAPTestSynchroMemberProbar la sincronización de miembros -LDAPTestSearchProbar una búsqueda LDAP -LDAPSynchroOKPrueba de sincronización realizada correctamente -LDAPSynchroKOPrueba de sincronización erronea -LDAPSynchroKOMayBePermissionsError de la prueba de sincronización. Compruebe que la conexión al servidor sea correcta y que permite las actualizaciones LDAP -LDAPTCPConnectOKConexión TCP al servidor LDAP efectuada (Servidor=%s, Puerto=%s) -LDAPTCPConnectKOFallo de conexión TCP al servidor LDAP (Servidor=%s, Puerto=%s) -LDAPBindOKConexión/Autenticación al servidor LDAP conseguida (Servidor=%s, Puerto=%s, Admin=%s, Password=%s) -LDAPBindKOFallo de conexión/autentificación al servidor LDAP (Servidor=%s, Puerto=%s, Admin=%s, Password=%s) -LDAPUnbindSuccessfullDesconexión realizada -LDAPUnbindFailedDesconexión fallada -LDAPConnectToDNSuccessfullConexión a DN (%s) realizada -LDAPConnectToDNFailedConnexión a DN (%s) fallada -LDAPSetupForVersion3Servidor LDAP configurado en versión 3 -LDAPSetupForVersion2Servidor LDAP configurado en versión 2 -LDAPDolibarrMappingMapping Dolibarr -LDAPLdapMappingMapping LDAP -LDAPFieldLoginUnixLogin (unix) -LDAPFieldLoginExampleEjemplo : uid -LDAPFilterConnectionFiltro de búsqueda -LDAPFilterConnectionExampleEjemplo : &(objectClass=inetOrgPerson) -LDAPFieldLoginSambaLogin (samba, activedirectory) -LDAPFieldLoginSambaExampleEjemplo : samaccountname -LDAPFieldFullnameNombre completo -LDAPFieldFullnameExampleEjemplo : cn -LDAPFieldPasswordContraseña -LDAPFieldPasswordNotCryptedContraseña no encriptada -LDAPFieldPasswordCryptedContraseña encriptada -LDAPFieldPasswordExampleEjemplo : userPassword -LDAPFieldCommonNameNombre comun -LDAPFieldCommonNameExampleEjemplo : cn -LDAPFieldNameNombre -LDAPFieldNameExampleEjemplo : sn -LDAPFieldFirstNameNombre -LDAPFieldFirstNameExampleEjemplo : givenName -LDAPFieldMailE-Mail -LDAPFieldMailExampleEjemplo : mail -LDAPFieldPhoneTeléfono trabajo -LDAPFieldPhoneExampleEjemplo : telephonenumber -LDAPFieldHomePhoneTeléfono personal -LDAPFieldHomePhoneExampleEjemplo : homephone -LDAPFieldMobileTeléfono móvil -LDAPFieldMobileExampleEjemplo : mobile -LDAPFieldFaxFax -LDAPFieldFaxExampleEjemplo : facsimiletelephonenumber -LDAPFieldAddressDirección -LDAPFieldAddressExampleEjemplo : street -LDAPFieldZipCódigo postal -LDAPFieldZipExampleEjemplo : postalcode -LDAPFieldTownPoblación -LDAPFieldTownExampleEjemplo : l -LDAPFieldCountryPaís -LDAPFieldCountryExampleEjemplo : c -LDAPFieldDescriptionDescripción -LDAPFieldDescriptionExampleEjemplo : description -LDAPFieldGroupMembersMiembros del grupo -LDAPFieldGroupMembersExampleEjemplo: uniqueMember -LDAPFieldBirthdateFecha de nacimiento -LDAPFieldBirthdateExampleEjemplo : -LDAPFieldCompanyEmpresa -LDAPFieldCompanyExampleEjemplo : o -LDAPFieldSidSID -LDAPFieldSidExampleEjemplo : objectsid -LDAPFieldEndLastSubscriptionFecha finalización como miembro -LDAPFieldTitlePuesto/Función -LDAPFieldTitleExampleEjemplo:titulo -LDAPParametersAreStillHardCodedLos parámetros LDAP son codificados en duro (en la clase contact) -LDAPSetupNotCompleteConfiguración LDAP incompleta (a completar en las otras pestañas) -LDAPNoUserOrPasswordProvidedAccessIsReadOnlyAdministrador o contraseña no indicados. Los accesos LDAP serán anónimos y en solo lectura. -LDAPDescContactEsta página permite definir el nombre de los atributos del árbol LDAP para cada información de los contactos Dolibarr. -LDAPDescUsersEsta página permite definir el nombre de los atributos del árbol LDAP para cada información de los usuarios Dolibarr. -LDAPDescGroupsEsta página permite definir el nombre de los atributos del árbol LDAP para cada información de los grupos usuarios Dolibarr. -LDAPDescMembersEsta página permite definir el nombre de los atributos del árbol LDAP para cada información de los miembros del módulo Asociaciones Dolibarr. -LDAPDescValuesLos valores de ejemplos se adaptan a OpenLDAP con los schemas cargados: core.schema, cosine.schema, inetorgperson.schema). Si usted utiliza los a valores sugeridos y OpenLDAP, modifique su archivo de configuración LDAP slapd.conf para tener todos estos schemas activos. -ForANonAnonymousAccessPara un acceso autentificado +LDAPSetup=Configuración del módulo LDAP +LDAPGlobalParameters=Parámetros globales +LDAPUsersSynchro=Usuarios +LDAPGroupsSynchro=Grupos +LDAPContactsSynchro=Contactos +LDAPMembersSynchro=Miembros +LDAPSynchronization=Sincronización LDAP +LDAPFunctionsNotAvailableOnPHP=Las funciones LDAP no están disponibles en su PHP +LDAPToDolibarr=LDAP -> Dolibarr +DolibarrToLDAP=Dolibarr -> LDAP +LDAPNamingAttribute=Clave en LDAP +LDAPSynchronizeUsers=Organización de los usuarios en LDAP +LDAPSynchronizeGroups=Organización de los grupos en LDAP +LDAPSynchronizeContacts=Organización de los contactos en LDAP +LDAPSynchronizeMembers=Organización de los miembros en LDAP +LDAPTypeExample=OpenLdap, Egroupware o Active Directory +LDAPPrimaryServer=Servidor primario +LDAPSecondaryServer=Servidor secundario +LDAPServerPort=Puerto del servidor +LDAPServerPortExample=Puerto por defecto : 389 +LDAPServerProtocolVersion=Versión de protocolo +LDAPServerUseTLS=Usuario TLS +LDAPServerUseTLSExample=Su servidor utiliza TLS +LDAPServerDn=DN del servidor +LDAPAdminDn=DN del administrador +LDAPAdminDnExample=DN completo (ej: cn=adminldap,dc=example,dc=com) +LDAPPassword=Contraseña del administrador +LDAPUserDn=DN de los usuarios +LDAPUserDnExample=DN completo (ej: ou=users,dc=example,dc=com) +LDAPGroupDn=DN de los grupos +LDAPGroupDnExample=DN completo (ej: ou=groups,dc=example,dc=com) +LDAPServerExample=Dirección del servidor (ej: localhost, 192.168.0.2, ldaps://ldap.example.com/) +LDAPServerDnExample=DN completo (ej: dc=my-domain,dc=com) +LDAPPasswordExample=Contraseña del administrador +LDAPDnSynchroActive=Sincronización de usuarios y grupos +LDAPDnSynchroActiveExample=Sincronización LDAP hacia Dolibarr o Dolibarr hacia LDAP +LDAPDnContactActive=Sincronización de contactos +LDAPDnContactActiveYes=Sincronización activada +LDAPDnContactActiveExample=Sincronización activada/desactivada +LDAPDnMemberActive=Sincronización de los miembros +LDAPDnMemberActiveExample=Sincronización activada/desactivada +LDAPContactDn=DN de los contactos Dolibarr +LDAPContactDnExample=DN completo (ej: ou=contacts,dc=example,dc=com) +LDAPMemberDn=DN de los miembros +LDAPMemberDnExample=DN completo (ex: ou=members,dc=society,dc=com) +LDAPMemberObjectClassList=Lista de objectClass +LDAPMemberObjectClassListExample=Lista de ObjectClass que definen los atributos de un registro (ej: top,inetOrgPerson o top,user for active directory) +LDAPUserObjectClassList=Lista de objectClass +LDAPUserObjectClassListExample=Lista de ObjectClass que definen los atributos de un registro (ej: top,inetOrgPerson o top,user for active directory) +LDAPGroupObjectClassList=Lista de objectClass +LDAPGroupObjectClassListExample=Lista de ObjectClass que definen los atributos de un registro (ej: top,groupOfUniqueNames) +LDAPContactObjectClassList=Lista de objectClass +LDAPContactObjectClassListExample=Lista de objectClass que definen los atributos de un registro (ej: top,inetOrgPerson o top,user for active directory) +LDAPMemberTypeDn=DN de los tipos de miembros +LDAPMemberTypeDnExample=DN complet (ej: ou=type_members,dc=example,dc=com) +LDAPTestConnect=Probar la conexión LDAP +LDAPTestSynchroContact=Probar la sincronización de contactos +LDAPTestSynchroUser=Probar la sincronización de usuarios +LDAPTestSynchroGroup=Probar la sincronización de grupos +LDAPTestSynchroMember=Probar la sincronización de miembros +LDAPTestSearch=Probar una búsqueda LDAP +LDAPSynchroOK=Prueba de sincronización realizada correctamente +LDAPSynchroKO=Prueba de sincronización erronea +LDAPSynchroKOMayBePermissions=Error de la prueba de sincronización. Compruebe que la conexión al servidor sea correcta y que permite las actualizaciones LDAP +LDAPTCPConnectOK=Conexión TCP al servidor LDAP efectuada (Servidor=%s, Puerto=%s) +LDAPTCPConnectKO=Fallo de conexión TCP al servidor LDAP (Servidor=%s, Puerto=%s) +LDAPBindOK=Conexión/Autenticación al servidor LDAP conseguida (Servidor=%s, Puerto=%s, Admin=%s, Password=%s) +LDAPBindKO=Fallo de conexión/autentificación al servidor LDAP (Servidor=%s, Puerto=%s, Admin=%s, Password=%s) +LDAPUnbindSuccessfull=Desconexión realizada +LDAPUnbindFailed=Desconexión fallada +LDAPConnectToDNSuccessfull=Conexión a DN (%s) realizada +LDAPConnectToDNFailed=Connexión a DN (%s) fallada +LDAPSetupForVersion3=Servidor LDAP configurado en versión 3 +LDAPSetupForVersion2=Servidor LDAP configurado en versión 2 +LDAPDolibarrMapping=Mapping Dolibarr +LDAPLdapMapping=Mapping LDAP +LDAPFieldLoginUnix=Login (unix) +LDAPFieldLoginExample=Ejemplo : uid +LDAPFilterConnection=Filtro de búsqueda +LDAPFilterConnectionExample=Ejemplo : &(objectClass=inetOrgPerson) +LDAPFieldLoginSamba=Login (samba, activedirectory) +LDAPFieldLoginSambaExample=Ejemplo : samaccountname +LDAPFieldFullname=Nombre completo +LDAPFieldFullnameExample=Ejemplo : cn +LDAPFieldPassword=Contraseña +LDAPFieldPasswordNotCrypted=Contraseña no encriptada +LDAPFieldPasswordCrypted=Contraseña encriptada +LDAPFieldPasswordExample=Ejemplo : userPassword +LDAPFieldCommonName=Nombre comun +LDAPFieldCommonNameExample=Ejemplo : cn +LDAPFieldName=Nombre +LDAPFieldNameExample=Ejemplo : sn +LDAPFieldFirstName=Nombre +LDAPFieldFirstNameExample=Ejemplo : givenName +LDAPFieldMail=E-Mail +LDAPFieldMailExample=Ejemplo : mail +LDAPFieldPhone=Teléfono trabajo +LDAPFieldPhoneExample=Ejemplo : telephonenumber +LDAPFieldHomePhone=Teléfono personal +LDAPFieldHomePhoneExample=Ejemplo : homephone +LDAPFieldMobile=Teléfono móvil +LDAPFieldMobileExample=Ejemplo : mobile +LDAPFieldFax=Fax +LDAPFieldFaxExample=Ejemplo : facsimiletelephonenumber +LDAPFieldAddress=Dirección +LDAPFieldAddressExample=Ejemplo : street +LDAPFieldZip=Código postal +LDAPFieldZipExample=Ejemplo : postalcode +LDAPFieldTown=Población +LDAPFieldTownExample=Ejemplo : l +LDAPFieldCountry=País +LDAPFieldCountryExample=Ejemplo : c +LDAPFieldDescription=Descripción +LDAPFieldDescriptionExample=Ejemplo : description +LDAPFieldGroupMembers=Miembros del grupo +LDAPFieldGroupMembersExample=Ejemplo: uniqueMember +LDAPFieldBirthdate=Fecha de nacimiento +LDAPFieldBirthdateExample=Ejemplo : +LDAPFieldCompany=Empresa +LDAPFieldCompanyExample=Ejemplo : o +LDAPFieldSid=SID +LDAPFieldSidExample=Ejemplo : objectsid +LDAPFieldEndLastSubscription=Fecha finalización como miembro +LDAPFieldTitle=Puesto/Función +LDAPFieldTitleExample=Ejemplo:titulo +LDAPParametersAreStillHardCoded=Los parámetros LDAP son codificados en duro (en la clase contact) +LDAPSetupNotComplete=Configuración LDAP incompleta (a completar en las otras pestañas) +LDAPNoUserOrPasswordProvidedAccessIsReadOnly=Administrador o contraseña no indicados. Los accesos LDAP serán anónimos y en solo lectura. +LDAPDescContact=Esta página permite definir el nombre de los atributos del árbol LDAP para cada información de los contactos Dolibarr. +LDAPDescUsers=Esta página permite definir el nombre de los atributos del árbol LDAP para cada información de los usuarios Dolibarr. +LDAPDescGroups=Esta página permite definir el nombre de los atributos del árbol LDAP para cada información de los grupos usuarios Dolibarr. +LDAPDescMembers=Esta página permite definir el nombre de los atributos del árbol LDAP para cada información de los miembros del módulo Asociaciones Dolibarr. +LDAPDescValues=Los valores de ejemplos se adaptan a OpenLDAP con los schemas cargados: core.schema, cosine.schema, inetorgperson.schema). Si usted utiliza los a valores sugeridos y OpenLDAP, modifique su archivo de configuración LDAP slapd.conf para tener todos estos schemas activos. +ForANonAnonymousAccess=Para un acceso autentificado ##### Products/Services ##### -ProductSetupConfiguración del módulo Productos -ServiceSetupConfiguración del módulo Servicios -ProductServiceSetupConfiguración de los módulos Productos y Servicios -NumberOfProductShowInSelectNº de productos máx. en las listas (0=sin límite) -ConfirmDeleteProductLineAbilityConfirmación de eliminación de una línea de producido en los formularios -ModifyProductDescAbilityPersonalización de las descripciones de los productos en los formularios -ViewProductDescInFormAbilityVisualización de las descripciones de los productos en los formularios -ViewProductDescInThirdpartyLanguageAbilityVisualización de las descripciones de productos en el idioma del tercero -UseSearchToSelectProductUtilizar un formulario de búsqueda para la selección de un producto (en vez de la lista desplegable). Tenga en cuenta que si tiene un número importante de productos o servicios (> 100 000), puede mejorar el rendimiento definiendo la constante PRODUCT_DONOTSEARCH_ANYWHERE a 1 en Configuración->Varios. La búsqueda quedará limitada al inicio de la cadena. -UseEcoTaxeAbilityAsumir ecotasa (DEEE) -SetDefaultBarcodeTypeProductsTipo de código de barras utilizado por defecto para los productos -SetDefaultBarcodeTypeThirdPartiesTipo de código de barras utilizado por defecto para los terceros -ProductCodeCheckerMódulo para la generación y comprobación del código de un producto o servicio -ProductOtherConfConfiguración de productos/servicios +ProductSetup=Configuración del módulo Productos +ServiceSetup=Configuración del módulo Servicios +ProductServiceSetup=Configuración de los módulos Productos y Servicios +NumberOfProductShowInSelect=Nº de productos máx. en las listas (0=sin límite) +ConfirmDeleteProductLineAbility=Confirmación de eliminación de una línea de producido en los formularios +ModifyProductDescAbility=Personalización de las descripciones de los productos en los formularios +ViewProductDescInFormAbility=Visualización de las descripciones de los productos en los formularios +ViewProductDescInThirdpartyLanguageAbility=Visualización de las descripciones de productos en el idioma del tercero +UseSearchToSelectProduct=Utilizar un formulario de búsqueda para la selección de un producto (en vez de la lista desplegable). Tenga en cuenta que si tiene un número importante de productos o servicios (> 100 000), puede mejorar el rendimiento definiendo la constante PRODUCT_DONOTSEARCH_ANYWHERE a 1 en Configuración->Varios. La búsqueda quedará limitada al inicio de la cadena. +UseEcoTaxeAbility=Asumir ecotasa (DEEE) +SetDefaultBarcodeTypeProducts=Tipo de código de barras utilizado por defecto para los productos +SetDefaultBarcodeTypeThirdParties=Tipo de código de barras utilizado por defecto para los terceros +ProductCodeChecker=Módulo para la generación y comprobación del código de un producto o servicio +ProductOtherConf=Configuración de productos/servicios ##### Syslog ##### -SyslogSetupConfiguración del módulo Syslog -SyslogOutputSalida del log -SyslogSyslogSyslog -SyslogFacilityFacilidad -SyslogLevelNivel -SyslogSimpleFileArchivo -SyslogFilenameNombre y ruta del archivo -YouCanUseDOL_DATA_ROOTPuede utilizar DOL_DATA_ROOT/dolibarr.log para un registro en el directorio "documentos" de Dolibarr. Sin embargo, puede establecer un directorio diferente para guardar este archivo. -ErrorUnknownSyslogConstantLa constante %s no es una constante syslog conocida -OnlyWindowsLOG_USERWindows sólo soporta LOG_USER +SyslogSetup=Configuración del módulo Syslog +SyslogOutput=Salida del log +SyslogSyslog=Syslog +SyslogFacility=Facilidad +SyslogLevel=Nivel +SyslogSimpleFile=Archivo +SyslogFilename=Nombre y ruta del archivo +YouCanUseDOL_DATA_ROOT=Puede utilizar DOL_DATA_ROOT/dolibarr.log para un registro en el directorio "documentos" de Dolibarr. Sin embargo, puede establecer un directorio diferente para guardar este archivo. +ErrorUnknownSyslogConstant=La constante %s no es una constante syslog conocida +OnlyWindowsLOG_USER=Windows sólo soporta LOG_USER ##### Donations ##### -DonationsSetupConfiguración del módulo donaciones -DonationsReceiptModelModelo recepción de donaciones +DonationsSetup=Configuración del módulo donaciones +DonationsReceiptModel=Modelo recepción de donaciones ##### Barcode ##### -BarcodeSetupConfiguración de los códigos de barras -PaperFormatModuleMódulos de formatos de impresión -BarcodeEncodeModuleMódulos de codificación de los códigos de barras -UseBarcodeInProductModuleUtilizar los códigos de barras en los productos -CodeBarGeneratorGenerador del código -ChooseABarCodeNingún generador seleccionado -FormatNotSupportedByGeneratorFormato no generado por este generador -BarcodeDescEAN8Códigos de barras tipo EAN8 -BarcodeDescEAN13Códigos de barras tipo EAN13 -BarcodeDescUPCCódigos de barras tipo UPC -BarcodeDescISBNCódigos de barras tipo ISBN -BarcodeDescC39Códigos de barras tipo C39 -BarcodeDescC128Códigos de barras tipo C128 -GenbarcodeLocationHerramienta de generación de códigos de barras en líneas de pedidos (utilizado por el motor phpbar para determinados tipos de códigos de barras) -BarcodeInternalEngineMotor interno +BarcodeSetup=Configuración de los códigos de barras +PaperFormatModule=Módulos de formatos de impresión +BarcodeEncodeModule=Módulos de codificación de los códigos de barras +UseBarcodeInProductModule=Utilizar los códigos de barras en los productos +CodeBarGenerator=Generador del código +ChooseABarCode=Ningún generador seleccionado +FormatNotSupportedByGenerator=Formato no generado por este generador +BarcodeDescEAN8=Códigos de barras tipo EAN8 +BarcodeDescEAN13=Códigos de barras tipo EAN13 +BarcodeDescUPC=Códigos de barras tipo UPC +BarcodeDescISBN=Códigos de barras tipo ISBN +BarcodeDescC39=Códigos de barras tipo C39 +BarcodeDescC128=Códigos de barras tipo C128 +GenbarcodeLocation=Herramienta de generación de códigos de barras en líneas de pedidos (utilizado por el motor phpbar para determinados tipos de códigos de barras) +BarcodeInternalEngine=Motor interno ##### Prelevements ##### -WithdrawalsSetupConfiguración del módulo domiciliaciones +WithdrawalsSetup=Configuración del módulo domiciliaciones ##### ExternalRSS ##### -ExternalRSSSetupConfiguración de las importaciones del flujo RSS -NewRSSSindicación de un nuevo flujo RSS -RSSUrlURL del RSS -RSSUrlExampleUn flujo RSS interesante +ExternalRSSSetup=Configuración de las importaciones del flujo RSS +NewRSS=Sindicación de un nuevo flujo RSS +RSSUrl=URL del RSS +RSSUrlExample=Un flujo RSS interesante ##### Mailing ##### -MailingSetupConfiguración del módulo E-Mailing -MailingEMailFromE-Mail emisor (From) de los correos enviados por E-Mailing -MailingEMailErrorE-Mail de respuesta (Errors-to) para las respuestas acerca de envíos por e-mailing con error. +MailingSetup=Configuración del módulo E-Mailing +MailingEMailFrom=E-Mail emisor (From) de los correos enviados por E-Mailing +MailingEMailError=E-Mail de respuesta (Errors-to) para las respuestas acerca de envíos por e-mailing con error. ##### Notification ##### -NotificationSetupConfiguración del módulo notificaciones -NotificationEMailFromE-Mail emisor (From) de los correos enviados a través de notificaciones -ListOfAvailableNotificationsListado de notificaciones disponibles (depende de los módulos activados) +NotificationSetup=Configuración del módulo notificaciones +NotificationEMailFrom=E-Mail emisor (From) de los correos enviados a través de notificaciones +ListOfAvailableNotifications=Listado de notificaciones disponibles (depende de los módulos activados) ##### Sendings ##### -SendingsSetupConfiguración del módulo Expediciones -SendingsReceiptModelModelo de notas de entrega -SendingsNumberingModulesMódulos de numeración de notas de entrega -SendingsAbilityUso de notas de entrega para los envíos a clientes -NoNeedForDeliveryReceiptsEn la mayoría de los casos, las notas de entrega (lista de productos enviados) también actúan como notas de recepción y son firmadas por el cliente. La gestión de las notas de recepción es por lo tanto redundante y rara vez se activará. -FreeLegalTextOnShippingsMención complementaria en las notas de entrega +SendingsSetup=Configuración del módulo Expediciones +SendingsReceiptModel=Modelo de notas de entrega +SendingsNumberingModules=Módulos de numeración de notas de entrega +SendingsAbility=Uso de notas de entrega para los envíos a clientes +NoNeedForDeliveryReceipts=En la mayoría de los casos, las notas de entrega (lista de productos enviados) también actúan como notas de recepción y son firmadas por el cliente. La gestión de las notas de recepción es por lo tanto redundante y rara vez se activará. +FreeLegalTextOnShippings=Mención complementaria en las notas de entrega ##### Deliveries ##### -DeliveryOrderNumberingModulesMódulo de numeración de las notas de entraga -DeliveryOrderModelModelo de notas de recepción -DeliveriesOrderAbilityUso de notas de recepción -FreeLegalTextOnDeliveryReceiptsTexto libre en las notas de recepción +DeliveryOrderNumberingModules=Módulo de numeración de las notas de entraga +DeliveryOrderModel=Modelo de notas de recepción +DeliveriesOrderAbility=Uso de notas de recepción +FreeLegalTextOnDeliveryReceipts=Texto libre en las notas de recepción ##### FCKeditor ##### -AdvancedEditorEditor avanzado -ActivateFCKeditorActivar editor avanzado para : -FCKeditorForCompanyCreación/edición WYSIWIG de la descripción y notas de los terceros -FCKeditorForProductCreación/edición WYSIWIG de la descripción y notas de los productos/servicios -FCKeditorForProductDetailsCreación/edición WYSIWIG de las líneas de detalle de los productos (en pedidos, presupuestos, facturas, etc.) -FCKeditorForMailingCreación/edición WYSIWIG de los E-Mails (Utilidades->E-Mailings) -FCKeditorForUserSignatureCreación/edición WYSIWIG de la firma de usuarios -FCKeditorForMailCreación/edición WYSIWIG de todos los E-Mails (excepto Utilidades->E-Mailings) +AdvancedEditor=Editor avanzado +ActivateFCKeditor=Activar editor avanzado para : +FCKeditorForCompany=Creación/edición WYSIWIG de la descripción y notas de los terceros +FCKeditorForProduct=Creación/edición WYSIWIG de la descripción y notas de los productos/servicios +FCKeditorForProductDetails=Creación/edición WYSIWIG de las líneas de detalle de los productos (en pedidos, presupuestos, facturas, etc.) +FCKeditorForMailing=Creación/edición WYSIWIG de los E-Mails (Utilidades->E-Mailings) +FCKeditorForUserSignature=Creación/edición WYSIWIG de la firma de usuarios +FCKeditorForMail=Creación/edición WYSIWIG de todos los E-Mails (excepto Utilidades->E-Mailings) ##### OSCommerce 1 ##### -OSCommerceErrorConnectOkButWrongDatabaseLa conexión se ha establecido, pero la base de datos no parece de OSCommerce. -OSCommerceTestOkLa conexión al servidor '%s' sobre la base '%s' por el usuario '%s' es correcta. -OSCommerceTestKo1La conexión al servidor '%s' sobre la base '%s' por el usuario '%s' no se pudo efectuar. -OSCommerceTestKo2La conexión al servidor '%s' por el usuario '%s' ha fallado. +OSCommerceErrorConnectOkButWrongDatabase=La conexión se ha establecido, pero la base de datos no parece de OSCommerce. +OSCommerceTestOk=La conexión al servidor '%s' sobre la base '%s' por el usuario '%s' es correcta. +OSCommerceTestKo1=La conexión al servidor '%s' sobre la base '%s' por el usuario '%s' no se pudo efectuar. +OSCommerceTestKo2=La conexión al servidor '%s' por el usuario '%s' ha fallado. ##### Mantis ##### -MantisSetupConfiguración del enlace con el sistema de seguimiento Mantis -MantisURLDirección (URL) de acceso a Mantis -MantisServerServidor de la base de datos Mantis -MantisDatabaseNameNombre de la base de datos Mantis -MantisUserIdentificador de acceso a la base -MantisSetupSavedLos identificadores Mantis se han guardado correctamente -MantisTestOkLa conexión al servidor '%s' sobre la base de datos '%s' por el usuario '%s' es correcta. -MantisTestKo1La conexión al servidor '%s' es correcta pero la base de datos' %s ' no pudo comprobarse. -MantisTestKo2La conexión al servidor '%s' por el usuario '%s' a fallado. -MantisErrorConnectOkButWrongDatabaseLa conexión es correcta pero la base de datos no parece ser una base de datos Mantis. +MantisSetup=Configuración del enlace con el sistema de seguimiento Mantis +MantisURL=Dirección (URL) de acceso a Mantis +MantisServer=Servidor de la base de datos Mantis +MantisDatabaseName=Nombre de la base de datos Mantis +MantisUser=Identificador de acceso a la base +MantisSetupSaved=Los identificadores Mantis se han guardado correctamente +MantisTestOk=La conexión al servidor '%s' sobre la base de datos '%s' por el usuario '%s' es correcta. +MantisTestKo1=La conexión al servidor '%s' es correcta pero la base de datos' %s ' no pudo comprobarse. +MantisTestKo2=La conexión al servidor '%s' por el usuario '%s' a fallado. +MantisErrorConnectOkButWrongDatabase=La conexión es correcta pero la base de datos no parece ser una base de datos Mantis. ##### Stock ##### -StockSetupConfiguración del módulo Stocks -UserWarehouseUtilizar los stocks personales de usuarios +StockSetup=Configuración del módulo Stocks +UserWarehouse=Utilizar los stocks personales de usuarios ##### Menu ##### -MenuDeletedMenú eliminado -TreeMenuEstructura de los menús -MenusMenús -TreeMenuPersonalizedMenús personalizados -NewMenuNuevo menú -MenuConfConfiguración de los menús -MenuSelección de los menús -MenuHandlerGestor de menús -MenuModuleMódulo origen -HideUnauthorizedMenuOcultar también los menús no autorizados a usuarios internos (si no sólo atenuados) -DetailIdIdentificador del menú -DetailMenuHandlerNombre del gestor de menús -DetailMenuModuleNombre del módulo si la entrada del menú es resultante de un módulo -DetailTypeTipo de menú (superior o izquierdo) -DetailTitreEtiqueta de menú -DetailMainmenuGrupo al cual pertenece (obsoleto) -DetailUrlURL de la página hacia la cual el menú apunta -DetailLeftmenuCondición de visualización o no (obsoleto) -DetailEnabledCondición de mostrar o no -DetailRightCondición de visualización completa o restringida -DetailLangsArchivo .lang para la traducción del título -DetailUserInterno / Externo / Todos -TargetObjetivo -DetailTargetComportamiento del enlace (_blank para abrir una nueva ventana) -DetailLevelNivel (-1:menú superior, 0:principal, >0 menú y submenú) -ModifMenuModificación del menú -DeleteMenuEliminar entrada de menú -ConfirmDeleteMenuEstá seguro de querer eliminar la entrada de menú %s ? -DeleteLineEliminación de línea -ConfirmDeleteLine¿Está seguro de querer eliminar esta línea? +MenuDeleted=Menú eliminado +TreeMenu=Estructura de los menús +Menus=Menús +TreeMenuPersonalized=Menús personalizados +NewMenu=Nuevo menú +MenuConf=Configuración de los menús +Menu=Selección de los menús +MenuHandler=Gestor de menús +MenuModule=Módulo origen +HideUnauthorizedMenu=Ocultar también los menús no autorizados a usuarios internos (si no sólo atenuados) +DetailId=Identificador del menú +DetailMenuHandler=Nombre del gestor de menús +DetailMenuModule=Nombre del módulo si la entrada del menú es resultante de un módulo +DetailType=Tipo de menú (superior o izquierdo) +DetailTitre=Etiqueta de menú +DetailMainmenu=Grupo al cual pertenece (obsoleto) +DetailUrl=URL de la página hacia la cual el menú apunta +DetailLeftmenu=Condición de visualización o no (obsoleto) +DetailEnabled=Condición de mostrar o no +DetailRight=Condición de visualización completa o restringida +DetailLangs=Archivo .lang para la traducción del título +DetailUser=Interno / Externo / Todos +Target=Objetivo +DetailTarget=Comportamiento del enlace (_blank para abrir una nueva ventana) +DetailLevel=Nivel (-1:menú superior, 0:principal, >0 menú y submenú) +ModifMenu=Modificación del menú +DeleteMenu=Eliminar entrada de menú +ConfirmDeleteMenu=Está seguro de querer eliminar la entrada de menú %s ? +DeleteLine=Eliminación de línea +ConfirmDeleteLine=¿Está seguro de querer eliminar esta línea? ##### Tax ##### -TaxSetupConfiguración del módulo Impuestos, cargas sociales y dividendos -OptionVatModeOpción de carga de IVA -OptionVATDefaultEstándar -OptionVATDebitOptionOpción servicios a débito -OptionVatDefaultDescLa carga del IVA es:
-en el envío de los bienes (en la práctica se usa la fecha de la factura)
-sobre el pago por los servicios -OptionVatDebitOptionDescLa carga del IVA es:
-en el envío de los bienes (en la práctica se usa la fecha de la factura)
-sobre la facturación de los servicios -SummaryOfVatExigibilityUsedByDefaultMomento de exigibilidad por defecto el IVA para la opción escogida: -OnDeliveryEn la entrega -OnPaymentEn el pago -OnInvoiceEn la factura -SupposedToBePaymentDateFecha de pago usada -SupposedToBeInvoiceDateFecha de factura usada -BuyCompra -SellVenta -InvoiceDateUsedFecha usada de factura -YourCompanyDoesNotUseVATSu empresa está configurada como no sujeta al IVA (Inicio - Configuración - Empresa/Institución), por lo que no hay opción para la paremetrización del IVA. -AccountancyCodeCódigo contable -AccountancyCodeSellCódigo contable ventas -AccountancyCodeBuyCódigo contable compras +TaxSetup=Configuración del módulo Impuestos, cargas sociales y dividendos +OptionVatMode=Opción de carga de IVA +OptionVATDefault=Estándar +OptionVATDebitOption=Opción servicios a débito +OptionVatDefaultDesc=La carga del IVA es:
-en el envío de los bienes (en la práctica se usa la fecha de la factura)
-sobre el pago por los servicios +OptionVatDebitOptionDesc=La carga del IVA es:
-en el envío de los bienes (en la práctica se usa la fecha de la factura)
-sobre la facturación de los servicios +SummaryOfVatExigibilityUsedByDefault=Momento de exigibilidad por defecto el IVA para la opción escogida: +OnDelivery=En la entrega +OnPayment=En el pago +OnInvoice=En la factura +SupposedToBePaymentDate=Fecha de pago usada +SupposedToBeInvoiceDate=Fecha de factura usada +Buy=Compra +Sell=Venta +InvoiceDateUsed=Fecha usada de factura +YourCompanyDoesNotUseVAT=Su empresa está configurada como no sujeta al IVA (Inicio - Configuración - Empresa/Institución), por lo que no hay opción para la paremetrización del IVA. +AccountancyCode=Código contable +AccountancyCodeSell=Código contable ventas +AccountancyCodeBuy=Código contable compras ##### Agenda ##### -AgendaSetupMódulo configuración de acciones y agenda -PasswordTogetVCalExportClave de autorización vcal export link -PastDelayVCalExportNo exportar los eventos de más de -AGENDA_USE_EVENT_TYPEUsar los tipos de eventos (administrables desde Configuración->Diccionarios->llx_c_actioncomm) +AgendaSetup=Módulo configuración de acciones y agenda +PasswordTogetVCalExport=Clave de autorización vcal export link +PastDelayVCalExport=No exportar los eventos de más de +AGENDA_USE_EVENT_TYPE=Usar los tipos de eventos (administrables desde Configuración->Diccionarios->llx_c_actioncomm) ##### ClickToDial ##### -ClickToDialDescEste módulo permite agregar un icono después del número de teléfono de contactos Dolibarr. Un clic en este icono, Llama a un servidor con una URL que se indica a continuación. Esto puede ser usado para llamar al sistema call center de Dolibarr que puede llamar al número de teléfono en un sistema SIP, por ejemplo. +ClickToDialDesc=Este módulo permite agregar un icono después del número de teléfono de contactos Dolibarr. Un clic en este icono, Llama a un servidor con una URL que se indica a continuación. Esto puede ser usado para llamar al sistema call center de Dolibarr que puede llamar al número de teléfono en un sistema SIP, por ejemplo. ##### Point Of Sales (CashDesk) ##### -CashDeskTPV -CashDeskSetupConfiguración del módulo Terminal Punto de Venta -CashDeskThirdPartyForSellTercero genérico a usar para la venta -CashDeskBankAccountForSellCuenta por defecto a utilizar para los cobros en efectivo (caja) -CashDeskBankAccountForChequeCuenta por defecto a utilizar para los cobros con cheques -CashDeskBankAccountForCBCuenta por defecto a utilizar para los cobros con tarjeta de crédito -CashDeskIdWareHouseAlmacén a utilizar para las ventas +CashDesk=TPV +CashDeskSetup=Configuración del módulo Terminal Punto de Venta +CashDeskThirdPartyForSell=Tercero genérico a usar para la venta +CashDeskBankAccountForSell=Cuenta por defecto a utilizar para los cobros en efectivo (caja) +CashDeskBankAccountForCheque=Cuenta por defecto a utilizar para los cobros con cheques +CashDeskBankAccountForCB=Cuenta por defecto a utilizar para los cobros con tarjeta de crédito +CashDeskIdWareHouse=Almacén a utilizar para las ventas ##### Bookmark ##### -BookmarkSetupConfiguración del módulo Marcadores -BookmarkDescEste módulo le permite gestionar los enlaces y accesos directos. También permite añadir cualquier página de Dolibarr o enlace web en el menú de acceso rápido de la izquierda. -NbOfBoomarkToShowNúmero máximo de marcadores que se mostrará en el menú +BookmarkSetup=Configuración del módulo Marcadores +BookmarkDesc=Este módulo le permite gestionar los enlaces y accesos directos. También permite añadir cualquier página de Dolibarr o enlace web en el menú de acceso rápido de la izquierda. +NbOfBoomarkToShow=Número máximo de marcadores que se mostrará en el menú ##### WebServices ##### -WebServicesSetupConfiguración del módulo Web services -WebServicesDescMediante la activación de este módulo, Dolibarr se convierte en servidor de servicios web ofreciendo diversos servicios web. -WSDLCanBeDownloadedHereLa descripción WSDL de los servicios prestados se pueden recuperar aquí -EndPointIsLos clientes SOAP deberán enviar sus solicitudes al punto final en la URL Dolibarr +WebServicesSetup=Configuración del módulo Web services +WebServicesDesc=Mediante la activación de este módulo, Dolibarr se convierte en servidor de servicios web ofreciendo diversos servicios web. +WSDLCanBeDownloadedHere=La descripción WSDL de los servicios prestados se pueden recuperar aquí +EndPointIs=Los clientes SOAP deberán enviar sus solicitudes al punto final en la URL Dolibarr ##### Bank ##### -BankSetupModuleConfiguración del módulo Banco -FreeLegalTextOnChequeReceiptsMención complementaria en las remesas de cheques -BankOrderShowOrden de visualización de la información bancaria al usar la "cuenta bancaria detallada" -BankOrderGlobalGeneral -BankOrderGlobalDescOrden de visualización general -BankOrderESEspañol -BankOrderESDescOrden de visualización español +BankSetupModule=Configuración del módulo Banco +FreeLegalTextOnChequeReceipts=Mención complementaria en las remesas de cheques +BankOrderShow=Orden de visualización de la información bancaria al usar la "cuenta bancaria detallada" +BankOrderGlobal=General +BankOrderGlobalDesc=Orden de visualización general +BankOrderES=Español +BankOrderESDesc=Orden de visualización español ##### Multicompany ##### -MultiCompanySetupConfiguración del módulo Multi-empresa +MultiCompanySetup=Configuración del módulo Multi-empresa ##### Suppliers ##### -SuppliersSetupConfiguración del módulo Proveedores -SuppliersCommandModelModelo de pedidos a proveedores completo (logo...) -SuppliersInvoiceModelModelo de facturas de proveedores completo (logo...) -SuppliersInvoiceNumberingModelModelos de numeración de facturas de proveedor +SuppliersSetup=Configuración del módulo Proveedores +SuppliersCommandModel=Modelo de pedidos a proveedores completo (logo...) +SuppliersInvoiceModel=Modelo de facturas de proveedores completo (logo...) +SuppliersInvoiceNumberingModel=Modelos de numeración de facturas de proveedor ##### GeoIPMaxmind ##### -GeoIPMaxmindSetupConfiguración del módulo GeoIP Maxmind -PathToGeoIPMaxmindCountryDataFileRuta del archivo Maxmind que contiene las conversiones IP->País.
Ejemplo: /usr/local/share/GeoIP/GeoIP.dat -NoteOnPathLocationTenga en cuenta que este archivo debe estar en un directorio accesible desde su PHP (Compruebe la configuración de open_basedir de su PHP y los permisos de archivo/directorios). -YouCanDownloadFreeDatFileToPuede descargarse una versión demo gratuita del archivo de países Maxmind GeoIP en la dirección %s. -YouCanDownloadAdvancedDatFileToTambién puede descargarse una versión más completa del archivo de países Maxmind GeoIP en la dirección %s. -TestGeoIPResultTest de conversión IP -> País +GeoIPMaxmindSetup=Configuración del módulo GeoIP Maxmind +PathToGeoIPMaxmindCountryDataFile=Ruta del archivo Maxmind que contiene las conversiones IP->País.
Ejemplo: /usr/local/share/GeoIP/GeoIP.dat +NoteOnPathLocation=Tenga en cuenta que este archivo debe estar en un directorio accesible desde su PHP (Compruebe la configuración de open_basedir de su PHP y los permisos de archivo/directorios). +YouCanDownloadFreeDatFileTo=Puede descargarse una versión demo gratuita del archivo de países Maxmind GeoIP en la dirección %s. +YouCanDownloadAdvancedDatFileTo=También puede descargarse una versión más completa del archivo de países Maxmind GeoIP en la dirección %s. +TestGeoIPResult=Test de conversión IP -> País ##### Projects ##### -ProjectsNumberingModulesMódulo de numeración para las referencias de los proyectos -ProjectsSetupConfiguración del módulo Proyectos -ProjectsModelModuleModelo de documento para informes de proyectos +ProjectsNumberingModules=Módulo de numeración para las referencias de los proyectos +ProjectsSetup=Configuración del módulo Proyectos +ProjectsModelModule=Modelo de documento para informes de proyectos #### Accountancy #### -ChartofaccountsPlan contable -DefinechartofaccountsDefinir un plan contable -SelectchartofaccountsSelección de un plan contable -DoNotSuggestChartNo sugerir un plan contable +Chartofaccounts=Plan contable +Definechartofaccounts=Definir un plan contable +Selectchartofaccounts=Selección de un plan contable +DoNotSuggestChart=No sugerir un plan contable ##### ECM (GED) ##### -ECMSetupConfiguración del módulo GED -ECMAutoTreeEl árbol automático está disponible +ECMSetup=Configuración del módulo GED +ECMAutoTree=El árbol automático está disponible From df26037e9d37b22cedf33385049d4184303a6609 Mon Sep 17 00:00:00 2001 From: simnandez Date: Wed, 3 Jul 2013 16:49:54 +0200 Subject: [PATCH 14/48] Trad: Load contracts lang for stats panel --- htdocs/index.php | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/index.php b/htdocs/index.php index 3ba4e63e03e..89498b57d7a 100644 --- a/htdocs/index.php +++ b/htdocs/index.php @@ -97,6 +97,7 @@ print "\n"; $langs->load("commercial"); $langs->load("bills"); $langs->load("orders"); +$langs->load("contracts"); if ($user->societe_id == 0) { From c474929caa7f87521fe7fee245c17a5c0b1294e5 Mon Sep 17 00:00:00 2001 From: simnandez Date: Wed, 3 Jul 2013 16:49:54 +0200 Subject: [PATCH 15/48] Trad: Load contracts lang for stats panel --- htdocs/index.php | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/index.php b/htdocs/index.php index 26a13b9d20c..44aa2c6005c 100644 --- a/htdocs/index.php +++ b/htdocs/index.php @@ -106,6 +106,7 @@ print "\n"; $langs->load("commercial"); $langs->load("bills"); $langs->load("orders"); +$langs->load("contracts"); //print memory_get_usage(); if ($user->societe_id == 0) From eef039e02f2297f8d07f5fc6617b4d5a624c51cb Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 4 Jul 2013 00:11:40 +0200 Subject: [PATCH 16/48] New: [ task #286 ] Enhance rounding function of prices to allow round of sum instead of sum of rounding --- ChangeLog | 7 +- htdocs/core/class/commonobject.class.php | 72 ++++++------ test/phpunit/FactureTestRounding.php | 134 ++++++++++++++++++++++- 3 files changed, 170 insertions(+), 43 deletions(-) diff --git a/ChangeLog b/ChangeLog index 30c741222d4..43dc578e49b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -6,8 +6,8 @@ English Dolibarr ChangeLog For users: - New: [ task #877 ] Reorganize menus. - New: [ task #858 ] Holiday module: note on manual holiday assignation. -- New: [ task #892 ] Add hidden option in thirdparty customer/supplier module to - hide non active companies in select_company method. +- New: [ task #892 ] Add hidden option in thirdparty customer/supplier module to hide non active + companies in select_company method. - New: [ task #531 ] Add a workload field on tasks. - New: Add graph of bank account input/output into input-output report page. - New: Add script export-bank-receipts.php @@ -24,7 +24,8 @@ For users: - New: [ task #928 ] Add extrafield feature on invoice lines. - New: Add option ADHERENT_LOGIN_NOT_REQUIRED. - New: Add a cron module to define scheduled jobs. -- New: Add new graphical boxes (customer invoices per month). +- New: Add new graphical boxes (customer invoices and orders per month). +- New: [ task #286 ] Enhance rounding function of prices to allow round of sum instead of sum of rounding. - Qual: Implement same rule for return value of all command line scripts (0 when success, <>0 if error). For translators: diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php index 1bb675a6a0b..0de5f388b42 100644 --- a/htdocs/core/class/commonobject.class.php +++ b/htdocs/core/class/commonobject.class.php @@ -42,7 +42,7 @@ abstract class CommonObject public $firstname; public $civility_id; public $import_key; - + public $array_options=array(); public $linkedObjectsIds; @@ -53,7 +53,7 @@ abstract class CommonObject /** * Method to output saved errors - * + * * @return string String with errors */ function errorsToString() @@ -1464,15 +1464,18 @@ abstract class CommonObject } /** - * Update total_ht, total_ttc and total_vat for an object (sum of lines) + * Update total_ht, total_ttc, total_vat, total_localtax1, total_localtax2 for an object (sum of lines). + * Must be called at end of methods addline, updateline. * * @param int $exclspec Exclude special product (product_type=9) - * @param int $roundingadjust -1=Use default method (MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND or 0), 0=Use total of rounding, 1=Use rounding of total + * @param int $roundingadjust -1=Use default method (MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND if defined, or 0), 0=Force use total of rounding, 1=Force use rounding of total * @param int $nodatabaseupdate 1=Do not update database. Update only properties of object. * @return int <0 if KO, >0 if OK */ function update_price($exclspec=0,$roundingadjust=-1,$nodatabaseupdate=0) { + global $conf; + include_once DOL_DOCUMENT_ROOT.'/core/lib/price.lib.php'; if ($roundingadjust < 0 && isset($conf->global->MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND)) $roundingadjust=$conf->global->MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND; @@ -1486,7 +1489,7 @@ abstract class CommonObject $fieldlocaltax2='total_localtax2'; if ($this->element == 'facture_fourn' || $this->element == 'invoice_supplier') $fieldtva='tva'; - $sql = 'SELECT qty, total_ht, '.$fieldtva.' as total_tva, total_ttc, '.$fieldlocaltax1.' as total_localtax1, '.$fieldlocaltax2.' as total_localtax2,'; + $sql = 'SELECT rowid, qty, total_ht, '.$fieldtva.' as total_tva, total_ttc, '.$fieldlocaltax1.' as total_localtax1, '.$fieldlocaltax2.' as total_localtax2,'; $sql.= ' tva_tx as vatrate, localtax1_tx, localtax2_tx, localtax1_type, localtax2_type'; $sql.= ' FROM '.MAIN_DB_PREFIX.$this->table_element_line; $sql.= ' WHERE '.$this->fk_element.' = '.$this->id; @@ -1496,6 +1499,7 @@ abstract class CommonObject if ($this->table_element_line == 'contratdet') $product_field=''; // contratdet table has no product_type field if ($product_field) $sql.= ' AND '.$product_field.' <> 9'; } + $sql.= ' ORDER by rowid'; // We want to be sure to always use same order of line to not change lines differently when option MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND is used dol_syslog(get_class($this)."::update_price sql=".$sql); $resql = $this->db->query($sql); @@ -1506,8 +1510,9 @@ abstract class CommonObject $this->total_localtax1 = 0; $this->total_localtax2 = 0; $this->total_ttc = 0; - $vatrates = array(); - $vatrates_alllines = array(); + $total_ht_by_vats = array(); + $total_tva_by_vats = array(); + $total_ttc_by_vats = array(); $num = $this->db->num_rows($resql); $i = 0; @@ -1515,42 +1520,34 @@ abstract class CommonObject { $obj = $this->db->fetch_object($resql); - $this->total_ht += $obj->total_ht; + $this->total_ht += $obj->total_ht; // The only field visible at line level $this->total_tva += $obj->total_tva; $this->total_localtax1 += $obj->total_localtax1; $this->total_localtax2 += $obj->total_localtax2; $this->total_ttc += $obj->total_ttc; + $total_ht_by_vats[$obj->vatrate] += $obj->total_ht; + $total_tva_by_vats[$obj->vatrate] += $obj->total_tva; + $total_ttc_by_vats[$obj->vatrate] += $obj->total_ttc; - // Check if there is a global invoice tax for this vat rate - // FIXME: We should have no database access into this function. Also localtax 7 seems to have problem so i add condition to avoid it into standard usage without loosing it. - if (! empty($conf->global->MAIN_USE_LOCALTAX_TYPE_7)) + if ($roundingadjust) // Check if we need adjustement onto line for vat { - if ($this->total_localtax1 == 0) - { - // Search to know if there is a localtax of type 7 - // TODO : store local taxes types into object lines and remove this. We should use here $obj->localtax1_type but it is not yet filled into database, so we search into table of vat rate - global $mysoc; - $localtax1_array=getLocalTaxesFromRate($vatrate,1,$mysoc); - if (empty($obj->localtax1_type)) - { - $obj->localtax1_type = $localtax1_array[0]; - $obj->localtax1_tx = $localtax1_array[1]; - } - //end TODO - } - if ($this->total_localtax2 == 0) - { - // Search to know if there is a localtax of type 7 - // TODO : store local taxes types into object lines and remove this. We should use here $obj->localtax1_type but it is not yet filled into database, so we search into table of vat rate - global $mysoc; - $localtax2_array=getLocalTaxesFromRate($vatrate,2,$mysoc); - if (empty($obj->localtax2_type)) - { - $obj->localtax2_type = $localtax2_array[0]; - $obj->localtax2_tx = $localtax2_array[1]; - } - //end TODO - } + $tmpvat=price2num($total_ht_by_vats[$obj->vatrate] * $obj->vatrate / 100, 'MT', 1); + $diff=price2num($total_tva_by_vats[$obj->vatrate]-$tmpvat, 'MT', 1); + //print 'Line '.$i.' rowid='.$obj->rowid.' vat_rate='.$obj->vatrate.' total_ht='.$obj->total_ht.' total_tva='.$obj->total_tva.' total_ttc='.$obj->total_ttc.' total_ht_by_vats='.$total_ht_by_vats[$obj->vatrate].' total_tva_by_vats='.$total_tva_by_vats[$obj->vatrate].' (new calculation = '.$tmpvat.') total_ttc_by_vats='.$total_ttc_by_vats[$obj->vatrate].($diff?" => DIFF":"")."
\n"; + if ($diff) + { + if ($diff > 0.1) { dol_print_error('','A rounding difference was detected but is to high to be corrected'); exit; } + $sqlfix="UPDATE ".MAIN_DB_PREFIX.$this->table_element_line." SET ".$fieldtva." = ".($obj->total_tva - $diff).", total_ttc = ".($obj->total_ttc - $diff)." WHERE rowid = ".$obj->rowid; + //print 'We found a difference of '.$diff.' for line rowid = '.$obj->rowid.". Run sqlfix = ".$sqlfix."
\n"; + dol_syslog('We found a difference of '.$diff.' for line rowid = '.$obj->rowid.". Run sqlfix = ".$sqlfix); + $resqlfix=$this->db->query($sqlfix); + if (! $resqlfix) dol_print_error($this->db,'Failed to update line'); + $this->total_tva -= $diff; + $this->total_ttc -= $diff; + $total_tva_by_vats[$obj->vatrate] -= $diff; + $total_ttc_by_vats[$obj->vatrate] -= $diff; + + } } $i++; @@ -1567,6 +1564,7 @@ abstract class CommonObject $fieldlocaltax1='localtax1'; $fieldlocaltax2='localtax2'; $fieldttc='total_ttc'; + // Specific code for backward compatibility with old field names if ($this->element == 'facture' || $this->element == 'facturerec') $fieldht='total'; if ($this->element == 'facture_fourn' || $this->element == 'invoice_supplier') $fieldtva='total_tva'; if ($this->element == 'propal') $fieldttc='total'; diff --git a/test/phpunit/FactureTestRounding.php b/test/phpunit/FactureTestRounding.php index f000b74289d..446b6893ae0 100644 --- a/test/phpunit/FactureTestRounding.php +++ b/test/phpunit/FactureTestRounding.php @@ -1,5 +1,5 @@ +/* Copyright (C) 2012-2013 Laurent Destailleur * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -157,9 +157,9 @@ class FactureTestRounding extends PHPUnit_Framework_TestCase /** * testFactureRoundingCreate2 - * + * * @return int - * + * * @depends testFactureRoundingCreate1 * Test according to page http://wiki.dolibarr.org/index.php/Draft:VAT_calculation_and_rounding#Standard_usage */ @@ -194,5 +194,133 @@ class FactureTestRounding extends PHPUnit_Framework_TestCase //$this->assertEquals($newlocalobject->total_ttc, 2.73); return $result; } + + + /** + * testFactureAddLine1 + * + * @return void + */ + public function testFactureAddLine1() + { + global $conf,$user,$langs,$db; + $conf=$this->savconf; + $user=$this->savuser; + $langs=$this->savlangs; + $db=$this->savdb; + + // With option MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND = 0 + $conf->global->MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND=0; + $localobject1a=new Facture($this->savdb); + $localobject1a->initAsSpecimen('nolines'); + $facid=$localobject1a->create($user); + $localobject1a->addline($facid, 'Line 1', 6.36, 15, 21); // This include update_price + print __METHOD__." id=".$facid." total_ttc=".$localobject1a->total_ttc."\n"; + $this->assertEquals( 95.40, $localobject1a->total_ht); + $this->assertEquals( 20.03, $localobject1a->total_tva); + $this->assertEquals(115.43, $localobject1a->total_ttc); + + // With option MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND = 1 + $conf->global->MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND=1; + $localobject1b=new Facture($this->savdb); + $localobject1b->initAsSpecimen('nolines'); + $facid=$localobject1b->create($user); + $localobject1b->addline($facid, 'Line 1', 6.36, 15, 21); // This include update_price + print __METHOD__." id=".$facid." total_ttc=".$localobject1b->total_ttc."\n"; + $this->assertEquals( 95.40, $localobject1b->total_ht, 'testFactureAddLine1 total_ht'); + $this->assertEquals( 20.03, $localobject1b->total_tva, 'testFactureAddLine1 total_tva'); + $this->assertEquals(115.43, $localobject1b->total_ttc, 'testFactureAddLine1 total_ttc'); + } + + /** + * testFactureAddLine2 + * + * @return void + * + * @depends testFactureAddLine1 + * The depends says test is run only if previous is ok + */ + public function testFactureAddLine2() + { + global $conf,$user,$langs,$db; + $conf=$this->savconf; + $user=$this->savuser; + $langs=$this->savlangs; + $db=$this->savdb; + + // With option MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND = 0 + $conf->global->MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND=0; + $localobject2=new Facture($this->savdb); + $localobject2->initAsSpecimen('nolines'); + $facid=$localobject2->create($user); + $localobject2->addline($facid, 'Line 1', 6.36, 5, 21); + $localobject2->addline($facid, 'Line 2', 6.36, 5, 21); + $localobject2->addline($facid, 'Line 3', 6.36, 5, 21); + print __METHOD__." id=".$facid." total_ttc=".$localobject2->total_ttc."\n"; + $this->assertEquals( 95.40, $localobject2->total_ht); + $this->assertEquals( 20.04, $localobject2->total_tva); + $this->assertEquals(115.44, $localobject2->total_ttc); + + // With option MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND = 1 + $conf->global->MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND=1; + $localobject2=new Facture($this->savdb); + $localobject2->initAsSpecimen('nolines'); + $facid=$localobject2->create($user); + $localobject2->addline($facid, 'Line 1', 6.36, 5, 21); + $localobject2->addline($facid, 'Line 2', 6.36, 5, 21); + $localobject2->addline($facid, 'Line 3', 6.36, 5, 21); + print __METHOD__." id=".$facid." total_ttc=".$localobject2->total_ttc."\n"; + $this->assertEquals( 95.40, $localobject2->total_ht); + $this->assertEquals( 20.03, $localobject2->total_tva); + $this->assertEquals(115.43, $localobject2->total_ttc); + } + + /** + * testFactureAddLine3 + * + * @return void + * + * @depends testFactureAddLine2 + * The depends says test is run only if previous is ok + */ + public function testFactureAddLine3() + { + global $conf,$user,$langs,$db; + $conf=$this->savconf; + $user=$this->savuser; + $langs=$this->savlangs; + $db=$this->savdb; + + // With option MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND = 0 + $conf->global->MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND=0; + $localobject3=new Facture($this->savdb); + $localobject3->initAsSpecimen('nolines'); + $facid=$localobject3->create($user); + $localobject3->addline($facid, 'Line 1', 6.36, 3, 21); + $localobject3->addline($facid, 'Line 2', 6.36, 3, 21); + $localobject3->addline($facid, 'Line 3', 6.36, 3, 21); + $localobject3->addline($facid, 'Line 4', 6.36, 3, 21); + $localobject3->addline($facid, 'Line 5', 6.36, 3, 21); + print __METHOD__." id=".$facid." total_ttc=".$localobject3->total_ttc."\n"; + $this->assertEquals( 95.40, $localobject3->total_ht); + $this->assertEquals( 20.05, $localobject3->total_tva); + $this->assertEquals(115.45, $localobject3->total_ttc); + + // With option MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND = 1 + $conf->global->MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND=1; + $localobject3=new Facture($this->savdb); + $localobject3->initAsSpecimen('nolines'); + $facid=$localobject3->create($user); + $localobject3->addline($facid, 'Line 1', 6.36, 3, 21); + $localobject3->addline($facid, 'Line 2', 6.36, 3, 21); + $localobject3->addline($facid, 'Line 3', 6.36, 3, 21); + $localobject3->addline($facid, 'Line 4', 6.36, 3, 21); + $localobject3->addline($facid, 'Line 5', 6.36, 3, 21); + print __METHOD__." id=".$facid." total_ttc=".$localobject3->total_ttc."\n"; + $this->assertEquals( 95.40, $localobject3->total_ht); + $this->assertEquals( 20.03, $localobject3->total_tva); + $this->assertEquals(115.43, $localobject3->total_ttc); + } + } ?> \ No newline at end of file From 1e089ef74a8316dc0e4808ee843aac246587cbea Mon Sep 17 00:00:00 2001 From: Florian Henry Date: Fri, 5 Jul 2013 09:19:56 +0200 Subject: [PATCH 17/48] Reset demo webservice to NORUN --- ...wsclient_actioncomm.php => demo_wsclient_actioncomm.php-NORUN} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename htdocs/webservices/{demo_wsclient_actioncomm.php => demo_wsclient_actioncomm.php-NORUN} (100%) diff --git a/htdocs/webservices/demo_wsclient_actioncomm.php b/htdocs/webservices/demo_wsclient_actioncomm.php-NORUN similarity index 100% rename from htdocs/webservices/demo_wsclient_actioncomm.php rename to htdocs/webservices/demo_wsclient_actioncomm.php-NORUN From 529a58cc9d70c4c78e0fa802ddac28f5ce958f86 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 5 Jul 2013 12:04:55 +0200 Subject: [PATCH 18/48] New: Add advice into info help --- htdocs/admin/system/dolibarr.php | 3 ++- htdocs/langs/en_US/admin.lang | 1 + htdocs/langs/fr_FR/admin.lang | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/htdocs/admin/system/dolibarr.php b/htdocs/admin/system/dolibarr.php index 9b83acc0bbd..b32ddf573bd 100644 --- a/htdocs/admin/system/dolibarr.php +++ b/htdocs/admin/system/dolibarr.php @@ -154,7 +154,8 @@ $var=!$var; print '  => price(1234.56)'.price(1234.56).''."\n"; // Timezone $txt =$langs->trans("OSTZ").' (variable system TZ): '.(! empty($_ENV["TZ"])?$_ENV["TZ"]:$langs->trans("NotDefined")).'
'."\n"; -$txt.=$langs->trans("PHPTZ").' (php.ini date.timezone): '.(ini_get("date.timezone")?ini_get("date.timezone"):$langs->trans("NotDefined")).''."\n"; // date.timezone must be in valued defined in http://fr3.php.net/manual/en/timezones.europe.php +$txt.=$langs->trans("PHPTZ").' (php.ini date.timezone): '.(ini_get("date.timezone")?ini_get("date.timezone"):$langs->trans("NotDefined")).''."
\n"; // date.timezone must be in valued defined in http://fr3.php.net/manual/en/timezones.europe.php +$txt.=$langs->trans("YouCanEditPHPTZ"); $var=!$var; print ''.$langs->trans("CurrentTimeZone").''; // Timezone server PHP $a=getServerTimeZoneInt('now'); diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index d9ed728f87b..123dad3b434 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -119,6 +119,7 @@ CurrentHour=PHP Time (server) CompanyTZ=Company Time Zone (main company) CompanyHour=Company Time (main company) CurrentSessionTimeOut=Current session timeout +YouCanEditPHPTZ=To set a different PHP timezone (not required), you can try to add a file .htacces with a line like this "SetEnv TZ Europe/Paris" OSEnv=OS Environment Box=Box Boxes=Boxes diff --git a/htdocs/langs/fr_FR/admin.lang b/htdocs/langs/fr_FR/admin.lang index b97aa7b3c81..5aa88277963 100644 --- a/htdocs/langs/fr_FR/admin.lang +++ b/htdocs/langs/fr_FR/admin.lang @@ -120,6 +120,7 @@ CurrentHour=Heure PHP (serveur) CompanyTZ=Fuseau horaire société (maison mère) CompanyHour=Heure société (maison mère) CurrentSessionTimeOut=Délai expiration session actuelle +YouCanEditPHPTZ=Pour définir un autre timezone PHP (non obligatoire), vous pouvez essayer d'ajouter un fichier .htaccess avec une ligne du type "SetEnv TZ Europe/Paris" OSEnv=Environnement OS Box=Boîte Boxes=Boîtes From 45e32ca3a5c79abeafd43681e644086756481883 Mon Sep 17 00:00:00 2001 From: BENKE Charles Date: Fri, 5 Jul 2013 12:14:27 +0200 Subject: [PATCH 19/48] Update modFacture.class.php add 'accountancy_code_sell' to the customer invoice export list --- htdocs/core/modules/modFacture.class.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/core/modules/modFacture.class.php b/htdocs/core/modules/modFacture.class.php index 384d1c63c45..2ce63d3ddc0 100644 --- a/htdocs/core/modules/modFacture.class.php +++ b/htdocs/core/modules/modFacture.class.php @@ -174,10 +174,10 @@ class modFacture extends DolibarrModules $this->export_label[$r]='CustomersInvoicesAndInvoiceLines'; // Translation key (used only if key ExportDataset_xxx_z not found) $this->export_icon[$r]='bill'; $this->export_permission[$r]=array(array("facture","facture","export")); - $this->export_fields_array[$r]=array('s.rowid'=>"IdCompany",'s.nom'=>'CompanyName','s.address'=>'Address','s.zip'=>'Zip','s.town'=>'Town','c.code'=>'CountryCode','s.phone'=>'Phone','s.siren'=>'ProfId1','s.siret'=>'ProfId2','s.ape'=>'ProfId3','s.idprof4'=>'ProfId4','s.code_compta'=>'CustomerAccountancyCode','s.code_compta_fournisseur'=>'SupplierAccountancyCode','s.tva_intra'=>'VATIntra','f.rowid'=>"InvoiceId",'f.facnumber'=>"InvoiceRef",'f.datec'=>"InvoiceDateCreation",'f.datef'=>"DateInvoice",'f.date_lim_reglement'=>"DateDue",'f.total'=>"TotalHT",'f.total_ttc'=>"TotalTTC",'f.tva'=>"TotalVAT",'f.paye'=>"InvoicePaid",'f.fk_statut'=>'InvoiceStatus','f.note'=>"NotePrivate",'f.note_public'=>"NotePublic",'fd.rowid'=>'LineId','fd.label'=>"Label",'fd.description'=>"LineDescription",'fd.price'=>"LineUnitPrice",'fd.tva_tx'=>"LineVATRate",'fd.qty'=>"LineQty",'fd.total_ht'=>"LineTotalHT",'fd.total_tva'=>"LineTotalVAT",'fd.total_ttc'=>"LineTotalTTC",'fd.date_start'=>"DateStart",'fd.date_end'=>"DateEnd",'fd.product_type'=>"TypeOfLineServiceOrProduct",'fd.fk_product'=>'ProductId','p.ref'=>'ProductRef','p.label'=>'ProductLabel'); + $this->export_fields_array[$r]=array('s.rowid'=>"IdCompany",'s.nom'=>'CompanyName','s.address'=>'Address','s.zip'=>'Zip','s.town'=>'Town','c.code'=>'CountryCode','s.phone'=>'Phone','s.siren'=>'ProfId1','s.siret'=>'ProfId2','s.ape'=>'ProfId3','s.idprof4'=>'ProfId4','s.code_compta'=>'CustomerAccountancyCode','s.code_compta_fournisseur'=>'SupplierAccountancyCode','s.tva_intra'=>'VATIntra','f.rowid'=>"InvoiceId",'f.facnumber'=>"InvoiceRef",'f.datec'=>"InvoiceDateCreation",'f.datef'=>"DateInvoice",'f.date_lim_reglement'=>"DateDue",'f.total'=>"TotalHT",'f.total_ttc'=>"TotalTTC",'f.tva'=>"TotalVAT",'f.paye'=>"InvoicePaid",'f.fk_statut'=>'InvoiceStatus','f.note'=>"NotePrivate",'f.note_public'=>"NotePublic",'fd.rowid'=>'LineId','fd.label'=>"Label",'fd.description'=>"LineDescription",'fd.price'=>"LineUnitPrice",'fd.tva_tx'=>"LineVATRate",'fd.qty'=>"LineQty",'fd.total_ht'=>"LineTotalHT",'fd.total_tva'=>"LineTotalVAT",'fd.total_ttc'=>"LineTotalTTC",'fd.date_start'=>"DateStart",'fd.date_end'=>"DateEnd",'fd.product_type'=>"TypeOfLineServiceOrProduct",'fd.fk_product'=>'ProductId','p.ref'=>'ProductRef','p.label'=>'ProductLabel','p.accountancy_code_sell'=>'ProductAccountancyBuyCode'); //$this->export_TypeFields_array[$r]=array('s.rowid'=>"List:societe:nom",'s.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','c.code'=>'Text','s.phone'=>'Text','s.siren'=>'Text','s.siret'=>'Text','s.ape'=>'Text','s.idprof4'=>'Text','s.code_compta'=>'Text','s.code_compta_fournisseur'=>'Text','s.tva_intra'=>'Text','f.facnumber'=>"Text",'f.datec'=>"Date",'f.datef'=>"Date",'f.date_lim_reglement'=>"Date",'f.total'=>"Numeric",'f.total_ttc'=>"Numeric",'f.tva'=>"Numeric",'f.paye'=>"Boolean",'f.fk_statut'=>'Status','f.note'=>"Text",'f.note_public'=>"Text",'fd.description'=>"Text",'fd.price'=>"Numeric",'fd.tva_tx'=>"Numeric",'fd.qty'=>"Numeric",'fd.total_ht'=>"Numeric",'fd.total_tva'=>"Numeric",'fd.total_ttc'=>"Numeric",'fd.date_start'=>"Date",'fd.date_end'=>"Date",'fd.product_type'=>"Numeric",'fd.fk_product'=>'List:Product:label','p.ref'=>'Text','p.label'=>'Text'); - $this->export_TypeFields_array[$r]=array('s.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','c.code'=>'Text','s.phone'=>'Text','s.siren'=>'Text','s.siret'=>'Text','s.ape'=>'Text','s.idprof4'=>'Text','s.code_compta'=>'Text','s.code_compta_fournisseur'=>'Text','s.tva_intra'=>'Text','f.facnumber'=>"Text",'f.datec'=>"Date",'f.datef'=>"Date",'f.date_lim_reglement'=>"Date",'f.total'=>"Numeric",'f.total_ttc'=>"Numeric",'f.tva'=>"Numeric",'f.paye'=>"Boolean",'f.fk_statut'=>'Status','f.note'=>"Text",'f.note_public'=>"Text",'fd.description'=>"Text",'fd.price'=>"Numeric",'fd.tva_tx'=>"Numeric",'fd.qty'=>"Numeric",'fd.total_ht'=>"Numeric",'fd.total_tva'=>"Numeric",'fd.total_ttc'=>"Numeric",'fd.date_start'=>"Date",'fd.date_end'=>"Date",'fd.product_type'=>"Numeric",'fd.fk_product'=>'List:Product:label','p.ref'=>'Text','p.label'=>'Text'); - $this->export_entities_array[$r]=array('s.rowid'=>"company",'s.nom'=>'company','s.address'=>'company','s.zip'=>'company','s.town'=>'company','c.code'=>'company','s.phone'=>'company','s.siren'=>'company','s.siret'=>'company','s.ape'=>'company','s.idprof4'=>'company','s.code_compta'=>'company','s.code_compta_fournisseur'=>'company','s.tva_intra'=>'company','f.rowid'=>"invoice",'f.facnumber'=>"invoice",'f.datec'=>"invoice",'f.datef'=>"invoice",'f.date_lim_reglement'=>"invoice",'f.total'=>"invoice",'f.total_ttc'=>"invoice",'f.tva'=>"invoice",'f.paye'=>"invoice",'f.fk_statut'=>'invoice','f.note'=>"invoice",'f.note_public'=>"invoice",'fd.rowid'=>'invoice_line','fd.label'=>"invoice_line",'fd.description'=>"invoice_line",'fd.price'=>"invoice_line",'fd.total_ht'=>"invoice_line",'fd.total_tva'=>"invoice_line",'fd.total_ttc'=>"invoice_line",'fd.tva_tx'=>"invoice_line",'fd.qty'=>"invoice_line",'fd.date_start'=>"invoice_line",'fd.date_end'=>"invoice_line",'fd.product_type'=>'invoice_line','fd.fk_product'=>'product','p.ref'=>'product','p.label'=>'product'); + $this->export_TypeFields_array[$r]=array('s.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','c.code'=>'Text','s.phone'=>'Text','s.siren'=>'Text','s.siret'=>'Text','s.ape'=>'Text','s.idprof4'=>'Text','s.code_compta'=>'Text','s.code_compta_fournisseur'=>'Text','s.tva_intra'=>'Text','f.facnumber'=>"Text",'f.datec'=>"Date",'f.datef'=>"Date",'f.date_lim_reglement'=>"Date",'f.total'=>"Numeric",'f.total_ttc'=>"Numeric",'f.tva'=>"Numeric",'f.paye'=>"Boolean",'f.fk_statut'=>'Status','f.note'=>"Text",'f.note_public'=>"Text",'fd.description'=>"Text",'fd.price'=>"Numeric",'fd.tva_tx'=>"Numeric",'fd.qty'=>"Numeric",'fd.total_ht'=>"Numeric",'fd.total_tva'=>"Numeric",'fd.total_ttc'=>"Numeric",'fd.date_start'=>"Date",'fd.date_end'=>"Date",'fd.product_type'=>"Numeric",'fd.fk_product'=>'List:Product:label','p.ref'=>'Text','p.label'=>'Text','p.accountancy_code_sell'=>'Text'); + $this->export_entities_array[$r]=array('s.rowid'=>"company",'s.nom'=>'company','s.address'=>'company','s.zip'=>'company','s.town'=>'company','c.code'=>'company','s.phone'=>'company','s.siren'=>'company','s.siret'=>'company','s.ape'=>'company','s.idprof4'=>'company','s.code_compta'=>'company','s.code_compta_fournisseur'=>'company','s.tva_intra'=>'company','f.rowid'=>"invoice",'f.facnumber'=>"invoice",'f.datec'=>"invoice",'f.datef'=>"invoice",'f.date_lim_reglement'=>"invoice",'f.total'=>"invoice",'f.total_ttc'=>"invoice",'f.tva'=>"invoice",'f.paye'=>"invoice",'f.fk_statut'=>'invoice','f.note'=>"invoice",'f.note_public'=>"invoice",'fd.rowid'=>'invoice_line','fd.label'=>"invoice_line",'fd.description'=>"invoice_line",'fd.price'=>"invoice_line",'fd.total_ht'=>"invoice_line",'fd.total_tva'=>"invoice_line",'fd.total_ttc'=>"invoice_line",'fd.tva_tx'=>"invoice_line",'fd.qty'=>"invoice_line",'fd.date_start'=>"invoice_line",'fd.date_end'=>"invoice_line",'fd.product_type'=>'invoice_line','fd.fk_product'=>'product','p.ref'=>'product','p.label'=>'product','p.accountancy_code_sell'=>'product'); $this->export_dependencies_array[$r]=array('invoice_line'=>'fd.rowid','product'=>'fd.rowid'); // To add unique key if we ask a field of a child to avoid the DISTINCT to discard them $this->export_sql_start[$r]='SELECT DISTINCT '; From 2cdf621b755e260b6026398ab258020ce56ec4fe Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 5 Jul 2013 14:55:24 +0200 Subject: [PATCH 20/48] New: Provide relativepath as parameter --- htdocs/core/class/html.formfile.class.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/htdocs/core/class/html.formfile.class.php b/htdocs/core/class/html.formfile.class.php index 0d2e3163be6..9368864c7d0 100644 --- a/htdocs/core/class/html.formfile.class.php +++ b/htdocs/core/class/html.formfile.class.php @@ -495,7 +495,7 @@ class FormFile // Autre cas if ($modulepart == 'donation') { $relativepath = get_exdir($filename,2).$file["name"]; } if ($modulepart == 'export') { $relativepath = $file["name"]; } - + $out.= ""; // Show file name with link to download @@ -533,7 +533,11 @@ class FormFile $out.= ($param?'&'.$param:''); $out.= '">'.img_printer().''; } - if (is_object($hookmanager)) $out.= $hookmanager->executeHooks('formBuilddocLineOptions',$parameters,$file); + if (is_object($hookmanager)) + { + $parameters=array('socid'=>(isset($GLOBALS['socid'])?$GLOBALS['socid']:''),'id'=>(isset($GLOBALS['id'])?$GLOBALS['id']:''),'modulepart'=>$modulepart,'relativepath'=>$relativepath); + $out.= $hookmanager->executeHooks('formBuilddocLineOptions',$parameters,$file); + } } $out.= ''; From e7982120dffcba6bc1019463d2152b66c0544089 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 5 Jul 2013 21:17:35 +0200 Subject: [PATCH 21/48] Fix bug with php 5.2.4 --- htdocs/includes/tcpdf/include/tcpdf_fonts.php | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/htdocs/includes/tcpdf/include/tcpdf_fonts.php b/htdocs/includes/tcpdf/include/tcpdf_fonts.php index 593939571e7..da649e15e92 100644 --- a/htdocs/includes/tcpdf/include/tcpdf_fonts.php +++ b/htdocs/includes/tcpdf/include/tcpdf_fonts.php @@ -1840,6 +1840,16 @@ class TCPDF_FONTS { if ($isunicode) { // requires PCRE unicode support turned on $chars = preg_split("//u", $str, -1, PREG_SPLIT_NO_EMPTY); + // DOL_CHANGE_LDR - FIX BUG WITH PHP 5.2.4 + if (count(preg_split('//u', "\nx", -1, PREG_SPLIT_NO_EMPTY)) == 1) // If function preg_split is bugged + { + $tmp=array(); + $len = mb_strlen($str, "UTF-8"); + for ($i = 0; $i < $len; $i++) { + $tmp[] = mb_substr($str, $i, 1, "UTF-8"); + } + $chars=$tmp; + } $carr = array_map(array('self', 'uniord'), $chars); } else { $chars = str_split($str); From e83e44a012ad93d9c08a561c3a3961d1040b5b3c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 5 Jul 2013 21:57:51 +0200 Subject: [PATCH 22/48] Update doc --- README | 1 - README-FR | 1 - 2 files changed, 2 deletions(-) diff --git a/README b/README index 2b320d665c1..c6ac993180c 100644 --- a/README +++ b/README @@ -132,7 +132,6 @@ This is features that Dolibarr does not support completely yet: - No accountancy (only bank management). - Dolibarr manage one currency at once (mono-currency). - Dolibarr manage one company/foundation (mono-company). If you want to manage several companies or foundations, you must install several time the software (on same server or not). Another solution is to extend Dolibarr with the addon Module MultiCompany that allows to manage several companies in one Dolibarr instance (one database but with a logical isolation of datas). -- Does not support double VAT (Federal / provincial) for Canada. - Dolibarr does not contains Payroll module. - Tasks on module project can't have dependencies between each other. - Dolibarr does not include any Webmail. diff --git a/README-FR b/README-FR index cc69cfa6e8a..8b3900ff78c 100644 --- a/README-FR +++ b/README-FR @@ -122,7 +122,6 @@ Voici un liste de fonctionnalites pas encore gérées par Dolibarr: - Pas de compta analytique (uniquement gestion de trésorerie). - Dolibarr ne gère qu'une seule monnaie à la fois (mono-devise). - Dolibarr ne gère en standard qu'une société/institution/association mère (mono-société). Pour en gérer plusieurs (comme vos filiales), il faut, soit faire plusieurs installations de Dolibarr, soit installer le module MultiCompany qui permet de gérer n société/institutions/associations dans une seule instance par une isolation logique des données. -- Ne gère pas la double tva (Fédérale / provinciale) du canada. - Dolibarr ne contient pas de module de Gestion de la paie. - Les taches du module de gestion de projets n'ont pas de dépendance entre elle. - Dolibarr ne contient pas de Webmail. From 9be6dd8b1786dd7e4a7b6c2d339a9c989b0e9903 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 5 Jul 2013 23:10:47 +0200 Subject: [PATCH 23/48] Fix: Missing load --- htdocs/fourn/facture/fiche.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/htdocs/fourn/facture/fiche.php b/htdocs/fourn/facture/fiche.php index 09eee38e075..ba6b0b02061 100644 --- a/htdocs/fourn/facture/fiche.php +++ b/htdocs/fourn/facture/fiche.php @@ -47,7 +47,8 @@ if (!empty($conf->projet->enabled)) { $langs->load('bills'); $langs->load('suppliers'); -$langs->load('companies'); +$langs->load('companies'); +$langs->load('products'); $mesg=''; $errors=array(); @@ -1173,7 +1174,7 @@ if ($action == 'create') if (! empty($conf->projet->enabled)) { $formproject=new FormProjets($db); - + $langs->load('projects'); print ''.$langs->trans('Project').''; $formproject->select_projects(-1, $projectid, 'projectid'); From 7b5e0678dbe4c2c12006789fdaa5bee92801f8a6 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 7 Jul 2013 03:26:51 +0200 Subject: [PATCH 24/48] New: Make some changes to allow usage of alternative $dolibarr_main_url_root variables. Can now use several alternative path. Fix several bugs with all code. --- ChangeLog | 4 +- htdocs/admin/system/constall.php | 1 - htdocs/admin/system/dolibarr.php | 1 - htdocs/admin/tools/update.php | 10 +-- htdocs/comm/propal/class/propal.class.php | 24 +++++-- htdocs/commande/class/commande.class.php | 47 ++++++------ htdocs/compta/facture/class/facture.class.php | 3 +- htdocs/core/lib/functions.lib.php | 71 +++++++++++-------- htdocs/core/menus/standard/auguria.lib.php | 30 ++++---- htdocs/core/menus/standard/eldy.lib.php | 38 +++++----- htdocs/filefunc.inc.php | 14 ++-- .../fourn/class/fournisseur.facture.class.php | 3 +- htdocs/install/etape1.php | 1 + htdocs/install/etape5.php | 3 +- htdocs/install/inc.php | 8 +-- htdocs/langs/fr_FR/agenda.lang | 4 +- htdocs/main.inc.php | 2 +- htdocs/master.inc.php | 12 ++-- htdocs/support/inc.php | 4 -- test/phpunit/CoreTest.php | 2 - test/phpunit/FactureTestRounding.php | 22 ++++-- test/phpunit/PricesTest.php | 2 + 22 files changed, 165 insertions(+), 141 deletions(-) diff --git a/ChangeLog b/ChangeLog index 43dc578e49b..a3f9db52ac9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -44,7 +44,9 @@ For developers: - New: Add option MAIN_MOTD_SETUPPAGE to add a content onto setup page. Also content for MAIN_MOTD_SETUPPAGE, MAIN_MOTD_SETUPPAGE, MAIN_HOME now accept "|langfile" into translation key to use a specific language file. - +- New: Make some changes to allow usage of several alternative $dolibarr_main_url_root variables. + Fix also several bugs with old code. + ***** ChangeLog for 3.4 compared to 3.3.2 ***** For users: diff --git a/htdocs/admin/system/constall.php b/htdocs/admin/system/constall.php index 681b108e1b8..3386e3aa135 100644 --- a/htdocs/admin/system/constall.php +++ b/htdocs/admin/system/constall.php @@ -183,7 +183,6 @@ foreach($configfileparameters as $key) print ""; if ($newkey == 'dolibarr_main_db_pass') print preg_replace('/./i','*',${$newkey}); else if ($newkey == 'dolibarr_main_url_root' && preg_match('/__auto__/',${$newkey})) print ${$newkey}.' => '.constant('DOL_MAIN_URL_ROOT'); - else if ($newkey == 'dolibarr_main_url_root_alt' && preg_match('/__auto__/',${$newkey})) print ${$newkey}.' => '.constant('DOL_MAIN_URL_ROOT_ALT'); else print ${$newkey}; if ($newkey == 'dolibarr_main_url_root' && $newkey != DOL_MAIN_URL_ROOT) print ' (currently overwritten by autodetected value: '.DOL_MAIN_URL_ROOT.')'; print ""; diff --git a/htdocs/admin/system/dolibarr.php b/htdocs/admin/system/dolibarr.php index b32ddf573bd..59f3b3f3856 100644 --- a/htdocs/admin/system/dolibarr.php +++ b/htdocs/admin/system/dolibarr.php @@ -302,7 +302,6 @@ foreach($configfileparameters as $key => $value) print ""; if ($newkey == 'dolibarr_main_db_pass') print preg_replace('/./i','*',${$newkey}); else if ($newkey == 'dolibarr_main_url_root' && preg_match('/__auto__/',${$newkey})) print ${$newkey}.' => '.constant('DOL_MAIN_URL_ROOT'); - else if ($newkey == 'dolibarr_main_url_root_alt' && preg_match('/__auto__/',${$newkey})) print ${$newkey}.' => '.constant('DOL_MAIN_URL_ROOT_ALT'); else print ${$newkey}; if ($newkey == 'dolibarr_main_url_root' && $newkey != DOL_MAIN_URL_ROOT) print ' (currently overwritten by autodetected value: '.DOL_MAIN_URL_ROOT.')'; print ""; diff --git a/htdocs/admin/tools/update.php b/htdocs/admin/tools/update.php index 3aae9b0f009..133dd247459 100644 --- a/htdocs/admin/tools/update.php +++ b/htdocs/admin/tools/update.php @@ -75,7 +75,7 @@ if (GETPOST('action','alpha')=='install') $result=dol_move_uploaded_file($_FILES['fileinstall']['tmp_name'],$newfile,1,0,$_FILES['fileinstall']['error']); if ($result > 0) { - $documentrootalt=DOL_DOCUMENT_ROOT_ALT; + $documentrootalt=DOL_DOCUMENT_ROOT.'/extensions'; $result=dol_uncompress($newfile,$documentrootalt); if (! empty($result['error'])) { @@ -95,7 +95,7 @@ if (GETPOST('action','alpha')=='install') * View */ -$dirins=DOL_DOCUMENT_ROOT_ALT; +$dirins=DOL_DOCUMENT_ROOT.'/extensions'; $dirins_ok=(is_dir($dirins)); $wikihelp='EN:Installation_-_Upgrade|FR:Installation_-_Mise_à_jour|ES:Instalación_-_Actualización'; @@ -141,7 +141,7 @@ print ''.$langs->trans("StepNb",3).': '; print $langs->trans("UnpackPackageInDolibarrRoot",$dolibarrroot).'
'; if (! empty($conf->global->MAIN_ONLINE_INSTALL_MODULE)) { - if ($dirins_ok && $dirins != 'DOL_DOCUMENT_ROOT_ALT') + if ($dirins_ok) { print '
'; print ''; @@ -151,8 +151,8 @@ if (! empty($conf->global->MAIN_ONLINE_INSTALL_MODULE)) } else { - $message=info_admin($langs->trans("NotExistsDirect").$langs->trans("InfDirAlt").$langs->trans("InfDirExample")); - print $message; + $message=info_admin($langs->trans("NotExistsDirect",$dirins).$langs->trans("InfDirAlt").$langs->trans("InfDirExample")); + print '
'.$message.'
'; } } else diff --git a/htdocs/comm/propal/class/propal.class.php b/htdocs/comm/propal/class/propal.class.php index a6f3647b45e..77d2b9ecd66 100644 --- a/htdocs/comm/propal/class/propal.class.php +++ b/htdocs/comm/propal/class/propal.class.php @@ -2468,22 +2468,32 @@ class Propal extends CommonObject global $conf, $db, $langs; $langs->load("propal"); - $dir = DOL_DOCUMENT_ROOT . "/core/modules/propale/"; - if (! empty($conf->global->PROPALE_ADDON)) { - $file = $conf->global->PROPALE_ADDON.".php"; + $mybool=false; - // Chargement de la classe de numerotation + $file = $conf->global->PROPALE_ADDON.".php"; $classname = $conf->global->PROPALE_ADDON; - require_once $dir.$file; + + // Include file with class + foreach ($conf->file->dol_document_root as $dirroot) + { + $dir = $dirroot."/core/modules/propale/"; + // Load file with numbering class (if found) + $mybool|=@include_once $dir.$file; + } + + if (! $mybool) + { + dol_print_error('',"Failed to include file ".$file); + return ''; + } $obj = new $classname(); - $numref = ""; $numref = $obj->getNextValue($soc,$this); - if ( $numref != "") + if ($numref != "") { return $numref; } diff --git a/htdocs/commande/class/commande.class.php b/htdocs/commande/class/commande.class.php index 8a2307aca81..abf1bb51db3 100644 --- a/htdocs/commande/class/commande.class.php +++ b/htdocs/commande/class/commande.class.php @@ -129,36 +129,39 @@ class Commande extends CommonOrder global $db, $langs, $conf; $langs->load("order"); - $dir = DOL_DOCUMENT_ROOT . "/core/modules/commande"; - if (! empty($conf->global->COMMANDE_ADDON)) { - $file = $conf->global->COMMANDE_ADDON.".php"; + $mybool=false; - // Chargement de la classe de numerotation + $file = $conf->global->COMMANDE_ADDON.".php"; $classname = $conf->global->COMMANDE_ADDON; - $result=include_once $dir.'/'.$file; - if ($result) - { - $obj = new $classname(); - $numref = ""; - $numref = $obj->getNextValue($soc,$this); + // Include file with class + foreach ($conf->file->dol_document_root as $dirroot) + { + $dir = $dirroot."/core/modules/commande/"; + // Load file with numbering class (if found) + $mybool|=@include_once $dir.$file; + } - if ( $numref != "") - { - return $numref; - } - else - { - dol_print_error($db,get_class($this)."::getNextNumRef ".$obj->error); - return ""; - } + if (! $mybool) + { + dol_print_error('',"Failed to include file ".$file); + return ''; + } + + $obj = new $classname(); + $numref = ""; + $numref = $obj->getNextValue($soc,$this); + + if ($numref != "") + { + return $numref; } else - { - print $langs->trans("Error")." ".$langs->trans("Error_COMMANDE_ADDON_NotDefined"); - return ""; + { + dol_print_error($db,get_class($this)."::getNextNumRef ".$obj->error); + return ""; } } else diff --git a/htdocs/compta/facture/class/facture.class.php b/htdocs/compta/facture/class/facture.class.php index 1e71d781e7f..53e7178ce6d 100644 --- a/htdocs/compta/facture/class/facture.class.php +++ b/htdocs/compta/facture/class/facture.class.php @@ -2540,11 +2540,10 @@ class Facture extends CommonInvoice } $obj = new $classname(); - $numref = ""; $numref = $obj->getNumRef($soc,$this,$mode); - if ( $numref != "") + if ($numref != "") { return $numref; } diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index fbbf6bbdc1d..56bdb1207c7 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -244,21 +244,30 @@ function dol_include_once($relpath, $classname='') /** - * Return path of url or filesystem. Return default_root or alternate root if file_exist fails + * Return path of url or filesystem. Return alternate root if exists * - * @param string $path Relative path to file (if mode=0, ie: mydir/myfile, ../myfile, ...) or relative url (if mode=1). + * @param string $path Relative path to file (if mode=0) or relative url (if mode=1). Ie: mydir/myfile, ../myfile * @param int $type 0=Used for a Filesystem path, 1=Used for an URL path (output relative), 2=Used for an URL path (output full path) - * @return string Full filsystem path (if mode=0), Full url path (if mode=1) + * @return string Full filesystem path (if mode=0), Full url path (if mode=1) */ function dol_buildpath($path, $type=0) { + global $conf; + + $path=preg_replace('/^\//','',$path); + if (empty($type)) // For a filesystem path { - $res = DOL_DOCUMENT_ROOT.$path; // Standard value - if (defined('DOL_DOCUMENT_ROOT_ALT') && DOL_DOCUMENT_ROOT_ALT) // We check only if alternate feature is used - { - if (! file_exists(DOL_DOCUMENT_ROOT.$path)) $res = DOL_DOCUMENT_ROOT_ALT.$path; - } + $res = DOL_DOCUMENT_ROOT.'/'.$path; // Standard value + foreach ($conf->file->dol_document_root as $key => $dirroot) // ex: array(["main"]=>"/home/main/htdocs", ["alt0"]=>"/home/dirmod/htdocs", ...) + { + if ($key == 'main') continue; + if (file_exists($dirroot.'/'.$path)) + { + $res=$dirroot.'/'.$path; + break; + } + } } else // For an url path { @@ -266,29 +275,23 @@ function dol_buildpath($path, $type=0) // Note that trying to know if a file on disk exist by forging path on disk from url // works only for some web server and some setup. This is bugged when // using proxy, rewriting, virtual path, etc... - if ($type == 1) + $res=''; + if ($type == 1) $res = DOL_URL_ROOT.'/'.$path; // Standard value + if ($type == 2) $res = DOL_MAIN_URL_ROOT.'/'.$path; // Standard value + foreach ($conf->file->dol_document_root as $key => $dirroot) // ex: array(["main"]=>"/home/main/htdocs", ["alt0"]=>"/home/dirmod/htdocs", ...) { - $res = DOL_URL_ROOT.$path; // Standard value - if (defined('DOL_URL_ROOT_ALT') && DOL_URL_ROOT_ALT) // We check only if alternate feature is used + if ($key == 'main') continue; + preg_match('/^([^\?]+(\.css\.php|\.css|\.js\.php|\.js|\.png|\.jpg|\.php)?)/i',$path,$regs); // Take part before '?' + if (! empty($regs[1])) { - preg_match('/^([^\?]+(\.css\.php|\.css|\.js\.php|\.js|\.png|\.jpg|\.php)?)/i',$path,$regs); // Take part before '?' - if (! empty($regs[1])) - { - if (! file_exists(DOL_DOCUMENT_ROOT.$regs[1])) $res = DOL_URL_ROOT_ALT.$path; + //print $key.'-'.$dirroot.'/'.$path.'-'.$conf->file->dol_url_root[$type].'
'."\n"; + if (file_exists($dirroot.'/'.$path)) + { + if ($type == 1) $res=DOL_URL_ROOT.$conf->file->dol_url_root[$key].'/'.$path; + if ($type == 2) $res=DOL_MAIN_URL_ROOT.$conf->file->dol_url_root[$key].'/'.$path; + break; } - } - } - else if ($type == 2) - { - $res = DOL_MAIN_URL_ROOT.$path; // Standard value - if (defined('DOL_URL_ROOT_ALT') && DOL_URL_ROOT_ALT) // We check only if alternate feature is used - { - preg_match('/^([^\?]+(\.css\.php|\.css|\.js\.php|\.js|\.png|\.jpg|\.php)?)/i',$path,$regs); // Take part before '?' - if (! empty($regs[1])) - { - if (! file_exists(DOL_DOCUMENT_ROOT.$regs[1])) $res = DOL_MAIN_URL_ROOT_ALT.$path; - } - } + } } } @@ -1714,8 +1717,16 @@ function img_picto($alt, $picto, $options = '', $pictoisfullpath = false, $srcon } // Clean parameters if (! preg_match('/(\.png|\.gif)$/i',$picto)) $picto .= '.png'; - // If img file is not into standard path, we use alternate path (Avoid using DOL_URL_ROOT_ALT for performane) - if (defined('DOL_URL_ROOT_ALT') && DOL_URL_ROOT_ALT && ! file_exists(DOL_DOCUMENT_ROOT.'/'.$path.'/img/'.$picto)) $url = DOL_URL_ROOT_ALT; + // If alt path are defined, define url where img file is, according to physical path + foreach ($conf->file->dol_document_root as $type => $dirroot) // ex: array(["main"]=>"/home/maindir/htdocs", ["alt0"]=>"/home/moddir/htdocs", ...) + { + if ($type == 'main') continue; + if (file_exists($dirroot.'/'.$path.'/img/'.$picto)) + { + $url=$conf->file->dol_url_root[$type]; + break; + } + } // $url is '' or '/custom', $path is current theme or $fullpathpicto = $url.'/'.$path.'/img/'.$picto; diff --git a/htdocs/core/menus/standard/auguria.lib.php b/htdocs/core/menus/standard/auguria.lib.php index 37179df0f75..204b43f97e0 100644 --- a/htdocs/core/menus/standard/auguria.lib.php +++ b/htdocs/core/menus/standard/auguria.lib.php @@ -63,16 +63,14 @@ function print_auguria_menu($db,$atarget,$type_user,&$tabMenu,&$menu,$noout=0) $url = $shorturl = $newTabMenu[$i]['url']; if (! preg_match("/^(http:\/\/|https:\/\/)/i",$newTabMenu[$i]['url'])) { - $param=''; - if (! preg_match('/mainmenu/i',$url) || ! preg_match('/leftmenu/i',$url)) - { - if (! preg_match('/\?/',$url)) $param.='?'; - else $param.='&'; - $param.='mainmenu='.$newTabMenu[$i]['mainmenu'].'&leftmenu='; - } + $tmp=explode('?',$newTabMenu[$i]['url'],2); + $url = $shorturl = $tmp[0]; + $param = (isset($tmp[1])?$tmp[1]:''); + + if (! preg_match('/mainmenu/i',$url) || ! preg_match('/leftmenu/i',$url)) $param.=($param?'&':'').'mainmenu='.$newTabMenu[$i]['mainmenu'].'&leftmenu='; //$url.="idmenu=".$newTabMenu[$i]['rowid']; // Already done by menuLoad - $url=dol_buildpath($url,1).$param; - $shorturl = $newTabMenu[$i]['url'].$param; + $url = dol_buildpath($url,1).($param?'?'.$param:''); + $shorturl = $shorturl.($param?'?'.$param:''); } $url=preg_replace('/__LOGIN__/',$user->login,$url); $shorturl=preg_replace('/__LOGIN__/',$user->login,$shorturl); @@ -246,15 +244,15 @@ function print_left_auguria_menu($db,$menu_array_before,$menu_array_after,&$tabM $sql.= " WHERE entity = ".$conf->entity; $sql.= " AND clos = 0"; $sql.= " ORDER BY label"; - + $resql = $db->query($sql); if ($resql) { $numr = $db->num_rows($resql); $i = 0; - + if ($numr > 0) $newmenu->add('/compta/bank/index.php',$langs->trans("BankAccounts"),0,$user->rights->banque->lire); - + while ($i < $numr) { $objp = $db->fetch_object($resql); @@ -281,14 +279,14 @@ function print_left_auguria_menu($db,$menu_array_before,$menu_array_after,&$tabM if (! empty($conf->global->$paramkey)) { $link="/ftp/index.php?idmenu=".$_SESSION["idmenu"]."&numero_ftp=".$i; - + $newmenu->add($link, dol_trunc($conf->global->$paramkey,24)); } $i++; } - } + } + - // Build final $menu_array = $menu_array_before +$newmenu->liste + $menu_array_after //var_dump($menu_array_before);exit; //var_dump($menu_array_after);exit; @@ -346,7 +344,7 @@ function print_left_auguria_menu($db,$menu_array_before,$menu_array_after,&$tabM } print ''."\n"; - + // Menu niveau 0 if ($menu_array[$i]['level'] == 0) { diff --git a/htdocs/core/menus/standard/eldy.lib.php b/htdocs/core/menus/standard/eldy.lib.php index 2f870665bf2..7db79024c62 100644 --- a/htdocs/core/menus/standard/eldy.lib.php +++ b/htdocs/core/menus/standard/eldy.lib.php @@ -192,7 +192,7 @@ function print_eldy_menu($db,$atarget,$type_user,&$tabMenu,&$menu,$noout=0) if (empty($noout)) print_end_menu_entry($showmode); $menu->add('/projet/index.php?mainmenu=project&leftmenu=', $langs->trans("Projects"), 0, $showmode, $atarget, "project", ''); } - + // HRM $tmpentry=array('enabled'=>(! empty($conf->holiday->enabled)), 'perms'=>(! empty($user->rights->holiday->write)), @@ -201,19 +201,19 @@ function print_eldy_menu($db,$atarget,$type_user,&$tabMenu,&$menu,$noout=0) if ($showmode) { $langs->load("holiday"); - + $classname=""; if ($_SESSION["mainmenu"] && $_SESSION["mainmenu"] == "hrm") { $classname='class="tmenusel"'; $_SESSION['idmenu']=''; } else $classname = 'class="tmenu"'; $idsel='hrm'; - + if (empty($noout)) print_start_menu_entry($idsel,$classname,$showmode); if (empty($noout)) print_text_menu_entry($langs->trans("HRM"), $showmode, DOL_URL_ROOT.'/holiday/index.php?mainmenu=hrm&leftmenu=', $id, $idsel, $classname, $atarget); if (empty($noout)) print_end_menu_entry($showmode); $menu->add('/holiday/index.php?mainmenu=holiday&leftmenu=', $langs->trans("HRM"), 0, $showmode, $atarget, "hrm", ''); } - - + + // Tools $tmpentry=array('enabled'=>(! empty($conf->mailing->enabled) || ! empty($conf->export->enabled) || ! empty($conf->import->enabled)), @@ -289,16 +289,14 @@ function print_eldy_menu($db,$atarget,$type_user,&$tabMenu,&$menu,$noout=0) $url = $shorturl = $newTabMenu[$i]['url']; if (! preg_match("/^(http:\/\/|https:\/\/)/i",$newTabMenu[$i]['url'])) { - $param=''; - if (! preg_match('/mainmenu/i',$url) || ! preg_match('/leftmenu/i',$url)) - { - if (! preg_match('/\?/',$url)) $param.='?'; - else $param.='&'; - $param.='mainmenu='.$newTabMenu[$i]['mainmenu'].'&leftmenu='; - } + $tmp=explode('?',$newTabMenu[$i]['url'],2); + $url = $shorturl = $tmp[0]; + $param = (isset($tmp[1])?$tmp[1]:''); + + if (! preg_match('/mainmenu/i',$url) || ! preg_match('/leftmenu/i',$url)) $param.=($param?'&':'').'mainmenu='.$newTabMenu[$i]['mainmenu'].'&leftmenu='; //$url.="idmenu=".$newTabMenu[$i]['rowid']; // Already done by menuLoad - $url = dol_buildpath($url,1).$param; - $shorturl = $newTabMenu[$i]['url'].$param; + $url = dol_buildpath($url,1).($param?'?'.$param:''); + $shorturl = $shorturl.($param?'?'.$param:''); } $url=preg_replace('/__LOGIN__/',$user->login,$url); $shorturl=preg_replace('/__LOGIN__/',$user->login,$shorturl); @@ -1099,7 +1097,7 @@ function print_left_eldy_menu($db,$menu_array_before,$menu_array_after,&$tabMenu $newmenu->add("/projet/activity/list.php", $langs->trans("NewTimeSpent"), 1, $user->rights->projet->creer && $user->rights->projet->creer); } } - + /* * Menu HRM */ @@ -1108,14 +1106,14 @@ function print_left_eldy_menu($db,$menu_array_before,$menu_array_after,&$tabMenu if (! empty($conf->holiday->enabled)) { $langs->load("holiday"); - + // HRM: Holiday module $newmenu->add("/holiday/index.php?&leftmenu=hrm", $langs->trans("CPTitreMenu"), 0, $user->rights->holiday->write, '', $mainmenu, 'hrm'); $newmenu->add("/holiday/fiche.php?&action=request", $langs->trans("MenuAddCP"), 1,$user->rights->holiday->write); $newmenu->add("/holiday/define_holiday.php?&action=request", $langs->trans("MenuConfCP"), 1, $user->rights->holiday->define_holiday); $newmenu->add("/holiday/view_log.php?&action=request", $langs->trans("MenuLogCP"), 1, $user->rights->holiday->view_log); $newmenu->add("/holiday/month_report.php?&action=request", $langs->trans("MenuReportMonth"), 1, $user->rights->holiday->view_log); - + } } @@ -1302,7 +1300,11 @@ function print_left_eldy_menu($db,$menu_array_before,$menu_array_after,&$tabMenu } // For external modules - $url = dol_buildpath($menu_array[$i]['url'], 1); + $tmp=explode('?',$menu_array[$i]['url'],2); + $url = $tmp[0]; + $param = (isset($tmp[1])?$tmp[1]:''); + $url = dol_buildpath($url,1).($param?'?'.$param:''); + $url=preg_replace('/__LOGIN__/',$user->login,$url); $url=preg_replace('/__USERID__/',$user->id,$url); diff --git a/htdocs/filefunc.inc.php b/htdocs/filefunc.inc.php index abdb1006266..483b71f3e07 100755 --- a/htdocs/filefunc.inc.php +++ b/htdocs/filefunc.inc.php @@ -145,10 +145,6 @@ if (empty($dolibarr_main_data_root)) define('DOL_CLASS_PATH', 'class/'); // Filesystem path to class dir (defined only for some code that want to be compatible with old versions without this parameter) define('DOL_DATA_ROOT', $dolibarr_main_data_root); // Filesystem data (documents) define('DOL_DOCUMENT_ROOT', $dolibarr_main_document_root); // Filesystem core php (htdocs) -if (! empty($dolibarr_main_document_root_alt)) -{ - define('DOL_DOCUMENT_ROOT_ALT', $dolibarr_main_document_root_alt); // Filesystem paths to alternate core php (alternate htdocs) -} // Define DOL_MAIN_URL_ROOT and DOL_URL_ROOT $tmp=''; $found=0; @@ -175,11 +171,12 @@ else $tmp='http'.(((empty($_SERVER["HTTPS"]) || $_SERVER["HTTPS"] != 'on') && (e if (! empty($dolibarr_main_force_https)) $tmp=preg_replace('/^http:/i','https:',$tmp); define('DOL_MAIN_URL_ROOT', $tmp); // URL absolute root (https://sss/dolibarr, ...) $uri=preg_replace('/^http(s?):\/\//i','',constant('DOL_MAIN_URL_ROOT')); // $uri contains url without http* -$suburi = strstr($uri, '/'); // $suburi contains url without domain +$suburi = strstr($uri, '/'); // $suburi contains url without domain:port if ($suburi == '/') $suburi = ''; // If $suburi is /, it is now '' define('DOL_URL_ROOT', $suburi); // URL relative root ('', '/dolibarr', ...) -// Define DOL_MAIN_URL_ROOT_ALT and DOL_URL_ROOT_ALT +/* +// Define DOL_MAIN_URL_ROOT_ALT and DOL_URL_ROOT_ALT (deprecated) if (! empty($dolibarr_main_url_root_alt)) { $altpart=str_replace($dolibarr_main_url_root,'',$dolibarr_main_url_root_alt); @@ -188,12 +185,13 @@ if (! empty($dolibarr_main_url_root_alt)) //$tmp_alt=$dolibarr_main_url_root_alt; define('DOL_MAIN_URL_ROOT_ALT', $tmp_alt); // URL absolute root (https://sss/dolibarr/custom, ...) $uri=preg_replace('/^http(s?):\/\//i','',constant('DOL_MAIN_URL_ROOT_ALT')); // $uri contains url without http* - $suburi = strstr($uri, '/'); // $suburi contains url without domain + $suburi = strstr($uri, '/'); // $suburi contains url without domain:port if ($suburi == '/') $suburi = ''; // If $suburi is /, it is now '' define('DOL_URL_ROOT_ALT', $suburi); // URL relative root ('', '/dolibarr/custom', ...) } +*/ -//print DOL_URL_ROOT.'-'.DOL_URL_ROOT_ALT; +//print DOL_URL_ROOT; // Define prefix MAIN_DB_PREFIX define('MAIN_DB_PREFIX',$dolibarr_main_db_prefix); diff --git a/htdocs/fourn/class/fournisseur.facture.class.php b/htdocs/fourn/class/fournisseur.facture.class.php index 19912e3f58f..e62832ec692 100644 --- a/htdocs/fourn/class/fournisseur.facture.class.php +++ b/htdocs/fourn/class/fournisseur.facture.class.php @@ -1422,11 +1422,10 @@ class FactureFournisseur extends CommonInvoice } $obj = new $classname(); - $numref = ""; $numref = $obj->getNumRef($soc,$this,$mode); - if ( $numref != "") + if ($numref != "") { return $numref; } diff --git a/htdocs/install/etape1.php b/htdocs/install/etape1.php index 486748f92a7..83dd849d9a0 100644 --- a/htdocs/install/etape1.php +++ b/htdocs/install/etape1.php @@ -359,6 +359,7 @@ if (! $error && $db->connected && $action == "set") $dir[5] = $main_data_dir."/ficheinter"; $dir[6] = $main_data_dir."/produit"; $dir[7] = $main_data_dir."/doctemplates"; + $dir[7] = $main_data_dir."/extensions"; // Boucle sur chaque repertoire de dir[] pour les creer s'ils nexistent pas $num=count($dir); diff --git a/htdocs/install/etape5.php b/htdocs/install/etape5.php index 08651603e61..61fde5a1215 100644 --- a/htdocs/install/etape5.php +++ b/htdocs/install/etape5.php @@ -145,7 +145,7 @@ if ($action == "set" || empty($action) || preg_match('/upgrade/i',$action)) // Create the global $hookmanager object include_once DOL_DOCUMENT_ROOT.'/core/class/hookmanager.class.php'; $hookmanager=new HookManager($db); - + $ok = 0; // If first install @@ -225,7 +225,6 @@ if ($action == "set" || empty($action) || preg_match('/upgrade/i',$action)) if (! empty($force_install_module)) { if (! defined('DOL_DOCUMENT_ROOT') && ! empty($dolibarr_main_document_root)) define('DOL_DOCUMENT_ROOT',$dolibarr_main_document_root); - if (! defined('DOL_DOCUMENT_ROOT_ALT') && ! empty($dolibarr_main_document_root_alt)) define('DOL_DOCUMENT_ROOT_ALT',$dolibarr_main_document_root_alt); $tmparray=explode(',',$force_install_module); foreach ($tmparray as $modtoactivate) diff --git a/htdocs/install/inc.php b/htdocs/install/inc.php index 7d4a22fffa2..081204415b2 100644 --- a/htdocs/install/inc.php +++ b/htdocs/install/inc.php @@ -133,10 +133,6 @@ define('MAIN_DB_PREFIX',(isset($dolibarr_main_db_prefix)?$dolibarr_main_db_prefi define('DOL_CLASS_PATH', 'class/'); // Filsystem path to class dir define('DOL_DATA_ROOT',(isset($dolibarr_main_data_root)?$dolibarr_main_data_root:'')); -if (! empty($dolibarr_main_document_root_alt)) -{ - define('DOL_DOCUMENT_ROOT_ALT', $dolibarr_main_document_root_alt); // Filesystem paths to alternate core php (alternate htdocs) -} define('DOL_MAIN_URL_ROOT', (isset($dolibarr_main_url_root)?$dolibarr_main_url_root:'')); // URL relative root $uri=preg_replace('/^http(s?):\/\//i','',constant('DOL_MAIN_URL_ROOT')); // $uri contains url without http* $suburi = strstr($uri, '/'); // $suburi contains url without domain @@ -323,7 +319,7 @@ function conf($dolibarr_main_document_root) { throw new Exception('Missing log handler file '.$handler.'.php'); } - + require_once $file; $loghandlerinstance = new $handler(); if (!$loghandlerinstance instanceof LogHandlerInterface) @@ -333,7 +329,7 @@ function conf($dolibarr_main_document_root) if (empty($conf->loghandlers[$handler])) $conf->loghandlers[$handler]=$loghandlerinstance; } - + return 1; } diff --git a/htdocs/langs/fr_FR/agenda.lang b/htdocs/langs/fr_FR/agenda.lang index 20a8141c619..f0029da19e4 100644 --- a/htdocs/langs/fr_FR/agenda.lang +++ b/htdocs/langs/fr_FR/agenda.lang @@ -19,8 +19,8 @@ EventOnFullDay=Événement sur la(les) journée(s) SearchAnAction= Rechercher un événement/tâche MenuToDoActions= Événements incomplets MenuDoneActions= Événements terminés -MenuToDoMyActions= Mes événements incomplets -MenuDoneMyActions= Mes événements terminés +MenuToDoMyActions= Mes événem. incomplets +MenuDoneMyActions= Mes événem. terminés ListOfEvents= Liste des événements Dolibarr ActionsAskedBy=Événements enregistrés par ActionsToDoBy=Événements affectés à diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php index e4a22c97285..a9ca7e4c2f7 100644 --- a/htdocs/main.inc.php +++ b/htdocs/main.inc.php @@ -1038,7 +1038,7 @@ function top_htmlhead($head, $title='', $disablejs=0, $disablehead=0, $arrayofjs $filescss=(array) $filescss; // To be sure filecss is an array foreach($filescss as $cssfile) { - // cssfile is a relative path + // cssfile is a relative path print ''."\n".'assertEquals(DOL_URL_ROOT,$expectedresult); return true; diff --git a/test/phpunit/FactureTestRounding.php b/test/phpunit/FactureTestRounding.php index 446b6893ae0..b90f67171d2 100644 --- a/test/phpunit/FactureTestRounding.php +++ b/test/phpunit/FactureTestRounding.php @@ -130,6 +130,8 @@ class FactureTestRounding extends PHPUnit_Framework_TestCase $langs=$this->savlangs; $db=$this->savdb; + $conf->global->MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND=0; + $localobject=new Facture($this->savdb); $localobject->initAsSpecimen(); $localobject->lines=array(); @@ -171,6 +173,8 @@ class FactureTestRounding extends PHPUnit_Framework_TestCase $langs=$this->savlangs; $db=$this->savdb; + $conf->global->MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND=0; + $localobject=new Facture($this->savdb); $localobject->initAsSpecimen(); $localobject->lines=array(); @@ -210,7 +214,8 @@ class FactureTestRounding extends PHPUnit_Framework_TestCase $db=$this->savdb; // With option MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND = 0 - $conf->global->MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND=0; + $conf->global->MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND=0; + $localobject1a=new Facture($this->savdb); $localobject1a->initAsSpecimen('nolines'); $facid=$localobject1a->create($user); @@ -221,7 +226,8 @@ class FactureTestRounding extends PHPUnit_Framework_TestCase $this->assertEquals(115.43, $localobject1a->total_ttc); // With option MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND = 1 - $conf->global->MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND=1; + $conf->global->MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND=1; + $localobject1b=new Facture($this->savdb); $localobject1b->initAsSpecimen('nolines'); $facid=$localobject1b->create($user); @@ -249,7 +255,8 @@ class FactureTestRounding extends PHPUnit_Framework_TestCase $db=$this->savdb; // With option MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND = 0 - $conf->global->MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND=0; + $conf->global->MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND=0; + $localobject2=new Facture($this->savdb); $localobject2->initAsSpecimen('nolines'); $facid=$localobject2->create($user); @@ -262,7 +269,8 @@ class FactureTestRounding extends PHPUnit_Framework_TestCase $this->assertEquals(115.44, $localobject2->total_ttc); // With option MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND = 1 - $conf->global->MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND=1; + $conf->global->MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND=1; + $localobject2=new Facture($this->savdb); $localobject2->initAsSpecimen('nolines'); $facid=$localobject2->create($user); @@ -292,7 +300,8 @@ class FactureTestRounding extends PHPUnit_Framework_TestCase $db=$this->savdb; // With option MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND = 0 - $conf->global->MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND=0; + $conf->global->MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND=0; + $localobject3=new Facture($this->savdb); $localobject3->initAsSpecimen('nolines'); $facid=$localobject3->create($user); @@ -307,7 +316,8 @@ class FactureTestRounding extends PHPUnit_Framework_TestCase $this->assertEquals(115.45, $localobject3->total_ttc); // With option MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND = 1 - $conf->global->MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND=1; + $conf->global->MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND=1; + $localobject3=new Facture($this->savdb); $localobject3->initAsSpecimen('nolines'); $facid=$localobject3->create($user); diff --git a/test/phpunit/PricesTest.php b/test/phpunit/PricesTest.php index ecea4b517e1..57a95b0b40a 100755 --- a/test/phpunit/PricesTest.php +++ b/test/phpunit/PricesTest.php @@ -200,6 +200,8 @@ class PricesTest extends PHPUnit_Framework_TestCase $this->savlangs=$langs; $this->savdb=$db; + $conf->global->MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND=0; + // Two lines of 1.24 give 2.48 HT and 2.72 TTC with standard vat rounding mode $localobject=new Facture($this->savdb); $localobject->initAsSpecimen('nolines'); From cbc0570bc3d0c3efd59eccb187d6b8ce3fa47b2b Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 7 Jul 2013 03:33:10 +0200 Subject: [PATCH 25/48] Update exemple --- htdocs/conf/conf.php.example | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/htdocs/conf/conf.php.example b/htdocs/conf/conf.php.example index fdc28d2c1fc..a23c2f9cfbe 100644 --- a/htdocs/conf/conf.php.example +++ b/htdocs/conf/conf.php.example @@ -38,20 +38,20 @@ $dolibarr_main_document_root=''; // dolibarr_main_url_root_alt // This parameter defines the alternative URL of your Dolibarr. -// It must link to a secondary directory htdocs. +// It must link to some other secondary htdocs directories, separated by a coma. // Examples: -// $dolibarr_main_url_root_alt='http://localhost/custom'; -// $dolibarr_main_url_root_alt='http://mydolibarrvirtualhost/custom'; -// $dolibarr_main_url_root_alt='http://myserver/dolibarr/htdocs/custom'; +// $dolibarr_main_url_root_alt='http://localhost/extensions'; +// $dolibarr_main_url_root_alt='http://mydolibarrvirtualhost/extensions1,http://mydolibarrvirtualhost/extensions2'; // $dolibarr_main_url_root_alt=''; // dolibarr_main_document_root_alt // This parameter contains absolute alternative file system directory of Dolibarr +// It must link to url to other secondary htdocs directories, separated by a coma. // Examples: -// $dolibarr_main_document_root_alt='/var/www/dolibarr/htdocs/custom'; -// $dolibarr_main_document_root_alt='C:/My web sites/dolibarr/htdocs/custom'; +// $dolibarr_main_document_root_alt='/var/www/dolibarr/htdocs/extensions'; +// $dolibarr_main_document_root_alt='C:/My web sites/dolibarr/htdocs/extensions1,C:/My web sites/dolibarr/htdocs/extensions2'; // $dolibarr_main_document_root_alt=''; From 2bc650bf61867b9cd37214b6a9a0bbc926d20d65 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 7 Jul 2013 13:14:32 +0200 Subject: [PATCH 26/48] Qual: Remove tons of codesniffer errors and warnings. --- htdocs/adherents/class/adherent.class.php | 12 ++--- htdocs/contrat/class/contrat.class.php | 2 +- htdocs/core/class/commoninvoice.class.php | 3 ++ htdocs/core/class/commonobject.class.php | 7 +-- htdocs/core/class/dolprintipp.class.php | 4 +- htdocs/core/class/html.form.class.php | 18 +++---- htdocs/core/class/html.formprojet.class.php | 38 +++++++------- htdocs/core/class/stats.class.php | 3 +- htdocs/core/lib/geturl.lib.php | 7 +-- htdocs/core/tpl/login.tpl.php | 2 +- htdocs/core/tpl/passwordforgotten.tpl.php | 2 +- htdocs/fichinter/class/fichinter.class.php | 14 +++--- .../canvas/product/tpl/card_create.tpl.php | 5 +- .../canvas/product/tpl/card_edit.tpl.php | 5 +- htdocs/projet/class/project.class.php | 49 +++++++++---------- test/phpunit/AdherentTest.php | 7 +-- test/phpunit/FactureTestRounding.php | 24 ++++----- 17 files changed, 107 insertions(+), 95 deletions(-) diff --git a/htdocs/adherents/class/adherent.class.php b/htdocs/adherents/class/adherent.class.php index 4ae6f7c6820..da94fa3ac02 100644 --- a/htdocs/adherents/class/adherent.class.php +++ b/htdocs/adherents/class/adherent.class.php @@ -268,7 +268,7 @@ class Adherent extends CommonObject // Clean parameters $this->import_key = trim($this->import_key); - + // Check parameters if (! empty($conf->global->ADHERENT_MAIL_REQUIRED) && ! isValidEMail($this->email)) { @@ -1006,18 +1006,18 @@ class Adherent extends CommonObject * Method to load member from its name * * @param string $firstname Firstname - ** @param string $lastname Lastname + * @param string $lastname Lastname * @return void */ function fetch_name($firstname,$lastname) { global $conf; - + $sql = "SELECT rowid FROM ".MAIN_DB_PREFIX."adherent"; $sql.= " WHERE firstname='".$this->db->escape($firstname)."'"; $sql.= " AND lastname='".$this->db->escape($lastname)."'"; $sql.= " AND entity = ".$conf->entity; - + $resql=$this->db->query($sql); if ($resql) { @@ -1032,7 +1032,7 @@ class Adherent extends CommonObject dol_print_error($this->db); } } - + /** * Load member from database * @@ -1541,7 +1541,7 @@ class Adherent extends CommonObject { global $langs; $langs->load("dict"); - + $code=(! empty($this->civilite_id)?$this->civilite_id:(! empty($this->civility_id)?$this->civility_id:'')); if (empty($code)) return ''; return $langs->getLabelFromKey($this->db, "Civility".$code, "c_civilite", "code", "civilite", $code); diff --git a/htdocs/contrat/class/contrat.class.php b/htdocs/contrat/class/contrat.class.php index 58670f48676..4575f43592d 100644 --- a/htdocs/contrat/class/contrat.class.php +++ b/htdocs/contrat/class/contrat.class.php @@ -2076,7 +2076,7 @@ class ContratLigne /** * Load elements linked to contract (only intervention for the moment) * - * @param User $user Objet type + * @param string $type Object type * @return array $elements array of linked elements */ function get_element_list($type) diff --git a/htdocs/core/class/commoninvoice.class.php b/htdocs/core/class/commoninvoice.class.php index e7dc17d62d1..0314bf34413 100644 --- a/htdocs/core/class/commoninvoice.class.php +++ b/htdocs/core/class/commoninvoice.class.php @@ -289,6 +289,9 @@ abstract class CommonInvoice extends CommonObject } } +/** + * Parent class of all other business classes for details of elements (invoices, contracts, proposals, orders, ...) + */ abstract class CommonInvoiceLine extends CommonObject { } diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php index 0de5f388b42..cce0b9277eb 100644 --- a/htdocs/core/class/commonobject.class.php +++ b/htdocs/core/class/commonobject.class.php @@ -2746,7 +2746,7 @@ abstract class CommonObject * @param string $seller Object of seller third party * @param string $buyer Object of buyer third party * @param string $selected Object line selected - * @param object $extrafieldline Object of extrafield line attribute + * @param object $extrafieldsline Object of extrafield line attribute * @return void */ function printObjectLine($action,$line,$var,$num,$i,$dateSelector,$seller,$buyer,$selected=0,$extrafieldsline=0) @@ -3013,9 +3013,10 @@ abstract class CommonObject /** + * get Margin info * - * @param string $force_price - * @return multitype:number string NULL + * @param string $force_price True of not + * @return mixed Array with info */ function getMarginInfos($force_price=false) { global $conf; diff --git a/htdocs/core/class/dolprintipp.class.php b/htdocs/core/class/dolprintipp.class.php index 1ade18a2968..f538b1359eb 100644 --- a/htdocs/core/class/dolprintipp.class.php +++ b/htdocs/core/class/dolprintipp.class.php @@ -79,7 +79,7 @@ class dolprintIPP /** * Print selected file - * + * * @param string $file file * @param string $module module * @@ -181,6 +181,8 @@ class dolprintIPP /** * Get printer detail * + * @param string $uri URI + * @return array List of attributes */ function get_printer_detail($uri) { diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index d0ed0b911eb..9a7d798cc4e 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -1372,7 +1372,7 @@ class Form $objp->remise = $objp2->remise; $objp->price_by_qty_rowid = $objp2->rowid; - $this->_construct_product_list_option($objp, $opt, $optJson, 0, $selected); + $this->constructProductListOption($objp, $opt, $optJson, 0, $selected); $j++; @@ -1386,7 +1386,7 @@ class Form } else { - $this->_construct_product_list_option($objp, $opt, $optJson, $price_level, $selected); + $this->constructProductListOption($objp, $opt, $optJson, $price_level, $selected); // Add new entry // "key" value of json key array is used by jQuery automatically as selected value // "label" value of json key array is used by jQuery automatically as text for combo box @@ -1411,16 +1411,16 @@ class Form } /** - * _construct_product_list_option + * constructProductListOption * - * @param resultset &$objp Resultset of fetch - * @param string $opt Option - * @param string $optJson Option + * @param resultset &$objp Resultset of fetch + * @param string &$opt Option + * @param string &$optJson Option * @param int $price_level Price level * @param string $selected Preselected value - * @return + * @return void */ - private function _construct_product_list_option(&$objp, &$opt, &$optJson, $price_level, $selected) + private function constructProductListOption(&$objp, &$opt, &$optJson, $price_level, $selected) { global $langs,$conf,$user,$db; @@ -1475,7 +1475,7 @@ class Form $sql.= " ORDER BY date_price"; $sql.= " DESC LIMIT 1"; - dol_syslog(get_class($this)."::_construct_product_list_option search price for level '.$price_level.' sql=".$sql); + dol_syslog(get_class($this)."::constructProductListOption search price for level '.$price_level.' sql=".$sql); $result2 = $this->db->query($sql); if ($result2) { diff --git a/htdocs/core/class/html.formprojet.class.php b/htdocs/core/class/html.formprojet.class.php index 10a23a58ac3..9e0d78118b0 100644 --- a/htdocs/core/class/html.formprojet.class.php +++ b/htdocs/core/class/html.formprojet.class.php @@ -45,20 +45,22 @@ class FormProjets /** * Show a combo list with projects qualified for a third party * - * @param int $socid Id third party (-1=all, 0=only projects not linked to a third party, id=projects not linked or linked to third party id) - * @param int $selected Id project preselected - * @param string $htmlname Nom de la zone html - * @param int $maxlength Maximum length of label - * @return int Nbre of project if OK, <0 if KO + * @param int $socid Id third party (-1=all, 0=only projects not linked to a third party, id=projects not linked or linked to third party id) + * @param int $selected Id project preselected + * @param string $htmlname Nom de la zone html + * @param int $maxlength Maximum length of label + * @param int $option_only Option only + * @param int $show_empty Add an empty line + * @return int Nber of project if OK, <0 if KO */ function select_projects($socid=-1, $selected='', $htmlname='projectid', $maxlength=16, $option_only=0, $show_empty=1) - { + { global $user,$conf,$langs; - + require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php'; $out=''; - + $hideunselectables = false; if (! empty($conf->global->PROJECT_HIDE_UNSELECTABLES)) $hideunselectables = true; @@ -146,7 +148,7 @@ class FormProjets $out.= ''; } print $out; - + $this->db->free($resql); return $num; } @@ -156,16 +158,16 @@ class FormProjets return -1; } } - + /** * Build Select List of element associable to a project * - * @param TableName Table of the element to update - * @return string The HTML select list of element + * @param string $table_element Table of the element to update + * @return string The HTML select list of element */ function select_element($table_element) { - + $projectkey="fk_projet"; switch ($table_element) { @@ -186,16 +188,16 @@ class FormProjets $sql = "SELECT rowid, ref"; break; } - + $sql.= " FROM ".MAIN_DB_PREFIX.$table_element; $sql.= " WHERE ".$projectkey." is null"; if (!empty($this->societe->id)) { $sql.= " AND fk_soc=".$this->societe->id; } $sql.= " ORDER BY ref DESC"; - + dol_syslog(get_class($this).'::select_element sql='.$sql,LOG_DEBUG); - + $resql=$this->db->query($sql); if ($resql) { @@ -213,10 +215,10 @@ class FormProjets $sellist .=''; } return $sellist ; - + $this->db->free($resql); } } - + } \ No newline at end of file diff --git a/htdocs/core/class/stats.class.php b/htdocs/core/class/stats.class.php index 4c5833eb1d3..aed3fae2367 100644 --- a/htdocs/core/class/stats.class.php +++ b/htdocs/core/class/stats.class.php @@ -417,8 +417,7 @@ abstract class Stats * Renvoie le montant moyen par mois pour une annee donnee * * @param int $year Year - * @param string $sql SQL - * @param int $format 0=Label of absiss is a translated text, 1=Label of absiss is a number + * @param string $sql SQL * @return array */ function _getAverageByMonth($year, $sql) diff --git a/htdocs/core/lib/geturl.lib.php b/htdocs/core/lib/geturl.lib.php index b7078c263c3..61bf9ca9494 100644 --- a/htdocs/core/lib/geturl.lib.php +++ b/htdocs/core/lib/geturl.lib.php @@ -27,9 +27,10 @@ * * @param string $url URL to call. * @param string $postorget 'post' = POST, 'get='GET' + * @param string $param Paraemeters of URL (x=value1&y=value2) * @return array returns an associtive array containing the response from the server. */ -function getURLContent($url,$postorget='GET',$param) +function getURLContent($url,$postorget='GET',$param='') { //declaring of global variables global $conf, $langs; @@ -58,7 +59,7 @@ function getURLContent($url,$postorget='GET',$param) curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, empty($conf->global->MAIN_USE_CONNECT_TIMEOUT)?5:$conf->global->MAIN_USE_CONNECT_TIMEOUT); curl_setopt($ch, CURLOPT_TIMEOUT, empty($conf->global->MAIN_USE_RESPONSE_TIMEOUT)?30:$conf->global->MAIN_USE_RESPONSE_TIMEOUT); - + curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); if ($postorget == 'POST') curl_setopt($ch, CURLOPT_POST, 1); else curl_setopt($ch, CURLOPT_POST, 0); @@ -82,7 +83,7 @@ function getURLContent($url,$postorget='GET',$param) $rep['content']=$response; $rep['curl_error_no']=''; $rep['curl_error_msg']=''; - + dol_syslog("getURLContent response=".$response); if (curl_errno($ch)) diff --git a/htdocs/core/tpl/login.tpl.php b/htdocs/core/tpl/login.tpl.php index d62b10ccea1..4b85cc109fb 100644 --- a/htdocs/core/tpl/login.tpl.php +++ b/htdocs/core/tpl/login.tpl.php @@ -58,7 +58,7 @@ $(document).ready(function () { - +
diff --git a/htdocs/core/tpl/passwordforgotten.tpl.php b/htdocs/core/tpl/passwordforgotten.tpl.php index 7d78d0947da..8109f5fe157 100644 --- a/htdocs/core/tpl/passwordforgotten.tpl.php +++ b/htdocs/core/tpl/passwordforgotten.tpl.php @@ -45,7 +45,7 @@ $(document).ready(function () { - +
diff --git a/htdocs/fichinter/class/fichinter.class.php b/htdocs/fichinter/class/fichinter.class.php index 8da9b42b587..bdb195d6728 100644 --- a/htdocs/fichinter/class/fichinter.class.php +++ b/htdocs/fichinter/class/fichinter.class.php @@ -533,8 +533,9 @@ class Fichinter extends CommonObject /** * Return clicable name (with picto eventually) * - * @param int $withpicto 0=_No picto, 1=Includes the picto in the linkn, 2=Picto only - * @return string String with URL + * @param int $withpicto 0=_No picto, 1=Includes the picto in the linkn, 2=Picto only + * @param string $option Options + * @return string String with URL */ function getNomUrl($withpicto=0,$option='') { @@ -659,8 +660,9 @@ class Fichinter extends CommonObject /** * Delete intervetnion * - * @param User $user Object user who delete - * @return int <0 if KO, >0 if OK + * @param User $user Object user who delete + * @param int $notrigger Disable trigger + * @return int <0 if KO, >0 if OK */ function delete($user, $notrigger=0) { @@ -830,8 +832,8 @@ class Fichinter extends CommonObject * Define the label of the contract * * @param User $user Object user who modify - * @param string $description description - * @return int <0 if ko, >0 if ok + * @param int $contractid Description + * @return int <0 if ko, >0 if ok */ function set_contrat($user, $contratid) { diff --git a/htdocs/product/canvas/product/tpl/card_create.tpl.php b/htdocs/product/canvas/product/tpl/card_create.tpl.php index f65f2e081f1..e340fe4e724 100755 --- a/htdocs/product/canvas/product/tpl/card_create.tpl.php +++ b/htdocs/product/canvas/product/tpl/card_create.tpl.php @@ -33,6 +33,9 @@ $statutarray=array('1' => $langs->trans("OnSell"), '0' => $langs->trans("NotOnSe +stock->enabled)) { ?> + + @@ -61,8 +64,6 @@ $statutarray=array('1' => $langs->trans("OnSell"), '0' => $langs->trans("NotOnSe - -
trans("StockLimit"); ?>
trans("Nature"); ?> diff --git a/htdocs/product/canvas/product/tpl/card_edit.tpl.php b/htdocs/product/canvas/product/tpl/card_edit.tpl.php index b96b80a00a9..1f44b21aaff 100755 --- a/htdocs/product/canvas/product/tpl/card_edit.tpl.php +++ b/htdocs/product/canvas/product/tpl/card_edit.tpl.php @@ -33,6 +33,9 @@ dol_htmloutput_errors($object->error,$object->errors); +stock->enabled)) { ?> + + @@ -61,8 +64,6 @@ dol_htmloutput_errors($object->error,$object->errors); - -"; // Show file name with link to download @@ -540,7 +541,7 @@ class FormFile $out.= ($param?'&'.$param:''); $out.= '">'.img_printer().''; } - if (is_object($hookmanager)) + if (is_object($hookmanager)) { $parameters=array('socid'=>(isset($GLOBALS['socid'])?$GLOBALS['socid']:''),'id'=>(isset($GLOBALS['id'])?$GLOBALS['id']:''),'modulepart'=>$modulepart,'relativepath'=>$relativepath); $res = $hookmanager->executeHooks('formBuilddocLineOptions',$parameters,$file); From 8d1b86db491a261526e74abb49d3416783158aea Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 10 Jul 2013 15:58:07 +0200 Subject: [PATCH 44/48] Qual: Add method addline --- test/phpunit/PropalTest.php | 44 ++++++++++++++++++++++++++++--------- 1 file changed, 34 insertions(+), 10 deletions(-) diff --git a/test/phpunit/PropalTest.php b/test/phpunit/PropalTest.php index 86b90fda99d..df083e15b94 100644 --- a/test/phpunit/PropalTest.php +++ b/test/phpunit/PropalTest.php @@ -116,7 +116,7 @@ class PropalTest extends PHPUnit_Framework_TestCase /** * testPropalCreate - * + * * @return void */ public function testPropalCreate() @@ -138,10 +138,10 @@ class PropalTest extends PHPUnit_Framework_TestCase /** * testPropalFetch - * + * * @param int $id Id of object * @return void - * + * * @depends testPropalCreate * The depends says test is run only if previous is ok */ @@ -161,13 +161,37 @@ class PropalTest extends PHPUnit_Framework_TestCase return $localobject; } + /** + * testPropalAddLine + * + * @param int $localobject Proposal + * @return void + * + * @depends testPropalFetch + * The depends says test is run only if previous is ok + */ + public function testPropalAddLine($localobject) + { + global $conf,$user,$langs,$db; + $conf=$this->savconf; + $user=$this->savuser; + $langs=$this->savlangs; + $db=$this->savdb; + + $result=$localobject->addline($localobject->id, 'Added line', 10, 2, 19.6); + + $this->assertLessThan($result, 0); + print __METHOD__." id=".$localobject->id." result=".$result."\n"; + return $localobject; + } + /** * testPropalValid - * + * * @param Proposal $localobject Proposal * @return Proposal - * - * @depends testPropalFetch + * + * @depends testPropalAddLine * The depends says test is run only if previous is ok */ public function testPropalValid($localobject) @@ -187,10 +211,10 @@ class PropalTest extends PHPUnit_Framework_TestCase /** * testPropalOther - * + * * @param Proposal $localobject Proposal * @return int - * + * * @depends testPropalValid * The depends says test is run only if previous is ok */ @@ -216,10 +240,10 @@ class PropalTest extends PHPUnit_Framework_TestCase /** * testPropalDelete - * + * * @param int $id Id of proposal * @return void - * + * * @depends testPropalOther * The depends says test is run only if previous is ok */ From 1ee67bd5b9c6d2ad46a7d441a56f9d504fd637f0 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 10 Jul 2013 16:07:57 +0200 Subject: [PATCH 45/48] Prepare code to uniformize method addline. --- dev/initdata/generate-facture.php | 8 ++++++-- dev/initdata/generate-propale.php | 4 +++- htdocs/compta/facture.php | 10 +++++----- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/dev/initdata/generate-facture.php b/dev/initdata/generate-facture.php index 7761817dc28..84fb39af9b9 100644 --- a/dev/initdata/generate-facture.php +++ b/dev/initdata/generate-facture.php @@ -112,8 +112,12 @@ while ($i < GEN_NUMBER_FACTURE && $result >= 0) $prodid = rand(1, $num_prods); $product=new Product($db); $result=$product->fetch($prodids[$prodid]); - $result=$facture->addline($facture->id,$product->description,$product->price, rand(1,5), 0, 0, 0, $prodids[$prodid], 0, '', '', 0, 0, '', $product->price_base_type, $product->price_ttc, $product->type); - $xnbp++; + $result=$facture->addline($facture->id, $product->description, $product->price, rand(1,5), 0, 0, 0, $prodids[$prodid], 0, '', '', 0, 0, '', $product->price_base_type, $product->price_ttc, $product->type); + if ($result < 0) + { + dol_print_error($db,$propal->error); + } + $xnbp++; } print " OK with ref ".$facture->ref."\n";; diff --git a/dev/initdata/generate-propale.php b/dev/initdata/generate-propale.php index 5ee18ee6073..878b29be74d 100644 --- a/dev/initdata/generate-propale.php +++ b/dev/initdata/generate-propale.php @@ -143,7 +143,9 @@ while ($i < GEN_NUMBER_PROPAL && $result >= 0) while ($xnbp < $nbp) { $prodid = rand(1, $num_prods); - $result=$propal->addline($propal->id, 'Description '.$xnbp, '100', rand(1,5), '19.6', 0, 0, $prodids[$prodid], 0); + $product=new Product($db); + $result=$product->fetch($prodids[$prodid]); + $result=$propal->addline($propal->id, $product->description, $product->price, rand(1,5), 0, 0, 0, $prodids[$prodid], 0); if ($result < 0) { dol_print_error($db,$propal->error); diff --git a/htdocs/compta/facture.php b/htdocs/compta/facture.php index dcacf578843..5aa83963bdc 100644 --- a/htdocs/compta/facture.php +++ b/htdocs/compta/facture.php @@ -758,7 +758,7 @@ else if ($action == 'add' && $user->rights->facture->creer) $product->fetch($_POST['idprod'.$i]); $startday=dol_mktime(12, 0, 0, $_POST['date_start'.$i.'month'], $_POST['date_start'.$i.'day'], $_POST['date_start'.$i.'year']); $endday=dol_mktime(12, 0, 0, $_POST['date_end'.$i.'month'], $_POST['date_end'.$i.'day'], $_POST['date_end'.$i.'year']); - $result=$object->addline($id,$product->description,$product->price, $_POST['qty'.$i], $product->tva_tx, $product->localtax1_tx, $product->localtax2_tx, $_POST['idprod'.$i], $_POST['remise_percent'.$i], $startday, $endday, 0, 0, '', $product->price_base_type, $product->price_ttc, $product->type); + $result=$object->addline($object->id,$product->description,$product->price, $_POST['qty'.$i], $product->tva_tx, $product->localtax1_tx, $product->localtax2_tx, $_POST['idprod'.$i], $_POST['remise_percent'.$i], $startday, $endday, 0, 0, '', $product->price_base_type, $product->price_ttc, $product->type); } } } @@ -913,7 +913,7 @@ else if ($action == 'add' && $user->rights->facture->creer) } $result = $object->addline( - $id, + $object->id, $langs->trans('Deposit'), $amountdeposit, //subprice 1, //quantity @@ -1016,7 +1016,7 @@ else if ($action == 'add' && $user->rights->facture->creer) } $result = $object->addline( - $id, + $object->id, $desc, $lines[$i]->subprice, $lines[$i]->qty, @@ -1093,7 +1093,7 @@ else if ($action == 'add' && $user->rights->facture->creer) $product->fetch($_POST['idprod'.$i]); $startday=dol_mktime(12, 0, 0, $_POST['date_start'.$i.'month'], $_POST['date_start'.$i.'day'], $_POST['date_start'.$i.'year']); $endday=dol_mktime(12, 0, 0, $_POST['date_end'.$i.'month'], $_POST['date_end'.$i.'day'], $_POST['date_end'.$i.'year']); - $result=$object->addline($id,$product->description,$product->price, $_POST['qty'.$i], $product->tva_tx, $product->localtax1_tx, $product->localtax2_tx, $_POST['idprod'.$i], $_POST['remise_percent'.$i], $startday, $endday, 0, 0, '', $product->price_base_type, $product->price_ttc, $product->type); + $result=$object->addline($object->id,$product->description,$product->price, $_POST['qty'.$i], $product->tva_tx, $product->localtax1_tx, $product->localtax2_tx, $_POST['idprod'.$i], $_POST['remise_percent'.$i], $startday, $endday, 0, 0, '', $product->price_base_type, $product->price_ttc, $product->type); } } } @@ -1311,7 +1311,7 @@ else if (($action == 'addline' || $action == 'addline_predef') && $user->rights- { // Insert line $result = $object->addline( - $id, + $object->id, $desc, $pu_ht, GETPOST('qty'), From 27a435994a0f4fab2555727716fdb00fdd07faad Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 10 Jul 2013 17:29:54 +0200 Subject: [PATCH 46/48] Qual: Some methods object->addline used a first parameter that was object->id, some not. Of course this was not a good pratice, since object->id is already known so no need to provide it as parameter. All methods addline in this case were modified to match good pratice and be uniformed with others. --- ChangeLog | 10 +++++++++- dev/initdata/generate-commande.php | 2 +- dev/initdata/generate-facture.php | 2 +- dev/initdata/generate-propale.php | 2 +- htdocs/adherents/card_subscriptions.php | 4 ++-- htdocs/comm/propal.php | 1 - htdocs/comm/propal/class/propal.class.php | 6 ++---- htdocs/commande/class/commande.class.php | 6 +++--- htdocs/commande/fiche.php | 2 -- htdocs/commande/orderstoinvoice.php | 3 +-- htdocs/compta/facture.php | 7 ++----- htdocs/compta/facture/class/facture-rec.class.php | 6 +++--- htdocs/compta/facture/class/facture.class.php | 7 +++---- htdocs/product/fiche.php | 3 --- 14 files changed, 28 insertions(+), 33 deletions(-) diff --git a/ChangeLog b/ChangeLog index e987a962f7a..8a61005c097 100644 --- a/ChangeLog +++ b/ChangeLog @@ -48,7 +48,10 @@ For developers: - New: Make some changes to allow usage of several alternative $dolibarr_main_url_root variables. Fix also several bugs with old code. -WARNING: We started to clean hooks code. If your hook want to modify value of $actions, it's role +WARNING: This may create regression for some external modules, but was necessary to make +Dolibarr better: + +- We started to clean hooks code. If your hook want to modify value of $actions, it's role of your hook to modify it. Dolibarr hook code will not decide this for your module anymore. If your action class for hook was returning a string or an array, instead your module must set $actionclassinstance->results (to return array) @@ -57,6 +60,11 @@ to return same thing. The return value must be replaced by a "return 0"; Goal is to fix old compatibility code that does not match hook specification: http://wiki.dolibarr.org/index.php/Hooks_system +- Some methods object->addline used a first parameter that was object->id, some not. Of course +this was not a good pratice, since object->id is already known so no need to provide it as +parameter. All methods addline in this case were modified to remove this information. + + ***** ChangeLog for 3.4 compared to 3.3.2 ***** For users: - New: Can use ODS templates as document templates. diff --git a/dev/initdata/generate-commande.php b/dev/initdata/generate-commande.php index 4794d9f949f..7057550e3d7 100644 --- a/dev/initdata/generate-commande.php +++ b/dev/initdata/generate-commande.php @@ -186,7 +186,7 @@ for ($s = 0 ; $s < GEN_NUMBER_COMMANDE ; $s++) $prodid = rand(1, $num_prods); $product=new Product($db); $result=$product->fetch($prodids[$prodid]); - $result=$com->addline($com->id, $product->description, $product->price, rand(1,5), 0, 0, 0, $prodids[$prodid], 0, 0, 0, $product->price_base_type, $product->price_ttc, '', '', $product->type); + $result=$com->addline($product->description, $product->price, rand(1,5), 0, 0, 0, $prodids[$prodid], 0, 0, 0, $product->price_base_type, $product->price_ttc, '', '', $product->type); if ($result < 0) { dol_print_error($db,$propal->error); diff --git a/dev/initdata/generate-facture.php b/dev/initdata/generate-facture.php index 84fb39af9b9..5de15dce3a1 100644 --- a/dev/initdata/generate-facture.php +++ b/dev/initdata/generate-facture.php @@ -112,7 +112,7 @@ while ($i < GEN_NUMBER_FACTURE && $result >= 0) $prodid = rand(1, $num_prods); $product=new Product($db); $result=$product->fetch($prodids[$prodid]); - $result=$facture->addline($facture->id, $product->description, $product->price, rand(1,5), 0, 0, 0, $prodids[$prodid], 0, '', '', 0, 0, '', $product->price_base_type, $product->price_ttc, $product->type); + $result=$facture->addline($product->description, $product->price, rand(1,5), 0, 0, 0, $prodids[$prodid], 0, '', '', 0, 0, '', $product->price_base_type, $product->price_ttc, $product->type); if ($result < 0) { dol_print_error($db,$propal->error); diff --git a/dev/initdata/generate-propale.php b/dev/initdata/generate-propale.php index 878b29be74d..b0724ecde4f 100644 --- a/dev/initdata/generate-propale.php +++ b/dev/initdata/generate-propale.php @@ -145,7 +145,7 @@ while ($i < GEN_NUMBER_PROPAL && $result >= 0) $prodid = rand(1, $num_prods); $product=new Product($db); $result=$product->fetch($prodids[$prodid]); - $result=$propal->addline($propal->id, $product->description, $product->price, rand(1,5), 0, 0, 0, $prodids[$prodid], 0); + $result=$propal->addline($product->description, $product->price, rand(1,5), 0, 0, 0, $prodids[$prodid], 0); if ($result < 0) { dol_print_error($db,$propal->error); diff --git a/htdocs/adherents/card_subscriptions.php b/htdocs/adherents/card_subscriptions.php index 81a5227e575..0fdfec86f76 100644 --- a/htdocs/adherents/card_subscriptions.php +++ b/htdocs/adherents/card_subscriptions.php @@ -368,7 +368,7 @@ if ($user->rights->adherent->cotisation->creer && $action == 'cotisation' && ! $ $vattouse=get_default_tva($mysoc, $mysoc, $idprodsubscription); } //print xx".$vattouse." - ".$mysoc." - ".$customer;exit; - $result=$invoice->addline($invoice->id,$label,0,1,$vattouse,0,0,$idprodsubscription,0,$datecotisation,$datesubend,0,0,'','TTC',$cotisation,1); + $result=$invoice->addline($label,0,1,$vattouse,0,0,$idprodsubscription,0,$datecotisation,$datesubend,0,0,'','TTC',$cotisation,1); if ($result <= 0) { $errmsg=$invoice->error; @@ -538,7 +538,7 @@ if ($rowid) // EMail print ''; - + // Status print ''; diff --git a/htdocs/comm/propal.php b/htdocs/comm/propal.php index 9946358d4e9..09afbe57c34 100644 --- a/htdocs/comm/propal.php +++ b/htdocs/comm/propal.php @@ -804,7 +804,6 @@ else if ($action == "addline" && $user->rights->propal->creer) { // Insert line $result=$object->addline( - $id, $desc, $pu_ht, GETPOST('qty'), diff --git a/htdocs/comm/propal/class/propal.class.php b/htdocs/comm/propal/class/propal.class.php index a9b5204abc7..f4c87387040 100644 --- a/htdocs/comm/propal/class/propal.class.php +++ b/htdocs/comm/propal/class/propal.class.php @@ -314,9 +314,9 @@ class Propal extends CommonObject * * @see add_product */ - function addline($propalid, $desc, $pu_ht, $qty, $txtva, $txlocaltax1=0, $txlocaltax2=0, $fk_product=0, $remise_percent=0, $price_base_type='HT', $pu_ttc=0, $info_bits=0, $type=0, $rang=-1, $special_code=0, $fk_parent_line=0, $fk_fournprice=0, $pa_ht=0, $label='',$date_start='', $date_end='',$array_option=0) + function addline($desc, $pu_ht, $qty, $txtva, $txlocaltax1=0, $txlocaltax2=0, $fk_product=0, $remise_percent=0, $price_base_type='HT', $pu_ttc=0, $info_bits=0, $type=0, $rang=-1, $special_code=0, $fk_parent_line=0, $fk_fournprice=0, $pa_ht=0, $label='',$date_start='', $date_end='',$array_option=0) { - global $conf; + $propalid=$this->id; dol_syslog(get_class($this)."::addline propalid=$propalid, desc=$desc, pu_ht=$pu_ht, qty=$qty, txtva=$txtva, fk_product=$fk_product, remise_except=$remise_percent, price_base_type=$price_base_type, pu_ttc=$pu_ttc, info_bits=$info_bits, type=$type"); include_once DOL_DOCUMENT_ROOT.'/core/lib/price.lib.php'; @@ -414,7 +414,6 @@ class Propal extends CommonObject $this->line->pa_ht = $pa_ht; // Mise en option de la ligne - //if ($conf->global->PROPALE_USE_OPTION_LINE && !$qty) $ligne->special_code=3; if (empty($qty) && empty($special_code)) $this->line->special_code=3; // TODO deprecated @@ -762,7 +761,6 @@ class Propal extends CommonObject } $result = $this->addline( - $this->id, $this->lines[$i]->desc, $this->lines[$i]->subprice, $this->lines[$i]->qty, diff --git a/htdocs/commande/class/commande.class.php b/htdocs/commande/class/commande.class.php index 66c5b077fb4..62651cd4067 100644 --- a/htdocs/commande/class/commande.class.php +++ b/htdocs/commande/class/commande.class.php @@ -681,7 +681,6 @@ class Commande extends CommonOrder } $result = $this->addline( - $this->id, $this->lines[$i]->desc, $this->lines[$i]->subprice, $this->lines[$i]->qty, @@ -1005,7 +1004,6 @@ class Commande extends CommonOrder /** * Add an order line into database (linked to product/service or not) * - * @param int $commandeid Id of line * @param string $desc Description of line * @param double $pu_ht Unit price (without tax) * @param double $qty Quantite @@ -1037,8 +1035,10 @@ class Commande extends CommonOrder * par l'appelant par la methode get_default_tva(societe_vendeuse,societe_acheteuse,produit) * et le desc doit deja avoir la bonne valeur (a l'appelant de gerer le multilangue) */ - function addline($commandeid, $desc, $pu_ht, $qty, $txtva, $txlocaltax1=0, $txlocaltax2=0, $fk_product=0, $remise_percent=0, $info_bits=0, $fk_remise_except=0, $price_base_type='HT', $pu_ttc=0, $date_start='', $date_end='', $type=0, $rang=-1, $special_code=0, $fk_parent_line=0, $fk_fournprice=null, $pa_ht=0, $label='',$array_option=0) + function addline($desc, $pu_ht, $qty, $txtva, $txlocaltax1=0, $txlocaltax2=0, $fk_product=0, $remise_percent=0, $info_bits=0, $fk_remise_except=0, $price_base_type='HT', $pu_ttc=0, $date_start='', $date_end='', $type=0, $rang=-1, $special_code=0, $fk_parent_line=0, $fk_fournprice=null, $pa_ht=0, $label='',$array_option=0) { + $commandeid=$this->id; + dol_syslog(get_class($this)."::addline commandeid=$commandeid, desc=$desc, pu_ht=$pu_ht, qty=$qty, txtva=$txtva, fk_product=$fk_product, remise_percent=$remise_percent, info_bits=$info_bits, fk_remise_except=$fk_remise_except, price_base_type=$price_base_type, pu_ttc=$pu_ttc, date_start=$date_start, date_end=$date_end, type=$type", LOG_DEBUG); include_once DOL_DOCUMENT_ROOT.'/core/lib/price.lib.php'; diff --git a/htdocs/commande/fiche.php b/htdocs/commande/fiche.php index cf054a6cfc8..74ed72d835c 100644 --- a/htdocs/commande/fiche.php +++ b/htdocs/commande/fiche.php @@ -322,7 +322,6 @@ else if ($action == 'add' && $user->rights->commande->creer) } $result = $object->addline( - $object_id, $desc, $lines[$i]->subprice, $lines[$i]->qty, @@ -739,7 +738,6 @@ else if ($action == 'addline' && $user->rights->commande->creer) { // Insert line $result = $object->addline( - $object->id, $desc, $pu_ht, GETPOST('qty'), diff --git a/htdocs/commande/orderstoinvoice.php b/htdocs/commande/orderstoinvoice.php index f24a9a32b84..72599d11840 100755 --- a/htdocs/commande/orderstoinvoice.php +++ b/htdocs/commande/orderstoinvoice.php @@ -269,7 +269,6 @@ if (($action == 'create' || $action == 'add') && empty($mesgs)) $fk_parent_line = 0; } $result = $object->addline( - $id, $desc, $lines[$i]->subprice, $lines[$i]->qty, @@ -428,7 +427,7 @@ if ($action == 'create' && empty($mesgs)) if (! empty($conf->projet->enabled)) { $formproject=new FormProjets($db); - + $langs->load('projects'); print '
trans("StockLimit"); ?>
trans("Nature"); ?> diff --git a/htdocs/projet/class/project.class.php b/htdocs/projet/class/project.class.php index 954bc7564c4..e6644c048c5 100644 --- a/htdocs/projet/class/project.class.php +++ b/htdocs/projet/class/project.class.php @@ -53,7 +53,7 @@ class Project extends CommonObject var $statuts_short; var $statuts; var $oldcopy; - + /** * Constructor @@ -147,7 +147,7 @@ class Project extends CommonObject dol_syslog(get_class($this)."::create error -2 " . $this->error, LOG_ERR); $error++; } - + //Update extrafield if (!$error) { if (empty($conf->global->MAIN_EXTRAFIELDS_DISABLED)) // For avoid conflicts if trigger used @@ -225,7 +225,7 @@ class Project extends CommonObject } // End call triggers } - + //Update extrafield if (!$error) { if (empty($conf->global->MAIN_EXTRAFIELDS_DISABLED)) // For avoid conflicts if trigger used @@ -478,10 +478,10 @@ class Project extends CommonObject $sql = "DELETE FROM " . MAIN_DB_PREFIX . "projet_task_extrafields"; $sql.= " WHERE fk_object IN (SELECT rowid FROM " . MAIN_DB_PREFIX . "projet_task WHERE fk_projet=" . $this->id . ")"; - + dol_syslog(get_class($this) . "::delete sql=" . $sql, LOG_DEBUG); $resql = $this->db->query($sql); - + $sql = "DELETE FROM " . MAIN_DB_PREFIX . "projet_task"; $sql.= " WHERE fk_projet=" . $this->id; @@ -493,13 +493,13 @@ class Project extends CommonObject dol_syslog(get_class($this) . "::delete sql=" . $sql, LOG_DEBUG); $resql = $this->db->query($sql); - + $sql = "DELETE FROM " . MAIN_DB_PREFIX . "projet_extrafields"; $sql.= " WHERE fk_object=" . $this->id; - + dol_syslog(get_class($this) . "::delete sql=" . $sql, LOG_DEBUG); $resql = $this->db->query($sql); - + if ($resql) { // We remove directory @@ -1277,20 +1277,19 @@ class Project extends CommonObject } return $result; } - + /** * Clean task not linked to a parent * - * @param DoliDB $db Database handler * @return int Nb of records deleted */ function clean_orphelins() { $nb=0; - + // There is orphelins. We clean that $listofid=array(); - + // Get list of id in array listofid $sql='SELECT rowid FROM '.MAIN_DB_PREFIX.'projet_task'; $resql = $this->db->query($sql); @@ -1309,22 +1308,22 @@ class Project extends CommonObject { dol_print_error($this->db); } - + if (count($listofid)) { // Removed orphelins records print 'Some orphelins were found and restored to be parents so records are visible again: '; print join(',',$listofid); - + $sql = "UPDATE ".MAIN_DB_PREFIX."projet_task"; $sql.= " SET fk_task_parent = 0"; $sql.= " WHERE fk_task_parent NOT IN (".join(',',$listofid).")"; - + $resql = $this->db->query($sql); if ($resql) { $nb=$this->db->affected_rows($sql); - + return $nb; } else @@ -1333,19 +1332,19 @@ class Project extends CommonObject } } } - - + + /** * Associate element to a project * - * @param TableName Table of the element to update - * @param ElementSelectId Key-rowid of the line of the element to update - * @return int 1 if OK or < 0 if KO + * @param string $TableName Table of the element to update + * @param int $ElementSelectId Key-rowid of the line of the element to update + * @return int 1 if OK or < 0 if KO */ function update_element($TableName, $ElementSelectId) { $sql="UPDATE ".MAIN_DB_PREFIX.$TableName; - + if ($TableName=="actioncomm") { $sql.= " SET fk_project=".$this->id; @@ -1356,17 +1355,17 @@ class Project extends CommonObject $sql.= " SET fk_projet=".$this->id; $sql.= " WHERE rowid=".$ElementSelectId; } - + dol_syslog(get_class($this)."::update_element sql=" . $sql, LOG_DEBUG); $resql=$this->db->query($sql); if (!$resql) { - $this->error=$this->db->lasterror(); + $this->error=$this->db->lasterror(); dol_syslog(get_class($this)."::update_element error : " . $this->error, LOG_ERR); return -1; }else { return 1; } - + } } diff --git a/test/phpunit/AdherentTest.php b/test/phpunit/AdherentTest.php index 3670ff29780..aebd54f45f6 100644 --- a/test/phpunit/AdherentTest.php +++ b/test/phpunit/AdherentTest.php @@ -139,12 +139,13 @@ class AdherentTest extends PHPUnit_Framework_TestCase return $localobject->id; } - + /** * testAdherentCreate * - * @return void - * + * @param int $fk_adherent_type Id type of member + * @return int + * * @depends testAdherentTypeCreate * The depends says test is run only if previous is ok */ diff --git a/test/phpunit/FactureTestRounding.php b/test/phpunit/FactureTestRounding.php index b90f67171d2..1c38fe17bad 100644 --- a/test/phpunit/FactureTestRounding.php +++ b/test/phpunit/FactureTestRounding.php @@ -221,8 +221,8 @@ class FactureTestRounding extends PHPUnit_Framework_TestCase $facid=$localobject1a->create($user); $localobject1a->addline($facid, 'Line 1', 6.36, 15, 21); // This include update_price print __METHOD__." id=".$facid." total_ttc=".$localobject1a->total_ttc."\n"; - $this->assertEquals( 95.40, $localobject1a->total_ht); - $this->assertEquals( 20.03, $localobject1a->total_tva); + $this->assertEquals(95.40, $localobject1a->total_ht); + $this->assertEquals(20.03, $localobject1a->total_tva); $this->assertEquals(115.43, $localobject1a->total_ttc); // With option MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND = 1 @@ -233,8 +233,8 @@ class FactureTestRounding extends PHPUnit_Framework_TestCase $facid=$localobject1b->create($user); $localobject1b->addline($facid, 'Line 1', 6.36, 15, 21); // This include update_price print __METHOD__." id=".$facid." total_ttc=".$localobject1b->total_ttc."\n"; - $this->assertEquals( 95.40, $localobject1b->total_ht, 'testFactureAddLine1 total_ht'); - $this->assertEquals( 20.03, $localobject1b->total_tva, 'testFactureAddLine1 total_tva'); + $this->assertEquals(95.40, $localobject1b->total_ht, 'testFactureAddLine1 total_ht'); + $this->assertEquals(20.03, $localobject1b->total_tva, 'testFactureAddLine1 total_tva'); $this->assertEquals(115.43, $localobject1b->total_ttc, 'testFactureAddLine1 total_ttc'); } @@ -264,8 +264,8 @@ class FactureTestRounding extends PHPUnit_Framework_TestCase $localobject2->addline($facid, 'Line 2', 6.36, 5, 21); $localobject2->addline($facid, 'Line 3', 6.36, 5, 21); print __METHOD__." id=".$facid." total_ttc=".$localobject2->total_ttc."\n"; - $this->assertEquals( 95.40, $localobject2->total_ht); - $this->assertEquals( 20.04, $localobject2->total_tva); + $this->assertEquals(95.40, $localobject2->total_ht); + $this->assertEquals(20.04, $localobject2->total_tva); $this->assertEquals(115.44, $localobject2->total_ttc); // With option MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND = 1 @@ -278,8 +278,8 @@ class FactureTestRounding extends PHPUnit_Framework_TestCase $localobject2->addline($facid, 'Line 2', 6.36, 5, 21); $localobject2->addline($facid, 'Line 3', 6.36, 5, 21); print __METHOD__." id=".$facid." total_ttc=".$localobject2->total_ttc."\n"; - $this->assertEquals( 95.40, $localobject2->total_ht); - $this->assertEquals( 20.03, $localobject2->total_tva); + $this->assertEquals(95.40, $localobject2->total_ht); + $this->assertEquals(20.03, $localobject2->total_tva); $this->assertEquals(115.43, $localobject2->total_ttc); } @@ -311,8 +311,8 @@ class FactureTestRounding extends PHPUnit_Framework_TestCase $localobject3->addline($facid, 'Line 4', 6.36, 3, 21); $localobject3->addline($facid, 'Line 5', 6.36, 3, 21); print __METHOD__." id=".$facid." total_ttc=".$localobject3->total_ttc."\n"; - $this->assertEquals( 95.40, $localobject3->total_ht); - $this->assertEquals( 20.05, $localobject3->total_tva); + $this->assertEquals(95.40, $localobject3->total_ht); + $this->assertEquals(20.05, $localobject3->total_tva); $this->assertEquals(115.45, $localobject3->total_ttc); // With option MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND = 1 @@ -327,8 +327,8 @@ class FactureTestRounding extends PHPUnit_Framework_TestCase $localobject3->addline($facid, 'Line 4', 6.36, 3, 21); $localobject3->addline($facid, 'Line 5', 6.36, 3, 21); print __METHOD__." id=".$facid." total_ttc=".$localobject3->total_ttc."\n"; - $this->assertEquals( 95.40, $localobject3->total_ht); - $this->assertEquals( 20.03, $localobject3->total_tva); + $this->assertEquals(95.40, $localobject3->total_ht); + $this->assertEquals(20.03, $localobject3->total_tva); $this->assertEquals(115.43, $localobject3->total_ttc); } From 7c163f7be31462ae7a5304d4f0a2edfeb61af22a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 7 Jul 2013 13:17:48 +0200 Subject: [PATCH 27/48] Fix: Running fixdosfile onto all project --- htdocs/admin/index.php | 14 +- htdocs/admin/tools/update.php | 2 +- htdocs/comm/propal/class/propal.class.php | 22 +- htdocs/commande/class/commande.class.php | 22 +- htdocs/core/class/commonobject.class.php | 10 +- htdocs/core/lib/functions.lib.php | 46 ++-- htdocs/core/menus/standard/auguria.lib.php | 4 +- htdocs/core/menus/standard/eldy.lib.php | 8 +- htdocs/fourn/facture/fiche.php | 4 +- htdocs/index.php | 16 +- htdocs/install/etape1.php | 2 +- htdocs/langs/ca_ES/paybox.lang | 74 +++--- test/phpunit/FactureTestRounding.php | 250 ++++++++++----------- test/phpunit/PricesTest.php | 2 +- 14 files changed, 238 insertions(+), 238 deletions(-) diff --git a/htdocs/admin/index.php b/htdocs/admin/index.php index 23dcacf4f1d..f234be227ea 100644 --- a/htdocs/admin/index.php +++ b/htdocs/admin/index.php @@ -47,14 +47,14 @@ if (! empty($conf->global->MAIN_MOTD_SETUPPAGE)) $conf->global->MAIN_MOTD_SETUPPAGE=preg_replace('//i','
',$conf->global->MAIN_MOTD_SETUPPAGE); if (! empty($conf->global->MAIN_MOTD_SETUPPAGE)) { - $i=0; - while (preg_match('/__\(([a-zA-Z|@]+)\)__/i',$conf->global->MAIN_MOTD_SETUPPAGE,$reg) && $i < 100) - { - $tmp=explode('|',$reg[1]); + $i=0; + while (preg_match('/__\(([a-zA-Z|@]+)\)__/i',$conf->global->MAIN_MOTD_SETUPPAGE,$reg) && $i < 100) + { + $tmp=explode('|',$reg[1]); if (! empty($tmp[1])) $langs->load($tmp[1]); - $conf->global->MAIN_MOTD_SETUPPAGE=preg_replace('/__\('.preg_quote($reg[1]).'\)__/i',$langs->trans($tmp[0]),$conf->global->MAIN_MOTD_SETUPPAGE); - $i++; - } + $conf->global->MAIN_MOTD_SETUPPAGE=preg_replace('/__\('.preg_quote($reg[1]).'\)__/i',$langs->trans($tmp[0]),$conf->global->MAIN_MOTD_SETUPPAGE); + $i++; + } print "\n\n"; print '"; + $out .= "
'; diff --git a/htdocs/admin/tools/update.php b/htdocs/admin/tools/update.php index 133dd247459..29e4c96b6c3 100644 --- a/htdocs/admin/tools/update.php +++ b/htdocs/admin/tools/update.php @@ -75,7 +75,7 @@ if (GETPOST('action','alpha')=='install') $result=dol_move_uploaded_file($_FILES['fileinstall']['tmp_name'],$newfile,1,0,$_FILES['fileinstall']['error']); if ($result > 0) { - $documentrootalt=DOL_DOCUMENT_ROOT.'/extensions'; + $documentrootalt=DOL_DOCUMENT_ROOT.'/extensions'; $result=dol_uncompress($newfile,$documentrootalt); if (! empty($result['error'])) { diff --git a/htdocs/comm/propal/class/propal.class.php b/htdocs/comm/propal/class/propal.class.php index 77d2b9ecd66..a9b5204abc7 100644 --- a/htdocs/comm/propal/class/propal.class.php +++ b/htdocs/comm/propal/class/propal.class.php @@ -2475,18 +2475,18 @@ class Propal extends CommonObject $file = $conf->global->PROPALE_ADDON.".php"; $classname = $conf->global->PROPALE_ADDON; - // Include file with class - foreach ($conf->file->dol_document_root as $dirroot) - { - $dir = $dirroot."/core/modules/propale/"; - // Load file with numbering class (if found) - $mybool|=@include_once $dir.$file; - } + // Include file with class + foreach ($conf->file->dol_document_root as $dirroot) + { + $dir = $dirroot."/core/modules/propale/"; + // Load file with numbering class (if found) + $mybool|=@include_once $dir.$file; + } - if (! $mybool) - { - dol_print_error('',"Failed to include file ".$file); - return ''; + if (! $mybool) + { + dol_print_error('',"Failed to include file ".$file); + return ''; } $obj = new $classname(); diff --git a/htdocs/commande/class/commande.class.php b/htdocs/commande/class/commande.class.php index abf1bb51db3..66c5b077fb4 100644 --- a/htdocs/commande/class/commande.class.php +++ b/htdocs/commande/class/commande.class.php @@ -136,18 +136,18 @@ class Commande extends CommonOrder $file = $conf->global->COMMANDE_ADDON.".php"; $classname = $conf->global->COMMANDE_ADDON; - // Include file with class - foreach ($conf->file->dol_document_root as $dirroot) - { - $dir = $dirroot."/core/modules/commande/"; - // Load file with numbering class (if found) - $mybool|=@include_once $dir.$file; - } + // Include file with class + foreach ($conf->file->dol_document_root as $dirroot) + { + $dir = $dirroot."/core/modules/commande/"; + // Load file with numbering class (if found) + $mybool|=@include_once $dir.$file; + } - if (! $mybool) - { - dol_print_error('',"Failed to include file ".$file); - return ''; + if (! $mybool) + { + dol_print_error('',"Failed to include file ".$file); + return ''; } $obj = new $classname(); diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php index cce0b9277eb..fac9bdfd764 100644 --- a/htdocs/core/class/commonobject.class.php +++ b/htdocs/core/class/commonobject.class.php @@ -1511,8 +1511,8 @@ abstract class CommonObject $this->total_localtax2 = 0; $this->total_ttc = 0; $total_ht_by_vats = array(); - $total_tva_by_vats = array(); - $total_ttc_by_vats = array(); + $total_tva_by_vats = array(); + $total_ttc_by_vats = array(); $num = $this->db->num_rows($resql); $i = 0; @@ -1543,9 +1543,9 @@ abstract class CommonObject $resqlfix=$this->db->query($sqlfix); if (! $resqlfix) dol_print_error($this->db,'Failed to update line'); $this->total_tva -= $diff; - $this->total_ttc -= $diff; - $total_tva_by_vats[$obj->vatrate] -= $diff; - $total_ttc_by_vats[$obj->vatrate] -= $diff; + $this->total_ttc -= $diff; + $total_tva_by_vats[$obj->vatrate] -= $diff; + $total_ttc_by_vats[$obj->vatrate] -= $diff; } } diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 56bdb1207c7..9c878615a19 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -259,15 +259,15 @@ function dol_buildpath($path, $type=0) if (empty($type)) // For a filesystem path { $res = DOL_DOCUMENT_ROOT.'/'.$path; // Standard value - foreach ($conf->file->dol_document_root as $key => $dirroot) // ex: array(["main"]=>"/home/main/htdocs", ["alt0"]=>"/home/dirmod/htdocs", ...) - { + foreach ($conf->file->dol_document_root as $key => $dirroot) // ex: array(["main"]=>"/home/main/htdocs", ["alt0"]=>"/home/dirmod/htdocs", ...) + { if ($key == 'main') continue; - if (file_exists($dirroot.'/'.$path)) - { - $res=$dirroot.'/'.$path; - break; - } - } + if (file_exists($dirroot.'/'.$path)) + { + $res=$dirroot.'/'.$path; + break; + } + } } else // For an url path { @@ -278,20 +278,20 @@ function dol_buildpath($path, $type=0) $res=''; if ($type == 1) $res = DOL_URL_ROOT.'/'.$path; // Standard value if ($type == 2) $res = DOL_MAIN_URL_ROOT.'/'.$path; // Standard value - foreach ($conf->file->dol_document_root as $key => $dirroot) // ex: array(["main"]=>"/home/main/htdocs", ["alt0"]=>"/home/dirmod/htdocs", ...) + foreach ($conf->file->dol_document_root as $key => $dirroot) // ex: array(["main"]=>"/home/main/htdocs", ["alt0"]=>"/home/dirmod/htdocs", ...) { - if ($key == 'main') continue; + if ($key == 'main') continue; preg_match('/^([^\?]+(\.css\.php|\.css|\.js\.php|\.js|\.png|\.jpg|\.php)?)/i',$path,$regs); // Take part before '?' if (! empty($regs[1])) { //print $key.'-'.$dirroot.'/'.$path.'-'.$conf->file->dol_url_root[$type].'
'."\n"; - if (file_exists($dirroot.'/'.$path)) - { + if (file_exists($dirroot.'/'.$path)) + { if ($type == 1) $res=DOL_URL_ROOT.$conf->file->dol_url_root[$key].'/'.$path; - if ($type == 2) $res=DOL_MAIN_URL_ROOT.$conf->file->dol_url_root[$key].'/'.$path; - break; + if ($type == 2) $res=DOL_MAIN_URL_ROOT.$conf->file->dol_url_root[$key].'/'.$path; + break; } - } + } } } @@ -1718,15 +1718,15 @@ function img_picto($alt, $picto, $options = '', $pictoisfullpath = false, $srcon // Clean parameters if (! preg_match('/(\.png|\.gif)$/i',$picto)) $picto .= '.png'; // If alt path are defined, define url where img file is, according to physical path - foreach ($conf->file->dol_document_root as $type => $dirroot) // ex: array(["main"]=>"/home/maindir/htdocs", ["alt0"]=>"/home/moddir/htdocs", ...) + foreach ($conf->file->dol_document_root as $type => $dirroot) // ex: array(["main"]=>"/home/maindir/htdocs", ["alt0"]=>"/home/moddir/htdocs", ...) { - if ($type == 'main') continue; - if (file_exists($dirroot.'/'.$path.'/img/'.$picto)) - { - $url=$conf->file->dol_url_root[$type]; - break; - } - } + if ($type == 'main') continue; + if (file_exists($dirroot.'/'.$path.'/img/'.$picto)) + { + $url=$conf->file->dol_url_root[$type]; + break; + } + } // $url is '' or '/custom', $path is current theme or $fullpathpicto = $url.'/'.$path.'/img/'.$picto; diff --git a/htdocs/core/menus/standard/auguria.lib.php b/htdocs/core/menus/standard/auguria.lib.php index 204b43f97e0..d0dce2d236d 100644 --- a/htdocs/core/menus/standard/auguria.lib.php +++ b/htdocs/core/menus/standard/auguria.lib.php @@ -63,8 +63,8 @@ function print_auguria_menu($db,$atarget,$type_user,&$tabMenu,&$menu,$noout=0) $url = $shorturl = $newTabMenu[$i]['url']; if (! preg_match("/^(http:\/\/|https:\/\/)/i",$newTabMenu[$i]['url'])) { - $tmp=explode('?',$newTabMenu[$i]['url'],2); - $url = $shorturl = $tmp[0]; + $tmp=explode('?',$newTabMenu[$i]['url'],2); + $url = $shorturl = $tmp[0]; $param = (isset($tmp[1])?$tmp[1]:''); if (! preg_match('/mainmenu/i',$url) || ! preg_match('/leftmenu/i',$url)) $param.=($param?'&':'').'mainmenu='.$newTabMenu[$i]['mainmenu'].'&leftmenu='; diff --git a/htdocs/core/menus/standard/eldy.lib.php b/htdocs/core/menus/standard/eldy.lib.php index 7db79024c62..459d2dfd1fb 100644 --- a/htdocs/core/menus/standard/eldy.lib.php +++ b/htdocs/core/menus/standard/eldy.lib.php @@ -289,8 +289,8 @@ function print_eldy_menu($db,$atarget,$type_user,&$tabMenu,&$menu,$noout=0) $url = $shorturl = $newTabMenu[$i]['url']; if (! preg_match("/^(http:\/\/|https:\/\/)/i",$newTabMenu[$i]['url'])) { - $tmp=explode('?',$newTabMenu[$i]['url'],2); - $url = $shorturl = $tmp[0]; + $tmp=explode('?',$newTabMenu[$i]['url'],2); + $url = $shorturl = $tmp[0]; $param = (isset($tmp[1])?$tmp[1]:''); if (! preg_match('/mainmenu/i',$url) || ! preg_match('/leftmenu/i',$url)) $param.=($param?'&':'').'mainmenu='.$newTabMenu[$i]['mainmenu'].'&leftmenu='; @@ -1300,8 +1300,8 @@ function print_left_eldy_menu($db,$menu_array_before,$menu_array_after,&$tabMenu } // For external modules - $tmp=explode('?',$menu_array[$i]['url'],2); - $url = $tmp[0]; + $tmp=explode('?',$menu_array[$i]['url'],2); + $url = $tmp[0]; $param = (isset($tmp[1])?$tmp[1]:''); $url = dol_buildpath($url,1).($param?'?'.$param:''); diff --git a/htdocs/fourn/facture/fiche.php b/htdocs/fourn/facture/fiche.php index ba6b0b02061..6bf258cbb89 100644 --- a/htdocs/fourn/facture/fiche.php +++ b/htdocs/fourn/facture/fiche.php @@ -47,8 +47,8 @@ if (!empty($conf->projet->enabled)) { $langs->load('bills'); $langs->load('suppliers'); -$langs->load('companies'); -$langs->load('products'); +$langs->load('companies'); +$langs->load('products'); $mesg=''; $errors=array(); diff --git a/htdocs/index.php b/htdocs/index.php index 44aa2c6005c..6108985a0b6 100644 --- a/htdocs/index.php +++ b/htdocs/index.php @@ -61,14 +61,14 @@ if (! empty($conf->global->MAIN_MOTD)) $conf->global->MAIN_MOTD=preg_replace('//i','
',$conf->global->MAIN_MOTD); if (! empty($conf->global->MAIN_MOTD)) { - $i=0; - while (preg_match('/__\(([a-zA-Z|@]+)\)__/i',$conf->global->MAIN_MOTD,$reg) && $i < 100) - { - $tmp=explode('|',$reg[1]); - if (! empty($tmp[1])) $langs->load($tmp[1]); - $conf->global->MAIN_MOTD=preg_replace('/__\('.preg_quote($reg[1]).'\)__/i',$langs->trans($tmp[0]),$conf->global->MAIN_MOTD); - $i++; - } + $i=0; + while (preg_match('/__\(([a-zA-Z|@]+)\)__/i',$conf->global->MAIN_MOTD,$reg) && $i < 100) + { + $tmp=explode('|',$reg[1]); + if (! empty($tmp[1])) $langs->load($tmp[1]); + $conf->global->MAIN_MOTD=preg_replace('/__\('.preg_quote($reg[1]).'\)__/i',$langs->trans($tmp[0]),$conf->global->MAIN_MOTD); + $i++; + } print "\n\n"; print '\n"; $var=!$var; print ''; print ''; diff --git a/htdocs/comm/action/class/actioncomm.class.php b/htdocs/comm/action/class/actioncomm.class.php index ea08cfcc98d..0310f5e0cdd 100644 --- a/htdocs/comm/action/class/actioncomm.class.php +++ b/htdocs/comm/action/class/actioncomm.class.php @@ -40,9 +40,9 @@ class ActionComm extends CommonObject var $id; var $type_id; // id into parent table llx_c_actioncomm (will be deprecated into future, link should not be required) - var $type_code; // code into parent table llx_c_actioncomm (will be deprecated into future, link should not be required) + var $type_code; // code into parent table llx_c_actioncomm (will be deprecated into future, link should not be required). With defautl setup, should be AC_OTH_AUTO or AC_OTH var $type; // label into parent table llx_c_actioncomm (will be deprecated into future, link should not be required) - var $code; + var $code; // Free code to identify action. Ie: Agenda trigger add here AC_TRIGGERNAME ('AC_COMPANY_CREATE', 'AC_PROPAL_VALIDATE', ...) var $label; var $datec; // Date creation record (datec) diff --git a/htdocs/core/triggers/interface_50_modAgenda_ActionsAuto.class.php b/htdocs/core/triggers/interface_50_modAgenda_ActionsAuto.class.php index 1bb55c93fc4..7b6b6399587 100755 --- a/htdocs/core/triggers/interface_50_modAgenda_ActionsAuto.class.php +++ b/htdocs/core/triggers/interface_50_modAgenda_ActionsAuto.class.php @@ -555,6 +555,23 @@ class InterfaceActionsAuto $ok=1; } + // Projects + elseif ($action == 'PROJECT_CREATE') + { + dol_syslog("Trigger '".$this->name."' for action '$action' launched by ".__FILE__.". id=".$object->id); + $langs->load("other"); + $langs->load("projects"); + $langs->load("agenda"); + + $object->actiontypecode='AC_OTH_AUTO'; + if (empty($object->actionmsg2)) $object->actionmsg2=$langs->transnoentities("ProjectCreatedInDolibarr",$object->ref); + $object->actionmsg=$langs->transnoentities("ProjectCreatedInDolibarr",$object->ref); + $object->actionmsg.="\n".$langs->transnoentities("Project").': '.$object->ref; + $object->actionmsg.="\n".$langs->transnoentities("Author").': '.$user->login; + $object->sendtoid=0; + $ok=1; + } + // If not found /* else diff --git a/htdocs/install/mysql/data/llx_c_action_trigger.sql b/htdocs/install/mysql/data/llx_c_action_trigger.sql index 64f21465797..9f7bf87229c 100644 --- a/htdocs/install/mysql/data/llx_c_action_trigger.sql +++ b/htdocs/install/mysql/data/llx_c_action_trigger.sql @@ -1,6 +1,6 @@ -- Copyright (C) 2001-2004 Rodolphe Quiedeville -- Copyright (C) 2003 Jean-Louis Bergamo --- Copyright (C) 2004-2011 Laurent Destailleur +-- Copyright (C) 2004-2013 Laurent Destailleur -- Copyright (C) 2004 Benoit Mortier -- Copyright (C) 2004 Guillaume Delecourt -- Copyright (C) 2005-2011 Regis Houssin @@ -57,3 +57,4 @@ insert into llx_c_action_trigger (rowid,code,label,description,elementtype,rang) insert into llx_c_action_trigger (rowid,code,label,description,elementtype,rang) values (27,'MEMBER_DELETE','Member deleted','Executed when a member is deleted','member',25); insert into llx_c_action_trigger (rowid,code,label,description,elementtype,rang) values (28,'BILL_UNVALIDATE','Customer invoice unvalidated','Executed when a customer invoice status set back to draft','facture',10); insert into llx_c_action_trigger (rowid,code,label,description,elementtype,rang) values (29,'FICHINTER_SENTBYMAIL','Intervention sent by mail','Executed when a intervention is sent by mail','ficheinter',29); +insert into llx_c_action_trigger (rowid,code,label,description,elementtype,rang) values (30,'PROJECT_CREATE','Project creation','Executed when a project is created','project',30); diff --git a/htdocs/install/mysql/migration/3.4.0-3.5.0.sql b/htdocs/install/mysql/migration/3.4.0-3.5.0.sql index 858fb2a51e9..549397f99a0 100755 --- a/htdocs/install/mysql/migration/3.4.0-3.5.0.sql +++ b/htdocs/install/mysql/migration/3.4.0-3.5.0.sql @@ -72,3 +72,6 @@ DELETE FROM llx_boxes where box_id IN (SELECT rowid FROM llx_boxes_def where fil DELETE FROM llx_boxes_def where file='box_activity.php' AND note IS NULL; ALTER TABLE llx_cronjob ADD libname VARCHAR(255); + +INSERT INTO llx_c_action_trigger (rowid,code,label,description,elementtype,rang) values (30,'PROJECT_CREATE','Project creation','Executed when a project is created','project',30); + diff --git a/htdocs/langs/en_US/projects.lang b/htdocs/langs/en_US/projects.lang index 8c4624fb057..dd7f866505c 100644 --- a/htdocs/langs/en_US/projects.lang +++ b/htdocs/langs/en_US/projects.lang @@ -94,6 +94,7 @@ ConfirmCloneProject=Are you sure to clone this project ? ProjectReportDate=Change task date according project start date ErrorShiftTaskDate=Impossible to shift task date according to new project start date ProjectsAndTasksLines=Projects and tasks +ProjectCreatedInDolibarr=Project %s created ##### Types de contacts ##### TypeContact_project_internal_PROJECTLEADER=Project leader TypeContact_project_external_PROJECTLEADER=Project leader diff --git a/htdocs/langs/fr_FR/projects.lang b/htdocs/langs/fr_FR/projects.lang index 6cec42521be..8eb71da8999 100644 --- a/htdocs/langs/fr_FR/projects.lang +++ b/htdocs/langs/fr_FR/projects.lang @@ -94,6 +94,7 @@ ConfirmCloneProject=Êtes-vous sûr de vouloir cloner ce projet ? ProjectReportDate=Reporter les dates des tâches en fonction de la date de départ. ErrorShiftTaskDate=Une erreur c'est produite dans le report des dates des tâches. ProjectsAndTasksLines=Projets et tâches +ProjectCreatedInDolibarr=Projet %s créé ##### Types de contacts ##### TypeContact_project_internal_PROJECTLEADER=Chef de projet TypeContact_project_external_PROJECTLEADER=Chef de projet From 9619b09e37d28474740b698f816733ab989f87db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Salvador?= Date: Wed, 10 Jul 2013 15:27:32 +0200 Subject: [PATCH 41/48] rewriting to fit the new way to use hooks --- htdocs/core/class/hookmanager.class.php | 2 +- htdocs/core/class/html.formfile.class.php | 67 +++++++++++++---------- 2 files changed, 38 insertions(+), 31 deletions(-) diff --git a/htdocs/core/class/hookmanager.class.php b/htdocs/core/class/hookmanager.class.php index 773bd512d70..deac8b79211 100755 --- a/htdocs/core/class/hookmanager.class.php +++ b/htdocs/core/class/hookmanager.class.php @@ -131,7 +131,7 @@ class HookManager // Define type of hook ('output', 'returnvalue' or 'addreplace'). 'addreplace' should be type for all hooks. 'output' and 'returnvalue' are deprecated. $hooktype='output'; if (preg_match('/^pdf_/',$method)) $hooktype='returnvalue'; // pdf_xxx except pdf_writelinedesc are returnvalue hooks. When there is 2 hooks of this type, only last one win. - if (in_array($method,array('doActions','formObjectOptions','moveUploadedFile','pdf_writelinedesc','paymentsupplierinvoices','printSearchForm'))) $hooktype='addreplace'; + if (in_array($method,array('doActions','formObjectOptions','moveUploadedFile','pdf_writelinedesc','paymentsupplierinvoices','printSearchForm', 'formattachOptions', 'formBuilddocLineOptions'))) $hooktype='addreplace'; // Loop on each hook to qualify modules that declared context $modulealreadyexecuted=array(); diff --git a/htdocs/core/class/html.formfile.class.php b/htdocs/core/class/html.formfile.class.php index 5e17cf830a8..84946405a93 100644 --- a/htdocs/core/class/html.formfile.class.php +++ b/htdocs/core/class/html.formfile.class.php @@ -77,22 +77,22 @@ class FormFile { $maxlength=$size; - print "\n\n\n"; + $out = "\n\n\n"; if (empty($title)) $title=$langs->trans("AttachANewFile"); if ($title != 'none') print_titre($title); - print ''; - print ''; - print ''; - print ''; + $out .= ''; + $out .= ''; + $out .= ''; + $out .= ''; - print '
'; diff --git a/htdocs/install/etape1.php b/htdocs/install/etape1.php index 83dd849d9a0..36b26fd7953 100644 --- a/htdocs/install/etape1.php +++ b/htdocs/install/etape1.php @@ -359,7 +359,7 @@ if (! $error && $db->connected && $action == "set") $dir[5] = $main_data_dir."/ficheinter"; $dir[6] = $main_data_dir."/produit"; $dir[7] = $main_data_dir."/doctemplates"; - $dir[7] = $main_data_dir."/extensions"; + $dir[7] = $main_data_dir."/extensions"; // Boucle sur chaque repertoire de dir[] pour les creer s'ils nexistent pas $num=count($dir); diff --git a/htdocs/langs/ca_ES/paybox.lang b/htdocs/langs/ca_ES/paybox.lang index 147743058d3..4d8f8c160bf 100644 --- a/htdocs/langs/ca_ES/paybox.lang +++ b/htdocs/langs/ca_ES/paybox.lang @@ -1,38 +1,38 @@ -# Dolibarr language file - ca_ES - paybox -CHARSET=UTF-8 -PayBoxSetup=Configuració mòdul PayBox -PayBoxDesc=Aquest mòdul ofereix una pàgina de pagament a través del proveïdor Paybox per realitzar qualsevol pagament o un pagament en relació amb un objecte Dolibarr (factures, comandes ...) -PaymentForm=Formulari de pagament -FollowingUrlAreAvailableToMakePayments=Les següents URL estan disponibles per a permetre a un client fer un pagament -WelcomeOnPaymentPage=Benvingut als nostres serveis de pagament en línia -ThisScreenAllowsYouToPay=Aquesta pantalla li permet fer el seu pagament en línia destinat a %s. -ThisIsInformationOnPayment=Aquí està la informació sobre el pagament a realitzar -ToComplete=A completar -YourEMail=E-mail de confirmació de pagament -Creditor=Beneficiari -PaymentCode=Codi de pagament -PayBoxDoPayment=Continua el pagament amb targeta -YouWillBeRedirectedOnPayBox=Serà redirigit a la pàgina segura de PayBox per indicar la seva targeta de crèdit -PleaseBePatient=Espereu uns segons -Continue=Continuar -ToOfferALinkForOnlinePayment=URL de pagament %s -ToOfferALinkForOnlinePaymentOnOrder=URL que ofereix una interfície de pagament en línia %s basada en l'import d'una comanda de client -ToOfferALinkForOnlinePaymentOnInvoice=URL que ofereix una interfície de pagament en línia %s basada en l'import d'una factura a client -ToOfferALinkForOnlinePaymentOnContractLine=URL que ofereix una interfície de pagament en línia %s basada en l'import d'una línia de contracte -ToOfferALinkForOnlinePaymentOnFreeAmount=URL que ofereix una interfície de pagament en línia %s basada en un impport llíure -ToOfferALinkForOnlinePaymentOnMemberSubscription=URL que ofereix una interfície de pagament en línia %s basada en la cotització d'un membre -YouCanAddTagOnUrl=També pot afegir el paràmetre url &tag=value per a qualsevol d'aquestes adreces (obligatori només per al pagament lliure) per veure el seu propi codi de comentari de pagament. -SetupPayBoxToHavePaymentCreatedAutomatically=Configureu la vostra url Paybox %s per tal que el pagament es creu automàticament al validar. -YourPaymentHasBeenRecorded=Aquesta pàgina confirma que el pagament s'ha registrat correctament. Gràcies. -YourPaymentHasNotBeenRecorded=El seu pagament no ha estat registrat i la transacció ha estat anul.lada. Gràcies. -AccountParameter=Paràmetres del compte -UsageParameter=Paràmetres d'ús -InformationToFindParameters=Informació per trobar la seva configuració de compte %s -PAYBOX_CGI_URL_V2=Url del mòdul CGI Paybox de pagament -VendorName=Nom del venedor -CSSUrlForPaymentForm=Url del full d'estil CSS per al formulari de pagament -MessageOK=Missatge a la pàgina de retorn de pagament confirmat -MessageKO=Missatge a la pàgina de retorn de pagament cancel·lat -NewPayboxPaymentReceived=Nou pagament Paybox rebut -NewPayboxPaymentFailed=Nou intent de pagament Paybox sense èxit +# Dolibarr language file - ca_ES - paybox +CHARSET=UTF-8 +PayBoxSetup=Configuració mòdul PayBox +PayBoxDesc=Aquest mòdul ofereix una pàgina de pagament a través del proveïdor Paybox per realitzar qualsevol pagament o un pagament en relació amb un objecte Dolibarr (factures, comandes ...) +PaymentForm=Formulari de pagament +FollowingUrlAreAvailableToMakePayments=Les següents URL estan disponibles per a permetre a un client fer un pagament +WelcomeOnPaymentPage=Benvingut als nostres serveis de pagament en línia +ThisScreenAllowsYouToPay=Aquesta pantalla li permet fer el seu pagament en línia destinat a %s. +ThisIsInformationOnPayment=Aquí està la informació sobre el pagament a realitzar +ToComplete=A completar +YourEMail=E-mail de confirmació de pagament +Creditor=Beneficiari +PaymentCode=Codi de pagament +PayBoxDoPayment=Continua el pagament amb targeta +YouWillBeRedirectedOnPayBox=Serà redirigit a la pàgina segura de PayBox per indicar la seva targeta de crèdit +PleaseBePatient=Espereu uns segons +Continue=Continuar +ToOfferALinkForOnlinePayment=URL de pagament %s +ToOfferALinkForOnlinePaymentOnOrder=URL que ofereix una interfície de pagament en línia %s basada en l'import d'una comanda de client +ToOfferALinkForOnlinePaymentOnInvoice=URL que ofereix una interfície de pagament en línia %s basada en l'import d'una factura a client +ToOfferALinkForOnlinePaymentOnContractLine=URL que ofereix una interfície de pagament en línia %s basada en l'import d'una línia de contracte +ToOfferALinkForOnlinePaymentOnFreeAmount=URL que ofereix una interfície de pagament en línia %s basada en un impport llíure +ToOfferALinkForOnlinePaymentOnMemberSubscription=URL que ofereix una interfície de pagament en línia %s basada en la cotització d'un membre +YouCanAddTagOnUrl=També pot afegir el paràmetre url &tag=value per a qualsevol d'aquestes adreces (obligatori només per al pagament lliure) per veure el seu propi codi de comentari de pagament. +SetupPayBoxToHavePaymentCreatedAutomatically=Configureu la vostra url Paybox %s per tal que el pagament es creu automàticament al validar. +YourPaymentHasBeenRecorded=Aquesta pàgina confirma que el pagament s'ha registrat correctament. Gràcies. +YourPaymentHasNotBeenRecorded=El seu pagament no ha estat registrat i la transacció ha estat anul.lada. Gràcies. +AccountParameter=Paràmetres del compte +UsageParameter=Paràmetres d'ús +InformationToFindParameters=Informació per trobar la seva configuració de compte %s +PAYBOX_CGI_URL_V2=Url del mòdul CGI Paybox de pagament +VendorName=Nom del venedor +CSSUrlForPaymentForm=Url del full d'estil CSS per al formulari de pagament +MessageOK=Missatge a la pàgina de retorn de pagament confirmat +MessageKO=Missatge a la pàgina de retorn de pagament cancel·lat +NewPayboxPaymentReceived=Nou pagament Paybox rebut +NewPayboxPaymentFailed=Nou intent de pagament Paybox sense èxit PAYBOX_PAYONLINE_SENDEMAIL=E-Mail a avisar en cas de pagament (amb èxit o no) diff --git a/test/phpunit/FactureTestRounding.php b/test/phpunit/FactureTestRounding.php index 1c38fe17bad..449d33eafdf 100644 --- a/test/phpunit/FactureTestRounding.php +++ b/test/phpunit/FactureTestRounding.php @@ -173,7 +173,7 @@ class FactureTestRounding extends PHPUnit_Framework_TestCase $langs=$this->savlangs; $db=$this->savdb; - $conf->global->MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND=0; + $conf->global->MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND=0; $localobject=new Facture($this->savdb); $localobject->initAsSpecimen(); @@ -200,136 +200,136 @@ class FactureTestRounding extends PHPUnit_Framework_TestCase } - /** - * testFactureAddLine1 - * - * @return void - */ - public function testFactureAddLine1() - { - global $conf,$user,$langs,$db; - $conf=$this->savconf; - $user=$this->savuser; - $langs=$this->savlangs; - $db=$this->savdb; - - // With option MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND = 0 + /** + * testFactureAddLine1 + * + * @return void + */ + public function testFactureAddLine1() + { + global $conf,$user,$langs,$db; + $conf=$this->savconf; + $user=$this->savuser; + $langs=$this->savlangs; + $db=$this->savdb; + + // With option MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND = 0 $conf->global->MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND=0; - - $localobject1a=new Facture($this->savdb); - $localobject1a->initAsSpecimen('nolines'); - $facid=$localobject1a->create($user); - $localobject1a->addline($facid, 'Line 1', 6.36, 15, 21); // This include update_price - print __METHOD__." id=".$facid." total_ttc=".$localobject1a->total_ttc."\n"; - $this->assertEquals(95.40, $localobject1a->total_ht); - $this->assertEquals(20.03, $localobject1a->total_tva); - $this->assertEquals(115.43, $localobject1a->total_ttc); - - // With option MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND = 1 + + $localobject1a=new Facture($this->savdb); + $localobject1a->initAsSpecimen('nolines'); + $facid=$localobject1a->create($user); + $localobject1a->addline($facid, 'Line 1', 6.36, 15, 21); // This include update_price + print __METHOD__." id=".$facid." total_ttc=".$localobject1a->total_ttc."\n"; + $this->assertEquals(95.40, $localobject1a->total_ht); + $this->assertEquals(20.03, $localobject1a->total_tva); + $this->assertEquals(115.43, $localobject1a->total_ttc); + + // With option MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND = 1 $conf->global->MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND=1; - - $localobject1b=new Facture($this->savdb); - $localobject1b->initAsSpecimen('nolines'); - $facid=$localobject1b->create($user); - $localobject1b->addline($facid, 'Line 1', 6.36, 15, 21); // This include update_price - print __METHOD__." id=".$facid." total_ttc=".$localobject1b->total_ttc."\n"; - $this->assertEquals(95.40, $localobject1b->total_ht, 'testFactureAddLine1 total_ht'); - $this->assertEquals(20.03, $localobject1b->total_tva, 'testFactureAddLine1 total_tva'); - $this->assertEquals(115.43, $localobject1b->total_ttc, 'testFactureAddLine1 total_ttc'); - } - - /** - * testFactureAddLine2 - * - * @return void - * - * @depends testFactureAddLine1 - * The depends says test is run only if previous is ok - */ - public function testFactureAddLine2() - { - global $conf,$user,$langs,$db; - $conf=$this->savconf; - $user=$this->savuser; - $langs=$this->savlangs; - $db=$this->savdb; - - // With option MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND = 0 + + $localobject1b=new Facture($this->savdb); + $localobject1b->initAsSpecimen('nolines'); + $facid=$localobject1b->create($user); + $localobject1b->addline($facid, 'Line 1', 6.36, 15, 21); // This include update_price + print __METHOD__." id=".$facid." total_ttc=".$localobject1b->total_ttc."\n"; + $this->assertEquals(95.40, $localobject1b->total_ht, 'testFactureAddLine1 total_ht'); + $this->assertEquals(20.03, $localobject1b->total_tva, 'testFactureAddLine1 total_tva'); + $this->assertEquals(115.43, $localobject1b->total_ttc, 'testFactureAddLine1 total_ttc'); + } + + /** + * testFactureAddLine2 + * + * @return void + * + * @depends testFactureAddLine1 + * The depends says test is run only if previous is ok + */ + public function testFactureAddLine2() + { + global $conf,$user,$langs,$db; + $conf=$this->savconf; + $user=$this->savuser; + $langs=$this->savlangs; + $db=$this->savdb; + + // With option MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND = 0 $conf->global->MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND=0; - - $localobject2=new Facture($this->savdb); - $localobject2->initAsSpecimen('nolines'); - $facid=$localobject2->create($user); - $localobject2->addline($facid, 'Line 1', 6.36, 5, 21); - $localobject2->addline($facid, 'Line 2', 6.36, 5, 21); - $localobject2->addline($facid, 'Line 3', 6.36, 5, 21); - print __METHOD__." id=".$facid." total_ttc=".$localobject2->total_ttc."\n"; - $this->assertEquals(95.40, $localobject2->total_ht); - $this->assertEquals(20.04, $localobject2->total_tva); - $this->assertEquals(115.44, $localobject2->total_ttc); - - // With option MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND = 1 + + $localobject2=new Facture($this->savdb); + $localobject2->initAsSpecimen('nolines'); + $facid=$localobject2->create($user); + $localobject2->addline($facid, 'Line 1', 6.36, 5, 21); + $localobject2->addline($facid, 'Line 2', 6.36, 5, 21); + $localobject2->addline($facid, 'Line 3', 6.36, 5, 21); + print __METHOD__." id=".$facid." total_ttc=".$localobject2->total_ttc."\n"; + $this->assertEquals(95.40, $localobject2->total_ht); + $this->assertEquals(20.04, $localobject2->total_tva); + $this->assertEquals(115.44, $localobject2->total_ttc); + + // With option MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND = 1 $conf->global->MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND=1; - - $localobject2=new Facture($this->savdb); - $localobject2->initAsSpecimen('nolines'); - $facid=$localobject2->create($user); - $localobject2->addline($facid, 'Line 1', 6.36, 5, 21); - $localobject2->addline($facid, 'Line 2', 6.36, 5, 21); - $localobject2->addline($facid, 'Line 3', 6.36, 5, 21); - print __METHOD__." id=".$facid." total_ttc=".$localobject2->total_ttc."\n"; - $this->assertEquals(95.40, $localobject2->total_ht); - $this->assertEquals(20.03, $localobject2->total_tva); - $this->assertEquals(115.43, $localobject2->total_ttc); - } - - /** - * testFactureAddLine3 - * - * @return void - * - * @depends testFactureAddLine2 - * The depends says test is run only if previous is ok - */ - public function testFactureAddLine3() - { - global $conf,$user,$langs,$db; - $conf=$this->savconf; - $user=$this->savuser; - $langs=$this->savlangs; - $db=$this->savdb; - - // With option MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND = 0 + + $localobject2=new Facture($this->savdb); + $localobject2->initAsSpecimen('nolines'); + $facid=$localobject2->create($user); + $localobject2->addline($facid, 'Line 1', 6.36, 5, 21); + $localobject2->addline($facid, 'Line 2', 6.36, 5, 21); + $localobject2->addline($facid, 'Line 3', 6.36, 5, 21); + print __METHOD__." id=".$facid." total_ttc=".$localobject2->total_ttc."\n"; + $this->assertEquals(95.40, $localobject2->total_ht); + $this->assertEquals(20.03, $localobject2->total_tva); + $this->assertEquals(115.43, $localobject2->total_ttc); + } + + /** + * testFactureAddLine3 + * + * @return void + * + * @depends testFactureAddLine2 + * The depends says test is run only if previous is ok + */ + public function testFactureAddLine3() + { + global $conf,$user,$langs,$db; + $conf=$this->savconf; + $user=$this->savuser; + $langs=$this->savlangs; + $db=$this->savdb; + + // With option MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND = 0 $conf->global->MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND=0; - - $localobject3=new Facture($this->savdb); - $localobject3->initAsSpecimen('nolines'); - $facid=$localobject3->create($user); - $localobject3->addline($facid, 'Line 1', 6.36, 3, 21); - $localobject3->addline($facid, 'Line 2', 6.36, 3, 21); - $localobject3->addline($facid, 'Line 3', 6.36, 3, 21); - $localobject3->addline($facid, 'Line 4', 6.36, 3, 21); - $localobject3->addline($facid, 'Line 5', 6.36, 3, 21); - print __METHOD__." id=".$facid." total_ttc=".$localobject3->total_ttc."\n"; - $this->assertEquals(95.40, $localobject3->total_ht); - $this->assertEquals(20.05, $localobject3->total_tva); - $this->assertEquals(115.45, $localobject3->total_ttc); - - // With option MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND = 1 + + $localobject3=new Facture($this->savdb); + $localobject3->initAsSpecimen('nolines'); + $facid=$localobject3->create($user); + $localobject3->addline($facid, 'Line 1', 6.36, 3, 21); + $localobject3->addline($facid, 'Line 2', 6.36, 3, 21); + $localobject3->addline($facid, 'Line 3', 6.36, 3, 21); + $localobject3->addline($facid, 'Line 4', 6.36, 3, 21); + $localobject3->addline($facid, 'Line 5', 6.36, 3, 21); + print __METHOD__." id=".$facid." total_ttc=".$localobject3->total_ttc."\n"; + $this->assertEquals(95.40, $localobject3->total_ht); + $this->assertEquals(20.05, $localobject3->total_tva); + $this->assertEquals(115.45, $localobject3->total_ttc); + + // With option MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND = 1 $conf->global->MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND=1; - - $localobject3=new Facture($this->savdb); - $localobject3->initAsSpecimen('nolines'); - $facid=$localobject3->create($user); - $localobject3->addline($facid, 'Line 1', 6.36, 3, 21); - $localobject3->addline($facid, 'Line 2', 6.36, 3, 21); - $localobject3->addline($facid, 'Line 3', 6.36, 3, 21); - $localobject3->addline($facid, 'Line 4', 6.36, 3, 21); - $localobject3->addline($facid, 'Line 5', 6.36, 3, 21); - print __METHOD__." id=".$facid." total_ttc=".$localobject3->total_ttc."\n"; - $this->assertEquals(95.40, $localobject3->total_ht); - $this->assertEquals(20.03, $localobject3->total_tva); - $this->assertEquals(115.43, $localobject3->total_ttc); + + $localobject3=new Facture($this->savdb); + $localobject3->initAsSpecimen('nolines'); + $facid=$localobject3->create($user); + $localobject3->addline($facid, 'Line 1', 6.36, 3, 21); + $localobject3->addline($facid, 'Line 2', 6.36, 3, 21); + $localobject3->addline($facid, 'Line 3', 6.36, 3, 21); + $localobject3->addline($facid, 'Line 4', 6.36, 3, 21); + $localobject3->addline($facid, 'Line 5', 6.36, 3, 21); + print __METHOD__." id=".$facid." total_ttc=".$localobject3->total_ttc."\n"; + $this->assertEquals(95.40, $localobject3->total_ht); + $this->assertEquals(20.03, $localobject3->total_tva); + $this->assertEquals(115.43, $localobject3->total_ttc); } } diff --git a/test/phpunit/PricesTest.php b/test/phpunit/PricesTest.php index 57a95b0b40a..101fd670ac3 100755 --- a/test/phpunit/PricesTest.php +++ b/test/phpunit/PricesTest.php @@ -200,7 +200,7 @@ class PricesTest extends PHPUnit_Framework_TestCase $this->savlangs=$langs; $this->savdb=$db; - $conf->global->MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND=0; + $conf->global->MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND=0; // Two lines of 1.24 give 2.48 HT and 2.72 TTC with standard vat rounding mode $localobject=new Facture($this->savdb); From 0de1fe893a6fc4ff7272c62cbf14c06a596fd1c4 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 7 Jul 2013 13:30:30 +0200 Subject: [PATCH 28/48] Prepare 3.4 --- build/exe/doliwamp/doliwamp.iss | 4 ++-- build/makepack-dolibarr.pl | 2 +- build/rpm/dolibarr_fedora.spec | 4 ++-- build/rpm/dolibarr_generic.spec | 3 ++- build/rpm/dolibarr_mandriva.spec | 4 ++-- build/rpm/dolibarr_opensuse.spec | 3 ++- htdocs/filefunc.inc.php | 2 +- 7 files changed, 12 insertions(+), 10 deletions(-) diff --git a/build/exe/doliwamp/doliwamp.iss b/build/exe/doliwamp/doliwamp.iss index 41e860e5927..7510ff88152 100644 --- a/build/exe/doliwamp/doliwamp.iss +++ b/build/exe/doliwamp/doliwamp.iss @@ -17,9 +17,9 @@ ; ----- Change this ----- AppName=DoliWamp ; DoliWamp-x.x.x or DoliWamp-x.x.x-alpha or DoliWamp-x.x.x-beta or DoliWamp-x.x.x-rc or DoliWamp-x.x.x -AppVerName=DoliWamp-3.4.0-beta +AppVerName=DoliWamp-3.4.0 ; DoliWamp-x.x x or DoliWamp-x.x.x-alpha or DoliWamp-x.x.x-beta or DoliWamp-x.x.x-rc or DoliWamp-x.x.x -OutputBaseFilename=DoliWamp-3.4.0-beta +OutputBaseFilename=DoliWamp-3.4.0 ; Define full path from wich all relative path are defined ; You must modify this to put here your dolibarr root directory ;SourceDir=Z:\home\ldestailleur\git\dolibarrxxx diff --git a/build/makepack-dolibarr.pl b/build/makepack-dolibarr.pl index c6bb2a1f174..dd348af17a6 100755 --- a/build/makepack-dolibarr.pl +++ b/build/makepack-dolibarr.pl @@ -10,7 +10,7 @@ use Cwd; $PROJECT="dolibarr"; $MAJOR="3"; $MINOR="4"; -$BUILD="0-beta"; # Mettre x pour release, x-dev pour dev, x-beta pour beta, x-rc pour release candidate +$BUILD="0"; # Mettre x pour release, x-dev pour dev, x-beta pour beta, x-rc pour release candidate $RPMSUBVERSION="auto"; # auto use value found into BUILD @LISTETARGET=("TGZ","ZIP","RPM_GENERIC","RPM_FEDORA","RPM_MANDRIVA","RPM_OPENSUSE","DEB","APS","EXEDOLIWAMP","SNAPSHOT"); # Possible packages diff --git a/build/rpm/dolibarr_fedora.spec b/build/rpm/dolibarr_fedora.spec index b4ced0c5088..1479a5bf023 100755 --- a/build/rpm/dolibarr_fedora.spec +++ b/build/rpm/dolibarr_fedora.spec @@ -320,7 +320,7 @@ then fi - +# version x.y.z-0.1.a for alpha, x.y.z-0.2.b for beta, x.y.z-0.3 for release %changelog -* Sun Feb 17 2013 Laurent Destailleur 3.4.0-0.1.b +* Sun Feb 17 2013 Laurent Destailleur 3.4.0-0.3 - Initial version (#723326) diff --git a/build/rpm/dolibarr_generic.spec b/build/rpm/dolibarr_generic.spec index cdc0ce0714a..76cd214359e 100755 --- a/build/rpm/dolibarr_generic.spec +++ b/build/rpm/dolibarr_generic.spec @@ -538,6 +538,7 @@ fi +# version x.y.z-0.1.a for alpha, x.y.z-0.2.b for beta, x.y.z-0.3 for release %changelog -* Sun Feb 17 2013 Laurent Destailleur 3.4.0-0.1.b +* Sun Feb 17 2013 Laurent Destailleur 3.4.0-0.3 - Initial version (#723326) diff --git a/build/rpm/dolibarr_mandriva.spec b/build/rpm/dolibarr_mandriva.spec index 51d911148eb..e93c6ad87a9 100755 --- a/build/rpm/dolibarr_mandriva.spec +++ b/build/rpm/dolibarr_mandriva.spec @@ -321,7 +321,7 @@ then fi - +# version x.y.z-0.1.a for alpha, x.y.z-0.2.b for beta, x.y.z-0.3 for release %changelog -* Sun Feb 17 2013 Laurent Destailleur 3.4.0-0.1.b +* Sun Feb 17 2013 Laurent Destailleur 3.4.0-0.3 - Initial version (#723326) diff --git a/build/rpm/dolibarr_opensuse.spec b/build/rpm/dolibarr_opensuse.spec index 7744c43695b..9d35c70b419 100755 --- a/build/rpm/dolibarr_opensuse.spec +++ b/build/rpm/dolibarr_opensuse.spec @@ -333,6 +333,7 @@ fi +# version x.y.z-0.1.a for alpha, x.y.z-0.2.b for beta, x.y.z-0.3 for release %changelog -* Sun Feb 17 2013 Laurent Destailleur 3.4.0-0.1.b +* Sun Feb 17 2013 Laurent Destailleur 3.4.0-0.3 - Initial version (#723326) diff --git a/htdocs/filefunc.inc.php b/htdocs/filefunc.inc.php index 545a0254eed..5462c1fda7f 100755 --- a/htdocs/filefunc.inc.php +++ b/htdocs/filefunc.inc.php @@ -29,7 +29,7 @@ * \brief File that include conf.php file and commons lib like functions.lib.php */ -if (! defined('DOL_VERSION')) define('DOL_VERSION','3.4.0-beta'); +if (! defined('DOL_VERSION')) define('DOL_VERSION','3.4.0'); if (! defined('EURO')) define('EURO',chr(128)); // Define syslog constants From b16689e8b7a5ee251f13bb81556519f1392d97b8 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 7 Jul 2013 13:32:45 +0200 Subject: [PATCH 29/48] Prepare 3.4 --- build/pad/pad_dolibarr.xml | 4 ++-- build/pad/pad_doliwamp.xml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/build/pad/pad_dolibarr.xml b/build/pad/pad_dolibarr.xml index d3550c7c57e..bd379443cf7 100644 --- a/build/pad/pad_dolibarr.xml +++ b/build/pad/pad_dolibarr.xml @@ -35,8 +35,8 @@ Dolibarr 3.4 - 05 - 17 + 07 + 07 2013 diff --git a/build/pad/pad_doliwamp.xml b/build/pad/pad_doliwamp.xml index 7e4c779489b..320751fd489 100644 --- a/build/pad/pad_doliwamp.xml +++ b/build/pad/pad_doliwamp.xml @@ -35,8 +35,8 @@ DoliWamp 3.4 - 05 - 17 + 07 + 07 2013 From a687cc429cff244e727f7b9595df2db591110d53 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 7 Jul 2013 13:35:29 +0200 Subject: [PATCH 30/48] Update doc for 3.4 --- build/makepack-howto.txt | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/build/makepack-howto.txt b/build/makepack-howto.txt index 0f5ffef71d9..5a130227945 100644 --- a/build/makepack-howto.txt +++ b/build/makepack-howto.txt @@ -9,13 +9,13 @@ beta version of Dolibarr, step by step. - Check all files are commited. - Update version/info in /ChangeLog -- Update version number with x.x.x-y in htdocs/filefunc.inc.php -- Update version number with x.x.x-y in build/makepack-dolibarr.pl -- Update version number with x.x.x-y in build/debian/changelog -- Update version number with x.x.x-y in build/exe/doliwamp/doliwamp.iss -- Update version number with x.x.x-y in build/rpm/*.spec -- Update version number with x.x.x in build/doxygen/dolibarr-doxygen.doxyfile -- Update version number with x.x.x in build/perl/virtualmin/dolibarr.pl +- Update version number with x.y.z-w in htdocs/filefunc.inc.php +- Update version number with x.y.z-w in build/makepack-dolibarr.pl +- Update version number with x.y.z-w in build/debian/changelog +- Update version number with x.y.z-w in build/exe/doliwamp/doliwamp.iss +- Update version number with x.y.z-w in build/rpm/*.spec +- Update version number with x.y.z in build/doxygen/dolibarr-doxygen.doxyfile +- Update version number with x.y.z in build/perl/virtualmin/dolibarr.pl - Commit all changes. - Add a Tag (x.y.betaz_YYYYMMDD) and push it: git push --tags - Create a branch (x.y). @@ -33,14 +33,14 @@ complete release of Dolibarr, step by step. - Check all files are commited. - Update version/info in ChangeLog -- Update version number with x.x.x in htdocs/filefunc.inc.php -- Update version number with x.x.x in build/makepack-dolibarr.pl -- Update version number with x.x.x in build/debian/changelog -- Update version number with x.x.x in build/exe/doliwamp/doliwamp.iss -- Update version number with x.x.x in build/rpm/*.spec +- Update version number with x.y.z in htdocs/filefunc.inc.php +- Update version number with x.y.z in build/makepack-dolibarr.pl +- Update version number with x.y.z in build/debian/changelog +- Update version number with x.y.z in build/exe/doliwamp/doliwamp.iss +- Update version number with x.y.z in build/rpm/*.spec - Update PAD files. - Commit all changes. -- Add a Tag (DOLIBARR_x_y) +- Add a Tag (x.y.z) - Build Dolibarr and DoliWamp packages with makepack-dolibarr.pl - Check content of built packages. From 05461c47cc403f66d418ab8d0fa99b6aa56cfe64 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 7 Jul 2013 23:22:00 +0200 Subject: [PATCH 31/48] Fix: vat rate for slovenia --- htdocs/install/mysql/data/llx_c_tva.sql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/install/mysql/data/llx_c_tva.sql b/htdocs/install/mysql/data/llx_c_tva.sql index df651bdb6f7..d96bc2d3f36 100644 --- a/htdocs/install/mysql/data/llx_c_tva.sql +++ b/htdocs/install/mysql/data/llx_c_tva.sql @@ -211,8 +211,8 @@ INSERT INTO llx_c_tva(rowid,fk_pays,taux,recuperableonly,note,active) VALUES (20 INSERT INTO llx_c_tva(rowid,fk_pays,taux,recuperableonly,note,active) VALUES (2013, 201, '0', '0', 'VAT Rate 0', 1); -- SLOVENIA (id country=202) -INSERT INTO llx_c_tva(rowid,fk_pays,taux,recuperableonly,note,active) VALUES (2021, 202, '20', '0', 'VAT standard rate', 1); -INSERT INTO llx_c_tva(rowid,fk_pays,taux,recuperableonly,note,active) VALUES (2022, 202,'8.5', '0', 'VAT reduced rate', 1); +INSERT INTO llx_c_tva(rowid,fk_pays,taux,recuperableonly,note,active) VALUES (2021, 202, '22', '0', 'VAT standard rate', 1); +INSERT INTO llx_c_tva(rowid,fk_pays,taux,recuperableonly,note,active) VALUES (2022, 202,'9.5', '0', 'VAT reduced rate', 1); INSERT INTO llx_c_tva(rowid,fk_pays,taux,recuperableonly,note,active) VALUES (2023, 202, '0', '0', 'VAT Rate 0', 1); -- SPAIN (id country=4) From b26250c45a06e050a2a34049d8f902ba02b2d2be Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 7 Jul 2013 23:37:56 +0200 Subject: [PATCH 32/48] Fix when alt path is full url instead of relative. --- htdocs/core/lib/functions.lib.php | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 9c878615a19..cc4b2aac7f0 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -287,8 +287,14 @@ function dol_buildpath($path, $type=0) //print $key.'-'.$dirroot.'/'.$path.'-'.$conf->file->dol_url_root[$type].'
'."\n"; if (file_exists($dirroot.'/'.$path)) { - if ($type == 1) $res=DOL_URL_ROOT.$conf->file->dol_url_root[$key].'/'.$path; - if ($type == 2) $res=DOL_MAIN_URL_ROOT.$conf->file->dol_url_root[$key].'/'.$path; + if ($type == 1) + { + $res=(preg_match('/^http/i',$conf->file->dol_url_root[$key])?'':DOL_URL_ROOT).$conf->file->dol_url_root[$key].'/'.$path; + } + if ($type == 2) + { + $res=(preg_match('/^http/i',$conf->file->dol_url_root[$key])?'':DOL_MAIN_URL_ROOT).$conf->file->dol_url_root[$key].'/'.$path; + } break; } } From c1cb5e9bffde4492f3c483855a7afbafda4c5166 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 9 Jul 2013 00:19:58 +0200 Subject: [PATCH 33/48] Fix geoipmaxmind module --- htdocs/admin/geoipmaxmind.php | 10 +++++++++- htdocs/core/class/dolgeoip.class.php | 8 ++++---- htdocs/langs/en_US/admin.lang | 2 +- htdocs/langs/fr_FR/admin.lang | 2 +- 4 files changed, 15 insertions(+), 7 deletions(-) diff --git a/htdocs/admin/geoipmaxmind.php b/htdocs/admin/geoipmaxmind.php index 675abfbc634..2b72a4395ca 100644 --- a/htdocs/admin/geoipmaxmind.php +++ b/htdocs/admin/geoipmaxmind.php @@ -67,7 +67,6 @@ if ($action == 'set') } - /* * View */ @@ -85,6 +84,13 @@ $geoip=''; if (! empty($conf->global->GEOIPMAXMIND_COUNTRY_DATAFILE)) { $geoip=new DolGeoIP('country',$conf->global->GEOIPMAXMIND_COUNTRY_DATAFILE); + //if ($geoip->error) print dol_htmloutput_errors($geoip->errorlabel,'',1); + if ($geoip->gi == 'NOGI') $geointernal=true; + else $geointernal=false; +} +else +{ + if (function_exists('geoip_country_code_by_name')) $geointernal=true; } // Mode @@ -102,6 +108,8 @@ print "
'.$langs->trans("PathToGeoIPMaxmindCountryDataFile").''; + +if ($geointernal) print 'Using geoip PHP internal functions. Value must be '.geoip_db_filename(GEOIP_COUNTRY_EDITION).' or '.geoip_db_filename(GEOIP_CITY_EDITION_REV1).'
'; print ''; if ($geoip) $version=$geoip->getVersion(); if ($version) diff --git a/htdocs/core/class/dolgeoip.class.php b/htdocs/core/class/dolgeoip.class.php index f8ccd749bb3..14364ea7902 100644 --- a/htdocs/core/class/dolgeoip.class.php +++ b/htdocs/core/class/dolgeoip.class.php @@ -65,18 +65,18 @@ class DolGeoIP print $this->errorlabel; return 0; } - if (! file_exists($datfile)) + if (! file_exists($datfile) || ! is_readable($datfile)) { //dol_syslog("DolGeoIP::DolGeoIP datafile ".$datfile." can not be read", LOG_ERR); $this->error='ErrorGeoIPClassNotInitialized'; $this->errorlabel="Datafile ".$datfile." not found"; - print $this->errorlabel; + print $this->errorlabel; // To be sure to understand when it fails on screens return 0; } if (function_exists('geoip_open')) { - $this->gi = geoip_open($datfile,GEOIP_STANDARD); + $this->gi = geoip_open($datfile,GEOIP_STANDARD); } else { @@ -133,7 +133,7 @@ class DolGeoIP function getVersion() { if ($this->gi == 'NOGI') return geoip_database_info(); - return ''; + return 'Not available (not using PHP internal geo functions)'; } /** diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index 123dad3b434..febeb84a032 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -1420,7 +1420,7 @@ SuppliersInvoiceModel=Complete template of supplier invoice (logo...) SuppliersInvoiceNumberingModel=Supplier invoices numbering models ##### GeoIPMaxmind ##### GeoIPMaxmindSetup=GeoIP Maxmind module setup -PathToGeoIPMaxmindCountryDataFile=Path to file containing Maxmind ip to country translation.
Example: /usr/local/share/GeoIP/GeoIP.dat +PathToGeoIPMaxmindCountryDataFile=Path to file containing Maxmind ip to country translation.
Examples:
/usr/local/share/GeoIP/GeoIP.dat
/usr/share/GeoIP/GeoIP.dat NoteOnPathLocation=Note that your ip to country data file must be inside a directory your PHP can read (Check your PHP open_basedir setup and filesystem permissions). YouCanDownloadFreeDatFileTo=You can download a free demo version of the Maxmind GeoIP country file at %s. YouCanDownloadAdvancedDatFileTo=You can also download a more complete version, with updates, of the Maxmind GeoIP country file at %s. diff --git a/htdocs/langs/fr_FR/admin.lang b/htdocs/langs/fr_FR/admin.lang index 5aa88277963..b2e9f7c810b 100644 --- a/htdocs/langs/fr_FR/admin.lang +++ b/htdocs/langs/fr_FR/admin.lang @@ -1422,7 +1422,7 @@ SuppliersInvoiceModel=Modèle de factures fournisseur complet (logo…) SuppliersInvoiceNumberingModel=Modèles de numérotation des factures fournisseur ##### GeoIPMaxmind ##### GeoIPMaxmindSetup=Configuration du module GeoIP Maxmind -PathToGeoIPMaxmindCountryDataFile=Chemin du fichier Maxmind contenant les conversions IP->Pays.
Exemple: /usr/local/share/GeoIP/GeoIP.dat +PathToGeoIPMaxmindCountryDataFile=Chemin du fichier Maxmind contenant les conversions IP->Pays.
Exemples
/usr/local/share/GeoIP/GeoIP.dat
/usr/share/GeoIP/GeoIP.dat NoteOnPathLocation=Notez que ce fichier doit être dans un répertoire accessible à votre PHP (Vérifiez le paramètre open_basedir de votre PHP et les permissions du fichier/répertoires). YouCanDownloadFreeDatFileTo=Vous pouvez télécharger une version démo gratuite de la base Maxmind à l'adresse %s. YouCanDownloadAdvancedDatFileTo=Vous pouvez aussi télécharger une version plus complète avec mise à jours de la base Maxmind à l'adresse %s. From 5706779c8b1bea3d4b40ed9f26f817f53c82570d Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 9 Jul 2013 13:50:20 +0200 Subject: [PATCH 34/48] New: Add a page on performance advice --- htdocs/admin/system/perf.php | 451 ++++++++++++++++++++++++ htdocs/admin/system/xdebug.php | 2 +- htdocs/core/lib/geturl.lib.php | 7 +- htdocs/core/menus/standard/eldy.lib.php | 5 +- htdocs/langs/en_US/admin.lang | 22 ++ htdocs/langs/fr_FR/admin.lang | 21 +- 6 files changed, 502 insertions(+), 6 deletions(-) create mode 100644 htdocs/admin/system/perf.php diff --git a/htdocs/admin/system/perf.php b/htdocs/admin/system/perf.php new file mode 100644 index 00000000000..f0f95b62d15 --- /dev/null +++ b/htdocs/admin/system/perf.php @@ -0,0 +1,451 @@ + + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/** + * \file htdocs/admin/system/perf.php + * \brief Page to show Performance information + */ + +require '../../main.inc.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/memory.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/geturl.lib.php'; + +$langs->load("admin"); +$langs->load("install"); +$langs->load("other"); + +if (! $user->admin) + accessforbidden(); + +if (GETPOST('action') == 'donothing') +{ + exit; +} + + +/* + * View + */ + +$form=new Form($db); +$nowstring=dol_print_date(dol_now(),'dayhourlog'); + +llxHeader(); + +print_fiche_titre($langs->trans("PerfDolibarr"),'','setup'); + +print $langs->trans("YouMayFindPerfAdviceHere",'http://wiki.dolibarr.org/index.php/FAQ_Increase_Performance').' ('.$langs->trans("Reload").')
'; + +// XDebug +print '
'; +print ''.$langs->trans("XDebug").': '; +$test=!function_exists('xdebug_is_enabled'); +if ($test) print img_picto('','tick.png').' '.$langs->trans("NotInstalled"); +else +{ + print img_picto('','warning').' '.$langs->trans("XDebugInstalled"); + print $langs->trans("MoreInformation").' XDebug admin page'; +} +print '
'; + +// Applicative cache +print '
'; +print ''.$langs->trans("ApplicativeCache").': '; +$test=!empty($conf->memcached->enabled); +if ($test) +{ + if (!empty($conf->global->MEMCACHED_SERVER)) + { + print img_picto('','tick.png').' '.$langs->trans("MemcachedAvailableAndSetup"); + print $langs->trans("MoreInformation").' Memcached module admin page'; + } + else + { + print img_picto('','warning').' '.$langs->trans("MemcachedModuleAvailableButNotSetup"); + } +} +else print img_picto('','warning').' '.$langs->trans("MemcachedNotAvailable"); +print '
'; + +// OPCode cache +print '
'; +print ''.$langs->trans("OPCodeCache").': '; +$test1=function_exists('xcache_info'); +if ($test1) +{ + print img_picto('','tick.png').' '.$langs->trans("XCacheInstalled"); + print $langs->trans("MoreInformation").' Xcache admin page'; +} +else +{ + $test2=function_exists('eaccelerator_info'); + if ($test2) print img_picto('','tick.png').' '.$langs->trans("EAcceleratorInstalled"); + else print $langs->trans("NoOPCodeCacheFound"); +} +print '
'; + +// HTTPCacheStaticResources +print ''; + + +print '
'; +print ''.$langs->trans("HTTPCacheStaticResources").' - '; +print $langs->trans("CacheByServer").':
'; +// No cahce on PHP +//print '
'.img_picto('','warning.png').' '.$langs->trans("FilesOfTypeNotCompressed",'php (.php)').'
'; +//print '
'.img_picto('','tick.png').' '.$langs->trans("FilesOfTypeNotCached",'php (.php)').'
'; +// Cache on rest +print '
'.img_picto('','tick.png').' '.$langs->trans("FilesOfTypeCached",'css (.css)').'
'; +print '
'.img_picto('','warning.png').' '.$langs->trans("FilesOfTypeNotCached",'css (.css)').'
'; +print '
'.img_picto('','tick.png').' '.$langs->trans("FilesOfTypeCached",'css (.css.php)').'
'; +print '
'.img_picto('','warning.png').' '.$langs->trans("FilesOfTypeNotCached",'css (.css.php)').'
'; +print '
'.img_picto('','tick.png').' '.$langs->trans("FilesOfTypeCached",'img (.png)').'
'; +print '
'.img_picto('','warning.png').' '.$langs->trans("FilesOfTypeNotCached",'img (.png)').'
'; +print '
'.img_picto('','tick.png').' '.$langs->trans("FilesOfTypeCached",'javascript (.js)').'
'; +print '
'.img_picto('','warning.png').' '.$langs->trans("FilesOfTypeNotCached",'javascript (.js)').'
'; +print '
'.img_picto('','tick.png').' '.$langs->trans("FilesOfTypeCached",'javascript (.js.php)').'
'; +print '
'.img_picto('','warning.png').' '.$langs->trans("FilesOfTypeNotCached",'javascript (.js.php)').'
'; +print '
'; +print ''.$langs->trans("HTTPCacheStaticResources").' - '; +print $langs->trans("CacheByClient").':
'; +print $langs->trans("TestNotPossibleWithCurrentBrowsers").'
'; + + +// Compressions +print '
'; +print ''.$langs->trans("CompressionOfResources").': '; +//$tmp=getURLContent(DOL_URL_ROOT.'/index.php','GET');var_dump($tmp); +print '
'; +// on PHP +print '
'.img_picto('','tick.png').' '.$langs->trans("FilesOfTypeCompressed",'php (.php)').'
'; +print '
'.img_picto('','warning.png').' '.$langs->trans("FilesOfTypeNotCompressed",'php (.php)').'
'; +// on rest +print '
'.img_picto('','tick.png').' '.$langs->trans("FilesOfTypeCompressed",'css (.css)').'
'; +print '
'.img_picto('','warning.png').' '.$langs->trans("FilesOfTypeNotCompressed",'css (.css)').'
'; +print '
'.img_picto('','tick.png').' '.$langs->trans("FilesOfTypeCompressed",'css (.css.php)').'
'; +print '
'.img_picto('','warning.png').' '.$langs->trans("FilesOfTypeNotCompressed",'css (.css.php)').'
'; +//print '
'.img_picto('','tick.png').' '.$langs->trans("FilesOfTypeCompressed",'img (.png)').'
'; +//print '
'.img_picto('','warning.png').' '.$langs->trans("FilesOfTypeNotCompressed",'img (.png)').'
'; +print '
'.img_picto('','tick.png').' '.$langs->trans("FilesOfTypeCompressed",'javascript (.js)').'
'; +print '
'.img_picto('','warning.png').' '.$langs->trans("FilesOfTypeNotCompressed",'javascript (.js)').'
'; +print '
'.img_picto('','tick.png').' '.$langs->trans("FilesOfTypeCompressed",'javascript (.js.php)').'
'; +print '
'.img_picto('','warning.png').' '.$langs->trans("FilesOfTypeNotCompressed",'javascript (.js.php)').'
'; + +// Database driver +print '
'; +print ''.$langs->trans("DriverType").': '; +print '
'; +if ($conf->db->type == 'mysql' || $conf->db->type == 'mysqli') +{ + $test=($conf->db->type == 'mysqli'); + if ($test) + { + print img_picto('','tick.png').' '.$langs->trans("YouUseBestDriver",$conf->db->type); + } + else + { + print img_picto('','warning.png').' '.$langs->trans("YouDoNotUseBestDriver",$conf->db->type,'mysqli'); + } + print '
'; +} + +// Product search +print '
'; +print ''.$langs->trans("ProductSearch").': '; +print '
'; +$tab = array(); +$sql = "SELECT COUNT(*) as nb"; +$sql.= " FROM ".MAIN_DB_PREFIX."product as p"; +$resql=$db->query($sql); +if ($resql) +{ + $limitforoptim=10000; + $num=$db->num_rows($resql); + if ($nb > $limitforoptim) + { + if (empty($conf->global->PRODUCT_DONOTSEARCH_ANYWHERE)) + { + print img_picto('','warning.png').' '.$langs->trans("YouHaveXProductUseSearchOptim",$num); + } + else + { + print img_picto('','tick.png').' '.$langs->trans("YouHaveXProductAndSearchOptimOn",$num); + } + } + else + { + print img_picto('','tick.png').' '.$langs->trans("NbOfProductIsLowerThanNoPb",$limitforoptim); + } + print '
'; + $db->free($resql); +} + +// Browser +print '
'; +print ''.$langs->trans("Browser").': '; +var_dump($conf->browser); +print '
'; + +// Database statistics update +print '
'; +print ''.$langs->trans("DatabaseStatistics").': '; +print '
'; + + + +llxFooter(); + +$db->close(); +?> \ No newline at end of file diff --git a/htdocs/admin/system/xdebug.php b/htdocs/admin/system/xdebug.php index d95c9574707..b3b833557f6 100644 --- a/htdocs/admin/system/xdebug.php +++ b/htdocs/admin/system/xdebug.php @@ -56,7 +56,7 @@ if (function_exists('socket_create')) print 'XDEBUG_PORT: '.$port."
\n"; print "
\n"; $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); - if (empty($socket)) die('Unable to preapre a socket'); + if (empty($socket)) die('Unable to prepare a socket'); //socket_bind($sock, $address, $port) or die('Unable to bind on address='.$address.' port='.$port); //socket_listen($sock); //$client = socket_accept($sock); diff --git a/htdocs/core/lib/geturl.lib.php b/htdocs/core/lib/geturl.lib.php index 61bf9ca9494..d0c6d29ddea 100644 --- a/htdocs/core/lib/geturl.lib.php +++ b/htdocs/core/lib/geturl.lib.php @@ -83,7 +83,7 @@ function getURLContent($url,$postorget='GET',$param='') $rep['content']=$response; $rep['curl_error_no']=''; $rep['curl_error_msg']=''; - + dol_syslog("getURLContent response=".$response); if (curl_errno($ch)) @@ -96,7 +96,10 @@ function getURLContent($url,$postorget='GET',$param='') } else { - //closing the curl + $info = curl_getinfo($ch); + $rep['header_size']=$info['header_size']; + + //closing the curl curl_close($ch); } diff --git a/htdocs/core/menus/standard/eldy.lib.php b/htdocs/core/menus/standard/eldy.lib.php index 459d2dfd1fb..bea2a29936c 100644 --- a/htdocs/core/menus/standard/eldy.lib.php +++ b/htdocs/core/menus/standard/eldy.lib.php @@ -521,13 +521,14 @@ function print_left_eldy_menu($db,$menu_array_before,$menu_array_after,&$tabMenu $newmenu->add('/admin/system/phpinfo.php?mainmenu=home&leftmenu=admintools', $langs->trans('InfoPHP'), 1); //if (function_exists('xdebug_is_enabled')) $newmenu->add('/admin/system/xdebug.php', $langs->trans('XDebug'),1); $newmenu->add('/admin/system/database.php?mainmenu=home&leftmenu=admintools', $langs->trans('InfoDatabase'), 1); + if (function_exists('eaccelerator_info')) $newmenu->add("/admin/tools/eaccelerator.php?mainmenu=home&leftmenu=admintools", $langs->trans("EAccelerator"),1); + //$newmenu->add("/admin/system/perf.php?mainmenu=home&leftmenu=admintools", $langs->trans("InfoPerf"),1); + $newmenu->add("/admin/tools/purge.php?mainmenu=home&leftmenu=admintools", $langs->trans("Purge"),1); $newmenu->add("/admin/tools/dolibarr_export.php?mainmenu=home&leftmenu=admintools", $langs->trans("Backup"),1); $newmenu->add("/admin/tools/dolibarr_import.php?mainmenu=home&leftmenu=admintools", $langs->trans("Restore"),1); $newmenu->add("/admin/tools/update.php?mainmenu=home&leftmenu=admintools", $langs->trans("MenuUpgrade"),1); - if (function_exists('eaccelerator_info')) $newmenu->add("/admin/tools/eaccelerator.php?mainmenu=home&leftmenu=admintools", $langs->trans("EAccelerator"),1); $newmenu->add("/admin/tools/listevents.php?mainmenu=home&leftmenu=admintools", $langs->trans("Audit"),1); $newmenu->add("/admin/tools/listsessions.php?mainmenu=home&leftmenu=admintools", $langs->trans("Sessions"),1); - $newmenu->add("/admin/tools/purge.php?mainmenu=home&leftmenu=admintools", $langs->trans("Purge"),1); $newmenu->add('/admin/system/about.php?mainmenu=home&leftmenu=admintools', $langs->trans('About'), 1); $newmenu->add("/support/index.php?mainmenu=home&leftmenu=admintools", $langs->trans("HelpCenter"),1,1,'targethelp'); } diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index 123dad3b434..a90fa297ef7 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -884,6 +884,7 @@ InfoOS=Infos OS InfoWebServer=Infos web server InfoDatabase=Infos database InfoPHP=Infos PHP +InfoPerf=Infos performances ListEvents=Audit events ListOfSecurityEvents=List of Dolibarr security events SecurityEventsPurged=Security events purged @@ -980,6 +981,11 @@ YesInSummer=Yes in summer OnlyFollowingModulesAreOpenedToExternalUsers=Note, only following modules are opened to external users (whatever are permission of such users): SuhosinSessionEncrypt=Session storage encrypted by Suhosin ConditionIsCurrently=Condition is currently %s +TestNotPossibleWithCurrentBrowsers=Automatic detection not possible +YouUseBestDriver=You use driver %s that is best driver available currently. +YouDoNotUseBestDriver=You use drive %s but driver %s is recommanded. +SearchProduct=Optimisation recherche produits +NbOfProductIsLowerThanNoPb=You have only %s products/services into database. This does not required any particular optimization. ##### Module password generation PasswordGenerationStandard=Return a password generated according to internal Dolibarr algorithm: 8 characters containing shared numbers and characters in lowercase. @@ -1228,6 +1234,22 @@ LDAPDescGroups=This page allows you to define LDAP attributes name in LDAP tree LDAPDescMembers=This page allows you to define LDAP attributes name in LDAP tree for each data found on Dolibarr members module. LDAPDescValues=Example values are designed for OpenLDAP with following loaded schemas: core.schema, cosine.schema, inetorgperson.schema). If you use thoose values and OpenLDAP, modify your LDAP config file slapd.conf to have all thoose schemas loaded. ForANonAnonymousAccess=For an authenticated access (for a write access for example) +PerfDolibarr=Performance setup/optimizing report +YouMayFindPerfAdviceHere=You will find on this page some checks or advices related to performance. +NotInstalled=Not installed, so your server is not slow down by this. +ApplicativeCache=Applicative cache +MemcachedNotAvailable=No applicative cache found. You can enhance performance by installing a cache server Memcached and a module able to use this cache server. More information here http://wiki.dolibarr.org/index.php/Module_MemCached_EN. Note that a lot of web hosting provider does not provide such cache server. +OPCodeCache=OPCode cache +NoOPCodeCacheFound=No OPCode cache found. May be you use another OPCode cache than XCache or eAccelerator (good), may be you don't have OPCode cache (very bad). +HTTPCacheStaticResources=HTTP cache for static resources (css, img, javascript) +FilesOfTypeCached=Files of type %s are cached by HTTP server +FilesOfTypeNotCached=Files of type %s are not cached by HTTP server +FilesOfTypeCompressed=Files of type %s are compressed by HTTP server +FilesOfTypeNotCompressed=Files of type %s are not compressed by HTTP server +CacheByServer=Cache by server +CacheByClient=Cache by browser +CompressionOfResources=Compression of HTTP responses +TestNotPossibleWithCurrentBrowsers=Such an automatic detection is not possible with current bowsers ##### Products ##### ProductSetup=Products module setup ServiceSetup=Services module setup diff --git a/htdocs/langs/fr_FR/admin.lang b/htdocs/langs/fr_FR/admin.lang index 5aa88277963..b25fb49a7e0 100644 --- a/htdocs/langs/fr_FR/admin.lang +++ b/htdocs/langs/fr_FR/admin.lang @@ -886,6 +886,7 @@ InfoOS=Infos OS InfoWebServer=Infos web server InfoDatabase=Infos base de donnée InfoPHP=Infos PHP +InfoPerf=Infos performances ListEvents=Audit événements ListOfSecurityEvents=Liste des événements de sécurité Dolibarr SecurityEventsPurged=Evenement de sécurité purgés @@ -982,7 +983,25 @@ YesInSummer=Oui en été OnlyFollowingModulesAreOpenedToExternalUsers=Remarque, seuls les modules suivants sont ouverts aux utilisateurs externes (quelles que soient les permissions de ces utilisateurs) : SuhosinSessionEncrypt=Stockage des sessions chiffrées par Suhosin ConditionIsCurrently=La condition est actuellement %s - +PerfDolibarr=Rapport de configuration/optimisation sur la performance +YouMayFindPerfAdviceHere=Sur cette page vous trouverez quelques indicateurs ou conseils pour optimiser la performance. +NotInstalled=Non installé, aussi votre serveur n'est pas ralentit par cela. +ApplicativeCache=Cache applicatif +MemcachedNotAvailable=Aucun cache applicatif disponible. Vous pouvez accélérer les performances de Dolibarr en installant un serveur de cache Memcached et un module de cache applicatif exploitant ce serveur. Plus d'info sur la page http://wiki.dolibarr.org/index.php/Module_MemCached. Notez que de nombreux hébergeurs bas couts ne fournissent pas de tels serveurs de cache dans leur infrastructure. +OPCodeCache=Cache OPCode +NoOPCodeCacheFound=Pas de cache OPCode trouvé. Peut-être utilisez-vous un cache OPCode différent de XCache ou eAccelerator (bien), peut-être n'avez vous pas du tout de cache OPCode (très mauvais). +HTTPCacheStaticResources=Cache HTTP des ressources statiques (css, img, javascript) +FilesOfTypeCached=Fichiers de type %s mis en cache par le serveur HTTP +FilesOfTypeNotCached=Fichiers de type %s non mis en cache par le serveur HTTP +FilesOfTypeCompressed=Fichiers de type %s compressé par le serveur HTTP +FilesOfTypeNotCompressed=Fichiers de type %s non compressé par le serveur HTTP +CacheByServer=Cache par le serveur +CacheByClient=Cache par le navigateur +CompressionOfResources=Compression des réponses HTTP +TestNotPossibleWithCurrentBrowsers=Détection automatique non possible +YouUseBestDriver=Vous utilisez le driver %s qui est le driver recommandé actuellement. +YouDoNotUseBestDriver=Vous utilisez le driver %s mais le driver %s est recommandé. +NbOfProductIsLowerThanNoPb=Vous n'avez que %s produits/services en base. Ceci ne requiert pas d'optimisation particulière. ##### Module password generation PasswordGenerationStandard=Renvoie un mot de passe généré selon l'algorithme interne de Dolibarr : 8 caractères, chiffres et caractères en minuscules mélangés. PasswordGenerationNone=Ne propose pas de mots de passe générés. Le mot de passe est à saisir manuellement. From 2fc07d05e9449505f6196eeb21e9f7d86b717d5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Salvador?= Date: Tue, 9 Jul 2013 17:12:35 +0200 Subject: [PATCH 35/48] hook in form_attach_new_file(html.formfile.class.php) --- htdocs/core/class/html.formfile.class.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/htdocs/core/class/html.formfile.class.php b/htdocs/core/class/html.formfile.class.php index 9368864c7d0..5e17cf830a8 100644 --- a/htdocs/core/class/html.formfile.class.php +++ b/htdocs/core/class/html.formfile.class.php @@ -64,7 +64,8 @@ class FormFile */ function form_attach_new_file($url, $title='', $addcancel=0, $sectionid=0, $perm=1, $size=50, $object='', $options='', $useajax=true) { - global $conf,$langs; + global $conf,$langs, $hookmanager; + $hookmanager->initHooks(array('formfile')); if (! empty($conf->browser->phone)) return 0; @@ -139,6 +140,8 @@ class FormFile if (empty($sectionid)) print '
'; print "\n\n\n"; + $parameters = array('socid'=>(isset($GLOBALS['socid'])?$GLOBALS['socid']:''),'id'=>(isset($GLOBALS['id'])?$GLOBALS['id']:''), 'url'=>$url); + print $hookmanager->executeHooks('formattachOptions',$parameters,$object); return 1; } From 03ad72a1fa69e13f03dc0b25f7a15304181646bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Salvador?= Date: Tue, 9 Jul 2013 14:19:05 +0200 Subject: [PATCH 36/48] fix dol_buildpath failing when processing path such as file.php?id=__ID__ --- htdocs/core/lib/functions.lib.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index cc4b2aac7f0..0767c13c9b1 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -285,7 +285,7 @@ function dol_buildpath($path, $type=0) if (! empty($regs[1])) { //print $key.'-'.$dirroot.'/'.$path.'-'.$conf->file->dol_url_root[$type].'
'."\n"; - if (file_exists($dirroot.'/'.$path)) + if (file_exists($dirroot.'/'.$regs[1])) { if ($type == 1) { From 1bff25bf28a8a437b09b802bd3f17d27740cf832 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 9 Jul 2013 21:33:45 +0200 Subject: [PATCH 37/48] Start to clean hookmanager code. --- htdocs/core/class/hookmanager.class.php | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/htdocs/core/class/hookmanager.class.php b/htdocs/core/class/hookmanager.class.php index 773bd512d70..bef5d29516d 100755 --- a/htdocs/core/class/hookmanager.class.php +++ b/htdocs/core/class/hookmanager.class.php @@ -159,13 +159,13 @@ class HookManager { $error++; $this->error=$actionclassinstance->error; $this->errors=array_merge($this->errors, (array) $actionclassinstance->errors); - - // TODO remove this. Change must be inside the method of hook if required + // TODO remove this. + /* Change must be inside the method of hook if required. Only hook must decide if $action must be modified or not. if ($method == 'doActions') { if ($action=='add') $action='create'; if ($action=='update') $action='edit'; - } + }*/ } if (is_array($actionclassinstance->results)) $this->resArray =array_merge($this->resArray, $actionclassinstance->results); @@ -181,11 +181,10 @@ class HookManager if (! empty($actionclassinstance->results) && is_array($actionclassinstance->results)) $this->resArray =array_merge($this->resArray, $actionclassinstance->results); if (! empty($actionclassinstance->resprints)) $this->resPrint.=$actionclassinstance->resprints; - // TODO. remove this. array result must be set into $actionclassinstance->results - if (is_array($result)) $this->resArray = array_merge($this->resArray, $result); + //if (is_array($result)) $this->resArray = array_merge($this->resArray, $result); // TODO. remove this. result must not be a string. we must use $actionclassinstance->resprint to return a string - if (! is_array($result) && ! is_numeric($result)) $this->resPrint.=$result; + //if (! is_array($result) && ! is_numeric($result)) $this->resPrint.=$result; } //print "After hook ".get_class($actionclassinstance)." method=".$method." results=".count($actionclassinstance->results)." resprints=".count($actionclassinstance->resprints)." result=".$result." resaction=".$resaction."
\n"; From f67e52f42a953dbc539dd11476fd61ed1d550877 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 9 Jul 2013 21:40:45 +0200 Subject: [PATCH 38/48] Start to clean hook code --- ChangeLog | 10 +++++++++- htdocs/core/class/hookmanager.class.php | 2 +- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index a3f9db52ac9..a14ca245af2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -46,7 +46,15 @@ For developers: key to use a specific language file. - New: Make some changes to allow usage of several alternative $dolibarr_main_url_root variables. Fix also several bugs with old code. - + +WARNING: We started to clean hooks code. If your hook want to modify value of $actions, it's role +of your hook to modify it. Dolibarr hook code will not decide this for your module anymore. +If your action class for hook was returning a string or an array, instead your module must +set $actionclassinstance->results (to return array) +or $actionclassinstance->resprints (to return string) +to return same thing. The return value must be replaced by a "return 0"; +Goal is to fix old compatibility code that does not match hook +specification: http://wiki.dolibarr.org/index.php/Hooks_system ***** ChangeLog for 3.4 compared to 3.3.2 ***** For users: diff --git a/htdocs/core/class/hookmanager.class.php b/htdocs/core/class/hookmanager.class.php index bef5d29516d..7227556d5ac 100755 --- a/htdocs/core/class/hookmanager.class.php +++ b/htdocs/core/class/hookmanager.class.php @@ -183,7 +183,7 @@ class HookManager if (! empty($actionclassinstance->resprints)) $this->resPrint.=$actionclassinstance->resprints; // TODO. remove this. array result must be set into $actionclassinstance->results //if (is_array($result)) $this->resArray = array_merge($this->resArray, $result); - // TODO. remove this. result must not be a string. we must use $actionclassinstance->resprint to return a string + // TODO. remove this. result must not be a string. we must use $actionclassinstance->resprints to return a string //if (! is_array($result) && ! is_numeric($result)) $this->resPrint.=$result; } From f94f516a12e39fd4b1a0f25d821262d7b52df2d6 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 9 Jul 2013 23:46:31 +0200 Subject: [PATCH 39/48] Clean code for managing alternate root dirs. --- htdocs/conf/conf.php.example | 11 +++++------ htdocs/filefunc.inc.php | 16 ---------------- htdocs/master.inc.php | 15 ++++++++++++++- 3 files changed, 19 insertions(+), 23 deletions(-) diff --git a/htdocs/conf/conf.php.example b/htdocs/conf/conf.php.example index a23c2f9cfbe..589cd212ef5 100644 --- a/htdocs/conf/conf.php.example +++ b/htdocs/conf/conf.php.example @@ -37,18 +37,17 @@ $dolibarr_main_document_root=''; // dolibarr_main_url_root_alt -// This parameter defines the alternative URL of your Dolibarr. -// It must link to some other secondary htdocs directories, separated by a coma. +// This parameter defines the relative sub URLs of alternative Dolibarr root directories. +// It can be links to some other secondary htdocs directories, separated by a coma. // Examples: -// $dolibarr_main_url_root_alt='http://localhost/extensions'; -// $dolibarr_main_url_root_alt='http://mydolibarrvirtualhost/extensions1,http://mydolibarrvirtualhost/extensions2'; +// $dolibarr_main_url_root_alt='/extensions'; +// $dolibarr_main_url_root_alt='/extensions1,/extensions2'; // $dolibarr_main_url_root_alt=''; // dolibarr_main_document_root_alt -// This parameter contains absolute alternative file system directory of Dolibarr -// It must link to url to other secondary htdocs directories, separated by a coma. +// This parameter contains absolute alternative root file system directories of Dolibarr // Examples: // $dolibarr_main_document_root_alt='/var/www/dolibarr/htdocs/extensions'; // $dolibarr_main_document_root_alt='C:/My web sites/dolibarr/htdocs/extensions1,C:/My web sites/dolibarr/htdocs/extensions2'; diff --git a/htdocs/filefunc.inc.php b/htdocs/filefunc.inc.php index 483b71f3e07..7ff53d7cac6 100755 --- a/htdocs/filefunc.inc.php +++ b/htdocs/filefunc.inc.php @@ -175,22 +175,6 @@ $suburi = strstr($uri, '/'); // $suburi contains url without domain:p if ($suburi == '/') $suburi = ''; // If $suburi is /, it is now '' define('DOL_URL_ROOT', $suburi); // URL relative root ('', '/dolibarr', ...) -/* -// Define DOL_MAIN_URL_ROOT_ALT and DOL_URL_ROOT_ALT (deprecated) -if (! empty($dolibarr_main_url_root_alt)) -{ - $altpart=str_replace($dolibarr_main_url_root,'',$dolibarr_main_url_root_alt); - if (! preg_match('/^\//',$altpart) && ! empty($altpart)) { $tmp_alt=$dolibarr_main_url_root_alt; } // Manage case url=http://localhost/aaa and url_alt=http://localhost/aaabbb - else $tmp_alt=$tmp.((preg_match('/\/$/',$tmp)||preg_match('/^\//',$altpart))?'':'/').$altpart; - //$tmp_alt=$dolibarr_main_url_root_alt; - define('DOL_MAIN_URL_ROOT_ALT', $tmp_alt); // URL absolute root (https://sss/dolibarr/custom, ...) - $uri=preg_replace('/^http(s?):\/\//i','',constant('DOL_MAIN_URL_ROOT_ALT')); // $uri contains url without http* - $suburi = strstr($uri, '/'); // $suburi contains url without domain:port - if ($suburi == '/') $suburi = ''; // If $suburi is /, it is now '' - define('DOL_URL_ROOT_ALT', $suburi); // URL relative root ('', '/dolibarr/custom', ...) -} -*/ - //print DOL_URL_ROOT; // Define prefix MAIN_DB_PREFIX diff --git a/htdocs/master.inc.php b/htdocs/master.inc.php index 3505a3b13fa..9e1c5ad2e14 100644 --- a/htdocs/master.inc.php +++ b/htdocs/master.inc.php @@ -74,7 +74,20 @@ if (! empty($dolibarr_main_document_root_alt)) foreach($values as $value) $conf->file->dol_document_root['alt'.($i++)]=(string) $value; $values=preg_split('/[;,]/',$dolibarr_main_url_root_alt); $i=0; - foreach($values as $value) $conf->file->dol_url_root['alt'.($i++)]=(string) $value; + foreach($values as $value) + { + if (preg_match('/^http(s)?:/',$value)) + { + print 'Error: values for $dolibarr_main_url_root_alt into conf.php file must contains relative path to alternative URLs.
'."\n"; + print "Found: \"".$value."\"
\n"; + print "Should found something like following examples:
\n"; + print "\"/extensions\"
\n"; + print "\"/extensions1,/extensions2,...\"
\n"; + print "\"/custom\"
\n"; + exit; + } + $conf->file->dol_url_root['alt'.($i++)]=(string) $value; + } } // Set properties specific to multicompany From a4abfe1abcedb6e374a4f1b74b9d1742c3683fe9 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 10 Jul 2013 14:46:16 +0200 Subject: [PATCH 40/48] New: Can add an event automatically when a projet is create. --- ChangeLog | 1 + htdocs/admin/agenda.php | 3 ++- htdocs/comm/action/class/actioncomm.class.php | 4 ++-- ...interface_50_modAgenda_ActionsAuto.class.php | 17 +++++++++++++++++ .../install/mysql/data/llx_c_action_trigger.sql | 3 ++- htdocs/install/mysql/migration/3.4.0-3.5.0.sql | 3 +++ htdocs/langs/en_US/projects.lang | 1 + htdocs/langs/fr_FR/projects.lang | 1 + 8 files changed, 29 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index a14ca245af2..e987a962f7a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -26,6 +26,7 @@ For users: - New: Add a cron module to define scheduled jobs. - New: Add new graphical boxes (customer invoices and orders per month). - New: [ task #286 ] Enhance rounding function of prices to allow round of sum instead of sum of rounding. +- New: Can add an event automatically when a projet is create. - Qual: Implement same rule for return value of all command line scripts (0 when success, <>0 if error). For translators: diff --git a/htdocs/admin/agenda.php b/htdocs/admin/agenda.php index 4e53a709d20..bdf2851855e 100644 --- a/htdocs/admin/agenda.php +++ b/htdocs/admin/agenda.php @@ -161,8 +161,9 @@ if (! empty($triggers)) if ($module == 'order_supplier' || $module == 'invoice_supplier') $module = 'fournisseur'; if ($module == 'shipping') $module = 'expedition_bon'; if ($module == 'member') $module = 'adherent'; + if ($module == 'project') $module = 'projet'; //print 'module='.$module.'
'; - if ($conf->$module->enabled) + if (! empty($conf->$module->enabled)) { $var=!$var; print '
'; - print ''; + $out .= '
'; + $out .= ''; - if (! empty($options)) print ''; + if (! empty($options)) $out .= ''; - print '"; - print "
'.$options.''.$options.''; + $out .= ''; $max=$conf->global->MAIN_UPLOAD_DOC; // En Kb $maxphp=@ini_get('upload_max_filesize'); // En inconnu @@ -103,20 +103,20 @@ class FormFile if ($max > 0) { - print ''; + $out .= ''; } - print 'global->MAIN_UPLOAD_DOC) || empty($perm)?' disabled="disabled"':''); - print '>'; - print '   '; - print 'global->MAIN_UPLOAD_DOC) || empty($perm)?' disabled="disabled"':''); - print '>'; + $out .= 'global->MAIN_UPLOAD_DOC) || empty($perm)?' disabled="disabled"':''); + $out .= '>'; + $out .= '   '; + $out .= 'global->MAIN_UPLOAD_DOC) || empty($perm)?' disabled="disabled"':''); + $out .= '>'; if ($addcancel) { - print '   '; - print ''; + $out .= '   '; + $out .= ''; } if (! empty($conf->global->MAIN_UPLOAD_DOC)) @@ -124,24 +124,28 @@ class FormFile if ($perm) { $langs->load('other'); - print ' ('.$langs->trans("MaxSize").': '.$max.' '.$langs->trans("Kb"); - print ' '.info_admin($langs->trans("ThisLimitIsDefinedInSetup",$max,$maxphp),1); - print ')'; + $out .= ' ('.$langs->trans("MaxSize").': '.$max.' '.$langs->trans("Kb"); + $out .= ' '.info_admin($langs->trans("ThisLimitIsDefinedInSetup",$max,$maxphp),1); + $out .= ')'; } } else { - print ' ('.$langs->trans("UploadDisabled").')'; + $out .= ' ('.$langs->trans("UploadDisabled").')'; } - print "
"; + $out .= "
"; - print ''; - if (empty($sectionid)) print '
'; + $out .= ''; + if (empty($sectionid)) $out .= '
'; - print "\n\n\n"; + $out .= "\n\n\n"; $parameters = array('socid'=>(isset($GLOBALS['socid'])?$GLOBALS['socid']:''),'id'=>(isset($GLOBALS['id'])?$GLOBALS['id']:''), 'url'=>$url); - print $hookmanager->executeHooks('formattachOptions',$parameters,$object); + $res = $hookmanager->executeHooks('formattachOptions',$parameters,$object); + if(!$res) { + echo $out; + } + echo $hookmanager->resPrint; return 1; } @@ -539,7 +543,10 @@ class FormFile if (is_object($hookmanager)) { $parameters=array('socid'=>(isset($GLOBALS['socid'])?$GLOBALS['socid']:''),'id'=>(isset($GLOBALS['id'])?$GLOBALS['id']:''),'modulepart'=>$modulepart,'relativepath'=>$relativepath); - $out.= $hookmanager->executeHooks('formBuilddocLineOptions',$parameters,$file); + $res = $hookmanager->executeHooks('formBuilddocLineOptions',$parameters,$file); + if(!$res) { + $out .= $hookmanager->resPrint; + } } } From ca406d098045697ab8a313d9405ea9ccd4aee986 Mon Sep 17 00:00:00 2001 From: simnandez Date: Wed, 10 Jul 2013 15:32:29 +0200 Subject: [PATCH 42/48] Fix: Regression in options MAIN_PROFIDx_IN_ADDRESS --- htdocs/admin/pdf.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/admin/pdf.php b/htdocs/admin/pdf.php index 085d33f3df0..85a707339f6 100755 --- a/htdocs/admin/pdf.php +++ b/htdocs/admin/pdf.php @@ -52,10 +52,10 @@ if ($action == 'update') dolibarr_set_const($db, "MAIN_PDF_FORMAT", $_POST["MAIN_PDF_FORMAT"],'chaine',0,'',$conf->entity); - dolibarr_set_const($db, "MAIN_PROFID2_IN_ADDRESS", $_POST["MAIN_PROFID2_IN_ADDRESS"],'chaine',0,'',$conf->entity); + dolibarr_set_const($db, "MAIN_PROFID1_IN_ADDRESS", $_POST["MAIN_PROFID1_IN_ADDRESS"],'chaine',0,'',$conf->entity); + dolibarr_set_const($db, "MAIN_PROFID2_IN_ADDRESS", $_POST["MAIN_PROFID2_IN_ADDRESS"],'chaine',0,'',$conf->entity); dolibarr_set_const($db, "MAIN_PROFID3_IN_ADDRESS", $_POST["MAIN_PROFID3_IN_ADDRESS"],'chaine',0,'',$conf->entity); dolibarr_set_const($db, "MAIN_PROFID4_IN_ADDRESS", $_POST["MAIN_PROFID4_IN_ADDRESS"],'chaine',0,'',$conf->entity); - dolibarr_set_const($db, "MAIN_PROFID4_IN_ADDRESS", $_POST["MAIN_PROFID4_IN_ADDRESS"],'chaine',0,'',$conf->entity); dolibarr_set_const($db, "MAIN_GENERATE_DOCUMENTS_WITHOUT_VAT", $_POST["MAIN_GENERATE_DOCUMENTS_WITHOUT_VAT"],'chaine',0,'',$conf->entity); dolibarr_set_const($db, "MAIN_TVAINTRA_NOT_IN_ADDRESS", $_POST["MAIN_TVAINTRA_NOT_IN_ADDRESS"],'chaine',0,'',$conf->entity); From 57dbf87d0ac0cd6bc89c2a8a365e4ffefe069e12 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 10 Jul 2013 15:45:16 +0200 Subject: [PATCH 43/48] Just use print instead of echo, just because echo is not use anuwhere else. --- htdocs/core/class/html.formfile.class.php | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/htdocs/core/class/html.formfile.class.php b/htdocs/core/class/html.formfile.class.php index 84946405a93..8f725368f9c 100644 --- a/htdocs/core/class/html.formfile.class.php +++ b/htdocs/core/class/html.formfile.class.php @@ -1,5 +1,5 @@ +/* Copyright (c) 2008-2013 Laurent Destailleur * Copyright (C) 2010-2012 Regis Houssin * Copyright (c) 2010 Juanjo Menent * @@ -142,10 +142,11 @@ class FormFile $out .= "\n\n\n"; $parameters = array('socid'=>(isset($GLOBALS['socid'])?$GLOBALS['socid']:''),'id'=>(isset($GLOBALS['id'])?$GLOBALS['id']:''), 'url'=>$url); $res = $hookmanager->executeHooks('formattachOptions',$parameters,$object); - if(!$res) { - echo $out; - } - echo $hookmanager->resPrint; + if (empty($res)) + { + print $out; + } + print $hookmanager->resprint; return 1; } @@ -502,7 +503,7 @@ class FormFile // Autre cas if ($modulepart == 'donation') { $relativepath = get_exdir($filename,2).$file["name"]; } if ($modulepart == 'export') { $relativepath = $file["name"]; } - + $out.= "
'.$langs->trans("EMail").''.dol_print_email($object->email,0,$object->fk_soc,1).'
'.$langs->trans("Status").''.$object->getLibStatut(4).'
'.$langs->trans('Project').''; $formproject->select_projects($soc->id, $projectid, 'projectid'); diff --git a/htdocs/compta/facture.php b/htdocs/compta/facture.php index 5aa83963bdc..b8bc0b1ed10 100644 --- a/htdocs/compta/facture.php +++ b/htdocs/compta/facture.php @@ -758,7 +758,7 @@ else if ($action == 'add' && $user->rights->facture->creer) $product->fetch($_POST['idprod'.$i]); $startday=dol_mktime(12, 0, 0, $_POST['date_start'.$i.'month'], $_POST['date_start'.$i.'day'], $_POST['date_start'.$i.'year']); $endday=dol_mktime(12, 0, 0, $_POST['date_end'.$i.'month'], $_POST['date_end'.$i.'day'], $_POST['date_end'.$i.'year']); - $result=$object->addline($object->id,$product->description,$product->price, $_POST['qty'.$i], $product->tva_tx, $product->localtax1_tx, $product->localtax2_tx, $_POST['idprod'.$i], $_POST['remise_percent'.$i], $startday, $endday, 0, 0, '', $product->price_base_type, $product->price_ttc, $product->type); + $result=$object->addline($product->description,$product->price, $_POST['qty'.$i], $product->tva_tx, $product->localtax1_tx, $product->localtax2_tx, $_POST['idprod'.$i], $_POST['remise_percent'.$i], $startday, $endday, 0, 0, '', $product->price_base_type, $product->price_ttc, $product->type); } } } @@ -913,7 +913,6 @@ else if ($action == 'add' && $user->rights->facture->creer) } $result = $object->addline( - $object->id, $langs->trans('Deposit'), $amountdeposit, //subprice 1, //quantity @@ -1016,7 +1015,6 @@ else if ($action == 'add' && $user->rights->facture->creer) } $result = $object->addline( - $object->id, $desc, $lines[$i]->subprice, $lines[$i]->qty, @@ -1093,7 +1091,7 @@ else if ($action == 'add' && $user->rights->facture->creer) $product->fetch($_POST['idprod'.$i]); $startday=dol_mktime(12, 0, 0, $_POST['date_start'.$i.'month'], $_POST['date_start'.$i.'day'], $_POST['date_start'.$i.'year']); $endday=dol_mktime(12, 0, 0, $_POST['date_end'.$i.'month'], $_POST['date_end'.$i.'day'], $_POST['date_end'.$i.'year']); - $result=$object->addline($object->id,$product->description,$product->price, $_POST['qty'.$i], $product->tva_tx, $product->localtax1_tx, $product->localtax2_tx, $_POST['idprod'.$i], $_POST['remise_percent'.$i], $startday, $endday, 0, 0, '', $product->price_base_type, $product->price_ttc, $product->type); + $result=$object->addline($product->description,$product->price, $_POST['qty'.$i], $product->tva_tx, $product->localtax1_tx, $product->localtax2_tx, $_POST['idprod'.$i], $_POST['remise_percent'.$i], $startday, $endday, 0, 0, '', $product->price_base_type, $product->price_ttc, $product->type); } } } @@ -1311,7 +1309,6 @@ else if (($action == 'addline' || $action == 'addline_predef') && $user->rights- { // Insert line $result = $object->addline( - $object->id, $desc, $pu_ht, GETPOST('qty'), diff --git a/htdocs/compta/facture/class/facture-rec.class.php b/htdocs/compta/facture/class/facture-rec.class.php index 565e63fd749..bd512016825 100644 --- a/htdocs/compta/facture/class/facture-rec.class.php +++ b/htdocs/compta/facture/class/facture-rec.class.php @@ -147,7 +147,6 @@ class FactureRec extends Facture for ($i = 0; $i < $num; $i++) { $result_insert = $this->addline( - $this->id, $facsrc->lines[$i]->desc, $facsrc->lines[$i]->subprice, $facsrc->lines[$i]->qty, @@ -399,7 +398,6 @@ class FactureRec extends Facture /** * Add a line to invoice * - * @param int $facid Id de la facture * @param string $desc Description de la ligne * @param double $pu_ht Prix unitaire HT (> 0 even for credit note) * @param double $qty Quantite @@ -416,8 +414,10 @@ class FactureRec extends Facture * @param string $label Label of the line * @return int <0 if KO, Id of line if OK */ - function addline($facid, $desc, $pu_ht, $qty, $txtva, $fk_product=0, $remise_percent=0, $price_base_type='HT', $info_bits=0, $fk_remise_except='', $pu_ttc=0, $type=0, $rang=-1, $special_code=0, $label='') + function addline($desc, $pu_ht, $qty, $txtva, $fk_product=0, $remise_percent=0, $price_base_type='HT', $info_bits=0, $fk_remise_except='', $pu_ttc=0, $type=0, $rang=-1, $special_code=0, $label='') { + $facid=$this->id; + dol_syslog("FactureRec::addline facid=$facid,desc=$desc,pu_ht=$pu_ht,qty=$qty,txtva=$txtva,fk_product=$fk_product,remise_percent=$remise_percent,date_start=$date_start,date_end=$date_end,ventil=$ventil,info_bits=$info_bits,fk_remise_except=$fk_remise_except,price_base_type=$price_base_type,pu_ttc=$pu_ttc,type=$type", LOG_DEBUG); include_once DOL_DOCUMENT_ROOT.'/core/lib/price.lib.php'; diff --git a/htdocs/compta/facture/class/facture.class.php b/htdocs/compta/facture/class/facture.class.php index 53e7178ce6d..b863d80e91c 100644 --- a/htdocs/compta/facture/class/facture.class.php +++ b/htdocs/compta/facture/class/facture.class.php @@ -344,7 +344,6 @@ class Facture extends CommonInvoice } $result = $this->addline( - $this->id, $this->lines[$i]->desc, $this->lines[$i]->subprice, $this->lines[$i]->qty, @@ -403,7 +402,6 @@ class Facture extends CommonInvoice $localtax2_tx=get_localtax($tva_tx,2,$soc); $result_insert = $this->addline( - $this->id, $_facrec->lines[$i]->desc, $_facrec->lines[$i]->subprice, $_facrec->lines[$i]->qty, @@ -1943,7 +1941,6 @@ class Facture extends CommonInvoice * par l'appelant par la methode get_default_tva(societe_vendeuse,societe_acheteuse,produit) * et le desc doit deja avoir la bonne valeur (a l'appelant de gerer le multilangue) * - * @param int $facid Id de la facture * @param string $desc Description de la ligne * @param double $pu_ht Prix unitaire HT (> 0 even for credit note) * @param double $qty Quantite @@ -1971,8 +1968,10 @@ class Facture extends CommonInvoice * @param array $array_option extrafields array * @return int <0 if KO, Id of line if OK */ - function addline($facid, $desc, $pu_ht, $qty, $txtva, $txlocaltax1=0, $txlocaltax2=0, $fk_product=0, $remise_percent=0, $date_start='', $date_end='', $ventil=0, $info_bits=0, $fk_remise_except='', $price_base_type='HT', $pu_ttc=0, $type=0, $rang=-1, $special_code=0, $origin='', $origin_id=0, $fk_parent_line=0, $fk_fournprice=null, $pa_ht=0, $label='',$array_option=0) + function addline($desc, $pu_ht, $qty, $txtva, $txlocaltax1=0, $txlocaltax2=0, $fk_product=0, $remise_percent=0, $date_start='', $date_end='', $ventil=0, $info_bits=0, $fk_remise_except='', $price_base_type='HT', $pu_ttc=0, $type=0, $rang=-1, $special_code=0, $origin='', $origin_id=0, $fk_parent_line=0, $fk_fournprice=null, $pa_ht=0, $label='',$array_option=0) { + $facid=$this->id; + dol_syslog(get_class($this)."::Addline facid=$facid,desc=$desc,pu_ht=$pu_ht,qty=$qty,txtva=$txtva, txlocaltax1=$txlocaltax1, txlocaltax2=$txlocaltax2, fk_product=$fk_product,remise_percent=$remise_percent,date_start=$date_start,date_end=$date_end,ventil=$ventil,info_bits=$info_bits,fk_remise_except=$fk_remise_except,price_base_type=$price_base_type,pu_ttc=$pu_ttc,type=$type", LOG_DEBUG); include_once DOL_DOCUMENT_ROOT.'/core/lib/price.lib.php'; diff --git a/htdocs/product/fiche.php b/htdocs/product/fiche.php index 8bec9528b87..dd42134ee2d 100644 --- a/htdocs/product/fiche.php +++ b/htdocs/product/fiche.php @@ -450,7 +450,6 @@ if (empty($reshook)) } $result = $propal->addline( - $propal->id, $desc, $pu_ht, GETPOST('qty'), @@ -524,7 +523,6 @@ if (empty($reshook)) } $result = $commande->addline( - $commande->id, $desc, $pu_ht, GETPOST('qty'), @@ -598,7 +596,6 @@ if (empty($reshook)) } $result = $facture->addline( - $facture->id, $desc, $pu_ht, GETPOST('qty'), From 40d7eca4bce7e98dd203a5f658c0229964892248 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 10 Jul 2013 17:36:14 +0200 Subject: [PATCH 47/48] Protect to avoid commiting into main source --- htdocs/.gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/.gitignore b/htdocs/.gitignore index bc4b1c974ae..1af8fc3719b 100644 --- a/htdocs/.gitignore +++ b/htdocs/.gitignore @@ -7,3 +7,4 @@ /google /skincoloreditor /pos +/ultimatepdf From 29759a1cba20892009b9a7e5ebf099d761af6cc0 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 10 Jul 2013 17:36:56 +0200 Subject: [PATCH 48/48] Protect to avoid commiting into main source --- htdocs/.gitignore | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/htdocs/.gitignore b/htdocs/.gitignore index 1af8fc3719b..fadc5632733 100644 --- a/htdocs/.gitignore +++ b/htdocs/.gitignore @@ -1,10 +1,11 @@ /test.php /custom* /bootstrap -/multicompany -/ovh -/numberingpack +/extensions /google -/skincoloreditor +/multicompany +/numberingpack +/ovh /pos +/skincoloreditor /ultimatepdf