diff --git a/ChangeLog b/ChangeLog index 863326937e8..66ff1ffd8e0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -7,8 +7,13 @@ For users: - New: [ task #877 ] Reorganize menus - New: [ task #858 ] Holiday module: note on manual holiday assignation - New: [ task #892 ] Add option in thridparty customer/supplier admin to hide non active in select_company method -- New: [ task #531 ] Add a duration on tasks - +- New: [ task #531 ] Add a workload on tasks +- New: Add graph of bank account input/output into input-output report page. +- New: Add script export-bank-receipts. +- New: Add option "filter=bank" onto script rebuild_merge_pdf.php to merge + PDF that has one payment on a specific bank account. +For developers: +- New: DolGraph can build graph with three lines. ***** ChangeLog for 3.4 compared to 3.3.2 ***** For users: diff --git a/README-FR b/README-FR index ac3a9ae2d8c..cc69cfa6e8a 100644 --- a/README-FR +++ b/README-FR @@ -78,30 +78,29 @@ IV - CE QUE DOLIBARR PEUT FAIRE ------------------------------- Modules principaux: +- Annuaires des prospects et/ou client et/ou fournisseurs - Gestion de catalogue de produits et services - Gestion de stock - Gestion des comptes bancaires -- Annuaires des prospects et/ou client et/ou fournisseurs -- Annuaires des contacts -- Gestion des actions/taches avec un agenda intégré (ou lien avec webcalendar) +- Agenda partagé - Gestion des commandes -- Gestion des propositions commerciales -- Gestion de contrats de services +- Gestion des devis, propositions commerciales - Gestion des factures clients et fournisseurs +- Gestion de contrats de services - Gestion des paiements - Gestion des virements bancaires - Gestion des expéditions +- GED (Gestion Electronique de Documents) +- EMailings de masse +- Réalisation de sondages +- Point de vente/Caisse enregistreuse Autres modules: -- Gestion de la TVA NPR (non perçue récupérable - pour les utilisateurs français des DOM-TOM) -- Gestion des adhérents d'association -- Gestion des dons - Gestion de marque-pages -- Agenda -- Point de vente/Caisse enregistreuse -- Fonctions d'EMailing de masses vers les clients, prospect ou utilisateurs Dolibarr +- Gestion des promesses de dons +- Gestion de la TVA NPR (non perçue récupérable - pour les utilisateurs français des DOM-TOM) - Rapports -- Fonctions d'exports +- Imports/Exports des données - Connectivité LDAP - Export PDF de tous les éléments (factures, propositions commerciales, commandes, bons expéditions, etc...) - De nombreuses autres fonctionnalités issues de modules officiels ou non (AWStats, Bittorrent, Gravatar, Google, Webcalendar...) @@ -122,7 +121,7 @@ V - CE QUE DOLIBARR NE PEUT PAS FAIRE (TACHES A FAIRE) 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 (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. +- 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. diff --git a/README.md b/README.md index e3d86854a70..257d19e60fb 100644 --- a/README.md +++ b/README.md @@ -75,33 +75,35 @@ See ChangeLog file found into package. ### Main modules/features: -- Products and services catalog - Customers, Prospects or Suppliers directory -- Address book +- Products and services catalog - Stock management - Bank accounts management - Orders management with PDF export -- Commercial proposals management with PDF export +- Commercial proposals management - Contracts management -- Invoices management with PDF export +- Invoices management - Payments management - Standing orders management - Shipping management -- ECM (Electronic Content Management) -- EMailings - Agenda with ical,vcal export for third tools integration -- Management of foundation members -- Donation management +- ECM (Electronic Content Management) +- Foundations members management +- Employee's holidays management +- Mass emailing +- Realize surveys +- Point of Sale ### Other modules: - Bookmarks management -- Can reports Dolibarr events inside Webcalendar or Phenix -- Data export tools +- Donations management +- Reporting +- Data export/import tools - LDAP connectivity - Third parties or products categories - ClickToDial phone numbers -- RSS +- RSS integration ### Miscellaneous: @@ -123,11 +125,11 @@ See ChangeLog file found into package. This is features that Dolibarr does not support completely yet: -- No accountancy (only bank management). +- No double party 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). +- 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. -- Dolibarr can't do coffee (not yet). \ No newline at end of file +- Dolibarr can't do coffee (not yet). diff --git a/htdocs/adherents/class/adherent.class.php b/htdocs/adherents/class/adherent.class.php index b98b34ded05..e97a09559af 100644 --- a/htdocs/adherents/class/adherent.class.php +++ b/htdocs/adherents/class/adherent.class.php @@ -690,6 +690,9 @@ class Adherent extends CommonObject $error=0; $errorflag=0; + // Check parameters + if (empty($rowid)) $rowid=$this->id; + $this->db->begin(); // Remove category @@ -1103,7 +1106,7 @@ class Adherent extends CommonObject if (count($extralabels)>0) { $this->fetch_optionals($this->id,$extralabels); } - + // Load other properties $result=$this->fetch_subscriptions(); @@ -1490,19 +1493,17 @@ class Adherent extends CommonObject /** - * Return civility label of a contact + * Return civility label of a member * - * @param int $nohtmlentities 0=Encode with htmlentities for HTML output, 1=No htmlentities for memory translation - * @return string Name translated of civility + * @return string Translated name of civility */ - function getCivilityLabel($nohtmlentities=0) + function getCivilityLabel() { global $langs; $langs->load("dict"); $code=$this->civilite_id; - if ($nohtmlentities) return $langs->transnoentities("Civility".$code)!="Civility".$code ? $langs->transnoentities("Civility".$code) : $code; - else return $langs->trans("Civility".$code)!="Civility".$code ? $langs->trans("Civility".$code) : $code; + return $langs->getLabelFromKey($this->db, "Civility".$code, "c_civilite", "code", "civilite", $code); } /** @@ -1534,7 +1535,7 @@ class Adherent extends CommonObject $lien = ''; $lienfin=''; } - + $picto='user'; $label=$langs->trans("ShowMember"); diff --git a/htdocs/adherents/fiche.php b/htdocs/adherents/fiche.php index 05833bbce10..8c714ab7c67 100644 --- a/htdocs/adherents/fiche.php +++ b/htdocs/adherents/fiche.php @@ -246,9 +246,22 @@ if ($action == 'update' && ! $_POST["cancel"] && $user->rights->adherent->creer) { $birthdate=dol_mktime(12, 0, 0, $_POST["birthmonth"], $_POST["birthday"], $_POST["birthyear"]); } + $lastname=$_POST["lastname"]; + $firstname=$_POST["firstname"]; + $morphy=$morphy=$_POST["morphy"];; + if ($morphy != 'mor' && empty($lastname)) { + $error++; + $langs->load("errors"); + $errmsg .= $langs->trans("ErrorFieldRequired",$langs->transnoentities("Lastname"))."
\n"; + } + if ($morphy != 'mor' && (!isset($firstname) || $firstname=='')) { + $error++; + $langs->load("errors"); + $errmsg .= $langs->trans("ErrorFieldRequired",$langs->transnoentities("Firstname"))."
\n"; + } // Create new object - if ($result > 0) + if ($result > 0 && ! $error) { $object->oldcopy=dol_clone($object); @@ -389,6 +402,10 @@ if ($action == 'update' && ! $_POST["cancel"] && $user->rights->adherent->creer) $action=''; } } + else + { + $action='edit'; + } } if ($action == 'add' && $user->rights->adherent->creer) @@ -489,7 +506,7 @@ if ($action == 'add' && $user->rights->adherent->creer) $errmsg .= $langs->trans("ErrorFieldRequired",$langs->transnoentities("Password"))."
\n"; } } - if (empty($lastname)) { + if ($morphy != 'mor' && empty($lastname)) { $error++; $langs->load("errors"); $errmsg .= $langs->trans("ErrorFieldRequired",$langs->transnoentities("Lastname"))."
\n"; diff --git a/htdocs/admin/stock.php b/htdocs/admin/stock.php index 0390efcdda4..3733973bb2a 100644 --- a/htdocs/admin/stock.php +++ b/htdocs/admin/stock.php @@ -68,7 +68,6 @@ if ($action == 'STOCK_CALCULATE_ON_SUPPLIER_BILL' $res=dolibarr_set_const($db, "STOCK_CALCULATE_ON_SUPPLIER_BILL", '','chaine',0,'',$conf->entity); $res=dolibarr_set_const($db, "STOCK_CALCULATE_ON_SUPPLIER_VALIDATE_ORDER", '','chaine',0,'',$conf->entity); $res=dolibarr_set_const($db, "STOCK_CALCULATE_ON_SUPPLIER_DISPATCH_ORDER", '','chaine',0,'',$conf->entity); - $res=dolibarr_set_const($db, "STOCK_CALCULATE_ON_DELETE_INVOICE", '','chaine',0,'',$conf->entity); if ($action == 'STOCK_CALCULATE_ON_SUPPLIER_BILL') $res=dolibarr_set_const($db, "STOCK_CALCULATE_ON_SUPPLIER_BILL", GETPOST('STOCK_CALCULATE_ON_SUPPLIER_BILL','alpha'),'chaine',0,'',$conf->entity); if ($action == 'STOCK_CALCULATE_ON_SUPPLIER_VALIDATE_ORDER') $res=dolibarr_set_const($db, "STOCK_CALCULATE_ON_SUPPLIER_VALIDATE_ORDER", GETPOST('STOCK_CALCULATE_ON_SUPPLIER_VALIDATE_ORDER','alpha'),'chaine',0,'',$conf->entity); if ($action == 'STOCK_CALCULATE_ON_SUPPLIER_DISPATCH_ORDER') $res=dolibarr_set_const($db, "STOCK_CALCULATE_ON_SUPPLIER_DISPATCH_ORDER", GETPOST('STOCK_CALCULATE_ON_SUPPLIER_DISPATCH_ORDER','alpha'),'chaine',0,'',$conf->entity); @@ -241,19 +240,6 @@ if (! empty($conf->fournisseur->enabled)) print ''; print "\n\n\n"; } -if (! empty($conf->facture->enabled)) -{ - $var=!$var; - print ""; - print ''.$langs->trans("ReStockOnDeleteInvoice").''; - print ''; - print "
"; - print ''; - print ""; - print $form->selectyesno("STOCK_CALCULATE_ON_DELETE_INVOICE",$conf->global->STOCK_CALCULATE_ON_DELETE_INVOICE,1); - print ''; - print "
\n\n\n"; -} print ''; diff --git a/htdocs/admin/system/phpinfo.php b/htdocs/admin/system/phpinfo.php index dc29a53141f..c6e2819f5d7 100644 --- a/htdocs/admin/system/phpinfo.php +++ b/htdocs/admin/system/phpinfo.php @@ -23,7 +23,8 @@ */ require '../../main.inc.php'; -require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; $langs->load("admin"); @@ -45,6 +46,23 @@ if (isset($title)) print_fiche_titre($langs->trans($title), '', 'setup'); } + + +print ''; +print ''; +print "\n"; + +$var=false; + +// Recupere la version de l'OS +$phpversion=version_php(); +print "\n"; + +print '
'.$langs->trans("Parameter").''.$langs->trans("Value").'
'.$langs->trans("Version")."".$phpversion."
'; +print '
'; + + + // Get php_info array $phparray=phpinfo_array(); foreach($phparray as $key => $value) @@ -68,7 +86,12 @@ foreach($phparray as $key => $value) print ''.$keyparam.''; $valtoshow=$keyvalue; if ($keyparam == 'X-ChromePhp-Data') $valtoshow=dol_trunc($keyvalue,80); - print ''.$valtoshow.''; + print ''; + if ($keyparam == 'Path') $valtoshow=join('; ',explode(';',trim($valtoshow))); + if ($keyparam == 'PATH') $valtoshow=join('; ',explode(';',trim($valtoshow))); + if ($keyparam == '_SERVER["PATH"]') $valtoshow=join('; ',explode(';',trim($valtoshow))); + print $valtoshow; + print ''; print ''; } else @@ -82,7 +105,7 @@ foreach($phparray as $key => $value) print ''; $valtoshow=$keyvalue2; if ($keyparam == 'disable_functions') $valtoshow=join(', ',explode(',',trim($valtoshow))); - //print $keyparam2.' = '; + //print $keyparam; print $valtoshow; $i++; print ''; diff --git a/htdocs/comm/action/fiche.php b/htdocs/comm/action/fiche.php index f230ba1a95b..8b93bf23590 100644 --- a/htdocs/comm/action/fiche.php +++ b/htdocs/comm/action/fiche.php @@ -932,7 +932,7 @@ if ($id > 0) // Busy print ''.$langs->trans("Busy").''; - print yn(($act->transparency > 0)?1:0); + if ($act->usertodo->id > 0) print yn(($act->transparency > 0)?1:0); // We show nothing if event is assigned to nobody print ''; // Done by diff --git a/htdocs/comm/propal.php b/htdocs/comm/propal.php index 09bc17792c0..1ad89847ea8 100644 --- a/htdocs/comm/propal.php +++ b/htdocs/comm/propal.php @@ -1858,7 +1858,7 @@ else // Convert date into timestamp format if (in_array($extrafields->attribute_type[$key],array('date','datetime'))) { - $value = isset($_POST["options_".$key])?dol_mktime($_POST["options_".$key."hour"], $_POST["options_".$key."min"], 0, $_POST["options_".$key."month"], $_POST["options_".$key."day"], $_POST["options_".$key."year"]):$object->array_options['options_'.$key]; + $value = isset($_POST["options_".$key])?dol_mktime($_POST["options_".$key."hour"], $_POST["options_".$key."min"], 0, $_POST["options_".$key."month"], $_POST["options_".$key."day"], $_POST["options_".$key."year"]):$db->jdate($object->array_options['options_'.$key]); } if ($action == 'edit_extras' && $user->rights->propal->creer) diff --git a/htdocs/commande/fiche.php b/htdocs/commande/fiche.php index a7d04670961..816df65ea85 100644 --- a/htdocs/commande/fiche.php +++ b/htdocs/commande/fiche.php @@ -2158,7 +2158,7 @@ else // Convert date into timestamp format if (in_array($extrafields->attribute_type[$key],array('date','datetime'))) { - $value = isset($_POST["options_".$key])?dol_mktime($_POST["options_".$key."hour"], $_POST["options_".$key."min"], 0, $_POST["options_".$key."month"], $_POST["options_".$key."day"], $_POST["options_".$key."year"]):$object->array_options['options_'.$key]; + $value = isset($_POST["options_".$key])?dol_mktime($_POST["options_".$key."hour"], $_POST["options_".$key."min"], 0, $_POST["options_".$key."month"], $_POST["options_".$key."day"], $_POST["options_".$key."year"]):$db->jdate($object->array_options['options_'.$key]); } if ($action == 'edit_extras' && $user->rights->commande->creer) diff --git a/htdocs/compta/bank/account.php b/htdocs/compta/bank/account.php index a07395a8f4f..a02dff6b868 100644 --- a/htdocs/compta/bank/account.php +++ b/htdocs/compta/bank/account.php @@ -543,41 +543,37 @@ if ($id > 0 || ! empty($ref)) if ($links[$key]['type']=='payment') { $paymentstatic->id=$links[$key]['url_id']; + $paymentstatic->ref=$links[$key]['url_id']; print ' '.$paymentstatic->getNomUrl(2); } - else if ($links[$key]['type']=='payment_supplier') + elseif ($links[$key]['type']=='payment_supplier') { $paymentsupplierstatic->id=$links[$key]['url_id']; $paymentsupplierstatic->ref=$links[$key]['url_id']; print ' '.$paymentsupplierstatic->getNomUrl(2); } - else if ($links[$key]['type']=='company') + elseif ($links[$key]['type']=='payment_sc') { - - } - else if ($links[$key]['type']=='payment_sc') - { - //print ' - '; print ''; print ' '.img_object($langs->trans('ShowPayment'),'payment').' '; //print $langs->trans("SocialContributionPayment"); print ''; } - else if ($links[$key]['type']=='payment_vat') + elseif ($links[$key]['type']=='payment_vat') { $paymentvatstatic->id=$links[$key]['url_id']; $paymentvatstatic->ref=$links[$key]['url_id']; print ' '.$paymentvatstatic->getNomUrl(2); } - else if ($links[$key]['type']=='banktransfert') + elseif ($links[$key]['type']=='banktransfert') { - // Do not show link to transfer ince there is no transfer card (avoid confusion). Can already be accessed from transaction detail. + // Do not show link to transfer since there is no transfer card (avoid confusion). Can already be accessed from transaction detail. if ($objp->amount > 0) { $banklinestatic->fetch($links[$key]['url_id']); $bankstatic->id=$banklinestatic->fk_account; $bankstatic->label=$banklinestatic->bank_account_label; - print ' ('.$langs->trans("From "); + print ' ('.$langs->trans("from").' '; print $bankstatic->getNomUrl(1,'transactions'); print ' '.$langs->trans("toward").' '; $bankstatic->id=$objp->bankid; @@ -589,7 +585,7 @@ if ($id > 0 || ! empty($ref)) { $bankstatic->id=$objp->bankid; $bankstatic->label=$objp->bankref; - print ' ('.$langs->trans("From "); + print ' ('.$langs->trans("from").' '; print $bankstatic->getNomUrl(1,''); print ' '.$langs->trans("toward").' '; $banklinestatic->fetch($links[$key]['url_id']); @@ -600,11 +596,15 @@ if ($id > 0 || ! empty($ref)) } //var_dump($links); } - else if ($links[$key]['type']=='member') + elseif ($links[$key]['type']=='company') { } - else if ($links[$key]['type']=='sc') + elseif ($links[$key]['type']=='member') + { + + } + elseif ($links[$key]['type']=='sc') { } diff --git a/htdocs/compta/bank/annuel.php b/htdocs/compta/bank/annuel.php index ada636adb33..a211dcb686d 100644 --- a/htdocs/compta/bank/annuel.php +++ b/htdocs/compta/bank/annuel.php @@ -2,6 +2,7 @@ /* Copyright (C) 2005 Rodolphe Quiedeville * Copyright (C) 2004-2010 Laurent Destailleur * Copyright (C) 2005-2012 Regis Houssin + * Copyright (C) 2013 Charles-Fr BENKE * * 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 @@ -20,15 +21,16 @@ /** * \file htdocs/compta/bank/annuel.php * \ingroup banque - * \brief Page reporting mensuel Entrees/Sorties d'un compte bancaire + * \brief Page to report input-output of a bank account */ require('../../main.inc.php'); require_once DOL_DOCUMENT_ROOT.'/core/lib/bank.lib.php'; require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php'; - -$langs->load("banks"); -$langs->load("categories"); +require_once DOL_DOCUMENT_ROOT.'/core/class/dolgraph.class.php'; + +$langs->load("banks"); +$langs->load("categories"); $id=GETPOST('account'); $ref=GETPOST('ref'); @@ -278,6 +280,237 @@ print "\n"; print ""; +// BUILDING GRAPHICS + +$datetime = dol_now(); +$year = dol_print_date($datetime, "%Y"); +$month = dol_print_date($datetime, "%m"); +$day = dol_print_date($datetime, "%d"); +if (! empty($_GET["year"])) $year=sprintf("%04d",$_GET["year"]); +if (! empty($_GET["month"])) $month=sprintf("%02d",$_GET["month"]); + +$result=dol_mkdir($conf->banque->dir_temp); +if ($result < 0) +{ + $langs->load("errors"); + $error++; + $mesg='
'.$langs->trans("ErrorFailedToCreateDir").'
'; +} +else +{ + // Definition de $width et $height + $width = 550; + $height = 300; + + // Calcul de $min et $max + $sql = "SELECT MIN(b.datev) as min, MAX(b.datev) as max"; + $sql.= " FROM ".MAIN_DB_PREFIX."bank as b"; + $sql.= ", ".MAIN_DB_PREFIX."bank_account as ba"; + $sql.= " WHERE b.fk_account = ba.rowid"; + $sql.= " AND ba.entity = ".$conf->entity; + if ($id && $_GET["option"]!='all') $sql.= " AND b.fk_account IN (".$id.")"; + + $resql = $db->query($sql); + if ($resql) + { + $num = $db->num_rows($resql); + $obj = $db->fetch_object($resql); + $min = $db->jdate($obj->min); + $max = $db->jdate($obj->max); + } + else + { + dol_print_error($db); + } + $log="graph.php: min=".$min." max=".$max; + dol_syslog($log); + +// CRED PART + // Chargement du tableau des années + $tblyear[0] = array(); + $tblyear[1] = array(); + $tblyear[2] = array(); + + for ($annee=0;$annee<3;$annee++) + { + $sql = "SELECT date_format(b.datev,'%m')"; + $sql.= ", SUM(b.amount)"; + $sql.= " FROM ".MAIN_DB_PREFIX."bank as b"; + $sql.= ", ".MAIN_DB_PREFIX."bank_account as ba"; + $sql.= " WHERE b.fk_account = ba.rowid"; + $sql.= " AND ba.entity = ".$conf->entity; + $sql.= " AND b.datev >= '".($year-$annee)."-01-01 00:00:00'"; + $sql.= " AND b.datev <= '".($year-$annee)."-12-31 23:59:59'"; + $sql.= " AND b.amount > 0"; + if ($id && $_GET["option"]!='all') $sql.= " AND b.fk_account IN (".$id.")"; + $sql .= " GROUP BY date_format(b.datev,'%m');"; + + $resql = $db->query($sql); + if ($resql) + { + $num = $db->num_rows($resql); + $i = 0; + while ($i < $num) + { + $row = $db->fetch_row($resql); + $tblyear[$annee][$row[0]] = $row[1]; + $i++; + } + $db->free($resql); + + } + else + { + dol_print_error($db); + } + } + // Chargement de labels et data_xxx pour tableau 4 Mouvements + $labels = array(); + $data_year_0 = array(); + $data_year_1 = array(); + $data_year_2 = array(); + + for ($i = 0 ; $i < 12 ; $i++) + { + $data_year_0[$i] = isset($tblyear[0][substr("0".($i+1),-2)]) ? $tblyear[0][substr("0".($i+1),-2)] : 0; + $data_year_1[$i] = isset($tblyear[1][substr("0".($i+1),-2)]) ? $tblyear[1][substr("0".($i+1),-2)] : 0; + $data_year_2[$i] = isset($tblyear[2][substr("0".($i+1),-2)]) ? $tblyear[2][substr("0".($i+1),-2)] : 0; + $labels[$i] = dol_print_date(dol_mktime(12,0,0,$i+1,1,2000),"%b"); + $datamin[$i] = 0; + } + + // Fabrication tableau 4b + $file= $conf->banque->dir_temp."/credmovement".$id."-".$year.".png"; + $fileurl=DOL_URL_ROOT.'/viewimage.php?modulepart=banque_temp&file='."/credmovement".$id."-".$year.".png"; + $title=$langs->transnoentities("Credit").' - '.$langs->transnoentities("Year").': '.($year-2).' - '.($year-1)." - ".$year; + $graph_datas=array(); + for($i=0;$i<12;$i++) + { + $graph_datas[$i]=array($labels[$i], $data_year_0[$i], $data_year_1[$i], $data_year_2[$i]); + } + + $px1 = new DolGraph(); + $px1->SetData($graph_datas); + $px1->SetLegend(array(($year),($year-1),($year-2))); + $px1->SetLegendWidthMin(180); + $px1->SetMaxValue($px1->GetCeilMaxValue()<0?0:$px1->GetCeilMaxValue()); + $px1->SetMinValue($px1->GetFloorMinValue()>0?0:$px1->GetFloorMinValue()); + $px1->SetTitle($title); + $px1->SetWidth($width); + $px1->SetHeight($height); + $px1->SetType(array('line','line','line')); + $px1->SetShading(3); + $px1->setBgColor('onglet'); + $px1->setBgColorGrid(array(255,255,255)); + $px1->SetHorizTickIncrement(1); + $px1->SetPrecisionY(0); + $px1->draw($file,$fileurl); + + $show1 = $px1->show(); + + unset($graph_datas); + unset($px1); + unset($tblyear[0]); + unset($tblyear[1]); + unset($tblyear[2]); + +// DEDBT PART + // Chargement du tableau des années + $tblyear[0] = array(); + $tblyear[1] = array(); + $tblyear[2] = array(); + + for ($annee=0;$annee<3;$annee++) + { + $sql = "SELECT date_format(b.datev,'%m')"; + $sql.= ", SUM(b.amount)"; + $sql.= " FROM ".MAIN_DB_PREFIX."bank as b"; + $sql.= ", ".MAIN_DB_PREFIX."bank_account as ba"; + $sql.= " WHERE b.fk_account = ba.rowid"; + $sql.= " AND ba.entity = ".$conf->entity; + $sql.= " AND b.datev >= '".($year-$annee)."-01-01 00:00:00'"; + $sql.= " AND b.datev <= '".($year-$annee)."-12-31 23:59:59'"; + $sql.= " AND b.amount < 0"; + if ($id && $_GET["option"]!='all') $sql.= " AND b.fk_account IN (".$id.")"; + $sql .= " GROUP BY date_format(b.datev,'%m');"; + + $resql = $db->query($sql); + if ($resql) + { + $num = $db->num_rows($resql); + $i = 0; + while ($i < $num) + { + $row = $db->fetch_row($resql); + $tblyear[$annee][$row[0]] = abs($row[1]); + $i++; + } + $db->free($resql); + } + else + { + dol_print_error($db); + } + } + // Chargement de labels et data_xxx pour tableau 4 Mouvements + $labels = array(); + $data_year_0 = array(); + $data_year_1 = array(); + $data_year_2 = array(); + + for ($i = 0 ; $i < 12 ; $i++) + { + $data_year_0[$i] = isset($tblyear[0][substr("0".($i+1),-2)]) ? $tblyear[0][substr("0".($i+1),-2)] : 0; + $data_year_1[$i] = isset($tblyear[1][substr("0".($i+1),-2)]) ? $tblyear[1][substr("0".($i+1),-2)] : 0; + $data_year_2[$i] = isset($tblyear[2][substr("0".($i+1),-2)]) ? $tblyear[2][substr("0".($i+1),-2)] : 0; + $labels[$i] = dol_print_date(dol_mktime(12,0,0,$i+1,1,2000),"%b"); + $datamin[$i] = 0; + } + + $file= $conf->banque->dir_temp."/debmovement".$id."-".$year.".png"; + $fileurl= DOL_URL_ROOT.'/viewimage.php?modulepart=banque_temp&file='."/debmovement".$id."-".$year.".png"; + $title=$langs->transnoentities("Debit").' - '.$langs->transnoentities("Year").': '.($year-2).' - '.($year-1)." - ".$year; + $graph_datas=array(); + for($i=0;$i<12;$i++) + { + $graph_datas[$i]=array($labels[$i], $data_year_0[$i], $data_year_1[$i], $data_year_2[$i]); + } + + $px2 = new DolGraph(); + $px2->SetData($graph_datas); + $px2->SetLegend(array(($year),($year-1),($year-2))); + $px2->SetLegendWidthMin(180); + $px2->SetMaxValue($px2->GetCeilMaxValue()<0?0:$px2->GetCeilMaxValue()); + $px2->SetMinValue($px2->GetFloorMinValue()>0?0:$px2->GetFloorMinValue()); + $px2->SetTitle($title); + $px2->SetWidth($width); + $px2->SetHeight($height); + $px2->SetType(array('line','line','line')); + $px2->SetShading(3); + $px2->setBgColor('onglet'); + $px2->setBgColorGrid(array(255,255,255)); + $px2->SetHorizTickIncrement(1); + $px2->SetPrecisionY(0); + $px2->draw($file,$fileurl); + + $show2 = $px2->show(); + + unset($graph_datas); + unset($px2); + unset($tblyear[0]); + unset($tblyear[1]); + unset($tblyear[2]); + + print ''; + print ''; + print '
'; + print $show1; + print ' '; + print $show2; + print '
'; +} + + print "\n\n"; llxFooter(); diff --git a/htdocs/compta/bank/releve.php b/htdocs/compta/bank/releve.php index 2a6ddd762d3..2d9ac9cd86e 100644 --- a/htdocs/compta/bank/releve.php +++ b/htdocs/compta/bank/releve.php @@ -1,6 +1,6 @@ - * Copyright (C) 2004-2009 Laurent Destailleur + * Copyright (C) 2004-2013 Laurent Destailleur * Copyright (C) 2005-2013 Regis Houssin * * This program is free software; you can redistribute it and/or modify @@ -20,11 +20,17 @@ /** * \file htdocs/compta/bank/releve.php * \ingroup banque - * \brief Page d'affichage d'un releve + * \brief Page to show a bank receipt report */ require('../../main.inc.php'); require_once DOL_DOCUMENT_ROOT.'/core/lib/bank.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php'; +require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent.class.php'; +require_once DOL_DOCUMENT_ROOT.'/compta/sociales/class/chargesociales.class.php'; +require_once DOL_DOCUMENT_ROOT.'/compta/paiement/class/paiement.class.php'; +require_once DOL_DOCUMENT_ROOT.'/compta/tva/class/tva.class.php'; +require_once DOL_DOCUMENT_ROOT.'/fourn/class/paiementfourn.class.php'; require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php'; $langs->load("banks"); @@ -76,6 +82,14 @@ $pagenext = $page + 1; llxHeader(); $form = new Form($db); +$societestatic=new Societe($db); +$chargestatic=new ChargeSociales($db); +$memberstatic=new Adherent($db); +$paymentstatic=new Paiement($db); +$paymentsupplierstatic=new PaiementFourn($db); +$paymentvatstatic=new TVA($db); +$bankstatic=new Account($db); +$banklinestatic=new AccountLine($db); // Load account @@ -131,7 +145,7 @@ if (empty($num)) print_barre_liste('', $page, $_SERVER["PHP_SELF"], "&account=".$acct->id, $sortfield, $sortorder,'',$numrows); print ''; - print ""; + print ''; print ''; //while ($i < min($numrows,$conf->liste_limit)) // retrait de la limite tant qu'il n'y a pas de pagination @@ -145,7 +159,7 @@ if (empty($num)) } else { - print "\n"; + print ''."\n"; } $i++; } @@ -252,16 +266,19 @@ else } // Recherche les ecritures pour le releve - $sql = "SELECT b.rowid, b.dateo as do, b.datev as dv"; - $sql.= ", b.amount, b.label, b.rappro, b.num_releve, b.num_chq, b.fk_type"; - $sql.= " FROM ".MAIN_DB_PREFIX."bank as b"; + $sql = "SELECT b.rowid, b.dateo as do, b.datev as dv,"; + $sql.= " b.amount, b.label, b.rappro, b.num_releve, b.num_chq, b.fk_type,"; + $sql.= " ba.rowid as bankid, ba.ref as bankref, ba.label as banklabel"; + $sql.= " FROM ".MAIN_DB_PREFIX."bank_account as ba"; + $sql.= ", ".MAIN_DB_PREFIX."bank as b"; $sql.= " WHERE b.num_releve='".$db->escape($num)."'"; if (!isset($num)) $sql.= " OR b.num_releve is null"; $sql.= " AND b.fk_account = ".$acct->id; - $sql.= " ORDER BY b.datev ASC"; + $sql.= " AND b.fk_account = ba.rowid"; + $sql.= $db->order("b.datev, b.datec", "ASC"); // We add date of creation to have correct order when everything is done the same day + dol_syslog("sql=".$sql); $result = $db->query($sql); - if ($result) { $var=True; @@ -314,19 +331,61 @@ else else print '
'; if ($links[$key]['type']=='payment') { - print ''; - print img_object($langs->trans('ShowPayment'),'payment').' '; - print $langs->trans("Payment"); - print ''; + $paymentstatic->id=$links[$key]['url_id']; + $paymentstatic->ref=$langs->trans("Payment"); + print ' '.$paymentstatic->getNomUrl(1); $newline=0; } - elseif ($links[$key]['type']=='payment_supplier') { - print ''; - print img_object($langs->trans('ShowPayment'),'payment').' '; - print $langs->trans("Payment"); - print ''; + elseif ($links[$key]['type']=='payment_supplier') + { + $paymentsupplierstatic->id=$links[$key]['url_id']; + $paymentsupplierstatic->ref=$langs->trans("Payment");; + print ' '.$paymentsupplierstatic->getNomUrl(1); $newline=0; } + elseif ($links[$key]['type']=='payment_sc') + { + print ''; + print ' '.img_object($langs->trans('ShowPayment'),'payment').' '; + print $langs->trans("SocialContributionPayment"); + print ''; + $newline=0; + } + elseif ($links[$key]['type']=='payment_vat') + { + $paymentvatstatic->id=$links[$key]['url_id']; + $paymentvatstatic->ref=$langs->trans("Payment"); + print ' '.$paymentvatstatic->getNomUrl(2); + } + elseif ($links[$key]['type']=='banktransfert') { + // Do not show link to transfer since there is no transfer card (avoid confusion). Can already be accessed from transaction detail. + if ($objp->amount > 0) + { + $banklinestatic->fetch($links[$key]['url_id']); + $bankstatic->id=$banklinestatic->fk_account; + $bankstatic->label=$banklinestatic->bank_account_label; + print ' ('.$langs->trans("from").' '; + print $bankstatic->getNomUrl(1,'transactions'); + print ' '.$langs->trans("toward").' '; + $bankstatic->id=$objp->bankid; + $bankstatic->label=$objp->bankref; + print $bankstatic->getNomUrl(1,''); + print ')'; + } + else + { + $bankstatic->id=$objp->bankid; + $bankstatic->label=$objp->bankref; + print ' ('.$langs->trans("from").' '; + print $bankstatic->getNomUrl(1,''); + print ' '.$langs->trans("toward").' '; + $banklinestatic->fetch($links[$key]['url_id']); + $bankstatic->id=$banklinestatic->fk_account; + $bankstatic->label=$banklinestatic->bank_account_label; + print $bankstatic->getNomUrl(1,'transactions'); + print ')'; + } + } elseif ($links[$key]['type']=='company') { print ''; print img_object($langs->trans('ShowCustomer'),'company').' '; @@ -334,34 +393,19 @@ else print ''; $newline=0; } - else if ($links[$key]['type']=='sc') { - print ''; - print img_object($langs->trans('ShowBill'),'bill').' '; - print $langs->trans("SocialContribution"); - print ''; - $newline=0; - } - else if ($links[$key]['type']=='payment_sc') { - print ''; - print img_object($langs->trans('ShowPayment'),'payment').' '; - print $langs->trans("SocialContributionPayment"); - print ''; - $newline=0; - } - else if ($links[$key]['type']=='member') { + elseif ($links[$key]['type']=='member') { print ''; print img_object($langs->trans('ShowMember'),'user').' '; print $links[$key]['label']; print ''; $newline=0; } - else if ($links[$key]['type']=='banktransfert') { - /* print ''; - print img_object($langs->trans('ShowTransaction'),'payment').' '; - print $langs->trans("TransactionOnTheOtherAccount"); - print ''; - $newline=0; - */ + elseif ($links[$key]['type']=='sc') { + print ''; + print img_object($langs->trans('ShowBill'),'bill').' '; + print $langs->trans("SocialContribution"); + print ''; + $newline=0; } else { print ''; diff --git a/htdocs/compta/facture.php b/htdocs/compta/facture.php index 1d6909874b1..82205be3e7b 100644 --- a/htdocs/compta/facture.php +++ b/htdocs/compta/facture.php @@ -3304,7 +3304,7 @@ else if ($id > 0 || ! empty($ref)) // Convert date into timestamp format if (in_array($extrafields->attribute_type[$key],array('date','datetime'))) { - $value = isset($_POST["options_".$key])?dol_mktime($_POST["options_".$key."hour"], $_POST["options_".$key."min"], 0, $_POST["options_".$key."month"], $_POST["options_".$key."day"], $_POST["options_".$key."year"]):$object->array_options['options_'.$key]; + $value = isset($_POST["options_".$key])?dol_mktime($_POST["options_".$key."hour"], $_POST["options_".$key."min"], 0, $_POST["options_".$key."month"], $_POST["options_".$key."day"], $_POST["options_".$key."year"]):$db->jdate($object->array_options['options_'.$key]); } if ($action == 'edit_extras' && $user->rights->facture->creer) diff --git a/htdocs/compta/prelevement/class/rejetprelevement.class.php b/htdocs/compta/prelevement/class/rejetprelevement.class.php index b7edbcd63fd..77bafae3603 100644 --- a/htdocs/compta/prelevement/class/rejetprelevement.class.php +++ b/htdocs/compta/prelevement/class/rejetprelevement.class.php @@ -50,7 +50,7 @@ class RejetPrelevement $this->motifs = array(); $this->facturer = array(); - $this->motifs[0] = "";//$langs->trans("StatusMotif0"); + $this->motifs[0] = ""; //$langs->trans("StatusMotif0"); $this->motifs[1] = $langs->trans("StatusMotif1"); $this->motifs[2] = $langs->trans("StatusMotif2"); $this->motifs[3] = $langs->trans("StatusMotif3"); @@ -175,6 +175,7 @@ class RejetPrelevement dol_syslog("RejetPrelevement::Create set_unpaid fac ".$fac->ref); $fac->set_unpaid($fac->id, $user); + //TODO: Must be managed by notifications module // Send email to sender of the standing order request $this->_send_email($fac); } diff --git a/htdocs/compta/prelevement/ligne.php b/htdocs/compta/prelevement/ligne.php index a828d1218e9..28358dc75f5 100644 --- a/htdocs/compta/prelevement/ligne.php +++ b/htdocs/compta/prelevement/ligne.php @@ -2,7 +2,7 @@ /* Copyright (C) 2005 Rodolphe Quiedeville * Copyright (C) 2005-2012 Laurent Destailleur * Copyright (C) 2005-2009 Regis Houssin - * Copyright (C) 2010-2012 Juanjo Menent + * Copyright (C) 2010-2013 Juanjo Menent * * 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 @@ -53,26 +53,36 @@ if ($action == 'confirm_rejet') { if ( GETPOST("confirm") == 'yes') { - $daterej = mktime(2, 0, 0, GETPOST('remonth','int'), GETPOST('reday','int'), GETPOST('reyear','int')); + if (GETPOST('remonth','int')) + { + $daterej = mktime(2, 0, 0, GETPOST('remonth','int'), GETPOST('reday','int'), GETPOST('reyear','int')); + } if (empty($daterej)) { $error++; setEventMessage($langs->trans("ErrorFieldRequired",$langs->trans("Date")),'errors'); } - + + elseif ($daterej > dol_now()) + { + $error++; + $langs->load("error"); + setEventMessage($langs->transnoentities("ErrorDateMustBeBeforeToday"),'errors'); + } + if (GETPOST('motif','alpha') == 0) { $error++; setEventMessage($langs->trans("ErrorFieldRequired",$langs->transnoentities("RefusedReason")),'errors'); } - - $lipre = new LignePrelevement($db, $user); - if ($lipre->fetch($id) == 0) + if ( ! $error ) { + $lipre = new LignePrelevement($db, $user); + + if ($lipre->fetch($id) == 0) - if ( ! $error && $daterej < time()) { $rej = new RejetPrelevement($db, $user); @@ -81,13 +91,11 @@ if ($action == 'confirm_rejet') header("Location: ligne.php?id=".$id); exit; } - else - { - dol_syslog("Motif : ".GETPOST('motif','alpha')); - dol_syslog("$daterej $time "); - $action="rejet"; - } + } + else + { + $action="rejet"; } } else @@ -188,13 +196,13 @@ if ($id) print ''; //Date - print ''; + print ''; print ''; //Reason - print ''; + print ''; print ''; @@ -319,8 +327,6 @@ if ($id) } } -dol_htmloutput_mesg($mesg); - llxFooter(); $db->close(); diff --git a/htdocs/compta/sociales/class/chargesociales.class.php b/htdocs/compta/sociales/class/chargesociales.class.php index f62b2fcc594..4efd90c10aa 100644 --- a/htdocs/compta/sociales/class/chargesociales.class.php +++ b/htdocs/compta/sociales/class/chargesociales.class.php @@ -35,6 +35,7 @@ class ChargeSociales extends CommonObject public $table_element='chargesociales'; var $id; + var $ref; var $date_ech; var $lib; var $type; diff --git a/htdocs/compta/tva/fiche.php b/htdocs/compta/tva/fiche.php index a95f7b85963..a31b4030b65 100644 --- a/htdocs/compta/tva/fiche.php +++ b/htdocs/compta/tva/fiche.php @@ -31,7 +31,8 @@ $langs->load("compta"); $langs->load("banks"); $langs->load("bills"); -$id=$_REQUEST["id"]; +$id=GETPOST("id"); +$action=GETPOST('action'); $mesg = ''; @@ -40,17 +41,25 @@ $socid = isset($_GET["socid"])?$_GET["socid"]:''; if ($user->societe_id) $socid=$user->societe_id; $result = restrictedArea($user, 'tax', '', '', 'charges'); +$tva = new Tva($db); + // Initialize technical object to manage hooks of thirdparties. Note that conf->hooks_modules contains array array $hookmanager->initHooks(array('taxvatcard')); -/** - * Action ajout paiement tva - */ -if ($_POST["action"] == 'add' && $_POST["cancel"] <> $langs->trans("Cancel")) -{ - $tva = new Tva($db); +/** + * Actions + */ + +if ($_POST["cancel"] == $langs->trans("Cancel")) +{ + header("Location: reglement.php"); + exit; +} + +if ($action == 'add' && $_POST["cancel"] <> $langs->trans("Cancel")) +{ $db->begin(); $datev=dol_mktime(12,0,0, $_POST["datevmonth"], $_POST["datevday"], $_POST["datevyear"]); @@ -74,13 +83,12 @@ if ($_POST["action"] == 'add' && $_POST["cancel"] <> $langs->trans("Cancel")) { $db->rollback(); $mesg='
'.$tva->error.'
'; - $_GET["action"]="create"; + $action="create"; } } -if ($_GET["action"] == 'delete') +if ($action == 'delete') { - $tva = new Tva($db); $result=$tva->fetch($_GET['id']); if ($tva->rappro == 0) @@ -143,7 +151,7 @@ if ($id) } // Formulaire saisie tva -if ($_GET["action"] == 'create') +if ($action == 'create') { print "
\n"; print ''; @@ -223,6 +231,9 @@ if ($id) print $vatpayment->ref; print ''; + // Label + print '
'; + print ""; print ''; $out .='
'.$langs->trans("AccountStatement").'
numr&account=".$acct->id."\">$objp->numr
'.$objp->numr.'
'.$langs->trans("RefusedData").'
'.$langs->trans("RefusedData").''; print $form->select_date('','','','','',"confirm_rejet"); print '
'.$langs->trans("RefusedReason").'
'.$langs->trans("RefusedReason").''; print $form->selectarray("motif", $rej->motifs); print '
'.$langs->trans("Label").''.$vatpayment->label.'
'.$langs->trans("DatePayment").''; print dol_print_date($vatpayment->datep,'day'); @@ -273,5 +284,4 @@ if ($id) $db->close(); llxFooter(); - -?> +?> \ No newline at end of file diff --git a/htdocs/contact/class/contact.class.php b/htdocs/contact/class/contact.class.php index e956f40a3e3..fb1ce97fd01 100644 --- a/htdocs/contact/class/contact.class.php +++ b/htdocs/contact/class/contact.class.php @@ -874,9 +874,9 @@ class Contact extends CommonObject } /** - * Return label of a civility contact + * Return civility label of contact * - * @return string Translated name of civility + * @return string Translated name of civility */ function getCivilityLabel() { @@ -884,7 +884,7 @@ class Contact extends CommonObject $langs->load("dict"); $code=$this->civilite_id; - return $langs->trans("Civility".$code)!="Civility".$code ? $langs->trans("Civility".$code) : ''; + return $langs->getLabelFromKey($this->db, "Civility".$code, "c_civilite", "code", "civilite", $code); } /** diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php index b5dee2a3c76..e283c977f5f 100644 --- a/htdocs/core/class/commonobject.class.php +++ b/htdocs/core/class/commonobject.class.php @@ -44,6 +44,9 @@ abstract class CommonObject public $civility_id; public $array_options=array(); + + public $linkedObjectsIds; + public $linkedObjects; // No constructor as it is an abstract class @@ -1649,7 +1652,7 @@ abstract class CommonObject } /** - * Fetch array of objects linked to current object. Links are loaded into this->linked_object array. + * Fetch array of objects linked to current object. Links are loaded into this->linkedObjects array. * * @param int $sourceid Object source id * @param string $sourcetype Object source type @@ -1708,6 +1711,7 @@ abstract class CommonObject $sql.= "(fk_source = '".$sourceid."' AND sourcetype = '".$sourcetype."')"; $sql.= " ".$clause." (fk_target = '".$targetid."' AND targettype = '".$targettype."')"; } + $sql .= ' ORDER BY sourcetype'; //print $sql; dol_syslog(get_class($this)."::fetchObjectLink sql=".$sql); @@ -2236,7 +2240,7 @@ abstract class CommonObject // Convert date into timestamp format if (in_array($extrafields->attribute_type[$key],array('date','datetime'))) { - $value = isset($_POST["options_".$key])?dol_mktime($_POST["options_".$key."hour"], $_POST["options_".$key."min"], 0, $_POST["options_".$key."month"], $_POST["options_".$key."day"], $_POST["options_".$key."year"]):$this->array_options['options_'.$key]; + $value = isset($_POST["options_".$key])?dol_mktime($_POST["options_".$key."hour"], $_POST["options_".$key."min"], 0, $_POST["options_".$key."month"], $_POST["options_".$key."day"], $_POST["options_".$key."year"]):$this->db->jdate($this->array_options['options_'.$key]); } $out .= ''.$label.''; diff --git a/htdocs/core/class/dolgraph.class.php b/htdocs/core/class/dolgraph.class.php index ea1734353d3..b158eb797be 100644 --- a/htdocs/core/class/dolgraph.class.php +++ b/htdocs/core/class/dolgraph.class.php @@ -1,914 +1,915 @@ - - * Copyright (c) 2004-2012 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 -* 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/core/class/dolgraph.class.php - * \ingroup core - * \brief File for class to generate graph - * - * Usage: - * $graph_data = array(array('labelxA',yA),array('labelxB',yB)); - * $graph_data = array(array('labelxA',yA1,...,yAn),array('labelxB',yB1,...yBn)); // when there is n value to show for each x - * $legend = array("Val1",...,"Valn"); // list of n series name - * $px = new DolGraph(); - * $px->SetData($graph_data); - * $px->SetMaxValue($px->GetCeilMaxValue()); - * $px->SetMinValue($px->GetFloorMinValue()); - * $px->SetTitle("title"); - * $px->SetLegend($legend); - * $px->SetWidth(width); - * $px->SetHeight(height); - * $px->draw("file.png","/viewdownload?..."); - */ - - -/** - * Parent class of graph classes - */ -class DolGraph -{ - //! Type of graph - var $type=array('bars'); // bars, lines, ... - var $mode='side'; // Mode bars graph: side, depth - private $_library='jflot'; // Graphic library to use (jflot, artichow) - - //! Array of data - var $data; // array(array('abs1',valA1,valB1), array('abs2',valA2,valB2), ...) - var $title; - var $width=380; - var $height=200; - var $MaxValue=0; - var $MinValue=0; - var $SetShading=0; - - var $PrecisionY=-1; - - var $horizTickIncrement=-1; - var $SetNumXTicks=-1; - var $labelInterval=-1; - - var $hideXGrid=false; - var $hideYGrid=false; - - var $Legend=array(); - var $LegendWidthMin=0; - - var $graph; // Objet Graph (Artichow, Phplot...) - var $error; - - var $bordercolor; // array(R,G,B) - var $bgcolor; // array(R,G,B) - var $bgcolorgrid=array(255,255,255); // array(R,G,B) - var $datacolor; // array(array(R,G,B),...) - - private $_stringtoshow; // To store string to output graph into HTML page - - - /** - * Constructor - */ - function __construct() - { - global $conf; - global $theme_bordercolor, $theme_datacolor, $theme_bgcolor, $theme_bgcoloronglet; - - // To use old feature - if (isset($conf->global->MAIN_GRAPH_LIBRARY) && $conf->global->MAIN_GRAPH_LIBRARY == 'artichow') - { - $this->_library='artichow'; - - // Test if module GD present - $modules_list = get_loaded_extensions(); - $isgdinstalled=0; - foreach ($modules_list as $module) - { - if ($module == 'gd') $isgdinstalled=1; - } - if (! $isgdinstalled) - { - $this->error="Error: PHP GD module is not available. It is required to build graphics."; - return -1; - } - } - - $this->bordercolor = array(235,235,224); - $this->datacolor = array(array(120,130,150), array(160,160,180), array(190,190,220)); - $this->bgcolor = array(235,235,224); - - $color_file = DOL_DOCUMENT_ROOT.'/theme/'.$conf->theme.'/graph-color.php'; - if (is_readable($color_file)) - { - include_once $color_file; - if (isset($theme_bordercolor)) $this->bordercolor = $theme_bordercolor; - if (isset($theme_datacolor)) $this->datacolor = $theme_datacolor; - if (isset($theme_bgcolor)) $this->bgcolor = $theme_bgcolor; - } - //print 'bgcolor: '.join(',',$this->bgcolor).'
'; - return 1; - } - - - /** - * Set Y precision - * - * @param float $which_prec Precision - * @return string - */ - function SetPrecisionY($which_prec) - { - $this->PrecisionY = $which_prec; - return true; - } - - /** - * Utiliser SetNumTicks ou SetHorizTickIncrement mais pas les 2 - * - * @param float $xi Xi - * @return boolean True - */ - function SetHorizTickIncrement($xi) - { - $this->horizTickIncrement = $xi; - return true; - } - - /** - * Utiliser SetNumTicks ou SetHorizTickIncrement mais pas les 2 - * - * @param float $xt Xt - * @return boolean True - */ - function SetNumXTicks($xt) - { - $this->SetNumXTicks = $xt; - return true; - } - - /** - * Set label interval to reduce number of labels - * - * @param float $x Label interval - * @return boolean True - */ - function SetLabelInterval($x) - { - $this->labelInterval = $x; - return true; - } - - /** - * Hide X grid - * - * @param boolean $bool XGrid or not - * @return boolean true - */ - function SetHideXGrid($bool) - { - $this->hideXGrid = $bool; - return true; - } - - /** - * Hide Y grid - * - * @param boolean $bool YGrid or not - * @return boolean true - */ - function SetHideYGrid($bool) - { - $this->hideYGrid = $bool; - return true; - } - - /** - * Set y label - * - * @param string $label Y label - * @return boolean True - */ - function SetYLabel($label) - { - $this->YLabel = $label; - } - - /** - * Set width - * - * @param int $w Width - * @return boolean True - */ - function SetWidth($w) - { - $this->width = $w; - } - - /** - * Set title - * - * @param string $title Title - * @return void - */ - function SetTitle($title) - { - $this->title = $title; - } - - /** - * Set data - * - * @param array $data Data - * @return void - */ - function SetData($data) - { - $this->data = $data; - //var_dump($this->data); - } - - /** - * Set type - * - * @param array $type Array with type for each serie - * @return void - */ - function SetType($type) - { - $this->type = $type; - } - - /** - * Set legend - * - * @param string $legend Legend - * @return void - */ - function SetLegend($legend) - { - $this->Legend = $legend; - } - - /** - * Set min width - * - * @param int $legendwidthmin Min width - * @return void - */ - function SetLegendWidthMin($legendwidthmin) - { - $this->LegendWidthMin = $legendwidthmin; - } - - /** - * Set max value - * - * @param int $max Max value - * @return void - */ - function SetMaxValue($max) - { - $this->MaxValue = $max; - } - - /** - * Get max value - * - * @return int Max value - */ - function GetMaxValue() - { - return $this->MaxValue; - } - - /** - * Set min value - * - * @param int $min Min value - * @return void - */ - function SetMinValue($min) - { - $this->MinValue = $min; - } - - /** - * Get min value - * - * @return int Max value - */ - function GetMinValue() - { - return $this->MinValue; - } - - /** - * Set height - * - * @param int $h Height - * @return void - */ - function SetHeight($h) - { - $this->height = $h; - } - - /** - * Set shading - * - * @param string $s Shading - * @return void - */ - function SetShading($s) - { - $this->SetShading = $s; - } - - /** - * Reset bg color - * - * @return void - */ - function ResetBgColor() - { - unset($this->bgcolor); - } - - /** - * Reset bgcolorgrid - * - * @return void - */ - function ResetBgColorGrid() - { - unset($this->bgcolorgrid); - } - - /** - * Is graph ko - * - * @return string Error - */ - function isGraphKo() - { - return $this->error; - } - - - /** - * Define background color of complete image - * - * @param array $bg_color array(R,G,B) ou 'onglet' ou 'default' - * @return void - */ - function SetBgColor($bg_color = array(255,255,255)) - { - global $theme_bgcolor,$theme_bgcoloronglet; - if (! is_array($bg_color)) - { - if ($bg_color == 'onglet') - { - //print 'ee'.join(',',$theme_bgcoloronglet); - $this->bgcolor = $theme_bgcoloronglet; - } - else - { - $this->bgcolor = $theme_bgcolor; - } - } - else - { - $this->bgcolor = $bg_color; - } - } - - /** - * Define background color of grid - * - * @param array $bg_colorgrid array(R,G,B) ou 'onglet' ou 'default' - * @return void - */ - function SetBgColorGrid($bg_colorgrid = array(255,255,255)) - { - global $theme_bgcolor,$theme_bgcoloronglet; - if (! is_array($bg_colorgrid)) - { - if ($bg_colorgrid == 'onglet') - { - //print 'ee'.join(',',$theme_bgcoloronglet); - $this->bgcolorgrid = $theme_bgcoloronglet; - } - else - { - $this->bgcolorgrid = $theme_bgcolor; - } - } - else - { - $this->bgcolorgrid = $bg_colorgrid; - } - } - - /** - * Reset data color - * - * @return void - */ - function ResetDataColor() - { - unset($this->datacolor); - } - - /** - * Get max value - * - * @return int Max value - */ - function GetMaxValueInData() - { - $k = 0; - $vals = array(); - - $nblines = count($this->data); - $nbvalues = count($this->data[0]) - 1; - - for ($j = 0 ; $j < $nblines ; $j++) - { - for ($i = 0 ; $i < $nbvalues ; $i++) - { - $vals[$k] = $this->data[$j][$i+1]; - $k++; - } - } - rsort($vals); - return $vals[0]; - } - - /** - * Return min value of all data - * - * @return int Min value of all data - */ - function GetMinValueInData() - { - $k = 0; - $vals = array(); - - $nblines = count($this->data); - $nbvalues = count($this->data[0]) - 1; - - for ($j = 0 ; $j < $nblines ; $j++) - { - for ($i = 0 ; $i < $nbvalues ; $i++) - { - $vals[$k] = $this->data[$j][$i+1]; - $k++; - } - } - sort($vals); - return $vals[0]; - } - - /** - * Return max value of all data - * - * @return int Max value of all data - */ - function GetCeilMaxValue() - { - $max = $this->GetMaxValueInData(); - if ($max != 0) $max++; - $size=dol_strlen(abs(ceil($max))); - $factor=1; - for ($i=0; $i < ($size-1); $i++) - { - $factor*=10; - } - - $res=0; - if (is_numeric($max)) $res=ceil($max/$factor)*$factor; - - //print "max=".$max." res=".$res; - return $res; - } - - /** - * Return min value of all data - * - * @return int Max value of all data - */ - function GetFloorMinValue() - { - $min = $this->GetMinValueInData(); - if ($min != 0) $min--; - $size=dol_strlen(abs(floor($min))); - $factor=1; - for ($i=0; $i < ($size-1); $i++) - { - $factor*=10; - } - - $res=floor($min/$factor)*$factor; - - //print "min=".$min." res=".$res; - return $res; - } - - /** - * Build a graph onto disk using correct library - * - * @param string $file Image file name to use if we save onto disk - * @param string $fileurl Url path to show image if saved onto disk - * @return void - */ - function draw($file,$fileurl='') - { - if (! is_array($this->data) || count($this->data) < 1) - { - $this->error="Call to draw method was made but SetData was not called or called with an empty dataset for parameters"; - dol_syslog(get_class($this)."::draw ".$this->error, LOG_ERR); - return -1; - } - $call = "draw_".$this->_library; - call_user_func_array(array($this,$call), array($file,$fileurl)); - } - - - /** - * Build a graph onto disk using Artichow library - * - * @param string $file Image file name to use if we save onto disk - * @param string $fileurl Url path to show image if saved onto disk - * @return void - */ - private function draw_artichow($file,$fileurl) - { - global $artichow_defaultfont; - - dol_syslog(get_class($this)."::draw_artichow this->type=".join(',',$this->type)); - - if (! defined('SHADOW_RIGHT_TOP')) define('SHADOW_RIGHT_TOP',3); - if (! defined('LEGEND_BACKGROUND')) define('LEGEND_BACKGROUND',2); - if (! defined('LEGEND_LINE')) define('LEGEND_LINE',1); - - // Create graph - $classname=''; - if ($this->type[0] == 'bars') $classname='BarPlot'; // Only first type of type is supported by artichow - if ($this->type[0] == 'lines') $classname='LinePlot'; - include_once ARTICHOW_PATH.$classname.'.class.php'; - - // Definition de couleurs - $bgcolor=new Color($this->bgcolor[0],$this->bgcolor[1],$this->bgcolor[2]); - $bgcolorgrid=new Color($this->bgcolorgrid[0],$this->bgcolorgrid[1],$this->bgcolorgrid[2]); - $colortrans=new Color(0,0,0,100); - $colorsemitrans=new Color(255,255,255,60); - $colorgradient= new LinearGradient(new Color(235, 235, 235),new Color(255, 255, 255),0); - $colorwhite=new Color(255,255,255); - - // Graph - $graph = new Graph($this->width, $this->height); - $graph->border->hide(); - $graph->setAntiAliasing(true); - if (isset($this->title)) - { - $graph->title->set($this->title); - //print $artichow_defaultfont;exit; - $graph->title->setFont(new $artichow_defaultfont(10)); - } - - if (is_array($this->bgcolor)) $graph->setBackgroundColor($bgcolor); - else $graph->setBackgroundGradient($colorgradient); - - $group = new PlotGroup; - //$group->setSpace(5, 5, 0, 0); - - $paddleft=50; - $paddright=10; - $strl=dol_strlen(max(abs($this->MaxValue),abs($this->MinValue))); - if ($strl > 6) $paddleft += ($strl * 4); - $group->setPadding($paddleft, $paddright); // Width on left and right for Y axis values - $group->legend->setSpace(0); - $group->legend->setPadding(2,2,2,2); - $group->legend->setPosition(NULL,0.1); - $group->legend->setBackgroundColor($colorsemitrans); - - if (is_array($this->bgcolorgrid)) $group->grid->setBackgroundColor($bgcolorgrid); - else $group->grid->setBackgroundColor($colortrans); - - if ($this->hideXGrid) $group->grid->hideVertical(true); - if ($this->hideYGrid) $group->grid->hideHorizontal(true); - - // On boucle sur chaque lot de donnees - $legends=array(); - $i=0; - $nblot=count($this->data[0])-1; - - while ($i < $nblot) - { - $x=0; - $values=array(); - foreach($this->data as $key => $valarray) - { - $legends[$x] = $valarray[0]; - $values[$x] = $valarray[$i+1]; - $x++; - } - - // We fix unknown values to null - $newvalues=array(); - foreach($values as $val) - { - $newvalues[]=(is_numeric($val) ? $val : null); - } - - - if ($this->type[0] == 'bars') - { - //print "Lot de donnees $i
"; - //print_r($values); - //print '
'; - - $color=new Color($this->datacolor[$i][0],$this->datacolor[$i][1],$this->datacolor[$i][2],20); - $colorbis=new Color(min($this->datacolor[$i][0]+50,255),min($this->datacolor[$i][1]+50,255),min($this->datacolor[$i][2]+50,255),50); - - $colorgrey=new Color(100,100,100); - $colorborder=new Color($this->datacolor[$i][0],$this->datacolor[$i][1],$this->datacolor[$i][2]); - - if ($this->mode == 'side') $plot = new BarPlot($newvalues, $i+1, $nblot); - if ($this->mode == 'depth') $plot = new BarPlot($newvalues, 1, 1, ($nblot-$i-1)*5); - - $plot->barBorder->setColor($colorgrey); - //$plot->setBarColor($color); - $plot->setBarGradient(new LinearGradient($colorbis, $color, 90)); - - if ($this->mode == 'side') $plot->setBarPadding(0.1, 0.1); - if ($this->mode == 'depth') $plot->setBarPadding(0.1, 0.4); - if ($this->mode == 'side') $plot->setBarSpace(5); - if ($this->mode == 'depth') $plot->setBarSpace(2); - - $plot->barShadow->setSize($this->SetShading); - $plot->barShadow->setPosition(SHADOW_RIGHT_TOP); - $plot->barShadow->setColor(new Color(160, 160, 160, 50)); - $plot->barShadow->smooth(TRUE); - //$plot->setSize(1, 0.96); - //$plot->setCenter(0.5, 0.52); - - // Le mode automatique est plus efficace - $plot->SetYMax($this->MaxValue); - $plot->SetYMin($this->MinValue); - } - - if ($this->type[0] == 'lines') - { - $color=new Color($this->datacolor[$i][0],$this->datacolor[$i][1],$this->datacolor[$i][2],20); - $colorbis=new Color(min($this->datacolor[$i][0]+20,255),min($this->datacolor[$i][1]+20,255),min($this->datacolor[$i][2]+20,255),60); - $colorter=new Color(min($this->datacolor[$i][0]+50,255),min($this->datacolor[$i][1]+50,255),min($this->datacolor[$i][2]+50,255),90); - - $plot = new LinePlot($newvalues); - //$plot->setSize(1, 0.96); - //$plot->setCenter(0.5, 0.52); - - $plot->setColor($color); - $plot->setThickness(1); - - // Set line background gradient - $plot->setFillGradient(new LinearGradient($colorter, $colorbis, 90)); - - $plot->xAxis->setLabelText($legends); - - // Le mode automatique est plus efficace - $plot->SetYMax($this->MaxValue); - $plot->SetYMin($this->MinValue); - //$plot->setYAxis(0); - //$plot->hideLine(true); - } - - //$plot->reduce(80); // Evite temps d'affichage trop long et nombre de ticks absisce satures - - $group->legend->setTextFont(new $artichow_defaultfont(10)); // This is to force Artichow to use awFileFontDriver to - // solve a bug in Artichow with UTF8 - if (count($this->Legend)) - { - if ($this->type[0] == 'bars') $group->legend->add($plot, $this->Legend[$i], LEGEND_BACKGROUND); - if ($this->type[0] == 'lines') $group->legend->add($plot, $this->Legend[$i], LEGEND_LINE); - } - $group->add($plot); - - $i++; - } - - $group->axis->bottom->setLabelText($legends); - $group->axis->bottom->label->setFont(new $artichow_defaultfont(7)); - - //print $group->axis->bottom->getLabelNumber(); - if ($this->labelInterval > 0) $group->axis->bottom->setLabelInterval($this->labelInterval); - - $graph->add($group); - - // Generate file - $graph->draw($file); - - $this->_stringtoshow=''.dol_escape_htmltag($this->title?$this->title:$this->YLabel).''; - } - - - /** - * Build a graph onto disk using JFlot library - * $graph_data = array(array('labelxA',yA),array('labelxB',yB)); - * $graph_data = array(array('labelxA',yA1,...,yAn),array('labelxB',yB1,...yBn)); // when there is n value to show for each x - * $legend = array("Val1",...,"Valn"); // list of n series name - * - * @param string $file Image file name to use if we save onto disk - * @param string $fileurl Url path to show image if saved onto disk - * @return void - */ - private function draw_jflot($file,$fileurl) - { - global $artichow_defaultfont; - - dol_syslog(get_class($this)."::draw_jflot this->type=".join(',',$this->type)); - - // On boucle sur chaque lot de donnees - $legends=array(); - $nblot=count($this->data[0])-1; // -1 to remove legend - $firstlot=0; - if ($nblot > 2) $firstlot = ($nblot - 2); // We limit nblot to 2 because jflot can't manage more than 2 bars on same x - - $i=$firstlot; - $serie=array(); - while ($i < $nblot) - { - $x=0; - $values=array(); - foreach($this->data as $key => $valarray) - { - $legends[$x] = $valarray[0]; - $values[$x] = $valarray[$i+1]; - $x++; - } - - // We fix unknown values to null - $newvalues=array(); - foreach($values as $val) - { - $newvalues[]=(is_numeric($val) ? $val : null); - } - - //print "Lot de donnees $i
"; - //print_r($values); - //print '
'; - $serie[$i]="var d".$i." = [];\n"; - $x=0; - foreach($newvalues as $key => $val) - { - if (isset($val)) $serie[$i].="d".$i.".push([".$x.", ".$val."]);\n"; - $x++; - } - - $i++; - } - - $tag=dol_escape_htmltag(dol_string_unaccent(dol_string_nospecial(basename($file),'_',array('-','.')))); - - $this->_stringtoshow =''."\n"; - $this->_stringtoshow.='
'.$this->title.'

'; - $this->_stringtoshow.='
'."\n"; - $this->_stringtoshow.=''."\n"; - } - - - - /** - * Output HTML string to show graph - * - * @return string HTML string to show graph - */ - function show() - { - return $this->_stringtoshow; - } - - /** - * getDefaultGraphSizeForStats - * - * @param string $direction 'width' or 'height' - * @param string $defaultsize Value we want as default size - * @return int Value of width or height to use by default - */ - static function getDefaultGraphSizeForStats($direction,$defaultsize='') - { - global $conf; - - if ($direction == 'width') return ($conf->dol_optimize_smallscreen?(empty($_SESSION['dol_screen_width'])?'280':$_SESSION['dol_screen_width']-40):($defaultsize?$defaultsize:'500')); - if ($direction == 'height') return ($conf->dol_optimize_smallscreen?'160':($defaultsize?$defaultsize:'200')); + + * Copyright (c) 2004-2012 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 +* 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/core/class/dolgraph.class.php + * \ingroup core + * \brief File for class to generate graph + * + * Usage: + * $graph_data = array(array('labelxA',yA),array('labelxB',yB)); + * $graph_data = array(array('labelxA',yA1,...,yAn),array('labelxB',yB1,...yBn)); // when there is n value to show for each x + * $legend = array("Val1",...,"Valn"); // list of n series name + * $px = new DolGraph(); + * $px->SetData($graph_data); + * $px->SetMaxValue($px->GetCeilMaxValue()); + * $px->SetMinValue($px->GetFloorMinValue()); + * $px->SetTitle("title"); + * $px->SetLegend($legend); + * $px->SetWidth(width); + * $px->SetHeight(height); + * $px->draw("file.png","/viewdownload?..."); + */ + + +/** + * Parent class of graph classes + */ +class DolGraph +{ + //! Type of graph + var $type=array('bars'); // bars, lines, ... + var $mode='side'; // Mode bars graph: side, depth + private $_library='jflot'; // Graphic library to use (jflot, artichow) + + //! Array of data + var $data; // array(array('abs1',valA1,valB1), array('abs2',valA2,valB2), ...) + var $title; + var $width=380; + var $height=200; + var $MaxValue=0; + var $MinValue=0; + var $SetShading=0; + + var $PrecisionY=-1; + + var $horizTickIncrement=-1; + var $SetNumXTicks=-1; + var $labelInterval=-1; + + var $hideXGrid=false; + var $hideYGrid=false; + + var $Legend=array(); + var $LegendWidthMin=0; + + var $graph; // Objet Graph (Artichow, Phplot...) + var $error; + + var $bordercolor; // array(R,G,B) + var $bgcolor; // array(R,G,B) + var $bgcolorgrid=array(255,255,255); // array(R,G,B) + var $datacolor; // array(array(R,G,B),...) + + private $_stringtoshow; // To store string to output graph into HTML page + + + /** + * Constructor + */ + function __construct() + { + global $conf; + global $theme_bordercolor, $theme_datacolor, $theme_bgcolor, $theme_bgcoloronglet; + + // To use old feature + if (isset($conf->global->MAIN_GRAPH_LIBRARY) && $conf->global->MAIN_GRAPH_LIBRARY == 'artichow') + { + $this->_library='artichow'; + + // Test if module GD present + $modules_list = get_loaded_extensions(); + $isgdinstalled=0; + foreach ($modules_list as $module) + { + if ($module == 'gd') $isgdinstalled=1; + } + if (! $isgdinstalled) + { + $this->error="Error: PHP GD module is not available. It is required to build graphics."; + return -1; + } + } + + $this->bordercolor = array(235,235,224); + $this->datacolor = array(array(120,130,150), array(160,160,180), array(190,190,220)); + $this->bgcolor = array(235,235,224); + + $color_file = DOL_DOCUMENT_ROOT.'/theme/'.$conf->theme.'/graph-color.php'; + if (is_readable($color_file)) + { + include_once $color_file; + if (isset($theme_bordercolor)) $this->bordercolor = $theme_bordercolor; + if (isset($theme_datacolor)) $this->datacolor = $theme_datacolor; + if (isset($theme_bgcolor)) $this->bgcolor = $theme_bgcolor; + } + //print 'bgcolor: '.join(',',$this->bgcolor).'
'; + return 1; + } + + + /** + * Set Y precision + * + * @param float $which_prec Precision + * @return string + */ + function SetPrecisionY($which_prec) + { + $this->PrecisionY = $which_prec; + return true; + } + + /** + * Utiliser SetNumTicks ou SetHorizTickIncrement mais pas les 2 + * + * @param float $xi Xi + * @return boolean True + */ + function SetHorizTickIncrement($xi) + { + $this->horizTickIncrement = $xi; + return true; + } + + /** + * Utiliser SetNumTicks ou SetHorizTickIncrement mais pas les 2 + * + * @param float $xt Xt + * @return boolean True + */ + function SetNumXTicks($xt) + { + $this->SetNumXTicks = $xt; + return true; + } + + /** + * Set label interval to reduce number of labels + * + * @param float $x Label interval + * @return boolean True + */ + function SetLabelInterval($x) + { + $this->labelInterval = $x; + return true; + } + + /** + * Hide X grid + * + * @param boolean $bool XGrid or not + * @return boolean true + */ + function SetHideXGrid($bool) + { + $this->hideXGrid = $bool; + return true; + } + + /** + * Hide Y grid + * + * @param boolean $bool YGrid or not + * @return boolean true + */ + function SetHideYGrid($bool) + { + $this->hideYGrid = $bool; + return true; + } + + /** + * Set y label + * + * @param string $label Y label + * @return boolean True + */ + function SetYLabel($label) + { + $this->YLabel = $label; + } + + /** + * Set width + * + * @param int $w Width + * @return boolean True + */ + function SetWidth($w) + { + $this->width = $w; + } + + /** + * Set title + * + * @param string $title Title + * @return void + */ + function SetTitle($title) + { + $this->title = $title; + } + + /** + * Set data + * + * @param array $data Data + * @return void + */ + function SetData($data) + { + $this->data = $data; + //var_dump($this->data); + } + + /** + * Set type + * + * @param array $type Array with type for each serie + * @return void + */ + function SetType($type) + { + $this->type = $type; + } + + /** + * Set legend + * + * @param string $legend Legend + * @return void + */ + function SetLegend($legend) + { + $this->Legend = $legend; + } + + /** + * Set min width + * + * @param int $legendwidthmin Min width + * @return void + */ + function SetLegendWidthMin($legendwidthmin) + { + $this->LegendWidthMin = $legendwidthmin; + } + + /** + * Set max value + * + * @param int $max Max value + * @return void + */ + function SetMaxValue($max) + { + $this->MaxValue = $max; + } + + /** + * Get max value + * + * @return int Max value + */ + function GetMaxValue() + { + return $this->MaxValue; + } + + /** + * Set min value + * + * @param int $min Min value + * @return void + */ + function SetMinValue($min) + { + $this->MinValue = $min; + } + + /** + * Get min value + * + * @return int Max value + */ + function GetMinValue() + { + return $this->MinValue; + } + + /** + * Set height + * + * @param int $h Height + * @return void + */ + function SetHeight($h) + { + $this->height = $h; + } + + /** + * Set shading + * + * @param string $s Shading + * @return void + */ + function SetShading($s) + { + $this->SetShading = $s; + } + + /** + * Reset bg color + * + * @return void + */ + function ResetBgColor() + { + unset($this->bgcolor); + } + + /** + * Reset bgcolorgrid + * + * @return void + */ + function ResetBgColorGrid() + { + unset($this->bgcolorgrid); + } + + /** + * Is graph ko + * + * @return string Error + */ + function isGraphKo() + { + return $this->error; + } + + + /** + * Define background color of complete image + * + * @param array $bg_color array(R,G,B) ou 'onglet' ou 'default' + * @return void + */ + function SetBgColor($bg_color = array(255,255,255)) + { + global $theme_bgcolor,$theme_bgcoloronglet; + if (! is_array($bg_color)) + { + if ($bg_color == 'onglet') + { + //print 'ee'.join(',',$theme_bgcoloronglet); + $this->bgcolor = $theme_bgcoloronglet; + } + else + { + $this->bgcolor = $theme_bgcolor; + } + } + else + { + $this->bgcolor = $bg_color; + } + } + + /** + * Define background color of grid + * + * @param array $bg_colorgrid array(R,G,B) ou 'onglet' ou 'default' + * @return void + */ + function SetBgColorGrid($bg_colorgrid = array(255,255,255)) + { + global $theme_bgcolor,$theme_bgcoloronglet; + if (! is_array($bg_colorgrid)) + { + if ($bg_colorgrid == 'onglet') + { + //print 'ee'.join(',',$theme_bgcoloronglet); + $this->bgcolorgrid = $theme_bgcoloronglet; + } + else + { + $this->bgcolorgrid = $theme_bgcolor; + } + } + else + { + $this->bgcolorgrid = $bg_colorgrid; + } + } + + /** + * Reset data color + * + * @return void + */ + function ResetDataColor() + { + unset($this->datacolor); + } + + /** + * Get max value + * + * @return int Max value + */ + function GetMaxValueInData() + { + $k = 0; + $vals = array(); + + $nblines = count($this->data); + $nbvalues = count($this->data[0]) - 1; + + for ($j = 0 ; $j < $nblines ; $j++) + { + for ($i = 0 ; $i < $nbvalues ; $i++) + { + $vals[$k] = $this->data[$j][$i+1]; + $k++; + } + } + rsort($vals); + return $vals[0]; + } + + /** + * Return min value of all data + * + * @return int Min value of all data + */ + function GetMinValueInData() + { + $k = 0; + $vals = array(); + + $nblines = count($this->data); + $nbvalues = count($this->data[0]) - 1; + + for ($j = 0 ; $j < $nblines ; $j++) + { + for ($i = 0 ; $i < $nbvalues ; $i++) + { + $vals[$k] = $this->data[$j][$i+1]; + $k++; + } + } + sort($vals); + return $vals[0]; + } + + /** + * Return max value of all data + * + * @return int Max value of all data + */ + function GetCeilMaxValue() + { + $max = $this->GetMaxValueInData(); + if ($max != 0) $max++; + $size=dol_strlen(abs(ceil($max))); + $factor=1; + for ($i=0; $i < ($size-1); $i++) + { + $factor*=10; + } + + $res=0; + if (is_numeric($max)) $res=ceil($max/$factor)*$factor; + + //print "max=".$max." res=".$res; + return $res; + } + + /** + * Return min value of all data + * + * @return int Max value of all data + */ + function GetFloorMinValue() + { + $min = $this->GetMinValueInData(); + if ($min != 0) $min--; + $size=dol_strlen(abs(floor($min))); + $factor=1; + for ($i=0; $i < ($size-1); $i++) + { + $factor*=10; + } + + $res=floor($min/$factor)*$factor; + + //print "min=".$min." res=".$res; + return $res; + } + + /** + * Build a graph onto disk using correct library + * + * @param string $file Image file name to use if we save onto disk + * @param string $fileurl Url path to show image if saved onto disk + * @return void + */ + function draw($file,$fileurl='') + { + if (! is_array($this->data) || count($this->data) < 1) + { + $this->error="Call to draw method was made but SetData was not called or called with an empty dataset for parameters"; + dol_syslog(get_class($this)."::draw ".$this->error, LOG_ERR); + return -1; + } + $call = "draw_".$this->_library; + call_user_func_array(array($this,$call), array($file,$fileurl)); + } + + + /** + * Build a graph onto disk using Artichow library + * + * @param string $file Image file name to use if we save onto disk + * @param string $fileurl Url path to show image if saved onto disk + * @return void + */ + private function draw_artichow($file,$fileurl) + { + global $artichow_defaultfont; + + dol_syslog(get_class($this)."::draw_artichow this->type=".join(',',$this->type)); + + if (! defined('SHADOW_RIGHT_TOP')) define('SHADOW_RIGHT_TOP',3); + if (! defined('LEGEND_BACKGROUND')) define('LEGEND_BACKGROUND',2); + if (! defined('LEGEND_LINE')) define('LEGEND_LINE',1); + + // Create graph + $classname=''; + if ($this->type[0] == 'bars') $classname='BarPlot'; // Only first type of type is supported by artichow + if ($this->type[0] == 'lines') $classname='LinePlot'; + include_once ARTICHOW_PATH.$classname.'.class.php'; + + // Definition de couleurs + $bgcolor=new Color($this->bgcolor[0],$this->bgcolor[1],$this->bgcolor[2]); + $bgcolorgrid=new Color($this->bgcolorgrid[0],$this->bgcolorgrid[1],$this->bgcolorgrid[2]); + $colortrans=new Color(0,0,0,100); + $colorsemitrans=new Color(255,255,255,60); + $colorgradient= new LinearGradient(new Color(235, 235, 235),new Color(255, 255, 255),0); + $colorwhite=new Color(255,255,255); + + // Graph + $graph = new Graph($this->width, $this->height); + $graph->border->hide(); + $graph->setAntiAliasing(true); + if (isset($this->title)) + { + $graph->title->set($this->title); + //print $artichow_defaultfont;exit; + $graph->title->setFont(new $artichow_defaultfont(10)); + } + + if (is_array($this->bgcolor)) $graph->setBackgroundColor($bgcolor); + else $graph->setBackgroundGradient($colorgradient); + + $group = new PlotGroup; + //$group->setSpace(5, 5, 0, 0); + + $paddleft=50; + $paddright=10; + $strl=dol_strlen(max(abs($this->MaxValue),abs($this->MinValue))); + if ($strl > 6) $paddleft += ($strl * 4); + $group->setPadding($paddleft, $paddright); // Width on left and right for Y axis values + $group->legend->setSpace(0); + $group->legend->setPadding(2,2,2,2); + $group->legend->setPosition(NULL,0.1); + $group->legend->setBackgroundColor($colorsemitrans); + + if (is_array($this->bgcolorgrid)) $group->grid->setBackgroundColor($bgcolorgrid); + else $group->grid->setBackgroundColor($colortrans); + + if ($this->hideXGrid) $group->grid->hideVertical(true); + if ($this->hideYGrid) $group->grid->hideHorizontal(true); + + // On boucle sur chaque lot de donnees + $legends=array(); + $i=0; + $nblot=count($this->data[0])-1; + + while ($i < $nblot) + { + $x=0; + $values=array(); + foreach($this->data as $key => $valarray) + { + $legends[$x] = $valarray[0]; + $values[$x] = $valarray[$i+1]; + $x++; + } + + // We fix unknown values to null + $newvalues=array(); + foreach($values as $val) + { + $newvalues[]=(is_numeric($val) ? $val : null); + } + + + if ($this->type[0] == 'bars') + { + //print "Lot de donnees $i
"; + //print_r($values); + //print '
'; + + $color=new Color($this->datacolor[$i][0],$this->datacolor[$i][1],$this->datacolor[$i][2],20); + $colorbis=new Color(min($this->datacolor[$i][0]+50,255),min($this->datacolor[$i][1]+50,255),min($this->datacolor[$i][2]+50,255),50); + + $colorgrey=new Color(100,100,100); + $colorborder=new Color($this->datacolor[$i][0],$this->datacolor[$i][1],$this->datacolor[$i][2]); + + if ($this->mode == 'side') $plot = new BarPlot($newvalues, $i+1, $nblot); + if ($this->mode == 'depth') $plot = new BarPlot($newvalues, 1, 1, ($nblot-$i-1)*5); + + $plot->barBorder->setColor($colorgrey); + //$plot->setBarColor($color); + $plot->setBarGradient(new LinearGradient($colorbis, $color, 90)); + + if ($this->mode == 'side') $plot->setBarPadding(0.1, 0.1); + if ($this->mode == 'depth') $plot->setBarPadding(0.1, 0.4); + if ($this->mode == 'side') $plot->setBarSpace(5); + if ($this->mode == 'depth') $plot->setBarSpace(2); + + $plot->barShadow->setSize($this->SetShading); + $plot->barShadow->setPosition(SHADOW_RIGHT_TOP); + $plot->barShadow->setColor(new Color(160, 160, 160, 50)); + $plot->barShadow->smooth(TRUE); + //$plot->setSize(1, 0.96); + //$plot->setCenter(0.5, 0.52); + + // Le mode automatique est plus efficace + $plot->SetYMax($this->MaxValue); + $plot->SetYMin($this->MinValue); + } + + if ($this->type[0] == 'lines') + { + $color=new Color($this->datacolor[$i][0],$this->datacolor[$i][1],$this->datacolor[$i][2],20); + $colorbis=new Color(min($this->datacolor[$i][0]+20,255),min($this->datacolor[$i][1]+20,255),min($this->datacolor[$i][2]+20,255),60); + $colorter=new Color(min($this->datacolor[$i][0]+50,255),min($this->datacolor[$i][1]+50,255),min($this->datacolor[$i][2]+50,255),90); + + $plot = new LinePlot($newvalues); + //$plot->setSize(1, 0.96); + //$plot->setCenter(0.5, 0.52); + + $plot->setColor($color); + $plot->setThickness(1); + + // Set line background gradient + $plot->setFillGradient(new LinearGradient($colorter, $colorbis, 90)); + + $plot->xAxis->setLabelText($legends); + + // Le mode automatique est plus efficace + $plot->SetYMax($this->MaxValue); + $plot->SetYMin($this->MinValue); + //$plot->setYAxis(0); + //$plot->hideLine(true); + } + + //$plot->reduce(80); // Evite temps d'affichage trop long et nombre de ticks absisce satures + + $group->legend->setTextFont(new $artichow_defaultfont(10)); // This is to force Artichow to use awFileFontDriver to + // solve a bug in Artichow with UTF8 + if (count($this->Legend)) + { + if ($this->type[0] == 'bars') $group->legend->add($plot, $this->Legend[$i], LEGEND_BACKGROUND); + if ($this->type[0] == 'lines') $group->legend->add($plot, $this->Legend[$i], LEGEND_LINE); + } + $group->add($plot); + + $i++; + } + + $group->axis->bottom->setLabelText($legends); + $group->axis->bottom->label->setFont(new $artichow_defaultfont(7)); + + //print $group->axis->bottom->getLabelNumber(); + if ($this->labelInterval > 0) $group->axis->bottom->setLabelInterval($this->labelInterval); + + $graph->add($group); + + // Generate file + $graph->draw($file); + + $this->_stringtoshow=''.dol_escape_htmltag($this->title?$this->title:$this->YLabel).''; + } + + + /** + * Build a graph onto disk using JFlot library + * $graph_data = array(array('labelxA',yA),array('labelxB',yB)); + * $graph_data = array(array('labelxA',yA1,...,yAn),array('labelxB',yB1,...yBn)); // when there is n value to show for each x + * $legend = array("Val1",...,"Valn"); // list of n series name + * + * @param string $file Image file name to use if we save onto disk + * @param string $fileurl Url path to show image if saved onto disk + * @return void + */ + private function draw_jflot($file,$fileurl) + { + global $artichow_defaultfont; + + dol_syslog(get_class($this)."::draw_jflot this->type=".join(',',$this->type)); + + // On boucle sur chaque lot de donnees + $legends=array(); + $nblot=count($this->data[0])-1; // -1 to remove legend + $firstlot=0; + // work with line but not with bars + //if ($nblot > 2) $firstlot = ($nblot - 2); // We limit nblot to 2 because jflot can't manage more than 2 bars on same x + + $i=$firstlot; + $serie=array(); + while ($i < $nblot) + { + $x=0; + $values=array(); + foreach($this->data as $key => $valarray) + { + $legends[$x] = $valarray[0]; + $values[$x] = $valarray[$i+1]; + $x++; + } + + // We fix unknown values to null + $newvalues=array(); + foreach($values as $val) + { + $newvalues[]=(is_numeric($val) ? $val : null); + } + + //print "Lot de donnees $i
"; + //print_r($values); + //print '
'; + $serie[$i]="var d".$i." = [];\n"; + $x=0; + foreach($newvalues as $key => $val) + { + if (isset($val)) $serie[$i].="d".$i.".push([".$x.", ".$val."]);\n"; + $x++; + } + + $i++; + } + + $tag=dol_escape_htmltag(dol_string_unaccent(dol_string_nospecial(basename($file),'_',array('-','.')))); + + $this->_stringtoshow =''."\n"; + $this->_stringtoshow.='
'.$this->title.'

'; + $this->_stringtoshow.='
'."\n"; + $this->_stringtoshow.=''."\n"; + } + + + + /** + * Output HTML string to show graph + * + * @return string HTML string to show graph + */ + function show() + { + return $this->_stringtoshow; + } + + /** + * getDefaultGraphSizeForStats + * + * @param string $direction 'width' or 'height' + * @param string $defaultsize Value we want as default size + * @return int Value of width or height to use by default + */ + static function getDefaultGraphSizeForStats($direction,$defaultsize='') + { + global $conf; + + if ($direction == 'width') return ($conf->dol_optimize_smallscreen?(empty($_SESSION['dol_screen_width'])?'280':$_SESSION['dol_screen_width']-40):($defaultsize?$defaultsize:'500')); + if ($direction == 'height') return ($conf->dol_optimize_smallscreen?'160':($defaultsize?$defaultsize:'200')); return 0; - } -} - -?> + } +} + +?> diff --git a/htdocs/core/class/extrafields.class.php b/htdocs/core/class/extrafields.class.php index 17226e7d461..6c6a9de1e99 100755 --- a/htdocs/core/class/extrafields.class.php +++ b/htdocs/core/class/extrafields.class.php @@ -825,7 +825,7 @@ class ExtraFields $sql = 'SELECT '.$InfoFieldList[1]; $sql.= ' FROM '.MAIN_DB_PREFIX .$InfoFieldList[0]; - $sql.= ' WHERE '.$keyList.'="'.$this->db->escape($value).'"'; + $sql.= ' WHERE '.$keyList.'=\''.$this->db->escape($value).'\''; //$sql.= ' AND entity = '.$conf->entity; dol_syslog(get_class($this).':showOutputField:$type=sellist sql='.$sql); $resql = $this->db->query($sql); diff --git a/htdocs/core/class/translate.class.php b/htdocs/core/class/translate.class.php index 433100c4cb4..b5f2dfce9c3 100644 --- a/htdocs/core/class/translate.class.php +++ b/htdocs/core/class/translate.class.php @@ -194,7 +194,7 @@ class Translate // Redefine alt $langarray=explode('_',$langofdir); - if ($alt < 1 && strtolower($langarray[0]) == strtolower($langarray[1])) $alt=1; + if ($alt < 1 && isset($langarray[1]) && strtolower($langarray[0]) == strtolower($langarray[1])) $alt=1; if ($alt < 2 && (strtolower($langofdir) == 'en_us' || strtolower($langofdir) == 'fr_fr' || strtolower($langofdir) == 'es_es')) $alt=2; foreach($this->dir as $keydir => $searchdir) @@ -643,13 +643,15 @@ class Translate * Store key-label found into cache variable $this->cache_labels to save SQL requests to get labels. * * @param DoliBD $db Database handler - * @param string $key Key to get label (key in language file) + * @param string $key Translation key to get label (key in language file) * @param string $tablename Table name without prefix * @param string $fieldkey Field for key * @param string $fieldlabel Field for label + * @param string $keyforselect Use another value than the translation key for the where into select * @return string Label in UTF8 (but without entities) + * @see dol_getIdFromCode */ - function getLabelFromKey($db,$key,$tablename,$fieldkey,$fieldlabel) + function getLabelFromKey($db,$key,$tablename,$fieldkey,$fieldlabel,$keyforselect='') { // If key empty if ($key == '') return ''; @@ -670,7 +672,7 @@ class Translate $sql = "SELECT ".$fieldlabel." as label"; $sql.= " FROM ".MAIN_DB_PREFIX.$tablename; - $sql.= " WHERE ".$fieldkey." = '".$key."'"; + $sql.= " WHERE ".$fieldkey." = '".($keyforselect?$keyforselect:$key)."'"; dol_syslog(get_class($this).'::getLabelFromKey sql='.$sql,LOG_DEBUG); $resql = $db->query($sql); if ($resql) diff --git a/htdocs/core/lib/company.lib.php b/htdocs/core/lib/company.lib.php index aa7339cb7ca..de42a730b2b 100644 --- a/htdocs/core/lib/company.lib.php +++ b/htdocs/core/lib/company.lib.php @@ -46,7 +46,7 @@ function societe_prepare_head($object) if ($object->client==1 || $object->client==2 || $object->client==3) { $head[$h][0] = DOL_URL_ROOT.'/comm/fiche.php?socid='.$object->id; - $head[$h][1]=''; + $head[$h][1] = ''; if (empty($conf->global->SOCIETE_DISABLE_PROSPECTS) && ($object->client==2 || $object->client==3)) $head[$h][1] .= $langs->trans("Prospect"); if (empty($conf->global->SOCIETE_DISABLE_PROSPECTS) && empty($conf->global->SOCIETE_DISABLE_CUSTOMERS) && $object->client==3) $head[$h][1] .= '/'; if (empty($conf->global->SOCIETE_DISABLE_CUSTOMERS) && ($object->client==1 || $object->client==3)) $head[$h][1] .= $langs->trans("Customer"); @@ -60,7 +60,7 @@ function societe_prepare_head($object) $head[$h][2] = 'supplier'; $h++; } - if (! empty($conf->agenda->enabled)) + if (! empty($conf->agenda->enabled) && !empty($user->right->agenda->lire)) { $head[$h][0] = DOL_URL_ROOT.'/societe/agenda.php?socid='.$object->id; $head[$h][1] = $langs->trans("Agenda"); @@ -68,7 +68,7 @@ function societe_prepare_head($object) $h++; } //show categorie tab - if (! empty($conf->categorie->enabled)) + if (! empty($conf->categorie->enabled) && !empty($user->right->categorie->lire)) { $type = 2; if ($object->fournisseur) $type = 1; diff --git a/htdocs/core/lib/files.lib.php b/htdocs/core/lib/files.lib.php index cad4d4c3d52..1845334e6e9 100644 --- a/htdocs/core/lib/files.lib.php +++ b/htdocs/core/lib/files.lib.php @@ -1221,7 +1221,7 @@ function dol_uncompress($inputfile,$outputdir) * @param string $dir Directory to scan * @param string $regexfilter Regex filter to restrict list. This regex value must be escaped for '/', since this char is used for preg_match function * @param string $excludefilter Array of Regex for exclude filter (example: array('\.meta$','^\.')). This regex value must be escaped for '/', since this char is used for preg_match function - * @param int $nohook Disable all hooks + * @param int $nohook Disable all hooks * @return string Full path to most recent file */ function dol_most_recent_file($dir,$regexfilter='',$excludefilter=array('\.meta$','^\.'),$nohook=false) @@ -1236,11 +1236,12 @@ function dol_most_recent_file($dir,$regexfilter='',$excludefilter=array('\.meta$ * @param string $modulepart Module of document * @param string $original_file Relative path with filename * @param string $entity Restrict onto entity + * @param string $refname Ref of object to check permission for external users (autodetect if not provided) * @return mixed Array with access information : accessallowed & sqlprotectagainstexternals & original_file (as full path name) */ -function dol_check_secure_access_document($modulepart,$original_file,$entity) +function dol_check_secure_access_document($modulepart,$original_file,$entity,$refname='') { - global $user, $conf; + global $user, $conf, $db; if (empty($modulepart)) return 'ErrorBadParameter'; if (empty($entity)) $entity=0; @@ -1250,6 +1251,9 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity) $sqlprotectagainstexternals=''; $ret=array(); + // find the subdirectory name as the reference + if (empty($refname)) $refname=basename(dirname($original_file)."/"); + // Wrapping for some images if ($modulepart == 'companylogo') { @@ -1425,7 +1429,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity) $accessallowed=1; } $original_file=$conf->societe->multidir_output[$entity].'/'.$original_file; - $sqlprotectagainstexternals = "SELECT rowid as fk_soc FROM ".MAIN_DB_PREFIX."societe WHERE rowid='".$refname."' AND entity IN (".getEntity('societe', 1).")"; + $sqlprotectagainstexternals = "SELECT rowid as fk_soc FROM ".MAIN_DB_PREFIX."societe WHERE rowid='".$db->escape($refname)."' AND entity IN (".getEntity('societe', 1).")"; } // Wrapping for invoices @@ -1436,7 +1440,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity) $accessallowed=1; } $original_file=$conf->facture->dir_output.'/'.$original_file; - $sqlprotectagainstexternals = "SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX."facture WHERE ref='".$refname."' AND entity=".$conf->entity; + $sqlprotectagainstexternals = "SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX."facture WHERE ref='".$db->escape($refname)."' AND entity=".$conf->entity; } else if ($modulepart == 'unpaid') @@ -1456,7 +1460,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity) $accessallowed=1; } $original_file=$conf->ficheinter->dir_output.'/'.$original_file; - $sqlprotectagainstexternals = "SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX."fichinter WHERE ref='".$refname."' AND entity=".$conf->entity; + $sqlprotectagainstexternals = "SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX."fichinter WHERE ref='".$db->escape($refname)."' AND entity=".$conf->entity; } // Wrapping pour les deplacements et notes de frais @@ -1467,7 +1471,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity) $accessallowed=1; } $original_file=$conf->deplacement->dir_output.'/'.$original_file; - //$sqlprotectagainstexternals = "SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX."fichinter WHERE ref='".$refname."' AND entity=".$conf->entity; + //$sqlprotectagainstexternals = "SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX."fichinter WHERE ref='".$db->escape($refname)."' AND entity=".$conf->entity; } // Wrapping pour les propales else if ($modulepart == 'propal') @@ -1478,7 +1482,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity) } $original_file=$conf->propal->dir_output.'/'.$original_file; - $sqlprotectagainstexternals = "SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX."propal WHERE ref='".$refname."' AND entity=".$conf->entity; + $sqlprotectagainstexternals = "SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX."propal WHERE ref='".$db->escape($refname)."' AND entity=".$conf->entity; } // Wrapping pour les commandes @@ -1489,7 +1493,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity) $accessallowed=1; } $original_file=$conf->commande->dir_output.'/'.$original_file; - $sqlprotectagainstexternals = "SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX."commande WHERE ref='".$refname."' AND entity=".$conf->entity; + $sqlprotectagainstexternals = "SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX."commande WHERE ref='".$db->escape($refname)."' AND entity=".$conf->entity; } // Wrapping pour les projets @@ -1500,7 +1504,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity) $accessallowed=1; } $original_file=$conf->projet->dir_output.'/'.$original_file; - $sqlprotectagainstexternals = "SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX."projet WHERE ref='".$refname."' AND entity=".$conf->entity; + $sqlprotectagainstexternals = "SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX."projet WHERE ref='".$db->escape($refname)."' AND entity=".$conf->entity; } // Wrapping pour les commandes fournisseurs @@ -1511,7 +1515,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity) $accessallowed=1; } $original_file=$conf->fournisseur->commande->dir_output.'/'.$original_file; - $sqlprotectagainstexternals = "SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX."commande_fournisseur WHERE ref='".$refname."' AND entity=".$conf->entity; + $sqlprotectagainstexternals = "SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX."commande_fournisseur WHERE ref='".$db->escape($refname)."' AND entity=".$conf->entity; } // Wrapping pour les factures fournisseurs @@ -1522,7 +1526,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity) $accessallowed=1; } $original_file=$conf->fournisseur->facture->dir_output.'/'.$original_file; - $sqlprotectagainstexternals = "SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX."facture_fourn WHERE facnumber='".$refname."' AND entity=".$conf->entity; + $sqlprotectagainstexternals = "SELECT fk_soc as fk_soc FROM ".MAIN_DB_PREFIX."facture_fourn WHERE facnumber='".$db->escape($refname)."' AND entity=".$conf->entity; } // Wrapping pour les rapport de paiements @@ -1755,7 +1759,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity) $sqlProtectConstName = strtoupper($modulepart).'_SQLPROTECTAGAINSTEXTERNALS_FOR_DOCUMENTS'; if (! empty($conf->global->$sqlProtectConstName)) // If module want to define its own $sqlprotectagainstexternals { - // Example: mymodule__SQLPROTECTAGAINSTEXTERNALS_FOR_DOCUMENTS = "SELECT fk_soc FROM ".MAIN_DB_PREFIX.$modulepart." WHERE ref='".$refname."' AND entity=".$conf->entity; + // Example: mymodule__SQLPROTECTAGAINSTEXTERNALS_FOR_DOCUMENTS = "SELECT fk_soc FROM ".MAIN_DB_PREFIX.$modulepart." WHERE ref='".$db->escape($refname)."' AND entity=".$conf->entity; eval('$sqlprotectagainstexternals = "'.$conf->global->$sqlProtectConstName.'";'); } } diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 2fc96042895..9f543529379 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -3323,7 +3323,7 @@ function picto_required() * * @param string $StringHtml String to clean * @param string $removelinefeed Replace also all lines feeds by a space - * @param string $pagecodeto Encoding of input string + * @param string $pagecodeto Encoding of input/output string * @return string String cleaned */ function dol_string_nohtmltag($StringHtml,$removelinefeed=1,$pagecodeto='UTF-8') @@ -4071,6 +4071,7 @@ function dol_osencode($str) * @param string $fieldkey Field for code * @param string $fieldid Field for id * @return int Id of code + * @see getLabelFromKey */ function dol_getIdFromCode($db,$key,$tablename,$fieldkey='code',$fieldid='id') { diff --git a/htdocs/core/lib/invoice2.lib.php b/htdocs/core/lib/invoice2.lib.php index 715ff2f877a..dd9e1ba987d 100644 --- a/htdocs/core/lib/invoice2.lib.php +++ b/htdocs/core/lib/invoice2.lib.php @@ -42,9 +42,10 @@ require_once(DOL_DOCUMENT_ROOT.'/core/lib/pdf.lib.php'); * @param int $usestdout Add information onto standard output * @param int $regenerate ''=Use existing PDF files, 'nameofpdf'=Regenerate all PDF files using the template * @param string $option Suffix to add into file name of generated PDF + * @param string $paymentbankid Only if payment on this bank account id * @return int Error code */ -function rebuild_merge_pdf($db, $langs, $conf, $diroutputpdf, $newlangid, $filter, $dateafterdate, $datebeforedate, $paymentdateafter, $paymentdatebefore, $usestdout, $regenerate=0, $option='') +function rebuild_merge_pdf($db, $langs, $conf, $diroutputpdf, $newlangid, $filter, $dateafterdate, $datebeforedate, $paymentdateafter, $paymentdatebefore, $usestdout, $regenerate=0, $option='', $paymentbankid='') { $sql = "SELECT DISTINCT f.rowid, f.facnumber"; $sql.= " FROM ".MAIN_DB_PREFIX."facture as f"; @@ -71,17 +72,25 @@ function rebuild_merge_pdf($db, $langs, $conf, $diroutputpdf, $newlangid, $filte $sqlwhere.= " f.fk_statut > 0"; $sqlwhere.= " AND pf.fk_paiement IS NULL"; } - if (in_array('payments',$filter)) + if (in_array('payments',$filter) || in_array('bank',$filter)) { - $sql.= ", ".MAIN_DB_PREFIX."paiement_facture as pf,"; - $sql.= " ".MAIN_DB_PREFIX."paiement as p"; + $sql.= ", ".MAIN_DB_PREFIX."paiement_facture as pf, ".MAIN_DB_PREFIX."paiement as p"; + if (in_array('bank',$filter)) $sql.= ", ".MAIN_DB_PREFIX."bank as b"; if (empty($sqlwhere)) $sqlwhere=' WHERE '; else $sqlwhere.=" AND"; $sqlwhere.= " f.fk_statut > 0"; $sqlwhere.= " AND f.rowid = pf.fk_facture"; $sqlwhere.= " AND pf.fk_paiement = p.rowid"; - $sqlwhere.= " AND p.datep >= '".$db->idate($paymentdateafter)."'"; - $sqlwhere.= " AND p.datep <= '".$db->idate($paymentdatebefore)."'"; + if (in_array('payments',$filter)) + { + $sqlwhere.= " AND p.datep >= '".$db->idate($paymentdateafter)."'"; + $sqlwhere.= " AND p.datep <= '".$db->idate($paymentdatebefore)."'"; + } + if (in_array('bank',$filter)) + { + $sqlwhere.= " AND p.fk_bank = b.rowid"; + $sqlwhere.= " AND b.fk_account = ".$paymentbankid; + } $sqlorder = " ORDER BY p.datep ASC"; } if (in_array('nodeposit',$filter)) diff --git a/htdocs/core/modules/export/export_csv.modules.php b/htdocs/core/modules/export/export_csv.modules.php index 902b75584cf..53b1e557f25 100644 --- a/htdocs/core/modules/export/export_csv.modules.php +++ b/htdocs/core/modules/export/export_csv.modules.php @@ -187,9 +187,10 @@ class ExportCsv extends ModeleExports * @param array $array_export_fields_label Array with list of label of fields * @param array $array_selected_sorted Array with list of field to export * @param Translate $outputlangs Object lang to translate values + * @param array $array_types Array with types of fields * @return int <0 if KO, >0 if OK */ - function write_title($array_export_fields_label,$array_selected_sorted,$outputlangs) + function write_title($array_export_fields_label,$array_selected_sorted,$outputlangs,$array_types) { global $conf; @@ -204,7 +205,7 @@ class ExportCsv extends ModeleExports foreach($array_selected_sorted as $code => $value) { - $newvalue=$outputlangs->transnoentities($array_export_fields_label[$code]); + $newvalue=$outputlangs->transnoentities($array_export_fields_label[$code]); // newvalue is now $outputlangs->charset_output encoded $newvalue=$this->csv_clean($newvalue,$outputlangs->charset_output); fwrite($this->handle,$newvalue.$this->separator); @@ -242,15 +243,12 @@ class ExportCsv extends ModeleExports if (strpos($code,' as ') == 0) $alias=str_replace(array('.','-'),'_',$code); else $alias=substr($code, strpos($code, ' as ') + 4); if (empty($alias)) dol_print_error('','Bad value for field with key='.$code.'. Try to redefine export.'); - - $newvalue=$outputlangs->convToOutputCharset($objp->$alias); + + $newvalue=$outputlangs->convToOutputCharset($objp->$alias); // objp->$alias must be utf8 encoded as any var in memory // newvalue is now $outputlangs->charset_output encoded $typefield=isset($array_types[$code])?$array_types[$code]:''; - + // Translation newvalue - if (preg_match('/^\((.*)\)$/i',$newvalue,$reg)) - { - $newvalue=$outputlangs->transnoentities($reg[1]); - } + if (preg_match('/^\((.*)\)$/i',$newvalue,$reg)) $newvalue=$outputlangs->transnoentities($reg[1]); $newvalue=$this->csv_clean($newvalue,$outputlangs->charset_output); @@ -284,11 +282,12 @@ class ExportCsv extends ModeleExports return 0; } + /** * Clean a cell to respect rules of CSV file cells * * @param string $newvalue String to clean - * @param string $charset Output character set + * @param string $charset Input AND Output character set * @return string Value cleaned */ function csv_clean($newvalue, $charset) @@ -296,7 +295,9 @@ class ExportCsv extends ModeleExports $addquote=0; // Rule Dolibarr: No HTML + //print $charset.' '.$newvalue."\n"; $newvalue=dol_string_nohtmltag($newvalue,1,$charset); + //print $charset.' '.$newvalue."\n"; // Rule 1 CSV: No CR, LF in cells $newvalue=str_replace("\r",'',$newvalue); diff --git a/htdocs/core/modules/export/export_excel.modules.php b/htdocs/core/modules/export/export_excel.modules.php index 8f6801e8521..ea0110dfe9b 100644 --- a/htdocs/core/modules/export/export_excel.modules.php +++ b/htdocs/core/modules/export/export_excel.modules.php @@ -158,7 +158,7 @@ class ExportExcel extends ModeleExports $outputlangs->charset_output='ISO-8859-1'; // Because Excel 5 format is ISO } - dol_syslog("ExportExcel::open_file file=".$file); + dol_syslog(get_class($this)."::open_file file=".$file); $this->file=$file; $ret=1; @@ -187,7 +187,7 @@ class ExportExcel extends ModeleExports $this->workbook->setActiveSheetIndex(0); $this->workbook->getActiveSheet()->setTitle($outputlangs->trans("Sheet")); - $this->workbook->getActiveSheet()->getDefaultRowDimension()->setRowHeight(15); + $this->workbook->getActiveSheet()->getDefaultRowDimension()->setRowHeight(16); } return $ret; } @@ -212,9 +212,10 @@ class ExportExcel extends ModeleExports * @param array $array_export_fields_label Array with list of label of fields * @param array $array_selected_sorted Array with list of field to export * @param Translate $outputlangs Object lang to translate values + * @param array $array_types Array with types of fields * @return int <0 if KO, >0 if OK */ - function write_title($array_export_fields_label,$array_selected_sorted,$outputlangs) + function write_title($array_export_fields_label,$array_selected_sorted,$outputlangs,$array_types) { // Create a format for the column headings if (! empty($conf->global->MAIN_USE_PHP_WRITEEXCEL)) @@ -231,7 +232,7 @@ class ExportExcel extends ModeleExports else { $this->workbook->getActiveSheet()->getStyle('1')->getFont()->setBold(true); - $this->workbook->getActiveSheet()->getStyle('1')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER); + $this->workbook->getActiveSheet()->getStyle('1')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_LEFT); } $this->col=0; @@ -247,6 +248,10 @@ class ExportExcel extends ModeleExports else { $this->workbook->getActiveSheet()->SetCellValueByColumnAndRow($this->col, $this->row+1, $outputlangs->transnoentities($alias)); + if (! empty($array_types[$code]) && in_array($array_types[$code],array('Date','Number','TextAuto'))) // Set autowidth for some types + { + $this->workbook->getActiveSheet()->getColumnDimension($this->column2Letter($this->col + 1))->setAutoSize(true); + } } $this->col++; } @@ -341,18 +346,17 @@ class ExportExcel extends ModeleExports $this->worksheet->write($this->row, $this->col, $newvalue); } else - { - if ($typefield == 'Text') + { + if ($typefield == 'Text' || $typefield == 'TextAuto') { //$this->workbook->getActiveSheet()->getCellByColumnAndRow($this->col, $this->row+1)->setValueExplicit($newvalue, PHPExcel_Cell_DataType::TYPE_STRING); $this->workbook->getActiveSheet()->SetCellValueByColumnAndRow($this->col, $this->row+1, (string) $newvalue); $coord=$this->workbook->getActiveSheet()->getCellByColumnAndRow($this->col, $this->row+1)->getCoordinate(); $this->workbook->getActiveSheet()->getStyle($coord)->getNumberFormat()->setFormatCode('@'); + $this->workbook->getActiveSheet()->getStyle($coord)->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_LEFT); } else { - //$coord=$this->workbook->getActiveSheet()->getCellByColumnAndRow($this->col, $this->row+1)->getCoordinate(); - //if ($typefield == 'Text') $this->workbook->getActiveSheet()->getStyle($coord)->getNumberFormat()->setFormatCode('@'); $this->workbook->getActiveSheet()->SetCellValueByColumnAndRow($this->col, $this->row+1, $newvalue); } } @@ -412,6 +416,29 @@ class ExportExcel extends ModeleExports return $newvalue; } + + + /** + * Convert a column to letter (1->A, 0->B, 27->AA, ...) + * + * @param int $c Column position + * @return string Letter + */ + function column2Letter($c) + { + + $c = intval($c); + if ($c <= 0) return ''; + + while ($c != 0) + { + $p = ($c - 1) % 26; + $c = intval(($c - $p) / 26); + $letter = chr(65 + $p) . $letter; + } + + return $letter; + } } ?> diff --git a/htdocs/core/modules/export/export_excel2007.modules.php b/htdocs/core/modules/export/export_excel2007.modules.php index 609bbc2d660..6d9a585e6be 100755 --- a/htdocs/core/modules/export/export_excel2007.modules.php +++ b/htdocs/core/modules/export/export_excel2007.modules.php @@ -72,310 +72,6 @@ class ExportExcel2007 extends ExportExcel $this->row=0; } - /** - * getDriverLabel - * - * @return int - */ - function getDriverId() - { - return $this->id; - } - - /** - * getDriverLabel - * - * @return string Return driver label - */ - function getDriverLabel() - { - return $this->label; - } - - /** - * getDriverDesc - * - * @return string - */ - function getDriverDesc() - { - return $this->desc; - } - - /** - * getDriverExtension - * - * @return string - */ - function getDriverExtension() - { - return $this->extension; - } - - /** - * getDriverVersion - * - * @return string - */ - function getDriverVersion() - { - return $this->version; - } - - /** - * getLibLabel - * - * @return string - */ - function getLibLabel() - { - return $this->label_lib; - } - - /** - * getLibVersion - * - * @return string - */ - function getLibVersion() - { - return $this->version_lib; - } - - - /** - * Open output file - * - * @param string $file File name to generate - * @param Translate $outputlangs Output language object - * @return int <0 if KO, >=0 if OK - */ - function open_file($file,$outputlangs) - { - global $user,$conf,$langs; - - if (! empty($conf->global->MAIN_USE_PHP_WRITEEXCEL)) - { - $outputlangs->charset_output='ISO-8859-1'; // Because Excel 5 format is ISO - } - - dol_syslog("ExportExcel::open_file file=".$file); - $this->file=$file; - - $ret=1; - - $outputlangs->load("exports"); - if (! empty($conf->global->MAIN_USE_PHP_WRITEEXCEL)) - { - require_once PHP_WRITEEXCEL_PATH.'class.writeexcel_workbookbig.inc.php'; - require_once PHP_WRITEEXCEL_PATH.'class.writeexcel_worksheet.inc.php'; - require_once PHP_WRITEEXCEL_PATH.'functions.writeexcel_utility.inc.php'; - $this->workbook = new writeexcel_workbookbig($file); - $this->workbook->set_tempdir($conf->export->dir_temp); // Set temporary directory - $this->workbook->set_sheetname($outputlangs->trans("Sheet")); - $this->worksheet = &$this->workbook->addworksheet(); - } - else - { - require_once PHPEXCEL_PATH.'PHPExcel.php'; - require_once PHPEXCEL_PATH.'PHPExcel/Style/Alignment.php'; - $this->workbook = new PHPExcel(); - $this->workbook->getProperties()->setCreator($user->getFullName($outputlangs).' - Dolibarr '.DOL_VERSION); - //$this->workbook->getProperties()->setLastModifiedBy('Dolibarr '.DOL_VERSION); - $this->workbook->getProperties()->setTitle($outputlangs->trans("Export").' - '.$file); - $this->workbook->getProperties()->setSubject($outputlangs->trans("Export").' - '.$file); - $this->workbook->getProperties()->setDescription($outputlangs->trans("Export").' - '.$file); - - $this->workbook->setActiveSheetIndex(0); - $this->workbook->getActiveSheet()->setTitle($outputlangs->trans("Sheet")); - $this->workbook->getActiveSheet()->getDefaultRowDimension()->setRowHeight(16); - } - return $ret; - } - - /** - * Write header - * - * @param Translate $outputlangs Object lang to translate values - * @return int <0 if KO, >0 if OK - */ - function write_header($outputlangs) - { - //$outputlangs->charset_output='ISO-8859-1'; // Because Excel 5 format is ISO - - return 0; - } - - - /** - * Output title line into file - * - * @param array $array_export_fields_label Array with list of label of fields - * @param array $array_selected_sorted Array with list of field to export - * @param Translate $outputlangs Object lang to translate values - * @return int <0 if KO, >0 if OK - */ - function write_title($array_export_fields_label,$array_selected_sorted,$outputlangs) - { - // Create a format for the column headings - if (! empty($conf->global->MAIN_USE_PHP_WRITEEXCEL)) - { - $outputlangs->charset_output='ISO-8859-1'; // Because Excel 5 format is ISO - - $formatheader =$this->workbook->addformat(); - $formatheader->set_bold(); - $formatheader->set_color('blue'); - //$formatheader->set_size(12); - //$formatheader->set_font("Courier New"); - //$formatheader->set_align('center'); - } - else - { - $this->workbook->getActiveSheet()->getStyle('1')->getFont()->setBold(true); - $this->workbook->getActiveSheet()->getStyle('1')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER); - } - - $this->col=0; - foreach($array_selected_sorted as $code => $value) - { - $alias=$array_export_fields_label[$code]; - //print "dd".$alias; - if (empty($alias)) dol_print_error('','Bad value for field with code='.$code.'. Try to redefine export.'); - if (! empty($conf->global->MAIN_USE_PHP_WRITEEXCEL)) - { - $this->worksheet->write($this->row, $this->col, $outputlangs->transnoentities($alias), $formatheader); - } - else - { - $this->workbook->getActiveSheet()->SetCellValueByColumnAndRow($this->col, $this->row+1, $outputlangs->transnoentities($alias)); - } - $this->col++; - } - $this->row++; - return 0; - } - - /** - * Output record line into file - * - * @param array $array_selected_sorted Array with list of field to export - * @param resource $objp A record from a fetch with all fields from select - * @param Translate $outputlangs Object lang to translate values - * @param array $array_types Array with types of fields - * @return int <0 if KO, >0 if OK - */ - function write_record($array_selected_sorted,$objp,$outputlangs,$array_types) - { - // Create a format for the column headings - if (! empty($conf->global->MAIN_USE_PHP_WRITEEXCEL)) - { - $outputlangs->charset_output='ISO-8859-1'; // Because Excel 5 format is ISO - } - - // Define first row - $this->col=0; - - foreach($array_selected_sorted as $code => $value) - { - if (strpos($code,' as ') == 0) $alias=str_replace(array('.','-'),'_',$code); - else $alias=substr($code, strpos($code, ' as ') + 4); - if (empty($alias)) dol_print_error('','Bad value for field with code='.$code.'. Try to redefine export.'); - $newvalue=$objp->$alias; - - $newvalue=$this->excel_clean($newvalue); - $typefield=isset($array_types[$code])?$array_types[$code]:''; - - // Traduction newvalue - if (preg_match('/^\((.*)\)$/i',$newvalue,$reg)) - { - $newvalue=$outputlangs->transnoentities($reg[1]); - } - else - { - $newvalue=$outputlangs->convToOutputCharset($newvalue); - } - - //var_dump($code.' '.$alias.' '.$newvalue.' '.$typefield); - - if (preg_match('/^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]$/i',$newvalue)) - { - if (! empty($conf->global->MAIN_USE_PHP_WRITEEXCEL)) - { - $formatdate=$this->workbook->addformat(); - $formatdate->set_num_format('yyyy-mm-dd'); - //$formatdate->set_num_format(0x0f); - $arrayvalue=preg_split('/[.,]/',xl_parse_date($newvalue)); - //print "x".$arrayvalue[0].'.'.strval($arrayvalue[1]).'
'; - $newvalue=strval($arrayvalue[0]).'.'.strval($arrayvalue[1]); // $newvalue=strval(36892.521); directly does not work because . will be convert into , later - $this->worksheet->write($this->row, $this->col, $newvalue, PHPExcel_Shared_Date::PHPToExcel($formatdate)); - } - else - { - $newvalue=dol_stringtotime($newvalue); - $this->workbook->getActiveSheet()->SetCellValueByColumnAndRow($this->col, $this->row+1, PHPExcel_Shared_Date::PHPToExcel($newvalue)); - $coord=$this->workbook->getActiveSheet()->getCellByColumnAndRow($this->col, $this->row+1)->getCoordinate(); - $this->workbook->getActiveSheet()->getStyle($coord)->getNumberFormat()->setFormatCode('yyyy-mm-dd'); - } - } - elseif (preg_match('/^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9]$/i',$newvalue)) - { - if (! empty($conf->global->MAIN_USE_PHP_WRITEEXCEL)) - { - $formatdatehour=$this->workbook->addformat(); - $formatdatehour->set_num_format('yyyy-mm-dd hh:mm:ss'); - //$formatdatehour->set_num_format(0x0f); - $arrayvalue=preg_split('/[.,]/',xl_parse_date($newvalue)); - //print "x".$arrayvalue[0].'.'.strval($arrayvalue[1]).'
'; - $newvalue=strval($arrayvalue[0]).'.'.strval($arrayvalue[1]); // $newvalue=strval(36892.521); directly does not work because . will be convert into , later - $this->worksheet->write($this->row, $this->col, $newvalue, $formatdatehour); - } - else - { - $newvalue=dol_stringtotime($newvalue); - $this->workbook->getActiveSheet()->SetCellValueByColumnAndRow($this->col, $this->row+1, PHPExcel_Shared_Date::PHPToExcel($newvalue)); - $coord=$this->workbook->getActiveSheet()->getCellByColumnAndRow($this->col, $this->row+1)->getCoordinate(); - $this->workbook->getActiveSheet()->getStyle($coord)->getNumberFormat()->setFormatCode('yyyy-mm-dd h:mm:ss'); - } - } - else - { - if (! empty($conf->global->MAIN_USE_PHP_WRITEEXCEL)) - { - $this->worksheet->write($this->row, $this->col, $newvalue); - } - else - { - if ($typefield == 'Text') - { - //$this->workbook->getActiveSheet()->getCellByColumnAndRow($this->col, $this->row+1)->setValueExplicit($newvalue, PHPExcel_Cell_DataType::TYPE_STRING); - $this->workbook->getActiveSheet()->SetCellValueByColumnAndRow($this->col, $this->row+1, (string) $newvalue); - $coord=$this->workbook->getActiveSheet()->getCellByColumnAndRow($this->col, $this->row+1)->getCoordinate(); - $this->workbook->getActiveSheet()->getStyle($coord)->getNumberFormat()->setFormatCode('@'); - } - else - { - $this->workbook->getActiveSheet()->SetCellValueByColumnAndRow($this->col, $this->row+1, $newvalue); - } - } - } - $this->col++; - } - $this->row++; - return 0; - } - - - /** - * Write footer - * - * @param Translate $outputlangs Output language object - * @return int <0 if KO, >0 if OK - */ - function write_footer($outputlangs) - { - return 0; - } - /** * Close Excel file @@ -399,20 +95,6 @@ class ExportExcel2007 extends ExportExcel return 0; } - - /** - * Clean a cell to respect rules of Excel file cells - * - * @param string $newvalue String to clean - * @return string Value cleaned - */ - function excel_clean($newvalue) - { - // Rule Dolibarr: No HTML - $newvalue=dol_string_nohtmltag($newvalue); - - return $newvalue; - } } ?> diff --git a/htdocs/core/modules/export/export_tsv.modules.php b/htdocs/core/modules/export/export_tsv.modules.php index edc08dc6840..12062b94804 100644 --- a/htdocs/core/modules/export/export_tsv.modules.php +++ b/htdocs/core/modules/export/export_tsv.modules.php @@ -182,13 +182,14 @@ class ExportTsv extends ModeleExports * @param array $array_export_fields_label Array with list of label of fields * @param array $array_selected_sorted Array with list of field to export * @param Translate $outputlangs Object lang to translate values + * @param array $array_types Array with types of fields * @return int <0 if KO, >0 if OK */ - function write_title($array_export_fields_label,$array_selected_sorted,$outputlangs) + function write_title($array_export_fields_label,$array_selected_sorted,$outputlangs,$array_types) { foreach($array_selected_sorted as $code => $value) { - $newvalue=$outputlangs->transnoentities($array_export_fields_label[$code]); + $newvalue=$outputlangs->transnoentities($array_export_fields_label[$code]); // newvalue is now $outputlangs->charset_output encoded $newvalue=$this->tsv_clean($newvalue,$outputlangs->charset_output); fwrite($this->handle,$newvalue.$this->separator); @@ -218,14 +219,11 @@ class ExportTsv extends ModeleExports else $alias=substr($code, strpos($code, ' as ') + 4); if (empty($alias)) dol_print_error('','Bad value for field with code='.$code.'. Try to redefine export.'); - $newvalue=$outputlangs->convToOutputCharset($objp->$alias); + $newvalue=$outputlangs->convToOutputCharset($objp->$alias); // objp->$alias must be utf8 encoded as any var in memory // newvalue is now $outputlangs->charset_output encoded $typefield=isset($array_types[$code])?$array_types[$code]:''; // Translation newvalue - if (preg_match('/^\((.*)\)$/i',$newvalue,$reg)) - { - $newvalue=$outputlangs->transnoentities($reg[1]); - } + if (preg_match('/^\((.*)\)$/i',$newvalue,$reg)) $newvalue=$outputlangs->transnoentities($reg[1]); $newvalue=$this->tsv_clean($newvalue,$outputlangs->charset_output); @@ -262,7 +260,7 @@ class ExportTsv extends ModeleExports * Clean a cell to respect rules of TSV file cells * * @param string $newvalue String to clean - * @param string $charset Output character set + * @param string $charset Input AND Output character set * @return string Value cleaned */ function tsv_clean($newvalue, $charset) diff --git a/htdocs/core/tpl/ajax/fileupload_main.tpl.php b/htdocs/core/tpl/ajax/fileupload_main.tpl.php index be6906faf04..b7437af4616 100644 --- a/htdocs/core/tpl/ajax/fileupload_main.tpl.php +++ b/htdocs/core/tpl/ajax/fileupload_main.tpl.php @@ -1,5 +1,5 @@ +/* Copyright (C) 2011-2013 Regis Houssin * * 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 @@ -44,7 +44,7 @@ $(function () { // Events $('#fileupload').fileupload({ - completed: function (e, data) { + stop: function (e, data) { location.href=''; }, destroy: function (e, data) { diff --git a/htdocs/core/tpl/login.tpl.php b/htdocs/core/tpl/login.tpl.php index 90caed4b8b4..bef263763de 100644 --- a/htdocs/core/tpl/login.tpl.php +++ b/htdocs/core/tpl/login.tpl.php @@ -134,7 +134,7 @@ if ($forgetpasslink || $helpcenterlink) echo '
'; echo '
'; if ($forgetpasslink) { - echo '('; + echo '('; echo $langs->trans('PasswordForgotten'); if (! $helpcenterlink) { echo ')'; @@ -145,7 +145,7 @@ if ($forgetpasslink || $helpcenterlink) if ($helpcenterlink) { $url=DOL_URL_ROOT.'/support/index.php'.$moreparam; if (! empty($conf->global->MAIN_HELPCENTER_LINKTOUSE)) $url=$conf->global->MAIN_HELPCENTER_LINKTOUSE; - echo ''; + echo ''; if ($forgetpasslink) { echo ' - '; } else { diff --git a/htdocs/document.php b/htdocs/document.php index 6758a5f76c0..86920e91e35 100644 --- a/htdocs/document.php +++ b/htdocs/document.php @@ -97,7 +97,7 @@ $refname=basename(dirname($original_file)."/"); // Security check if (empty($modulepart)) accessforbidden('Bad value for parameter modulepart'); -$check_access = dol_check_secure_access_document($modulepart,$original_file,$entity); +$check_access = dol_check_secure_access_document($modulepart,$original_file,$entity,$refname); $accessallowed = $check_access['accessallowed']; $sqlprotectagainstexternals = $check_access['sqlprotectagainstexternals']; $original_file = $check_access['original_file']; diff --git a/htdocs/exports/class/export.class.php b/htdocs/exports/class/export.class.php index 2311c6fe66e..b90922b3206 100644 --- a/htdocs/exports/class/export.class.php +++ b/htdocs/exports/class/export.class.php @@ -520,7 +520,7 @@ class Export $objmodel->write_header($outputlangs); // Genere ligne de titre - $objmodel->write_title($this->array_export_fields[$indice],$array_selected,$outputlangs); + $objmodel->write_title($this->array_export_fields[$indice],$array_selected,$outputlangs,$this->array_export_TypeFields[$indice]); $var=true; diff --git a/htdocs/fichinter/class/fichinter.class.php b/htdocs/fichinter/class/fichinter.class.php index b2c4884cf3e..a748ef0f549 100644 --- a/htdocs/fichinter/class/fichinter.class.php +++ b/htdocs/fichinter/class/fichinter.class.php @@ -372,7 +372,7 @@ class Fichinter extends CommonObject // Define new ref if (! $error && (preg_match('/^[\(]?PROV/i', $this->ref))) { - $num = $this->getNextNumRef($soc); + $num = $this->getNextNumRef($this->thirdparty); } else { diff --git a/htdocs/fourn/class/paiementfourn.class.php b/htdocs/fourn/class/paiementfourn.class.php index a1324f774ae..03dbc54f697 100644 --- a/htdocs/fourn/class/paiementfourn.class.php +++ b/htdocs/fourn/class/paiementfourn.class.php @@ -380,6 +380,8 @@ class PaiementFourn extends Paiement $sql.= ' FROM '.MAIN_DB_PREFIX.'paiementfourn_facturefourn as pf, '.MAIN_DB_PREFIX.'facture_fourn as f'; $sql.= ' WHERE pf.fk_facturefourn = f.rowid AND fk_paiementfourn = '.$this->id; if ($filter) $sql.= ' AND '.$filter; + + dol_syslog(get_class($this).'::getBillsArray sql='.$sql); $resql = $this->db->query($sql); if ($resql) { @@ -399,7 +401,7 @@ class PaiementFourn extends Paiement else { $this->error=$this->db->error(); - dol_syslog('PaiementFourn::getBillsArray Error '.$this->error.' - sql='.$sql); + dol_syslog(get_class($this).'::getBillsArray Error '.$this->error); return -1; } } diff --git a/htdocs/holiday/define_holiday.php b/htdocs/holiday/define_holiday.php index 721bf87054e..bb46a1291a6 100644 --- a/htdocs/holiday/define_holiday.php +++ b/htdocs/holiday/define_holiday.php @@ -68,7 +68,7 @@ if ($action == 'update' && isset($_POST['update_cp'])) } //If the user set a comment, we add it to the log comment - $comment = (isset($_POST['note_holiday'][$userID]) ? ' ('.$_POST['note_holiday'][$userID].')' : ''); + $comment = ((isset($_POST['note_holiday'][$userID]) && !empty($_POST['note_holiday'][$userID])) ? ' ('.$_POST['note_holiday'][$userID].')' : ''); // We add the modification to the log $holiday->addLogCP($user->id,$userID, $langs->trans('ManualUpdate').$comment,$userValue); @@ -150,10 +150,10 @@ print ''; print ''; print ""; print ''; -print ''; +print ''; print ''; print ''; -print ''; +print ''; print ''; foreach($listUsers as $users) diff --git a/htdocs/holiday/fiche.php b/htdocs/holiday/fiche.php index db27fb1116a..48d5f591edd 100644 --- a/htdocs/holiday/fiche.php +++ b/htdocs/holiday/fiche.php @@ -854,8 +854,8 @@ else // Si refus de la demande if ($action == 'refuse' && $cp->statut == 2 && $user->id == $cp->fk_validator) { - $array_input = array(array('type'=>"text",'label'=>"Entrez ci-dessous un motif de refus :",'name'=>"detail_refuse",'size'=>"50",'value'=>"")); - $ret=$form->form_confirm("fiche.php?id=".$id."&action=confirm_refuse", $langs->trans("TitleRefuseCP"), "", "confirm_refuse", $array_input, 1, 0); + $array_input = array(array('type'=>"text",'label'=> $langs->trans('DetailRefusCP'),'name'=>"detail_refuse",'size'=>"50",'value'=>"")); + $ret=$form->form_confirm("fiche.php?id=".$id."&action=confirm_refuse", $langs->trans("TitleRefuseCP"), $langs->trans('ConfirmRefuseCP'), "confirm_refuse", $array_input, 1, 0); if ($ret == 'html') print '
'; } diff --git a/htdocs/holiday/index.php b/htdocs/holiday/index.php index 4e85f261c3c..109153357ea 100644 --- a/htdocs/holiday/index.php +++ b/htdocs/holiday/index.php @@ -273,7 +273,7 @@ print ''; print ''; -$formother->select_year($year_create,'year_create',1, $min_year, $max_year); +$formother->select_year($year_create,'year_create',1, $min_year, 0); print ''; // UTILISATEUR diff --git a/htdocs/langs/ca_ES/errors.lang b/htdocs/langs/ca_ES/errors.lang index 5a68c272c3a..74411ee6a34 100644 --- a/htdocs/langs/ca_ES/errors.lang +++ b/htdocs/langs/ca_ES/errors.lang @@ -119,6 +119,7 @@ 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. +ErrorDateMustBeBeforeToday=La data no pot ser superior a avui # Warnings WarningMandatorySetupNotComplete=Els paràmetres obligatoris de configuració no estan encara definits diff --git a/htdocs/langs/ca_ES/margins.lang b/htdocs/langs/ca_ES/margins.lang index 8a0763f5214..7f80518f2ff 100644 --- a/htdocs/langs/ca_ES/margins.lang +++ b/htdocs/langs/ca_ES/margins.lang @@ -1,8 +1,6 @@ # Dolibarr language file - ca_ES - margins CHARSET=UTF-8 -Module59000Name=Marges -Module59000Desc=Gestió de marges comercials Margin=Marge Margins=Marges TotalMargin=Marge total diff --git a/htdocs/langs/el_GR/admin.lang b/htdocs/langs/el_GR/admin.lang index 5606120714b..c52e1530095 100644 --- a/htdocs/langs/el_GR/admin.lang +++ b/htdocs/langs/el_GR/admin.lang @@ -74,10 +74,6 @@ OSTZ=Ζώνη Ώρας OS server PHPTZ=Ζώνη Ώρας PHP server PHPServerOffsetWithGreenwich=PHP server offset width Greenwich (seconds) ClientOffsetWithGreenwich=Client/Browser offset width Greenwich (seconds) -CurrentHour=PHP server hour -CompanyTZ= Time Zone company (main company) -CompanyHour= Hour company (main company) -CurrentSessionTimeOut=Current session timeout OSEnv=Περιβάλλον OS Box=Πλαίσιο Boxes=Πλαίσια diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index cac27722e61..2dca3cd266f 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -109,16 +109,16 @@ ParameterInDolibarr=Parameter %s LanguageParameter=Language parameter %s LanguageBrowserParameter=Parameter %s LocalisationDolibarrParameters=Localisation parameters -ClientTZ=Time Zone client (user) -ClientHour=Hour client (user) -OSTZ=Time Zone OS server -PHPTZ=Time Zone PHP server +ClientTZ=Client Time Zone(user) +ClientHour=Client time(user) +OSTZ=Servre OS Time Zone +PHPTZ=PHP server Time Zone PHPServerOffsetWithGreenwich=PHP server offset width Greenwich (seconds) ClientOffsetWithGreenwich=Client/Browser offset width Greenwich (seconds) DaylingSavingTime=Daylight saving time -CurrentHour=Hour PHP (server) -CompanyTZ= Time Zone company (main company) -CompanyHour= Hour company (main company) +CurrentHour=PHP Time (server) +CompanyTZ=Company Time Zone (main company) +CompanyHour=Company Time (main company) CurrentSessionTimeOut=Current session timeout OSEnv=OS Environment Box=Box @@ -129,7 +129,7 @@ Position=Order MenusDesc=Menus managers define content of the 2 menu bars (horizontal bar and vertical bar). MenusEditorDesc=The menu editor allow you to define personalized entries in menus. Use it carefully to avoid making dolibarr unstable and menu entries permanently unreachable.
Some modules add entries in the menus (in menu All in most cases). If you removed some of these entries by mistake, you can restore them by disabling and reenabling the module. MenuForUsers=Menu for users -LangFile=File .lang +LangFile=.lang file System=System SystemInfo=System information SystemTools=System tools diff --git a/htdocs/langs/en_US/banks.lang b/htdocs/langs/en_US/banks.lang index de84677fc23..7a9b5644255 100644 --- a/htdocs/langs/en_US/banks.lang +++ b/htdocs/langs/en_US/banks.lang @@ -20,6 +20,8 @@ SavingAccount=Savings account SavingAccounts=Savings accounts ErrorBankLabelAlreadyExists=Financial account label already exists BankBalance=Balance +BankBalanceBefore=Balance before +BankBalanceAfter=Balance after BalanceMinimalAllowed=Minimum allowed balance BalanceMinimalDesired=Minimum desired balance InitialBankBalance=Initial balance diff --git a/htdocs/langs/en_US/companies.lang b/htdocs/langs/en_US/companies.lang index 56238311a27..9506f72abc5 100644 --- a/htdocs/langs/en_US/companies.lang +++ b/htdocs/langs/en_US/companies.lang @@ -377,7 +377,7 @@ SupplierCategory=Supplier category JuridicalStatus200=Independant DeleteFile=Delete file ConfirmDeleteFile=Are you sure you want to delete this file? -AllocateCommercial=Allocate a commercial +AllocateCommercial=Assigned to sale representative SelectCountry=Select a country SelectCompany=Select a third party Organization=Organization diff --git a/htdocs/langs/en_US/errors.lang b/htdocs/langs/en_US/errors.lang index 1f02fc11f5f..47c8e2768f7 100644 --- a/htdocs/langs/en_US/errors.lang +++ b/htdocs/langs/en_US/errors.lang @@ -123,6 +123,7 @@ ErrorNewValueCantMatchOldValue=New value can't be equal to old one ErrorFailedToValidatePasswordReset=Failed to reinit password. May be the reinit was already done (this link can be used only one time). If not, try to restart the reinit process. ErrorToConnectToMysqlCheckInstance=Connect to database fails. Check Mysql server is running (in most cases, you can launch it from command line with 'sudo /etc/init.d/mysql start'). ErrorFailedToAddContact=Failed to add contact +ErrorDateMustBeBeforeToday=The date can not be greater than today # Warnings WarningMandatorySetupNotComplete=Mandatory setup parameters are not yet defined diff --git a/htdocs/langs/en_US/main.lang b/htdocs/langs/en_US/main.lang index 32e7911c1ba..27170d6b15c 100644 --- a/htdocs/langs/en_US/main.lang +++ b/htdocs/langs/en_US/main.lang @@ -140,6 +140,7 @@ ConfirmClone=Choose data you want to clone : NoCloneOptionsSpecified=No data to clone defined. Of=of Go=Go +Run=Run CopyOf=Copy of Show=Show ShowCardHere=Show card @@ -648,6 +649,8 @@ Element=Element NoPhotoYet=No pictures available yet HomeDashboard=Home summary Deductible=Deductible +from=from +toward=toward # Week day Monday=Monday diff --git a/htdocs/langs/en_US/margins.lang b/htdocs/langs/en_US/margins.lang index f4975b719c7..e8c5ab38b6b 100644 --- a/htdocs/langs/en_US/margins.lang +++ b/htdocs/langs/en_US/margins.lang @@ -1,8 +1,6 @@ # Dolibarr language file - en_US - marges CHARSET=UTF-8 -Module59000Name=Margins -Module59000Desc=Profit margins management Margin=Margin Margins=Margins TotalMargin=Total Margin diff --git a/htdocs/langs/en_US/products.lang b/htdocs/langs/en_US/products.lang index 3f648f86e0f..16c566d144e 100644 --- a/htdocs/langs/en_US/products.lang +++ b/htdocs/langs/en_US/products.lang @@ -106,9 +106,9 @@ NoteNotVisibleOnBill=Note (not visible on invoices, proposals...) CreateCopy=Create copy ServiceLimitedDuration=If product is a service with limited duration: MultiPricesAbility=Activate the multi-prices -MultiPricesNumPrices=Number of price +MultiPricesNumPrices=Number of prices MultiPriceLevelsName=Price categories -AssociatedProductsAbility=Activate the virtual products feature +AssociatedProductsAbility=Activate the virtual products feature AssociatedProducts=Virtual product AssociatedProductsNumber=Number of products composing this virtual product ParentProductsNumber=Number of parent virtual product @@ -142,11 +142,11 @@ NoStockForThisProduct=No stock for this product NoStock=No Stock Restock=Restock ProductSpecial=Special -QtyMin=Quantity minimum +QtyMin=Min. Order Qty. PriceQty=Price for this quantity -PriceQtyMin=Price quantity min. (without discount) +PriceQtyMin=MOQ Price (w/o discount) VATRateForSupplierProduct=VAT Rate (for this supplier/product) -DiscountQtyMin=Discount quantity min. (by default) +DiscountQtyMin=MOQ Discount (by default) NoPriceDefinedForThisSupplier=No price/qty defined for this supplier/product NoSupplierPriceDefinedForThisProduct=No supplier price/qty defined for this product RecordedProducts=Products recorded @@ -159,7 +159,7 @@ ListProductServiceByPopularity=List of products/services by popularity ListProductByPopularity=List of products by popularity ListServiceByPopularity=List of services by popularity Finished=Manufactured product -RowMaterial=First material +RowMaterial=Raw Material CloneProduct=Clone product or service ConfirmCloneProduct=Are you sure you want to clone product or service %s ? CloneContentProduct=Clone all main informations of product/service @@ -172,8 +172,8 @@ CustomCode=Customs code CountryOrigin=Origin country HiddenIntoCombo=Hidden into select lists Nature=Nature -ProductCodeModel=Product code model -ServiceCodeModel=Service code model +ProductCodeModel=Product code template +ServiceCodeModel=Service code template AddThisProductCard=Create product card HelpAddThisProductCard=This option allows you to create or clone a product if it does not exist. AddThisServiceCard=Create service card diff --git a/htdocs/langs/es_ES/errors.lang b/htdocs/langs/es_ES/errors.lang index f3b9694e4fe..2b9b4d09f11 100644 --- a/htdocs/langs/es_ES/errors.lang +++ b/htdocs/langs/es_ES/errors.lang @@ -122,6 +122,7 @@ 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. +ErrorDateMustBeBeforeToday=La fecha no puede ser superior a hoy # Warnings WarningMandatorySetupNotComplete=Los parámetros obligatorios de configuración no están todavía definidos diff --git a/htdocs/langs/es_ES/margins.lang b/htdocs/langs/es_ES/margins.lang index b4614596ae6..11505132287 100644 --- a/htdocs/langs/es_ES/margins.lang +++ b/htdocs/langs/es_ES/margins.lang @@ -1,8 +1,6 @@ # Dolibarr language file - es_ES - margins CHARSET=UTF-8 -Module59000Name=Márgenes -Module59000Desc=Gestión de márgenes comerciales Margin=Margen Margins=Márgenes TotalMargin=Margen total diff --git a/htdocs/langs/fr_FR/banks.lang b/htdocs/langs/fr_FR/banks.lang index c51d915602f..bcc281626e1 100644 --- a/htdocs/langs/fr_FR/banks.lang +++ b/htdocs/langs/fr_FR/banks.lang @@ -20,6 +20,8 @@ SavingAccount=Compte épargne SavingAccounts=Comptes épargne/placements ErrorBankLabelAlreadyExists=Libellé de compte financier déjà existant BankBalance=Solde +BankBalanceBefore=Solde avant +BankBalanceAfter=Solde après BalanceMinimalAllowed=Solde minimum autorisé BalanceMinimalDesired=Solde minimum désiré InitialBankBalance=Solde initial diff --git a/htdocs/langs/fr_FR/compta.lang b/htdocs/langs/fr_FR/compta.lang index 227b6b734ad..a86676b36b9 100644 --- a/htdocs/langs/fr_FR/compta.lang +++ b/htdocs/langs/fr_FR/compta.lang @@ -140,7 +140,7 @@ SellsJournal=Journal des ventes PurchasesJournal=Journal des achats Journaux=Journaux InvoiceRef=Réf facture -Piece=Piece compta +Piece=Pièce compta DescSellsJournal=Journal des ventes DescPurchasesJournal=Journal des achats JournalNum=Journal diff --git a/htdocs/langs/fr_FR/errors.lang b/htdocs/langs/fr_FR/errors.lang index 28be39d651f..f3bcee9c4d9 100644 --- a/htdocs/langs/fr_FR/errors.lang +++ b/htdocs/langs/fr_FR/errors.lang @@ -124,6 +124,7 @@ ErrorNewValueCantMatchOldValue=La nouvelle valeur ne peut être égale à l'anci ErrorFailedToValidatePasswordReset=Echec de la réinitialisation du mot de passe. Il est possible que ce lien ait déjà été utilisé (l'utilisation de ce lien ne fonctionne qu'une fois). Si ce n'est pas le cas, essayer de recommencer le processus de réinit de mot de passe depuis le début. ErrorToConnectToMysqlCheckInstance=Echec de la connection au serveur de base de donnée. Vérifier que Mysql est bien lancé (dans la plupart des cas, vous pouvez le lancer depuis la ligne de commande par la commande 'sudo /etc/init.d/mysql start'). ErrorFailedToAddContact=Echec à l'ajout du contact +ErrorDateMustBeBeforeToday=La date ne peut pas être supérieure à aujourd'hui # Warnings WarningMandatorySetupNotComplete=Les informations de configuration obligatoire doivent être renseignées diff --git a/htdocs/langs/fr_FR/main.lang b/htdocs/langs/fr_FR/main.lang index 62130ce5d5c..c3117dcf7d7 100644 --- a/htdocs/langs/fr_FR/main.lang +++ b/htdocs/langs/fr_FR/main.lang @@ -141,6 +141,7 @@ ConfirmClone=Veuillez choisir votre option de clonage : NoCloneOptionsSpecified=Aucun option de clonage n'a été spécifiée. Of=du Go=Aller +Run=Lancer CopyOf=Copie de Show=Voir ShowCardHere=Voir la fiche ici @@ -652,6 +653,8 @@ Element=Élément NoPhotoYet=Pas de photo disponible pour l'instant HomeDashboard=Synthèse accueil Deductible=Déductible +from=de +toward=vers # Week day Monday=Lundi diff --git a/htdocs/langs/fr_FR/margins.lang b/htdocs/langs/fr_FR/margins.lang index b30e79a3e7b..19910d90291 100644 --- a/htdocs/langs/fr_FR/margins.lang +++ b/htdocs/langs/fr_FR/margins.lang @@ -1,8 +1,6 @@ # Dolibarr language file - fr_FR - margins CHARSET=UTF-8 -Module59000Name=Marges -Module59000Desc=Gestion des marges commerciales Margin=Marge Margins=Marges TotalMargin=Marge totale diff --git a/htdocs/langs/it_IT/commercial.lang b/htdocs/langs/it_IT/commercial.lang index 7e49c50e656..3f1c70f5771 100644 --- a/htdocs/langs/it_IT/commercial.lang +++ b/htdocs/langs/it_IT/commercial.lang @@ -86,3 +86,4 @@ TaskRDVWith =Incontro con %s TasksHistoryForThisContact =Storico del contatto ToDoActions =Azioni da fare ToDoActionsFor =Azioni da fare per %s +ThirdPartiesOfSaleRepresentative=Terze parti con responsabile commerciale diff --git a/htdocs/langs/it_IT/main.lang b/htdocs/langs/it_IT/main.lang index 040f9f7dcfc..cbf5a404504 100644 --- a/htdocs/langs/it_IT/main.lang +++ b/htdocs/langs/it_IT/main.lang @@ -655,3 +655,4 @@ yes =sì Yes =Sì Yesterday =Ieri YouCanChangeValuesForThisListFromDictionnarySetup =È possibile modificare i valori di questo elenco dal menu Impostazioni - Dizionario +LinkedToSpecificUsers=Con collegamento ad un utente specifico diff --git a/htdocs/langs/it_IT/projects.lang b/htdocs/langs/it_IT/projects.lang index a52a3c03bfc..1fd71170070 100644 --- a/htdocs/langs/it_IT/projects.lang +++ b/htdocs/langs/it_IT/projects.lang @@ -62,7 +62,7 @@ NotOwnerOfProject=Non proprietario di questo progetto privato OfficerProject =Responsabile del progetto PrivateProject=Contatti di progetto Progress=Progressi -ProjectContact=Progetto contatti +ProjectContact=Contatti Project =Progetto ProjectsArea =Sezione progetti ProjectsDedicatedToThisThirdParty=I progetti dedicati a questo terzo diff --git a/htdocs/langs/nb_NO/companies.lang b/htdocs/langs/nb_NO/companies.lang index 287d2e2c08e..3b1531f5391 100644 --- a/htdocs/langs/nb_NO/companies.lang +++ b/htdocs/langs/nb_NO/companies.lang @@ -248,7 +248,6 @@ NoOtherDeliveryAddress=Ingen alternativ leveringsadresse lagt inn JuridicalStatus200=Uavhengig DeleteFile=Slett fil ConfirmDeleteFile=Er du sikker på at du vil slette denne filen? -AllocateCommercial=Allocate a commercial SelectCountry=Velg land SelectCompany=Velg tredjepart Organization=Organisasjon diff --git a/htdocs/langs/nl_NL/dict.lang b/htdocs/langs/nl_NL/dict.lang index c430b86e6d0..37aa3207418 100644 --- a/htdocs/langs/nl_NL/dict.lang +++ b/htdocs/langs/nl_NL/dict.lang @@ -247,10 +247,11 @@ CountryME = Montenegro CountryBL = Saint Barthelemy CountryMF = Saint Martin ##### Civilities ##### = -CivilityMME = Mej. -CivilityMR = Dhr. -CivilityMLE = Mevr. +CivilityMME = Mevrouw +CivilityMR = Meneer +CivilityMLE = Mejuffrouw CivilityMTRE = Meester +CivilityDR = Dokter ##### Currencies ##### = Currencyeuros = Euro CurrencyAUD = Australische Dollars @@ -289,17 +290,17 @@ CurrencyXOF = Francs CFA BCEAO CurrencySingXOF = Franc CFA BCEAO CurrencyXPF = Francs CFP CurrencySingXPF = Franc CFP - - -// START - Lines generated via autotranslator.php tool (2011-10-10 01:37:25). -// Reference language: en_US -> nl_NL -CurrencyUAH=Hryvnia -CurrencySingUAH=Hryvnia -DemandReasonTypeSRC_INTE=Internet -DemandReasonTypeSRC_CAMP_MAIL=Mailing campagne -DemandReasonTypeSRC_CAMP_EMAIL=E-mailen campagne -DemandReasonTypeSRC_CAMP_PHO=Telefoon campagne -DemandReasonTypeSRC_CAMP_FAX=Fax-campagne -DemandReasonTypeSRC_COMM=Commercieel contact -DemandReasonTypeSRC_SHOP=Winkel contact -// STOP - Lines generated via autotranslator.php tool (2011-10-10 01:39:55). + + +// START - Lines generated via autotranslator.php tool (2011-10-10 01:37:25). +// Reference language: en_US -> nl_NL +CurrencyUAH=Hryvnia +CurrencySingUAH=Hryvnia +DemandReasonTypeSRC_INTE=Internet +DemandReasonTypeSRC_CAMP_MAIL=Mailing campagne +DemandReasonTypeSRC_CAMP_EMAIL=E-mailen campagne +DemandReasonTypeSRC_CAMP_PHO=Telefoon campagne +DemandReasonTypeSRC_CAMP_FAX=Fax-campagne +DemandReasonTypeSRC_COMM=Commercieel contact +DemandReasonTypeSRC_SHOP=Winkel contact +// STOP - Lines generated via autotranslator.php tool (2011-10-10 01:39:55). \ No newline at end of file diff --git a/htdocs/langs/tr_TR/margins.lang b/htdocs/langs/tr_TR/margins.lang index f8d8d6a39a9..c4e807cf8e7 100644 --- a/htdocs/langs/tr_TR/margins.lang +++ b/htdocs/langs/tr_TR/margins.lang @@ -1,8 +1,6 @@ # Dolibarr language file - en_US - marges CHARSET=UTF-8 -Module59000Name=Oranlar -Module59000Desc=Kar oranı yönetimi Margin=Oran Margins=Oranlar TotalMargin=Toplam Oran diff --git a/htdocs/langs/zh_CN/admin.lang b/htdocs/langs/zh_CN/admin.lang index 0b8c6abbbf5..b3c3d1e9310 100644 --- a/htdocs/langs/zh_CN/admin.lang +++ b/htdocs/langs/zh_CN/admin.lang @@ -1,313 +1,414 @@ -/* - * Language code: zh_CN - * Automatic generated via autotranslator.php tool - * Generation date 2010-06-08 21:22:55 - */ - - -// START - Lines generated via autotranslator.php tool (2010-06-08 21:22:55). -// Reference language: en_US +# Dolibarr language file - en_US - admin CHARSET=UTF-8 +Foundation=机构 Version=版本 -VersionProgram=版本计划 -VersionLastInstall=初始安装版本 -VersionLastUpgrade=最后的升级版本 -VersionExperimental=实验 -VersionDevelopment=发展 +VersionProgram=程序版本 +VersionLastInstall=最初安装的版本 +VersionLastUpgrade=上次更新的版本 +VersionExperimental=试验性 +VersionDevelopment=开发 VersionUnknown=未知 -VersionRecommanded=推荐 -SessionId=会话ID -SessionSaveHandler=处理程序,以节省会议 -SessionSavePath=本地化存储会议 -PurgeSessions=清除的会议 -ConfirmPurgeSessions=难道你真的想清除所有的会议?这将断开每个用户(除了自己)。 -NoSessionListWithThisHandler=保存的会话处理器配置你的PHP不允许列出所有正在运行的会话。 -LockNewSessions=锁定新的连接 -ConfirmLockNewSessions=你肯定你想限制任何新Dolibarr连接到自己。只有用户%s将能够连接之后。 -UnlockNewSessions=删除连接锁 +VersionRecommanded=推荐项目 +SessionId=会话 ID +SessionSaveHandler=会话保存处理程序 +SessionSavePath=存储会话本地化 +PurgeSessions=清空会话 +ConfirmPurgeSessions=您确定要清空会话?这将断开除您之外的所有用户。 +NoSessionListWithThisHandler=您 PHP 中设置的保存会话处理程序不允许列出运行中的会话。 +LockNewSessions=锁定新连接 +ConfirmLockNewSessions=你确定要限制 Dolibarr 的所有新连接,只允许您自己连入?此后将只有用户 %s 可以连入。 +UnlockNewSessions=取消连接锁定 YourSession=您的会话 -Sessions=用户会议 -NoSessionFound=您的PHP似乎不容许列出活动的会话。目录用于保存会话(%)可能受到保护(例如,通过操作系统的权限,或者由PHP指令的open_basedir)。 -HTMLCharset=字符集的生成HTML页面 -DBStoringCharset=数据库字符集来存储数据 -DBSortingCharset=数据库字符集的数据进行排序 -WarningModuleNotActive=模块%s必须启用 -WarningOnlyPermissionOfActivatedModules=只有激活相关的模块权限是在这里显示。你可以在激活家庭>安装->模块网页上的其他模块。 -DolibarrSetup=Dolibarr设置 -DolibarrUser=Dolibarr用户 -InternalUser=内部用户 -ExternalUser=外部用户 -InternalUsers=内部用户 -ExternalUsers=外部用户 -GlobalSetup=全球格局 -GUISetup=显示 -SetupArea=安装面积 -FormToTestFileUploadForm=测试文件的形式上传(根据设置) -IfModuleEnabled=注:是的,是有效的,只有模块%s是启用 -RemoveLock=删除文件%s如果它的存在是为了让更新的工具。 -RestoreLock=替换文件%s的更新工具,只允许读文件使用任何禁用。 +Sessions=用户会话 +WebUserGroup=Web 服务器用户/组 +NoSessionFound=您 PHP 似乎不允许列出运行中的会话。会话的存储目录可能受到系统权限或PHP open_basedir 指令的保护。 +HTMLCharset=生成 HTML 页面的字符编码 +DBStoringCharset=数据库保存数据的字符编码 +DBSortingCharset=数据库数据排序的字符编码 +WarningModuleNotActive=模块 %s 必须启用 +WarningOnlyPermissionOfActivatedModules=仅与已启用模块相关的权限显示在此。您可以在 主页->设定->模块页面中启用其它模块。 +DolibarrSetup=Dolibarr 的安装或更新 +DolibarrUser=Dolibarr 用户 +InternalUser=内部员工用户 +ExternalUser=外部人员用户 +InternalUsers=内部员工用户 +ExternalUsers=外部人员用户 +GlobalSetup=全局设定 +GUISetup=显示界面 +SetupArea=设定 区域 +FormToTestFileUploadForm=文件上传测试文件表单 (根据设置) +IfModuleEnabled=注:“是”仅在模块 %s 启用时有效 +RemoveLock=如果存在文件 %s 则删除,以便可以使用升级工具。 +RestoreLock=恢复文件 %s 的只读权限,以禁止升级工具的使用。 SecuritySetup=安全设置 -ErrorModuleRequirePHPVersion=错误,这个模块需要的PHP版本是%s或更高 -ErrorModuleRequireDolibarrVersion=错误,这个模块需要Dolibarr%s或更高版本 -ErrorDecimalLargerThanAreForbidden=错误,1%的精度高于不支持。 -DictionnarySetup=词典设置 -DisableJavascript=禁用JavaScript和Ajax功能 -ConfirmAjax=使用Ajax确认弹出式窗口 -UseSearchToSelectCompany=使用搜索表单选择,而不是使用一个列表框的公司() -ViewFullDateActions=充分显示行动的日期,第三表 -NotAvailableWhenAjaxDisabled=用时没有Ajax的残疾人 -JavascriptDisabled=禁用JavaScript -UsePopupCalendar=使用弹出输入日期 +ErrorModuleRequirePHPVersion=错误,此模块要求 PHP 版本 %s 或更高 +ErrorModuleRequireDolibarrVersion=错误,此模块要求 Dolibarr 版本 %s 或更高 +ErrorDecimalLargerThanAreForbidden=错误,不支持超过 %s 的精度。 +DictionnarySetup=选项列表设定 +Dictionnary=选项字典 +ErrorReservedTypeSystemSystemAuto=类型值 'system' 与 'systemauto' 是系统保留值。不能以'user'为值添加您的记录 +ErrorCodeCantContainZero=编码不能包含 0 +DisableJavascript=禁用 JavaScript 和 Ajax 功能 +ConfirmAjax=使用 Ajax 弹出式确认窗口 +UseSearchToSelectCompany=使用自动完成栏的方式,来选择第三方(不使用下拉选择框)

如果你有大于 100000 笔第三方资讯,则可以通过修改SOCIETE_DONOTSEARCH_ANYWHERE 常数为 1 来加快速度。此常数可以在设定->其他设置中设定。这样自动完成功能会被限制为从字首开始依次匹配。 +ActivityStateToSelectCompany= 添加一个筛选器选项来显示/隐藏当前有往来或已停止往来的客户/供应商。 +UseSearchToSelectContact=使用自动完成栏的方式,来选择第三方(取代下拉菜单)

如果你有大于 100000 个第三方,则可以通过修改SOCIETE_DONOTSEARCH_ANYWHERE 常数为 1 来加快速度。此常数可以在设定->其他设置中设定。这样自动完成功能会被限制为从字首开始依次匹配。 +SearchFilter=搜索过滤选项 +NumberOfKeyToSearch=触发搜索的字符数量:%s +ViewFullDateActions=在第三表中显示全天事件 +NotAvailableWhenAjaxDisabled=Ajax 禁用时不可用 +JavascriptDisabled=禁用 JavaScript +UsePopupCalendar=使用弹出窗口输入日期 UsePreviewTabs=使用预览标签 ShowPreview=显示预览 -PreviewNotAvailable=无法预览 -ThemeCurrentlyActive=目前活跃的主题 -CurrentTimeZone=PHP服务器的TimeZone +PreviewNotAvailable=无预览 +ThemeCurrentlyActive=当前使用的主题 +CurrentTimeZone=PHP 服务器的时区 Space=空间 -Fields=菲尔兹 -Mask=面具 -NextValue=下一个值 -NextValueForInvoices=下一个值(发票) -NextValueForCreditNotes=下一个值(信用债券) -MustBeLowerThanPHPLimit=注意:你的PHP限制每个文件上传的大小为%s%s的,不管这个参数的值 -NoMaxSizeByPHPLimit=注:不限制设置在你的PHP配置 -MaxSizeForUploadedFiles=最高(0上传文件的大小,禁止任何上传) -UseCaptchaCode=使用图形化代码,在登录(CAPTCHA的)页 -UseAvToScanUploadedFiles=使用防病毒扫描上传的文件 -AntiVirusCommand=反病毒命令的完整路径 -AntiVirusCommandExample=示例的ClamWin中:C:\程序文件(x86)的\的ClamWin \斌\ clamscan.exe
ClamAV的实例:/ usr /斌/ clamscan -AntiVirusParam=命令行参数的更多 -AntiVirusParamExample=示例的ClamWin: - 数据库=的“C:\程序文件(x86)的\的ClamWin \ lib目录” +Table=表 +Fields=字段 +Index=索引 +Mask=格式掩码 +NextValue=下一个编码 +NextValueForInvoices=下一个发票编码 +NextValueForCreditNotes=下一个票据编码 +MustBeLowerThanPHPLimit=注意:无论这个参数值是多少,您的 PHP 参数已经限制每个上传文件大小为 %s %s +NoMaxSizeByPHPLimit=注:您的 PHP 配置参数中没有设置限制 +MaxSizeForUploadedFiles=上传文件的最大大小 (0 表示禁止上传) +UseCaptchaCode=登陆页面启用图形验证码 +UseAvToScanUploadedFiles=使用防毒软件扫瞄上传的文件 +AntiVirusCommand= 防毒命令的完整路径 +AntiVirusCommandExample= ClamWin 示例:c:\Progra~1\ClamWin\bin\clamscan.exe
ClamAv 实例:/usr/bin/clamscan +AntiVirusParam= 更多命令行参数 +AntiVirusParamExample= ClamWin 示例: --database ComptaSetup=会计模块设置 -UserSetup=用户的管理体制 -MenuSetup=菜单的管理体制 -MenuLimits=界限和准确性 -MenuIdParent=父菜单编号 -DetailMenuIdParent=家长菜单(0编号为顶级菜单) -DetailPosition=分类编号,以确定菜单位置 +UserSetup=用户管理设置 +MenuSetup=菜单管理设置 +MenuLimits=范围和精度 +MenuIdParent=父菜单ID +DetailMenuIdParent=父菜单ID (空表示顶级菜单) +DetailPosition=排序编号,以确定菜单位置 PersonalizedMenusNotSupported=不支持个性化菜单 AllMenus=所有 -NotConfigured=未配置 -Setup=格局 -Activation=活化 -Active=活跃 -SetupShort=格局 +NotConfigured=模块未配置 +Setup=设定 +Activation=启用 +Active=启用 +SetupShort=设定 OtherOptions=其他选项 OtherSetup=其他设置 -CurrentValueSeparatorDecimal=小数分隔符 +CurrentValueSeparatorDecimal=小数位分隔符 CurrentValueSeparatorThousand=千位分隔符 Modules=模块 ModulesCommon=主要模块 ModulesOther=其他模块 -ModulesInterfaces=接口模块 -ModulesSpecial=非常具体的模块 -ParameterInDolibarr=%s的参数 -LanguageParameter=参数%s的语言 -LanguageBrowserParameter=%s的参数 +ModulesInterfaces=界面相关模块 +ModulesSpecial=专用功能模块 +ParameterInDolibarr=参数 %s +LanguageParameter=语言参数 %s +LanguageBrowserParameter=参数 %s LocalisationDolibarrParameters=本地化参数 -ClientTZ=时区客户端(用户) -ClientHour=小时客户端(用户) -OSTZ=服务器操作系统时区 -PHPTZ=时区PHP服务器 -PHPServerOffsetWithGreenwich=PHP服务器抵消宽度格林威治(秒) -CurrentHour=PHP服务器小时 -CompanyTZ=时区的公司(主要公司) -CompanyHour=小时公司(主要公司) +ClientTZ=客户端(用户)时区 +ClientHour=客户端(用户)时间 +OSTZ=服务器作业系统时区 +PHPTZ=PHP服务器时区 +PHPServerOffsetWithGreenwich=PHP服务器与 GMT 时差(秒) +ClientOffsetWithGreenwich=客户机/浏览器与 GMT 时差(秒) +DaylingSavingTime=夏令时间(用户) +CurrentHour=PHP 服务器时间 +CompanyTZ= 公司时区(主公司) +CompanyHour= 公司时间(主公司) CurrentSessionTimeOut=当前会话超时 -OSEnv=OS环境 -Box=框 -Boxes=盒 -MaxNbOfLinesForBoxes=最大的行数为箱 +OSEnv=系统环境 +Box=资讯框 +Boxes=资讯框 +MaxNbOfLinesForBoxes=资讯框最大行数 PositionByDefault=默认顺序 -Position=秩序 -MenusDesc=经理定义菜单2菜单栏(横向和纵向栏栏内容)。 -MenusEditorDesc=菜单编辑器允许您定义个性化的菜单项。使用它小心避免dolibarr不稳定和菜单项永远无法达到的。
某些模块菜单添加菜单项(在所有的病例在大多数)。如果您错误地删除了这些项目的一些,你可以通过禁用和重新启用恢复模块它们。 +Position=* 顺序/订单 +MenusDesc=菜单管理器定义两菜单中的内容(横向和纵向菜单栏)。 +MenusEditorDesc=菜单编辑器允许您定义个性化的菜单项。请谨慎使用,以免造成部分菜单项无法访问,影响 Dolibarr 的稳定性。
一些模块会添加菜单项(通常在 所有(All)菜单下)。如果您错误的移除了其中的一些菜单项,可以通过禁用/重新启用相应的模块来恢复。 MenuForUsers=用户菜单 -LangFile=文件。郎 +LangFile=.lang 文件 System=系统 -SystemInfo=系统信息 +SystemInfo=系统资讯 SystemTools=系统工具 SystemToolsArea=系统工具区 -SystemToolsAreaDesc=这一地区提供了管理功能。使用菜单选择功能,您要找的内容。 -PurgeAreaDesc=此页面允许您删除所有文件或目录建立存储Dolibarr(%s或临时文件中的所有文件)。使用此功能是没有必要的。它为用户提供的Dolibarr是由供应商,不提供删除权限由Web服务器建立档案托管。 -PurgeDeleteLogFile=删除日志文件%s的定义系统日志模块(无数据风险松) -PurgeDeleteTemporaryFiles=删除所有临时文件(不松散数据的风险) -PurgeDeleteAllFilesInDocumentsDir=删除所有文件目录%s。临时文件,而且文件附加到元素(第三方发票,...),进入流脑模块上传将被删除。 -PurgeRunNow=现在清除 -PurgeNothingToDelete=没有目录或文件删除。 -PurgeNDirectoriesDeleted=%s的文件或目录删除。 -PurgeAuditEvents=清除所有事件 -ConfirmPurgeAuditEvents=您是否确定要清除所有安全事件?所有的安全日志将被删除,没有其他数据将被删除。 -NewBackup=新的备份 -GenerateBackup=生成的备份 -Backup=备用 -Restore=恢复 -RunCommandSummary=备份将通过下面的命令 +SystemToolsAreaDesc=此区域提供管理员功能。请点选菜单来管理你想要的内容。 +Purge=清空 +PurgeAreaDesc=此页面允许您删除目录%s或临时文件夹中 Dolibarr 生成或存储的所有文件。通常无需使用此功能。它为Dolibarr托管在服务器上,但服务供应商未提供删除权限的用户而设。 +PurgeDeleteLogFile=删除系统日志模块定义的日志文件%s(无数据丢失风险) +PurgeDeleteTemporaryFiles=删除所有临时文件(无数据丢失风险) +PurgeDeleteAllFilesInDocumentsDir=删除 %s 目录中的所有文件。临时文件、数据库备份转储文件、系统档案条目(第三方、付款明细)的附件及 电子文档管理 模块中上传的文件。 +PurgeRunNow=立即清空 +PurgeNothingToDelete=没有目录或文件被删除。 +PurgeNDirectoriesDeleted=%s 个文件或目录删除。 +PurgeAuditEvents=清空所有安全事件 +ConfirmPurgeAuditEvents=您确定要清空所有安全事件?所有安全日志都将被清除,其它数据不动。 +NewBackup=新建备份 +GenerateBackup=生成备份 +Backup=备份 +Restore=还原 +RunCommandSummary=备份已通过如下命令执行 +RunCommandSummaryToLaunch=备份可通过如下命令执行 WebServerMustHavePermissionForCommand=您的Web服务器必须有权限来运行这些命令 BackupResult=备份结果 -BackupFileSuccessfullyCreated=生成的备份文件成功 +BackupFileSuccessfullyCreated=备份文件生成成功 YouCanDownloadBackupFile=生成的文件现在可以下载 NoBackupFileAvailable=没有可用的备份文件。 -ExportMethod=Export方法 +ExportMethod=导出方法 ImportMethod=导入方法 -ToBuildBackupFileClickHere=为了建立一个备份文件,单击此处 。 -ImportMySqlDesc=要导入的备份文件,您必须使用命令行mysql命令: -ImportMySqlCommand=%s的%s的<mybackupfile.sql -FileNameToGenerate=文件名生成 -CommandsToDisableForeignKeysForImport=命令来禁用外键进口 -ExportCompatibility=生成的导出文件的兼容性 -MySqlExportParameters=MySQL的出口参数 +ToBuildBackupFileClickHere=要建立一个备份文件,请单击此处 +ImportMySqlDesc=要导入备份文件,您必须使用mysql命令行命令: +ImportPostgreSqlDesc=导入备份文件,你必须使用 pg_restore 命令行命令: +ImportMySqlCommand=%s %s < mybackupfile.sql +ImportPostgreSqlCommand=%s %s mybackupfile.sql +FileNameToGenerate=生成的文件名 +Compression=压缩 +CommandsToDisableForeignKeysForImport=导入时禁用 Foreign Key 的命令 +CommandsToDisableForeignKeysForImportWarning=必须使用,如果您希望稍候能恢复您的SQL转储。 +ExportCompatibility=生成导出文件的兼容性 +MySqlExportParameters=MySQL 导出参数 +PostgreSqlExportParameters= PostgreSQL 导出参数 UseTransactionnalMode=使用事务模式 -FullPathToMysqldumpCommand=mysqldump命令的完整路径 +FullPathToMysqldumpCommand=mysqldump 命令的完整路径 +FullPathToPostgreSQLdumpCommand=pg_dump 命令的完整路径 ExportOptions=导出选项 -AddDropDatabase=添加删除数据库命令 -AddDropTable=添加DROP TABLE命令 +AddDropDatabase=添加 DROP DATABASE 命令 +AddDropTable=添加 DROP TABLE 命令 +ExportStructure=结构 Datas=数据 NameColumn=名称列 -ExtendedInsert=扩展的INSERT +ExtendedInsert=扩展 INSERT +NoLockBeforeInsert=INSERT 命令前后没有锁定命令 DelayedInsert=延迟插入 -EncodeBinariesInHexa=在十六进制编码的二进制数据 -Yes=是的 -No=没有 -AutoDetectLang=自动检测(浏览器的语言) -FeatureDisabledInDemo=在演示功能禁用 +EncodeBinariesInHexa=二进制数据以十六进制编码 +IgnoreDuplicateRecords=忽略重复记录错误(INSERT IGNORE) +Yes=是 +No=否 +AutoDetectLang=自动检测(浏览器的语言) +FeatureDisabledInDemo=功能在演示版中已禁用 Rights=权限 -BoxesDesc=框屏幕区域,显示了在一些网页上的资料。您可以选择显示选择目标页,然后点击'的方块,或不激活',或按一下垃圾桶中禁用它。 -OnlyActiveElementsAreShown=分子只有启用的模块显示。 -ModulesDesc=Dolibarr模块定义哪些功能是在软件中启用。有些模块需要您必须授予权限给用户,在启用模块。 -ModulesInterfaceDesc=该Dolibarr模块接口允许你添加取决于外部软件,系统或服务功能。 -ModulesSpecialDesc=特别是非常具体的模块或很少使用的模块。 -ModulesJobDesc=业务模块提供特定业务简单的Dolibarr预定义设置。 -BoxesAvailable=盒可用 -BoxesActivated=激活盒 -ActivateOn=激活 -ActiveOn=激活 -SourceFile=源文件 -AutomaticIfJavascriptDisabled=如果JavaScript被禁用自动 -AvailableOnlyIfJavascriptNotDisabled=仅当禁用JavaScript是不 -AvailableOnlyIfJavascriptAndAjaxNotDisabled=仅当禁用JavaScript是不 -Required=需要 +BoxesDesc=资讯框是一些页面中显示信息的屏幕区域。您可以选择目标页面并点击“启用”或垃圾桶按钮来显示或禁用这些信息域。 +OnlyActiveElementsAreShown=仅显示 已启用模块 的元素。 +ModulesDesc=Dolibarr 模块版面设定启用软件中的哪些功能。有些模块启用后需要授予权限给用户。单击“状态”列中的开/关按钮来启用模块/功能。 +ModulesInterfaceDesc=该 Dolibarr 模块接口允许您根据外部软件、系统或服务添加功能。 +ModulesSpecialDesc=特殊模块指局部非常具体的功能或很少使用的模块。 +ModulesJobDesc=业务模块为特定业务提供简单的 Dolibarr 预制设置。 +ModulesMarketPlaceDesc=您可以在一些外部网站上找到更多的模块(安全性未知)... +ModulesMarketPlaces=更多模块... +DoliStoreDesc=DoliStore,为 Dolibarr 的 ERP/CRM 的外部模块官方市场 +WebSiteDesc=网站提供者可以搜索找到更多模块... +URL=链接 +BoxesAvailable=资讯框可用 +BoxesActivated=资讯框已启用 +ActivateOn=启用页面 +ActiveOn=启用页面 +SourceFile=来源文件 +AutomaticIfJavascriptDisabled=自动,如果 JavaScript 被禁用 +AvailableOnlyIfJavascriptNotDisabled=仅当 JavaScript 启用时可用 +AvailableOnlyIfJavascriptAndAjaxNotDisabled=仅当 JavaScript 启用时可用 +Required=必要 Security=安全 Passwords=密码 -DoNotStoreClearPassword=难道没有明确的密码存储在数据库,但只存储加密值(活性炭推荐) -MainDbPasswordFileConfEncrypted=数据库密码conf.php加密(活性炭推荐) -InstrucToEncodePass=为了有密码编码到conf.php文件,替换行
$ dolibarr_main_db_pass ="..."

$ dolibarr_main_db_pass =“加密的:%s的” -InstrucToClearPass=为了有密码破译(清除)到conf.php文件,替换行
$ dolibarr_main_db_pass =“加密的:..."

$ dolibarr_main_db_pass =“%的” -ProtectAndEncryptPdfFiles=保护生成的PDF文件(活性不推荐,休息质量PDF生成) -ProtectAndEncryptPdfFilesDesc=一个PDF文档保护不断提供给阅读和打印任何的PDF浏览器。然而,编辑和复制是不可能的了。请注意,使用此功能使全球累计PDF格式的建设工作不喜欢未付发票()。 -Feature=特征 -DolibarrLicense=牌照 +DoNotStoreClearPassword=不在数据库中储存明文密码,只存储加密后的密码(建议启用) +MainDbPasswordFileConfEncrypted=加密 conf.php 中的数据库密码(推荐启用) +InstrucToEncodePass=要将 conf.php 文件中的密码加密,替换行
$ dolibarr_main_db_pass="..."

$dolibarr_main_db_pass="crypted:%s" +InstrucToClearPass=要在conf.php文件中使用将明文密码,替换行
$ dolibarr_main_db_pass="crypted:..."

$dolibarr_main_db_pass="%s" +ProtectAndEncryptPdfFiles=保护生成的PDF文件(推荐*不*启用,影响PDF的批量生成) +ProtectAndEncryptPdfFilesDesc=PDF保护允许在PDF浏览器中阅读和打印PDF,但无法编辑和复制内容。请注意,此功能让追加生成多页PDF的功能无法使用(例如未支付发票)。 +Feature=功能特色 +DolibarrLicense=授权 DolibarrProjectLeader=项目负责人 Developpers=开发商/贡献者 OtherDeveloppers=其他发展商/贡献者 -OfficialWebSite=Dolibarr国际官方网站 +OfficialWebSite=Dolibarr 国际官方网站 OfficialWebSiteFr=法国官方网站 -OfficialWikiFr=法语维基 -OfficialWiki=Dolibarr维基 +OfficialWiki=Dolibarr Wiki 上的文档 OfficialDemo=Dolibarr在线演示 -ForDocumentationSeeWiki=对于用户或开发人员的文件(文档,常见问题...),
看一看在Dolibarr维基看看:
%s的 -ForAnswersSeeForum=对于任何其他问题/帮助,您可以使用Dolibarr论坛:
%s的 -HelpCenterDesc1=这方面可以帮助你获得一个Dolibarr帮助支持服务。 -HelpCenterDesc2=一些服务的一部分,这是只有英文 。 -CurrentTopMenuHandler=目前的顶部菜单中的处理程序 -CurrentLeftMenuHandler=当前左菜单处理程序 +OfficialMarketPlace=官方市场提供外部模块/扩展 +OfficialWebHostingService=官方网页托管服务(云托管) +ForDocumentationSeeWiki=用户或开发人员用文档(文档,常见问题…),
参见 Dolibarr 百科:
%s +ForAnswersSeeForum=您有任何其他问题/帮助,可以到 Dolibarr 论坛:
%s +HelpCenterDesc1=此处可以帮助你获得 Dolibarr 帮助支持服务。 +HelpCenterDesc2=此服务的一些部分,仅有英文 可用。 +CurrentTopMenuHandler=当前顶部菜单的菜单处理程序 +CurrentLeftMenuHandler=当前左侧菜单的菜单处理程序 +CurrentMenuHandler=当前菜单处理程序 +CurrentSmartphoneMenuHandler=当前智能手机界面的菜单处理程序 MeasuringUnit=计量单位 Emails=电子邮件 EMailsSetup=电子邮件设置 -EMailsDesc=此页面允许您覆盖你的PHP参数电子邮件发送。在基于Unix / Linux操作系统,你的PHP安装程序是正确的,这些参数大多数情况下是无用的。 -MAIN_MAIL_SMTP_PORT=的SMTP / SMTPS端口(通过php.ini文件的默认位置:%s)的 -MAIN_MAIL_SMTP_SERVER=的SMTP / SMTPS主机(通过php.ini文件的默认位置:%s)的 -MAIN_MAIL_SMTP_PORT_NotAvailableOnLinuxLike=的SMTP / SMTPS港口(不定义为PHP的Unix类系统) -MAIN_MAIL_SMTP_SERVER_NotAvailableOnLinuxLike=的SMTP / SMTPS主机(不定义为PHP的Unix类系统) -MAIN_MAIL_EMAIL_FROM=发件人电子邮件(邮件自动电子邮件为php.ini文件的默认位置:%s)的 -MAIN_DISABLE_ALL_MAILS=禁用所有电子邮件sendings(用于测试目的或演示) -MAIN_MAIL_SENDMODE=方法用于发送电子邮件 -MAIN_MAIL_SMTPS_ID=如果需要验证的SMTP身份 -MAIN_MAIL_SMTPS_PW=如果需要验证的SMTP密码 -MAIN_MAIL_EMAIL_TLS=使用TLS(SSL)的加密 -FeatureNotAvailableOnLinux=功能不可用在Unix类系统。在本地测试您的sendmail程序。 +EMailsDesc=此页面允许您覆盖你的PHP电子邮件发送参数。通常在基于 Unix / Linux 的操作系统中,如果您的PHP安装程序正确,一般用不到这里的参数。 +MAIN_MAIL_SMTP_PORT=SMTP/SMTPS 端口 ( php.ini 文件中的默认值:%s) +MAIN_MAIL_SMTP_SERVER=SMTP/SMTPS 主机 ( php.ini 文件中的默认值:%s) +MAIN_MAIL_SMTP_PORT_NotAvailableOnLinuxLike=SMTP/SMTPS 端口 ( Unix 类系统下未在 PHP 中定义) +MAIN_MAIL_SMTP_SERVER_NotAvailableOnLinuxLike=SMTP/SMTPS 主机 ( Unix 类系统下未在 PHP 中定义) +MAIN_MAIL_EMAIL_FROM=系统电邮发件人 ( php.ini 文件中的默认值:%s) +MAIN_MAIL_ERRORS_TO=出错通知邮件使用的发件人地址 +MAIN_MAIL_AUTOCOPY_TO= BCC 所有发送邮件至 +MAIN_DISABLE_ALL_MAILS=禁用电邮发送功能 (用于测试目的或演示) +MAIN_MAIL_SENDMODE=电邮发送方法 +MAIN_MAIL_SMTPS_ID=SMTP ID,如果要求验证 +MAIN_MAIL_SMTPS_PW=SMTP 密码,如果要求验证 +MAIN_MAIL_EMAIL_TLS= 使用 TLS(SSL)加密 +MAIN_DISABLE_ALL_SMS=禁用所有短信发送(用于测试目的或演示) +MAIN_SMS_SENDMODE=短信发送方法 +MAIN_MAIL_SMS_FROM=发送短信的默认发件人号码 +FeatureNotAvailableOnLinux=功能在 Unix 类系统下不可用。请在本地测试您的sendmail程序。 +SubmitTranslation=如果您发现当前语言的翻译不完整或有误,您可以通过编辑langs/%s文件更正它,并将修改后的文件提交至 www.dolibarr.org 论坛。 ModuleSetup=模块设置 ModulesSetup=模块设置 ModuleFamilyBase=系统 -ModuleFamilyCrm=客户关系管理(CRM) +ModuleFamilyCrm=客户关系管理(CRM) ModuleFamilyProducts=产品管理 ModuleFamilyHr=人力资源管理 ModuleFamilyProjects=项目/协同工作 ModuleFamilyOther=其他 -ModuleFamilyTechnic=短期而言,模块工具 -ModuleFamilyExperimental=实验模块 -ModuleFamilyFinancial=财务模块(会计/库务) -ModuleFamilyECM=流脑 +ModuleFamilyTechnic=多模块工具 +ModuleFamilyExperimental=实验性模块 +ModuleFamilyFinancial=财务模块(会计/库务) +ModuleFamilyECM=电子内容管理(ECM) MenuHandlers=菜单处理程序 MenuAdmin=菜单编辑器 -ThisIsProcessToFollow=这是安装程序的过程: -StepNb=%s的步 -FindPackageFromWebSite=找到一个包,它提供的功能你要(对网站%s的例子)。 -DownloadPackageFromWebSite=下载包。 -UnpackPackageInDolibarrRoot=包文件解压到目录%Dolibarr本源 -SetupIsReadyForUse=安装完成并Dolibarr准备使用这一新的组成部分。 -CurrentVersion=Dolibarr当前版本 -CallUpdatePage=转到页更新的数据库结构和技术资料:%s的 -LastStableVersion=最后的稳定版本 -GenericMaskCodes=您可以输入任何编号面具。在这种面具,可以使用以下标记:
(000000)对应的第多少%递增将每个输入尽可能多的零作为计数器所需要的长度。该台将完成从左侧零,以便有像掩盖了很多零。
(000000)000以前的偏移量相同,但对应的编号,标志权的+ s的应用开始于第一个%
(000000 @ x)的前相同,但计数器被重置为0时,x是达到12个月(十介于1和)。如果使用此选项,x是2或更高,那么序列(yy)()或(西元年毫米)(毫米)也是必需的。
(日)天(01至31)。
()毫米 (01到12)。
(yy),(西元年)或()Ÿ超过2年,4个或1的数字。
-GenericMaskCodes2=()中交的客户端代码
(cccc000)n个字符的客户端代码的是跟一个客户端的裁判没有抵消柜台和柜台零化与全球性的。
()中的字符代码tttt N公司类型上(见dictionnary,公司类型)。
-GenericMaskCodes3=掩码中的所有其他字符将保持不变。
空间上都是不允许的。
-GenericMaskCodes4a=%例如在第99的S TheCompany 2007-01-31做第三者:
-GenericMaskCodes4b=例如关于2007年3月1日创建的第三方:
-GenericMaskCodes5=美国广播公司(yy)(毫米) - (000000)ABC0701 - 000099
(0000 +100)-打瞌睡/(日)/ xxx号0199-ZZZ/31/XXX -GenericNumRefModelDesc=返回一个可定制的数目是根据确定的面具。 -ServerAvailableOnIPOrPort=服务器可在地址%s%s的端口上 -ServerNotAvailableOnIPOrPort=服务器而不是可在地址港口%S对 -DoTestServerAvailability=测试服务器连接 -DoTestSend=发送测试 -DoTestSendHTML=测试发送HTML -ErrorCantUseRazInStartedYearIfNoYearMonthInMask=错误,不能使用选项@如果序列(yy)()或(西元年毫米)(毫米)是不是面具。 -UMask=umask的参数在Unix / Linux / BSD的文件系统的新文件。 -UMaskExplanation=此参数允许您定义,例如上载期间就Dolibarr服务器上创建文件的默认设置权限()。
它必须是八进制值(例如,0666就是为大家阅读和书写)。
这个参数是没有用的基于Windows的服务器。 -SeeWikiForAllTeam=采取的所有行动者及其组织的完整列表维基页面看看 -UseACacheDelay=在几秒钟内出口的缓存响应延迟(0或没有缓存为空) -DisableLinkToHelpCenter=隐藏链接“ 需要帮助或支持登录”页 -DisableLinkToHelp=隐藏链接“%s网上帮助 ”菜单 -AddCRIfTooLong=有没有自动换行,因此,如果行是出网页上的文件,因为太长了,你必须自己添加textarea的回车。 +DoNotUseInProduction=请勿用于生产环境 +ThisIsProcessToFollow=以下为软体的安装过程: +StepNb=第 %s 步骤 +FindPackageFromWebSite=搜索你需要的功能(例如在官方 %s )。 +DownloadPackageFromWebSite=下载软件包。 +UnpackPackageInDolibarrRoot=解压缩到 Dolibarr 的根目录 %s 下 +SetupIsReadyForUse=安装完成,Dolibarr 已可以使用此新组件。 +NotExistsDirect=未设置可选备用根目录。
+InfDirAlt=自 v3 开始,Dolibarr 可以定义备用根目录。这令您可以将插件和自定义模板保存至同一位置。
您只需在Dolibarr的根目录下创建一个目录(例如custom)。
+InfDirExample=
然后在 conf.php 中声明它
$dolibarr_main_url_root_alt='http://myserver/custom'
$dolibarr_main_document_root_alt='/path/of/dolibarr/htdocs/custom'
*这些行已存在,移除注释符"#"即可。 +YouCanSubmitFile=选择模块: +CurrentVersion=Dolibarr 当前版本 +CallUpdatePage=请到数据库的结构和数据更新页面:%s。 +LastStableVersion=最新的稳定版本 +GenericMaskCodes=您可自由设置格式掩码。在 %s 格式掩码中, 有如下计数标记可用:
{000000}表示按顺序递增的序号。序号位数与掩码中0的个数相同,不足自动补零,达最大值后自动归零。
{000000+000} 同上但 %s 起始序号从 + 后的数值记起。
{000000@x} 与第一种相同,但序号到X月时自动清零(x=1~12 、0=程序设置中的财年起始月、99=每月清零)。 如果使用此种掩码且 x >= 2 ,则必须同时使用日期掩码 {yy}{mm} 或 {yyyy}{mm}。
{dd} 天 (01~31)。
{mm} 月 (01~12)。
{yy}{yyyy}{y} 代表 2位, 4位 或 1 位年。

+GenericMaskCodes2={cccc} 客户代码
{cccc000} 客户代码ccc后跟客户引用序号000。
{tttt}> 公司类型代码。(参见公司类型的下拉菜单项目列表)。
+GenericMaskCodes3=其它非标记字符将维持不变。
不允许使用空格
+GenericMaskCodes4a=例如: 2007-01-31 第三方“TheCompany”的第99笔 %s :
+GenericMaskCodes4b=例如: 2007-03-1 建立的第三方公司:
+GenericMaskCodes4c=例如: 于 2007-03-1 建立的产品资讯:
+GenericMaskCodes5=格式掩码: ABC{yy}{mm}-{000000} 将生成编号 ABC0701-000099
格式掩码:{0000+100}-ZZZ/{dd}/XXX 将生成编号 0199-ZZZ/31/XXX +GenericNumRefModelDesc=根据事先定义的格式掩码,返回一个可定制编号,详见说明。 +ServerAvailableOnIPOrPort=可用服务器地址: %s:%s +ServerNotAvailableOnIPOrPort=服务器地址: %s:%s 不可用 +DoTestServerAvailability=测试服务器连通性 +DoTestSend=测试发送 +DoTestSendHTML=测试发送 HTML +ErrorCantUseRazInStartedYearIfNoYearMonthInMask=错误,格式掩码中标记 @ 必须与{yy}{mm}或{yyyy}{mm}同时使用。 +UMask=Unix/Linux/BSD 文件系统下新文件的 umask 参数。 +UMaskExplanation=定义服务器上 Dolibarr 创建文件的默认权限(例如上传的文件)。
它必须是八进制值(例如,0666就表示人人可读可写)。
此参数对Windows服务器无效。 +SeeWikiForAllTeam=全部行动者及其机构的完整列表参见wiki页面 +UseACacheDelay= 缓存导出响应的延迟时间(0或留空表示禁用缓存) +DisableLinkToHelpCenter=隐藏登陆页面中的“需要帮助或支持”链接 +DisableLinkToHelp=隐藏左侧菜单中的“%s 在线帮助 ” +AddCRIfTooLong=注意:没有自动换行功能,所以如果一行文字太长会超出纸张,请务必按下Enter键换行。 ModuleDisabled=模块禁用 -ModuleDisabledSoNoEvent=模块残疾人创造这样的事件从未 -ConfirmPurge=你确定要执行该清除?
这将删除绝对没有办法来恢复他们(马华文件的所有数据文件,附加文件...). +ModuleDisabledSoNoEvent=模块已禁用,所以事件从未创建 +ConfirmPurge=你确定要执行该清除?
这将删除所有数据文件,且无法恢复(ECM 文件,附件...)。 MinLength=最小长度 -LanguageFilesCachedIntoShmopSharedMemory=文件。郎加载到共享内存 -ExamplesWithCurrentSetup=与当前正在运行的安装实例 -ListOfDirectories=OpenDocument的名单模板目录 -NumberOfModelFilesFound=模板文件了ODT人数在这些目录中找到 -ExampleOfDirectoriesForModelGen=语法的例子:
ç:\ mydir
/首页/ mydir
DOL_DATA_ROOT /流脑/ ecmdir +LanguageFilesCachedIntoShmopSharedMemory=文件 .lang 已加载到共享内存 +ExamplesWithCurrentSetup=当前运行设置的实例 +ListOfDirectories=OpenDocument 文档模板目录清单 +ListOfDirectoriesForModelGenODT=请输入含有 OpenDocument 格式范本的目录字串。

1. 输入全名称路径。
2. 在每个目录项目之间加入 carriage return 字元。
3. 增加 GED 模块目录,如右:DOL_DATA_ROOT/ecm/yourdirectoryname

4. 在这些目录中的文件副档名必须是.odt。 +NumberOfModelFilesFound=这些目录中发现的 ODT 文档模板数量 +ExampleOfDirectoriesForModelGen=语法格式:
c:\mydir
/home/mydir
DOL_DATA_ROOT/ecm/ecmdir +FollowingSubstitutionKeysCanBeUsed=
要知道如何建立您的ODT文建范本,并储存在这些目录,请上读上 wiki 网站: +FullListOnOnlineDocumentation=http://wiki.dolibarr.org/index.php/Create_an_ODT_document_template +FirstnameNamePosition=姓 /名 位置顺序 +DescWeather=当事件逾期/延误达到以下数值范围时,主看版将显示如下图标: +KeyForWebServicesAccess=使用 SOAP 服务的密钥 (webservices 中的"dolibarrkey"参数) +TestSubmitForm=可在以下表单输入资料来测试 +ThisForceAlsoTheme=使用此菜单管理器将同时使用其主题,无论用户如何设置。同时此菜单管理器专为智能手机而设计但并不适用于所有手机。如果您的手机上使用有问题请选择其它主题。 +ThemeDir=主题目录 +ConnectionTimeout=连接超时 +ResponseTimeout=响应超时 +SmsTestMessage=测试消息从 __PHONEFROM__ 至 __ PHONETO__ +ModuleMustBeEnabledFirst=使用此功能前必须启用模块%s。 +SecurityToken=保护URL链接的密钥 +NoSmsEngine=无短信发送管理程序可用。SMS sender manager are not installed with default distribution (because they depends on an external supplier) but you can find some on %s +PDF=PDF格式 +PDFDesc=你可以设置PDF生成有关的每个全局选项 +PDFAddressForging=PDF 中地址生成规则 +HideAnyVATInformationOnPDF=生成的PDF中隐藏所有有关增值税的信息 +HideDescOnPDF=生成 PDF 中隐藏产品描述信息 +HideRefOnPDF=隐藏生成 PDF 中的产品编号 +HideDetailsOnPDF=隐藏生成的 PDF 中的产品行信息 +Library=Library +UrlGenerationParameters=URL地址的保护参数 +SecurityTokenIsUnique=为每个URL使用独特的securekey参数 +EnterRefToBuildUrl=输入对象 %s 的编号 +GetSecuredUrl=获取算得的URL地址 +ButtonHideUnauthorized=隐藏无权限操作的按钮,而非禁用。 +ProductVatMassChange=批量修改增值税(VAT) +ProductVatMassChangeDesc=此页面可用来修改产品或服务的增值税(VAT)。警告,此操作将影响整个数据库。 +OldVATRates=以前的增值税率(VAT) +NewVATRates=新建增值税率(VAT) +PriceBaseTypeToChange=修改设置了基本参考价值的产品的价格/ base reference value +MassConvert=执行批量转换 +String=字符串 +TextLong=长文本 +Int=整数值 +Float=小数值 +DateAndTime=日期与小时 +Unique=唯一 +Boolean=布尔值 (复选框) +ExtrafieldPhone = 电话 +ExtrafieldPrice = 定价 +ExtrafieldMail = 电邮 +ExtrafieldSelect = 选择列表 +ExtrafieldSelectList = 从表格中选取 +ExtrafieldSeparator=分隔符 +ExtrafieldCheckBox=复选框 +ExtrafieldRadio=单选框 +ExtrafieldParamHelpselect=Parameters list have to be like key,value

for exemple :
1,value1
2,value2
3,value3
... +ExtrafieldParamHelpcheckbox=Parameters list have to be like key,value

for exemple :
1,value1
2,value2
3,value3
... +ExtrafieldParamHelpradio=Parameters list have to be like key,value

for exemple :
1,value1
2,value2
3,value3
... +ExtrafieldParamHelpsellist=Parameters list have come from table

for exemple :
c_typent:libelle:id
+LibraryToBuildPDF=Library used to build PDF +WarningUsingFPDF=Warning: Your conf.php contains directive dolibarr_pdf_force_fpdf=1. This means you use the FPDF library to generate PDF files. This library is old and does not support a lot of features (Unicode, image transparency, cyrillic, arab and asiatic languages, ...), so you may experience errors during PDF generation.
To solve this and have a full support of PDF generation, please download TCPDF library, then comment or remove the line $dolibarr_pdf_force_fpdf=1, and add instead $dolibarr_lib_TCPDF_PATH='path_to_TCPDF_dir' +LocalTaxDesc=在一些国家,每个发票行有 2 或 3 项税。如果是这样,请选择第二和第三项税的类型及税率。Possible type are:
1 : local tax apply on products and services without vat (vat is not applied on local tax)
2 : local tax apply on products and services before vat (vat is calculated on amount + localtax)
3 : local tax apply on products without vat (vat is not applied on local tax)
4 : local tax apply on products before vat (vat is calculated on amount + localtax)
5 : local tax apply on services without vat (vat is not applied on local tax)
6 : local tax apply on services before vat (vat is calculated on amount + localtax) +SMS=SMS +LinkToTestClickToDial=Enter a phone number to call to show a link to test the ClickToDial url for user %s +RefreshPhoneLink=刷新链接 +LinkToTest=Clickable link generated for user %s (click phone number to test) +KeepEmptyToUseDefault=不填表示使用默认值 +DefaultLink=默认链接 +ValueOverwrittenByUserSetup=警告,此设置可能被用户设置所覆盖(用户可以设置各自的click2dial链接) + +# Modules Module0Name=用户和组 Module0Desc=用户和组管理 Module1Name=第三方 -Module1Desc=公司和联系人的管理 -Module2Name=商业 -Module2Desc=商业管理 +Module1Desc=公司和联络人管理(客户、潜在客户...) +Module2Name=商业交易 +Module2Desc=交易管理 Module10Name=会计 -Module10Desc=简单的会计管理(发票和付款调度) -Module20Name=建议 -Module20Desc=商业建议的管理 -Module22Name=大众电子邮购 -Module22Desc=大规模电子邮件发送的管理 -Module23Name=能源 -Module23Desc=监测的能源消费 -Module25Name=客户订单 -Module25Desc=客户订单的管理 -Module30Name=发票 -Module30Desc=发票和信用音符的管理客户。发票的管理供应商 +Module10Desc=根据数据库内容生成的简易会计报告 (日报, 营业额)。无外部数据对接. +Module20Name=报价 +Module20Desc=报价单管理 +Module22Name=群发电邮 +Module22Desc=电子邮件群发的管理 +Module23Name= 能耗 +Module23Desc= 能耗监测 +Module25Name=销售订单 +Module25Desc=销售订单管理 +Module30Name=付款明细 +Module30Desc=客户发票和票据管理供应商发票管理 Module40Name=供应商 -Module40Desc=供应商的管理和购买(订单和发票) +Module40Desc=供应商的管理和采购的管理(订单和发票) Module42Name=系统日志 -Module42Desc=测井设备(系统日志) -Module49Name=编辑 +Module42Desc=日志系统(文件、系统日志...) +Module49Name=编辑器 Module49Desc=编辑器的管理 Module50Name=产品 Module50Desc=产品的管理 -Module51Name=大量邮件 -Module51Desc=群众邮寄文件的管理 -Module52Name=股票 -Module52Desc=库存的管理产品 +Module51Name=批量邮寄 +Module51Desc=批量邮寄文件的管理 +Module52Name=库存 +Module52Desc=产品库存的管理 Module53Name=服务 Module53Desc=服务的管理 Module54Name=合同 @@ -316,321 +417,383 @@ Module55Name=条码 Module55Desc=条码的管理 Module56Name=电话 Module56Desc=电话整合 -Module57Name=常年订单 -Module57Desc=常委会订单和退出的管理 -Module58Name=ClickToDial -Module58Desc=ClickToDial一体化 +Module57Name=长期订单 +Module57Desc=长期订单和提款管理 +Module58Name=单击拨号 +Module58Desc=单击拨号系统集成(Asterisk ...) Module59Name=Bookmark4u -Module59Desc=添加函数生成一个Dolibarr帐户Bookmark4u帐户 +Module59Desc=添加函数从一个Dolibarr帐户生成一个Bookmark4u帐户 Module70Name=干预 Module70Desc=干预的管理 -Module75Name=费用和旅游笔记 -Module75Desc=费用和旅游音符的管理 -Module80Name=Sendings -Module80Desc=Sendings和交付订单的管理 +Module75Name=差旅费用记录 +Module75Desc=费用和差旅记录的管理 +Module80Name=发货 +Module80Desc=发货单和交货单的管理 Module85Name=银行及现金 -Module85Desc=银行账户或现金管理 -Module200Name=LDAP的 +Module85Desc=银行或现金帐户管理 +Module100Name=外部站点 +Module100Desc=此模块添加外部网站链接或页面到 Dolibarr 的菜单或页面框架中 +Module105Name=Mailman 及 SPIP +Module105Desc=成员模块的 Mailman 或 SPIP 接口 +Module200Name=LDAP Module200Desc=LDAP目录同步 Module210Name=PostNuke -Module210Desc=PostNuke一体化 -Module240Name=出口数据 -Module240Desc=工具出口景致与助理Dolibarr() -Module250Name=进口数据 -Module250Desc=进口Dolibarr工具景致(与助理) +Module210Desc=PostNuke 整合 +Module240Name=数据导出 +Module240Desc=用来导出数据的工具 +Module250Name=数据导入 +Module250Desc=用来导入数据的工具 Module310Name=成员 Module310Desc=基金会成员管理 -Module320Name=RSS馈送 -Module320Desc=添加RSS饲料内Dolibarr屏幕页面 +Module320Name=RSS 源 +Module320Desc=添加 RSS 源至 Dolibarr 主屏幕页面 Module330Name=书签 Module330Desc=书签的管理 Module400Name=项目 -Module400Desc=项目的其他模块内部管理 +Module400Desc=在其他模块内部的管理项目 Module410Name=Webcalendar -Module410Desc=Webcalendar一体化 -Module500Name=税,社会贡献和股息 +Module410Desc=Webcalendar 整合 +Module500Name=税、保险、红利、股息管理 Module500Desc=税收和社会贡献的管理 Module600Name=通知 -Module600Desc=由一些商业活动的电子邮件发送Dolibarr通知给第三方的交往 +Module600Desc=当系统中一些商业事件发生时,通过电邮通知第三方联系人。 Module700Name=捐赠 Module700Desc=捐款的管理 -Module800Name=直接档由数据库访问 -Module800Desc=通过界面显示直接数据库访问oscommerce的店铺或OSCSS -Module900Name=被档由 -Module900Desc=界面显示一个通过Web服务oscommerce的商店。此模块requiere您安装/ oscommerce_ws / ws_server到您oscommerce的服务器组件。查看自述文件/ oscommerce_ws / ws_server。 -Module1200Name=螂 -Module1200Desc=螳螂一体化 +Module800Name=OSCommerce (通过直接数据库访问) +Module800Desc=通过直接访问其数据库,在界面中显示 OSCommerce 或 OSCSS 店铺 +Module900Name=OSCommerce by WS +Module900Desc=Interface to show an OSCommerce shop via Web services. This module requiere you to install components from /oscommerce_ws/ws_server into your OSCommerce server. See README file in /oscommerce_ws/ws_server. +Module1200Name=Mantis +Module1200Desc=Mantis 整合 Module1400Name=会计 -Module1400Desc=会计管理(双方) +Module1400Desc=会计管理(双方) Module1780Name=分类 -Module1780Desc=的类别:管理层(产品,供应商和客户) -Module2000Name=fckeditor的 -Module2000Desc=所见即所得的编辑器 -Module2400Name=议程 -Module2400Desc=行动/任务和议程管理 +Module1780Desc=分类的管理(产品、供应商和客户) +Module2000Name=所见即所得编辑器 +Module2000Desc=允许在一些文本编辑区中使用所见即所得编辑器 +Module2300Name=Cron +Module2300Desc=任务排程管理 +Module2400Name=日程 +Module2400Desc=事件/任务和日程管理 Module2500Name=电子内容管理 Module2500Desc=保存和共享文件 -Module2600Name=的WebServices -Module2600Desc=启用Web服务的服务器Dolibarr -Module2700Name=的Gravatar -Module2700Desc=使用网上的Gravatar服务(www.gravatar.com),以显示/成员(与他们的电子邮件用户发现照片)。需要一个互联网接入 -Module2900Name=GeoIPMaxmind -Module2900Desc=geoip的Maxmind转换能力 +Module2600Name= SOAP WebServices +Module2600Desc= 启用 Dolibarr Web 服务的服务器 +Module2700Name= Gravatar +Module2700Desc= 使用网上的 Gravatar 服务(www.gravatar.com),显示 用户/成员的头像(通过电邮搜索)。需要互联网连接。 +Module2800Desc=FTP 客户端 +Module2900Name= GeoIPMaxmind +Module2900Desc= Maxmind geoip 数据库的转换能力 Module5000Name=多公司 Module5000Desc=允许你管理多个公司 -Module10000Name=PayBox -Module10000Desc=模块提供了一个用信用卡网上支付卡与PayBox页 -Module50100Name=销售点 -Module50100Desc=销售点模块 -Permission11=阅读发票 -Permission12=创建发票 -Permission14=验证发票 -Permission15=通过电子邮件发送发票 -Permission16=创建发票付款 -Permission19=删除发票 -Permission21=了解商业的建议 -Permission22=创建/修改商业建议 -Permission24=验证商业建议 -Permission25=发送商业建议 -Permission26=商业建议关闭 -Permission27=商业建议删除 -Permission28=出口商业建议 -Permission31=了解产品 -Permission32=创建/修改产品 -Permission34=删除产品 -Permission38=出口产品 -Permission41=阅读项目(共享的项目和项目我联系) -Permission42=创建/修改项目(共享的项目和项目我联系) -Permission44=删除项目(共享的项目和项目我联系) +Module20000Name=休假 +Module20000Desc=声明和跟踪聘员休假 +Module50000Name=出纳 +Module50000Desc=模块通过 PayBox 提供信用卡网上支付页面 +Module50100Name=POS +Module50100Desc=POS 模块 +Module50200Name= Paypal +Module50200Desc= 模块提供信用卡与Paypal网上支付页面 +Module59000Name=利润空间 +Module59000Desc=利润空间管理模块 +Module60000Name=佣金 +Module60000Desc=佣金管理模块 +Permission11=读取客户发票 +Permission12=创建修改客户发票 +Permission13=重新起草付款明细(销售) +Permission14=确认付款明细(销售) +Permission15=通过电邮发送发票 +Permission16=为付款明细(销售)建立支付记录 +Permission19=删除付款明细(销售) +Permission21=读取报价单 +Permission22=建立/修改报价单 +Permission24=确认报价单 +Permission25=发送报价单 +Permission26=关闭报价单 +Permission27=删除报价单 +Permission28=导出报价单 +Permission31=读取产品信息 +Permission32=建立/修改产品信息 +Permission34=删除产品信息 +Permission36=查看/管理隐藏产品 +Permission38=导出产品信息 +Permission41=读取项目(共享项目和我参与的项目) +Permission42=建立/修改项目(共享项目和我参与的项目) +Permission44=删除项目(共享项目和参与的项目) Permission61=阅读干预 -Permission62=创建/修改干预 +Permission62=建立/修改干预 Permission64=删除干预 -Permission67=出口干预措施 +Permission67=导出干预措施 Permission71=阅读成员 -Permission72=创建/修改成员 +Permission72=建立/修改成员 Permission74=删除成员 Permission75=安装类型和成员属性 -Permission76=出口达塔斯 +Permission76=导出数据 Permission78=阅读订阅 -Permission79=创建/修改订阅 -Permission81=了解客户的订单 -Permission82=创建/修改客户的订单 -Permission84=验证客户的订单 -Permission86=客户发送订单 -Permission87=关闭客户的订单 -Permission88=客户取消订单 -Permission89=删除客户订单 +Permission79=建立/修改订阅 +Permission81=读取商业订单 +Permission82=建立/修改商业订单 +Permission84=确认商业订单 +Permission86=发送商业订单 +Permission87=关闭商业订单 +Permission88=取消商业订单 +Permission89=删除商业订单 Permission91=了解社会的贡献和增值税 -Permission92=创建/修改的社会贡献和增值税 -Permission93=删除的社会贡献和增值税 -Permission94=出口社会贡献 +Permission92=建立/修改的社会贡献和增值税 +Permission93=删除社会贡献和增值税 +Permission94=导出社会贡献 Permission95=阅读报告 -Permission96=安装调度 -Permission97=了解会计调度发票 +Permission96=设置调度 +Permission97=了解发票的会计调度 Permission98=调度发票的会计行 -Permission101=阅读sendings -Permission102=创建/修改sendings -Permission104=验证sendings -Permission109=删除sendings +Permission101=读取发货资讯 +Permission102=建立/修改发货单 +Permission104=确认发货单 +Permission106=导出发货单 +Permission109=删除发货单 Permission111=阅读财务帐目 -Permission112=创建/修改/删除和比较交易 -Permission113=安装程序(创建,管理类financiel帐户) +Permission112=建立/修改/删除和比较交易 +Permission113=设置财务账户(建立,管理类别) Permission114=合并交易 -Permission115=出口交易和帐户报表 +Permission115=导出交易和帐户报表 Permission116=帐户之间转帐 -Permission117=检查调度管理 -Permission121=阅读与第三方用户 -Permission122=创建/修改与用户第三者 -Permission125=删除第三方链接到用户 -Permission126=出口第三者 -Permission141=阅读任务 -Permission142=创建/修改任务 -Permission144=删除任务 -Permission146=阅读者 +Permission117=支票调度管理 +Permission121=读取与用户相关联的第三方的信息 +Permission122=建立/修改与用户相关联的第三方的信息 +Permission125=删除与用户相关联的第三方的信息 +Permission126=导出第三方信息 +Permission141=阅读项目(以及用户未参与的个人项目) +Permission142=建立/修改项目(以及用户未参与的个人项目) +Permission144=删除任务(以及用户未参与的个人项目) +Permission146=读取供应商 Permission147=读统计 Permission151=阅读常年订单 -Permission152=安装常年订单 +Permission152=创建/修改常年订单请求 Permission153=阅读常年订单收据 -Permission161=看看合同 -Permission162=创建/修改合约 -Permission163=启动了一个服务合同 -Permission164=禁用服务的合同 +Permission154=信贷/拒绝站在订单收据 +Permission161=读取合同 +Permission162=建立/修改服务合同 +Permission163=启动服务合同 +Permission164=禁用服务合同 Permission165=删除合同 -Permission171=阅读人次 -Permission172=创建/修改行程 -Permission173=删除人次 -Permission178=出口旅行 -Permission180=了解供应商 -Permission181=了解供应商的订单 -Permission182=创建/修改供应商的订单 -Permission183=验证供应商的订单 -Permission184=核准供应商的订单 -Permission185=令供应商的订单 -Permission186=接收供应商的订单 -Permission187=关闭供应商的订单 -Permission188=取消供应商的订单 -Permission192=创建行 -Permission193=取消行 -Permission194=阅读带宽线路 -Permission202=建立ADSL连接 -Permission203=为了连接订单 -Permission204=为了连接 +Permission171=阅读差旅记录 +Permission172=建立/修改差旅记录 +Permission173=删除差旅记录 +Permission178=导出差旅记录 +Permission180=读取供应商资讯 +Permission181=读取采购订单 +Permission182=建立/修改采购订单 +Permission183=确认供采购订单 +Permission184=批准采购订单 +Permission185=整理采购订单 +Permission186=接收采购订单 +Permission187=关闭采购订单 +Permission188=取消采购订单 +Permission192=添加线路 +Permission193=取消线路 +Permission194=读取带宽行 +Permission202=创建 ADSL 连接 +Permission203=订立连接订单 +Permission204=订购连接 Permission205=管理连接 -Permission206=阅读连接 -Permission211=阅读电话 -Permission212=订单行 -Permission213=激活线 +Permission206=读取连接 +Permission211=读取电话 +Permission212=订购线路 +Permission213=激活线路 Permission214=安装电话 Permission215=安装商 -Permission221=阅读emailings -Permission222=创建/修改emailings(主题,收件人...) -Permission223=验证emailings(允许发送) -Permission229=删除emailings -Permission231=确定付款方式 -Permission232=创建/修改供应商发票 -Permission233=验证供应商发票 -Permission234=删除供应商发票 -Permission236=出口供应商发票 -Permission241=阅读分类 -Permission242=创建/修改分类 -Permission243=删除类别 -Permission244=看到隐藏的内容类别 -Permission251=阅读其他用户和组 -Permission252=创建/修改其他用户,组和permisssions -Permission253=修改其他用户的密码 -Permission254=其他用户删除或禁用 -Permission255=创建/修改自己的用户信息 -Permission256=修改自己的密码 -Permission258=导出用户 -Permission261=访问商业菜单 -Permission262=扩展访问所有的第三方(不只是与用户的人)。没有有效的外部用户(总是有限的给自己)。 -Permission271=正读 +Permission221=阅读邮件 +Permission222=建立/修改邮件(主题,收件人,,,) +Permission223=确认邮寄(允许发送) +Permission229=删除邮件 +Permission237=查看收件人及信息 +Permission238=手动发送邮件 +Permission239=验证或发送后删除邮件记录 +Permission241=读取分类 +Permission242=建立/修改分类 +Permission243=删除分类 +Permission244=查看隐藏类别的内容 +Permission251=读取其他用户和群组资讯 +PermissionAdvanced251=阅读其他用户 +Permission252=读取其他用户的使用权限 +Permission253=建立/修改其他用户、群组资讯及其权限 +PermissionAdvanced253=创建/修改内部/外部用户和权限 +Permission254=只能建立/修改外部用户资讯 +Permission255=修改其他用户密码 +Permission256=删除或暂时关闭其他用户 +Permission262=扩展权限到所有第三方(不仅限于与此账户相关联的单位)。对外单位用户无效(他们始终只能访问自己的信息)。 +Permission271=读取 CA Permission272=阅读发票 -Permission273=发票问题 -Permission281=读往来 -Permission282=创建/修改联系人 -Permission283=删除联系人 -Permission286=导出联系人 -Permission291=阅读关税 -Permission292=关于关税设置权限 -Permission293=修改关税的costumers -Permission300=条形码阅读 -Permission301=创建/修改条形码 -Permission302=删除条形码 +Permission273=开具发票 +Permission281=读取联络人资讯 +Permission282=建立/修改联络人资讯 +Permission283=删除联络人资讯 +Permission286=导出联络人资讯 +Permission291=读取关税 +Permission292=设置关税权限 +Permission293=修改客户关税 +Permission300=读取条码 +Permission301=建立/修改条码 +Permission302=删除条码 Permission311=阅读服务 -Permission312=指定的服务合约 +Permission312=指派服务到合同 Permission331=阅读书签 -Permission332=创建/修改书签 +Permission332=建立/修改书签 Permission333=删除书签 -Permission401=阅读折扣 -Permission402=创建/修改折扣 -Permission403=验证折扣 +Permission341=阅读自己的权限 +Permission342=建立/修改自己的资讯 +Permission343=修改自己的密码 +Permission344=修改自己的权限 +Permission351=阅读群体 +Permission352=阅读组的权限 +Permission353=建立/修改组 +Permission354=删除或禁用组 +Permission358=汇出用户资讯 +Permission401=读取折扣 +Permission402=建立/修改折扣 +Permission403=确认折扣 Permission404=删除折扣 Permission531=阅读服务 -Permission532=创建/修改服务 +Permission532=建立/修改服务 Permission534=删除服务 -Permission538=出口服务 -Permission701=阅读捐款 -Permission702=创建/修改捐款 -Permission703=删除捐款 -Permission1001=了解股票 -Permission1002=创建/修改股票 -Permission1003=删除股票 -Permission1004=了解股票的走势 -Permission1005=创建/修改股票走势 -Permission1101=阅读交货订单 -Permission1102=创建/修改交货订单 -Permission1104=验证交货订单 +Permission536=查看/隐藏服务管理 +Permission538=导出服务 +Permission701=读取捐款资讯 +Permission702=建立/修改捐款资讯 +Permission703=删除捐款资讯 +Permission1001=读取库存资讯 +Permission1002=建立/修改库存资讯 +Permission1003=删除库存资讯 +Permission1004=读取库存的转让资讯 +Permission1005=建立/修改库存转让 +Permission1101=读取交货订单 +Permission1102=建立/修改交货订单 +Permission1104=确认交货订单 Permission1109=删除交货订单 -Permission1181=了解供应商 -Permission1182=了解供应商的订单 -Permission1183=建立供应商的订单 -Permission1184=验证供应商的订单 -Permission1185=核准供应商的订单 -Permission1186=订购/取消供应商的订单 -Permission1187=确认收到供应商的订单 -Permission1188=关闭供应商的订单 -Permission1201=结果得到一个出口 -Permission1202=创建/修改一个出口 -Permission1231=了解供应商发票 -Permission1232=创建供应商发票 -Permission1233=验证供应商发票 -Permission1234=删除供应商发票 -Permission1236=出口供应商发票,属性和付款 -Permission1251=进入数据库的外部数据(数据加载运行质量进口) -Permission1321=出口发票的客户,属性和付款 -Permission1421=出口客户订单和属性 -Permission2401=阅读的行动(事件或任务)链接到其户口 -Permission2402=创建/修改行动(事件或任务)链接到其户口 -Permission2403=(事件或任务)与他的帐户删除操作 -Permission2411=阅读的行动(事件或任务)他人 -Permission2412=创建/修改行动(事件或任务)的人 -Permission2413=(事件或任务)删除他人行动 -Permission2501=阅读文件 -Permission2502=提交或删除文件 -Permission2515=安装文件的目录 +Permission1181=读取供应商资讯 +Permission1182=读取采购订单 +Permission1183=建立/修改采购订单 +Permission1184=确认供采购订单 +Permission1185=批准采购订单 +Permission1186=整理采购订单 +Permission1187=通知供应商已收货 +Permission1188=删除采购订单 +Permission1201=取得导出结果 +Permission1202=建立/修改导出信息 +Permission1231=读取采购付款明细 +Permission1232=建立/修改采购付款明细 +Permission1233=确认采购付款明细 +Permission1234=删除采购付款明细 +Permission1235=通过电邮发送采购发票 +Permission1236=导出供应商发票、属性及其付款资讯 +Permission1237=导出采购订单及其详情 +Permission1251=导入大量外部数据到数据库(载入资料) +Permission1321=导出销售发票、属性及其付款资讯 +Permission1421=导出销售订单及属性资讯 +Permission23001 = 阅读排程的任务 +Permission23002 = 创建/更新排程的任务 +Permission23003 = 删除排程的任务 +Permission23004 = 执行排程的任务 +Permission2401=读取关联至此用户账户的动作(事件或任务) +Permission2402=建立/修改关联至此用户账户的动作(事件或任务) +Permission2403=删除关联至此用户账户的动作(事件或任务) +Permission2411=阅读他人账户的动作(事件或任务) +Permission2412=建立/修改他人账户的动作(事件或任务) +Permission2413=删除他人的动作(事件或任务) +Permission2501=阅读/下载文档 +Permission2502=提交或删除文档 +Permission2503=提交或删除的文件 +Permission2515=设置文档目录 +Permission2801=允许FTP客户端读取(仅供浏览和下载) +Permission2802=允许FTP客户端写入(删除和上传文件) +Permission50101=启用 POS +Permission50201= 读取交易 +Permission50202= 进口交易 DictionnaryCompanyType=公司类型 -DictionnaryCompanyJuridicalType=公司法人种 -DictionnaryProspectLevel=展望潜在水平 -DictionnaryCanton=国家/州 +DictionnaryCompanyJuridicalType=公司法律类型 +DictionnaryProspectLevel=潜在开发潜力 +DictionnaryCanton=州/省 DictionnaryRegion=地区 DictionnaryCountry=国家 -DictionnaryCurrency=货币 -DictionnaryCivility=文明称号 -DictionnaryActions=操作列表 +DictionnaryCurrency=币别 +DictionnaryCivility=称谓 +DictionnaryActions=日程事件类型 DictionnarySocialContributions=社会捐助类型 -DictionnaryVAT=增值税率 +DictionnaryVAT=增值税或销售税税率 +DictionnaryRevenueStamp=印花税总额 DictionnaryPaymentConditions=付款条件 DictionnaryPaymentModes=付款方式 -DictionnaryTypeContact=联系类型 -DictionnaryEcotaxe=Ecotax指令(WEEE) -DictionnaryPaperFormat=文件格式 +DictionnaryTypeContact=联络人/地址类型 +DictionnaryEcotaxe=Ecotax 指令 (WEEE) +DictionnaryPaperFormat=纸张格式 DictionnaryFees=收费类型 -DictionnarySendingMethods=Sendings方法 -DictionnaryStaff=员工 -SetupSaved=保存设置 +DictionnarySendingMethods=发货方式 +DictionnaryStaff=员工人数 +DictionnaryAvailability=交付迟延 +DictionnaryOrderMethods=排列方法 +DictionnarySource=订单来源方式 +DictionnaryAccountancyplan=账户图表 +DictionnaryAccountancysystem=账户图表模块 +SetupSaved=设定值已储存 BackToModuleList=返回模块列表 -BackToDictionnaryList=回到词典列表 -VATReceivedOnly=特别率不收费 +BackToDictionnaryList=回到设定选项列表 +VATReceivedOnly=特殊税种未收取 VATManagement=增值税管理 -VATIsUsedDesc=默认情况下,增值税率创造前景时,发票,订单等后续活动的标准规定:
如果卖方遭受增值税,那么默认值= 0增值税。结束统治。
如果(国家=购买国出售),则默认增值税=销售的国产品的增值税。结束统治。
如果卖方和买方欧洲共同体和货物运输销售有新的手段(车,船,飞机),默认的增值税= 0(应支付的增值税在他的国家customoffice买方和卖方在不)。结束统治。
如果卖方在欧洲共同体和交通工具,而不是其他方式的新途径出售的商品,则默认增值税=产品增值税买方出售。结束统治。
其他建议的默认增值税= 1。结束统治。 -VATIsNotUsedDesc=默认情况下,建议的增值税为0,可用于像协会的情况下才使用,个人欧小型公司。 -VATIsUsedExampleFR=在法国,这意味着公司或机构有真正的财政体制(简体真实的或正常的真实)。在其中一个增值税申报制度。 -VATIsNotUsedExampleFR=在法国,这意味着协会,都是非增值税申报或公司,组织或已选择了微型企业会计制度(特许增值税)和申报缴纳增值税没有任何专利权增值税自由职业者。这一选择将显示“的提法不适用增值税 - 发票上的艺术的CGI 293B”。 -LocalTax1ManagementES=稀土管理 -LocalTax1IsUsedDescES=默认情况下,稀土率在创建前景,发票,订单等后续活动的标准规定:
如果德买方没有受到稀土,稀土默认= 0。结束统治。
如果买方是受再然后在默认情况下可再生能源。结束统治。
-LocalTax1IsNotUsedDescES=默认情况下,建议重为0。结束统治。 -LocalTax1IsUsedExampleES=在西班牙,他们是专业人士受西班牙误差性能指标的某些具体的条文。 -LocalTax1IsNotUsedExampleES=在西班牙,他们是专业和社会,受到了西班牙误差性能指标的某些章节。 -LocalTax2ManagementES=IRPF管理 -LocalTax2IsUsedDescES=默认情况下,稀土率在创建前景,发票,订单等后续活动的标准规定:
如果卖方没有受到IRPF,然后IRPF默认= 0。结束统治。
如果卖方遭受IRPF则默认IRPF。结束统治。
-LocalTax2IsNotUsedDescES=默认情况下,建议IRPF为0。结束统治。 -LocalTax2IsUsedExampleES=在西班牙,自由职业者,谁提供服务,谁选择了模块税务系统公司独立专业人士。 -LocalTax2IsNotUsedExampleES=在西班牙他们bussines不缴税的模块系统。 -LabelUsedByDefault=默认情况下使用标签,如果没有翻译,可找到的代码 -LabelOnDocuments=标签上的文件 -NbOfDays=铌天 +VATIsUsedDesc=默认情况下,增值税率在创建报价、发票或订单时遵循当前标准规则:
如果卖方如果卖方无需缴纳VAT,VAT默认=0。规则结束。
内贸,默认VAT默认=卖方国家的VAT。规则结束。
如果买卖双方同处欧盟成员国VAT策略见英文界面。规则结束。规则结束。规则结束。
其它情况默认VAT=0。规则结束。 +VATIsNotUsedDesc=默认情况下,建议的营业税为0,可用于像协会、个人或小公司。 +VATIsUsedExampleFR=In France, it means companies or organisations having a real fiscal system (Simplified real or normal real). A system in which VAT is declared. +VATIsNotUsedExampleFR=In France, it means associations that are non VAT declared or companies, organisations or liberal professions that have chosen the micro enterprise fiscal system (VAT in franchise) and paid a franchise VAT without any VAT declaration. This choice will display the reference "Non applicable VAT - art-293B of CGI" on invoices. +##### Local Taxes ##### +LocalTax1IsUsed=使用第二项税率 +LocalTax1IsNotUsed=不使用第二项税率 +LocalTax1IsUsedDesc=使用其它类型税率(非增值税VAT) +LocalTax1IsNotUsedDesc=不使用其它类型税率(非增值税VAT) +LocalTax1Management=第二项税类型 +LocalTax1IsUsedExample= +LocalTax1IsNotUsedExample= +LocalTax2IsUsed=使用第三项税 +LocalTax2IsNotUsed=不使用第三项税 +LocalTax2IsUsedDesc=使用其它税率类型(非增值税VAT) +LocalTax2IsNotUsedDesc=不使用其它类型税率(非增值税VAT) +LocalTax2Management=第三项税类型 +LocalTax2IsUsedExample= +LocalTax2IsNotUsedExample= +LocalTax1ManagementES= RE 管理(大陆不适用) +LocalTax1IsUsedDescES= The RE rate by default when creating prospects, invoices, orders etc follow the active standard rule:
If te buyer is not subjected to RE, RE by default=0. End of rule.
If the buyer is subjected to RE then the RE by default. End of rule.
+LocalTax1IsNotUsedDescES= By default the proposed RE is 0. 规则结束。 +LocalTax1IsUsedExampleES= In Spain they are professionals subject to some specific sections of the Spanish IAE. +LocalTax1IsNotUsedExampleES= In Spain they are professional and societies and subject to certain sections of the Spanish IAE. +LocalTax2ManagementES= IRPF 管理(大陆不适用) +LocalTax2IsUsedDescES= The RE rate by default when creating prospects, invoices, orders etc follow the active standard rule:
If the seller is not subjected to IRPF, then IRPF by default=0. End of rule.
If the seller is subjected to IRPF then the IRPF by default. End of rule.
+LocalTax2IsNotUsedDescES= By default the proposed IRPF is 0. 规则结束。 +LocalTax2IsUsedExampleES= In Spain, freelancers and independent professionals who provide services and companies who have chosen the tax system of modules. +LocalTax2IsNotUsedExampleES= In Spain they are bussines not subject to tax system of modules. +LabelUsedByDefault=如果代码没有翻译则默认使用以下标签 +LabelOnDocuments=文档中的标签 +NbOfDays=天数 AtEndOfMonth=月末 -Offset=抵销 -AlwaysActive=始终活跃 -UpdateRequired=您的系统需要更新。要做到这一点,点击立即更新 。 +Offset=Offset +AlwaysActive=始终启用 +UpdateRequired=您的系统需要更新。要更新,请点击 立即更新。 Upgrade=升级 MenuUpgrade=升级/扩展 -AddExtensionThemeModuleOrOther=添加扩展名(主题,模块,...) -WebServer=Web服务器 -DocumentRootServer=Web服务器的根目录 +AddExtensionThemeModuleOrOther=添加扩展(主题、模块...) +WebServer=网页服务器 +DocumentRootServer=网页服务器的根目录 DataRootServer=数据文件的目录 -IP=知识产权 -Port=港口 +IP=IP 地址 +Port=端口 VirtualServerName=虚拟服务器名称 AllParameters=所有参数 OS=操作系统 -PhpEnv=包膜 +PhpEnv=PHP运行环境 PhpModules=模块 -PhpConf=机密档案 -PhpWebLink=网络PHP的链接 -Pear=梨 -PearPackages=梨的软件包 +PhpConf=PHP 配置参数 +PhpWebLink=PHP 网路连结 +Pear=PEAR +PearPackages=PEAR 软件包 +Browser=浏览器 +Server=服务器 Database=数据库 DatabaseServer=数据库主机 DatabaseName=数据库名称 @@ -641,636 +804,629 @@ DatabaseConfiguration=数据库设置 Tables=表 TableName=表名称 TableLineFormat=行格式 -NbOfRecord=铌记录 +NbOfRecord=记录数 Constraints=约束 ConstraintsType=约束的类型 -ConstraintsToShowOrNotEntry=约束不显示或菜单项 +ConstraintsToShowOrNotEntry=约束是否显示菜单项 AllMustBeOk=所有这些都必须检查 Host=服务器 DriverType=驱动类型 -SummarySystem=系统信息摘要 -SummaryConst=列出所有Dolibarr设置参数 +SummarySystem=系统资讯摘要 +SummaryConst=Dolibarr所有设置参数清单 SystemUpdate=系统更新 -SystemSuccessfulyUpdate=您的系统已经更新successfuly -MenuCompanySetup=公司/基金会 -MenuNewUser=新用户 +SystemSuccessfulyUpdate=您的系统已经成功更新 +MenuCompanySetup=公司资讯 +MenuNewUser=新建用户 MenuTopManager=顶部菜单管理 -MenuLeftManager=左菜单管理 +MenuLeftManager=左侧菜单管理 +MenuManager=菜单管理器 +MenuSmartphoneManager=智能手机菜单管理 DefaultMenuTopManager=顶部菜单管理 -DefaultMenuLeftManager=左菜单管理 -Skin=皮肤主题 -DefaultSkin=默认皮肤主题 -MaxSizeList=最大长度为列表 -DefaultMaxSizeList=默认列表最大长度 -MessageOfDay=消息的一天 -MessageLogin=登录页的信息 -PermanentLeftSearchForm=常驻左搜索列表菜单 -DefaultLanguage=预设语言使用(语言代码) +DefaultMenuLeftManager=左侧菜单管理 +DefaultMenuManager= 标准菜单管理 +DefaultMenuSmartphoneManager=智能手机菜单管理 +Skin=外观主题 +DefaultSkin=默认外观主题 +MaxSizeList=最大列表长度 +DefaultMaxSizeList=默认最大列表长度 +MessageOfDay=每日消息 +MessageLogin=登录页面显示消息 +PermanentLeftSearchForm=常驻左侧菜单搜寻框 +DefaultLanguage=默认语言使用(语言代码) EnableMultilangInterface=启用多语言界面 -EnableShowLogo=在菜单上显示的标志 +EnableShowLogo=左侧菜单中显示公司标志 SystemSuccessfulyUpdated=您的系统已成功更新 -CompanyInfo=公司/基础信息 -CompanyIds=公司/基础身份 +CompanyInfo=公司资讯 +CompanyIds=公司/协会的编号 CompanyName=名称 CompanyAddress=地址 -CompanyZip=拉链 -CompanyTown=镇 +CompanyZip=邮编 +CompanyTown=城镇 CompanyCountry=国家 CompanyCurrency=主要货币 +Logo=标志 DoNotShow=不显示 -DoNotSuggestPaymentMode=不建议 -NoActiveBankAccountDefined=没有有效的银行帐户中定义 -OwnerOfBankAccount=银行帐户%342 +DoNotSuggestPaymentMode=不提示 +NoActiveBankAccountDefined=没有定义有效的银行帐户 +OwnerOfBankAccount=银行帐户 %s 的户主 BankModuleNotActive=银行账户模块没有启用 -ShowBugTrackLink=显示链接“报告错误” -ShowWorkBoard=显示“工作台”的网页 -Alerts=快讯 +ShowBugTrackLink=显示连结“报告错误” +ShowWorkBoard=主页面显示“工作台” +Alerts=其他提醒 Delays=延误 -DelayBeforeWarning=前延迟的警告 -DelaysBeforeWarning=时滞前警告 -DelaysOfToleranceBeforeWarning=前警告性延误 -DelaysOfToleranceDesc=这个屏幕允许你定义的警报之前不能容忍拖延是与象形%s的屏幕报晚元素。 -Delays_MAIN_DELAY_ACTIONS_TODO=延迟容忍(在天前通知)对尚未实现的行动计划 -Delays_MAIN_DELAY_ORDERS_TO_PROCESS=延迟容忍(在天前通知)对尚未完成的订单 -Delays_MAIN_DELAY_PROPALS_TO_CLOSE=延迟容忍(在天前通知)关于建议关闭 -Delays_MAIN_DELAY_PROPALS_TO_BILL=延迟容忍(在天前通知)对提案不计费 -Delays_MAIN_DELAY_NOT_ACTIVATED_SERVICES=容忍延迟(在天前通知)到服务激活 -Delays_MAIN_DELAY_RUNNING_SERVICES=容忍延迟(在天前通知)对过期服务 -Delays_MAIN_DELAY_SUPPLIER_BILLS_TO_PAY=容忍延迟(天数)前未付供应商发票警报 -Delays_MAIN_DELAY_CUSTOMER_BILLS_UNPAYED=容忍延迟(天数)客户端之前,未付发票警报 -Delays_MAIN_DELAY_TRANSACTIONS_TO_CONCILIATE=容忍延迟(在天前通知)对悬而未决的银行对帐 -Delays_MAIN_DELAY_MEMBERS=容忍延迟(天数)延迟之前会费警报 -Delays_MAIN_DELAY_CHEQUES_TO_DEPOSIT=容忍延迟(在天前通知)支票存款做 -SetupDescription1=所有参数可在安装区设置让你开始使用它之前Dolibarr。 -SetupDescription2=最重要的2安装步骤2在左侧的设置菜单中的第一,这意味着公司/基础设置页和模块设置页: -SetupDescription3=菜单参数安装“ - >公司/基础是必要的,因为输入的信息是用于Dolibarr显示和修改Dolibarr行为的国家(例如您要为特征有关)。 -SetupDescription4=模块参数的菜单安装“ - >是必要的,因为Dolibarr不是一种固定的ERP / CRM服务,但一,总结的几个模块都或多或少的独立。这只是激活模块后,你在,你会看到出现了有趣的功能菜单。 +DelayBeforeWarning=超时警告阀值 +DelaysBeforeWarning=超时警告阀值 +DelaysOfToleranceBeforeWarning=超时警告前延迟的阀值 +DelaysOfToleranceDesc=这里您可以设置主看板区出现逾期提醒 (带有%s图标) 前的逾期时间。 +Delays_MAIN_DELAY_ACTIONS_TODO=计划待办事件最大逾期时间 (天) +Delays_MAIN_DELAY_ORDERS_TO_PROCESS=未处理订单最大逾期时间 (天) +Delays_MAIN_DELAY_SUPPLIER_ORDERS_TO_PROCESS=未处理采购订单最大逾期时间 (天) +Delays_MAIN_DELAY_PROPALS_TO_CLOSE=合同逾期未关闭最大逾期时间 (天) +Delays_MAIN_DELAY_PROPALS_TO_BILL=报价单逾期收款最大逾期时间 (天) +Delays_MAIN_DELAY_NOT_ACTIVATED_SERVICES=服务逾期生效最大逾期时间 (天) +Delays_MAIN_DELAY_RUNNING_SERVICES=服务超期过期最大逾期时间 (天) +Delays_MAIN_DELAY_SUPPLIER_BILLS_TO_PAY=采购付款明细延误付款最大逾期时间 (天) +Delays_MAIN_DELAY_CUSTOMER_BILLS_UNPAYED=销售付款明细延误付款最大逾期时间 (天) +Delays_MAIN_DELAY_TRANSACTIONS_TO_CONCILIATE=银行对账推迟最大逾期时间 (天) +Delays_MAIN_DELAY_MEMBERS=Tolerance delay (in days) before alert on delayed membership fee +Delays_MAIN_DELAY_CHEQUES_TO_DEPOSIT=Tolerance delay (in days) before alert for cheques deposit to do +SetupDescription1=Dolibarr使用前可在安装区设置所有参数。 +SetupDescription2=最重要的两个安装步骤,是前2步,即“公司”页面设置和“模块”页面的设置: +SetupDescription3=菜单设定>公司资讯中的参数是必要的,因为输入的信息被用于Dolibarr的显示和影响 Dolibarr 的程序行为 (例如当涉及到与国家有关的功能) 。 +SetupDescription4=菜单设定->模块中的参数是必要的,因为Dolibarr 不是固定的 ERP/CRM 系统,而是多个模块的联合体,模块间相对独立。只有启用了您要用的模块后,菜单中才会出现相应的功能。 SetupDescription5=其他菜单项管理可选参数。 -EventsSetup=安装程序的事件日志 -LogEvents=安全审计事件 -Audit=审计 -ListEvents=审计事件 -ListOfSecurityEvents=名单Dolibarr安全事件 -LogEventDesc=在这里您可以启用的Dolibarr安全事件日志记录。管理员就可以看到它的菜单内容,通过系统工具-审计 。警告,此功能可以在数据库中消耗了大量数据。 -AreaForAdminOnly=这些功能都可以使用管理员用户 。 -SystemInfoDesc=系统信息是您在其他技术资料只读模式和显着的管理员只能获得。 -SystemAreaForAdminOnly=这个地区是管理员用户可用。在Dolibarr权限都不能减少这种限制。 -CompanyFundationDesc=编辑此页面上所有的公司或您需要管理的基础已知信息 -DisplayDesc=您可以选择相关的Dolibarr每个参数的外观和感觉这里 -AvailableModules=可用的模块 -ToActivateModule=要激活模块,继续安装区(首页->安装->模块)。 -SessionTimeOut=会话超时 -SessionExplanation=这个数字保证会议将永不过期此之前的延迟。在此期限后但PHP sessoin管理并不保证该届会议上总是届满:如果出现这种情况的制度进行清理缓存会话运行。
注:没有特定的系统,内部PHP的过程将清除之晤谈约每%/%s的访问,但只在会议期间提出的其他访问。 -TriggersAvailable=可用的触发器 -TriggersDesc=触发器是文件,将修改工作流行为Dolibarr一旦触发复制到该目录htdocs中/包括/。他们认识到新的行动,对Dolibarr事件(新公司的建立,发票验证,...).启动 -TriggerDisabledByName=在这个文件触发器被禁用的,将NoRun在其名称后缀。 -TriggerDisabledAsModuleDisabled=在这个文件触发器被禁用的模块%s是禁用的。 -TriggerAlwaysActive=在这个文件触发器总是活跃,无论是激活Dolibarr模块。 -TriggerActiveAsModuleActive=在这个文件中启用触发器活跃模块%s是。 -GeneratedPasswordDesc=这里定义的规定,你要用来生成新的密码,如果你问有自动生成的密码 -DictionnaryDesc=这里所有的参考定义景致。您可以完成预定义与你的价值。 -ConstDesc=此页面允许你编辑所有没有先前网页提供的其他参数。他们是保留给高级开发人员或troubleshouting参数。 -OnceSetupFinishedCreateUsers=警告,你是一个Dolibarr管理员用户。管理员用户用于安装Dolibarr。对于通常使用的Dolibarr,建议使用非管理员用户从菜单中创建用户和组。 -MiscellaneousDesc=定义在这里与安全有关的所有其他参数。 -LimitsSetup=极限/精密安装 -LimitsDesc=您可以定义范围,精度和Dolibarr这里使用的最佳化 -MAIN_MAX_DECIMALS_UNIT=单位价格最高为小数 -MAIN_MAX_DECIMALS_TOT=总价格的最高位小数 -MAIN_MAX_DECIMALS_SHOWN=屏幕(最大显示价格小数就新增...这个号码后,如果你想看到...当数被截断时,屏幕上显示) -MAIN_DISABLE_PDF_COMPRESSION=使用PDF压缩生成的PDF文件。 -MAIN_ROUNDING_RULE_TOT=四舍五入的范围大小(如申请人是四舍五入的东西比其他10个基地进行罕见的国家) -UnitPriceOfProduct=一种产品的单位价格网 -TotalPriceAfterRounding=总价格(净值/增值税/含税)后四舍五入 -ParameterActiveForNextInputOnly=下一个输入参数才能有效 -NoEventOrNoAuditSetup=没有安全事件已被记录呢。这可以是正常的,如果审计没有在“设置中启用 - 安全 - 审计”页面。 -NoEventFoundWithCriteria=没有安全事件已发现这种搜索标准。 -SeeLocalSendMailSetup=看到您当地的sendmail的设置 -BackupDesc=为了使一个完整的Dolibarr备份,您必须: -BackupDesc2=*保存内容的文件目录(%s)中包含所有上传和生成的文件(你可以压缩为一个例子)。 -BackupDesc3=*您的数据库的内容保存到转储文件。对于这一点,你可以使用下面的助手。 -BackupDescX=存档的目录应该被存储在一个安全的地方。 -BackupDescY=生成的转储文件应存放在安全的地方。 -RestoreDesc=要还原Dolibarr备份,您必须: -RestoreDesc2=*恢复存档文件(例如文件压缩文件)解压缩文件的目录中的文件目录树中安装一个新的Dolibarr或进入这个现行文件directoy(%s)中。 -RestoreDesc3=*恢复数据,从备份转储文件,进入新Dolibarr安装数据库或进入此当前安装的数据库。警告,一旦恢复完成后,你必须使用一个登录/密码,备份时存在了,再次连接。要恢复到这个当前安装一个备份数据库,你可以按照这个助理。 -ForcedToByAModule=这项规则是被迫到%s的一个激活的模块 -PreviousDumpFiles=可用的数据库备份转储文件 -WeekStartOnDay=每周的第一天 -RunningUpdateProcessMayBeRequired=运行升级进程似乎需要(程序版本%s版本%s从数据库不同) -YouMustRunCommandFromCommandLineAfterLoginToUser=您必须运行此命令从命令行壳用户登录后进入S%。 -YourPHPDoesNotHaveSSLSupport=SSL的功能不是在您的PHP可用 -DownloadMoreSkins=更多皮肤下载 -SimpleNumRefModelDesc=返回的格式%syymm,其中yy是二○○一年的参考号码,MM是月,nnnn是无孔序列和无复位 -PasswordGenerationStandard=返回一个密码生成算法根据内部Dolibarr:8个字符,包含共享小写数字和字符。 -PasswordGenerationNone=不要提出任何生成的密码。密码必须手动键入。 -UserGroupSetup=用户和组模块设置 -GeneratePassword=推荐一个生成的密码 -RuleForGeneratedPasswords=建议的规则来生成密码或验证密码 -DoNotSuggest=不要提出任何密码 -EncryptedPasswordInDatabase=为使在数据库中的密码加密 -DisableForgetPasswordLinkOnLogonPage=不显示链接“登录时忘记密码”页面 -UsersSetup=用户模块设置 -UserMailRequired=电子邮件要求创建一个新用户 -CompanySetup=公司模块设置 -CompanyCodeChecker=对第三方代码生成和检查(客户或供应商模块) -AccountCodeManager=代码生成的会计(模块客户或供应商) -ModuleCompanyCodeAquarium=返回一个会计代码“401代码由第三方供应商的供应商遵循会计守则”和“411”由第三方客户代码之后为客户建立会计代码。 -ModuleCompanyCodePanicum=返回一个空的会计代码。 -ModuleCompanyCodeDigitaria=会计代码依赖于第三方的代码。该代码是字符组成的“C”的第一个位置的前5第三方代码字符之后。 -UseNotifications=使用通知 -NotificationsDesc=电子邮件通知功能,您可以静静地发送自动邮件,对于一些Dolibarr活动时,(客户或供应商)被配置给第三方。主动通知和作出选择的目标联系在一次第三方。 -ModelModules=文件范本 -DocumentModelOdt=从OpenDocuments生成文件模板(。为OpenOffice,KOffice中,文字编辑,...)的ODT文件 -WatermarkOnDraft=水印文件草案 -WebCalSetup=Webcalendar链接设置 -WebCalSyncro=添加Dolibarr事件WebCalendar -WebCalAllways=一如既往,不问 -WebCalYesByDefault=随需应变(默认是) -WebCalNoByDefault=随需应变(默认没有) -WebCalNever=从来没有 -WebCalURL=网址日历访问 -WebCalServer=服务器托管日历数据库 -WebCalDatabaseName=数据库名称 -WebCalUser=用户访问数据库 -WebCalSetupSaved=Webcalendar设置保存成功。 -WebCalTestOk=连接到服务器'%s'于资料库'用户'%s'的%s'的成功。 -WebCalTestKo1=连接到服务器'%s'的成功,但是数据库'%s'的无法达成。 -WebCalTestKo2=连接到服务器'%s的与用户'%s'的失败。 -WebCalErrorConnectOkButWrongDatabase=数据库连接成功,但并不指望成为Webcalendar数据库。 -WebCalAddEventOnCreateActions=添加创建行动日历事件 -WebCalAddEventOnCreateCompany=添加公司创建日历事件 -WebCalAddEventOnStatusPropal=添加商业建议的情况变化日历事件 -WebCalAddEventOnStatusContract=日历事件添加合同地位的改变 -WebCalAddEventOnStatusBill=日历事件添加法案地位的变化 -WebCalAddEventOnStatusMember=日历事件添加成员地位的变化 -WebCalUrlForVCalExport=出口连接到%s格式可在以下链接:%s的 -WebCalCheckWebcalSetup=也许Webcal模块的设置是不正确的。 -BillsSetup=发票模块设置 -BillsDate=发票日期 -BillsNumberingModule=发票编号和信用票据模块 -BillsPDFModules=发票的文件模式 -CreditNoteSetup=信用模块设置说明 -CreditNotePDFModules=信用说明文档模型 -CreditNote=信用注意 -CreditNotes=信用票据 -ForceInvoiceDate=部队发票日期审定日期 -DisableRepeatable=禁用重复发票 -SuggestedPaymentModesIfNotDefinedInInvoice=建议付款方式在默认情况下,如果没有发票发票的定义 -EnableEditDeleteValidInvoice=启用的可能性,编辑/删除无有效发票付款 -SuggestPaymentByRIBOnAccount=建议撤回有关帐户付款 -SuggestPaymentByChequeToAddress=建议以支票付款 -FreeLegalTextOnInvoices=免费发票上的文字 -WatermarkOnDraftInvoices=如有任何发票草案空(水印) -PropalSetup=商业建议模块设置 -CreateForm=创建表单 -NumberOfProductLines=产品线数目 -PathToDocuments=文件路径 -PathDirectory=目录 -ProposalsNumberingModules=商业建议编号模块 -ProposalsPDFModules=商业模式的建议文件 -ClassifiedInvoiced=发票分类 -HideTreadedPropal=隐藏在对待商业的建议名单 -AddShippingDateAbility=添加出货日期的能力 -AddDeliveryAddressAbility=添加交付日期的能力 -UseOptionLineIfNoQuantity=一个产品线/服务的,是作为一个选项视为零的数额 -FreeLegalTextOnProposal=自由文本商业建议 -WatermarkOnDraftProposal=草案建议,任何商业,如果空(水印) -OrdersSetup=订单的管理体制 -OrdersNumberingModules=订单编号模块 -OrdersModelModule=订购文件模式 -HideTreadedOrders=隐藏在治疗或取消订单的名单 -ValidOrderAfterPropalClosed=为了验证该命令后,建议密切,使得它可以不一步的临时命令 -FreeLegalTextOnOrders=自由文本订单 -WatermarkOnDraftOrders=草案订单(水印如有任何空) -FicheinterNumberingModules=干预编号模块 -TemplatePDFInterventions=干预卡文件模式 -WatermarkOnDraftInterventionCards=卡文件的任何干预,如果空(水印) -ClickToDialSetup=点击拨号模块设置 -ClickToDialUrlDesc=链接时调用一个电话象形点击完成。丹斯l'网址,vous pouvez utiliser莱balises
%%1 $ s的夸血清remplacé电话杆乐德l' appelé
%%2 $ s的夸血清remplacé电话杆乐德l' appelant(乐votre)
%%3 $ s的夸血清remplacé杆votre登录clicktodial(定义所涵盖河畔votre胶片utilisateur)
%%4 $ s的夸血清remplacé杆votre摩托罗拉德过时clicktodial(定义所涵盖河畔votre胶片utilisateur)。 -Bookmark4uSetup=Bookmark4u模块设置 -InterventionsSetup=干预模块设置 -MembersSetup=委员模块设置 -MemberMainOptions=主要选项 -AddSubscriptionIntoAccount=添加到银行或银行现金账户订阅模块, -AdherentMailRequired=电子邮件要求创建一个新成员 -MemberSendInformationByMailByDefault=复选框发送电子邮件确认为成员(验证或新订阅)默认是 -LDAPSetup=LDAP设置 -LDAPGlobalParameters=全局参数 -LDAPUsersSynchro=用户 -LDAPGroupsSynchro=团体 -LDAPContactsSynchro=往来 -LDAPMembersSynchro=成员 -LDAPSynchronization=LDAP同步 -LDAPFunctionsNotAvailableOnPHP=LDAP的功能不可用在你的PHP -LDAPToDolibarr=LDAP的 - > Dolibarr -DolibarrToLDAP=Dolibarr - >的LDAP -LDAPNamingAttribute=关键在LDAP -LDAPSynchronizeUsers=在LDAP的用户组织 -LDAPSynchronizeGroups=在LDAP团体组织 -LDAPSynchronizeContacts=在LDAP组织接触 -LDAPSynchronizeMembers=地基的成员组织在LDAP -LDAPTypeExample=OpenLDAP的,或Active Directory中的egroupware -LDAPPrimaryServer=主服务器 -LDAPSecondaryServer=中学服务器 -LDAPServerPort=服务器端口 -LDAPServerPortExample=默认端口:389 -LDAPServerProtocolVersion=协议版本 -LDAPServerUseTLS=使用TLS -LDAPServerUseTLSExample=您的LDAP服务器使用TLS -LDAPServerDn=服务器的DN -LDAPAdminDn=管理员的DN -LDAPAdminDnExample=完整的DN(例如:架CN = adminldap,直流=社会,直流= com)上 -LDAPPassword=管理员密码 -LDAPUserDn=用户的DN -LDAPUserDnExample=完整的DN(例如:欧=用户,直流=社会,直流= com)上 -LDAPGroupDn=组'的DN -LDAPGroupDnExample=完整的DN(例如:欧=组,直流=社会,直流= com)上 -LDAPServerExample=服务器地址(例如:本地主机,192.168.0.2,ldaps:/ / ldap.example.com /) -LDAPServerDnExample=完整的DN(例如:直流=公司,直流= com)上 -LDAPPasswordExample=管理员密码 -LDAPDnSynchroActive=用户和组同步 -LDAPDnSynchroActiveExample=LDAP来Dolibarr或Dolibarr到LDAP同步 -LDAPDnContactActive=联系人的同步 -LDAPDnContactActiveYes=活性炭同步 -LDAPDnContactActiveExample=激活/未活化同步 -LDAPDnMemberActive=议员的同步 -LDAPDnMemberActiveExample=激活/未活化同步 -LDAPContactDn=Dolibarr接触'的DN -LDAPContactDnExample=完整的DN(例如:欧=接触,直流=社会,直流= com)上 -LDAPMemberDn=Dolibarr成员的DN -LDAPMemberDnExample=完整的DN(例如:欧=成员,直流=社会,直流= com)上 -LDAPMemberObjectClassList=objectClass的名单 -LDAPMemberObjectClassListExample=名单确定(例如:顶,顶的inetOrgPerson或为活动目录用户记录属性objectclass) -LDAPUserObjectClassList=objectClass的名单 -LDAPUserObjectClassListExample=名单确定(例如:顶,顶的inetOrgPerson或为活动目录用户记录属性objectclass) -LDAPGroupObjectClassList=objectClass的名单 -LDAPGroupObjectClassListExample=定义(例如:记录属性objectclass列表的顶部,groupOfUniqueNames) -LDAPContactObjectClassList=objectClass的名单 -LDAPContactObjectClassListExample=名单确定(例如:顶,顶的inetOrgPerson或为活动目录用户记录属性objectclass) -LDAPMemberTypeDn=Dolibarr成员的类型的DN -LDAPMemberTypeDnExample=完整的DN(例如:欧= type_members,直流=社会,直流= com)上 -LDAPTestConnect=测试LDAP连接 -LDAPTestSynchroContact=测试联系人的同步 -LDAPTestSynchroUser=测试用户的同步 -LDAPTestSynchroGroup=试验组的同步 -LDAPTestSynchroMember=测试成员的同步 -LDAPSynchroOK=同步测试成功 -LDAPSynchroKO=同步测试失败 -LDAPSynchroKOMayBePermissions=同步失败的考验。检查联接到服务器的正确配置,并允许LDAP的udpates -LDAPTCPConnectOK=TCP连接到LDAP服务器的成功(服务器=%s端口=%s)的 -LDAPTCPConnectKO=TCP连接到LDAP服务器失败(服务器=%s端口=%s)的 -LDAPBindOK=连接/ Authentificate到LDAP服务器的成功(服务器=%s端口=%s后,管理员=%s的,密码=%s)的 -LDAPBindKO=连接/ Authentificate到LDAP服务器失败(服务器=%s端口=%s后,管理员=%s的,密码=%s)的 -LDAPUnbindSuccessfull=断开成功 -LDAPUnbindFailed=断开失败 -LDAPConnectToDNSuccessfull=连接区的DN(%s)的里¿ ½ ussie -LDAPConnectToDNFailed=连接区的DN(%s的)我¿ ½ ¿ ½ é草衣 -LDAPSetupForVersion3=LDAP服务器配置为第3版 -LDAPSetupForVersion2=LDAP服务器配置为版本2 -LDAPDolibarrMapping=Dolibarr映射 -LDAPLdapMapping=LDAP的映射 -LDAPFieldLoginUnix=登录(Unix系统) -LDAPFieldLoginExample=例如:的UID -LDAPFilterConnection=搜索过滤器 -LDAPFilterConnectionExample=例如:&(objectClass的=的inetOrgPerson) -LDAPFieldLoginSamba=登录(桑巴,activedirectory) -LDAPFieldLoginSambaExample=例如:sAMAccountName赋 -LDAPFieldFullname=名字名称 -LDAPFieldFullnameExample=例如:架CN -LDAPFieldPassword=密码 -LDAPFieldPasswordNotCrypted=不加密的密码 -LDAPFieldPasswordCrypted=密码加密的 -LDAPFieldPasswordExample=例如:userPassword时 -LDAPFieldCommonName=通用名称 -LDAPFieldCommonNameExample=例如:架CN -LDAPFieldName=名称 -LDAPFieldNameExample=例如:锡 -LDAPFieldFirstName=名字 -LDAPFieldFirstNameExample=例如:givenname -LDAPFieldMail=电邮地址 -LDAPFieldMailExample=例如:邮件 -LDAPFieldPhone=专业的电话号码 -LDAPFieldPhoneExample=例如:telephonenumber -LDAPFieldHomePhone=个人电话号码 -LDAPFieldHomePhoneExample=例如:homephone -LDAPFieldMobile=手机 -LDAPFieldMobileExample=例如:移动 -LDAPFieldFax=传真号 -LDAPFieldFaxExample=例如:facsimiletelephonenumber -LDAPFieldAddress=街头 -LDAPFieldAddressExample=例如:街道 -LDAPFieldZip=拉链 -LDAPFieldZipExample=例如:邮政编码 -LDAPFieldTown=镇 -LDAPFieldTownExample=例如:升 -LDAPFieldCountry=国家 -LDAPFieldCountryExample=例如:C -LDAPFieldDescription=描述 -LDAPFieldDescriptionExample=例如:说明 -LDAPFieldGroupMembers=集团成员 -LDAPFieldGroupMembersExample=例如:uniqueMember -LDAPFieldBirthdate=生日 -LDAPFieldBirthdateExample=例如: -LDAPFieldCompany=公司 -LDAPFieldCompanyExample=例如:O型 -LDAPFieldSid=的SID -LDAPFieldSidExample=例如:的objectSID -LDAPFieldEndLastSubscription=认购结束日期 -LDAPParametersAreStillHardCoded=LDAP的规范,仍然是硬编码(接触类) -LDAPSetupNotComplete=LDAP的安装程序不完整的(对别人去标签) -LDAPNoUserOrPasswordProvidedAccessIsReadOnly=没有管理员或密码。 LDAP的访问将是匿名的,在只读模式。 -LDAPDescContact=此页面允许您定义的LDAP属性的LDAP树就Dolibarr接触发现每个数据的名称。 -LDAPDescUsers=此页面允许您定义的LDAP属性的LDAP树就Dolibarr用户发现每个数据的名称。 -LDAPDescGroups=此页面允许您定义的LDAP属性的LDAP树就Dolibarr组发现每个数据的名称。 -LDAPDescMembers=此页面允许您定义的LDAP属性的LDAP树就Dolibarr成员发现每个数据模块的名称。 -LDAPDescValues=例如OpenLDAP的设计值与下列加载模式:core.schema,cosine.schema,inetorgperson.schema)。如果您使用thoose价值观和OpenLDAP,修改您的LDAP配置文件的slapd.conf让所有thoose模式加载。 -ForANonAnonymousAccess=对于一个写验证存取权限,例如访问() -ProductSetup=产品模块设置 -NumberOfProductShowInSelect=马克斯在连击产品数量(0 =没有限制选择列表) -ConfirmDeleteProductLineAbility=当形式确认删除产品线 -ModifyProductDescAbility=产品个性化的形式描述 -ViewProductDescInFormAbility=在形式(如弹出工具提示,否则可视化产品说明) -UseSearchToSelectProduct=使用搜索表单选择而不是使用一个列表框的产品() -UseEcoTaxeAbility=支持生态附加税(WEEE)的 -SetDefaultBarcodeTypeProducts=默认使用条码的产品类型 -SetDefaultBarcodeTypeThirdParties=默认使用条码类型为第三方 -SyslogSetup=系统日志模块设置 -SyslogOutput=日志输出 -SyslogSyslog=系统日志 -SyslogFacility=设施 -SyslogLevel=水平 -SyslogSimpleFile=文件 -SyslogFilename=文件名称和路径 -YouCanUseDOL_DATA_ROOT=你可以使用DOL_DATA_ROOT /可在Dolibarr日志文件dolibarr.log“文件”目录。你可以设置一个不同的路径来存储该文件。 -ErrorUnknownSyslogConstant=恒%s不是一个已知的syslog常数 -DonationsSetup=捐赠模块设置 -DonationsReceiptModel=模板的捐赠收据 -BarcodeSetup=条码设置 -PaperFormatModule=打印格式模块 -BarcodeEncodeModule=条码编码类型 -UseBarcodeInProductModule=对产品使用条形码 -CodeBarGenerator=条码发生器 -ChooseABarCode=没有发电机定义 -FormatNotSupportedByGenerator=格式不支持此发生器 -BarcodeDescEAN8=条码类型EAN8 -BarcodeDescEAN13=条码类型EAN13 -BarcodeDescUPC=刚果爱国者联盟类型的条码 -BarcodeDescISBN=书号条码类型 -BarcodeDescC39=条码类型C39座 -BarcodeDescC128=条码型C128 -GenbarcodeLocation=条码生成命令行工具(由phpbarcode引擎用于某些类型的条形码) -WithdrawalsSetup=提款模块设置 -ExternalRSSSetup=外部的RSS进口格局 -NewRSS=新的RSS饲料 -MailingSetup=通过电子邮件发送模块设置 -MailingEMailFrom=发件人的电子邮件(从)为通过电子邮件发送电子邮件模块 -MailingEMailError=回电子邮件(错误对),与错误的电子邮件 -NotificationSetup=模块设置电子邮件通知府 -NotificationEMailFrom=发件人的电子邮件(从)为发送通知邮件 -SendingsSetup=发送模块设置 -SendingsReceiptModel=发送接收模式 -SendingsAbility=支持sendings表为客户交付 -NoNeedForDeliveryReceipts=在大多数情况下,sendings收益用于为客户交付(产品名单表送两个),这是由客户签署求相关和床单。因此,产品交付收据是一个重复的特点,也很少启动。 -FreeLegalTextOnDeliveryReceipts=免费送货文本收益 -DeliveryOrderNumberingModules=产品收货编号模块 -DeliveryOrderModel=产品收货模型 -DeliveriesOrderAbility=支持产品交付收据 -ActivateFCKeditor=fckeditor的激活为: -FCKeditorForUsers=所见即所得创建/编辑用户的描述和说明 -FCKeditorForCompany=所见即所得创建/版,公司就的描述和说明 -FCKeditorForProduct=所见即所得创建/版本的产品/服务的描述和说明 -FCKeditorForMembers=所见即所得创建/编辑成员的描述和说明 -FCKeditorForProductDetails=所见即所得创作/箱版的产品线细则的所有实体(建议,订单,发票等..)。 警告:使用此选项不认真,意见书,因为它可以创建PDF格式的问题与特殊字符和建设时,页面格式化文件。 -FCKeditorForProductDetailsPerso=所见即所得创建/编辑个性化的产品为所有实体(建议,订单细节线条,发票等..) -FCKeditorForMailing=所见即所得创建/编辑的邮件 -OSCommerceErrorConnectOkButWrongDatabase=数据库连接成功,但并不指望成为oscommerce的数据库(关键%不是%s的表中找到)。 -OSCommerceTestOk=连接到服务器'%s'于资料库'用户'%s'的%s'的成功。 -OSCommerceTestKo1=连接到服务器'%s'的成功,但是数据库'%s'的无法达成。 -OSCommerceTestKo2=连接到服务器'%s的与用户'%s'的失败。 -MantisSetup=螳螂链接设置 -MantisURL=URL访问的螳螂 -MantisServer=螳螂数据库服务器托管 -MantisDatabaseName=数据库名称 -MantisUser=用户访问数据库 -MantisSetupSaved=螳螂设置保存成功。 -MantisTestOk=连接到服务器'%s'于资料库'用户'%s'的%s'的成功。 -MantisTestKo1=连接到服务器'%s'的成功,但是数据库'%s'的无法达成。 -MantisTestKo2=连接到服务器'%s的与用户'%s'的失败。 -MantisErrorConnectOkButWrongDatabase=连接成功了,但是数据库不看是螳螂数据库。 -StockSetup=股票配置模块 -UserWarehouse=使用用户的个人股票 -MenuDeleted=菜单中删除 -TreeMenu=树菜单 -Menus=菜单 -TreeMenuPersonalized=个性化菜单 -NewMenu=新菜单 -MenuConf=菜单设置 -Menu=选择菜单 -MenuHandler=菜单处理程序 -MenuModule=源模块 -DetailId=编号菜单 -DetailMenuHandler=菜单处理程序在哪里显示新的菜单 -DetailMenuModule=模块名称,如果菜单项来自一个模块 -DetailType=类型菜单(顶部或左) -DetailTitre=菜单标签或标签代码翻译 -DetailMainmenu=其所属集团(陈旧) -DetailUrl=菜单上的网址发送给您(绝对网址链接或以http://外部链接) -DetailLeftmenu=显示条件或没有(过时) -DetailEnabled=条件不显示或入境 -DetailRight=未经批准的条件,显示灰色菜单 -DetailLangs=郎文件名称的标签代码转换 -DetailUser=实习生/外部/所有 -DetailTarget=目标的链接(_blank顶开一新视窗) -DetailLevel=级(-1:顶部菜单,0:头菜单,> 0菜单和子菜单) -ModifMenu=菜单上的变化 -DeleteMenu=删除菜单项 -ConfirmDeleteMenu=你确定要删除菜单条目%s吗 ? -DeleteLine=删除线 -ConfirmDeleteLine=你确定要删除这条路线? -TaxSetup=税,社会贡献和股息模块设置 -OptionVatMode=由于增值税 -OptionVATDefault=标准 -OptionVATDebitOption=在收费服务选项 -OptionVatDefaultDesc=增值税是因为:
- 交货/付款商品
- 关于服务费 -OptionVatDebitOptionDesc=增值税是因为:
- 交货/付款商品
- 对发票(付款)服务 -SummaryOfVatExigibilityUsedByDefault=增值税exigibility时间根据选用默认选项: -OnDelivery=交货 -OnPayment=关于付款 -OnInvoice=关于发票 -SupposedToBePaymentDate=如果使用的付款日期交货日期不详 -Buy=购买 -Sell=出售 -InvoiceValidateDateUsed=使用发票dtate -YourCompanyDoesNotUseVAT=贵公司已被定义为不使用增值税(首页 - 安装 - 公司/基金会),所以没有设置增值税的选择。 -AgendaSetup=模块设置的行动和议程 -PasswordTogetVCalExport=授权出口的关键环节 -PastDelayVCalExport=不要以上出口事件 -ClickToDialDesc=这个模块允许添加后Dolibarr联系电话号码的图标。关于这个图标,会调用一个特定的URL serveur您定义如下。这可以用来调用一个从Dolibarr呼叫中心系统,可致电1例如SIP系统的电话号码。 -CashDesk=销售点 -CashDeskSetup=模块设置的销售点 -CashDeskThirdPartyForSell=通用第三方使用销售 -CashDeskBankAccountForSell=帐户用于接收现金付款 -CashDeskBankAccountForCheque=帐户用于接收支票付款 -CashDeskBankAccountForCB=帐户用于接收信用卡支付现金 -CashDeskIdWareHouse=仓库使用销售 -BookmarkSetup=模块设置书签 -BookmarkDesc=这个模块允许您管理书签。您还可以添加快捷方式到任何Dolibarr网页或在您的左边菜单externale网站。 -NbOfBoomarkToShow=最大数量的书签显示在左边的菜单 -WebServicesSetup=符模块设置 -WebServicesDesc=通过启用这个模块,Dolibarr成为网络服务的服务器,提供网络服务的杂项。 -WSDLCanBeDownloadedHere=的WSDL描述文件提供serviceses可以从这里下载 -EndPointIs=SOAP客户端必须将他们的要求去Dolibarr端点可在网址 -BankSetupModule=银行模块设置 -FreeLegalTextOnChequeReceipts=自由文本查询收益 -MultiCompanySetup=多模块安装公司 -SuppliersSetup=供应商模块设置 -SuppliersCommandModel=完成模板供应商的订单(logo. ..) -GeoIPMaxmindSetup=geoip的Maxmind模块设置 -PathToGeoIPMaxmindCountryDataFile=文件路径Maxmind向国家知识产权含有翻译。
范例:/ usr /本地/共享/ geoip的/ GeoIP.dat -NoteOnPathLocation=请注意您的IP到国家数据文件必须是你的PHP目录内可以读取(检查你的PHP中的open_basedir设置和文件系统权限)。 -YouCanDownloadFreeDatFileTo=你可以下载一个在%s的免费演示版 geoip的国家Maxmind文件 -YouCanDownloadAdvancedDatFileTo=您也可以下载一个更完整版本,更新,对Maxmind geoip的文件在%s的国家 -TestGeoIPResult=试验的IP转换 - >国家 -ProjectsNumberingModules=项目编号模块 -ProjectsSetup=项目模块设置 -ProjectsModelModule=项目的报告文档模型 -// STOP - Lines generated via autotranslator.php tool (2010-06-08 21:22:55). - - -// START - Lines generated via autotranslator.php tool (2010-09-04 01:33:40). -// Reference language: en_US -> zh_CN -IgnoreDuplicateRecords=忽略重复的错误记录(插入忽略) -ModulesMarketPlaceDesc=你可以找到更多的模块,以在互联网上下载的外部网站的... -ModulesMarketPlaces=更多的模块... -DoliStoreDesc=DoliStore,为Dolibarr的ERP / CRM的外部模块官方市场 -WebSiteDesc=网站提供者可以搜索找到更多的模块... -URL=链接 -OfficialMarketPlace=官方/插件外部模块市场 -MAIN_MAIL_AUTOCOPY_TO=发送一个隐藏的系统碳复制所有发送电子邮件给 -SubmitTranslation=如果语言翻译,这是不完整的,或者您发现错误,您可以通过编辑更正此文件到目录兰斯/ %s并提交www.dolibarr.org论坛上修改的文件。 -ListOfDirectoriesForModelGenODT=含有目录清单模板OpenDocument格式的文件。

这里写的目录的完整路径。
之间添加字节EAH目录回车。
要添加一个模块目录中的盖德,在这里补充DOL_DATA_ROOT /流脑/ yourdirectoryname。

在这些目录中的文件必须以。的ODT。 -FirstnameNamePosition=的名字位置/名称 -Module100Name=ExternalSite -Module100Desc=到Dolibarr菜单包含任何外部网站,并查看它成为一个Dolibarr框架 -Permission13=Unvalidate发票 -Permission36=查看/隐藏产品管理 -Permission536=查看/隐藏服务管理 -FreeLegalTextOnInterventions=自由文本文件干预 -// STOP - Lines generated via autotranslator.php tool (2010-09-04 01:52:42). - - -// START - Lines generated via autotranslator.php tool (2012-02-29 17:37:09). -// Reference language: en_US -> zh_CN -WebUserGroup=Web服务器的用户/组 -ActivityStateToSelectCompany=添加一个过滤器的选项,以显示/隐藏thirdparties,这是在目前的活动或已停止 -SearchFilter=搜索过滤选项 -NumberOfKeyToSearch=NBR的字符来触发搜索:%s -ClientOffsetWithGreenwich=客户机/浏览器偏移宽度格林威治时间(秒) -DaylingSavingTime=夏令时间(用户) -RunCommandSummaryToLaunch=可以用下面的命令启动备份 -ImportPostgreSqlDesc=导入备份文件,你必须使用命令行pg_restore的命令: -ImportPostgreSqlCommand=%s %s mybackupfile.sql -FullPathToPostgreSQLdumpCommand=pg_dump命令的完整路径 -NoLockBeforeInsert=周围的INSERT没有锁定命令 -CurrentMenuHandler=当前菜单处理程序 -CurrentSmartphoneMenuHandler=当前智能手​​机的菜单处理 -MAIN_MAIL_ERRORS_TO=错误回报电子邮件的发件人电子邮件发送 -MAIN_DISABLE_ALL_SMS=禁用所有的短信sendings(用于测试目的或演示) -MAIN_SMS_SENDMODE=使用方法发送短信 -MAIN_MAIL_SMS_FROM=默认发件人的电话号码发送短信 -FollowingSubstitutionKeysCanBeUsed=
要知道如何创建您的ODT文档模板存储在这些目录,读取wiki文档: -FullListOnOnlineDocumentation=http://wiki.dolibarr.org/index.php/Create_an_ODT_document_template -DescWeather=下面的图片将会显示在仪表盘时,晚行动的数量达到以下值: -KeyForWebServicesAccess=键来使用Web服务(在WebServices的参数“dolibarrkey”) -TestSubmitForm=输入测试表 -ThisForceAlsoTheme=使用此菜单管理器,也将使用它自己的主题,无论是用户的选择。此菜单经理还专门为智能手机并不适用于所有的智能手机。使用另一个菜单管理器,如果你遇到你的问题。 -ThemeDir=skins目录 -ConnectionTimeout=联接超时 -ResponseTimeout=响应超时 -SmsTestMessage=测试消息从_ PHONEFROM__ __ PHONETO__ -ModuleMustBeEnabledFirst=第一次使用此功能前,必须启用模块%s。 -SecurityToken=安全网址的关键 -NoSmsEngine=没有SMS发件人经理。短信发件人经理没有安装默认分配(因为他们依赖外部供应商),但你可以找到一些http://www.dolistore.com -PDF=PDF格式 -PDFDesc=你可以设置PDF生成有关的每个全局选项 -PDFAddressForging=伪造地址框的规则 -HideAnyVATInformationOnPDF=隐藏所有有关增值税生成的PDF信息 -UrlGenerationParameters=参数,以确保网址 -SecurityTokenIsUnique=每个URL使用独特的securekey参数 -EnterRefToBuildUrl=输入参考对象%s -GetSecuredUrl=获取计算网址 -Module105Name=梅尔曼和SIP -Module105Desc=邮递员或SPIP成员模块接口 -Module50000Name=出纳 -Module50000Desc=模块提供信用卡网上支付页面与出纳 -Module50200Name=贝宝 -Module50200Desc=模块提供信用卡与Paypal网上支付页面 -Permission154=信贷/拒绝站在订单收据 -PermissionAdvanced251=阅读其他用户 -PermissionAdvanced253=创建/修改内部/外部用户和权限 -Permission341=阅读自己的权限 -Permission342=创建/修改自己的用户信息 -Permission343=修改自己的密码 -Permission344=修改其自己的权限 -Permission351=阅读群体 -Permission352=阅读组的权限 -Permission353=创建/修改组 -Permission354=删除或禁用组 -Permission358=出口用户 -Permission1235=通过电子邮件发送的供应商发票 -Permission2503=提交或删除的文件 -Permission50001=使用销售点 -Permission50201=读取交易 -Permission50202=进口交易 -DictionnaryAvailability=迟延交付 -DictionnaryOrderMethods=排列方法 -DictionnarySource=建议/订单的起源 -MenuSmartphoneManager=智能手机菜单管理 -DefaultMenuManager=标准菜单管理 -DefaultMenuSmartphoneManager=智能手机菜单管理 -Delays_MAIN_DELAY_SUPPLIER_ORDERS_TO_PROCESS=延迟容忍(天)前尚未处理的供应商的订单提醒 +EventsSetup=设置 事件日志 +LogEvents=安全稽核事件 +Audit=安全稽核 +InfoDolibarr=Dolibarr 信息 +InfoOS=系统 信息 +InfoWebServer=网页服务器 信息 +InfoDatabase=数据库 信息 +InfoPHP=PHP 信息 +ListEvents=稽核事件 +ListOfSecurityEvents=安全事件清单 SecurityEventsPurged=安全事件清除 -ShowProfIdInAddress=文件上显示professionnal地址ID +LogEventDesc=这里您可以启用 Dolibarr 的安全事件日志记录。管理员可以通过系统工具-稽核查看其内容。警告,此功能会消耗大量的数据库空间。 +AreaForAdminOnly=这些功能仅供管理员用户 使用。 +SystemInfoDesc=系统信息指以只读方式显示的其它技术信息,只对系统管理员可见。 +SystemAreaForAdminOnly=此区仅供管理员用户使用。Dolibarr 中没有权限可越过此限制。 +CompanyFundationDesc=此页面中请点击底部的“修改”按钮,编辑您所管理公司已知信息。 +DisplayDesc=这里可以选择 Dolibarr 外观效果相关的所有参数 +AvailableModules=可用的模块 +ToActivateModule=要启用模块,请到“设定”区 (首页->设定->模块)。 +SessionTimeOut=会话超时 +SessionExplanation=This number guarantee that session will never expire before this delay, if the session cleaner is done by Internal PHP session cleaner (and nothing else). Internal PHP session cleaner does not guaranty that session will expire just after this delay. It will expire, after this delay, and when the session cleaner is ran, so every %s/%s access, but only during access made by other sessions.
Note: on some servers with an external session cleaning mechanism (cron under debian, ubuntu ...), the sessions can be destroyed after a period defined by the default session.gc_maxlifetime, no matter what the value entered here. +TriggersAvailable=可用的触发器 +TriggersDesc=Triggers are files that will modify the behaviour of Dolibarr workflow once copied into the directory htdocs/core/triggers. They realised new actions, activated on Dolibarr events (new company creation, invoice validation, ...). +TriggerDisabledByName=文件中的触发器代码可以通过文件名中的 -NoRun 前缀禁用。 +TriggerDisabledAsModuleDisabled=此文件中的触发器将在%s模块禁用时禁用。 +TriggerAlwaysActive=此文件中的触发器总是启用,无论 Dolibarr 的各模块是否启用。 +TriggerActiveAsModuleActive=此文件中的触发器将于 %s 模块启用后启用。 +GeneratedPasswordDesc=在此设定新密码的生成规则,如果您选择使用自动生成的密码。 +DictionnaryDesc=此处可以设置可选字段中的所有可用数据。您可以通过自定义值来完善程序的预制设置。 +ConstDesc=此页中您可以编辑前几页中没有的其它所有参数。他们是供开发人员调试用的保留参数。 +OnceSetupFinishedCreateUsers=警告,您是 Dolibarr 管理员用户。管理员用户被用来安装设置 Dolibarr 。Dolibarr 的日常使用,推荐通过用户/组菜创建的非管理员用户进行。 +MiscellaneousDesc=在这里定义与安全有关的所有其他参数。 +LimitsSetup=限制及精准度 +LimitsDesc=这里您可以设置 Dolibarr 的范围、精度和优化参数。 +MAIN_MAX_DECIMALS_UNIT=单价小数位 +MAIN_MAX_DECIMALS_TOT=总价小数位 +MAIN_MAX_DECIMALS_SHOWN=屏幕显示小数位(如果你希望系统内部数值显示时遇到小数位截断的情况下显示...,请在此数值后加上...) +MAIN_DISABLE_PDF_COMPRESSION=压缩生成的 PDF 文件。 +MAIN_ROUNDING_RULE_TOT= 四舍五入的取舍值 (仅适用于个别不按10取舍的国家) +UnitPriceOfProduct=产品单价 (税前) +TotalPriceAfterRounding=四舍五入的总价 (税前价/增值税/税后价) +ParameterActiveForNextInputOnly=参数仅在下次输入数值起生效。 +NoEventOrNoAuditSetup=尚无安全事件被记录。这属正常,默认“设置 - 安全 - 稽核”页面的稽核功能未启用。 +NoEventFoundWithCriteria=未发现符合搜索条件的安全事件。 +SeeLocalSendMailSetup=参见您的本机 sendmail 设置 +BackupDesc=为了生成一个完整的 Dolibarr 备份,您必须: +BackupDesc2=保存文档目录 (%s) 中的内容 (例如您可以将此目录压缩打包),此目录中包括所有上传和生成的文件。 +BackupDesc3=保存您的数据库转储文件。为此,您可以使用如下辅助措施。 +BackupDescX=存档的文档目录应存储在一个安全的地方。 +BackupDescY=生成的转储文件应存放在安全的地方。 +BackupPHPWarning=此方法不保证成功生成备份。建议使用前者 +RestoreDesc=要还原Dolibarr备份,您必须: +RestoreDesc2=还原存档的文档文件夹(例如 zip 文件包)将其中的文件树释放到新装 Dolibarr 的 documents 文件夹或当前 Dolibarr 的文档文件夹(%s)中。 +RestoreDesc3=将备份的转储文件中的数据还原到新装或当前 Dolibarr 的数据库中。警告,一旦完成还原,您必须使用备份时数据库中的登陆用户名/密码登陆。要恢复备份的数据库到当前安装中,请根据说明操作。/follow assistance +RestoreMySQL=MySQL 导入 +ForcedToByAModule= 此规则被一个启用中的模块强制应用于 %s +PreviousDumpFiles=可用的数据库备份转储文件 +WeekStartOnDay=每周的第一天 +RunningUpdateProcessMayBeRequired=似乎需要运行升级程序(程序版本 %s 与数据库版本 %s 不符) +YouMustRunCommandFromCommandLineAfterLoginToUser=您必须以 %s 用户在MySQL控制台登陆后通过命令行运行此命令否则您必须在命令行的末尾使用 -W 选项来提供 %s 的密码。 +YourPHPDoesNotHaveSSLSupport=SSL 在您的 PHP 中不可用 +DownloadMoreSkins=下载更多外观主题 +SimpleNumRefModelDesc=依照 %syymm-nnnn 的格式返回引用编号,其中yy是年、mm是月、nnnn 是自动填零补全的序号。 +ShowProfIdInAddress=文件中显示专业编号及地址 +ShowVATIntaInAddress=Hide VAT Intra num with addresses on documents TranslationUncomplete=部分翻译 -SomeTranslationAreUncomplete=有些语言可能被部分翻译或可能包含错误。如果您发现了一些,你可以修复。郎文本文件到目录的htdocs / langs他们在论坛上提交http://www.dolibarr.org 。 -MenuUseLayout=请垂直菜单hidable(选项不能被禁用的JavaScript) -MAIN_DISABLE_METEO=禁用气象局认为 -TestLoginToAPI=测试登录到API -ProxyDesc=Dolibarr的某些功能需要有一个上网工作。这里定义为这个参数。 ,如果Dolibarr服务器代理服务器后面的是,那些参数告诉Dolibarr的如何通过它来访问互联网。 +SomeTranslationAreUncomplete=一些语言的翻译可能不完整或含有错误百出。如果您发现了错误,请修改 htdocs/langs 目录下的 .lang 文本文件,并将更新后的文件提交至论坛 http://www.dolibarr.org。 +MenuUseLayout=可隐藏垂直菜单 (需要开启 JavaScript) +MAIN_DISABLE_METEO=禁用天气图标 +TestLoginToAPI=测试 API 登录 +ProxyDesc=Dolibarr 的一些功能需要互联网连接。请在此设置联网参数。如果 Dolibarr 服务器上网需要代理服务器,请设置下面的代理参数。 ExternalAccess=外部访问 -MAIN_PROXY_USE=使用代理服务器(否则直接访问互联网) +MAIN_PROXY_USE=使用代理服务器(否则直接访问互联网) MAIN_PROXY_HOST=代理服务器的名称/地址 MAIN_PROXY_PORT=代理服务器的端口 MAIN_PROXY_USER=登录使用代理服务器 MAIN_PROXY_PASS=使用代理服务器的密码 -DefineHereComplementaryAttributes=这里定义的所有atributes,不是已经默认提供的,而且你要为%s支持。 -ExtraFields=互补的属性 -ExtraFieldHasWrongValue=attribut %s有一个错误的值。 -SendingMailSetup=通过电子邮件的设置sendings -SendmailOptionNotComplete=警告,在某些Linux系统,从您的电子邮件发送电子邮件,必须conatins sendmail的执行设置选项-BA(参数mail.force_extra_parameters到你的php.ini文件)。如果收件人没有收到电子邮件,尝试编辑mail.force_extra_parameters =-BA)这个PHP参数。 -SendmailOptionMayHurtBuggedMTA=功能使用方法“PHP的mail直接”发送电子邮件,将生成一个邮件,可能会不正确地解析一些接收邮件服务器。结果是不能由thoose窃听平台的托管人阅读一些邮件。这是一些互联网服务提供商(例如:在法国Orange)的情况下。这不是一个将Dolibarr也不到PHP中,但到接收邮件服务器的问题。但是,您可以选项MAIN_FIX_FOR_BUGGED_MTA添加1,进入设置 - 其他,修改Dolibarr避免这种情况。然而,你可能会遇到与其他服务器的问题,严格遵守SMTP标准。其他的解决办法(建议报告)是使用的方法“SMTP套接字库”,有没有坏处。 -CompanyIdProfChecker=专业ID的唯一 -MustBeUnique=必须是唯一的吗? -Miscellaneous=杂项 +DefineHereComplementaryAttributes=此处定义所有默认安装中没有,但您又希望能在 %s 中使用的属性。 +ExtraFields=自定义增补属性 +ExtraFieldsThirdParties=增补属性 (往来单位) +ExtraFieldsContacts=增补属性 (联系人/地址) +ExtraFieldsMember=增补属性 (成员) +ExtraFieldsMemberType=增补属性 (成员类型) +ExtraFieldsSupplierOrders=增补属性 (订单) +ExtraFieldsSupplierInvoices=增补属性 (发票) +ExtraFieldsProject=增补属性 (项目) +ExtraFieldsProjectTask=增补属性 (任务) +ExtraFieldHasWrongValue=属性 %s 的值有错误。 +AlphaNumOnlyCharsAndNoSpace=仅限英文字母 (不包括空格) +SendingMailSetup=通过电邮发送的设置 +SendmailOptionNotComplete=Warning, on some Linux systems, to send email from your email, sendmail execution setup must contains option -ba (parameter mail.force_extra_parameters into your php.ini file). If some recipients never receive emails, try to edit this PHP parameter with mail.force_extra_parameters = -ba). +PathToDocuments=文件路径 +PathDirectory=目录 +SendmailOptionMayHurtBuggedMTA=Feature to send mails using method "PHP mail direct" will generate a mail message that might be not correctly parsed by some receiving mail servers. Result is that some mails can't be read by people hosted by thoose bugged platforms. It's case for some Internet providers (Ex: Orange in France). This is not a problem into Dolibarr nor into PHP but onto receiving mail server. You can however add option MAIN_FIX_FOR_BUGGED_MTA to 1 into setup - other to modify Dolibarr to avoid this. However, you may experience problem with other servers that respect strictly the SMTP standard. The other solution (recommanded) is to use the method "SMTP socket library" that has no disadvantages. +TranslationSetup=Configuration de la traduction +TranslationDesc=Choice of language visible on screen can be modified:
* Globally from menu Home - Setup - Display
* For user only from tab User display of user card (click on login on top of screen). +TotalNumberOfActivatedModules=Total number of activated feature modules: %s +YouMustEnableOneModule=您必须至少启用 1 个模块 +ClassNotFoundIntoPathWarning=PHP 路径中未发现 类 %s +YesInSummer=是(在夏天) +OnlyFollowingModulesAreOpenedToExternalUsers=注意,仅如下模块向外部用户开放。(无论外部用户的权限如何): +SuhosinSessionEncrypt=会话存储空间已用 Suhosin 加密 +ConditionIsCurrently=当前条件为 %s + +##### Module password generation +PasswordGenerationStandard=返回一个根据 Dolibarr 内部算法生成的密码:8个字符,包含小写数字和字母。 +PasswordGenerationNone=不使用自动生成的密码。用户必须手动输入密码。 +##### Users setup ##### +UserGroupSetup=用户和组模块设置 +GeneratePassword=推荐一个随机生成的密码 +RuleForGeneratedPasswords=生成推荐密码和验证密码的规则 +DoNotSuggest=禁止推荐密码 +EncryptedPasswordInDatabase=允许数据库中的密码加密 +DisableForgetPasswordLinkOnLogonPage=登陆页面不显示“忘记密码”链接 +UsersSetup=用户模块设置 +UserMailRequired=新用户创建时需要输入电子邮件 +##### Company setup ##### +CompanySetup=客户/供应商模块及其相关参数设置 +CompanyCodeChecker=第三方编号产生及检查模块设定 +AccountCodeManager=会计编号产生及检查模块设定(客户或供应商) +ModuleCompanyCodeAquarium=根据以下编码原则返回会计编号:
以 %s 为前置字串,并紧接著供应商编码。
以 %s 为前置字串,并紧接著客户编码。 +ModuleCompanyCodePanicum=只会回传一个空的会计编号 +ModuleCompanyCodeDigitaria=会计编号取决于第三方的编号。代码以C开头,后跟第三方单位的 5 位代码 +UseNotifications=使用通知 +NotificationsDesc=电邮通知功能令您可以将 Dolibarr 中的事件通过邮件自动通知给所设定的第三方(客户或供应商)。Choice of active notification and targets contacts is made one third party at time. +ModelModules=文件模板 +DocumentModelOdt=使用 OpenDocuments 模板(ODT格式: OpenOffice、KOffice、TextEdit,...)生成文档 +WatermarkOnDraft=为草稿文档加水印 +CompanyIdProfChecker=Professional Id 规则 +MustBeUnique=必须是唯一 ID 吗? +MustBeMandatory=强制创建第三方时必需设置? +MustBeInvoiceMandatory=强制确认发票时必需设置? +Miscellaneous=杂项设定 +##### Webcal setup ##### +WebCalSetup=Webcalendar 链接设置 +WebCalSyncro=添加 Dolibarr 事件至 WebCalendar +WebCalAllways=一如既往,不再询问 +WebCalYesByDefault=按需设置 (默认是) +WebCalNoByDefault=按需设置 (默认否) +WebCalNever=从不 +WebCalURL=访问的日历 URL +WebCalServer=服务器托管日历数据库 +WebCalDatabaseName=数据库名称 +WebCalUser=访问数据库的用户名 +WebCalSetupSaved=Webcalendar 设置保存成功。 +WebCalTestOk=成功连接到服务器'%s'的数据库'%s'上,身份用户 '%s'。 +WebCalTestKo1=服务器'%s'连接成功,但无法打开数据库'%s'。 +WebCalTestKo2=以用户身份'%s'连接至服务器'%s' 失败。 +WebCalErrorConnectOkButWrongDatabase=数据库连接成功,但并不指望成为Webcalendar数据库。 +WebCalAddEventOnCreateActions=添加建立行动日历事件 +WebCalAddEventOnCreateCompany=添加公司创建日历事件 +WebCalAddEventOnStatusPropal=日程中显示报价单的状态变化 +WebCalAddEventOnStatusContract=日程中显示合同的状态变化 +WebCalAddEventOnStatusBill=日程中显示账单的状态变化 +WebCalAddEventOnStatusMember=日程中显示成员的状态的变化 +WebCalUrlForVCalExport=%s格式的导出文件可以通过链接 %s 下载 +WebCalCheckWebcalSetup=也许 Webcal 模块的设置不正确。 +##### Invoices ##### +BillsSetup=付款明细模块设置 +BillsDate=明细日期 +BillsNumberingModule=付款明细与信用票据编号模块 +BillsPDFModules=付款明细文档模板 +CreditNoteSetup=信用票据模块设置 +CreditNotePDFModules=信用票据文档模板 +CreditNote=信用票据 +CreditNotes=信用票据 +ForceInvoiceDate=强制明细中的日期为确认日期 +DisableRepeatable=禁用循环明细功能 +SuggestedPaymentModesIfNotDefinedInInvoice=如果明细中未设置付款方式,设置一个默认值付款方式。 +EnableEditDeleteValidInvoice=允许对未结清付款明细的编辑/删除 +SuggestPaymentByRIBOnAccount=根据帐户提款方式提示付款方式 +SuggestPaymentByChequeToAddress=根据支票地址提示付款方式 +FreeLegalTextOnInvoices=付款明细中的额外说明文本 +WatermarkOnDraftInvoices=为发票草稿加水印 (如果有) +##### Proposals ##### +PropalSetup=报价单模块设置 +CreateForm=建立表单 +NumberOfProductLines=产品行数 +ProposalsNumberingModules=报价单编号模块 +ProposalsPDFModules=报价单文档模板 +ClassifiedInvoiced=发票分类 +HideTreadedPropal=列表中隐藏处理完毕的报价单 +AddShippingDateAbility=添加发货日期的能力 +AddDeliveryAddressAbility=添加交付日期的能力 +UseOptionLineIfNoQuantity=定量为0的产品或服务项视为可选项* +FreeLegalTextOnProposal=报价单中的额外说明文本 +WatermarkOnDraftProposal=为报价单草稿加水印(如果有) +##### Orders ##### +OrdersSetup=订单管理设置 +OrdersNumberingModules=订单编号模块 +OrdersModelModule=订单文档模板 +HideTreadedOrders=列表中隐藏已处理或取消的订单 +ValidOrderAfterPropalClosed=To validate the order after proposal closer, makes it possible not to step by the provisional order +FreeLegalTextOnOrders=订单中的额外说明文本 +WatermarkOnDraftOrders=为订单草稿加水印(如果有) +##### Clicktodial ##### +ClickToDialSetup=点击拨号模块设置 +ClickToDialUrlDesc=Url called when a click on phone picto is done. In URL, you can use tags
__PHONETO__ that will be replaced with the phone number of person to call
__PHONEFROM__ that will be replaced with phone number of calling person (yours)
__LOGIN__ that will be replaced with your clicktodial login (defined on your user card)
__PASS__ that will be replaced with your clicktodial password (defined on your user card). +##### Bookmark4u ##### +Bookmark4uSetup=Bookmark4u 模块设置 +##### Interventions ##### +InterventionsSetup=干预模块设置 +FreeLegalTextOnInterventions=干预文档中的额外说明文本 +FicheinterNumberingModules=干预编号模块 +TemplatePDFInterventions=干预信息卡文档模板 +WatermarkOnDraftInterventionCards=干预卡文档加水印(如果有) +##### Contracts ##### ContractsSetup=合同模块的设置 ContractsNumberingModules=合同编号模块 -AdherentLoginRequired=管理每个成员登录 -ServiceSetup=服务模块的设置 +##### Members ##### +MembersSetup=会员模块设置 +MemberMainOptions=主要选项 +AddSubscriptionIntoAccount=当添加新的已支付订阅时,默认提示在银行模块中创建银行交易。 +AdherentLoginRequired= 管理成员登录 +AdherentMailRequired=创建新成员时要求输入电子邮件 +MemberSendInformationByMailByDefault=设置向成员发送邮件确认(成员确认或添加订阅)复选框默认为启用 +##### LDAP setup ##### +LDAPSetup=LDAP 设置 +LDAPGlobalParameters=全局参数 +LDAPUsersSynchro=用户 +LDAPGroupsSynchro=群组 +LDAPContactsSynchro=联系人 +LDAPMembersSynchro=成员 +LDAPSynchronization=LDAP 同步 +LDAPFunctionsNotAvailableOnPHP=您的 PHP 中 LDAP 功能不可用 +LDAPToDolibarr=LDAP - > Dolibarr +DolibarrToLDAP=Dolibarr - > LDAP +LDAPNamingAttribute=LDAP 中的键(Key) +LDAPSynchronizeUsers=LDAP 中用户的组织 +LDAPSynchronizeGroups=LDAP 中群组的组织 +LDAPSynchronizeContacts=LDAP 联系人的组织 +LDAPSynchronizeMembers=LDAP 中公司成员的组织 +LDAPTypeExample=OpenLdap, Egroupware 或 Active Directory +LDAPPrimaryServer=主服务器 +LDAPSecondaryServer=副服务器 +LDAPServerPort=服务器端口 +LDAPServerPortExample=默认端口: 389 +LDAPServerProtocolVersion=协议版本 +LDAPServerUseTLS=使用 TLS +LDAPServerUseTLSExample=您的 LDAP 服务器使用 TLS +LDAPServerDn=服务器的 DN +LDAPAdminDn=管理员的 DN +LDAPAdminDnExample=完整的 DN (例如:cn=admin,dc=example,dc=com) +LDAPPassword=管理员密码 +LDAPUserDn=用户的 DN +LDAPUserDnExample=完整的 DN (例如:ou=users,dc=example,dc=com) +LDAPGroupDn=组的 DN +LDAPGroupDnExample=完整的 DN (例如:ou=groups,dc=example,dc=com) +LDAPServerExample=服务器地址 (例如: 本地主机,192.168.0.2,ldaps://ldap.example.com/) +LDAPServerDnExample=完整的 DN (例如:dc=example,dc=com) +LDAPPasswordExample=管理员密码 +LDAPDnSynchroActive=用户和组同步 +LDAPDnSynchroActiveExample=LDAP->Dolibarr 或 Dolibarr->LDAP 同步 +LDAPDnContactActive=联系人的同步 +LDAPDnContactActiveYes=激活的同步 +LDAPDnContactActiveExample=已激活/取消的同步 +LDAPDnMemberActive=成员的同步 +LDAPDnMemberActiveExample=已激活/取消的同步 +LDAPContactDn=Dolibarr 联系人的 DN +LDAPContactDnExample=完整的 DN (例如:ou=contacts,dc=example,dc=com) +LDAPMemberDn=Dolibarr 成员的 DN +LDAPMemberDnExample=完整的 DN (例如:ou=members,dc=example,dc=com) +LDAPMemberObjectClassList=objectClass 列表 +LDAPMemberObjectClassListExample=定义记录属性的 (例如:AD 的 top,groupOfUniqueNames) 的objectClass列表 +LDAPUserObjectClassList=objectClass 列表 +LDAPUserObjectClassListExample=定义记录属性的 (例如:AD 的 top,groupOfUniqueNames) 的objectClass列表 +LDAPGroupObjectClassList=objectClass 列表 +LDAPGroupObjectClassListExample=定义记录属性的 (例如:AD 的 top,groupOfUniqueNames) 的objectClass列表 +LDAPContactObjectClassList=objectClass 列表 +LDAPContactObjectClassListExample=定义记录属性的 (例如:AD 的 top,groupOfUniqueNames) 的objectClass列表 +LDAPMemberTypeDn=Dolibarr成员类型的 DN +LDAPMemberTypeDnExample=完整的 DN (例如:ou=type_members,dc=example,dc=com) +LDAPTestConnect=测试 LDAP 连接 +LDAPTestSynchroContact=测试联系人的同步 +LDAPTestSynchroUser=测试用户的同步 +LDAPTestSynchroGroup=测试组的同步 +LDAPTestSynchroMember=测试成员的同步 +LDAPTestSearch= 测试 LDAP 搜索 +LDAPSynchroOK=同步测试成功 +LDAPSynchroKO=同步测试失败 +LDAPSynchroKOMayBePermissions=同步测试失败。请检查连接服务器已经正确设置并允许LDAP更新 +LDAPTCPConnectOK=TCP 连接到 LDAP 服务器连接成功 (服务器=%s, 端口=%s) +LDAPTCPConnectKO=TCP 连接到 LDAP 服务器连接失败 (服务器=%s, 端口=%s) +LDAPBindOK=LDAP 服务器连接/认证 成功(服务器=%s,用户=%s,密码=%s) +LDAPBindKO=LDAP 服务器连接/认证 失败(服务器=%s,用户=%s,密码=%s) +LDAPUnbindSuccessfull=成功断开 +LDAPUnbindFailed=断开失败 +LDAPConnectToDNSuccessfull=成功连接至 DN (%s) +LDAPConnectToDNFailed=连接至 DN (%s) 失败 +LDAPSetupForVersion3=LDAP服务器版本配置为 v3 +LDAPSetupForVersion2=LDAP服务器版本配置为 v2 +LDAPDolibarrMapping=Dolibarr 映射 +LDAPLdapMapping=LDAP 映射 +LDAPFieldLoginUnix=登录 (Unix) +LDAPFieldLoginExample=例如:UID +LDAPFilterConnection=搜索筛选器 +LDAPFilterConnectionExample=例如: &(objectClass=inetOrgPerson) +LDAPFieldLoginSamba=登录 (samba,activedirectory) +LDAPFieldLoginSambaExample=例如: samaccountname +LDAPFieldFullname=全名 +LDAPFieldFullnameExample=例如: CN +LDAPFieldPassword=密码 +LDAPFieldPasswordNotCrypted=明文密码 +LDAPFieldPasswordCrypted=加密密码 +LDAPFieldPasswordExample=例如:userPassword +LDAPFieldCommonName=通用名称 (CN) +LDAPFieldCommonNameExample=例如: CN +LDAPFieldName=名称 +LDAPFieldNameExample=例如:SN +LDAPFieldFirstName=名 +LDAPFieldFirstNameExample=例如:张 +LDAPFieldMail=电邮地址 +LDAPFieldMailExample=例如:邮件 +LDAPFieldPhone=办公电话号码 +LDAPFieldPhoneExample=例如:5131654 +LDAPFieldHomePhone=个人电话号码 +LDAPFieldHomePhoneExample=例如:541562 +LDAPFieldMobile=手机 +LDAPFieldMobileExample=例如:138256160 +LDAPFieldFax=传真号 +LDAPFieldFaxExample=例如: 5174654 +LDAPFieldAddress=街道 +LDAPFieldAddressExample=例如:华盛顿宪法大道 +LDAPFieldZip=邮编 +LDAPFieldZipExample=例如:1254022 +LDAPFieldTown=城镇 +LDAPFieldTownExample=例如 :橙县 +LDAPFieldCountry=国家 +LDAPFieldCountryExample=例如:美国 +LDAPFieldDescription=描述 +LDAPFieldDescriptionExample=例如 :备注描述等等 +LDAPFieldGroupMembers= 组成员 +LDAPFieldGroupMembersExample= 例如:成员1 +LDAPFieldBirthdate=生日 +LDAPFieldBirthdateExample=例如: +LDAPFieldCompany=公司 +LDAPFieldCompanyExample=例如:埃克森美孚 +LDAPFieldSid=SID +LDAPFieldSidExample=例如:objectSID +LDAPFieldEndLastSubscription=订阅结束日期 +LDAPFieldTitle=职位/角色 +LDAPFieldTitleExample=例如: CXO +LDAPParametersAreStillHardCoded=LDAP 参数仍直接写入了联系人类(Class)的代码中无法修改 +LDAPSetupNotComplete=LDAP 的安装程序不完整的 (请检查其他选项卡) +LDAPNoUserOrPasswordProvidedAccessIsReadOnly=未提供管理员名称或密码LDAP 将以只读模式匿名访问。 +LDAPDescContact=此页面中可以定义 Dolibarr 联系人各项数据在 LDAP 树中的 LDAP 属性名称。 +LDAPDescUsers=此页面中可以定义 Dolibarr 用户各项数据在 LDAP 树中的 LDAP 属性名称。 +LDAPDescGroups=此页面中可以定义 Dolibarr 中用户组各项数据在 LDAP 树中的 LDAP 属性名称。 +LDAPDescMembers=此页面中可以定义 Dolibarr 成员各项数据在 LDAP 树中的 LDAP 属性名称。 +LDAPDescValues=例值以载入如下模式的 OpenLDAP为例:core.schema, cosine.schema, inetorgperson.schema)如果您使用OpenLDAP和这些例值,请修改您的 LDAP 配置文件slapd.conf来载入全部这些模式。 +ForANonAnonymousAccess=存取访问要求验证, (例如写访问) +##### Products ##### +ProductSetup=产品模块设置 +ServiceSetup=服务模块设置 ProductServiceSetup=产品和服务模块的设置 -ViewProductDescInThirdpartyLanguageAbility=产品在第三方语言描述的可视化 -ListOfAvailableNotifications=可用的通知名单(此名单上激活的模块依赖) -SendingsNumberingModules=sendings编号模块 -FreeLegalTextOnShippings=自由文本上shippings +NumberOfProductShowInSelect=下拉菜单中的最大产品数量(0=无限制) +ConfirmDeleteProductLineAbility=从表单中删除产品时要求确认 +ModifyProductDescAbility=允许更改表单中的产品说明 +ViewProductDescInFormAbility=表单中是否可以直接显示产品描述资讯(如果关闭则用弹出工具提示显示) +ViewProductDescInThirdpartyLanguageAbility=是否可以直接显示其他语系的产品描述资讯 +UseSearchToSelectProduct=使用自动完成栏方式选择产品(来代替下来菜单)

如果你有大于100000个的产品信息,可以通过修改 PRODUCT_DONOTSEARCH_ANYWHERE 常数为 1 来提速。这样自动完成功能会被限制为从字首开始依次匹配。 +UseEcoTaxeAbility=支持生态附加税 (WEEE) +SetDefaultBarcodeTypeProducts=默认的条码类型 +SetDefaultBarcodeTypeThirdParties=第三方用默认条码类型 +ProductCodeChecker= 产品/服务编号的生成与检查模块 +ProductOtherConf= 产品/服务 配置 +##### Syslog ##### +SyslogSetup=系统日志模块设置 +SyslogOutput=日志输出 +SyslogSyslog=系统日志 +SyslogFacility=记录设备 +SyslogLevel=水平 +SyslogSimpleFile=文件 +SyslogFilename=文件名称和路径 +YouCanUseDOL_DATA_ROOT=您可以使用 DOL_DATA_ROOT/dolibarr.log 来表示“documents”目录下的日志文件。您可以设置不同的路径来保存此文件。 +ErrorUnknownSyslogConstant=常量 %s 不是已知的 Syslog 常数 +OnlyWindowsLOG_USER=Windows 仅支持 LOG_USER +##### Donations ##### +DonationsSetup=捐赠模块设置 +DonationsReceiptModel=捐赠收据模板 +##### Barcode ##### +BarcodeSetup=条码设置 +PaperFormatModule=打印格式模块 +BarcodeEncodeModule=条码编码类型 +UseBarcodeInProductModule=对产品使用条形码 +CodeBarGenerator=条码产生器 +ChooseABarCode=没有定义条码产生器 +FormatNotSupportedByGenerator=条码产生器不支持此格式 +BarcodeDescEAN8=EAN 8 条码 +BarcodeDescEAN13=一般商品常用的 EAN 13 条码 +BarcodeDescUPC=通用产品条码(UPC) +BarcodeDescISBN=ISBN 书籍条码 +BarcodeDescC39=Code 39 条码 +BarcodeDescC128=Code 128 条码 +GenbarcodeLocation=条形码生成用的命令行工具 (内部引擎用来生成某些类型的条码) +BarcodeInternalEngine=内部引擎 +##### Prelevements ##### +WithdrawalsSetup=提款模块设置 +##### ExternalRSS ##### +ExternalRSSSetup=外部 RSS 的导入设置 +NewRSS=新增 RSS 源 +RSSUrl=RSS 链接 +RSSUrlExample=感兴趣的 RSS 源 +##### Mailing ##### +MailingSetup=电邮发送模块设置 +MailingEMailFrom=邮件模块所使用的邮件发件人 +MailingEMailError=对错误的电子邮件发送错误通知邮件(慎用避免循环退信造成IP拉入黑名单) +##### Notification ##### +NotificationSetup=电邮通知模块设置 +NotificationEMailFrom=通知模块所使用的邮件发件人 +ListOfAvailableNotifications=可用的通知名单 (项目视实际启用的模块而定) +##### Sendings ##### +SendingsSetup=发货单模块设置 +SendingsReceiptModel=发货单据模板 +SendingsNumberingModules=发货单编号模块 +SendingsAbility=发货单支持客户收货回执功能 +NoNeedForDeliveryReceipts=通常发货单同时被用来作为发货清单和收货回执,由客户接收并签字。所以产品收货回执/交付回执是此功能的重复,很少使用。 +FreeLegalTextOnShippings=发货单中的额外说明文本 +##### Deliveries ##### +DeliveryOrderNumberingModules=收货回执编号模块 +DeliveryOrderModel=收货回执模块 +DeliveriesOrderAbility=支持产品收货回执 +FreeLegalTextOnDeliveryReceipts=收货回执中的额外说明文本 +##### FCKeditor ##### AdvancedEditor=高级编辑 -HideUnauthorizedMenu=隐藏未经授权的菜单(灰色) -SupposedToBeInvoiceDate=使用的发票日期 -InvoiceDateUsed=使用的发票日期 -AccountancyCode=会计守则 -BankOrderShow=显示使用“详细的银行数目”国家为了银行帐户 +ActivateFCKeditor=为以下为功能启用高级编辑器功能: +FCKeditorForCompany=描述及注解采用所见即所得的方式建立或编辑(不含产品及服务) +FCKeditorForProduct=产品/服务的描述及注解采用所见即所得的方式建立或编辑 +FCKeditorForProductDetails=以所见即所得方式创建/编辑产品及所有文档(报价、订单、明细等...)的详情。警告: 此项功能不推荐使用,因为可能造成PDF文档中的特殊字符和页面排版问题。 +FCKeditorForMailing= 以所见即所得方式创建/编辑群发邮件(工具->电邮寄送) +FCKeditorForUserSignature=以所见即所得方式创建/编辑用户签名 +FCKeditorForMail=以所见即所得方式创建/编辑所有邮件(工具->电邮寄送 除外) +##### OSCommerce 1 ##### +OSCommerceErrorConnectOkButWrongDatabase=数据库连接成功,似乎并非 oscommerce 的数据库 (键 % 在表 %s 中不存在)。 +OSCommerceTestOk=成功连接到服务器'%s'的数据库'%s'上,身份用户 '%s'。 +OSCommerceTestKo1=服务器'%s'连接成功,但无法打开数据库'%s'。 +OSCommerceTestKo2=以用户身份'%s'连接至服务器'%s' 失败。 +##### Mantis ##### +MantisSetup=Mantis 连接设置 +MantisURL=Mantis 访问链接 +MantisServer=Mantis 数据库托管服务器 +MantisDatabaseName=数据库名称 +MantisUser=访问数据库的用户名 +MantisSetupSaved=螳螂设置保存成功。 +MantisTestOk=成功连接到服务器'%s'的数据库'%s'上,身份用户 '%s'。 +MantisTestKo1=服务器'%s'连接成功,但无法打开数据库'%s'。 +MantisTestKo2=以用户身份'%s'连接至服务器'%s' 失败。 +MantisErrorConnectOkButWrongDatabase=连接成功了,但是数据库不看是 Mantis 数据库。 +##### Stock ##### +StockSetup=库存模块设置 +UserWarehouse=*启用用户自定义库存 +##### Menu ##### +MenuDeleted=菜单(项)已删除 +TreeMenu=树状菜单 +Menus=菜单 +TreeMenuPersonalized=个性化选单 +NewMenu=新建菜单 +MenuConf=菜单设置 +Menu=菜单的选择 +MenuHandler=菜单处理程序 +MenuModule=源模块 +HideUnauthorizedMenu= 隐藏未经授权的菜单 (灰色) +DetailId=菜单编号 +DetailMenuHandler=菜单处理程序 (决定何处显示新菜单) +DetailMenuModule=模块名称 (如果菜单项来自模块) +DetailType=菜单类型 (顶部或左侧) +DetailTitre=翻译用的菜单标签或标签代码 +DetailMainmenu=其所属组 (过时) +DetailUrl=菜单指向的URL (绝对链接或尾部链接,以http://开头) +DetailLeftmenu=是否按条件显示 (过时) +DetailEnabled=菜单是否显示的条件 +DetailRight=菜单显示为变灰禁用的条件 +DetailLangs=标签翻译使用的 .lang 文件名 +DetailUser=内部/外部/全部 +Target=目标 +DetailTarget=目标链接 (_blank top 开新窗口) +DetailLevel=级 (-1:顶部菜单,0:头菜单,> 0菜单和子菜单) +ModifMenu=菜单变化 +DeleteMenu=删除选单项 +ConfirmDeleteMenu=你确定要删除菜单条目 %s 吗? +DeleteLine=删除行 +ConfirmDeleteLine=你确定要删除此行吗? +##### Tax ##### +TaxSetup=税,社会贡献和红利模块设置 +OptionVatMode=增值税到期 +OptionVATDefault=标准 +OptionVATDebitOption=借记可选服务 +OptionVatDefaultDesc=增值税到期:
- 商品完成交货(按付款明细的时间)
- 服务付款 +OptionVatDebitOptionDesc=增值税到期:
- 交货/付款商品 (按付款明细的时间)
- 服务的付款明细(借记)发出 +SummaryOfVatExigibilityUsedByDefault=Time of VAT exigibility by default according to choosed option: +OnDelivery=交货时 +OnPayment=付款时 +OnInvoice=发出付款明细时 +SupposedToBePaymentDate=所有付款日期 +SupposedToBeInvoiceDate=所用付款明细日期 +Buy=采购 +Sell=销售 +InvoiceDateUsed=所用付款明细日期 +YourCompanyDoesNotUseVAT=贵公司已被定义为不使用增值税 (首页->设定->公司/基金会),所以没有设置增值税的选项。 +AccountancyCode=会计代码 +AccountancyCodeSell=销售账户代码 +AccountancyCodeBuy=采购账户代码 +##### Agenda ##### +AgendaSetup=事件及行程模块设置 +PasswordTogetVCalExport=导出链接的授权密钥 +PastDelayVCalExport=不要导出事件,如果事件日期旧于 +AGENDA_USE_EVENT_TYPE=使用事件类型 (管理请到 设定->下拉列表项->llx_c_actioncomm) +##### ClickToDial ##### +ClickToDialDesc=此模块可以在电话号码后添加图标点击此图标将根据您设置的URL呼叫服务器。您可以用此从Dolibarr中拨打呼叫中心系统,例如来通过SIP系统呼叫电话号码。 +##### Point Of Sales (CashDesk) ##### +CashDesk=POS +CashDeskSetup=POS 模块设置 +CashDeskThirdPartyForSell=销售用通用第三方 +CashDeskBankAccountForSell=接收现金付款的默认帐户 +CashDeskBankAccountForCheque= 接收支票付款的默认帐户 +CashDeskBankAccountForCB= 接收信用卡支付的默认帐户 +CashDeskIdWareHouse=销售发货仓库 +##### Bookmark ##### +BookmarkSetup=书签模块设置 +BookmarkDesc=此模块可以管理您的书签您也可以将Dolibarr的任意页面加入您的左侧菜单中。 +NbOfBoomarkToShow=左侧菜单中显示书签的最大数量 +##### WebServices ##### +WebServicesSetup=SOAP Webservice 模块设置 +WebServicesDesc=启用此模块,Dolibarr成为Web服务器提供其他Web服务。 +WSDLCanBeDownloadedHere=提供服务的 WSDL描述文件可以从此处下载 +EndPointIs=SOAP客户端发送请求至 Dolibarr 的必需通过链接 +##### Bank ##### +BankSetupModule=银行模块设置 +FreeLegalTextOnChequeReceipts=支票回执中的额外说明文本 +BankOrderShow=Display order of bank accounts for countries using "detailed bank number" BankOrderGlobal=一般 BankOrderGlobalDesc=一般的显示顺序 -BankOrderES=西班牙人 -BankOrderESDesc=西班牙的显示顺序 -MailmanSpipSetup=梅尔曼和SPIP模块安装 -SuppliersInvoiceModel=完整的模板供应商发票。(logo. ...) -// STOP - Lines generated via autotranslator.php tool (2012-02-29 17:39:17). +BankOrderES=Spanish +BankOrderESDesc=Spanish display order +##### Multicompany ##### +MultiCompanySetup=多公司模块设置 +##### Suppliers ##### +SuppliersSetup=供应商模块设置 +SuppliersCommandModel=采购合同的完整模板(标识...) +SuppliersInvoiceModel=采购发票的完整模板(标识...) +SuppliersInvoiceNumberingModel=采购付款明细编号模块 +##### GeoIPMaxmind ##### +GeoIPMaxmindSetup=Maxmind Geoip 模块设置 +PathToGeoIPMaxmindCountryDataFile=包含Maxmind 国家/IP转换库的文件路径。
例如: /usr/local/share/GeoIP/GeoIP.dat +NoteOnPathLocation=注意此数据文件所处目录您的PHP必需能读取(检查您 PHP 的 open_basedir 设置和文件系统权限)。 +YouCanDownloadFreeDatFileTo=您可以下载 Maxmind GeoIP 的 免费演示版 国家数据文件,位置在 %s。 +YouCanDownloadAdvancedDatFileTo=您也可以下载更加完整更新更快的 Maxmind GeoIP 国家文件版本,位置在 %s。 +TestGeoIPResult=测试保留 IP->国家 +##### Projects ##### +ProjectsNumberingModules=项目编号模块 +ProjectsSetup=项目模块设置 +ProjectsModelModule=项目报告文档模板 +##### ECM (GED) ##### +ECMSetup = GED 设置 +ECMAutoTree = 自动树形文件夹和文档 diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php index 6bee9a606ca..5a39f4b09ef 100644 --- a/htdocs/main.inc.php +++ b/htdocs/main.inc.php @@ -823,9 +823,9 @@ if (! defined('NOREQUIREMENU')) foreach($dirmenus as $dirmenu) { $menufound=dol_include_once($dirmenu."standard/".$file_menu); - if ($menufound) break; + if (class_exists('MenuManager')) break; } - if (! $menufound) // If failed to include, we try with standard + if (! class_exists('MenuManager')) // If failed to include, we try with standard eldy_menu.php { dol_syslog("You define a menu manager '".$file_menu."' that can not be loaded.", LOG_WARNING); $file_menu='eldy_menu.php'; @@ -987,7 +987,7 @@ function top_htmlhead($head, $title='', $disablejs=0, $disablehead=0, $arrayofjs //$arrayofcss=array('/includes/jquery/plugins/jquerytreeview/jquery.treeview.css'); print ''."\n"; } - + } print ''."\n"; diff --git a/htdocs/societe/note.php b/htdocs/societe/note.php index 8fbd6c6187f..372177c0c89 100644 --- a/htdocs/societe/note.php +++ b/htdocs/societe/note.php @@ -25,10 +25,6 @@ * \ingroup societe */ -error_reporting(E_ALL); -ini_set('display_errors', true); -ini_set('html_errors', false); - require '../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; diff --git a/htdocs/theme/amarok/style.css.php b/htdocs/theme/amarok/style.css.php index 5788b0f011f..4f55463a323 100755 --- a/htdocs/theme/amarok/style.css.php +++ b/htdocs/theme/amarok/style.css.php @@ -557,6 +557,15 @@ img.login, img.printer, img.entity { font-weight:bold; } +.alogin { + color: #FFF; + font-weight: normal; +} +.alogin:hover { + color: #FFF; + text-decoration:underline; +} + div.login_main_home { color: #000000; } diff --git a/htdocs/theme/auguria/style.css.php b/htdocs/theme/auguria/style.css.php index f998fdc4e9c..41bdadf037c 100644 --- a/htdocs/theme/auguria/style.css.php +++ b/htdocs/theme/auguria/style.css.php @@ -596,6 +596,15 @@ div.login a:hover { text-decoration:underline; } +.alogin, .alogin:hover { + color: #888 !important; + font-weight: normal !important; + font-size: px !important; +} +.alogin:hover { + text-decoration:underline !important; +} + img.login, img.printer, img.entity { padding: dol_optimize_smallscreen?'0':'8')?>px 0px 0px 0px; margin: 0px 0px 0px 8px; diff --git a/htdocs/theme/bureau2crea/style.css.php b/htdocs/theme/bureau2crea/style.css.php index f87364fef9b..46abe55ecae 100644 --- a/htdocs/theme/bureau2crea/style.css.php +++ b/htdocs/theme/bureau2crea/style.css.php @@ -640,6 +640,15 @@ div.login a:hover { text-decoration:underline; } +.alogin, .alogin:hover { + color: #888 !important; + font-weight: normal !important; + font-size: px !important; +} +.alogin:hover { + text-decoration:underline !important; +} + img.login, img.printer, img.entity { padding: dol_optimize_smallscreen?'0':'8')?>px 0px 0px 0px; margin: 0px 0px 0px 8px; diff --git a/htdocs/theme/cameleo/style.css.php b/htdocs/theme/cameleo/style.css.php index 568e81f13f2..be7c6532f44 100644 --- a/htdocs/theme/cameleo/style.css.php +++ b/htdocs/theme/cameleo/style.css.php @@ -651,6 +651,15 @@ div.login a:hover { text-decoration:underline; } +.alogin, .alogin:hover { + color: #888 !important; + font-weight: normal !important; + font-size: px !important; +} +.alogin:hover { + text-decoration:underline !important; +} + img.login, img.printer, img.entity { padding: dol_optimize_smallscreen?'0':'8')?>px 0px 0px 0px; margin: 0px 0px 0px 8px; diff --git a/htdocs/theme/eldy/style.css.php b/htdocs/theme/eldy/style.css.php index 1fbca3e51a0..02e871c20f6 100644 --- a/htdocs/theme/eldy/style.css.php +++ b/htdocs/theme/eldy/style.css.php @@ -854,7 +854,14 @@ div.login a:hover { color: #; text-decoration:underline; } - +.alogin, .alogin:hover { + color: #888 !important; + font-weight: normal !important; + font-size: px !important; +} +.alogin:hover { + text-decoration:underline !important; +} img.login, img.printer, img.entity { padding: dol_optimize_smallscreen?'0':'8')?>px 0px 0px 0px; margin: 0px 0px 0px 8px; @@ -870,6 +877,8 @@ img.login, img.printer, img.entity { div.vmenu, td.vmenu { margin-: 2px; + position: relative; + float: left; padding: 0px; padding-bottom: 0px; padding-top: 1px; diff --git a/htdocs/viewimage.php b/htdocs/viewimage.php index 864bd9cb5af..efa2dbe576d 100644 --- a/htdocs/viewimage.php +++ b/htdocs/viewimage.php @@ -57,8 +57,7 @@ $action=GETPOST('action','alpha'); $original_file=GETPOST("file"); $modulepart=GETPOST('modulepart','alpha'); $urlsource=GETPOST("urlsource"); -$entity=GETPOST('entity','int'); -if ($entity == '') $entity=1; // For backward compatibility +$entity=GETPOST('entity')?GETPOST('entity','int'):$conf->entity; // Security check if (empty($modulepart)) accessforbidden('Bad value for parameter modulepart'); @@ -98,9 +97,12 @@ else $type=dol_mimetype($original_file); // Suppression de la chaine de caractere ../ dans $original_file $original_file = str_replace("../","/", $original_file); +// Find the subdirectory name as the reference +$refname=basename(dirname($original_file)."/"); + // Security check if (empty($modulepart)) accessforbidden('Bad value for parameter modulepart'); -$check_access = dol_check_secure_access_document($modulepart,$original_file,$entity); +$check_access = dol_check_secure_access_document($modulepart,$original_file,$entity,$refname); $accessallowed = $check_access['accessallowed']; $sqlprotectagainstexternals = $check_access['sqlprotectagainstexternals']; $original_file = $check_access['original_file']; diff --git a/htdocs/webservices/server_other.php b/htdocs/webservices/server_other.php index bb296f56794..7b770823289 100644 --- a/htdocs/webservices/server_other.php +++ b/htdocs/webservices/server_other.php @@ -173,13 +173,16 @@ function getVersions($authentication) } -/* +/** * Method to get a document by webservice -* \param authentication array -* \param modulepart array Properties of document -* -*/ -function getDocument($authentication, $modulepart, $file) + * + * @param array $authentication Array with permissions + * @param string $modulepart Properties of document + * @param string $file Relative path + * @param string $refname Ref of object to check permission for external users (autodetect if not provided) + * @return void + */ +function getDocument($authentication, $modulepart, $file, $refname='') { global $db,$conf,$langs,$mysoc; @@ -194,8 +197,8 @@ function getDocument($authentication, $modulepart, $file) // Properties of doc $original_file = $file; $type=dol_mimetype($original_file); - $relativefilepath = $ref . "/"; - $relativepath = $relativefilepath . $ref.'.pdf'; + //$relativefilepath = $ref . "/"; + //$relativepath = $relativefilepath . $ref.'.pdf'; $accessallowed=0; @@ -218,10 +221,10 @@ function getDocument($authentication, $modulepart, $file) $original_file = str_replace("../","/", $original_file); // find the subdirectory name as the reference - $refname=basename(dirname($original_file)."/"); + if (empty($refname)) $refname=basename(dirname($original_file)."/"); // Security check - $check_access = dol_check_secure_access_document($modulepart,$original_file,$conf->entity); + $check_access = dol_check_secure_access_document($modulepart,$original_file,$conf->entity,$refname); $accessallowed = $check_access['accessallowed']; $sqlprotectagainstexternals = $check_access['sqlprotectagainstexternals']; $original_file = $check_access['original_file']; @@ -320,4 +323,4 @@ function getDocument($authentication, $modulepart, $file) // Return the results. $server->service($HTTP_RAW_POST_DATA); -?> +?> \ No newline at end of file diff --git a/scripts/bank/export-bank-receipts.php b/scripts/bank/export-bank-receipts.php new file mode 100755 index 00000000000..1d71c4edfe4 --- /dev/null +++ b/scripts/bank/export-bank-receipts.php @@ -0,0 +1,443 @@ +#!/usr/bin/php + + * + * 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 scripts/bank/export-bank-receipts.php + * \ingroup bank + * \brief Script file to export bank receipts into Excel files + */ + +$sapi_type = php_sapi_name(); +$script_file = basename(__FILE__); +$path=dirname(__FILE__).'/'; + +// Test if batch mode +if (substr($sapi_type, 0, 3) == 'cgi') { + echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n"; + exit; +} + +require_once($path."../../htdocs/master.inc.php"); +require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/bank.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php'; +require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent.class.php'; +require_once DOL_DOCUMENT_ROOT.'/compta/sociales/class/chargesociales.class.php'; +require_once DOL_DOCUMENT_ROOT.'/compta/paiement/class/paiement.class.php'; +require_once DOL_DOCUMENT_ROOT.'/compta/tva/class/tva.class.php'; +require_once DOL_DOCUMENT_ROOT.'/fourn/class/paiementfourn.class.php'; +require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php'; +require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php'; +require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php'; +require_once DOL_DOCUMENT_ROOT.'/compta/tva/class/tva.class.php'; +require_once DOL_DOCUMENT_ROOT.'/compta/sociales/class/paymentsocialcontribution.class.php'; + +// Global variables +$version=DOL_VERSION; +$error=0; + + + +/* + * Main + */ + +@set_time_limit(0); +print "***** ".$script_file." (".$version.") *****\n"; + +if (! isset($argv[3]) || ! $argv[3]) { + print "Usage: $script_file bank_ref bank_receipt_number (csv|tsv|excel|excel2007) [lang=xx_XX]\n"; + exit; +} +$bankref=$argv[1]; +$num=$argv[2]; +$model=$argv[3]; +$newlangid='en_EN'; // To force a new lang id + + +$invoicestatic=new Facture($db); +$invoicesupplierstatic=new FactureFournisseur($db); +$societestatic=new Societe($db); +$chargestatic=new ChargeSociales($db); +$memberstatic=new Adherent($db); +$paymentstatic=new Paiement($db); +$paymentsupplierstatic=new PaiementFourn($db); +$paymentsocialcontributionstatic=new PaymentSocialContribution($db); +$paymentvatstatic=new Tva($db); +$bankstatic=new Account($db); +$banklinestatic=new AccountLine($db); + + +// Parse parameters +foreach ($argv as $key => $value) +{ + $found=false; + + // Define options + if (preg_match('/^lang=/i',$value)) + { + $found=true; + $valarray=explode('=',$value); + $newlangid=$valarray[1]; + print 'Use language '.$newlangid.".\n"; + } +} +$outputlangs = $langs; +if (! empty($newlangid)) +{ + if ($outputlangs->defaultlang != $newlangid) + { + $outputlangs = new Translate("",$conf); + $outputlangs->setDefaultLang($newlangid); + } +} +$outputlangs->load("main"); +$outputlangs->load("bills"); +$outputlangs->load("companies"); +$outputlangs->load("banks"); +$outputlangs->load("members"); +$outputlangs->load("compta"); + + +$acct=new Account($db); +$result=$acct->fetch('',$bankref); +if ($result <= 0) +{ + print "Failed to find bank account with ref ".$bankref.".\n"; + exit; +} +else +{ + print "Export for bank account ".$acct->ref." (".$acct->label.").\n"; +} + + +// Creation de la classe d'export du model ExportXXX +$dir = DOL_DOCUMENT_ROOT . "/core/modules/export/"; +$file = "export_".$model.".modules.php"; +$classname = "Export".$model; +if (! dol_is_file($dir.$file)) +{ + print "No driver to export with format ".$model."\n"; + exit; +} +require_once $dir.$file; +$objmodel = new $classname($db); + + +// Define target path +$dirname = $conf->banque->dir_temp; +$filename = 'export-bank-receipts-'.$bankref.'-'.$num.'.'.$objmodel->extension; + + +$array_fields=array( +'bankreceipt'=>$outputlangs->transnoentitiesnoconv("AccountStatementShort"), 'bankaccount'=>$outputlangs->transnoentitiesnoconv("BankAccount"), +'dateop'=>$outputlangs->transnoentitiesnoconv("DateOperationShort"),'dateval'=>$outputlangs->transnoentitiesnoconv("DateValueShort"),'type'=>$outputlangs->transnoentitiesnoconv("Type"), +'description'=>$outputlangs->transnoentitiesnoconv("Description"), 'thirdparty'=>$outputlangs->transnoentitiesnoconv("Tiers"), 'accountelem'=>$outputlangs->transnoentitiesnoconv("Piece"), +'debit'=>$outputlangs->transnoentitiesnoconv("Debit"), 'credit'=>$outputlangs->transnoentitiesnoconv("Credit"), +'soldbefore'=>$outputlangs->transnoentitiesnoconv("BankBalanceBefore"), 'soldafter'=>$outputlangs->transnoentitiesnoconv("BankBalanceAfter"), +'comment'=>$outputlangs->transnoentitiesnoconv("Comment") +); +$array_selected=array( +'bankreceipt'=>'bankreceipt', 'bankaccount'=>'bankaccount', +'dateop'=>'dateop','dateval'=>'dateval','type'=>'type', +'description'=>'description', 'thirdparty'=>'thirdparty', 'accountelem'=>'accountelem', +'debit'=>'debit', 'credit'=>'credit', +'soldbefore'=>'soldbefore','soldafter'=>'soldafter', +'comment'=>'comment' +); +$array_export_TypeFields=array( +'bankreceipt'=>'Text', 'bankaccount'=>'Text', +'dateop'=>'Date','dateval'=>'Date','type'=>'Text', +'description'=>'Text', 'thirdparty'=>'Text', 'accountelem'=>'Text', +'debit'=>'Number', 'credit'=>'Number', +'soldbefore'=>'Number','soldafter'=>'Number', +'comment'=>'Text' +); + + +// Recherche les ecritures pour le releve +$listofnum="'"; +$arraynum=explode(',',$num); +foreach($arraynum as $val) +{ + if ($listofnum != "'") $listofnum.="','"; + $listofnum.=$val; +} +$listofnum.="'"; +$sql = "SELECT b.rowid, b.dateo as do, b.datev as dv,"; +$sql.= " b.amount, b.label, b.rappro, b.num_releve, b.num_chq, b.fk_type,"; +$sql.= " ba.rowid as bankid, ba.ref as bankref, ba.label as banklabel"; +$sql.= " FROM ".MAIN_DB_PREFIX."bank_account as ba"; +$sql.= ", ".MAIN_DB_PREFIX."bank as b"; +$sql.= " WHERE b.num_releve IN (".$listofnum.")"; +if (!isset($num)) $sql.= " OR b.num_releve is null"; +$sql.= " AND b.fk_account = ".$acct->id; +$sql.= " AND b.fk_account = ba.rowid"; +$sql.= $db->order("b.num_releve, b.datev, b.datec", "ASC"); // We add date of creation to have correct order when everything is done the same day +//print $sql; +$resql=$db->query($sql); +if ($resql) +{ + $balancebefore=array(); + + $numrows = $db->num_rows($resql); + + if ($numrows > 0) + { + // Open file + print 'Open file '.$filename.' into directory '.$dirname."\n"; + dol_mkdir($dirname); + $result=$objmodel->open_file($dirname."/".$filename, $outputlangs); + + if ($result < 0) + { + print 'Failed to create file '.$filename.' into dir '.$dirname.'.'."\n"; + return -1; + } + + // Genere en-tete + $objmodel->write_header($outputlangs); + + // Genere ligne de titre + $objmodel->write_title($array_fields,$array_selected,$outputlangs,$array_export_TypeFields); + } + + $i=0; + while ($i < $numrows) + { + $thirdparty=''; + $accountelem=''; + $comment=''; + + $objp = $db->fetch_object($resql); + + // Calculate start balance + if (! isset($balancebefore[$objp->num_releve])) + { + print 'Calculate start balance for receipt '.$objp->num_releve."\n"; + + $sql2 = "SELECT sum(b.amount) as amount"; + $sql2.= " FROM ".MAIN_DB_PREFIX."bank as b"; + $sql2.= " WHERE b.num_releve < '".$db->escape($objp->num_releve)."'"; + $sql2.= " AND b.fk_account = ".$objp->bankid; + $resql2=$db->query($sql2); + if ($resql2) + { + $obj2=$db->fetch_object($resql2); + $balancebefore[$objp->num_releve] = ($obj2->amount?$obj2->amount:0); + $db->free($resql2); + } + else + { + dol_print_error($db); + exit; + } + + $total = $balancebefore[$objp->num_releve]; + } + + $totalbefore = $total; + $total = $total + $objp->amount; + + $var=!$var; + + // Date operation + $dateop=$db->jdate($objp->do); + + // Date de valeur + $datevalue=$db->jdate($objp->dv); + + // Num cheque + $numchq=($objp->num_chq?$objp->num_chq:''); + + // Libelle + $reg=array(); + preg_match('/\((.+)\)/i',$objp->label,$reg); // Si texte entoure de parenthese on tente recherche de traduction + if ($reg[1] && $langs->transnoentitiesnoconv($reg[1])!=$reg[1]) $description=$langs->transnoentitiesnoconv($reg[1]); + else $description=$objp->label; + + /* + * Ajout les liens (societe, company...) + */ + $links = $acct->get_url($objp->rowid); + foreach($links as $key=>$val) + { + if ($links[$key]['type']=='payment') + { + $paymentstatic->fetch($links[$key]['url_id']); + $tmparray=$paymentstatic->getBillsArray(''); + foreach($tmparray as $key => $val) + { + $invoicestatic->fetch($val); + if ($accountelem) $accountelem.= ', '; + $accountelem.=$invoicestatic->ref; + } + } + elseif ($links[$key]['type']=='payment_supplier') + { + $paymentsupplierstatic->fetch($links[$key]['url_id']); + $tmparray=$paymentsupplierstatic->getBillsArray(''); + foreach($tmparray as $key => $val) + { + $invoicesupplierstatic->fetch($val); + if ($accountelem) $accountelem.= ', '; + $accountelem.=$invoicesupplierstatic->ref; + } + } + elseif ($links[$key]['type']=='payment_sc') + { + $paymentsocialcontributionstatic->fetch($links[$key]['url_id']); + if ($accountelem) $accountelem.= ', '; + $accountelem.=$langs->transnoentitiesnoconv("SocialContribution").' '.$paymentsocialcontributionstatic->ref; + } + elseif ($links[$key]['type']=='payment_vat') + { + $paymentvatstatic->fetch($links[$key]['url_id']); + if ($accountelem) $accountelem.= ', '; + $accountelem.=$langs->transnoentitiesnoconv("VATPayments").' '.$paymentvatstatic->ref; + } + elseif ($links[$key]['type']=='banktransfert') + { + $comment=$outputlangs->transnoentitiesnoconv("Transfer"); + if ($objp->amount > 0) + { + if ($comment) $comment.= ' '; + $banklinestatic->fetch($links[$key]['url_id']); + $bankstatic->id=$banklinestatic->fk_account; + $bankstatic->label=$banklinestatic->bank_account_label; + $comment.= ' ('.$langs->transnoentitiesnoconv("from").' '; + $comment.= $bankstatic->getNomUrl(1,'transactions'); + $comment.= ' '.$langs->transnoentitiesnoconv("toward").' '; + $bankstatic->id=$objp->bankid; + $bankstatic->label=$objp->bankref; + $comment.= $bankstatic->getNomUrl(1,''); + $comment.= ')'; + } + else + { + if ($comment) $comment.= ' '; + $bankstatic->id=$objp->bankid; + $bankstatic->label=$objp->bankref; + $comment.= ' ('.$langs->transnoentitiesnoconv("from").' '; + $comment.= $bankstatic->getNomUrl(1,''); + $comment.= ' '.$langs->transnoentitiesnoconv("toward").' '; + $banklinestatic->fetch($links[$key]['url_id']); + $bankstatic->id=$banklinestatic->fk_account; + $bankstatic->label=$banklinestatic->bank_account_label; + $comment.= $bankstatic->getNomUrl(1,'transactions'); + $comment.= ')'; + } + } + elseif ($links[$key]['type']=='company') + { + if ($thirdparty) $thirdparty.= ', '; + $thirdparty.= dol_trunc($links[$key]['label'],24); + $newline=0; + } + elseif ($links[$key]['type']=='member') + { + if ($thirdparty) $accountelem.= ', '; + $thirdparty.= $links[$key]['label']; + $newline=0; + } + /*elseif ($links[$key]['type']=='sc') + { + if ($accountelem) $accountelem.= ', '; + //$accountelem.= ''; + //$accountelem.= img_object($langs->transnoentitiesnoconv('ShowBill'),'bill').' '; + $accountelem.= $langs->transnoentitiesnoconv("SocialContribution"); + //$accountelem.= ''; + $newline=0; + } + else + { + if ($accountelem) $accountelem.= ', '; + //$accountelem.= ''; + $accountelem.= $links[$key]['label']; + //$accountelem.= ''; + $newline=0; + }*/ + } + + $debit=$credit=''; + if ($objp->amount < 0) + { + $totald = $totald + abs($objp->amount); + $debit=price2num($objp->amount * -1); + } + else + { + $totalc = $totalc + abs($objp->amount); + $credit=price2num($objp->amount); + } + + $i++; + + $rec=new stdClass(); + $rec->bankreceipt=$objp->num_releve; + $rec->bankaccount=$objp->banklabel; + $rec->dateop=dol_print_date($dateop,'dayrfc'); + $rec->dateval=dol_print_date($datevalue,'dayrfc'); + $rec->type=$objp->fk_type.' '.($objp->num_chq?$objp->num_chq:''); + $rec->description=$description; + $rec->thirdparty=$thirdparty; + $rec->accountelem=$accountelem; + $rec->debit=$debit; + $rec->credit=$credit; + $rec->sold=$sold; + $rec->comment=$comment; + $rec->soldbefore=price2num($totalbefore); + $rec->soldafter=price2num($total); + + // end of special operation processing + $objmodel->write_record($array_selected,$rec,$outputlangs,$array_export_TypeFields); + } + + if ($numrows > 0) + { + print "Found ".$numrows." records for receipt ".$num."\n"; + + // Genere en-tete + $objmodel->write_footer($outputlangs); + + // Close file + $objmodel->close_file(); + + print 'File '.$filename.' was generated into dir '.$dirname.'.'."\n"; + + $ret=0; + } + else + { + print "No records found for receipt ".$num."\n"; + + $ret=0; + } +} +else +{ + dol_print_error($db); + $ret=-1; +} + +$db->close(); + +return $ret; +?> \ No newline at end of file diff --git a/scripts/company/export-contacts-xls-example.php b/scripts/company/export-contacts-xls-example.php index a07813b3606..760b351df7d 100644 --- a/scripts/company/export-contacts-xls-example.php +++ b/scripts/company/export-contacts-xls-example.php @@ -40,8 +40,6 @@ if (! isset($argv[1]) || ! $argv[1]) { } $now=$argv[1]; -// Recupere env dolibarr -$version='1.10'; require_once($path."../../htdocs/master.inc.php"); //require_once(PHP_WRITEEXCEL_PATH."/class.writeexcel_workbook.inc.php"); @@ -51,8 +49,18 @@ require_once(PHPEXCEL_PATH."/PHPExcel.php"); //require_once(PHPEXCEL_PATH."/PHPExcel/Writer/Excel2007.php"); require_once(PHPEXCEL_PATH."/PHPExcel/Writer/Excel5.php"); +// Global variables +$version=DOL_VERSION; +$error=0; +/* + * Main + */ + +@set_time_limit(0); +print "***** ".$script_file." (".$version.") *****\n"; + $fname = DOL_DATA_ROOT.'/export-contacts.xls'; //$objPHPExcel = new writeexcel_workbook($fname); diff --git a/scripts/company/sync_contacts_dolibarr2ldap.php b/scripts/company/sync_contacts_dolibarr2ldap.php index 5cdc38537d5..a9916100218 100644 --- a/scripts/company/sync_contacts_dolibarr2ldap.php +++ b/scripts/company/sync_contacts_dolibarr2ldap.php @@ -40,18 +40,23 @@ if (! isset($argv[1]) || ! $argv[1]) { } $now=$argv[1]; -// Recupere env dolibarr -$version='1.25'; require_once($path."../../htdocs/master.inc.php"); require_once(DOL_DOCUMENT_ROOT."/contact/class/contact.class.php"); require_once(DOL_DOCUMENT_ROOT."/user/class/user.class.php"); require_once(DOL_DOCUMENT_ROOT."/core/class/ldap.class.php"); +// Global variables +$version=DOL_VERSION; $error=0; -print "***** $script_file ($version) *****\n"; +/* + * Main + */ + +@set_time_limit(0); +print "***** ".$script_file." (".$version.") *****\n"; print "Mails sending disabled (useless in batch mode)\n"; $conf->global->MAIN_DISABLE_ALL_MAILS=1; // On bloque les mails diff --git a/scripts/contracts/email_expire_services_to_customers.php b/scripts/contracts/email_expire_services_to_customers.php index 4a74218b843..4370314bb9d 100755 --- a/scripts/contracts/email_expire_services_to_customers.php +++ b/scripts/contracts/email_expire_services_to_customers.php @@ -55,20 +55,27 @@ $langs->load('main'); $langs->load('contracts'); +// Global variables +$version=DOL_VERSION; +$error=0; + + /* * Main */ +@set_time_limit(0); +print "***** ".$script_file." (".$version.") *****\n"; + $now=dol_now('tzserver'); $duration_value=$argv[2]; -$error = 0; print $script_file." launched with mode ".$mode.($duration_value?" delay=".$duration_value:"")."\n"; $sql = "SELECT DISTINCT s.nom as name, c.ref, cd.date_fin_validite, cd.total_ttc, p.label label, s.email, s.default_lang"; $sql .= " FROM ".MAIN_DB_PREFIX."societe AS s"; -$sql .= ", ".MAIN_DB_PREFIX."contrat AS c"; -$sql .= ", ".MAIN_DB_PREFIX."contratdet AS cd"; +$sql .= ", ".MAIN_DB_PREFIX."contrat AS c"; +$sql .= ", ".MAIN_DB_PREFIX."contratdet AS cd"; $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."product AS p ON p.rowid = cd.fk_product"; $sql .= " WHERE s.rowid = c.fk_soc AND c.rowid = cd.fk_contrat AND c.statut > 0 AND cd.statut<5"; @@ -173,10 +180,10 @@ function envoi_mail($mode,$oldemail,$message,$total,$userlang,$oldcustomer,$dura global $conf,$langs; $newlangs=new Translate('',$conf); - $newlangs->setDefaultLang($userlang); + $newlangs->setDefaultLang(empty($userlang)?(empty($conf->global->MAIN_LANG_DEFAULT)?'auto':$conf->global->MAIN_LANG_DEFAULT):$userlang); $newlangs->load("main"); $newlangs->load("contracts"); - + if ($duration_value) $title=$newlangs->transnoentities("ListOfServicesToExpireWithDuration",$duration_value); else diff --git a/scripts/contracts/email_expire_services_to_representatives.php b/scripts/contracts/email_expire_services_to_representatives.php index 249cfc3b195..b509ecc69a4 100755 --- a/scripts/contracts/email_expire_services_to_representatives.php +++ b/scripts/contracts/email_expire_services_to_representatives.php @@ -55,14 +55,21 @@ $langs->load('main'); $langs->load('contracts'); +// Global variables +$version=DOL_VERSION; +$error=0; + + /* * Main */ +@set_time_limit(0); +print "***** ".$script_file." (".$version.") *****\n"; + $now=dol_now('tzserver'); $duration_value=$argv[2]; -$error = 0; print $script_file." launched with mode ".$mode.($duration_value?" delay=".$duration_value:"")."\n"; $sql = "SELECT DISTINCT s.nom, c.ref, cd.date_fin_validite, cd.total_ttc, p.label label, c.fk_soc,u.rowid AS uid, u.lastname, u.firstname, u.email, u.lang"; @@ -173,7 +180,7 @@ function envoi_mail($mode,$oldemail,$message,$total,$userlang,$oldsalerepresenta global $conf,$langs; $newlangs=new Translate('',$conf); - $newlangs->setDefaultLang($userlang); + $newlangs->setDefaultLang(empty($userlang)?(empty($conf->global->MAIN_LANG_DEFAULT)?'auto':$conf->global->MAIN_LANG_DEFAULT):$userlang); $newlangs->load("main"); $newlangs->load("contracts"); @@ -181,7 +188,7 @@ function envoi_mail($mode,$oldemail,$message,$total,$userlang,$oldsalerepresenta $title=$newlangs->transnoentities("ListOfServicesToExpireWithDuration",$duration_value); else $title= $newlangs->transnoentities("ListOfServicesToExpire"); - + $subject = "[".(empty($conf->global->MAIN_APPLICATION_TITLE)?'Dolibarr':$conf->global->MAIN_APPLICATION_TITLE)."] ".$title; $sendto = $oldemail; $from = $conf->global->MAIN_MAIL_EMAIL_FROM; diff --git a/scripts/cron/cron_run_jobs.php b/scripts/cron/cron_run_jobs.php index 151af859fcd..386c996f137 100755 --- a/scripts/cron/cron_run_jobs.php +++ b/scripts/cron/cron_run_jobs.php @@ -59,10 +59,17 @@ require_once (DOL_DOCUMENT_ROOT."/cron/class/cronjob.class.php"); require_once (DOL_DOCUMENT_ROOT.'/user/class/user.class.php'); require_once (DOL_DOCUMENT_ROOT."/cron/class/cronjob.class.php"); +// Global variables +$version=DOL_VERSION; +$error=0; + + +/* + * Main + */ -/* - * Main - */ +@set_time_limit(0); +print "***** ".$script_file." (".$version.") *****\n"; // Check security key if ($key != $conf->global->CRON_KEY) diff --git a/scripts/emailings/mailing-send.php b/scripts/emailings/mailing-send.php index 1c929dec212..23830007fae 100755 --- a/scripts/emailings/mailing-send.php +++ b/scripts/emailings/mailing-send.php @@ -45,7 +45,19 @@ require_once ($path."../../htdocs/master.inc.php"); require_once (DOL_DOCUMENT_ROOT."/core/class/CMailFile.class.php"); -$error = 0; +// Global variables +$version=DOL_VERSION; +$error=0; + + + +/* + * Main + */ + +@set_time_limit(0); +print "***** ".$script_file." (".$version.") *****\n"; + // We get list of emailing to process diff --git a/scripts/invoices/email_unpaid_invoices_to_customers.php b/scripts/invoices/email_unpaid_invoices_to_customers.php index 1c88248b2ce..c631c394366 100755 --- a/scripts/invoices/email_unpaid_invoices_to_customers.php +++ b/scripts/invoices/email_unpaid_invoices_to_customers.php @@ -36,9 +36,9 @@ if (substr($sapi_type, 0, 3) == 'cgi') { exit; } -if (! isset($argv[1]) || ! $argv[1] || ! in_array($argv[1],array('test','confirm'))) +if (! isset($argv[2]) || ! $argv[2] || ! in_array($argv[1],array('test','confirm')) || ! in_array($argv[2],array('thirdparties','contacts'))) { - print "Usage: $script_file [test|confirm] [delay]\n"; + print "Usage: $script_file (test|confirm) (thirdparties|contacts) [delay]\n"; print "\n"; print "Send an email to customers to remind all unpaid customer invoices.\n"; print "If you choose 'test' mode, no emails are sent.\n"; @@ -46,6 +46,7 @@ if (! isset($argv[1]) || ! $argv[1] || ! in_array($argv[1],array('test','confirm exit; } $mode=$argv[1]; +$targettype=$argv[2]; require($path."../../htdocs/master.inc.php"); @@ -53,24 +54,37 @@ require_once (DOL_DOCUMENT_ROOT."/core/class/CMailFile.class.php"); $langs->load('main'); - -/* - * Main - */ +// Global variables +$version=DOL_VERSION; +$error=0; + + + +/* + * Main + */ + +@set_time_limit(0); +print "***** ".$script_file." (".$version.") *****\n"; $now=dol_now('tzserver'); -$duration_value=$argv[2]; +$duration_value=isset($argv[3])?$argv[3]:-1; $error = 0; -print $script_file." launched with mode ".$mode.($duration_value?" delay=".$duration_value:"")."\n"; +print $script_file." launched with mode ".$mode.($duration_value>=0?" delay=".$duration_value:"")."\n"; -$sql = "SELECT f.facnumber, f.total_ttc, f.date_lim_reglement as due_date, s.nom as name, s.email, s.default_lang"; -$sql .= " FROM ".MAIN_DB_PREFIX."facture as f"; -$sql .= " , ".MAIN_DB_PREFIX."societe as s"; -$sql .= " WHERE f.fk_statut != 0 AND f.paye = 0"; -$sql .= " AND f.fk_soc = s.rowid"; -if ($duration_value) $sql .= " AND f.date_lim_reglement < '".$db->idate(dol_time_plus_duree($now, $duration_value, "d"))."'"; -$sql .= " ORDER BY s.email ASC, s.rowid ASC"; // Order by email to allow one message per email +$sql = "SELECT f.facnumber, f.total_ttc, f.date_lim_reglement as due_date,"; +$sql.= " s.rowid as sid, s.nom as name, s.email, s.default_lang"; +if ($targettype == 'contacts') $sql.= ", sp.rowid as cid, sp.firstname as cfirstname, sp.lastname as clastname, sp.email as cemail"; +$sql.= " FROM ".MAIN_DB_PREFIX."facture as f, ".MAIN_DB_PREFIX."societe as s"; +if ($targettype == 'contacts') $sql.= ", ".MAIN_DB_PREFIX."socpeople as sp"; +$sql.= " WHERE f.fk_statut != 0 AND f.paye = 0"; +$sql.= " AND f.fk_soc = s.rowid"; +if ($duration_value>=0) $sql.= " AND f.date_lim_reglement < '".$db->idate(dol_time_plus_duree($now, $duration_value, "d"))."'"; +if ($targettype == 'contacts') $sql.= " AND s.rowid = sp.fk_soc"; +$sql.= " ORDER BY"; +if ($targettype == 'contacts') $sql.= " sp.email, sp.rowid,"; +$sql.= " s.email ASC, s.rowid ASC, f.facnumber ASC"; // Order by email to allow one message per email //print $sql; $resql=$db->query($sql); @@ -78,10 +92,12 @@ if ($resql) { $num = $db->num_rows($resql); $i = 0; - $oldemail = 'none'; $olduid = 0; $oldlang=''; + $oldemail = 'none'; $oldsid = 0; $oldcid = 0; $oldlang=''; $total = 0; $foundtoprocess = 0; - print "We found ".$num." couples (unpayed validated invoice - customer) qualified\n"; - dol_syslog("We found ".$num." couples (unpayed validated invoice - customer) qualified"); + $trackthirdpartiessent = array(); + + print "We found ".$num." couples (unpayed validated invoices-".$targettype.") qualified\n"; + dol_syslog("We found ".$num." couples (unpayed validated invoices-".$targettype.") qualified"); $message=''; if ($num) @@ -90,36 +106,50 @@ if ($resql) { $obj = $db->fetch_object($resql); - if (($obj->email <> $oldemail || $obj->uid <> $olduid) || $oldemail == 'none') + $newemail=empty($obj->cemail)?$obj->email:$obj->cemail; + + // Check if this record is a break after previous one + $startbreak=false; + if ($newemail <> $oldemail || $oldemail == 'none') $startbreak=true; + if ($obj->sid && $obj->sid <> $oldsid) $startbreak=true; + if ($obj->cid && $obj->cid <> $oldcid) $startbreak=true; + + if ($startbreak) { - // Break onto sales representative (new email or uid) - if (dol_strlen($oldemail) && $oldemail != 'none') + // Break onto sales representative (new email or cid) + if (dol_strlen($oldemail) && $oldemail != 'none' && empty($trackthirdpartiessent[$oldsid.'|'.$oldemail])) { - envoi_mail($mode,$oldemail,$message,$total,$oldlang,$oldcustomer); + envoi_mail($mode,$oldemail,$message,$total,$oldlang,$oldtarget); + $trackthirdpartiessent[$oldsid.'|'.$oldemail]='contact id '.$oldcid; } else - { - if ($oldemail != 'none') print "- No email sent for ".$oldcustomer.", total: ".$total."\n"; + { + if ($oldemail != 'none') + { + if (empty($trackthirdpartiessent[$oldsid.'|'.$oldemail])) print "- No email sent for '".$oldtarget."', total: ".$total."\n"; + else print "- No email sent for '".$oldtarget."', total: ".$total." (already sent to ".$trackthirdpartiessent[$oldsid.'|'.$oldemail].")\n"; + } } - $oldemail = $obj->email; - $olduid = $obj->uid; + $oldemail = $newemail; + $oldsid = $obj->sid; + $oldcid = $obj->cid; $oldlang = $obj->lang; - $oldcustomer=$obj->name; + $oldtarget=(empty($obj->cfirstname) && empty($obj->clastname))?$obj->name:($obj->clastname." ".$obj->cfirstname); $message = ''; - $total = 0; + $total = 0; $foundtoprocess = 0; - $customer=$obj->name; - if (empty($obj->email)) print "Warning: Customer ".$customer." has no email. Notice disabled.\n"; + $target=(empty($obj->cfirstname) && empty($obj->clastname))?$obj->name:($obj->clastname." ".$obj->cfirstname); + //if (empty($newemail)) print "Warning: Customer ".$target." has no email. Notice disabled.\n"; } - if (dol_strlen($oldemail)) + if (dol_strlen($newemail)) { - $message .= $langs->trans("Invoice")." ".$obj->facnumber." : ".price($obj->total_ttc)." : ".$obj->name."\n"; - dol_syslog("email_unpaid_invoices_to_customers.php: ".$obj->email); + $message .= $langs->trans("Invoice")." ".$obj->facnumber." : ".price($obj->total_ttc)."\n"; + dol_syslog("email_unpaid_invoices_to_customers.php: ".$newemail." ".$message); $foundtoprocess++; } - print "Unpaid invoice ".$obj->facnumber.", price ".price2num($obj->total_ttc).", due date ".dol_print_date($db->jdate($obj->due_date),'day')." customer ".$obj->name.", email ".$obj->email.": "; - if (dol_strlen($obj->email)) print "qualified."; + print "Unpaid invoice ".$obj->facnumber.", price ".price2num($obj->total_ttc).", due date ".dol_print_date($db->jdate($obj->due_date),'day')." customer id ".$obj->sid." ".$obj->name.", ".($obj->cid?"contact id ".$obj->cid." ".$obj->clastname." ".$obj->cfirstname.",":"")." email ".$newemail.": "; + if (dol_strlen($newemail)) print "qualified."; else print "disqualified (no email)."; print "\n"; @@ -131,13 +161,18 @@ if ($resql) // Si il reste des envois en buffer if ($foundtoprocess) { - if (dol_strlen($oldemail) && $oldemail != 'none') // Break onto email (new email) + if (dol_strlen($oldemail) && $oldemail != 'none' && empty($trackthirdpartiessent[$oldsid.'|'.$oldemail])) // Break onto email (new email) { - envoi_mail($mode,$oldemail,$message,$total,$oldlang,$oldcustomer); + envoi_mail($mode,$oldemail,$message,$total,$oldlang,$oldtarget); + $trackthirdpartiessent[$oldsid.'|'.$oldemail]='contact id '.$oldcid; } else { - if ($oldemail != 'none') print "- No email sent for ".$oldcustomer.", total: ".$total."\n"; + if ($oldemail != 'none') + { + if (empty($trackthirdpartiessent[$oldsid.'|'.$oldemail])) print "- No email sent for '".$oldtarget."', total: ".$total."\n"; + else print "- No email sent for '".$oldtarget."', total: ".$total." (already sent to ".$trackthirdpartiessent[$oldsid.'|'.$oldemail].")\n"; + } } } } @@ -157,19 +192,19 @@ else * Send email * * @param string $mode Mode (test | confirm) - * @param string $oldemail Old email + * @param string $oldemail Target email * @param string $message Message to send * @param string $total Total amount of unpayed invoices * @param string $userlang Code lang to use for email output. - * @param string $oldcustomer Old customer + * @param string $oldtarget Target name * @return int <0 if KO, >0 if OK */ -function envoi_mail($mode,$oldemail,$message,$total,$userlang,$oldcustomer) +function envoi_mail($mode,$oldemail,$message,$total,$userlang,$oldtarget) { global $conf,$langs; $newlangs=new Translate('',$conf); - $newlangs->setDefaultLang($userlang); + $newlangs->setDefaultLang(empty($userlang)?(empty($conf->global->MAIN_LANG_DEFAULT)?'auto':$conf->global->MAIN_LANG_DEFAULT):$userlang); $newlangs->load("main"); $newlangs->load("bills"); @@ -179,7 +214,7 @@ function envoi_mail($mode,$oldemail,$message,$total,$userlang,$oldcustomer) $errorsto = $conf->global->MAIN_MAIL_ERRORS_TO; $msgishtml = 0; - print "- Send email for ".$oldcustomer."(".$oldemail."), total: ".$total."\n"; + print "- Send email for '".$oldtarget."' (".$oldemail."), total: ".$total."\n"; dol_syslog("email_unpaid_invoices_to_customers.php: send mail to ".$oldemail); $usehtml=0; diff --git a/scripts/invoices/email_unpaid_invoices_to_representatives.php b/scripts/invoices/email_unpaid_invoices_to_representatives.php index 07c181b4f93..ca260dd43bc 100755 --- a/scripts/invoices/email_unpaid_invoices_to_representatives.php +++ b/scripts/invoices/email_unpaid_invoices_to_representatives.php @@ -54,15 +54,23 @@ require_once (DOL_DOCUMENT_ROOT."/core/class/CMailFile.class.php"); $langs->load('main'); +// Global variables +$version=DOL_VERSION; +$error=0; + + + /* * Main */ -$now=dol_now('tzserver'); -$duration_value=$argv[2]; +@set_time_limit(0); +print "***** ".$script_file." (".$version.") *****\n"; -$error = 0; -print $script_file." launched with mode ".$mode.($duration_value?" delay=".$duration_value:"")."\n"; +$now=dol_now('tzserver'); +$duration_value=isset($argv[2])?$argv[2]:-1; + +print $script_file." launched with mode ".$mode.($duration_value>=0?" delay=".$duration_value:"")."\n"; $sql = "SELECT f.facnumber, f.total_ttc, f.date_lim_reglement as due_date, s.nom as name, u.rowid as uid, u.lastname, u.firstname, u.email, u.lang"; $sql .= " FROM ".MAIN_DB_PREFIX."facture as f"; @@ -71,10 +79,10 @@ $sql .= " , ".MAIN_DB_PREFIX."societe_commerciaux as sc"; $sql .= " , ".MAIN_DB_PREFIX."user as u"; $sql .= " WHERE f.fk_statut != 0 AND f.paye = 0"; $sql .= " AND f.fk_soc = s.rowid"; -if ($duration_value) $sql .= " AND f.date_lim_reglement < '".$db->idate(dol_time_plus_duree($now, $duration_value, "d"))."'"; +if ($duration_value>=0) $sql .= " AND f.date_lim_reglement < '".$db->idate(dol_time_plus_duree($now, $duration_value, "d"))."'"; $sql .= " AND sc.fk_soc = s.rowid"; $sql .= " AND sc.fk_user = u.rowid"; -$sql .= " ORDER BY u.email ASC, s.rowid ASC"; // Order by email to allow one message per email +$sql .= " ORDER BY u.email ASC, s.rowid ASC, f.facnumber ASC"; // Order by email to allow one message per email //print $sql; $resql=$db->query($sql); @@ -138,10 +146,10 @@ if ($resql) { envoi_mail($mode,$oldemail,$message,$total,$oldlang,$oldsalerepresentative); } - else - { - if ($oldemail != 'none') print "- No email sent for ".$oldsalerepresentative.", total: ".$total."\n"; - } + else + { + if ($oldemail != 'none') print "- No email sent for ".$oldsalerepresentative.", total: ".$total."\n"; + } } } else @@ -172,11 +180,11 @@ function envoi_mail($mode,$oldemail,$message,$total,$userlang,$oldsalerepresenta global $conf,$langs; $newlangs=new Translate('',$conf); - $newlangs->setDefaultLang($userlang); + $newlangs->setDefaultLang(empty($userlang)?(empty($conf->global->MAIN_LANG_DEFAULT)?'auto':$conf->global->MAIN_LANG_DEFAULT):$userlang); $newlangs->load("main"); $newlangs->load("bills"); - $subject = "[".(empty($conf->global->MAIN_APPLICATION_TITLE)?'Dolibarr':$conf->global->MAIN_APPLICATION_TITLE)."] ".$newlangs->trans("ListOfYourUnpaidInvoices"); + $subject = "[".(empty($conf->global->MAIN_APPLICATION_TITLE)?'Dolibarr':$conf->global->MAIN_APPLICATION_TITLE)."] ".$newlangs->transnoentities("ListOfYourUnpaidInvoices"); $sendto = $oldemail; $from = $conf->global->MAIN_MAIL_EMAIL_FROM; $errorsto = $conf->global->MAIN_MAIL_ERRORS_TO; @@ -196,7 +204,7 @@ function envoi_mail($mode,$oldemail,$message,$total,$userlang,$oldsalerepresenta } else { - $allmessage.= "List of unpaid invoices".($usehtml?"
\n":"\n").($usehtml?"
\n":"\n"); + $allmessage.= $newlangs->transnoentities("ListOfYourUnpaidInvoices").($usehtml?"
\n":"\n").($usehtml?"
\n":"\n"); $allmessage.= "Note: This list contains only invoices for third parties you are linked to as a sale representative.".($usehtml?"
\n":"\n"); } $allmessage.= $message.($usehtml?"
\n":"\n"); diff --git a/scripts/invoices/rebuild_merge_pdf.php b/scripts/invoices/rebuild_merge_pdf.php index 6360735ab67..354b245cb23 100755 --- a/scripts/invoices/rebuild_merge_pdf.php +++ b/scripts/invoices/rebuild_merge_pdf.php @@ -46,11 +46,15 @@ require_once(DOL_DOCUMENT_ROOT.'/core/lib/invoice2.lib.php'); $langs->load("main"); // Global variables -$version='1.24'; +$version=DOL_VERSION; $error=0; -// -------------------- START OF YOUR CODE HERE -------------------- + +/* + * Main + */ + @set_time_limit(0); print "***** ".$script_file." (".$version.") *****\n"; @@ -118,6 +122,11 @@ foreach ($argv as $key => $value) $paymentdateafter=dol_stringtotime($argv[$key+1]); $paymentdatebefore=dol_stringtotime($argv[$key+2]); + if (empty($paymentdateafter) || empty($paymentdatebefore)) + { + print 'Error: Bad date format'."\n"; + exit; + } print 'Rebuild PDF for invoices with at least one payment between '.dol_print_date($paymentdateafter,'day')." and ".dol_print_date($paymentdatebefore,'day').".\n"; } @@ -130,7 +139,25 @@ foreach ($argv as $key => $value) print 'Rebuild PDF for invoices with no payment done yet.'."\n"; } - if ($value == 'filter=nodeposit') + if ($value == 'filter=bank') + { + $found=true; + $option.=(empty($option)?'':'_').'bank_'.$argv[$key+1]; + $filter[]='bank'; + + $paymentonbankref=$argv[$key+1]; + $bankaccount=new Account($db); + $result=$bankaccount->fetch(0,$paymentonbankref); + if ($result <= 0) + { + print 'Error: Bank account with ref "'.$paymentonbankref.'" not found'."\n"; + exit; + } + $paymentonbankid=$bankaccount->id; + print 'Rebuild PDF for invoices with at least one payment on financial account '.$bankaccount->ref."\n"; + } + + if ($value == 'filter=nodeposit') { $found=true; $option.=(empty($option)?'':'_').'nodeposit'; @@ -169,16 +196,21 @@ if (empty($option) && count($filter) <= 0) exit; } // Check if there is no uncompatible choice -if (in_array('payments',$filter) && in_array('nopayment',$filter)) -{ - usage(); - exit; -} +if (in_array('payments',$filter) && in_array('nopayment',$filter)) +{ + usage(); + exit; +} +if (in_array('bank',$filter) && in_array('nopayment',$filter)) +{ + usage(); + exit; +} // Define SQL and SQL request to select invoices // Use $filter, $dateafterdate, datebeforedate, $paymentdateafter, $paymentdatebefore -$result=rebuild_merge_pdf($db, $langs, $conf, $diroutputpdf, $newlangid, $filter, $dateafterdate, $datebeforedate, $paymentdateafter, $paymentdatebefore, 1, $regenerate, $option); +$result=rebuild_merge_pdf($db, $langs, $conf, $diroutputpdf, $newlangid, $filter, $dateafterdate, $datebeforedate, $paymentdateafter, $paymentdatebefore, 1, $regenerate, $option, $paymentonbankid); @@ -213,9 +245,11 @@ function usage() print "Rebuild PDF files for some invoices and merge PDF files into one.\n"; print "\n"; print "To build/merge PDF for invoices in a date range:\n"; - print "Usage: ".$script_file." filter=date dateafter datebefore [lang=langcode]\n"; + print "Usage: ".$script_file." filter=date dateafter datebefore\n"; print "To build/merge PDF for invoices with at least one payment in a date range:\n"; - print "Usage: ".$script_file." filter=payments dateafter datebefore [lang=langcode]\n"; + print "Usage: ".$script_file." filter=payments dateafter datebefore\n"; + print "To build/merge PDF for invoices with at least one payment onto a bank account:\n"; + print "Usage: ".$script_file." filter=bank bankref\n"; print "To build/merge PDF for all invoices, use filter=all\n"; print "Usage: ".$script_file." filter=all\n"; print "To build/merge PDF for invoices with no payments, use filter=nopayment\n"; @@ -224,9 +258,10 @@ function usage() print "To exclude replacement invoices, use filter=noreplacement\n"; print "To exclude deposit invoices, use filter=nodeposit\n"; print "To regenerate existing PDF, use regenerate=crabe\n"; + print "To generate invoices in a language, use lang=xx_XX\n"; print "\n"; print "Example: ".$script_file." filter=payments 20080101 20081231 lang=fr_FR regenerate=crabe\n"; - print "Example: ".$script_file." filter=all lang=it_IT\n"; + print "Example: ".$script_file." filter=all lang=en_US\n"; print "\n"; print "Note that some filters can be cumulated.\n"; } diff --git a/scripts/members/sync_members_dolibarr2ldap.php b/scripts/members/sync_members_dolibarr2ldap.php index eb14a9cb6a6..7a8f3bad42c 100755 --- a/scripts/members/sync_members_dolibarr2ldap.php +++ b/scripts/members/sync_members_dolibarr2ldap.php @@ -34,21 +34,24 @@ if (substr($sapi_type, 0, 3) == 'cgi') { exit; } -// Main -$version='1.11'; -$path=str_replace($script_file,'',$_SERVER["PHP_SELF"]); -@set_time_limit(0); -$error=0; - require_once($path."../../htdocs/master.inc.php"); require_once(DOL_DOCUMENT_ROOT."/core/class/ldap.class.php"); require_once(DOL_DOCUMENT_ROOT."/adherents/class/adherent.class.php"); - $langs->load("main"); +// Global variables +$version=DOL_VERSION; +$error=0; -print "***** $script_file ($version) *****\n"; + + +/* + * Main + */ + +@set_time_limit(0); +print "***** ".$script_file." (".$version.") *****\n"; if (! isset($argv[1]) || ! $argv[1]) { print "Usage: $script_file now\n"; diff --git a/scripts/members/sync_members_ldap2dolibarr.php b/scripts/members/sync_members_ldap2dolibarr.php index 6c72556f89f..45577cddcb0 100755 --- a/scripts/members/sync_members_ldap2dolibarr.php +++ b/scripts/members/sync_members_ldap2dolibarr.php @@ -34,22 +34,29 @@ if (substr($sapi_type, 0, 3) == 'cgi') { exit; } -// Main -$version='1.14'; -@set_time_limit(0); -$error=0; -$forcecommit=0; - - require_once($path."../../htdocs/master.inc.php"); require_once(DOL_DOCUMENT_ROOT."/core/lib/date.lib.php"); require_once(DOL_DOCUMENT_ROOT."/core/class/ldap.class.php"); require_once(DOL_DOCUMENT_ROOT."/adherents/class/adherent.class.php"); require_once(DOL_DOCUMENT_ROOT."/adherents/class/cotisation.class.php"); - $langs->load("main"); -$langs->load("errors"); +$langs->load("errors"); + + +// Global variables +$version=DOL_VERSION; +$error=0; +$forcecommit=0; + + + +/* + * Main + */ + +@set_time_limit(0); +print "***** ".$script_file." (".$version.") *****\n"; // List of fields to get from LDAP $required_fields = array( diff --git a/scripts/user/sync_groups_dolibarr2ldap.php b/scripts/user/sync_groups_dolibarr2ldap.php index 5f0780e3f35..602673c8cce 100755 --- a/scripts/user/sync_groups_dolibarr2ldap.php +++ b/scripts/user/sync_groups_dolibarr2ldap.php @@ -40,17 +40,21 @@ if (! isset($argv[1]) || ! $argv[1]) { } $now=$argv[1]; -// Recupere env dolibarr -$version='1.10'; - require_once($path."../../htdocs/master.inc.php"); require_once(DOL_DOCUMENT_ROOT."/core/class/ldap.class.php"); require_once(DOL_DOCUMENT_ROOT."/user/class/usergroup.class.php"); +// Global variables +$version=DOL_VERSION; $error=0; -print "***** $script_file ($version) *****\n"; +/* + * Main + */ + +@set_time_limit(0); +print "***** ".$script_file." (".$version.") *****\n"; /* if (! $conf->global->LDAP_SYNCHRO_ACTIVE) diff --git a/scripts/user/sync_groups_ldap2dolibarr.php b/scripts/user/sync_groups_ldap2dolibarr.php index fd92086e77f..2c239197b41 100755 --- a/scripts/user/sync_groups_ldap2dolibarr.php +++ b/scripts/user/sync_groups_ldap2dolibarr.php @@ -35,24 +35,29 @@ if (substr($sapi_type, 0, 3) == 'cgi') { exit; } +require_once($path."../../htdocs/master.inc.php"); +require_once(DOL_DOCUMENT_ROOT."/core/lib/date.lib.php"); +require_once(DOL_DOCUMENT_ROOT."/core/class/ldap.class.php"); +require_once(DOL_DOCUMENT_ROOT."/user/class/user.class.php"); +require_once(DOL_DOCUMENT_ROOT."/user/class/usergroup.class.php"); + +$langs->load("main"); +$langs->load("errors"); +// Global variables +$version=DOL_VERSION; +$error=0; +$forcecommit=0; + + +/* + * Main + */ + +@set_time_limit(0); +print "***** ".$script_file." (".$version.") *****\n"; -// Main - -$version='1.14'; -@set_time_limit(0); -$error=0; -$forcecommit=0; - -require_once($path."../../htdocs/master.inc.php"); -require_once(DOL_DOCUMENT_ROOT."/core/lib/date.lib.php"); -require_once(DOL_DOCUMENT_ROOT."/core/class/ldap.class.php"); -require_once(DOL_DOCUMENT_ROOT."/user/class/user.class.php"); -require_once(DOL_DOCUMENT_ROOT."/user/class/usergroup.class.php"); - -$langs->load("main"); -$langs->load("errors"); // List of fields to get from LDAP $required_fields = array( @@ -136,11 +141,11 @@ if ($result >= 0) $group->entity = $conf->entity; //print_r($ldapgroup); - + if($group->id > 0) { // Group update print $langs->transnoentities("GroupUpdate").' # '.$key.': name='.$group->nom; $res=$group->update(); - + if ($res > 0) { print ' --> Updated group id='.$group->id.' name='.$group->nom; @@ -154,7 +159,7 @@ if ($result >= 0) } else { // Group creation print $langs->transnoentities("GroupCreate").' # '.$key.': name='.$group->nom; $res=$group->create(); - + if ($res > 0) { print ' --> Created group id='.$group->id.' name='.$group->nom; @@ -168,7 +173,7 @@ if ($result >= 0) } //print_r($group); - + // Gestion des utilisateurs associés au groupe // 1 - Association des utilisateurs du groupe LDAP au groupe Dolibarr $userList = array(); @@ -179,29 +184,29 @@ if ($result >= 0) $userFilter = explode(',', $userdn); $userKey = $ldap->getAttributeValues('('.$userFilter[0].')', $conf->global->LDAP_KEY_USERS); if(!is_array($userKey)) continue; - + $fuser = new User($db); - + if($conf->global->LDAP_KEY_USERS == $conf->global->LDAP_FIELD_SID) { $fuser->fetch('','',$userKey[0]); // Chargement du user concerné par le SID } else if($conf->global->LDAP_KEY_USERS == $conf->global->LDAP_FIELD_LOGIN) { $fuser->fetch('',$userKey[0]); // Chargement du user concerné par le login } - + $userList[$userdn] = $fuser; } else { $fuser = &$userList[$userdn]; } - + $userIdList[$userdn] = $fuser->id; - + // Ajout de l'utilisateur dans le groupe if(!in_array($fuser->id, array_keys($group->members))) { $fuser->SetInGroup($group->id, $group->entity); echo $fuser->login.' added'."\n"; } } - + // 2 - Suppression des utilisateurs du groupe Dolibarr qui ne sont plus dans le groupe LDAP foreach ($group->members as $guser) { if(!in_array($guser->id, $userIdList)) { diff --git a/scripts/user/sync_users_dolibarr2ldap.php b/scripts/user/sync_users_dolibarr2ldap.php index 3b47af05053..c6a26804b40 100755 --- a/scripts/user/sync_users_dolibarr2ldap.php +++ b/scripts/user/sync_users_dolibarr2ldap.php @@ -40,17 +40,21 @@ if (! isset($argv[1]) || ! $argv[1]) { } $now=$argv[1]; -// Recupere env dolibarr -$version='1.13'; - require_once($path."../../htdocs/master.inc.php"); require_once(DOL_DOCUMENT_ROOT."/core/class/ldap.class.php"); require_once(DOL_DOCUMENT_ROOT."/user/class/user.class.php"); +// Global variables +$version=DOL_VERSION; $error=0; -print "***** $script_file ($version) *****\n"; +/* + * Main + */ + +@set_time_limit(0); +print "***** ".$script_file." (".$version.") *****\n"; /* if (! $conf->global->LDAP_SYNCHRO_ACTIVE) diff --git a/scripts/user/sync_users_ldap2dolibarr.php b/scripts/user/sync_users_ldap2dolibarr.php index 64bea3ca567..6f7d63c41ce 100755 --- a/scripts/user/sync_users_ldap2dolibarr.php +++ b/scripts/user/sync_users_ldap2dolibarr.php @@ -34,23 +34,27 @@ if (substr($sapi_type, 0, 3) == 'cgi') { exit; } +require_once($path."../../htdocs/master.inc.php"); +require_once(DOL_DOCUMENT_ROOT."/core/lib/date.lib.php"); +require_once(DOL_DOCUMENT_ROOT."/core/class/ldap.class.php"); +require_once(DOL_DOCUMENT_ROOT."/user/class/user.class.php"); + +$langs->load("main"); +$langs->load("errors"); + - - -// Main - -$version='1.14'; -@set_time_limit(0); +// Global variables +$version=DOL_VERSION; $error=0; $forcecommit=0; -require_once($path."../../htdocs/master.inc.php"); -require_once(DOL_DOCUMENT_ROOT."/core/lib/date.lib.php"); -require_once(DOL_DOCUMENT_ROOT."/core/class/ldap.class.php"); -require_once(DOL_DOCUMENT_ROOT."/user/class/user.class.php"); -$langs->load("main"); -$langs->load("errors"); +/* + * Main + */ + +@set_time_limit(0); +print "***** ".$script_file." (".$version.") *****\n"; // List of fields to get from LDAP $required_fields = array( @@ -178,7 +182,7 @@ if ($result >= 0) foreach ($ldaprecords as $key => $ldapuser) { $fuser = new User($db); - + if($conf->global->LDAP_KEY_USERS == $conf->global->LDAP_FIELD_SID) { $fuser->fetch('','',$ldapuser[$conf->global->LDAP_KEY_USERS]); // Chargement du user concerné par le SID } else if($conf->global->LDAP_KEY_USERS == $conf->global->LDAP_FIELD_LOGIN) { @@ -226,11 +230,11 @@ if ($result >= 0) //if ($fuser->statut > 1) $fuser->statut=1; //print_r($ldapuser); - + if($fuser->id > 0) { // User update print $langs->transnoentities("UserUpdate").' # '.$key.': login='.$fuser->login.', fullname='.$fuser->getFullName($langs); $res=$fuser->update($user); - + if ($res < 0) { $error++; @@ -243,7 +247,7 @@ if ($result >= 0) } else { // User creation print $langs->transnoentities("UserCreate").' # '.$key.': login='.$fuser->login.', fullname='.$fuser->getFullName($langs); $res=$fuser->create($user); - + if ($res > 0) { print ' --> Created user id='.$fuser->id.' login='.$fuser->login; @@ -256,7 +260,7 @@ if ($result >= 0) } print "\n"; //print_r($fuser); - + // Gestion des groupes // TODO : revoir la gestion des groupes (ou script de sync groupes) /*if(!$error) { diff --git a/scripts/withdrawals/build_withdrawal_file.php b/scripts/withdrawals/build_withdrawal_file.php index c7513c48540..0afb79b55d7 100644 --- a/scripts/withdrawals/build_withdrawal_file.php +++ b/scripts/withdrawals/build_withdrawal_file.php @@ -34,16 +34,23 @@ if (substr($sapi_type, 0, 3) == 'cgi') { exit; } -// Recupere env dolibarr -$version='1.6'; - require_once($path."../../htdocs/master.inc.php"); require_once(DOL_DOCUMENT_ROOT."/compta/prelevement/class/bonprelevement.class.php"); require_once(DOL_DOCUMENT_ROOT."/compta/facture/class/facture.class.php"); require_once(DOL_DOCUMENT_ROOT."/societe/class/societe.class.php"); require_once(DOL_DOCUMENT_ROOT."/compta/paiement/class/paiement.class.php"); -$error = 0; +// Global variables +$version=DOL_VERSION; +$error=0; + + +/* + * Main + */ + +@set_time_limit(0); +print "***** ".$script_file." (".$version.") *****\n"; $datetimeprev = time();
'.$langs->trans('ID').''.$langs->trans('UserName').''.$langs->trans('Employee').''.$langs->trans('Available').''.$langs->trans('Note').''.$langs->trans('UpdateButtonCP').''.$langs->trans('UpdateButtonCP').'